ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnR4dCBiL2FwaS9jdXJyZW50LnR4dAppbmRleCAxYzQxOTBlLi43N2M5ZjZlIDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC50eHQKKysrIGIvYXBpL2N1cnJlbnQudHh0CkBAIC00NzYxLDYgKzQ3NjEsNyBAQAogICBwdWJsaWMgY2xhc3MgQ2xpcERhdGEgaW1wbGVtZW50cyBhbmRyb2lkLm9zLlBhcmNlbGFibGUgewogICAgIGN0b3IgcHVibGljIENsaXBEYXRhKGphdmEubGFuZy5DaGFyU2VxdWVuY2UsIGphdmEubGFuZy5TdHJpbmdbXSwgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhLkl0ZW0pOwogICAgIGN0b3IgcHVibGljIENsaXBEYXRhKGFuZHJvaWQuY29udGVudC5DbGlwRGVzY3JpcHRpb24sIGFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtKTsKKyAgICBjdG9yIHB1YmxpYyBDbGlwRGF0YShhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBhZGRJdGVtKGFuZHJvaWQuY29udGVudC5DbGlwRGF0YS5JdGVtKTsKICAgICBtZXRob2QgcHVibGljIGludCBkZXNjcmliZUNvbnRlbnRzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuQ2xpcERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCk7CkBAIC01Mzc4LDYgKzUzNzksNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZVtdIGdldENoYXJTZXF1ZW5jZUFycmF5RXh0cmEoamF2YS5sYW5nLlN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5DaGFyU2VxdWVuY2U+IGdldENoYXJTZXF1ZW5jZUFycmF5TGlzdEV4dHJhKGphdmEubGFuZy5TdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRDaGFyU2VxdWVuY2VFeHRyYShqYXZhLmxhbmcuU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5DbGlwRGF0YSBnZXRDbGlwRGF0YSgpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLm5ldC5VcmkgZ2V0RGF0YSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREYXRhU3RyaW5nKCk7CkBAIC01NDYxLDYgKzU0NjMsNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXRDbGFzcyhhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgamF2YS5sYW5nLkNsYXNzPD8+KTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q2xhc3NOYW1lKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBqYXZhLmxhbmcuU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuY29udGVudC5JbnRlbnQgc2V0Q2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDbGlwRGF0YShhbmRyb2lkLmNvbnRlbnQuQ2xpcERhdGEpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXRDb21wb25lbnQoYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWUpOwogICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5jb250ZW50LkludGVudCBzZXREYXRhKGFuZHJvaWQubmV0LlVyaSk7CiAgICAgbWV0aG9kIHB1YmxpYyBhbmRyb2lkLmNvbnRlbnQuSW50ZW50IHNldERhdGFBbmROb3JtYWxpemUoYW5kcm9pZC5uZXQuVXJpKTsKQEAgLTU2NDYsNiArNTY0OSw3IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLmxhbmcuU3RyaW5nIEVYVFJBX1VJRCA9ICJhbmRyb2lkLmludGVudC5leHRyYS5VSUQiOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fQUNUSU9OID0gMTsgLy8gMHgxCiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9DQVRFR09SSUVTID0gNDsgLy8gMHg0CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9DTElQX0RBVEEgPSAxMjg7IC8vIDB4ODAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUxMX0lOX0NPTVBPTkVOVCA9IDg7IC8vIDB4OAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fREFUQSA9IDI7IC8vIDB4MgogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fUEFDS0FHRSA9IDE2OyAvLyAweDEwCkBAIC0xMDc4MCw2ICsxMDc4NCwxNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvbkpldFVzZXJJZFVwZGF0ZShhbmRyb2lkLm1lZGlhLkpldFBsYXllciwgaW50LCBpbnQpOwogICB9CiAKKyAgcHVibGljIGNsYXNzIE1lZGlhQWN0aW9uU291bmQgeworICAgIGN0b3IgcHVibGljIE1lZGlhQWN0aW9uU291bmQoKTsKKyAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGxvYWQoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBsYXkoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgcmVsZWFzZSgpOworICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPQ1VTX0NPTVBMRVRFID0gMTsgLy8gMHgxCisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hVVFRFUl9DTElDSyA9IDA7IC8vIDB4MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1ZJREVPX1JFQ09SRElORyA9IDI7IC8vIDB4MgorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUT1BfVklERU9fUkVDT1JESU5HID0gMzsgLy8gMHgzCisgIH0KKwogICBwdWJsaWMgY2xhc3MgTWVkaWFNZXRhZGF0YVJldHJpZXZlciB7CiAgICAgY3RvciBwdWJsaWMgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBleHRyYWN0TWV0YWRhdGEoaW50KTsKQEAgLTIzMzU5LDYgKzIzMzc0LDcgQEAKICAgICBtZXRob2QgcHVibGljIHZvaWQgb25SZXNvbHZlZFRleHREaXJlY3Rpb25SZXNldCgpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblJlc3RvcmVJbnN0YW5jZVN0YXRlKGFuZHJvaWQub3MuUGFyY2VsYWJsZSk7CiAgICAgbWV0aG9kIHByb3RlY3RlZCBhbmRyb2lkLm9zLlBhcmNlbGFibGUgb25TYXZlSW5zdGFuY2VTdGF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBvblNjcmVlblN0YXRlQ2hhbmdlZChpbnQpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblNjcm9sbENoYW5nZWQoaW50LCBpbnQsIGludCwgaW50KTsKICAgICBtZXRob2QgcHJvdGVjdGVkIGJvb2xlYW4gb25TZXRBbHBoYShpbnQpOwogICAgIG1ldGhvZCBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCwgaW50LCBpbnQsIGludCk7CkBAIC0yMzU2OCw2ICsyMzU4NCw4IEBACiAgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBhbmRyb2lkLnV0aWwuUHJvcGVydHkgUk9UQVRJT05fWTsKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGFuZHJvaWQudXRpbC5Qcm9wZXJ0eSBTQ0FMRV9YOwogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgYW5kcm9pZC51dGlsLlByb3BlcnR5IFNDQUxFX1k7CisgICAgZmllbGQgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0NSRUVOX1NUQVRFX09GRiA9IDA7IC8vIDB4MAorICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTl9TVEFURV9PTiA9IDE7IC8vIDB4MQogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX0lOU0VUID0gMTY3NzcyMTY7IC8vIDB4MTAwMDAwMAogICAgIGZpZWxkIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUk9MTEJBUlNfSU5TSURFX09WRVJMQVkgPSAwOyAvLyAweDAKICAgICBmaWVsZCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JPTExCQVJTX09VVFNJREVfSU5TRVQgPSA1MDMzMTY0ODsgLy8gMHgzMDAwMDAwCkBAIC0yNzUwMCwxNCArMjc1MTgsMjQgQEAKICAgICBjdG9yIHB1YmxpYyBTd2l0Y2goYW5kcm9pZC5jb250ZW50LkNvbnRleHQpOwogICAgIGN0b3IgcHVibGljIFN3aXRjaChhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCwgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldCk7CiAgICAgY3RvciBwdWJsaWMgU3dpdGNoKGFuZHJvaWQuY29udGVudC5Db250ZXh0LCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0LCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFN3aXRjaE1pbldpZHRoKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0U3dpdGNoUGFkZGluZygpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSBnZXRUZXh0T2ZmKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIGdldFRleHRPbigpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRUaHVtYkRyYXdhYmxlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0VGh1bWJUZXh0UGFkZGluZygpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSBnZXRUcmFja0RyYXdhYmxlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIG9uTWVhc3VyZShpbnQsIGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN3aXRjaE1pbldpZHRoKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN3aXRjaFBhZGRpbmcoaW50KTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U3dpdGNoVGV4dEFwcGVhcmFuY2UoYW5kcm9pZC5jb250ZW50LkNvbnRleHQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN3aXRjaFR5cGVmYWNlKGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFN3aXRjaFR5cGVmYWNlKGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRUZXh0T2ZmKGphdmEubGFuZy5DaGFyU2VxdWVuY2UpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRUZXh0T24oamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFRodW1iRHJhd2FibGUoYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZSk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFRodW1iVGV4dFBhZGRpbmcoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VHJhY2tEcmF3YWJsZShhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKICAgfQogCiAgIHB1YmxpYyBjbGFzcyBUYWJIb3N0IGV4dGVuZHMgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlci5PblRvdWNoTW9kZUNoYW5nZUxpc3RlbmVyIHsKQEAgLTI3NjM0LDkgKzI3NjYyLDEyIEBACiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBpbnQgZ2V0QXV0b0xpbmtNYXNrKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29tcG91bmREcmF3YWJsZVBhZGRpbmcoKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVbXSBnZXRDb21wb3VuZERyYXdhYmxlcygpOworICAgIG1ldGhvZCBwdWJsaWMgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZVtdIGdldENvbXBvdW5kRHJhd2FibGVzUmVsYXRpdmUoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdCb3R0b20oKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdFbmQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdMZWZ0KCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q29tcG91bmRQYWRkaW5nUmlnaHQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRDb21wb3VuZFBhZGRpbmdTdGFydCgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldENvbXBvdW5kUGFkZGluZ1RvcCgpOwogICAgIG1ldGhvZCBwdWJsaWMgZmluYWwgaW50IGdldEN1cnJlbnRIaW50VGV4dENvbG9yKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q3VycmVudFRleHRDb2xvcigpOwpAQCAtMjc2NzksOCArMjc3MTAsMTAgQEAKICAgICBtZXRob2QgcHVibGljIGZsb2F0IGdldFRleHRTY2FsZVgoKTsKICAgICBtZXRob2QgcHVibGljIGZsb2F0IGdldFRleHRTaXplKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nQm90dG9tKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nRW5kKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nTGVmdCgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ1JpZ2h0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0VG90YWxQYWRkaW5nU3RhcnQoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRUb3RhbFBhZGRpbmdUb3AoKTsKICAgICBtZXRob2QgcHVibGljIGZpbmFsIGFuZHJvaWQudGV4dC5tZXRob2QuVHJhbnNmb3JtYXRpb25NZXRob2QgZ2V0VHJhbnNmb3JtYXRpb25NZXRob2QoKTsKICAgICBtZXRob2QgcHVibGljIGFuZHJvaWQuZ3JhcGhpY3MuVHlwZWZhY2UgZ2V0VHlwZWZhY2UoKTsKQEAgLTI3NzEwLDYgKzI3NzQzLDkgQEAKICAgICBtZXRob2QgcHVibGljIGZpbmFsIHZvaWQgc2V0QXV0b0xpbmtNYXNrKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVQYWRkaW5nKGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVzKGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlKGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUsIGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGUpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlV2l0aEludHJpbnNpY0JvdW5kcyhpbnQsIGludCwgaW50LCBpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlV2l0aEludHJpbnNpY0JvdW5kcyhhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNXaXRoSW50cmluc2ljQm91bmRzKGludCwgaW50LCBpbnQsIGludCk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvbXBvdW5kRHJhd2FibGVzV2l0aEludHJpbnNpY0JvdW5kcyhhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlLCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q3Vyc29yVmlzaWJsZShib29sZWFuKTsKZGlmZiAtLWdpdCBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKaW5kZXggMTNiNjNkYy4uYmE3OWM5ZiAxMDA2NDQKLS0tIGEvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKKysrIGIvY21kcy9kdW1wc3RhdGUvZHVtcHN0YXRlLmMKQEAgLTg2LDExICs4Niw2IEBACiAgICAgZHVtcF9maWxlKCJQQUdFVFlQRUlORk8iLCAiL3Byb2MvcGFnZXR5cGVpbmZvIik7CiAgICAgZHVtcF9maWxlKCJCVUREWUlORk8iLCAiL3Byb2MvYnVkZHlpbmZvIik7CiAKLSAgICBwcmludF9wcm9wZXJ0aWVzKCk7Ci0KLSAgICAvKiBUT0RPOiBNYWtlIGxhc3Rfa21zZyBDQVBfU1lTTE9HIHByb3RlY3RlZC4gYi81NTU1NjkxICovCi0gICAgZHVtcF9maWxlKCJMQVNUIEtNU0ciLCAiL3Byb2MvbGFzdF9rbXNnIik7Ci0gICAgZG9fZG1lc2coKTsKIAogICAgIGR1bXBfZmlsZSgiS0VSTkVMIFdBS0VMT0NLUyIsICIvcHJvYy93YWtlbG9ja3MiKTsKICAgICBkdW1wX2ZpbGUoIktFUk5FTCBDUFVGUkVRIiwgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTAvY3B1ZnJlcS9zdGF0cy90aW1lX2luX3N0YXRlIik7CkBAIC05OSw2ICs5NCwxOSBAQAogICAgIHJ1bl9jb21tYW5kKCJQUk9DRVNTRVMgQU5EIFRIUkVBRFMiLCAxMCwgInBzIiwgIi10IiwgIi1wIiwgIi1QIiwgTlVMTCk7CiAgICAgcnVuX2NvbW1hbmQoIkxJQlJBTksiLCAxMCwgImxpYnJhbmsiLCBOVUxMKTsKIAorICAgIGRvX2RtZXNnKCk7CisKKyAgICBydW5fY29tbWFuZCgiTElTVCBPRiBPUEVOIEZJTEVTIiwgMTAsIFNVX1BBVEgsICJyb290IiwgImxzb2YiLCBOVUxMKTsKKworICAgIGZvcl9lYWNoX3BpZChkb19zaG93bWFwLCAiU01BUFMgT0YgQUxMIFBST0NFU1NFUyIpOworICAgIGZvcl9lYWNoX3BpZChzaG93X3djaGFuLCAiQkxPQ0tFRCBQUk9DRVNTIFdBSVQtQ0hBTk5FTFMiKTsKKworICAgIC8vIGR1bXBfZmlsZSgiRVZFTlQgTE9HIFRBR1MiLCAiL2V0Yy9ldmVudC1sb2ctdGFncyIpOworICAgIHJ1bl9jb21tYW5kKCJTWVNURU0gTE9HIiwgMjAsICJsb2djYXQiLCAiLXYiLCAidGhyZWFkdGltZSIsICItZCIsICIqOnYiLCBOVUxMKTsKKyAgICBydW5fY29tbWFuZCgiRVZFTlQgTE9HIiwgMjAsICJsb2djYXQiLCAiLWIiLCAiZXZlbnRzIiwgIi12IiwgInRocmVhZHRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7CisgICAgcnVuX2NvbW1hbmQoIlJBRElPIExPRyIsIDIwLCAibG9nY2F0IiwgIi1iIiwgInJhZGlvIiwgIi12IiwgInRocmVhZHRpbWUiLCAiLWQiLCAiKjp2IiwgTlVMTCk7CisKKwogICAgIC8qIHNob3cgdGhlIHRyYWNlcyB3ZSBjb2xsZWN0ZWQgaW4gbWFpbigpLCBpZiB0aGF0IHdhcyBkb25lICovCiAgICAgaWYgKGR1bXBfdHJhY2VzX3BhdGggIT0gTlVMTCkgewogICAgICAgICBkdW1wX2ZpbGUoIlZNIFRSQUNFUyBKVVNUIE5PVyIsIGR1bXBfdHJhY2VzX3BhdGgpOwpAQCAtMTI0LDYgKzEzMiwxMSBAQAogICAgIGR1bXBfZmlsZSgiTkVUV09SSyBST1VURVMiLCAiL3Byb2MvbmV0L3JvdXRlIik7CiAgICAgZHVtcF9maWxlKCJORVRXT1JLIFJPVVRFUyBJUFY2IiwgIi9wcm9jL25ldC9pcHY2X3JvdXRlIik7CiAKKyAgICAvKiBUT0RPOiBNYWtlIGxhc3Rfa21zZyBDQVBfU1lTTE9HIHByb3RlY3RlZC4gYi81NTU1NjkxICovCisgICAgZHVtcF9maWxlKCJMQVNUIEtNU0ciLCAiL3Byb2MvbGFzdF9rbXNnIik7CisgICAgZHVtcF9maWxlKCJMQVNUIFBBTklDIENPTlNPTEUiLCAiL2RhdGEvZG9udHBhbmljL2FwYW5pY19jb25zb2xlIik7CisgICAgZHVtcF9maWxlKCJMQVNUIFBBTklDIFRIUkVBRFMiLCAiL2RhdGEvZG9udHBhbmljL2FwYW5pY190aHJlYWRzIik7CisKICAgICBpZiAoc2NyZWVuc2hvdF9wYXRoWzBdKSB7CiAgICAgICAgIEFMT0dJKCJ0YWtpbmcgc2NyZWVuc2hvdFxuIik7CiAgICAgICAgIHJ1bl9jb21tYW5kKE5VTEwsIDUsIFNVX1BBVEgsICJyb290IiwgInNjcmVlbnNob3QiLCBzY3JlZW5zaG90X3BhdGgsIE5VTEwpOwpAQCAtMTM0LDExICsxNDcsNyBAQAogICAgICAgICAgICAgIi9kYXRhL2RhdGEvY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzL2RhdGFiYXNlcy9zZXR0aW5ncy5kYiIsCiAgICAgICAgICAgICAicHJhZ21hIHVzZXJfdmVyc2lvbjsgc2VsZWN0ICogZnJvbSBzeXN0ZW07IHNlbGVjdCAqIGZyb20gc2VjdXJlOyIsIE5VTEwpOwogCi0gICAgLy8gZHVtcF9maWxlKCJFVkVOVCBMT0cgVEFHUyIsICIvZXRjL2V2ZW50LWxvZy10YWdzIik7Ci0gICAgcnVuX2NvbW1hbmQoIlNZU1RFTSBMT0ciLCAyMCwgImxvZ2NhdCIsICItdiIsICJ0aHJlYWR0aW1lIiwgIi1kIiwgIio6diIsIE5VTEwpOwotICAgIHJ1bl9jb21tYW5kKCJFVkVOVCBMT0ciLCAyMCwgImxvZ2NhdCIsICItYiIsICJldmVudHMiLCAiLXYiLCAidGhyZWFkdGltZSIsICItZCIsICIqOnYiLCBOVUxMKTsKLSAgICBydW5fY29tbWFuZCgiUkFESU8gTE9HIiwgMjAsICJsb2djYXQiLCAiLWIiLCAicmFkaW8iLCAiLXYiLCAidGhyZWFkdGltZSIsICItZCIsICIqOnYiLCBOVUxMKTsKLQorICAgIC8qIFRoZSBmb2xsb3dpbmcgaGF2ZSBhIHRlbmRlbmN5IHRvIGdldCB3ZWRnZWQgd2hlbiB3aWZpIGRyaXZlcnMvZncgZ29lcyBiZWxseS11cC4gKi8KICAgICBydW5fY29tbWFuZCgiTkVUV09SSyBJTlRFUkZBQ0VTIiwgMTAsIFNVX1BBVEgsICJyb290IiwgIm5ldGNmZyIsIE5VTEwpOwogICAgIHJ1bl9jb21tYW5kKCJJUCBSVUxFUyIsIDEwLCAiaXAiLCAicnVsZSIsICJzaG93IiwgTlVMTCk7CiAgICAgcnVuX2NvbW1hbmQoIklQIFJVTEVTIHY2IiwgMTAsICJpcCIsICItNiIsICJydWxlIiwgInNob3ciLCBOVUxMKTsKQEAgLTE3MSw0MCArMTgwLDE3IEBACiAgICAgICAgICAgICBTVV9QQVRILCAicm9vdCIsICJ3bHV0aWwiLCAiY291bnRlcnMiLCBOVUxMKTsKICNlbmRpZgogCi0gICAgY2hhciByaWxfZHVtcHN0YXRlX3RpbWVvdXRbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKLSAgICBwcm9wZXJ0eV9nZXQoInJpbC5kdW1wc3RhdGUudGltZW91dCIsIHJpbF9kdW1wc3RhdGVfdGltZW91dCwgIjMwIik7Ci0gICAgaWYgKHN0cm5sZW4ocmlsX2R1bXBzdGF0ZV90aW1lb3V0LCBQUk9QRVJUWV9WQUxVRV9NQVggLSAxKSA+IDApIHsKLSAgICAgICAgaWYgKDAgPT0gc3RybmNtcChidWlsZF90eXBlLCAidXNlciIsIFBST1BFUlRZX1ZBTFVFX01BWCAtIDEpKSB7Ci0gICAgICAgICAgICAvLyBzdSBkb2VzIG5vdCBleGlzdCBvbiB1c2VyIGJ1aWxkcywgc28gdHJ5IHJ1bm5pbmcgd2l0aG91dCBpdC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IGFueSBpbXBsZW1lbnRhdGlvbnMgb2YgdnJpbC1kdW1wIHRoYXQgZG8gbm90IHJlcXVpcmUKLSAgICAgICAgICAgIC8vIHJvb3QgY2FuIHJ1biBvbiB1c2VyIGJ1aWxkcy4KLSAgICAgICAgICAgIHJ1bl9jb21tYW5kKCJEVU1QIFZFTkRPUiBSSUwgTE9HUyIsIGF0b2kocmlsX2R1bXBzdGF0ZV90aW1lb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgInZyaWwtZHVtcCIsIE5VTEwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcnVuX2NvbW1hbmQoIkRVTVAgVkVORE9SIFJJTCBMT0dTIiwgYXRvaShyaWxfZHVtcHN0YXRlX3RpbWVvdXQpLAotICAgICAgICAgICAgICAgICAgICBTVV9QQVRILCAicm9vdCIsICJ2cmlsLWR1bXAiLCBOVUxMKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwcmludF9wcm9wZXJ0aWVzKCk7CiAKICAgICBydW5fY29tbWFuZCgiVk9MRCBEVU1QIiwgMTAsICJ2ZGMiLCAiZHVtcCIsIE5VTEwpOwogICAgIHJ1bl9jb21tYW5kKCJTRUNVUkUgQ09OVEFJTkVSUyIsIDEwLCAidmRjIiwgImFzZWMiLCAibGlzdCIsIE5VTEwpOwogCi0gICAgZHVtcF9maWxlKCJCSU5ERVIgRkFJTEVEIFRSQU5TQUNUSU9OIExPRyIsICIvc3lzL2tlcm5lbC9kZWJ1Zy9iaW5kZXIvZmFpbGVkX3RyYW5zYWN0aW9uX2xvZyIpOwotICAgIGR1bXBfZmlsZSgiQklOREVSIFRSQU5TQUNUSU9OIExPRyIsICIvc3lzL2tlcm5lbC9kZWJ1Zy9iaW5kZXIvdHJhbnNhY3Rpb25fbG9nIik7Ci0gICAgZHVtcF9maWxlKCJCSU5ERVIgVFJBTlNBQ1RJT05TIiwgIi9zeXMva2VybmVsL2RlYnVnL2JpbmRlci90cmFuc2FjdGlvbnMiKTsKLSAgICBkdW1wX2ZpbGUoIkJJTkRFUiBTVEFUUyIsICIvc3lzL2tlcm5lbC9kZWJ1Zy9iaW5kZXIvc3RhdHMiKTsKLSAgICBkdW1wX2ZpbGUoIkJJTkRFUiBTVEFURSIsICIvc3lzL2tlcm5lbC9kZWJ1Zy9iaW5kZXIvc3RhdGUiKTsKLQogICAgIHJ1bl9jb21tYW5kKCJGSUxFU1lTVEVNUyAmIEZSRUUgU1BBQ0UiLCAxMCwgU1VfUEFUSCwgInJvb3QiLCAiZGYiLCBOVUxMKTsKIAogICAgIGR1bXBfZmlsZSgiUEFDS0FHRSBTRVRUSU5HUyIsICIvZGF0YS9zeXN0ZW0vcGFja2FnZXMueG1sIik7CiAgICAgZHVtcF9maWxlKCJQQUNLQUdFIFVJRCBFUlJPUlMiLCAiL2RhdGEvc3lzdGVtL3VpZGVycm9ycy50eHQiKTsKIAogICAgIHJ1bl9jb21tYW5kKCJMQVNUIFJBRElPIExPRyIsIDEwLCAicGFyc2VfcmFkaW9fbG9nIiwgIi9wcm9jL2xhc3RfcmFkaW9fbG9nIiwgTlVMTCk7Ci0gICAgZHVtcF9maWxlKCJMQVNUIFBBTklDIENPTlNPTEUiLCAiL2RhdGEvZG9udHBhbmljL2FwYW5pY19jb25zb2xlIik7Ci0gICAgZHVtcF9maWxlKCJMQVNUIFBBTklDIFRIUkVBRFMiLCAiL2RhdGEvZG9udHBhbmljL2FwYW5pY190aHJlYWRzIik7Ci0KLSAgICBmb3JfZWFjaF9waWQoc2hvd193Y2hhbiwgIkJMT0NLRUQgUFJPQ0VTUyBXQUlULUNIQU5ORUxTIik7CiAKICAgICBwcmludGYoIi0tLS0tLSBCQUNLTElHSFRTIC0tLS0tLVxuIik7CiAgICAgcHJpbnRmKCJMQ0QgYnJpZ2h0bmVzcz0iKTsKQEAgLTIxOSw5ICsyMDUsMTIgQEAKICAgICBkdW1wX2ZpbGUoTlVMTCwgIi9zeXMvY2xhc3MvbGVkcy9sY2QtYmFja2xpZ2h0L3JlZ2lzdGVycyIpOwogICAgIHByaW50ZigiXG4iKTsKIAotICAgIHJ1bl9jb21tYW5kKCJMSVNUIE9GIE9QRU4gRklMRVMiLCAxMCwgU1VfUEFUSCwgInJvb3QiLCAibHNvZiIsIE5VTEwpOwotCi0gICAgZm9yX2VhY2hfcGlkKGRvX3Nob3dtYXAsICJTTUFQUyBPRiBBTEwgUFJPQ0VTU0VTIik7CisgICAgLyogQmluZGVyIHN0YXRlIGlzIGV4cGVuc2l2ZSB0byBsb29rIGF0IGFzIGl0IHVzZXMgYSBsb3Qgb2YgbWVtb3J5LiAqLworICAgIGR1bXBfZmlsZSgiQklOREVSIEZBSUxFRCBUUkFOU0FDVElPTiBMT0ciLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL2ZhaWxlZF90cmFuc2FjdGlvbl9sb2ciKTsKKyAgICBkdW1wX2ZpbGUoIkJJTkRFUiBUUkFOU0FDVElPTiBMT0ciLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3RyYW5zYWN0aW9uX2xvZyIpOworICAgIGR1bXBfZmlsZSgiQklOREVSIFRSQU5TQUNUSU9OUyIsICIvc3lzL2tlcm5lbC9kZWJ1Zy9iaW5kZXIvdHJhbnNhY3Rpb25zIik7CisgICAgZHVtcF9maWxlKCJCSU5ERVIgU1RBVFMiLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3N0YXRzIik7CisgICAgZHVtcF9maWxlKCJCSU5ERVIgU1RBVEUiLCAiL3N5cy9rZXJuZWwvZGVidWcvYmluZGVyL3N0YXRlIik7CiAKICNpZmRlZiBCT0FSRF9IQVNfRFVNUFNUQVRFCiAgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CkBAIC0yMzIsNiArMjIxLDIyIEBACiAgICAgcHJpbnRmKCJcbiIpOwogI2VuZGlmCiAKKyAgICAvKiBNaWdyYXRlIHRoZSByaWxfZHVtcHN0YXRlIHRvIGEgZHVtcHN0YXRlX2JvYXJkKCk/ICovCisgICAgY2hhciByaWxfZHVtcHN0YXRlX3RpbWVvdXRbUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKKyAgICBwcm9wZXJ0eV9nZXQoInJpbC5kdW1wc3RhdGUudGltZW91dCIsIHJpbF9kdW1wc3RhdGVfdGltZW91dCwgIjMwIik7CisgICAgaWYgKHN0cm5sZW4ocmlsX2R1bXBzdGF0ZV90aW1lb3V0LCBQUk9QRVJUWV9WQUxVRV9NQVggLSAxKSA+IDApIHsKKyAgICAgICAgaWYgKDAgPT0gc3RybmNtcChidWlsZF90eXBlLCAidXNlciIsIFBST1BFUlRZX1ZBTFVFX01BWCAtIDEpKSB7CisgICAgICAgICAgICAvLyBzdSBkb2VzIG5vdCBleGlzdCBvbiB1c2VyIGJ1aWxkcywgc28gdHJ5IHJ1bm5pbmcgd2l0aG91dCBpdC4KKyAgICAgICAgICAgIC8vIFRoaXMgd2F5IGFueSBpbXBsZW1lbnRhdGlvbnMgb2YgdnJpbC1kdW1wIHRoYXQgZG8gbm90IHJlcXVpcmUKKyAgICAgICAgICAgIC8vIHJvb3QgY2FuIHJ1biBvbiB1c2VyIGJ1aWxkcy4KKyAgICAgICAgICAgIHJ1bl9jb21tYW5kKCJEVU1QIFZFTkRPUiBSSUwgTE9HUyIsIGF0b2kocmlsX2R1bXBzdGF0ZV90aW1lb3V0KSwKKyAgICAgICAgICAgICAgICAgICAgInZyaWwtZHVtcCIsIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcnVuX2NvbW1hbmQoIkRVTVAgVkVORE9SIFJJTCBMT0dTIiwgYXRvaShyaWxfZHVtcHN0YXRlX3RpbWVvdXQpLAorICAgICAgICAgICAgICAgICAgICBTVV9QQVRILCAicm9vdCIsICJ2cmlsLWR1bXAiLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogICAgIHByaW50ZigiPT0gQW5kcm9pZCBGcmFtZXdvcmsgU2VydmljZXNcbiIpOwogICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAppbmRleCBmYmY4MDBjLi4wNDE0Yjk4IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L2NvZGVjLmNwcApAQCAtMzUsNyArMzUsOCBAQAogc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAlcyBbLWFdIHVzZSBhdWRpb1xuIgogICAgICAgICAgICAgICAgICAgICAiXHRcdFstdl0gdXNlIHZpZGVvXG4iCi0gICAgICAgICAgICAgICAgICAgICJcdFx0Wy1wXSBwbGF5YmFja1xuIiwgbWUpOworICAgICAgICAgICAgICAgICAgICAiXHRcdFstcF0gcGxheWJhY2tcbiIKKyAgICAgICAgICAgICAgICAgICAgIlx0XHRbLVNdIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2VcbiIsIG1lKTsKIAogICAgIGV4aXQoMSk7CiB9CkBAIC00OSw2ICs1MCw5IEBACiAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gbUluQnVmZmVyczsKICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtT3V0QnVmZmVyczsKICAgICBib29sIG1TYXdPdXRwdXRFT1M7CisgICAgaW50NjRfdCBtTnVtQnVmZmVyc0RlY29kZWQ7CisgICAgaW50NjRfdCBtTnVtQnl0ZXNEZWNvZGVkOworICAgIGJvb2wgbUlzQXVkaW87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApAQCAtNTcsOSArNjEsMTIgQEAKICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QUxvb3Blcj4gJmxvb3BlciwKICAgICAgICAgY29uc3QgY2hhciAqcGF0aCwKICAgICAgICAgYm9vbCB1c2VBdWRpbywKLSAgICAgICAgYm9vbCB1c2VWaWRlbykgeworICAgICAgICBib29sIHVzZVZpZGVvLAorICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpTdXJmYWNlPiAmc3VyZmFjZSkgewogICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisgICAgc3RhdGljIGludDY0X3Qga1RpbWVvdXQgPSA1MDBsbDsKKwogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IGV4dHJhY3RvciA9IG5ldyBOdU1lZGlhRXh0cmFjdG9yOwogICAgIGlmIChleHRyYWN0b3ItPnNldERhdGFTb3VyY2UocGF0aCkgIT0gT0spIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmFibGUgdG8gaW5zdGFudGlhdGUgZXh0cmFjdG9yLlxuIik7CkBAIC03OCwxMSArODUsMTIgQEAKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogCi0gICAgICAgIGlmICh1c2VBdWRpbyAmJiAhaGF2ZUF1ZGlvCi0gICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIGJvb2wgaXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJhdWRpby8iLCA2KTsKKyAgICAgICAgYm9vbCBpc1ZpZGVvID0gIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpOworCisgICAgICAgIGlmICh1c2VBdWRpbyAmJiAhaGF2ZUF1ZGlvICYmIGlzQXVkaW8pIHsKICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodXNlVmlkZW8gJiYgIWhhdmVWaWRlbwotICAgICAgICAgICAgICAgICYmICFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSkgeworICAgICAgICB9IGVsc2UgaWYgKHVzZVZpZGVvICYmICFoYXZlVmlkZW8gJiYgaXNWaWRlbykgewogICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtOTYsMTMgKzEwNCwxNyBAQAogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9CiAgICAgICAgICAgICAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KHN0YXRlQnlUcmFjay5hZGQoaSwgQ29kZWNTdGF0ZSgpKSk7CiAKKyAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgPSAwOworICAgICAgICBzdGF0ZS0+bU51bUJ1ZmZlcnNEZWNvZGVkID0gMDsKKyAgICAgICAgc3RhdGUtPm1Jc0F1ZGlvID0gaXNBdWRpbzsKKwogICAgICAgICBzdGF0ZS0+bUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAogICAgICAgICAgICAgICAgIGxvb3BlciwgbWltZS5jX3N0cigpLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKIAogICAgICAgICBDSEVDSyhzdGF0ZS0+bUNvZGVjICE9IE5VTEwpOwogCiAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPmNvbmZpZ3VyZSgKLSAgICAgICAgICAgICAgICBmb3JtYXQsIE5VTEwgLyogc3VyZmFjZVRleHR1cmUgKi8sIDAgLyogZmxhZ3MgKi8pOworICAgICAgICAgICAgICAgIGZvcm1hdCwgaXNWaWRlbyA/IHN1cmZhY2UgOiBOVUxMLCAwIC8qIGZsYWdzICovKTsKIAogICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKQEAgLTEyMiw2ICsxMzQsOCBAQAogCiAgICAgQ0hFQ0soIXN0YXRlQnlUcmFjay5pc0VtcHR5KCkpOwogCisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CiAKQEAgLTEzNywxMyArMTUxLDcgQEAKIAogICAgICAgICB3aGlsZSAoc3RhdGUtPm1DU0RJbmRleCA8IHN0YXRlLT5tQ1NELnNpemUoKSkgewogICAgICAgICAgICAgc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaW5kZXgpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbmRleCwgLTFsbCk7CiAgICAgICAgICAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdClPSyk7CiAKICAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIgPQpAQCAtMTc5LDcgKzE4Nyw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gc3RhdGUtPm1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmluZGV4LCBrVGltZW91dCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gLUVBR0FJTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjA0LDcgKzIxMiw3IEBACiAgICAgICAgICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUZvcih0cmFja0luZGV4KTsKIAogICAgICAgICAgICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmluZGV4KTsKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGF0ZS0+bUNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJmluZGV4LCBrVGltZW91dCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaWxsaW5nIGlucHV0IGJ1ZmZlciAlZCIsIGluZGV4KTsKQEAgLTI2MSwxMiArMjY5LDE1IEBACiAgICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXRlLT5tQ29kZWMtPmRlcXVldWVPdXRwdXRCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJm9mZnNldCwgJnNpemUsICZwcmVzZW50YXRpb25UaW1lVXMsICZmbGFncywKLSAgICAgICAgICAgICAgICAgICAgMTAwMDBsbCk7CisgICAgICAgICAgICAgICAgICAgIGtUaW1lb3V0KTsKIAogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dWKCJkcmFpbmluZyBvdXRwdXQgYnVmZmVyICVkLCB0aW1lID0gJWxsZCB1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHByZXNlbnRhdGlvblRpbWVVcyk7CiAKKyAgICAgICAgICAgICAgICArK3N0YXRlLT5tTnVtQnVmZmVyc0RlY29kZWQ7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CeXRlc0RlY29kZWQgKz0gc2l6ZTsKKwogICAgICAgICAgICAgICAgIGVyciA9IHN0YXRlLT5tQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaW5kZXgpOwogICAgICAgICAgICAgICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKIApAQCAtMjkyLDEwICszMDMsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKIAogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIHN0YXRlLT5tQ29kZWMtPnJlbGVhc2UoKSk7CisKKyAgICAgICAgaWYgKHN0YXRlLT5tSXNBdWRpbykgeworICAgICAgICAgICAgcHJpbnRmKCJ0cmFjayAlZDogJWxsZCBieXRlcyByZWNlaXZlZC4gJS4yZiBLQi9zZWNcbiIsCisgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCAqIDFFNiAvIDEwMjQgLyBlbGFwc2VkVGltZVVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigidHJhY2sgJWQ6ICVsbGQgZnJhbWVzIGRlY29kZWQsICUuMmYgZnBzLiAlbGxkIGJ5dGVzICIKKyAgICAgICAgICAgICAgICAgICAicmVjZWl2ZWQuICUuMmYgS0Ivc2VjXG4iLAorICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1OdW1CdWZmZXJzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ1ZmZlcnNEZWNvZGVkICogMUU2IC8gZWxhcHNlZFRpbWVVcywKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bU51bUJ5dGVzRGVjb2RlZCAqIDFFNiAvIDEwMjQgLyBlbGFwc2VkVGltZVVzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMzA5LDkgKzMzNywxMCBAQAogICAgIGJvb2wgdXNlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIHVzZVZpZGVvID0gZmFsc2U7CiAgICAgYm9vbCBwbGF5YmFjayA9IGZhbHNlOworICAgIGJvb2wgdXNlU3VyZmFjZSA9IGZhbHNlOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGF2cCIpKSA+PSAwKSB7CisgICAgd2hpbGUgKChyZXMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhhdnBTIikpID49IDApIHsKICAgICAgICAgc3dpdGNoIChyZXMpIHsKICAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICAgewpAQCAtMzMxLDYgKzM2MCwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1c2VTdXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0zNTgsOCArMzkzLDEyIEBACiAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogCi0gICAgaWYgKHBsYXliYWNrKSB7Ci0gICAgICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CisgICAgc3A8U3VyZmFjZUNvbnRyb2w+IGNvbnRyb2w7CisgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKworICAgIGlmIChwbGF5YmFjayB8fCAodXNlU3VyZmFjZSAmJiB1c2VWaWRlbykpIHsKKyAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBjb21wb3NlckNsaWVudC0+Z2V0RGlzcGxheVdpZHRoKDApOwpAQCAtMzY3LDE0ICs0MDYsMTMgQEAKIAogICAgICAgICBBTE9HVigiZGlzcGxheSBpcyAlbGQgeCAlbGRcbiIsIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7CiAKLSAgICAgICAgc3A8U3VyZmFjZUNvbnRyb2w+IGNvbnRyb2wgPQotICAgICAgICAgICAgY29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAotICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgY29udHJvbCA9IGNvbXBvc2VyQ2xpZW50LT5jcmVhdGVTdXJmYWNlKAorICAgICAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoLAorICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQsCisgICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1JHQl81NjUsCisgICAgICAgICAgICAgICAgMCk7CiAKICAgICAgICAgQ0hFQ0soY29udHJvbCAhPSBOVUxMKTsKICAgICAgICAgQ0hFQ0soY29udHJvbC0+aXNWYWxpZCgpKTsKQEAgLTM4NCw5ICs0MjIsMTEgQEAKICAgICAgICAgQ0hFQ0tfRVEoY29udHJvbC0+c2hvdygpLCAoc3RhdHVzX3QpT0spOwogICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKIAotICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gY29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgICAgICBzdXJmYWNlID0gY29udHJvbC0+Z2V0U3VyZmFjZSgpOwogICAgICAgICBDSEVDSyhzdXJmYWNlICE9IE5VTEwpOworICAgIH0KIAorICAgIGlmIChwbGF5YmFjaykgewogICAgICAgICBzcDxTaW1wbGVQbGF5ZXI+IHBsYXllciA9IG5ldyBTaW1wbGVQbGF5ZXI7CiAgICAgICAgIGxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHBsYXllcik7CiAKQEAgLTM5NiwxMCArNDM2LDEyIEBACiAgICAgICAgIHNsZWVwKDYwKTsKICAgICAgICAgcGxheWVyLT5zdG9wKCk7CiAgICAgICAgIHBsYXllci0+cmVzZXQoKTsKLQotICAgICAgICBjb21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlY29kZShsb29wZXIsIGFyZ3ZbMF0sIHVzZUF1ZGlvLCB1c2VWaWRlbyk7CisgICAgICAgIGRlY29kZShsb29wZXIsIGFyZ3ZbMF0sIHVzZUF1ZGlvLCB1c2VWaWRlbywgc3VyZmFjZSk7CisgICAgfQorCisgICAgaWYgKHBsYXliYWNrIHx8ICh1c2VTdXJmYWNlICYmIHVzZVZpZGVvKSkgeworICAgICAgICBjb21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOwogICAgIH0KIAogICAgIGxvb3Blci0+c3RvcCgpOwpkaWZmIC0tZ2l0IGEvY21kcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rIGIvY21kcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGYzMmJiLi4wMDAwMDAwCi0tLSBhL2NtZHMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQltYWluX3N1cmZhY2VmbGluZ2VyLmNwcCAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlic3VyZmFjZWZsaW5nZXIgXAotCWxpYmJpbmRlciBcCi0JbGlidXRpbHMKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChMT0NBTF9QQVRIKS8uLi8uLi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlcgotCi1MT0NBTF9NT0RVTEU6PSBzdXJmYWNlZmxpbmdlcgotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NtZHMvc3VyZmFjZWZsaW5nZXIvbWFpbl9zdXJmYWNlZmxpbmdlci5jcHAgYi9jbWRzL3N1cmZhY2VmbGluZ2VyL21haW5fc3VyZmFjZWZsaW5nZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJjZjVjLi4wMDAwMDAwCi0tLSBhL2NtZHMvc3VyZmFjZWZsaW5nZXIvbWFpbl9zdXJmYWNlZmxpbmdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8U3VyZmFjZUZsaW5nZXIuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIFN1cmZhY2VGbGluZ2VyOjpwdWJsaXNoQW5kSm9pblRocmVhZFBvb2wodHJ1ZSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9BbmRyb2lkLm1rIGIvY21kcy9zeXN0ZW1fc2VydmVyL2xpYnJhcnkvQW5kcm9pZC5tawppbmRleCBlOGFmY2UzLi43ZDA4YThjIDEwMDY0NAotLS0gYS9jbWRzL3N5c3RlbV9zZXJ2ZXIvbGlicmFyeS9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3lzdGVtX3NlcnZlci9saWJyYXJ5L0FuZHJvaWQubWsKQEAgLTUsMTMgKzUsMTQgQEAKIAlzeXN0ZW1faW5pdC5jcHAKIAogYmFzZSA9ICQoTE9DQUxfUEFUSCkvLi4vLi4vLi4KK25hdGl2ZSA9ICQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vLi4vbmF0aXZlCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoYmFzZSkvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAogCSQoYmFzZSkvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLQkkKGJhc2UpL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyIFwKIAkkKGJhc2UpL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UgXAogCSQoYmFzZSkvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKKwkkKG5hdGl2ZSkvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIgXAogCSQoSk5JX0hfSU5DTFVERSkKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9BY2NvdW50TWFuYWdlclNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDVmZWU0ZGUuLmFkYzdkMzUgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0FjY291bnRNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CkBAIC0zMyw2ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZWdpc3RlcmVkU2VydmljZXNDYWNoZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGVMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uVXNlckluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CiBpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5EYXRhYmFzZVV0aWxzOwpAQCAtNDgsMTEgKzUwLDE0IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwogaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwogaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySWQ7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOworaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKIAogaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLlI7CitpbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwudXRpbC5JbmRlbnRpbmdQcmludFdyaXRlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOwpAQCAtNjIsNiArNjcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKQEAgLTk0LDcgKzEwMCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfVElNRURfT1VUID0gMzsKIAogICAgIHByaXZhdGUgZmluYWwgSUFjY291bnRBdXRoZW50aWNhdG9yQ2FjaGUgbUF1dGhlbnRpY2F0b3JDYWNoZTsKLSAgICBwcml2YXRlIGZpbmFsIERhdGFiYXNlSGVscGVyIG1PcGVuSGVscGVyOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0FDQ09VTlRTID0gImFjY291bnRzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDT1VOVFNfSUQgPSAiX2lkIjsKQEAgLTE0OCwxNCArMTUzLDM2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwPFN0cmluZywgU2Vzc2lvbj4gbVNlc3Npb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTZXNzaW9uPigpOwogICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtTm90aWZpY2F0aW9uSWRzID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8UGFpcjxQYWlyPEFjY291bnQsIFN0cmluZz4sIEludGVnZXI+LCBJbnRlZ2VyPgotICAgICAgICAgICAgbUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxQYWlyPFBhaXI8QWNjb3VudCwgU3RyaW5nPiwgSW50ZWdlcj4sIEludGVnZXI+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEFjY291bnQsIEludGVnZXI+IG1TaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LCBJbnRlZ2VyPigpOworICAgIHN0YXRpYyBjbGFzcyBVc2VyQWNjb3VudHMgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCB1c2VySWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGF0YWJhc2VIZWxwZXIgb3BlbkhlbHBlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFBhaXI8UGFpcjxBY2NvdW50LCBTdHJpbmc+LCBJbnRlZ2VyPiwgSW50ZWdlcj4KKyAgICAgICAgICAgICAgICBjcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMgPQorICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFBhaXI8UGFpcjxBY2NvdW50LCBTdHJpbmc+LCBJbnRlZ2VyPiwgSW50ZWdlcj4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPEFjY291bnQsIEludGVnZXI+IHNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWRzID0KKyAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LCBJbnRlZ2VyPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBjYWNoZUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIC8qKiBwcm90ZWN0ZWQgYnkgdGhlIHtAbGluayAjY2FjaGVMb2NrfSAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBBY2NvdW50W10+IGFjY291bnRDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQWNjb3VudFtdPigpOworICAgICAgICAvKiogcHJvdGVjdGVkIGJ5IHRoZSB7QGxpbmsgI2NhY2hlTG9ja30gKi8KKyAgICAgICAgcHJpdmF0ZSBIYXNoTWFwPEFjY291bnQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PiB1c2VyRGF0YUNhY2hlID0KKyAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKKyAgICAgICAgLyoqIHByb3RlY3RlZCBieSB0aGUge0BsaW5rICNjYWNoZUxvY2t9ICovCisgICAgICAgIHByaXZhdGUgSGFzaE1hcDxBY2NvdW50LCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4gYXV0aFRva2VuQ2FjaGUgPQorICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEFjY291bnQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PigpOworCisgICAgICAgIFVzZXJBY2NvdW50cyhDb250ZXh0IGNvbnRleHQsIGludCB1c2VySWQpIHsKKyAgICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOworICAgICAgICAgICAgc3luY2hyb25pemVkIChjYWNoZUxvY2spIHsKKyAgICAgICAgICAgICAgICBvcGVuSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKGNvbnRleHQsIHVzZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PFVzZXJBY2NvdW50cz4gbVVzZXJzID0gbmV3IFNwYXJzZUFycmF5PFVzZXJBY2NvdW50cz4oKTsKKwogICAgIHByaXZhdGUgc3RhdGljIEF0b21pY1JlZmVyZW5jZTxBY2NvdW50TWFuYWdlclNlcnZpY2U+IHNUaGlzID0KICAgICAgICAgICAgIG5ldyBBdG9taWNSZWZlcmVuY2U8QWNjb3VudE1hbmFnZXJTZXJ2aWNlPigpOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNjb3VudFtdIEVNUFRZX0FDQ09VTlRfQVJSQVkgPSBuZXcgQWNjb3VudFtde307CiAKICAgICBzdGF0aWMgewpAQCAtMTYzLDE1ICsxOTAsNiBAQAogICAgICAgICBBQ0NPVU5UU19DSEFOR0VEX0lOVEVOVC5zZXRGbGFncyhJbnRlbnQuRkxBR19SRUNFSVZFUl9SRUdJU1RFUkVEX09OTFlfQkVGT1JFX0JPT1QpOwogICAgIH0KIAotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1DYWNoZUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgLyoqIHByb3RlY3RlZCBieSB0aGUge0BsaW5rICNtQ2FjaGVMb2NrfSAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEFjY291bnRbXT4gbUFjY291bnRDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQWNjb3VudFtdPigpOwotICAgIC8qKiBwcm90ZWN0ZWQgYnkgdGhlIHtAbGluayAjbUNhY2hlTG9ja30gKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8QWNjb3VudCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4+IG1Vc2VyRGF0YUNhY2hlID0KLSAgICAgICAgICAgIG5ldyBIYXNoTWFwPEFjY291bnQsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+PigpOwotICAgIC8qKiBwcm90ZWN0ZWQgYnkgdGhlIHtAbGluayAjbUNhY2hlTG9ja30gKi8KLSAgICBwcml2YXRlIEhhc2hNYXA8QWNjb3VudCwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4+IG1BdXRoVG9rZW5DYWNoZSA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPj4oKTsKIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHN5c3RlbSBjb2RlLiBPbmUgc2hvdWxkIG9ubHkgY2FsbCB0aGlzIGFmdGVyIHRoZSBzZXJ2aWNlCkBAIC0xOTIsMTAgKzIxMCw2IEBACiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gcGFja2FnZU1hbmFnZXI7CiAKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBtT3BlbkhlbHBlciA9IG5ldyBEYXRhYmFzZUhlbHBlcihtQ29udGV4dCk7Ci0gICAgICAgIH0KLQogICAgICAgICBtTWVzc2FnZVRocmVhZCA9IG5ldyBIYW5kbGVyVGhyZWFkKCJBY2NvdW50TWFuYWdlclNlcnZpY2UiKTsKICAgICAgICAgbU1lc3NhZ2VUaHJlYWQuc3RhcnQoKTsKICAgICAgICAgbU1lc3NhZ2VIYW5kbGVyID0gbmV3IE1lc3NhZ2VIYW5kbGVyKG1NZXNzYWdlVGhyZWFkLmdldExvb3BlcigpKTsKQEAgLTIwMyw2ICsyMTcsOCBAQAogICAgICAgICBtQXV0aGVudGljYXRvckNhY2hlID0gYXV0aGVudGljYXRvckNhY2hlOwogICAgICAgICBtQXV0aGVudGljYXRvckNhY2hlLnNldExpc3RlbmVyKHRoaXMsIG51bGwgLyogSGFuZGxlciAqLyk7CiAKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gaW5pdFVzZXIoMCk7CisKICAgICAgICAgc1RoaXMuc2V0KHRoaXMpOwogCiAgICAgICAgIEludGVudEZpbHRlciBpbnRlbnRGaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7CkBAIC0yMTEsMTcgKzIyNywzNiBAQAogICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dDEsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgICAgICBwdXJnZU9sZEdyYW50cygpOworICAgICAgICAgICAgICAgIHB1cmdlT2xkR3JhbnRzQWxsKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0sIGludGVudEZpbHRlcik7Ci0gICAgICAgIHB1cmdlT2xkR3JhbnRzKCk7CiAKLSAgICAgICAgdmFsaWRhdGVBY2NvdW50c0FuZFBvcHVsYXRlQ2FjaGUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHVyZ2VPbGRHcmFudHMoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgcHJpdmF0ZSBVc2VyQWNjb3VudHMgaW5pdFVzZXIoaW50IHVzZXJJZCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Vc2VycykgeworICAgICAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gbVVzZXJzLmdldCh1c2VySWQpOworICAgICAgICAgICAgaWYgKGFjY291bnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY2NvdW50cyA9IG5ldyBVc2VyQWNjb3VudHMobUNvbnRleHQsIHVzZXJJZCk7CisgICAgICAgICAgICAgICAgbVVzZXJzLmFwcGVuZCh1c2VySWQsIGFjY291bnRzKTsKKyAgICAgICAgICAgICAgICBwdXJnZU9sZEdyYW50cyhhY2NvdW50cyk7CisgICAgICAgICAgICAgICAgdmFsaWRhdGVBY2NvdW50c0FuZFBvcHVsYXRlQ2FjaGUoYWNjb3VudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFjY291bnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1cmdlT2xkR3JhbnRzQWxsKCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Vc2VycykgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVXNlcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwdXJnZU9sZEdyYW50cyhtVXNlcnMudmFsdWVBdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHVyZ2VPbGRHcmFudHMoVXNlckFjY291bnRzIGFjY291bnRzKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgZmluYWwgQ3Vyc29yIGN1cnNvciA9IGRiLnF1ZXJ5KFRBQkxFX0dSQU5UUywKICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tde0dSQU5UU19HUkFOVEVFX1VJRH0sCiAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIEdSQU5UU19HUkFOVEVFX1VJRCwgbnVsbCwgbnVsbCk7CkBAIC0yNDMsMTUgKzI3OCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQWNjb3VudHNBbmRQb3B1bGF0ZUNhY2hlKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUFjY291bnRzQW5kUG9wdWxhdGVDYWNoZShVc2VyQWNjb3VudHMgYWNjb3VudHMpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBib29sZWFuIGFjY291bnREZWxldGVkID0gZmFsc2U7CiAgICAgICAgICAgICBDdXJzb3IgY3Vyc29yID0gZGIucXVlcnkoVEFCTEVfQUNDT1VOVFMsCiAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXtBQ0NPVU5UU19JRCwgQUNDT1VOVFNfVFlQRSwgQUNDT1VOVFNfTkFNRX0sCiAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtQWNjb3VudENhY2hlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYWNjb3VudHMuYWNjb3VudENhY2hlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PiBhY2NvdW50TmFtZXNCeVR5cGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8U3RyaW5nPj4oKTsKICAgICAgICAgICAgICAgICB3aGlsZSAoY3Vyc29yLm1vdmVUb05leHQoKSkgewpAQCAtMjY1LDggKzMwMCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkYi5kZWxldGUoVEFCTEVfQUNDT1VOVFMsIEFDQ09VTlRTX0lEICsgIj0iICsgYWNjb3VudElkLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnREZWxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IG5ldyBBY2NvdW50KGFjY291bnROYW1lLCBhY2NvdW50VHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVXNlckRhdGFDYWNoZS5yZW1vdmUoYWNjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXV0aFRva2VuQ2FjaGUucmVtb3ZlKGFjY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudHMudXNlckRhdGFDYWNoZS5yZW1vdmUoYWNjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50cy5hdXRoVG9rZW5DYWNoZS5yZW1vdmUoYWNjb3VudCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhY2NvdW50TmFtZXMgPSBhY2NvdW50TmFtZXNCeVR5cGUuZ2V0KGFjY291bnRUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2NvdW50TmFtZXMgPT0gbnVsbCkgewpAQCAtMjg2LDE5ICszMjEsNTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRzRm9yVHlwZVtpXSA9IG5ldyBBY2NvdW50KGFjY291bnROYW1lLCBhY2NvdW50VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICArK2k7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUFjY291bnRDYWNoZS5wdXQoYWNjb3VudFR5cGUsIGFjY291bnRzRm9yVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGFjY291bnRzLmFjY291bnRDYWNoZS5wdXQoYWNjb3VudFR5cGUsIGFjY291bnRzRm9yVHlwZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBjdXJzb3IuY2xvc2UoKTsKICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudERlbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOworICAgICAgICAgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KGFjY291bnRzLnVzZXJJZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBVc2VyQWNjb3VudHMgZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCkgeworICAgICAgICByZXR1cm4gZ2V0VXNlckFjY291bnRzKFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCBVc2VyQWNjb3VudHMgZ2V0VXNlckFjY291bnRzKGludCB1c2VySWQpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtVXNlcnMpIHsKKyAgICAgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IG1Vc2Vycy5nZXQodXNlcklkKTsKKyAgICAgICAgICAgIGlmIChhY2NvdW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWNjb3VudHMgPSBpbml0VXNlcih1c2VySWQpOworICAgICAgICAgICAgICAgIG1Vc2Vycy5hcHBlbmQodXNlcklkLCBhY2NvdW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYWNjb3VudHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VXNlckluZm8+IGdldEFsbFVzZXJzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRVc2VycygpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIC8vIExvY2FsIHRvIHN5c3RlbSBwcm9jZXNzLCBzaG91bGRuJ3QgaGFwcGVuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ2hhbmdlZChBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24gZGVzYywgYm9vbGVhbiByZW1vdmVkKSB7Ci0gICAgICAgIHZhbGlkYXRlQWNjb3VudHNBbmRQb3B1bGF0ZUNhY2hlKCk7CisgICAgICAgIC8vIFZhbGlkYXRlIGFjY291bnRzIGZvciBhbGwgdXNlcnMKKyAgICAgICAgTGlzdDxVc2VySW5mbz4gdXNlcnMgPSBnZXRBbGxVc2VycygpOworICAgICAgICBpZiAodXNlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsaWRhdGVBY2NvdW50c0FuZFBvcHVsYXRlQ2FjaGUoZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChVc2VySW5mbyB1c2VyIDogdXNlcnMpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUFjY291bnRzQW5kUG9wdWxhdGVDYWNoZShnZXRVc2VyQWNjb3VudHModXNlci5pZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZChBY2NvdW50IGFjY291bnQpIHsKQEAgLTMxMCwyMSArMzc3LDIyIEBACiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBjaGVja0F1dGhlbnRpY2F0ZUFjY291bnRzUGVybWlzc2lvbihhY2NvdW50KTsKIAorICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZWFkUGFzc3dvcmRJbnRlcm5hbChhY2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiByZWFkUGFzc3dvcmRJbnRlcm5hbChhY2NvdW50cywgYWNjb3VudCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFBhc3N3b3JkSW50ZXJuYWwoQWNjb3VudCBhY2NvdW50KSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFBhc3N3b3JkSW50ZXJuYWwoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQpIHsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgIEN1cnNvciBjdXJzb3IgPSBkYi5xdWVyeShUQUJMRV9BQ0NPVU5UUywgbmV3IFN0cmluZ1tde0FDQ09VTlRTX1BBU1NXT1JEfSwKICAgICAgICAgICAgICAgICAgICAgQUNDT1VOVFNfTkFNRSArICI9PyBBTkQgIiArIEFDQ09VTlRTX1RZUEUrICI9PyIsCiAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXthY2NvdW50Lm5hbWUsIGFjY291bnQudHlwZX0sIG51bGwsIG51bGwsIG51bGwpOwpAQCAtMzQ5LDkgKzQxNywxMCBAQAogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgaXMgbnVsbCIpOwogICAgICAgICBjaGVja0F1dGhlbnRpY2F0ZUFjY291bnRzUGVybWlzc2lvbihhY2NvdW50KTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZFVzZXJEYXRhSW50ZXJuYWwoYWNjb3VudCwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiByZWFkVXNlckRhdGFJbnRlcm5hbChhY2NvdW50cywgYWNjb3VudCwga2V5KTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTM5MCwyMSArNDU5LDIzIEBACiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBjaGVja0F1dGhlbnRpY2F0ZUFjY291bnRzUGVybWlzc2lvbihhY2NvdW50KTsKIAorICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgLy8gZmFpbHMgaWYgdGhlIGFjY291bnQgYWxyZWFkeSBleGlzdHMKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBhZGRBY2NvdW50SW50ZXJuYWwoYWNjb3VudCwgcGFzc3dvcmQsIGV4dHJhcyk7CisgICAgICAgICAgICByZXR1cm4gYWRkQWNjb3VudEludGVybmFsKGFjY291bnRzLCBhY2NvdW50LCBwYXNzd29yZCwgZXh0cmFzKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gYWRkQWNjb3VudEludGVybmFsKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkLCBCdW5kbGUgZXh0cmFzKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGFkZEFjY291bnRJbnRlcm5hbChVc2VyQWNjb3VudHMgYWNjb3VudHMsIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHBhc3N3b3JkLAorICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGxvbmcgbnVtTWF0Y2hlcyA9IERhdGFiYXNlVXRpbHMubG9uZ0ZvclF1ZXJ5KGRiLApAQCAtNDM3LDExICs1MDgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKLSAgICAgICAgICAgICAgICBpbnNlcnRBY2NvdW50SW50b0NhY2hlTG9ja2VkKGFjY291bnQpOworICAgICAgICAgICAgICAgIGluc2VydEFjY291bnRJbnRvQ2FjaGVMb2NrZWQoYWNjb3VudHMsIGFjY291bnQpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBkYi5lbmRUcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpOworICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdChhY2NvdW50cy51c2VySWQpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC00NjcsOSArNTM4LDEwIEBACiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBpZiAoZmVhdHVyZXMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmVhdHVyZXMgaXMgbnVsbCIpOwogICAgICAgICBjaGVja1JlYWRBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgVGVzdEZlYXR1cmVzU2Vzc2lvbihyZXNwb25zZSwgYWNjb3VudCwgZmVhdHVyZXMpLmJpbmQoKTsKKyAgICAgICAgICAgIG5ldyBUZXN0RmVhdHVyZXNTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudCwgZmVhdHVyZXMpLmJpbmQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTQ3OSw5ICs1NTEsOSBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1GZWF0dXJlczsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50IG1BY2NvdW50OwogCi0gICAgICAgIHB1YmxpYyBUZXN0RmVhdHVyZXNTZXNzaW9uKElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlLAorICAgICAgICBwdWJsaWMgVGVzdEZlYXR1cmVzU2Vzc2lvbihVc2VyQWNjb3VudHMgYWNjb3VudHMsIElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlLAogICAgICAgICAgICAgICAgIEFjY291bnQgYWNjb3VudCwgU3RyaW5nW10gZmVhdHVyZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGZhbHNlIC8qIGV4cGVjdEFjdGl2aXR5TGF1bmNoICovLAorICAgICAgICAgICAgc3VwZXIoYWNjb3VudHMsIHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGZhbHNlIC8qIGV4cGVjdEFjdGl2aXR5TGF1bmNoICovLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLyk7CiAgICAgICAgICAgICBtRmVhdHVyZXMgPSBmZWF0dXJlczsKICAgICAgICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKQEAgLTUzNywyMSArNjA5LDIyIEBACiAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXNwb25zZSBpcyBudWxsIik7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBjaGVja01hbmFnZUFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAotICAgICAgICBjYW5jZWxOb3RpZmljYXRpb24oZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChhY2NvdW50KSk7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzKSB7CisgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKGFjY291bnRzLCBhY2NvdW50KSk7CisgICAgICAgIHN5bmNocm9uaXplZChhY2NvdW50cy5jcmVkZW50aWFsc1Blcm1pc3Npb25Ob3RpZmljYXRpb25JZHMpIHsKICAgICAgICAgICAgIGZvciAoUGFpcjxQYWlyPEFjY291bnQsIFN0cmluZz4sIEludGVnZXI+IHBhaXI6Ci0gICAgICAgICAgICAgICAgbUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIGFjY291bnRzLmNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5rZXlTZXQoKSkgewogICAgICAgICAgICAgICAgIGlmIChhY2NvdW50LmVxdWFscyhwYWlyLmZpcnN0LmZpcnN0KSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSBtQ3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzLmdldChwYWlyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkID0gYWNjb3VudHMuY3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzLmdldChwYWlyKTsKICAgICAgICAgICAgICAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKGlkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFJlbW92ZUFjY291bnRTZXNzaW9uKHJlc3BvbnNlLCBhY2NvdW50KS5iaW5kKCk7CisgICAgICAgICAgICBuZXcgUmVtb3ZlQWNjb3VudFNlc3Npb24oYWNjb3VudHMsIHJlc3BvbnNlLCBhY2NvdW50KS5iaW5kKCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC01NTksOCArNjMyLDkgQEAKIAogICAgIHByaXZhdGUgY2xhc3MgUmVtb3ZlQWNjb3VudFNlc3Npb24gZXh0ZW5kcyBTZXNzaW9uIHsKICAgICAgICAgZmluYWwgQWNjb3VudCBtQWNjb3VudDsKLSAgICAgICAgcHVibGljIFJlbW92ZUFjY291bnRTZXNzaW9uKElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlLCBBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgICAgIHN1cGVyKHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGZhbHNlIC8qIGV4cGVjdEFjdGl2aXR5TGF1bmNoICovLAorICAgICAgICBwdWJsaWMgUmVtb3ZlQWNjb3VudFNlc3Npb24oVXNlckFjY291bnRzIGFjY291bnRzLCBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQpIHsKKyAgICAgICAgICAgIHN1cGVyKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudC50eXBlLCBmYWxzZSAvKiBleHBlY3RBY3Rpdml0eUxhdW5jaCAqLywKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQgKi8pOwogICAgICAgICAgICAgbUFjY291bnQgPSBhY2NvdW50OwogICAgICAgICB9CkBAIC01NzksNyArNjUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgIXJlc3VsdC5jb250YWluc0tleShBY2NvdW50TWFuYWdlci5LRVlfSU5URU5UKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVtb3ZhbEFsbG93ZWQgPSByZXN1bHQuZ2V0Qm9vbGVhbihBY2NvdW50TWFuYWdlci5LRVlfQk9PTEVBTl9SRVNVTFQpOwogICAgICAgICAgICAgICAgIGlmIChyZW1vdmFsQWxsb3dlZCkgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2NvdW50SW50ZXJuYWwobUFjY291bnQpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVBY2NvdW50SW50ZXJuYWwobUFjY291bnRzLCBtQWNjb3VudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VBbmRDbG9zZSgpOwogICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsKSB7CkBAIC02MDAsMTMgKzY3NCwxOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogRm9yIHRlc3RpbmcgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY2NvdW50SW50ZXJuYWwoQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIHJlbW92ZUFjY291bnRJbnRlcm5hbChnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKSwgYWNjb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFjY291bnRJbnRlcm5hbChVc2VyQWNjb3VudHMgYWNjb3VudHMsIEFjY291bnQgYWNjb3VudCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgIGRiLmRlbGV0ZShUQUJMRV9BQ0NPVU5UUywgQUNDT1VOVFNfTkFNRSArICI9PyBBTkQgIiArIEFDQ09VTlRTX1RZUEUrICI9PyIsCiAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXXthY2NvdW50Lm5hbWUsIGFjY291bnQudHlwZX0pOwotICAgICAgICAgICAgcmVtb3ZlQWNjb3VudEZyb21DYWNoZUxvY2tlZChhY2NvdW50KTsKLSAgICAgICAgICAgIHNlbmRBY2NvdW50c0NoYW5nZWRCcm9hZGNhc3QoKTsKKyAgICAgICAgICAgIHJlbW92ZUFjY291bnRGcm9tQ2FjaGVMb2NrZWQoYWNjb3VudHMsIGFjY291bnQpOworICAgICAgICAgICAgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdChhY2NvdW50cy51c2VySWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02MTksMTMgKzY5OCwxNCBAQAogICAgICAgICBpZiAoYWNjb3VudFR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudFR5cGUgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYXV0aFRva2VuID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF1dGhUb2tlbiBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrTWFuYWdlQWNjb3VudHNPclVzZUNyZWRlbnRpYWxzUGVybWlzc2lvbnMoKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUF1dGhUb2tlbkxvY2tlZChkYiwgYWNjb3VudFR5cGUsIGF1dGhUb2tlbik7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVBdXRoVG9rZW5Mb2NrZWQoYWNjb3VudHMsIGRiLCBhY2NvdW50VHlwZSwgYXV0aFRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgZGIuc2V0VHJhbnNhY3Rpb25TdWNjZXNzZnVsKCk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKQEAgLTYzNiw3ICs3MTYsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGludmFsaWRhdGVBdXRoVG9rZW5Mb2NrZWQoU1FMaXRlRGF0YWJhc2UgZGIsIFN0cmluZyBhY2NvdW50VHlwZSwgU3RyaW5nIGF1dGhUb2tlbikgeworICAgIHByaXZhdGUgdm9pZCBpbnZhbGlkYXRlQXV0aFRva2VuTG9ja2VkKFVzZXJBY2NvdW50cyBhY2NvdW50cywgU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBTdHJpbmcgYWNjb3VudFR5cGUsIFN0cmluZyBhdXRoVG9rZW4pIHsKICAgICAgICAgaWYgKGF1dGhUb2tlbiA9PSBudWxsIHx8IGFjY291bnRUeXBlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNjU3LDcgKzczOCw3IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGFjY291bnROYW1lID0gY3Vyc29yLmdldFN0cmluZygxKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSA9IGN1cnNvci5nZXRTdHJpbmcoMik7CiAgICAgICAgICAgICAgICAgZGIuZGVsZXRlKFRBQkxFX0FVVEhUT0tFTlMsIEFVVEhUT0tFTlNfSUQgKyAiPSIgKyBhdXRoVG9rZW5JZCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVBdXRoVG9rZW5JbnRvQ2FjaGVMb2NrZWQoZGIsIG5ldyBBY2NvdW50KGFjY291bnROYW1lLCBhY2NvdW50VHlwZSksCisgICAgICAgICAgICAgICAgd3JpdGVBdXRoVG9rZW5JbnRvQ2FjaGVMb2NrZWQoYWNjb3VudHMsIGRiLCBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFRva2VuVHlwZSwgbnVsbCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC02NjUsMTMgKzc0NiwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVBdXRoVG9rZW5Ub0RhdGFiYXNlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHR5cGUsIFN0cmluZyBhdXRoVG9rZW4pIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZUF1dGhUb2tlblRvRGF0YWJhc2UoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsIFN0cmluZyB0eXBlLAorICAgICAgICAgICAgU3RyaW5nIGF1dGhUb2tlbikgewogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKGFjY291bnQpKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgY2FuY2VsTm90aWZpY2F0aW9uKGdldFNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWQoYWNjb3VudHMsIGFjY291bnQpKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGxvbmcgYWNjb3VudElkID0gZ2V0QWNjb3VudElkTG9ja2VkKGRiLCBhY2NvdW50KTsKQEAgLTY4Nyw3ICs3NjksNyBAQAogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoQVVUSFRPS0VOU19BVVRIVE9LRU4sIGF1dGhUb2tlbik7CiAgICAgICAgICAgICAgICAgaWYgKGRiLmluc2VydChUQUJMRV9BVVRIVE9LRU5TLCBBVVRIVE9LRU5TX0FVVEhUT0tFTiwgdmFsdWVzKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGRiLnNldFRyYW5zYWN0aW9uU3VjY2Vzc2Z1bCgpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZUF1dGhUb2tlbkludG9DYWNoZUxvY2tlZChkYiwgYWNjb3VudCwgdHlwZSwgYXV0aFRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVBdXRoVG9rZW5JbnRvQ2FjaGVMb2NrZWQoYWNjb3VudHMsIGRiLCBhY2NvdW50LCB0eXBlLCBhdXRoVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzA3LDkgKzc4OSwxMCBAQAogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgaWYgKGF1dGhUb2tlblR5cGUgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYXV0aFRva2VuVHlwZSBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrQXV0aGVudGljYXRlQWNjb3VudHNQZXJtaXNzaW9uKGFjY291bnQpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiByZWFkQXV0aFRva2VuSW50ZXJuYWwoYWNjb3VudCwgYXV0aFRva2VuVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZEF1dGhUb2tlbkludGVybmFsKGFjY291bnRzLCBhY2NvdW50LCBhdXRoVG9rZW5UeXBlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KQEAgLTcyNSw5ICs4MDgsMTAgQEAKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudCBpcyBudWxsIik7CiAgICAgICAgIGlmIChhdXRoVG9rZW5UeXBlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF1dGhUb2tlblR5cGUgaXMgbnVsbCIpOwogICAgICAgICBjaGVja0F1dGhlbnRpY2F0ZUFjY291bnRzUGVybWlzc2lvbihhY2NvdW50KTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzYXZlQXV0aFRva2VuVG9EYXRhYmFzZShhY2NvdW50LCBhdXRoVG9rZW5UeXBlLCBhdXRoVG9rZW4pOworICAgICAgICAgICAgc2F2ZUF1dGhUb2tlblRvRGF0YWJhc2UoYWNjb3VudHMsIGFjY291bnQsIGF1dGhUb2tlblR5cGUsIGF1dGhUb2tlbik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC03NDEsMjAgKzgyNSwyMSBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBjaGVja0F1dGhlbnRpY2F0ZUFjY291bnRzUGVybWlzc2lvbihhY2NvdW50KTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRQYXNzd29yZEludGVybmFsKGFjY291bnQsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIHNldFBhc3N3b3JkSW50ZXJuYWwoYWNjb3VudHMsIGFjY291bnQsIHBhc3N3b3JkKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2V0UGFzc3dvcmRJbnRlcm5hbChBY2NvdW50IGFjY291bnQsIFN0cmluZyBwYXNzd29yZCkgeworICAgIHByaXZhdGUgdm9pZCBzZXRQYXNzd29yZEludGVybmFsKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcGFzc3dvcmQpIHsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CkBAIC03NjQsMjAgKzg0OSwyMCBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcmdzQWNjb3VudElkID0ge1N0cmluZy52YWx1ZU9mKGFjY291bnRJZCl9OwogICAgICAgICAgICAgICAgICAgICBkYi51cGRhdGUoVEFCTEVfQUNDT1VOVFMsIHZhbHVlcywgQUNDT1VOVFNfSUQgKyAiPT8iLCBhcmdzQWNjb3VudElkKTsKICAgICAgICAgICAgICAgICAgICAgZGIuZGVsZXRlKFRBQkxFX0FVVEhUT0tFTlMsIEFVVEhUT0tFTlNfQUNDT1VOVFNfSUQgKyAiPT8iLCBhcmdzQWNjb3VudElkKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1dGhUb2tlbkNhY2hlLnJlbW92ZShhY2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudHMuYXV0aFRva2VuQ2FjaGUucmVtb3ZlKGFjY291bnQpOwogICAgICAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGRiLmVuZFRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KCk7CisgICAgICAgICAgICBzZW5kQWNjb3VudHNDaGFuZ2VkQnJvYWRjYXN0KGFjY291bnRzLnVzZXJJZCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdCgpIHsKKyAgICBwcml2YXRlIHZvaWQgc2VuZEFjY291bnRzQ2hhbmdlZEJyb2FkY2FzdChpbnQgdXNlcklkKSB7CiAgICAgICAgIExvZy5pKFRBRywgInRoZSBhY2NvdW50cyBjaGFuZ2VkLCBzZW5kaW5nIGJyb2FkY2FzdCBvZiAiCiAgICAgICAgICAgICAgICAgKyBBQ0NPVU5UU19DSEFOR0VEX0lOVEVOVC5nZXRBY3Rpb24oKSk7Ci0gICAgICAgIG1Db250ZXh0LnNlbmRCcm9hZGNhc3QoQUNDT1VOVFNfQ0hBTkdFRF9JTlRFTlQpOworICAgICAgICBtQ29udGV4dC5zZW5kQnJvYWRjYXN0KEFDQ09VTlRTX0NIQU5HRURfSU5URU5ULCB1c2VySWQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFyUGFzc3dvcmQoQWNjb3VudCBhY2NvdW50KSB7CkBAIC03ODgsOSArODczLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudCBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrTWFuYWdlQWNjb3VudHNQZXJtaXNzaW9uKCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0UGFzc3dvcmRJbnRlcm5hbChhY2NvdW50LCBudWxsKTsKKyAgICAgICAgICAgIHNldFBhc3N3b3JkSW50ZXJuYWwoYWNjb3VudHMsIGFjY291bnQsIG51bGwpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQpAQCAtODA2LDIwICs4OTIsMjIgQEAKICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50IGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tBdXRoZW50aWNhdGVBY2NvdW50c1Blcm1pc3Npb24oYWNjb3VudCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgc2V0VXNlcmRhdGFJbnRlcm5hbChhY2NvdW50LCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHNldFVzZXJkYXRhSW50ZXJuYWwoYWNjb3VudHMsIGFjY291bnQsIGtleSwgdmFsdWUpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZXRVc2VyZGF0YUludGVybmFsKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgcHJpdmF0ZSB2b2lkIHNldFVzZXJkYXRhSW50ZXJuYWwoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsIFN0cmluZyBrZXksCisgICAgICAgICAgICBTdHJpbmcgdmFsdWUpIHsKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCB8fCBrZXkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgZGIuYmVnaW5UcmFuc2FjdGlvbigpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsb25nIGFjY291bnRJZCA9IGdldEFjY291bnRJZExvY2tlZChkYiwgYWNjb3VudCk7CkBAIC04NDAsNyArOTI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlVXNlckRhdGFJbnRvQ2FjaGVMb2NrZWQoZGIsIGFjY291bnQsIGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIHdyaXRlVXNlckRhdGFJbnRvQ2FjaGVMb2NrZWQoYWNjb3VudHMsIGRiLCBhY2NvdW50LCBrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgICBkYi5zZXRUcmFuc2FjdGlvblN1Y2Nlc3NmdWwoKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgZGIuZW5kVHJhbnNhY3Rpb24oKTsKQEAgLTg2OCwxNSArOTU2LDE2IEBACiAgICAgfQogCiAgICAgdm9pZCBnZXRBdXRoVG9rZW5MYWJlbChmaW5hbCBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCwgZmluYWwgU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBpbnQgdWlkKSB7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYXV0aFRva2VuVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdXRoVG9rZW5UeXBlIGlzIG51bGwiKTsKIAogICAgICAgICBjaGVja0JpbmRlclBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5VU0VfQ1JFREVOVElBTFMpOwotCisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50cyhVc2VySWQuZ2V0VXNlcklkKHVpZCkpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFNlc3Npb24ocmVzcG9uc2UsIGFjY291bnQudHlwZSwgZmFsc2UsCisgICAgICAgICAgICBuZXcgU2Vzc2lvbihhY2NvdW50cywgcmVzcG9uc2UsIGFjY291bnQudHlwZSwgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLykgewogICAgICAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdG9EZWJ1Z1N0cmluZyhsb25nIG5vdykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9EZWJ1Z1N0cmluZyhub3cpICsgIiwgZ2V0QXV0aFRva2VuTGFiZWwiCkBAIC05MjEsNiArMTAxMCw3IEBACiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBpZiAoYXV0aFRva2VuVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhdXRoVG9rZW5UeXBlIGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tCaW5kZXJQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uVVNFX0NSRURFTlRJQUxTKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIEFjY291bnRBdXRoZW50aWNhdG9yQ2FjaGUuU2VydmljZUluZm88QXV0aGVudGljYXRvckRlc2NyaXB0aW9uPiBhdXRoZW50aWNhdG9ySW5mbyA9CiAgICAgICAgICAgICBtQXV0aGVudGljYXRvckNhY2hlLmdldFNlcnZpY2VJbmZvKAogICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdG9yRGVzY3JpcHRpb24ubmV3S2V5KGFjY291bnQudHlwZSkpOwpAQCAtOTQ2LDcgKzEwMzYsNyBAQAogICAgICAgICAgICAgLy8gaWYgdGhlIGNhbGxlciBoYXMgcGVybWlzc2lvbiwgZG8gdGhlIHBlZWsuIG90aGVyd2lzZSBnbyB0aGUgbW9yZSBleHBlbnNpdmUKICAgICAgICAgICAgIC8vIHJvdXRlIG9mIHN0YXJ0aW5nIGEgU2Vzc2lvbgogICAgICAgICAgICAgaWYgKCFjdXN0b21Ub2tlbnMgJiYgcGVybWlzc2lvbkdyYW50ZWQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aFRva2VuID0gcmVhZEF1dGhUb2tlbkludGVybmFsKGFjY291bnQsIGF1dGhUb2tlblR5cGUpOworICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoVG9rZW4gPSByZWFkQXV0aFRva2VuSW50ZXJuYWwoYWNjb3VudHMsIGFjY291bnQsIGF1dGhUb2tlblR5cGUpOwogICAgICAgICAgICAgICAgIGlmIChhdXRoVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BVVRIVE9LRU4sIGF1dGhUb2tlbik7CkBAIC05NTcsNyArMTA0Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBuZXcgU2Vzc2lvbihyZXNwb25zZSwgYWNjb3VudC50eXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKKyAgICAgICAgICAgIG5ldyBTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudC50eXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc3RyaXBBdXRoVG9rZW5Gcm9tUmVzdWx0ICovKSB7CiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyB0b0RlYnVnU3RyaW5nKGxvbmcgbm93KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dpbk9wdGlvbnMgIT0gbnVsbCkgbG9naW5PcHRpb25zLmtleVNldCgpOwpAQCAtMTAwMCwxNCArMTA5MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VzdG9tVG9rZW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVBdXRoVG9rZW5Ub0RhdGFiYXNlKG5ldyBBY2NvdW50KG5hbWUsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlQXV0aFRva2VuVG9EYXRhYmFzZShtQWNjb3VudHMsIG5ldyBBY2NvdW50KG5hbWUsIHR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhUb2tlblR5cGUsIGF1dGhUb2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gcmVzdWx0LmdldFBhcmNlbGFibGUoQWNjb3VudE1hbmFnZXIuS0VZX0lOVEVOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwgJiYgbm90aWZ5T25BdXRoRmFpbHVyZSAmJiAhY3VzdG9tVG9rZW5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ob3RpZmljYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9Ob3RpZmljYXRpb24obUFjY291bnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgcmVzdWx0LmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQVVUSF9GQUlMRURfTUVTU0FHRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTA5MCwyNiArMTE4MCwyNyBAQAogICAgIHByaXZhdGUgSW50ZWdlciBnZXRDcmVkZW50aWFsUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhUb2tlblR5cGUsCiAgICAgICAgICAgICBpbnQgdWlkKSB7CiAgICAgICAgIEludGVnZXIgaWQ7Ci0gICAgICAgIHN5bmNocm9uaXplZChtQ3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzKSB7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50cyhVc2VySWQuZ2V0VXNlcklkKHVpZCkpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcykgewogICAgICAgICAgICAgZmluYWwgUGFpcjxQYWlyPEFjY291bnQsIFN0cmluZz4sIEludGVnZXI+IGtleSA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBQYWlyPFBhaXI8QWNjb3VudCwgU3RyaW5nPiwgSW50ZWdlcj4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFBhaXI8QWNjb3VudCwgU3RyaW5nPihhY2NvdW50LCBhdXRoVG9rZW5UeXBlKSwgdWlkKTsKLSAgICAgICAgICAgIGlkID0gbUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlkID0gYWNjb3VudHMuY3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzLmdldChrZXkpOwogICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZCA9IG1Ob3RpZmljYXRpb25JZHMuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICAgICAgbUNyZWRlbnRpYWxzUGVybWlzc2lvbk5vdGlmaWNhdGlvbklkcy5wdXQoa2V5LCBpZCk7CisgICAgICAgICAgICAgICAgYWNjb3VudHMuY3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uSWRzLnB1dChrZXksIGlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gaWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBJbnRlZ2VyIGdldFNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWQoQWNjb3VudCBhY2NvdW50KSB7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIGdldFNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWQoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQpIHsKICAgICAgICAgSW50ZWdlciBpZDsKLSAgICAgICAgc3luY2hyb25pemVkKG1TaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcykgewotICAgICAgICAgICAgaWQgPSBtU2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZHMuZ2V0KGFjY291bnQpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLnNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWRzKSB7CisgICAgICAgICAgICBpZCA9IGFjY291bnRzLnNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWRzLmdldChhY2NvdW50KTsKICAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWQgPSBtTm90aWZpY2F0aW9uSWRzLmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgIG1TaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkcy5wdXQoYWNjb3VudCwgaWQpOworICAgICAgICAgICAgICAgIGFjY291bnRzLnNpZ25pblJlcXVpcmVkTm90aWZpY2F0aW9uSWRzLnB1dChhY2NvdW50LCBpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkOwpAQCAtMTEzMSw2ICsxMjIyLDcgQEAKICAgICAgICAgaWYgKGFjY291bnRUeXBlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnRUeXBlIGlzIG51bGwiKTsKICAgICAgICAgY2hlY2tNYW5hZ2VBY2NvdW50c1Blcm1pc3Npb24oKTsKIAorICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgZmluYWwgaW50IHBpZCA9IEJpbmRlci5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIGZpbmFsIGludCB1aWQgPSBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9ucyA9IChvcHRpb25zSW4gPT0gbnVsbCkgPyBuZXcgQnVuZGxlKCkgOiBvcHRpb25zSW47CkBAIC0xMTM5LDcgKzEyMzEsNyBAQAogCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXcgU2Vzc2lvbihyZXNwb25zZSwgYWNjb3VudFR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAorICAgICAgICAgICAgbmV3IFNlc3Npb24oYWNjb3VudHMsIHJlc3BvbnNlLCBhY2NvdW50VHlwZSwgZXhwZWN0QWN0aXZpdHlMYXVuY2gsCiAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogc3RyaXBBdXRoVG9rZW5Gcm9tUmVzdWx0ICovKSB7CiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgIG1BdXRoZW50aWNhdG9yLmFkZEFjY291bnQodGhpcywgbUFjY291bnRUeXBlLCBhdXRoVG9rZW5UeXBlLCByZXF1aXJlZEZlYXR1cmVzLApAQCAtMTE3Miw5ICsxMjY0LDEwIEBACiAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXNwb25zZSBpcyBudWxsIik7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnQgaXMgbnVsbCIpOwogICAgICAgICBjaGVja01hbmFnZUFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBTZXNzaW9uKHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAorICAgICAgICAgICAgbmV3IFNlc3Npb24oYWNjb3VudHMsIHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLykgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICBtQXV0aGVudGljYXRvci5jb25maXJtQ3JlZGVudGlhbHModGhpcywgYWNjb3VudCwgb3B0aW9ucyk7CkBAIC0xMjA0LDkgKzEyOTcsMTAgQEAKICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWNjb3VudCBpcyBudWxsIik7CiAgICAgICAgIGlmIChhdXRoVG9rZW5UeXBlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImF1dGhUb2tlblR5cGUgaXMgbnVsbCIpOwogICAgICAgICBjaGVja01hbmFnZUFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBTZXNzaW9uKHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAorICAgICAgICAgICAgbmV3IFNlc3Npb24oYWNjb3VudHMsIHJlc3BvbnNlLCBhY2NvdW50LnR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLykgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICBtQXV0aGVudGljYXRvci51cGRhdGVDcmVkZW50aWFscyh0aGlzLCBhY2NvdW50LCBhdXRoVG9rZW5UeXBlLCBsb2dpbk9wdGlvbnMpOwpAQCAtMTIzNiw5ICsxMzMwLDEwIEBACiAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXNwb25zZSBpcyBudWxsIik7CiAgICAgICAgIGlmIChhY2NvdW50VHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50VHlwZSBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrTWFuYWdlQWNjb3VudHNQZXJtaXNzaW9uKCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50c0ZvckNhbGxlcigpOwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbmV3IFNlc3Npb24ocmVzcG9uc2UsIGFjY291bnRUeXBlLCBleHBlY3RBY3Rpdml0eUxhdW5jaCwKKyAgICAgICAgICAgIG5ldyBTZXNzaW9uKGFjY291bnRzLCByZXNwb25zZSwgYWNjb3VudFR5cGUsIGV4cGVjdEFjdGl2aXR5TGF1bmNoLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLykgewogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICBtQXV0aGVudGljYXRvci5lZGl0UHJvcGVydGllcyh0aGlzLCBtQWNjb3VudFR5cGUpOwpAQCAtMTI1OSwxNiArMTM1NCwxNiBAQAogICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEFycmF5TGlzdDxBY2NvdW50PiBtQWNjb3VudHNXaXRoRmVhdHVyZXMgPSBudWxsOwogICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBtQ3VycmVudEFjY291bnQgPSAwOwogCi0gICAgICAgIHB1YmxpYyBHZXRBY2NvdW50c0J5VHlwZUFuZEZlYXR1cmVTZXNzaW9uKElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICAgICAgU3RyaW5nIHR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7Ci0gICAgICAgICAgICBzdXBlcihyZXNwb25zZSwgdHlwZSwgZmFsc2UgLyogZXhwZWN0QWN0aXZpdHlMYXVuY2ggKi8sCisgICAgICAgIHB1YmxpYyBHZXRBY2NvdW50c0J5VHlwZUFuZEZlYXR1cmVTZXNzaW9uKFVzZXJBY2NvdW50cyBhY2NvdW50cywKKyAgICAgICAgICAgICAgICBJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIHR5cGUsIFN0cmluZ1tdIGZlYXR1cmVzKSB7CisgICAgICAgICAgICBzdXBlcihhY2NvdW50cywgcmVzcG9uc2UsIHR5cGUsIGZhbHNlIC8qIGV4cGVjdEFjdGl2aXR5TGF1bmNoICovLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCAqLyk7CiAgICAgICAgICAgICBtRmVhdHVyZXMgPSBmZWF0dXJlczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUFjY291bnRzT2ZUeXBlID0gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQobUFjY291bnRUeXBlKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgICAgIG1BY2NvdW50c09mVHlwZSA9IGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKG1BY2NvdW50cywgbUFjY291bnRUeXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZWFjaCBhY2NvdW50IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBmZWF0dXJlcwogICAgICAgICAgICAgbUFjY291bnRzV2l0aEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxBY2NvdW50PihtQWNjb3VudHNPZlR5cGUubGVuZ3RoKTsKQEAgLTEzNDYsNiArMTQ0MSwyMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYWNjb3VudHMgZm9yIGEgc3BlY2lmaWMgdXNlcgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIEFjY291bnRbXSBnZXRBY2NvdW50cyhpbnQgdXNlcklkKSB7CisgICAgICAgIGNoZWNrUmVhZEFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHModXNlcklkKTsKKyAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKGFjY291bnRzLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgQWNjb3VudFtdIGdldEFjY291bnRzKFN0cmluZyB0eXBlKSB7CiAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewogICAgICAgICAgICAgTG9nLnYoVEFHLCAiZ2V0QWNjb3VudHM6IGFjY291bnRUeXBlICIgKyB0eXBlCkBAIC0xMzUzLDEwICsxNDY1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICsgIiwgcGlkICIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgfQogICAgICAgICBjaGVja1JlYWRBY2NvdW50c1Blcm1pc3Npb24oKTsKKyAgICAgICAgVXNlckFjY291bnRzIGFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQodHlwZSk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZChhY2NvdW50cywgdHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpAQCAtMTM3NSwxOSArMTQ4OCwyMCBAQAogICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzcG9uc2UgaXMgbnVsbCIpOwogICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY2NvdW50VHlwZSBpcyBudWxsIik7CiAgICAgICAgIGNoZWNrUmVhZEFjY291bnRzUGVybWlzc2lvbigpOworICAgICAgICBVc2VyQWNjb3VudHMgdXNlckFjY291bnRzID0gZ2V0VXNlckFjY291bnRzRm9yQ2FsbGVyKCk7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgIEFjY291bnRbXSBhY2NvdW50czsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgYWNjb3VudHMgPSBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZCh0eXBlKTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJBY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudHMgPSBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZCh1c2VyQWNjb3VudHMsIHR5cGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBCdW5kbGUgcmVzdWx0ID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRQYXJjZWxhYmxlQXJyYXkoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRTLCBhY2NvdW50cyk7CiAgICAgICAgICAgICAgICAgb25SZXN1bHQocmVzcG9uc2UsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbmV3IEdldEFjY291bnRzQnlUeXBlQW5kRmVhdHVyZVNlc3Npb24ocmVzcG9uc2UsIHR5cGUsIGZlYXR1cmVzKS5iaW5kKCk7CisgICAgICAgICAgICBuZXcgR2V0QWNjb3VudHNCeVR5cGVBbmRGZWF0dXJlU2Vzc2lvbih1c2VyQWNjb3VudHMsIHJlc3BvbnNlLCB0eXBlLCBmZWF0dXJlcykuYmluZCgpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQpAQCAtMTQzNSwxMiArMTU0OSwxNCBAQAogICAgICAgICBJQWNjb3VudEF1dGhlbnRpY2F0b3IgbUF1dGhlbnRpY2F0b3IgPSBudWxsOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtU3RyaXBBdXRoVG9rZW5Gcm9tUmVzdWx0OworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVXNlckFjY291bnRzIG1BY2NvdW50czsKIAotICAgICAgICBwdWJsaWMgU2Vzc2lvbihJQWNjb3VudE1hbmFnZXJSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjY291bnRUeXBlLAorICAgICAgICBwdWJsaWMgU2Vzc2lvbihVc2VyQWNjb3VudHMgYWNjb3VudHMsIElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgYWNjb3VudFR5cGUsCiAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHBlY3RBY3Rpdml0eUxhdW5jaCwgYm9vbGVhbiBzdHJpcEF1dGhUb2tlbkZyb21SZXN1bHQpIHsKICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVzcG9uc2UgaXMgbnVsbCIpOwogICAgICAgICAgICAgaWYgKGFjY291bnRUeXBlID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjY291bnRUeXBlIGlzIG51bGwiKTsKKyAgICAgICAgICAgIG1BY2NvdW50cyA9IGFjY291bnRzOwogICAgICAgICAgICAgbVN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdCA9IHN0cmlwQXV0aFRva2VuRnJvbVJlc3VsdDsKICAgICAgICAgICAgIG1SZXNwb25zZSA9IHJlc3BvbnNlOwogICAgICAgICAgICAgbUFjY291bnRUeXBlID0gYWNjb3VudFR5cGU7CkBAIC0xNTc4LDcgKzE2OTQsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSA9IHJlc3VsdC5nZXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSk7CiAgICAgICAgICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShhY2NvdW50TmFtZSkgJiYgIVRleHRVdGlscy5pc0VtcHR5KGFjY291bnRUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQgPSBuZXcgQWNjb3VudChhY2NvdW50TmFtZSwgYWNjb3VudFR5cGUpOwotICAgICAgICAgICAgICAgICAgICBjYW5jZWxOb3RpZmljYXRpb24oZ2V0U2lnbmluUmVxdWlyZWROb3RpZmljYXRpb25JZChhY2NvdW50KSk7CisgICAgICAgICAgICAgICAgICAgIGNhbmNlbE5vdGlmaWNhdGlvbihnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKG1BY2NvdW50cywgYWNjb3VudCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIElBY2NvdW50TWFuYWdlclJlc3BvbnNlIHJlc3BvbnNlOwpAQCAtMTY5NCwyMCArMTgxMCwyMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLSAgICAgICAgaWYoRW52aXJvbm1lbnQuaXNFbmNyeXB0ZWRGaWxlc3lzdGVtRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBIYXJkLWNvZGVkIHBhdGggaW4gY2FzZSBvZiBlbmNyeXB0ZWQgZmlsZSBzeXN0ZW0KLSAgICAgICAgICAgIHJldHVybiBFbnZpcm9ubWVudC5nZXRTeXN0ZW1TZWN1cmVEaXJlY3RvcnkoKS5nZXRQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIERBVEFCQVNFX05BTUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBSZWd1bGFyIHBhdGggaW4gY2FzZSBvZiBub24tZW5jcnlwdGVkIGZpbGUgc3lzdGVtCi0gICAgICAgICAgICByZXR1cm4gREFUQUJBU0VfTkFNRTsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKGludCB1c2VySWQpIHsKKyAgICAgICAgRmlsZSBzeXN0ZW1EaXIgPSBFbnZpcm9ubWVudC5nZXRTeXN0ZW1TZWN1cmVEaXJlY3RvcnkoKTsKKyAgICAgICAgRmlsZSBkYXRhYmFzZUZpbGUgPSBuZXcgRmlsZShzeXN0ZW1EaXIsICJ1c2Vycy8iICsgdXNlcklkICsgIi8iICsgREFUQUJBU0VfTkFNRSk7CisgICAgICAgIGlmICh1c2VySWQgPT0gMCkgeworICAgICAgICAgICAgLy8gTWlncmF0ZSBvbGQgZmlsZSwgaWYgaXQgZXhpc3RzLCB0byB0aGUgbmV3IGxvY2F0aW9uCisgICAgICAgICAgICBGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShzeXN0ZW1EaXIsIERBVEFCQVNFX05BTUUpOworICAgICAgICAgICAgaWYgKG9sZEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBvbGRGaWxlLnJlbmFtZVRvKGRhdGFiYXNlRmlsZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRhdGFiYXNlRmlsZS5nZXRQYXRoKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgIHN0YXRpYyBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgewogCi0gICAgICAgIHB1YmxpYyBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIEFjY291bnRNYW5hZ2VyU2VydmljZS5nZXREYXRhYmFzZU5hbWUoKSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CisgICAgICAgIHB1YmxpYyBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQsIGludCB1c2VySWQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIEFjY291bnRNYW5hZ2VyU2VydmljZS5nZXREYXRhYmFzZU5hbWUodXNlcklkKSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTE3OTksMTUgKzE5MTgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNldE1ldGFWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwotICAgICAgICB2YWx1ZXMucHV0KE1FVEFfS0VZLCBrZXkpOwotICAgICAgICB2YWx1ZXMucHV0KE1FVEFfVkFMVUUsIHZhbHVlKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCkucmVwbGFjZShUQUJMRV9NRVRBLCBNRVRBX0tFWSwgdmFsdWVzKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIHJldHVybiBhc0JpbmRlcigpOwogICAgIH0KQEAgLTE4MzcsMTEgKzE5NDcsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiIHdpdGhvdXQgcGVybWlzc2lvbiAiICsgYW5kcm9pZC5NYW5pZmVzdC5wZXJtaXNzaW9uLkRVTVApOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNDaGVja2luUmVxdWVzdCA9IHNjYW5BcmdzKGFyZ3MsICItLWNoZWNraW4iKSB8fCBzY2FuQXJncyhhcmdzLCAiLWMiKTsKIAotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICBmb3V0ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKGZvdXQsICIgICIpOworICAgICAgICBpbnQgc2l6ZSA9IG1Vc2Vycy5zaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmb3V0LnByaW50bG4oIlVzZXIgIiArIG1Vc2Vycy5rZXlBdChpKSArICI6Iik7CisgICAgICAgICAgICAoKEluZGVudGluZ1ByaW50V3JpdGVyKSBmb3V0KS5pbmNyZWFzZUluZGVudCgpOworICAgICAgICAgICAgZHVtcFVzZXIobVVzZXJzLnZhbHVlQXQoaSksIGZkLCBmb3V0LCBhcmdzLCBpc0NoZWNraW5SZXF1ZXN0KTsKKyAgICAgICAgICAgICgoSW5kZW50aW5nUHJpbnRXcml0ZXIpIGZvdXQpLmRlY3JlYXNlSW5kZW50KCk7CisgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgZm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNDaGVja2luUmVxdWVzdCA9IHNjYW5BcmdzKGFyZ3MsICItLWNoZWNraW4iKSB8fCBzY2FuQXJncyhhcmdzLCAiLWMiKTsKKyAgICBwcml2YXRlIHZvaWQgZHVtcFVzZXIoVXNlckFjY291bnRzIHVzZXJBY2NvdW50cywgRmlsZURlc2NyaXB0b3IgZmQsIFByaW50V3JpdGVyIGZvdXQsCisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzLCBib29sZWFuIGlzQ2hlY2tpblJlcXVlc3QpIHsKKyAgICAgICAgc3luY2hyb25pemVkICh1c2VyQWNjb3VudHMuY2FjaGVMb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IHVzZXJBY2NvdW50cy5vcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKIAogICAgICAgICAgICAgaWYgKGlzQ2hlY2tpblJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY2hlY2tpbiByZXF1ZXN0LiAqT25seSogdXBsb2FkIHRoZSBhY2NvdW50IHR5cGVzIGFuZCB0aGUgY291bnQgb2YgZWFjaC4KQEAgLTE4NTgsNyArMTk4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFjY291bnRbXSBhY2NvdW50cyA9IGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKG51bGwgLyogdHlwZSAqLyk7CisgICAgICAgICAgICAgICAgQWNjb3VudFtdIGFjY291bnRzID0gZ2V0QWNjb3VudHNGcm9tQ2FjaGVMb2NrZWQodXNlckFjY291bnRzLCBudWxsIC8qIHR5cGUgKi8pOwogICAgICAgICAgICAgICAgIGZvdXQucHJpbnRsbigiQWNjb3VudHM6ICIgKyBhY2NvdW50cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgIGZvciAoQWNjb3VudCBhY2NvdW50IDogYWNjb3VudHMpIHsKICAgICAgICAgICAgICAgICAgICAgZm91dC5wcmludGxuKCIgICIgKyBhY2NvdW50KTsKQEAgLTE4NzksNyArMjAwMyw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZG9Ob3RpZmljYXRpb24oQWNjb3VudCBhY2NvdW50LCBDaGFyU2VxdWVuY2UgbWVzc2FnZSwgSW50ZW50IGludGVudCkgeworICAgIHByaXZhdGUgdm9pZCBkb05vdGlmaWNhdGlvbihVc2VyQWNjb3VudHMgYWNjb3VudHMsIEFjY291bnQgYWNjb3VudCwgQ2hhclNlcXVlbmNlIG1lc3NhZ2UsCisgICAgICAgICAgICBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKQEAgLTE4OTEsNyArMjAxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldENvbXBvbmVudCgpLmdldENsYXNzTmFtZSgpKSkgewogICAgICAgICAgICAgICAgIGNyZWF0ZU5vQ3JlZGVudGlhbHNQZXJtaXNzaW9uTm90aWZpY2F0aW9uKGFjY291bnQsIGludGVudCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgbm90aWZpY2F0aW9uSWQgPSBnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKGFjY291bnQpOworICAgICAgICAgICAgICAgIGZpbmFsIEludGVnZXIgbm90aWZpY2F0aW9uSWQgPSBnZXRTaWduaW5SZXF1aXJlZE5vdGlmaWNhdGlvbklkKGFjY291bnRzLCBhY2NvdW50KTsKICAgICAgICAgICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoU3RyaW5nLnZhbHVlT2Yobm90aWZpY2F0aW9uSWQpKTsKICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb24gbiA9IG5ldyBOb3RpZmljYXRpb24oYW5kcm9pZC5SLmRyYXdhYmxlLnN0YXRfc3lzX3dhcm5pbmcsIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHdoZW4gKi8pOwpAQCAtMTk2Miw3ICsyMDg3LDcgQEAKICAgICAgICAgZmluYWwgYm9vbGVhbiBmcm9tQXV0aGVudGljYXRvciA9IGFjY291bnQgIT0gbnVsbAogICAgICAgICAgICAgICAgICYmIGhhc0F1dGhlbnRpY2F0b3JVaWQoYWNjb3VudC50eXBlLCBjYWxsZXJVaWQpOwogICAgICAgICBmaW5hbCBib29sZWFuIGhhc0V4cGxpY2l0R3JhbnRzID0gYWNjb3VudCAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgaGFzRXhwbGljaXRseUdyYW50ZWRQZXJtaXNzaW9uKGFjY291bnQsIGF1dGhUb2tlblR5cGUpOworICAgICAgICAgICAgICAgICYmIGhhc0V4cGxpY2l0bHlHcmFudGVkUGVybWlzc2lvbihhY2NvdW50LCBhdXRoVG9rZW5UeXBlLCBjYWxsZXJVaWQpOwogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgIExvZy52KFRBRywgImNoZWNrR3JhbnRzT3JDYWxsaW5nVWlkQWdhaW5zdEF1dGhlbnRpY2F0b3I6IGNhbGxlciB1aWQgIgogICAgICAgICAgICAgICAgICAgICArIGNhbGxlclVpZCArICIsICIgKyBhY2NvdW50CkBAIC0xOTg0LDEzICsyMTA5LDE1IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRXhwbGljaXRseUdyYW50ZWRQZXJtaXNzaW9uKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKLSAgICAgICAgaWYgKEJpbmRlci5nZXRDYWxsaW5nVWlkKCkgPT0gYW5kcm9pZC5vcy5Qcm9jZXNzLlNZU1RFTV9VSUQpIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRXhwbGljaXRseUdyYW50ZWRQZXJtaXNzaW9uKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhUb2tlblR5cGUsCisgICAgICAgICAgICBpbnQgY2FsbGVyVWlkKSB7CisgICAgICAgIGlmIChjYWxsZXJVaWQgPT0gYW5kcm9pZC5vcy5Qcm9jZXNzLlNZU1RFTV9VSUQpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0ge1N0cmluZy52YWx1ZU9mKEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpLCBhdXRoVG9rZW5UeXBlLAorICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHNGb3JDYWxsZXIoKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CisgICAgICAgICAgICBTdHJpbmdbXSBhcmdzID0geyBTdHJpbmcudmFsdWVPZihjYWxsZXJVaWQpLCBhdXRoVG9rZW5UeXBlLAogICAgICAgICAgICAgICAgICAgICBhY2NvdW50Lm5hbWUsIGFjY291bnQudHlwZX07CiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHBlcm1pc3Npb25HcmFudGVkID0KICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VVdGlscy5sb25nRm9yUXVlcnkoZGIsIENPVU5UX09GX01BVENISU5HX0dSQU5UUywgYXJncykgIT0gMDsKQEAgLTE5OTgsNyArMjEyNSw3IEBACiAgICAgICAgICAgICAgICAgLy8gVE9ETzogU2tpcCB0aGlzIGNoZWNrIHdoZW4gcnVubmluZyBhdXRvbWF0ZWQgdGVzdHMuIFJlcGxhY2UgdGhpcwogICAgICAgICAgICAgICAgIC8vIHdpdGggYSBtb3JlIGdlbmVyYWwgc29sdXRpb24uCiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAibm8gY3JlZGVudGlhbHMgcGVybWlzc2lvbiBmb3IgdXNhZ2Ugb2YgIiArIGFjY291bnQgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGF1dGhUb2tlblR5cGUgKyAiIGJ5IHVpZCAiICsgQmluZGVyLmdldENhbGxpbmdVaWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBhdXRoVG9rZW5UeXBlICsgIiBieSB1aWQgIiArIGNhbGxlclVpZAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJ1dCBpZ25vcmluZyBzaW5jZSBkZXZpY2UgaXMgaW4gdGVzdCBoYXJuZXNzLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQpAQCAtMjA0OCw4ICsyMTc1LDkgQEAKICAgICAgICAgICAgIExvZy5lKFRBRywgImdyYW50QXBwUGVybWlzc2lvbjogY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHMiLCBuZXcgRXhjZXB0aW9uKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CisgICAgICAgIFVzZXJBY2NvdW50cyBhY2NvdW50cyA9IGdldFVzZXJBY2NvdW50cyhVc2VySWQuZ2V0VXNlcklkKHVpZCkpOworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIgPSBhY2NvdW50cy5vcGVuSGVscGVyLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKICAgICAgICAgICAgIGRiLmJlZ2luVHJhbnNhY3Rpb24oKTsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbG9uZyBhY2NvdW50SWQgPSBnZXRBY2NvdW50SWRMb2NrZWQoZGIsIGFjY291bnQpOwpAQCAtMjA4MSw4ICsyMjA5LDkgQEAKICAgICAgICAgICAgIExvZy5lKFRBRywgInJldm9rZUFwcFBlcm1pc3Npb246IGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzIiwgbmV3IEV4Y2VwdGlvbigpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1DYWNoZUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworICAgICAgICBVc2VyQWNjb3VudHMgYWNjb3VudHMgPSBnZXRVc2VyQWNjb3VudHMoVXNlcklkLmdldFVzZXJJZCh1aWQpKTsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICBkYi5iZWdpblRyYW5zYWN0aW9uKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGxvbmcgYWNjb3VudElkID0gZ2V0QWNjb3VudElkTG9ja2VkKGRiLCBhY2NvdW50KTsKQEAgLTIxMDUsOCArMjIzNCw4IEBACiAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gKCJbIiArIFRleHRVdGlscy5qb2luKCIsIiwgdmFsdWUpICsgIl0iKSA6IG51bGw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFjY291bnRGcm9tQ2FjaGVMb2NrZWQoQWNjb3VudCBhY2NvdW50KSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRbXSBvbGRBY2NvdW50c0ZvclR5cGUgPSBtQWNjb3VudENhY2hlLmdldChhY2NvdW50LnR5cGUpOworICAgIHByaXZhdGUgdm9pZCByZW1vdmVBY2NvdW50RnJvbUNhY2hlTG9ja2VkKFVzZXJBY2NvdW50cyBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50KSB7CisgICAgICAgIGZpbmFsIEFjY291bnRbXSBvbGRBY2NvdW50c0ZvclR5cGUgPSBhY2NvdW50cy5hY2NvdW50Q2FjaGUuZ2V0KGFjY291bnQudHlwZSk7CiAgICAgICAgIGlmIChvbGRBY2NvdW50c0ZvclR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgQXJyYXlMaXN0PEFjY291bnQ+IG5ld0FjY291bnRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8QWNjb3VudD4oKTsKICAgICAgICAgICAgIGZvciAoQWNjb3VudCBjdXJBY2NvdW50IDogb2xkQWNjb3VudHNGb3JUeXBlKSB7CkBAIC0yMTE1LDM0ICsyMjQ0LDM0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5ld0FjY291bnRzTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQWNjb3VudENhY2hlLnJlbW92ZShhY2NvdW50LnR5cGUpOworICAgICAgICAgICAgICAgIGFjY291bnRzLmFjY291bnRDYWNoZS5yZW1vdmUoYWNjb3VudC50eXBlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQWNjb3VudFtdIG5ld0FjY291bnRzRm9yVHlwZSA9IG5ldyBBY2NvdW50W25ld0FjY291bnRzTGlzdC5zaXplKCldOwogICAgICAgICAgICAgICAgIG5ld0FjY291bnRzRm9yVHlwZSA9IG5ld0FjY291bnRzTGlzdC50b0FycmF5KG5ld0FjY291bnRzRm9yVHlwZSk7Ci0gICAgICAgICAgICAgICAgbUFjY291bnRDYWNoZS5wdXQoYWNjb3VudC50eXBlLCBuZXdBY2NvdW50c0ZvclR5cGUpOworICAgICAgICAgICAgICAgIGFjY291bnRzLmFjY291bnRDYWNoZS5wdXQoYWNjb3VudC50eXBlLCBuZXdBY2NvdW50c0ZvclR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1Vc2VyRGF0YUNhY2hlLnJlbW92ZShhY2NvdW50KTsKLSAgICAgICAgbUF1dGhUb2tlbkNhY2hlLnJlbW92ZShhY2NvdW50KTsKKyAgICAgICAgYWNjb3VudHMudXNlckRhdGFDYWNoZS5yZW1vdmUoYWNjb3VudCk7CisgICAgICAgIGFjY291bnRzLmF1dGhUb2tlbkNhY2hlLnJlbW92ZShhY2NvdW50KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgYWNjb3VudCBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbnNlcnRBY2NvdW50SW50b0NhY2hlTG9ja2VkKEFjY291bnQgYWNjb3VudCkgewotICAgICAgICBBY2NvdW50W10gYWNjb3VudHNGb3JUeXBlID0gbUFjY291bnRDYWNoZS5nZXQoYWNjb3VudC50eXBlKTsKKyAgICBwcml2YXRlIHZvaWQgaW5zZXJ0QWNjb3VudEludG9DYWNoZUxvY2tlZChVc2VyQWNjb3VudHMgYWNjb3VudHMsIEFjY291bnQgYWNjb3VudCkgeworICAgICAgICBBY2NvdW50W10gYWNjb3VudHNGb3JUeXBlID0gYWNjb3VudHMuYWNjb3VudENhY2hlLmdldChhY2NvdW50LnR5cGUpOwogICAgICAgICBpbnQgb2xkTGVuZ3RoID0gKGFjY291bnRzRm9yVHlwZSAhPSBudWxsKSA/IGFjY291bnRzRm9yVHlwZS5sZW5ndGggOiAwOwogICAgICAgICBBY2NvdW50W10gbmV3QWNjb3VudHNGb3JUeXBlID0gbmV3IEFjY291bnRbb2xkTGVuZ3RoICsgMV07CiAgICAgICAgIGlmIChhY2NvdW50c0ZvclR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhY2NvdW50c0ZvclR5cGUsIDAsIG5ld0FjY291bnRzRm9yVHlwZSwgMCwgb2xkTGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBuZXdBY2NvdW50c0ZvclR5cGVbb2xkTGVuZ3RoXSA9IGFjY291bnQ7Ci0gICAgICAgIG1BY2NvdW50Q2FjaGUucHV0KGFjY291bnQudHlwZSwgbmV3QWNjb3VudHNGb3JUeXBlKTsKKyAgICAgICAgYWNjb3VudHMuYWNjb3VudENhY2hlLnB1dChhY2NvdW50LnR5cGUsIG5ld0FjY291bnRzRm9yVHlwZSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEFjY291bnRbXSBnZXRBY2NvdW50c0Zyb21DYWNoZUxvY2tlZChTdHJpbmcgYWNjb3VudFR5cGUpIHsKKyAgICBwcm90ZWN0ZWQgQWNjb3VudFtdIGdldEFjY291bnRzRnJvbUNhY2hlTG9ja2VkKFVzZXJBY2NvdW50cyB1c2VyQWNjb3VudHMsIFN0cmluZyBhY2NvdW50VHlwZSkgewogICAgICAgICBpZiAoYWNjb3VudFR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgQWNjb3VudFtdIGFjY291bnRzID0gbUFjY291bnRDYWNoZS5nZXQoYWNjb3VudFR5cGUpOworICAgICAgICAgICAgZmluYWwgQWNjb3VudFtdIGFjY291bnRzID0gdXNlckFjY291bnRzLmFjY291bnRDYWNoZS5nZXQoYWNjb3VudFR5cGUpOwogICAgICAgICAgICAgaWYgKGFjY291bnRzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFlfQUNDT1VOVF9BUlJBWTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yMTUwLDcgKzIyNzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IHRvdGFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGZvciAoQWNjb3VudFtdIGFjY291bnRzIDogbUFjY291bnRDYWNoZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChBY2NvdW50W10gYWNjb3VudHMgOiB1c2VyQWNjb3VudHMuYWNjb3VudENhY2hlLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gYWNjb3VudHMubGVuZ3RoOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRvdGFsTGVuZ3RoID09IDApIHsKQEAgLTIxNTgsNyArMjI4Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBY2NvdW50W10gYWNjb3VudHMgPSBuZXcgQWNjb3VudFt0b3RhbExlbmd0aF07CiAgICAgICAgICAgICB0b3RhbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICBmb3IgKEFjY291bnRbXSBhY2NvdW50c09mVHlwZSA6IG1BY2NvdW50Q2FjaGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAoQWNjb3VudFtdIGFjY291bnRzT2ZUeXBlIDogdXNlckFjY291bnRzLmFjY291bnRDYWNoZS52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYWNjb3VudHNPZlR5cGUsIDAsIGFjY291bnRzLCB0b3RhbExlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRzT2ZUeXBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gYWNjb3VudHNPZlR5cGUubGVuZ3RoOwpAQCAtMjE2NywxMiArMjI5NiwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVVc2VyRGF0YUludG9DYWNoZUxvY2tlZChmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwgQWNjb3VudCBhY2NvdW50LAotICAgICAgICAgICAgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJEYXRhRm9yQWNjb3VudCA9IG1Vc2VyRGF0YUNhY2hlLmdldChhY2NvdW50KTsKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVVzZXJEYXRhSW50b0NhY2hlTG9ja2VkKFVzZXJBY2NvdW50cyBhY2NvdW50cywgZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsCisgICAgICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB1c2VyRGF0YUZvckFjY291bnQgPSBhY2NvdW50cy51c2VyRGF0YUNhY2hlLmdldChhY2NvdW50KTsKICAgICAgICAgaWYgKHVzZXJEYXRhRm9yQWNjb3VudCA9PSBudWxsKSB7CiAgICAgICAgICAgICB1c2VyRGF0YUZvckFjY291bnQgPSByZWFkVXNlckRhdGFGb3JBY2NvdW50RnJvbURhdGFiYXNlTG9ja2VkKGRiLCBhY2NvdW50KTsKLSAgICAgICAgICAgIG1Vc2VyRGF0YUNhY2hlLnB1dChhY2NvdW50LCB1c2VyRGF0YUZvckFjY291bnQpOworICAgICAgICAgICAgYWNjb3VudHMudXNlckRhdGFDYWNoZS5wdXQoYWNjb3VudCwgdXNlckRhdGFGb3JBY2NvdW50KTsKICAgICAgICAgfQogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdXNlckRhdGFGb3JBY2NvdW50LnJlbW92ZShrZXkpOwpAQCAtMjE4MSwxMiArMjMxMCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBdXRoVG9rZW5JbnRvQ2FjaGVMb2NrZWQoZmluYWwgU1FMaXRlRGF0YWJhc2UgZGIsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICAgIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBhdXRoVG9rZW5zRm9yQWNjb3VudCA9IG1BdXRoVG9rZW5DYWNoZS5nZXQoYWNjb3VudCk7CisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBdXRoVG9rZW5JbnRvQ2FjaGVMb2NrZWQoVXNlckFjY291bnRzIGFjY291bnRzLCBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiwKKyAgICAgICAgICAgIEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGF1dGhUb2tlbnNGb3JBY2NvdW50ID0gYWNjb3VudHMuYXV0aFRva2VuQ2FjaGUuZ2V0KGFjY291bnQpOwogICAgICAgICBpZiAoYXV0aFRva2Vuc0ZvckFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgYXV0aFRva2Vuc0ZvckFjY291bnQgPSByZWFkQXV0aFRva2Vuc0ZvckFjY291bnRGcm9tRGF0YWJhc2VMb2NrZWQoZGIsIGFjY291bnQpOwotICAgICAgICAgICAgbUF1dGhUb2tlbkNhY2hlLnB1dChhY2NvdW50LCBhdXRoVG9rZW5zRm9yQWNjb3VudCk7CisgICAgICAgICAgICBhY2NvdW50cy5hdXRoVG9rZW5DYWNoZS5wdXQoYWNjb3VudCwgYXV0aFRva2Vuc0ZvckFjY291bnQpOwogICAgICAgICB9CiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBhdXRoVG9rZW5zRm9yQWNjb3VudC5yZW1vdmUoa2V5KTsKQEAgLTIxOTUsMjcgKzIzMjQsMjggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZEF1dGhUb2tlbkludGVybmFsKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQ2FjaGVMb2NrKSB7Ci0gICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBhdXRoVG9rZW5zRm9yQWNjb3VudCA9IG1BdXRoVG9rZW5DYWNoZS5nZXQoYWNjb3VudCk7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZWFkQXV0aFRva2VuSW50ZXJuYWwoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsCisgICAgICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKGFjY291bnRzLmNhY2hlTG9jaykgeworICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aFRva2Vuc0ZvckFjY291bnQgPSBhY2NvdW50cy5hdXRoVG9rZW5DYWNoZS5nZXQoYWNjb3VudCk7CiAgICAgICAgICAgICBpZiAoYXV0aFRva2Vuc0ZvckFjY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcG9wdWxhdGUgdGhlIGNhY2hlIGZvciB0aGlzIGFjY291bnQKLSAgICAgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTUUxpdGVEYXRhYmFzZSBkYiA9IGFjY291bnRzLm9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOwogICAgICAgICAgICAgICAgIGF1dGhUb2tlbnNGb3JBY2NvdW50ID0gcmVhZEF1dGhUb2tlbnNGb3JBY2NvdW50RnJvbURhdGFiYXNlTG9ja2VkKGRiLCBhY2NvdW50KTsKLSAgICAgICAgICAgICAgICBtQXV0aFRva2VuQ2FjaGUucHV0KGFjY291bnQsIGF1dGhUb2tlbnNGb3JBY2NvdW50KTsKKyAgICAgICAgICAgICAgICBhY2NvdW50cy5hdXRoVG9rZW5DYWNoZS5wdXQoYWNjb3VudCwgYXV0aFRva2Vuc0ZvckFjY291bnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGF1dGhUb2tlbnNGb3JBY2NvdW50LmdldChhdXRoVG9rZW5UeXBlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZFVzZXJEYXRhSW50ZXJuYWwoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUNhY2hlTG9jaykgewotICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gdXNlckRhdGFGb3JBY2NvdW50ID0gbVVzZXJEYXRhQ2FjaGUuZ2V0KGFjY291bnQpOworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVhZFVzZXJEYXRhSW50ZXJuYWwoVXNlckFjY291bnRzIGFjY291bnRzLCBBY2NvdW50IGFjY291bnQsIFN0cmluZyBrZXkpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChhY2NvdW50cy5jYWNoZUxvY2spIHsKKyAgICAgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHVzZXJEYXRhRm9yQWNjb3VudCA9IGFjY291bnRzLnVzZXJEYXRhQ2FjaGUuZ2V0KGFjY291bnQpOwogICAgICAgICAgICAgaWYgKHVzZXJEYXRhRm9yQWNjb3VudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBwb3B1bGF0ZSB0aGUgY2FjaGUgZm9yIHRoaXMgYWNjb3VudAotICAgICAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFNRTGl0ZURhdGFiYXNlIGRiID0gYWNjb3VudHMub3BlbkhlbHBlci5nZXRSZWFkYWJsZURhdGFiYXNlKCk7CiAgICAgICAgICAgICAgICAgdXNlckRhdGFGb3JBY2NvdW50ID0gcmVhZFVzZXJEYXRhRm9yQWNjb3VudEZyb21EYXRhYmFzZUxvY2tlZChkYiwgYWNjb3VudCk7Ci0gICAgICAgICAgICAgICAgbVVzZXJEYXRhQ2FjaGUucHV0KGFjY291bnQsIHVzZXJEYXRhRm9yQWNjb3VudCk7CisgICAgICAgICAgICAgICAgYWNjb3VudHMudXNlckRhdGFDYWNoZS5wdXQoYWNjb3VudCwgdXNlckRhdGFGb3JBY2NvdW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB1c2VyRGF0YUZvckFjY291bnQuZ2V0KGtleSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0dyYW50Q3JlZGVudGlhbHNQZXJtaXNzaW9uQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL0dyYW50Q3JlZGVudGlhbHNQZXJtaXNzaW9uQWN0aXZpdHkuamF2YQppbmRleCAwZWU2ODNjLi40NDE5YzhjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hY2NvdW50cy9HcmFudENyZWRlbnRpYWxzUGVybWlzc2lvbkFjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvR3JhbnRDcmVkZW50aWFsc1Blcm1pc3Npb25BY3Rpdml0eS5qYXZhCkBAIC0xMTMsOCArMTEzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICBhY2NvdW50TWFuYWdlclNlcnZpY2UuZ2V0QXV0aFRva2VuTGFiZWwoCi0gICAgICAgICAgICAgICAgcmVzcG9uc2UsIG1BY2NvdW50LCBtQXV0aFRva2VuVHlwZSk7CisgICAgICAgIGFjY291bnRNYW5hZ2VyU2VydmljZS5nZXRBdXRoVG9rZW5MYWJlbChyZXNwb25zZSwgbUFjY291bnQsIG1BdXRoVG9rZW5UeXBlLCBtVWlkKTsKIAogICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5hbGxvd19idXR0b24pLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQuZGVueV9idXR0b24pLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FjY291bnRzL09uQWNjb3VudHNVcGRhdGVMaXN0ZW5lci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvT25BY2NvdW50c1VwZGF0ZUxpc3RlbmVyLmphdmEKaW5kZXggMzhiMzcxZC4uMmI0ZWU1MCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvT25BY2NvdW50c1VwZGF0ZUxpc3RlbmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYWNjb3VudHMvT25BY2NvdW50c1VwZGF0ZUxpc3RlbmVyLmphdmEKQEAgLTE3LDExICsxNywxMSBAQAogcGFja2FnZSBhbmRyb2lkLmFjY291bnRzOwogCiAvKioKLSAqIEFuIGludGVyZmFjZSB0aGF0IGNvbnRhaW5zIHRoZSBjYWxsYmFjayB1c2VkIGJ5IHRoZSBBY2NvdW50TW9uaXRvcgorICogQW4gaW50ZXJmYWNlIHRoYXQgY29udGFpbnMgdGhlIGNhbGxiYWNrIHVzZWQgYnkgdGhlIEFjY291bnRNYW5hZ2VyCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgT25BY2NvdW50c1VwZGF0ZUxpc3RlbmVyIHsKICAgICAvKioKLSAgICAgKiBUaGlzIGludm9rZWQgd2hlbiB0aGUgQWNjb3VudE1vbml0b3Igc3RhcnRzIHVwIGFuZCB3aGVuZXZlciB0aGUgYWNjb3VudAorICAgICAqIFRoaXMgaW52b2tlZCB3aGVuIHRoZSBBY2NvdW50TWFuYWdlciBzdGFydHMgdXAgYW5kIHdoZW5ldmVyIHRoZSBhY2NvdW50CiAgICAgICogc2V0IGNoYW5nZXMuCiAgICAgICogQHBhcmFtIGFjY291bnRzIHRoZSBjdXJyZW50IGFjY291bnRzCiAgICAgICovCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVmFsdWVBbmltYXRvci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYW5pbWF0aW9uL1ZhbHVlQW5pbWF0b3IuamF2YQppbmRleCA2ZmJlZWUzLi45NTRhZTY2IDEwMDc1NQotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hbmltYXRpb24vVmFsdWVBbmltYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FuaW1hdGlvbi9WYWx1ZUFuaW1hdG9yLmphdmEKQEAgLTY0NSw3ICs2NDUsNyBAQAogICAgICAgICAgICAgLy8gb25BbmltYXRlIHRvIHByb2Nlc3MgdGhlIG5leHQgZnJhbWUgb2YgdGhlIGFuaW1hdGlvbnMuCiAgICAgICAgICAgICBpZiAoIW1BbmltYXRpb25TY2hlZHVsZWQKICAgICAgICAgICAgICAgICAgICAgJiYgKCFtQW5pbWF0aW9ucy5pc0VtcHR5KCkgfHwgIW1EZWxheWVkQW5pbXMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgICAgIG1DaG9yZW9ncmFwaGVyLnBvc3RBbmltYXRpb25DYWxsYmFjayh0aGlzKTsKKyAgICAgICAgICAgICAgICBtQ2hvcmVvZ3JhcGhlci5wb3N0QW5pbWF0aW9uQ2FsbGJhY2sodGhpcywgbnVsbCk7CiAgICAgICAgICAgICAgICAgbUFuaW1hdGlvblNjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9BY3Rpdml0eS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKaW5kZXggOGU4ZDM3ZC4uZjg5NTQzMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5LmphdmEKQEAgLTU3MCw3ICs1NzAsMTggQEAKICAqIHRhZy4gIEJ5IGRvaW5nIHNvLCBvdGhlciBhcHBsaWNhdGlvbnMgd2lsbCBuZWVkIHRvIGRlY2xhcmUgYSBjb3JyZXNwb25kaW5nCiAgKiB7QGxpbmsgYW5kcm9pZC5SLnN0eWxlYWJsZSNBbmRyb2lkTWFuaWZlc3RVc2VzUGVybWlzc2lvbiAmbHQ7dXNlcy1wZXJtaXNzaW9uJmd0O30KICAqIGVsZW1lbnQgaW4gdGhlaXIgb3duIG1hbmlmZXN0IHRvIGJlIGFibGUgdG8gc3RhcnQgdGhhdCBhY3Rpdml0eS4KLSAqIAorICoKKyAqIDxwPldoZW4gc3RhcnRpbmcgYW4gQWN0aXZpdHkgeW91IGNhbiBzZXQge0BsaW5rIEludGVudCNGTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KKyAqIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT059IGFuZC9vciB7QGxpbmsgSW50ZW50I0ZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04KKyAqIEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OfSBvbiB0aGUgSW50ZW50LiAgVGhpcyB3aWxsIGdyYW50IHRoZQorICogQWN0aXZpdHkgYWNjZXNzIHRvIHRoZSBzcGVjaWZpYyBVUklzIGluIHRoZSBJbnRlbnQuICBBY2Nlc3Mgd2lsbCByZW1haW4KKyAqIHVudGlsIHRoZSBBY3Rpdml0eSBoYXMgZmluaXNoZWQgKGl0IHdpbGwgcmVtYWluIGFjcm9zcyB0aGUgaG9zdGluZworICogcHJvY2VzcyBiZWluZyBraWxsZWQgYW5kIG90aGVyIHRlbXBvcmFyeSBkZXN0cnVjdGlvbikuICBBcyBvZgorICoge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNHSU5HRVJCUkVBRH0sIGlmIHRoZSBBY3Rpdml0eQorICogd2FzIGFscmVhZHkgY3JlYXRlZCBhbmQgYSBuZXcgSW50ZW50IGlzIGJlaW5nIGRlbGl2ZXJlZCB0bworICoge0BsaW5rICNvbk5ld0ludGVudChJbnRlbnQpfSwgYW55IG5ld2x5IGdyYW50ZWQgVVJJIHBlcm1pc3Npb25zIHdpbGwgYmUgYWRkZWQKKyAqIHRvIHRoZSBleGlzdGluZyBvbmVzIGl0IGhvbGRzLgorICoKICAqIDxwPlNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9zZWN1cml0eS9zZWN1cml0eS5odG1sIj5TZWN1cml0eSBhbmQgUGVybWlzc2lvbnM8L2E+CiAgKiBkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwZXJtaXNzaW9ucyBhbmQgc2VjdXJpdHkgaW4gZ2VuZXJhbC4KICAqIApAQCAtMzU0OSw3ICszNTYwLDE2IEBACiAgICAgLyoqCiAgICAgICogQ2FsbCB0aGlzIHRvIHNldCB0aGUgcmVzdWx0IHRoYXQgeW91ciBhY3Rpdml0eSB3aWxsIHJldHVybiB0byBpdHMKICAgICAgKiBjYWxsZXIuCi0gICAgICogCisgICAgICoKKyAgICAgKiA8cD5BcyBvZiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0dJTkdFUkJSRUFEfSwgdGhlIEludGVudAorICAgICAqIHlvdSBzdXBwbHkgaGVyZSBjYW4gaGF2ZSB7QGxpbmsgSW50ZW50I0ZMQUdfR1JBTlRfUkVBRF9VUklfUEVSTUlTU0lPTgorICAgICAqIEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT059IGFuZC9vciB7QGxpbmsgSW50ZW50I0ZMQUdfR1JBTlRfV1JJVEVfVVJJX1BFUk1JU1NJT04KKyAgICAgKiBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTn0gc2V0LiAgVGhpcyB3aWxsIGdyYW50IHRoZQorICAgICAqIEFjdGl2aXR5IHJlY2VpdmluZyB0aGUgcmVzdWx0IGFjY2VzcyB0byB0aGUgc3BlY2lmaWMgVVJJcyBpbiB0aGUgSW50ZW50LgorICAgICAqIEFjY2VzcyB3aWxsIHJlbWFpbiB1bnRpbCB0aGUgQWN0aXZpdHkgaGFzIGZpbmlzaGVkIChpdCB3aWxsIHJlbWFpbiBhY3Jvc3MgdGhlIGhvc3RpbmcKKyAgICAgKiBwcm9jZXNzIGJlaW5nIGtpbGxlZCBhbmQgb3RoZXIgdGVtcG9yYXJ5IGRlc3RydWN0aW9uKSBhbmQgd2lsbCBiZSBhZGRlZAorICAgICAqIHRvIGFueSBleGlzdGluZyBzZXQgb2YgVVJJIHBlcm1pc3Npb25zIGl0IGFscmVhZHkgaG9sZHMuCisgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0Q29kZSBUaGUgcmVzdWx0IGNvZGUgdG8gcHJvcGFnYXRlIGJhY2sgdG8gdGhlIG9yaWdpbmF0aW5nCiAgICAgICogICAgICAgICAgICAgICAgICAgYWN0aXZpdHksIG9mdGVuIFJFU1VMVF9DQU5DRUxFRCBvciBSRVNVTFRfT0sKICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBwcm9wYWdhdGUgYmFjayB0byB0aGUgb3JpZ2luYXRpbmcgYWN0aXZpdHkuCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQppbmRleCA1ODgxMjVkLi5lYmY0MjYxOSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FwcGxpY2F0aW9uRXJyb3JSZXBvcnQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQXBwbGljYXRpb25FcnJvclJlcG9ydC5qYXZhCkBAIC05OCw3ICs5OCw3IEBACiAgICAgLyoqCiAgICAgICogUGFja2FnZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB3aGljaCBpbnN0YWxsZWQgdGhlIGFwcGxpY2F0aW9uIHRoaXMKICAgICAgKiByZXBvcnQgcGVydGFpbnMgdG8uCi0gICAgICogVGhpcyBpZGVudGlmaWVzIHdoaWNoIE1hcmtldCB0aGUgYXBwbGljYXRpb24gY2FtZSBmcm9tLgorICAgICAqIFRoaXMgaWRlbnRpZmllcyB3aGljaCBtYXJrZXQgdGhlIGFwcGxpY2F0aW9uIGNhbWUgZnJvbS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGluc3RhbGxlclBhY2thZ2VOYW1lOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvYXBwL1NlcnZpY2UuamF2YQppbmRleCAzNWJkOGMwLi5iZTRiOGFmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvU2VydmljZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9TZXJ2aWNlLmphdmEKQEAgLTE2Myw3ICsxNjMsMTkgQEAKICAqIHtAbGluayBhbmRyb2lkLlIuc3R5bGVhYmxlI0FuZHJvaWRNYW5pZmVzdFVzZXNQZXJtaXNzaW9uICZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7fQogICogZWxlbWVudCBpbiB0aGVpciBvd24gbWFuaWZlc3QgdG8gYmUgYWJsZSB0byBzdGFydCwgc3RvcCwgb3IgYmluZCB0bwogICogdGhlIHNlcnZpY2UuCi0gKiAKKyAqCisgKiA8cD5BcyBvZiB7QGxpbmsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OX0NPREVTI0dJTkdFUkJSRUFEfSwgd2hlbiB1c2luZworICoge0BsaW5rIENvbnRleHQjc3RhcnRTZXJ2aWNlKEludGVudCkgQ29udGV4dC5zdGFydFNlcnZpY2UoSW50ZW50KX0sIHlvdSBjYW4KKyAqIGFsc28gc2V0IHtAbGluayBJbnRlbnQjRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OCisgKiBJbnRlbnQuRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OfSBhbmQvb3Ige0BsaW5rIEludGVudCNGTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OCisgKiBJbnRlbnQuRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTn0gb24gdGhlIEludGVudC4gIFRoaXMgd2lsbCBncmFudCB0aGUKKyAqIFNlcnZpY2UgdGVtcG9yYXJ5IGFjY2VzcyB0byB0aGUgc3BlY2lmaWMgVVJJcyBpbiB0aGUgSW50ZW50LiAgQWNjZXNzIHdpbGwKKyAqIHJlbWFpbiB1bnRpbCB0aGUgU2VydmljZSBoYXMgY2FsbGVkIHtAbGluayAjc3RvcFNlbGYoaW50KX0gZm9yIHRoYXQgc3RhcnQKKyAqIGNvbW1hbmQgb3IgYSBsYXRlciBvbmUsIG9yIHVudGlsIHRoZSBTZXJ2aWNlIGhhcyBiZWVuIGNvbXBsZXRlbHkgc3RvcHBlZC4KKyAqIFRoaXMgd29ya3MgZm9yIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgb3RoZXIgYXBwcyB0aGF0IGhhdmUgbm90IHJlcXVlc3RlZAorICogdGhlIHBlcm1pc3Npb24gcHJvdGVjdGluZyB0aGUgU2VydmljZSwgb3IgZXZlbiB3aGVuIHRoZSBTZXJ2aWNlIGlzIG5vdAorICogZXhwb3J0ZWQgYXQgYWxsLgorICoKICAqIDxwPkluIGFkZGl0aW9uLCBhIHNlcnZpY2UgY2FuIHByb3RlY3QgaW5kaXZpZHVhbCBJUEMgY2FsbHMgaW50byBpdCB3aXRoCiAgKiBwZXJtaXNzaW9ucywgYnkgY2FsbGluZyB0aGUKICAqIHtAbGluayAjY2hlY2tDYWxsaW5nUGVybWlzc2lvbn0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERhdGEuamF2YQppbmRleCBhOGIxYmY0Li5hNjU1ZGQ0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEYXRhLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGF0YS5qYXZhCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAKICAgICBmaW5hbCBCaXRtYXAgbUljb247CiAKLSAgICBmaW5hbCBBcnJheUxpc3Q8SXRlbT4gbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOworICAgIGZpbmFsIEFycmF5TGlzdDxJdGVtPiBtSXRlbXM7CiAKICAgICAvKioKICAgICAgKiBEZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBpdGVtIGluIGEgQ2xpcHBlZERhdGEuCkBAIC0zMjEsNiArMzIxLDMzIEBACiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KIC8vRU5EX0lOQ0xVREUoY29lcmNlVG9UZXh0KQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTI4KTsKKworICAgICAgICAgICAgYi5hcHBlbmQoIkNsaXBEYXRhLkl0ZW0geyAiKTsKKyAgICAgICAgICAgIHRvU2hvcnRTdHJpbmcoYik7CisgICAgICAgICAgICBiLmFwcGVuZCgiIH0iKTsKKworICAgICAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgdm9pZCB0b1Nob3J0U3RyaW5nKFN0cmluZ0J1aWxkZXIgYikgeworICAgICAgICAgICAgaWYgKG1UZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiVDoiKTsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZChtVGV4dCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1VcmkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJVOiIpOworICAgICAgICAgICAgICAgIGIuYXBwZW5kKG1VcmkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSW50ZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiSToiKTsKKyAgICAgICAgICAgICAgICBtSW50ZW50LnRvU2hvcnRTdHJpbmcoYiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCJOVUxMIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMzNiw2ICszNjMsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJpdGVtIGlzIG51bGwiKTsKICAgICAgICAgfQogICAgICAgICBtSWNvbiA9IG51bGw7CisgICAgICAgIG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKICAgICAgICAgbUl0ZW1zLmFkZChpdGVtKTsKICAgICB9CiAKQEAgLTM1MSwxMCArMzc5LDIzIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIml0ZW0gaXMgbnVsbCIpOwogICAgICAgICB9CiAgICAgICAgIG1JY29uID0gbnVsbDsKKyAgICAgICAgbUl0ZW1zID0gbmV3IEFycmF5TGlzdDxJdGVtPigpOwogICAgICAgICBtSXRlbXMuYWRkKGl0ZW0pOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjbGlwIHRoYXQgaXMgYSBjb3B5IG9mIGFub3RoZXIgY2xpcC4gIFRoaXMgZG9lcyBhIGRlZXAtY29weQorICAgICAqIG9mIGFsbCBpdGVtcyBpbiB0aGUgY2xpcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdGhlciBUaGUgZXhpc3RpbmcgQ2xpcERhdGEgdGhhdCBpcyB0byBiZSBjb3BpZWQuCisgICAgICovCisgICAgcHVibGljIENsaXBEYXRhKENsaXBEYXRhIG90aGVyKSB7CisgICAgICAgIG1DbGlwRGVzY3JpcHRpb24gPSBvdGhlci5tQ2xpcERlc2NyaXB0aW9uOworICAgICAgICBtSWNvbiA9IG90aGVyLm1JY29uOworICAgICAgICBtSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEl0ZW0+KG90aGVyLm1JdGVtcyk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbmV3IENsaXBEYXRhIGhvbGRpbmcgZGF0YSBvZiB0aGUgdHlwZQogICAgICAqIHtAbGluayBDbGlwRGVzY3JpcHRpb24jTUlNRVRZUEVfVEVYVF9QTEFJTn0uCiAgICAgICoKQEAgLTQ3NSw2ICs1MTYsNDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworCisgICAgICAgIGIuYXBwZW5kKCJDbGlwRGF0YSB7ICIpOworICAgICAgICB0b1Nob3J0U3RyaW5nKGIpOworICAgICAgICBiLmFwcGVuZCgiIH0iKTsKKworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyB2b2lkIHRvU2hvcnRTdHJpbmcoU3RyaW5nQnVpbGRlciBiKSB7CisgICAgICAgIGJvb2xlYW4gZmlyc3Q7CisgICAgICAgIGlmIChtQ2xpcERlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpcnN0ID0gIW1DbGlwRGVzY3JpcHRpb24udG9TaG9ydFN0cmluZyhiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUljb24gIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgYi5hcHBlbmQoIkk6Iik7CisgICAgICAgICAgICBiLmFwcGVuZChtSWNvbi5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKCd4Jyk7CisgICAgICAgICAgICBiLmFwcGVuZChtSWNvbi5nZXRIZWlnaHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPG1JdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgYi5hcHBlbmQoJ3snKTsKKyAgICAgICAgICAgIG1JdGVtcy5nZXQoaSkudG9TaG9ydFN0cmluZyhiKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKCd9Jyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTUxNSw2ICs1OTYsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUljb24gPSBudWxsOwogICAgICAgICB9CisgICAgICAgIG1JdGVtcyA9IG5ldyBBcnJheUxpc3Q8SXRlbT4oKTsKICAgICAgICAgZmluYWwgaW50IE4gPSBpbi5yZWFkSW50KCk7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKICAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gVGV4dFV0aWxzLkNIQVJfU0VRVUVOQ0VfQ1JFQVRPUi5jcmVhdGVGcm9tUGFyY2VsKGluKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NsaXBEZXNjcmlwdGlvbi5qYXZhCmluZGV4IGI1ZmEyMGMuLmM2YjUxZWYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ2xpcERlc2NyaXB0aW9uLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9DbGlwRGVzY3JpcHRpb24uamF2YQpAQCAtMTg0LDYgKzE4NCwzOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisKKyAgICAgICAgYi5hcHBlbmQoIkNsaXBEZXNjcmlwdGlvbiB7ICIpOworICAgICAgICB0b1Nob3J0U3RyaW5nKGIpOworICAgICAgICBiLmFwcGVuZCgiIH0iKTsKKworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBib29sZWFuIHRvU2hvcnRTdHJpbmcoU3RyaW5nQnVpbGRlciBiKSB7CisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bU1pbWVUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgYi5hcHBlbmQobU1pbWVUeXBlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1MYWJlbCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICBiLmFwcGVuZCgnIicpOworICAgICAgICAgICAgYi5hcHBlbmQobUxhYmVsKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICFmaXJzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGRlc2NyaWJlQ29udGVudHMoKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFNlcnZpY2UuamF2YQppbmRleCBmYzRjMjYyLi5mODI3YzNkIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRlbnRTZXJ2aWNlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZW50U2VydmljZS5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWw7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TZXJ2aWNlTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlVzZXJJZDsKIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwogaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VJbnRBcnJheTsKIGltcG9ydCBhbmRyb2lkLk1hbmlmZXN0OwpAQCAtMTYzLDYgKzE2NCw4IEBACiAgICAgICAgICAgICBMb2cudihUQUcsICJOb3RpZnlpbmcgdXBkYXRlIG9mICIgKyB1cmkgKyAiIGZyb20gb2JzZXJ2ZXIgIiArIG9ic2VydmVyCiAgICAgICAgICAgICAgICAgICAgICsgIiwgc3luY1RvTmV0d29yayAiICsgc3luY1RvTmV0d29yayk7CiAgICAgICAgIH0KKworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKICAgICAgICAgLy8gVGhpcyBtYWtlcyBpdCBzbyB0aGF0IGZ1dHVyZSBwZXJtaXNzaW9uIGNoZWNrcyB3aWxsIGJlIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKICAgICAgICAgLy8gcHJvY2VzcyByYXRoZXIgdGhhbiB0aGUgY2FsbGVyJ3MgcHJvY2Vzcy4gV2Ugd2lsbCByZXN0b3JlIHRoaXMgYmVmb3JlIHJldHVybmluZy4KICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKQEAgLTIwMSw3ICsyMDQsOCBAQAogICAgICAgICAgICAgaWYgKHN5bmNUb05ldHdvcmspIHsKICAgICAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuc2NoZWR1bGVMb2NhbFN5bmMobnVsbCAvKiBhbGwgYWNjb3VudHMgKi8sIHVyaS5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLnNjaGVkdWxlTG9jYWxTeW5jKG51bGwgLyogYWxsIGFjY291bnRzICovLCB1c2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJpLmdldEF1dGhvcml0eSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC0yMjksMTMgKzIzMywxNSBAQAogCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdFN5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5LCBCdW5kbGUgZXh0cmFzKSB7CiAgICAgICAgIENvbnRlbnRSZXNvbHZlci52YWxpZGF0ZVN5bmNFeHRyYXNCdW5kbGUoZXh0cmFzKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgLy8gVGhpcyBtYWtlcyBpdCBzbyB0aGF0IGZ1dHVyZSBwZXJtaXNzaW9uIGNoZWNrcyB3aWxsIGJlIGluIHRoZSBjb250ZXh0IG9mIHRoaXMKICAgICAgICAgLy8gcHJvY2VzcyByYXRoZXIgdGhhbiB0aGUgY2FsbGVyJ3MgcHJvY2Vzcy4gV2Ugd2lsbCByZXN0b3JlIHRoaXMgYmVmb3JlIHJldHVybmluZy4KICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3luY01hbmFnZXIuc2NoZWR1bGVTeW5jKGFjY291bnQsIGF1dGhvcml0eSwgZXh0cmFzLCAwIC8qIG5vIGRlbGF5ICovLAorICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLnNjaGVkdWxlU3luYyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwgZXh0cmFzLCAwIC8qIG5vIGRlbGF5ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUgKi8pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewpAQCAtMjUwLDE0ICsyNTYsMTYgQEAKICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IGZpbHRlciB0aGUgcGVuZGluZyBhbmQgYWN0aXZlIHN5bmNzIHRvIGNhbmNlbCB1c2luZyB0aGlzIGF1dGhvcml0eQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNhbmNlbFN5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCBmdXR1cmUgcGVybWlzc2lvbiBjaGVja3Mgd2lsbCBiZSBpbiB0aGUgY29udGV4dCBvZiB0aGlzCiAgICAgICAgIC8vIHByb2Nlc3MgcmF0aGVyIHRoYW4gdGhlIGNhbGxlcidzIHByb2Nlc3MuIFdlIHdpbGwgcmVzdG9yZSB0aGlzIGJlZm9yZSByZXR1cm5pbmcuCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLmNsZWFyU2NoZWR1bGVkU3luY09wZXJhdGlvbnMoYWNjb3VudCwgYXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5jYW5jZWxBY3RpdmVTeW5jKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuY2xlYXJTY2hlZHVsZWRTeW5jT3BlcmF0aW9ucyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgc3luY01hbmFnZXIuY2FuY2VsQWN0aXZlU3luYyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpAQCAtMjgzLDEyICsyOTEsMTQgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBnZXRTeW5jQXV0b21hdGljYWxseShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc2V0dGluZ3MiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0U3luY0F1dG9tYXRpY2FsbHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBwcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTI5OSwxMiArMzA5LDE0IEBACiAgICAgcHVibGljIHZvaWQgc2V0U3luY0F1dG9tYXRpY2FsbHkoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBib29sZWFuIHN5bmMpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfU1lOQ19TRVRUSU5HUywKICAgICAgICAgICAgICAgICAibm8gcGVybWlzc2lvbiB0byB3cml0ZSB0aGUgc3luYyBzZXR0aW5ncyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLnNldFN5bmNBdXRvbWF0aWNhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgcHJvdmlkZXJOYW1lLCBzeW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCBzeW5jKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CkBAIC0zMTUsMTAgKzMyNywxMiBAQAogICAgICAgICAgICAgbG9uZyBwb2xsRnJlcXVlbmN5KSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLldSSVRFX1NZTkNfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gd3JpdGUgdGhlIHN5bmMgc2V0dGluZ3MiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGdldFN5bmNNYW5hZ2VyKCkuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5hZGRQZXJpb2RpY1N5bmMoCi0gICAgICAgICAgICAgICAgICAgIGFjY291bnQsIGF1dGhvcml0eSwgZXh0cmFzLCBwb2xsRnJlcXVlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHksIGV4dHJhcywgcG9sbEZyZXF1ZW5jeSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC0zMjcsOSArMzQxLDEyIEBACiAgICAgcHVibGljIHZvaWQgcmVtb3ZlUGVyaW9kaWNTeW5jKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSwgQnVuZGxlIGV4dHJhcykgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHdyaXRlIHRoZSBzeW5jIHNldHRpbmdzIik7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRTeW5jTWFuYWdlcigpLmdldFN5bmNTdG9yYWdlRW5naW5lKCkucmVtb3ZlUGVyaW9kaWNTeW5jKGFjY291bnQsIGF1dGhvcml0eSwgZXh0cmFzKTsKKyAgICAgICAgICAgIGdldFN5bmNNYW5hZ2VyKCkuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5yZW1vdmVQZXJpb2RpY1N5bmMoYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwogICAgICAgICB9CkBAIC0zMzgsMTAgKzM1NSwxMiBAQAogICAgIHB1YmxpYyBMaXN0PFBlcmlvZGljU3luYz4gZ2V0UGVyaW9kaWNTeW5jcyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc2V0dGluZ3MiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHJldHVybiBnZXRTeW5jTWFuYWdlcigpLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0UGVyaW9kaWNTeW5jcygKLSAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgcHJvdmlkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQpAQCAtMzUwLDEyICszNjksMTQgQEAKICAgICBwdWJsaWMgaW50IGdldElzU3luY2FibGUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgIG1Db250ZXh0LmVuZm9yY2VDYWxsaW5nT3JTZWxmUGVybWlzc2lvbihNYW5pZmVzdC5wZXJtaXNzaW9uLlJFQURfU1lOQ19TRVRUSU5HUywKICAgICAgICAgICAgICAgICAibm8gcGVybWlzc2lvbiB0byByZWFkIHRoZSBzeW5jIHNldHRpbmdzIik7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBzeW5jTWFuYWdlci5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLmdldElzU3luY2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBwcm92aWRlck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTM2NiwxMiArMzg3LDE0IEBACiAgICAgcHVibGljIHZvaWQgc2V0SXNTeW5jYWJsZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIGludCBzeW5jYWJsZSkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5XUklURV9TWU5DX1NFVFRJTkdTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHdyaXRlIHRoZSBzeW5jIHNldHRpbmdzIik7CisgICAgICAgIGludCB1c2VySWQgPSBVc2VySWQuZ2V0Q2FsbGluZ1VzZXJJZCgpOworCiAgICAgICAgIGxvbmcgaWRlbnRpdHlUb2tlbiA9IGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeW5jTWFuYWdlciBzeW5jTWFuYWdlciA9IGdldFN5bmNNYW5hZ2VyKCk7CiAgICAgICAgICAgICBpZiAoc3luY01hbmFnZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuc2V0SXNTeW5jYWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHByb3ZpZGVyTmFtZSwgc3luY2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsIHN5bmNhYmxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CkBAIC0zODEsMTEgKzQwNCwxMyBAQAogICAgIHB1YmxpYyBib29sZWFuIGdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCkgewogICAgICAgICBtQ29udGV4dC5lbmZvcmNlQ2FsbGluZ09yU2VsZlBlcm1pc3Npb24oTWFuaWZlc3QucGVybWlzc2lvbi5SRUFEX1NZTkNfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgIm5vIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3luYyBzZXR0aW5ncyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3luY01hbmFnZXIuZ2V0U3luY1N0b3JhZ2VFbmdpbmUoKS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSgpOworICAgICAgICAgICAgICAgIHJldHVybiBzeW5jTWFuYWdlci5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KHVzZXJJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICByZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50aXR5VG9rZW4pOwpAQCAtMzk2LDExICs0MjEsMTMgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShib29sZWFuIGZsYWcpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uV1JJVEVfU1lOQ19TRVRUSU5HUywKICAgICAgICAgICAgICAgICAibm8gcGVybWlzc2lvbiB0byB3cml0ZSB0aGUgc3luYyBzZXR0aW5ncyIpOworICAgICAgICBpbnQgdXNlcklkID0gVXNlcklkLmdldENhbGxpbmdVc2VySWQoKTsKKwogICAgICAgICBsb25nIGlkZW50aXR5VG9rZW4gPSBjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3luY01hbmFnZXIgc3luY01hbmFnZXIgPSBnZXRTeW5jTWFuYWdlcigpOwogICAgICAgICAgICAgaWYgKHN5bmNNYW5hZ2VyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeW5jTWFuYWdlci5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLnNldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KGZsYWcpOworICAgICAgICAgICAgICAgIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuc2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoZmxhZywgdXNlcklkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CkBAIC00MTAsMTIgKzQzNywxNCBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzU3luY0FjdGl2ZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NUQVRTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc3RhdHMiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuaXNTeW5jQWN0aXZlKAotICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnRpdHlUb2tlbik7CkBAIC00MjYsOSArNDU1LDExIEBACiAgICAgcHVibGljIExpc3Q8U3luY0luZm8+IGdldEN1cnJlbnRTeW5jcygpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NUQVRTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc3RhdHMiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBnZXRTeW5jTWFuYWdlcigpLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0Q3VycmVudFN5bmNzKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0U3luY01hbmFnZXIoKS5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLmdldEN1cnJlbnRTeW5jcyh1c2VySWQpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKICAgICAgICAgfQpAQCAtNDM3LDEyICs0NjgsMTQgQEAKICAgICBwdWJsaWMgU3luY1N0YXR1c0luZm8gZ2V0U3luY1N0YXR1cyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NUQVRTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc3RhdHMiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuZ2V0U3RhdHVzQnlBY2NvdW50QW5kQXV0aG9yaXR5KAotICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKQEAgLTQ1MywxMSArNDg2LDEzIEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNTeW5jUGVuZGluZyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgbUNvbnRleHQuZW5mb3JjZUNhbGxpbmdPclNlbGZQZXJtaXNzaW9uKE1hbmlmZXN0LnBlcm1pc3Npb24uUkVBRF9TWU5DX1NUQVRTLAogICAgICAgICAgICAgICAgICJubyBwZXJtaXNzaW9uIHRvIHJlYWQgdGhlIHN5bmMgc3RhdHMiKTsKKyAgICAgICAgaW50IHVzZXJJZCA9IFVzZXJJZC5nZXRDYWxsaW5nVXNlcklkKCk7CisKICAgICAgICAgbG9uZyBpZGVudGl0eVRva2VuID0gY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN5bmNNYW5hZ2VyIHN5bmNNYW5hZ2VyID0gZ2V0U3luY01hbmFnZXIoKTsKICAgICAgICAgICAgIGlmIChzeW5jTWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNNYW5hZ2VyLmdldFN5bmNTdG9yYWdlRW5naW5lKCkuaXNTeW5jUGVuZGluZyhhY2NvdW50LCBhdXRob3JpdHkpOworICAgICAgICAgICAgICAgIHJldHVybiBzeW5jTWFuYWdlci5nZXRTeW5jU3RvcmFnZUVuZ2luZSgpLmlzU3luY1BlbmRpbmcoYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmVzdG9yZUNhbGxpbmdJZGVudGl0eShpZGVudGl0eVRva2VuKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0ludGVudC5qYXZhCmluZGV4IGFiNjJjNDQuLjU3MzkxMTkgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvSW50ZW50LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9JbnRlbnQuamF2YQpAQCAtMTEzNyw3ICsxMTM3LDcgQEAKICAgICAvKioKICAgICAgKiBBY3Rpdml0eSBBY3Rpb246IFRoZSB1c2VyIHByZXNzZWQgdGhlICJSZXBvcnQiIGJ1dHRvbiBpbiB0aGUgY3Jhc2gvQU5SIGRpYWxvZy4KICAgICAgKiBUaGlzIGludGVudCBpcyBkZWxpdmVyZWQgdG8gdGhlIHBhY2thZ2Ugd2hpY2ggaW5zdGFsbGVkIHRoZSBhcHBsaWNhdGlvbiwgdXN1YWxseQotICAgICAqIHRoZSBNYXJrZXQuCisgICAgICogR29vZ2xlIFBsYXkuCiAgICAgICogPHA+SW5wdXQ6IE5vIGRhdGEgaXMgc3BlY2lmaWVkLiBUaGUgYnVnIHJlcG9ydCBpcyBwYXNzZWQgaW4gdXNpbmcKICAgICAgKiBhbiB7QGxpbmsgI0VYVFJBX0JVR19SRVBPUlR9IGZpZWxkLgogICAgICAqIDxwPk91dHB1dDogTm90aGluZy4KQEAgLTI2ODgsMTIgKzI2ODgsMjAgQEAKIAogICAgIC8qKgogICAgICAqIElmIHNldCwgdGhlIHJlY2lwaWVudCBvZiB0aGlzIEludGVudCB3aWxsIGJlIGdyYW50ZWQgcGVybWlzc2lvbiB0bwotICAgICAqIHBlcmZvcm0gcmVhZCBvcGVyYXRpb25zIG9uIHRoZSBVcmkgaW4gdGhlIEludGVudCdzIGRhdGEuCisgICAgICogcGVyZm9ybSByZWFkIG9wZXJhdGlvbnMgb24gdGhlIFVyaSBpbiB0aGUgSW50ZW50J3MgZGF0YSBhbmQgYW55IFVSSXMKKyAgICAgKiBzcGVjaWZpZWQgaW4gaXRzIENsaXBEYXRhLiAgV2hlbiBhcHBseWluZyB0byBhbiBJbnRlbnQncyBDbGlwRGF0YSwKKyAgICAgKiBhbGwgVVJJcyBhcyB3ZWxsIGFzIHJlY3Vyc2l2ZSB0cmF2ZXJzYWxzIHRocm91Z2ggZGF0YSBvciBvdGhlciBDbGlwRGF0YQorICAgICAqIGluIEludGVudCBpdGVtcyB3aWxsIGJlIGdyYW50ZWQ7IG9ubHkgdGhlIGdyYW50IGZsYWdzIG9mIHRoZSB0b3AtbGV2ZWwKKyAgICAgKiBJbnRlbnQgYXJlIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19HUkFOVF9SRUFEX1VSSV9QRVJNSVNTSU9OID0gMHgwMDAwMDAwMTsKICAgICAvKioKICAgICAgKiBJZiBzZXQsIHRoZSByZWNpcGllbnQgb2YgdGhpcyBJbnRlbnQgd2lsbCBiZSBncmFudGVkIHBlcm1pc3Npb24gdG8KLSAgICAgKiBwZXJmb3JtIHdyaXRlIG9wZXJhdGlvbnMgb24gdGhlIFVyaSBpbiB0aGUgSW50ZW50J3MgZGF0YS4KKyAgICAgKiBwZXJmb3JtIHdyaXRlIG9wZXJhdGlvbnMgb24gdGhlIFVyaSBpbiB0aGUgSW50ZW50J3MgZGF0YSBhbmQgYW55IFVSSXMKKyAgICAgKiBzcGVjaWZpZWQgaW4gaXRzIENsaXBEYXRhLiAgV2hlbiBhcHBseWluZyB0byBhbiBJbnRlbnQncyBDbGlwRGF0YSwKKyAgICAgKiBhbGwgVVJJcyBhcyB3ZWxsIGFzIHJlY3Vyc2l2ZSB0cmF2ZXJzYWxzIHRocm91Z2ggZGF0YSBvciBvdGhlciBDbGlwRGF0YQorICAgICAqIGluIEludGVudCBpdGVtcyB3aWxsIGJlIGdyYW50ZWQ7IG9ubHkgdGhlIGdyYW50IGZsYWdzIG9mIHRoZSB0b3AtbGV2ZWwKKyAgICAgKiBJbnRlbnQgYXJlIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTiA9IDB4MDAwMDAwMDI7CiAgICAgLyoqCkBAIC0zMDE4LDYgKzMwMjYsNyBAQAogICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7CiAgICAgcHJpdmF0ZSBSZWN0IG1Tb3VyY2VCb3VuZHM7CiAgICAgcHJpdmF0ZSBJbnRlbnQgbVNlbGVjdG9yOworICAgIHByaXZhdGUgQ2xpcERhdGEgbUNsaXBEYXRhOwogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMwNDksNiArMzA1OCw5IEBACiAgICAgICAgIGlmIChvLm1TZWxlY3RvciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aGlzLm1TZWxlY3RvciA9IG5ldyBJbnRlbnQoby5tU2VsZWN0b3IpOwogICAgICAgICB9CisgICAgICAgIGlmIChvLm1DbGlwRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLm1DbGlwRGF0YSA9IG5ldyBDbGlwRGF0YShvLm1DbGlwRGF0YSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM3MjksNiArMzc0MSwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybiB0aGUge0BsaW5rIENsaXBEYXRhfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBJbnRlbnQuICBJZiB0aGVyZSBpcworICAgICAqIG5vbmUsIHJldHVybnMgbnVsbC4gIFNlZSB7QGxpbmsgI3NldENsaXBEYXRhfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBzZWUgI3NldENsaXBEYXRhOworICAgICAqLworICAgIHB1YmxpYyBDbGlwRGF0YSBnZXRDbGlwRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1DbGlwRGF0YTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBDbGFzc0xvYWRlciB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHVubWFyc2hhbGxpbmcKICAgICAgKiBhbnkgUGFyY2VsYWJsZSB2YWx1ZXMgZnJvbSB0aGUgZXh0cmFzIG9mIHRoaXMgSW50ZW50LgogICAgICAqCkBAIC00NjgzLDYgKzQ3MDUsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXQgYSB7QGxpbmsgQ2xpcERhdGF9IGFzc29jaWF0ZWQgd2l0aCB0aGlzIEludGVudC4gIFRoaXMgcmVwbGFjZXMgYW55CisgICAgICogcHJldmlvdXNseSBzZXQgQ2xpcERhdGEuCisgICAgICoKKyAgICAgKiA8cD5UaGUgQ2xpcERhdGEgaW4gYW4gaW50ZW50IGlzIG5vdCB1c2VkIGZvciBJbnRlbnQgbWF0Y2hpbmcgb3Igb3RoZXIKKyAgICAgKiBzdWNoIG9wZXJhdGlvbnMuICBTZW1hbnRpY2FsbHkgaXQgaXMgbGlrZSBleHRyYXMsIHVzZWQgdG8gdHJhbnNtaXQKKyAgICAgKiBhZGRpdGlvbmFsIGRhdGEgd2l0aCB0aGUgSW50ZW50LiAgVGhlIG1haW4gZmVhdHVyZSBvZiB1c2luZyB0aGlzIG92ZXIKKyAgICAgKiB0aGUgZXh0cmFzIGZvciBkYXRhIGlzIHRoYXQge0BsaW5rICNGTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT059CisgICAgICogYW5kIHtAbGluayAjRkxBR19HUkFOVF9XUklURV9VUklfUEVSTUlTU0lPTn0gd2lsbCBvcGVyYXRlIG9uIGFueSBVUkkKKyAgICAgKiBpdGVtcyBpbmNsdWRlZCBpbiB0aGUgY2xpcCBkYXRhLiAgVGhpcyBpcyB1c2VmdWwsIGluIHBhcnRpY3VsYXIsIGlmCisgICAgICogeW91IHdhbnQgdG8gdHJhbnNtaXQgYW4gSW50ZW50IGNvbnRhaW5pbmcgbXVsdGlwbGUgPGNvZGU+Y29udGVudDo8L2NvZGU+CisgICAgICogVVJJcyBmb3Igd2hpY2ggdGhlIHJlY2lwaWVudCBtYXkgbm90IGhhdmUgZ2xvYmFsIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZQorICAgICAqIGNvbnRlbnQgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgQ2xpcERhdGEgY29udGFpbnMgaXRlbXMgdGhhdCBhcmUgdGhlbXNlbHZlcyBJbnRlbnRzLCBhbnkKKyAgICAgKiBncmFudCBmbGFncyBpbiB0aG9zZSBJbnRlbnRzIHdpbGwgYmUgaWdub3JlZC4gIE9ubHkgdGhlIHRvcC1sZXZlbCBmbGFncworICAgICAqIG9mIHRoZSBtYWluIEludGVudCBhcmUgcmVzcGVjdGVkLCBhbmQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBVcmkgb3IKKyAgICAgKiBJbnRlbnQgaXRlbXMgaW4gdGhlIGNsaXAgKG9yIHN1Yi1pdGVtcyBvZiB0aGUgY2xpcCkuCisgICAgICoKKyAgICAgKiA8cD5UaGUgTUlNRSB0eXBlLCBsYWJlbCwgYW5kIGljb24gaW4gdGhlIENsaXBEYXRhIG9iamVjdCBhcmUgbm90CisgICAgICogZGlyZWN0bHkgdXNlZCBieSBJbnRlbnQuICBBcHBsaWNhdGlvbnMgc2hvdWxkIGdlbmVyYWxseSByZWx5IG9uIHRoZQorICAgICAqIE1JTUUgdHlwZSBvZiB0aGUgSW50ZW50IGl0c2VsZiwgbm90IHdoYXQgaXQgbWF5IGZpbmQgaW4gdGhlIENsaXBEYXRhLgorICAgICAqIEEgY29tbW9uIHByYWN0aWNlIGlzIHRvIGNvbnN0cnVjdCBhIENsaXBEYXRhIGZvciB1c2Ugd2l0aCBhbiBJbnRlbnQKKyAgICAgKiB3aXRoIGEgTUlNRSB0eXBlIG9mICIqXC8qIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGlwIFRoZSBuZXcgY2xpcCB0byBzZXQuICBNYXkgYmUgbnVsbCB0byBjbGVhciB0aGUgY3VycmVudCBjbGlwLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsaXBEYXRhKENsaXBEYXRhIGNsaXApIHsKKyAgICAgICAgbUNsaXBEYXRhID0gY2xpcDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBZGQgZXh0ZW5kZWQgZGF0YSB0byB0aGUgaW50ZW50LiAgVGhlIG5hbWUgbXVzdCBpbmNsdWRlIGEgcGFja2FnZQogICAgICAqIHByZWZpeCwgZm9yIGV4YW1wbGUgdGhlIGFwcCBjb20uYW5kcm9pZC5jb250YWN0cyB3b3VsZCB1c2UgbmFtZXMKICAgICAgKiBsaWtlICJjb20uYW5kcm9pZC5jb250YWN0cy5TaG93QWxsIi4KQEAgLTU2NjAsNiArNTcxMywxMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTExfSU5fU0VMRUNUT1IgPSAxPDw2OwogCiAgICAgLyoqCisgICAgICogVXNlIHdpdGgge0BsaW5rICNmaWxsSW59IHRvIGFsbG93IHRoZSBjdXJyZW50IENsaXBEYXRhIHRvIGJlCisgICAgICogb3ZlcndyaXR0ZW4sIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBzZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9JTl9DTElQX0RBVEEgPSAxPDw3OworCisgICAgLyoqCiAgICAgICogQ29weSB0aGUgY29udGVudHMgb2YgPHZhcj5vdGhlcjwvdmFyPiBpbiB0byB0aGlzIG9iamVjdCwgYnV0IG9ubHkKICAgICAgKiB3aGVyZSBmaWVsZHMgYXJlIG5vdCBkZWZpbmVkIGJ5IHRoaXMgb2JqZWN0LiAgRm9yIHB1cnBvc2VzIG9mIGEgZmllbGQKICAgICAgKiBiZWluZyBkZWZpbmVkLCB0aGUgZm9sbG93aW5nIHBpZWNlcyBvZiBkYXRhIGluIHRoZSBJbnRlbnQgYXJlCkBAIC01NjczLDE5ICs1NzMyLDIyIEBACiAgICAgICogPGxpPiBwYWNrYWdlLCBhcyBzZXQgYnkge0BsaW5rICNzZXRQYWNrYWdlfS4KICAgICAgKiA8bGk+IGNvbXBvbmVudCwgYXMgc2V0IGJ5IHtAbGluayAjc2V0Q29tcG9uZW50KENvbXBvbmVudE5hbWUpfSBvcgogICAgICAqIHJlbGF0ZWQgbWV0aG9kcy4KLSAgICAgKiA8bGk+IHNvdXJjZSBib3VuZHMsIGFzIHNldCBieSB7QGxpbmsgI3NldFNvdXJjZUJvdW5kc30KKyAgICAgKiA8bGk+IHNvdXJjZSBib3VuZHMsIGFzIHNldCBieSB7QGxpbmsgI3NldFNvdXJjZUJvdW5kc30uCisgICAgICogPGxpPiBzZWxlY3RvciwgYXMgc2V0IGJ5IHtAbGluayAjc2V0U2VsZWN0b3IoSW50ZW50KX0uCisgICAgICogPGxpPiBjbGlwIGRhdGEsIGFzIHNldCBieSB7QGxpbmsgI3NldENsaXBEYXRhKENsaXBEYXRhKX0uCiAgICAgICogPGxpPiBlYWNoIHRvcC1sZXZlbCBuYW1lIGluIHRoZSBhc3NvY2lhdGVkIGV4dHJhcy4KICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogPHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIHRoZSB7QGxpbmsgI0ZJTExfSU5fQUNUSU9OfSwKICAgICAgKiB7QGxpbmsgI0ZJTExfSU5fREFUQX0sIHtAbGluayAjRklMTF9JTl9DQVRFR09SSUVTfSwge0BsaW5rICNGSUxMX0lOX1BBQ0tBR0V9LAotICAgICAqIHtAbGluayAjRklMTF9JTl9DT01QT05FTlR9LCB7QGxpbmsgI0ZJTExfSU5fU09VUkNFX0JPVU5EU30sIGFuZAotICAgICAqIHtAbGluayAjRklMTF9JTl9TRUxFQ1RPUn0gdG8gb3ZlcnJpZGUgdGhlIHJlc3RyaWN0aW9uIHdoZXJlIHRoZQotICAgICAqIGNvcnJlc3BvbmRpbmcgZmllbGQgd2lsbCBub3QgYmUgcmVwbGFjZWQgaWYgaXQgaXMgYWxyZWFkeSBzZXQuCisgICAgICoge0BsaW5rICNGSUxMX0lOX0NPTVBPTkVOVH0sIHtAbGluayAjRklMTF9JTl9TT1VSQ0VfQk9VTkRTfSwKKyAgICAgKiB7QGxpbmsgI0ZJTExfSU5fU0VMRUNUT1J9LCBhbmQge0BsaW5rICNGSUxMX0lOX0NMSVBfREFUQX0gdG8gb3ZlcnJpZGUKKyAgICAgKiB0aGUgcmVzdHJpY3Rpb24gd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgd2lsbCBub3QgYmUgcmVwbGFjZWQgaWYKKyAgICAgKiBpdCBpcyBhbHJlYWR5IHNldC4KICAgICAgKgotICAgICAqIDxwPk5vdGU6IFRoZSBjb21wb25lbnQgZmllbGQgd2lsbCBvbmx5IGJlIGNvcGllZCBpZiB7QGxpbmsgI0ZJTExfSU5fQ09NUE9ORU5UfSBpcyBleHBsaWNpdGx5Ci0gICAgICogc3BlY2lmaWVkLiAgVGhlIHNlbGVjdG9yIHdpbGwgb25seSBiZSBjb3BpZWQgaWYge0BsaW5rICNGSUxMX0lOX1NFTEVDVE9SfSBpcwotICAgICAqIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorICAgICAqIDxwPk5vdGU6IFRoZSBjb21wb25lbnQgZmllbGQgd2lsbCBvbmx5IGJlIGNvcGllZCBpZiB7QGxpbmsgI0ZJTExfSU5fQ09NUE9ORU5UfQorICAgICAqIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgVGhlIHNlbGVjdG9yIHdpbGwgb25seSBiZSBjb3BpZWQgaWYKKyAgICAgKiB7QGxpbmsgI0ZJTExfSU5fU0VMRUNUT1J9IGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgogICAgICAqCiAgICAgICogPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIEludGVudCBBIHdpdGgge2RhdGE9ImZvbyIsIGNhdGVnb3JpZXM9ImJhciJ9CiAgICAgICogYW5kIEludGVudCBCIHdpdGgge2FjdGlvbj0iZ290aXQiLCBkYXRhLXR5cGU9InNvbWUvdGhpbmciLApAQCAtNTc0Miw2ICs1ODA0LDExIEBACiAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBGSUxMX0lOX1NFTEVDVE9SOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChvdGhlci5tQ2xpcERhdGEgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIChtQ2xpcERhdGEgPT0gbnVsbCB8fCAoZmxhZ3MmRklMTF9JTl9DTElQX0RBVEEpICE9IDApKSB7CisgICAgICAgICAgICBtQ2xpcERhdGEgPSBvdGhlci5tQ2xpcERhdGE7CisgICAgICAgICAgICBjaGFuZ2VzIHw9IEZJTExfSU5fQ0xJUF9EQVRBOworICAgICAgICB9CiAgICAgICAgIC8vIENvbXBvbmVudCBpcyBzcGVjaWFsOiBpdCBjYW4gLW9ubHktIGJlIHNldCBpZiBleHBsaWNpdGx5IGFsbG93ZWQsCiAgICAgICAgIC8vIHNpbmNlIG90aGVyd2lzZSB0aGUgc2VuZGVyIGNvdWxkIGZvcmNlIHRoZSBpbnRlbnQgc29tZXdoZXJlIHRoZQogICAgICAgICAvLyBvcmlnaW5hdG9yIGRpZG4ndCBpbnRlbmQuCkBAIC01OTM4LDcgKzYwMDUsNyBAQAogICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwogCiAgICAgICAgIGIuYXBwZW5kKCJJbnRlbnQgeyAiKTsKLSAgICAgICAgdG9TaG9ydFN0cmluZyhiLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgdG9TaG9ydFN0cmluZyhiLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgIGIuYXBwZW5kKCIgfSIpOwogCiAgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CkBAIC01OTQ5LDIxICs2MDE2LDMzIEBACiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CiAKICAgICAgICAgYi5hcHBlbmQoIkludGVudCB7ICIpOwotICAgICAgICB0b1Nob3J0U3RyaW5nKGIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgdG9TaG9ydFN0cmluZyhiLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICBiLmFwcGVuZCgiIH0iKTsKIAogICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKiBAaGlkZSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TaG9ydFN0cmluZyhib29sZWFuIHNlY3VyZSwgYm9vbGVhbiBjb21wLCBib29sZWFuIGV4dHJhcykgeworICAgIHB1YmxpYyBTdHJpbmcgdG9JbnNlY3VyZVN0cmluZ1dpdGhDbGlwKCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwotICAgICAgICB0b1Nob3J0U3RyaW5nKGIsIHNlY3VyZSwgY29tcCwgZXh0cmFzKTsKKworICAgICAgICBiLmFwcGVuZCgiSW50ZW50IHsgIik7CisgICAgICAgIHRvU2hvcnRTdHJpbmcoYiwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICBiLmFwcGVuZCgiIH0iKTsKKwogICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKiBAaGlkZSAqLwotICAgIHB1YmxpYyB2b2lkIHRvU2hvcnRTdHJpbmcoU3RyaW5nQnVpbGRlciBiLCBib29sZWFuIHNlY3VyZSwgYm9vbGVhbiBjb21wLCBib29sZWFuIGV4dHJhcykgeworICAgIHB1YmxpYyBTdHJpbmcgdG9TaG9ydFN0cmluZyhib29sZWFuIHNlY3VyZSwgYm9vbGVhbiBjb21wLCBib29sZWFuIGV4dHJhcywgYm9vbGVhbiBjbGlwKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEyOCk7CisgICAgICAgIHRvU2hvcnRTdHJpbmcoYiwgc2VjdXJlLCBjb21wLCBleHRyYXMsIGNsaXApOworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyB2b2lkIHRvU2hvcnRTdHJpbmcoU3RyaW5nQnVpbGRlciBiLCBib29sZWFuIHNlY3VyZSwgYm9vbGVhbiBjb21wLCBib29sZWFuIGV4dHJhcywKKyAgICAgICAgICAgIGJvb2xlYW4gY2xpcCkgewogICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgaWYgKG1BY3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgYi5hcHBlbmQoImFjdD0iKS5hcHBlbmQobUFjdGlvbik7CkBAIC02MDMxLDYgKzYxMTAsMTkgQEAKICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgICBiLmFwcGVuZCgiYm5kcz0iKS5hcHBlbmQobVNvdXJjZUJvdW5kcy50b1Nob3J0U3RyaW5nKCkpOwogICAgICAgICB9CisgICAgICAgIGlmIChtQ2xpcERhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNsaXApIHsKKyAgICAgICAgICAgICAgICBiLmFwcGVuZCgiY2xpcD17Iik7CisgICAgICAgICAgICAgICAgbUNsaXBEYXRhLnRvU2hvcnRTdHJpbmcoYik7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi5hcHBlbmQoIihoYXMgY2xpcCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoZXh0cmFzICYmIG1FeHRyYXMgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKCFmaXJzdCkgewogICAgICAgICAgICAgICAgIGIuYXBwZW5kKCcgJyk7CkBAIC02MDQwLDcgKzYxMzIsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtU2VsZWN0b3IgIT0gbnVsbCkgewogICAgICAgICAgICAgYi5hcHBlbmQoIiBzZWw9eyIpOwotICAgICAgICAgICAgbVNlbGVjdG9yLnRvU2hvcnRTdHJpbmcoYiwgc2VjdXJlLCBjb21wLCBleHRyYXMpOworICAgICAgICAgICAgbVNlbGVjdG9yLnRvU2hvcnRTdHJpbmcoYiwgc2VjdXJlLCBjb21wLCBleHRyYXMsIGNsaXApOwogICAgICAgICAgICAgYi5hcHBlbmQoIn0iKTsKICAgICAgICAgfQogICAgIH0KQEAgLTYyMDksNiArNjMwMSwxMyBAQAogICAgICAgICAgICAgb3V0LndyaXRlSW50KDApOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1DbGlwRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQoMSk7CisgICAgICAgICAgICBtQ2xpcERhdGEud3JpdGVUb1BhcmNlbChvdXQsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludCgwKTsKKyAgICAgICAgfQorCiAgICAgICAgIG91dC53cml0ZUJ1bmRsZShtRXh0cmFzKTsKICAgICB9CiAKQEAgLTYyNTQsNiArNjM1MywxMCBAQAogICAgICAgICAgICAgbVNlbGVjdG9yID0gbmV3IEludGVudChpbik7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoaW4ucmVhZEludCgpICE9IDApIHsKKyAgICAgICAgICAgIG1DbGlwRGF0YSA9IG5ldyBDbGlwRGF0YShpbik7CisgICAgICAgIH0KKwogICAgICAgICBtRXh0cmFzID0gaW4ucmVhZEJ1bmRsZSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jTWFuYWdlci5qYXZhCmluZGV4IGJhMjQwMzYuLmI3ZGZlOTIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY01hbmFnZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNNYW5hZ2VyLmphdmEKQEAgLTIzLDE4ICsyMywyMyBAQAogCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwogaW1wb3J0IGFuZHJvaWQuYWNjb3VudHMuQWNjb3VudE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50TWFuYWdlclNlcnZpY2U7CiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5PbkFjY291bnRzVXBkYXRlTGlzdGVuZXI7CiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BcHBHbG9iYWxzOwogaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRG93bmxvYWRNYW5hZ2VyLlJlcXVlc3Q7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LlN5bmNTdG9yYWdlRW5naW5lLk9uU3luY1JlcXVlc3RMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUHJvdmlkZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZWdpc3RlcmVkU2VydmljZXNDYWNoZTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGVMaXN0ZW5lcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlVzZXJJbmZvOwogaW1wb3J0IGFuZHJvaWQubmV0LkNvbm5lY3Rpdml0eU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuTmV0d29ya0luZm87CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CkBAIC00OCw2ICs1Myw3IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKIGltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbVByb3BlcnRpZXM7CitpbXBvcnQgYW5kcm9pZC5vcy5Vc2VySWQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5Xb3JrU291cmNlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3M7CiBpbXBvcnQgYW5kcm9pZC50ZXh0LmZvcm1hdC5EYXRlVXRpbHM7CkBAIC0xMzIsNyArMTM4LDkgQEAKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIAotICAgIHByaXZhdGUgdm9sYXRpbGUgQWNjb3VudFtdIG1BY2NvdW50cyA9IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNjb3VudEFuZFVzZXJbXSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZID0gbmV3IEFjY291bnRBbmRVc2VyWzBdOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBY2NvdW50QW5kVXNlcltdIG1BY2NvdW50cyA9IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7CiAKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtSGFuZGxlQWxhcm1XYWtlTG9jazsKICAgICB2b2xhdGlsZSBwcml2YXRlIFBvd2VyTWFuYWdlci5XYWtlTG9jayBtU3luY01hbmFnZXJXYWtlTG9jazsKQEAgLTE2Niw3ICsxNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgIkludGVybmFsIHN0b3JhZ2UgaXMgbG93LiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VJc0xvdyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jKG51bGwgLyogYW55IGFjY291bnQgKi8sIG51bGwgLyogYW55IGF1dGhvcml0eSAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jKG51bGwgLyogYW55IGFjY291bnQgKi8sIFVzZXJJZC5VU0VSX0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBhbnkgYXV0aG9yaXR5ICovKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJbnRlbnQuQUNUSU9OX0RFVklDRV9TVE9SQUdFX09LLmVxdWFscyhhY3Rpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJJbnRlcm5hbCBzdG9yYWdlIGlzIG9rLiIpOwpAQCAtMTg2LDI4ICsxOTUsNzMgQEAKICAgICBwcml2YXRlIEJyb2FkY2FzdFJlY2VpdmVyIG1CYWNrZ3JvdW5kRGF0YVNldHRpbmdDaGFuZ2VkID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewogICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7CiAgICAgICAgICAgICBpZiAoZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcigpLmdldEJhY2tncm91bmREYXRhU2V0dGluZygpKSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jKG51bGwgLyogYWNjb3VudCAqLywgbnVsbCAvKiBhdXRob3JpdHkgKi8sIG5ldyBCdW5kbGUoKSwgMCAvKiBkZWxheSAqLywKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmMobnVsbCAvKiBhY2NvdW50ICovLCBVc2VySWQuVVNFUl9BTEwsIG51bGwgLyogYXV0aG9yaXR5ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1bmRsZSgpLCAwIC8qIGRlbGF5ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogb25seVRob3NlV2l0aFVua25vd25TeW5jYWJsZVN0YXRlICovKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBY2NvdW50W10gSU5JVElBTF9BQ0NPVU5UU19BUlJBWSA9IG5ldyBBY2NvdW50WzBdOwotCiAgICAgcHJpdmF0ZSBmaW5hbCBQb3dlck1hbmFnZXIgbVBvd2VyTWFuYWdlcjsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1lOQ19BTEFSTV9USU1FT1VUX01JTiA9IDMwICogMTAwMDsgLy8gMzAgc2Vjb25kcwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgU1lOQ19BTEFSTV9USU1FT1VUX01BWCA9IDIgKiA2MCAqIDYwICogMTAwMDsgLy8gdHdvIGhvdXJzCiAKKyAgICBwcml2YXRlIExpc3Q8VXNlckluZm8+IGdldEFsbFVzZXJzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEFwcEdsb2JhbHMuZ2V0UGFja2FnZU1hbmFnZXIoKS5nZXRVc2VycygpOworICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIC8vIExvY2FsIHRvIHN5c3RlbSBwcm9jZXNzLCBzaG91bGRuJ3QgaGFwcGVuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zQWNjb3VudEFuZFVzZXIoQWNjb3VudEFuZFVzZXJbXSBhY2NvdW50cywgQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkKSB7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NvdW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFjY291bnRzW2ldLnVzZXJJZCA9PSB1c2VySWQKKyAgICAgICAgICAgICAgICAgICAgJiYgYWNjb3VudHNbaV0uYWNjb3VudC5lcXVhbHMoYWNjb3VudCkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIG9uQWNjb3VudHNVcGRhdGVkKEFjY291bnRbXSBhY2NvdW50cykgewogICAgICAgICAvLyByZW1lbWJlciBpZiB0aGlzIHdhcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYW4gdXBkYXRlCiAgICAgICAgIGZpbmFsIGJvb2xlYW4ganVzdEJvb3RlZFVwID0gbUFjY291bnRzID09IElOSVRJQUxfQUNDT1VOVFNfQVJSQVk7Ci0gICAgICAgIG1BY2NvdW50cyA9IGFjY291bnRzOwogCi0gICAgICAgIC8vIGlmIGEgc3luYyBpcyBpbiBwcm9ncmVzcyB5ZXQgaXQgaXMgbm8gbG9uZ2VyIGluIHRoZSBhY2NvdW50cyBsaXN0LAotICAgICAgICAvLyBjYW5jZWwgaXQKKyAgICAgICAgTGlzdDxVc2VySW5mbz4gdXNlcnMgPSBnZXRBbGxVc2VycygpOworICAgICAgICBpZiAodXNlcnMgPT0gbnVsbCkgIHJldHVybjsKKworICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgIC8vIEZvciBhbGwga25vd24gdXNlcnMgb24gdGhlIHN5c3RlbSwgZ2V0IHRoZWlyIGFjY291bnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgbGlzdAorICAgICAgICAvLyBUT0RPOiBMaW1pdCB0aGlzIHRvIGFjdGl2ZSB1c2Vycywgd2hlbiBzdWNoIGEgY29uY2VwdCBleGlzdHMuCisgICAgICAgIGZvciAoVXNlckluZm8gdXNlciA6IHVzZXJzKSB7CisgICAgICAgICAgICBhY2NvdW50cyA9IEFjY291bnRNYW5hZ2VyU2VydmljZS5nZXRTaW5nbGV0b24oKS5nZXRBY2NvdW50cyh1c2VyLmlkKTsKKyAgICAgICAgICAgIGNvdW50ICs9IGFjY291bnRzLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEFjY291bnRBbmRVc2VyW10gYWxsQWNjb3VudHMgPSBuZXcgQWNjb3VudEFuZFVzZXJbY291bnRdOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKFVzZXJJbmZvIHVzZXIgOiB1c2VycykgeworICAgICAgICAgICAgYWNjb3VudHMgPSBBY2NvdW50TWFuYWdlclNlcnZpY2UuZ2V0U2luZ2xldG9uKCkuZ2V0QWNjb3VudHModXNlci5pZCk7CisgICAgICAgICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGFjY291bnRzKSB7CisgICAgICAgICAgICAgICAgYWxsQWNjb3VudHNbaW5kZXgrK10gPSBuZXcgQWNjb3VudEFuZFVzZXIoYWNjb3VudCwgdXNlci5pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUJvb3RDb21wbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZG9EYXRhYmFzZUNsZWFudXAoYWNjb3VudHMsIHVzZXIuaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbUFjY291bnRzID0gYWxsQWNjb3VudHM7CisKICAgICAgICAgZm9yIChBY3RpdmVTeW5jQ29udGV4dCBjdXJyZW50U3luY0NvbnRleHQgOiBtQWN0aXZlU3luY0NvbnRleHRzKSB7Ci0gICAgICAgICAgICBpZiAoIUFycmF5VXRpbHMuY29udGFpbnMoYWNjb3VudHMsIGN1cnJlbnRTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hY2NvdW50KSkgeworICAgICAgICAgICAgaWYgKCFjb250YWluc0FjY291bnRBbmRVc2VyKGFsbEFjY291bnRzLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLnVzZXJJZCkpIHsKICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJjYW5jZWxpbmcgc3luYyBzaW5jZSB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIik7CiAgICAgICAgICAgICAgICAgc2VuZFN5bmNGaW5pc2hlZE9yQ2FuY2VsZWRNZXNzYWdlKGN1cnJlbnRTeW5jQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogbm8gcmVzdWx0IHNpbmNlIHRoaXMgaXMgYSBjYW5jZWwgKi8pOwpAQCAtMjE4LDExICsyNzIsNyBAQAogICAgICAgICAvLyB0aGUgYWNjb3VudHMgYXJlIG5vdCBzZXQgeWV0CiAgICAgICAgIHNlbmRDaGVja0FsYXJtc01lc3NhZ2UoKTsKIAotICAgICAgICBpZiAobUJvb3RDb21wbGV0ZWQpIHsKLSAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kb0RhdGFiYXNlQ2xlYW51cChhY2NvdW50cyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYWNjb3VudHMubGVuZ3RoID4gMCkgeworICAgICAgICBpZiAoYWxsQWNjb3VudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGlzIHdhcyBjYWxsZWQgYWZ0ZXIgYSBib290dXAgdGhlbgogICAgICAgICAgICAgLy8gdGhlIGFjY291bnRzIGhhdmVuJ3QgcmVhbGx5IGNoYW5nZWQsIGluc3RlYWQgdGhleSB3ZXJlIGp1c3QgbG9hZGVkCiAgICAgICAgICAgICAvLyBmcm9tIHRoZSBBY2NvdW50TWFuYWdlci4gT3RoZXJ3aXNlIGF0IGxlYXN0IG9uZSBvZiB0aGUgYWNjb3VudHMKQEAgLTIzOCw3ICsyODgsOCBAQAogICAgICAgICAgICAgLy8gYSBjaGFuY2UgdG8gc2V0IHRoZWlyIHN5bmNhYmxlIHN0YXRlLgogCiAgICAgICAgICAgICBib29sZWFuIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlID0ganVzdEJvb3RlZFVwOwotICAgICAgICAgICAgc2NoZWR1bGVTeW5jKG51bGwsIG51bGwsIG51bGwsIDAgLyogbm8gZGVsYXkgKi8sIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlKTsKKyAgICAgICAgICAgIHNjaGVkdWxlU3luYyhudWxsLCBVc2VySWQuVVNFUl9BTEwsIG51bGwsIG51bGwsIDAgLyogbm8gZGVsYXkgKi8sCisgICAgICAgICAgICAgICAgICAgIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjc3LDEwICszMjgsMzYgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1lOQ19BTEFSTSA9ICJhbmRyb2lkLmNvbnRlbnQuc3luY21hbmFnZXIuU1lOQ19BTEFSTSI7CiAgICAgcHJpdmF0ZSBmaW5hbCBTeW5jSGFuZGxlciBtU3luY0hhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1NYWluSGFuZGxlcjsKIAogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBtQm9vdENvbXBsZXRlZCA9IGZhbHNlOwogCisgICAgc3RhdGljIGNsYXNzIEFjY291bnRBbmRVc2VyIHsKKyAgICAgICAgQWNjb3VudCBhY2NvdW50OworICAgICAgICBpbnQgdXNlcklkOworCisgICAgICAgIEFjY291bnRBbmRVc2VyKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCkgeworICAgICAgICAgICAgdGhpcy5hY2NvdW50ID0gYWNjb3VudDsKKyAgICAgICAgICAgIHRoaXMudXNlcklkID0gdXNlcklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBY2NvdW50QW5kVXNlcikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGZpbmFsIEFjY291bnRBbmRVc2VyIG90aGVyID0gKEFjY291bnRBbmRVc2VyKSBvOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNjb3VudC5lcXVhbHMob3RoZXIuYWNjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy51c2VySWQgPT0gb3RoZXIudXNlcklkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gYWNjb3VudC5oYXNoQ29kZSgpICsgdXNlcklkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBhY2NvdW50LnRvU3RyaW5nKCkgKyAiIHUiICsgdXNlcklkOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBDb25uZWN0aXZpdHlNYW5hZ2VyIGdldENvbm5lY3Rpdml0eU1hbmFnZXIoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgaWYgKG1Db25uTWFuYWdlckRvTm90VXNlRGlyZWN0bHkgPT0gbnVsbCkgewpAQCAtMjk3LDYgKzM3NCwxMyBAQAogICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLmluaXQoY29udGV4dCk7CiAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZSA9IFN5bmNTdG9yYWdlRW5naW5lLmdldFNpbmdsZXRvbigpOworICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0T25TeW5jUmVxdWVzdExpc3RlbmVyKG5ldyBPblN5bmNSZXF1ZXN0TGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSZXF1ZXN0KEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luYyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwgZXh0cmFzLCAwLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCiAgICAgICAgIG1TeW5jQWRhcHRlcnMgPSBuZXcgU3luY0FkYXB0ZXJzQ2FjaGUobUNvbnRleHQpOwogICAgICAgICBtU3luY1F1ZXVlID0gbmV3IFN5bmNRdWV1ZShtU3luY1N0b3JhZ2VFbmdpbmUsIG1TeW5jQWRhcHRlcnMpOwogCkBAIC0zMDQsMTIgKzM4OCwxMSBAQAogICAgICAgICAgICAgICAgIFByb2Nlc3MuVEhSRUFEX1BSSU9SSVRZX0JBQ0tHUk9VTkQpOwogICAgICAgICBzeW5jVGhyZWFkLnN0YXJ0KCk7CiAgICAgICAgIG1TeW5jSGFuZGxlciA9IG5ldyBTeW5jSGFuZGxlcihzeW5jVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbU1haW5IYW5kbGVyID0gbmV3IEhhbmRsZXIobUNvbnRleHQuZ2V0TWFpbkxvb3BlcigpKTsKIAogICAgICAgICBtU3luY0FkYXB0ZXJzLnNldExpc3RlbmVyKG5ldyBSZWdpc3RlcmVkU2VydmljZXNDYWNoZUxpc3RlbmVyPFN5bmNBZGFwdGVyVHlwZT4oKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDaGFuZ2VkKFN5bmNBZGFwdGVyVHlwZSB0eXBlLCBib29sZWFuIHJlbW92ZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jKG51bGwsIHR5cGUuYXV0aG9yaXR5LCBudWxsLCAwIC8qIG5vIGRlbGF5ICovLAorICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVN5bmMobnVsbCwgVXNlcklkLlVTRVJfQUxMLCB0eXBlLmF1dGhvcml0eSwgbnVsbCwgMCAvKiBubyBkZWxheSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSAqLyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzc2LDcgKzQ1OSw3IEBACiAgICAgICAgICAgICBBY2NvdW50TWFuYWdlci5nZXQobUNvbnRleHQpLmFkZE9uQWNjb3VudHNVcGRhdGVkTGlzdGVuZXIoU3luY01hbmFnZXIudGhpcywKICAgICAgICAgICAgICAgICBtU3luY0hhbmRsZXIsIGZhbHNlIC8qIHVwZGF0ZUltbWVkaWF0ZWx5ICovKTsKICAgICAgICAgICAgIC8vIGRvIHRoaXMgc3luY2hyb25vdXNseSB0byBlbnN1cmUgd2UgaGF2ZSB0aGUgYWNjb3VudHMgYmVmb3JlIHRoaXMgY2FsbCByZXR1cm5zCi0gICAgICAgICAgICBvbkFjY291bnRzVXBkYXRlZChBY2NvdW50TWFuYWdlci5nZXQobUNvbnRleHQpLmdldEFjY291bnRzKCkpOworICAgICAgICAgICAgb25BY2NvdW50c1VwZGF0ZWQobnVsbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQwNCw4MiArNDg3LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU3luY0FkYXB0ZXIoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7Ci0gICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgTG9nLnYoVEFHLCAiaW5pdGlhbGl6ZVN5bmNBZGFwdGVyOiAiICsgYWNjb3VudCArICIsIGF1dGhvcml0eSAiICsgYXV0aG9yaXR5KTsKLSAgICAgICAgfQotICAgICAgICBTeW5jQWRhcHRlclR5cGUgc3luY0FkYXB0ZXJUeXBlID0gU3luY0FkYXB0ZXJUeXBlLm5ld0tleShhdXRob3JpdHksIGFjY291bnQudHlwZSk7Ci0gICAgICAgIFJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlLlNlcnZpY2VJbmZvPFN5bmNBZGFwdGVyVHlwZT4gc3luY0FkYXB0ZXJJbmZvID0KLSAgICAgICAgICAgICAgICBtU3luY0FkYXB0ZXJzLmdldFNlcnZpY2VJbmZvKHN5bmNBZGFwdGVyVHlwZSk7Ci0gICAgICAgIGlmIChzeW5jQWRhcHRlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiY2FuJ3QgZmluZCBhIHN5bmMgYWRhcHRlciBmb3IgIiArIHN5bmNBZGFwdGVyVHlwZSArICIsIHJlbW92aW5nIik7Ci0gICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUucmVtb3ZlQXV0aG9yaXR5KGFjY291bnQsIGF1dGhvcml0eSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOwotICAgICAgICBpbnRlbnQuc2V0QWN0aW9uKCJhbmRyb2lkLmNvbnRlbnQuU3luY0FkYXB0ZXIiKTsKLSAgICAgICAgaW50ZW50LnNldENvbXBvbmVudChzeW5jQWRhcHRlckluZm8uY29tcG9uZW50TmFtZSk7Ci0gICAgICAgIGlmICghbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LAotICAgICAgICAgICAgICAgIG5ldyBJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uKGFjY291bnQsIGF1dGhvcml0eSwgbUNvbnRleHQsIG1NYWluSGFuZGxlciksCi0gICAgICAgICAgICAgICAgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFIHwgQ29udGV4dC5CSU5EX05PVF9GT1JFR1JPVU5ECi0gICAgICAgICAgICAgICAgfCBDb250ZXh0LkJJTkRfQUxMT1dfT09NX01BTkFHRU1FTlQpKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJpbml0aWFsaXplU3luY0FkYXB0ZXI6IGZhaWxlZCB0byBiaW5kIHRvICIgKyBpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5pdGlhbGl6ZXJTZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50IG1BY2NvdW50OwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQXV0aG9yaXR5OwotICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG1Jbml0aWFsaXplZDsKLQotICAgICAgICBwdWJsaWMgSW5pdGlhbGl6ZXJTZXJ2aWNlQ29ubmVjdGlvbihBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHksIENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIG1BY2NvdW50ID0gYWNjb3VudDsKLSAgICAgICAgICAgIG1BdXRob3JpdHkgPSBhdXRob3JpdHk7Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IGhhbmRsZXI7Ci0gICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgImNhbGxpbmcgaW5pdGlhbGl6ZTogIiArIG1BY2NvdW50ICsgIiwgYXV0aG9yaXR5ICIgKyBtQXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBJU3luY0FkYXB0ZXIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKS5pbml0aWFsaXplKG1BY2NvdW50LCBtQXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgbWF0dGVyLCB3ZSB3aWxsIHJldHJ5IGFnYWluIGxhdGVyCi0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiZXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nOiAiICsgbUFjY291bnQgKyAiLCBhdXRob3JpdHkgIiArIG1BdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2l2ZSB0aGUgc3luYyBhZGFwdGVyIHRpbWUgdG8gaW5pdGlhbGl6ZSBiZWZvcmUgdW5iaW5kaW5nIGZyb20gaXQKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBBUEkgdG8gbm90IHJlbHkgb24gdGhpcyB0aW1pbmcsIGh0dHA6Ly9iLzI1MDA4MDUKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQudW5iaW5kU2VydmljZShJbml0aWFsaXplclNlcnZpY2VDb25uZWN0aW9uLnRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0sIElOSVRJQUxJWkFUSU9OX1VOQklORF9ERUxBWV9NUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UoSW5pdGlhbGl6ZXJTZXJ2aWNlQ29ubmVjdGlvbi50aGlzKTsKLSAgICAgICAgICAgICAgICBtQ29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQogICAgIC8qKgogICAgICAqIEluaXRpYXRlIGEgc3luYy4gVGhpcyBjYW4gc3RhcnQgYSBzeW5jIGZvciBhbGwgcHJvdmlkZXJzCiAgICAgICogKHBhc3MgbnVsbCB0byB1cmwsIHNldCBvbmx5VGlja2xhYmxlIHRvIGZhbHNlKSwgb25seSB0aG9zZQpAQCAtNTAwLDYgKzUwNyw4IEBACiAgICAgICogPHA+WW91J2xsIHN0YXJ0IGdldHRpbmcgY2FsbGJhY2tzIGFmdGVyIHRoaXMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVxdWVzdGVkQWNjb3VudCB0aGUgYWNjb3VudCB0byBzeW5jLCBtYXkgYmUgbnVsbCB0byBzaWduaWZ5IGFsbCBhY2NvdW50cworICAgICAqIEBwYXJhbSB1c2VySWQgdGhlIGlkIG9mIHRoZSB1c2VyIHdob3NlIGFjY291bnRzIGFyZSB0byBiZSBzeW5jZWQuIElmIHVzZXJJZCBpcyBVU0VSX0FMTCwKKyAgICAgKiAgICAgICAgICB0aGVuIGFsbCB1c2VycycgYWNjb3VudHMgYXJlIGNvbnNpZGVyZWQuCiAgICAgICogQHBhcmFtIHJlcXVlc3RlZEF1dGhvcml0eSB0aGUgYXV0aG9yaXR5IHRvIHN5bmMsIG1heSBiZSBudWxsIHRvIGluZGljYXRlIGFsbCBhdXRob3JpdGllcwogICAgICAqIEBwYXJhbSBleHRyYXMgYSBNYXAgb2YgU3luY0FkYXB0ZXItc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gY29udHJvbAogICAgICAqICAgICAgICAgIHN5bmNzIG9mIGEgc3BlY2lmaWMgcHJvdmlkZXIuIENhbiBiZSBudWxsLiBJcyBpZ25vcmVkCkBAIC01MDcsNyArNTE2LDcgQEAKICAgICAgKiBAcGFyYW0gZGVsYXkgaG93IG1hbnkgbWlsbGlzZWNvbmRzIGluIHRoZSBmdXR1cmUgdG8gd2FpdCBiZWZvcmUgcGVyZm9ybWluZyB0aGlzCiAgICAgICogQHBhcmFtIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVTeW5jKEFjY291bnQgcmVxdWVzdGVkQWNjb3VudCwgU3RyaW5nIHJlcXVlc3RlZEF1dGhvcml0eSwKKyAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZVN5bmMoQWNjb3VudCByZXF1ZXN0ZWRBY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcmVxdWVzdGVkQXV0aG9yaXR5LAogICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgbG9uZyBkZWxheSwgYm9vbGVhbiBvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSkgewogICAgICAgICBib29sZWFuIGlzTG9nZ2FibGUgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKTsKIApAQCAtNTIxLDkgKzUzMCw5IEBACiAgICAgICAgICAgICBkZWxheSA9IC0xOyAvLyB0aGlzIG1lYW5zIHNjaGVkdWxlIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUKICAgICAgICAgfQogCi0gICAgICAgIEFjY291bnRbXSBhY2NvdW50czsKLSAgICAgICAgaWYgKHJlcXVlc3RlZEFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWNjb3VudHMgPSBuZXcgQWNjb3VudFtde3JlcXVlc3RlZEFjY291bnR9OworICAgICAgICBBY2NvdW50QW5kVXNlcltdIGFjY291bnRzOworICAgICAgICBpZiAocmVxdWVzdGVkQWNjb3VudCAhPSBudWxsICYmIHVzZXJJZCAhPSBVc2VySWQuVVNFUl9BTEwpIHsKKyAgICAgICAgICAgIGFjY291bnRzID0gbmV3IEFjY291bnRBbmRVc2VyW10geyBuZXcgQWNjb3VudEFuZFVzZXIocmVxdWVzdGVkQWNjb3VudCwgdXNlcklkKSB9OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gaWYgdGhlIGFjY291bnRzIGFyZW4ndCBjb25maWd1cmVkIHlldCB0aGVuIHdlIGNhbid0IHN1cHBvcnQgYW4gYWNjb3VudC1sZXNzCiAgICAgICAgICAgICAvLyBzeW5jIHJlcXVlc3QKQEAgLTU3NCwyNCArNTgzLDIzIEBACiAgICAgICAgICAgICBpZiAoaGFzU3luY0FkYXB0ZXIpIHN5bmNhYmxlQXV0aG9yaXRpZXMuYWRkKHJlcXVlc3RlZEF1dGhvcml0eSk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBib29sZWFuIG1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCk7Ci0KICAgICAgICAgZm9yIChTdHJpbmcgYXV0aG9yaXR5IDogc3luY2FibGVBdXRob3JpdGllcykgewotICAgICAgICAgICAgZm9yIChBY2NvdW50IGFjY291bnQgOiBhY2NvdW50cykgewotICAgICAgICAgICAgICAgIGludCBpc1N5bmNhYmxlID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICAgICAgICAgIGZvciAoQWNjb3VudEFuZFVzZXIgYWNjb3VudCA6IGFjY291bnRzKSB7CisgICAgICAgICAgICAgICAgaW50IGlzU3luY2FibGUgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50LmFjY291bnQsIGFjY291bnQudXNlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICBpZiAoaXNTeW5jYWJsZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmaW5hbCBSZWdpc3RlcmVkU2VydmljZXNDYWNoZS5TZXJ2aWNlSW5mbzxTeW5jQWRhcHRlclR5cGU+IHN5bmNBZGFwdGVySW5mbyA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY0FkYXB0ZXJzLmdldFNlcnZpY2VJbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jQWRhcHRlclR5cGUubmV3S2V5KGF1dGhvcml0eSwgYWNjb3VudC50eXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNBZGFwdGVyVHlwZS5uZXdLZXkoYXV0aG9yaXR5LCBhY2NvdW50LmFjY291bnQudHlwZSkpOwogICAgICAgICAgICAgICAgIGlmIChzeW5jQWRhcHRlckluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxvd1BhcmFsbGVsU3luY3MgPSBzeW5jQWRhcHRlckluZm8udHlwZS5hbGxvd1BhcmFsbGVsU3luY3MoKTsKICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzQWx3YXlzU3luY2FibGUgPSBzeW5jQWRhcHRlckluZm8udHlwZS5pc0Fsd2F5c1N5bmNhYmxlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGlzU3luY2FibGUgPCAwICYmIGlzQWx3YXlzU3luY2FibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudCwgYXV0aG9yaXR5LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudC5hY2NvdW50LCBhY2NvdW50LnVzZXJJZCwgYXV0aG9yaXR5LCAxKTsKICAgICAgICAgICAgICAgICAgICAgaXNTeW5jYWJsZSA9IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChvbmx5VGhvc2VXaXRoVW5rb3duU3luY2FibGVTdGF0ZSAmJiBpc1N5bmNhYmxlID49IDApIHsKQEAgLTYwNSw4ICs2MTMsMTAgQEAKICAgICAgICAgICAgICAgICBib29sZWFuIHN5bmNBbGxvd2VkID0KICAgICAgICAgICAgICAgICAgICAgICAgIChpc1N5bmNhYmxlIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlnbm9yZVNldHRpbmdzCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQgJiYgbWFzdGVyU3luY0F1dG9tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudCwgYXV0aG9yaXR5KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQudXNlcklkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudC5hY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQudXNlcklkLCBhdXRob3JpdHkpKTsKICAgICAgICAgICAgICAgICBpZiAoIXN5bmNBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc0xvZ2dhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzY2hlZHVsZVN5bmM6IHN5bmMgb2YgIiArIGFjY291bnQgKyAiLCAiICsgYXV0aG9yaXR5CkBAIC02MTUsOCArNjI1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKGFjY291bnQsIGF1dGhvcml0eSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBkZWxheVVudGlsID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldERlbGF5VW50aWxUaW1lKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0gbVN5bmNTdG9yYWdlRW5naW5lCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QmFja29mZihhY2NvdW50LmFjY291bnQsIGFjY291bnQudXNlcklkLCBhdXRob3JpdHkpOworICAgICAgICAgICAgICAgIGxvbmcgZGVsYXlVbnRpbCA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXREZWxheVVudGlsVGltZShhY2NvdW50LmFjY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LnVzZXJJZCwgYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGJhY2tvZmZUaW1lID0gYmFja29mZiAhPSBudWxsID8gYmFja29mZi5maXJzdCA6IDA7CiAgICAgICAgICAgICAgICAgaWYgKGlzU3luY2FibGUgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBuZXdFeHRyYXMgPSBuZXcgQnVuZGxlKCk7CkBAIC02MzAsOSArNjQyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXMgIiArIG5ld0V4dHJhcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQsIHNvdXJjZSwgYXV0aG9yaXR5LCBuZXdFeHRyYXMsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmVGltZSwgZGVsYXlVbnRpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93UGFyYWxsZWxTeW5jcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQuYWNjb3VudCwgYWNjb3VudC51c2VySWQsIHNvdXJjZSwgYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXh0cmFzLCAwLCBiYWNrb2ZmVGltZSwgZGVsYXlVbnRpbCwgYWxsb3dQYXJhbGxlbFN5bmNzKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghb25seVRob3NlV2l0aFVua293blN5bmNhYmxlU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKQEAgLTY0NCwxOCArNjU1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZXh0cmFzICIgKyBleHRyYXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50LCBzb3VyY2UsIGF1dGhvcml0eSwgZXh0cmFzLCBkZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tvZmZUaW1lLCBkZWxheVVudGlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dQYXJhbGxlbFN5bmNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudC5hY2NvdW50LCBhY2NvdW50LnVzZXJJZCwgc291cmNlLCBhdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMsIGRlbGF5LCBiYWNrb2ZmVGltZSwgZGVsYXlVbnRpbCwgYWxsb3dQYXJhbGxlbFN5bmNzKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVMb2NhbFN5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgcHVibGljIHZvaWQgc2NoZWR1bGVMb2NhbFN5bmMoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGV4dHJhcy5wdXRCb29sZWFuKENvbnRlbnRSZXNvbHZlci5TWU5DX0VYVFJBU19VUExPQUQsIHRydWUpOwotICAgICAgICBzY2hlZHVsZVN5bmMoYWNjb3VudCwgYXV0aG9yaXR5LCBleHRyYXMsIExPQ0FMX1NZTkNfREVMQVksCisgICAgICAgIHNjaGVkdWxlU3luYyhhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwgZXh0cmFzLCBMT0NBTF9TWU5DX0RFTEFZLAogICAgICAgICAgICAgICAgIGZhbHNlIC8qIG9ubHlUaG9zZVdpdGhVbmtvd25TeW5jYWJsZVN0YXRlICovKTsKICAgICB9CiAKQEAgLTY5MSwxMSArNzAxLDEzIEBACiAgICAgICAgIG1TeW5jSGFuZGxlci5zZW5kTWVzc2FnZShtc2cpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzZW5kQ2FuY2VsU3luY3NNZXNzYWdlKGZpbmFsIEFjY291bnQgYWNjb3VudCwgZmluYWwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgIHByaXZhdGUgdm9pZCBzZW5kQ2FuY2VsU3luY3NNZXNzYWdlKGZpbmFsIEFjY291bnQgYWNjb3VudCwgZmluYWwgaW50IHVzZXJJZCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHkpIHsKICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSBMb2cudihUQUcsICJzZW5kaW5nIE1FU1NBR0VfQ0FOQ0VMIik7CiAgICAgICAgIE1lc3NhZ2UgbXNnID0gbVN5bmNIYW5kbGVyLm9idGFpbk1lc3NhZ2UoKTsKICAgICAgICAgbXNnLndoYXQgPSBTeW5jSGFuZGxlci5NRVNTQUdFX0NBTkNFTDsKICAgICAgICAgbXNnLm9iaiA9IFBhaXIuY3JlYXRlKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgIG1zZy5hcmcxID0gdXNlcklkOwogICAgICAgICBtU3luY0hhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAKQEAgLTcxNywxMCArNzI5LDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFyQmFja29mZlNldHRpbmcoU3luY09wZXJhdGlvbiBvcCkgewotICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QmFja29mZihvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksCisgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5LAogICAgICAgICAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUsIFN5bmNTdG9yYWdlRW5naW5lLk5PVF9JTl9CQUNLT0ZGX01PREUpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKLSAgICAgICAgICAgIG1TeW5jUXVldWUub25CYWNrb2ZmQ2hhbmdlZChvcC5hY2NvdW50LCBvcC5hdXRob3JpdHksIDApOworICAgICAgICAgICAgbVN5bmNRdWV1ZS5vbkJhY2tvZmZDaGFuZ2VkKG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5LCAwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzI4LDcgKzc0MCw3IEBACiAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCk7CiAKICAgICAgICAgZmluYWwgUGFpcjxMb25nLCBMb25nPiBwcmV2aW91c1NldHRpbmdzID0KLSAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0QmFja29mZihvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5KTsKICAgICAgICAgbG9uZyBuZXdEZWxheUluTXMgPSAtMTsKICAgICAgICAgaWYgKHByZXZpb3VzU2V0dGluZ3MgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gZG9uJ3QgaW5jcmVhc2UgYmFja29mZiBiZWZvcmUgY3VycmVudCBiYWNrb2ZmIGlzIGV4cGlyZWQuIFRoaXMgd2lsbCBoYXBwZW4gZm9yIG9wJ3MKQEAgLTc1OSwxNCArNzcxLDE0IEBACiAKICAgICAgICAgZmluYWwgbG9uZyBiYWNrb2ZmID0gbm93ICsgbmV3RGVsYXlJbk1zOwogCi0gICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5zZXRCYWNrb2ZmKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwKKyAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEJhY2tvZmYob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgYmFja29mZiwgbmV3RGVsYXlJbk1zKTsKIAogICAgICAgICBvcC5iYWNrb2ZmID0gYmFja29mZjsKICAgICAgICAgb3AudXBkYXRlRWZmZWN0aXZlUnVuVGltZSgpOwogCiAgICAgICAgIHN5bmNocm9uaXplZCAobVN5bmNRdWV1ZSkgewotICAgICAgICAgICAgbVN5bmNRdWV1ZS5vbkJhY2tvZmZDaGFuZ2VkKG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSwgYmFja29mZik7CisgICAgICAgICAgICBtU3luY1F1ZXVlLm9uQmFja29mZkNoYW5nZWQob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHksIGJhY2tvZmYpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NzksNyArNzkxLDggQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5ld0RlbGF5VW50aWxUaW1lID0gMDsKICAgICAgICAgfQotICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0RGVsYXlVbnRpbFRpbWUob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LCBuZXdEZWxheVVudGlsVGltZSk7CisgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZQorICAgICAgICAgICAgICAgIC5zZXREZWxheVVudGlsVGltZShvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLmF1dGhvcml0eSwgbmV3RGVsYXlVbnRpbFRpbWUpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKICAgICAgICAgICAgIG1TeW5jUXVldWUub25EZWxheVVudGlsVGltZUNoYW5nZWQob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LCBuZXdEZWxheVVudGlsVGltZSk7CiAgICAgICAgIH0KQEAgLTc5MCw4ICs4MDMsOCBAQAogICAgICAqIEBwYXJhbSBhY2NvdW50IGxpbWl0IHRoZSBjYW5jZWxhdGlvbnMgdG8gc3luY3Mgd2l0aCB0aGlzIGFjY291bnQsIGlmIG5vbi1udWxsCiAgICAgICogQHBhcmFtIGF1dGhvcml0eSBsaW1pdCB0aGUgY2FuY2VsYXRpb25zIHRvIHN5bmNzIHdpdGggdGhpcyBhdXRob3JpdHksIGlmIG5vbi1udWxsCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgY2FuY2VsQWN0aXZlU3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKLSAgICAgICAgc2VuZENhbmNlbFN5bmNzTWVzc2FnZShhY2NvdW50LCBhdXRob3JpdHkpOworICAgIHB1YmxpYyB2b2lkIGNhbmNlbEFjdGl2ZVN5bmMoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgIHNlbmRDYW5jZWxTeW5jc01lc3NhZ2UoYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODIzLDExICs4MzYsMTEgQEAKICAgICAgKiBAcGFyYW0gYWNjb3VudCBsaW1pdCB0aGUgcmVtb3ZhbHMgdG8gb3BlcmF0aW9ucyB3aXRoIHRoaXMgYWNjb3VudCwgaWYgbm9uLW51bGwKICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5IGxpbWl0IHRoZSByZW1vdmFscyB0byBvcGVyYXRpb25zIHdpdGggdGhpcyBhdXRob3JpdHksIGlmIG5vbi1udWxsCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgY2xlYXJTY2hlZHVsZWRTeW5jT3BlcmF0aW9ucyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICBwdWJsaWMgdm9pZCBjbGVhclNjaGVkdWxlZFN5bmNPcGVyYXRpb25zKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1TeW5jUXVldWUpIHsKLSAgICAgICAgICAgIG1TeW5jUXVldWUucmVtb3ZlKGFjY291bnQsIGF1dGhvcml0eSk7CisgICAgICAgICAgICBtU3luY1F1ZXVlLnJlbW92ZShhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSk7CiAgICAgICAgIH0KLSAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnNldEJhY2tvZmYoYWNjb3VudCwgYXV0aG9yaXR5LAorICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuc2V0QmFja29mZihhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwKICAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFLCBTeW5jU3RvcmFnZUVuZ2luZS5OT1RfSU5fQkFDS09GRl9NT0RFKTsKICAgICB9CiAKQEAgLTg3NSw3ICs4ODgsOCBAQAogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInJldHJ5aW5nIHN5bmMgb3BlcmF0aW9uIHRoYXQgZmFpbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGFscmVhZHkgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJzeW5jIGluIHByb2dyZXNzOiAiICsgb3BlcmF0aW9uKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihuZXcgU3luY09wZXJhdGlvbihvcGVyYXRpb24uYWNjb3VudCwgb3BlcmF0aW9uLnN5bmNTb3VyY2UsCisgICAgICAgICAgICBzY2hlZHVsZVN5bmNPcGVyYXRpb24obmV3IFN5bmNPcGVyYXRpb24ob3BlcmF0aW9uLmFjY291bnQsIG9wZXJhdGlvbi51c2VySWQsCisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5zeW5jU291cmNlLAogICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYXV0aG9yaXR5LCBvcGVyYXRpb24uZXh0cmFzLAogICAgICAgICAgICAgICAgICAgICBERUxBWV9SRVRSWV9TWU5DX0lOX1BST0dSRVNTX0lOX1NFQ09ORFMgKiAxMDAwLAogICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYmFja29mZiwgb3BlcmF0aW9uLmRlbGF5VW50aWwsIG9wZXJhdGlvbi5hbGxvd1BhcmFsbGVsU3luY3MpKTsKQEAgLTk3OSw3ICs5OTMsOCBAQAogICAgICAgICAgICAgbUJvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYmluZFJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5CSU5EX0FVVE9fQ1JFQVRFIHwgQ29udGV4dC5CSU5EX05PVF9GT1JFR1JPVU5ECi0gICAgICAgICAgICAgICAgICAgIHwgQ29udGV4dC5CSU5EX0FMTE9XX09PTV9NQU5BR0VNRU5UKTsKKyAgICAgICAgICAgICAgICAgICAgfCBDb250ZXh0LkJJTkRfQUxMT1dfT09NX01BTkFHRU1FTlQsCisgICAgICAgICAgICAgICAgICAgIG1TeW5jT3BlcmF0aW9uLnVzZXJJZCk7CiAgICAgICAgICAgICBpZiAoIWJpbmRSZXN1bHQpIHsKICAgICAgICAgICAgICAgICBtQm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTEwMzQsMTAgKzEwNDksMTkgQEAKIAogICAgIHByb3RlY3RlZCB2b2lkIGR1bXBTeW5jU3RhdGUoUHJpbnRXcml0ZXIgcHcpIHsKICAgICAgICAgcHcucHJpbnQoImRhdGEgY29ubmVjdGVkOiAiKTsgcHcucHJpbnRsbihtRGF0YUNvbm5lY3Rpb25Jc0Nvbm5lY3RlZCk7Ci0gICAgICAgIHB3LnByaW50KCJhdXRvIHN5bmM6ICIpOyBwdy5wcmludGxuKG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSgpKTsKKyAgICAgICAgcHcucHJpbnQoImF1dG8gc3luYzogIik7CisgICAgICAgIExpc3Q8VXNlckluZm8+IHVzZXJzID0gZ2V0QWxsVXNlcnMoKTsKKyAgICAgICAgaWYgKHVzZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoVXNlckluZm8gdXNlciA6IHVzZXJzKSB7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoInUiICsgdXNlci5pZCArICI9IgorICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkodXNlci5pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHcucHJpbnRsbigpOworICAgICAgICB9CiAgICAgICAgIHB3LnByaW50KCJtZW1vcnkgbG93OiAiKTsgcHcucHJpbnRsbihtU3RvcmFnZUlzTG93KTsKIAotICAgICAgICBmaW5hbCBBY2NvdW50W10gYWNjb3VudHMgPSBtQWNjb3VudHM7CisgICAgICAgIGZpbmFsIEFjY291bnRBbmRVc2VyW10gYWNjb3VudHMgPSBtQWNjb3VudHM7CisKICAgICAgICAgcHcucHJpbnQoImFjY291bnRzOiAiKTsKICAgICAgICAgaWYgKGFjY291bnRzICE9IElOSVRJQUxfQUNDT1VOVFNfQVJSQVkpIHsKICAgICAgICAgICAgIHB3LnByaW50bG4oYWNjb3VudHMubGVuZ3RoKTsKQEAgLTEwOTAsMTggKzExMTQsMjAgQEAKICAgICAgICAgLy8gam9pbiB0aGUgaW5zdGFsbGVkIHN5bmMgYWRhcHRlciB3aXRoIHRoZSBhY2NvdW50cyBsaXN0IGFuZCBlbWl0IGZvciBldmVyeXRoaW5nCiAgICAgICAgIHB3LnByaW50bG4oKTsKICAgICAgICAgcHcucHJpbnRsbigiU3luYyBTdGF0dXMiKTsKLSAgICAgICAgZm9yIChBY2NvdW50IGFjY291bnQgOiBhY2NvdW50cykgewotICAgICAgICAgICAgcHcucHJpbnQoIiAgQWNjb3VudCAiKTsgcHcucHJpbnQoYWNjb3VudC5uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAiKTsgcHcucHJpbnQoYWNjb3VudC50eXBlKTsKKyAgICAgICAgZm9yIChBY2NvdW50QW5kVXNlciBhY2NvdW50IDogYWNjb3VudHMpIHsKKyAgICAgICAgICAgIHB3LnByaW50KCIgIEFjY291bnQgIik7IHB3LnByaW50KGFjY291bnQuYWNjb3VudC5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB1Iik7IHB3LnByaW50KGFjY291bnQudXNlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiAiKTsgcHcucHJpbnQoYWNjb3VudC5hY2NvdW50LnR5cGUpOwogICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKCI6Iik7CiAgICAgICAgICAgICBmb3IgKFJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlLlNlcnZpY2VJbmZvPFN5bmNBZGFwdGVyVHlwZT4gc3luY0FkYXB0ZXJUeXBlIDoKICAgICAgICAgICAgICAgICAgICAgbVN5bmNBZGFwdGVycy5nZXRBbGxTZXJ2aWNlcygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzeW5jQWRhcHRlclR5cGUudHlwZS5hY2NvdW50VHlwZS5lcXVhbHMoYWNjb3VudC50eXBlKSkgeworICAgICAgICAgICAgICAgIGlmICghc3luY0FkYXB0ZXJUeXBlLnR5cGUuYWNjb3VudFR5cGUuZXF1YWxzKGFjY291bnQuYWNjb3VudC50eXBlKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5BdXRob3JpdHlJbmZvIHNldHRpbmdzID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldE9yQ3JlYXRlQXV0aG9yaXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgc3luY0FkYXB0ZXJUeXBlLnR5cGUuYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5BdXRob3JpdHlJbmZvIHNldHRpbmdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRPckNyZWF0ZUF1dGhvcml0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudC5hY2NvdW50LCBhY2NvdW50LnVzZXJJZCwgc3luY0FkYXB0ZXJUeXBlLnR5cGUuYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICBTeW5jU3RhdHVzSW5mbyBzdGF0dXMgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0T3JDcmVhdGVTeW5jU3RhdHVzKHNldHRpbmdzKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiICAgICIpOyBwdy5wcmludChzZXR0aW5ncy5hdXRob3JpdHkpOwogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oIjoiKTsKQEAgLTE1NTQsNyArMTU4MCwxNiBAQAogICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENvdW50RG93bkxhdGNoIG1SZWFkeVRvUnVuTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQm9vdENvbXBsZXRlZCgpIHsKICAgICAgICAgICAgIG1Cb290Q29tcGxldGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5kb0RhdGFiYXNlQ2xlYW51cChBY2NvdW50TWFuYWdlci5nZXQobUNvbnRleHQpLmdldEFjY291bnRzKCkpOworICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGJvb3Rjb21wbGV0ZWQgZXZlbnQgZm9yIHNwZWNpZmljIHVzZXIuIE5vdyBsZXQncyBqdXN0IGl0ZXJhdGUgdGhyb3VnaAorICAgICAgICAgICAgLy8gYWxsIHRoZSB1c2Vycy4KKyAgICAgICAgICAgIExpc3Q8VXNlckluZm8+IHVzZXJzID0gZ2V0QWxsVXNlcnMoKTsKKyAgICAgICAgICAgIGlmICh1c2VycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChVc2VySW5mbyB1c2VyIDogdXNlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmRvRGF0YWJhc2VDbGVhbnVwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY291bnRNYW5hZ2VyU2VydmljZS5nZXRTaW5nbGV0b24oKS5nZXRBY2NvdW50cyh1c2VyLmlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobVJlYWR5VG9SdW5MYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbVJlYWR5VG9SdW5MYXRjaC5jb3VudERvd24oKTsKICAgICAgICAgICAgIH0KQEAgLTE2MzUsNyArMTY3MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaGFuZGxlU3luY0hhbmRsZXJNZXNzYWdlOiBNRVNTQUdFX1NFUlZJQ0VfQ0FOQ0VMOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBheWxvYWQuZmlyc3QgKyAiLCAiICsgcGF5bG9hZC5zZWNvbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQWN0aXZlU3luY0xvY2tlZChwYXlsb2FkLmZpcnN0LCBwYXlsb2FkLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxBY3RpdmVTeW5jTG9ja2VkKHBheWxvYWQuZmlyc3QsIG1zZy5hcmcxLCBwYXlsb2FkLnNlY29uZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UGVuZGluZ1N5bmNUaW1lID0gbWF5YmVTdGFydE5leHRTeW5jTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTc0MCwyMiArMTc3NSwyOCBAQAogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCA9CiAgICAgICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpdml0eU1hbmFnZXIoKS5nZXRCYWNrZ3JvdW5kRGF0YVNldHRpbmcoKTsKICAgICAgICAgICAgIGxvbmcgZWFybGllc3RGdXR1cmVQb2xsVGltZSA9IExvbmcuTUFYX1ZBTFVFOwotICAgICAgICAgICAgaWYgKCFiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZCB8fCAhbVN5bmNTdG9yYWdlRW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KCkpIHsKKyAgICAgICAgICAgIGlmICghYmFja2dyb3VuZERhdGFVc2FnZUFsbG93ZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZWFybGllc3RGdXR1cmVQb2xsVGltZTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQWNjb3VudEFuZFVzZXJbXSBhY2NvdW50cyA9IG1BY2NvdW50czsKKwogICAgICAgICAgICAgZmluYWwgbG9uZyBub3dBYnNvbHV0ZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgQXJyYXlMaXN0PFN5bmNTdG9yYWdlRW5naW5lLkF1dGhvcml0eUluZm8+IGluZm9zID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEF1dGhvcml0aWVzKCk7CiAgICAgICAgICAgICBmb3IgKFN5bmNTdG9yYWdlRW5naW5lLkF1dGhvcml0eUluZm8gaW5mbyA6IGluZm9zKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGUgc3luYyBpZiB0aGUgYWNjb3VudCBvZiB0aGlzIG9wZXJhdGlvbiBubyBsb25nZXIgZXhpc3RzCi0gICAgICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKG1BY2NvdW50cywgaW5mby5hY2NvdW50KSkgeworICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNBY2NvdW50QW5kVXNlcihhY2NvdW50cywgaW5mby5hY2NvdW50LCBpbmZvLnVzZXJJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKCFtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoaW5mby5hY2NvdW50LCBpbmZvLmF1dGhvcml0eSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1TeW5jU3RvcmFnZUVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShpbmZvLnVzZXJJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoaW5mby5hY2NvdW50LCBpbmZvLnVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5hdXRob3JpdHkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShpbmZvLmFjY291bnQsIGluZm8uYXV0aG9yaXR5KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKGluZm8uYWNjb3VudCwgaW5mby51c2VySWQsIGluZm8uYXV0aG9yaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTE3NzIsOCArMTgxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsYXN0UG9sbFRpbWVBYnNvbHV0ZSArIHBlcmlvZEluU2Vjb25kcyAqIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIHJlYWR5IHRvIHJ1biB0aGVuIHNjaGVkdWxlIGl0IGFuZCBtYXJrIGl0IGFzIGhhdmluZyBiZWVuIHNjaGVkdWxlZAogICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFBvbGxUaW1lQWJzb2x1dGUgPD0gbm93QWJzb2x1dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRCYWNrb2ZmKGluZm8uYWNjb3VudCwgaW5mby5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFpcjxMb25nLCBMb25nPiBiYWNrb2ZmID0gbVN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYWNjb3VudCwgaW5mby51c2VySWQsIGluZm8uYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlZ2lzdGVyZWRTZXJ2aWNlc0NhY2hlLlNlcnZpY2VJbmZvPFN5bmNBZGFwdGVyVHlwZT4gc3luY0FkYXB0ZXJJbmZvID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNBZGFwdGVycy5nZXRTZXJ2aWNlSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jQWRhcHRlclR5cGUubmV3S2V5KGluZm8uYXV0aG9yaXR5LCBpbmZvLmFjY291bnQudHlwZSkpOwpAQCAtMTc4MSwxMSArMTgyMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3luY09wZXJhdGlvbihpbmZvLmFjY291bnQsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9QRVJJT0RJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN5bmNPcGVyYXRpb24oaW5mby5hY2NvdW50LCBpbmZvLnVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5TT1VSQ0VfUEVSSU9ESUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5hdXRob3JpdHksIGV4dHJhcywgMCAvKiBkZWxheSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmICE9IG51bGwgPyBiYWNrb2ZmLmZpcnN0IDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLmFjY291bnQsIGluZm8uYXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uYWNjb3VudCwgaW5mby51c2VySWQsIGluZm8uYXV0aG9yaXR5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jQWRhcHRlckluZm8udHlwZS5hbGxvd1BhcmFsbGVsU3luY3MoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLnNldFBlcmlvZGljU3luY1RpbWUoaSwgbm93QWJzb2x1dGUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTgzMCw3ICsxODcyLDcgQEAKIAogICAgICAgICAgICAgLy8gSWYgdGhlIGFjY291bnRzIGFyZW4ndCBrbm93biB5ZXQgdGhlbiB3ZSBhcmVuJ3QgcmVhZHkgdG8gcnVuLiBXZSB3aWxsIGJlIGtpY2tlZAogICAgICAgICAgICAgLy8gd2hlbiB0aGUgYWNjb3VudCBsb29rdXAgcmVxdWVzdCBkb2VzIGNvbXBsZXRlLgotICAgICAgICAgICAgQWNjb3VudFtdIGFjY291bnRzID0gbUFjY291bnRzOworICAgICAgICAgICAgQWNjb3VudEFuZFVzZXJbXSBhY2NvdW50cyA9IG1BY2NvdW50czsKICAgICAgICAgICAgIGlmIChhY2NvdW50cyA9PSBJTklUSUFMX0FDQ09VTlRTX0FSUkFZKSB7CiAgICAgICAgICAgICAgICAgaWYgKGlzTG9nZ2FibGUpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAibWF5YmVTdGFydE5leHRTeW5jOiBhY2NvdW50cyBub3Qga25vd24sIHNraXBwaW5nIik7CkBAIC0xODQzLDcgKzE4ODUsNiBAQAogICAgICAgICAgICAgLy8gc3RhcnQgaXQsIG90aGVyd2lzZSBqdXN0IGdldCBvdXQuCiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJhY2tncm91bmREYXRhVXNhZ2VBbGxvd2VkID0KICAgICAgICAgICAgICAgICAgICAgZ2V0Q29ubmVjdGl2aXR5TWFuYWdlcigpLmdldEJhY2tncm91bmREYXRhU2V0dGluZygpOwotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtYXN0ZXJTeW5jQXV0b21hdGljYWxseSA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSgpOwogCiAgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOwogCkBAIC0xODYzLDE0ICsxOTA0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN5bmNPcGVyYXRpb24gb3AgPSBvcGVyYXRpb25JdGVyYXRvci5uZXh0KCk7CiAKICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcCB0aGUgc3luYyBpZiB0aGUgYWNjb3VudCBvZiB0aGlzIG9wZXJhdGlvbiBubyBsb25nZXIgZXhpc3RzCi0gICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlVdGlscy5jb250YWlucyhtQWNjb3VudHMsIG9wLmFjY291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNBY2NvdW50QW5kVXNlcihhY2NvdW50cywgb3AuYWNjb3VudCwgb3AudXNlcklkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSXRlcmF0b3IucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZGVsZXRlRnJvbVBlbmRpbmcob3AucGVuZGluZ09wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgdGhpcyBzeW5jIHJlcXVlc3QgaWYgaXQgaXNuJ3Qgc3luY2FibGUKLSAgICAgICAgICAgICAgICAgICAgaW50IHN5bmNhYmxlU3RhdGUgPSBtU3luY1N0b3JhZ2VFbmdpbmUuZ2V0SXNTeW5jYWJsZShvcC5hY2NvdW50LCBvcC5hdXRob3JpdHkpOworICAgICAgICAgICAgICAgICAgICBpbnQgc3luY2FibGVTdGF0ZSA9IG1TeW5jU3RvcmFnZUVuZ2luZS5nZXRJc1N5bmNhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN5bmNhYmxlU3RhdGUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uSXRlcmF0b3IucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUuZGVsZXRlRnJvbVBlbmRpbmcob3AucGVuZGluZ09wZXJhdGlvbik7CkBAIC0xOTA1LDExICsxOTQ3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGRpc2Nvbm5lY3RlZCBmb3IgdGhlIHRhcmdldCBVSUQuCiAgICAgICAgICAgICAgICAgICAgIGlmICghb3AuZXh0cmFzLmdldEJvb2xlYW4oQ29udGVudFJlc29sdmVyLlNZTkNfRVhUUkFTX0lHTk9SRV9TRVRUSU5HUywgZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN5bmNhYmxlU3RhdGUgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghbWFzdGVyU3luY0F1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIW1TeW5jU3RvcmFnZUVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShvcC51c2VySWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFiYWNrZ3JvdW5kRGF0YVVzYWdlQWxsb3dlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhdWlkTmV0d29ya0Nvbm5lY3RlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbVN5bmNTdG9yYWdlRW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbkl0ZXJhdG9yLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLmRlbGV0ZUZyb21QZW5kaW5nKG9wLnBlbmRpbmdPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xOTQ2LDYgKzE5ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVPcC5hY2NvdW50LnR5cGUuZXF1YWxzKGNhbmRpZGF0ZS5hY2NvdW50LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aXZlT3AuYXV0aG9yaXR5LmVxdWFscyhjYW5kaWRhdGUuYXV0aG9yaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFjdGl2ZU9wLnVzZXJJZCA9PSBjYW5kaWRhdGUudXNlcklkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFhY3RpdmVPcC5hbGxvd1BhcmFsbGVsU3luY3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYWN0aXZlT3AuYWNjb3VudC5uYW1lLmVxdWFscyhjYW5kaWRhdGUuYWNjb3VudC5uYW1lKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0ID0gYWN0aXZlU3luY0NvbnRleHQ7CkBAIC0yMDMzLDcgKzIwNzYsNyBAQAogICAgICAgICAgICAgaWYgKHN5bmNBZGFwdGVySW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiY2FuJ3QgZmluZCBhIHN5bmMgYWRhcHRlciBmb3IgIiArIHN5bmNBZGFwdGVyVHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByZW1vdmluZyBzZXR0aW5ncyBmb3IgaXQiKTsKLSAgICAgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUucmVtb3ZlQXV0aG9yaXR5KG9wLmFjY291bnQsIG9wLmF1dGhvcml0eSk7CisgICAgICAgICAgICAgICAgbVN5bmNTdG9yYWdlRW5naW5lLnJlbW92ZUF1dGhvcml0eShvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLmF1dGhvcml0eSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCkBAIC0yMDc0LDcgKzIxMTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFjdGl2ZVN5bmNMb2NrZWQoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgICAgIHByaXZhdGUgdm9pZCBjYW5jZWxBY3RpdmVTeW5jTG9ja2VkKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICAgICAgQXJyYXlMaXN0PEFjdGl2ZVN5bmNDb250ZXh0PiBhY3RpdmVTeW5jcyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8QWN0aXZlU3luY0NvbnRleHQ+KG1BY3RpdmVTeW5jQ29udGV4dHMpOwogICAgICAgICAgICAgZm9yIChBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCA6IGFjdGl2ZVN5bmNzKSB7CkBAIC0yMDgyLDE1ICsyMTI1LDIwIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIGF1dGhvcml0eSB3YXMgc3BlY2lmaWVkIHRoZW4gb25seSBjYW5jZWwgdGhlIHN5bmMgaWYgaXQgbWF0Y2hlcwogICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFjY291bnQuZXF1YWxzKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLmFjY291bnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGFuIGFjY291bnQgd2FzIHNwZWNpZmllZCB0aGVuIG9ubHkgY2FuY2VsIHRoZSBzeW5jIGlmIGl0IG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF1dGhvcml0eS5lcXVhbHMoYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYXV0aG9yaXR5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdXNlcmlkIG1hdGNoZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJJZCAhPSBVc2VySWQuVVNFUl9BTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1c2VySWQgIT0gYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24udXNlcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBydW5TeW5jRmluaXNoZWRPckNhbmNlbGVkTG9ja2VkKG51bGwgLyogbm8gcmVzdWx0IHNpbmNlIHRoaXMgaXMgYSBjYW5jZWwgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIxNjksNyArMjIxNyw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzeW5jUmVzdWx0ICE9IG51bGwgJiYgc3luY1Jlc3VsdC5mdWxsU3luY1JlcXVlc3RlZCkgewotICAgICAgICAgICAgICAgIHNjaGVkdWxlU3luY09wZXJhdGlvbihuZXcgU3luY09wZXJhdGlvbihzeW5jT3BlcmF0aW9uLmFjY291bnQsCisgICAgICAgICAgICAgICAgc2NoZWR1bGVTeW5jT3BlcmF0aW9uKG5ldyBTeW5jT3BlcmF0aW9uKHN5bmNPcGVyYXRpb24uYWNjb3VudCwgc3luY09wZXJhdGlvbi51c2VySWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLnN5bmNTb3VyY2UsIHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LCBuZXcgQnVuZGxlKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmJhY2tvZmYsIHN5bmNPcGVyYXRpb24uZGVsYXlVbnRpbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYWxsb3dQYXJhbGxlbFN5bmNzKSk7CkBAIC0yMTgwLDcgKzIyMjgsOCBAQAogICAgICAgICBwcml2YXRlIHZvaWQgY2xvc2VBY3RpdmVTeW5jQ29udGV4dChBY3RpdmVTeW5jQ29udGV4dCBhY3RpdmVTeW5jQ29udGV4dCkgewogICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQuY2xvc2UoKTsKICAgICAgICAgICAgIG1BY3RpdmVTeW5jQ29udGV4dHMucmVtb3ZlKGFjdGl2ZVN5bmNDb250ZXh0KTsKLSAgICAgICAgICAgIG1TeW5jU3RvcmFnZUVuZ2luZS5yZW1vdmVBY3RpdmVTeW5jKGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jSW5mbyk7CisgICAgICAgICAgICBtU3luY1N0b3JhZ2VFbmdpbmUucmVtb3ZlQWN0aXZlU3luYyhhY3RpdmVTeW5jQ29udGV4dC5tU3luY0luZm8sCisgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN5bmNDb250ZXh0Lm1TeW5jT3BlcmF0aW9uLnVzZXJJZCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTI0NDYsNyArMjQ5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYWNjb3VudC5uYW1lLmhhc2hDb2RlKCkpOwogCiAgICAgICAgICAgICByZXR1cm4gbVN5bmNTdG9yYWdlRW5naW5lLmluc2VydFN0YXJ0U3luY0V2ZW50KAotICAgICAgICAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmFjY291bnQsIHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LCBub3csIHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24uYWNjb3VudCwgc3luY09wZXJhdGlvbi51c2VySWQsIHN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICBub3csIHNvdXJjZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzdG9wU3luY0V2ZW50KGxvbmcgcm93SWQsIFN5bmNPcGVyYXRpb24gc3luY09wZXJhdGlvbiwgU3RyaW5nIHJlc3VsdE1lc3NhZ2UsCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb24uamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhCmluZGV4IDk0YzIyNDcuLjRlODZlZjggMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvbi5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTeW5jT3BlcmF0aW9uIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CiAgICAgcHVibGljIGZpbmFsIEFjY291bnQgYWNjb3VudDsKKyAgICBwdWJsaWMgZmluYWwgaW50IHVzZXJJZDsKICAgICBwdWJsaWMgaW50IHN5bmNTb3VyY2U7CiAgICAgcHVibGljIFN0cmluZyBhdXRob3JpdHk7CiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gYWxsb3dQYXJhbGxlbFN5bmNzOwpAQCAtMzgsOSArMzksMTAgQEAKICAgICBwdWJsaWMgbG9uZyBkZWxheVVudGlsOwogICAgIHB1YmxpYyBsb25nIGVmZmVjdGl2ZVJ1blRpbWU7CiAKLSAgICBwdWJsaWMgU3luY09wZXJhdGlvbihBY2NvdW50IGFjY291bnQsIGludCBzb3VyY2UsIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMsCisgICAgcHVibGljIFN5bmNPcGVyYXRpb24oQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBpbnQgc291cmNlLCBTdHJpbmcgYXV0aG9yaXR5LCBCdW5kbGUgZXh0cmFzLAogICAgICAgICAgICAgbG9uZyBkZWxheUluTXMsIGxvbmcgYmFja29mZiwgbG9uZyBkZWxheVVudGlsLCBib29sZWFuIGFsbG93UGFyYWxsZWxTeW5jcykgewogICAgICAgICB0aGlzLmFjY291bnQgPSBhY2NvdW50OworICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKICAgICAgICAgdGhpcy5zeW5jU291cmNlID0gc291cmNlOwogICAgICAgICB0aGlzLmF1dGhvcml0eSA9IGF1dGhvcml0eTsKICAgICAgICAgdGhpcy5hbGxvd1BhcmFsbGVsU3luY3MgPSBhbGxvd1BhcmFsbGVsU3luY3M7CkBAIC03NSw2ICs3Nyw3IEBACiAKICAgICBTeW5jT3BlcmF0aW9uKFN5bmNPcGVyYXRpb24gb3RoZXIpIHsKICAgICAgICAgdGhpcy5hY2NvdW50ID0gb3RoZXIuYWNjb3VudDsKKyAgICAgICAgdGhpcy51c2VySWQgPSBvdGhlci51c2VySWQ7CiAgICAgICAgIHRoaXMuc3luY1NvdXJjZSA9IG90aGVyLnN5bmNTb3VyY2U7CiAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gb3RoZXIuYXV0aG9yaXR5OwogICAgICAgICB0aGlzLmV4dHJhcyA9IG5ldyBCdW5kbGUob3RoZXIuZXh0cmFzKTsKQEAgLTEyMCw3ICsxMjMsOCBAQAogICAgIHByaXZhdGUgU3RyaW5nIHRvS2V5KCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgc2IuYXBwZW5kKCJhdXRob3JpdHk6ICIpLmFwcGVuZChhdXRob3JpdHkpOwotICAgICAgICBzYi5hcHBlbmQoIiBhY2NvdW50IHtuYW1lPSIgKyBhY2NvdW50Lm5hbWUgKyAiLCB0eXBlPSIgKyBhY2NvdW50LnR5cGUgKyAifSIpOworICAgICAgICBzYi5hcHBlbmQoIiBhY2NvdW50IHtuYW1lPSIgKyBhY2NvdW50Lm5hbWUgKyAiLCB1c2VyPSIgKyB1c2VySWQgKyAiLCB0eXBlPSIgKyBhY2NvdW50LnR5cGUKKyAgICAgICAgICAgICAgICArICJ9Iik7CiAgICAgICAgIHNiLmFwcGVuZCgiIGV4dHJhczogIik7CiAgICAgICAgIGV4dHJhc1RvU3RyaW5nQnVpbGRlcihleHRyYXMsIHNiKTsKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jUXVldWUuamF2YQppbmRleCBiZmRmNGExLi4wNmRhNmZhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNRdWV1ZS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1F1ZXVlLmphdmEKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICAgICAgZmluYWwgaW50IE4gPSBvcHMuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZS5QZW5kaW5nT3BlcmF0aW9uIG9wID0gb3BzLmdldChpKTsKLSAgICAgICAgICAgIGZpbmFsIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9IHN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KTsKKyAgICAgICAgICAgIGZpbmFsIFBhaXI8TG9uZywgTG9uZz4gYmFja29mZiA9CisgICAgICAgICAgICAgICAgICAgIHN5bmNTdG9yYWdlRW5naW5lLmdldEJhY2tvZmYob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHkpOwogICAgICAgICAgICAgZmluYWwgUmVnaXN0ZXJlZFNlcnZpY2VzQ2FjaGUuU2VydmljZUluZm88U3luY0FkYXB0ZXJUeXBlPiBzeW5jQWRhcHRlckluZm8gPQogICAgICAgICAgICAgICAgICAgICBzeW5jQWRhcHRlcnMuZ2V0U2VydmljZUluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY0FkYXB0ZXJUeXBlLm5ld0tleShvcC5hdXRob3JpdHksIG9wLmFjY291bnQudHlwZSkpOwpAQCAtNTcsOSArNTgsOSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3luY09wZXJhdGlvbiBzeW5jT3BlcmF0aW9uID0gbmV3IFN5bmNPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgIG9wLmFjY291bnQsIG9wLnN5bmNTb3VyY2UsIG9wLmF1dGhvcml0eSwgb3AuZXh0cmFzLCAwIC8qIGRlbGF5ICovLAorICAgICAgICAgICAgICAgICAgICBvcC5hY2NvdW50LCBvcC51c2VySWQsIG9wLnN5bmNTb3VyY2UsIG9wLmF1dGhvcml0eSwgb3AuZXh0cmFzLCAwIC8qIGRlbGF5ICovLAogICAgICAgICAgICAgICAgICAgICBiYWNrb2ZmICE9IG51bGwgPyBiYWNrb2ZmLmZpcnN0IDogMCwKLSAgICAgICAgICAgICAgICAgICAgc3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgc3luY1N0b3JhZ2VFbmdpbmUuZ2V0RGVsYXlVbnRpbFRpbWUob3AuYWNjb3VudCwgb3AudXNlcklkLCBvcC5hdXRob3JpdHkpLAogICAgICAgICAgICAgICAgICAgICBzeW5jQWRhcHRlckluZm8udHlwZS5hbGxvd1BhcmFsbGVsU3luY3MoKSk7CiAgICAgICAgICAgICBzeW5jT3BlcmF0aW9uLmV4cGVkaXRlZCA9IG9wLmV4cGVkaXRlZDsKICAgICAgICAgICAgIHN5bmNPcGVyYXRpb24ucGVuZGluZ09wZXJhdGlvbiA9IG9wOwpAQCAtMTAyLDggKzEwMyw4IEBACiAgICAgICAgIG9wZXJhdGlvbi5wZW5kaW5nT3BlcmF0aW9uID0gcG9wOwogICAgICAgICBpZiAob3BlcmF0aW9uLnBlbmRpbmdPcGVyYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgcG9wID0gbmV3IFN5bmNTdG9yYWdlRW5naW5lLlBlbmRpbmdPcGVyYXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmFjY291bnQsIG9wZXJhdGlvbi5zeW5jU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hdXRob3JpdHksIG9wZXJhdGlvbi5leHRyYXMsIG9wZXJhdGlvbi5leHBlZGl0ZWQpOworICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uYWNjb3VudCwgb3BlcmF0aW9uLnVzZXJJZCwgb3BlcmF0aW9uLnN5bmNTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5hdXRob3JpdHksIG9wZXJhdGlvbi5leHRyYXMsIG9wZXJhdGlvbi5leHBlZGl0ZWQpOwogICAgICAgICAgICAgcG9wID0gbVN5bmNTdG9yYWdlRW5naW5lLmluc2VydEludG9QZW5kaW5nKHBvcCk7CiAgICAgICAgICAgICBpZiAocG9wID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJlcnJvciBhZGRpbmcgcGVuZGluZyBzeW5jIG9wZXJhdGlvbiAiCkBAIC0xMzEsMTEgKzEzMiwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25CYWNrb2ZmQ2hhbmdlZChBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIGxvbmcgYmFja29mZikgeworICAgIHB1YmxpYyB2b2lkIG9uQmFja29mZkNoYW5nZWQoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBsb25nIGJhY2tvZmYpIHsKICAgICAgICAgLy8gZm9yIGVhY2ggb3AgdGhhdCBtYXRjaGVzIHRoZSBhY2NvdW50IGFuZCBwcm92aWRlciB1cGRhdGUgaXRzCiAgICAgICAgIC8vIGJhY2tvZmYgYW5kIGVmZmVjdGl2ZVN0YXJ0VGltZQogICAgICAgICBmb3IgKFN5bmNPcGVyYXRpb24gb3AgOiBtT3BlcmF0aW9uc01hcC52YWx1ZXMoKSkgewotICAgICAgICAgICAgaWYgKG9wLmFjY291bnQuZXF1YWxzKGFjY291bnQpICYmIG9wLmF1dGhvcml0eS5lcXVhbHMocHJvdmlkZXJOYW1lKSkgeworICAgICAgICAgICAgaWYgKG9wLmFjY291bnQuZXF1YWxzKGFjY291bnQpICYmIG9wLmF1dGhvcml0eS5lcXVhbHMocHJvdmlkZXJOYW1lKQorICAgICAgICAgICAgICAgICAgICAmJiBvcC51c2VySWQgPT0gdXNlcklkKSB7CiAgICAgICAgICAgICAgICAgb3AuYmFja29mZiA9IGJhY2tvZmY7CiAgICAgICAgICAgICAgICAgb3AudXBkYXRlRWZmZWN0aXZlUnVuVGltZSgpOwogICAgICAgICAgICAgfQpAQCAtMTUzLDcgKzE1NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgcHVibGljIHZvaWQgcmVtb3ZlKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBTeW5jT3BlcmF0aW9uPj4gZW50cmllcyA9IG1PcGVyYXRpb25zTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBTeW5jT3BlcmF0aW9uPiBlbnRyeSA9IGVudHJpZXMubmV4dCgpOwpAQCAtMTY0LDYgKzE2Niw5IEBACiAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwgJiYgIXN5bmNPcGVyYXRpb24uYXV0aG9yaXR5LmVxdWFscyhhdXRob3JpdHkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXNlcklkICE9IHN5bmNPcGVyYXRpb24udXNlcklkKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbnRyaWVzLnJlbW92ZSgpOwogICAgICAgICAgICAgaWYgKCFtU3luY1N0b3JhZ2VFbmdpbmUuZGVsZXRlRnJvbVBlbmRpbmcoc3luY09wZXJhdGlvbi5wZW5kaW5nT3BlcmF0aW9uKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAidW5hYmxlIHRvIGZpbmQgcGVuZGluZyByb3cgZm9yICIgKyBzeW5jT3BlcmF0aW9uOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZS5qYXZhCmluZGV4IGExZTE3NGIuLjdiYjk4NjYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmUuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxTZXJpYWxpemVyOwogCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5TeW5jTWFuYWdlci5BY2NvdW50QW5kVXNlcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVEYXRhYmFzZTsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVFeGNlcHRpb247CkBAIC01OCw5ICs1OSwxNiBAQAogICogQGhpZGUKICAqLwogcHVibGljIGNsYXNzIFN5bmNTdG9yYWdlRW5naW5lIGV4dGVuZHMgSGFuZGxlciB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5bmNNYW5hZ2VyIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0ZJTEUgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUl9ORVhUX0FVVEhPUklUWV9JRCA9ICJuZXh0QXV0aG9yaXR5SWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUl9MSVNURU5fRk9SX1RJQ0tMRVMgPSAibGlzdGVuLWZvci10aWNrbGVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVFJfRU5BQkxFRCA9ICJlbmFibGVkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVFJfVVNFUiA9ICJ1c2VyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19MSVNURU5fRk9SX1RJQ0tMRVMgPSAibGlzdGVuRm9yVGlja2xlcyI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfUE9MTF9GUkVRVUVOQ1lfU0VDT05EUyA9IDYwICogNjAgKiAyNDsgLy8gT25lIGRheQogCiAgICAgLy8gQFZpc2libGVGb3JUZXN0aW5nCkBAIC0xMzMsNiArMTQxLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVuZGluZ09wZXJhdGlvbiB7CiAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudDsKKyAgICAgICAgZmluYWwgaW50IHVzZXJJZDsKICAgICAgICAgZmluYWwgaW50IHN5bmNTb3VyY2U7CiAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHk7CiAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXM7ICAgICAgICAvLyBub3RlOiByZWFkLW9ubHkuCkBAIC0xNDEsOSArMTUwLDEwIEBACiAgICAgICAgIGludCBhdXRob3JpdHlJZDsKICAgICAgICAgYnl0ZVtdIGZsYXRFeHRyYXM7CiAKLSAgICAgICAgUGVuZGluZ09wZXJhdGlvbihBY2NvdW50IGFjY291bnQsIGludCBzb3VyY2UsCisgICAgICAgIFBlbmRpbmdPcGVyYXRpb24oQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBpbnQgc291cmNlLAogICAgICAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHksIEJ1bmRsZSBleHRyYXMsIGJvb2xlYW4gZXhwZWRpdGVkKSB7CiAgICAgICAgICAgICB0aGlzLmFjY291bnQgPSBhY2NvdW50OworICAgICAgICAgICAgdGhpcy51c2VySWQgPSB1c2VySWQ7CiAgICAgICAgICAgICB0aGlzLnN5bmNTb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgICB0aGlzLmF1dGhvcml0eSA9IGF1dGhvcml0eTsKICAgICAgICAgICAgIHRoaXMuZXh0cmFzID0gZXh0cmFzICE9IG51bGwgPyBuZXcgQnVuZGxlKGV4dHJhcykgOiBleHRyYXM7CkBAIC0xNTMsNiArMTYzLDcgQEAKIAogICAgICAgICBQZW5kaW5nT3BlcmF0aW9uKFBlbmRpbmdPcGVyYXRpb24gb3RoZXIpIHsKICAgICAgICAgICAgIHRoaXMuYWNjb3VudCA9IG90aGVyLmFjY291bnQ7CisgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IG90aGVyLnVzZXJJZDsKICAgICAgICAgICAgIHRoaXMuc3luY1NvdXJjZSA9IG90aGVyLnN5bmNTb3VyY2U7CiAgICAgICAgICAgICB0aGlzLmF1dGhvcml0eSA9IG90aGVyLmF1dGhvcml0eTsKICAgICAgICAgICAgIHRoaXMuZXh0cmFzID0gb3RoZXIuZXh0cmFzOwpAQCAtMTYyLDE3ICsxNzMsMTggQEAKICAgICB9CiAKICAgICBzdGF0aWMgY2xhc3MgQWNjb3VudEluZm8gewotICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQ7CisgICAgICAgIGZpbmFsIEFjY291bnRBbmRVc2VyIGFjY291bnRBbmRVc2VyOwogICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgQXV0aG9yaXR5SW5mbz4gYXV0aG9yaXRpZXMgPQogICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgQXV0aG9yaXR5SW5mbz4oKTsKIAotICAgICAgICBBY2NvdW50SW5mbyhBY2NvdW50IGFjY291bnQpIHsKLSAgICAgICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgICAgICAgIEFjY291bnRJbmZvKEFjY291bnRBbmRVc2VyIGFjY291bnRBbmRVc2VyKSB7CisgICAgICAgICAgICB0aGlzLmFjY291bnRBbmRVc2VyID0gYWNjb3VudEFuZFVzZXI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF1dGhvcml0eUluZm8gewogICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQ7CisgICAgICAgIGZpbmFsIGludCB1c2VySWQ7CiAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpdHk7CiAgICAgICAgIGZpbmFsIGludCBpZGVudDsKICAgICAgICAgYm9vbGVhbiBlbmFibGVkOwpAQCAtMTgyLDggKzE5NCw5IEBACiAgICAgICAgIGxvbmcgZGVsYXlVbnRpbDsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFBhaXI8QnVuZGxlLCBMb25nPj4gcGVyaW9kaWNTeW5jczsKIAotICAgICAgICBBdXRob3JpdHlJbmZvKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSwgaW50IGlkZW50KSB7CisgICAgICAgIEF1dGhvcml0eUluZm8oQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5LCBpbnQgaWRlbnQpIHsKICAgICAgICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgICAgICAgICAgICB0aGlzLnVzZXJJZCA9IHVzZXJJZDsKICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gYXV0aG9yaXR5OwogICAgICAgICAgICAgdGhpcy5pZGVudCA9IGlkZW50OwogICAgICAgICAgICAgZW5hYmxlZCA9IFNZTkNfRU5BQkxFRF9ERUZBVUxUOwpAQCAtMjE5LDE3ICsyMzIsMjkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludGVyZmFjZSBPblN5bmNSZXF1ZXN0TGlzdGVuZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBzeW5jIGlzIG5lZWRlZCBvbiBhbiBhY2NvdW50KHMpIGR1ZSB0byBzb21lIGNoYW5nZSBpbiBzdGF0ZS4KKyAgICAgICAgICogQHBhcmFtIGFjY291bnQKKyAgICAgICAgICogQHBhcmFtIHVzZXJJZAorICAgICAgICAgKiBAcGFyYW0gYXV0aG9yaXR5CisgICAgICAgICAqIEBwYXJhbSBleHRyYXMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JlcXVlc3QoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5LCBCdW5kbGUgZXh0cmFzKTsKKyAgICB9CisKICAgICAvLyBQcmltYXJ5IGxpc3Qgb2YgYWxsIHN5bmNhYmxlIGF1dGhvcml0aWVzLiAgQWxzbyBvdXIgZ2xvYmFsIGxvY2suCiAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxBdXRob3JpdHlJbmZvPiBtQXV0aG9yaXRpZXMgPQogICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PEF1dGhvcml0eUluZm8+KCk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8QWNjb3VudCwgQWNjb3VudEluZm8+IG1BY2NvdW50cyA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEFjY291bnQsIEFjY291bnRJbmZvPigpOworICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxBY2NvdW50QW5kVXNlciwgQWNjb3VudEluZm8+IG1BY2NvdW50cworICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxBY2NvdW50QW5kVXNlciwgQWNjb3VudEluZm8+KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQZW5kaW5nT3BlcmF0aW9uPiBtUGVuZGluZ09wZXJhdGlvbnMgPQogICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxQZW5kaW5nT3BlcmF0aW9uPigpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8U3luY0luZm8+IG1DdXJyZW50U3luY3MgPSBuZXcgQXJyYXlMaXN0PFN5bmNJbmZvPigpOworICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8QXJyYXlMaXN0PFN5bmNJbmZvPj4gbUN1cnJlbnRTeW5jcworICAgICAgICAgICAgPSBuZXcgU3BhcnNlQXJyYXk8QXJyYXlMaXN0PFN5bmNJbmZvPj4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8U3luY1N0YXR1c0luZm8+IG1TeW5jU3RhdHVzID0KICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxTeW5jU3RhdHVzSW5mbz4oKTsKQEAgLTI4Miw3ICszMDcsOSBAQAogICAgIHByaXZhdGUgaW50IG1OdW1QZW5kaW5nRmluaXNoZWQgPSAwOwogCiAgICAgcHJpdmF0ZSBpbnQgbU5leHRIaXN0b3J5SWQgPSAwOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkgPSB0cnVlOworICAgIHByaXZhdGUgU3BhcnNlQXJyYXk8Qm9vbGVhbj4gbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID0gbmV3IFNwYXJzZUFycmF5PEJvb2xlYW4+KCk7CisKKyAgICBwcml2YXRlIE9uU3luY1JlcXVlc3RMaXN0ZW5lciBtU3luY1JlcXVlc3RMaXN0ZW5lcjsKIAogICAgIHByaXZhdGUgU3luY1N0b3JhZ2VFbmdpbmUoQ29udGV4dCBjb250ZXh0LCBGaWxlIGRhdGFEaXIpIHsKICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwpAQCAtMzMwLDYgKzM1NywxMiBAQAogICAgICAgICByZXR1cm4gc1N5bmNTdG9yYWdlRW5naW5lOwogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIHNldE9uU3luY1JlcXVlc3RMaXN0ZW5lcihPblN5bmNSZXF1ZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1TeW5jUmVxdWVzdExpc3RlbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIG1TeW5jUmVxdWVzdExpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewogICAgICAgICBpZiAobXNnLndoYXQgPT0gTVNHX1dSSVRFX1NUQVRVUykgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKQEAgLTM4OSwxMCArNDIyLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRTeW5jQXV0b21hdGljYWxseShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTeW5jQXV0b21hdGljYWxseShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIGlmIChhY2NvdW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsCisgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3luY0F1dG9tYXRpY2FsbHkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYXV0aG9yaXR5ICE9IG51bGwgJiYgYXV0aG9yaXR5LmVuYWJsZWQ7CiAgICAgICAgICAgICB9CkBAIC00MDIsNiArNDM1LDcgQEAKICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBtQXV0aG9yaXRpZXMudmFsdWVBdChpKTsKICAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5LmF1dGhvcml0eS5lcXVhbHMocHJvdmlkZXJOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXV0aG9yaXR5LnVzZXJJZCA9PSB1c2VySWQKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF1dGhvcml0eS5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxMCwxMSArNDQ0LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRTeW5jQXV0b21hdGljYWxseShBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIGJvb2xlYW4gc3luYykgewotICAgICAgICBMb2cuZChUQUcsICJzZXRTeW5jQXV0b21hdGljYWxseTogIiArIC8qYWNjb3VudCArKi8gIiwgcHJvdmlkZXIgIiArIHByb3ZpZGVyTmFtZQotICAgICAgICAgICAgICAgICsgIiAtPiAiICsgc3luYyk7CisgICAgcHVibGljIHZvaWQgc2V0U3luY0F1dG9tYXRpY2FsbHkoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBzeW5jKSB7CisgICAgICAgIExvZy5kKFRBRywgInNldFN5bmNBdXRvbWF0aWNhbGx5OiAiICsgLyogYWNjb3VudCArICovIiBwcm92aWRlciAiICsgcHJvdmlkZXJOYW1lCisgICAgICAgICAgICAgICAgKyAiLCB1c2VyICIgKyB1c2VySWQgKyAiIC0+ICIgKyBzeW5jKTsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgcHJvdmlkZXJOYW1lLCAtMSwgZmFsc2UpOworICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgLTEsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkuZW5hYmxlZCA9PSBzeW5jKSB7CiAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2V0U3luY0F1dG9tYXRpY2FsbHk6IGFscmVhZHkgc2V0IHRvICIgKyBzeW5jICsgIiwgZG9pbmcgbm90aGluZyIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTQyNCwxNSArNDYwLDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3luYykgewotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgbmV3IEJ1bmRsZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3RTeW5jKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCBuZXcgQnVuZGxlKCkpOwogICAgICAgICB9CiAgICAgICAgIHJlcG9ydENoYW5nZShDb250ZW50UmVzb2x2ZXIuU1lOQ19PQlNFUlZFUl9UWVBFX1NFVFRJTkdTKTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGdldElzU3luY2FibGUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CisgICAgcHVibGljIGludCBnZXRJc1N5bmNhYmxlKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewogICAgICAgICAgICAgaWYgKGFjY291bnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRJc1N5bmNhYmxlIik7CiAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTQ1MiwxNSArNDg4LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXRJc1N5bmNhYmxlKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgaW50IHN5bmNhYmxlKSB7CisgICAgcHVibGljIHZvaWQgc2V0SXNTeW5jYWJsZShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsIGludCBzeW5jYWJsZSkgewogICAgICAgICBpZiAoc3luY2FibGUgPiAxKSB7CiAgICAgICAgICAgICBzeW5jYWJsZSA9IDE7CiAgICAgICAgIH0gZWxzZSBpZiAoc3luY2FibGUgPCAtMSkgewogICAgICAgICAgICAgc3luY2FibGUgPSAtMTsKICAgICAgICAgfQotICAgICAgICBMb2cuZChUQUcsICJzZXRJc1N5bmNhYmxlOiAiICsgYWNjb3VudCArICIsIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUgKyAiIC0+ICIgKyBzeW5jYWJsZSk7CisgICAgICAgIExvZy5kKFRBRywgInNldElzU3luY2FibGU6ICIgKyBhY2NvdW50ICsgIiwgcHJvdmlkZXIgIiArIHByb3ZpZGVyTmFtZQorICAgICAgICAgICAgICAgICsgIiwgdXNlciAiICsgdXNlcklkICsgIiAtPiAiICsgc3luY2FibGUpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsIC0xLCBmYWxzZSk7CisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgaWYgKGF1dGhvcml0eS5zeW5jYWJsZSA9PSBzeW5jYWJsZSkgewogICAgICAgICAgICAgICAgIExvZy5kKFRBRywgInNldElzU3luY2FibGU6IGFscmVhZHkgc2V0IHRvICIgKyBzeW5jYWJsZSArICIsIGRvaW5nIG5vdGhpbmciKTsKICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC00NzAsMTQgKzUwOCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN5bmNhYmxlID4gMCkgewotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnJlcXVlc3RTeW5jKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgbmV3IEJ1bmRsZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3RTeW5jKGFjY291bnQsIHVzZXJJZCwgcHJvdmlkZXJOYW1lLCBuZXcgQnVuZGxlKCkpOwogICAgICAgICB9CiAgICAgICAgIHJlcG9ydENoYW5nZShDb250ZW50UmVzb2x2ZXIuU1lOQ19PQlNFUlZFUl9UWVBFX1NFVFRJTkdTKTsKICAgICB9CiAKLSAgICBwdWJsaWMgUGFpcjxMb25nLCBMb25nPiBnZXRCYWNrb2ZmKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSkgeworICAgIHB1YmxpYyBQYWlyPExvbmcsIExvbmc+IGdldEJhY2tvZmYoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsICJnZXRCYWNrb2ZmIik7CisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImdldEJhY2tvZmYiKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCB8fCBhdXRob3JpdHkuYmFja29mZlRpbWUgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC00ODUsMTcgKzUyNCwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0QmFja29mZihBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsCisgICAgcHVibGljIHZvaWQgc2V0QmFja29mZihBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsCiAgICAgICAgICAgICBsb25nIG5leHRTeW5jVGltZSwgbG9uZyBuZXh0RGVsYXkpIHsKICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICBMb2cudihUQUcsICJzZXRCYWNrb2ZmOiAiICsgYWNjb3VudCArICIsIHByb3ZpZGVyICIgKyBwcm92aWRlck5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB1c2VyICIgKyB1c2VySWQKICAgICAgICAgICAgICAgICAgICAgKyAiIC0+IG5leHRTeW5jVGltZSAiICsgbmV4dFN5bmNUaW1lICsgIiwgbmV4dERlbGF5ICIgKyBuZXh0RGVsYXkpOwogICAgICAgICB9CiAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewogICAgICAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCB8fCBwcm92aWRlck5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZvciAoQWNjb3VudEluZm8gYWNjb3VudEluZm8gOiBtQWNjb3VudHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjY291bnQgIT0gbnVsbCAmJiAhYWNjb3VudC5lcXVhbHMoYWNjb3VudEluZm8uYWNjb3VudCkpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsICYmICFhY2NvdW50LmVxdWFscyhhY2NvdW50SW5mby5hY2NvdW50QW5kVXNlci5hY2NvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJJZCAhPSBhY2NvdW50SW5mby5hY2NvdW50QW5kVXNlci51c2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZvciAoQXV0aG9yaXR5SW5mbyBhdXRob3JpdHlJbmZvIDogYWNjb3VudEluZm8uYXV0aG9yaXRpZXMudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlck5hbWUgIT0gbnVsbCAmJiAhcHJvdmlkZXJOYW1lLmVxdWFscyhhdXRob3JpdHlJbmZvLmF1dGhvcml0eSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTUxMCw3ICs1NTMsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgcHJvdmlkZXJOYW1lLCAtMSAvKiBpZGVudCAqLywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgLTEgLyogaWRlbnQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkuYmFja29mZlRpbWUgPT0gbmV4dFN5bmNUaW1lICYmIGF1dGhvcml0eS5iYWNrb2ZmRGVsYXkgPT0gbmV4dERlbGF5KSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CkBAIC01MzUsMTMgKzU3OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY2xlYXJBbGxCYWNrb2ZmczoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXV0aG9yaXR5OiIgKyBhdXRob3JpdHlJbmZvLmF1dGhvcml0eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFjY291bnQ6IiArIGFjY291bnRJbmZvLmFjY291bnQubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFjY291bnQ6IiArIGFjY291bnRJbmZvLmFjY291bnRBbmRVc2VyLmFjY291bnQubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHVzZXI6IiArIGFjY291bnRJbmZvLmFjY291bnRBbmRVc2VyLnVzZXJJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJhY2tvZmZUaW1lIHdhczogIiArIGF1dGhvcml0eUluZm8uYmFja29mZlRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiYWNrb2ZmRGVsYXkgd2FzOiAiICsgYXV0aG9yaXR5SW5mby5iYWNrb2ZmRGVsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5SW5mby5iYWNrb2ZmVGltZSA9IE5PVF9JTl9CQUNLT0ZGX01PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHlJbmZvLmJhY2tvZmZEZWxheSA9IE5PVF9JTl9CQUNLT0ZGX01PREU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jUXVldWUub25CYWNrb2ZmQ2hhbmdlZChhY2NvdW50SW5mby5hY2NvdW50LCBhdXRob3JpdHlJbmZvLmF1dGhvcml0eSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUXVldWUub25CYWNrb2ZmQ2hhbmdlZChhY2NvdW50SW5mby5hY2NvdW50QW5kVXNlci5hY2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50SW5mby5hY2NvdW50QW5kVXNlci51c2VySWQsIGF1dGhvcml0eUluZm8uYXV0aG9yaXR5LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTUzLDE0ICs1OTksMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHNldERlbGF5VW50aWxUaW1lKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgbG9uZyBkZWxheVVudGlsKSB7CisgICAgcHVibGljIHZvaWQgc2V0RGVsYXlVbnRpbFRpbWUoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgbG9uZyBkZWxheVVudGlsKSB7CiAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewogICAgICAgICAgICAgTG9nLnYoVEFHLCAic2V0RGVsYXlVbnRpbDogIiArIGFjY291bnQgKyAiLCBwcm92aWRlciAiICsgcHJvdmlkZXJOYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiAtPiBkZWxheVVudGlsICIgKyBkZWxheVVudGlsKTsKKyAgICAgICAgICAgICAgICAgICAgKyAiLCB1c2VyICIgKyB1c2VySWQgKyAiIC0+IGRlbGF5VW50aWwgIiArIGRlbGF5VW50aWwpOwogICAgICAgICB9CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKAotICAgICAgICAgICAgICAgICAgICBhY2NvdW50LCBwcm92aWRlck5hbWUsIC0xIC8qIGlkZW50ICovLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudCwgdXNlcklkLCBwcm92aWRlck5hbWUsIC0xIC8qIGlkZW50ICovLCB0cnVlKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkuZGVsYXlVbnRpbCA9PSBkZWxheVVudGlsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQpAQCAtNTcwLDkgKzYxNywxMCBAQAogICAgICAgICByZXBvcnRDaGFuZ2UoQ29udGVudFJlc29sdmVyLlNZTkNfT0JTRVJWRVJfVFlQRV9TRVRUSU5HUyk7CiAgICAgfQogCi0gICAgcHVibGljIGxvbmcgZ2V0RGVsYXlVbnRpbFRpbWUoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CisgICAgcHVibGljIGxvbmcgZ2V0RGVsYXlVbnRpbFRpbWUoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsICJnZXREZWxheVVudGlsIik7CisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImdldERlbGF5VW50aWwiKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQpAQCAtNTgwLDcgKzYyOCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlT3JSZW1vdmVQZXJpb2RpY1N5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBCdW5kbGUgZXh0cmFzLAorICAgIHByaXZhdGUgdm9pZCB1cGRhdGVPclJlbW92ZVBlcmlvZGljU3luYyhBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBwcm92aWRlck5hbWUsCisgICAgICAgICAgICBCdW5kbGUgZXh0cmFzLAogICAgICAgICAgICAgbG9uZyBwZXJpb2QsIGJvb2xlYW4gYWRkKSB7CiAgICAgICAgIGlmIChwZXJpb2QgPD0gMCkgewogICAgICAgICAgICAgcGVyaW9kID0gMDsKQEAgLTU4OSwxMyArNjM4LDE0IEBACiAgICAgICAgICAgICBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICJhZGRPclJlbW92ZVBlcmlvZGljU3luYzogIiArIGFjY291bnQgKyAiLCBwcm92aWRlciAiICsgcHJvdmlkZXJOYW1lCisgICAgICAgICAgICBMb2cudihUQUcsICJhZGRPclJlbW92ZVBlcmlvZGljU3luYzogIiArIGFjY291bnQgKyAiLCB1c2VyICIgKyB1c2VySWQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlciAiICsgcHJvdmlkZXJOYW1lCiAgICAgICAgICAgICAgICAgICAgICsgIiAtPiBwZXJpb2QgIiArIHBlcmlvZCArICIsIGV4dHJhcyAiICsgZXh0cmFzKTsKICAgICAgICAgfQogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsIC0xLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgLTEsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoYWRkKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGlzIHBlcmlvZGljIHN5bmMgaWYgb25lIHdpdGggdGhlIHNhbWUgZXh0cmFzIGRvZXNuJ3QgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICAvLyBleGlzdCBpbiB0aGUgcGVyaW9kaWNTeW5jcyBhcnJheQpAQCAtNjUyLDYxICs3MDIsNjcgQEAKICAgICAgICAgcmVwb3J0Q2hhbmdlKENvbnRlbnRSZXNvbHZlci5TWU5DX09CU0VSVkVSX1RZUEVfU0VUVElOR1MpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZFBlcmlvZGljU3luYyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUsIEJ1bmRsZSBleHRyYXMsCisgICAgcHVibGljIHZvaWQgYWRkUGVyaW9kaWNTeW5jKEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIHByb3ZpZGVyTmFtZSwgQnVuZGxlIGV4dHJhcywKICAgICAgICAgICAgIGxvbmcgcG9sbEZyZXF1ZW5jeSkgewotICAgICAgICB1cGRhdGVPclJlbW92ZVBlcmlvZGljU3luYyhhY2NvdW50LCBwcm92aWRlck5hbWUsIGV4dHJhcywgcG9sbEZyZXF1ZW5jeSwgdHJ1ZSAvKiBhZGQgKi8pOworICAgICAgICB1cGRhdGVPclJlbW92ZVBlcmlvZGljU3luYyhhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgZXh0cmFzLCBwb2xsRnJlcXVlbmN5LAorICAgICAgICAgICAgICAgIHRydWUgLyogYWRkICovKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQZXJpb2RpY1N5bmMoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgcHJvdmlkZXJOYW1lLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIHVwZGF0ZU9yUmVtb3ZlUGVyaW9kaWNTeW5jKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgZXh0cmFzLCAwIC8qIHBlcmlvZCwgaWdub3JlZCAqLywKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQZXJpb2RpY1N5bmMoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lLAorICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgeworICAgICAgICB1cGRhdGVPclJlbW92ZVBlcmlvZGljU3luYyhhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwgZXh0cmFzLCAwIC8qIHBlcmlvZCwgaWdub3JlZCAqLywKICAgICAgICAgICAgICAgICBmYWxzZSAvKiByZW1vdmUgKi8pOwogICAgIH0KIAotICAgIHB1YmxpYyBMaXN0PFBlcmlvZGljU3luYz4gZ2V0UGVyaW9kaWNTeW5jcyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBwcm92aWRlck5hbWUpIHsKKyAgICBwdWJsaWMgTGlzdDxQZXJpb2RpY1N5bmM+IGdldFBlcmlvZGljU3luY3MoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgIEFycmF5TGlzdDxQZXJpb2RpY1N5bmM+IHN5bmNzID0gbmV3IEFycmF5TGlzdDxQZXJpb2RpY1N5bmM+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCBwcm92aWRlck5hbWUsICJnZXRQZXJpb2RpY1N5bmNzIik7CisgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGdldEF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIHByb3ZpZGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgImdldFBlcmlvZGljU3luY3MiKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZvciAoUGFpcjxCdW5kbGUsIExvbmc+IGl0ZW0gOiBhdXRob3JpdHkucGVyaW9kaWNTeW5jcykgewotICAgICAgICAgICAgICAgICAgICBzeW5jcy5hZGQobmV3IFBlcmlvZGljU3luYyhhY2NvdW50LCBwcm92aWRlck5hbWUsIGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNzLmFkZChuZXcgUGVyaW9kaWNTeW5jKGFjY291bnQsIHByb3ZpZGVyTmFtZSwgaXRlbS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNlY29uZCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3luY3M7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoYm9vbGVhbiBmbGFnKSB7CisgICAgcHVibGljIHZvaWQgc2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoYm9vbGVhbiBmbGFnLCBpbnQgdXNlcklkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBpZiAobU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5ID09IGZsYWcpIHsKKyAgICAgICAgICAgIEJvb2xlYW4gYXV0byA9IG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseS5nZXQodXNlcklkKTsKKyAgICAgICAgICAgIGlmIChhdXRvICE9IG51bGwgJiYgKGJvb2xlYW4pIGF1dG8gPT0gZmxhZykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseSA9IGZsYWc7CisgICAgICAgICAgICBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkucHV0KHVzZXJJZCwgZmxhZyk7CiAgICAgICAgICAgICB3cml0ZUFjY291bnRJbmZvTG9ja2VkKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZsYWcpIHsKLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlci5yZXF1ZXN0U3luYyhudWxsLCBudWxsLCBuZXcgQnVuZGxlKCkpOworICAgICAgICAgICAgcmVxdWVzdFN5bmMobnVsbCwgdXNlcklkLCBudWxsLCBuZXcgQnVuZGxlKCkpOwogICAgICAgICB9CiAgICAgICAgIHJlcG9ydENoYW5nZShDb250ZW50UmVzb2x2ZXIuU1lOQ19PQlNFUlZFUl9UWVBFX1NFVFRJTkdTKTsKICAgICAgICAgbUNvbnRleHQuc2VuZEJyb2FkY2FzdChTWU5DX0NPTk5FQ1RJT05fU0VUVElOR19DSEFOR0VEX0lOVEVOVCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoKSB7CisgICAgcHVibGljIGJvb2xlYW4gZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoaW50IHVzZXJJZCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgcmV0dXJuIG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseTsKKyAgICAgICAgICAgIEJvb2xlYW4gYXV0byA9IG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseS5nZXQodXNlcklkKTsKKyAgICAgICAgICAgIHJldHVybiBhdXRvID09IG51bGwgPyB0cnVlIDogYXV0bzsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBBdXRob3JpdHlJbmZvIGdldE9yQ3JlYXRlQXV0aG9yaXR5KEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgIHB1YmxpYyBBdXRob3JpdHlJbmZvIGdldE9yQ3JlYXRlQXV0aG9yaXR5KEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwgU3RyaW5nIGF1dGhvcml0eSkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgcmV0dXJuIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIGF1dGhvcml0eSwKKyAgICAgICAgICAgIHJldHVybiBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZChhY2NvdW50LCB1c2VySWQsIGF1dGhvcml0eSwKICAgICAgICAgICAgICAgICAgICAgLTEgLyogYXNzaWduIGEgbmV3IGlkZW50aWZpZXIgaWYgY3JlYXRpbmcgYSBuZXcgYXV0aG9yaXR5ICovLAogICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIHdyaXRlIHRvIHN0b3JhZ2UgaWYgdGhpcyByZXN1bHRzIGluIGEgY2hhbmdlICovKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF1dGhvcml0eShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBdXRob3JpdHkoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICByZW1vdmVBdXRob3JpdHlMb2NrZWQoYWNjb3VudCwgYXV0aG9yaXR5LCB0cnVlIC8qIGRvV3JpdGUgKi8pOworICAgICAgICAgICAgcmVtb3ZlQXV0aG9yaXR5TG9ja2VkKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5LCB0cnVlIC8qIGRvV3JpdGUgKi8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MjAsMTIgKzc3NiwxMyBAQAogICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBzeW5jIG9wZXJhdGlvbiBmb3IgdGhlIGdpdmVuCiAgICAgICogYWNjb3VudCBvciBhdXRob3JpdHkgYWN0aXZlbHkgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU3luY0FjdGl2ZShBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNBY3RpdmUoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7Ci0gICAgICAgICAgICBmb3IgKFN5bmNJbmZvIHN5bmNJbmZvIDogbUN1cnJlbnRTeW5jcykgeworICAgICAgICAgICAgZm9yIChTeW5jSW5mbyBzeW5jSW5mbyA6IGdldEN1cnJlbnRTeW5jcyh1c2VySWQpKSB7CiAgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhaW5mbyA9IGdldEF1dGhvcml0eShzeW5jSW5mby5hdXRob3JpdHlJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGFpbmZvICE9IG51bGwgJiYgYWluZm8uYWNjb3VudC5lcXVhbHMoYWNjb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGFpbmZvLmF1dGhvcml0eS5lcXVhbHMoYXV0aG9yaXR5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWluZm8uYXV0aG9yaXR5LmVxdWFscyhhdXRob3JpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhaW5mby51c2VySWQgPT0gdXNlcklkKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTczOCwxMiArNzk1LDEzIEBACiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKICAgICAgICAgICAgICAgICBMb2cudihUQUcsICJpbnNlcnRJbnRvUGVuZGluZzogYWNjb3VudD0iICsgb3AuYWNjb3VudAotICAgICAgICAgICAgICAgICAgICArICIgYXV0aD0iICsgb3AuYXV0aG9yaXR5Ci0gICAgICAgICAgICAgICAgICAgICsgIiBzcmM9IiArIG9wLnN5bmNTb3VyY2UKLSAgICAgICAgICAgICAgICAgICAgKyAiIGV4dHJhcz0iICsgb3AuZXh0cmFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1c2VyPSIgKyBvcC51c2VySWQKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdXRoPSIgKyBvcC5hdXRob3JpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzcmM9IiArIG9wLnN5bmNTb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleHRyYXM9IiArIG9wLmV4dHJhcyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQob3AuYWNjb3VudCwKKyAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQob3AuYWNjb3VudCwgb3AudXNlcklkLAogICAgICAgICAgICAgICAgICAgICBvcC5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgIC0xIC8qIGRlc2lyZWQgaWRlbnRpZmllciAqLywKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB3cml0ZSBhY2NvdW50cyB0byBzdG9yYWdlICovKTsKQEAgLTc2OSw2ICs4MjcsNyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewogICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiZGVsZXRlRnJvbVBlbmRpbmc6IGFjY291bnQ9IiArIG9wLmFjY291bnQKKyAgICAgICAgICAgICAgICAgICAgKyAiIHVzZXI9IiArIG9wLnVzZXJJZAogICAgICAgICAgICAgICAgICAgICArICIgYXV0aD0iICsgb3AuYXV0aG9yaXR5CiAgICAgICAgICAgICAgICAgICAgICsgIiBzcmM9IiArIG9wLnN5bmNTb3VyY2UKICAgICAgICAgICAgICAgICAgICAgKyAiIGV4dHJhcz0iICsgb3AuZXh0cmFzKTsKQEAgLTc4Miw3ICs4NDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBtTnVtUGVuZGluZ0ZpbmlzaGVkKys7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQob3AuYWNjb3VudCwgb3AuYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKG9wLmFjY291bnQsIG9wLnVzZXJJZCwgb3AuYXV0aG9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgImRlbGV0ZUZyb21QZW5kaW5nIik7CiAgICAgICAgICAgICAgICAgaWYgKGF1dGhvcml0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgTG9nLnYoVEFHLCAicmVtb3ZpbmcgLSAiICsgYXV0aG9yaXR5KTsKQEAgLTc5MSw3ICs4NTAsOCBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nT3BlcmF0aW9uIGN1ciA9IG1QZW5kaW5nT3BlcmF0aW9ucy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyLmFjY291bnQuZXF1YWxzKG9wLmFjY291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1ci5hdXRob3JpdHkuZXF1YWxzKG9wLmF1dGhvcml0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY3VyLmF1dGhvcml0eS5lcXVhbHMob3AuYXV0aG9yaXR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXIudXNlcklkID09IG9wLnVzZXJJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTgxMiwyNCArODcyLDYgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGNsZWFyUGVuZGluZygpIHsKLSAgICAgICAgaW50IG51bTsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgImNsZWFyUGVuZGluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbnVtID0gbVBlbmRpbmdPcGVyYXRpb25zLnNpemUoKTsKLSAgICAgICAgICAgIG1QZW5kaW5nT3BlcmF0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgZmluYWwgaW50IE4gPSBtU3luY1N0YXR1cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN5bmNTdGF0dXMudmFsdWVBdChpKS5wZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZVBlbmRpbmdPcGVyYXRpb25zTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVwb3J0Q2hhbmdlKENvbnRlbnRSZXNvbHZlci5TWU5DX09CU0VSVkVSX1RZUEVfUEVORElORyk7Ci0gICAgICAgIHJldHVybiBudW07Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgY29weSBvZiB0aGUgY3VycmVudCBhcnJheSBvZiBwZW5kaW5nIG9wZXJhdGlvbnMuICBUaGUKICAgICAgKiBQZW5kaW5nT3BlcmF0aW9uIG9iamVjdHMgYXJlIHRoZSByZWFsIG9iamVjdHMgc3RvcmVkIGluc2lkZSwgc28gdGhhdApAQCAtODU0LDE3ICs4OTYsMTggQEAKICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2V0IG9mIGFjY291bnQgaGFzIGNoYW5nZWQsIGdpdmVuIHRoZSBuZXcgYXJyYXkgb2YKICAgICAgKiBhY3RpdmUgYWNjb3VudHMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZG9EYXRhYmFzZUNsZWFudXAoQWNjb3VudFtdIGFjY291bnRzKSB7CisgICAgcHVibGljIHZvaWQgZG9EYXRhYmFzZUNsZWFudXAoQWNjb3VudFtdIGFjY291bnRzLCBpbnQgdXNlcklkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIExvZy53KFRBRywgIlVwZGF0aW5nIGZvciBuZXcgYWNjb3VudHMuLi4iKTsKICAgICAgICAgICAgIFNwYXJzZUFycmF5PEF1dGhvcml0eUluZm8+IHJlbW92aW5nID0gbmV3IFNwYXJzZUFycmF5PEF1dGhvcml0eUluZm8+KCk7CiAgICAgICAgICAgICBJdGVyYXRvcjxBY2NvdW50SW5mbz4gYWNjSXQgPSBtQWNjb3VudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIHdoaWxlIChhY2NJdC5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICBBY2NvdW50SW5mbyBhY2MgPSBhY2NJdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFBcnJheVV0aWxzLmNvbnRhaW5zKGFjY291bnRzLCBhY2MuYWNjb3VudCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUFycmF5VXRpbHMuY29udGFpbnMoYWNjb3VudHMsIGFjYy5hY2NvdW50QW5kVXNlci5hY2NvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWNjLmFjY291bnRBbmRVc2VyLnVzZXJJZCA9PSB1c2VySWQpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhY2NvdW50IG5vIGxvbmdlciBleGlzdHMuLi4KICAgICAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBY2NvdW50IHJlbW92ZWQ6ICIgKyBhY2MuYWNjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJBY2NvdW50IHJlbW92ZWQ6ICIgKyBhY2MuYWNjb3VudEFuZFVzZXIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZvciAoQXV0aG9yaXR5SW5mbyBhdXRoIDogYWNjLmF1dGhvcml0aWVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmluZy5wdXQoYXV0aC5pZGVudCwgYXV0aCk7CkBAIC05MTksMTMgKzk2MiwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRPckNyZWF0ZUF1dGhvcml0eUxvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24uYWNjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3luY0NvbnRleHQubVN5bmNPcGVyYXRpb24udXNlcklkLAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3luY09wZXJhdGlvbi5hdXRob3JpdHksCiAgICAgICAgICAgICAgICAgICAgIC0xIC8qIGFzc2lnbiBhIG5ldyBpZGVudGlmaWVyIGlmIGNyZWF0aW5nIGEgbmV3IGF1dGhvcml0eSAqLywKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiB3cml0ZSB0byBzdG9yYWdlIGlmIHRoaXMgcmVzdWx0cyBpbiBhIGNoYW5nZSAqLyk7CiAgICAgICAgICAgICBzeW5jSW5mbyA9IG5ldyBTeW5jSW5mbyhhdXRob3JpdHkuaWRlbnQsCiAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS5hY2NvdW50LCBhdXRob3JpdHkuYXV0aG9yaXR5LAogICAgICAgICAgICAgICAgICAgICBhY3RpdmVTeW5jQ29udGV4dC5tU3RhcnRUaW1lKTsKLSAgICAgICAgICAgIG1DdXJyZW50U3luY3MuYWRkKHN5bmNJbmZvKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRTeW5jcyhhdXRob3JpdHkudXNlcklkKS5hZGQoc3luY0luZm8pOwogICAgICAgICB9CiAKICAgICAgICAgcmVwb3J0QWN0aXZlQ2hhbmdlKCk7CkBAIC05MzUsMTMgKzk3OSwxNCBAQAogICAgIC8qKgogICAgICAqIENhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IGEgcHJldmlvdXNseSBhY3RpdmUgc3luYyBpcyBubyBsb25nZXIgYWN0aXZlLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFjdGl2ZVN5bmMoU3luY0luZm8gc3luY0luZm8pIHsKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBY3RpdmVTeW5jKFN5bmNJbmZvIHN5bmNJbmZvLCBpbnQgdXNlcklkKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudihUQUcsICJyZW1vdmVBY3RpdmVTeW5jOiBhY2NvdW50PSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc3luY0luZm8uYWNjb3VudCArICIgYXV0aD0iICsgc3luY0luZm8uYXV0aG9yaXR5KTsKKyAgICAgICAgICAgICAgICBMb2cudihUQUcsICJyZW1vdmVBY3RpdmVTeW5jOiBhY2NvdW50PSIgKyBzeW5jSW5mby5hY2NvdW50CisgICAgICAgICAgICAgICAgICAgICAgICArICIgdXNlcj0iICsgdXNlcklkCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYXV0aD0iICsgc3luY0luZm8uYXV0aG9yaXR5KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50U3luY3MucmVtb3ZlKHN5bmNJbmZvKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRTeW5jcyh1c2VySWQpLnJlbW92ZShzeW5jSW5mbyk7CiAgICAgICAgIH0KIAogICAgICAgICByZXBvcnRBY3RpdmVDaGFuZ2UoKTsKQEAgLTk1NywxNSArMTAwMiwxNSBAQAogICAgIC8qKgogICAgICAqIE5vdGUgdGhhdCBzeW5jIGhhcyBzdGFydGVkIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCBhbmQgYXV0aG9yaXR5LgogICAgICAqLwotICAgIHB1YmxpYyBsb25nIGluc2VydFN0YXJ0U3luY0V2ZW50KEFjY291bnQgYWNjb3VudE5hbWUsIFN0cmluZyBhdXRob3JpdHlOYW1lLAorICAgIHB1YmxpYyBsb25nIGluc2VydFN0YXJ0U3luY0V2ZW50KEFjY291bnQgYWNjb3VudE5hbWUsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHlOYW1lLAogICAgICAgICAgICAgbG9uZyBub3csIGludCBzb3VyY2UpIHsKICAgICAgICAgbG9uZyBpZDsKICAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKICAgICAgICAgICAgIGlmIChMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5WRVJCT1NFKSkgewotICAgICAgICAgICAgICAgIExvZy52KFRBRywgImluc2VydFN0YXJ0U3luY0V2ZW50OiBhY2NvdW50PSIgKyBhY2NvdW50TmFtZQorICAgICAgICAgICAgICAgIExvZy52KFRBRywgImluc2VydFN0YXJ0U3luY0V2ZW50OiBhY2NvdW50PSIgKyBhY2NvdW50TmFtZSArICJ1c2VyPSIgKyB1c2VySWQKICAgICAgICAgICAgICAgICAgICAgKyAiIGF1dGg9IiArIGF1dGhvcml0eU5hbWUgKyAiIHNvdXJjZT0iICsgc291cmNlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gZ2V0QXV0aG9yaXR5TG9ja2VkKGFjY291bnROYW1lLCBhdXRob3JpdHlOYW1lLAorICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBnZXRBdXRob3JpdHlMb2NrZWQoYWNjb3VudE5hbWUsIHVzZXJJZCwgYXV0aG9yaXR5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgImluc2VydFN0YXJ0U3luY0V2ZW50Iik7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0xMTE5LDkgKzExNjQsMTQgQEAKICAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN5bmNzLiBOb3RlIHRoYXQgdGhlIHJldHVybmVkIGl0ZW1zIGFyZSB0aGUKICAgICAgKiByZWFsLCBsaXZlIGFjdGl2ZSBzeW5jIG9iamVjdHMsIHNvIGJlIGNhcmVmdWwgd2hhdCB5b3UgZG8gd2l0aCBpdC4KICAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTeW5jSW5mbz4gZ2V0Q3VycmVudFN5bmNzKCkgeworICAgIHB1YmxpYyBMaXN0PFN5bmNJbmZvPiBnZXRDdXJyZW50U3luY3MoaW50IHVzZXJJZCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKG1BdXRob3JpdGllcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3luY0luZm8+KG1DdXJyZW50U3luY3MpOworICAgICAgICAgICAgQXJyYXlMaXN0PFN5bmNJbmZvPiBzeW5jcyA9IG1DdXJyZW50U3luY3MuZ2V0KHVzZXJJZCk7CisgICAgICAgICAgICBpZiAoc3luY3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN5bmNzID0gbmV3IEFycmF5TGlzdDxTeW5jSW5mbz4oKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFN5bmNzLnB1dCh1c2VySWQsIHN5bmNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PFN5bmNJbmZvPihzeW5jcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExNjQsNyArMTIxNCw4IEBACiAgICAgICogQHBhcmFtIGF1dGhvcml0eSB0aGUgYXV0aG9yaXR5IHdob3NlIHJvdyBzaG91bGQgYmUgc2VsZWN0ZWQKICAgICAgKiBAcmV0dXJuIHRoZSBTeW5jU3RhdHVzSW5mbyBmb3IgdGhlIGF1dGhvcml0eQogICAgICAqLwotICAgIHB1YmxpYyBTeW5jU3RhdHVzSW5mbyBnZXRTdGF0dXNCeUFjY291bnRBbmRBdXRob3JpdHkoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aG9yaXR5KSB7CisgICAgcHVibGljIFN5bmNTdGF0dXNJbmZvIGdldFN0YXR1c0J5QWNjb3VudEFuZEF1dGhvcml0eShBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsCisgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIGlmIChhY2NvdW50ID09IG51bGwgfHwgYXV0aG9yaXR5ID09IG51bGwpIHsKICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgICAgICAgIH0KQEAgLTExNzQsOCArMTIyNSw5IEBACiAgICAgICAgICAgICAgICAgU3luY1N0YXR1c0luZm8gY3VyID0gbVN5bmNTdGF0dXMudmFsdWVBdChpKTsKICAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGFpbmZvID0gbUF1dGhvcml0aWVzLmdldChjdXIuYXV0aG9yaXR5SWQpOwogCi0gICAgICAgICAgICAgICAgaWYgKGFpbmZvICE9IG51bGwgJiYgYWluZm8uYXV0aG9yaXR5LmVxdWFscyhhdXRob3JpdHkpICYmCi0gICAgICAgICAgICAgICAgICAgIGFjY291bnQuZXF1YWxzKGFpbmZvLmFjY291bnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFpbmZvICE9IG51bGwgJiYgYWluZm8uYXV0aG9yaXR5LmVxdWFscyhhdXRob3JpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhaW5mby51c2VySWQgPT0gdXNlcklkCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY2NvdW50LmVxdWFscyhhaW5mby5hY2NvdW50KSkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xMTg2LDcgKzEyMzgsNyBAQAogICAgIC8qKgogICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwZW5kaW5nIHN0YXR1cyBpcyB0cnVlIG9mIGFueSBtYXRjaGluZyBhdXRob3JpdGllcy4KICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bmNQZW5kaW5nKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eSkgeworICAgIHB1YmxpYyBib29sZWFuIGlzU3luY1BlbmRpbmcoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5KSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUF1dGhvcml0aWVzKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgTiA9IG1TeW5jU3RhdHVzLnNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxOOyBpKyspIHsKQEAgLTExOTUsNiArMTI0Nyw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGFpbmZvID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1c2VySWQgIT0gYWluZm8udXNlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudCAhPSBudWxsICYmICFhaW5mby5hY2NvdW50LmVxdWFscyhhY2NvdW50KSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMjM1LDM0ICsxMjkwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIElmIHN5bmMgaXMgZmFpbGluZyBmb3IgYW55IG9mIHRoZSBwcm92aWRlci9hY2NvdW50cyB0aGVuIGRldGVybWluZSB0aGUgdGltZSBhdCB3aGljaCBpdAotICAgICAqIHN0YXJ0ZWQgZmFpbGluZyBhbmQgcmV0dXJuIHRoZSBlYXJsaWVzdCB0aW1lIG92ZXIgYWxsIHRoZSBwcm92aWRlci9hY2NvdW50cy4gSWYgbm9uZSBhcmUKLSAgICAgKiBmYWlsaW5nIHRoZW4gcmV0dXJuIDAuCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0SW5pdGlhbFN5bmNGYWlsdXJlVGltZSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtQXV0aG9yaXRpZXMpIHsKLSAgICAgICAgICAgIGlmICghbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgb2xkZXN0ID0gMDsKLSAgICAgICAgICAgIGludCBpID0gbVN5bmNTdGF0dXMuc2l6ZSgpOwotICAgICAgICAgICAgd2hpbGUgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgIFN5bmNTdGF0dXNJbmZvIHN0YXRzID0gbVN5bmNTdGF0dXMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IG1BdXRob3JpdGllcy5nZXQoc3RhdHMuYXV0aG9yaXR5SWQpOwotICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgIT0gbnVsbCAmJiBhdXRob3JpdHkuZW5hYmxlZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAob2xkZXN0ID09IDAgfHwgc3RhdHMuaW5pdGlhbEZhaWx1cmVUaW1lIDwgb2xkZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRlc3QgPSBzdGF0cy5pbml0aWFsRmFpbHVyZVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBvbGRlc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGludCBnZXRDdXJyZW50RGF5TG9ja2VkKCkgewogICAgICAgICBtQ2FsLnNldFRpbWVJbk1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgIGZpbmFsIGludCBkYXlPZlllYXIgPSBtQ2FsLmdldChDYWxlbmRhci5EQVlfT0ZfWUVBUik7CkBAIC0xMjgzLDE4ICsxMzEwLDE5IEBACiAgICAgICogQHBhcmFtIHRhZyBJZiBub24tbnVsbCwgdGhpcyB3aWxsIGJlIHVzZWQgaW4gYSBsb2cgbWVzc2FnZSBpZiB0aGUKICAgICAgKiByZXF1ZXN0ZWQgYXV0aG9yaXR5IGRvZXMgbm90IGV4aXN0LgogICAgICAqLwotICAgIHByaXZhdGUgQXV0aG9yaXR5SW5mbyBnZXRBdXRob3JpdHlMb2NrZWQoQWNjb3VudCBhY2NvdW50TmFtZSwgU3RyaW5nIGF1dGhvcml0eU5hbWUsCisgICAgcHJpdmF0ZSBBdXRob3JpdHlJbmZvIGdldEF1dGhvcml0eUxvY2tlZChBY2NvdW50IGFjY291bnROYW1lLCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5TmFtZSwKICAgICAgICAgICAgIFN0cmluZyB0YWcpIHsKLSAgICAgICAgQWNjb3VudEluZm8gYWNjb3VudCA9IG1BY2NvdW50cy5nZXQoYWNjb3VudE5hbWUpOwotICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CisgICAgICAgIEFjY291bnRBbmRVc2VyIGF1ID0gbmV3IEFjY291bnRBbmRVc2VyKGFjY291bnROYW1lLCB1c2VySWQpOworICAgICAgICBBY2NvdW50SW5mbyBhY2NvdW50SW5mbyA9IG1BY2NvdW50cy5nZXQoYXUpOworICAgICAgICBpZiAoYWNjb3VudEluZm8gPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgdGFnICsgIjogdW5rbm93biBhY2NvdW50ICIgKyBhY2NvdW50TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy52KFRBRywgdGFnICsgIjogdW5rbm93biBhY2NvdW50ICIgKyBhdSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBhY2NvdW50LmF1dGhvcml0aWVzLmdldChhdXRob3JpdHlOYW1lKTsKKyAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSBhY2NvdW50SW5mby5hdXRob3JpdGllcy5nZXQoYXV0aG9yaXR5TmFtZSk7CiAgICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHRhZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CkBAIC0xMzA3LDEyICsxMzM1LDEzIEBACiAgICAgICAgIHJldHVybiBhdXRob3JpdHk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBBdXRob3JpdHlJbmZvIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKEFjY291bnQgYWNjb3VudE5hbWUsCisgICAgcHJpdmF0ZSBBdXRob3JpdHlJbmZvIGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKEFjY291bnQgYWNjb3VudE5hbWUsIGludCB1c2VySWQsCiAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5TmFtZSwgaW50IGlkZW50LCBib29sZWFuIGRvV3JpdGUpIHsKLSAgICAgICAgQWNjb3VudEluZm8gYWNjb3VudCA9IG1BY2NvdW50cy5nZXQoYWNjb3VudE5hbWUpOworICAgICAgICBBY2NvdW50QW5kVXNlciBhdSA9IG5ldyBBY2NvdW50QW5kVXNlcihhY2NvdW50TmFtZSwgdXNlcklkKTsKKyAgICAgICAgQWNjb3VudEluZm8gYWNjb3VudCA9IG1BY2NvdW50cy5nZXQoYXUpOwogICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhY2NvdW50ID0gbmV3IEFjY291bnRJbmZvKGFjY291bnROYW1lKTsKLSAgICAgICAgICAgIG1BY2NvdW50cy5wdXQoYWNjb3VudE5hbWUsIGFjY291bnQpOworICAgICAgICAgICAgYWNjb3VudCA9IG5ldyBBY2NvdW50SW5mbyhhdSk7CisgICAgICAgICAgICBtQWNjb3VudHMucHV0KGF1LCBhY2NvdW50KTsKICAgICAgICAgfQogICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IGFjY291bnQuYXV0aG9yaXRpZXMuZ2V0KGF1dGhvcml0eU5hbWUpOwogICAgICAgICBpZiAoYXV0aG9yaXR5ID09IG51bGwpIHsKQEAgLTEzMjMsOSArMTM1MiwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLlZFUkJPU0UpKSB7CiAgICAgICAgICAgICAgICAgTG9nLnYoVEFHLCAiY3JlYXRlZCBhIG5ldyBBdXRob3JpdHlJbmZvIGZvciAiICsgYWNjb3VudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlciAiICsgYXV0aG9yaXR5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICArICIsIHVzZXIgIiArIHVzZXJJZAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlciAiICsgYXV0aG9yaXR5TmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdXRob3JpdHkgPSBuZXcgQXV0aG9yaXR5SW5mbyhhY2NvdW50TmFtZSwgYXV0aG9yaXR5TmFtZSwgaWRlbnQpOworICAgICAgICAgICAgYXV0aG9yaXR5ID0gbmV3IEF1dGhvcml0eUluZm8oYWNjb3VudE5hbWUsIHVzZXJJZCwgYXV0aG9yaXR5TmFtZSwgaWRlbnQpOwogICAgICAgICAgICAgYWNjb3VudC5hdXRob3JpdGllcy5wdXQoYXV0aG9yaXR5TmFtZSwgYXV0aG9yaXR5KTsKICAgICAgICAgICAgIG1BdXRob3JpdGllcy5wdXQoaWRlbnQsIGF1dGhvcml0eSk7CiAgICAgICAgICAgICBpZiAoZG9Xcml0ZSkgewpAQCAtMTMzNiw4ICsxMzY2LDkgQEAKICAgICAgICAgcmV0dXJuIGF1dGhvcml0eTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlQXV0aG9yaXR5TG9ja2VkKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGhvcml0eU5hbWUsIGJvb2xlYW4gZG9Xcml0ZSkgewotICAgICAgICBBY2NvdW50SW5mbyBhY2NvdW50SW5mbyA9IG1BY2NvdW50cy5nZXQoYWNjb3VudCk7CisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUF1dGhvcml0eUxvY2tlZChBY2NvdW50IGFjY291bnQsIGludCB1c2VySWQsIFN0cmluZyBhdXRob3JpdHlOYW1lLAorICAgICAgICAgICAgYm9vbGVhbiBkb1dyaXRlKSB7CisgICAgICAgIEFjY291bnRJbmZvIGFjY291bnRJbmZvID0gbUFjY291bnRzLmdldChuZXcgQWNjb3VudEFuZFVzZXIoYWNjb3VudCwgdXNlcklkKSk7CiAgICAgICAgIGlmIChhY2NvdW50SW5mbyAhPSBudWxsKSB7CiAgICAgICAgICAgICBmaW5hbCBBdXRob3JpdHlJbmZvIGF1dGhvcml0eUluZm8gPSBhY2NvdW50SW5mby5hdXRob3JpdGllcy5yZW1vdmUoYXV0aG9yaXR5TmFtZSk7CiAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5SW5mbyAhPSBudWxsKSB7CkBAIC0xNDE5LDggKzE0NTAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIHRhZ05hbWUgPSBwYXJzZXIuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKCJhY2NvdW50cyIuZXF1YWxzKHRhZ05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxpc3RlbiA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICJsaXN0ZW4tZm9yLXRpY2tsZXMiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGlzdGVuID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIFhNTF9BVFRSX0xJU1RFTl9GT1JfVElDS0xFUyk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInZlcnNpb24iKTsKICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbjsKICAgICAgICAgICAgICAgICB0cnkgewpAQCAtMTQyOCwxNCArMTQ1OCwxNCBAQAogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAwOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dElkU3RyaW5nID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsICJuZXh0QXV0aG9yaXR5SWQiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmV4dElkU3RyaW5nID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIFhNTF9BVFRSX05FWFRfQVVUSE9SSVRZX0lEKTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSAobmV4dElkU3RyaW5nID09IG51bGwpID8gMCA6IEludGVnZXIucGFyc2VJbnQobmV4dElkU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgbU5leHRBdXRob3JpdHlJZCA9IE1hdGgubWF4KG1OZXh0QXV0aG9yaXR5SWQsIGlkKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjYXJlCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseSA9IGxpc3RlbiA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKGxpc3Rlbik7CisgICAgICAgICAgICAgICAgbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5LnB1dCgwLCBsaXN0ZW4gPT0gbnVsbCB8fCBCb29sZWFuLnBhcnNlQm9vbGVhbihsaXN0ZW4pKTsKICAgICAgICAgICAgICAgICBldmVudFR5cGUgPSBwYXJzZXIubmV4dCgpOwogICAgICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gYXV0aG9yaXR5ID0gbnVsbDsKICAgICAgICAgICAgICAgICBQYWlyPEJ1bmRsZSwgTG9uZz4gcGVyaW9kaWNTeW5jID0gbnVsbDsKQEAgLTE0NDksNiArMTQ3OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkuaWRlbnQgPiBoaWdoZXN0QXV0aG9yaXR5SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3RBdXRob3JpdHlJZCA9IGF1dGhvcml0eS5pZGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MX1RBR19MSVNURU5fRk9SX1RJQ0tMRVMuZXF1YWxzKHRhZ05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTGlzdGVuRm9yVGlja2xlcyhwYXJzZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VyLmdldERlcHRoKCkgPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgicGVyaW9kaWNTeW5jIi5lcXVhbHModGFnTmFtZSkgJiYgYXV0aG9yaXR5ICE9IG51bGwpIHsKQEAgLTE1MTEsMjUgKzE1NDMsNDEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgcmVjb3JkIG9mIHRoaXMgbmV3IGF1dGhvcml0eSB0aGVuIGRvbid0IGNvcHkgb3ZlciB0aGUgc2V0dGluZ3MKLSAgICAgICAgICAgIGlmIChnZXRBdXRob3JpdHlMb2NrZWQoYXV0aG9yaXR5LmFjY291bnQsIG5ld0F1dGhvcml0eU5hbWUsICJjbGVhbnVwIikgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGdldEF1dGhvcml0eUxvY2tlZChhdXRob3JpdHkuYWNjb3VudCwgYXV0aG9yaXR5LnVzZXJJZCwgbmV3QXV0aG9yaXR5TmFtZSwgImNsZWFudXAiKQorICAgICAgICAgICAgICAgICAgICAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEF1dGhvcml0eUluZm8gbmV3QXV0aG9yaXR5ID0gZ2V0T3JDcmVhdGVBdXRob3JpdHlMb2NrZWQoYXV0aG9yaXR5LmFjY291bnQsCi0gICAgICAgICAgICAgICAgICAgIG5ld0F1dGhvcml0eU5hbWUsIC0xIC8qIGlkZW50ICovLCBmYWxzZSAvKiBkb1dyaXRlICovKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LnVzZXJJZCwgbmV3QXV0aG9yaXR5TmFtZSwgLTEgLyogaWRlbnQgKi8sIGZhbHNlIC8qIGRvV3JpdGUgKi8pOwogICAgICAgICAgICAgbmV3QXV0aG9yaXR5LmVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgd3JpdGVOZWVkZWQgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChBdXRob3JpdHlJbmZvIGF1dGhvcml0eUluZm8gOiBhdXRob3JpdGllc1RvUmVtb3ZlKSB7Ci0gICAgICAgICAgICByZW1vdmVBdXRob3JpdHlMb2NrZWQoYXV0aG9yaXR5SW5mby5hY2NvdW50LCBhdXRob3JpdHlJbmZvLmF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZG9Xcml0ZSAqLyk7CisgICAgICAgICAgICByZW1vdmVBdXRob3JpdHlMb2NrZWQoYXV0aG9yaXR5SW5mby5hY2NvdW50LCBhdXRob3JpdHlJbmZvLnVzZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5SW5mby5hdXRob3JpdHksIGZhbHNlIC8qIGRvV3JpdGUgKi8pOwogICAgICAgICAgICAgd3JpdGVOZWVkZWQgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHdyaXRlTmVlZGVkOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBwYXJzZUxpc3RlbkZvclRpY2tsZXMoWG1sUHVsbFBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgU3RyaW5nIHVzZXIgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgWE1MX0FUVFJfVVNFUik7CisgICAgICAgIGludCB1c2VySWQgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXNlcklkID0gSW50ZWdlci5wYXJzZUludCh1c2VyKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy5lKFRBRywgImVycm9yIHBhcnNpbmcgdGhlIHVzZXIgZm9yIGxpc3Rlbi1mb3ItdGlja2xlcyIsIGUpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJ0aGUgdXNlciBpbiBsaXN0ZW4tZm9yLXRpY2tsZXMgaXMgbnVsbCIsIGUpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBlbmFibGVkID0gcGFyc2VyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIFhNTF9BVFRSX0VOQUJMRUQpOworICAgICAgICBib29sZWFuIGxpc3RlbiA9IGVuYWJsZWQgPT0gbnVsbCB8fCBCb29sZWFuLnBhcnNlQm9vbGVhbihlbmFibGVkKTsKKyAgICAgICAgbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5LnB1dCh1c2VySWQsIGxpc3Rlbik7CisgICAgfQorCiAgICAgcHJpdmF0ZSBBdXRob3JpdHlJbmZvIHBhcnNlQXV0aG9yaXR5KFhtbFB1bGxQYXJzZXIgcGFyc2VyLCBpbnQgdmVyc2lvbikgewogICAgICAgICBBdXRob3JpdHlJbmZvIGF1dGhvcml0eSA9IG51bGw7CiAgICAgICAgIGludCBpZCA9IC0xOwpAQCAtMTU0MywxMCArMTU5MSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChpZCA+PSAwKSB7CiAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXR5TmFtZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiYXV0aG9yaXR5Iik7Ci0gICAgICAgICAgICBTdHJpbmcgZW5hYmxlZCA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAiZW5hYmxlZCIpOworICAgICAgICAgICAgU3RyaW5nIGVuYWJsZWQgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgWE1MX0FUVFJfRU5BQkxFRCk7CiAgICAgICAgICAgICBTdHJpbmcgc3luY2FibGUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgInN5bmNhYmxlIik7CiAgICAgICAgICAgICBTdHJpbmcgYWNjb3VudE5hbWUgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgImFjY291bnQiKTsKICAgICAgICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSA9IHBhcnNlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCAidHlwZSIpOworICAgICAgICAgICAgU3RyaW5nIHVzZXIgPSBwYXJzZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgWE1MX0FUVFJfVVNFUik7CisgICAgICAgICAgICBpbnQgdXNlcklkID0gdXNlciA9PSBudWxsID8gMCA6IEludGVnZXIucGFyc2VJbnQodXNlcik7CiAgICAgICAgICAgICBpZiAoYWNjb3VudFR5cGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGFjY291bnRUeXBlID0gImNvbS5nb29nbGUiOwogICAgICAgICAgICAgICAgIHN5bmNhYmxlID0gInVua25vd24iOwpAQCAtMTU1NCwxMiArMTYwNCwxMyBAQAogICAgICAgICAgICAgYXV0aG9yaXR5ID0gbUF1dGhvcml0aWVzLmdldChpZCk7CiAgICAgICAgICAgICBpZiAoREVCVUdfRklMRSkgTG9nLnYoVEFHLCAiQWRkaW5nIGF1dGhvcml0eTogYWNjb3VudD0iCiAgICAgICAgICAgICAgICAgICAgICsgYWNjb3VudE5hbWUgKyAiIGF1dGg9IiArIGF1dGhvcml0eU5hbWUKKyAgICAgICAgICAgICAgICAgICAgKyAiIHVzZXI9IiArIHVzZXJJZAogICAgICAgICAgICAgICAgICAgICArICIgZW5hYmxlZD0iICsgZW5hYmxlZAogICAgICAgICAgICAgICAgICAgICArICIgc3luY2FibGU9IiArIHN5bmNhYmxlKTsKICAgICAgICAgICAgIGlmIChhdXRob3JpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChERUJVR19GSUxFKSBMb2cudihUQUcsICJDcmVhdGluZyBlbnRyeSIpOwogICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IGdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnQoYWNjb3VudE5hbWUsIGFjY291bnRUeXBlKSwgYXV0aG9yaXR5TmFtZSwgaWQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50KGFjY291bnROYW1lLCBhY2NvdW50VHlwZSksIHVzZXJJZCwgYXV0aG9yaXR5TmFtZSwgaWQsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmVyc2lvbiBpcyAwIHRoZW4gd2UgYXJlIHVwZ3JhZGluZyBmcm9tIGEgZmlsZSBmb3JtYXQgdGhhdCBkaWQgbm90CiAgICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBwZXJpb2RpYyBzeW5jcy4gSW4gdGhhdCBjYXNlIGRvbid0IGNsZWFyIHRoZSBsaXN0IHNpbmNlIHdlCiAgICAgICAgICAgICAgICAgLy8gd2FudCB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgYSBkYWlseSBwZXJpb2Rpb2Mgc3luYy4KQEAgLTE2NTMsOSArMTcwNCwxNyBAQAogCiAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgImFjY291bnRzIik7CiAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJ2ZXJzaW9uIiwgSW50ZWdlci50b1N0cmluZyhBQ0NPVU5UU19WRVJTSU9OKSk7Ci0gICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJuZXh0QXV0aG9yaXR5SWQiLCBJbnRlZ2VyLnRvU3RyaW5nKG1OZXh0QXV0aG9yaXR5SWQpKTsKLSAgICAgICAgICAgIGlmICghbU1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KSB7Ci0gICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAibGlzdGVuLWZvci10aWNrbGVzIiwgImZhbHNlIik7CisgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIFhNTF9BVFRSX05FWFRfQVVUSE9SSVRZX0lELCBJbnRlZ2VyLnRvU3RyaW5nKG1OZXh0QXV0aG9yaXR5SWQpKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGhlIFN5bmMgQXV0b21hdGljYWxseSBmbGFncyBmb3IgZWFjaCB1c2VyCisgICAgICAgICAgICBmaW5hbCBpbnQgTSA9IG1NYXN0ZXJTeW5jQXV0b21hdGljYWxseS5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IE07IG0rKykgeworICAgICAgICAgICAgICAgIGludCB1c2VySWQgPSBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkua2V5QXQobSk7CisgICAgICAgICAgICAgICAgQm9vbGVhbiBsaXN0ZW4gPSBtTWFzdGVyU3luY0F1dG9tYXRpY2FsbHkudmFsdWVBdChtKTsKKyAgICAgICAgICAgICAgICBvdXQuc3RhcnRUYWcobnVsbCwgWE1MX1RBR19MSVNURU5fRk9SX1RJQ0tMRVMpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgWE1MX0FUVFJfVVNFUiwgSW50ZWdlci50b1N0cmluZyh1c2VySWQpKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIFhNTF9BVFRSX0VOQUJMRUQsIEJvb2xlYW4udG9TdHJpbmcobGlzdGVuKSk7CisgICAgICAgICAgICAgICAgb3V0LmVuZFRhZyhudWxsLCBYTUxfVEFHX0xJU1RFTl9GT1JfVElDS0xFUyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZpbmFsIGludCBOID0gbUF1dGhvcml0aWVzLnNpemUoKTsKQEAgLTE2NjQsOSArMTcyMywxMCBAQAogICAgICAgICAgICAgICAgIG91dC5zdGFydFRhZyhudWxsLCAiYXV0aG9yaXR5Iik7CiAgICAgICAgICAgICAgICAgb3V0LmF0dHJpYnV0ZShudWxsLCAiaWQiLCBJbnRlZ2VyLnRvU3RyaW5nKGF1dGhvcml0eS5pZGVudCkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgImFjY291bnQiLCBhdXRob3JpdHkuYWNjb3VudC5uYW1lKTsKKyAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsIFhNTF9BVFRSX1VTRVIsIEludGVnZXIudG9TdHJpbmcoYXV0aG9yaXR5LnVzZXJJZCkpOwogICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInR5cGUiLCBhdXRob3JpdHkuYWNjb3VudC50eXBlKTsKICAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJhdXRob3JpdHkiLCBhdXRob3JpdHkuYXV0aG9yaXR5KTsKLSAgICAgICAgICAgICAgICBvdXQuYXR0cmlidXRlKG51bGwsICJlbmFibGVkIiwgQm9vbGVhbi50b1N0cmluZyhhdXRob3JpdHkuZW5hYmxlZCkpOworICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgWE1MX0FUVFJfRU5BQkxFRCwgQm9vbGVhbi50b1N0cmluZyhhdXRob3JpdHkuZW5hYmxlZCkpOwogICAgICAgICAgICAgICAgIGlmIChhdXRob3JpdHkuc3luY2FibGUgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG91dC5hdHRyaWJ1dGUobnVsbCwgInN5bmNhYmxlIiwgInVua25vd24iKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTc4OCw3ICsxODQ4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhvcml0eU5hbWUgPSBjLmdldFN0cmluZyhjLmdldENvbHVtbkluZGV4KCJhdXRob3JpdHkiKSk7CiAgICAgICAgICAgICAgICAgQXV0aG9yaXR5SW5mbyBhdXRob3JpdHkgPSB0aGlzLmdldE9yQ3JlYXRlQXV0aG9yaXR5TG9ja2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnQoYWNjb3VudE5hbWUsIGFjY291bnRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50KGFjY291bnROYW1lLCBhY2NvdW50VHlwZSksIDAgLyogbGVnYWN5IGlzIHNpbmdsZS11c2VyICovLAogICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5TmFtZSwgLTEsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBtU3luY1N0YXR1cy5zaXplKCk7CkBAIC0xODMzLDcgKzE4OTMsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGMuZ2V0U3RyaW5nKGMuZ2V0Q29sdW1uSW5kZXgoInZhbHVlIikpOwogICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygibGlzdGVuX2Zvcl90aWNrbGVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkodmFsdWUgPT0gbnVsbCB8fCBCb29sZWFuLnBhcnNlQm9vbGVhbih2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICBzZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSh2YWx1ZSA9PSBudWxsIHx8IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlKSwgMCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoInN5bmNfcHJvdmlkZXJfIikpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyID0gbmFtZS5zdWJzdHJpbmcoInN5bmNfcHJvdmlkZXJfIi5sZW5ndGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCgpKTsKQEAgLTE5NjQsNyArMjAyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgUGVuZGluZ09wZXJhdGlvbiBvcCA9IG5ldyBQZW5kaW5nT3BlcmF0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS5hY2NvdW50LCBzeW5jU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS5hY2NvdW50LCBhdXRob3JpdHkudXNlcklkLCBzeW5jU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eS5hdXRob3JpdHksIGV4dHJhcywgZXhwZWRpdGVkKTsKICAgICAgICAgICAgICAgICAgICAgb3AuYXV0aG9yaXR5SWQgPSBhdXRob3JpdHlJZDsKICAgICAgICAgICAgICAgICAgICAgb3AuZmxhdEV4dHJhcyA9IGZsYXRFeHRyYXM7CkBAIC0yMDg0LDYgKzIxNDQsMTkgQEAKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgcmVxdWVzdFN5bmMoQWNjb3VudCBhY2NvdW50LCBpbnQgdXNlcklkLCBTdHJpbmcgYXV0aG9yaXR5LCBCdW5kbGUgZXh0cmFzKSB7CisgICAgICAgIC8vIElmIHRoaXMgaXMgaGFwcGVuaW5nIGluIHRoZSBzeXN0ZW0gcHJvY2VzcywgdGhlbiBjYWxsIHRoZSBzeW5jcmVxdWVzdCBsaXN0ZW5lcgorICAgICAgICAvLyB0byBtYWtlIGEgcmVxdWVzdCBiYWNrIHRvIHRoZSBTeW5jTWFuYWdlciBkaXJlY3RseS4KKyAgICAgICAgLy8gSWYgdGhpcyBpcyBwcm9iYWJseSBhIHRlc3QgaW5zdGFuY2UsIHRoZW4gY2FsbCBiYWNrIHRocm91Z2ggdGhlIENvbnRlbnRSZXNvbHZlcgorICAgICAgICAvLyB3aGljaCB3aWxsIGtub3cgd2hpY2ggdXNlcklkIHRvIGFwcGx5IGJhc2VkIG9uIHRoZSBCaW5kZXIgaWQuCisgICAgICAgIGlmIChhbmRyb2lkLm9zLlByb2Nlc3MubXlVaWQoKSA9PSBhbmRyb2lkLm9zLlByb2Nlc3MuU1lTVEVNX1VJRAorICAgICAgICAgICAgICAgICYmIG1TeW5jUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TeW5jUmVxdWVzdExpc3RlbmVyLm9uU3luY1JlcXVlc3QoYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHksIGV4dHJhcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb250ZW50UmVzb2x2ZXIucmVxdWVzdFN5bmMoYWNjb3VudCwgYXV0aG9yaXR5LCBleHRyYXMpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElTVElDU19GSUxFX0VORCA9IDA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVElTVElDU19GSUxFX0lURU1fT0xEID0gMTAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRJU1RJQ1NfRklMRV9JVEVNID0gMTAxOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YQppbmRleCBjY2EyMDhhLi41NzNlNmVhIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9oYXJkd2FyZS9DYW1lcmEuamF2YQpAQCAtMzYsNyArMzYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKLQogLyoqCiAgKiBUaGUgQ2FtZXJhIGNsYXNzIGlzIHVzZWQgdG8gc2V0IGltYWdlIGNhcHR1cmUgc2V0dGluZ3MsIHN0YXJ0L3N0b3AgcHJldmlldywKICAqIHNuYXAgcGljdHVyZXMsIGFuZCByZXRyaWV2ZSBmcmFtZXMgZm9yIGVuY29kaW5nIGZvciB2aWRlby4gIFRoaXMgY2xhc3MgaXMgYQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhU291bmQuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYVNvdW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOTdmZjA5Li4wMDAwMDAwCi0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2hhcmR3YXJlL0NhbWVyYVNvdW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIDxwPlVzZSB0aGlzIGNsYXNzIHRvIHBsYXkgYW4gYXBwcm9wcmlhdGUgc291bmQgd2hlbiBpbXBsZW1lbnRpbmcgYSBjdXN0b20KLSAqIHN0aWxsIG9yIHZpZGVvIHJlY29yZGluZyBtZWNoYW5pc20gdGhyb3VnaCB0aGUgcHJldmlldyBjYWxsYmFja3MuPC9wPgotICoKLSAqIDxwPlRoZXJlIGlzIG5vIG5lZWQgdG8gcGxheSBzb3VuZHMgd2hlbiB1c2luZyB7QGxpbmsgI2FuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhI3Rha2VQaWN0dXJlfQotICogb3Ige0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcn0gZm9yIHN0aWxsIGltYWdlcyBvciB2aWRlbywKLSAqIHJlc3BlY3RpdmVseSwgYXMgdGhlc2UgcGxheSB0aGVpciBvd24gc291bmRzIHdoZW4gbmVlZGVkLjwvcD4KLSAqCi0gKiBAaGlkZQotICovCi1wdWJsaWMgY2xhc3MgQ2FtZXJhU291bmQgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2FtZXJhU291bmQiOwotICAgIC8qKgotICAgICAqIFRoZSBzb3VuZCB1c2VkIGJ5IHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSN0YWtlUGljdHVyZX0gdG8KLSAgICAgKiBpbmRpY2F0ZSBzdGlsbCBpbWFnZSBjYXB0dXJlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIVVRURVJfQ0xJQ0sgICAgICAgICA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBBIHNvdW5kIHRvIGluZGljYXRlIHRoYXQgZm9jdXNpbmcgaGFzIGNvbXBsZXRlZC4gQmVjYXVzZSBkZWNpZGluZwotICAgICAqIHdoZW4gdGhpcyBvY2N1cnMgaXMgYXBwbGljYXRpb24tZGVwZW5kZW50LCB0aGlzIHNvdW5kIGlzIG5vdCB1c2VkIGJ5Ci0gICAgICogYW55IG1ldGhvZHMgaW4gdGhlIENhbWVyYSBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT0NVU19DT01QTEVURSAgICAgICAgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIHNvdW5kIHVzZWQgYnkge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciNzdGFydH0gdG8KLSAgICAgKiBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgdmlkZW8gcmVjb3JkaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1ZJREVPX1JFQ09SRElORyA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgc291bmQgdXNlZCBieSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyI3N0b3B9IHRvCi0gICAgICogaW5kaWNhdGUgdGhlIGVuZCBvZiB2aWRlbyByZWNvcmRpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUF9WSURFT19SRUNPUkRJTkcgID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fU09VTkRTICAgICAgICAgICA9IDQ7Ci0gICAgcHJpdmF0ZSBDYW1lcmFTb3VuZFBsYXllcltdIG1DYW1lcmFTb3VuZFBsYXllcnM7Ci0KLSAgICBwdWJsaWMgQ2FtZXJhU291bmQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogPHA+UGxheSBvbmUgb2YgdGhlIHByZWRlZmluZWQgcGxhdGZvcm0gc291bmRzIGZvciBjYW1lcmEgYWN0aW9ucy48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Vc2UgdGhpcyBtZXRob2QgdG8gcGxheSBhIHBsYXRmb3JtLXNwZWNpZmljIHNvdW5kIGZvciB2YXJpb3VzIGNhbWVyYQotICAgICAqIGFjdGlvbnMuIFRoZSBzb3VuZCBwbGF5aW5nIGlzIGRvbmUgYXN5bmNocm9ub3VzbHksIHdpdGggdGhlIHNhbWUgYmVoYXZpb3IKLSAgICAgKiBhbmQgY29udGVudCBhcyB0aGUgc291bmRzIHBsYXllZCBieSB7QGxpbmsgI3Rha2VQaWN0dXJlIHRha2VQaWN0dXJlfSwKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyI3N0YXJ0IE1lZGlhUmVjb3JkZXIuc3RhcnR9LCBhbmQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyI3N0b3AgTWVkaWFSZWNvcmRlci5zdG9wfS48L3A+Ci0gICAgICoKLSAgICAgKiA8cD5Vc2luZyB0aGlzIG1ldGhvZCBtYWtlcyBpdCBlYXN5IHRvIG1hdGNoIHRoZSBkZWZhdWx0IGRldmljZSBzb3VuZHMKLSAgICAgKiB3aGVuIHJlY29yZGluZyBvciBjYXB0dXJpbmcgZGF0YSB0aHJvdWdoIHRoZSBwcmV2aWV3IGNhbGxiYWNrcy48L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc291bmRJZCBUaGUgdHlwZSBvZiBzb3VuZCB0byBwbGF5LCBzZWxlY3RlZCBmcm9tIFNIVVRURVJfQ0xJQ0ssCi0gICAgICogICAgICAgICBGT0NVU19DT01QTEVURSwgU1RBUlRfVklERU9fUkVDT1JESU5HLCBvciBTVE9QX1ZJREVPX1JFQ09SRElORy4KLSAgICAgKiBAc2VlIGFuZHJvaWQuaGFyZHdhcmUjdGFrZVBpY3R1cmUKLSAgICAgKiBAc2VlIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcgotICAgICAqIEBzZWUgI1NIVVRURVJfQ0xJQ0sKLSAgICAgKiBAc2VlICNGT0NVU19DT01QTEVURQotICAgICAqIEBzZWUgI1NUQVJUX1ZJREVPX1JFQ09SRElORwotICAgICAqIEBzZWUgI1NUT1BfVklERU9fUkVDT1JESU5HCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGxheVNvdW5kKGludCBzb3VuZElkKSB7Ci0gICAgICAgIGlmIChtQ2FtZXJhU291bmRQbGF5ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1DYW1lcmFTb3VuZFBsYXllcnMgPSBuZXcgQ2FtZXJhU291bmRQbGF5ZXJbTlVNX1NPVU5EU107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DYW1lcmFTb3VuZFBsYXllcnNbc291bmRJZF0gPT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbWVyYVNvdW5kUGxheWVyc1tzb3VuZElkXSA9IG5ldyBDYW1lcmFTb3VuZFBsYXllcihzb3VuZElkKTsKLSAgICAgICAgfQotICAgICAgICBtQ2FtZXJhU291bmRQbGF5ZXJzW3NvdW5kSWRdLnBsYXkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBpZiAobUNhbWVyYVNvdW5kUGxheWVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKENhbWVyYVNvdW5kUGxheWVyIGNzcDogbUNhbWVyYVNvdW5kUGxheWVycykgewotICAgICAgICAgICAgICAgIGlmIChjc3AgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjc3AucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYW1lcmFTb3VuZFBsYXllcnMgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FtZXJhU291bmRQbGF5ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Tb3VuZElkOwotICAgICAgICBwcml2YXRlIE1lZGlhUGxheWVyIG1QbGF5ZXI7Ci0gICAgICAgIHByaXZhdGUgVGhyZWFkIG1UaHJlYWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRXhpdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXlDb3VudDsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbVNodXR0ZXJTb3VuZCAgICA9Ci0gICAgICAgICAgICAgICAgIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtRm9jdXNTb3VuZCAgICAgID0KLSAgICAgICAgICAgICAgICAiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9jYW1lcmFfZm9jdXMub2dnIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1WaWRlb1N0YXJ0U291bmQgPQotICAgICAgICAgICAgICAgICIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtVmlkZW9TdG9wU291bmQgID0KLSAgICAgICAgICAgICAgICAiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc291bmRGaWxlUGF0aDsKLSAgICAgICAgICAgIHN3aXRjaCAobVNvdW5kSWQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNIVVRURVJfQ0xJQ0s6Ci0gICAgICAgICAgICAgICAgICAgIHNvdW5kRmlsZVBhdGggPSBtU2h1dHRlclNvdW5kOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEZPQ1VTX0NPTVBMRVRFOgotICAgICAgICAgICAgICAgICAgICBzb3VuZEZpbGVQYXRoID0gbUZvY3VzU291bmQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVklERU9fUkVDT1JESU5HOgotICAgICAgICAgICAgICAgICAgICBzb3VuZEZpbGVQYXRoID0gbVZpZGVvU3RhcnRTb3VuZDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1ZJREVPX1JFQ09SRElORzoKLSAgICAgICAgICAgICAgICAgICAgc291bmRGaWxlUGF0aCA9IG1WaWRlb1N0b3BTb3VuZDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5rbm93biBzb3VuZCAiICsgbVNvdW5kSWQgKyAiIHJlcXVlc3RlZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllciA9IG5ldyBNZWRpYVBsYXllcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtUGxheWVyLnNldEF1ZGlvU3RyZWFtVHlwZShBdWRpb01hbmFnZXIuU1RSRUFNX1NZU1RFTV9FTkZPUkNFRCk7Ci0gICAgICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKHNvdW5kRmlsZVBhdGgpOwotICAgICAgICAgICAgICAgIG1QbGF5ZXIuc2V0TG9vcGluZyhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVBsYXllci5wcmVwYXJlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBzZXR0aW5nIHVwIHNvdW5kICIgKyBtU291bmRJZCwgZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FeGl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1QbGF5Q291bnQgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlDb3VudC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVBsYXllci5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkVycm9yIHBsYXlpbmcgc291bmQgIiArIG1Tb3VuZElkLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2FtZXJhU291bmRQbGF5ZXIoaW50IHNvdW5kSWQpIHsKLSAgICAgICAgICAgIG1Tb3VuZElkID0gc291bmRJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7Ci0gICAgICAgICAgICBpZiAobVRocmVhZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVRocmVhZCA9IG5ldyBUaHJlYWQodGhpcyk7Ci0gICAgICAgICAgICAgICAgbVRocmVhZC5zdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlDb3VudCsrOwotICAgICAgICAgICAgICAgIG5vdGlmeUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgICAgIGlmIChtVGhyZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUV4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbVRocmVhZC5qb2luKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVGhyZWFkID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGxheWVyLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKLSAgICAgICAgICAgIHJlbGVhc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9uZXQvaHR0cC9DZXJ0aWZpY2F0ZUNoYWluVmFsaWRhdG9yLmphdmEKaW5kZXggMDZjNmM2ZS4uNmFkOGZlMyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvbmV0L2h0dHAvQ2VydGlmaWNhdGVDaGFpblZhbGlkYXRvci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9odHRwL0NlcnRpZmljYXRlQ2hhaW5WYWxpZGF0b3IuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogCiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5TWFuYWdlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CkBAIC0xMjgsMTAgKzEzMCwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVUcnVzdFN0b3JhZ2VVcGRhdGUoKSB7CiAKLSAgICAgICAgWDUwOVRydXN0TWFuYWdlciB4NTA5VHJ1c3RNYW5hZ2VyID0gU1NMUGFyYW1ldGVyc0ltcGwuZ2V0RGVmYXVsdFRydXN0TWFuYWdlcigpOwotICAgICAgICBpZiggeDUwOVRydXN0TWFuYWdlciBpbnN0YW5jZW9mIFRydXN0TWFuYWdlckltcGwgKSB7Ci0gICAgICAgICAgICBUcnVzdE1hbmFnZXJJbXBsIHRydXN0TWFuYWdlciA9IChUcnVzdE1hbmFnZXJJbXBsKSB4NTA5VHJ1c3RNYW5hZ2VyOwotICAgICAgICAgICAgdHJ1c3RNYW5hZ2VyLmhhbmRsZVRydXN0U3RvcmFnZVVwZGF0ZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgWDUwOVRydXN0TWFuYWdlciB4NTA5VHJ1c3RNYW5hZ2VyID0gU1NMUGFyYW1ldGVyc0ltcGwuZ2V0RGVmYXVsdFRydXN0TWFuYWdlcigpOworICAgICAgICAgICAgaWYoIHg1MDlUcnVzdE1hbmFnZXIgaW5zdGFuY2VvZiBUcnVzdE1hbmFnZXJJbXBsICkgeworICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckltcGwgdHJ1c3RNYW5hZ2VyID0gKFRydXN0TWFuYWdlckltcGwpIHg1MDlUcnVzdE1hbmFnZXI7CisgICAgICAgICAgICAgICAgdHJ1c3RNYW5hZ2VyLmhhbmRsZVRydXN0U3RvcmFnZVVwZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIGlnbm9yZWQpIHsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY1LDcgKzE3MCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTU0xQYXJhbWV0ZXJzSW1wbC5nZXREZWZhdWx0VHJ1c3RNYW5hZ2VyKCkuY2hlY2tTZXJ2ZXJUcnVzdGVkKGNoYWluLCBhdXRoVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIE5vIGVycm9ycy4KLSAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKEh0dHBMb2cuTE9HVikgewogICAgICAgICAgICAgICAgIEh0dHBMb2cudigiZmFpbGVkIHRvIHZhbGlkYXRlIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbiwgZXJyb3I6ICIgKwogICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9GaWxlVXRpbHMuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhCmluZGV4IDIxNWU4MzYuLjZjMTQ0NWQgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL29zL0ZpbGVVdGlscy5qYXZhCkBAIC0yOCw2ICsyOCw4IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNoZWNrZWRJbnB1dFN0cmVhbTsKIAoraW1wb3J0IGxpYmNvcmUuaW8uT3M7CitpbXBvcnQgbGliY29yZS5pby5TdHJ1Y3RTdGF0OwogCiAvKioKICAqIFRvb2xzIGZvciBtYW5hZ2luZyBmaWxlcy4gIE5vdCBmb3IgcHVibGljIGNvbnN1bXB0aW9uLgpAQCAtNTIsOCArNTQsMTAgQEAKICAgICAKICAgICAvKioKICAgICAgKiBGaWxlIHN0YXR1cyBpbmZvcm1hdGlvbi4gVGhpcyBjbGFzcyBtYXBzIGRpcmVjdGx5IHRvIHRoZSBQT1NJWCBzdGF0IHN0cnVjdHVyZS4KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIFN0cnVjdFN0YXR9IGluc3RlYWQuCiAgICAgICogQGhpZGUKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZVN0YXR1cyB7CiAgICAgICAgIHB1YmxpYyBpbnQgZGV2OwogICAgICAgICBwdWJsaWMgaW50IGlubzsKQEAgLTc3LDcgKzgxLDkgQEAKICAgICAgKiBleGlzdHMuIAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGZhbHNlIGlmIGl0IGRvZXMgbm90IGV4aXN0LiBJZiB5b3UgZG8gbm90IGhhdmUgCiAgICAgICogcGVybWlzc2lvbiB0byBzdGF0IHRoZSBmaWxlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGZhbHNlLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgT3Mjc3RhdChTdHJpbmcpfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldEZpbGVTdGF0dXMoU3RyaW5nIHBhdGgsIEZpbGVTdGF0dXMgc3RhdHVzKSB7CiAgICAgICAgIFN0cmljdE1vZGUubm90ZURpc2tSZWFkKCk7CiAgICAgICAgIHJldHVybiBnZXRGaWxlU3RhdHVzTmF0aXZlKHBhdGgsIHN0YXR1cyk7CkBAIC05MCw2ICs5NiwxMCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldFBlcm1pc3Npb25zKFN0cmluZyBmaWxlLCBpbnQgbW9kZSwgaW50IHVpZCwgaW50IGdpZCk7CiAKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIE9zI3N0YXQoU3RyaW5nKX0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIGludCBnZXRQZXJtaXNzaW9ucyhTdHJpbmcgZmlsZSwgaW50W10gb3V0UGVybWlzc2lvbnMpOwogCiAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgaW50IHNldFVNYXNrKGludCBtYXNrKTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQppbmRleCBhMGFkOWMwLi43NTliZTkxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCkBAIC0xMDksNyArMTA5LDcgQEAKICAqIGVmZm9ydCBtZWNoYW5pc20uICBOb3RhYmx5LCBkaXNrIG9yIG5ldHdvcmsgYWNjZXNzIGZyb20gSk5JIGNhbGxzCiAgKiB3b24ndCBuZWNlc3NhcmlseSB0cmlnZ2VyIGl0LiAgRnV0dXJlIHZlcnNpb25zIG9mIEFuZHJvaWQgbWF5IGNhdGNoCiAgKiBtb3JlIChvciBmZXdlcikgb3BlcmF0aW9ucywgc28geW91IHNob3VsZCBuZXZlciBsZWF2ZSBTdHJpY3RNb2RlCi0gKiBlbmFibGVkIGluIHNoaXBwaW5nIGFwcGxpY2F0aW9ucyBvbiB0aGUgQW5kcm9pZCBNYXJrZXQuCisgKiBlbmFibGVkIGluIGFwcGxpY2F0aW9ucyBkaXN0cmlidXRlZCBvbiBHb29nbGUgUGxheS4KICAqLwogcHVibGljIGZpbmFsIGNsYXNzIFN0cmljdE1vZGUgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3RyaWN0TW9kZSI7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YQppbmRleCBiNDI0MTdhLi5iYzY1OTRiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEKQEAgLTI2NDQsMTAgKzI2NDQsMTAgQEAKIAogICAgICAgICAvKioKICAgICAgICAgICogV2hldGhlciB0aGUgcGFja2FnZSBpbnN0YWxsZXIgc2hvdWxkIGFsbG93IGluc3RhbGxhdGlvbiBvZiBhcHBzIGRvd25sb2FkZWQgZnJvbQotICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gdGhlIEFuZHJvaWQgTWFya2V0ICh2ZW5kaW5nIG1hY2hpbmUpLgorICAgICAgICAgKiBzb3VyY2VzIG90aGVyIHRoYW4gR29vZ2xlIFBsYXkuCiAgICAgICAgICAqCiAgICAgICAgICAqIDEgPSBhbGxvdyBpbnN0YWxsaW5nIGZyb20gb3RoZXIgc291cmNlcwotICAgICAgICAgKiAwID0gb25seSBhbGxvdyBpbnN0YWxsaW5nIGZyb20gdGhlIEFuZHJvaWQgTWFya2V0CisgICAgICAgICAqIDAgPSBvbmx5IGFsbG93IGluc3RhbGxpbmcgZnJvbSBHb29nbGUgUGxheQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9OT05fTUFSS0VUX0FQUFMgPSAiaW5zdGFsbF9ub25fbWFya2V0X2FwcHMiOwogCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0Nob3Jlb2dyYXBoZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQ2hvcmVvZ3JhcGhlci5qYXZhCmluZGV4IGY0ZDdhZjkuLjEwZWRjMDYgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQ2hvcmVvZ3JhcGhlci5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvQ2hvcmVvZ3JhcGhlci5qYXZhCkBAIC04MSw4ICs4MSw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ET19BTklNQVRJT04gPSAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfRE9fRFJBVyA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ET19TQ0hFRFVMRV9WU1lOQyA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19QT1NUX0RFTEFZRURfQU5JTUFUSU9OID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BPU1RfREVMQVlFRF9EUkFXID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RPX1NDSEVEVUxFX0FOSU1BVElPTiA9IDM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19ET19TQ0hFRFVMRV9EUkFXID0gNDsKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwogCkBAIC0xNTIsMTM0ICsxNTIsMTU4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU3VidHJhY3RzIHR5cGljYWwgZnJhbWUgZGVsYXkgdGltZSBmcm9tIGEgZGVsYXkgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29tcGVuc2F0ZSBmb3IgYW5pbWF0aW9uIGRlbGF5IHRpbWVzIHRoYXQgaGF2ZSBiYWtlZAorICAgICAqIGluIGFzc3VtcHRpb25zIGFib3V0IHRoZSBmcmFtZSBkZWxheS4gIEZvciBleGFtcGxlLCBpdCdzIHF1aXRlIGNvbW1vbiBmb3IgY29kZSB0bworICAgICAqIGFzc3VtZSBhIDYwSHogZnJhbWUgdGltZSBhbmQgYmFrZSBpbiBhIDE2bXMgZGVsYXkuICBXaGVuIHdlIGNhbGwKKyAgICAgKiB7QGxpbmsgI3Bvc3RBbmltYXRpb25DYWxsYmFja0RlbGF5ZWR9IHdlIHdhbnQgdG8ga25vdyBob3cgbG9uZyB0byB3YWl0IGJlZm9yZQorICAgICAqIHBvc3RpbmcgdGhlIGFuaW1hdGlvbiBjYWxsYmFjayBidXQgbGV0IHRoZSBhbmltYXRpb24gdGltZXIgdGFrZSBjYXJlIG9mIHRoZSByZW1haW5pbmcKKyAgICAgKiBmcmFtZSBkZWxheSB0aW1lLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgc29tZXdoYXQgY29uc2VydmF0aXZlIGFib3V0IGhvdyBtdWNoIG9mIHRoZSBmcmFtZSBkZWxheSBpdAorICAgICAqIHN1YnRyYWN0cy4gIEl0IHVzZXMgdGhlIHNhbWUgdmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRGcmFtZURlbGF5fSB3aGljaCBieQorICAgICAqIGRlZmF1bHQgaXMgMTBtcyBldmVuIHRob3VnaCBtYW55IHBhcnRzIG9mIHRoZSBzeXN0ZW0gYXNzdW1lIDE2bXMuICBDb25zZXF1ZW50bHksCisgICAgICogd2UgbWlnaHQgc3RpbGwgd2FpdCA2bXMgYmVmb3JlIHBvc3RpbmcgYW4gYW5pbWF0aW9uIGNhbGxiYWNrIHRoYXQgd2Ugd2FudCB0byBydW4KKyAgICAgKiBvbiB0aGUgbmV4dCBmcmFtZSwgYnV0IHRoaXMgaXMgbXVjaCBiZXR0ZXIgdGhhbiB3YWl0aW5nIGEgd2hvbGUgMTZtcyBhbmQgbGlrZWx5CisgICAgICogbWlzc2luZyB0aGUgZGVhZGxpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVsYXlNaWxsaXMgVGhlIG9yaWdpbmFsIGRlbGF5IHRpbWUgaW5jbHVkaW5nIGFuIGFzc3VtZWQgZnJhbWUgZGVsYXkuCisgICAgICogQHJldHVybiBUaGUgYWRqdXN0ZWQgZGVsYXkgdGltZSB3aXRoIHRoZSBhc3N1bWVkIGZyYW1lIGRlbGF5IHN1YnRyYWN0ZWQgb3V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBzdWJ0cmFjdEZyYW1lRGVsYXkobG9uZyBkZWxheU1pbGxpcykgeworICAgICAgICBmaW5hbCBsb25nIGZyYW1lRGVsYXkgPSBzRnJhbWVEZWxheTsKKyAgICAgICAgcmV0dXJuIGRlbGF5TWlsbGlzIDw9IGZyYW1lRGVsYXkgPyAwIDogZGVsYXlNaWxsaXMgLSBmcmFtZURlbGF5OworICAgIH0KKworICAgIC8qKgogICAgICAqIFBvc3RzIGEgY2FsbGJhY2sgdG8gcnVuIG9uIHRoZSBuZXh0IGFuaW1hdGlvbiBjeWNsZS4KICAgICAgKiBUaGUgY2FsbGJhY2sgb25seSBydW5zIG9uY2UgYW5kIHRoZW4gaXMgYXV0b21hdGljYWxseSByZW1vdmVkLgogICAgICAqCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlIFRoZSBjYWxsYmFjayB0byBydW4gZHVyaW5nIHRoZSBuZXh0IGFuaW1hdGlvbiBjeWNsZS4KKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBjYWxsYmFjayBhY3Rpb24gdG8gcnVuIGR1cmluZyB0aGUgbmV4dCBhbmltYXRpb24gY3ljbGUuCisgICAgICogQHBhcmFtIHRva2VuIFRoZSBjYWxsYmFjayB0b2tlbiwgb3IgbnVsbCBpZiBub25lLgogICAgICAqCiAgICAgICogQHNlZSAjcmVtb3ZlQW5pbWF0aW9uQ2FsbGJhY2sKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3N0QW5pbWF0aW9uQ2FsbGJhY2soUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgaWYgKHJ1bm5hYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJ1bm5hYmxlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBwb3N0QW5pbWF0aW9uQ2FsbGJhY2tVbmNoZWNrZWQocnVubmFibGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3N0QW5pbWF0aW9uQ2FsbGJhY2tVbmNoZWNrZWQoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUFuaW1hdGlvbkNhbGxiYWNrcyA9IGFkZENhbGxiYWNrTG9ja2VkKG1BbmltYXRpb25DYWxsYmFja3MsIHJ1bm5hYmxlKTsKLSAgICAgICAgICAgIHNjaGVkdWxlQW5pbWF0aW9uTG9ja2VkKCk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBwb3N0QW5pbWF0aW9uQ2FsbGJhY2soUnVubmFibGUgYWN0aW9uLCBPYmplY3QgdG9rZW4pIHsKKyAgICAgICAgcG9zdEFuaW1hdGlvbkNhbGxiYWNrRGVsYXllZChhY3Rpb24sIHRva2VuLCAwKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBQb3N0cyBhIGNhbGxiYWNrIHRvIHJ1biBvbiB0aGUgbmV4dCBhbmltYXRpb24gY3ljbGUgZm9sbG93aW5nIHRoZSBzcGVjaWZpZWQgZGVsYXkuCiAgICAgICogVGhlIGNhbGxiYWNrIG9ubHkgcnVucyBvbmNlIGFuZCB0aGVuIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBydW5uYWJsZSBUaGUgY2FsbGJhY2sgdG8gcnVuIGR1cmluZyB0aGUgbmV4dCBhbmltYXRpb24gY3ljbGUgZm9sbG93aW5nCisgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgY2FsbGJhY2sgYWN0aW9uIHRvIHJ1biBkdXJpbmcgdGhlIG5leHQgYW5pbWF0aW9uIGN5Y2xlIGFmdGVyCiAgICAgICogdGhlIHNwZWNpZmllZCBkZWxheS4KKyAgICAgKiBAcGFyYW0gdG9rZW4gVGhlIGNhbGxiYWNrIHRva2VuLCBvciBudWxsIGlmIG5vbmUuCiAgICAgICogQHBhcmFtIGRlbGF5TWlsbGlzIFRoZSBkZWxheSB0aW1lIGluIG1pbGxpc2Vjb25kcy4KICAgICAgKgogICAgICAqIEBzZWUgI3JlbW92ZUFuaW1hdGlvbkNhbGxiYWNrCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdEFuaW1hdGlvbkNhbGxiYWNrRGVsYXllZChSdW5uYWJsZSBydW5uYWJsZSwgbG9uZyBkZWxheU1pbGxpcykgewotICAgICAgICBpZiAocnVubmFibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicnVubmFibGUgbXVzdCBub3QgYmUgbnVsbCIpOworICAgIHB1YmxpYyB2b2lkIHBvc3RBbmltYXRpb25DYWxsYmFja0RlbGF5ZWQoUnVubmFibGUgYWN0aW9uLCBPYmplY3QgdG9rZW4sIGxvbmcgZGVsYXlNaWxsaXMpIHsKKyAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZWxheU1pbGxpcyA8PSAwKSB7Ci0gICAgICAgICAgICBwb3N0QW5pbWF0aW9uQ2FsbGJhY2tVbmNoZWNrZWQocnVubmFibGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19QT1NUX0RFTEFZRURfQU5JTUFUSU9OLCBydW5uYWJsZSk7Ci0gICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZURlbGF5ZWQobXNnLCBkZWxheU1pbGxpcyk7CisKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZHVlVGltZSA9IG5vdyArIGRlbGF5TWlsbGlzOworICAgICAgICAgICAgbUFuaW1hdGlvbkNhbGxiYWNrcyA9IGFkZENhbGxiYWNrTG9ja2VkKG1BbmltYXRpb25DYWxsYmFja3MsIGR1ZVRpbWUsIGFjdGlvbiwgdG9rZW4pOworCisgICAgICAgICAgICBpZiAoZHVlVGltZSA8PSBub3cpIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZUFuaW1hdGlvbkxvY2tlZChub3cpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPX1NDSEVEVUxFX0FOSU1BVElPTiwgYWN0aW9uKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtc2csIGR1ZVRpbWUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbmltYXRpb24gY2FsbGJhY2tzIGZvciB0aGUgc3BlY2lmaWVkIHJ1bm5hYmxlLgotICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgc3BlY2lmaWVkIGFuaW1hdGlvbiBjYWxsYmFjayBoYXMgbm90IGJlZW4gcG9zdGVkIG9yIGhhcyBhbHJlYWR5Ci0gICAgICogYmVlbiByZW1vdmVkLgorICAgICAqIFJlbW92ZXMgYW5pbWF0aW9uIGNhbGxiYWNrcyB0aGF0IGhhdmUgdGhlIHNwZWNpZmllZCBhY3Rpb24gYW5kIHRva2VuLgogICAgICAqCi0gICAgICogQHBhcmFtIHJ1bm5hYmxlIFRoZSBhbmltYXRpb24gY2FsbGJhY2sgdG8gcmVtb3ZlLgorICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGFjdGlvbiBwcm9wZXJ0eSBvZiB0aGUgY2FsbGJhY2tzIHRvIHJlbW92ZSwgb3IgbnVsbCB0byByZW1vdmUKKyAgICAgKiBjYWxsYmFja3Mgd2l0aCBhbnkgYWN0aW9uLgorICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgdG9rZW4gcHJvcGVydHkgb2YgdGhlIGNhbGxiYWNrcyB0byByZW1vdmUsIG9yIG51bGwgdG8gcmVtb3ZlCisgICAgICogY2FsbGJhY2tzIHdpdGggYW55IHRva2VuLgogICAgICAqCiAgICAgICogQHNlZSAjcG9zdEFuaW1hdGlvbkNhbGxiYWNrCiAgICAgICogQHNlZSAjcG9zdEFuaW1hdGlvbkNhbGxiYWNrRGVsYXllZAogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUFuaW1hdGlvbkNhbGxiYWNrcyhSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBpZiAocnVubmFibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicnVubmFibGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgcmVtb3ZlQW5pbWF0aW9uQ2FsbGJhY2tzKFJ1bm5hYmxlIGFjdGlvbiwgT2JqZWN0IHRva2VuKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1BbmltYXRpb25DYWxsYmFja3MgPSByZW1vdmVDYWxsYmFja3NMb2NrZWQobUFuaW1hdGlvbkNhbGxiYWNrcywgcnVubmFibGUpOworICAgICAgICAgICAgbUFuaW1hdGlvbkNhbGxiYWNrcyA9IHJlbW92ZUNhbGxiYWNrc0xvY2tlZChtQW5pbWF0aW9uQ2FsbGJhY2tzLCBhY3Rpb24sIHRva2VuKTsKKyAgICAgICAgICAgIGlmIChhY3Rpb24gIT0gbnVsbCAmJiB0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlTWVzc2FnZXMoTVNHX0RPX1NDSEVEVUxFX0FOSU1BVElPTiwgYWN0aW9uKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfUE9TVF9ERUxBWUVEX0FOSU1BVElPTiwgcnVubmFibGUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFBvc3RzIGEgY2FsbGJhY2sgdG8gcnVuIG9uIHRoZSBuZXh0IGRyYXcgY3ljbGUuCiAgICAgICogVGhlIGNhbGxiYWNrIG9ubHkgcnVucyBvbmNlIGFuZCB0aGVuIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBydW5uYWJsZSBUaGUgY2FsbGJhY2sgdG8gcnVuIGR1cmluZyB0aGUgbmV4dCBkcmF3IGN5Y2xlLgorICAgICAqIEBwYXJhbSBhY3Rpb24gVGhlIGNhbGxiYWNrIGFjdGlvbiB0byBydW4gZHVyaW5nIHRoZSBuZXh0IGRyYXcgY3ljbGUuCisgICAgICogQHBhcmFtIHRva2VuIFRoZSBjYWxsYmFjayB0b2tlbiwgb3IgbnVsbCBpZiBub25lLgogICAgICAqCiAgICAgICogQHNlZSAjcmVtb3ZlRHJhd0NhbGxiYWNrCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdERyYXdDYWxsYmFjayhSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBpZiAocnVubmFibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicnVubmFibGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHBvc3REcmF3Q2FsbGJhY2tVbmNoZWNrZWQocnVubmFibGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwb3N0RHJhd0NhbGxiYWNrVW5jaGVja2VkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1EcmF3Q2FsbGJhY2tzID0gYWRkQ2FsbGJhY2tMb2NrZWQobURyYXdDYWxsYmFja3MsIHJ1bm5hYmxlKTsKLSAgICAgICAgICAgIHNjaGVkdWxlRHJhd0xvY2tlZCgpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgcG9zdERyYXdDYWxsYmFjayhSdW5uYWJsZSBhY3Rpb24sIE9iamVjdCB0b2tlbikgeworICAgICAgICBwb3N0RHJhd0NhbGxiYWNrRGVsYXllZChhY3Rpb24sIHRva2VuLCAwKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBQb3N0cyBhIGNhbGxiYWNrIHRvIHJ1biBvbiB0aGUgbmV4dCBkcmF3IGN5Y2xlIGZvbGxvd2luZyB0aGUgc3BlY2lmaWVkIGRlbGF5LgogICAgICAqIFRoZSBjYWxsYmFjayBvbmx5IHJ1bnMgb25jZSBhbmQgdGhlbiBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcnVubmFibGUgVGhlIGNhbGxiYWNrIHRvIHJ1biBkdXJpbmcgdGhlIG5leHQgZHJhdyBjeWNsZSBmb2xsb3dpbmcKKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBjYWxsYmFjayBhY3Rpb24gdG8gcnVuIGR1cmluZyB0aGUgbmV4dCBhbmltYXRpb24gY3ljbGUgYWZ0ZXIKICAgICAgKiB0aGUgc3BlY2lmaWVkIGRlbGF5LgorICAgICAqIEBwYXJhbSB0b2tlbiBUaGUgY2FsbGJhY2sgdG9rZW4sIG9yIG51bGwgaWYgbm9uZS4KICAgICAgKiBAcGFyYW0gZGVsYXlNaWxsaXMgVGhlIGRlbGF5IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqCiAgICAgICogQHNlZSAjcmVtb3ZlRHJhd0NhbGxiYWNrCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcG9zdERyYXdDYWxsYmFja0RlbGF5ZWQoUnVubmFibGUgcnVubmFibGUsIGxvbmcgZGVsYXlNaWxsaXMpIHsKLSAgICAgICAgaWYgKHJ1bm5hYmxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJ1bm5hYmxlIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICBwdWJsaWMgdm9pZCBwb3N0RHJhd0NhbGxiYWNrRGVsYXllZChSdW5uYWJsZSBhY3Rpb24sIE9iamVjdCB0b2tlbiwgbG9uZyBkZWxheU1pbGxpcykgeworICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBtdXN0IG5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRlbGF5TWlsbGlzIDw9IDApIHsKLSAgICAgICAgICAgIHBvc3REcmF3Q2FsbGJhY2tVbmNoZWNrZWQocnVubmFibGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19QT1NUX0RFTEFZRURfRFJBVywgcnVubmFibGUpOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VEZWxheWVkKG1zZywgZGVsYXlNaWxsaXMpOworCisgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIGR1ZVRpbWUgPSBub3cgKyBkZWxheU1pbGxpczsKKyAgICAgICAgICAgIG1EcmF3Q2FsbGJhY2tzID0gYWRkQ2FsbGJhY2tMb2NrZWQobURyYXdDYWxsYmFja3MsIGR1ZVRpbWUsIGFjdGlvbiwgdG9rZW4pOworICAgICAgICAgICAgc2NoZWR1bGVEcmF3TG9ja2VkKG5vdyk7CisKKyAgICAgICAgICAgIGlmIChkdWVUaW1lIDw9IG5vdykgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlRHJhd0xvY2tlZChub3cpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPX1NDSEVEVUxFX0RSQVcsIGFjdGlvbik7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobXNnLCBkdWVUaW1lKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbW92ZXMgZHJhdyBjYWxsYmFja3MgZm9yIHRoZSBzcGVjaWZpZWQgcnVubmFibGUuCi0gICAgICogRG9lcyBub3RoaW5nIGlmIHRoZSBzcGVjaWZpZWQgZHJhdyBjYWxsYmFjayBoYXMgbm90IGJlZW4gcG9zdGVkIG9yIGhhcyBhbHJlYWR5Ci0gICAgICogYmVlbiByZW1vdmVkLgorICAgICAqIFJlbW92ZXMgZHJhdyBjYWxsYmFja3MgdGhhdCBoYXZlIHRoZSBzcGVjaWZpZWQgYWN0aW9uIGFuZCB0b2tlbi4KICAgICAgKgotICAgICAqIEBwYXJhbSBydW5uYWJsZSBUaGUgZHJhdyBjYWxsYmFjayB0byByZW1vdmUuCisgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgYWN0aW9uIHByb3BlcnR5IG9mIHRoZSBjYWxsYmFja3MgdG8gcmVtb3ZlLCBvciBudWxsIHRvIHJlbW92ZQorICAgICAqIGNhbGxiYWNrcyB3aXRoIGFueSBhY3Rpb24uCisgICAgICogQHBhcmFtIHRva2VuIFRoZSB0b2tlbiBwcm9wZXJ0eSBvZiB0aGUgY2FsbGJhY2tzIHRvIHJlbW92ZSwgb3IgbnVsbCB0byByZW1vdmUKKyAgICAgKiBjYWxsYmFja3Mgd2l0aCBhbnkgdG9rZW4uCiAgICAgICoKICAgICAgKiBAc2VlICNwb3N0RHJhd0NhbGxiYWNrCiAgICAgICogQHNlZSAjcG9zdERyYXdDYWxsYmFja0RlbGF5ZWQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVEcmF3Q2FsbGJhY2tzKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChydW5uYWJsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJydW5uYWJsZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVEcmF3Q2FsbGJhY2tzKFJ1bm5hYmxlIGFjdGlvbiwgT2JqZWN0IHRva2VuKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1EcmF3Q2FsbGJhY2tzID0gcmVtb3ZlQ2FsbGJhY2tzTG9ja2VkKG1EcmF3Q2FsbGJhY2tzLCBydW5uYWJsZSk7CisgICAgICAgICAgICBtRHJhd0NhbGxiYWNrcyA9IHJlbW92ZUNhbGxiYWNrc0xvY2tlZChtRHJhd0NhbGxiYWNrcywgYWN0aW9uLCB0b2tlbik7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwgJiYgdG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19ET19TQ0hFRFVMRV9EUkFXLCBhY3Rpb24pOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19QT1NUX0RFTEFZRURfRFJBVywgcnVubmFibGUpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZUFuaW1hdGlvbkxvY2tlZCgpIHsKKyAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVBbmltYXRpb25Mb2NrZWQobG9uZyBub3cpIHsKICAgICAgICAgaWYgKCFtQW5pbWF0aW9uU2NoZWR1bGVkKSB7CiAgICAgICAgICAgICBtQW5pbWF0aW9uU2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChVU0VfVlNZTkMpIHsKQEAgLTI5MSwxNCArMzE1LDEzIEBACiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHBvc3QgYSBtZXNzYWdlIHRvIHNjaGVkdWxlIHRoZSB2c3luYyBmcm9tIHRoZSBVSSB0aHJlYWQKICAgICAgICAgICAgICAgICAvLyBhcyBzb29uIGFzIHBvc3NpYmxlLgogICAgICAgICAgICAgICAgIGlmIChpc1J1bm5pbmdPbkxvb3BlclRocmVhZExvY2tlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvU2NoZWR1bGVWc3luY0xvY2tlZCgpOworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVZzeW5jTG9ja2VkKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19ET19TQ0hFRFVMRV9WU1lOQyk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy5zZXRBc3luY2hyb25vdXModHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlQXRGcm9udE9mUXVldWUobXNnKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBuZXh0QW5pbWF0aW9uVGltZSA9IE1hdGgubWF4KG1MYXN0QW5pbWF0aW9uVGltZSArIHNGcmFtZURlbGF5LCBub3cpOwogICAgICAgICAgICAgICAgIGlmIChERUJVRykgewogICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTY2hlZHVsaW5nIGFuaW1hdGlvbiBpbiAiICsgKG5leHRBbmltYXRpb25UaW1lIC0gbm93KSArICIgbXMuIik7CkBAIC0zMTAsMTggKzMzMywxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlRHJhd0xvY2tlZCgpIHsKKyAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVEcmF3TG9ja2VkKGxvbmcgbm93KSB7CiAgICAgICAgIGlmICghbURyYXdTY2hlZHVsZWQpIHsKICAgICAgICAgICAgIG1EcmF3U2NoZWR1bGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChVU0VfQU5JTUFUSU9OX1RJTUVSX0ZPUl9EUkFXKSB7Ci0gICAgICAgICAgICAgICAgc2NoZWR1bGVBbmltYXRpb25Mb2NrZWQoKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZUFuaW1hdGlvbkxvY2tlZChub3cpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2NoZWR1bGluZyBkcmF3IGltbWVkaWF0ZWx5LiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RPX0RSQVcpOwogICAgICAgICAgICAgICAgIG1zZy5zZXRBc3luY2hyb25vdXModHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtc2csIG5vdyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMzYsNyArMzU5LDcgQEAKIAogICAgIHZvaWQgZG9BbmltYXRpb25Jbm5lcigpIHsKICAgICAgICAgZmluYWwgbG9uZyBzdGFydDsKLSAgICAgICAgZmluYWwgQ2FsbGJhY2sgY2FsbGJhY2tzOworICAgICAgICBDYWxsYmFjayBjYWxsYmFja3M7CiAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKICAgICAgICAgICAgIGlmICghbUFuaW1hdGlvblNjaGVkdWxlZCkgewogICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gd29yayB0byBkbwpAQCAtMzUxLDcgKzM3NCwyMyBAQAogICAgICAgICAgICAgbUxhc3RBbmltYXRpb25UaW1lID0gc3RhcnQ7CiAKICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BbmltYXRpb25DYWxsYmFja3M7Ci0gICAgICAgICAgICBtQW5pbWF0aW9uQ2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjYWxsYmFja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MuZHVlVGltZSA+IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgcHJlZGVjZXNzb3IgPSBjYWxsYmFja3M7CisgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIHN1Y2Nlc3NvciA9IHByZWRlY2Vzc29yLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdWNjZXNzb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3Nvci5kdWVUaW1lID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3Nvci5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yID0gc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yID0gc3VjY2Vzc29yLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUFuaW1hdGlvbkNhbGxiYWNrcyA9IHN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTM2OCw3ICs0MDcsNyBAQAogCiAgICAgdm9pZCBkb0RyYXcoKSB7CiAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnQ7Ci0gICAgICAgIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrczsKKyAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2tzOwogICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CiAgICAgICAgICAgICBpZiAoIW1EcmF3U2NoZWR1bGVkKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyB3b3JrIHRvIGRvCkBAIC0zODMsNyArNDIyLDIzIEBACiAgICAgICAgICAgICBtTGFzdERyYXdUaW1lID0gc3RhcnQ7CiAKICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1EcmF3Q2FsbGJhY2tzOwotICAgICAgICAgICAgbURyYXdDYWxsYmFja3MgPSBudWxsOworICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcy5kdWVUaW1lID4gc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBwcmVkZWNlc3NvciA9IGNhbGxiYWNrczsKKyAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2sgc3VjY2Vzc29yID0gcHJlZGVjZXNzb3IubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN1Y2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yLmR1ZVRpbWUgPiBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRlY2Vzc29yLm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3IgPSBzdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzb3IgPSBzdWNjZXNzb3IubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtRHJhd0NhbGxiYWNrcyA9IHN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY2FsbGJhY2tzICE9IG51bGwpIHsKQEAgLTQwMCwzOCArNDU1LDY2IEBACiAKICAgICB2b2lkIGRvU2NoZWR1bGVWc3luYygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZG9TY2hlZHVsZVZzeW5jTG9ja2VkKCk7CisgICAgICAgICAgICBpZiAobUFuaW1hdGlvblNjaGVkdWxlZCkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlVnN5bmNMb2NrZWQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBkb1NjaGVkdWxlVnN5bmNMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChtQW5pbWF0aW9uU2NoZWR1bGVkKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUV2ZW50UmVjZWl2ZXIuc2NoZWR1bGVWc3luYygpOworICAgIHZvaWQgZG9TY2hlZHVsZUFuaW1hdGlvbigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeworICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGlmIChtQW5pbWF0aW9uQ2FsbGJhY2tzICE9IG51bGwgJiYgbUFuaW1hdGlvbkNhbGxiYWNrcy5kdWVUaW1lIDw9IG5vdykgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlQW5pbWF0aW9uTG9ja2VkKG5vdyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICB2b2lkIGRvU2NoZWR1bGVEcmF3KCkgeworICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOworICAgICAgICAgICAgaWYgKG1EcmF3Q2FsbGJhY2tzICE9IG51bGwgJiYgbURyYXdDYWxsYmFja3MuZHVlVGltZSA8PSBub3cpIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZURyYXdMb2NrZWQobm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZVZzeW5jTG9ja2VkKCkgeworICAgICAgICBtRGlzcGxheUV2ZW50UmVjZWl2ZXIuc2NoZWR1bGVWc3luYygpOworICAgIH0KKwogICAgIHByaXZhdGUgYm9vbGVhbiBpc1J1bm5pbmdPbkxvb3BlclRocmVhZExvY2tlZCgpIHsKICAgICAgICAgcmV0dXJuIExvb3Blci5teUxvb3BlcigpID09IG1Mb29wZXI7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDYWxsYmFjayBhZGRDYWxsYmFja0xvY2tlZChDYWxsYmFjayBoZWFkLCBSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBDYWxsYmFjayBjYWxsYmFjayA9IG9idGFpbkNhbGxiYWNrTG9ja2VkKHJ1bm5hYmxlKTsKKyAgICBwcml2YXRlIENhbGxiYWNrIGFkZENhbGxiYWNrTG9ja2VkKENhbGxiYWNrIGhlYWQsCisgICAgICAgICAgICBsb25nIGR1ZVRpbWUsIFJ1bm5hYmxlIGFjdGlvbiwgT2JqZWN0IHRva2VuKSB7CisgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrID0gb2J0YWluQ2FsbGJhY2tMb2NrZWQoZHVlVGltZSwgYWN0aW9uLCB0b2tlbik7CiAgICAgICAgIGlmIChoZWFkID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjazsKICAgICAgICAgfQotICAgICAgICBDYWxsYmFjayB0YWlsID0gaGVhZDsKLSAgICAgICAgd2hpbGUgKHRhaWwubmV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0YWlsID0gdGFpbC5uZXh0OworICAgICAgICBDYWxsYmFjayBlbnRyeSA9IGhlYWQ7CisgICAgICAgIGlmIChkdWVUaW1lIDwgZW50cnkuZHVlVGltZSkgeworICAgICAgICAgICAgY2FsbGJhY2submV4dCA9IGVudHJ5OworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrOwogICAgICAgICB9Ci0gICAgICAgIHRhaWwubmV4dCA9IGNhbGxiYWNrOworICAgICAgICB3aGlsZSAoZW50cnkubmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZHVlVGltZSA8IGVudHJ5Lm5leHQuZHVlVGltZSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm5leHQgPSBlbnRyeS5uZXh0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5uZXh0OworICAgICAgICB9CisgICAgICAgIGVudHJ5Lm5leHQgPSBjYWxsYmFjazsKICAgICAgICAgcmV0dXJuIGhlYWQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDYWxsYmFjayByZW1vdmVDYWxsYmFja3NMb2NrZWQoQ2FsbGJhY2sgaGVhZCwgUnVubmFibGUgcnVubmFibGUpIHsKKyAgICBwcml2YXRlIENhbGxiYWNrIHJlbW92ZUNhbGxiYWNrc0xvY2tlZChDYWxsYmFjayBoZWFkLCBSdW5uYWJsZSBhY3Rpb24sIE9iamVjdCB0b2tlbikgewogICAgICAgICBDYWxsYmFjayBwcmVkZWNlc3NvciA9IG51bGw7CiAgICAgICAgIGZvciAoQ2FsbGJhY2sgY2FsbGJhY2sgPSBoZWFkOyBjYWxsYmFjayAhPSBudWxsOykgewogICAgICAgICAgICAgZmluYWwgQ2FsbGJhY2sgbmV4dCA9IGNhbGxiYWNrLm5leHQ7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sucnVubmFibGUgPT0gcnVubmFibGUpIHsKKyAgICAgICAgICAgIGlmICgoYWN0aW9uID09IG51bGwgfHwgY2FsbGJhY2suYWN0aW9uID09IGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgJiYgKHRva2VuID09IG51bGwgfHwgY2FsbGJhY2sudG9rZW4gPT0gdG9rZW4pKSB7CiAgICAgICAgICAgICAgICAgaWYgKHByZWRlY2Vzc29yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcHJlZGVjZXNzb3IubmV4dCA9IG5leHQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ0OCw3ICs1MzEsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHJ1bkNhbGxiYWNrcyhDYWxsYmFjayBoZWFkKSB7CiAgICAgICAgIHdoaWxlIChoZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGhlYWQucnVubmFibGUucnVuKCk7CisgICAgICAgICAgICBoZWFkLmFjdGlvbi5ydW4oKTsKICAgICAgICAgICAgIGhlYWQgPSBoZWFkLm5leHQ7CiAgICAgICAgIH0KICAgICB9CkBAIC00NjEsNyArNTQ0LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgQ2FsbGJhY2sgb2J0YWluQ2FsbGJhY2tMb2NrZWQoUnVubmFibGUgcnVubmFibGUpIHsKKyAgICBwcml2YXRlIENhbGxiYWNrIG9idGFpbkNhbGxiYWNrTG9ja2VkKGxvbmcgZHVlVGltZSwgUnVubmFibGUgYWN0aW9uLCBPYmplY3QgdG9rZW4pIHsKICAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2sgPSBtQ2FsbGJhY2tQb29sOwogICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewogICAgICAgICAgICAgY2FsbGJhY2sgPSBuZXcgQ2FsbGJhY2soKTsKQEAgLTQ2OSwxMiArNTUyLDE1IEBACiAgICAgICAgICAgICBtQ2FsbGJhY2tQb29sID0gY2FsbGJhY2submV4dDsKICAgICAgICAgICAgIGNhbGxiYWNrLm5leHQgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIGNhbGxiYWNrLnJ1bm5hYmxlID0gcnVubmFibGU7CisgICAgICAgIGNhbGxiYWNrLmR1ZVRpbWUgPSBkdWVUaW1lOworICAgICAgICBjYWxsYmFjay5hY3Rpb24gPSBhY3Rpb247CisgICAgICAgIGNhbGxiYWNrLnRva2VuID0gdG9rZW47CiAgICAgICAgIHJldHVybiBjYWxsYmFjazsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcmVjeWNsZUNhbGxiYWNrTG9ja2VkKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGNhbGxiYWNrLnJ1bm5hYmxlID0gbnVsbDsKKyAgICAgICAgY2FsbGJhY2suYWN0aW9uID0gbnVsbDsKKyAgICAgICAgY2FsbGJhY2sudG9rZW4gPSBudWxsOwogICAgICAgICBjYWxsYmFjay5uZXh0ID0gbUNhbGxiYWNrUG9vbDsKICAgICAgICAgbUNhbGxiYWNrUG9vbCA9IGNhbGxiYWNrOwogICAgIH0KQEAgLTQ5NiwxMSArNTgyLDExIEBACiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfRE9fU0NIRURVTEVfVlNZTkM6CiAgICAgICAgICAgICAgICAgICAgIGRvU2NoZWR1bGVWc3luYygpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19QT1NUX0RFTEFZRURfQU5JTUFUSU9OOgotICAgICAgICAgICAgICAgICAgICBwb3N0QW5pbWF0aW9uQ2FsbGJhY2tVbmNoZWNrZWQoKFJ1bm5hYmxlKW1zZy5vYmopOworICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RPX1NDSEVEVUxFX0FOSU1BVElPTjoKKyAgICAgICAgICAgICAgICAgICAgZG9TY2hlZHVsZUFuaW1hdGlvbigpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19QT1NUX0RFTEFZRURfRFJBVzoKLSAgICAgICAgICAgICAgICAgICAgcG9zdERyYXdDYWxsYmFja1VuY2hlY2tlZCgoUnVubmFibGUpbXNnLm9iaik7CisgICAgICAgICAgICAgICAgY2FzZSBNU0dfRE9fU0NIRURVTEVfRFJBVzoKKyAgICAgICAgICAgICAgICAgICAgZG9TY2hlZHVsZURyYXcoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUxOSw2ICs2MDUsOCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2FsbGJhY2sgewogICAgICAgICBwdWJsaWMgQ2FsbGJhY2sgbmV4dDsKLSAgICAgICAgcHVibGljIFJ1bm5hYmxlIHJ1bm5hYmxlOworICAgICAgICBwdWJsaWMgbG9uZyBkdWVUaW1lOworICAgICAgICBwdWJsaWMgUnVubmFibGUgYWN0aW9uOworICAgICAgICBwdWJsaWMgT2JqZWN0IHRva2VuOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9JV2luZG93LmFpZGwKaW5kZXggNzE1ZmE3Yi4uNDk3YmM5MGIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvSVdpbmRvdy5haWRsCkBAIC00OSw2ICs0OSw3IEBACiAgICAgICAgICAgICBib29sZWFuIHJlcG9ydERyYXcsIGluIENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnKTsKICAgICB2b2lkIGRpc3BhdGNoQXBwVmlzaWJpbGl0eShib29sZWFuIHZpc2libGUpOwogICAgIHZvaWQgZGlzcGF0Y2hHZXROZXdTdXJmYWNlKCk7CisgICAgdm9pZCBkaXNwYXRjaFNjcmVlblN0YXRlKGJvb2xlYW4gb24pOwogCiAgICAgLyoqCiAgICAgICogVGVsbCB0aGUgd2luZG93IHRoYXQgaXQgaXMgZWl0aGVyIGdhaW5pbmcgb3IgbG9zaW5nIGZvY3VzLiAgS2VlcCBpdCB1cApkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQppbmRleCA5NDU3MDY3Li5hNjUxMzYyIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXcuamF2YQpAQCAtMTk5NCw2ICsxOTk0LDIwIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklORF9WSUVXU19XSVRIX0FDQ0VTU0lCSUxJVFlfTk9ERV9QUk9WSURFUlMgPSAweDAwMDAwMDA0OwogCiAgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNjcmVlbiBoYXMgY2hhbmdlZCBzdGF0ZSBhbmQgaXMgbm93IG9mZi4KKyAgICAgKgorICAgICAqIEBzZWUgI29uU2NyZWVuU3RhdGVDaGFuZ2VkKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQ1JFRU5fU1RBVEVfT0ZGID0gMHgwOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIHNjcmVlbiBoYXMgY2hhbmdlZCBzdGF0ZSBhbmQgaXMgbm93IG9uLgorICAgICAqCisgICAgICogQHNlZSAjb25TY3JlZW5TdGF0ZUNoYW5nZWQoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNDUkVFTl9TVEFURV9PTiA9IDB4MTsKKworICAgIC8qKgogICAgICAqIENvbnRyb2xzIHRoZSBvdmVyLXNjcm9sbCBtb2RlIGZvciB0aGlzIHZpZXcuCiAgICAgICogU2VlIHtAbGluayAjb3ZlclNjcm9sbEJ5KGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBib29sZWFuKX0sCiAgICAgICoge0BsaW5rICNPVkVSX1NDUk9MTF9BTFdBWVN9LCB7QGxpbmsgI09WRVJfU0NST0xMX0lGX0NPTlRFTlRfU0NST0xMU30sCkBAIC0zMDkzLDEzICszMTA3LDEzIEBACiAgICAgICAgICAgICBzZXRCYWNrZ3JvdW5kRHJhd2FibGUoYmFja2dyb3VuZCk7CiAgICAgICAgIH0KIAotICAgICAgICBtVXNlclBhZGRpbmdSZWxhdGl2ZSA9IChzdGFydFBhZGRpbmcgPj0gMCB8fCBlbmRQYWRkaW5nID49IDApOwotCiAgICAgICAgIC8vIENhY2hlIHVzZXIgcGFkZGluZyBhcyB3ZSBjYW5ub3QgZnVsbHkgcmVzb2x2ZSBwYWRkaW5nIGhlcmUgKHdlIGRvbnQgaGF2ZSB5ZXQgdGhlIHJlc29sdmVkCiAgICAgICAgIC8vIGxheW91dCBkaXJlY3Rpb24pLiBUaG9zZSBjYWNoZWQgdmFsdWVzIHdpbGwgYmUgdXNlZCBsYXRlciBkdXJpbmcgcGFkZGluZyByZXNvbHV0aW9uLgogICAgICAgICBtVXNlclBhZGRpbmdTdGFydCA9IHN0YXJ0UGFkZGluZzsKICAgICAgICAgbVVzZXJQYWRkaW5nRW5kID0gZW5kUGFkZGluZzsKIAorICAgICAgICB1cGRhdGVVc2VyUGFkZGluZ1JlbGF0aXZlKCk7CisKICAgICAgICAgaWYgKHBhZGRpbmcgPj0gMCkgewogICAgICAgICAgICAgbGVmdFBhZGRpbmcgPSBwYWRkaW5nOwogICAgICAgICAgICAgdG9wUGFkZGluZyA9IHBhZGRpbmc7CkBAIC0zMTQ2LDYgKzMxNjAsMTAgQEAKICAgICAgICAgY29tcHV0ZU9wYXF1ZUZsYWdzKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVVzZXJQYWRkaW5nUmVsYXRpdmUoKSB7CisgICAgICAgIG1Vc2VyUGFkZGluZ1JlbGF0aXZlID0gKG1Vc2VyUGFkZGluZ1N0YXJ0ID49IDAgfHwgbVVzZXJQYWRkaW5nRW5kID49IDApOworICAgIH0KKwogICAgIC8qKgogICAgICAqIE5vbi1wdWJsaWMgY29uc3RydWN0b3IgZm9yIHVzZSBpbiB0ZXN0aW5nCiAgICAgICovCkBAIC04Nzc1LDYgKzg3OTMsNTIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiA8cD5DYXVzZXMgdGhlIFJ1bm5hYmxlIHRvIGV4ZWN1dGUgb24gdGhlIG5leHQgYW5pbWF0aW9uIHRpbWUgc3RlcC4KKyAgICAgKiBUaGUgcnVubmFibGUgd2lsbCBiZSBydW4gb24gdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFVJIHRocmVhZAorICAgICAqIG9ubHkgd2hlbiB0aGlzIFZpZXcgaXMgYXR0YWNoZWQgdG8gYSB3aW5kb3cuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFjdGlvbiBUaGUgUnVubmFibGUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLgorICAgICAqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwb3N0T25BbmltYXRpb24oUnVubmFibGUgYWN0aW9uKSB7CisgICAgICAgIGZpbmFsIEF0dGFjaEluZm8gYXR0YWNoSW5mbyA9IG1BdHRhY2hJbmZvOworICAgICAgICBpZiAoYXR0YWNoSW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRhY2hJbmZvLm1WaWV3Um9vdEltcGwubUNob3Jlb2dyYXBoZXIucG9zdEFuaW1hdGlvbkNhbGxiYWNrKGFjdGlvbiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBwb3N0IHdpbGwgc3VjY2VlZCBsYXRlcgorICAgICAgICAgICAgVmlld1Jvb3RJbXBsLmdldFJ1blF1ZXVlKCkucG9zdChhY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+Q2F1c2VzIHRoZSBSdW5uYWJsZSB0byBleGVjdXRlIG9uIHRoZSBuZXh0IGFuaW1hdGlvbiB0aW1lIHN0ZXAsCisgICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBlbGFwc2VzLgorICAgICAqIFRoZSBydW5uYWJsZSB3aWxsIGJlIHJ1biBvbiB0aGUgdXNlciBpbnRlcmZhY2UgdGhyZWFkLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGZyb20gb3V0c2lkZSBvZiB0aGUgVUkgdGhyZWFkCisgICAgICogb25seSB3aGVuIHRoaXMgVmlldyBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdy48L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYWN0aW9uIFRoZSBSdW5uYWJsZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuCisgICAgICogQHBhcmFtIGRlbGF5TWlsbGlzIFRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSB1bnRpbCB0aGUgUnVubmFibGUKKyAgICAgKiAgICAgICAgd2lsbCBiZSBleGVjdXRlZC4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgcG9zdE9uQW5pbWF0aW9uRGVsYXllZChSdW5uYWJsZSBhY3Rpb24sIGxvbmcgZGVsYXlNaWxsaXMpIHsKKyAgICAgICAgZmluYWwgQXR0YWNoSW5mbyBhdHRhY2hJbmZvID0gbUF0dGFjaEluZm87CisgICAgICAgIGlmIChhdHRhY2hJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dGFjaEluZm8ubVZpZXdSb290SW1wbC5tQ2hvcmVvZ3JhcGhlci5wb3N0QW5pbWF0aW9uQ2FsbGJhY2tEZWxheWVkKAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIG51bGwsIGRlbGF5TWlsbGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IHBvc3Qgd2lsbCBzdWNjZWVkIGxhdGVyCisgICAgICAgICAgICBWaWV3Um9vdEltcGwuZ2V0UnVuUXVldWUoKS5wb3N0RGVsYXllZChhY3Rpb24sIGRlbGF5TWlsbGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIDxwPlJlbW92ZXMgdGhlIHNwZWNpZmllZCBSdW5uYWJsZSBmcm9tIHRoZSBtZXNzYWdlIHF1ZXVlLjwvcD4KICAgICAgKiAKICAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBmcm9tIG91dHNpZGUgb2YgdGhlIFVJIHRocmVhZApAQCAtODc5MSw2ICs4ODU1LDcgQEAKICAgICAgICAgZmluYWwgQXR0YWNoSW5mbyBhdHRhY2hJbmZvID0gbUF0dGFjaEluZm87CiAgICAgICAgIGlmIChhdHRhY2hJbmZvICE9IG51bGwpIHsKICAgICAgICAgICAgIGF0dGFjaEluZm8ubUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKGFjdGlvbik7CisgICAgICAgICAgICBhdHRhY2hJbmZvLm1WaWV3Um9vdEltcGwubUNob3Jlb2dyYXBoZXIucmVtb3ZlQW5pbWF0aW9uQ2FsbGJhY2tzKGFjdGlvbiwgbnVsbCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBBc3N1bWUgdGhhdCBwb3N0IHdpbGwgc3VjY2VlZCBsYXRlcgogICAgICAgICAgICAgVmlld1Jvb3RJbXBsLmdldFJ1blF1ZXVlKCkucmVtb3ZlQ2FsbGJhY2tzKGFjdGlvbik7CkBAIC05NjAwLDYgKzk2NjUsMjUgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlICNvblNjcmVlblN0YXRlQ2hhbmdlZChpbnQpCisgICAgICovCisgICAgdm9pZCBkaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlZChpbnQgc2NyZWVuU3RhdGUpIHsKKyAgICAgICAgb25TY3JlZW5TdGF0ZUNoYW5nZWQoc2NyZWVuU3RhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3RhdGUgb2YgdGhlIHNjcmVlbiB0aGlzIHZpZXcgaXMKKyAgICAgKiBhdHRhY2hlZCB0byBjaGFuZ2VzLiBBIHN0YXRlIGNoYW5nZSB3aWxsIHVzdWFsbHkgb2NjdXJzIHdoZW4gdGhlIHNjcmVlbgorICAgICAqIHR1cm5zIG9uIG9yIG9mZiAod2hldGhlciBpdCBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgb3IgdGhlIHVzZXIgZG9lcyBpdAorICAgICAqIG1hbnVhbGx5LikKKyAgICAgKgorICAgICAqIEBwYXJhbSBzY3JlZW5TdGF0ZSBUaGUgbmV3IHN0YXRlIG9mIHRoZSBzY3JlZW4uIENhbiBiZSBlaXRoZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAge0BsaW5rICNTQ1JFRU5fU1RBVEVfT059IG9yIHtAbGluayAjU0NSRUVOX1NUQVRFX09GRn0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblNjcmVlblN0YXRlQ2hhbmdlZChpbnQgc2NyZWVuU3RhdGUpIHsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXNvbHZlIGFuZCBjYWNoZSB0aGUgbGF5b3V0IGRpcmVjdGlvbi4gTFRSIGlzIHNldCBpbml0aWFsbHkuIFRoaXMgaXMgaW1wbGljaXRseSBzdXBwb3NpbmcKICAgICAgKiB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0aW9uYWxpdHkgY2FuIGFuZCB3aWxsIGJlIHJlc29sdmVkIGJlZm9yZSBpdHMgY2hpbGRyZW4uCiAgICAgICovCkBAIC05NjQ0LDYgKzk3MjgsOCBAQAogICAgICAgICAvLyBTZXQgdG8gcmVzb2x2ZWQKICAgICAgICAgbVByaXZhdGVGbGFnczIgfD0gTEFZT1VUX0RJUkVDVElPTl9SRVNPTFZFRDsKICAgICAgICAgb25SZXNvbHZlZExheW91dERpcmVjdGlvbkNoYW5nZWQoKTsKKyAgICAgICAgLy8gUmVzb2x2ZSBwYWRkaW5nCisgICAgICAgIHJlc29sdmVQYWRkaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05Njk4LDcgKzk3ODQsMTEgQEAKIAogICAgICAgICBtVXNlclBhZGRpbmdCb3R0b20gPSAobVVzZXJQYWRkaW5nQm90dG9tID49IDApID8gbVVzZXJQYWRkaW5nQm90dG9tIDogbVBhZGRpbmdCb3R0b207CiAKLSAgICAgICAgcmVjb21wdXRlUGFkZGluZygpOworICAgICAgICBpZihpc1BhZGRpbmdSZWxhdGl2ZSgpKSB7CisgICAgICAgICAgICBzZXRQYWRkaW5nUmVsYXRpdmUobVVzZXJQYWRkaW5nU3RhcnQsIG1QYWRkaW5nVG9wLCBtVXNlclBhZGRpbmdFbmQsIG1Vc2VyUGFkZGluZ0JvdHRvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNvbXB1dGVQYWRkaW5nKCk7CisgICAgICAgIH0KICAgICAgICAgb25QYWRkaW5nQ2hhbmdlZChyZXNvbHZlZExheW91dERpcmVjdGlvbik7CiAgICAgfQogCkBAIC0xMTgzNywxMCArMTE5MjcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzY2hlZHVsZURyYXdhYmxlKERyYXdhYmxlIHdobywgUnVubmFibGUgd2hhdCwgbG9uZyB3aGVuKSB7CiAgICAgICAgIGlmICh2ZXJpZnlEcmF3YWJsZSh3aG8pICYmIHdoYXQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBkZWxheSA9IHdoZW4gLSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhbmRsZXIucG9zdEF0VGltZSh3aGF0LCB3aG8sIHdoZW4pOworICAgICAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1WaWV3Um9vdEltcGwubUNob3Jlb2dyYXBoZXIucG9zdEFuaW1hdGlvbkNhbGxiYWNrRGVsYXllZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHdobywgQ2hvcmVvZ3JhcGhlci5zdWJ0cmFjdEZyYW1lRGVsYXkoZGVsYXkpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVmlld1Jvb3RJbXBsLmdldFJ1blF1ZXVlKCkucG9zdERlbGF5ZWQod2hhdCwgd2hlbiAtIFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICBWaWV3Um9vdEltcGwuZ2V0UnVuUXVldWUoKS5wb3N0RGVsYXllZCh3aGF0LCBkZWxheSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTg1NCw3ICsxMTk0Niw3IEBACiAgICAgcHVibGljIHZvaWQgdW5zY2hlZHVsZURyYXdhYmxlKERyYXdhYmxlIHdobywgUnVubmFibGUgd2hhdCkgewogICAgICAgICBpZiAodmVyaWZ5RHJhd2FibGUod2hvKSAmJiB3aGF0ICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChtQXR0YWNoSW5mbyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHdoYXQsIHdobyk7CisgICAgICAgICAgICAgICAgbUF0dGFjaEluZm8ubVZpZXdSb290SW1wbC5tQ2hvcmVvZ3JhcGhlci5yZW1vdmVBbmltYXRpb25DYWxsYmFja3Mod2hhdCwgd2hvKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgVmlld1Jvb3RJbXBsLmdldFJ1blF1ZXVlKCkucmVtb3ZlQ2FsbGJhY2tzKHdoYXQpOwogICAgICAgICAgICAgfQpAQCAtMTE4NzIsNyArMTE5NjQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHVuc2NoZWR1bGVEcmF3YWJsZShEcmF3YWJsZSB3aG8pIHsKICAgICAgICAgaWYgKG1BdHRhY2hJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKHdobyk7CisgICAgICAgICAgICBtQXR0YWNoSW5mby5tVmlld1Jvb3RJbXBsLm1DaG9yZW9ncmFwaGVyLnJlbW92ZUFuaW1hdGlvbkNhbGxiYWNrcyhudWxsLCB3aG8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjIzMywxNSArMTIzMjUsMjAgQEAKICAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gcGFkZGluZyBpbiBwaXhlbHMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYWRkaW5nKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0KKyAgICAgICAgbVVzZXJQYWRkaW5nU3RhcnQgPSAtMTsKKyAgICAgICAgbVVzZXJQYWRkaW5nRW5kID0gLTE7CiAgICAgICAgIG1Vc2VyUGFkZGluZ1JlbGF0aXZlID0gZmFsc2U7CiAKKyAgICAgICAgaW50ZXJuYWxTZXRQYWRkaW5nKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGludGVybmFsU2V0UGFkZGluZyhpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CiAgICAgICAgIG1Vc2VyUGFkZGluZ0xlZnQgPSBsZWZ0OwogICAgICAgICBtVXNlclBhZGRpbmdSaWdodCA9IHJpZ2h0OwogICAgICAgICBtVXNlclBhZGRpbmdCb3R0b20gPSBib3R0b207CiAKICAgICAgICAgZmluYWwgaW50IHZpZXdGbGFncyA9IG1WaWV3RmxhZ3M7CisgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwogCiAgICAgICAgIC8vIENvbW1vbiBjYXNlIGlzIHRoZXJlIGFyZSBubyBzY3JvbGwgYmFycy4KICAgICAgICAgaWYgKCh2aWV3RmxhZ3MgJiAoU0NST0xMQkFSU19WRVJUSUNBTHxTQ1JPTExCQVJTX0hPUklaT05UQUwpKSAhPSAwKSB7CkBAIC0xMjMxMCwxOCArMTI0MDcsMTcgQEAKICAgICAgKiBAcGFyYW0gYm90dG9tIHRoZSBib3R0b20gcGFkZGluZyBpbiBwaXhlbHMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmVsYXRpdmUoaW50IHN0YXJ0LCBpbnQgdG9wLCBpbnQgZW5kLCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIG1Vc2VyUGFkZGluZ1JlbGF0aXZlID0gdHJ1ZTsKLQogICAgICAgICBtVXNlclBhZGRpbmdTdGFydCA9IHN0YXJ0OwogICAgICAgICBtVXNlclBhZGRpbmdFbmQgPSBlbmQ7CisgICAgICAgIG1Vc2VyUGFkZGluZ1JlbGF0aXZlID0gdHJ1ZTsKIAogICAgICAgICBzd2l0Y2goZ2V0UmVzb2x2ZWRMYXlvdXREaXJlY3Rpb24oKSkgewogICAgICAgICAgICAgY2FzZSBMQVlPVVRfRElSRUNUSU9OX1JUTDoKLSAgICAgICAgICAgICAgICBzZXRQYWRkaW5nKGVuZCwgdG9wLCBzdGFydCwgYm90dG9tKTsKKyAgICAgICAgICAgICAgICBpbnRlcm5hbFNldFBhZGRpbmcoZW5kLCB0b3AsIHN0YXJ0LCBib3R0b20pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMQVlPVVRfRElSRUNUSU9OX0xUUjoKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc2V0UGFkZGluZyhzdGFydCwgdG9wLCBlbmQsIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxTZXRQYWRkaW5nKHN0YXJ0LCB0b3AsIGVuZCwgYm90dG9tKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ4NzEsNiArMTQ5NjcsOCBAQAogICAgICAgICBib29sZWFuIG1IYXJkd2FyZUFjY2VsZXJhdGlvblJlcXVlc3RlZDsKICAgICAgICAgSGFyZHdhcmVSZW5kZXJlciBtSGFyZHdhcmVSZW5kZXJlcjsKIAorICAgICAgICBib29sZWFuIG1TY3JlZW5PbjsKKwogICAgICAgICAvKioKICAgICAgICAgICogU2NhbGUgZmFjdG9yIHVzZWQgYnkgdGhlIGNvbXBhdGliaWxpdHkgbW9kZQogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdHcm91cC5qYXZhCmluZGV4IDBjNjMyODYuLmM5ZTAyNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld0dyb3VwLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3R3JvdXAuamF2YQpAQCAtMjI1NCw2ICsyMjU0LDE3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgdm9pZCBkaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlZChpbnQgc2NyZWVuU3RhdGUpIHsKKyAgICAgICAgc3VwZXIuZGlzcGF0Y2hTY3JlZW5TdGF0ZUNoYW5nZWQoc2NyZWVuU3RhdGUpOworCisgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DaGlsZHJlbkNvdW50OworICAgICAgICBmaW5hbCBWaWV3W10gY2hpbGRyZW4gPSBtQ2hpbGRyZW47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgY2hpbGRyZW5baV0uZGlzcGF0Y2hTY3JlZW5TdGF0ZUNoYW5nZWQoc2NyZWVuU3RhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgYm9vbGVhbiBkaXNwYXRjaFBvcHVsYXRlQWNjZXNzaWJpbGl0eUV2ZW50SW50ZXJuYWwoQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLmRpc3BhdGNoUG9wdWxhdGVBY2Nlc3NpYmlsaXR5RXZlbnRJbnRlcm5hbChldmVudCk7CiAgICAgICAgIGlmIChoYW5kbGVkKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290SW1wbC5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdEltcGwuamF2YQppbmRleCA4MGQ0YzUzLi43MjM2NWM3IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1ZpZXdSb290SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3RJbXBsLmphdmEKQEAgLTQ2LDYgKzQ2LDcgQEAKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CiBpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBvd2VyTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7CiBpbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKQEAgLTM5MCw2ICszOTEsOSBAQAogICAgICAgICBtUHJvZmlsZVJlbmRlcmluZyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKAogICAgICAgICAgICAgICAgIFN5c3RlbVByb3BlcnRpZXMuZ2V0KFBST1BFUlRZX1BST0ZJTEVfUkVOREVSSU5HLCAiZmFsc2UiKSk7CiAgICAgICAgIG1DaG9yZW9ncmFwaGVyID0gQ2hvcmVvZ3JhcGhlci5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIFBvd2VyTWFuYWdlciBwb3dlck1hbmFnZXIgPSAoUG93ZXJNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5QT1dFUl9TRVJWSUNFKTsKKyAgICAgICAgbUF0dGFjaEluZm8ubVNjcmVlbk9uID0gcG93ZXJNYW5hZ2VyLmlzU2NyZWVuT24oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc1Nyw2ICs3NjEsMTkgQEAKICAgICAgICAgc2NoZWR1bGVUcmF2ZXJzYWxzKCk7CiAgICAgfQogCisgICAgdm9pZCBoYW5kbGVTY3JlZW5TdGF0ZUNoYW5nZShib29sZWFuIG9uKSB7CisgICAgICAgIGlmIChvbiAhPSBtQXR0YWNoSW5mby5tU2NyZWVuT24pIHsKKyAgICAgICAgICAgIG1BdHRhY2hJbmZvLm1TY3JlZW5PbiA9IG9uOworICAgICAgICAgICAgaWYgKG1WaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtVmlldy5kaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlZChvbiA/IFZpZXcuU0NSRUVOX1NUQVRFX09OIDogVmlldy5TQ1JFRU5fU1RBVEVfT0ZGKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbikgeworICAgICAgICAgICAgICAgIG1GdWxsUmVkcmF3TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZVRyYXZlcnNhbHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KQEAgLTg2Nyw3ICs4ODQsNyBAQAogICAgIHZvaWQgc2NoZWR1bGVGcmFtZSgpIHsKICAgICAgICAgaWYgKCFtRnJhbWVTY2hlZHVsZWQpIHsKICAgICAgICAgICAgIG1GcmFtZVNjaGVkdWxlZCA9IHRydWU7Ci0gICAgICAgICAgICBtQ2hvcmVvZ3JhcGhlci5wb3N0RHJhd0NhbGxiYWNrKG1GcmFtZVJ1bm5hYmxlKTsKKyAgICAgICAgICAgIG1DaG9yZW9ncmFwaGVyLnBvc3REcmF3Q2FsbGJhY2sobUZyYW1lUnVubmFibGUsIG51bGwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04NzYsNyArODkzLDcgQEAKIAogICAgICAgICBpZiAobUZyYW1lU2NoZWR1bGVkKSB7CiAgICAgICAgICAgICBtRnJhbWVTY2hlZHVsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1DaG9yZW9ncmFwaGVyLnJlbW92ZURyYXdDYWxsYmFja3MobUZyYW1lUnVubmFibGUpOworICAgICAgICAgICAgbUNob3Jlb2dyYXBoZXIucmVtb3ZlRHJhd0NhbGxiYWNrcyhtRnJhbWVSdW5uYWJsZSwgbnVsbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4ODYsNiArMTkwMyw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1EcmF3KCkgeworICAgICAgICBpZiAoIW1BdHRhY2hJbmZvLm1TY3JlZW5PbikgcmV0dXJuOworCiAgICAgICAgIGZpbmFsIGxvbmcgZHJhd1N0YXJ0VGltZTsKICAgICAgICAgaWYgKFZpZXdEZWJ1Zy5ERUJVR19MQVRFTkNZKSB7CiAgICAgICAgICAgICBkcmF3U3RhcnRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CkBAIC0yMDE4LDggKzIwMzcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFkaXJ0eS5pc0VtcHR5KCkgfHwgbUlzQW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtQXR0YWNoSW5mby5tSGFyZHdhcmVSZW5kZXJlci5pc0VuYWJsZWQoKSkgeworICAgICAgICAgICAgaWYgKG1BdHRhY2hJbmZvLm1IYXJkd2FyZVJlbmRlcmVyICE9IG51bGwgJiYgbUF0dGFjaEluZm8ubUhhcmR3YXJlUmVuZGVyZXIuaXNFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBEcmF3IHdpdGggaGFyZHdhcmUgcmVuZGVyZXIuCiAgICAgICAgICAgICAgICAgbUlzQW5pbWF0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbUhhcmR3YXJlWU9mZnNldCA9IHlvZmY7CkBAIC0yNDg1LDYgKzI1MDMsNyBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNU0dfRklORF9BQ0NFU1NJQkxJVFlfTk9ERV9JTkZPX0JZX1ZJRVdfSUQgPSAyMTsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTVNHX0ZJTkRfQUNDRVNTSUJMSVRZX05PREVfSU5GT19CWV9URVhUID0gMjI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1TR19QUk9DRVNTX0lOUFVUX0VWRU5UUyA9IDIzOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBNU0dfRElTUEFUQ0hfU0NSRUVOX1NUQVRFID0gMjQ7CiAKICAgICBmaW5hbCBjbGFzcyBWaWV3Um9vdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKICAgICAgICAgQE92ZXJyaWRlCkBAIC0yNzQxLDYgKzI3NjAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQWNjZXNzaWJpbGl0eU5vZGVJbmZvc0J5VGV4dFVpVGhyZWFkKG1zZyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTVNHX0RJU1BBVENIX1NDUkVFTl9TVEFURTogeworICAgICAgICAgICAgICAgIGlmIChtVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNjcmVlblN0YXRlQ2hhbmdlKG1zZy5hcmcxID09IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC00MDI3LDcgKzQwNTEsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChtUG9zdGVkICYmIG1WaWV3cy5pc0VtcHR5KCkgJiYgbVZpZXdSZWN0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNob3Jlb2dyYXBoZXIucmVtb3ZlQW5pbWF0aW9uQ2FsbGJhY2tzKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBtQ2hvcmVvZ3JhcGhlci5yZW1vdmVBbmltYXRpb25DYWxsYmFja3ModGhpcywgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgIG1Qb3N0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MDY4LDcgKzQwOTIsNyBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBwb3N0SWZOZWVkZWRMb2NrZWQoKSB7CiAgICAgICAgICAgICBpZiAoIW1Qb3N0ZWQpIHsKLSAgICAgICAgICAgICAgICBtQ2hvcmVvZ3JhcGhlci5wb3N0QW5pbWF0aW9uQ2FsbGJhY2sodGhpcyk7CisgICAgICAgICAgICAgICAgbUNob3Jlb2dyYXBoZXIucG9zdEFuaW1hdGlvbkNhbGxiYWNrKHRoaXMsIG51bGwpOwogICAgICAgICAgICAgICAgIG1Qb3N0ZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00MTIxLDYgKzQxNDUsMTIgQEAKICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobXNnKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaFNjcmVlblN0YXRlQ2hhbmdlKGJvb2xlYW4gb24pIHsKKyAgICAgICAgTWVzc2FnZSBtc2cgPSBtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19ESVNQQVRDSF9TQ1JFRU5fU1RBVEUpOworICAgICAgICBtc2cuYXJnMSA9IG9uID8gMSA6IDA7CisgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hHZXROZXdTdXJmYWNlKCkgewogICAgICAgICBNZXNzYWdlIG1zZyA9IG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoTVNHX0RJU1BBVENIX0dFVF9ORVdfU1VSRkFDRSk7CiAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG1zZyk7CkBAIC00MzIyLDYgKzQzNTIsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGUoYm9vbGVhbiBvbikgeworICAgICAgICAgICAgZmluYWwgVmlld1Jvb3RJbXBsIHZpZXdBbmNlc3RvciA9IG1WaWV3QW5jZXN0b3IuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlld0FuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aWV3QW5jZXN0b3IuZGlzcGF0Y2hTY3JlZW5TdGF0ZUNoYW5nZShvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaEdldE5ld1N1cmZhY2UoKSB7CiAgICAgICAgICAgICBmaW5hbCBWaWV3Um9vdEltcGwgdmlld0FuY2VzdG9yID0gbVZpZXdBbmNlc3Rvci5nZXQoKTsKICAgICAgICAgICAgIGlmICh2aWV3QW5jZXN0b3IgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy90ZXh0c2VydmljZS9TcGVsbENoZWNrZXJTZXNzaW9uLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L3RleHRzZXJ2aWNlL1NwZWxsQ2hlY2tlclNlc3Npb24uamF2YQppbmRleCA5MTA1ZjE5Li42ZmYzYjliIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L3RleHRzZXJ2aWNlL1NwZWxsQ2hlY2tlclNlc3Npb24uamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L3RleHRzZXJ2aWNlL1NwZWxsQ2hlY2tlclNlc3Npb24uamF2YQpAQCAtMjgxLDkgKzI4MSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREJHKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiR2V0IHN1Z2dlc3Rpb25zIGZyb20gdGhlIHNwZWxsIGNoZWNrZXIuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NwLm1UZXh0SW5mb3MubGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24ub25HZXRTZW50ZW5jZVN1Z2dlc3Rpb25zTXVsdGlwbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3AubVRleHRJbmZvcywgc2NwLm1TdWdnZXN0aW9uc0xpbWl0KTsKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dlYmtpdC9XZWJWaWV3Q2xhc3NpYy5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEKaW5kZXggMDRhNjk4Zi4uNzJhZWQ0YiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2Via2l0L1dlYlZpZXdDbGFzc2ljLmphdmEKQEAgLTEzNTcsMTQgKzEzNTcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBXZWJWaWV3IHdpdGggbGF5b3V0IHBhcmFtZXRlcnMsIGEgZGVmYXVsdCBzdHlsZSBhbmQgYSBzZXQKLSAgICAgKiBvZiBjdXN0b20gSmF2c2NyaXB0IGludGVyZmFjZXMgdG8gYmUgYWRkZWQgdG8gdGhlIFdlYlZpZXcgYXQgaW5pdGlhbGl6YXRpb24KLSAgICAgKiB0aW1lLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aGVzZSBpbnRlcmZhY2VzIHdpbGwgYmUgYXZhaWxhYmxlIHdoZW4gdGhlIEpTCi0gICAgICogY29udGV4dCBpcyBpbml0aWFsaXplZC4KLSAgICAgKiBAcGFyYW0gamF2YVNjcmlwdEludGVyZmFjZXMgaXMgYSBNYXAgb2YgaW50ZXJmYWNlIG5hbWVzLCBhcyBrZXlzLCBhbmQKLSAgICAgKiBvYmplY3QgaW1wbGVtZW50aW5nIHRob3NlIGludGVyZmFjZXMsIGFzIHZhbHVlcy4KLSAgICAgKiBAcGFyYW0gcHJpdmF0ZUJyb3dzaW5nIElmIHRydWUgdGhlIHdlYiB2aWV3IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4gcHJpdmF0ZSBtb2RlLgotICAgICAqIEBoaWRlIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlld1Byb3ZpZGVyI2luaXQoTWFwLCBib29sZWFuKX0KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbml0KE1hcDxTdHJpbmcsIE9iamVjdD4gamF2YVNjcmlwdEludGVyZmFjZXMsIGJvb2xlYW4gcHJpdmF0ZUJyb3dzaW5nKSB7CkBAIC0xODY3LDM2ICsxODYwLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBob3Jpem9udGFsIHNjcm9sbGJhciBoYXMgb3ZlcmxheSBzdHlsZS4KLSAgICAgKiBAcGFyYW0gb3ZlcmxheSBUUlVFIGlmIGhvcml6b250YWwgc2Nyb2xsYmFyIHNob3VsZCBoYXZlIG92ZXJsYXkgc3R5bGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldEhvcml6b250YWxTY3JvbGxiYXJPdmVybGF5KGJvb2xlYW4pfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEhvcml6b250YWxTY3JvbGxiYXJPdmVybGF5KGJvb2xlYW4gb3ZlcmxheSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtT3ZlcmxheUhvcml6b250YWxTY3JvbGxiYXIgPSBvdmVybGF5OwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNwZWNpZnkgd2hldGhlciB0aGUgdmVydGljYWwgc2Nyb2xsYmFyIGhhcyBvdmVybGF5IHN0eWxlLgotICAgICAqIEBwYXJhbSBvdmVybGF5IFRSVUUgaWYgdmVydGljYWwgc2Nyb2xsYmFyIHNob3VsZCBoYXZlIG92ZXJsYXkgc3R5bGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldFZlcnRpY2FsU2Nyb2xsYmFyT3ZlcmxheShib29sZWFuKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFZlcnRpY2FsU2Nyb2xsYmFyT3ZlcmxheShib29sZWFuIG92ZXJsYXkpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbU92ZXJsYXlWZXJ0aWNhbFNjcm9sbGJhciA9IG92ZXJsYXk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaGFzIG92ZXJsYXkgc3R5bGUKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaGFzIG92ZXJsYXkgc3R5bGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I292ZXJsYXlIb3Jpem9udGFsU2Nyb2xsYmFyKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb3ZlcmxheUhvcml6b250YWxTY3JvbGxiYXIoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtT3ZlcmxheUhvcml6b250YWxTY3JvbGxiYXI7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIHdoZXRoZXIgdmVydGljYWwgc2Nyb2xsYmFyIGhhcyBvdmVybGF5IHN0eWxlCi0gICAgICogQHJldHVybiBUUlVFIGlmIHZlcnRpY2FsIHNjcm9sbGJhciBoYXMgb3ZlcmxheSBzdHlsZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjb3ZlcmxheVZlcnRpY2FsU2Nyb2xsYmFyKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb3ZlcmxheVZlcnRpY2FsU2Nyb2xsYmFyKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbU92ZXJsYXlWZXJ0aWNhbFNjcm9sbGJhcjsKQEAgLTE5MzQsMTEgKzE5MjcsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgdmlzaWJsZSBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIGVtYmVkZGVkIHRpdGxlIGJhciAoaWYgYW55KS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhpcyBtZXRob2QgaXMgb2Jzb2xldGUgYW5kIGFsd2F5cyByZXR1cm5zIDAuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm93IG9ic29sZXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRWaXNpYmxlVGl0bGVIZWlnaHQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0VmlzaWJsZVRpdGxlSGVpZ2h0KCkgewogICAgICAgICAvLyBBY3R1YWxseSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBlbWJlZGRlZCB0aXRsZSBiYXIgaWYgb25lIGlzIHNldCB2aWEgdGhlCkBAIC0xOTg1LDE3ICsxOTc2LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgU1NMIGNlcnRpZmljYXRlIGZvciB0aGUgbWFpbiB0b3AtbGV2ZWwgcGFnZSBvciBudWxsIGlmCi0gICAgICogdGhlcmUgaXMgbm8gY2VydGlmaWNhdGUgKHRoZSBzaXRlIGlzIG5vdCBzZWN1cmUpLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRDZXJ0aWZpY2F0ZSgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTc2xDZXJ0aWZpY2F0ZSBnZXRDZXJ0aWZpY2F0ZSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1DZXJ0aWZpY2F0ZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBTU0wgY2VydGlmaWNhdGUgZm9yIHRoZSBtYWluIHRvcC1sZXZlbCBwYWdlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXRDZXJ0aWZpY2F0ZShTc2xDZXJ0aWZpY2F0ZSl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q2VydGlmaWNhdGUoU3NsQ2VydGlmaWNhdGUgY2VydGlmaWNhdGUpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKQEAgLTIwMTAsMjYgKzIwMDIsMTggQEAKICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8qKgotICAgICAqIFNhdmUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgYSBwYXJ0aWN1bGFyIGhvc3QgaW4gdGhlIFdlYlZpZXcncwotICAgICAqIGludGVybmFsIGRhdGFiYXNlLgotICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IHRoYXQgcmVxdWlyZWQgdGhlIGNyZWRlbnRpYWxzLgotICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgZm9yIHRoZSBnaXZlbiBob3N0LgotICAgICAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgZm9yIHRoZSBnaXZlbiBob3N0LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzYXZlUGFzc3dvcmQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2F2ZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtRGF0YWJhc2Uuc2V0VXNlcm5hbWVQYXNzd29yZChob3N0LCB1c2VybmFtZSwgcGFzc3dvcmQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgSFRUUCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyBmb3IgYSBnaXZlbiBob3N0IGFuZCByZWFsbS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBob3N0IFRoZSBob3N0IGZvciB0aGUgY3JlZGVudGlhbHMuCi0gICAgICogQHBhcmFtIHJlYWxtIFRoZSByZWFsbSBmb3IgdGhlIGNyZWRlbnRpYWxzLgotICAgICAqIEBwYXJhbSB1c2VybmFtZSBUaGUgdXNlcm5hbWUgZm9yIHRoZSBwYXNzd29yZC4gSWYgaXQgaXMgbnVsbCwgaXQgbWVhbnMKLSAgICAgKiAgICAgICAgICAgICAgICAgcGFzc3dvcmQgY2FuJ3QgYmUgc2F2ZWQuCi0gICAgICogQHBhcmFtIHBhc3N3b3JkIFRoZSBwYXNzd29yZAorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIGhvc3QsIFN0cmluZyByZWFsbSwKICAgICAgICAgICAgIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CkBAIC0yMDM3LDE0ICsyMDIxLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXRyaWV2ZSB0aGUgSFRUUCBhdXRoZW50aWNhdGlvbiB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIGEgZ2l2ZW4KLSAgICAgKiBob3N0ICYgcmVhbG0gcGFpcgotICAgICAqCi0gICAgICogQHBhcmFtIGhvc3QgVGhlIGhvc3QgZm9yIHdoaWNoIHRoZSBjcmVkZW50aWFscyBhcHBseS4KLSAgICAgKiBAcGFyYW0gcmVhbG0gVGhlIHJlYWxtIGZvciB3aGljaCB0aGUgY3JlZGVudGlhbHMgYXBwbHkuCi0gICAgICogQHJldHVybiBTdHJpbmdbXSBpZiBmb3VuZCwgU3RyaW5nWzBdIGlzIHVzZXJuYW1lLCB3aGljaCBjYW4gYmUgbnVsbCBhbmQKLSAgICAgKiAgICAgICAgIFN0cmluZ1sxXSBpcyBwYXNzd29yZC4gUmV0dXJuIG51bGwgaWYgaXQgY2FuJ3QgZmluZCBhbnl0aGluZy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZywgU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SHR0cEF1dGhVc2VybmFtZVBhc3N3b3JkKFN0cmluZyBob3N0LCBTdHJpbmcgcmVhbG0pIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1EYXRhYmFzZS5nZXRIdHRwQXV0aFVzZXJuYW1lUGFzc3dvcmQoaG9zdCwgcmVhbG0pOwpAQCAtMjA4MiwxMCArMjA2MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVzdHJveSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIFdlYlZpZXcuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQKLSAgICAgKiBhZnRlciB0aGUgV2ViVmlldyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHZpZXcgc3lzdGVtLiBObyBvdGhlcgotICAgICAqIG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBvbiBhIFdlYlZpZXcgYWZ0ZXIgZGVzdHJveS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZGVzdHJveSgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGRlc3Ryb3lJbXBsKCk7CkBAIC0yMTE1LDEwICsyMDkzLDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbmFibGVzIHBsYXRmb3JtIG5vdGlmaWNhdGlvbnMgb2YgZGF0YSBzdGF0ZSBhbmQgcHJveHkgY2hhbmdlcy4KLSAgICAgKiBOb3RpZmljYXRpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgb2Jzb2xldGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2VuYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpfQogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuYWJsZVBsYXRmb3JtTm90aWZpY2F0aW9ucygpIHsKQEAgLTIxMzIsMTAgKzIxMDcsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIERpc2FibGVzIHBsYXRmb3JtIG5vdGlmaWNhdGlvbnMgb2YgZGF0YSBzdGF0ZSBhbmQgcHJveHkgY2hhbmdlcy4KLSAgICAgKiBOb3RpZmljYXRpb25zIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgb2Jzb2xldGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2Rpc2FibGVQbGF0Zm9ybU5vdGlmaWNhdGlvbnMoKX0KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkaXNhYmxlUGxhdGZvcm1Ob3RpZmljYXRpb25zKCkgewpAQCAtMjE2MSwxMSArMjEzMyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSW5mb3JtIFdlYlZpZXcgb2YgdGhlIG5ldHdvcmsgc3RhdGUuIFRoaXMgaXMgdXNlZCB0byBzZXQKLSAgICAgKiB0aGUgSmF2YVNjcmlwdCBwcm9wZXJ0eSB3aW5kb3cubmF2aWdhdG9yLmlzT25saW5lIGFuZAotICAgICAqIGdlbmVyYXRlcyB0aGUgb25saW5lL29mZmxpbmUgZXZlbnQgYXMgc3BlY2lmaWVkIGluIEhUTUw1LCBzZWMuIDUuNy43Ci0gICAgICogQHBhcmFtIG5ldHdvcmtVcCBib29sZWFuIGluZGljYXRpbmcgaWYgbmV0d29yayBpcyBhdmFpbGFibGUKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0TmV0d29ya0F2YWlsYWJsZShib29sZWFuKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXROZXR3b3JrQXZhaWxhYmxlKGJvb2xlYW4gbmV0d29ya1VwKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5TRVRfTkVUV09SS19TVEFURSwKQEAgLTIxODMsMTkgKzIxNTMsMTEgQEAKICAgICAgICAgbWFwLnB1dCgic3VidHlwZSIsIHN1YnR5cGUpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuU0VUX05FVFdPUktfVFlQRSwgbWFwKTsKICAgICB9CisKICAgICAvKioKLSAgICAgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIFdlYlZpZXcgdXNlZCBpbgotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblNhdmVJbnN0YW5jZVN0YXRlfS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzCi0gICAgICogbWV0aG9kIG5vIGxvbmdlciBzdG9yZXMgdGhlIGRpc3BsYXkgZGF0YSBmb3IgdGhpcyBXZWJWaWV3LiBUaGUgcHJldmlvdXMKLSAgICAgKiBiZWhhdmlvciBjb3VsZCBwb3RlbnRpYWxseSBsZWFrIGZpbGVzIGlmIHtAbGluayAjcmVzdG9yZVN0YXRlfSB3YXMgbmV2ZXIKLSAgICAgKiBjYWxsZWQuIFNlZSB7QGxpbmsgI3NhdmVQaWN0dXJlfSBhbmQge0BsaW5rICNyZXN0b3JlUGljdHVyZX0gZm9yIHNhdmluZwotICAgICAqIGFuZCByZXN0b3JpbmcgdGhlIGRpc3BsYXkgZGF0YS4KLSAgICAgKiBAcGFyYW0gb3V0U3RhdGUgVGhlIEJ1bmRsZSB0byBzdG9yZSB0aGUgV2ViVmlldyBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBzYW1lIGNvcHkgb2YgdGhlIGJhY2svZm9yd2FyZCBsaXN0IHVzZWQgdG8gc2F2ZSB0aGUgc3RhdGUuIElmCi0gICAgICogICAgICAgICBzYXZlU3RhdGUgZmFpbHMsIHRoZSByZXR1cm5lZCBsaXN0IHdpbGwgYmUgbnVsbC4KLSAgICAgKiBAc2VlICNzYXZlUGljdHVyZQotICAgICAqIEBzZWUgI3Jlc3RvcmVQaWN0dXJlCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NhdmVTdGF0ZShCdW5kbGUpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBXZWJCYWNrRm9yd2FyZExpc3Qgc2F2ZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAob3V0U3RhdGUgPT0gbnVsbCkgewpAQCAtMjI0NCwxNCArMjIwNiw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2F2ZSB0aGUgY3VycmVudCBkaXNwbGF5IGRhdGEgdG8gdGhlIEJ1bmRsZSBnaXZlbi4gVXNlZCBpbiBjb25qdW5jdGlvbgotICAgICAqIHdpdGgge0BsaW5rICNzYXZlU3RhdGV9LgotICAgICAqIEBwYXJhbSBiIEEgQnVuZGxlIHRvIHN0b3JlIHRoZSBkaXNwbGF5IGRhdGEuCi0gICAgICogQHBhcmFtIGRlc3QgVGhlIGZpbGUgdG8gc3RvcmUgdGhlIHNlcmlhbGl6ZWQgcGljdHVyZSBkYXRhLiBXaWxsIGJlCi0gICAgICogICAgICAgICAgICAgb3ZlcndyaXR0ZW4gd2l0aCB0aGlzIFdlYlZpZXcncyBwaWN0dXJlIGRhdGEuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwaWN0dXJlIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm93IG9ic29sZXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzYXZlUGljdHVyZShCdW5kbGUsIEZpbGUpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGJvb2xlYW4gc2F2ZVBpY3R1cmUoQnVuZGxlIGIsIGZpbmFsIEZpbGUgZGVzdCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwpAQCAtMjMxMSwxNSArMjI2OCw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVzdG9yZSB0aGUgZGlzcGxheSBkYXRhIHRoYXQgd2FzIHNhdmUgaW4ge0BsaW5rICNzYXZlUGljdHVyZX0uIFVzZWQgaW4KLSAgICAgKiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjcmVzdG9yZVN0YXRlfS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHdvcmsgaWYgdGhlIFdlYlZpZXcgaXMgaGFyZHdhcmUgYWNjZWxlcmF0ZWQuCi0gICAgICogQHBhcmFtIGIgQSBCdW5kbGUgY29udGFpbmluZyB0aGUgc2F2ZWQgZGlzcGxheSBkYXRhLgotICAgICAqIEBwYXJhbSBzcmMgVGhlIGZpbGUgd2hlcmUgdGhlIHBpY3R1cmUgZGF0YSB3YXMgc3RvcmVkLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGljdHVyZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlc3RvcmVkLgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdyBvYnNvbGV0ZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcmVzdG9yZVBpY3R1cmUoQnVuZGxlLCBGaWxlKX07CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYm9vbGVhbiByZXN0b3JlUGljdHVyZShCdW5kbGUgYiwgRmlsZSBzcmMpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKQEAgLTI0MDIsNyArMjM1Myw2IEBACiAgICAgLyoqCiAgICAgICogQ2xlYXJzIHRoZSB2aWV3IHN0YXRlIHNldCB3aXRoIHtAbGluayAjbG9hZFZpZXdTdGF0ZShJbnB1dFN0cmVhbSl9LgogICAgICAqIFRoaXMgV2ViVmlldyB3aWxsIHRoZW4gc3dpdGNoIHRvIHNob3dpbmcgdGhlIGNvbnRlbnQgZnJvbSB3ZWJraXQKLSAgICAgKiBAaGlkZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyVmlld1N0YXRlKCkgewogICAgICAgICBtQmxvY2tXZWJraXRWaWV3TWVzc2FnZXMgPSBmYWxzZTsKQEAgLTI0MTEsMTkgKzIzNjEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoaXMgV2ViVmlldyBmcm9tIHRoZSBnaXZlbiBtYXAgdXNlZCBpbgotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblJlc3RvcmVJbnN0YW5jZVN0YXRlfS4gVGhpcyBtZXRob2Qgc2hvdWxkCi0gICAgICogYmUgY2FsbGVkIHRvIHJlc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSBXZWJWaWV3IGJlZm9yZSB1c2luZyB0aGUgb2JqZWN0LiBJZgotICAgICAqIGl0IGlzIGNhbGxlZCBhZnRlciB0aGUgV2ViVmlldyBoYXMgaGFkIGEgY2hhbmNlIHRvIGJ1aWxkIHN0YXRlIChsb2FkCi0gICAgICogcGFnZXMsIGNyZWF0ZSBhIGJhY2svZm9yd2FyZCBsaXN0LCBldGMuKSB0aGVyZSBtYXkgYmUgdW5kZXNpcmFibGUKLSAgICAgKiBzaWRlLWVmZmVjdHMuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2Qgbm8gbG9uZ2VyIHJlc3RvcmVzIHRoZQotICAgICAqIGRpc3BsYXkgZGF0YSBmb3IgdGhpcyBXZWJWaWV3LiBTZWUge0BsaW5rICNzYXZlUGljdHVyZX0gYW5kIHtAbGluawotICAgICAqICNyZXN0b3JlUGljdHVyZX0gZm9yIHNhdmluZyBhbmQgcmVzdG9yaW5nIHRoZSBkaXNwbGF5IGRhdGEuCi0gICAgICogQHBhcmFtIGluU3RhdGUgVGhlIGluY29taW5nIEJ1bmRsZSBvZiBzdGF0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByZXN0b3JlZCBiYWNrL2ZvcndhcmQgbGlzdCBvciBudWxsIGlmIHJlc3RvcmVTdGF0ZSBmYWlsZWQuCi0gICAgICogQHNlZSAjc2F2ZVBpY3R1cmUKLSAgICAgKiBAc2VlICNyZXN0b3JlUGljdHVyZQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNyZXN0b3JlU3RhdGUoQnVuZGxlKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgV2ViQmFja0ZvcndhcmRMaXN0IHJlc3RvcmVTdGF0ZShCdW5kbGUgaW5TdGF0ZSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJCYWNrRm9yd2FyZExpc3QgcmV0dXJuTGlzdCA9IG51bGw7CkBAIC0yNDc4LDE1ICsyNDE4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBnaXZlbiBVUkwgd2l0aCB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgSFRUUCBoZWFkZXJzLgotICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC4KLSAgICAgKiBAcGFyYW0gYWRkaXRpb25hbEh0dHBIZWFkZXJzIFRoZSBhZGRpdGlvbmFsIGhlYWRlcnMgdG8gYmUgdXNlZCBpbiB0aGUKLSAgICAgKiAgICAgICAgICAgIEhUVFAgcmVxdWVzdCBmb3IgdGhpcyBVUkwsIHNwZWNpZmllZCBhcyBhIG1hcCBmcm9tIG5hbWUgdG8KLSAgICAgKiAgICAgICAgICAgIHZhbHVlLiBOb3RlIHRoYXQgaWYgdGhpcyBtYXAgY29udGFpbnMgYW55IG9mIHRoZSBoZWFkZXJzCi0gICAgICogICAgICAgICAgICB0aGF0IGFyZSBzZXQgYnkgZGVmYXVsdCBieSB0aGUgV2ViVmlldywgc3VjaCBhcyB0aG9zZQotICAgICAqICAgICAgICAgICAgY29udHJvbGxpbmcgY2FjaGluZywgYWNjZXB0IHR5cGVzIG9yIHRoZSBVc2VyLUFnZW50LCB0aGVpcgotICAgICAqICAgICAgICAgICAgdmFsdWVzIG1heSBiZSBvdmVycmlkZW4gYnkgdGhlIFdlYlZpZXcncyBkZWZhdWx0cy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjbG9hZFVybChTdHJpbmcsIE1hcCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbG9hZFVybChTdHJpbmcgdXJsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIdHRwSGVhZGVycykgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBsb2FkVXJsSW1wbCh1cmwsIGFkZGl0aW9uYWxIdHRwSGVhZGVycyk7CkBAIC0yNTAyLDkgKzI0MzYsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgdGhlIGdpdmVuIFVSTC4KLSAgICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHRvIGxvYWQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2xvYWRVcmwoU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBsb2FkVXJsKFN0cmluZyB1cmwpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgbG9hZFVybEltcGwodXJsKTsKQEAgLTI1MTgsMTMgKzI0NTIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgdGhlIHVybCB3aXRoIHBvc3REYXRhIHVzaW5nICJQT1NUIiBtZXRob2QgaW50byB0aGUgV2ViVmlldy4gSWYgdXJsCi0gICAgICogaXMgbm90IGEgbmV0d29yayB1cmwsIGl0IHdpbGwgYmUgbG9hZGVkIHdpdGgge2xpbmsKLSAgICAgKiB7QGxpbmsgI2xvYWRVcmwoU3RyaW5nKX0gaW5zdGVhZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwgVGhlIHVybCBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZC4KLSAgICAgKiBAcGFyYW0gcG9zdERhdGEgVGhlIGRhdGEgd2lsbCBiZSBwYXNzZWQgdG8gIlBPU1QiIHJlcXVlc3QuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3Bvc3RVcmwoU3RyaW5nLCBieXRlW10pfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHBvc3RVcmwoU3RyaW5nIHVybCwgYnl0ZVtdIHBvc3REYXRhKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChVUkxVdGlsLmlzTmV0d29ya1VybCh1cmwpKSB7CkBAIC0yNTQwLDMxICsyNDcwLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBnaXZlbiBkYXRhIGludG8gdGhlIFdlYlZpZXcgdXNpbmcgYSAnZGF0YScgc2NoZW1lIFVSTC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgSmF2YVNjcmlwdCdzIHNhbWUgb3JpZ2luIHBvbGljeSBtZWFucyB0aGF0IHNjcmlwdCBydW5uaW5nIGluIGEKLSAgICAgKiBwYWdlIGxvYWRlZCB1c2luZyB0aGlzIG1ldGhvZCB3aWxsIGJlIHVuYWJsZSB0byBhY2Nlc3MgY29udGVudCBsb2FkZWQKLSAgICAgKiB1c2luZyBhbnkgc2NoZW1lIG90aGVyIHRoYW4gJ2RhdGEnLCBpbmNsdWRpbmcgJ2h0dHAocyknLiBUbyBhdm9pZCB0aGlzCi0gICAgICogcmVzdHJpY3Rpb24sIHVzZSB7QGxpbmsKLSAgICAgKiAjbG9hZERhdGFXaXRoQmFzZVVSTChTdHJpbmcsU3RyaW5nLFN0cmluZyxTdHJpbmcsU3RyaW5nKQotICAgICAqIGxvYWREYXRhV2l0aEJhc2VVUkwoKX0gd2l0aCBhbiBhcHByb3ByaWF0ZSBiYXNlIFVSTC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGVuY29kaW5nIHBhcmFtZXRlciBpcyAnYmFzZTY0JywgdGhlbiB0aGUgZGF0YSBtdXN0Ci0gICAgICogYmUgZW5jb2RlZCBhcyBiYXNlNjQuIE90aGVyd2lzZSwgdGhlIGRhdGEgbXVzdCB1c2UgQVNDSUkgZW5jb2RpbmcgZm9yCi0gICAgICogb2N0ZXRzIGluc2lkZSB0aGUgcmFuZ2Ugb2Ygc2FmZSBVUkwgY2hhcmFjdGVycyBhbmQgdXNlIHRoZSBzdGFuZGFyZCAleHgKLSAgICAgKiBoZXggZW5jb2Rpbmcgb2YgVVJMcyBmb3Igb2N0ZXRzIG91dHNpZGUgdGhhdCByYW5nZS4gRm9yIGV4YW1wbGUsCi0gICAgICogJyMnLCAnJScsICdcJywgJz8nIHNob3VsZCBiZSByZXBsYWNlZCBieSAlMjMsICUyNSwgJTI3LCAlM2YgcmVzcGVjdGl2ZWx5LgotICAgICAqIDxwPgotICAgICAqIFRoZSAnZGF0YScgc2NoZW1lIFVSTCBmb3JtZWQgYnkgdGhpcyBtZXRob2QgdXNlcyB0aGUgZGVmYXVsdCBVUy1BU0NJSQotICAgICAqIGNoYXJzZXQuIElmIHlvdSBuZWVkIG5lZWQgdG8gc2V0IGEgZGlmZmVyZW50IGNoYXJzZXQsIHlvdSBzaG91bGQgZm9ybSBhCi0gICAgICogJ2RhdGEnIHNjaGVtZSBVUkwgd2hpY2ggZXhwbGljaXRseSBzcGVjaWZpZXMgYSBjaGFyc2V0IHBhcmFtZXRlciBpbiB0aGUKLSAgICAgKiBtZWRpYXR5cGUgcG9ydGlvbiBvZiB0aGUgVVJMIGFuZCBjYWxsIHtAbGluayAjbG9hZFVybChTdHJpbmcpfSBpbnN0ZWFkLgotICAgICAqIE5vdGUgdGhhdCB0aGUgY2hhcnNldCBvYnRhaW5lZCBmcm9tIHRoZSBtZWRpYXR5cGUgcG9ydGlvbiBvZiBhIGRhdGEgVVJMCi0gICAgICogYWx3YXlzIG92ZXJyaWRlcyB0aGF0IHNwZWNpZmllZCBpbiB0aGUgSFRNTCBvciBYTUwgZG9jdW1lbnQgaXRzZWxmLgotICAgICAqIEBwYXJhbSBkYXRhIEEgU3RyaW5nIG9mIGRhdGEgaW4gdGhlIGdpdmVuIGVuY29kaW5nLgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgTUlNRSB0eXBlIG9mIHRoZSBkYXRhLCBlLmcuICd0ZXh0L2h0bWwnLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGhlIGRhdGEuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2xvYWREYXRhKFN0cmluZywgU3RyaW5nLCBTdHJpbmcpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGxvYWREYXRhKFN0cmluZyBkYXRhLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBlbmNvZGluZykgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBsb2FkRGF0YUltcGwoZGF0YSwgbWltZVR5cGUsIGVuY29kaW5nKTsKQEAgLTI1ODIsMjcgKzI0OTAsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIExvYWQgdGhlIGdpdmVuIGRhdGEgaW50byB0aGUgV2ViVmlldywgdXNpbmcgYmFzZVVybCBhcyB0aGUgYmFzZSBVUkwgZm9yCi0gICAgICogdGhlIGNvbnRlbnQuIFRoZSBiYXNlIFVSTCBpcyB1c2VkIGJvdGggdG8gcmVzb2x2ZSByZWxhdGl2ZSBVUkxzIGFuZCB3aGVuCi0gICAgICogYXBwbHlpbmcgSmF2YVNjcmlwdCdzIHNhbWUgb3JpZ2luIHBvbGljeS4gVGhlIGhpc3RvcnlVcmwgaXMgdXNlZCBmb3IgdGhlCi0gICAgICogaGlzdG9yeSBlbnRyeS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgY29udGVudCBzcGVjaWZpZWQgaW4gdGhpcyB3YXkgY2FuIGFjY2VzcyBsb2NhbCBkZXZpY2UgZmlsZXMKLSAgICAgKiAodmlhICdmaWxlJyBzY2hlbWUgVVJMcykgb25seSBpZiBiYXNlVXJsIHNwZWNpZmllcyBhIHNjaGVtZSBvdGhlciB0aGFuCi0gICAgICogJ2h0dHAnLCAnaHR0cHMnLCAnZnRwJywgJ2Z0cHMnLCAnYWJvdXQnIG9yICdqYXZhc2NyaXB0Jy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgYmFzZSBVUkwgdXNlcyB0aGUgZGF0YSBzY2hlbWUsIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8KLSAgICAgKiBjYWxsaW5nIHtAbGluayAjbG9hZERhdGEoU3RyaW5nLFN0cmluZyxTdHJpbmcpIGxvYWREYXRhKCl9IGFuZCB0aGUKLSAgICAgKiBoaXN0b3J5VXJsIGlzIGlnbm9yZWQuCi0gICAgICogQHBhcmFtIGJhc2VVcmwgVVJMIHRvIHVzZSBhcyB0aGUgcGFnZSdzIGJhc2UgVVJMLiBJZiBudWxsIGRlZmF1bHRzIHRvCi0gICAgICogICAgICAgICAgICAnYWJvdXQ6YmxhbmsnCi0gICAgICogQHBhcmFtIGRhdGEgQSBTdHJpbmcgb2YgZGF0YSBpbiB0aGUgZ2l2ZW4gZW5jb2RpbmcuCi0gICAgICogQHBhcmFtIG1pbWVUeXBlIFRoZSBNSU1FVHlwZSBvZiB0aGUgZGF0YSwgZS5nLiAndGV4dC9odG1sJy4gSWYgbnVsbCwKLSAgICAgKiAgICAgICAgICAgIGRlZmF1bHRzIHRvICd0ZXh0L2h0bWwnLgotICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgZW5jb2Rpbmcgb2YgdGhlIGRhdGEuCi0gICAgICogQHBhcmFtIGhpc3RvcnlVcmwgVVJMIHRvIHVzZSBhcyB0aGUgaGlzdG9yeSBlbnRyeSwgaWYgbnVsbCBkZWZhdWx0cyB0bwotICAgICAqICAgICAgICAgICAgJ2Fib3V0OmJsYW5rJy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjbG9hZERhdGFXaXRoQmFzZVVSTChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbG9hZERhdGFXaXRoQmFzZVVSTChTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRhdGEsCiAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGhpc3RvcnlVcmwpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKQEAgLTI2MjMsMTAgKzI1MTMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNhdmVzIHRoZSBjdXJyZW50IHZpZXcgYXMgYSB3ZWIgYXJjaGl2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgZmlsZW5hbWUgd2hlcmUgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHBsYWNlZC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2F2ZVdlYkFyY2hpdmUoU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzYXZlV2ViQXJjaGl2ZShTdHJpbmcgZmlsZW5hbWUpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgc2F2ZVdlYkFyY2hpdmVJbXBsKGZpbGVuYW1lLCBmYWxzZSwgbnVsbCk7CkBAIC0yNjQ2LDE3ICsyNTM1LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTYXZlcyB0aGUgY3VycmVudCB2aWV3IGFzIGEgd2ViIGFyY2hpdmUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmFzZW5hbWUgVGhlIGZpbGVuYW1lIHdoZXJlIHRoZSBhcmNoaXZlIHNob3VsZCBiZSBwbGFjZWQuCi0gICAgICogQHBhcmFtIGF1dG9uYW1lIElmIGZhbHNlLCB0YWtlcyBiYXNlbmFtZSB0byBiZSBhIGZpbGUuIElmIHRydWUsIGJhc2VuYW1lCi0gICAgICogICAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgYSBkaXJlY3RvcnkgaW4gd2hpY2ggYSBmaWxlbmFtZSB3aWxsIGJlCi0gICAgICogICAgICAgICAgICAgICAgIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlIHVybCBvZiB0aGUgY3VycmVudCBwYWdlLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdGhlIHdlYiBhcmNoaXZlIGhhcyBiZWVuIHNhdmVkLiBUaGUKLSAgICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGZvciBvblJlY2VpdmVWYWx1ZSB3aWxsIGVpdGhlciBiZSB0aGUgZmlsZW5hbWUKLSAgICAgKiAgICAgICAgICAgICAgICAgdW5kZXIgd2hpY2ggdGhlIGZpbGUgd2FzIHNhdmVkLCBvciBudWxsIGlmIHNhdmluZyB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgZmlsZSBmYWlsZWQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NhdmVXZWJBcmNoaXZlKFN0cmluZywgYm9vbGVhbiwgVmFsdWVDYWxsYmFjayl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2F2ZVdlYkFyY2hpdmUoU3RyaW5nIGJhc2VuYW1lLCBib29sZWFuIGF1dG9uYW1lLCBWYWx1ZUNhbGxiYWNrPFN0cmluZz4gY2FsbGJhY2spIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgc2F2ZVdlYkFyY2hpdmVJbXBsKGJhc2VuYW1lLCBhdXRvbmFtZSwgY2FsbGJhY2spOwpAQCAtMjY2OSw4ICsyNTUwLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTdG9wIHRoZSBjdXJyZW50IGxvYWQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3N0b3BMb2FkaW5nKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RvcExvYWRpbmcoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjbGVhciBhbGwgdGhlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSBiZWZvcmUgc2VuZGluZwpAQCAtMjY4MCw4ICsyNTYyLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWxvYWQgdGhlIGN1cnJlbnQgdXJsLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNyZWxvYWQoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGNsZWFySGVscGVycygpOwpAQCAtMjY5MCw5ICsyNTczLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFdlYlZpZXcgaGFzIGEgYmFjayBoaXN0b3J5IGl0ZW0uCi0gICAgICogQHJldHVybiBUcnVlIGlmZiB0aGlzIFdlYlZpZXcgaGFzIGEgYmFjayBoaXN0b3J5IGl0ZW0uCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NhbkdvQmFjaygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNhbkdvQmFjaygpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgV2ViQmFja0ZvcndhcmRMaXN0IGwgPSBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKTsKQEAgLTI3MDYsMTcgKzI1ODksMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHbyBiYWNrIGluIHRoZSBoaXN0b3J5IG9mIHRoaXMgV2ViVmlldy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ29CYWNrKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZ29CYWNrKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBnb0JhY2tPckZvcndhcmRJbXBsKC0xKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFdlYlZpZXcgaGFzIGEgZm9yd2FyZCBoaXN0b3J5IGl0ZW0uCi0gICAgICogQHJldHVybiBUcnVlIGlmZiB0aGlzIFdlYnZpZXcgaGFzIGEgZm9yd2FyZCBoaXN0b3J5IGl0ZW0uCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NhbkdvRm9yd2FyZCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNhbkdvRm9yd2FyZCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgV2ViQmFja0ZvcndhcmRMaXN0IGwgPSBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKTsKQEAgLTI3MzAsMTkgKzI2MTQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHbyBmb3J3YXJkIGluIHRoZSBoaXN0b3J5IG9mIHRoaXMgV2ViVmlldy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ29Gb3J3YXJkKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZ29Gb3J3YXJkKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBnb0JhY2tPckZvcndhcmRJbXBsKDEpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBwYWdlIGNhbiBnbyBiYWNrIG9yIGZvcndhcmQgdGhlIGdpdmVuCi0gICAgICogbnVtYmVyIG9mIHN0ZXBzLgotICAgICAqIEBwYXJhbSBzdGVwcyBUaGUgbmVnYXRpdmUgb3IgcG9zaXRpdmUgbnVtYmVyIG9mIHN0ZXBzIHRvIG1vdmUgdGhlCi0gICAgICogICAgICAgICAgICAgIGhpc3RvcnkuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NhbkdvQmFja09yRm9yd2FyZChpbnQpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNhbkdvQmFja09yRm9yd2FyZChpbnQgc3RlcHMpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgV2ViQmFja0ZvcndhcmRMaXN0IGwgPSBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKTsKQEAgLTI3NTcsMTIgKzI2NDAsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdvIHRvIHRoZSBoaXN0b3J5IGl0ZW0gdGhhdCBpcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIGF3YXkgZnJvbQotICAgICAqIHRoZSBjdXJyZW50IGl0ZW0uIFN0ZXBzIGlzIG5lZ2F0aXZlIGlmIGJhY2t3YXJkIGFuZCBwb3NpdGl2ZQotICAgICAqIGlmIGZvcndhcmQuCi0gICAgICogQHBhcmFtIHN0ZXBzIFRoZSBudW1iZXIgb2Ygc3RlcHMgdG8gdGFrZSBiYWNrIG9yIGZvcndhcmQgaW4gdGhlIGJhY2sKLSAgICAgKiAgICAgICAgICAgICAgZm9yd2FyZCBsaXN0LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnb0JhY2tPckZvcndhcmQoaW50KX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBnb0JhY2tPckZvcndhcmQoaW50IHN0ZXBzKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGdvQmFja09yRm9yd2FyZEltcGwoc3RlcHMpOwpAQCAtMjc4MSw4ICsyNjYxLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgcHJpdmF0ZSBicm93c2luZyBpcyBlbmFibGVkIGluIHRoaXMgV2ViVmlldy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gZ2V0U2V0dGluZ3MoKS5pc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKTsKQEAgLTI4MDIsMTAgKzI2ODMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjcm9sbCB0aGUgY29udGVudHMgb2YgdGhlIHZpZXcgdXAgYnkgaGFsZiB0aGUgdmlldyBzaXplCi0gICAgICogQHBhcmFtIHRvcCB0cnVlIHRvIGp1bXAgdG8gdGhlIHRvcCBvZiB0aGUgcGFnZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFnZSB3YXMgc2Nyb2xsZWQKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcGFnZVVwKGJvb2xlYW4pfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHBhZ2VVcChib29sZWFuIHRvcCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAobU5hdGl2ZUNsYXNzID09IDApIHsKQEAgLTI4MjgsMTAgKzI3MDgsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNjcm9sbCB0aGUgY29udGVudHMgb2YgdGhlIHZpZXcgZG93biBieSBoYWxmIHRoZSBwYWdlIHNpemUKLSAgICAgKiBAcGFyYW0gYm90dG9tIHRydWUgdG8ganVtcCB0byBib3R0b20gb2YgcGFnZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFnZSB3YXMgc2Nyb2xsZWQKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcGFnZURvd24oYm9vbGVhbil9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcGFnZURvd24oYm9vbGVhbiBib3R0b20pIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKSB7CkBAIC0yODUzLDkgKzI3MzIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFyIHRoZSB2aWV3IHNvIHRoYXQgb25EcmF3KCkgd2lsbCBkcmF3IG5vdGhpbmcgYnV0IHdoaXRlIGJhY2tncm91bmQsCi0gICAgICogYW5kIG9uTWVhc3VyZSgpIHdpbGwgcmV0dXJuIDAgaWYgTWVhc3VyZVNwZWMgaXMgbm90IE1lYXN1cmVTcGVjLkVYQUNUTFkKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2xlYXJWaWV3KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXJWaWV3KCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtQ29udGVudFdpZHRoID0gMDsKQEAgLTI4NjUsMTQgKzI3NDQsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhIG5ldyBwaWN0dXJlIHRoYXQgY2FwdHVyZXMgdGhlIGN1cnJlbnQgZGlzcGxheSBvZiB0aGUgd2Vidmlldy4KLSAgICAgKiBUaGlzIGlzIGEgY29weSBvZiB0aGUgZGlzcGxheSwgYW5kIHdpbGwgYmUgdW5hZmZlY3RlZCBpZiB0aGUgd2VidmlldwotICAgICAqIGxhdGVyIGxvYWRzIGEgZGlmZmVyZW50IFVSTC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBwaWN0dXJlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHZpZXcuIE5vdGUgdGhpcwotICAgICAqICAgICAgICAgcGljdHVyZSBpcyBvZiB0aGUgZW50aXJlIGRvY3VtZW50LCBhbmQgaXMgbm90IHJlc3RyaWN0ZWQgdG8gdGhlCi0gICAgICogICAgICAgICBib3VuZHMgb2YgdGhlIHZpZXcuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NhcHR1cmVQaWN0dXJlKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFBpY3R1cmUgY2FwdHVyZVBpY3R1cmUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChtTmF0aXZlQ2xhc3MgPT0gMCkgcmV0dXJuIG51bGw7CkBAIC0yODgyLDkgKzI3NTYsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY3VycmVudCBzY2FsZSBvZiB0aGUgV2ViVmlldwotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgc2NhbGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFNjYWxlKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZsb2F0IGdldFNjYWxlKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLmdldFNjYWxlKCk7CkBAIC0yOTAwLDI1ICsyNzc0LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBpbml0aWFsIHNjYWxlIGZvciB0aGUgV2ViVmlldy4gMCBtZWFucyBkZWZhdWx0LiBJZgotICAgICAqIHtAbGluayBXZWJTZXR0aW5ncyNnZXRVc2VXaWRlVmlld1BvcnQoKX0gaXMgdHJ1ZSwgaXQgem9vbXMgb3V0IGFsbCB0aGUKLSAgICAgKiB3YXkuIE90aGVyd2lzZSBpdCBzdGFydHMgd2l0aCAxMDAlLiBJZiBpbml0aWFsIHNjYWxlIGlzIGdyZWF0ZXIgdGhhbiAwLAotICAgICAqIFdlYlZpZXcgc3RhcnRzIHdpdGggdGhpcyB2YWx1ZSBhcyBpbml0aWFsIHNjYWxlLgotICAgICAqIFBsZWFzZSBub3RlIHRoYXQgdW5saWtlIHRoZSBzY2FsZSBwcm9wZXJ0aWVzIGluIHRoZSB2aWV3cG9ydCBtZXRhIHRhZywKLSAgICAgKiB0aGlzIG1ldGhvZCBkb2Vzbid0IHRha2UgdGhlIHNjcmVlbiBkZW5zaXR5IGludG8gYWNjb3VudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzY2FsZUluUGVyY2VudCBUaGUgaW5pdGlhbCBzY2FsZSBpbiBwZXJjZW50LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXRJbml0aWFsU2NhbGUoaW50KX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRJbml0aWFsU2NhbGUoaW50IHNjYWxlSW5QZXJjZW50KSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1ab29tTWFuYWdlci5zZXRJbml0aWFsU2NhbGVJblBlcmNlbnQoc2NhbGVJblBlcmNlbnQpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEludm9rZSB0aGUgZ3JhcGhpY2FsIHpvb20gcGlja2VyIHdpZGdldCBmb3IgdGhpcyBXZWJWaWV3LiBUaGlzIHdpbGwKLSAgICAgKiByZXN1bHQgaW4gdGhlIHpvb20gd2lkZ2V0IGFwcGVhcmluZyBvbiB0aGUgc2NyZWVuIHRvIGNvbnRyb2wgdGhlIHpvb20KLSAgICAgKiBsZXZlbCBvZiB0aGlzIFdlYlZpZXcuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2ludm9rZVpvb21QaWNrZXIoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbnZva2Vab29tUGlja2VyKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAoIWdldFNldHRpbmdzKCkuc3VwcG9ydFpvb20oKSkgewpAQCAtMjkzMCwyMyArMjc5Nyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJuIGEgSGl0VGVzdFJlc3VsdCBiYXNlZCBvbiB0aGUgY3VycmVudCBjdXJzb3Igbm9kZS4gSWYgYSBIVE1MOjphIHRhZwotICAgICAqIGlzIGZvdW5kIGFuZCB0aGUgYW5jaG9yIGhhcyBhIG5vbi1KYXZhU2NyaXB0IHVybCwgdGhlIEhpdFRlc3RSZXN1bHQgdHlwZQotICAgICAqIGlzIHNldCB0byBTUkNfQU5DSE9SX1RZUEUgYW5kIHRoZSB1cmwgaXMgc2V0IGluIHRoZSAiZXh0cmEiIGZpZWxkLiBJZiB0aGUKLSAgICAgKiBhbmNob3IgZG9lcyBub3QgaGF2ZSBhIHVybCBvciBpZiBpdCBpcyBhIEphdmFTY3JpcHQgdXJsLCB0aGUgdHlwZSB3aWxsCi0gICAgICogYmUgVU5LTk9XTl9UWVBFIGFuZCB0aGUgdXJsIGhhcyB0byBiZSByZXRyaWV2ZWQgdGhyb3VnaAotICAgICAqIHtAbGluayAjcmVxdWVzdEZvY3VzTm9kZUhyZWZ9IGFzeW5jaHJvbm91c2x5LiBJZiBhIEhUTUw6OmltZyB0YWcgaXMKLSAgICAgKiBmb3VuZCwgdGhlIEhpdFRlc3RSZXN1bHQgdHlwZSBpcyBzZXQgdG8gSU1BR0VfVFlQRSBhbmQgdGhlIHVybCBpcyBzZXQgaW4KLSAgICAgKiB0aGUgImV4dHJhIiBmaWVsZC4gQSB0eXBlIG9mCi0gICAgICogU1JDX0lNQUdFX0FOQ0hPUl9UWVBFIGluZGljYXRlcyBhbiBhbmNob3Igd2l0aCBhIHVybCB0aGF0IGhhcyBhbiBpbWFnZSBhcwotICAgICAqIGEgY2hpbGQgbm9kZS4gSWYgYSBwaG9uZSBudW1iZXIgaXMgZm91bmQsIHRoZSBIaXRUZXN0UmVzdWx0IHR5cGUgaXMgc2V0Ci0gICAgICogdG8gUEhPTkVfVFlQRSBhbmQgdGhlIHBob25lIG51bWJlciBpcyBzZXQgaW4gdGhlICJleHRyYSIgZmllbGQgb2YKLSAgICAgKiBIaXRUZXN0UmVzdWx0LiBJZiBhIG1hcCBhZGRyZXNzIGlzIGZvdW5kLCB0aGUgSGl0VGVzdFJlc3VsdCB0eXBlIGlzIHNldAotICAgICAqIHRvIEdFT19UWVBFIGFuZCB0aGUgYWRkcmVzcyBpcyBzZXQgaW4gdGhlICJleHRyYSIgZmllbGQgb2YgSGl0VGVzdFJlc3VsdC4KLSAgICAgKiBJZiBhbiBlbWFpbCBhZGRyZXNzIGlzIGZvdW5kLCB0aGUgSGl0VGVzdFJlc3VsdCB0eXBlIGlzIHNldCB0byBFTUFJTF9UWVBFCi0gICAgICogYW5kIHRoZSBlbWFpbCBpcyBzZXQgaW4gdGhlICJleHRyYSIgZmllbGQgb2YgSGl0VGVzdFJlc3VsdC4gT3RoZXJ3aXNlLAotICAgICAqIEhpdFRlc3RSZXN1bHQgdHlwZSBpcyBzZXQgdG8gVU5LTk9XTl9UWVBFLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRIaXRUZXN0UmVzdWx0KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEhpdFRlc3RSZXN1bHQgZ2V0SGl0VGVzdFJlc3VsdCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1Jbml0aWFsSGl0VGVzdFJlc3VsdDsKQEAgLTI5ODAsMTkgKzI4MzMsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3QgdGhlIGFuY2hvciBvciBpbWFnZSBlbGVtZW50IFVSTCBhdCB0aGUgbGFzdCB0YXBwZWQgcG9pbnQuCi0gICAgICogSWYgaHJlZk1zZyBpcyBudWxsLCB0aGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5IGFuZCBkb2VzIG5vdAotICAgICAqIGRpc3BhdGNoIGhyZWZNc2cgdG8gaXRzIHRhcmdldC4gSWYgdGhlIHRhcHBlZCBwb2ludCBoaXRzIGFuIGltYWdlLAotICAgICAqIGFuIGFuY2hvciwgb3IgYW4gaW1hZ2UgaW4gYW4gYW5jaG9yLCB0aGUgbWVzc2FnZSBhc3NvY2lhdGVzCi0gICAgICogc3RyaW5ncyBpbiBuYW1lZCBrZXlzIGluIGl0cyBkYXRhLiBUaGUgdmFsdWUgcGFpcmVkIHdpdGggdGhlIGtleQotICAgICAqIG1heSBiZSBhbiBlbXB0eSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaHJlZk1zZyBUaGlzIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICByZXF1ZXN0LiBUaGUgbWVzc2FnZSBkYXRhIGNvbnRhaW5zIHRocmVlIGtleXM6Ci0gICAgICogICAgICAgICAgICAgICAgLSAidXJsIiByZXR1cm5zIHRoZSBhbmNob3IncyBocmVmIGF0dHJpYnV0ZS4KLSAgICAgKiAgICAgICAgICAgICAgICAtICJ0aXRsZSIgcmV0dXJucyB0aGUgYW5jaG9yJ3MgdGV4dC4KLSAgICAgKiAgICAgICAgICAgICAgICAtICJzcmMiIHJldHVybnMgdGhlIGltYWdlJ3Mgc3JjIGF0dHJpYnV0ZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjcmVxdWVzdEZvY3VzTm9kZUhyZWYoTWVzc2FnZSl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVxdWVzdEZvY3VzTm9kZUhyZWYoTWVzc2FnZSBocmVmTXNnKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChocmVmTXNnID09IG51bGwpIHsKQEAgLTMwMTMsMTIgKzI4NTYsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlcXVlc3QgdGhlIHVybCBvZiB0aGUgaW1hZ2UgbGFzdCB0b3VjaGVkIGJ5IHRoZSB1c2VyLiBtc2cgd2lsbCBiZSBzZW50Ci0gICAgICogdG8gaXRzIHRhcmdldCB3aXRoIGEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdXJsIGFzIGl0cyBvYmplY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXNnIFRoaXMgbWVzc2FnZSB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSByZXF1ZXN0Ci0gICAgICogICAgICAgICAgICBhcyB0aGUgZGF0YSBtZW1iZXIgd2l0aCAidXJsIiBhcyBrZXkuIFRoZSByZXN1bHQgY2FuIGJlIG51bGwuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3JlcXVlc3RJbWFnZVJlZihNZXNzYWdlKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0SW1hZ2VSZWYoTWVzc2FnZSBtc2cpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKDAgPT0gbU5hdGl2ZUNsYXNzKSByZXR1cm47IC8vIGNsaWVudCBpc24ndCBpbml0aWFsaXplZApAQCAtMzUyMSwxMSArMzM2MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB1cmwgZm9yIHRoZSBjdXJyZW50IHBhZ2UuIFRoaXMgaXMgbm90IGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgdXJsCi0gICAgICogcGFzc2VkIHRvIFdlYlZpZXdDbGllbnQub25QYWdlU3RhcnRlZCBiZWNhdXNlIGFsdGhvdWdoIHRoZSBsb2FkIGZvcgotICAgICAqIHRoYXQgdXJsIGhhcyBiZWd1biwgdGhlIGN1cnJlbnQgcGFnZSBtYXkgbm90IGhhdmUgY2hhbmdlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSB1cmwgZm9yIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFVybCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJIaXN0b3J5SXRlbSBoID0gbUNhbGxiYWNrUHJveHkuZ2V0QmFja0ZvcndhcmRMaXN0KCkuZ2V0Q3VycmVudEl0ZW0oKTsKQEAgLTM1MzMsMTMgKzMzNzEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgb3JpZ2luYWwgdXJsIGZvciB0aGUgY3VycmVudCBwYWdlLiBUaGlzIGlzIG5vdCBhbHdheXMgdGhlIHNhbWUKLSAgICAgKiBhcyB0aGUgdXJsIHBhc3NlZCB0byBXZWJWaWV3Q2xpZW50Lm9uUGFnZVN0YXJ0ZWQgYmVjYXVzZSBhbHRob3VnaCB0aGUKLSAgICAgKiBsb2FkIGZvciB0aGF0IHVybCBoYXMgYmVndW4sIHRoZSBjdXJyZW50IHBhZ2UgbWF5IG5vdCBoYXZlIGNoYW5nZWQuCi0gICAgICogQWxzbywgdGhlcmUgbWF5IGhhdmUgYmVlbiByZWRpcmVjdHMgcmVzdWx0aW5nIGluIGEgZGlmZmVyZW50IHVybCB0byB0aGF0Ci0gICAgICogb3JpZ2luYWxseSByZXF1ZXN0ZWQuCi0gICAgICogQHJldHVybiBUaGUgdXJsIHRoYXQgd2FzIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGZvciB0aGUgY3VycmVudCBwYWdlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRPcmlnaW5hbFVybCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JpZ2luYWxVcmwoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIFdlYkhpc3RvcnlJdGVtIGggPSBtQ2FsbGJhY2tQcm94eS5nZXRCYWNrRm9yd2FyZExpc3QoKS5nZXRDdXJyZW50SXRlbSgpOwpAQCAtMzU0NywxMCArMzM4MSw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB0aXRsZSBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQgcGFnZQotICAgICAqIHVudGlsIFdlYlZpZXdDbGllbnQub25SZWNlaXZlZFRpdGxlIGlzIGNhbGxlZC4KLSAgICAgKiBAcmV0dXJuIFRoZSB0aXRsZSBmb3IgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0VGl0bGUoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBXZWJIaXN0b3J5SXRlbSBoID0gbUNhbGxiYWNrUHJveHkuZ2V0QmFja0ZvcndhcmRMaXN0KCkuZ2V0Q3VycmVudEl0ZW0oKTsKQEAgLTM1NTgsMTAgKzMzOTEsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCB0aGUgZmF2aWNvbiBmb3IgdGhlIGN1cnJlbnQgcGFnZS4gVGhpcyBpcyB0aGUgZmF2aWNvbiBvZiB0aGUgY3VycmVudAotICAgICAqIHBhZ2UgdW50aWwgV2ViVmlld0NsaWVudC5vblJlY2VpdmVkSWNvbiBpcyBjYWxsZWQuCi0gICAgICogQHJldHVybiBUaGUgZmF2aWNvbiBmb3IgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0RmF2aWNvbigpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCaXRtYXAgZ2V0RmF2aWNvbigpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgV2ViSGlzdG9yeUl0ZW0gaCA9IG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpLmdldEN1cnJlbnRJdGVtKCk7CkBAIC0zNTY5LDM3ICszNDAxLDM2IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSB0b3VjaCBpY29uIHVybCBmb3IgdGhlIGFwcGxlLXRvdWNoLWljb24gPGxpbms+IGVsZW1lbnQsIG9yCi0gICAgICogYSBVUkwgb24gdGhpcyBzaXRlJ3Mgc2VydmVyIHBvaW50aW5nIHRvIHRoZSBzdGFuZGFyZCBsb2NhdGlvbiBvZiBhCi0gICAgICogdG91Y2ggaWNvbi4KLSAgICAgKiBAaGlkZQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRUb3VjaEljb25VcmwoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFRvdWNoSWNvblVybCgpIHsKICAgICAgICAgV2ViSGlzdG9yeUl0ZW0gaCA9IG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpLmdldEN1cnJlbnRJdGVtKCk7CiAgICAgICAgIHJldHVybiBoICE9IG51bGwgPyBoLmdldFRvdWNoSWNvblVybCgpIDogbnVsbDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb2dyZXNzIGZvciB0aGUgY3VycmVudCBwYWdlLgotICAgICAqIEByZXR1cm4gVGhlIHByb2dyZXNzIGZvciB0aGUgY3VycmVudCBwYWdlIGJldHdlZW4gMCBhbmQgMTAwLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRQcm9ncmVzcygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0UHJvZ3Jlc3MoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtQ2FsbGJhY2tQcm94eS5nZXRQcm9ncmVzcygpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgSFRNTCBjb250ZW50LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRDb250ZW50SGVpZ2h0KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb250ZW50SGVpZ2h0KCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbUNvbnRlbnRIZWlnaHQ7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgd2lkdGggb2YgdGhlIEhUTUwgY29udGVudC4KLSAgICAgKiBAaGlkZQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNnZXRDb250ZW50V2lkdGgoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldENvbnRlbnRXaWR0aCgpIHsKICAgICAgICAgcmV0dXJuIG1Db250ZW50V2lkdGg7CiAgICAgfQpAQCAtMzYxMiwzMiArMzQ0MywyNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBhdXNlIGFsbCBsYXlvdXQsIHBhcnNpbmcsIGFuZCBKYXZhU2NyaXB0IHRpbWVycyBmb3IgYWxsIHdlYnZpZXdzLiBUaGlzCi0gICAgICogaXMgYSBnbG9iYWwgcmVxdWVzdHMsIG5vdCByZXN0cmljdGVkIHRvIGp1c3QgdGhpcyB3ZWJ2aWV3LiBUaGlzIGNhbiBiZQotICAgICAqIHVzZWZ1bCBpZiB0aGUgYXBwbGljYXRpb24gaGFzIGJlZW4gcGF1c2VkLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNwYXVzZVRpbWVycygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHBhdXNlVGltZXJzKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuUEFVU0VfVElNRVJTKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXN1bWUgYWxsIGxheW91dCwgcGFyc2luZywgYW5kIEphdmFTY3JpcHQgdGltZXJzIGZvciBhbGwgd2Vidmlld3MuCi0gICAgICogVGhpcyB3aWxsIHJlc3VtZSBkaXNwYXRjaGluZyBhbGwgdGltZXJzLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNyZXN1bWVUaW1lcnMoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXN1bWVUaW1lcnMoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5SRVNVTUVfVElNRVJTKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDYWxsIHRoaXMgdG8gcGF1c2UgYW55IGV4dHJhIHByb2Nlc3NpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgV2ViVmlldyBhbmQKLSAgICAgKiBpdHMgYXNzb2NpYXRlZCBET00sIHBsdWdpbnMsIEphdmFTY3JpcHQgZXRjLiBGb3IgZXhhbXBsZSwgaWYgdGhlIFdlYlZpZXcKLSAgICAgKiBpcyB0YWtlbiBvZmZzY3JlZW4sIHRoaXMgY291bGQgYmUgY2FsbGVkIHRvIHJlZHVjZSB1bm5lY2Vzc2FyeSBDUFUgb3IKLSAgICAgKiBuZXR3b3JrIHRyYWZmaWMuIFdoZW4gdGhlIFdlYlZpZXcgaXMgYWdhaW4gImFjdGl2ZSIsIGNhbGwgb25SZXN1bWUoKS4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBwYXVzZVRpbWVycygpLCB3aGljaCBhZmZlY3RzIGFsbCBXZWJWaWV3cy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjb25QYXVzZSgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUGF1c2UoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmICghbUlzUGF1c2VkKSB7CkBAIC0zNjc0LDggKzM1MDAsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgdGhpcyB0byByZXN1bWUgYSBXZWJWaWV3IGFmdGVyIGEgcHJldmlvdXMgY2FsbCB0byBvblBhdXNlKCkuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I29uUmVzdW1lKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChtSXNQYXVzZWQpIHsKQEAgLTM2OTcsMjkgKzM1MjQsMjYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZpZXcgaXMgcGF1c2VkLCBtZWFuaW5nIG9uUGF1c2UoKSB3YXMgY2FsbGVkLiBDYWxsaW5nCi0gICAgICogb25SZXN1bWUoKSBzZXRzIHRoZSBwYXVzZWQgc3RhdGUgYmFjayB0byBmYWxzZS4KLSAgICAgKiBAaGlkZQorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNpc1BhdXNlZCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUGF1c2VkKCkgewogICAgICAgICByZXR1cm4gbUlzUGF1c2VkOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENhbGwgdGhpcyB0byBpbmZvcm0gdGhlIHZpZXcgdGhhdCBtZW1vcnkgaXMgbG93IHNvIHRoYXQgaXQgY2FuCi0gICAgICogZnJlZSBhbnkgYXZhaWxhYmxlIG1lbW9yeS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZnJlZU1lbW9yeSgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZyZWVNZW1vcnkoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1XZWJWaWV3Q29yZS5zZW5kTWVzc2FnZShFdmVudEh1Yi5GUkVFX01FTU9SWSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIHJlc291cmNlIGNhY2hlLiBOb3RlIHRoYXQgdGhlIGNhY2hlIGlzIHBlci1hcHBsaWNhdGlvbiwgc28KLSAgICAgKiB0aGlzIHdpbGwgY2xlYXIgdGhlIGNhY2hlIGZvciBhbGwgV2ViVmlld3MgdXNlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmNsdWRlRGlza0ZpbGVzIElmIGZhbHNlLCBvbmx5IHRoZSBSQU0gY2FjaGUgaXMgY2xlYXJlZC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjY2xlYXJDYWNoZShib29sZWFuKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlKGJvb2xlYW4gaW5jbHVkZURpc2tGaWxlcykgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICAvLyBOb3RlOiB0aGlzIHJlYWxseSBuZWVkcyB0byBiZSBhIHN0YXRpYyBtZXRob2QgYXMgaXQgY2xlYXJzIGNhY2hlIGZvciBhbGwKQEAgLTM3MzAsMTcgKzM1NTQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNYWtlIHN1cmUgdGhhdCBjbGVhcmluZyB0aGUgZm9ybSBkYXRhIHJlbW92ZXMgdGhlIGFkYXB0ZXIgZnJvbSB0aGUKLSAgICAgKiBjdXJyZW50bHkgZm9jdXNlZCB0ZXh0ZmllbGQgaWYgdGhlcmUgaXMgb25lLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjbGVhckZvcm1EYXRhKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xlYXJGb3JtRGF0YSgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IGIvNjA4MzA0MQogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlbGwgdGhlIFdlYlZpZXcgdG8gY2xlYXIgaXRzIGludGVybmFsIGJhY2svZm9yd2FyZCBsaXN0LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjbGVhckhpc3RvcnkoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhckhpc3RvcnkoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1DYWxsYmFja1Byb3h5LmdldEJhY2tGb3J3YXJkTGlzdCgpLnNldENsZWFyUGVuZGluZygpOwpAQCAtMzc0OCw0NiArMzU3MywzNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBTU0wgcHJlZmVyZW5jZXMgdGFibGUgc3RvcmVkIGluIHJlc3BvbnNlIHRvIHByb2NlZWRpbmcgd2l0aCBTU0wKLSAgICAgKiBjZXJ0aWZpY2F0ZSBlcnJvcnMuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NsZWFyU3NsUHJlZmVyZW5jZXMoKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhclNzbFByZWZlcmVuY2VzKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtV2ViVmlld0NvcmUuc2VuZE1lc3NhZ2UoRXZlbnRIdWIuQ0xFQVJfU1NMX1BSRUZfVEFCTEUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgV2ViQmFja0ZvcndhcmRMaXN0IGZvciB0aGlzIFdlYlZpZXcuIFRoaXMgY29udGFpbnMgdGhlCi0gICAgICogYmFjay9mb3J3YXJkIGxpc3QgZm9yIHVzZSBpbiBxdWVyeWluZyBlYWNoIGl0ZW0gaW4gdGhlIGhpc3Rvcnkgc3RhY2suCi0gICAgICogVGhpcyBpcyBhIGNvcHkgb2YgdGhlIHByaXZhdGUgV2ViQmFja0ZvcndhcmRMaXN0IHNvIGl0IGNvbnRhaW5zIG9ubHkgYQotICAgICAqIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHN0YXRlLiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuCi0gICAgICogZGlmZmVyZW50IG9iamVjdHMuIFRoZSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIG5vdCBiZQotICAgICAqIHVwZGF0ZWQgdG8gcmVmbGVjdCBhbnkgbmV3IHN0YXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjb3B5QmFja0ZvcndhcmRMaXN0KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFdlYkJhY2tGb3J3YXJkTGlzdCBjb3B5QmFja0ZvcndhcmRMaXN0KCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbUNhbGxiYWNrUHJveHkuZ2V0QmFja0ZvcndhcmRMaXN0KCkuY2xvbmUoKTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIEhpZ2hsaWdodCBhbmQgc2Nyb2xsIHRvIHRoZSBuZXh0IG9jY3VyYW5jZSBvZiBTdHJpbmcgaW4gZmluZEFsbC4KLSAgICAgKiBXcmFwcyB0aGUgcGFnZSBpbmZpbml0ZWx5LCBhbmQgc2Nyb2xscy4gIE11c3QgYmUgY2FsbGVkIGFmdGVyCi0gICAgICogY2FsbGluZyBmaW5kQWxsLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcndhcmQgRGlyZWN0aW9uIHRvIHNlYXJjaC4KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZmluZE5leHQoYm9vbGVhbil9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmluZE5leHQoYm9vbGVhbiBmb3J3YXJkKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmICgwID09IG1OYXRpdmVDbGFzcykgcmV0dXJuOyAvLyBjbGllbnQgaXNuJ3QgaW5pdGlhbGl6ZWQKICAgICAgICAgbVdlYlZpZXdDb3JlLnNlbmRNZXNzYWdlKEV2ZW50SHViLkZJTkRfTkVYVCwgZm9yd2FyZCA/IDEgOiAwKTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIEZpbmQgYWxsIGluc3RhbmNlcyBvZiBmaW5kIG9uIHRoZSBwYWdlIGFuZCBoaWdobGlnaHQgdGhlbS4KLSAgICAgKiBAcGFyYW0gZmluZCAgU3RyaW5nIHRvIGZpbmQuCi0gICAgICogQHJldHVybiBpbnQgIFRoZSBudW1iZXIgb2Ygb2NjdXJhbmNlcyBvZiB0aGUgU3RyaW5nICJmaW5kIgotICAgICAqICAgICAgICAgICAgICB0aGF0IHdlcmUgZm91bmQuCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2ZpbmRBbGwoU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGZpbmRBbGwoU3RyaW5nIGZpbmQpIHsKICAgICAgICAgcmV0dXJuIGZpbmRBbGxCb2R5KGZpbmQsIGZhbHNlKTsKICAgICB9CkBAIC0zOTM1LDkgKzM3NTEsMTAgQEAKICAgICAgICAgcmV0dXJuIFdlYlZpZXdDb3JlLm5hdGl2ZUZpbmRBZGRyZXNzKGFkZHIsIGNhc2VJbnNlbnNpdGl2ZSk7CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBDbGVhciB0aGUgaGlnaGxpZ2h0aW5nIHN1cnJvdW5kaW5nIHRleHQgbWF0Y2hlcyBjcmVhdGVkIGJ5IGZpbmRBbGwuCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2NsZWFyTWF0Y2hlcygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyTWF0Y2hlcygpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgaWYgKG1OYXRpdmVDbGFzcyA9PSAwKQpAQCAtMzk2NSwxMSArMzc4Miw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUXVlcnkgdGhlIGRvY3VtZW50IHRvIHNlZSBpZiBpdCBjb250YWlucyBhbnkgaW1hZ2UgcmVmZXJlbmNlcy4gVGhlCi0gICAgICogbWVzc2FnZSBvYmplY3Qgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYXJnMSBiZWluZyBzZXQgdG8gMSBpZiBpbWFnZXMKLSAgICAgKiB3ZXJlIGZvdW5kIGFuZCAwIGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCByZWZlcmVuY2UgYW55IGltYWdlcy4KLSAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCB0aGUgcmVzdWx0LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNkb2N1bWVudEhhc0ltYWdlcyhNZXNzYWdlKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkb2N1bWVudEhhc0ltYWdlcyhNZXNzYWdlIHJlc3BvbnNlKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChyZXNwb25zZSA9PSBudWxsKSB7CkBAIC00Mzk2LDEwICs0MjExLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIFdlYlZpZXdDbGllbnQgdGhhdCB3aWxsIHJlY2VpdmUgdmFyaW91cyBub3RpZmljYXRpb25zIGFuZAotICAgICAqIHJlcXVlc3RzLiBUaGlzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBoYW5kbGVyLgotICAgICAqIEBwYXJhbSBjbGllbnQgQW4gaW1wbGVtZW50YXRpb24gb2YgV2ViVmlld0NsaWVudC4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0V2ViVmlld0NsaWVudChXZWJWaWV3Q2xpZW50KX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRXZWJWaWV3Q2xpZW50KFdlYlZpZXdDbGllbnQgY2xpZW50KSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1DYWxsYmFja1Byb3h5LnNldFdlYlZpZXdDbGllbnQoY2xpZW50KTsKQEAgLTQ0MTYsMjIgKzQyMzAsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWdpc3RlciB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgd2hlbiBjb250ZW50IGNhbiBub3QgYmUgaGFuZGxlZCBieQotICAgICAqIHRoZSByZW5kZXJpbmcgZW5naW5lLCBhbmQgc2hvdWxkIGJlIGRvd25sb2FkZWQgaW5zdGVhZC4gVGhpcyB3aWxsIHJlcGxhY2UKLSAgICAgKiB0aGUgY3VycmVudCBoYW5kbGVyLgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb3dubG9hZExpc3RlbmVyLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNzZXREb3dubG9hZExpc3RlbmVyKERvd25sb2FkTGlzdGVuZXIpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERvd25sb2FkTGlzdGVuZXIoRG93bmxvYWRMaXN0ZW5lciBsaXN0ZW5lcikgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBtQ2FsbGJhY2tQcm94eS5zZXREb3dubG9hZExpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNocm9tZSBoYW5kbGVyLiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFdlYkNocm9tZUNsaWVudCBmb3IKLSAgICAgKiB1c2UgaW4gaGFuZGxpbmcgSmF2YVNjcmlwdCBkaWFsb2dzLCBmYXZpY29ucywgdGl0bGVzLCBhbmQgdGhlIHByb2dyZXNzLgotICAgICAqIFRoaXMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IGhhbmRsZXIuCi0gICAgICogQHBhcmFtIGNsaWVudCBBbiBpbXBsZW1lbnRhdGlvbiBvZiBXZWJDaHJvbWVDbGllbnQuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3NldFdlYkNocm9tZUNsaWVudChXZWJDaHJvbWVDbGllbnQpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFdlYkNocm9tZUNsaWVudChXZWJDaHJvbWVDbGllbnQgY2xpZW50KSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIG1DYWxsYmFja1Byb3h5LnNldFdlYkNocm9tZUNsaWVudChjbGllbnQpOwpAQCAtNDQ2NywxMSArNDI3Nyw5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBQaWN0dXJlIGxpc3RlbmVyLiBUaGlzIGlzIGFuIGludGVyZmFjZSB1c2VkIHRvIHJlY2VpdmUKLSAgICAgKiBub3RpZmljYXRpb25zIG9mIGEgbmV3IFBpY3R1cmUuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIEFuIGltcGxlbWVudGF0aW9uIG9mIFdlYlZpZXcuUGljdHVyZUxpc3RlbmVyLgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgbWV0aG9kIGlzIG5vdyBvYnNvbGV0ZS4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0UGljdHVyZUxpc3RlbmVyKFBpY3R1cmVMaXN0ZW5lcil9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRQaWN0dXJlTGlzdGVuZXIoUGljdHVyZUxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CkBAIC00NDk1LDMxICs0MzAzLDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpbmplY3RzIHRoZSBzdXBwbGllZCBKYXZhIG9iamVjdCBpbnRvIHRoZSBXZWJWaWV3LiBUaGUKLSAgICAgKiBvYmplY3QgaXMgaW5qZWN0ZWQgaW50byB0aGUgSmF2YVNjcmlwdCBjb250ZXh0IG9mIHRoZSBtYWluIGZyYW1lLCB1c2luZwotICAgICAqIHRoZSBzdXBwbGllZCBuYW1lLiBUaGlzIGFsbG93cyB0aGUgSmF2YSBvYmplY3QgdG8gYmUgYWNjZXNzZWQgZnJvbQotICAgICAqIEphdmFTY3JpcHQuIE5vdGUgdGhhdCB0aGF0IGluamVjdGVkIG9iamVjdHMgd2lsbCBub3QgYXBwZWFyIGluCi0gICAgICogSmF2YVNjcmlwdCB1bnRpbCB0aGUgcGFnZSBpcyBuZXh0IChyZSlsb2FkZWQuIEZvciBleGFtcGxlOgotICAgICAqIDxwcmU+IHdlYlZpZXcuYWRkSmF2YXNjcmlwdEludGVyZmFjZShuZXcgT2JqZWN0KCksICJpbmplY3RlZE9iamVjdCIpOwotICAgICAqIHdlYlZpZXcubG9hZERhdGEoIjwhRE9DVFlQRSBodG1sPjx0aXRsZT48L3RpdGxlPiIsICJ0ZXh0L2h0bWwiLCBudWxsKTsKLSAgICAgKiB3ZWJWaWV3LmxvYWRVcmwoImphdmFzY3JpcHQ6YWxlcnQoaW5qZWN0ZWRPYmplY3QudG9TdHJpbmcoKSkiKTs8L3ByZT4KLSAgICAgKiA8cD48c3Ryb25nPklNUE9SVEFOVDo8L3N0cm9uZz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPiBhZGRKYXZhc2NyaXB0SW50ZXJmYWNlKCkgY2FuIGJlIHVzZWQgdG8gYWxsb3cgSmF2YVNjcmlwdCB0byBjb250cm9sCi0gICAgICogdGhlIGhvc3QgYXBwbGljYXRpb24uIFRoaXMgaXMgYSBwb3dlcmZ1bCBmZWF0dXJlLCBidXQgYWxzbyBwcmVzZW50cyBhCi0gICAgICogc2VjdXJpdHkgcmlzay4gVXNlIG9mIHRoaXMgbWV0aG9kIGluIGEgV2ViVmlldyBjb250YWluaW5nIHVudHJ1c3RlZAotICAgICAqIGNvbnRlbnQgY291bGQgYWxsb3cgYW4gYXR0YWNrZXIgdG8gbWFuaXB1bGF0ZSB0aGUgaG9zdCBhcHBsaWNhdGlvbiBpbgotICAgICAqIHVuaW50ZW5kZWQgd2F5cywgZXhlY3V0aW5nIEphdmEgY29kZSB3aXRoIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgaG9zdAotICAgICAqIGFwcGxpY2F0aW9uLiBVc2UgZXh0cmVtZSBjYXJlIHdoZW4gdXNpbmcgdGhpcyBtZXRob2QgaW4gYSBXZWJWaWV3IHdoaWNoCi0gICAgICogY291bGQgY29udGFpbiB1bnRydXN0ZWQgY29udGVudC4KLSAgICAgKiA8bGk+IEphdmFTY3JpcHQgaW50ZXJhY3RzIHdpdGggSmF2YSBvYmplY3Qgb24gYSBwcml2YXRlLCBiYWNrZ3JvdW5kCi0gICAgICogdGhyZWFkIG9mIHRoZSBXZWJWaWV3LiBDYXJlIGlzIHRoZXJlZm9yZSByZXF1aXJlZCB0byBtYWludGFpbiB0aHJlYWQKLSAgICAgKiBzYWZldHkuPC9saT4KLSAgICAgKiA8L3VsPjwvcD4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IFRoZSBKYXZhIG9iamVjdCB0byBpbmplY3QgaW50byB0aGUgV2ViVmlldydzIEphdmFTY3JpcHQKLSAgICAgKiAgICAgICAgICAgICAgIGNvbnRleHQuIE51bGwgdmFsdWVzIGFyZSBpZ25vcmVkLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHVzZWQgdG8gZXhwb3NlIHRoZSBpbnN0YW5jZSBpbiBKYXZhU2NyaXB0LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNhZGRKYXZhc2NyaXB0SW50ZXJmYWNlKE9iamVjdCwgU3RyaW5nKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRKYXZhc2NyaXB0SW50ZXJmYWNlKE9iamVjdCBvYmplY3QsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewpAQCAtNDUzMiw5ICs0MzE4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcHJldmlvdXNseSBhZGRlZCBKYXZhU2NyaXB0IGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdG8gcmVtb3ZlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNyZW1vdmVKYXZhc2NyaXB0SW50ZXJmYWNlKFN0cmluZyl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlSmF2YXNjcmlwdEludGVyZmFjZShTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICBpZiAobVdlYlZpZXdDb3JlICE9IG51bGwpIHsKQEAgLTQ1NDUsMzMgKzQzMzEsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIFdlYlNldHRpbmdzIG9iamVjdCB1c2VkIHRvIGNvbnRyb2wgdGhlIHNldHRpbmdzIGZvciB0aGlzCi0gICAgICogV2ViVmlldy4KLSAgICAgKiBAcmV0dXJuIEEgV2ViU2V0dGluZ3Mgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGlzIFdlYlZpZXcncwotICAgICAqICAgICAgICAgc2V0dGluZ3MuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFNldHRpbmdzKCl9CisgICAgICogTm90ZSB0aGlzIHJldHVybnMgV2ViU2V0dGluZ3NDbGFzc2ljLCBhIHN1Yi1jbGFzcyBvZiBXZWJTZXR0aW5ncywgd2hpY2ggY2FuIGJlIHVzZWQKKyAgICAgKiB0byBhY2Nlc3MgZXh0ZW5zaW9uIEFQSXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFdlYlNldHRpbmdzQ2xhc3NpYyBnZXRTZXR0aW5ncygpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIChtV2ViVmlld0NvcmUgIT0gbnVsbCkgPyBtV2ViVmlld0NvcmUuZ2V0U2V0dGluZ3MoKSA6IG51bGw7CiAgICAgfQogCi0gICAvKioKLSAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIHBsdWdpbnMuCi0gICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGN1cnJlbnRseSBsb2FkZWQgcGx1Z2lucy4KLSAgICAqCi0gICAgKiBAaGlkZQotICAgICogQGRlcHJlY2F0ZWQgVGhpcyB3YXMgdXNlZCBmb3IgR2VhcnMsIHdoaWNoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjZ2V0UGx1Z2luTGlzdCgpfQorICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgUGx1Z2luTGlzdCBnZXRQbHVnaW5MaXN0KCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbmV3IFBsdWdpbkxpc3QoKTsKICAgICB9CiAKLSAgIC8qKgotICAgICogQGhpZGUKLSAgICAqIEBkZXByZWNhdGVkIFRoaXMgd2FzIHVzZWQgZm9yIEdlYXJzLCB3aGljaCBoYXMgYmVlbiBkZXByZWNhdGVkLgotICAgICovCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I3JlZnJlc2hQbHVnaW5zKGJvb2xlYW4pfQorICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgcmVmcmVzaFBsdWdpbnMoYm9vbGVhbiByZWxvYWRPcGVuUGFnZXMpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKQEAgLTQ5MjUsOSArNDcwNiw3IEBACiAgICAgICAgIGlmIChsYXllciA9PSAwIHx8IGlzUGljdHVyZUFmdGVyRmlyc3RMYXlvdXQpIHsKICAgICAgICAgICAgIG1XZWJWaWV3Q29yZS5yZXN1bWVXZWJLaXREcmF3KCk7CiAgICAgICAgIH0gZWxzZSBpZiAocXVldWVGdWxsKSB7Ci0gICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSBkaXNhYmxlIHdlYmtpdCBkcmF3IHRocm90dGxpbmcKLSAgICAgICAgICAgIC8vIFRPRE86IHJlLWVuYWJsZQotICAgICAgICAgICAgLy8gbVdlYlZpZXdDb3JlLnBhdXNlV2ViS2l0RHJhdygpOworICAgICAgICAgICAgbVdlYlZpZXdDb3JlLnBhdXNlV2ViS2l0RHJhdygpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1IVE1MNVZpZGVvVmlld1Byb3h5ICE9IG51bGwpIHsKQEAgLTU1MDMsMTAgKzUyODIsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBwdXQgdGhlIFdlYlZpZXcgaW50byB0ZXh0IHNlbGVjdGlvbiBtb2RlLgotICAgICAqIERvIG5vdCByZWx5IG9uIHRoaXMgZnVuY3Rpb25hbGl0eTsgaXQgd2lsbCBiZSBkZXByZWNhdGVkIGluIHRoZSBmdXR1cmUuCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaXMgbm93IG9ic29sZXRlLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNlbXVsYXRlU2hpZnRIZWxkKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBlbXVsYXRlU2hpZnRIZWxkKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwpAQCAtNTc0OSw2ICs1NTI3LDkgQEAKICAgICAgICAgICAgIHNldEZvY3VzQ29udHJvbGxlckFjdGl2ZShmYWxzZSk7CiAgICAgICAgICAgICBtS2V5c1ByZXNzZWQuY2xlYXIoKTsKICAgICAgICAgfQorICAgICAgICBpZiAoIW1Ub3VjaEhpZ2hsaWdodFJlZ2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LmludmFsaWRhdGUobVRvdWNoSGlnaGxpZ2h0UmVnaW9uLmdldEJvdW5kcygpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHZvaWQgc2V0R0xSZWN0Vmlld3BvcnQoKSB7CkBAIC01OTYwLDYgKzU3NDEsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIGlmICghbVdlYlZpZXcuaXNGb2N1c2VkKCkpIHsKKyAgICAgICAgICAgIG1XZWJWaWV3LnJlcXVlc3RGb2N1cygpOworICAgICAgICB9CisKICAgICAgICAgaWYgKERlYnVnRmxhZ3MuV0VCX1ZJRVcpIHsKICAgICAgICAgICAgIExvZy52KExPR1RBRywgZXYgKyAiIGF0ICIgKyBldi5nZXRFdmVudFRpbWUoKQogICAgICAgICAgICAgICAgICsgIiBtVG91Y2hNb2RlPSIgKyBtVG91Y2hNb2RlCkBAIC02MzQ5LDcgKzYxMzQsNiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2FzZSBNb3Rpb25FdmVudC5BQ1RJT05fVVA6IHsKLSAgICAgICAgICAgICAgICBpZiAoIW1XZWJWaWV3LmlzRm9jdXNlZCgpKSBtV2ViVmlldy5yZXF1ZXN0Rm9jdXMoKTsKICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0b3VjaCBldmVudHMgZnJvbSBVSSB0aHJlYWQgdG8gV2ViQ29yZSB0aHJlYWQKICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkRm9yd2FyZFRvdWNoRXZlbnQoKSkgewogICAgICAgICAgICAgICAgICAgICBUb3VjaEV2ZW50RGF0YSB0ZWQgPSBuZXcgVG91Y2hFdmVudERhdGEoKTsKQEAgLTcxNzEsMTggKzY5NTUsOSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybnMgYSB2aWV3IGNvbnRhaW5pbmcgem9vbSBjb250cm9scyBpLmUuICsvLSBidXR0b25zLiBUaGUgY2FsbGVyIGlzCi0gICAgICogaW4gY2hhcmdlIG9mIGluc3RhbGxpbmcgdGhpcyB2aWV3IHRvIHRoZSB2aWV3IGhpZXJhcmNoeS4gVGhpcyB2aWV3IHdpbGwKLSAgICAgKiBiZWNvbWUgdmlzaWJsZSB3aGVuIHRoZSB1c2VyIHN0YXJ0cyBzY3JvbGxpbmcgdmlhIHRvdWNoIGFuZCBmYWRlIGF3YXkgaWYKLSAgICAgKiB0aGUgdXNlciBkb2VzIG5vdCBpbnRlcmFjdCB3aXRoIGl0LgotICAgICAqIDxwLz4KLSAgICAgKiBBUEkgdmVyc2lvbiAzIGludHJvZHVjZXMgYSBidWlsdC1pbiB6b29tIG1lY2hhbmlzbSB0aGF0IGlzIHNob3duCi0gICAgICogYXV0b21hdGljYWxseSBieSB0aGUgTWFwVmlldy4gVGhpcyBpcyB0aGUgcHJlZmVycmVkIGFwcHJvYWNoIGZvcgotICAgICAqIHNob3dpbmcgdGhlIHpvb20gVUkuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGUgYnVpbHQtaW4gem9vbSBtZWNoYW5pc20gaXMgcHJlZmVycmVkLCBzZWUKLSAgICAgKiAgICAgICAgICAgICB7QGxpbmsgV2ViU2V0dGluZ3Mjc2V0QnVpbHRJblpvb21Db250cm9scyhib29sZWFuKX0uCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2dldFpvb21Db250cm9scygpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFZpZXcgZ2V0Wm9vbUNvbnRyb2xzKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwpAQCAtNzIxMCwzNCArNjk4NSwzNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgV2ViVmlldyBjYW4gYmUgem9vbWVkIGluLgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjYW5ab29tSW4oKX0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjYW5ab29tSW4oKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuY2FuWm9vbUluKCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBXZWJWaWV3IGNhbiBiZSB6b29tZWQgb3V0LgorICAgICAqIFNlZSB7QGxpbmsgV2ViVmlldyNjYW5ab29tT3V0KCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuWm9vbU91dCgpIHsKICAgICAgICAgY2hlY2tUaHJlYWQoKTsKICAgICAgICAgcmV0dXJuIG1ab29tTWFuYWdlci5jYW5ab29tT3V0KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUGVyZm9ybSB6b29tIGluIGluIHRoZSB3ZWJ2aWV3Ci0gICAgICogQHJldHVybiBUUlVFIGlmIHpvb20gaW4gc3VjY2VlZHMuIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjem9vbUluKCl9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gem9vbUluKCkgewogICAgICAgICBjaGVja1RocmVhZCgpOwogICAgICAgICByZXR1cm4gbVpvb21NYW5hZ2VyLnpvb21JbigpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFBlcmZvcm0gem9vbSBvdXQgaW4gdGhlIHdlYnZpZXcKLSAgICAgKiBAcmV0dXJuIFRSVUUgaWYgem9vbSBvdXQgc3VjY2VlZHMuIEZBTFNFIGlmIG5vIHpvb20gY2hhbmdlcy4KKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjem9vbU91dCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHpvb21PdXQoKSB7CiAgICAgICAgIGNoZWNrVGhyZWFkKCk7CiAgICAgICAgIHJldHVybiBtWm9vbU1hbmFnZXIuem9vbU91dCgpOwpAQCAtODUyMSw3ICs4Mjk4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAobUZvY3VzZWROb2RlLm1IYXNGb2N1cyAmJiAhbVdlYlZpZXcuaXNJblRvdWNoTW9kZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIW1Gb2N1c2VkTm9kZS5tRWRpdGFibGU7CisgICAgICAgICAgICByZXR1cm4gbURyYXdDdXJzb3JSaW5nICYmICFtRm9jdXNlZE5vZGUubUVkaXRhYmxlOwogICAgICAgICB9CiAgICAgICAgIGlmIChtRm9jdXNlZE5vZGUubUhhc0ZvY3VzICYmIG1Gb2N1c2VkTm9kZS5tRWRpdGFibGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTkxODIsOSArODk1OSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yLiBJdCdzIHdoaXRlIGJ5IGRlZmF1bHQuIFBhc3MKLSAgICAgKiB6ZXJvIHRvIG1ha2UgdGhlIHZpZXcgdHJhbnNwYXJlbnQuCi0gICAgICogQHBhcmFtIGNvbG9yICAgdGhlIEFSR0IgY29sb3IgZGVzY3JpYmVkIGJ5IENvbG9yLmphdmEKKyAgICAgKiBTZWUge0BsaW5rIFdlYlZpZXcjc2V0QmFja2dyb3VuZENvbG9yKGludCl9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewpAQCAtOTE5Myw4ICs4OTY4LDkgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBUaGlzIG1ldGhvZCBpcyBub3cgb2Jzb2xldGUuCisgICAgICogU2VlIHtAbGluayBXZWJWaWV3I2RlYnVnRHVtcCgpfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgZGVidWdEdW1wKCkgewogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DaGVja2VkVGV4dFZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9DaGVja2VkVGV4dFZpZXcuamF2YQppbmRleCA2MDNjZWExLi4xOWZiN2IxIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvQ2hlY2tlZFRleHRWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0NoZWNrZWRUZXh0Vmlldy5qYXZhCkBAIC0xNjEsNiArMTYxLDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UGFkZGluZ1JlbGF0aXZlKGludCBzdGFydCwgaW50IHRvcCwgaW50IGVuZCwgaW50IGJvdHRvbSkgeworICAgICAgICBzdXBlci5zZXRQYWRkaW5nUmVsYXRpdmUoc3RhcnQsIHRvcCwgZW5kLCBib3R0b20pOworICAgICAgICBtQmFzZVBhZGRpbmcgPSBnZXRQYWRkaW5nRW5kKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKICAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9MaXN0UG9wdXBXaW5kb3cuamF2YQppbmRleCA1Yzk3NTkzLi5mNGQ1ZDc0IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvTGlzdFBvcHVwV2luZG93LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L0xpc3RQb3B1cFdpbmRvdy5qYXZhCkBAIC0xMDgwLDYgKzEwODAsOCBAQAogICAgICAgICAgICAgaWYgKCFtRHJvcERvd25WZXJ0aWNhbE9mZnNldFNldCkgewogICAgICAgICAgICAgICAgIG1Ecm9wRG93blZlcnRpY2FsT2Zmc2V0ID0gLW1UZW1wUmVjdC50b3A7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtVGVtcFJlY3Quc2V0RW1wdHkoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIE1heCBoZWlnaHQgYXZhaWxhYmxlIG9uIHRoZSBzY3JlZW4gZm9yIGEgcG9wdXAuCkBAIC0xMDkyLDcgKzEwOTQsMjUgQEAKICAgICAgICAgICAgIHJldHVybiBtYXhIZWlnaHQgKyBwYWRkaW5nOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgaW50IGxpc3RDb250ZW50ID0gbURyb3BEb3duTGlzdC5tZWFzdXJlSGVpZ2h0T2ZDaGlsZHJlbihNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCwKKyAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhTcGVjOworICAgICAgICBzd2l0Y2ggKG1Ecm9wRG93bldpZHRoKSB7CisgICAgICAgICAgICBjYXNlIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOgorICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAtCisgICAgICAgICAgICAgICAgICAgICAgICAobVRlbXBSZWN0LmxlZnQgKyBtVGVtcFJlY3QucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuQVRfTU9TVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UOgorICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0RGlzcGxheU1ldHJpY3MoKS53aWR0aFBpeGVscyAtCisgICAgICAgICAgICAgICAgICAgICAgICAobVRlbXBSZWN0LmxlZnQgKyBtVGVtcFJlY3QucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNoaWxkV2lkdGhTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKG1Ecm9wRG93bldpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgbGlzdENvbnRlbnQgPSBtRHJvcERvd25MaXN0Lm1lYXN1cmVIZWlnaHRPZkNoaWxkcmVuKGNoaWxkV2lkdGhTcGVjLAogICAgICAgICAgICAgICAgIDAsIExpc3RWaWV3Lk5PX1BPU0lUSU9OLCBtYXhIZWlnaHQgLSBvdGhlckhlaWdodHMsIC0xKTsKICAgICAgICAgLy8gYWRkIHBhZGRpbmcgb25seSBpZiB0aGUgbGlzdCBoYXMgaXRlbXMgaW4gaXQsIHRoYXQgd2F5IHdlIGRvbid0IHNob3cKICAgICAgICAgLy8gdGhlIHBvcHVwIGlmIGl0IGlzIG5vdCBuZWVkZWQKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGVsbENoZWNrZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGVsbENoZWNrZXIuamF2YQppbmRleCBkZjI5OTZjLi45YWZhZWUzIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3BlbGxDaGVja2VyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwZWxsQ2hlY2tlci5qYXZhCkBAIC0yOTAsNyArMjkwLDcgQEAKIAogICAgIHByaXZhdGUgU3BlbGxDaGVja1NwYW4gb25HZXRTdWdnZXN0aW9uc0ludGVybmFsKAogICAgICAgICAgICAgU3VnZ2VzdGlvbnNJbmZvIHN1Z2dlc3Rpb25zSW5mbywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgICBpZiAoc3VnZ2VzdGlvbnNJbmZvLmdldENvb2tpZSgpICE9IG1Db29raWUpIHsKKyAgICAgICAgaWYgKHN1Z2dlc3Rpb25zSW5mbyA9PSBudWxsIHx8IHN1Z2dlc3Rpb25zSW5mby5nZXRDb29raWUoKSAhPSBtQ29va2llKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBFZGl0YWJsZSBlZGl0YWJsZSA9IChFZGl0YWJsZSkgbVRleHRWaWV3LmdldFRleHQoKTsKQEAgLTMzNSw5ICszMzUsMTUgQEAKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgIGZpbmFsIFNlbnRlbmNlU3VnZ2VzdGlvbnNJbmZvIHNzaSA9IHJlc3VsdHNbaV07CisgICAgICAgICAgICBpZiAoc3NpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFNwZWxsQ2hlY2tTcGFuIHNwZWxsQ2hlY2tTcGFuID0gbnVsbDsKICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3NpLmdldFN1Z2dlc3Rpb25zQ291bnQoKTsgKytqKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3VnZ2VzdGlvbnNJbmZvIHN1Z2dlc3Rpb25zSW5mbyA9IHNzaS5nZXRTdWdnZXN0aW9uc0luZm9BdChqKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VnZ2VzdGlvbnNJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZpbmFsIGludCBvZmZzZXQgPSBzc2kuZ2V0T2Zmc2V0QXQoaik7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHNzaS5nZXRMZW5ndGhBdChqKTsKICAgICAgICAgICAgICAgICBmaW5hbCBTcGVsbENoZWNrU3BhbiBzY3MgPSBvbkdldFN1Z2dlc3Rpb25zSW50ZXJuYWwoCkBAIC00ODgsMTEgKzQ5NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZS5yZW1vdmVTcGFuKG1SYW5nZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gU3RvcCBzcGVsbCBjaGVja2luZyB3aGVuIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzIGluIHRoZSByYW5nZS4KKyAgICAgICAgICAgICAgICBpZiAod29yZEVuZCA8IHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd29yZFN0YXJ0ID0gcmVnaW9uRW5kOwogICAgICAgICAgICAgICAgIC8vIFRPRE86IEZpbmQgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzZW50ZW5jZS4KICAgICAgICAgICAgICAgICAvLyBTZXQgc3BhbiB3aXRoIHRoZSBjb250ZXh0Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNwZWxsQ2hlY2tTdGFydCA9ICBNYXRoLm1pbigKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBNYXRoLm1heCh3b3JkU3RhcnQsIHJlZ2lvbkVuZCAtIFdPUkRfSVRFUkFUT1JfSU5URVJWQUwpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BlbGxDaGVja1N0YXJ0ID0gIE1hdGgubWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgTWF0aC5taW4od29yZFN0YXJ0LCByZWdpb25FbmQgLSBXT1JEX0lURVJBVE9SX0lOVEVSVkFMKSk7CiAgICAgICAgICAgICAgICAgaWYgKHJlZ2lvbkVuZCA8PSBzcGVsbENoZWNrU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3Bpbm5lci5qYXZhCmluZGV4IDg5YzUwNmYuLjY1NDA2MTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9TcGlubmVyLmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1NwaW5uZXIuamF2YQpAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwogaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwogaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3dpdGNoLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvU3dpdGNoLmphdmEKaW5kZXggMzM0YjljNC4uMjNlNTVlMiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1N3aXRjaC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3dpZGdldC9Td2l0Y2guamF2YQpAQCAtMTY5LDYgKzE2OSw4IEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc3dpdGNoIHRleHQgY29sb3IsIHNpemUsIHN0eWxlLCBoaW50IGNvbG9yLCBhbmQgaGlnaGxpZ2h0IGNvbG9yCiAgICAgICogZnJvbSB0aGUgc3BlY2lmaWVkIFRleHRBcHBlYXJhbmNlIHJlc291cmNlLgorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoX3N3aXRjaFRleHRBcHBlYXJhbmNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3dpdGNoVGV4dEFwcGVhcmFuY2UoQ29udGV4dCBjb250ZXh0LCBpbnQgcmVzaWQpIHsKICAgICAgICAgVHlwZWRBcnJheSBhcHBlYXJhbmNlID0KQEAgLTI3NCw3ICsyNzYsMTI4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBhbW91bnQgb2YgaG9yaXpvbnRhbCBwYWRkaW5nIGJldHdlZW4gdGhlIHN3aXRjaCBhbmQgdGhlIGFzc29jaWF0ZWQgdGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaXhlbHMgQW1vdW50IG9mIHBhZGRpbmcgaW4gcGl4ZWxzCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hfc3dpdGNoUGFkZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN3aXRjaFBhZGRpbmcoaW50IHBpeGVscykgeworICAgICAgICBtU3dpdGNoUGFkZGluZyA9IHBpeGVsczsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYW1vdW50IG9mIGhvcml6b250YWwgcGFkZGluZyBiZXR3ZWVuIHRoZSBzd2l0Y2ggYW5kIHRoZSBhc3NvY2lhdGVkIHRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscworICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoX3N3aXRjaFBhZGRpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFN3aXRjaFBhZGRpbmcoKSB7CisgICAgICAgIHJldHVybiBtU3dpdGNoUGFkZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIHN3aXRjaCBpbiBwaXhlbHMuIFRoZSBzd2l0Y2gncyB3aWR0aCB3aWxsIGJlIHRoZSBtYXhpbXVtCisgICAgICogb2YgdGhpcyB2YWx1ZSBhbmQgaXRzIG1lYXN1cmVkIHdpZHRoIGFzIGRldGVybWluZWQgYnkgdGhlIHN3aXRjaCBkcmF3YWJsZXMgYW5kIHRleHQgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwaXhlbHMgTWluaW11bSB3aWR0aCBvZiB0aGUgc3dpdGNoIGluIHBpeGVscworICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoX3N3aXRjaE1pbldpZHRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3dpdGNoTWluV2lkdGgoaW50IHBpeGVscykgeworICAgICAgICBtU3dpdGNoTWluV2lkdGggPSBwaXhlbHM7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1pbmltdW0gd2lkdGggb2YgdGhlIHN3aXRjaCBpbiBwaXhlbHMuIFRoZSBzd2l0Y2gncyB3aWR0aCB3aWxsIGJlIHRoZSBtYXhpbXVtCisgICAgICogb2YgdGhpcyB2YWx1ZSBhbmQgaXRzIG1lYXN1cmVkIHdpZHRoIGFzIGRldGVybWluZWQgYnkgdGhlIHN3aXRjaCBkcmF3YWJsZXMgYW5kIHRleHQgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWluaW11bSB3aWR0aCBvZiB0aGUgc3dpdGNoIGluIHBpeGVscworICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoX3N3aXRjaE1pbldpZHRoCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTd2l0Y2hNaW5XaWR0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1Td2l0Y2hNaW5XaWR0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGhvcml6b250YWwgcGFkZGluZyBhcm91bmQgdGhlIHRleHQgZHJhd24gb24gdGhlIHN3aXRjaCBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGl4ZWxzIEhvcml6b250YWwgcGFkZGluZyBmb3Igc3dpdGNoIHRodW1iIHRleHQgaW4gcGl4ZWxzCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hfdGh1bWJUZXh0UGFkZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRodW1iVGV4dFBhZGRpbmcoaW50IHBpeGVscykgeworICAgICAgICBtVGh1bWJUZXh0UGFkZGluZyA9IHBpeGVsczsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaG9yaXpvbnRhbCBwYWRkaW5nIGFyb3VuZCB0aGUgdGV4dCBkcmF3biBvbiB0aGUgc3dpdGNoIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSG9yaXpvbnRhbCBwYWRkaW5nIGZvciBzd2l0Y2ggdGh1bWIgdGV4dCBpbiBwaXhlbHMKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1N3aXRjaF90aHVtYlRleHRQYWRkaW5nCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUaHVtYlRleHRQYWRkaW5nKCkgeworICAgICAgICByZXR1cm4gbVRodW1iVGV4dFBhZGRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkcmF3YWJsZSB1c2VkIGZvciB0aGUgdHJhY2sgdGhhdCB0aGUgc3dpdGNoIHNsaWRlcyB3aXRoaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhY2sgVHJhY2sgZHJhd2FibGUKKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1N3aXRjaF90cmFjaworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRyYWNrRHJhd2FibGUoRHJhd2FibGUgdHJhY2spIHsKKyAgICAgICAgbVRyYWNrRHJhd2FibGUgPSB0cmFjazsKKyAgICAgICAgcmVxdWVzdExheW91dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZHJhd2FibGUgdXNlZCBmb3IgdGhlIHRyYWNrIHRoYXQgdGhlIHN3aXRjaCBzbGlkZXMgd2l0aGluLgorICAgICAqCisgICAgICogQHJldHVybiBUcmFjayBkcmF3YWJsZQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoX3RyYWNrCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldFRyYWNrRHJhd2FibGUoKSB7CisgICAgICAgIHJldHVybiBtVHJhY2tEcmF3YWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBzd2l0Y2ggInRodW1iIiAtIHRoZSBwaWVjZSB0aGF0IHRoZSB1c2VyCisgICAgICogY2FuIHBoeXNpY2FsbHkgdG91Y2ggYW5kIGRyYWcgYWxvbmcgdGhlIHRyYWNrLgorICAgICAqCisgICAgICogQHBhcmFtIHRodW1iIFRodW1iIGRyYXdhYmxlCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hfdGh1bWIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYkRyYXdhYmxlKERyYXdhYmxlIHRodW1iKSB7CisgICAgICAgIG1UaHVtYkRyYXdhYmxlID0gdGh1bWI7CisgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRyYXdhYmxlIHVzZWQgZm9yIHRoZSBzd2l0Y2ggInRodW1iIiAtIHRoZSBwaWVjZSB0aGF0IHRoZSB1c2VyCisgICAgICogY2FuIHBoeXNpY2FsbHkgdG91Y2ggYW5kIGRyYWcgYWxvbmcgdGhlIHRyYWNrLgorICAgICAqCisgICAgICogQHJldHVybiBUaHVtYiBkcmF3YWJsZQorICAgICAqCisgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjU3dpdGNoX3RodW1iCisgICAgICovCisgICAgcHVibGljIERyYXdhYmxlIGdldFRodW1iRHJhd2FibGUoKSB7CisgICAgICAgIHJldHVybiBtVGh1bWJEcmF3YWJsZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IGRpc3BsYXllZCB3aGVuIHRoZSBidXR0b24gaXMgaW4gdGhlIGNoZWNrZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hfdGV4dE9uCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0T24oKSB7CiAgICAgICAgIHJldHVybiBtVGV4dE9uOwpAQCAtMjgyLDYgKzQwNSw4IEBACiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB0ZXh0IGRpc3BsYXllZCB3aGVuIHRoZSBidXR0b24gaXMgaW4gdGhlIGNoZWNrZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hfdGV4dE9uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGV4dE9uKENoYXJTZXF1ZW5jZSB0ZXh0T24pIHsKICAgICAgICAgbVRleHRPbiA9IHRleHRPbjsKQEAgLTI5MCw2ICs0MTUsOCBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgYnV0dG9uIGlzIG5vdCBpbiB0aGUgY2hlY2tlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1N3aXRjaF90ZXh0T2ZmCiAgICAgICovCiAgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0T2ZmKCkgewogICAgICAgICByZXR1cm4gbVRleHRPZmY7CkBAIC0yOTcsNiArNDI0LDggQEAKIAogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHRleHQgZGlzcGxheWVkIHdoZW4gdGhlIGJ1dHRvbiBpcyBub3QgaW4gdGhlIGNoZWNrZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNTd2l0Y2hfdGV4dE9mZgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRleHRPZmYoQ2hhclNlcXVlbmNlIHRleHRPZmYpIHsKICAgICAgICAgbVRleHRPZmYgPSB0ZXh0T2ZmOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvd2lkZ2V0L1RleHRWaWV3LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQppbmRleCA0NzE5MDEwLi40Yzg5MjE4IDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC93aWRnZXQvVGV4dFZpZXcuamF2YQpAQCAtMjE2LDYgKzIxNiw4IEBACiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZUJvdHRvbQogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVSaWdodAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVMZWZ0CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZVN0YXJ0CisgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZUVuZAogICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVQYWRkaW5nCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19saW5lU3BhY2luZ0V4dHJhCiAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19saW5lU3BhY2luZ011bHRpcGxpZXIKQEAgLTE1MjAsOCArMTUyMiw2IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc3RhcnQgcGFkZGluZyBvZiB0aGUgdmlldywgcGx1cyBzcGFjZSBmb3IgdGhlIHN0YXJ0CiAgICAgICogRHJhd2FibGUgaWYgYW55LgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldENvbXBvdW5kUGFkZGluZ1N0YXJ0KCkgewogICAgICAgICByZXNvbHZlRHJhd2FibGVzKCk7CkBAIC0xNTM3LDggKzE1MzcsNiBAQAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGVuZCBwYWRkaW5nIG9mIHRoZSB2aWV3LCBwbHVzIHNwYWNlIGZvciB0aGUgZW5kCiAgICAgICogRHJhd2FibGUgaWYgYW55LgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldENvbXBvdW5kUGFkZGluZ0VuZCgpIHsKICAgICAgICAgcmVzb2x2ZURyYXdhYmxlcygpOwpAQCAtMTYzNiw4ICsxNjM0LDYgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBzdGFydCBwYWRkaW5nIG9mIHRoZSB2aWV3LCBpbmNsdWRpbmcgdGhlIHN0YXJ0CiAgICAgICogRHJhd2FibGUgaWYgYW55LgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ1N0YXJ0KCkgewogICAgICAgICByZXR1cm4gZ2V0Q29tcG91bmRQYWRkaW5nU3RhcnQoKTsKQEAgLTE2NDYsOCArMTY0Miw2IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgdG90YWwgZW5kIHBhZGRpbmcgb2YgdGhlIHZpZXcsIGluY2x1ZGluZyB0aGUgZW5kCiAgICAgICogRHJhd2FibGUgaWYgYW55LgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldFRvdGFsUGFkZGluZ0VuZCgpIHsKICAgICAgICAgcmV0dXJuIGdldENvbXBvdW5kUGFkZGluZ0VuZCgpOwpAQCAtMTg0OSw4ICsxODQzLDYgQEAKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZVRvcAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlRW5kCiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVCb3R0b20KLSAgICAgKgotICAgICAqIEBoaWRlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcG91bmREcmF3YWJsZXNSZWxhdGl2ZShEcmF3YWJsZSBzdGFydCwgRHJhd2FibGUgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYXdhYmxlIGVuZCwgRHJhd2FibGUgYm90dG9tKSB7CkBAIC0xOTcyLDggKzE5NjQsNiBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlVG9wCiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVFbmQKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZUJvdHRvbQotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlV2l0aEludHJpbnNpY0JvdW5kcyhpbnQgc3RhcnQsIGludCB0b3AsIGludCBlbmQsCiAgICAgICAgICAgICBpbnQgYm90dG9tKSB7CkBAIC0xOTk2LDggKzE5ODYsNiBAQAogICAgICAqIEBhdHRyIHJlZiBhbmRyb2lkLlIuc3R5bGVhYmxlI1RleHRWaWV3X2RyYXdhYmxlVG9wCiAgICAgICogQGF0dHIgcmVmIGFuZHJvaWQuUi5zdHlsZWFibGUjVGV4dFZpZXdfZHJhd2FibGVFbmQKICAgICAgKiBAYXR0ciByZWYgYW5kcm9pZC5SLnN0eWxlYWJsZSNUZXh0Vmlld19kcmF3YWJsZUJvdHRvbQotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlV2l0aEludHJpbnNpY0JvdW5kcyhEcmF3YWJsZSBzdGFydCwgRHJhd2FibGUgdG9wLAogICAgICAgICAgICAgRHJhd2FibGUgZW5kLCBEcmF3YWJsZSBib3R0b20pIHsKQEAgLTIwMzQsOCArMjAyMiw2IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGRyYXdhYmxlcyBmb3IgdGhlIHN0YXJ0LCB0b3AsIGVuZCwgYW5kIGJvdHRvbSBib3JkZXJzLgotICAgICAqCi0gICAgICogQGhpZGUKICAgICAgKi8KICAgICBwdWJsaWMgRHJhd2FibGVbXSBnZXRDb21wb3VuZERyYXdhYmxlc1JlbGF0aXZlKCkgewogICAgICAgICBmaW5hbCBEcmF3YWJsZXMgZHIgPSBtRHJhd2FibGVzOwpAQCAtMjA5Myw2ICsyMDc5LDIwIEBACiAgICAgICAgIGludmFsaWRhdGUoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWRkaW5nUmVsYXRpdmUoaW50IHN0YXJ0LCBpbnQgdG9wLCBpbnQgZW5kLCBpbnQgYm90dG9tKSB7CisgICAgICAgIGlmIChzdGFydCAhPSBnZXRQYWRkaW5nU3RhcnQoKSB8fAorICAgICAgICAgICAgZW5kICE9IGdldFBhZGRpbmdFbmQoKSB8fAorICAgICAgICAgICAgdG9wICE9IG1QYWRkaW5nVG9wIHx8CisgICAgICAgICAgICBib3R0b20gIT0gbVBhZGRpbmdCb3R0b20pIHsKKyAgICAgICAgICAgIG51bGxMYXlvdXRzKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgc3VwZXIgY2FsbCB3aWxsIHJlcXVlc3RMYXlvdXQoKQorICAgICAgICBzdXBlci5zZXRQYWRkaW5nUmVsYXRpdmUoc3RhcnQsIHRvcCwgZW5kLCBib3R0b20pOworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogR2V0cyB0aGUgYXV0b2xpbmsgbWFzayBvZiB0aGUgdGV4dC4gIFNlZSB7QGxpbmsKICAgICAgKiBhbmRyb2lkLnRleHQudXRpbC5MaW5raWZ5I0FMTCBMaW5raWZ5LkFMTH0gYW5kIHBlZXJzIGZvcgpAQCAtNDI4MCw2ICs0MjgwLDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TY3JlZW5TdGF0ZUNoYW5nZWQoaW50IHNjcmVlblN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2NyZWVuU3RhdGVDaGFuZ2VkKHNjcmVlblN0YXRlKTsKKyAgICAgICAgaWYgKG1FZGl0b3IgIT0gbnVsbCkgZ2V0RWRpdG9yKCkub25TY3JlZW5TdGF0ZUNoYW5nZWQoc2NyZWVuU3RhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzUGFkZGluZ09mZnNldFJlcXVpcmVkKCkgewogICAgICAgICByZXR1cm4gbVNoYWRvd1JhZGl1cyAhPSAwIHx8IG1EcmF3YWJsZXMgIT0gbnVsbDsKICAgICB9CkBAIC0xMTQwMCw2ICsxMTQwNiwzMCBAQAogICAgICAgICAgICAgaGlkZUNvbnRyb2xsZXJzKCk7CiAgICAgICAgIH0KIAorICAgICAgICB2b2lkIG9uU2NyZWVuU3RhdGVDaGFuZ2VkKGludCBzY3JlZW5TdGF0ZSkgeworICAgICAgICAgICAgc3dpdGNoIChzY3JlZW5TdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgU0NSRUVOX1NUQVRFX09OOgorICAgICAgICAgICAgICAgICAgICByZXN1bWVCbGluaygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNDUkVFTl9TVEFURV9PRkY6CisgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRCbGluaygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzdXNwZW5kQmxpbmsoKSB7CisgICAgICAgICAgICBpZiAobUJsaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQmxpbmsuY2FuY2VsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVzdW1lQmxpbmsoKSB7CisgICAgICAgICAgICBpZiAobUJsaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtQmxpbmsudW5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICBtYWtlQmxpbmsoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHZvaWQgYWRqdXN0SW5wdXRUeXBlKGJvb2xlYW4gcGFzc3dvcmQsIGJvb2xlYW4gcGFzc3dvcmRJbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgYm9vbGVhbiB3ZWJQYXNzd29yZElucHV0VHlwZSwgYm9vbGVhbiBudW1iZXJQYXNzd29yZElucHV0VHlwZSkgewogICAgICAgICAgICAgLy8gbUlucHV0VHlwZSBoYXMgYmVlbiBzZXQgZnJvbSBpbnB1dFR5cGUsIHBvc3NpYmx5IG1vZGlmaWVkIGJ5IG1JbnB1dE1ldGhvZC4KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvb3MvWnlnb3RlSW5pdC5qYXZhCmluZGV4IDZhOTlhMmIuLjk5OGMwMzcgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC9vcy9aeWdvdGVJbml0LmphdmEKKysrIGIvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL29zL1p5Z290ZUluaXQuamF2YQpAQCAtMzQ4LDYgKzM0OCw3IEBACiAgICAgICAgICAgICAgICAgVHlwZWRBcnJheSBhciA9IG1SZXNvdXJjZXMub2J0YWluVHlwZWRBcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXJyYXkucHJlbG9hZGVkX2RyYXdhYmxlcyk7CiAgICAgICAgICAgICAgICAgaW50IE4gPSBwcmVsb2FkRHJhd2FibGVzKHJ1bnRpbWUsIGFyKTsKKyAgICAgICAgICAgICAgICBhci5yZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiLi4ucHJlbG9hZGVkICIgKyBOICsgIiByZXNvdXJjZXMgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgKyAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCktc3RhcnRUaW1lKSArICJtcy4iKTsKIApAQCAtMzU1LDYgKzM1Niw3IEBACiAgICAgICAgICAgICAgICAgYXIgPSBtUmVzb3VyY2VzLm9idGFpblR5cGVkQXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmFycmF5LnByZWxvYWRlZF9jb2xvcl9zdGF0ZV9saXN0cyk7CiAgICAgICAgICAgICAgICAgTiA9IHByZWxvYWRDb2xvclN0YXRlTGlzdHMocnVudGltZSwgYXIpOworICAgICAgICAgICAgICAgIGFyLnJlY3ljbGUoKTsKICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIuLi5wcmVsb2FkZWQgIiArIE4gKyAiIHJlc291cmNlcyBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICArIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKS1zdGFydFRpbWUpICsgIm1zLiIpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L0Jhc2VJV2luZG93LmphdmEKaW5kZXggYjIyNzcwMC4uMTVkMTFkOCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvQmFzZUlXaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9CYXNlSVdpbmRvdy5qYXZhCkBAIC00OSw2ICs0OSw5IEBACiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2hHZXROZXdTdXJmYWNlKCkgewogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGUoYm9vbGVhbiBvbikgeworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHdpbmRvd0ZvY3VzQ2hhbmdlZChib29sZWFuIGhhc0ZvY3VzLCBib29sZWFuIHRvdWNoRW5hYmxlZCkgewogICAgIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9qbmkvQW5kcm9pZC5tayBiL2NvcmUvam5pL0FuZHJvaWQubWsKaW5kZXggYzZkM2NlZS4uYzM4OWNmNyAxMDA2NDQKLS0tIGEvY29yZS9qbmkvQW5kcm9pZC5taworKysgYi9jb3JlL2puaS9BbmRyb2lkLm1rCkBAIC0xNTksMTIgKzE1OSwxMCBAQAogCSQoSk5JX0hfSU5DTFVERSkgXAogCSQoTE9DQUxfUEFUSCkvYW5kcm9pZC9ncmFwaGljcyBcCiAJJChMT0NBTF9QQVRIKS8uLi8uLi9saWJzL2h3dWkgXAotCSQoTE9DQUxfUEFUSCkvLi4vLi4vb3BlbmdsL2xpYnMgXAorCSQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vbmF0aXZlL29wZW5nbC9saWJzIFwKIAkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmx1ZWRyb2lkKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlKS9oYXJkd2FyZSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGxpYmhhcmR3YXJlX2xlZ2FjeSkvaGFyZHdhcmVfbGVnYWN5IFwKLQkkKExPQ0FMX1BBVEgpLy4uLy4uL2luY2x1ZGUvdWkgXAotCSQoTE9DQUxfUEFUSCkvLi4vLi4vaW5jbHVkZS91dGlscyBcCiAJZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAogCWV4dGVybmFsL3NraWEvaW5jbHVkZS9lZmZlY3RzIFwKIAlleHRlcm5hbC9za2lhL2luY2x1ZGUvaW1hZ2VzIFwKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19zZWxlY3Rfc2luZ2xlY2hvaWNlLnhtbCBiL2NvcmUvcmVzL3Jlcy9sYXlvdXQvd2Vidmlld19zZWxlY3Rfc2luZ2xlY2hvaWNlLnhtbAppbmRleCBjMDc1M2E4Li5kM2MzYzE1IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvbGF5b3V0L3dlYnZpZXdfc2VsZWN0X3NpbmdsZWNob2ljZS54bWwKKysrIGIvY29yZS9yZXMvcmVzL2xheW91dC93ZWJ2aWV3X3NlbGVjdF9zaW5nbGVjaG9pY2UueG1sCkBAIC0xNywxMyArMTcsNyBAQAogPFRleHRWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC90ZXh0MSIKICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgotICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VMYXJnZSIKLSAgICBhbmRyb2lkOnRleHRDb2xvcj0iP2FuZHJvaWQ6YXR0ci90ZXh0Q29sb3JBbGVydERpYWxvZ0xpc3RJdGVtIgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZGlwIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI3ZGlwIgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iP2FuZHJvaWQ6YXR0ci9kcm9wZG93bkxpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0IgogICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgogICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3NwaW5uZXJEcm9wRG93bkl0ZW1TdHlsZSIKICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvYWN0aXZhdGVkQmFja2dyb3VuZEluZGljYXRvciIKZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCmluZGV4IDQ5MDBhNWQuLjlhYzIwZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiJHQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiJUQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBldGFieXRlU2hvcnQiIG1zZ2lkPSI1NjM3ODE2NjgwMTQ0OTkwMjE5Ij4iUEIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmlsZVNpemVTdWZmaXggKDkxNjQyOTI3OTE1MDA1MzE5NDkpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJmaWxlU2l6ZVN1ZmZpeCIgbXNnaWQ9IjkxNjQyOTI3OTE1MDA1MzE5NDkiPiI8eGxpZmY6ZyBpZD0iVU5JVCI+JTIkczwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iTlVNQkVSIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVudGl0bGVkIiBtc2dpZD0iNDYzODk1Njk1NDg1Mjc4MjU3NiI+IiZsdDtUaXRlbGxvb3MmZ3Q7Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXMiIG1zZ2lkPSI3ODk5ODI5NTE2MDQ4ODEzMjM3Ij4i4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXNfdHdvX2RvdHMiIG1zZ2lkPSIxMjI4MDc4OTk0ODY2MDMwNzM2Ij4i4oClIjwvc3RyaW5nPgpAQCAtMzE0LDggKzMxMyw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBtc2dpZD0iNjMzNTU3Njc3NTcxMTA5NTkzMSI+ImFrdGl2ZWVyIG9mIGRlYWt0aXZlZXIgcHJvZ3JhbWtvbXBvbmVudGUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VDb21wb25lbnRTdGF0ZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iODg4NzQzNTc0MDk4MjIzNzI5NCI+IkxhYXQgZGllIHByb2dyYW0gdG9lIG9tIHRlIHZlcmFuZGVyIG9mIFwnbiBrb21wb25lbnQgdmFuIGFuZGVyIHByb2dyYW0gZ2Vha3RpdmVlciBpcyBvZiBuaWUuIEt3YWFkd2lsbGlnZSBwcm9ncmFtbWUga2FuIGRpdCBkYWxrIGdlYnJ1aWsgb20gYmVsYW5ncmlrZSB0YWJsZXR2ZXJtb8OrbnMgdGUgZGVha3RpdmVlci4gV2VlcyB2ZXJzaWd0aWcgbWV0IGhpZXJkaWUgdG9lc3RlbW1pbmcsIHdhbnQgZGl0IGthbiBwcm9ncmFta29tcG9uZW50ZSB0b3QgXCduIG9uYnJ1aWtiYXJlLCBpbmtvbnNla3dlbnRlIG9mIG9uc3RhYmllbGUgdG9lc3RhbmQgYnJpbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfY2hhbmdlQ29tcG9uZW50U3RhdGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIxODI3MjMyNDg0NDE2NTA1NjE1Ij4iTGFhdCBkaWUgcHJvZ3JhbSB0b2Ugb20gdGUgdmVyYW5kZXIgb2YgXCduIGtvbXBvbmVudCB2YW4gYW5kZXIgcHJvZ3JhbSBnZWFrdGl2ZWVyIGlzIG9mIG5pZS4gS3dhYWR3aWxsaWdlIHByb2dyYW1tZSBrYW4gZGl0IGdlYnJ1aWsgb20gYmVsYW5ncmlrZSBmb29udmVybW/Dq25zIHRlIGRlYWt0aXZlZXIuIFdlZXMgdmVyc2lndGlnIG1ldCBoaWVyZGllIHRvZXN0ZW1taW5nLCB3YW50IGRpdCBrYW4gcHJvZ3JhbWtvbXBvbmVudGUgdG90IFwnbiBvbmJydWlrYmFyZSwgaW5rb25zZWt3ZW50ZSBvZiBvbnN0YWJpZWxlIHRvZXN0YW5kIGJyaW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfZ3JhbnRSZXZva2VQZXJtaXNzaW9ucyIgbXNnaWQ9IjQ2MjczMTUzNTEwOTM1MDg3OTUiPiJ0b2VzdGVtbWluZ3MgdGUgdmVybGVlbiBvZiB0ZSBoZXJyb2VwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZ3JhbnRSZXZva2VQZXJtaXNzaW9ucyIgbXNnaWQ9IjQwODg2NDI2NTQwODU4NTA2NjIiPiJMYWF0IFwnbiBwcm9ncmFtIHRvZSBvbSBzcGVzaWZpZWtlIHRvZXN0ZW1taW5ncyB0ZSB2ZXJsZWVuIG9mIHRlIGhlcnJvZXAgdmlyIGRpZSBiZXRyb2trZSBwcm9ncmFtIG9mIGFuZGVyIHByb2dyYW1tZS4gU2thZGVsaWtlIHByb2dyYW1tZSBrYW4gZGl0IGdlYnJ1aWsgb20gdG9lZ2FuZyB0ZSB2ZXJrcnkgdG90IGtlbm1lcmtlIHdhYXJ2b29yIGp5IG5pZSB0b2VzdGVtbWluZyB2ZXJsZWVuIGhldCBuaWUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9ncmFudFJldm9rZVBlcm1pc3Npb25zIiBtc2dpZD0iNDYyNzMxNTM1MTA5MzUwODc5NSI+InZlcmxlZW4gb2YgaGVycm9lcCB0b2VzdGVtbWluZ3MiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19ncmFudFJldm9rZVBlcm1pc3Npb25zIiBtc2dpZD0iNDA4ODY0MjY1NDA4NTg1MDY2MiI+IkxhYXQgXCduIHByb2dyYW0gdG9lIG9tIHNwZXNpZmlla2UgdG9lc3RlbW1pbmdzIHRlIHZlcmxlZW4gb2YgdGUgaGVycm9lcCB2aXIgZGllIGJldHJva2tlIHByb2dyYW0gb2YgYW5kZXIgcHJvZ3JhbW1lLiBLd2FhZHdpbGxpZ2UgcHJvZ3JhbW1lIGthbiBkaXQgZ2VicnVpayBvbSB0b2VnYW5nIHRlIHZlcmtyeSB0b3Qga2VubWVya2Ugd2FhcnZvb3IgankgbmllIHRvZXN0ZW1taW5nIHZlcmxlZW4gaGV0IG5pZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3NldFByZWZlcnJlZEFwcGxpY2F0aW9ucyIgbXNnaWQ9Ijg0NjMxODE2Mjg2OTUzOTYzOTEiPiJzdGVsIHZvb3JrZXVycHJvZ3JhbW1lIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0UHJlZmVycmVkQXBwbGljYXRpb25zIiBtc2dpZD0iNDk3Mzk4Njc2MjI0MTc4MzcxMiI+IkxhYXQgZGllIHByb2dyYW0gdG9lIG9tIGpvdSB2b29ya2V1ci1wcm9ncmFtbWUgdGUgdmVyYW5kZXIuIEt3YWFkd2lsbGlnZSBwcm9ncmFtbWUga2FuIHN0aWx3ZWcgZGllIHByb2dyYW1tZSB3YXQgbG9vcCwgdmVyYW5kZXIsIHdhdCBqb3UgYmVzdGFhbmRlIHByb2dyYW1tZSBiZWRyaWVnIG9tIHByaXZhdGUgZGF0YSBvb3Igam91IGluIHRlIHNhbWVsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVTZXR0aW5ncyIgbXNnaWQ9IjEzNjU1MjM0OTczOTUxNDM3MDQiPiJ2ZXJhbmRlciBnbG9iYWxlIHN0ZWxzZWxpbnN0ZWxsaW5ncyI8L3N0cmluZz4KQEAgLTY3Miw4ICs2NzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFjZXVubG9ja19tdWx0aXBsZV9mYWlsdXJlcyIgbXNnaWQ9Ijc1NDEzNzU4MzAyMjc5MjQyOSI+Ik1ha3NpbXVtIGdlc2lnb250c2x1aXQtcG9naW5ncyBvb3Jza3J5Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iODA1Nzc2MjgyODM1NTU3MjMxNSI+IkxhYWksICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkdlaGVmLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQgKDQ0NzcyNjQ4NDkzODY4NTAyNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSI0NDc3MjY0ODQ5Mzg2ODUwMjY2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbG93X2JhdHRlcnkiIG1zZ2lkPSIxNDgyODczOTgxOTE5MjQ5NzQwIj4iS29wcGVsIGpvdSBoZXJsYWFpZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+IkdlZW4gU0lNLWthYXJ0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTUxNjU5MTk2MDk1NzkxNDc0Ij4iR2VlbiBTSU0ta2FhcnQgaW4gdGFibGV0IG5pZS4iPC9zdHJpbmc+CkBAIC03MjIsMTAgKzcyMCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IiBtc2dpZD0iOTkyMjgwNzU2MjU2NTM2MDQyIj4iPzEyMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FscGhhX2tleSIgbXNnaWQ9IjgwMDEwOTYxNzUxNjc0ODU2NDkiPiJBQkMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHRfa2V5IiBtc2dpZD0iMTI4NDgyMDk0MjYyMDI4ODY3OCI+IkFMVCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2FtcG0gKDQ1ODQzMzgwODM1MjkzNTU5ODIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9jYXBfYW1wbSAoMjA4MzQ2NTk5Mjk0MDQ0NDM2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfYW1wbSIgbXNnaWQ9IjQ1ODQzMzgwODM1MjkzNTU5ODIiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJBTVBNIj4lUDwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2NhcF9hbXBtIiBtc2dpZD0iMjA4MzQ2NTk5Mjk0MDQ0NDM2NiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IkFNUE0iPiVwPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X2ZhaWxlZCIgbXNnaWQ9IjU0MTAyNzAzMjkxMTQyMTIwNDEiPiJGYWJyaWVrdG9ldHMgaGV0IGdlZmFhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0iIG1zZ2lkPSI0NDM1MjAxNjU2NzY3Mjc2NzIzIj4iRGllIEZBQ1RPUllfVEVTVC1oYW5kZWxpbmcgd29yZCBuZXQgb25kZXJzdGV1biB2aXIgcGFra2V0dGUgd2F0IGluIC9zeXN0ZW0vYXBwIGdlw69uc3RhbGxlZXIgaXMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm9fYWN0aW9uIiBtc2dpZD0iODcyOTkxODc0Nzk5OTk4NTYxIj4iR2VlbiBwYWtrZXQgaXMgZ2V2aW5kIHdhdCBkaWUgRkFDVE9SWV9URVNULWhhbmRlbGluZyBiaWVkIG5pZS4iPC9zdHJpbmc+CkBAIC03MzcsOCArNzMzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSI0NTk1MDQ2NTE1NDAwMjY4ODgxIj4iV2VuazogRHViYmVsdGlrIG9tIGluIGVuIHVpdCB0ZSB6b2VtLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX3RoaXNfZm9ybSIgbXNnaWQ9IjQ2MTY3NTg4NDExNTc4MTY2NzYiPiJPdXRvdnVsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfYXV0b2ZpbGwiIG1zZ2lkPSI3MTAzNDk1MDcwMTgwNTkwODE0Ij4iU3RlbCBvdXRvdnVsIG9wIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IgKDYzNTAxNDUxNTQ3Nzk3MDY3NzIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yIiBtc2dpZD0iNjM1MDE0NTE1NDc3OTcwNjc3MiI+IiAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfbmFtZV9mb3JtYXQiIG1zZ2lkPSIzMjY4MDQxMDU0ODk5MjE0OTQ1Ij4iJDEkMiQzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X3NlcGFyYXRvciIgbXNnaWQ9Ijc0ODMzMDc4OTMxNzAzMjQxMjkiPiIsICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9mb3JtYXQiIG1zZ2lkPSI0ODc0NDU5NDU1Nzg2ODI3MzQ0Ij4iJDEkMiQzIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKaW5kZXggZjI1MzhjNi4uZGM3NGQ5NCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sCkBAIC0zNDEsNyArMzQxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlUHJvZmlsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQ2MzczNjY3MjM3OTMwNDU2MDMiPiLhiI3hiq0g4Yql4YqV4YuwIOGKoOGKleGJsCDhiLXhiJ0g4Yql4YqTIOGLqOGLleGLjeGJguGLqyDhiJjhiKjhjIMg4Y2jIOGJo+GKleGJsCDhiJjhiLPhiKrhi6sg4YuI4Yi14YylIOGLqOGJsOGKqOGIm+GJuSDhi6jhjI3hiI0g4YiY4YyI4YiI4YyrIOGImOGIqOGMgyDhiIjhiJjhiIjhi4jhjKUg4YuI4Yut4YidIOGIiOGIm+GKqOGIjSDhiIjhiJjhibDhjI3hiaDhiKrhi6vhi40g4Yut4Y2I4YmF4Yuz4YiJ4Y2h4Y2h4Yut4YiE4YidIOGIm+GIiOGJtSDhiIzhiI7hib0g4YiY4Ymw4YyN4Ymg4Yiq4Yur4YuO4Ym9IOGIiuGIiOGLqeGIhSDhi63hib3hiIvhiIkg4Yql4YqTIOGIiOGIjOGIjuGJvSDhi6jhiJjhjIjhiIjhjKsg4YiY4Yio4YyD4YiF4YqVIOGLreGIjeGKq+GIieGNoeGNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFNvY2lhbFN0cmVhbSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjEyNjg5MjA5NTYxNTI0MTkxNzAiPiLhi6jhiqDhipXhibDhipUg4Yib4YiF4Ymg4Yir4YuKIOGLqOGLjeGLreGLreGJtSDhiq3hjY3hiI7hib0g4Yqg4YqV4Yml4YmlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFNvY2lhbFN0cmVhbSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM0MTkwNTA4MDg1NDczMzUzMjAiPiIg4Yqo4Yqg4YqV4YmwIOGMk+GLsOGKnuGJvSDhiJvhiIXhiaDhiKvhi4og4Yud4Yib4YqU4YuO4Ym94YqVIOGKpeGKleGLsuGLsOGIreGIteGJo+GJuOGLjSDhiqXhipMg4Yql4YqV4Yuy4Yur4YiY4Yiz4Yi14YiNIOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjeGLreGNiOGJheGLs+GIieGNoeGNoSDhibDhipXhiq7hiI0g4Yqg4YuY4YiNIOGImOGJsOGMjeGJoOGIquGLq+GLjuGJvSDhi63hiIXhipUg4YiY4Yuz4Yio4Yi7IOGJo+GKleGJsOGKkyDhiaDhjJPhi7Dhip7hib3hiIUg4YiY4Yqr4Yqo4YiNIOGJoOGIm+GIheGJoOGIq+GLiiDhiqDhi43hibPhiKjhiJjhiKjhiabhib0g4Yur4YiJIOGLqOGMjeGIjSDhibDhjI3hiaPhiabhibbhib3hipUg4YiI4YiY4Yuz4Yio4Yi1IOGIiuGMoOGJgOGImeGJoOGJtSDhi63hib3hiIvhiInhjaHhjaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlU29jaWFsU3RyZWFtIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzUwNDE3OTIyMjQ5MzIzNTY0NSI+IuGLiOGLsCDhi6vhipXhibAg4Yib4YiF4Ymg4Yir4YuKIOGLqOGLjeGLreGLreGJtSDhiq3hjY3hiI7hib0g4Yy74Y2NIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVNvY2lhbFN0cmVhbSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM1MDQxNzkyMjI0OTMyMzU2NDUiPiLhi4jhi7Ag4Yuo4Yqg4YqV4YmwICDhiJvhiIXhiaDhiKvhi4og4Yuo4YuN4Yut4Yut4Ym1IOGKreGNjeGIjuGJvSDhjLvhjY0iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZVNvY2lhbFN0cmVhbSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM0OTYyNzcxNzY5NTU3MjE0NTEiPiIg4Yuo4YyT4Yuw4Yqe4Ym94YiF4YqVIOGIm+GIheGJoOGIq+GLiiDhi53hiJvhipThi47hib3hipUg4YiI4Yib4Yiz4Yuo4Ym1IOGIiOGImOGJsOGMjeGJoOGIquGLq+GLjSDhi63hjYjhiYXhi7PhiInhjaHhjaEg4Ymw4YqV4Yqu4YiNIOGKoOGLmOGIjSDhiJjhibDhjI3hiaDhiKrhi6vhi47hib0g4Yut4YiF4YqVIOGImOGLs+GIqOGIuyDhjJPhi7Dhipsg4YiY4Yi14YiI4YuNIOGIiOGImOGJheGIqOGJpSDhiqXhipMg4Yuo4Yut4YiI4Y2NIOGJg+GIjeGKkyDhiIzhiIsg4Yid4Yi14Yyi4Yir4YuKIOGImOGIqOGMgyDhiqXhipXhi7XhibXhiLDhjKUg4YiI4Yib4Yu14Yio4YyNIOGIiuGMoOGJgOGImeGJoOGJtSDhi63hib3hiIvhiInhjaHhjaEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRDYWxlbmRhciIgbXNnaWQ9IjU5NzI3Mjc1NjAyNTc2MTIzOTgiPiLhi6jhiYDhipUg4YiY4YmB4Yyg4Yiq4YurIOGKreGIteGJsOGJtuGJvSDhibDhjKjhiJvhiKog4Yia4Yi14Yyl4Yir4YuKIOGImOGIqOGMgyDhiqDhipXhiaXhiaUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkQ2FsZW5kYXIiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjIzMzg0MTQ1NTEwMDQxMjI2ODciPiLhiaDhjKHhiaPhi4og4Ymw4Yqu4YiFIOGIi+GLrSDhi6jhibDhiqjhiJvhibkg4YiB4YiJ4YqV4YidIOGLqOGJgOGKlSDhiJjhiYHhjKDhiKrhi6sg4Yqt4Yi14Ymw4Ym24Ym9IOGImOGJsOGMjeGJoOGIquGLq+GLjuGJuSDhiqXhipXhi7Lhi6vhipDhiaEg4Yut4Y2I4YmF4Yuz4YiJ4Y2h4Y2hIOGLq+GIiCDhiaPhiIjhiaThibEg4Yql4YuN4YmF4YqTIOGKqOGKkOGLmuGIhSDhi6jhiYDhipUg4YiY4YmB4Yyg4Yiq4Yur4YuO4Ym9IOGLqOGMjeGIjSDhiJjhiKjhjIPhi47hib3hipUg4YyO4YyCIOGImOGJsOGMjeGJoOGIquGLq+GLjuGJvSDhi6vhi4jhjKPhiInhjaHhjaEiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAppbmRleCAzZGFmMzNhLi5jMjc3ZWU5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwKQEAgLTI2LDggKzI2LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImdpZ2FieXRlU2hvcnQiIG1zZ2lkPSIzMjU5ODgyNDU1MjEyMTkzMjE0Ij4i0JPQkSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiLQotCRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGV0YWJ5dGVTaG9ydCIgbXNnaWQ9IjU2Mzc4MTY2ODAxNDQ5OTAyMTkiPiLQn9CRIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbGVTaXplU3VmZml4ICg5MTY0MjkyNzkxNTAwNTMxOTQ5KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZmlsZVNpemVTdWZmaXgiIG1zZ2lkPSI5MTY0MjkyNzkxNTAwNTMxOTQ5Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JTEkczwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlVOSVQiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O9CR0LXQtyDQt9Cw0LPQu9Cw0LLQuNC1Jmd0OyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzIiBtc2dpZD0iNzg5OTgyOTUxNjA0ODgxMzIzNyI+IuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzX3R3b19kb3RzIiBtc2dpZD0iMTIyODA3ODk5NDg2NjAzMDczNiI+Ii4uIjwvc3RyaW5nPgpAQCAtNjcyLDggKzY3MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWNldW5sb2NrX211bHRpcGxlX2ZhaWx1cmVzIiBtc2dpZD0iNzU0MTM3NTgzMDIyNzkyNDI5Ij4i0JzQsNC60YHQuNC80LDQu9C90LjRj9GCINCx0YDQvtC5INC+0L/QuNGC0Lgg0LfQsCDQvtGC0LrQu9GO0YfQstCw0L3QtSDRgSDQu9C40YbQtSDQtSDQvdCw0LTQstC40YjQtdC9Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iODA1Nzc2MjgyODM1NTU3MjMxNSI+ItCX0LDRgNC10LbQtNCwINGB0LUsIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4i0JfQsNGA0LXQtNC10L0uIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCAoNDQ3NzI2NDg0OTM4Njg1MDI2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fYmF0dGVyeV9zaG9ydCIgbXNnaWQ9IjQ0NzcyNjQ4NDkzODY4NTAyNjYiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9sb3dfYmF0dGVyeSIgbXNnaWQ9IjE0ODI4NzM5ODE5MTkyNDk3NDAiPiLQodCy0YrRgNC20LXRgtC1INC30LDRgNGP0LTQvdC+0YLQviDRgdC4INGD0YHRgtGA0L7QudGB0YLQstC+LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCIgbXNnaWQ9IjczODE0OTkyMTc3MzIyMjcyOTUiPiLQndGP0LzQsCBTSU0g0LrQsNGA0YLQsC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE1MTY1OTE5NjA5NTc5MTQ3NCI+ItCSINGC0LDQsdC70LXRgtCwINC90Y/QvNCwIFNJTSDQutCw0YDRgtCwLiI8L3N0cmluZz4KQEAgLTcyMiwxMCArNzIwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiIG1zZ2lkPSI5OTIyODA3NTYyNTY1MzYwNDIiPiI/MTIzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWxwaGFfa2V5IiBtc2dpZD0iODAwMTA5NjE3NTE2NzQ4NTY0OSI+ItCQ0JHQkiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FsdF9rZXkiIG1zZ2lkPSIxMjg0ODIwOTQyNjIwMjg4Njc4Ij4iQUxUIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfYW1wbSAoNDU4NDMzODA4MzUyOTM1NTk4MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2NhcF9hbXBtICgyMDgzNDY1OTkyOTQwNDQ0MzY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9hbXBtIiBtc2dpZD0iNDU4NDMzODA4MzUyOTM1NTk4MiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IkFNUE0iPiVQPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfY2FwX2FtcG0iIG1zZ2lkPSIyMDgzNDY1OTkyOTQwNDQ0MzY2Ij4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iQU1QTSI+JXA8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3RfZmFpbGVkIiBtc2dpZD0iNTQxMDI3MDMyOTExNDIxMjA0MSI+ItCk0LDQsdGA0LjRh9C90LjRj9GCINGC0LXRgdGCINC90LUg0LHQtSDRg9GB0L/QtdGI0LXQvSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0iIG1zZ2lkPSI0NDM1MjAxNjU2NzY3Mjc2NzIzIj4i0JTQtdC50YHRgtCy0LjQtdGC0L4gRkFDVE9SWV9URVNUINGB0LUg0L/QvtC00LTRitGA0LbQsCDRgdCw0LzQviDQt9CwINC/0LDQutC10YLQuCwg0LjQvdGB0YLQsNC70LjRgNCw0L3QuCDQsiAvc3lzdGVtL2FwcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub19hY3Rpb24iIG1zZ2lkPSI4NzI5OTE4NzQ3OTk5OTg1NjEiPiLQndC1INCx0LUg0L3QsNC80LXRgNC10L0g0L/QsNC60LXRgiwg0L/RgNC10LTQvtGB0YLQsNCy0Y/RiSDQtNC10LnRgdGC0LLQuNC10YLQviBGQUNUT1JZX1RFU1QuIjwvc3RyaW5nPgpAQCAtNzM3LDggKzczMyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iNDU5NTA0NjUxNTQwMDI2ODg4MSI+ItCh0YrQstC10YI6INCU0L7QutC+0YHQvdC10YLQtSDQtNCy0YPQutGA0LDRgtC90L4sINC30LAg0LTQsCDRg9Cy0LXQu9C40YfQuNGC0LUg0LjQu9C4INC90LDQvNCw0LvQuNGC0LUg0LzQsNGJ0LDQsdCwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX3RoaXNfZm9ybSIgbXNnaWQ9IjQ2MTY3NTg4NDExNTc4MTY2NzYiPiLQkNCy0YLQvtC/0L7Qvy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9hdXRvZmlsbCIgbXNnaWQ9IjcxMDM0OTUwNzAxODA1OTA4MTQiPiLQkNCy0YLQvtC/0L7Qvy46INCd0LDRgdGC0YDQvtC50LrQsCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yICg2MzUwMTQ1MTU0Nzc5NzA2NzcyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciIgbXNnaWQ9IjYzNTAxNDUxNTQ3Nzk3MDY3NzIiPiIgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X25hbWVfZm9ybWF0IiBtc2dpZD0iMzI2ODA0MTA1NDg5OTIxNDk0NSI+IiQxJDIkMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9zZXBhcmF0b3IiIG1zZ2lkPSI3NDgzMzA3ODkzMTcwMzI0MTI5Ij4iLCAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfZm9ybWF0IiBtc2dpZD0iNDg3NDQ1OTQ1NTc4NjgyNzM0NCI+IiQxJDIkMyI8L3N0cmluZz4KQEAgLTc3MywxMCArNzY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NlcmlhbFBvcnQiIG1zZ2lkPSIyOTkxNjM5OTg1MjI0NTk4MTkzIj4i0KDQsNC30YDQtdGI0LDQstCwINC90LAg0L/RgNC40YLQtdC20LDRgtC10LvRjyDQtNC+0YHRgtGK0L8g0LTQviDRgdC10YDQuNC50L3QuCDQv9C+0YDRgtC+0LLQtSDQv9C+0YHRgNC10LTRgdGC0LLQvtC8INC/0YDQuNC70L7QttC90LjRjyDQv9GA0L7Qs9GA0LDQvNC10L0g0LjQvdGC0LXRgNGE0LXQudGBIChBUEkpIFNlcmlhbE1hbmFnZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiLQstGK0L3RiNC10L0g0LTQvtGB0YLRitC/INC00L4g0LTQvtGB0YLQsNCy0YfQuNGG0LjRgtC1INC90LAg0YHRitC00YrRgNC2LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNDU0NDM0NjQ4NjY5Nzg1MzY4NSI+ItCg0LDQt9GA0LXRiNCw0LLQsCDQvdCwINC/0YDQuNGC0LXQttCw0YLQtdC70Y8g0LTQvtGB0YLRitC/INC00L4g0LTQvtGB0YLQsNCy0YfQuNGG0LjRgtC1INC90LAg0YHRitC00YrRgNC20LDQvdC40LUg0L7RgiDQutC+0LzQsNC90LTQvdC40Y8g0YDQtdC0LiDQndC+0YDQvNCw0LvQvdC40YLQtSDQv9GA0LjQu9C+0LbQtdC90LjRjyDQsdC4INGC0YDRj9Cx0LLQsNC70L4g0L3QuNC60L7Qs9CwINC00LAg0L3QtSDRgdC1INC90YPQttC00LDRj9GCINC+0YIg0YLQvtCy0LAuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfdXBkYXRlTG9jayAoMzUyNzU1ODM2NjYxNjY4MDg4OSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY191cGRhdGVMb2NrICgxNjU1NjI1ODMyMTY2Nzc4NDkyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+ItCx0LXQtyDQsNCy0YIuINCw0LrRgtGD0LDQu9C40LfQsNGG0LjQuCDQvdCwINGD0YHRgtGA0L7QudGB0YLQstC+0YLQviI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4i0KDQsNC30YDQtdGI0LDQstCwINC90LAg0L/RgNC40YLQtdC20LDRgtC10LvRjyDQtNCwINC/0YDQtdC00LvQvtC20Lgg0L3QsCDRgdC40YHRgtC10LzQsNGC0LAg0LjQvdGE0L7RgNC80LDRhtC40Y8g0LfQsCDRgtC+0LLQsCwg0LrQvtCz0LAg0YnQtSDQtSDQstGK0LfQvNC+0LbQvdC+INC90LXQuNC90YLQtdGA0LDQutGC0LjQstC90L4g0YDQtdGB0YLQsNGA0YLQuNGA0LDQvdC1INC30LAg0L3QsNC00YHRgtGA0L7QudCy0LDQvdC1INC90LAg0YPRgdGC0YDQvtC50YHRgtCy0L7RgtC+LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+ItCY0YHQutCw0YLQtSDQu9C4INCx0YDQsNGD0LfRitGA0YrRgiDQtNCwINC30LDQv9C+0LzQvdC4INGC0LDQt9C4INC/0LDRgNC+0LvQsD8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiLQndC1INGB0LXQs9CwIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiLQl9Cw0L/QvtC80L3Rj9C90LUiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAppbmRleCA4ZWE3NzExLi4zODlhNjcyIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwKQEAgLTc2OCw3ICs3NjgsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiJVbW/FvsWIdWplIGRyxb5pdGVsaSBwxZnDrXN0dXAgayBzw6lyaW92w71tIHBvcnTFr20gcG9tb2PDrSByb3pocmFuw60gU2VyaWFsTWFuYWdlciBBUEkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiJleHRlcm7DrSBwxZnDrXN0dXAgayBwb3NreXRvdmF0ZWzFr20gb2JzYWh1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI0NTQ0MzQ2NDg2Njk3ODUzNjg1Ij4iVW1vxb7FiHVqZSBkcsW+aXRlbGkgesOtc2thdCB6IHDFmcOta2F6b3bDqWhvIMWZw6Fka3UgcMWZw61zdHVwIGsgcG9za3l0b3ZhdGVsxa9tIG9ic2FodS4gQsSbxb5uw6kgYXBsaWthY2UgYnkgdG90byBvcHLDoXZuxJtuw60gbmVtxJtseSBuaWtkeSBwb8W+YWRvdmF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdXBkYXRlTG9jayIgbXNnaWQ9IjM1Mjc1NTgzNjY2MTY2ODA4ODkiPiJ2YXJvdsOhbsOtIHDFmWVkIGF1dG9tYXRpY2tvdSBha3R1YWxpemFjw60iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4idmFyb3ZhdCBwxZllZCBhdXRvbWF0aWNrb3UgYWt0dWFsaXphY8OtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJVbW/FvsWIdWplIGRyxb5pdGVsaSBuYXZyaG5vdXQgc3lzdMOpbXUgaW5mb3JtYWNlIG8gdmhvZG7DqSBkb2LEmyBwcm8gdXBncmFkZSB6YcWZw616ZW7DrSBuZWludGVyYWt0aXZuw61tIHJlc3RhcnRvdsOhbsOtbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJDaGNldGUsIGFieSBzaSBwcm9obMOtxb5lxI0gemFwYW1hdG92YWwgdG90byBoZXNsbz8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJOeW7DrSBuZSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmluZGV4IDZmZDQ1NDMuLjNjYTA1MzQgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApAQCAtNzY5LDcgKzc2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+ImFkZ2FuZyB0aWwgaW5kaG9sZHNsZXZlcmFuZMO4cmVyIGVrc3Rlcm50Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI0NTQ0MzQ2NDg2Njk3ODUzNjg1Ij4iR2l2ZXIgaW5kZWhhdmVyZW4gYWRnYW5nIHRpbCBpbmRob2xkc2xldmVyYW5kw7hyZXIgZnJhIHN0YXJ0c2lkZW4uIELDuHIgYWxkcmlnIHbDpnJlIG7DuGR2ZW5kaWd0IGZvciBub3JtYWxlIGFwcHMuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+InVuZGfDpSBhdXRvbWF0aXNrZSBlbmhlZHNvcGRhdGVyaW5nZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191cGRhdGVMb2NrIiBtc2dpZD0iMTY1NTYyNTgzMjE2Njc3ODQ5MiI+IkdpdmVyIGluZGVoYXZlcmVuIHJldCB0aWwgYXQgZ2l2ZSBzeXN0ZW1ldCBvcGx5c25pbmdlciBvbSwgaHZvcm7DpXIgZGV0IHZpbCB2w6ZyZSBldCBnb2R0IHRpZHNwdW5rdCBmb3IgZW4gaWtrZS1pbnRlcmFrdGl2IGdlbnN0YXJ0IGF0IG9wZ3JhZGVyZSBlbmhlZGVuLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4iR2l2ZXIgaW5kZWhhdmVyZW4gcmV0IHRpbCBhdCBnaXZlIHN5c3RlbWV0IG9wbHlzbmluZ2VyIG9tLCBodm9ybsOlciBkZXQgdmlsIHbDpnJlIGV0IGdvZHQgdGlkc3B1bmt0IGZvciBlbiBpa2tlLWludGVyYWt0aXYgZ2Vuc3RhcnQgZm9yIGF0IG9wZ3JhZGVyZSBlbmhlZGVuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IsOYbnNrZXIgZHUsIGF0IGJyb3dzZXJlbiBza2FsIGh1c2tlIGRlbm5lIGFkZ2FuZ3Nrb2RlPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbm90bm93IiBtc2dpZD0iNjM4OTY3NTMxNjcwNjY5OTc1OCI+Iklra2UgbnUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX3JlbWVtYmVyIiBtc2dpZD0iNjQ5MTg3OTY3ODk5Njc0OTQ2NiI+Ikh1c2siPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmluZGV4IDFhMGQ0NzkuLjhlMzY5NDggMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCkBAIC02NzEsNyArNjcxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY2V1bmxvY2tfbXVsdGlwbGVfZmFpbHVyZXMiIG1zZ2lkPSI3NTQxMzc1ODMwMjI3OTI0MjkiPiJTZSBzdXBlcsOzIGVsIG3DoXhpbW8gZGUgaW50ZW50b3MgcGVybWl0aWRvIHBhcmEgZWwgZGVzYmxvcXVlbyBmYWNpYWwgZGVsIGRpc3Bvc2l0aXZvLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjgwNTc3NjI4MjgzNTU1NzIzMTUiPiJDYXJnYW5kbyA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNhcmdhZGEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+IkNvbmVjdGEgdHUgY2FyZ2Fkb3IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+Ik5vIGhheSB0YXJqZXRhIFNJTS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE1MTY1OTE5NjA5NTc5MTQ3NCI+Ik5vIGhheSB0YXJqZXRhIFNJTSBlbiBlbCB0YWJsZXQuIjwvc3RyaW5nPgpAQCAtNzY4LDggKzc2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXJpYWxQb3J0IiBtc2dpZD0iMjk5MTYzOTk4NTIyNDU5ODE5MyI+IlBlcm1pdGUgYWNjZWRlciBhIHB1ZXJ0b3Mgc2VyaWUgYSB0cmF2w6lzIGRlIGxhIEFQSSBTZXJpYWxNYW5hZ2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI1MDc3Nzc0Mjk3OTQzNDA5Mjg1Ij4iYWNjZWRlciBhIHByb3ZlZWRvcmVzIGV4dGVybmFtZW50ZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNDU0NDM0NjQ4NjY5Nzg1MzY4NSI+IlBlcm1pdGUgYWNjZWRlciBhIGxvcyBwcm92ZWVkb3JlcyBkZSBjb250ZW5pZG8gZGVzZGUgbGEgaW50ZXJmYXouIExhcyBhcGxpY2FjaW9uZXMgbm9ybWFsZXMgbnVuY2EgZGViZXLDrWFuIG5lY2VzaXRhcmxvLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdXBkYXRlTG9jayIgbXNnaWQ9IjM1Mjc1NTgzNjY2MTY2ODA4ODkiPiJkZXNhbGVudGFyIGEgbGFzIGFjdHVhbGl6YWNpb25lcyBhdXRvbcOhdGljYXMgZGUgZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJQZXJtaXRlIGEgc3UgdGl0dWxhciBhIG9mcmVjZXIgaW5mb3JtYWNpw7NuIGFsIHNpc3RlbWEgYWNlcmNhIGRlIGN1w6FuZG8gc2Vyw61hIHVuIGJ1ZW4gbW9tZW50byBwYXJhIHJlaW5pY2lhciBlbCBzaXN0ZW1hIG5vIGludGVyYWN0aXZvIHBhcmEgYWN0dWFsaXphciBlbCBkaXNwb3NpdGl2by4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4ibm8gcmVhbGl6YXIgYWN0dWFsaXphY2lvbmVzIGF1dG9tw6F0aWNhcyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4iUGVybWl0ZSBhIHN1IHByb3BpZXRhcmlvIG9mcmVjZXIgaW5mb3JtYWNpw7NuIGFsIHNpc3RlbWEgYWNlcmNhIGRlIGN1w6FuZG8gc2Vyw61hIGFkZWN1YWRvIHJlaW5pY2lhciBlbCBzaXN0ZW1hIGRlIGZvcm1hIG5vIGludGVyYWN0aXZhIHkgYWN0dWFsaXphciBlbCBkaXNwb3NpdGl2by4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLCv1F1aWVyZXMgcmVjb3JkYXIgZXN0YSBjb250cmFzZcOxYSBlbiBlbCBuYXZlZ2Fkb3I/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9ub3Rub3ciIG1zZ2lkPSI2Mzg5Njc1MzE2NzA2Njk5NzU4Ij4iQWhvcmEgbm8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiJSZWN1ZXJkYSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmluZGV4IDNiN2JkMGYuLmE0YTliZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbApAQCAtNzY4LDEwICs3NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiLYqNmHINiv2KfYsdmG2K/ZhyDYp9is2KfYstmHINmF24zigIzYr9mH2K8g2KjYpyDYp9iz2KrZgdin2K/ZhyDYp9iyIFNlcmlhbE1hbmFnZXIgQVBJINio2Ycg2K/Ysdqv2KfZh+KAjNmH2KfbjCDYs9ix24zYp9mEINiv2LPYqtix2LPbjCDYr9in2LTYqtmHINio2KfYtNivLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI1MDc3Nzc0Mjk3OTQzNDA5Mjg1Ij4i2K/Ys9iq2LHYs9uMINiu2KfYsdis24wg2KjZhyDYp9ix2KfYptmH4oCM2K/Zh9mG2K/ar9in2YYg2YXYrdiq2YjYpyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNDU0NDM0NjQ4NjY5Nzg1MzY4NSI+Itio2Ycg2K/Yp9ix2YbYr9mHINin2KzYp9iy2Ycg2YXbjOKAjNiv2YfYryDYqtinINin2LIg2K7Yp9ix2Kwg2KjYsdmG2KfZhdmHINio2Ycg2KfYsdin2KbZh+KAjNiv2YfZhtiv2q/Yp9mGINmF2K3YqtmI2Kcg2K/Ys9iq2LHYs9uMINiv2KfYtNiq2Ycg2KjYp9i02K8uINmH2LHar9iyINio2LHYp9uMINio2LHZhtin2YXZh+KAjNmH2KfbjCDZhdi52YXZiNmE24wg2KjZhyDYotmGINmG24zYp9iy24wg2YbbjNiz2KouIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfdXBkYXRlTG9jayAoMzUyNzU1ODM2NjYxNjY4MDg4OSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY191cGRhdGVMb2NrICgxNjU1NjI1ODMyMTY2Nzc4NDkyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+Itiq2LHYutuM2Kgg2KjZhyDYp9mG2KzYp9mFINmG2K/Yp9iv2YYg2KjZh+KAjNix2YjYstix2LPYp9mG24zigIzZh9in24wg2K7ZiNiv2qnYp9ixINiv2LPYqtqv2KfZhyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4i2KjZhyDYr9in2LHZhtiv2Ycg2KfYrNin2LLZhyDZhduM4oCM2K/Zh9ivINin2LfZhNin2LnYp9iq24wg2K/YsSDZhdmI2LHYryDYstmF2KfZhiDZhdmG2KfYs9ioINio2LHYp9uMINuM2qkg2LHYp9mH4oCM2KfZhtiv2KfYstuMINmF2KzYr9ivINi624zYsdiq2LnYp9mF2YTbjCDYrNmH2Kog2KfYsdiq2YLYp9uMINiv2LPYqtqv2KfZhyDYsdinINio2Ycg2LPbjNiz2KrZhSDYp9ix2KfYptmHINiv2YfYry4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLZhduMINiu2YjYp9mH24zYryDZhdix2YjYsdqv2LEg2KfbjNmGINix2YXYsiDZiNix2YjYryDYsdinINio2Ycg2K7Yp9i32LEg2K/Yp9i02KrZhyDYqNin2LTYr9ifIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9ub3Rub3ciIG1zZ2lkPSI2Mzg5Njc1MzE2NzA2Njk5NzU4Ij4i2KfaqdmG2YjZhiDYrtuM2LEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX3JlbWVtYmVyIiBtc2dpZD0iNjQ5MTg3OTY3ODk5Njc0OTQ2NiI+Itio2Ycg2K7Yp9i32LEg2LPZvtix2K/ZhiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmluZGV4IGU1OWNiMjIuLmIxOWE3ZGUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiJHbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiJUbyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBldGFieXRlU2hvcnQiIG1zZ2lkPSI1NjM3ODE2NjgwMTQ0OTkwMjE5Ij4iUG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmlsZVNpemVTdWZmaXggKDkxNjQyOTI3OTE1MDA1MzE5NDkpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJmaWxlU2l6ZVN1ZmZpeCIgbXNnaWQ9IjkxNjQyOTI3OTE1MDA1MzE5NDkiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lMSRzPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IlVOSVQiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O1NhbnMgbm9tJmd0OyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzIiBtc2dpZD0iNzg5OTgyOTUxNjA0ODgxMzIzNyI+IuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzX3R3b19kb3RzIiBtc2dpZD0iMTIyODA3ODk5NDg2NjAzMDczNiI+IuKApSI8L3N0cmluZz4KQEAgLTY3Miw4ICs2NzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFjZXVubG9ja19tdWx0aXBsZV9mYWlsdXJlcyIgbXNnaWQ9Ijc1NDEzNzU4MzAyMjc5MjQyOSI+Ik5vbWJyZSBtYXhpbWFsIGF1dG9yaXPDqSBkZSB0ZW50YXRpdmVzIEZhY2XCoFVubG9jayBhdHRlaW50LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjgwNTc3NjI4MjgzNTU1NzIzMTUiPiJFbiBjaGFyZ2UgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkNoYXJnw6kiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0ICg0NDc3MjY0ODQ5Mzg2ODUwMjY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbG93X2JhdHRlcnkiIG1zZ2lkPSIxNDgyODczOTgxOTE5MjQ5NzQwIj4iQnJhbmNoZXogdm90cmUgY2hhcmdldXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+IkF1Y3VuZSBjYXJ0ZSBTSU0gblwnYSDDqXTDqSB0cm91dsOpZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE1MTY1OTE5NjA5NTc5MTQ3NCI+IkF1Y3VuZSBjYXJ0ZSBTSU0gblwnZXN0IGluc8OpcsOpZSBkYW5zIGxhIHRhYmxldHRlLiI8L3N0cmluZz4KQEAgLTcyMiwxMCArNzIwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiIG1zZ2lkPSI5OTIyODA3NTYyNTY1MzYwNDIiPiI/MTIzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWxwaGFfa2V5IiBtc2dpZD0iODAwMTA5NjE3NTE2NzQ4NTY0OSI+IkFCQyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FsdF9rZXkiIG1zZ2lkPSIxMjg0ODIwOTQyNjIwMjg4Njc4Ij4iQUxUIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfYW1wbSAoNDU4NDMzODA4MzUyOTM1NTk4MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2NhcF9hbXBtICgyMDgzNDY1OTkyOTQwNDQ0MzY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9hbXBtIiBtc2dpZD0iNDU4NDMzODA4MzUyOTM1NTk4MiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+wqA8eGxpZmY6ZyBpZD0iQU1QTSI+JVA8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9jYXBfYW1wbSIgbXNnaWQ9IjIwODM0NjU5OTI5NDA0NDQzNjYiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPsKgPHhsaWZmOmcgaWQ9IkFNUE0iPiVwPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X2ZhaWxlZCIgbXNnaWQ9IjU0MTAyNzAzMjkxMTQyMTIwNDEiPiLDiWNoZWMgZHUgdGVzdCB1c2luZSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0iIG1zZ2lkPSI0NDM1MjAxNjU2NzY3Mjc2NzIzIj4iTFwnYWN0aW9uIEZBQ1RPUllfVEVTVCBlc3QgdW5pcXVlbWVudCBwcmlzZSBlbiBjaGFyZ2UgcG91ciBsZXMgcGFxdWV0cyBkZSBkb25uw6llcyBpbnN0YWxsw6lzIGRhbnMgaW4vc3lzdGVtL2FwcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub19hY3Rpb24iIG1zZ2lkPSI4NzI5OTE4NzQ3OTk5OTg1NjEiPiJJbXBvc3NpYmxlIGRlIHRyb3V2ZXIgdW4gcGFxdWV0IHByb3Bvc2FudCBsXCdhY3Rpb24gRkFDVE9SWV9URVNULiI8L3N0cmluZz4KQEAgLTczNyw4ICs3MzMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjQ1OTUwNDY1MTU0MDAyNjg4ODEiPiJDb25zZWlswqA6IEFwcHV5ZXogZGV1eMKgZm9pcyBwb3VyIGZhaXJlIHVuIHpvb20gYXZhbnQgb3UgYXJyacOocmUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIiBtc2dpZD0iNDYxNjc1ODg0MTE1NzgxNjY3NiI+IlNhaXNpZSBhdXRvIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfYXV0b2ZpbGwiIG1zZ2lkPSI3MTAzNDk1MDcwMTgwNTkwODE0Ij4iQ29uZi4gc2Fpc2llIGF1dG8iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciAoNjM1MDE0NTE1NDc3OTcwNjc3MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IiIG1zZ2lkPSI2MzUwMTQ1MTU0Nzc5NzA2NzcyIj4iICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9uYW1lX2Zvcm1hdCIgbXNnaWQ9IjMyNjgwNDEwNTQ4OTkyMTQ5NDUiPiIkMSQyJDMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfc2VwYXJhdG9yIiBtc2dpZD0iNzQ4MzMwNzg5MzE3MDMyNDEyOSI+IiwgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X2Zvcm1hdCIgbXNnaWQ9IjQ4NzQ0NTk0NTU3ODY4MjczNDQiPiIkMSQyJDMiPC9zdHJpbmc+CkBAIC04NzAsOCArODY1LDggQEAKICAgICA8c3RyaW5nIG5hbWU9ImRheXMiIG1zZ2lkPSI0Nzc0NTQ3NjYxMDIxMzQ0NjAyIj4iam91cnMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJob3VyIiBtc2dpZD0iMjEyNjc3MTkxNjQyNjE4OTQ4MSI+ImhldXJlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaG91cnMiIG1zZ2lkPSI4OTQ0MjQwMDUyNjY4NTI5OTMiPiJoZXVyZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtaW51dGUiIG1zZ2lkPSI5MTQ4ODc4NjU3NzAzNzY5ODY4Ij4ibW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtaW51dGVzIiBtc2dpZD0iNTY0NjAwMTAwNTgyNzAzNDUwOSI+Im1uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibWludXRlIiBtc2dpZD0iOTE0ODg3ODY1NzcwMzc2OTg2OCI+Im1pbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im1pbnV0ZXMiIG1zZ2lkPSI1NjQ2MDAxMDA1ODI3MDM0NTA5Ij4ibWluIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2Vjb25kIiBtc2dpZD0iMzE4NDIzNTgwODAyMTQ3OCI+InMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZWNvbmRzIiBtc2dpZD0iMzE2MTUxNTM0NzIxNjU4OTIzNSI+InMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3ZWVrIiBtc2dpZD0iNTYxNzk2MTUzNzE3MzA2MTU4MyI+InNlbWFpbmUiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAppbmRleCA1MzQzZTA0Li5mYmQzYTNkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKQEAgLTc2OSw3ICs3NjksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiJwcmlzdHVwIHBydcW+YXRlbGppbWEgc2FkcsW+YWphIGl6dmFuYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNDU0NDM0NjQ4NjY5Nzg1MzY4NSI+Ik9tb2d1xId1amUgdmxhc25pa3UgcHJpc3R1cCBwcnXFvmF0ZWxqaW1hIHNhZHLFvmFqYSBpeiBwcm9ncmFtc2tlIG92b2puaWNlLiBOZSBiaSB0cmViYWxvIGJpdGkgcG90cmVibm8gemEgbm9ybWFsbmUgYXBsaWthY2lqZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4ib2R2cmF0aXRpIGF1dG9tYXRza2EgYcW+dXJpcmFuamEgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191cGRhdGVMb2NrIiBtc2dpZD0iMTY1NTYyNTgzMjE2Njc3ODQ5MiI+Ik9tb2d1xId1amUgdmxhc25pa3UgZGF2YW5qZSBpbmZvcm1hY2lqYSBzdXN0YXZ1IG8gcG9nb2Rub20gdHJlbnV0a3UgemEgbmFkb2dyYWRuanUgdXJlxJFhamEgcHV0ZW0gcG9ub3Zub2cgcG9rcmV0YW5qYSBiZXogaW50ZXJha2NpamUuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJPbW9ndcSHdWplIHZsYXNuaWt1IGRhdmFuamUgaW5mb3JtYWNpamEgc3VzdGF2dSBvIHBvZ29kbm9tIHRyZW51dGt1IHphIG5hZG9ncmFkbmp1IHVyZcSRYWphIHBvbm92bmltIHBva3JldGFuamVtIGJleiBpbnRlcmFrY2lqZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLFvWVsaXRlIGxpIGRhIHByZWdsZWRuaWsgemFwYW10aSBvdnUgemFwb3JrdT8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJOZSBzYWRhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiJaYXBhbXRpIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggNjAzYTdiZS4uN2QwODA0OCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCkBAIC02OCw3ICs2OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJDTElSRGVmYXVsdE9mZk5leHRDYWxsT24iIG1zZ2lkPSI2MTc5NDI1MTgyODU2NDE4NDY1Ij4iTm9tb3IgcGVuZWxlcG9uIGJhd2FhbiB0aWRhayBkaWJhdGFzaS4gUGFuZ2dpbGFuIHNlbGFuanV0bnlhOiBEaWJhdGFzaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IkNMSVJEZWZhdWx0T2ZmTmV4dENhbGxPZmYiIG1zZ2lkPSIyNTY3OTk4NjMzMTI0NDA4NTUyIj4iTm9tb3IgcGVuZWxlcG9uIGJhd2FhbiB0aWRhayBkaWJhdGFzaS4gUGFuZ2dpbGFuIHNlbGFuanV0bnlhOiBUaWRhayBkaWJhdGFzaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlcnZpY2VOb3RQcm92aXNpb25lZCIgbXNnaWQ9Ijg2MTQ4MzAxODA1MDg2ODY2NjYiPiJMYXlhbmFuIHRpZGFrIGRpcGVybGVuZ2thcGkuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iQ0xJUlBlcm1hbmVudCIgbXNnaWQ9IjMzNzczNzExNDU5MjY4MzU2NzEiPiJBbmRhIHRpZGFrIGRhcGF0IG1lbmd1YmFoIHNldGVsYW4gbm9tb3IgcGVuZWxlcG9uLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IkNMSVJQZXJtYW5lbnQiIG1zZ2lkPSIzMzc3MzcxMTQ1OTI2ODM1NjcxIj4iQW5kYSB0aWRhayBkYXBhdCBtZW5ndWJhaCBwZW5nYXR1cmFuIG5vbW9yIHBlbmVsZXBvbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJSZXN0cmljdGVkQ2hhbmdlZFRpdGxlIiBtc2dpZD0iNTU5MjE4OTM5ODk1NjE4NzQ5OCI+IkFrc2VzIHRlcmJhdGFzIGJlcnViYWgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJSZXN0cmljdGVkT25EYXRhIiBtc2dpZD0iODY1Mzc5NDc4NDY5MDA2NTU0MCI+IkxheWFuYW4gZGF0YSBkaWNla2FsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IlJlc3RyaWN0ZWRPbkVtZXJnZW5jeSIgbXNnaWQ9IjY1ODExNjM3NzkwNzI4MzM2NjUiPiJMYXlhbmFuIGRhcnVyYXQgZGljZWthbC4iPC9zdHJpbmc+CkBAIC0xMjAsMTUgKzEyMCwxNSBAQAogICAgIDxzdHJpbmcgbmFtZT0iaHR0cEVycm9yVW5zdXBwb3J0ZWRTY2hlbWUiIG1zZ2lkPSI1MDE1NzMwODEyOTA2MTkyMjA4Ij4iUHJvdG9rb2wgdGlkYWsgZGlkdWt1bmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaHR0cEVycm9yRmFpbGVkU3NsSGFuZHNoYWtlIiBtc2dpZD0iOTY1NDk2MDYwMDA2NTg2NDEiPiJUaWRhayBkYXBhdCBtZW1idWF0IHNhbWJ1bmdhbiBhbWFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Imh0dHBFcnJvckJhZFVybCIgbXNnaWQ9IjM2MzY5Mjk3MjI3Mjg4ODE5NzIiPiJUaWRhayBkYXBhdCBtZW1idWthIGxhbWFuIGthcmVuYSBVUkwgdGlkYWsgdmFsaWQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iaHR0cEVycm9yRmlsZSIgbXNnaWQ9IjIxNzA3ODg1MTUwNTI1NTg2NzYiPiJUaWRhayBkYXBhdCBtZW5nYWtzZXMgYmVya2FzLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Imh0dHBFcnJvckZpbGVOb3RGb3VuZCIgbXNnaWQ9IjYyMDM4NTY2MTIwNDI2NTUwODQiPiJUaWRhayBkYXBhdCBtZW5lbXVrYW4gYmVya2FzIHlhbmcgZGltaW50YS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJodHRwRXJyb3JGaWxlIiBtc2dpZD0iMjE3MDc4ODUxNTA1MjU1ODY3NiI+IlRpZGFrIGRhcGF0IG1lbmdha3NlcyBmaWxlLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imh0dHBFcnJvckZpbGVOb3RGb3VuZCIgbXNnaWQ9IjYyMDM4NTY2MTIwNDI2NTUwODQiPiJUaWRhayBkYXBhdCBtZW5lbXVrYW4gZmlsZSB5YW5nIGRpbWludGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iaHR0cEVycm9yVG9vTWFueVJlcXVlc3RzIiBtc2dpZD0iMTIzNTM5NjkyNzA4NzE4ODI1MyI+IlRlcmxhbHUgYmFueWFrIHBlcm1pbnRhYW4geWFuZyBkaXByb3Nlcy4gQ29iYSBsYWdpIG5hbnRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9Ijg5Njc3MTAwMjUwMzYxNjM4MjIiPiJHYWxhdCBzYWF0IG1hc3VrIHVudHVrIDx4bGlmZjpnIGlkPSJBQ0NPVU5UIj4lMSRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNvbnRlbnRTZXJ2aWNlU3luYyIgbXNnaWQ9IjgzNTM1MjMwNjAyNjkzMzU2NjciPiJTaW5rcm9uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29udGVudFNlcnZpY2VTeW5jTm90aWZpY2F0aW9uVGl0bGUiIG1zZ2lkPSIzOTc3NDMzNDkxOTE5MDE0NTgiPiJTaW5rcm9uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY29udGVudFNlcnZpY2VUb29NYW55RGVsZXRlc05vdGlmaWNhdGlvbkRlc2MiIG1zZ2lkPSI4MTAwOTgxNDM1MDgwNjk2NDMxIj4iVGVybGFsdSBiYW55YWsgPHhsaWZmOmcgaWQ9IkNPTlRFTlRfVFlQRSI+JXM8L3hsaWZmOmc+IHBlbmdoYXB1c2FuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Imxvd19tZW1vcnkiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjY0OTQwMTkyMzQxMDIxNTQ4OTYiPiJQZW55aW1wYW5hbiB0YWJsZXQgcGVudWguIEhhcHVzIGJlYmVyYXBhIGJlcmthcyB1bnR1ayBtZW5nb3NvbmdrYW4gcnVhbmcuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG93X21lbW9yeSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM0NzU5OTkyODY2ODAwMDA1NDEiPiJQZW55aW1wYW5hbiBkaSBwb25zZWwgcGVudWguIEhhcHVzIHNlYmFnaWFuIGJlcmthcyB1bnR1ayBtZW5nb3NvbmdrYW4gcnVhbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG93X21lbW9yeSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iNjQ5NDAxOTIzNDEwMjE1NDg5NiI+IlBlbnlpbXBhbmFuIHRhYmxldCBwZW51aC4gSGFwdXMgYmViZXJhcGEgZmlsZSB1bnR1ayBtZW5nb3NvbmdrYW4gcnVhbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG93X21lbW9yeSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjM0NzU5OTkyODY2ODAwMDA1NDEiPiJQZW55aW1wYW5hbiBkaSBwb25zZWwgcGVudWguIEhhcHVzIHNlYmFnaWFuIGZpbGUgdW50dWsgbWVuZ29zb25na2FuIHJ1YW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im1lIiBtc2dpZD0iNjU0NTY5NjAwNzYzMTQwNDI5MiI+IlNheWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwb3dlcl9kaWFsb2ciIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9Ijg1NDUzNTE0MjA4NjUyMDI4NTMiPiJPcHNpIHRhYmxldCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBvd2VyX2RpYWxvZyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjEzMTk5MTkwNzU0NjM5ODg2MzgiPiJPcHNpIHRlbGVwb24iPC9zdHJpbmc+CkBAIC0yMTksNyArMjE5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NldFNjcmVlbkNvbXBhdGliaWxpdHkiIG1zZ2lkPSI2OTIwNDM2MTg2OTM5MTczNzQiPiJNZW11bmdraW5rYW4gYXBsIG1lbmdvbnRyb2wgbW9kZSBrb21wYXRpYmlsaXRhcyBsYXlhciBhcGxpa2FzaSBsYWluLiBBcGxpa2FzaSBiZXJiYWhheWEgZGFwYXQgbWVydXNhayBwZXJpbGFrdSBhcGxpa2FzaSBsYWluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0RGVidWdBcHAiIG1zZ2lkPSIzMDIyMTA3MTk4Njg2NTg0MDUyIj4ibWVuZ2FrdGlma2FuIGRlYnVnZ2luZyBhcGwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXREZWJ1Z0FwcCIgbXNnaWQ9IjQ0NzQ1MTI0MTYyOTkwMTMyNTYiPiJNZW5naXppbmthbiBhcGwgbWVuZ2FrdGlma2FuIGRlYnVnZ2luZyB1bnR1ayBhcGwgbGFpbi4gQXBsIGJlcmJhaGF5YSBkYXBhdCBtZW5nZ3VuYWthbiBjYXJhIGluaSB1bnR1ayBtZW51dHVwIGFwbCBsYWluLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29uZmlndXJhdGlvbiIgbXNnaWQ9IjgyMTQ0NzU3Nzk1MjEyMTgyOTUiPiJ1YmFoIHNldGVsYW4gVUkgQW5kYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29uZmlndXJhdGlvbiIgbXNnaWQ9IjgyMTQ0NzU3Nzk1MjEyMTgyOTUiPiJ1YmFoIHBlbmdhdHVyYW4gVUkgQW5kYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NoYW5nZUNvbmZpZ3VyYXRpb24iIG1zZ2lkPSI0MzcyMjIzODczMTU0Mjk2MDc2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIGtvbmZpZ3VyYXNpIHNhYXQgaW5pLCBtaXNhbG55YSBsb2thbCBhdGF1IHVrdXJhbiBmb24ga2VzZWx1cnVoYW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9lbmFibGVDYXJNb2RlIiBtc2dpZD0iNTY4NDUwNDA1ODE5MjkyMTA5OCI+ImFrdGlma2FuIG1vZGUgbW9iaWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19lbmFibGVDYXJNb2RlIiBtc2dpZD0iNDg1MzE4NzQyNTc1MTQxOTQ2NyI+Ik1lbmdpemlua2FuIGFwbCBtZW5nYWt0aWZrYW4gbW9kZSBtb2JpbC4iPC9zdHJpbmc+CkBAIC0yOTMsMjMgKzI5MywyMyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jbGVhckFwcFVzZXJEYXRhIiBtc2dpZD0iMjc0MTA5MTkxODQ1ODQyNzU2Ij4ibWVuZ2hhcHVzIGRhdGEgYXBsIGxhaW5ueWEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcFVzZXJEYXRhIiBtc2dpZD0iNDYyNTMyMzY4NDEyNTQ1OTQ4OCI+Ik1lbmdpemlua2FuIGFwbCBtZW5naGFwdXMgZGF0YSBwZW5nZ3VuYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RlbGV0ZUNhY2hlRmlsZXMiIG1zZ2lkPSIzMTI4NjY1NTcxODM3NDA4Njc1Ij4ibWVuZ2hhcHVzIHRlbWJvbG9rIGFwbCBsYWlubnlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZGVsZXRlQ2FjaGVGaWxlcyIgbXNnaWQ9IjM4MTI5OTg1OTkwMDY3MzAxOTYiPiJNZW5naXppbmthbiBhcGwgbWVuZ2hhcHVzIGJlcmthcyB0ZW1ib2xvay4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kZWxldGVDYWNoZUZpbGVzIiBtc2dpZD0iMzgxMjk5ODU5OTAwNjczMDE5NiI+Ik1lbmdpemlua2FuIGFwbCBtZW5naGFwdXMgZmlsZSB0ZW1ib2xvay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2dldFBhY2thZ2VTaXplIiBtc2dpZD0iNzQ3MjkyMTc2ODM1Nzk4MTk4NiI+Im1lbmd1a3VyIHJ1YW5nIHBlbnlpbXBhbmFuIGFwbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2dldFBhY2thZ2VTaXplIiBtc2dpZD0iMzkyMTA2ODE1NDQyMDczODI5NiI+Ik1lbmdpemlua2FuIGFwbCBtZW5nYW1iaWwga29kZSwgZGF0YSwgZGFuIHVrdXJhbiB0ZW1ib2xva255YSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfaW5zdGFsbFBhY2thZ2VzIiBtc2dpZD0iMjE5OTEyODQ4MjgyMDMwNjkyNCI+ImxhbmdzdW5nIG1lbWFzYW5nIGFwbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2luc3RhbGxQYWNrYWdlcyIgbXNnaWQ9IjU2Mjg1MzA5NzI1NDgwNzEyODQiPiJNZW5naXppbmthbiBhcGwgbWVtYXNhbmcgcGFrZXQgQW5kcm9pZCB5YW5nIGJhcnUgYXRhdSBkaXBlcmJhcnVpLiBBcGwgYmVyYmFoYXlhIGRhcGF0IG1lbmdndW5ha2FuIGluaSB1bnR1ayBtZW5hbWJhaGthbiBhcGwgYmFydSBkZW5nYW4gc2VtYmFyYW5nIGl6aW4geWFuZyBrdWF0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2xlYXJBcHBDYWNoZSIgbXNnaWQ9Ijc0ODcyNzkzOTE3MjM1MjY4MTUiPiJtZW5naGFwdXMgc2VtdWEgZGF0YSB0ZW1ib2xvayBhcGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jbGVhckFwcENhY2hlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIzNTIzMzk2Mjg0NDc0MDQyMjg0Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmdvc29uZ2thbiBwZW55aW1wYW5hbiB0YWJsZXQgZGVuZ2FuIG1lbmdoYXB1cyBiZXJrYXMgZGFsYW0gZGlyZWt0b3JpIHRlbWJvbG9rIGFwbC4gQWtzZXMgYmlhc2FueWEgc2FuZ2F0IHRlcmJhdGFzIGRhbiBoYW55YSBkaWJlcmlrYW4gYmFnaSBwcm9zZXMgc2lzdGVtLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDY3OTg4MzczMzY2MjkyMTg2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmdvc29uZ2thbiBwZW55aW1wYW5hbiBwb25zZWwgZGVuZ2FuIG1lbmdoYXB1cyBiZXJrYXMgZGFsYW0gZGlyZWt0b3JpIHRlbWJvbG9rIGFwbC4gQWtzZXMgYmlhc2FueWEgc2FuZ2F0IHRlcmJhdGFzIGRhbiBoYW55YSBkaWJlcmlrYW4gYmFnaSBwcm9zZXMgc2lzdGVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjM1MjMzOTYyODQ0NzQwNDIyODQiPiJNZW5naXppbmthbiBhcGwgbWVuZ29zb25na2FuIHBlbnlpbXBhbmFuIHRhYmxldCBkZW5nYW4gbWVuZ2hhcHVzIGZpbGUgZGFsYW0gZGlyZWt0b3JpIHRlbWJvbG9rIGFwbC4gQWtzZXMgYmlhc2FueWEgc2FuZ2F0IHRlcmJhdGFzIGRhbiBoYW55YSBkaWJlcmlrYW4gYmFnaSBwcm9zZXMgc2lzdGVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NsZWFyQXBwQ2FjaGUiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI1MDY3OTg4MzczMzY2MjkyMTg2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmdvc29uZ2thbiBwZW55aW1wYW5hbiBwb25zZWwgZGVuZ2FuIG1lbmdoYXB1cyBmaWxlIGRhbGFtIGRpcmVrdG9yaSB0ZW1ib2xvayBhcGwuIEFrc2VzIGJpYXNhbnlhIHNhbmdhdCB0ZXJiYXRhcyBkYW4gaGFueWEgZGliZXJpa2FuIGJhZ2kgcHJvc2VzIHNpc3RlbS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vdmVQYWNrYWdlIiBtc2dpZD0iMzI4OTg5MDI3MTY0NTkyMTQxMSI+Im1lbWluZGFoa2FuIHN1bWJlciBkYXlhIGFwbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdmVQYWNrYWdlIiBtc2dpZD0iMzE5NTYyMjE3Nzc4MjQ0NTI0Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbWluZGFoa2FuIHN1bWJlciBkYXlhIGFwbCBkYXJpIG1lZGlhIGludGVybmFsIGtlIGVrc3Rlcm5hbCBkYW4gc2ViYWxpa255YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRMb2dzIiBtc2dpZD0iNjYxNTc3ODU0MzE5ODk2NzYxNCI+ImJhY2EgZGF0YSBsb2cgc2Vuc2l0aWYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iODIwNjEzMTMyOTM0NTUxNTEiPiJNZW5naXppbmthbiBhcGwgbWVtYmFjYSBkYXJpIGJlcmJhZ2FpIGJlcmthcyBsb2cgc2lzdGVtLiBJemluIGluaSBtZW11bmdraW5rYW4gYXBsIG1lbmVtdWthbiBpbmZvcm1hc2kgdW11bSB0ZW50YW5nIGhhbC1oYWwgeWFuZyBBbmRhIGxha3VrYW4gZGVuZ2FuIHRhYmxldCwga2VtdW5na2luYW4gdGVybWFzdWsgaW5mb3JtYXNpIHByaWJhZGkuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyMDYzNDM4MTQwMjQxNTYwNDQzIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2EgZGFyaSBiZXJiYWdhaSBiZXJrYXMgbG9nIHNpc3RlbS4gSXppbiBpbmkgbWVtdW5na2lua2FuIGFwbCBtZW5lbXVrYW4gaW5mb3JtYXNpIHVtdW0gdGVudGFuZyBoYWwtaGFsIHlhbmcgQW5kYSBsYWt1a2FuIGRpIHBvbnNlbCwga2VtdW5na2luYW4gdGVybWFzdWsgaW5mb3JtYXNpIHByaWJhZGkuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZExvZ3MiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjgyMDYxMzEzMjkzNDU1MTUxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2EgZGFyaSBiZXJiYWdhaSBmaWxlIGxvZyBzaXN0ZW0uIEl6aW4gaW5pIG1lbXVuZ2tpbmthbiBhcGwgbWVuZW11a2FuIGluZm9ybWFzaSB1bXVtIHRlbnRhbmcgaGFsLWhhbCB5YW5nIEFuZGEgbGFrdWthbiBkZW5nYW4gdGFibGV0LCBrZW11bmdraW5hbiB0ZXJtYXN1ayBpbmZvcm1hc2kgcHJpYmFkaS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkTG9ncyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjIwNjM0MzgxNDAyNDE1NjA0NDMiPiJNZW5naXppbmthbiBhcGwgbWVtYmFjYSBkYXJpIGJlcmJhZ2FpIGZpbGUgbG9nIHNpc3RlbS4gSXppbiBpbmkgbWVtdW5na2lua2FuIGFwbCBtZW5lbXVrYW4gaW5mb3JtYXNpIHVtdW0gdGVudGFuZyBoYWwtaGFsIHlhbmcgQW5kYSBsYWt1a2FuIGRpIHBvbnNlbCwga2VtdW5na2luYW4gdGVybWFzdWsgaW5mb3JtYXNpIHByaWJhZGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hbnlDb2RlY0ZvclBsYXliYWNrIiBtc2dpZD0iNzE1ODA1NTU1ODIzODgxODE4Ij4ibWVuZ2d1bmFrYW4gbWVkaWEgcGVuZ2F3YXNhbmRpIGFwYSBwdW4gdW50dWsgcGVtdXRhcmFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYW55Q29kZWNGb3JQbGF5YmFjayIgbXNnaWQ9IjgyODM5MTI0ODg0MzMxODkwMTAiPiJNZW5naXppbmthbiBhcGwgbWVuZ2d1bmFrYW4gcGVuZ2F3YXNhbmRpIG1lZGlhIGFwYSBwdW4geWFuZyB0ZXJwYXNhbmcgZ3VuYSBtZW5nYXdhc2FuZGlrYW4gbWVkaWEgdW50dWsgZGlwdXRhci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2RpYWdub3N0aWMiIG1zZ2lkPSI4MDc2NzQzOTUzOTA4MDAwMzQyIj4iYmFjYS90dWxpcyBrZSBzdW1iZXIgZGF5YSB5YW5nIGRpbWlsaWtpIG9sZWggZGlhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2RpYWdub3N0aWMiIG1zZ2lkPSI2NjA4Mjk1NjkyMDAyNDUyMjgzIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2EgZGFuIG1lbnVsaXMga2Ugc3VtYmVyIGRheWEgYXBhIHB1biB5YW5nIGRpbWlsaWtpIG9sZWggZ3J1cCBkaWFnOyBtaXNhbG55YSwgYmVya2FzIGRhbGFtIC9kZXYuIEl6aW4gaW5pIGJlcnBvdGVuc2kgbWVtcGVuZ2FydWhpIGtlc3RhYmlsYW4gZGFuIGtlYW1hbmFuIHNpc3RlbS4gU2ViYWlrbnlhIGluaSBIQU5ZQSBkaWd1bmFrYW4gdW50dWsgZGlhZ25vc3RpayBraHVzdXMgcGVyYW5na2F0IGtlcmFzIG9sZWggcGFicmlrYW4gYXRhdSBvcGVyYXRvci4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaWFnbm9zdGljIiBtc2dpZD0iNjYwODI5NTY5MjAwMjQ1MjI4MyI+Ik1lbmdpemlua2FuIGFwbCBtZW1iYWNhIGRhbiBtZW51bGlzIGtlIHN1bWJlciBkYXlhIGFwYSBwdW4geWFuZyBkaW1pbGlraSBvbGVoIGdydXAgZGlhZzsgbWlzYWxueWEsIGZpbGUgZGFsYW0gL2Rldi4gSXppbiBpbmkgYmVycG90ZW5zaSBtZW1wZW5nYXJ1aGkga2VzdGFiaWxhbiBkYW4ga2VhbWFuYW4gc2lzdGVtLiBTZWJhaWtueWEgaW5pIEhBTllBIGRpZ3VuYWthbiB1bnR1ayBkaWFnbm9zdGlrIGtodXN1cyBwZXJhbmdrYXQga2VyYXMgb2xlaCBwYWJyaWthbiBhdGF1IG9wZXJhdG9yLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2hhbmdlQ29tcG9uZW50U3RhdGUiIG1zZ2lkPSI2MzM1NTc2Nzc1NzExMDk1OTMxIj4ibWVuZ2FrdGlma2FuIGF0YXUgbWVub25ha3RpZmthbiBrb21wb25lbiBhcGwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VDb21wb25lbnRTdGF0ZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iODg4NzQzNTc0MDk4MjIzNzI5NCI+Ik1lbmdpemlua2FuIGFwbCBtZW5ndWJhaCBhcGFrYWgga29tcG9uZW4gYXBsIGxhaW4gZGlha3RpZmthbiBhdGF1IHRpZGFrLiBBcGwgYmVyYmFoYXlhIGRhcGF0IG1lbmdndW5ha2FuIGluaSB1bnR1ayBtZW5vbmFrdGlma2FuIGtlbWFtcHVhbiB0YWJsZXQgeWFuZyBwZW50aW5nLiBJemluIGluaSBoYXJ1cyBkaWd1bmFrYW4gZGVuZ2FuIGhhdGktaGF0aSBrYXJlbmEgZGFwYXQgbWVuamFkaWthbiBrb21wb25lbiBhcGwgdGlkYWsgZGFwYXQgZGlndW5ha2FuLCB0aWRhayBrb25zaXN0ZW4sIGF0YXUgdGlkYWsgc3RhYmlsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NoYW5nZUNvbXBvbmVudFN0YXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMTgyNzIzMjQ4NDQxNjUwNTYxNSI+Ik1lbmdpemlua2FuIGFwbCBtZW5ndWJhaCBhcGFrYWgga29tcG9uZW4gYXBsIGxhaW4gZGlha3RpZmthbiBhdGF1IHRpZGFrLiBBcGwgYmVyYmFoYXlhIGRhcGF0IG1lbmdndW5ha2FuIGl6aW4gaW5pIHVudHVrIG1lbm9uYWt0aWZrYW4ga2VtYW1wdWFuIHBvbnNlbCB5YW5nIHBlbnRpbmcuIEl6aW4gaW5pIGhhcnVzIGRpZ3VuYWthbiBkZW5nYW4gaGF0aS1oYXRpLCBrYXJlbmEgbXVuZ2tpbiBzYWphIG1lbmphZGlrYW4ga29tcG9uZW4gYXBsIHRpZGFrIGRhcGF0IGRpZ3VuYWthbiwgdGlkYWsga29uc2lzdGVuLCBhdGF1IHRpZGFrIHN0YWJpbC4iPC9zdHJpbmc+CkBAIC0zMTcsMTAgKzMxNywxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfZ3JhbnRSZXZva2VQZXJtaXNzaW9ucyIgbXNnaWQ9IjQwODg2NDI2NTQwODU4NTA2NjIiPiJNZW11bmdraW5rYW4gYXBsaWthc2kgbWVtYmVyaWthbiBhdGF1IG1lbmNhYnV0IGl6aW4ga2h1c3VzIHVudHVrIGFwbGlrYXNpIHRlcnNlYnV0IGF0YXUgYXBsaWthc2kgbGFpbm55YS4gQXBsaWthc2kgYmVyYmFoYXlhIGRhcGF0IG1lbmdndW5ha2FubnlhIHVudHVrIG1lbmdha3NlcyBmaXR1ciB5YW5nIHRpZGFrIEFuZGEgYmVyaSBpemluLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0UHJlZmVycmVkQXBwbGljYXRpb25zIiBtc2dpZD0iODQ2MzE4MTYyODY5NTM5NjM5MSI+Im1lbnlldGVsIGFwbCB5YW5nIGRpc3VrYWkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRQcmVmZXJyZWRBcHBsaWNhdGlvbnMiIG1zZ2lkPSI0OTczOTg2NzYyMjQxNzgzNzEyIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBhcGwgcGlsaWhhbiBBbmRhLiBBcGwgYmVyYmFoYXlhIGRhcGF0IGRpYW0tZGlhbSBtZW5ndWJhaCBhcGwgeWFuZyBiZXJqYWxhbiwgbWVuaXB1IGFwbCB5YW5nIGFkYSB1bnR1ayBtZW5ndW1wdWxrYW4gZGF0YSBwcmliYWRpIGRhcmkgQW5kYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlU2V0dGluZ3MiIG1zZ2lkPSIxMzY1NTIzNDk3Mzk1MTQzNzA0Ij4idWJhaCBzZXRlbGFuIHNpc3RlbSBnbG9iYWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZVNldHRpbmdzIiBtc2dpZD0iNzc3NTcyMzQ0MTU1ODkwNzE4MSI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgZGF0YSBzZXRlbGFuIHNpc3RlbS4gQXBsIGJlcmJhaGF5YSBkYXBhdCBtZXJ1c2FrIGtvbmZpZ3VyYXNpIHNpc3RlbSBhbmRhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVTZWN1cmVTZXR0aW5ncyIgbXNnaWQ9IjIwNDY3NjI1MTg3NjcxODI4OCI+InViYWggc2V0ZWxhbiBzaXN0ZW0gYW1hbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlU2VjdXJlU2V0dGluZ3MiIG1zZ2lkPSI4MTU5NTM1NjEzMDIwMTM3MzkxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBkYXRhIHNldGVsYW4gYW1hbiBzaXN0ZW0uIFRpZGFrIHVudHVrIGRpZ3VuYWthbiBvbGVoIGFwbCBub3JtYWwuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVNldHRpbmdzIiBtc2dpZD0iMTM2NTUyMzQ5NzM5NTE0MzcwNCI+InViYWggcGVuZ2F0dXJhbiBzaXN0ZW0gZ2xvYmFsIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVTZXR0aW5ncyIgbXNnaWQ9Ijc3NzU3MjM0NDE1NTg5MDcxODEiPiJNZW5naXppbmthbiBhcGwgbWVtb2RpZmlrYXNpIGRhdGEgcGVuZ2F0dXJhbiBzaXN0ZW0uIEFwbCBiZXJiYWhheWEgZGFwYXQgbWVydXNhayBrb25maWd1cmFzaSBzaXN0ZW0gYW5kYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlU2VjdXJlU2V0dGluZ3MiIG1zZ2lkPSIyMDQ2NzYyNTE4NzY3MTgyODgiPiJ1YmFoIHBlbmdhdHVyYW4gc2lzdGVtIGFtYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZVNlY3VyZVNldHRpbmdzIiBtc2dpZD0iODE1OTUzNTYxMzAyMDEzNzM5MSI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgZGF0YSBwZW5nYXR1cmFuIGFtYW4gc2lzdGVtLiBUaWRhayB1bnR1ayBkaWd1bmFrYW4gb2xlaCBhcGwgbm9ybWFsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVHc2VydmljZXMiIG1zZ2lkPSIyMTQ5NDI2NjY0MjI2MTUyMTg1Ij4idWJhaCBwZXRhIGxheWFuYW4gR29vZ2xlIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVHc2VydmljZXMiIG1zZ2lkPSIxMjg3MzA5NDM3NjM4MzgwMjI5Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBwZXRhIGxheWFuYW4gR29vZ2xlLiBUaWRhayB1bnR1ayBkaWd1bmFrYW4gb2xlaCBhcGwgbm9ybWFsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVjZWl2ZUJvb3RDb21wbGV0ZWQiIG1zZ2lkPSI3Nzc2Nzc5ODQyODY2OTkzMzc3Ij4ibXVsYWkgc2VjYXJhIG90b21hdGlzIHBhZGEgc2FhdCBib290Ijwvc3RyaW5nPgpAQCAtMzY0LDggKzM2NCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NTdXJmYWNlRmxpbmdlciIgbXNnaWQ9IjEwNDE2MTk1MTY3MzMyOTM1NTEiPiJNZW5naXppbmthbiBhcGwgbWVuZ2d1bmFrYW4gZml0dXIgdGluZ2thdCByZW5kYWggU3VyZmFjZUZsaW5nZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkRnJhbWVCdWZmZXIiIG1zZ2lkPSI2NjkwNTA0MjQ4MTc4NDk4MTM2Ij4iYmFjYSBidWZmZXIgZnJhbWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkRnJhbWVCdWZmZXIiIG1zZ2lkPSI0OTM3NDA1NTIxODA5NDU0NjgwIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2Ega29udGVuIHBlbnlhbmdnYSBmcmFtZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX21vZGlmeUF1ZGlvU2V0dGluZ3MiIG1zZ2lkPSI2MDk1ODU5OTM3MDY5MTQ2MDg2Ij4idWJhaCBzZXRlbGFuIGF1ZGlvIEFuZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb2RpZnlBdWRpb1NldHRpbmdzIiBtc2dpZD0iNzM0Mzk1MTE4NTQwODM5NjkxOSI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgc2V0ZWxhbiBhdWRpbyBnbG9iYWwsIG1pc2FsbnlhIHZvbHVtZSBkYW4gcGVydXRlYW4uIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb2RpZnlBdWRpb1NldHRpbmdzIiBtc2dpZD0iNjA5NTg1OTkzNzA2OTE0NjA4NiI+InViYWggcGVuZ2F0dXJhbiBhdWRpbyBBbmRhIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbW9kaWZ5QXVkaW9TZXR0aW5ncyIgbXNnaWQ9IjczNDM5NTExODU0MDgzOTY5MTkiPiJNZW5naXppbmthbiBhcGwgbWVtb2RpZmlrYXNpIHBlbmdhdHVyYW4gYXVkaW8gZ2xvYmFsLCBtaXNhbG55YSB2b2x1bWUgZGFuIHBlcnV0ZWFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVjb3JkQXVkaW8iIG1zZ2lkPSIzODc2MDQ5NzcxNDI3NDY2MzIzIj4icmVrYW0gYXVkaW8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWNvcmRBdWRpbyIgbXNnaWQ9IjIzODc0NjIyMzM5NzYyNDg2MzUiPiJNZW5naXppbmthbiBhcGwgbWVuZ2Frc2VzIGphbHVyIHJla2FtYW4gYXVkaW8uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jYW1lcmEiIG1zZ2lkPSIzNjE2MzkxOTE5NTU5NzUxMTkyIj4iYW1iaWwgZ2FtYmFyIGRhbiB2aWRlbyI8L3N0cmluZz4KQEAgLTM3OSw3ICszNzksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVib290IiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI4MTcyMDU2MTgwMDYzNzAwNzQxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbWFrc2EgdGFibGV0IG1lbGFrdWthbiByZWJvb3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVib290IiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNTMyNjAwODEyNDI4OTk4OTk2OSI+Ik1lbmdpemlua2FuIGFwbCBtZW1ha3NhIHBvbnNlbCBtZWxha3VrYW4gcmVib290LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfbW91bnRfdW5tb3VudF9maWxlc3lzdGVtcyIgbXNnaWQ9IjE3NjEwMjMyNzIxNzA5NTY1NDEiPiJwYXNhbmcgZGFuIGxlcGFzIGZpbGVzeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3VudF91bm1vdW50X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iMTgyOTI5MDcwMTY1ODk5MjM0NyI+Ik1lbmdpemlua2FuIGFwbCBtZW1hc2FuZyBkYW4gbWVsZXBhcyBzaXN0ZW0gYmVya2FzIHVudHVrIHBlbnlpbXBhbmFuIHlhbmcgZGFwYXQgZGljb3BvdC4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19tb3VudF91bm1vdW50X2ZpbGVzeXN0ZW1zIiBtc2dpZD0iMTgyOTI5MDcwMTY1ODk5MjM0NyI+Ik1lbmdpemlua2FuIGFwbCBtZW1hc2FuZyBkYW4gbWVsZXBhcyBzaXN0ZW0gZmlsZSB1bnR1ayBwZW55aW1wYW5hbiB5YW5nIGRhcGF0IGRpY29wb3QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tb3VudF9mb3JtYXRfZmlsZXN5c3RlbXMiIG1zZ2lkPSI1NTIzMjg1MTQzNTc2NzE4OTgxIj4iZm9ybWF0IHBlbnlpbXBhbmFuIGVrc3Rlcm5hbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21vdW50X2Zvcm1hdF9maWxlc3lzdGVtcyIgbXNnaWQ9Ijg3ODQyNjgyNDY3NzkxOTg2MjciPiJNZW5naXppbmthbiBhcGwgbWVtZm9ybWF0IHBlbnlpbXBhbmFuIHlhbmcgZGFwYXQgZGljb3BvdC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FzZWNfYWNjZXNzIiBtc2dpZD0iMzQxMTMzODYzMjAwMjE5Mzg0NiI+ImRhcGF0a2FuIGluZm9ybWFzaSBwYWRhIHBlbnlpbXBhbmFuIGludGVybmFsIjwvc3RyaW5nPgpAQCAtNDM0LDggKzQzNCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRXYWxscGFwZXIiIG1zZ2lkPSI3MzczNDQ3OTIwOTc3NjI0NzQ1Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbnlldGVsIHdhbGxwYXBlciBzaXN0ZW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRXYWxscGFwZXJIaW50cyIgbXNnaWQ9IjM2MDA3MjEwNjkzNTMxMDY4NTEiPiJhdHVyIHBldHVuanVrIHVrdXJhbiB3YWxscGFwZXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRXYWxscGFwZXJIaW50cyIgbXNnaWQ9IjgyMzU3ODQzODQyMjM3MzAwOTEiPiJNZW5naXppbmthbiBhcGwgbWVueWV0ZWwgcGV0dW5qdWsgdWt1cmFuIHdhbGxwYXBlciBzaXN0ZW0uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tYXN0ZXJDbGVhciIgbXNnaWQ9IjIzMTU3NTA0MjMxMzk2OTczOTciPiJzZXRlbCB1bGFuZyBzaXN0ZW0ga2Ugc2V0ZWxhbiBiYXdhYW4gcGFicmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbWFzdGVyQ2xlYXIiIG1zZ2lkPSIzNjY1MzgwNDkyNjMzOTEwMjI2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbnlldGVsIHVsYW5nIHNpc3RlbSBrZSBzZXRlbGFuIHBhYnJpayBzZXBlbnVobnlhLCBtZW5naGFwdXMgc2VtdWEgZGF0YSwga29uZmlndXJhc2ksIGRhbiBhcGwgeWFuZyB0ZXJwYXNhbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tYXN0ZXJDbGVhciIgbXNnaWQ9IjIzMTU3NTA0MjMxMzk2OTczOTciPiJzZXRlbCB1bGFuZyBzaXN0ZW0ga2UgcGVuZ2F0dXJhbiBiYXdhYW4gcGFicmlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfbWFzdGVyQ2xlYXIiIG1zZ2lkPSIzNjY1MzgwNDkyNjMzOTEwMjI2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbnlldGVsIHVsYW5nIHNpc3RlbSBrZSBwZW5nYXR1cmFuIHBhYnJpayBzZXBlbnVobnlhLCBtZW5naGFwdXMgc2VtdWEgZGF0YSwga29uZmlndXJhc2ksIGRhbiBhcGwgeWFuZyB0ZXJwYXNhbmcuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zZXRUaW1lIiBtc2dpZD0iMjAyMTYxNDgyOTU5MTc3NTY0NiI+ImF0dXIgd2FrdHUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRUaW1lIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIxODk2MzQxNDM4MTUxMTUyODgxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIHdha3R1IHBhZGEgamFtIHRhYmxldC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXRUaW1lIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMTg1NTcwMjczMDczODAyMCI+Ik1lbmdpemlua2FuIGFwbCBtZW5ndWJhaCB3YWt0dSBwYWRhIGphbSBwb25zZWwuIjwvc3RyaW5nPgpAQCAtNDU3LDE0ICs0NTcsMTQgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FjY2Vzc05ldHdvcmtTdGF0ZSIgbXNnaWQ9IjQ3OTc3Mjc5Njk1MjU0NzE5OCI+Ik1lbmdpemlua2FuIGFwbCBtZWxpaGF0IGtlYWRhYW4gc2VtdWEgamFyaW5nYW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jcmVhdGVOZXR3b3JrU29ja2V0cyIgbXNnaWQ9IjkxMjE2MzM2ODAzNDk1NDk1ODUiPiJha3NlcyBpbnRlcm5ldCBwZW51aCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NyZWF0ZU5ldHdvcmtTb2NrZXRzIiBtc2dpZD0iNTk2MzkyMjI5NzQ0NDI2NTk1MCI+Ik1lbmdpemlua2FuIGFwbCBtZW1idWF0IHNva2V0IGphcmluZ2FuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVBcG5TZXR0aW5ncyIgbXNnaWQ9IjUwNTY2MDE1OTY3NTc1MTg5NiI+Im1lbmd1YmFoL21lbmNlZ2F0IGxhbHUgbGludGFzIGRhbiBzZXRlbGFuIGphcmluZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVBcG5TZXR0aW5ncyIgbXNnaWQ9IjUzMzM3OTg4ODY0MTI3MTQxOTMiPiJNZW5naXppbmthbiBhcGwgbWVuZ3ViYWggc2V0ZWxhbiBqYXJpbmdhbiBkYW4gbWVuY2VnYXQgc2VydGEgbWVtZXJpa3NhIHNlbXVhIGxhbHUgbGludGFzIGphcmluZ2FuLCBtaXNhbG55YSBtZW5ndWJhaCBwcm94eSBkYW4gcG9ydCBBUE4gYXBhIHNhamEuIEFwbCBiZXJiYWhheWEgZGFwYXQgbWVtYW50YXUsIG1lbmdhbGloa2FuLCBhdGF1IG1lbmd1YmFoIHBha2V0IGphcmluZ2FuIHRhbnBhIHNlcGVuZ2V0YWh1YW4gQW5kYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlQXBuU2V0dGluZ3MiIG1zZ2lkPSI1MDU2NjAxNTk2NzU3NTE4OTYiPiJtZW5ndWJhaC9tZW5jZWdhdCBsYWx1IGxpbnRhcyBkYW4gcGVuZ2F0dXJhbiBqYXJpbmdhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlQXBuU2V0dGluZ3MiIG1zZ2lkPSI1MzMzNzk4ODg2NDEyNzE0MTkzIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIHBlbmdhdHVyYW4gamFyaW5nYW4gZGFuIG1lbmNlZ2F0IHNlcnRhIG1lbWVyaWtzYSBzZW11YSBsYWx1IGxpbnRhcyBqYXJpbmdhbiwgbWlzYWxueWEgbWVuZ3ViYWggcHJveHkgZGFuIHBvcnQgQVBOIGFwYSBzYWphLiBBcGwgYmVyYmFoYXlhIGRhcGF0IG1lbWFudGF1LCBtZW5nYWxpaGthbiwgYXRhdSBtZW5ndWJhaCBwYWtldCBqYXJpbmdhbiB0YW5wYSBzZXBlbmdldGFodWFuIEFuZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VOZXR3b3JrU3RhdGUiIG1zZ2lkPSI5NTg4ODQyOTE0NTQzMjczMDkiPiJ1YmFoIGtvbmVrdGl2aXRhcyBqYXJpbmdhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NoYW5nZU5ldHdvcmtTdGF0ZSIgbXNnaWQ9IjY3ODkxMjM5MTI0NzY0MTYyMTQiPiJNZW5naXppbmthbiBhcGwgbWVuZ3ViYWgga2VhZGFhbiBrb25la3Rpdml0YXMgamFyaW5nYW4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VUZXRoZXJTdGF0ZSIgbXNnaWQ9IjU5NTI1ODQ5NjQzNzMwMTc5NjAiPiJtZW5ndWJhaCBrb25la3Rpdml0YXMgeWFuZyB0ZXJ0YW1iYXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VUZXRoZXJTdGF0ZSIgbXNnaWQ9IjE1MjQ0NDEzNDQ0MTIzMTk3ODAiPiJNZW5naXppbmthbiBhcGwgbWVuZ3ViYWggc3RhdHVzIGtvbmVrdGl2aXRhcyBqYXJpbmdhbiB5YW5nIHRlcnRhbWJhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZUJhY2tncm91bmREYXRhU2V0dGluZyIgbXNnaWQ9IjE0MDA2NjYwMTI2NzE2NDg3NDEiPiJtZW5ndWJhaCBzZXRlbGFuIHBlbmdndW5hYW4gZGF0YSBsYXRhciBiZWxha2FuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NoYW5nZUJhY2tncm91bmREYXRhU2V0dGluZyIgbXNnaWQ9IjUzNDc3Mjk1Nzg0Njg3NDQzNzkiPiJNZW5naXppbmthbiBhcGwgbWVuZ3ViYWggc2V0ZWxhbiBwZW5nZ3VuYWFuIGRhdGEgbGF0YXIgYmVsYWthbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9jaGFuZ2VCYWNrZ3JvdW5kRGF0YVNldHRpbmciIG1zZ2lkPSIxNDAwNjY2MDEyNjcxNjQ4NzQxIj4ibWVuZ3ViYWggcGVuZ2F0dXJhbiBwZW5nZ3VuYWFuIGRhdGEgbGF0YXIgYmVsYWthbmciPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jaGFuZ2VCYWNrZ3JvdW5kRGF0YVNldHRpbmciIG1zZ2lkPSI1MzQ3NzI5NTc4NDY4NzQ0Mzc5Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbmd1YmFoIHBlbmdhdHVyYW4gcGVuZ2d1bmFhbiBkYXRhIGxhdGFyIGJlbGFrYW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzV2lmaVN0YXRlIiBtc2dpZD0iODEwMDkyNjY1MDIxMTAzNDQwMCI+ImxpaGF0IGtvbmRpc2kgV2ktRmkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NXaWZpU3RhdGUiIG1zZ2lkPSI3NzcwNDUyNjU4MjI2MjU2ODMxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbGloYXQgaW5mb3JtYXNpIHRlbnRhbmcga2VhZGFhbiBXaS1GaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2NoYW5nZVdpZmlTdGF0ZSIgbXNnaWQ9IjcyODA2MzI3MTEwNTcxMTIxMzciPiJ1YmFoIHN0YXR1cyBXaS1GaSI8L3N0cmluZz4KQEAgLTQ4NSwxMCArNDg1LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19uZmMiIG1zZ2lkPSI3MTIwNjExODE5NDAxNzg5OTA3Ij4iTWVuZ2l6aW5rYW4gYXBsIGJlcmtvbXVuaWthc2kgZGVuZ2FuIHRhZywga2FydHUsIGRhbiBhbGF0IHBlbWJhY2EgS29tdW5pa2FzaSBOaXJrYWJlbCBKYXJhayBEZWthdCAoTkZDKS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2Rpc2FibGVLZXlndWFyZCIgbXNnaWQ9IjQ5Nzc0MDYxNjQzMTE1MzUwOTIiPiJub25ha3RpZmthbiBrdW5jaSB0b21ib2wiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19kaXNhYmxlS2V5Z3VhcmQiIG1zZ2lkPSI2MjMxNjExMjg2ODkyMjMyNjI2Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbm9uYWt0aWZrYW4ga3VuY2kgdG9tYm9sIGRhbiBzZWdhbGEga2VhbWFuYW4gc2FuZGkgeWFuZyB0ZXJrYWl0LiBDb250b2ggbnlhdGEgZGFyaSBoYWwgaW5pIGFkYWxhaCBwb25zZWwgbWVub25ha3RpZmthbiBrdW5jaSB0b21ib2wgc2FhdCBtZW5lcmltYSBwYW5nZ2lsYW4gdGVsZXBvbiBtYXN1aywga2VtdWRpYW4gbWVuZ2FrdGlma2FuIGtlbWJhbGkga3VuY2kgdG9tYm9sIGtldGlrYSBwYW5nZ2lsYW4gc2VsZXNhaS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI2MjAxODEwMDA4MjMwNTAzMDUyIj4iYmFjYSBzZXRlbGFuIHNpbmtyb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkU3luY1NldHRpbmdzIiBtc2dpZD0iNTQ2NDA1Njc4NTI3NDIyOTI3OCI+Ik1lbmdpemlua2FuIGFwbCBtZW1iYWNhIHNldGVsYW4gc2lua3JvbmlzYXNpLCBtaXNhbG55YSBhcGFrYWggc2lua3JvbmlzYXNpIHVudHVrIGFwbCBPcmFuZyBkaWFrdGlma2FuIGF0YXUgdGlkYWsuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZVN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyOTcxMzg1NjY0NDI0ODY0NjIiPiJ0dWxpc2thbiBzZXRlbGFuIHNpbmtyb25pc2FzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlU3luY1NldHRpbmdzIiBtc2dpZD0iMTQ2NjA1NjU2NDUwMjExNzEzMCI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgc2V0ZWxhbiBzaW5rcm9uaXNhc2ksIHNlcGVydGkgYXBha2FoIHNpbmtyb25pc2FzaSB1bnR1ayBhcGwgT3JhbmcgZGlha3RpZmthbiBhdGF1IHRpZGFrLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZFN5bmNTZXR0aW5ncyIgbXNnaWQ9IjYyMDE4MTAwMDgyMzA1MDMwNTIiPiJiYWNhIHBlbmdhdHVyYW4gc2lua3JvbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3JlYWRTeW5jU2V0dGluZ3MiIG1zZ2lkPSI1NDY0MDU2Nzg1Mjc0MjI5Mjc4Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2EgcGVuZ2F0dXJhbiBzaW5rcm9uaXNhc2ksIG1pc2FsbnlhIGFwYWthaCBzaW5rcm9uaXNhc2kgdW50dWsgYXBsIE9yYW5nIGRpYWt0aWZrYW4gYXRhdSB0aWRhay4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlU3luY1NldHRpbmdzIiBtc2dpZD0iNjI5NzEzODU2NjQ0MjQ4NjQ2MiI+InR1bGlza2FuIHBlbmdhdHVyYW4gc2lua3JvbmlzYXNpIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVTeW5jU2V0dGluZ3MiIG1zZ2lkPSIxNDY2MDU2NTY0NTAyMTE3MTMwIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBwZW5nYXR1cmFuIHNpbmtyb25pc2FzaSwgc2VwZXJ0aSBhcGFrYWggc2lua3JvbmlzYXNpIHVudHVrIGFwbCBPcmFuZyBkaWFrdGlma2FuIGF0YXUgdGlkYWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9yZWFkU3luY1N0YXRzIiBtc2dpZD0iNzM5NjU3NzQ1MTM2MDIwMjQ0OCI+InN0YXRpc3Rpa2EgYmFjYSBzaW5rcm9uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZFN5bmNTdGF0cyIgbXNnaWQ9IjM4MDE5NzE4Mzk5Mzk5NTE2NzgiPiJNZW5naXppbmthbiBhcGwgbWVtYmFjYSBzdGF0aXN0aWsgc2lua3JvbmlzYXNpOyBtaXMuLCByaXdheWF0IHNpbmtyb25pc2FzaSB5YW5nIHRlbGFoIHRlcmphZGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9zdWJzY3JpYmVkRmVlZHNSZWFkIiBtc2dpZD0iNDc1NjYwOTYzNzA1MzM1MzMxOCI+ImJhY2EgdW1wYW4gbGFuZ2dhbmFuIjwvc3RyaW5nPgpAQCAtNTA1LDggKzUwNSw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZGNhcmRXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjQzMzc0MTc3OTA5MzY2MzIwOTAiPiJNZW11bmdraW5rYW4gYXBsIG1lbnVsaXMga2Uga2FydHUgU0QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9tZWRpYVN0b3JhZ2VXcml0ZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY4NTk4MzkxOTk3MDY4NzkwMTUiPiJ1YmFoL2hhcHVzIGtvbnRlbiBwZW55aW1wYW5hbiBtZWRpYSBpbnRlcm5hbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX21lZGlhU3RvcmFnZVdyaXRlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODE4OTE2MDU5NzY5ODUyOTE4NSI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kga29udGVuIHBlbnlpbXBhbmFuIG1lZGlhIGludGVybmFsLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJha3NlcyBzaXN0ZW0gYmVya2FzIHRlbWJvbG9rLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2NhY2hlX2ZpbGVzeXN0ZW0iIG1zZ2lkPSI1NTc4OTY3NjQyMjY1NTUwOTU1Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2EgZGFuIG1lbnVsaXMgcGFkYSBzaXN0ZW0gYmVya2FzIHRlbWJvbG9rLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfY2FjaGVfZmlsZXN5c3RlbSIgbXNnaWQ9IjU2NTY0ODcyNjQ4MTk2Njk4MjQiPiJha3NlcyBzaXN0ZW0gZmlsZSB0ZW1ib2xvay4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19jYWNoZV9maWxlc3lzdGVtIiBtc2dpZD0iNTU3ODk2NzY0MjI2NTU1MDk1NSI+Ik1lbmdpemlua2FuIGFwbCBtZW1iYWNhIGRhbiBtZW51bGlzIHBhZGEgc2lzdGVtIGZpbGUgdGVtYm9sb2suIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91c2Vfc2lwIiBtc2dpZD0iNTk4Njk1MjM2Mjc5NTg3MDUwMiI+Imxha3VrYW4vL3RlcmltYSBwYW5nZ2lsYW4gaW50ZXJuZXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191c2Vfc2lwIiBtc2dpZD0iNDcxNzYzMjAwMDA2MjY3NDI5NCI+Ik1lbmdpemlua2FuIGFwbCBtZW5nZ3VuYWthbiBsYXlhbmFuIFNJUCB1bnR1ayBtZWxha3VrYW4vbWVuZXJpbWEgcGFuZ2dpbGFuIGludGVybmV0LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZE5ldHdvcmtVc2FnZUhpc3RvcnkiIG1zZ2lkPSI3ODYyNTkzMjgzNjExNDkzMjMyIj4iYmFjYSByaXdheWF0IHBlbmdndW5hYW4gamFyaW5nYW4iPC9zdHJpbmc+CkBAIC02OTUsMTAgKzY5NSwxMCBAQAogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfcGluX2F0dGVtcHRzX2RpYWxvZ19tZXNzYWdlIiBtc2dpZD0iNjIxNjY3MjcwNjU0NTY5Njk1NSI+IkFuZGEgdGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaSBzYWxhaCBtZW5nZXRpayBQSU4uICJcblxuIkNvYmEgbGFnaSBkYWxhbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBkZXRpay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSI5MTkxNjExOTg0NjI1NDYwODIwIj4iQW5kYSB0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzAiPiVkPC94bGlmZjpnPiBrYWxpIHNhbGFoIG1lbmdnYW1iYXIgcG9sYSBwZW1idWthIGt1bmNpLiBTZXRlbGFoIDx4bGlmZjpnIGlkPSJOVU1CRVJfMSI+JWQ8L3hsaWZmOmc+IGxhZ2kgdXBheWEgZ2FnYWwsIEFuZGEgYWthbiBkaW1pbnRhIG1lbWJ1a2Ega3VuY2kgdGFibGV0IG1lbmdndW5ha2FuIGluZm8gbWFzdWsgR29vZ2xlLiJcblxuIkNvYmEgbGFnaSBkYWxhbSA8eGxpZmY6ZyBpZD0iTlVNQkVSXzIiPiVkPC94bGlmZjpnPiBkZXRpay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19hbG1vc3RfZ2xvZ2luIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMjU5MDIyNzU1OTc2Mzc2Mjc1MSI+IkFuZGEgdGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaSBzYWxhaCBtZW5nZ2FtYmFyIHBvbGEgcGVtYnVrYSBrdW5jaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiBsYWdpIHVwYXlhIGdhZ2FsLCBBbmRhIGFrYW4gZGltaW50YSBtZW1idWthIGt1bmNpIHBvbnNlbCBtZW5nZ3VuYWthbiBpbmZvIG1hc3VrIEdvb2dsZS4iXG5cbiJDb2JhIGxhZ2kgZGFsYW0gPHhsaWZmOmcgaWQ9Ik5VTUJFUl8yIj4lZDwveGxpZmY6Zz4gZGV0aWsuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2F0X3dpcGUiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjYxMjgxMDYzOTk3NDU3NTU2MDQiPiJBbmRhIHRlbGFoIGdhZ2FsIG1lbmNvYmEgbWVtYnVrYSBnZW1ib2sgdGFibGV0IHNlYmFueWFrIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGthbGkuIFNldGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdXBheWEgZ2FnYWwgbGFnaSwgdGFibGV0IGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBzZXRlbGFuIGJhd2FhbiBwYWJyaWsgZGFuIHNlbXVhIGRhdGEgcGVuZ2d1bmEgaGlsYW5nLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9hdF93aXBlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODYwMzU2NTE0MjE1NjgyNjU2NSI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayBwb25zZWwgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB1cGF5YSBnYWdhbCBsYWdpLCBwb25zZWwgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gYmF3YWFuIHBhYnJpayBkYW4gc2VtdWEgZGF0YSBwZW5nZ3VuYSBoaWxhbmcuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfbm93X3dpcGluZyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMjgwODczNTE2NDkzOTM0MzY1Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHRhYmxldCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4ga2FsaS4gS2luaSB0YWJsZXQgYWthbiBkaXNldGVsIHVsYW5nIGtlIHNldGVsYW4gYmF3YWFuIHBhYnJpay4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19ub3dfd2lwaW5nIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzAyNTUwNDcyMTc2NDkyMjI0NiI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayBwb25zZWwgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IGthbGkuIEtpbmkgcG9uc2VsIGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBzZXRlbGFuIGJhd2FhbiBwYWJyaWsuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfYWxtb3N0X2F0X3dpcGUiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjYxMjgxMDYzOTk3NDU3NTU2MDQiPiJBbmRhIHRlbGFoIGdhZ2FsIG1lbmNvYmEgbWVtYnVrYSBnZW1ib2sgdGFibGV0IHNlYmFueWFrIDx4bGlmZjpnIGlkPSJOVU1CRVJfMCI+JWQ8L3hsaWZmOmc+IGthbGkuIFNldGVsYWggPHhsaWZmOmcgaWQ9Ik5VTUJFUl8xIj4lZDwveGxpZmY6Zz4gdXBheWEgZ2FnYWwgbGFnaSwgdGFibGV0IGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBwZW5nYXR1cmFuIGJhd2FhbiBwYWJyaWsgZGFuIHNlbXVhIGRhdGEgcGVuZ2d1bmEgaGlsYW5nLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fZmFpbGVkX2F0dGVtcHRzX2FsbW9zdF9hdF93aXBlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODYwMzU2NTE0MjE1NjgyNjU2NSI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayBwb25zZWwgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUl8wIj4lZDwveGxpZmY6Zz4ga2FsaS4gU2V0ZWxhaCA8eGxpZmY6ZyBpZD0iTlVNQkVSXzEiPiVkPC94bGlmZjpnPiB1cGF5YSBnYWdhbCBsYWdpLCBwb25zZWwgYWthbiBkaXNldGVsIHVsYW5nIGtlIHBlbmdhdHVyYW4gYmF3YWFuIHBhYnJpayBkYW4gc2VtdWEgZGF0YSBwZW5nZ3VuYSBoaWxhbmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mYWlsZWRfYXR0ZW1wdHNfbm93X3dpcGluZyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMjgwODczNTE2NDkzOTM0MzY1Ij4iQW5kYSB0ZWxhaCBnYWdhbCBtZW5jb2JhIG1lbWJ1a2EgZ2VtYm9rIHRhYmxldCBzZWJhbnlhayA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4ga2FsaS4gS2luaSB0YWJsZXQgYWthbiBkaXNldGVsIHVsYW5nIGtlIHBlbmdhdHVyYW4gYmF3YWFuIHBhYnJpay4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2ZhaWxlZF9hdHRlbXB0c19ub3dfd2lwaW5nIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzAyNTUwNDcyMTc2NDkyMjI0NiI+IkFuZGEgdGVsYWggZ2FnYWwgbWVuY29iYSBtZW1idWthIGdlbWJvayBwb25zZWwgc2ViYW55YWsgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IGthbGkuIEtpbmkgcG9uc2VsIGFrYW4gZGlzZXRlbCB1bGFuZyBrZSBwZW5nYXR1cmFuIGJhd2FhbiBwYWJyaWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl90b29fbWFueV9mYWlsZWRfYXR0ZW1wdHNfY291bnRkb3duIiBtc2dpZD0iNjI1MTQ4MDM0MzM5NDM4OTY2NSI+IkNvYmEgbGFnaSBkYWxhbSA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gZGV0aWsuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9mb3Jnb3RfcGF0dGVybl9idXR0b25fdGV4dCIgbXNnaWQ9IjI2MjY5OTk0NDk2MTA2OTU5MzAiPiJMdXBhIHBvbGE/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9nbG9naW5fZm9yZ290X3BhdHRlcm4iIG1zZ2lkPSIyNTg4NTIxNTAxMTY2MDMyNzQ3Ij4iUGVtYnVrYSBrdW5jaSBha3VuIjwvc3RyaW5nPgpAQCAtNzQ5LDE3ICs3NDksMTcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX3BhcmlzaCIgbXNnaWQ9IjgyMDIyMDYxMDU0Njg4MjAwNTciPiJLYW1wdW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYXJlYSIgbXNnaWQ9IjM1NDc0MDkwNTA4ODk5NTI0MjMiPiJBcmVhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfZW1pcmF0ZSIgbXNnaWQ9IjI4OTM4ODA5Nzg4MzU2OTg4MTgiPiJFbWlyYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3JlYWRIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iMTI4NDg0MzcyODIwMzQxMjEzNSI+ImJhY2Egcml3YXlhdCBkYW4gYm9va21hcmsgUGVyYW1iYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19yZWFkSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjQ1Nzc0NzYzOTI2MDQ1OTU5MjEiPiJNZW5naXppbmthbiBhcGwgbWVtYmFjYSBzZW11YSBVUkwgeWFuZyB0ZWxhaCBkaWt1bmp1bmdpIFBlcmFtYmFuIGRhbiBzZW11YSBib29rbWFyayBQZXJhbWJhbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgbXNnaWQ9IjkwMDk0MzQxMDk4MzYyODAzNzQiPiJ0dWxpc2thbiByaXdheWF0IGRhbiBib29rbWFyayBQZXJhbWJhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTc1NzEwMzgwNDgyNDIwOTUzMCI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgcml3YXlhdCBQZXJhbWJhbiBhdGF1IGJvb2ttYXJrIHlhbmcgdGVyc2ltcGFuIGRpIHRhYmxldC4gQXBsIGJlcmJhaGF5YSBkYXBhdCBtZW5nZ3VuYWthbiBpemluIGluaSB1bnR1ayBtZW5naGFwdXMgYXRhdSBtZW1vZGlmaWthc2kgZGF0YSBQZXJhbWJhbiBBbmRhLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3dyaXRlSGlzdG9yeUJvb2ttYXJrcyIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjY2OTM3NjQzNTU3MjA3MTkxOTciPiJNZW5naXppbmthbiBhcGwgbWVtb2RpZmlrYXNpIHJpd2F5YXQgUGVyYW1iYW4gYXRhdSBib29rbWFyayB5YW5nIHRlcnNpbXBhbiBkaSBwb25zZWwgQW5kYS4gQXBsIGJlcmJhaGF5YSBkYXBhdCBtZW5nZ3VuYWthbm55YSB1bnR1ayBtZW5naGFwdXMgYXRhdSBtZW1vZGlmaWthc2kgZGF0YSBQZXJhbWJhbiBBbmRhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSIxMjg0ODQzNzI4MjAzNDEyMTM1Ij4iYmFjYSByaXdheWF0IGRhbiBib29rbWFyayBCcm93c2VyIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcmVhZEhpc3RvcnlCb29rbWFya3MiIG1zZ2lkPSI0NTc3NDc2MzkyNjA0NTk1OTIxIj4iTWVuZ2l6aW5rYW4gYXBsIG1lbWJhY2Egc2VtdWEgVVJMIHlhbmcgdGVsYWggZGlrdW5qdW5naSBCcm93c2VyIGRhbiBzZW11YSBib29rbWFyayBCcm93c2VyLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBtc2dpZD0iOTAwOTQzNDEwOTgzNjI4MDM3NCI+InR1bGlza2FuIHJpd2F5YXQgZGFuIGJvb2ttYXJrIEJyb3dzZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUhpc3RvcnlCb29rbWFya3MiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE3NTcxMDM4MDQ4MjQyMDk1MzAiPiJNZW5naXppbmthbiBhcGwgbWVtb2RpZmlrYXNpIHJpd2F5YXQgQnJvd3NlciBhdGF1IGJvb2ttYXJrIHlhbmcgdGVyc2ltcGFuIGRpIHRhYmxldC4gQXBsIGJlcmJhaGF5YSBkYXBhdCBtZW5nZ3VuYWthbiBpemluIGluaSB1bnR1ayBtZW5naGFwdXMgYXRhdSBtZW1vZGlmaWthc2kgZGF0YSBCcm93c2VyIEFuZGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfd3JpdGVIaXN0b3J5Qm9va21hcmtzIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjY5Mzc2NDM1NTcyMDcxOTE5NyI+Ik1lbmdpemlua2FuIGFwbCBtZW1vZGlmaWthc2kgcml3YXlhdCBCcm93c2VyIGF0YXUgYm9va21hcmsgeWFuZyB0ZXJzaW1wYW4gZGkgcG9uc2VsIEFuZGEuIEFwbCBiZXJiYWhheWEgZGFwYXQgbWVuZ2d1bmFrYW5ueWEgdW50dWsgbWVuZ2hhcHVzIGF0YXUgbWVtb2RpZmlrYXNpIGRhdGEgQnJvd3NlciBBbmRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfc2V0QWxhcm0iIG1zZ2lkPSI1OTI0NDAxMzI4ODAzNjE1MTY1Ij4ic2V0ZWwgYWxhcm0gZGkgamFtIGFsYXJtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2V0QWxhcm0iIG1zZ2lkPSIzMTYzOTIwMzkxNTc0NzM4NDgiPiJNZW5naXppbmthbiBhcGwgbWVueWV0ZWwgYWxhcm0gZGkgYXBsIGphbSBhbGFybSB5YW5nIHRlcnBhc2FuZy4gQmViZXJhcGEgYXBsIGphbSBhbGFybSBtdW5na2luIHRpZGFrIG1lbmVyYXBrYW4gZml0dXIgaW5pLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWRkVm9pY2VtYWlsIiBtc2dpZD0iNTUyNTY2MDAyNjA5MDk1OTA0NCI+InRhbWJhaGthbiBrb3RhayBwZXNhbiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FkZFZvaWNlbWFpbCIgbXNnaWQ9IjY2MDQ1MDg2NTE0MjgyNTI0MzciPiJNZW5naXppbmthbiBhcGwgbWVuYW1iYWhrYW4gcGVzYW4ga2Uga290YWsgbWFzdWsgdW50dWsgcGVzYW4gc3VhcmEgQW5kYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3dyaXRlR2VvbG9jYXRpb25QZXJtaXNzaW9ucyIgbXNnaWQ9IjU5NjIyMjQxNTg5NTUyNzM5MzIiPiJtZW1vZGlmaWthc2kgaXppbiBnZW9sb2thc2kgUGVyYW1iYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSIxMDgzNzQzMjM0NTIyNjM4NzQ3Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBpemluIGdlb2xva2FzaSBQZXJhbWJhbi4gQXBsIGJlcmJhaGF5YSBkYXBhdCBtZW5nZ3VuYWthbiBpemluIGluaSB1bnR1ayBtZW11bmdraW5rYW4gcGVuZ2lyaW1hbiBpbmZvcm1hc2kgbG9rYXNpIGtlIHNlbWJhcmFuZyBzaXR1cyB3ZWIuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl93cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSI1OTYyMjI0MTU4OTU1MjczOTMyIj4ibWVtb2RpZmlrYXNpIGl6aW4gZ2VvbG9rYXNpIEJyb3dzZXIiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY193cml0ZUdlb2xvY2F0aW9uUGVybWlzc2lvbnMiIG1zZ2lkPSIxMDgzNzQzMjM0NTIyNjM4NzQ3Ij4iTWVuZ2l6aW5rYW4gYXBsIG1lbW9kaWZpa2FzaSBpemluIGdlb2xva2FzaSBCcm93c2VyLiBBcGwgYmVyYmFoYXlhIGRhcGF0IG1lbmdndW5ha2FuIGl6aW4gaW5pIHVudHVrIG1lbXVuZ2tpbmthbiBwZW5naXJpbWFuIGluZm9ybWFzaSBsb2thc2kga2Ugc2VtYmFyYW5nIHNpdHVzIHdlYi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3BhY2thZ2VWZXJpZmljYXRpb25BZ2VudCIgbXNnaWQ9IjU1NjgxMzkxMDA2NDU4MjkxMTciPiJ2ZXJpZmlrYXNpIHBha2V0Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfcGFja2FnZVZlcmlmaWNhdGlvbkFnZW50IiBtc2dpZD0iODQzNzU5MDE5MDk5MDg0MzM4MSI+Ik1lbmdpemlua2FuIGFwbCBtZW12ZXJpZmlrYXNpIGJhaHdhIHN1YXR1IHBha2V0IGRhcGF0IGRpcGFzYW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYmluZFBhY2thZ2VWZXJpZmllciIgbXNnaWQ9IjQxODc3ODY3OTMzNjAzMjY2NTQiPiJtZW5naWthdCBrZSBwZW12ZXJpZmlrYXNpIHBha2V0Ijwvc3RyaW5nPgpAQCAtNzY4LDExICs3NjgsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiJNZW11bmdraW5rYW4gcGVtZWdhbmdueWEgbWVuZ2Frc2VzIHBvcnQgc2VyaWFsIG1lbmdndW5ha2FuIEFQSSBTZXJpYWxNYW5hZ2VyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI1MDc3Nzc0Mjk3OTQzNDA5Mjg1Ij4ibWVuZ2Frc2VzIHBlbnllZGlhIGtvbnRlbiBkYXJpIGx1YXIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiJNZW11bmdraW5rYW4gcGVtZWdhbmcgbWVuZ2Frc2VzIHBlbnllZGlhIGtvbnRlbiBkYXJpIGNhbmdrYW5nLiBUaWRhayBwZXJuYWggZGlwZXJsdWthbiB1bnR1ayBhcGwgbm9ybWFsLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3VwZGF0ZUxvY2sgKDM1Mjc1NTgzNjY2MTY2ODA4ODkpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfdXBkYXRlTG9jayAoMTY1NTYyNTgzMjE2Njc3ODQ5MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IkFwYWthaCBBbmRhIGluZ2luIHBlcmFtYmFuIG1lbnlpbXBhbiBzYW5kaSBpbmk/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+Im1lbmdoaW5kYXJpIHBlbWJhcnVhbiBwZXJhbmdrYXQgb3RvbWF0aXMiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191cGRhdGVMb2NrIiBtc2dpZD0iMTY1NTYyNTgzMjE2Njc3ODQ5MiI+Ik1lbXVuZ2tpbmthbiBwZW1lZ2FuZyB1bnR1ayBtZW5hd2Fya2FuIGluZm9ybWFzaSBrZSBzaXN0ZW0gbWVuZ2VuYWkga2FwYW4gd2FrdHUgeWFuZyBiYWlrIGJhZ2kgcGVtdWxhaWFuIHVsYW5nIG5vbi1pbnRlcmFrdGlmIHVudHVrIG1lbmluZ2thdGthbiB2ZXJzaSBwZXJhbmdrYXQuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iQXBha2FoIEFuZGEgaW5naW4gYnJvd3NlciBtZW55aW1wYW4gc2FuZGkgaW5pPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbm90bm93IiBtc2dpZD0iNjM4OTY3NTMxNjcwNjY5OTc1OCI+IlRpZGFrIHNla2FyYW5nIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiJJbmdhdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbmV2ZXIiIG1zZ2lkPSI4Mjc0MzMwMjk2Nzg1ODU1MTA1Ij4iSmFuZ2FuIjwvc3RyaW5nPgpAQCAtOTEyLDcgKzkxMCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJjYXBpdGFsX29mZiIgbXNnaWQ9IjY4MTU4NzAzODY5NzI4MDU4MzIiPiJNQVRJIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0id2hpY2hBcHBsaWNhdGlvbiIgbXNnaWQ9IjQ1MzMxODU5NDcwNjQ3NzMzODYiPiJUaW5kYWthbiBsZW5na2FwIG1lbmdndW5ha2FuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWx3YXlzVXNlIiBtc2dpZD0iNDU4MzAxODM2ODAwMDYxMDQzOCI+Ikd1bmFrYW4gc2VjYXJhIGJhd2FhbiB1bnR1ayB0aW5kYWthbiBpbmkuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iY2xlYXJEZWZhdWx0SGludE1zZyIgbXNnaWQ9IjMyNTI1ODQ2ODk1MTIwNzcyNTciPiJNZW5naGFwdXMgYmF3YWFuIGRpIFNldGVsYW4gc2lzdGVtICZndDsgQXBsICZndDsgVGVydW5kdWguIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY2xlYXJEZWZhdWx0SGludE1zZyIgbXNnaWQ9IjMyNTI1ODQ2ODk1MTIwNzcyNTciPiJNZW5naGFwdXMgYmF3YWFuIGRpIFBlbmdhdHVyYW4gc2lzdGVtICZndDsgQXBsICZndDsgVGVydW5kdWguIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY2hvb3NlQWN0aXZpdHkiIG1zZ2lkPSI3NDg2ODc2MTQ3NzUxODAzMzMzIj4iUGlsaWggdGluZGFrYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjaG9vc2VVc2JBY3Rpdml0eSIgbXNnaWQ9IjY4OTQ3NDg0MTYwNzM1ODM1MDkiPiJQaWxpaCBhcGwgdW50dWsgcGVyYW5na2F0IFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im5vQXBwbGljYXRpb25zIiBtc2dpZD0iMjk5MTgxNDI3MzkzNjUwNDY4OSI+IlRpZGFrIGFkYSBhcGwgeWFuZyBkYXBhdCBtZWxha3VrYW4gdGluZGFrYW4gaW5pLiI8L3N0cmluZz4KQEAgLTkzMyw3ICs5MzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoX3dhcm5pbmdfb3JpZ2luYWwiIG1zZ2lkPSIxODgxMDIwMjMwMjE2Njg2ODMiPiI8eGxpZmY6ZyBpZD0iQVBQX05BTUUiPiUxJHM8L3hsaWZmOmc+IHRlbGFoIGRpbHVuY3Vya2FuIGFzbGlueWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2NyZWVuX2NvbXBhdF9tb2RlX3NjYWxlIiBtc2dpZD0iMzIwMjk1NTY2NzY3NTk0NDQ5OSI+IlNrYWxhIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2NyZWVuX2NvbXBhdF9tb2RlX3Nob3ciIG1zZ2lkPSI0MDEzODc4ODc2NDg2NjU1ODkyIj4iU2VsYWx1IHRhbXBpbGthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InNjcmVlbl9jb21wYXRfbW9kZV9oaW50IiBtc2dpZD0iMTA2NDUyNDA4NDU0MzMwNDQ1OSI+IkFrdGlma2FuIGtlbWJhbGkgZGlhbG9nIGluaSBkaSBTZXRlbGFuIHNpc3RlbSAmZ3Q7IEFwbCAmZ3Q7IFRlcnVuZHVoLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InNjcmVlbl9jb21wYXRfbW9kZV9oaW50IiBtc2dpZD0iMTA2NDUyNDA4NDU0MzMwNDQ1OSI+IkFrdGlma2FuIGtlbWJhbGkgZGlhbG9nIGluaSBkaSBQZW5nYXR1cmFuIHNpc3RlbSAmZ3Q7IEFwbCAmZ3Q7IFRlcnVuZHVoLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNtdl9hcHBsaWNhdGlvbiIgbXNnaWQ9IjMzMDcyMDkxOTIxNTU0NDI4MjkiPiJBcGwgPHhsaWZmOmcgaWQ9IkFQUExJQ0FUSU9OIj4lMSRzPC94bGlmZjpnPiAocHJvc2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMiRzPC94bGlmZjpnPikgdGVsYWggbWVsYW5nZ2FyIGtlYmlqYWthbiBTdHJpY3RNb2RlIHlhbmcgZGliZXJsYWt1a2FubnlhIHNlbmRpcmkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic212X3Byb2Nlc3MiIG1zZ2lkPSI1MTIwMzk3MDEyMDQ3NDYyNDQ2Ij4iUHJvc2VzIDx4bGlmZjpnIGlkPSJQUk9DRVNTIj4lMSRzPC94bGlmZjpnPiB0ZWxhaCBtZWxhbmdnYXIga2ViaWpha2FuIFN0cmljdE1vZGUgeWFuZyBkaWJlcmxha3VrYW4gc2VjYXJhIG90b21hdGlzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFuZHJvaWRfdXBncmFkaW5nX3RpdGxlIiBtc2dpZD0iMTU4NDE5MjI4NTQ0MTQwNTc0NiI+IkFuZHJvaWQgc2VkYW5nIG1lbmluZ2thdGthbiB2ZXJzaS4uLiI8L3N0cmluZz4KQEAgLTk4NSw3ICs5ODMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0id2lmaV9wMnBfdHVybm9uX21lc3NhZ2UiIG1zZ2lkPSIyOTA5MjUwOTQyMjk5NjI3MjQ0Ij4iTWVtdWxhaSBXaS1GaSBMYW5nc3VuZy4gT3BzaSBpbmkgYWthbiBtZW1hdGlrYW4gaG90c3BvdC9rbGllbiBXaS1GaS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ3aWZpX3AycF9mYWlsZWRfbWVzc2FnZSIgbXNnaWQ9IjM3NjM2Njk2Nzc5MzU2MjMwODQiPiJUaWRhayBkYXBhdCBtZW11bGFpIFdpLUZpIExhbmdzdW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndpZmlfcDJwX2VuYWJsZWRfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMjA2ODMyMTg4MTY3MzczNDg4NiI+IldpLUZpIExhbmdzdW5nIGFrdGlmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0id2lmaV9wMnBfZW5hYmxlZF9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjE2Mzg5NDk5NTM5OTM4OTQzMzUiPiJTZW50dWggdW50dWsgc2V0ZWxhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9IndpZmlfcDJwX2VuYWJsZWRfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIxNjM4OTQ5OTUzOTkzODk0MzM1Ij4iU2VudHVoIHVudHVrIHBlbmdhdHVyYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2NlcHQiIG1zZ2lkPSIxNjQ1MjY3MjU5MjcyODI5NTU5Ij4iVGVyaW1hIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGVjbGluZSIgbXNnaWQ9IjIxMTIyMjU0NTE3MDYxMzc4OTQiPiJUb2xhayI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9IndpZmlfcDJwX2ludml0YXRpb25fc2VudF90aXRsZSIgbXNnaWQ9IjEzMTg5NzUxODUxMTIwNzA3MzQiPiJVbmRhbmdhbiB0ZXJraXJpbSI8L3N0cmluZz4KQEAgLTEwMTYsMTMgKzEwMTQsMTMgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1zX3Nob3dfYWxsIiBtc2dpZD0iMjY3MTc5MTE2MzkzMzA5MTE4MCI+PGI+IlRhbXBpbGthbiBzZW11YSI8L2I+PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9hY3Rpdml0eV90aXRsZSIgbXNnaWQ9IjQ0NjUwNTUxNTcyMDk2NDg2NDEiPiJQZW55aW1wYW5hbiBtYXNzYWwgVVNCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfdGl0bGUiIG1zZ2lkPSI1OTAxNDU5MDQxMzk4NzUxNDk1Ij4iVVNCIHRlcmh1YnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzMwODUzODA5NDMxNjQ3NzgzOSI+IkFuZGEgdGVsYWggdGVyc2FtYnVuZyBrZSBrb21wdXRlciBtZWxhbHVpIFVTQi4gU2VudHVoIHRvbWJvbCBkaSBiYXdhaCBqaWthIEFuZGEgaW5naW4gbWVueWFsaW4gYmVya2FzIGFudGFyYSBrb21wdXRlciBkYW4gcGVueWltcGFuYW4gVVNCIEFuZHJvaWQgQW5kYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA1MzUxMDAwNDQ2MDM3ODExIj4iQW5kYSB0ZWxhaCB0ZXJzYW1idW5nIGtlIGtvbXB1dGVyIG1lbGFsdWkgVVNCLiBTZW50dWggdG9tYm9sIGRpIGJhd2FoIGppa2EgQW5kYSBpbmdpbiBtZW55YWxpbiBiZXJrYXMgYW50YXJhIGtvbXB1dGVyIGRhbiBrYXJ0dSBTRCBBbmRyb2lkIEFuZGEuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2VfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzMzA4NTM4MDk0MzE2NDc3ODM5Ij4iQW5kYSB0ZWxhaCB0ZXJzYW1idW5nIGtlIGtvbXB1dGVyIG1lbGFsdWkgVVNCLiBTZW50dWggdG9tYm9sIGRpIGJhd2FoIGppa2EgQW5kYSBpbmdpbiBtZW55YWxpbiBmaWxlIGFudGFyYSBrb21wdXRlciBkYW4gcGVueWltcGFuYW4gVVNCIEFuZHJvaWQgQW5kYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9tZXNzYWdlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iODA1MzUxMDAwNDQ2MDM3ODExIj4iQW5kYSB0ZWxhaCB0ZXJzYW1idW5nIGtlIGtvbXB1dGVyIG1lbGFsdWkgVVNCLiBTZW50dWggdG9tYm9sIGRpIGJhd2FoIGppa2EgQW5kYSBpbmdpbiBtZW55YWxpbiBmaWxlIGFudGFyYSBrb21wdXRlciBkYW4ga2FydHUgU0QgQW5kcm9pZCBBbmRhLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2J1dHRvbl9tb3VudCIgbXNnaWQ9IjEwNTIyNTk5MzAzNjk1MDgyMzUiPiJIaWR1cGthbiBwZW55aW1wYW5hbiBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9lcnJvcl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjMwMTcwNDUyMTczNjU1NDA2NTgiPiJUZXJqYWRpIG1hc2FsYWggc2FhdCBtZW5nZ3VuYWthbiBwZW55aW1wYW5hbiBVU0IgQW5kYSB1bnR1ayBwZW55aW1wYW5hbiBtYXNzYWwgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX2Vycm9yX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSIyODc2MDE4NTEyNzE2OTcwMzEzIj4iVGVyamFkaSBtYXNhbGFoIHNhYXQgbWVuZ2d1bmFrYW4ga2FydHUgU0QgQW5kYSB1bnR1ayBwZW55aW1wYW5hbiBtYXNzYWwgVVNCLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjgxNzU4OTI1NTQ3NTcyMTY1MjUiPiJVU0IgdGVyaHVidW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSI5Mzk4MjI3ODM4MjgxODM3NjMiPiJTZW50dWggdW50dWsgbWVueWFsaW4gYmVya2FzIGtlL2Rhcmkga29tcHV0ZXIgQW5kYS4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjkzOTgyMjc4MzgyODE4Mzc2MyI+IlNlbnR1aCB1bnR1ayBtZW55YWxpbiBmaWxlIGtlL2Rhcmkga29tcHV0ZXIgQW5kYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2Jfc3RvcmFnZV9zdG9wX25vdGlmaWNhdGlvbl90aXRsZSIgbXNnaWQ9IjIzMzYwNTgzOTY2NjM1MTYwMTciPiJNYXRpa2FuIHBlbnlpbXBhbmFuIFVTQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVzYl9zdG9yYWdlX3N0b3Bfbm90aWZpY2F0aW9uX21lc3NhZ2UiIG1zZ2lkPSIxNjU2ODUyMDk4NTU1NjIzODIyIj4iU2VudHVoIHVudHVrIG1lbWF0aWthbiBwZW55aW1wYW5hbiBVU0IuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNiX3N0b3JhZ2Vfc3RvcF90aXRsZSIgbXNnaWQ9IjY2MDEyOTg1MTcwODc3NTg1MyI+IlBlbnlpbXBhbmFuIFVTQiBzZWRhbmcgZGlndW5ha2FuIjwvc3RyaW5nPgpAQCAtMTA0MSw3ICsxMDM5LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InVzYl9ub3RpZmljYXRpb25fbWVzc2FnZSIgbXNnaWQ9IjIyOTA4NTkzOTk5ODM3MjAyNzEiPiJTZW50dWggdW50dWsgb3BzaSBVU0IgbGFpbm55YS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfdGl0bGUiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iOTAyMDA5MjE5NjA2MTAwNzI2MiI+IkZvcm1hdCBwZW55aW1wYW5hbiBVU0I/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iMzY0ODQxNTkyMTUyNjUyNjA2OSI+IkZvcm1hdCBrYXJ0dSBTRD8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSIzOTM0MDE2ODUzNDI1NzYxMDc4Ij4iU2VtdWEgYmVya2FzIHlhbmcgdGVyc2ltcGFuIGRhbGFtIHBlbnlpbXBhbmFuIFVTQiBBbmRhIGFrYW4gZGloYXB1cy4gVGluZGFrYW4gaW5pIHRpZGFrIGRhcGF0IGRpdXJ1bmdrYW4hIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0bWVkaWFfZm9ybWF0X21lc3NhZ2UiIHByb2R1Y3Q9Im5vc2RjYXJkIiBtc2dpZD0iMzkzNDAxNjg1MzQyNTc2MTA3OCI+IlNlbXVhIGZpbGUgeWFuZyB0ZXJzaW1wYW4gZGFsYW0gcGVueWltcGFuYW4gVVNCIEFuZGEgYWthbiBkaWhhcHVzLiBUaW5kYWthbiBpbmkgdGlkYWsgZGFwYXQgZGl1cnVuZ2thbiEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRtZWRpYV9mb3JtYXRfbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9IjE0MTMxODk1MDI3NTQzODMwIj4iU2VtdWEgZGF0YSBkaSBrYXJ0dSBBbmRhIGFrYW4gaGlsYW5nLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dG1lZGlhX2Zvcm1hdF9idXR0b25fZm9ybWF0IiBtc2dpZD0iNDEzMTA2NDU2MDEyNzQ3ODY5NSI+IkZvcm1hdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFkYl9hY3RpdmVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iNjcyOTA0NDc3ODk0OTE4OTkxOCI+IkRlYnVnZ2luZyBVU0IgdGVyaHVidW5nIjwvc3RyaW5nPgpAQCAtMTA1Nyw3ICsxMDU1LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0ibm9zZGNhcmQiIG1zZ2lkPSI3Nzg4MDQwNzQ1Njg2MjI5MzA3Ij4iUGVueWltcGFuYW4gVVNCIGtvc29uZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl90aXRsZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijc4MDQ3NzgzODI0MTIxMjk5NyI+IkthcnR1IFNEIGtvc29uZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImV4dF9tZWRpYV9ub2ZzX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9Ijc4NDAxMjEwNjc0MjcyNjk1MDAiPiJQZW55aW1wYW5hbiBVU0Iga29zb25nIGF0YXUgc2lzdGVtIGJlcmthc255YSB0aWRhayBkaWR1a3VuZy4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfbm9mc19ub3RpZmljYXRpb25fbWVzc2FnZSIgcHJvZHVjdD0iZGVmYXVsdCIgbXNnaWQ9Ijg2NDEwNjU2NDE3ODY5MjM2MDQiPiJLYXJ0dSBTRCBrb3NvbmcgYXRhdSBtZW1pbGlraSBzaXN0ZW0gYmVya2FzIHlhbmcgdGlkYWsgZGlkdWt1bmcuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX25vZnNfbm90aWZpY2F0aW9uX21lc3NhZ2UiIHByb2R1Y3Q9ImRlZmF1bHQiIG1zZ2lkPSI4NjQxMDY1NjQxNzg2OTIzNjA0Ij4iS2FydHUgU0Qga29zb25nIGF0YXUgbWVtaWxpa2kgc2lzdGVtIGZpbGUgeWFuZyB0aWRhayBkaWR1a3VuZy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjIwOTAwNDY3Njk1MzI3MTM1NjMiPiJQZW55aW1wYW5hbiBVU0IgcnVzYWsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJleHRfbWVkaWFfdW5tb3VudGFibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBwcm9kdWN0PSJkZWZhdWx0IiBtc2dpZD0iNjQxMDcyMzkwNjAxOTEwMDE4OSI+IkthcnR1IFNEIHJ1c2FrIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZXh0X21lZGlhX3VubW91bnRhYmxlX25vdGlmaWNhdGlvbl9tZXNzYWdlIiBwcm9kdWN0PSJub3NkY2FyZCIgbXNnaWQ9IjE3OTU5MTc1NzgzOTUzMzMyODAiPiJQZW55aW1wYW5hbiBVU0IgcnVzYWsuIENvYmEgZGlmb3JtYXQgdWxhbmcuIjwvc3RyaW5nPgpAQCAtMTEwNiw4ICsxMTA0LDggQEAKICAgICA8c3RyaW5nIG5hbWU9InZwbl90aXRsZV9sb25nIiBtc2dpZD0iNjQwMDcxNDc5ODA0OTI1MjI5NCI+IlZQTiBkaWFrdGlma2FuIG9sZWggPHhsaWZmOmcgaWQ9IkFQUCI+JXM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idnBuX3RleHQiIG1zZ2lkPSIzMDExMzA2NjA3MTI2NDUwMzIyIj4iU2VudHVoIHVudHVrIG1lbmdlbG9sYSBqYXJpbmdhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ2cG5fdGV4dF9sb25nIiBtc2dpZD0iNjQwNzM1MTAwNjI0OTE3NDQ3MyI+IlRlcnNhbWJ1bmcga2UgPHhsaWZmOmcgaWQ9IlNFU1NJT04iPiVzPC94bGlmZjpnPi4gU2VudHVoIHVudHVrIG1lbmdlbG9sYSBqYXJpbmdhbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJ1cGxvYWRfZmlsZSIgbXNnaWQ9IjI4OTc5NTcxNzIzNjY3MzA0MTYiPiJQaWxpaCBiZXJrYXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJUaWRhayBhZGEgYmVya2FzIHlhbmcgZGlwaWxpaCI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVwbG9hZF9maWxlIiBtc2dpZD0iMjg5Nzk1NzE3MjM2NjczMDQxNiI+IlBpbGloIGZpbGUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJub19maWxlX2Nob3NlbiIgbXNnaWQ9IjYzNjM2NDg1NjIxNzA3NTk0NjUiPiJUaWRhayBhZGEgZmlsZSB5YW5nIGRpcGlsaWgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldCIgbXNnaWQ9IjI0NDgxNjgwODA5NjQyMDk5MDgiPiJTZXRlbCB1bGFuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN1Ym1pdCIgbXNnaWQ9IjE2MDIzMzU1NzIwODk5MTE5NDEiPiJLaXJpbSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNhcl9tb2RlX2Rpc2FibGVfbm90aWZpY2F0aW9uX3RpdGxlIiBtc2dpZD0iMzE2NDc2ODIxMjAwMzg2NDMxNiI+Ik1vZGUgbW9iaWwgZGlha3RpZmthbiI8L3N0cmluZz4KQEAgLTEyNDUsNiArMTI0Myw2IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2RldmljZV9sb2NrZWQiIG1zZ2lkPSIzMDkyNzAzNDQ4NjkwNjY5NzY4Ij4iUGVyYW5na2F0IHRlcmdlbWJvay4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsaXN0X2RlbGltZXRlciIgbXNnaWQ9IjM5NzUxMTc1NzIxODU0OTQxNTIiPiIsICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNlbmRpbmciIG1zZ2lkPSIzMjQ1NjUzNjgxMDA4MjE4MDMwIj4iTWVuZ2lyaW0uLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJsYXVuY2hCcm93c2VyRGVmYXVsdCIgbXNnaWQ9IjIwNTc5NTE5NDcyOTc2MTQ3MjUiPiJMdW5jdXJrYW4gUGVyYW1iYW4/Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoQnJvd3NlckRlZmF1bHQiIG1zZ2lkPSIyMDU3OTUxOTQ3Mjk3NjE0NzI1Ij4iTHVuY3Vya2FuIEJyb3dzZXI/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iU2V0dXBDYWxsRGVmYXVsdCIgbXNnaWQ9IjU4MzQ5NDg0NjkyNTM3NTg1NzUiPiJUZXJpbWEgcGFuZ2dpbGFuPyI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKaW5kZXggYjI4YmZkZC4uYmM5ODQwZCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sCkBAIC0yNiw4ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnaWdhYnl0ZVNob3J0IiBtc2dpZD0iMzI1OTg4MjQ1NTIxMjE5MzIxNCI+IkdCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGVyYWJ5dGVTaG9ydCIgbXNnaWQ9IjIzMTYxMzAxODE1OTE4Njk2MiI+IlRCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGV0YWJ5dGVTaG9ydCIgbXNnaWQ9IjU2Mzc4MTY2ODAxNDQ5OTAyMTkiPiJQQiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaWxlU2l6ZVN1ZmZpeCAoOTE2NDI5Mjc5MTUwMDUzMTk0OSkgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbGVTaXplU3VmZml4IiBtc2dpZD0iOTE2NDI5Mjc5MTUwMDUzMTk0OSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiUxJHM8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlVOSVQiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O+aWsOimjyZndDsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpcyIgbXNnaWQ9Ijc4OTk4Mjk1MTYwNDg4MTMyMzciPiIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpc190d29fZG90cyIgbXNnaWQ9IjEyMjgwNzg5OTQ4NjYwMzA3MzYiPiLigKUiPC9zdHJpbmc+CkBAIC02NzIsOCArNjcxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY2V1bmxvY2tfbXVsdGlwbGVfZmFpbHVyZXMiIG1zZ2lkPSI3NTQxMzc1ODMwMjI3OTI0MjkiPiLjg5XjgqfjgqTjgrnjgqLjg7Pjg63jg4Pjgq/jga7mnIDlpKfoqabooYzlm57mlbDjgpLotoXjgYjjgb7jgZfjgZ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4i5YWF6Zu744GX44Gm44GE44G+44GZOiA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IuWFhembu+WujOS6hiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQgKDQ0NzcyNjQ4NDkzODY4NTAyNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSI0NDc3MjY0ODQ5Mzg2ODUwMjY2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbG93X2JhdHRlcnkiIG1zZ2lkPSIxNDgyODczOTgxOTE5MjQ5NzQwIj4i5YWF6Zu744GX44Gm44GP44Gg44GV44GEIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+IlNJTeOCq+ODvOODieOBjOaMv+WFpeOBleOCjOOBpuOBhOOBvuOBm+OCkyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTUxNjU5MTk2MDk1NzkxNDc0Ij4i44K/44OW44Os44OD44OI5YaF44GrU0lN44Kr44O844OJ44GM44GC44KK44G+44Gb44KT44CCIjwvc3RyaW5nPgpAQCAtNzIyLDEwICs3MjAsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIgbXNnaWQ9Ijk5MjI4MDc1NjI1NjUzNjA0MiI+Ij8xMjMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHBoYV9rZXkiIG1zZ2lkPSI4MDAxMDk2MTc1MTY3NDg1NjQ5Ij4iQUJDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWx0X2tleSIgbXNnaWQ9IjEyODQ4MjA5NDI2MjAyODg2NzgiPiJBTFQiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9hbXBtICg0NTg0MzM4MDgzNTI5MzU1OTgyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfY2FwX2FtcG0gKDIwODM0NjU5OTI5NDA0NDQzNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2FtcG0iIG1zZ2lkPSI0NTg0MzM4MDgzNTI5MzU1OTgyIj4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iQU1QTSI+JVA8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9jYXBfYW1wbSIgbXNnaWQ9IjIwODM0NjU5OTI5NDA0NDQzNjYiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJBTVBNIj4lcDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9mYWlsZWQiIG1zZ2lkPSI1NDEwMjcwMzI5MTE0MjEyMDQxIj4i5Ye66I235pmC6Kmm6aiT44GM5aSx5pWXIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm90X3N5c3RlbSIgbXNnaWQ9IjQ0MzUyMDE2NTY3NjcyNzY3MjMiPiJGQUNUT1JZX1RFU1Tmk43kvZzjga/jgIEvc3lzdGVtL2FwcOOBq+OCpOODs+OCueODiOODvOODq+OBleOCjOOBn+ODkeODg+OCseODvOOCuOOBruOBv+OBjOWvvuixoeOBp+OBmeOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vX2FjdGlvbiIgbXNnaWQ9Ijg3Mjk5MTg3NDc5OTk5ODU2MSI+IkZBQ1RPUllfVEVTVOaTjeS9nOOCkuihjOOBhuODkeODg+OCseODvOOCuOOBr+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBn+OAgiI8L3N0cmluZz4KQEAgLTczNyw4ICs3MzMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjQ1OTUwNDY1MTU0MDAyNjg4ODEiPiLjg5Ljg7Pjg4g6IOODgOODluODq+OCv+ODg+ODl+OBp+aLoeWkpy/nuK7lsI/jgafjgY3jgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF90aGlzX2Zvcm0iIG1zZ2lkPSI0NjE2NzU4ODQxMTU3ODE2Njc2Ij4i6Ieq5YuV5YWl5YqbIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfYXV0b2ZpbGwiIG1zZ2lkPSI3MTAzNDk1MDcwMTgwNTkwODE0Ij4i6Ieq5YuV5YWl5Yqb44KS6Kit5a6aIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IgKDYzNTAxNDUxNTQ3Nzk3MDY3NzIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yIiBtc2dpZD0iNjM1MDE0NTE1NDc3OTcwNjc3MiI+IiAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfbmFtZV9mb3JtYXQiIG1zZ2lkPSIzMjY4MDQxMDU0ODk5MjE0OTQ1Ij4iJDMkMiQxIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X3NlcGFyYXRvciIgbXNnaWQ9Ijc0ODMzMDc4OTMxNzAzMjQxMjkiPiLjgIEgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X2Zvcm1hdCIgbXNnaWQ9IjQ4NzQ0NTk0NTU3ODY4MjczNDQiPiIkMSQyJDMiPC9zdHJpbmc+CkBAIC03NzMsMTAgKzc2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXJpYWxQb3J0IiBtc2dpZD0iMjk5MTYzOTk4NTIyNDU5ODE5MyI+IlNlcmlhbE1hbmFnZXIgQVBJ44KS5L2/55So44GX44Gm44K344Oq44Ki44Or44Od44O844OI44Gr44Ki44Kv44K744K544GZ44KL44GT44Go44KS5omA5pyJ6ICF44Gr6Kix5Y+v44GX44G+44GZ44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiLjgrPjg7Pjg4bjg7Pjg4Tjg5fjg63jg5DjgqTjg4Djgbjjga7lpJbpg6jjgqLjgq/jgrvjgrkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiLjgrfjgqfjg6vjgYvjgonjgrPjg7Pjg4bjg7Pjg4Tjg5fjg63jg5DjgqTjg4DjgavjgqLjgq/jgrvjgrnjgZnjgovjgZPjgajjgpLmqKnliKnmiYDmnInogIXjgavoqLHlj6/jgZfjgb7jgZnjgILpgJrluLjjga7jgqLjg5fjg6rjgafjga/lv4XopoHjgYLjgorjgb7jgZvjgpPjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl91cGRhdGVMb2NrICgzNTI3NTU4MzY2NjE2NjgwODg5KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3VwZGF0ZUxvY2sgKDE2NTU2MjU4MzIxNjY3Nzg0OTIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4i56uv5pyr44Gu6Ieq5YuV5pu05paw44Gu5oqR5Yi2Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiLpnZ7lr77oqbHlnovjga7lho3otbfli5Xjgavjgojjgornq6/mnKvjgpLjgqLjg4Pjg5fjgrDjg6zjg7zjg4njgZnjgovjga7jgavpganjgZfjgZ/jgr/jgqTjg5/jg7PjgrDjgavjgaTjgYTjgabjgIHjgrfjgrnjg4bjg6Djgavmg4XloLHjgpLmj5DkvpvjgZnjgovjgZPjgajjgpLmqKnliKnmiYDmnInogIXjgavoqLHlj6/jgZfjgb7jgZnjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLjgZPjga7jg5Hjgrnjg6/jg7zjg4njgpLjg5bjg6njgqbjgrbjgafkv53lrZjjgZfjgb7jgZnjgYvvvJ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiLku4rjga/kv53lrZjjgZfjgarjgYQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX3JlbWVtYmVyIiBtc2dpZD0iNjQ5MTg3OTY3ODk5Njc0OTQ2NiI+IuS/neWtmCI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCmluZGV4IDAwZjM0ZWMuLmM5ODAxYTMgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbApAQCAtNzY5LDcgKzc2OSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+IuyZuOu2gOyXkOyEnCDsvZjthZDsuKAg7KCc6rO17J6Q7JeQIOyVoeyEuOyKpCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNDU0NDM0NjQ4NjY5Nzg1MzY4NSI+Iuq2jO2VnOydhCDqsIDsp4Qg7ZSE66Gc6re4656o7J20IOyFuOyXkOyEnCDsvZjthZDsuKAg7KCc6rO17J6Q7JeQIOyVoeyEuOyKpO2VmOuPhOuhnSDtl4jsmqntlanri4jri6QuIOydvOuwmCDslbHsl5DshJzripQg7ZWE7JqU7ZWY7KeAIOyViuyKteuLiOuLpC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4i7KeA6riI7J2AIOyekOuPmSDquLDquLAg7JeF642w7J207Yq466W8IOq2jOyepe2VmOyngCDslYrsnYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191cGRhdGVMb2NrIiBtc2dpZD0iMTY1NTYyNTgzMjE2Njc3ODQ5MiI+Iuq4sOq4sOulvCDsiqTsiqTroZwg64uk7IucIOu2gO2Mhe2VmOyXrCDsl4Xqt7jroIjsnbTrk5ztlbTrj4Qg6rSc7LCu7J2AIOyLnOqwhOyXkCDrjIDtlZwg7KCV67O066W8IOyCrOyaqeyekOqwgCDsi5zsiqTthZzsl5Ag7KCc6rO17ZWgIOyImCDsnojrj4TroZ0g7ZeI7Jqp7ZWp64uI64ukLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4i6riw6riw66W8IOyekOuPmeycvOuhnCDri6Tsi5wg67aA7YyF7ZWY7JesIOyXheq3uOugiOydtOuTnO2VtOuPhCDqtJzssK7snYAg7Iuc6rCE7JeQIOuMgO2VnCDsoJXrs7Trpbwg7IKs7Jqp7J6Q6rCAIOyLnOyKpO2FnOyXkCDsoJzqs7XtlaAg7IiYIOyeiOuPhOuhnSDtl4jsmqntlanri4jri6QuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4i67iM65287Jqw7KCA7JeQIOydtCDruYTrsIDrsojtmLjrpbwg7KCA7J6l7ZWY7Iuc6rKg7Iq164uI6rmMPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbm90bm93IiBtc2dpZD0iNjM4OTY3NTMxNjcwNjY5OTc1OCI+IuuCmOykkeyXkCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfcmVtZW1iZXIiIG1zZ2lkPSI2NDkxODc5Njc4OTk2NzQ5NDY2Ij4i7KCA7J6lIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKaW5kZXggMTNjY2MyZS4uNDQyNGFkNSAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sCkBAIC03NjgsNyArNzY4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NlcmlhbFBvcnQiIG1zZ2lkPSIyOTkxNjM5OTg1MjI0NTk4MTkzIj4iTGVpZMW+aWFtYSBzYXZpbmlua3VpIHBhc2lla3RpIG51b3Nla2xpdW9zaXVzIHByaWV2YWR1cyBuYXVkb2phbnQg4oCeU2VyaWFsTWFuYWdlcuKAnCBBUEkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiJwYXNpZWt0aSB0dXJpbmlvIHRlaWvEl2p1cyBpxaEgacWhb3LEl3MiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiJMZWlkxb5pYW1hIHNhdmluaW5rdWkgcGFzaWVrdGkgdHVyaW5pbyB0ZWlrxJdqdXMgbmF1ZG9qYW50IGFwdmFsa2FsxIUuIFRvIG5pZWthZGEgbmV0dXLEl3TFsyBwcmlyZWlrdGkgbmF1ZG9qYW50IMSvcHJhc3RhcyBwcm9ncmFtYXMuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+IkF0c2lzYWt5dGkgYXV0b21hdGluacWzIMSvcmVuZ2luaW8gYXRuYXVqaW5pbcWzIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+IkF0c2lzYWt5dGkgYXV0b20uIMSvcmVuZ2luaW8gYXRuYXVqaW5pbcWzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJMZWlkxb5pYSBzYXZpbmlua3VpIHBhdGVpa3RpIHBhc2nFq2x5bcSFIHNpc3RlbWFpIGTEl2wgdGlua2FtbyBsYWlrbyBpxaEgbmF1am8gbmVpbnRlcmFrdHl2aWFpIMSva2VsdGkgcHJvZ3JhbcSFLCBrYWQgYsWrdMWzIG5hdWpvdmluYW1hcyDEr3JlbmdpbnlzLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfbWVzc2FnZSIgbXNnaWQ9Ijc2NzM0NDY4NzEzOTE5NTc5MCI+IkFyIG5vcml0ZSwga2FkIG5hcsWheWtsxJcgYXRzaW1pbnTFsyDFocSvIHNsYXB0YcW+b2TErz8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJOZSBkYWJhciI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sCmluZGV4IDJjOGNhMzAuLjM4NWJlYmIgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiJHQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiJUQiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBldGFieXRlU2hvcnQiIG1zZ2lkPSI1NjM3ODE2NjgwMTQ0OTkwMjE5Ij4iUEIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmlsZVNpemVTdWZmaXggKDkxNjQyOTI3OTE1MDA1MzE5NDkpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJmaWxlU2l6ZVN1ZmZpeCIgbXNnaWQ9IjkxNjQyOTI3OTE1MDA1MzE5NDkiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lMSRzPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJVTklUIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVudGl0bGVkIiBtc2dpZD0iNDYzODk1Njk1NDg1Mjc4MjU3NiI+IiZsdDtUaWRhayBiZXJ0YWp1ayZndDsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpcyIgbXNnaWQ9Ijc4OTk4Mjk1MTYwNDg4MTMyMzciPiIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpc190d29fZG90cyIgbXNnaWQ9IjEyMjgwNzg5OTQ4NjYwMzA3MzYiPiLigKUiPC9zdHJpbmc+CkBAIC02NzIsOCArNjcxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY2V1bmxvY2tfbXVsdGlwbGVfZmFpbHVyZXMiIG1zZ2lkPSI3NTQxMzc1ODMwMjI3OTI0MjkiPiJUZWxhaCBtZWxlcGFzaSBoYWQgY3ViYWFuIEJ1a2EgS3VuY2kgV2FqYWgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4iTWVuZ2VjYXMsICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJTdWRhaCBkaWNhcy4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0ICg0NDc3MjY0ODQ5Mzg2ODUwMjY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+IlNhbWJ1bmdrYW4gcGVuZ2VjYXMgYW5kYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQiIG1zZ2lkPSI3MzgxNDk5MjE3NzMyMjI3Mjk1Ij4iVGlhZGEga2FkIFNJTS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE1MTY1OTE5NjA5NTc5MTQ3NCI+IlRpYWRhIGthZCBTSU0gZGFsYW0gdGFibGV0LiI8L3N0cmluZz4KQEAgLTcyMiwxMCArNzIwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiIG1zZ2lkPSI5OTIyODA3NTYyNTY1MzYwNDIiPiI/MTIzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWxwaGFfa2V5IiBtc2dpZD0iODAwMTA5NjE3NTE2NzQ4NTY0OSI+IkFCQyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FsdF9rZXkiIG1zZ2lkPSIxMjg0ODIwOTQyNjIwMjg4Njc4Ij4iQUxUIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfYW1wbSAoNDU4NDMzODA4MzUyOTM1NTk4MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2NhcF9hbXBtICgyMDgzNDY1OTkyOTQwNDQ0MzY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9hbXBtIiBtc2dpZD0iNDU4NDMzODA4MzUyOTM1NTk4MiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IkFNUE0iPiVQPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfY2FwX2FtcG0iIG1zZ2lkPSIyMDgzNDY1OTkyOTQwNDQ0MzY2Ij4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iQU1QTSI+JXA8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3RfZmFpbGVkIiBtc2dpZD0iNTQxMDI3MDMyOTExNDIxMjA0MSI+IlVqaWFuIGtpbGFuZyBnYWdhbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0iIG1zZ2lkPSI0NDM1MjAxNjU2NzY3Mjc2NzIzIj4iVGluZGFrYW4gRkFDVE9SWV9URVNUIGhhbnlhIGRpc29rb25nIHVudHVrIHBha2VqIHlhbmcgZGlwYXNhbmdrYW4gZGFsYW0gL3N5c3RlbS9hcHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm9fYWN0aW9uIiBtc2dpZD0iODcyOTkxODc0Nzk5OTk4NTYxIj4iVGlhZGEgcGFrZWogeWFuZyBtZW55ZWRpYWthbiB0aW5kYWthbiBGQUNUT1JZX1RFU1QgZGl0ZW11aS4iPC9zdHJpbmc+CkBAIC03MzcsOCArNzMzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSI0NTk1MDQ2NTE1NDAwMjY4ODgxIj4iUGV0dWE6IEtldGlrIGR1YSBrYWxpIHVudHVrIG1lbmdlenVtIG1hc3VrIGRhbiBrZWx1YXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIiBtc2dpZD0iNDYxNjc1ODg0MTE1NzgxNjY3NiI+IkF1dG8gaXNpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfYXV0b2ZpbGwiIG1zZ2lkPSI3MTAzNDk1MDcwMTgwNTkwODE0Ij4iU2VkaWFrYW4gQXV0b2lzaSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yICg2MzUwMTQ1MTU0Nzc5NzA2NzcyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciIgbXNnaWQ9IjYzNTAxNDUxNTQ3Nzk3MDY3NzIiPiIgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X25hbWVfZm9ybWF0IiBtc2dpZD0iMzI2ODA0MTA1NDg5OTIxNDk0NSI+IiQxJDIkMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9zZXBhcmF0b3IiIG1zZ2lkPSI3NDgzMzA3ODkzMTcwMzI0MTI5Ij4iLCAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfZm9ybWF0IiBtc2dpZD0iNDg3NDQ1OTQ1NTc4NjgyNzM0NCI+IiQxJDIkMyI8L3N0cmluZz4KQEAgLTc3MywxMCArNzY4LDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3NlcmlhbFBvcnQiIG1zZ2lkPSIyOTkxNjM5OTg1MjI0NTk4MTkzIj4iTWVtYmVuYXJrYW4gcGVtZWdhbmcgbWVuZ2Frc2VzIHBvcnQgYmVyc2lyaSBtZW5nZ3VuYWthbiBBUEkgU2VyaWFsTWFuYWdlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+ImFrc2VzIHBlbWJla2FsIGthbmR1bmdhbiBzZWNhcmEgbHVhcmFuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI0NTQ0MzQ2NDg2Njk3ODUzNjg1Ij4iTWVtYm9sZWhrYW4gcGVtZWdhbmcgbWVuZ2Frc2VzIHBlbWJla2FsIGthbmR1bmdhbiBkYXJpIGx1YXIuIFRpZGFrIGFrYW4gc2VrYWxpLWthbGkgZGlwZXJsdWthbiB1bnR1ayBhcGwgYmlhc2EuIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1sYWJfdXBkYXRlTG9jayAoMzUyNzU1ODM2NjYxNjY4MDg4OSkgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtZGVzY191cGRhdGVMb2NrICgxNjU1NjI1ODMyMTY2Nzc4NDkyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl91cGRhdGVMb2NrIiBtc2dpZD0iMzUyNzU1ODM2NjYxNjY4MDg4OSI+InRpZGFrIG1lbmdnYWxha2thbiBrZW1hcyBraW5pIHBlcmFudGkgYXV0b21hdGlrIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJNZW1iZW5hcmthbiBhcGxpa2FzaSB1bnR1ayBtZW5hd2Fya2FuIG1ha2x1bWF0IGtlcGFkYSBzaXN0ZW0gdGVudGFuZyBiaWxhIGFrYW4gbWVuamFkaSBtYXNhIHlhbmcgYmFpayB1bnR1ayBidXQgc2VtdWxhIGJ1a2FuIGludGVyYWt0aWYgdW50dWsgbWVuYWlrIHRhcmFmIHBlcmFudGkuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iQWRha2FoIGFuZGEgbWFodSBwZW55ZW1hayBpbWJhcyBtZW5naW5nYXRpIGthdGEgbGFsdWFuIGluaT8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJCdWthbiBzZWthcmFuZyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfcmVtZW1iZXIiIG1zZ2lkPSI2NDkxODc5Njc4OTk2NzQ5NDY2Ij4iSW5nYXQiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAppbmRleCAwOTczNjI0Li5lNzBhNjY0IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKQEAgLTY3MSw3ICs2NzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFjZXVubG9ja19tdWx0aXBsZV9mYWlsdXJlcyIgbXNnaWQ9Ijc1NDEzNzU4MzAyMjc5MjQyOSI+IkR1IGhhciBvdmVyc2tyZWRldCBncmVuc2VuIGZvciBvcHBsw6VzaW5nc2ZvcnPDuGsgbWVkIEFuc2lrdHNsw6VzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9wbHVnZ2VkX2luIiBtc2dpZD0iODA1Nzc2MjgyODM1NTU3MjMxNSI+IkxhZGVyLCA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+IkZ1bGx0IGxhZGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSI0NDc3MjY0ODQ5Mzg2ODUwMjY2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+IktvYmxlIHRpbCBlbiBiYXR0ZXJpbGFkZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+Ik1hbmdsZXIgU0lNLWtvcnQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIxNTE2NTkxOTYwOTU3OTE0NzQiPiJOZXR0YnJldHRldCBtYW5nbGVyIFNJTS1rb3J0LiI8L3N0cmluZz4KQEAgLTEwODgsNyArMTA4OCw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJpbWVfYWN0aW9uX2RlZmF1bHQiIG1zZ2lkPSIyODQwOTIxODg1NTU4MDQ1NzIxIj4iVXRmw7hyIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZGlhbF9udW1iZXJfdXNpbmciIG1zZ2lkPSI1Nzg5MTc2NDI1MTY3NTczNTg2Ij4iUmluZyBudW1tZXJldCJcbiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjcmVhdGVfY29udGFjdF91c2luZyIgbXNnaWQ9IjQ5NDc0MDUyMjY3ODgxMDQ1MzgiPiJMYWcga29udGFrdCJcbiJtZWQgbnVtbWVyZXQgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JXM8L3hsaWZmOmc+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iZ3JhbnRfY3JlZGVudGlhbHNfcGVybWlzc2lvbl9tZXNzYWdlX2hlYWRlciIgbXNnaWQ9IjIxMDYxMDM4MTc5Mzc4NTk2NjIiPiLDiW4gZWxsZXIgZmxlcmUgYXYgZGUgZsO4bGdlbmRlIGFwcGVuZSBiZXIgb20gdGlsbGF0ZWxzZSB0aWwgw6UgZsOlIHRpbGdhbmcgdGlsIGtvbnRvZW4gZGluIGZyYSBuw6UgYXYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZ3JhbnRfY3JlZGVudGlhbHNfcGVybWlzc2lvbl9tZXNzYWdlX2hlYWRlciIgbXNnaWQ9IjIxMDYxMDM4MTc5Mzc4NTk2NjIiPiJGw7hsZ2VuZGUgYXBwKGVyKSBiZXIgb20gdGlsZ2FuZyB0aWwga29udG9lbiBkaW4gZnJhIG7DpSBhdi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJncmFudF9jcmVkZW50aWFsc19wZXJtaXNzaW9uX21lc3NhZ2VfZm9vdGVyIiBtc2dpZD0iMzEyNTIxMTM0MzM3OTM3NjU2MSI+IlZpbCBkdSB0aWxsYXRlIGRldHRlPyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImdyYW50X3Blcm1pc3Npb25zX2hlYWRlcl90ZXh0IiBtc2dpZD0iNjg3NDQ5NzQwODIwMTgyNjcwOCI+IlRpbGdhbmdzZm9yZXNww7hyc2VsIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWxsb3ciIG1zZ2lkPSI3MjI1OTQ4ODExMjk2Mzg2NTUxIj4iVGlsbGF0Ijwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKaW5kZXggZDc3OTcwZC4uOTZkY2ZhMCAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sCkBAIC0yNiw4ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnaWdhYnl0ZVNob3J0IiBtc2dpZD0iMzI1OTg4MjQ1NTIxMjE5MzIxNCI+IkdCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idGVyYWJ5dGVTaG9ydCIgbXNnaWQ9IjIzMTYxMzAxODE1OTE4Njk2MiI+IlRCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGV0YWJ5dGVTaG9ydCIgbXNnaWQ9IjU2Mzc4MTY2ODAxNDQ5OTAyMTkiPiJQQiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBmaWxlU2l6ZVN1ZmZpeCAoOTE2NDI5Mjc5MTUwMDUzMTk0OSkgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImZpbGVTaXplU3VmZml4IiBtc2dpZD0iOTE2NDI5Mjc5MTUwMDUzMTk0OSI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiUxJHM8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJVTklUIj4lMiRzPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InVudGl0bGVkIiBtc2dpZD0iNDYzODk1Njk1NDg1Mjc4MjU3NiI+IiZsdDtCZXogbmF6d3kmZ3Q7Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXMiIG1zZ2lkPSI3ODk5ODI5NTE2MDQ4ODEzMjM3Ij4i4oCmIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZWxsaXBzaXNfdHdvX2RvdHMiIG1zZ2lkPSIxMjI4MDc4OTk0ODY2MDMwNzM2Ij4i4oClIjwvc3RyaW5nPgpAQCAtNjcyLDggKzY3MSw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJmYWNldW5sb2NrX211bHRpcGxlX2ZhaWx1cmVzIiBtc2dpZD0iNzU0MTM3NTgzMDIyNzkyNDI5Ij4iUHJ6ZWtyb2N6b25vIG1ha3N5bWFsbsSFIGxpY3pixJkgcHLDs2Igb2RibG9rb3dhbmlhIEZhY2UgVW5sb2NrLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjgwNTc3NjI4MjgzNTU1NzIzMTUiPiLFgWFkb3dhbmllICg8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iUEVSQ0VOVCI+JSU8L3hsaWZmOmc+KSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYcWCYWRvd2FueS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0ICg0NDc3MjY0ODQ5Mzg2ODUwMjY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+IlBvZMWCxIVjeiDFgmFkb3dhcmvEmS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQiIG1zZ2lkPSI3MzgxNDk5MjE3NzMyMjI3Mjk1Ij4iQnJhayBrYXJ0eSBTSU0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIxNTE2NTkxOTYwOTU3OTE0NzQiPiJCcmFrIGthcnR5IFNJTSB3IHRhYmxlY2llLiI8L3N0cmluZz4KQEAgLTcyMiwxMCArNzIwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiIG1zZ2lkPSI5OTIyODA3NTYyNTY1MzYwNDIiPiI/MTIzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWxwaGFfa2V5IiBtc2dpZD0iODAwMTA5NjE3NTE2NzQ4NTY0OSI+IkFCQyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FsdF9rZXkiIG1zZ2lkPSIxMjg0ODIwOTQyNjIwMjg4Njc4Ij4iQUxUIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfYW1wbSAoNDU4NDMzODA4MzUyOTM1NTk4MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2NhcF9hbXBtICgyMDgzNDY1OTkyOTQwNDQ0MzY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9hbXBtIiBtc2dpZD0iNDU4NDMzODA4MzUyOTM1NTk4MiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJBTVBNIj4lUDwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2NhcF9hbXBtIiBtc2dpZD0iMjA4MzQ2NTk5Mjk0MDQ0NDM2NiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJBTVBNIj4lcDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9mYWlsZWQiIG1zZ2lkPSI1NDEwMjcwMzI5MTE0MjEyMDQxIj4iTmlldWRhbnkgdGVzdCBmYWJyeWN6bnkiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub3Rfc3lzdGVtIiBtc2dpZD0iNDQzNTIwMTY1Njc2NzI3NjcyMyI+IkN6eW5ub8WbxIcgRkFDVE9SWV9URVNUIGplc3Qgb2JzxYJ1Z2l3YW5hIHR5bGtvIGRsYSBwYWtpZXTDs3cgemFpbnN0YWxvd2FueWNoIHcga2F0YWxvZ3UgL3N5c3RlbS9hcHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm9fYWN0aW9uIiBtc2dpZD0iODcyOTkxODc0Nzk5OTk4NTYxIj4iTmllIHpuYWxlemlvbm8gxbxhZG5lZ28gcGFraWV0dSwga3TDs3J5IHphcGV3bmlhIGR6aWHFgmFuaWUgRkFDVE9SWV9URVNULiI8L3N0cmluZz4KQEAgLTczNyw4ICs3MzMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjQ1OTUwNDY1MTU0MDAyNjg4ODEiPiJXc2thesOzd2thOiBkb3RrbmlqIGR3dWtyb3RuaWUsIGFieSBwb3dpxJlrc3p5xIcgbHViIHBvbW5pZWpzennEhy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF90aGlzX2Zvcm0iIG1zZ2lkPSI0NjE2NzU4ODQxMTU3ODE2Njc2Ij4iQXV0b3V6dXBlxYJuaWFuaWUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9hdXRvZmlsbCIgbXNnaWQ9IjcxMDM0OTUwNzAxODA1OTA4MTQiPiJVc3RhdyBhdXRvdXp1cGXFgm5pYW5pZSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yICg2MzUwMTQ1MTU0Nzc5NzA2NzcyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciIgbXNnaWQ9IjYzNTAxNDUxNTQ3Nzk3MDY3NzIiPiIgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X25hbWVfZm9ybWF0IiBtc2dpZD0iMzI2ODA0MTA1NDg5OTIxNDk0NSI+IiQxJDIkMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9zZXBhcmF0b3IiIG1zZ2lkPSI3NDgzMzA3ODkzMTcwMzI0MTI5Ij4iLCAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfZm9ybWF0IiBtc2dpZD0iNDg3NDQ1OTQ1NTc4NjgyNzM0NCI+IiQxJDIkMyI8L3N0cmluZz4KQEAgLTc3Myw4ICs3NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiJVbW/FvGxpd2lhIHBvc2lhZGFjem93aSBkb3N0xJlwIGRvIHBvcnTDs3cgc3plcmVnb3d5Y2ggcHJ6eSB1xbx5Y2l1IGludGVyZmVqc3UgQVBJIG5hcnrEmWR6aWEgU2VyaWFsTWFuYWdlci4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+IkRvc3TEmXAgZG8gZG9zdGF3Y8OzdyB0cmXFm2NpIHogemV3bsSFdHJ6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfYWNjZXNzQ29udGVudFByb3ZpZGVyc0V4dGVybmFsbHkiIG1zZ2lkPSI0NTQ0MzQ2NDg2Njk3ODUzNjg1Ij4iUG96d2FsYSBuYSBkb3N0xJlwIGRvIGRvc3Rhd2PDs3cgdHJlxZtjaSB6IHBvd8WCb2tpLiBUbyB1cHJhd25pZW5pZSBuaWUgcG93aW5ubyBiecSHIHBvdHJ6ZWJuZSB6d3lrxYJ5bSBhcGxpa2Fjam9tLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdXBkYXRlTG9jayIgbXNnaWQ9IjM1Mjc1NTgzNjY2MTY2ODA4ODkiPiJvZHJhZMW6IGF1dG9tYXR5Y3puZSBha3R1YWxpemFjamUgdXJ6xIVkemVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY191cGRhdGVMb2NrIiBtc2dpZD0iMTY1NTYyNTgzMjE2Njc3ODQ5MiI+IlVtb8W8bGl3aWEgcG9zaWFkYWN6b3dpIHBvaW5mb3Jtb3dhbmllIHN5c3RlbXUsIGtpZWR5IGLEmWR6aWUgZG9icnkgbW9tZW50IG5hIG5pZWludGVyYWt0eXduZSB1cnVjaG9taWVuaWUgcG9ub3duZSB3eW1hZ2FuZSBkbyB1YWt0dWFsbmllbmlhIHVyesSFZHplbmlhLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdXBkYXRlTG9jayIgbXNnaWQ9IjM1Mjc1NTgzNjY2MTY2ODA4ODkiPiJvZHJhZHphbmllIGF1dG9tYXR5Y3pueWNoIGFrdHVhbGl6YWNqaSB1cnrEhWR6ZW5pYSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4iVW1vxbxsaXdpYSBwb3NpYWRhY3pvd2kgcG9pbmZvcm1vd2FuaWUgc3lzdGVtdSwga2llZHkgYsSZZHppZSBkb2JyeSBtb21lbnQgbmEgcG9ub3duZSB1cnVjaG9taWVuaWUgd3ltYWdhbmUgZG8gdWFrdHVhbG5pZW5pYSB1cnrEhWR6ZW5pYS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJDenkgY2hjZXN6LCBhYnkgemFwYW1pxJl0YcSHIHRvIGhhc8WCbyB3IHByemVnbMSFZGFyY2U/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9ub3Rub3ciIG1zZ2lkPSI2Mzg5Njc1MzE2NzA2Njk5NzU4Ij4iTmllIHRlcmF6Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiJaYXBhbWnEmXRhaiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sCmluZGV4IDZhMDg0YzAuLmNhYzU4NmUgMTAwNjQ0Ci0tLSBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApAQCAtMjYsOCArMjYsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZ2lnYWJ5dGVTaG9ydCIgbXNnaWQ9IjMyNTk4ODI0NTUyMTIxOTMyMTQiPiJHTyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRlcmFieXRlU2hvcnQiIG1zZ2lkPSIyMzE2MTMwMTgxNTkxODY5NjIiPiJUTyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBldGFieXRlU2hvcnQiIG1zZ2lkPSI1NjM3ODE2NjgwMTQ0OTkwMjE5Ij4iUE8iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgZmlsZVNpemVTdWZmaXggKDkxNjQyOTI3OTE1MDA1MzE5NDkpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJmaWxlU2l6ZVN1ZmZpeCIgbXNnaWQ9IjkxNjQyOTI3OTE1MDA1MzE5NDkiPiI8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lMSRzPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iVU5JVCI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1bnRpdGxlZCIgbXNnaWQ9IjQ2Mzg5NTY5NTQ4NTI3ODI1NzYiPiImbHQ7RsSDcsSDIHRpdGx1Jmd0OyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzIiBtc2dpZD0iNzg5OTgyOTUxNjA0ODgxMzIzNyI+IuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzX3R3b19kb3RzIiBtc2dpZD0iMTIyODA3ODk5NDg2NjAzMDczNiI+IuKApSI8L3N0cmluZz4KQEAgLTY3Miw4ICs2NzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFjZXVubG9ja19tdWx0aXBsZV9mYWlsdXJlcyIgbXNnaWQ9Ijc1NDEzNzU4MzAyMjc5MjQyOSI+IlMtYSBkZXDEg8WfaXQgbnVtxINydWwgbWF4aW0gZGUgw65uY2VyY8SDcmkgcGVudHJ1IERlYmxvY2FyZSBmYWNpYWzEgyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjgwNTc3NjI4MjgzNTU1NzIzMTUiPiJTZSDDrm5jYXJjxIMsIDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2NoYXJnZWQiIG1zZ2lkPSI0OTM4OTMwNDU5NjIwOTg5OTcyIj4iw45uY8SDcmNhdMSDLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQgKDQ0NzcyNjQ4NDkzODY4NTAyNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSI0NDc3MjY0ODQ5Mzg2ODUwMjY2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+IkNvbmVjdGHFo2kgw65uY8SDcmPEg3RvcnVsLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCIgbXNnaWQ9IjczODE0OTkyMTc3MzIyMjcyOTUiPiJOaWNpdW4gY2FyZCBTSU0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlIiBwcm9kdWN0PSJ0YWJsZXQiIG1zZ2lkPSIxNTE2NTkxOTYwOTU3OTE0NzQiPiJOdSBleGlzdMSDIGNhcmQgU0lNIMOubiBjb21wdXRlcnVsIHRhYmxldCBQQy4iPC9zdHJpbmc+CkBAIC03MjIsMTAgKzcyMCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IiBtc2dpZD0iOTkyMjgwNzU2MjU2NTM2MDQyIj4iPzEyMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FscGhhX2tleSIgbXNnaWQ9IjgwMDEwOTYxNzUxNjc0ODU2NDkiPiJBQkMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHRfa2V5IiBtc2dpZD0iMTI4NDgyMDk0MjYyMDI4ODY3OCI+IkFMVCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2FtcG0gKDQ1ODQzMzgwODM1MjkzNTU5ODIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9jYXBfYW1wbSAoMjA4MzQ2NTk5Mjk0MDQ0NDM2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfYW1wbSIgbXNnaWQ9IjQ1ODQzMzgwODM1MjkzNTU5ODIiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iQU1QTSI+JVA8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9jYXBfYW1wbSIgbXNnaWQ9IjIwODM0NjU5OTI5NDA0NDQzNjYiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPiA8eGxpZmY6ZyBpZD0iQU1QTSI+JXA8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3RfZmFpbGVkIiBtc2dpZD0iNTQxMDI3MDMyOTExNDIxMjA0MSI+IlRlc3RhcmVhIGRlIGZhYnJpY8SDIG51IGEgcmV1xZ9pdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0iIG1zZ2lkPSI0NDM1MjAxNjU2NzY3Mjc2NzIzIj4iQWPFo2l1bmVhIEZBQ1RPUllfVEVTVCBlc3RlIGFjY2VwdGF0xIMgZG9hciBwZW50cnUgcGFjaGV0ZWxlIGluc3RhbGF0ZSDDrm4gL3N5c3RlbS9hcHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm9fYWN0aW9uIiBtc2dpZD0iODcyOTkxODc0Nzk5OTk4NTYxIj4iTnUgcy1hIGfEg3NpdCBuaWNpdW4gcGFjaGV0IGNhcmUgc8SDIG9mZXJlIGFjxaNpdW5lYSBGQUNUT1JZX1RFU1QuIjwvc3RyaW5nPgpAQCAtNzM3LDggKzczMyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iNDU5NTA0NjUxNTQwMDI2ODg4MSI+IlNmYXQ6IG3Eg3JpxaNpIMWfaSBtaWPFn29yYcWjaSBwcmluIGR1YmzEgyBhdGluZ2VyZS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF90aGlzX2Zvcm0iIG1zZ2lkPSI0NjE2NzU4ODQxMTU3ODE2Njc2Ij4iQXV0b21hdCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNldHVwX2F1dG9maWxsIiBtc2dpZD0iNzEwMzQ5NTA3MDE4MDU5MDgxNCI+IkNvbmYuQ29tcGwuYXV0by4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciAoNjM1MDE0NTE1NDc3OTcwNjc3MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IiIG1zZ2lkPSI2MzUwMTQ1MTU0Nzc5NzA2NzcyIj4iICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9uYW1lX2Zvcm1hdCIgbXNnaWQ9IjMyNjgwNDEwNTQ4OTkyMTQ5NDUiPiIkMSQyJDMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfc2VwYXJhdG9yIiBtc2dpZD0iNzQ4MzMwNzg5MzE3MDMyNDEyOSI+IiwgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X2Zvcm1hdCIgbXNnaWQ9IjQ4NzQ0NTk0NTU3ODY4MjczNDQiPiIkMSQyJDMiPC9zdHJpbmc+CkBAIC03NzMsMTAgKzc2OCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19zZXJpYWxQb3J0IiBtc2dpZD0iMjk5MTYzOTk4NTIyNDU5ODE5MyI+IlBlcm1pdGUgcG9zZXNvcnVsdWkgYWNjZXN1bCBsYSBwb3J0dXJpbGUgc2VyaWFsIHV0aWxpesOibmQgQVBJLXVsIFNlcmlhbE1hbmFnZXIuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiJhY2Nlc2HFo2kgZnVybml6LiBkZSBjb27Fo2luLiBkaW4gZXh0ZXJpb3IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiJQZXJtaXRlIGRlxaNpbsSDdG9ydWx1aSBzxIMgYWNjZXNlemUgZnVybml6b3JpaSBkZSBjb27Fo2ludXQgZGluIGludGVyZmHFo8SDLiBOdSBhciB0cmVidWkgc8SDIGZpZSBuZWNlc2FyxIMgcGVudHJ1IGFwbGljYcWjaWlsZSBub3JtYWxlLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBwZXJtbGFiX3VwZGF0ZUxvY2sgKDM1Mjc1NTgzNjY2MTY2ODA4ODkpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWRlc2NfdXBkYXRlTG9jayAoMTY1NTYyNTgzMjE2Njc3ODQ5MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1sYWJfdXBkYXRlTG9jayIgbXNnaWQ9IjM1Mjc1NTgzNjY2MTY2ODA4ODkiPiJkZXNjdXJhai4gYWN0dWFsLiBhdXRvbS4gYWxlIGRpc3Bveml0aXYuIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiJQZXJtaXRlIHByb3ByaWV0YXJ1bHVpIHPEgyBvZmVyZSBzaXN0ZW11bHVpIGluZm9ybWHFo2lpIGN1IHByaXZpcmUgbGEgbW9tZW50dWwgb3BvcnR1biBwZW50cnUgbyByZXBvcm5pcmUgbm9uaW50ZXJhY3RpdsSDIMOubiBzY29wdWwgdHJlY2VyaWkgZGlzcG96aXRpdnVsdWkgbGEgbyB2ZXJzaXVuZSBzdXBlcmlvYXLEgy4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiJEb3JpxaNpIGNhIGJyb3dzZXJ1bCBzxIMgcmXFo2luxIMgYWNlYXN0xIMgcGFyb2zEgz8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiJOdSBhY3VtIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9yZW1lbWJlciIgbXNnaWQ9IjY0OTE4Nzk2Nzg5OTY3NDk0NjYiPiJSZcWjaW5lxaNpIjwvc3RyaW5nPgpkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKaW5kZXggZGViODEwZi4uM2E1NTRkNiAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sCkBAIC0yNiw4ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJnaWdhYnl0ZVNob3J0IiBtc2dpZD0iMzI1OTg4MjQ1NTIxMjE5MzIxNCI+ItCT0JEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXJhYnl0ZVNob3J0IiBtc2dpZD0iMjMxNjEzMDE4MTU5MTg2OTYyIj4iVNCRIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGV0YWJ5dGVTaG9ydCIgbXNnaWQ9IjU2Mzc4MTY2ODAxNDQ5OTAyMTkiPiLQn9CRIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbGVTaXplU3VmZml4ICg5MTY0MjkyNzkxNTAwNTMxOTQ5KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZmlsZVNpemVTdWZmaXgiIG1zZ2lkPSI5MTY0MjkyNzkxNTAwNTMxOTQ5Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JTEkczwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlVOSVQiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O9CR0LXQtyDQvdCw0LfQstCw0L3QuNGPJmd0OyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzIiBtc2dpZD0iNzg5OTgyOTUxNjA0ODgxMzIzNyI+IuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzX3R3b19kb3RzIiBtc2dpZD0iMTIyODA3ODk5NDg2NjAzMDczNiI+Ii4uLiI8L3N0cmluZz4KQEAgLTY3Miw4ICs2NzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFjZXVubG9ja19tdWx0aXBsZV9mYWlsdXJlcyIgbXNnaWQ9Ijc1NDEzNzU4MzAyMjc5MjQyOSI+ItCS0YHQtSDQv9C+0L/Ri9GC0LrQuCDQstC+0LnRgtC4INGBINC/0L7QvNC+0YnRjNGOINCk0LXQudGB0LrQvtC90YLRgNC+0LvRjyDQuNGB0L/QvtC70YzQt9C+0LLQsNC90YsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4i0JjQtNC10YIg0LfQsNGA0Y/QtNC60LAgKDx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4pIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9jaGFyZ2VkIiBtc2dpZD0iNDkzODkzMDQ1OTYyMDk4OTk3MiI+ItCR0LDRgtCw0YDQtdGPINC30LDRgNGP0LbQtdC90LAiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0ICg0NDc3MjY0ODQ5Mzg2ODUwMjY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+ItCf0L7QtNC60LvRjtGH0LjRgtC1INC30LDRgNGP0LTQvdC+0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9taXNzaW5nX3NpbV9tZXNzYWdlX3Nob3J0IiBtc2dpZD0iNzM4MTQ5OTIxNzczMjIyNzI5NSI+ItCd0LXRgiBTSU0t0LrQsNGA0YLRiyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTUxNjU5MTk2MDk1NzkxNDc0Ij4iU0lNLdC60LDRgNGC0LAg0L3QtSDRg9GB0YLQsNC90L7QstC70LXQvdCwLiI8L3N0cmluZz4KQEAgLTcyMiwxMCArNzIwLDggQEAKICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX3N5bWJvbF9rZXkiIG1zZ2lkPSI5OTIyODA3NTYyNTY1MzYwNDIiPiI/MTIzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWxwaGFfa2V5IiBtc2dpZD0iODAwMTA5NjE3NTE2NzQ4NTY0OSI+ItCQ0JHQkiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FsdF9rZXkiIG1zZ2lkPSIxMjg0ODIwOTQyNjIwMjg4Njc4Ij4iQUxUIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfYW1wbSAoNDU4NDMzODA4MzUyOTM1NTk4MikgLS0+Ci0gICAgPHNraXAgLz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2NhcF9hbXBtICgyMDgzNDY1OTkyOTQwNDQ0MzY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9hbXBtIiBtc2dpZD0iNDU4NDMzODA4MzUyOTM1NTk4MiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJBTVBNIj4lUDwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2NhcF9hbXBtIiBtc2dpZD0iMjA4MzQ2NTk5Mjk0MDQ0NDM2NiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJBTVBNIj4lcDwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9mYWlsZWQiIG1zZ2lkPSI1NDEwMjcwMzI5MTE0MjEyMDQxIj4i0J3QtSDRg9C00LDQu9C+0YHRjCDQv9GA0L7QstC10YHRgtC4INGB0YLQsNC90LTQsNGA0YLQvdGL0Lkg0YLQtdGB0YIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub3Rfc3lzdGVtIiBtc2dpZD0iNDQzNTIwMTY1Njc2NzI3NjcyMyI+ItCU0LXQudGB0YLQstC40LUgRkFDVE9SWV9URVNUINC/0L7QtNC00LXRgNC20LjQstCw0LXRgtGB0Y8g0YLQvtC70YzQutC+INC00LvRjyDQv9Cw0LrQtdGC0L7Qsiwg0YPRgdGC0LDQvdC+0LLQu9C10L3QvdGL0YUg0LIgL3N5c3RlbS9hcHAuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm9fYWN0aW9uIiBtc2dpZD0iODcyOTkxODc0Nzk5OTk4NTYxIj4i0J/QsNC60LXRgiwg0L7QsdC10YHQv9C10YfQuNCy0LDRjtGJ0LjQuSDQtNC10LnRgdGC0LLQuNC1IEZBQ1RPUllfVEVTVCwg0L3QtSDQvdCw0LnQtNC10L0uIjwvc3RyaW5nPgpAQCAtNzM3LDggKzczMyw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJkb3VibGVfdGFwX3RvYXN0IiBtc2dpZD0iNDU5NTA0NjUxNTQwMDI2ODg4MSI+ItCh0L7QstC10YI6INC90LDQttC80LjRgtC1INC00LLQsNC20LTRiywg0YfRgtC+0LHRiyDRg9Cy0LXQu9C40YfQuNGC0Ywg0Lgg0YPQvNC10L3RjNGI0LjRgtGMINC80LDRgdGI0YLQsNCxLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX3RoaXNfZm9ybSIgbXNnaWQ9IjQ2MTY3NTg4NDExNTc4MTY2NzYiPiLQkNCy0YLQvtC30LDQv9C+0LvQvdC10L3QuNC1Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0dXBfYXV0b2ZpbGwiIG1zZ2lkPSI3MTAzNDk1MDcwMTgwNTkwODE0Ij4i0J3QsNGB0YLRgNC+0LjRgtGMINCw0LLRgtC+0LfQsNC/0L7Qu9C90LXQvdC40LUiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciAoNjM1MDE0NTE1NDc3OTcwNjc3MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IiIG1zZ2lkPSI2MzUwMTQ1MTU0Nzc5NzA2NzcyIj4iICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9uYW1lX2Zvcm1hdCIgbXNnaWQ9IjMyNjgwNDEwNTQ4OTkyMTQ5NDUiPiIkMSQyJDMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfc2VwYXJhdG9yIiBtc2dpZD0iNzQ4MzMwNzg5MzE3MDMyNDEyOSI+IiwgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X2Zvcm1hdCIgbXNnaWQ9IjQ4NzQ0NTk0NTU3ODY4MjczNDQiPiIkMSQyJDMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAppbmRleCA0ZDRjOWNkLi5kYWEzMjFkIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwKQEAgLTI2LDggKzI2LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImdpZ2FieXRlU2hvcnQiIG1zZ2lkPSIzMjU5ODgyNDU1MjEyMTkzMjE0Ij4iR0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXJhYnl0ZVNob3J0IiBtc2dpZD0iMjMxNjEzMDE4MTU5MTg2OTYyIj4iVEIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXRhYnl0ZVNob3J0IiBtc2dpZD0iNTYzNzgxNjY4MDE0NDk5MDIxOSI+IlBCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbGVTaXplU3VmZml4ICg5MTY0MjkyNzkxNTAwNTMxOTQ5KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZmlsZVNpemVTdWZmaXgiIG1zZ2lkPSI5MTY0MjkyNzkxNTAwNTMxOTQ5Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JTEkczwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlVOSVQiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O0JleiBtZW5hJmd0OyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzIiBtc2dpZD0iNzg5OTgyOTUxNjA0ODgxMzIzNyI+IuKApiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImVsbGlwc2lzX3R3b19kb3RzIiBtc2dpZD0iMTIyODA3ODk5NDg2NjAzMDczNiI+IuKApSI8L3N0cmluZz4KQEAgLTY3Miw4ICs2NzEsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZmFjZXVubG9ja19tdWx0aXBsZV9mYWlsdXJlcyIgbXNnaWQ9Ijc1NDEzNzU4MzAyMjc5MjQyOSI+IlByZWtyb8SNaWxpIHN0ZSBtYXhpbcOhbG55IHBvdm9sZW7DvSBwb8SNZXQgcG9rdXNvdiBvIG9kb21rbnV0aWUgdHbDoXJvdSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fcGx1Z2dlZF9pbiIgbXNnaWQ9IjgwNTc3NjI4MjgzNTU1NzIzMTUiPiJQcmViaWVoYSBuYWLDrWphbmllLCA8eGxpZmY6ZyBpZD0iTlVNQkVSIj4lZDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJOYWJpdMOpLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQgKDQ0NzcyNjQ4NDkzODY4NTAyNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSI0NDc3MjY0ODQ5Mzg2ODUwMjY2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+IlByaXBvanRlIG5hYsOtamHEjWt1LiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCIgbXNnaWQ9IjczODE0OTkyMTc3MzIyMjcyOTUiPiJOaWUgamUgdmxvxb5lbsOhIGthcnRhIFNJTS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2UiIHByb2R1Y3Q9InRhYmxldCIgbXNnaWQ9IjE1MTY1OTE5NjA5NTc5MTQ3NCI+IlYgdGFibGV0ZSBuaWUgamUgxb5pYWRuYSBrYXJ0YSBTSU0uIjwvc3RyaW5nPgpAQCAtNzIyLDEwICs3MjAsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfc3ltYm9sX2tleSIgbXNnaWQ9Ijk5MjI4MDc1NjI1NjUzNjA0MiI+Ij8xMjMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHBoYV9rZXkiIG1zZ2lkPSI4MDAxMDk2MTc1MTY3NDg1NjQ5Ij4iQUJDIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfa2V5Ym9hcmRfbGFiZWxfYWx0X2tleSIgbXNnaWQ9IjEyODQ4MjA5NDI2MjAyODg2NzgiPiJBTFQiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9hbXBtICg0NTg0MzM4MDgzNTI5MzU1OTgyKSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGhvdXJfY2FwX2FtcG0gKDIwODM0NjU5OTI5NDA0NDQzNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2FtcG0iIG1zZ2lkPSI0NTg0MzM4MDgzNTI5MzU1OTgyIj4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IkFNUE0iPiVQPC94bGlmZjpnPiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfY2FwX2FtcG0iIG1zZ2lkPSIyMDgzNDY1OTkyOTQwNDQ0MzY2Ij4iPHhsaWZmOmcgaWQ9IkhPVVIiPiUtbDwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IkFNUE0iPiVwPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X2ZhaWxlZCIgbXNnaWQ9IjU0MTAyNzAzMjkxMTQyMTIwNDEiPiJUb3bDoXJlbnNrw70gdGVzdCB6bHloYWwiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub3Rfc3lzdGVtIiBtc2dpZD0iNDQzNTIwMTY1Njc2NzI3NjcyMyI+IlRlc3QgRkFDVE9SWV9URVNUIGplIG1vxb5uw6kgdXNrdXRvxI1uacWlIGliYSBwcmkgYmFsw63EjWtvY2ggbmFpbsWhdGFsb3ZhbsO9Y2ggdiBwcmllxI1pbmt1IC9zeXN0ZW0vYXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vX2FjdGlvbiIgbXNnaWQ9Ijg3Mjk5MTg3NDc5OTk5ODU2MSI+Ik5lYm9sIG7DoWpkZW7DvSDFvmlhZG55IGJhbMOtxI1layB1bW/FvsWIdWrDumNpIHRlc3QgRkFDVE9SWV9URVNULiI8L3N0cmluZz4KQEAgLTczNyw4ICs3MzMsNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iZG91YmxlX3RhcF90b2FzdCIgbXNnaWQ9IjQ1OTUwNDY1MTU0MDAyNjg4ODEiPiJUaXA6IER2b2ppdMO9bSBrbGVwbnV0w61tIG3DtMW+ZXRlIHpvYnJhemVuaWUgcHJpYmzDrcW+acWlIGFsZWJvIG9kZGlhbGnFpS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF90aGlzX2Zvcm0iIG1zZ2lkPSI0NjE2NzU4ODQxMTU3ODE2Njc2Ij4iQXV0LmRvcC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXR1cF9hdXRvZmlsbCIgbXNnaWQ9IjcxMDM0OTUwNzAxODA1OTA4MTQiPiJOYXN0LiBBdXQuIGRvcC4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciAoNjM1MDE0NTE1NDc3OTcwNjc3MikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IiIG1zZ2lkPSI2MzUwMTQ1MTU0Nzc5NzA2NzcyIj4iICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9uYW1lX2Zvcm1hdCIgbXNnaWQ9IjMyNjgwNDEwNTQ4OTkyMTQ5NDUiPiIkMSQyJDMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfc2VwYXJhdG9yIiBtc2dpZD0iNzQ4MzMwNzg5MzE3MDMyNDEyOSI+IiwgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X2Zvcm1hdCIgbXNnaWQ9IjQ4NzQ0NTk0NTU3ODY4MjczNDQiPiIkMSQyJDMiPC9zdHJpbmc+CmRpZmYgLS1naXQgYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAppbmRleCAyZWQyYWQ2Li4xMzA1M2FiIDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwKQEAgLTI2LDggKzI2LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImdpZ2FieXRlU2hvcnQiIG1zZ2lkPSIzMjU5ODgyNDU1MjEyMTkzMjE0Ij4iR0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXJhYnl0ZVNob3J0IiBtc2dpZD0iMjMxNjEzMDE4MTU5MTg2OTYyIj4iVEIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXRhYnl0ZVNob3J0IiBtc2dpZD0iNTYzNzgxNjY4MDE0NDk5MDIxOSI+IlBCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbGVTaXplU3VmZml4ICg5MTY0MjkyNzkxNTAwNTMxOTQ5KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZmlsZVNpemVTdWZmaXgiIG1zZ2lkPSI5MTY0MjkyNzkxNTAwNTMxOTQ5Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JTEkczwveGxpZmY6Zz48eGxpZmY6ZyBpZD0iVU5JVCI+JTIkczwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1bnRpdGxlZCIgbXNnaWQ9IjQ2Mzg5NTY5NTQ4NTI3ODI1NzYiPiImbHQ7SGFpbmEgamluYSZndDsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpcyIgbXNnaWQ9Ijc4OTk4Mjk1MTYwNDg4MTMyMzciPiLigKYiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpc190d29fZG90cyIgbXNnaWQ9IjEyMjgwNzg5OTQ4NjYwMzA3MzYiPiLigKUiPC9zdHJpbmc+CkBAIC02NzIsOCArNjcxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY2V1bmxvY2tfbXVsdGlwbGVfZmFpbHVyZXMiIG1zZ2lkPSI3NTQxMzc1ODMwMjI3OTI0MjkiPiJNYWphcmliaW8geWEgSnV1IHlhIEt1ZnVuZ3VhIFVzbyB5YW1lemlkaXNod2EiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4iSW5hY2hhamkgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiJJbWVjaGFqaXdhLiI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQgKDQ0NzcyNjQ4NDkzODY4NTAyNjYpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2JhdHRlcnlfc2hvcnQiIG1zZ2lkPSI0NDc3MjY0ODQ5Mzg2ODUwMjY2Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbG93X2JhdHRlcnkiIG1zZ2lkPSIxNDgyODczOTgxOTE5MjQ5NzQwIj4iVW5nYW5pc2hhIGNoYWphIHlha28iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX21pc3Npbmdfc2ltX21lc3NhZ2Vfc2hvcnQiIG1zZ2lkPSI3MzgxNDk5MjE3NzMyMjI3Mjk1Ij4iSGFrdW5hIFNJTSBrYWRpLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTUxNjU5MTk2MDk1NzkxNDc0Ij4iSGFrdW5hIFNJTSBrYWRpIGthdGlrYSBrb21weXV0YSBuZG9nby4iPC9zdHJpbmc+CkBAIC03MjIsMTAgKzcyMCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IiBtc2dpZD0iOTkyMjgwNzU2MjU2NTM2MDQyIj4iPzEyMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FscGhhX2tleSIgbXNnaWQ9IjgwMDEwOTYxNzUxNjc0ODU2NDkiPiJBQkMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHRfa2V5IiBtc2dpZD0iMTI4NDgyMDk0MjYyMDI4ODY3OCI+IkFMVCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2FtcG0gKDQ1ODQzMzgwODM1MjkzNTU5ODIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9jYXBfYW1wbSAoMjA4MzQ2NTk5Mjk0MDQ0NDM2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfYW1wbSIgbXNnaWQ9IjQ1ODQzMzgwODM1MjkzNTU5ODIiPiI8eGxpZmY6ZyBpZD0iSE9VUiI+JS1sPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJBTVBNIj4lUDwveGxpZmY6Zz4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJob3VyX2NhcF9hbXBtIiBtc2dpZD0iMjA4MzQ2NTk5Mjk0MDQ0NDM2NiI+Ijx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IkFNUE0iPiVwPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X2ZhaWxlZCIgbXNnaWQ9IjU0MTAyNzAzMjkxMTQyMTIwNDEiPiJKYXJpYmlvIGxhIGtpd2FuZGEgbGltZXNoaW5kaWthbmEiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJmYWN0b3J5dGVzdF9ub3Rfc3lzdGVtIiBtc2dpZD0iNDQzNTIwMTY1Njc2NzI3NjcyMyI+IlRlbmRvIGxhIEpBUklCSU9fTEEgS0lXQU5EQSAgbGluYWhpbWlsaXdhIHR1IGt3YSBmdXJ1c2hpIHppbGl6b3Nha2luaXNod2Ega2F0aWthIC9zeXN0ZW0vYXBwLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vX2FjdGlvbiIgbXNnaWQ9Ijg3Mjk5MTg3NDc5OTk5ODU2MSI+Ikhha3VuYSBmdXJ1c2hpIGxpbGlsb3BhdGlrYW5hIGFtYmFsbyBsaW5hdG9hIHRlbmRvIGxhIEpBUklCSU9fTEEgS0lXQU5EQS4iPC9zdHJpbmc+CkBAIC03MzcsOCArNzMzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSI0NTk1MDQ2NTE1NDAwMjY4ODgxIj4iS2lkb2tlem86IEdvbmdhIG1hcmEgbWJpbGkgaWxpIGt1a3V6YSBuZGFuaSBuYSBuamUuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIiBtc2dpZD0iNDYxNjc1ODg0MTE1NzgxNjY3NiI+Ik1qYXpvLW90b21hdGlraSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNldHVwX2F1dG9maWxsIiBtc2dpZD0iNzEwMzQ5NTA3MDE4MDU5MDgxNCI+IlNhbmlkaSBNamF6by1vdG9tYXRpIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGF1dG9maWxsX2FkZHJlc3NfbmFtZV9zZXBhcmF0b3IgKDYzNTAxNDUxNTQ3Nzk3MDY3NzIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yIiBtc2dpZD0iNjM1MDE0NTE1NDc3OTcwNjc3MiI+IiAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhdXRvZmlsbF9hZGRyZXNzX3N1bW1hcnlfbmFtZV9mb3JtYXQiIG1zZ2lkPSIzMjY4MDQxMDU0ODk5MjE0OTQ1Ij4iJDEkMiQzIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X3NlcGFyYXRvciIgbXNnaWQ9Ijc0ODMzMDc4OTMxNzAzMjQxMjkiPiIsICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9mb3JtYXQiIG1zZ2lkPSI0ODc0NDU5NDU1Nzg2ODI3MzQ0Ij4iJDEkMiQzIjwvc3RyaW5nPgpAQCAtNzczLDEwICs3NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiJJbmFydWh1c3UgbW1pbGlraSBrdWZpa2lhIHZpdHVvIHRhbWJ1bGlzaGkga3dhIGt1dHVtaWEgS2lzaW1hbWl6aVRhbWJ1bGlzaGkgY2hhIEFQSS4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX2FjY2Vzc0NvbnRlbnRQcm92aWRlcnNFeHRlcm5hbGx5IiBtc2dpZD0iNTA3Nzc3NDI5Nzk0MzQwOTI4NSI+ImZpa2lhIHdhdG9hIGh1ZHVtYSBuamUiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiJJbmFydWh1c3UgbW1pbGlraSBrdWZpa2lhIHdhdG9hIGh1ZHVtYSAga3V0b2thIGt3YSBvbnllc2hvLiBIYWlmYWkga3VoaXRhamlrYSBrYW13ZSBrd2EgcHJvZ3JhbXUgemEga2F3YWlkYS4iPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl91cGRhdGVMb2NrICgzNTI3NTU4MzY2NjE2NjgwODg5KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3VwZGF0ZUxvY2sgKDE2NTU2MjU4MzIxNjY3Nzg0OTIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4icGluZ2EgdXNhc2lzaGFqaSBraWZhYSBraW90b21hdGlraSI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBlcm1kZXNjX3VwZGF0ZUxvY2siIG1zZ2lkPSIxNjU1NjI1ODMyMTY2Nzc4NDkyIj4iSW5hcnVodXN1IG1taWxpa2kga3V0b2EgbWFlbGV6byBrd2EgbWZ1bW8ga3VodXN1IG5pIGxpbmkgaXRha3V3YSB3YWthdGkgbXp1cmkgd2EgdXdhc2hhamkgdXB5YSB1c2lvdGFndXNhbmEgaWxpIGt1cGFuZGlzaGEgZ3JlZGkga2lmYWEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9tZXNzYWdlIiBtc2dpZD0iNzY3MzQ0Njg3MTM5MTk1NzkwIj4iVW5hdGFrYSBrdXZpbmphcmkgaWxpIHVrdW1idWtlIG5lbm9zaXJpIGhpbGk/Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2F2ZV9wYXNzd29yZF9ub3Rub3ciIG1zZ2lkPSI2Mzg5Njc1MzE2NzA2Njk5NzU4Ij4iU2kgU2FzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNhdmVfcGFzc3dvcmRfcmVtZW1iZXIiIG1zZ2lkPSI2NDkxODc5Njc4OTk2NzQ5NDY2Ij4iS3VtYnVrYSI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKaW5kZXggNGFiYTY3Yy4uMjY2NGFkMyAxMDA2NDQKLS0tIGEvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKQEAgLTI2LDggKzI2LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImdpZ2FieXRlU2hvcnQiIG1zZ2lkPSIzMjU5ODgyNDU1MjEyMTkzMjE0Ij4iR0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ0ZXJhYnl0ZVNob3J0IiBtc2dpZD0iMjMxNjEzMDE4MTU5MTg2OTYyIj4iVEIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXRhYnl0ZVNob3J0IiBtc2dpZD0iNTYzNzgxNjY4MDE0NDk5MDIxOSI+IlBCIjwvc3RyaW5nPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIGZpbGVTaXplU3VmZml4ICg5MTY0MjkyNzkxNTAwNTMxOTQ5KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iZmlsZVNpemVTdWZmaXgiIG1zZ2lkPSI5MTY0MjkyNzkxNTAwNTMxOTQ5Ij4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JTEkczwveGxpZmY6Zz4gPHhsaWZmOmcgaWQ9IlVOSVQiPiUyJHM8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idW50aXRsZWQiIG1zZ2lkPSI0NjM4OTU2OTU0ODUyNzgyNTc2Ij4iJmx0O+acquWRveWQjSZndDsiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpcyIgbXNnaWQ9Ijc4OTk4Mjk1MTYwNDg4MTMyMzciPiIuLi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJlbGxpcHNpc190d29fZG90cyIgbXNnaWQ9IjEyMjgwNzg5OTQ4NjYwMzA3MzYiPiLigKUiPC9zdHJpbmc+CkBAIC02NzIsOCArNjcxLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImZhY2V1bmxvY2tfbXVsdGlwbGVfZmFpbHVyZXMiIG1zZ2lkPSI3NTQxMzc1ODMwMjI3OTI0MjkiPiLlt7LotoXov4figJzkurrohLjop6PplIHigJ3lsJ3or5XmrKHmlbDkuIrpmZAiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX3BsdWdnZWRfaW4iIG1zZ2lkPSI4MDU3NzYyODI4MzU1NTcyMzE1Ij4i5q2j5Zyo5YWF55S177yMPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+PHhsaWZmOmcgaWQ9IlBFUkNFTlQiPiUlPC94bGlmZjpnPiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fY2hhcmdlZCIgbXNnaWQ9IjQ5Mzg5MzA0NTk2MjA5ODk5NzIiPiLlt7LlhYXmu6HjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgbG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0ICg0NDc3MjY0ODQ5Mzg2ODUwMjY2KSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0ibG9ja3NjcmVlbl9iYXR0ZXJ5X3Nob3J0IiBtc2dpZD0iNDQ3NzI2NDg0OTM4Njg1MDI2NiI+Ijx4bGlmZjpnIGlkPSJOVU1CRVIiPiVkPC94bGlmZjpnPjx4bGlmZjpnIGlkPSJQRVJDRU5UIj4lJTwveGxpZmY6Zz4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJsb2Nrc2NyZWVuX2xvd19iYXR0ZXJ5IiBtc2dpZD0iMTQ4Mjg3Mzk4MTkxOTI0OTc0MCI+Iui/nuaOpeaCqOeahOWFheeUteWZqOOAgiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZV9zaG9ydCIgbXNnaWQ9IjczODE0OTkyMTc3MzIyMjcyOTUiPiLmsqHmnIkgU0lNIOWNoSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImxvY2tzY3JlZW5fbWlzc2luZ19zaW1fbWVzc2FnZSIgcHJvZHVjdD0idGFibGV0IiBtc2dpZD0iMTUxNjU5MTk2MDk1NzkxNDc0Ij4i5bmz5p2/55S16ISR5Lit5rKh5pyJIFNJTSDljaHjgIIiPC9zdHJpbmc+CkBAIC03MjIsMTAgKzcyMCw4IEBACiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9zeW1ib2xfa2V5IiBtc2dpZD0iOTkyMjgwNzU2MjU2NTM2MDQyIj4iPzEyMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2tleWJvYXJkX2xhYmVsX2FscGhhX2tleSIgbXNnaWQ9IjgwMDEwOTYxNzUxNjc0ODU2NDkiPiJBQkMiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9rZXlib2FyZF9sYWJlbF9hbHRfa2V5IiBtc2dpZD0iMTI4NDgyMDk0MjYyMDI4ODY3OCI+IkFMVCI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBob3VyX2FtcG0gKDQ1ODQzMzgwODM1MjkzNTU5ODIpIC0tPgotICAgIDxza2lwIC8+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgaG91cl9jYXBfYW1wbSAoMjA4MzQ2NTk5Mjk0MDQ0NDM2NikgLS0+Ci0gICAgPHNraXAgLz4KKyAgICA8c3RyaW5nIG5hbWU9ImhvdXJfYW1wbSIgbXNnaWQ9IjQ1ODQzMzgwODM1MjkzNTU5ODIiPiI8eGxpZmY6ZyBpZD0iQU1QTSI+JVA8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+Ijwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iaG91cl9jYXBfYW1wbSIgbXNnaWQ9IjIwODM0NjU5OTI5NDA0NDQzNjYiPiI8eGxpZmY6ZyBpZD0iQU1QTSI+JXA8L3hsaWZmOmc+IDx4bGlmZjpnIGlkPSJIT1VSIj4lLWw8L3hsaWZmOmc+Ijwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3RfZmFpbGVkIiBtc2dpZD0iNTQxMDI3MDMyOTExNDIxMjA0MSI+IuWHuuWOgua1i+ivleWksei0pSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImZhY3Rvcnl0ZXN0X25vdF9zeXN0ZW0iIG1zZ2lkPSI0NDM1MjAxNjU2NzY3Mjc2NzIzIj4i5Y+q5pyJ5ZyoIC9zeXN0ZW0vYXBwIOS4reWuieijheeahOWMheaUr+aMgSBGQUNUT1JZX1RFU1Qg5pON5L2c44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iZmFjdG9yeXRlc3Rfbm9fYWN0aW9uIiBtc2dpZD0iODcyOTkxODc0Nzk5OTk4NTYxIj4i5pyq5Y+R546w5pSv5oyBIEZBQ1RPUllfVEVTVCDmk43kvZznmoTljIXjgIIiPC9zdHJpbmc+CkBAIC03MzcsOCArNzMzLDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImRvdWJsZV90YXBfdG9hc3QiIG1zZ2lkPSI0NTk1MDQ2NTE1NDAwMjY4ODgxIj4i5o+Q56S677ya54K55oyJ5Lik5qyh5Y+v5pS+5aSn5oiW57yp5bCP44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfdGhpc19mb3JtIiBtc2dpZD0iNDYxNjc1ODg0MTE1NzgxNjY3NiI+IuiHquWKqOWhq+WFhSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNldHVwX2F1dG9maWxsIiBtc2dpZD0iNzEwMzQ5NTA3MDE4MDU5MDgxNCI+Iuiuvue9ruiHquWKqOWhq+WFhSI8L3N0cmluZz4KLSAgICA8IS0tIG5vIHRyYW5zbGF0aW9uIGZvdW5kIGZvciBhdXRvZmlsbF9hZGRyZXNzX25hbWVfc2VwYXJhdG9yICg2MzUwMTQ1MTU0Nzc5NzA2NzcyKSAtLT4KLSAgICA8c2tpcCAvPgorICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19uYW1lX3NlcGFyYXRvciIgbXNnaWQ9IjYzNTAxNDUxNTQ3Nzk3MDY3NzIiPiIgIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYXV0b2ZpbGxfYWRkcmVzc19zdW1tYXJ5X25hbWVfZm9ybWF0IiBtc2dpZD0iMzI2ODA0MTA1NDg5OTIxNDk0NSI+IiQxJDIkMyI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9zZXBhcmF0b3IiIG1zZ2lkPSI3NDgzMzA3ODkzMTcwMzI0MTI5Ij4i77yMICI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImF1dG9maWxsX2FkZHJlc3Nfc3VtbWFyeV9mb3JtYXQiIG1zZ2lkPSI0ODc0NDU5NDU1Nzg2ODI3MzQ0Ij4iJDEkMiQzIjwvc3RyaW5nPgpAQCAtNzczLDEwICs3NjgsOCBAQAogICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2Nfc2VyaWFsUG9ydCIgbXNnaWQ9IjI5OTE2Mzk5ODUyMjQ1OTgxOTMiPiLlhYHorrjmjIHmnInkurrkvb/nlKggU2VyaWFsTWFuYWdlciBBUEkg6K6/6Zeu5Liy6KGM56uv5Y+j44CCIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0icGVybWxhYl9hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjUwNzc3NzQyOTc5NDM0MDkyODUiPiLku47lpJbpg6jorr/pl67lhoXlrrnmj5DkvpvnqIvluo8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwZXJtZGVzY19hY2Nlc3NDb250ZW50UHJvdmlkZXJzRXh0ZXJuYWxseSIgbXNnaWQ9IjQ1NDQzNDY0ODY2OTc4NTM2ODUiPiLlhYHorrjmjIHmnInogIXpgJrov4fnlYzpnaLorr/pl67lhoXlrrnmj5DkvpvnqIvluo/jgILmma7pgJrlupTnlKjnu53kuI3pnIDopoHmraTmnYPpmZDjgIIiPC9zdHJpbmc+Ci0gICAgPCEtLSBubyB0cmFuc2xhdGlvbiBmb3VuZCBmb3IgcGVybWxhYl91cGRhdGVMb2NrICgzNTI3NTU4MzY2NjE2NjgwODg5KSAtLT4KLSAgICA8c2tpcCAvPgotICAgIDwhLS0gbm8gdHJhbnNsYXRpb24gZm91bmQgZm9yIHBlcm1kZXNjX3VwZGF0ZUxvY2sgKDE2NTU2MjU4MzIxNjY3Nzg0OTIpIC0tPgotICAgIDxza2lwIC8+CisgICAgPHN0cmluZyBuYW1lPSJwZXJtbGFiX3VwZGF0ZUxvY2siIG1zZ2lkPSIzNTI3NTU4MzY2NjE2NjgwODg5Ij4i6Zi75q2i6Ieq5Yqo6K6+5aSH5pu05pawIjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGVybWRlc2NfdXBkYXRlTG9jayIgbXNnaWQ9IjE2NTU2MjU4MzIxNjY3Nzg0OTIiPiLlhYHorrjlupTnlKjlkJHns7vnu5/mj5Dkvpvnm7jlhbPkv6Hmga/vvIzku6Xnoa7lrprkvZXml7bpgILlkIjmiafooYzpnZ7kuqTkupLlvI/ph43lkK/ku6XljYfnuqforr7lpIfjgIIiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX21lc3NhZ2UiIG1zZ2lkPSI3NjczNDQ2ODcxMzkxOTU3OTAiPiLmmK/lkKbluIzmnJvmtY/op4jlmajorrDkvY/mraTlr4bnoIHvvJ8iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX25vdG5vdyIgbXNnaWQ9IjYzODk2NzUzMTY3MDY2OTk3NTgiPiLmmoLkuI3kv53lrZgiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzYXZlX3Bhc3N3b3JkX3JlbWVtYmVyIiBtc2dpZD0iNjQ5MTg3OTY3ODk5Njc0OTQ2NiI+IuiusOS9jyI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbCBiL2NvcmUvcmVzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbAppbmRleCA5ZTdiMTdjLi5hNTFmM2Y5IDEwMDY0NAotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIGIvY29yZS9yZXMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCkBAIC04MjYsNiArODI2LDEwIEBACiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0Lkljb25NZW51Lkl0ZW0iIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuU21hbGwiPgogICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+P3RleHRDb2xvclByaW1hcnk8L2l0ZW0+CisgICAgICAgIDwhLS0gZHAgaXMgdXNlZCBvbiBwdXJwb3NlIGhlcmUgaW5zdGVhZCBvZiBzcDsgdGhlcmUgaXMgbm90IHNwYWNlCisgICAgICAgICAgICAgZm9yIGxhcmdlciBmb250IHNpemVzIGJhc2VkIG9uIHRoZSB1c2VyIHNldHRpbmcuIE5ld2VyIGFwcHMKKyAgICAgICAgICAgICBzaG91bGQgbm90IHJlY2VpdmUgdGhlIGxlZ2FjeSBpY29uIG1lbnUgcGFuZWwuIC0tPgorICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNGRwPC9pdGVtPgogICAgIDwvc3R5bGU+CiAKICAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuV2lkZ2V0LkVkaXRUZXh0Ij4KZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvQ29ubmVjdGl2aXR5TWFuYWdlclRlc3Qvc3JjL2NvbS9hbmRyb2lkL2Nvbm5lY3Rpdml0eW1hbmFnZXJ0ZXN0L0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0QWN0aXZpdHkuamF2YSBiL2NvcmUvdGVzdHMvQ29ubmVjdGl2aXR5TWFuYWdlclRlc3Qvc3JjL2NvbS9hbmRyb2lkL2Nvbm5lY3Rpdml0eW1hbmFnZXJ0ZXN0L0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0QWN0aXZpdHkuamF2YQppbmRleCAyNTlmMTVmLi4xOWFhNzdiIDEwMDY0NAotLS0gYS9jb3JlL3Rlc3RzL0Nvbm5lY3Rpdml0eU1hbmFnZXJUZXN0L3NyYy9jb20vYW5kcm9pZC9jb25uZWN0aXZpdHltYW5hZ2VydGVzdC9Db25uZWN0aXZpdHlNYW5hZ2VyVGVzdEFjdGl2aXR5LmphdmEKKysrIGIvY29yZS90ZXN0cy9Db25uZWN0aXZpdHlNYW5hZ2VyVGVzdC9zcmMvY29tL2FuZHJvaWQvY29ubmVjdGl2aXR5bWFuYWdlcnRlc3QvQ29ubmVjdGl2aXR5TWFuYWdlclRlc3RBY3Rpdml0eS5qYXZhCkBAIC0yNDEsNiArMjQxLDcgQEAKICAgICAgICAgbUNNID0gKENvbm5lY3Rpdml0eU1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNPTk5FQ1RJVklUWV9TRVJWSUNFKTsKICAgICAgICAgLy8gR2V0IGFuIGluc3RhbmNlIG9mIFdpZmlNYW5hZ2VyCiAgICAgICAgIG1XaWZpTWFuYWdlciA9KFdpZmlNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSUZJX1NFUlZJQ0UpOworICAgICAgICBtQ29udGV4dCA9IHRoaXM7CiAgICAgICAgIG1DaGFubmVsID0gbVdpZmlNYW5hZ2VyLmluaXRpYWxpemUobUNvbnRleHQsIG1Db250ZXh0LmdldE1haW5Mb29wZXIoKSwgbnVsbCk7CiAKICAgICAgICAgaW5pdGlhbGl6ZU5ldHdvcmtTdGF0ZXMoKTsKZGlmZiAtLWdpdCBhL2NvcmUvdGVzdHMvYmVuY2htYXJrcy9SRUFETUUgYi9jb3JlL3Rlc3RzL2JlbmNobWFya3MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDFiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2JlbmNobWFya3MvUkVBRE1FCkBAIC0wLDAgKzEsOCBAQAorCitUaGVzZSBiZW5jaG1hcmtzIHVzZSB0aGUgQ2FsaXBlciBiZW5jaG1hcmsgZnJhbWV3b3JrLCBhbmQgY2FuIGJlCitydW4gb24gYSByZW1vdGUgZGV2aWNlIHVzaW5nIFZvZ2FyOgorCitodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY2FsaXBlci8KK2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC92b2dhci8KKworJCB2b2dhciAtLWJlbmNobWFyayBwYXRoL3RvL0JlbmNobWFyay5qYXZhCmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2JlbmNobWFya3Mvc3JjL2FuZHJvaWQvb3MvUGFyY2VsQXJyYXlCZW5jaG1hcmsuamF2YSBiL2NvcmUvdGVzdHMvYmVuY2htYXJrcy9zcmMvYW5kcm9pZC9vcy9QYXJjZWxBcnJheUJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxY2ZiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2JlbmNobWFya3Mvc3JjL2FuZHJvaWQvb3MvUGFyY2VsQXJyYXlCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5QYXJhbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNhbGlwZXIuU2ltcGxlQmVuY2htYXJrOworCitwdWJsaWMgY2xhc3MgUGFyY2VsQXJyYXlCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgQFBhcmFtKHsgIjEiLCAiMTAiLCAiMTAwIiwgIjEwMDAiIH0pCisgICAgcHJpdmF0ZSBpbnQgbVNpemU7CisKKyAgICBwcml2YXRlIFBhcmNlbCBtV3JpdGVQYXJjZWw7CisKKyAgICBwcml2YXRlIGJ5dGVbXSBtQnl0ZUFycmF5OworICAgIHByaXZhdGUgaW50W10gbUludEFycmF5OworICAgIHByaXZhdGUgbG9uZ1tdIG1Mb25nQXJyYXk7CisKKyAgICBwcml2YXRlIFBhcmNlbCBtQnl0ZVBhcmNlbDsKKyAgICBwcml2YXRlIFBhcmNlbCBtSW50UGFyY2VsOworICAgIHByaXZhdGUgUGFyY2VsIG1Mb25nUGFyY2VsOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG1Xcml0ZVBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKworICAgICAgICBtQnl0ZUFycmF5ID0gbmV3IGJ5dGVbbVNpemVdOworICAgICAgICBtSW50QXJyYXkgPSBuZXcgaW50W21TaXplXTsKKyAgICAgICAgbUxvbmdBcnJheSA9IG5ldyBsb25nW21TaXplXTsKKworICAgICAgICBtQnl0ZVBhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgbUJ5dGVQYXJjZWwud3JpdGVCeXRlQXJyYXkobUJ5dGVBcnJheSk7CisgICAgICAgIG1JbnRQYXJjZWwgPSBQYXJjZWwub2J0YWluKCk7CisgICAgICAgIG1JbnRQYXJjZWwud3JpdGVJbnRBcnJheShtSW50QXJyYXkpOworICAgICAgICBtTG9uZ1BhcmNlbCA9IFBhcmNlbC5vYnRhaW4oKTsKKyAgICAgICAgbUxvbmdQYXJjZWwud3JpdGVMb25nQXJyYXkobUxvbmdBcnJheSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIG1Xcml0ZVBhcmNlbC5yZWN5Y2xlKCk7CisgICAgICAgIG1Xcml0ZVBhcmNlbCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVdyaXRlQnl0ZUFycmF5KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtV3JpdGVQYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgbVdyaXRlUGFyY2VsLndyaXRlQnl0ZUFycmF5KG1CeXRlQXJyYXkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZUNyZWF0ZUJ5dGVBcnJheShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgbUJ5dGVQYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgbUJ5dGVQYXJjZWwuY3JlYXRlQnl0ZUFycmF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVhZEJ5dGVBcnJheShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgbUJ5dGVQYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgbUJ5dGVQYXJjZWwucmVhZEJ5dGVBcnJheShtQnl0ZUFycmF5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVXcml0ZUludEFycmF5KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtV3JpdGVQYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICAgICAgbVdyaXRlUGFyY2VsLndyaXRlSW50QXJyYXkobUludEFycmF5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVDcmVhdGVJbnRBcnJheShpbnQgcmVwcykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcHM7IGkrKykgeworICAgICAgICAgICAgbUludFBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBtSW50UGFyY2VsLmNyZWF0ZUludEFycmF5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVhZEludEFycmF5KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtSW50UGFyY2VsLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgICAgIG1JbnRQYXJjZWwucmVhZEludEFycmF5KG1JbnRBcnJheSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVMb25nQXJyYXkoaW50IHJlcHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIG1Xcml0ZVBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBtV3JpdGVQYXJjZWwud3JpdGVMb25nQXJyYXkobUxvbmdBcnJheSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lQ3JlYXRlTG9uZ0FycmF5KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtTG9uZ1BhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBtTG9uZ1BhcmNlbC5jcmVhdGVMb25nQXJyYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkTG9uZ0FycmF5KGludCByZXBzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtTG9uZ1BhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgICAgICAgICBtTG9uZ1BhcmNlbC5yZWFkTG9uZ0FycmF5KG1Mb25nQXJyYXkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2JlbmNobWFya3Mvc3JjL2FuZHJvaWQvb3MvUGFyY2VsQmVuY2htYXJrLmphdmEgYi9jb3JlL3Rlc3RzL2JlbmNobWFya3Mvc3JjL2FuZHJvaWQvb3MvUGFyY2VsQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3YjdjODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rlc3RzL2JlbmNobWFya3Mvc3JjL2FuZHJvaWQvb3MvUGFyY2VsQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vczsKKworaW1wb3J0IGNvbS5nb29nbGUuY2FsaXBlci5TaW1wbGVCZW5jaG1hcms7CisKK3B1YmxpYyBjbGFzcyBQYXJjZWxCZW5jaG1hcmsgZXh0ZW5kcyBTaW1wbGVCZW5jaG1hcmsgeworCisgICAgcHJpdmF0ZSBQYXJjZWwgbVBhcmNlbDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgeworICAgICAgICBtUGFyY2VsID0gUGFyY2VsLm9idGFpbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBtUGFyY2VsLnJlY3ljbGUoKTsKKyAgICAgICAgbVBhcmNlbCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVdyaXRlQnl0ZShpbnQgcmVwcykgeworICAgICAgICBmaW5hbCBieXRlIHZhbCA9IDB4RjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIG1QYXJjZWwud3JpdGVCeXRlKHZhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lUmVhZEJ5dGUoaW50IHJlcHMpIHsKKyAgICAgICAgbVBhcmNlbC5zZXREYXRhQ2FwYWNpdHkocmVwcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtUGFyY2VsLnJlYWRCeXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0aW1lV3JpdGVJbnQoaW50IHJlcHMpIHsKKyAgICAgICAgZmluYWwgaW50IHZhbCA9IDB4RjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBzOyBpKyspIHsKKyAgICAgICAgICAgIG1QYXJjZWwud3JpdGVJbnQodmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVSZWFkSW50KGludCByZXBzKSB7CisgICAgICAgIG1QYXJjZWwuc2V0RGF0YUNhcGFjaXR5KHJlcHMgPDwgMik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtUGFyY2VsLnJlYWRJbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRpbWVXcml0ZUxvbmcoaW50IHJlcHMpIHsKKyAgICAgICAgZmluYWwgbG9uZyB2YWwgPSAweEY7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtUGFyY2VsLndyaXRlTG9uZyh2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGltZVJlYWRMb25nKGludCByZXBzKSB7CisgICAgICAgIG1QYXJjZWwuc2V0RGF0YUNhcGFjaXR5KHJlcHMgPDwgMyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwczsgaSsrKSB7CisgICAgICAgICAgICBtUGFyY2VsLnJlYWRMb25nKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb25UZXN0LmphdmEgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNPcGVyYXRpb25UZXN0LmphdmEKaW5kZXggMzdlOTQ4ZC4uOTEwYzcyMSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jT3BlcmF0aW9uVGVzdC5qYXZhCisrKyBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvU3luY09wZXJhdGlvblRlc3QuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICBCdW5kbGUgYjIgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGIyLnB1dEJvb2xlYW4oImIyIiwgdHJ1ZSk7CiAKLSAgICAgICAgU3luY09wZXJhdGlvbiBvcDEgPSBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50MSwKKyAgICAgICAgU3luY09wZXJhdGlvbiBvcDEgPSBuZXcgU3luY09wZXJhdGlvbihhY2NvdW50MSwgMCwKICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICJhdXRob3JpdHkxIiwKICAgICAgICAgICAgICAgICBiMSwKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgICAgICAgICAgICBmYWxzZSk7CiAKICAgICAgICAgLy8gU2FtZSBhcyBvcDEgYnV0IGRpZmZlcmVudCB0aW1lIGluZm9zCi0gICAgICAgIFN5bmNPcGVyYXRpb24gb3AyID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsCisgICAgICAgIFN5bmNPcGVyYXRpb24gb3AyID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsIDAsCiAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAiYXV0aG9yaXR5MSIsCiAgICAgICAgICAgICAgICAgYjEsCkBAIC02MSw3ICs2MSw3IEBACiAgICAgICAgICAgICAgICAgZmFsc2UpOwogCiAgICAgICAgIC8vIFNhbWUgYXMgb3AxIGJ1dCBkaWZmZXJlbnQgYXV0aG9yaXR5Ci0gICAgICAgIFN5bmNPcGVyYXRpb24gb3AzID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsCisgICAgICAgIFN5bmNPcGVyYXRpb24gb3AzID0gbmV3IFN5bmNPcGVyYXRpb24oYWNjb3VudDEsIDAsCiAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAiYXV0aG9yaXR5MiIsCiAgICAgICAgICAgICAgICAgYjEsCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgZmFsc2UpOwogCiAgICAgICAgIC8vIFNhbWUgYXMgb3AxIGJ1dCBkaWZmZXJlbnQgYWNjb3VudAotICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNCA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQyLAorICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNCA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQyLCAwLAogICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgImF1dGhvcml0eTEiLAogICAgICAgICAgICAgICAgIGIxLApAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgICAgIGZhbHNlKTsKIAogICAgICAgICAvLyBTYW1lIGFzIG9wMSBidXQgZGlmZmVyZW50IGJ1bmRsZQotICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNSA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQxLAorICAgICAgICBTeW5jT3BlcmF0aW9uIG9wNSA9IG5ldyBTeW5jT3BlcmF0aW9uKGFjY291bnQxLCAwLAogICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgImF1dGhvcml0eTEiLAogICAgICAgICAgICAgICAgIGIyLApkaWZmIC0tZ2l0IGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YSBiL2NvcmUvdGVzdHMvY29yZXRlc3RzL3NyYy9hbmRyb2lkL2NvbnRlbnQvU3luY1N0b3JhZ2VFbmdpbmVUZXN0LmphdmEKaW5kZXggYWU0MTQwOS4uOTZmMzEzYSAxMDA2NDQKLS0tIGEvY29yZS90ZXN0cy9jb3JldGVzdHMvc3JjL2FuZHJvaWQvY29udGVudC9TeW5jU3RvcmFnZUVuZ2luZVRlc3QuamF2YQorKysgYi9jb3JlL3Rlc3RzL2NvcmV0ZXN0cy9zcmMvYW5kcm9pZC9jb250ZW50L1N5bmNTdG9yYWdlRW5naW5lVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5EZWJ1ZzsKIGltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwogaW1wb3J0IGFuZHJvaWQudGVzdC5SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0OwogaW1wb3J0IGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXI7CkBAIC0zNCw2ICszNSwxMCBAQAogCiBwdWJsaWMgY2xhc3MgU3luY1N0b3JhZ2VFbmdpbmVUZXN0IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIAorICAgIHByaXZhdGUgRmlsZSBnZXRTeW5jRGlyKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpbGUobmV3IEZpbGUoZ2V0Q29udGV4dCgpLmdldEZpbGVzRGlyKCksICJzeXN0ZW0iKSwgInN5bmMiKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0IHRoYXQgd2UgaGFuZGxlIHRoZSBjYXNlIG9mIGEgaGlzdG9yeSByb3cgYmVpbmcgb2xkIGVub3VnaCB0byBwdXJnZSBiZWZvcmUgdGhlCiAgICAgICogY29ycmVjcG9uZGluZyBzeW5jIGlzIGZpbmlzaGVkLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGNsb2NrIGNoYW5nZXMgd2hpbGUgd2UgYXJlIHN5bmNpbmcuCkBAIC01Miw3ICs1Nyw3IEBACiAKICAgICAgICAgbG9uZyB0aW1lMCA9IDEwMDA7CiAgICAgICAgIGxvbmcgaGlzdG9yeUlkID0gZW5naW5lLmluc2VydFN0YXJ0U3luY0V2ZW50KAotICAgICAgICAgICAgICAgIGFjY291bnQsIGF1dGhvcml0eSwgdGltZTAsIFN5bmNTdG9yYWdlRW5naW5lLlNPVVJDRV9MT0NBTCk7CisgICAgICAgICAgICAgICAgYWNjb3VudCwgMCwgYXV0aG9yaXR5LCB0aW1lMCwgU3luY1N0b3JhZ2VFbmdpbmUuU09VUkNFX0xPQ0FMKTsKICAgICAgICAgbG9uZyB0aW1lMSA9IHRpbWUwICsgU3luY1N0b3JhZ2VFbmdpbmUuTUlMTElTX0lOXzRXRUVLUyAqIDI7CiAgICAgICAgIGVuZ2luZS5zdG9wU3luY0V2ZW50KGhpc3RvcnlJZCwgdGltZTEgLSB0aW1lMCwgInlheSIsIDAsIDApOwogICAgIH0KQEAgLTgyLDM4ICs4Nyw0NyBAQAogICAgICAgICBTeW5jU3RvcmFnZUVuZ2luZSBlbmdpbmUgPSBTeW5jU3RvcmFnZUVuZ2luZS5uZXdUZXN0SW5zdGFuY2UoCiAgICAgICAgICAgICAgICAgbmV3IFRlc3RDb250ZXh0KG1vY2tSZXNvbHZlciwgZ2V0Q29udGV4dCgpKSk7CiAKLSAgICAgICAgcmVtb3ZlUGVyaW9kaWNTeW5jcyhlbmdpbmUsIGFjY291bnQxLCBhdXRob3JpdHkpOwotICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDIsIGF1dGhvcml0eSk7CisgICAgICAgIHJlbW92ZVBlcmlvZGljU3luY3MoZW5naW5lLCBhY2NvdW50MSwgMCwgYXV0aG9yaXR5KTsKKyAgICAgICAgcmVtb3ZlUGVyaW9kaWNTeW5jcyhlbmdpbmUsIGFjY291bnQyLCAwLCBhdXRob3JpdHkpOworICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDEsIDEsIGF1dGhvcml0eSk7CiAKICAgICAgICAgLy8gdGhpcyBzaG91bGQgYWRkIHR3byBkaXN0aW5jdCBwZXJpb2RpYyBzeW5jcyBmb3IgYWNjb3VudDEgYW5kIG9uZSBmb3IgYWNjb3VudDIKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMS5hY2NvdW50LCBzeW5jMS5hdXRob3JpdHksIHN5bmMxLmV4dHJhcywgc3luYzEucGVyaW9kKTsKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMi5hY2NvdW50LCBzeW5jMi5hdXRob3JpdHksIHN5bmMyLmV4dHJhcywgc3luYzIucGVyaW9kKTsKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMy5hY2NvdW50LCBzeW5jMy5hdXRob3JpdHksIHN5bmMzLmV4dHJhcywgc3luYzMucGVyaW9kKTsKLSAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jNC5hY2NvdW50LCBzeW5jNC5hdXRob3JpdHksIHN5bmM0LmV4dHJhcywgc3luYzQucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMS5hY2NvdW50LCAwLCBzeW5jMS5hdXRob3JpdHksIHN5bmMxLmV4dHJhcywgc3luYzEucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMi5hY2NvdW50LCAwLCBzeW5jMi5hdXRob3JpdHksIHN5bmMyLmV4dHJhcywgc3luYzIucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMy5hY2NvdW50LCAwLCBzeW5jMy5hdXRob3JpdHksIHN5bmMzLmV4dHJhcywgc3luYzMucGVyaW9kKTsKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jNC5hY2NvdW50LCAwLCBzeW5jNC5hdXRob3JpdHksIHN5bmM0LmV4dHJhcywgc3luYzQucGVyaW9kKTsKKyAgICAgICAgLy8gYWRkIGEgc2Vjb25kIHVzZXIKKyAgICAgICAgZW5naW5lLmFkZFBlcmlvZGljU3luYyhzeW5jMi5hY2NvdW50LCAxLCBzeW5jMi5hdXRob3JpdHksIHN5bmMyLmV4dHJhcywgc3luYzIucGVyaW9kKTsKIAotICAgICAgICBMaXN0PFBlcmlvZGljU3luYz4gc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50MSwgYXV0aG9yaXR5KTsKKyAgICAgICAgTGlzdDxQZXJpb2RpY1N5bmM+IHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudDEsIDAsIGF1dGhvcml0eSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHN5bmNzLnNpemUoKSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bmMxLCBzeW5jcy5nZXQoMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzMsIHN5bmNzLmdldCgxKSk7CiAKLSAgICAgICAgZW5naW5lLnJlbW92ZVBlcmlvZGljU3luYyhzeW5jMS5hY2NvdW50LCBzeW5jMS5hdXRob3JpdHksIHN5bmMxLmV4dHJhcyk7CisgICAgICAgIGVuZ2luZS5yZW1vdmVQZXJpb2RpY1N5bmMoc3luYzEuYWNjb3VudCwgMCwgc3luYzEuYXV0aG9yaXR5LCBzeW5jMS5leHRyYXMpOwogCi0gICAgICAgIHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudDEsIGF1dGhvcml0eSk7CisgICAgICAgIHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudDEsIDAsIGF1dGhvcml0eSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBzeW5jcy5zaXplKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzMsIHN5bmNzLmdldCgwKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50MiwgYXV0aG9yaXR5KTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50MiwgMCwgYXV0aG9yaXR5KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN5bmNzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzeW5jNCwgc3luY3MuZ2V0KDApKTsKKworICAgICAgICBzeW5jcyA9IGVuZ2luZS5nZXRQZXJpb2RpY1N5bmNzKHN5bmMyLmFjY291bnQsIDEsIHN5bmMyLmF1dGhvcml0eSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzeW5jcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzIsIHN5bmNzLmdldCgwKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVBlcmlvZGljU3luY3MoU3luY1N0b3JhZ2VFbmdpbmUgZW5naW5lLCBBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRob3JpdHkpIHsKLSAgICAgICAgZW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudCwgYXV0aG9yaXR5LCBlbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50LCBhdXRob3JpdHkpKTsKLSAgICAgICAgTGlzdDxQZXJpb2RpY1N5bmM+IHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudCwgYXV0aG9yaXR5KTsKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUGVyaW9kaWNTeW5jcyhTeW5jU3RvcmFnZUVuZ2luZSBlbmdpbmUsIEFjY291bnQgYWNjb3VudCwgaW50IHVzZXJJZCwKKyAgICAgICAgICAgIFN0cmluZyBhdXRob3JpdHkpIHsKKyAgICAgICAgZW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudCwgdXNlcklkLCBhdXRob3JpdHksCisgICAgICAgICAgICAgICAgZW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudCwgMCwgYXV0aG9yaXR5KSk7CisgICAgICAgIExpc3Q8UGVyaW9kaWNTeW5jPiBzeW5jcyA9IGVuZ2luZS5nZXRQZXJpb2RpY1N5bmNzKGFjY291bnQsIHVzZXJJZCwgYXV0aG9yaXR5KTsKICAgICAgICAgZm9yIChQZXJpb2RpY1N5bmMgc3luYyA6IHN5bmNzKSB7Ci0gICAgICAgICAgICBlbmdpbmUucmVtb3ZlUGVyaW9kaWNTeW5jKHN5bmMuYWNjb3VudCwgc3luYy5hdXRob3JpdHksIHN5bmMuZXh0cmFzKTsKKyAgICAgICAgICAgIGVuZ2luZS5yZW1vdmVQZXJpb2RpY1N5bmMoc3luYy5hY2NvdW50LCB1c2VySWQsIHN5bmMuYXV0aG9yaXR5LCBzeW5jLmV4dHJhcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0Nyw1NyArMTYxLDU3IEBACiAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lIGVuZ2luZSA9IFN5bmNTdG9yYWdlRW5naW5lLm5ld1Rlc3RJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBuZXcgVGVzdENvbnRleHQobW9ja1Jlc29sdmVyLCBnZXRDb250ZXh0KCkpKTsKIAotICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDEsIGF1dGhvcml0eTEpOwotICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDIsIGF1dGhvcml0eTEpOwotICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDEsIGF1dGhvcml0eTIpOwotICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDIsIGF1dGhvcml0eTIpOworICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDEsIDAsIGF1dGhvcml0eTEpOworICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDIsIDAsIGF1dGhvcml0eTEpOworICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDEsIDAsIGF1dGhvcml0eTIpOworICAgICAgICByZW1vdmVQZXJpb2RpY1N5bmNzKGVuZ2luZSwgYWNjb3VudDIsIDAsIGF1dGhvcml0eTIpOwogCi0gICAgICAgIGVuZ2luZS5zZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShmYWxzZSk7CisgICAgICAgIGVuZ2luZS5zZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseShmYWxzZSwgMCk7CiAKLSAgICAgICAgZW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudDEsIGF1dGhvcml0eTEsIDEpOwotICAgICAgICBlbmdpbmUuc2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIGF1dGhvcml0eTEsIHRydWUpOworICAgICAgICBlbmdpbmUuc2V0SXNTeW5jYWJsZShhY2NvdW50MSwgMCwgYXV0aG9yaXR5MSwgMSk7CisgICAgICAgIGVuZ2luZS5zZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MSwgMCwgYXV0aG9yaXR5MSwgdHJ1ZSk7CiAKLSAgICAgICAgZW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudDIsIGF1dGhvcml0eTEsIDEpOwotICAgICAgICBlbmdpbmUuc2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDIsIGF1dGhvcml0eTEsIHRydWUpOworICAgICAgICBlbmdpbmUuc2V0SXNTeW5jYWJsZShhY2NvdW50MiwgMCwgYXV0aG9yaXR5MSwgMSk7CisgICAgICAgIGVuZ2luZS5zZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgMCwgYXV0aG9yaXR5MSwgdHJ1ZSk7CiAKLSAgICAgICAgZW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudDEsIGF1dGhvcml0eTIsIDEpOwotICAgICAgICBlbmdpbmUuc2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIGF1dGhvcml0eTIsIGZhbHNlKTsKKyAgICAgICAgZW5naW5lLnNldElzU3luY2FibGUoYWNjb3VudDEsIDAsIGF1dGhvcml0eTIsIDEpOworICAgICAgICBlbmdpbmUuc2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIDAsIGF1dGhvcml0eTIsIGZhbHNlKTsKIAotICAgICAgICBlbmdpbmUuc2V0SXNTeW5jYWJsZShhY2NvdW50MiwgYXV0aG9yaXR5MiwgMCk7Ci0gICAgICAgIGVuZ2luZS5zZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgYXV0aG9yaXR5MiwgdHJ1ZSk7CisgICAgICAgIGVuZ2luZS5zZXRJc1N5bmNhYmxlKGFjY291bnQyLCAwLCBhdXRob3JpdHkyLCAwKTsKKyAgICAgICAgZW5naW5lLnNldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCAwLCBhdXRob3JpdHkyLCB0cnVlKTsKIAotICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmMxLmFjY291bnQsIHN5bmMxLmF1dGhvcml0eSwgc3luYzEuZXh0cmFzLCBzeW5jMS5wZXJpb2QpOwotICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmMyLmFjY291bnQsIHN5bmMyLmF1dGhvcml0eSwgc3luYzIuZXh0cmFzLCBzeW5jMi5wZXJpb2QpOwotICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmMzLmFjY291bnQsIHN5bmMzLmF1dGhvcml0eSwgc3luYzMuZXh0cmFzLCBzeW5jMy5wZXJpb2QpOwotICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmM0LmFjY291bnQsIHN5bmM0LmF1dGhvcml0eSwgc3luYzQuZXh0cmFzLCBzeW5jNC5wZXJpb2QpOwotICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmM1LmFjY291bnQsIHN5bmM1LmF1dGhvcml0eSwgc3luYzUuZXh0cmFzLCBzeW5jNS5wZXJpb2QpOworICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmMxLmFjY291bnQsIDAsIHN5bmMxLmF1dGhvcml0eSwgc3luYzEuZXh0cmFzLCBzeW5jMS5wZXJpb2QpOworICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmMyLmFjY291bnQsIDAsIHN5bmMyLmF1dGhvcml0eSwgc3luYzIuZXh0cmFzLCBzeW5jMi5wZXJpb2QpOworICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmMzLmFjY291bnQsIDAsIHN5bmMzLmF1dGhvcml0eSwgc3luYzMuZXh0cmFzLCBzeW5jMy5wZXJpb2QpOworICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmM0LmFjY291bnQsIDAsIHN5bmM0LmF1dGhvcml0eSwgc3luYzQuZXh0cmFzLCBzeW5jNC5wZXJpb2QpOworICAgICAgICBlbmdpbmUuYWRkUGVyaW9kaWNTeW5jKHN5bmM1LmFjY291bnQsIDAsIHN5bmM1LmF1dGhvcml0eSwgc3luYzUuZXh0cmFzLCBzeW5jNS5wZXJpb2QpOwogCiAgICAgICAgIGVuZ2luZS53cml0ZUFsbFN0YXRlKCk7CiAgICAgICAgIGVuZ2luZS5jbGVhckFuZFJlYWRTdGF0ZSgpOwogCi0gICAgICAgIExpc3Q8UGVyaW9kaWNTeW5jPiBzeW5jcyA9IGVuZ2luZS5nZXRQZXJpb2RpY1N5bmNzKGFjY291bnQxLCBhdXRob3JpdHkxKTsKKyAgICAgICAgTGlzdDxQZXJpb2RpY1N5bmM+IHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudDEsIDAsIGF1dGhvcml0eTEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3luY3Muc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bmMxLCBzeW5jcy5nZXQoMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzIsIHN5bmNzLmdldCgxKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50MSwgYXV0aG9yaXR5Mik7CisgICAgICAgIHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudDEsIDAsIGF1dGhvcml0eTIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3luY3Muc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bmMzLCBzeW5jcy5nZXQoMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzQsIHN5bmNzLmdldCgxKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50MiwgYXV0aG9yaXR5MSk7CisgICAgICAgIHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudDIsIDAsIGF1dGhvcml0eTEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3luY3Muc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bmM1LCBzeW5jcy5nZXQoMCkpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIGF1dGhvcml0eTEpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgYXV0aG9yaXR5MSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MSwgYXV0aG9yaXR5MikpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCBhdXRob3JpdHkyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIDAsIGF1dGhvcml0eTEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgMCwgYXV0aG9yaXR5MSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MSwgMCwgYXV0aG9yaXR5MikpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCAwLCBhdXRob3JpdHkyKSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQxLCBhdXRob3JpdHkxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50MiwgYXV0aG9yaXR5MSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudDEsIGF1dGhvcml0eTIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQyLCBhdXRob3JpdHkyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBlbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50MSwgMCwgYXV0aG9yaXR5MSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudDIsIDAsIGF1dGhvcml0eTEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQxLCAwLCBhdXRob3JpdHkyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBlbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50MiwgMCwgYXV0aG9yaXR5MikpOwogICAgIH0KIAogICAgIEBNZWRpdW1UZXN0CkBAIC0yMjAsMTIgKzIzNCwxMyBAQAogCiAgICAgICAgIGJ5dGVbXSBhY2NvdW50c0ZpbGVEYXRhID0gKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCcgc3RhbmRhbG9uZT0neWVzJyA/PlxuIgogICAgICAgICAgICAgICAgICsgIjxhY2NvdW50cz5cbiIKLSAgICAgICAgICAgICAgICArICI8YXV0aG9yaXR5IGlkPVwiMFwiIGFjY291bnQ9XCJhY2NvdW50MVwiIHR5cGU9XCJ0eXBlMVwiIGF1dGhvcml0eT1cImF1dGgxXCIgLz5cbiIKLSAgICAgICAgICAgICAgICArICI8YXV0aG9yaXR5IGlkPVwiMVwiIGFjY291bnQ9XCJhY2NvdW50MVwiIHR5cGU9XCJ0eXBlMVwiIGF1dGhvcml0eT1cImF1dGgyXCIgLz5cbiIKLSAgICAgICAgICAgICAgICArICI8YXV0aG9yaXR5IGlkPVwiMlwiIGFjY291bnQ9XCJhY2NvdW50MVwiIHR5cGU9XCJ0eXBlMVwiIGF1dGhvcml0eT1cImF1dGgzXCIgLz5cbiIKKyAgICAgICAgICAgICAgICArICI8YXV0aG9yaXR5IGlkPVwiMFwiIHVzZXI9XCIwXCIgYWNjb3VudD1cImFjY291bnQxXCIgdHlwZT1cInR5cGUxXCIgYXV0aG9yaXR5PVwiYXV0aDFcIiAvPlxuIgorICAgICAgICAgICAgICAgICsgIjxhdXRob3JpdHkgaWQ9XCIxXCIgdXNlcj1cIjBcIiBhY2NvdW50PVwiYWNjb3VudDFcIiB0eXBlPVwidHlwZTFcIiBhdXRob3JpdHk9XCJhdXRoMlwiIC8+XG4iCisgICAgICAgICAgICAgICAgKyAiPGF1dGhvcml0eSBpZD1cIjJcIiAgICAgICAgICAgIGFjY291bnQ9XCJhY2NvdW50MVwiIHR5cGU9XCJ0eXBlMVwiIGF1dGhvcml0eT1cImF1dGgzXCIgLz5cbiIKKyAgICAgICAgICAgICAgICArICI8YXV0aG9yaXR5IGlkPVwiM1wiIHVzZXI9XCIxXCIgYWNjb3VudD1cImFjY291bnQxXCIgdHlwZT1cInR5cGUxXCIgYXV0aG9yaXR5PVwiYXV0aDNcIiAvPlxuIgogICAgICAgICAgICAgICAgICsgIjwvYWNjb3VudHM+XG4iKS5nZXRCeXRlcygpOwogCi0gICAgICAgIEZpbGUgc3luY0RpciA9IG5ldyBGaWxlKG5ldyBGaWxlKHRlc3RDb250ZXh0LmdldEZpbGVzRGlyKCksICJzeXN0ZW0iKSwgInN5bmMiKTsKKyAgICAgICAgRmlsZSBzeW5jRGlyID0gZ2V0U3luY0RpcigpOwogICAgICAgICBzeW5jRGlyLm1rZGlycygpOwogICAgICAgICBBdG9taWNGaWxlIGFjY291bnRJbmZvRmlsZSA9IG5ldyBBdG9taWNGaWxlKG5ldyBGaWxlKHN5bmNEaXIsICJhY2NvdW50cy54bWwiKSk7CiAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gYWNjb3VudEluZm9GaWxlLnN0YXJ0V3JpdGUoKTsKQEAgLTIzNCwxNSArMjQ5LDE5IEBACiAKICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUgZW5naW5lID0gU3luY1N0b3JhZ2VFbmdpbmUubmV3VGVzdEluc3RhbmNlKHRlc3RDb250ZXh0KTsKIAotICAgICAgICBMaXN0PFBlcmlvZGljU3luYz4gc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkxKTsKKyAgICAgICAgTGlzdDxQZXJpb2RpY1N5bmM+IHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudCwgMCwgYXV0aG9yaXR5MSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBzeW5jcy5zaXplKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzEsIHN5bmNzLmdldCgwKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkyKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN5bmNzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzeW5jMiwgc3luY3MuZ2V0KDApKTsKIAotICAgICAgICBzeW5jcyA9IGVuZ2luZS5nZXRQZXJpb2RpY1N5bmNzKGFjY291bnQsIGF1dGhvcml0eTMpOworICAgICAgICBzeW5jcyA9IGVuZ2luZS5nZXRQZXJpb2RpY1N5bmNzKGFjY291bnQsIDAsIGF1dGhvcml0eTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3luY3Muc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN5bmMzLCBzeW5jcy5nZXQoMCkpOworCisgICAgICAgIHN5bmNzID0gZW5naW5lLmdldFBlcmlvZGljU3luY3MoYWNjb3VudCwgMSwgYXV0aG9yaXR5Myk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBzeW5jcy5zaXplKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3luYzMsIHN5bmNzLmdldCgwKSk7CiAKQEAgLTI2MCwxMyArMjc5LDEzIEBACiAKICAgICAgICAgZW5naW5lLmNsZWFyQW5kUmVhZFN0YXRlKCk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkxKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkxKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN5bmNzLnNpemUoKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkyKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN5bmNzLnNpemUoKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkzKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHN5bmNzLnNpemUoKSk7CiAKICAgICAgICAgYWNjb3VudHNGaWxlRGF0YSA9ICgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXRmLTgnIHN0YW5kYWxvbmU9J3llcycgPz5cbiIKQEAgLTI4OSwyMCArMzA4LDQ4IEBACiAKICAgICAgICAgZW5naW5lLmNsZWFyQW5kUmVhZFN0YXRlKCk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkxKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkxKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN5bmNzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzeW5jMXMsIHN5bmNzLmdldCgwKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkyKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN5bmNzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzeW5jMnMsIHN5bmNzLmdldCgwKSk7CiAKLSAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCBhdXRob3JpdHkzKTsKKyAgICAgICAgc3luY3MgPSBlbmdpbmUuZ2V0UGVyaW9kaWNTeW5jcyhhY2NvdW50LCAwLCBhdXRob3JpdHkzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN5bmNzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhzeW5jM3MsIHN5bmNzLmdldCgwKSk7CiAgICAgfQogCiAgICAgQE1lZGl1bVRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuRm9yVGlja2xlc1BhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGFjY291bnRzRmlsZURhdGEgPSAoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04JyBzdGFuZGFsb25lPSd5ZXMnID8+XG4iCisgICAgICAgICAgICAgICAgKyAiPGFjY291bnRzPlxuIgorICAgICAgICAgICAgICAgICsgIjxsaXN0ZW5Gb3JUaWNrbGVzIHVzZXI9XCIwXCIgZW5hYmxlZD1cImZhbHNlXCIgLz4iCisgICAgICAgICAgICAgICAgKyAiPGxpc3RlbkZvclRpY2tsZXMgdXNlcj1cIjFcIiBlbmFibGVkPVwidHJ1ZVwiIC8+IgorICAgICAgICAgICAgICAgICsgIjxhdXRob3JpdHkgaWQ9XCIwXCIgdXNlcj1cIjBcIiBhY2NvdW50PVwiYWNjb3VudDFcIiB0eXBlPVwidHlwZTFcIiBhdXRob3JpdHk9XCJhdXRoMVwiIC8+XG4iCisgICAgICAgICAgICAgICAgKyAiPGF1dGhvcml0eSBpZD1cIjFcIiB1c2VyPVwiMVwiIGFjY291bnQ9XCJhY2NvdW50MVwiIHR5cGU9XCJ0eXBlMVwiIGF1dGhvcml0eT1cImF1dGgxXCIgLz5cbiIKKyAgICAgICAgICAgICAgICArICI8L2FjY291bnRzPlxuIikuZ2V0Qnl0ZXMoKTsKKworICAgICAgICBNb2NrQ29udGVudFJlc29sdmVyIG1vY2tSZXNvbHZlciA9IG5ldyBNb2NrQ29udGVudFJlc29sdmVyKCk7CisgICAgICAgIGZpbmFsIFRlc3RDb250ZXh0IHRlc3RDb250ZXh0ID0gbmV3IFRlc3RDb250ZXh0KG1vY2tSZXNvbHZlciwgZ2V0Q29udGV4dCgpKTsKKworICAgICAgICBGaWxlIHN5bmNEaXIgPSBnZXRTeW5jRGlyKCk7CisgICAgICAgIHN5bmNEaXIubWtkaXJzKCk7CisgICAgICAgIEF0b21pY0ZpbGUgYWNjb3VudEluZm9GaWxlID0gbmV3IEF0b21pY0ZpbGUobmV3IEZpbGUoc3luY0RpciwgImFjY291bnRzLnhtbCIpKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBhY2NvdW50SW5mb0ZpbGUuc3RhcnRXcml0ZSgpOworICAgICAgICBmb3Mud3JpdGUoYWNjb3VudHNGaWxlRGF0YSk7CisgICAgICAgIGFjY291bnRJbmZvRmlsZS5maW5pc2hXcml0ZShmb3MpOworCisgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lIGVuZ2luZSA9IFN5bmNTdG9yYWdlRW5naW5lLm5ld1Rlc3RJbnN0YW5jZSh0ZXN0Q29udGV4dCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmdpbmUuZ2V0TWFzdGVyU3luY0F1dG9tYXRpY2FsbHkoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldE1hc3RlclN5bmNBdXRvbWF0aWNhbGx5KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGVuZ2luZS5nZXRNYXN0ZXJTeW5jQXV0b21hdGljYWxseSgyKSk7CisKKyAgICB9CisKKyAgICBATWVkaXVtVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRob3JpdHlSZW5hbWluZygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQxID0gbmV3IEFjY291bnQoImFjYzEiLCAidHlwZTEiKTsKICAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50MiA9IG5ldyBBY2NvdW50KCJhY2MyIiwgInR5cGUyIik7CkBAIC0zMzksMTcgKzM4NiwxNyBAQAogCiAgICAgICAgIFN5bmNTdG9yYWdlRW5naW5lIGVuZ2luZSA9IFN5bmNTdG9yYWdlRW5naW5lLm5ld1Rlc3RJbnN0YW5jZSh0ZXN0Q29udGV4dCk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIGF1dGhvcml0eUNvbnRhY3RzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQxLCBhdXRob3JpdHlDYWxlbmRhcikpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQxLCBhdXRob3JpdHlPdGhlcikpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQxLCBhdXRob3JpdHlDb250YWN0c05ldykpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQxLCBhdXRob3JpdHlDYWxlbmRhck5ldykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MSwgMCwgYXV0aG9yaXR5Q29udGFjdHMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIDAsIGF1dGhvcml0eUNhbGVuZGFyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIDAsIGF1dGhvcml0eU90aGVyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIDAsIGF1dGhvcml0eUNvbnRhY3RzTmV3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDEsIDAsIGF1dGhvcml0eUNhbGVuZGFyTmV3KSk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDIsIGF1dGhvcml0eUNvbnRhY3RzKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCBhdXRob3JpdHlDYWxlbmRhcikpOwotICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCBhdXRob3JpdHlPdGhlcikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgYXV0aG9yaXR5Q29udGFjdHNOZXcpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDIsIGF1dGhvcml0eUNhbGVuZGFyTmV3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCAwLCBhdXRob3JpdHlDb250YWN0cykpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgMCwgYXV0aG9yaXR5Q2FsZW5kYXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGVuZ2luZS5nZXRTeW5jQXV0b21hdGljYWxseShhY2NvdW50MiwgMCwgYXV0aG9yaXR5T3RoZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmdpbmUuZ2V0U3luY0F1dG9tYXRpY2FsbHkoYWNjb3VudDIsIDAsIGF1dGhvcml0eUNvbnRhY3RzTmV3KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZW5naW5lLmdldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQyLCAwLCBhdXRob3JpdHlDYWxlbmRhck5ldykpOwogICAgIH0KIAogICAgIEBTbWFsbFRlc3QKQEAgLTM3OSwxMCArNDI2LDEwIEBACiAKICAgICAgICAgU3luY1N0b3JhZ2VFbmdpbmUgZW5naW5lID0gU3luY1N0b3JhZ2VFbmdpbmUubmV3VGVzdEluc3RhbmNlKHRlc3RDb250ZXh0KTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQsICJvdGhlcjEiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBlbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50LCAib3RoZXIyIikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudCwgIm90aGVyMyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQsICJvdGhlcjQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgZW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudCwgMCwgIm90aGVyMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGVuZ2luZS5nZXRJc1N5bmNhYmxlKGFjY291bnQsIDAsICJvdGhlcjIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBlbmdpbmUuZ2V0SXNTeW5jYWJsZShhY2NvdW50LCAwLCAib3RoZXIzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZW5naW5lLmdldElzU3luY2FibGUoYWNjb3VudCwgMCwgIm90aGVyNCIpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5NjUyZjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIEJ1dHRvbnMKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+QnV0dG9uczwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+QSBidXR0b24gY29uc2lzdHMgb2YgdGV4dCBhbmQvb3IgYW4gaW1hZ2UgdGhhdCBjbGVhcmx5IGNvbW11bmljYXRlcyB3aGF0IGFjdGlvbiB3aWxsIG9jY3VyIHdoZW4gdGhlCi11c2VyIHRvdWNoZXMgaXQuIEFuZHJvaWQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBidXR0b25zOiA8ZW0+YmFzaWMgYnV0dG9uczwvZW0+IGFuZCA8ZW0+Ym9yZGVybGVzcwotYnV0dG9uczwvZW0+LiBCb3RoIGNhbiBjb250YWluIHRleHQgbGFiZWxzIGFuZC9vciBpbWFnZXMuPC9wPgotCi08ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgotICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYnV0dG9uc19iYXNpYy5wbmciPgotPC9kaXY+Ci0KLTxoMiBpZD0iYmFzaWMiPkJhc2ljIEJ1dHRvbnM8L2gyPgotCi08cD5CYXNpYyBidXR0b25zIGFyZSB0cmFkaXRpb25hbCBidXR0b25zIHdpdGggYm9yZGVycyBhbmQgYmFja2dyb3VuZC4gQW5kcm9pZCBzdXBwb3J0cyB0d28gc3R5bGVzIGZvcgotYmFzaWMgYnV0dG9uczogZGVmYXVsdCBhbmQgc21hbGwuIERlZmF1bHQgYnV0dG9ucyBoYXZlIHNsaWdodGx5IGxhcmdlciBmb250IHNpemUgYW5kIGFyZSBvcHRpbWl6ZWQKLWZvciBkaXNwbGF5IG91dHNpZGUgb2YgZm9ybSBjb250ZW50LiBTbWFsbCBidXR0b25zIGFyZSBpbnRlbmRlZCBmb3IgZGlzcGxheSBhbG9uZ3NpZGUgb3RoZXIgY29udGVudC4KLVRoZXkgaGF2ZSBhIHNtYWxsZXIgZm9udCBhbmQgc21hbGxlciBtaW5pbXVtIGhlaWdodC4gVXNlIHNtYWxsIGJ1dHRvbnMgaW4gZm9ybXMgd2hlcmUgdGhleSBuZWVkIHRvCi1hbGlnbiB3aXRoIG90aGVyIFVJIGVsZW1lbnRzLjwvcD4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2J1dHRvbnNfZGVmYXVsdF9zbWFsbC5wbmciPgotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgRGVmYXVsdCBidXR0b25zIGluIEhvbG8gRGFyayAmYW1wOyBMaWdodC4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFNtYWxsIGJ1dHRvbnMgaW4gSG9sbyBEYXJrICZhbXA7IExpZ2h0LgotICAgIDwvZGl2PgotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9ImJvcmRlcmxlc3MiPkJvcmRlcmxlc3MgQnV0dG9uczwvaDI+Ci0KLTxwPkJvcmRlcmxlc3MgYnV0dG9ucyByZXNlbWJsZSBiYXNpYyBidXR0b25zIGV4Y2VwdCB0aGF0IHRoZXkgaGF2ZSBubyBib3JkZXJzIG9yIGJhY2tncm91bmQuIFlvdSBjYW4KLXVzZSBib3JkZXJsZXNzIGJ1dHRvbnMgd2l0aCBib3RoIGljb25zIGFuZCB0ZXh0LiBCb3JkZXJsZXNzIGJ1dHRvbnMgYXJlIHZpc3VhbGx5IG1vcmUgbGlnaHR3ZWlnaHQKLXRoYW4gYmFzaWMgYnV0dG9ucyBhbmQgaW50ZWdyYXRlIG5pY2VseSB3aXRoIG90aGVyIGNvbnRlbnQuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYnV0dG9uc19ib3JkZXJsZXNzLnBuZyI+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiZWFiMAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuamQKQEAgLTAsMCArMSw0MCBAQAorcGFnZS50aXRsZT1CdXR0b25zCitAamQ6Ym9keQorCis8cD5BIGJ1dHRvbiBjb25zaXN0cyBvZiB0ZXh0IGFuZC9vciBhbiBpbWFnZSB0aGF0IGNsZWFybHkgY29tbXVuaWNhdGVzIHdoYXQgYWN0aW9uIHdpbGwgb2NjdXIgd2hlbiB0aGUKK3VzZXIgdG91Y2hlcyBpdC4gQW5kcm9pZCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGJ1dHRvbnM6IDxlbT5iYXNpYyBidXR0b25zPC9lbT4gYW5kIDxlbT5ib3JkZXJsZXNzCitidXR0b25zPC9lbT4uIEJvdGggY2FuIGNvbnRhaW4gdGV4dCBsYWJlbHMgYW5kL29yIGltYWdlcy48L3A+CisKKzxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CisgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2J1dHRvbnNfYmFzaWMucG5nIj4KKzwvZGl2PgorCis8aDIgaWQ9ImJhc2ljIj5CYXNpYyBCdXR0b25zPC9oMj4KKworPHA+QmFzaWMgYnV0dG9ucyBhcmUgdHJhZGl0aW9uYWwgYnV0dG9ucyB3aXRoIGJvcmRlcnMgYW5kIGJhY2tncm91bmQuIEFuZHJvaWQgc3VwcG9ydHMgdHdvIHN0eWxlcyBmb3IKK2Jhc2ljIGJ1dHRvbnM6IGRlZmF1bHQgYW5kIHNtYWxsLiBEZWZhdWx0IGJ1dHRvbnMgaGF2ZSBzbGlnaHRseSBsYXJnZXIgZm9udCBzaXplIGFuZCBhcmUgb3B0aW1pemVkCitmb3IgZGlzcGxheSBvdXRzaWRlIG9mIGZvcm0gY29udGVudC4gU21hbGwgYnV0dG9ucyBhcmUgaW50ZW5kZWQgZm9yIGRpc3BsYXkgYWxvbmdzaWRlIG90aGVyIGNvbnRlbnQuCitUaGV5IGhhdmUgYSBzbWFsbGVyIGZvbnQgYW5kIHNtYWxsZXIgbWluaW11bSBoZWlnaHQuIFVzZSBzbWFsbCBidXR0b25zIGluIGZvcm1zIHdoZXJlIHRoZXkgbmVlZCB0bworYWxpZ24gd2l0aCBvdGhlciBVSSBlbGVtZW50cy48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2J1dHRvbnNfZGVmYXVsdF9zbWFsbC5wbmciPgorPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgRGVmYXVsdCBidXR0b25zIGluIEhvbG8gRGFyayAmYW1wOyBMaWdodC4KKyAgICA8L2Rpdj4KKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIFNtYWxsIGJ1dHRvbnMgaW4gSG9sbyBEYXJrICZhbXA7IExpZ2h0LgorICAgIDwvZGl2PgorICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImJvcmRlcmxlc3MiPkJvcmRlcmxlc3MgQnV0dG9uczwvaDI+CisKKzxwPkJvcmRlcmxlc3MgYnV0dG9ucyByZXNlbWJsZSBiYXNpYyBidXR0b25zIGV4Y2VwdCB0aGF0IHRoZXkgaGF2ZSBubyBib3JkZXJzIG9yIGJhY2tncm91bmQuIFlvdSBjYW4KK3VzZSBib3JkZXJsZXNzIGJ1dHRvbnMgd2l0aCBib3RoIGljb25zIGFuZCB0ZXh0LiBCb3JkZXJsZXNzIGJ1dHRvbnMgYXJlIHZpc3VhbGx5IG1vcmUgbGlnaHR3ZWlnaHQKK3RoYW4gYmFzaWMgYnV0dG9ucyBhbmQgaW50ZWdyYXRlIG5pY2VseSB3aXRoIG90aGVyIGNvbnRlbnQuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9idXR0b25zX2JvcmRlcmxlc3MucG5nIj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzYTU3YS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gRGlhbG9ncwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5EaWFsb2dzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5EaWFsb2dzIHByb21wdCB0aGUgdXNlciBmb3IgZGVjaXNpb25zIG9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIGFwcCB0byBjb250aW51ZSBhCi10YXNrLiBTdWNoIHJlcXVlc3RzIGNhbiByYW5nZSBmcm9tIHNpbXBsZSBDYW5jZWwvT0sgZGVjaXNpb25zIHRvIG1vcmUgY29tcGxleCBsYXlvdXRzIGFza2luZyB0aGUKLXVzZXIgdG8gYWRqdXN0IHNldHRpbmdzIG9yIGVudGVyIHRleHQuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZGlhbG9nc19tYWluLnBuZyI+Ci0KLTxkaXYgY2xhc3M9IndpdGgtY2FsbG91dHMiPgotCi08b2w+Ci08bGk+Ci08aDQ+T3B0aW9uYWwgdGl0bGUgcmVnaW9uPC9oND4KLTxwPlRoZSB0aXRsZSBpbnRyb2R1Y2VzIHRoZSBjb250ZW50IG9mIHlvdXIgZGlhbG9nLiBJdCBjYW4sIGZvciBleGFtcGxlLCBpZGVudGlmeSB0aGUgbmFtZSBvZiBhCi0gc2V0dGluZyB0aGF0IHRoZSB1c2VyIGlzIGFib3V0IHRvIGNoYW5nZSwgb3IgcmVxdWVzdCBhIGRlY2lzaW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08aDQ+Q29udGVudCBhcmVhPC9oND4KLTxwPkRpYWxvZyBjb250ZW50IHZhcmllcyB3aWRlbHkuIEZvciBzZXR0aW5ncyBkaWFsb2dzLCBhIGRpYWxvZyBtYXkgY29udGFpbiBVSSBlbGVtZW50cyBzdWNoIGFzCi0gc2xpZGVycywgdGV4dCBmaWVsZHMsIGNoZWNrYm94ZXMsIG9yIHJhZGlvIGJ1dHRvbnMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBjaGFuZ2UgYXBwIG9yIHN5c3RlbQotIHNldHRpbmdzLiBJbiBvdGhlciBjYXNlcywgc3VjaCBhcyBhbGVydHMsIHRoZSBjb250ZW50IG1heSBjb25zaXN0IHNvbGVseSBvZiB0ZXh0IHRoYXQgcHJvdmlkZXMKLSBmdXJ0aGVyIGNvbnRleHQgZm9yIGEgdXNlciBkZWNpc2lvbi48L3A+Ci08L2xpPgotPGxpPgotPGg0PkFjdGlvbiBidXR0b25zPC9oND4KLTxwPkFjdGlvbiBidXR0b25zIGFyZSB0eXBpY2FsbHkgQ2FuY2VsIGFuZC9vciBPSywgd2l0aCBPSyBpbmRpY2F0aW5nIHRoZSBwcmVmZXJyZWQgb3IgbW9zdCBsaWtlbHkKLSBhY3Rpb24uIEhvd2V2ZXIsIGlmIHRoZSBvcHRpb25zIGNvbnNpc3Qgb2Ygc3BlY2lmaWMgYWN0aW9ucyBzdWNoIGFzIENsb3NlIG9yIFdhaXQgcmF0aGVyIHRoYW4KLSBhIGNvbmZpcm1hdGlvbiBvciBjYW5jZWxsYXRpb24gb2YgdGhlIGFjdGlvbiBkZXNjcmliZWQgaW4gdGhlIGNvbnRlbnQsIHRoZW4gYWxsIHRoZSBidXR0b25zCi0gc2hvdWxkIGJlIGFjdGl2ZSB2ZXJicy4gQXMgYSBydWxlLCB0aGUgZGlzbWlzc2l2ZSBhY3Rpb24gb2YgYSBkaWFsb2cgaXMgYWx3YXlzIG9uIHRoZSBsZWZ0Ci0gd2hlcmVhcyB0aGUgYWZmaXJtYXRpdmUgYWN0aW9ucyBhcmUgb24gdGhlIHJpZ2h0LjwvcD4KLTwvbGk+Ci08L29sPgotCi08L2Rpdj4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2RpYWxvZ3NfZXhhbXBsZXMucG5nIj4KLTxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgU2FtcGxlcyBvZiB0eXBpY2FsIGRpYWxvZyB1c2UgaW4gQW5kcm9pZC4KLTwvZGl2PgotCi08aDIgaWQ9ImFsZXJ0cyI+QWxlcnRzPC9oMj4KLQotPHA+QWxlcnRzIGluZm9ybSB0aGUgdXNlciBhYm91dCBhIHNpdHVhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZWlyIGNvbmZpcm1hdGlvbiBvciBhY2tub3dsZWRnZW1lbnQgYmVmb3JlCi1wcm9jZWVkaW5nLiBUaGV5IGRpZmZlciBzbGlnaHRseSBpbiBhcHBlYXJhbmNlIGJhc2VkIHVwb24gdGhlIHNldmVyaXR5IGFuZCBpbXBhY3Qgb2YgdGhlIG1lc3NhZ2UKLWNvbnZleWVkLjwvcD4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZGlhbG9nc193X25vX3RpdGxlLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+QWxlcnRzIHdpdGhvdXQgdGl0bGUgYmFyczwvaDQ+Ci08cD5Nb3N0IGFsZXJ0cyBkb24ndCBuZWVkIHRpdGxlcy4gVXN1YWxseSB0aGUgZGVjaXNpb24gZG9lc24ndCBoYXZlIGEgc2V2ZXJlIGltcGFjdCBhbmQgY2FuIGJlIHN1bW1lZAotdXAgc3VjY2luY3RseSBpbiBhIHNlbnRlbmNlIG9yIHR3by4gVGhlIGNvbnRlbnQgYXJlYSBzaG91bGQgZWl0aGVyIGFzayBhIHF1ZXN0aW9uIChzdWNoIGFzICJEZWxldGUKLXRoaXMgY29udmVyc2F0aW9uPyIpIG9yIG1ha2UgYSBjbGVhciBzdGF0ZW1lbnQgd2hvc2UgcmVsYXRpb25zaGlwIHRvIHRoZSBhY3Rpb24gYnV0dG9ucyBpcyBvYnZpb3VzLjwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2RpYWxvZ3Nfd190aXRsZS5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotPGg0PkFsZXJ0cyB3aXRoIHRpdGxlIGJhcnM8L2g0PgotPHA+VXNlIGFsZXJ0cyB3aXRoIHRpdGxlIGJhcnMgc3BhcmluZ2x5LiBUaGV5IGFyZSBhcHByb3ByaWF0ZSBvbmx5IHdoZW4gYSBoaWdoLXJpc2sgb3BlcmF0aW9uIGludm9sdmluZwotcG90ZW50aWFsIGxvc3Mgb2YgZGF0YSwgY29ubmVjdGl2aXR5LCBleHRyYSBjaGFyZ2VzLCBhbmQgc28gb24gcmVxdWlyZXMgYSBjbGVhciBxdWVzdGlvbiBvcgotc3RhdGVtZW50ICh0aGUgdGl0bGUpIGFuZCBzb21lIGFkZGl0aW9uYWwgZXhwbGFuYXRpb24gKGluIHRoZSBjb250ZW50IGFyZWEpLjwvcD4KLTxwPktlZXAgdGhlIHF1ZXN0aW9uIG9yIHN0YXRlbWVudCBzaG9ydDogZm9yIGV4YW1wbGUsICJFcmFzZSBVU0Igc3RvcmFnZT8iIEF2b2lkIGFwb2xvZ2llcy4gQSB1c2VyCi1zaG91bGQgYmUgYWJsZSB0byBza2lwIHRoZSBjb250ZW50IGNvbXBsZXRlbHkgYW5kIHN0aWxsIGhhdmUgYSBjbGVhciBpZGVhIG9mIHdoYXQgY2hvaWNlcyBhcmUKLWF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgdGl0bGUgYW5kIHRoZSB0ZXh0IG9mIHRoZSBhY3Rpb24gYnV0dG9ucy48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi08aDIgaWQ9InBvcHVwcyI+UG9wdXBzPC9oMj4KLQotPHA+UG9wdXBzIGFyZSBsaWdodHdlaWdodCB2ZXJzaW9uIG9mIGRpYWxvZ3MgdGhhdCByZXF1aXJlIGEgc2luZ2xlIHNlbGVjdGlvbiBmcm9tIHRoZSB1c2VyLiBQb3B1cHMKLWRvbid0IGhhdmUgaGF2ZSBleHBsaWNpdCBidXR0b25zIHRoYXQgYWNjZXB0IG9yIGNhbmNlbCB0aGUgb3BlcmF0aW9uLiBJbnN0ZWFkLCBtYWtpbmcgYSBzZWxlY3Rpb24KLWFkdmFuY2VzIHRoZSB3b3JrZmxvdywgYW5kIHNpbXBseSB0b3VjaGluZyBvdXRzaWRlIHRoZSBwb3B1cCBkaXNtaXNzZXMgaXQuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZGlhbG9nc19wb3B1cHNfZXhhbXBsZS5wbmciPgotCi0KLTxoMiBpZD0idG9hc3RzIj5Ub2FzdHM8L2gyPgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtNiI+PC9kaXY+Ci0KLTxwPlRvYXN0cyBwcm92aWRlIGxpZ2h0d2VpZ2h0IGZlZWRiYWNrIGFib3V0IGFuIG9wZXJhdGlvbiBpbiBhIHNtYWxsIHBvcHVwLiBGb3IgZXhhbXBsZSwgbmF2aWdhdGluZwotYXdheSBmcm9tIGFuIGVtYWlsIGJlZm9yZSB5b3Ugc2VuZCBpdCB0cmlnZ2VycyBhICJEcmFmdCBzYXZlZCIgdG9hc3QgdG8gbGV0IHlvdSBrbm93IHRoYXQgeW91IGNhbgotY29udGludWUgZWRpdGluZyBsYXRlci4gVG9hc3RzIGF1dG9tYXRpY2FsbHkgZGlzYXBwZWFyIGFmdGVyIGEgdGltZW91dC48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2RpYWxvZ3NfdG9hc3RzLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY1M2VlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5qZApAQCAtMCwwICsxLDExMiBAQAorcGFnZS50aXRsZT1EaWFsb2dzCitAamQ6Ym9keQorCis8cD5EaWFsb2dzIHByb21wdCB0aGUgdXNlciBmb3IgZGVjaXNpb25zIG9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIGFwcCB0byBjb250aW51ZSBhCit0YXNrLiBTdWNoIHJlcXVlc3RzIGNhbiByYW5nZSBmcm9tIHNpbXBsZSBDYW5jZWwvT0sgZGVjaXNpb25zIHRvIG1vcmUgY29tcGxleCBsYXlvdXRzIGFza2luZyB0aGUKK3VzZXIgdG8gYWRqdXN0IHNldHRpbmdzIG9yIGVudGVyIHRleHQuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9kaWFsb2dzX21haW4ucG5nIj4KKworPGRpdiBjbGFzcz0id2l0aC1jYWxsb3V0cyI+CisKKzxvbD4KKzxsaT4KKzxoND5PcHRpb25hbCB0aXRsZSByZWdpb248L2g0PgorPHA+VGhlIHRpdGxlIGludHJvZHVjZXMgdGhlIGNvbnRlbnQgb2YgeW91ciBkaWFsb2cuIEl0IGNhbiwgZm9yIGV4YW1wbGUsIGlkZW50aWZ5IHRoZSBuYW1lIG9mIGEKKyBzZXR0aW5nIHRoYXQgdGhlIHVzZXIgaXMgYWJvdXQgdG8gY2hhbmdlLCBvciByZXF1ZXN0IGEgZGVjaXNpb24uPC9wPgorPC9saT4KKzxsaT4KKzxoND5Db250ZW50IGFyZWE8L2g0PgorPHA+RGlhbG9nIGNvbnRlbnQgdmFyaWVzIHdpZGVseS4gRm9yIHNldHRpbmdzIGRpYWxvZ3MsIGEgZGlhbG9nIG1heSBjb250YWluIFVJIGVsZW1lbnRzIHN1Y2ggYXMKKyBzbGlkZXJzLCB0ZXh0IGZpZWxkcywgY2hlY2tib3hlcywgb3IgcmFkaW8gYnV0dG9ucyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIGNoYW5nZSBhcHAgb3Igc3lzdGVtCisgc2V0dGluZ3MuIEluIG90aGVyIGNhc2VzLCBzdWNoIGFzIGFsZXJ0cywgdGhlIGNvbnRlbnQgbWF5IGNvbnNpc3Qgc29sZWx5IG9mIHRleHQgdGhhdCBwcm92aWRlcworIGZ1cnRoZXIgY29udGV4dCBmb3IgYSB1c2VyIGRlY2lzaW9uLjwvcD4KKzwvbGk+Cis8bGk+Cis8aDQ+QWN0aW9uIGJ1dHRvbnM8L2g0PgorPHA+QWN0aW9uIGJ1dHRvbnMgYXJlIHR5cGljYWxseSBDYW5jZWwgYW5kL29yIE9LLCB3aXRoIE9LIGluZGljYXRpbmcgdGhlIHByZWZlcnJlZCBvciBtb3N0IGxpa2VseQorIGFjdGlvbi4gSG93ZXZlciwgaWYgdGhlIG9wdGlvbnMgY29uc2lzdCBvZiBzcGVjaWZpYyBhY3Rpb25zIHN1Y2ggYXMgQ2xvc2Ugb3IgV2FpdCByYXRoZXIgdGhhbgorIGEgY29uZmlybWF0aW9uIG9yIGNhbmNlbGxhdGlvbiBvZiB0aGUgYWN0aW9uIGRlc2NyaWJlZCBpbiB0aGUgY29udGVudCwgdGhlbiBhbGwgdGhlIGJ1dHRvbnMKKyBzaG91bGQgYmUgYWN0aXZlIHZlcmJzLiBBcyBhIHJ1bGUsIHRoZSBkaXNtaXNzaXZlIGFjdGlvbiBvZiBhIGRpYWxvZyBpcyBhbHdheXMgb24gdGhlIGxlZnQKKyB3aGVyZWFzIHRoZSBhZmZpcm1hdGl2ZSBhY3Rpb25zIGFyZSBvbiB0aGUgcmlnaHQuPC9wPgorPC9saT4KKzwvb2w+CisKKzwvZGl2PgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9kaWFsb2dzX2V4YW1wbGVzLnBuZyI+Cis8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgIFNhbXBsZXMgb2YgdHlwaWNhbCBkaWFsb2cgdXNlIGluIEFuZHJvaWQuCis8L2Rpdj4KKworPGgyIGlkPSJhbGVydHMiPkFsZXJ0czwvaDI+CisKKzxwPkFsZXJ0cyBpbmZvcm0gdGhlIHVzZXIgYWJvdXQgYSBzaXR1YXRpb24gdGhhdCByZXF1aXJlcyB0aGVpciBjb25maXJtYXRpb24gb3IgYWNrbm93bGVkZ2VtZW50IGJlZm9yZQorcHJvY2VlZGluZy4gVGhleSBkaWZmZXIgc2xpZ2h0bHkgaW4gYXBwZWFyYW5jZSBiYXNlZCB1cG9uIHRoZSBzZXZlcml0eSBhbmQgaW1wYWN0IG9mIHRoZSBtZXNzYWdlCitjb252ZXllZC48L3A+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvZGlhbG9nc193X25vX3RpdGxlLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+QWxlcnRzIHdpdGhvdXQgdGl0bGUgYmFyczwvaDQ+Cis8cD5Nb3N0IGFsZXJ0cyBkb24ndCBuZWVkIHRpdGxlcy4gVXN1YWxseSB0aGUgZGVjaXNpb24gZG9lc24ndCBoYXZlIGEgc2V2ZXJlIGltcGFjdCBhbmQgY2FuIGJlIHN1bW1lZAordXAgc3VjY2luY3RseSBpbiBhIHNlbnRlbmNlIG9yIHR3by4gVGhlIGNvbnRlbnQgYXJlYSBzaG91bGQgZWl0aGVyIGFzayBhIHF1ZXN0aW9uIChzdWNoIGFzICJEZWxldGUKK3RoaXMgY29udmVyc2F0aW9uPyIpIG9yIG1ha2UgYSBjbGVhciBzdGF0ZW1lbnQgd2hvc2UgcmVsYXRpb25zaGlwIHRvIHRoZSBhY3Rpb24gYnV0dG9ucyBpcyBvYnZpb3VzLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvZGlhbG9nc193X3RpdGxlLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+QWxlcnRzIHdpdGggdGl0bGUgYmFyczwvaDQ+Cis8cD5Vc2UgYWxlcnRzIHdpdGggdGl0bGUgYmFycyBzcGFyaW5nbHkuIFRoZXkgYXJlIGFwcHJvcHJpYXRlIG9ubHkgd2hlbiBhIGhpZ2gtcmlzayBvcGVyYXRpb24gaW52b2x2aW5nCitwb3RlbnRpYWwgbG9zcyBvZiBkYXRhLCBjb25uZWN0aXZpdHksIGV4dHJhIGNoYXJnZXMsIGFuZCBzbyBvbiByZXF1aXJlcyBhIGNsZWFyIHF1ZXN0aW9uIG9yCitzdGF0ZW1lbnQgKHRoZSB0aXRsZSkgYW5kIHNvbWUgYWRkaXRpb25hbCBleHBsYW5hdGlvbiAoaW4gdGhlIGNvbnRlbnQgYXJlYSkuPC9wPgorPHA+S2VlcCB0aGUgcXVlc3Rpb24gb3Igc3RhdGVtZW50IHNob3J0OiBmb3IgZXhhbXBsZSwgIkVyYXNlIFVTQiBzdG9yYWdlPyIgQXZvaWQgYXBvbG9naWVzLiBBIHVzZXIKK3Nob3VsZCBiZSBhYmxlIHRvIHNraXAgdGhlIGNvbnRlbnQgY29tcGxldGVseSBhbmQgc3RpbGwgaGF2ZSBhIGNsZWFyIGlkZWEgb2Ygd2hhdCBjaG9pY2VzIGFyZQorYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSB0aXRsZSBhbmQgdGhlIHRleHQgb2YgdGhlIGFjdGlvbiBidXR0b25zLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCisKKzxoMiBpZD0icG9wdXBzIj5Qb3B1cHM8L2gyPgorCis8cD5Qb3B1cHMgYXJlIGxpZ2h0d2VpZ2h0IHZlcnNpb24gb2YgZGlhbG9ncyB0aGF0IHJlcXVpcmUgYSBzaW5nbGUgc2VsZWN0aW9uIGZyb20gdGhlIHVzZXIuIFBvcHVwcworZG9uJ3QgaGF2ZSBoYXZlIGV4cGxpY2l0IGJ1dHRvbnMgdGhhdCBhY2NlcHQgb3IgY2FuY2VsIHRoZSBvcGVyYXRpb24uIEluc3RlYWQsIG1ha2luZyBhIHNlbGVjdGlvbgorYWR2YW5jZXMgdGhlIHdvcmtmbG93LCBhbmQgc2ltcGx5IHRvdWNoaW5nIG91dHNpZGUgdGhlIHBvcHVwIGRpc21pc3NlcyBpdC48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2RpYWxvZ3NfcG9wdXBzX2V4YW1wbGUucG5nIj4KKworCis8aDIgaWQ9InRvYXN0cyI+VG9hc3RzPC9oMj4KKworCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTYiPjwvZGl2PgorCis8cD5Ub2FzdHMgcHJvdmlkZSBsaWdodHdlaWdodCBmZWVkYmFjayBhYm91dCBhbiBvcGVyYXRpb24gaW4gYSBzbWFsbCBwb3B1cC4gRm9yIGV4YW1wbGUsIG5hdmlnYXRpbmcKK2F3YXkgZnJvbSBhbiBlbWFpbCBiZWZvcmUgeW91IHNlbmQgaXQgdHJpZ2dlcnMgYSAiRHJhZnQgc2F2ZWQiIHRvYXN0IHRvIGxldCB5b3Uga25vdyB0aGF0IHlvdSBjYW4KK2NvbnRpbnVlIGVkaXRpbmcgbGF0ZXIuIFRvYXN0cyBhdXRvbWF0aWNhbGx5IGRpc2FwcGVhciBhZnRlciBhIHRpbWVvdXQuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2RpYWxvZ3NfdG9hc3RzLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y2MDIxNi4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gR3JpZCBMaXN0cwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5HcmlkIExpc3RzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZ3JpZHZpZXdfb3ZlcnZpZXcucG5nIj4KLQotPHA+R3JpZCBsaXN0cyBhcmUgYW4gYWx0ZXJuYXRpdmUgdG8gc3RhbmRhcmQgbGlzdCB2aWV3cy4gVGhleSBhcmUgYmVzdCBzdWl0ZWQgZm9yIHNob3dpbmcgZGF0YSBzZXRzCi10aGF0IHJlcHJlc2VudCB0aGVtc2VsdmVzIHRocm91Z2ggaW1hZ2VzLiBJbiBjb250cmFzdCB0byBzaW1wbGUgbGlzdHMsIGdyaWQgbGlzdHMgbWF5IHNjcm9sbCBlaXRoZXIKLXZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5LjwvcD4KLQotCi0KLTxoMiBpZD0iZ2VuZXJpY19ncmlkIj5HZW5lcmljIEdyaWRzPC9oMj4KLQotCi08cD5UaGUgaXRlbXMgaW4gYSBncmlkIGxpc3QgYXJlIGFycmFuZ2VkIGluIHR3byBkaW1lbnNpb25zLCBvbmUgb2Ygd2hpY2ggaXMgZml4ZWQgd2hlbiBzY3JvbGxpbmcKLWNvbnRlbnQuIFRoZSBzY3JvbGxpbmcgZGlyZWN0aW9uIGRpY3RhdGVzIHRoZSBvcmRlcmluZyBvZiB0aGUgaXRlbXMgd2l0aGluIHRoZSBncmlkIGxpc3QuIFNpbmNlIHRoZQotc2Nyb2xsaW5nIGRpcmVjdGlvbiBpcyBub3QgZGV0ZXJtaW5pc3RpYywgbWFrZSBpdCBlYXN5IGZvciB0aGUgdXNlciB0byBkZXRlcm1pbmUgdGhlIG9yaWVudGF0aW9uIGJ5Ci1jdXR0aW5nIG9mZiBncmlkIGl0ZW1zIHRvIGNvbW11bmljYXRlIHdoZXJlIHRoZSBvdmVyZmxvdyBpcyBsb2NhdGVkLjwvcD4KLTxwPkF2b2lkIGNyZWF0aW5nIGdyaWQgbGlzdHMgdGhhdCBzY3JvbGwgaW4gdHdvIGRpbWVuc2lvbnMuPC9wPgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X3ZlcnRpY2FsLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08aDQ+VmVydGljYWwgc2Nyb2xsaW5nPC9oND4KLTxwPlZlcnRpY2FsbHkgc2Nyb2xsaW5nIGdyaWQgbGlzdCBpdGVtcyBhcmUgc29ydGVkIGluIHRyYWRpdGlvbmFsIHdlc3Rlcm4gcmVhZGluZyBkaXJlY3Rpb246Ci1sZWZ0LXRvLXJpZ2h0IGFuZCB0b3AtZG93bi4gV2hlbiBkaXNwbGF5aW5nIHRoZSBsaXN0LCBjdXQgb2ZmIHRoZSBpdGVtcyBpbiB0aGUgYm90dG9tIHJvdyB0bwotY29tbXVuaWNhdGUgdGhhdCB0aGUgdXNlciBjYW4gc2Nyb2xsIHRoZSBsaXN0IGRvd24gdG8gc2hvdyBhZGRpdGlvbmFsIGl0ZW1zLiBCZSBzdXJlIHRvIHJldGFpbiB0aGlzCi1zY2hlbWUgd2hlbiB0aGUgdXNlciByb3RhdGVzIHRoZSBzY3JlZW4uPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X2hvcml6b250YWwucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLTxoND5Ib3Jpem9udGFsIHNjcm9sbGluZzwvaDQ+Ci08cD5Ib3Jpem9udGFsbHkgc2Nyb2xsaW5nIGxpc3RzIGZpeCB0aGUgdmVydGljYWwgYXhpcyBvZiB0aGUgaXRlbSBncmlkLiBDb21wYXJlZCB0byB2ZXJ0aWNhbGx5Ci1zY3JvbGxpbmcgbGlzdHMsIHRoZSBzb3J0aW5nIGNoYW5nZXMgc2xpZ2h0bHkgdG8gYSB0b3AtZG93biBhbmQgbGVmdC10by1yaWdodCBhcnJhbmdlbWVudC4gRW1wbG95Ci10aGUgc2FtZSB0ZWNobmlxdWUgb2YgY3V0dGluZyBvZmYgdGhlIGl0ZW1zIGluIHRoZSByaWdodG1vc3QgY29sdW1uIHRvIGluZGljYXRlIHRoZSBzY3JvbGxpbmcKLWRpcmVjdGlvbi48L3A+Ci08cD5Eb24ndCB1c2Ugc2Nyb2xsaW5nIHRhYnMgYXMgYSBtZWFucyB0byBzd2l0Y2ggdmlld3MgaW4gY29uanVuY3Rpb24gd2l0aCBob3Jpem9udGFsbHkgc2Nyb2xsaW5nIGdyaWQKLWxpc3RzLCBiZWNhdXNlIHRoZSBob3Jpem9udGFsIGdlc3R1cmUgZm9yIHZpZXcgYW5kIGNvbnRlbnQgbmF2aWdhdGlvbiB3aWxsIGNvbmZsaWN0LiBJZiB5b3Ugc2hvdwotc2Nyb2xsaW5nIHRhYnMgZm9yIHZpZXcgbmF2aWdhdGlvbiB0b2dldGhlciB3aXRoIGEgZ3JpZCBsaXN0LCB1c2UgdmVydGljYWwgZ3JpZCBzY3JvbGxpbmcgZm9yIGxpc3QKLW5hdmlnYXRpb24uPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotPGgyIGlkPSJ3aXRoLWxhYmVscyI+R3JpZCBMaXN0IHdpdGggTGFiZWxzPC9oMj4KLQotPHA+VXNlIGxhYmVscyB0byBkaXNwbGF5IGFkZGl0aW9uYWwgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBmb3IgeW91ciBncmlkIGxpc3QgaXRlbXMuPC9wPgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X3N0eWxlLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08aDQ+U3R5bGU8L2g0PgotPHA+VXNlIHNlbWktdHJhbnNwYXJlbnQgcGFuZWxzIG9uIHRvcCBvZiB0aGUgZ3JpZCBsaXN0IGl0ZW1zIHRvIGRpc3BsYXkgeW91ciBsYWJlbHMuIFRoaXMgYWxsb3dzIHlvdSB0bwotY29udHJvbCB0aGUgY29udHJhc3QgYW5kIGVuc3VyZXMgbGVnaWJpbGl0eSBvZiB0aGUgbGFiZWxzIHdoaWxlIGxldHRpbmcgdGhlIGNvbnRlbnQgInNoaW5lIHRocm91Z2giLjwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1ZWJjYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuamQKQEAgLTAsMCArMSw3OSBAQAorcGFnZS50aXRsZT1HcmlkIExpc3RzCitAamQ6Ym9keQorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9ncmlkdmlld19vdmVydmlldy5wbmciPgorCis8cD5HcmlkIGxpc3RzIGFyZSBhbiBhbHRlcm5hdGl2ZSB0byBzdGFuZGFyZCBsaXN0IHZpZXdzLiBUaGV5IGFyZSBiZXN0IHN1aXRlZCBmb3Igc2hvd2luZyBkYXRhIHNldHMKK3RoYXQgcmVwcmVzZW50IHRoZW1zZWx2ZXMgdGhyb3VnaCBpbWFnZXMuIEluIGNvbnRyYXN0IHRvIHNpbXBsZSBsaXN0cywgZ3JpZCBsaXN0cyBtYXkgc2Nyb2xsIGVpdGhlcgordmVydGljYWxseSBvciBob3Jpem9udGFsbHkuPC9wPgorCisKKworPGgyIGlkPSJnZW5lcmljX2dyaWQiPkdlbmVyaWMgR3JpZHM8L2gyPgorCisKKzxwPlRoZSBpdGVtcyBpbiBhIGdyaWQgbGlzdCBhcmUgYXJyYW5nZWQgaW4gdHdvIGRpbWVuc2lvbnMsIG9uZSBvZiB3aGljaCBpcyBmaXhlZCB3aGVuIHNjcm9sbGluZworY29udGVudC4gVGhlIHNjcm9sbGluZyBkaXJlY3Rpb24gZGljdGF0ZXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBpdGVtcyB3aXRoaW4gdGhlIGdyaWQgbGlzdC4gU2luY2UgdGhlCitzY3JvbGxpbmcgZGlyZWN0aW9uIGlzIG5vdCBkZXRlcm1pbmlzdGljLCBtYWtlIGl0IGVhc3kgZm9yIHRoZSB1c2VyIHRvIGRldGVybWluZSB0aGUgb3JpZW50YXRpb24gYnkKK2N1dHRpbmcgb2ZmIGdyaWQgaXRlbXMgdG8gY29tbXVuaWNhdGUgd2hlcmUgdGhlIG92ZXJmbG93IGlzIGxvY2F0ZWQuPC9wPgorPHA+QXZvaWQgY3JlYXRpbmcgZ3JpZCBsaXN0cyB0aGF0IHNjcm9sbCBpbiB0d28gZGltZW5zaW9ucy48L3A+CisKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9ncmlkdmlld192ZXJ0aWNhbC5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPGg0PlZlcnRpY2FsIHNjcm9sbGluZzwvaDQ+Cis8cD5WZXJ0aWNhbGx5IHNjcm9sbGluZyBncmlkIGxpc3QgaXRlbXMgYXJlIHNvcnRlZCBpbiB0cmFkaXRpb25hbCB3ZXN0ZXJuIHJlYWRpbmcgZGlyZWN0aW9uOgorbGVmdC10by1yaWdodCBhbmQgdG9wLWRvd24uIFdoZW4gZGlzcGxheWluZyB0aGUgbGlzdCwgY3V0IG9mZiB0aGUgaXRlbXMgaW4gdGhlIGJvdHRvbSByb3cgdG8KK2NvbW11bmljYXRlIHRoYXQgdGhlIHVzZXIgY2FuIHNjcm9sbCB0aGUgbGlzdCBkb3duIHRvIHNob3cgYWRkaXRpb25hbCBpdGVtcy4gQmUgc3VyZSB0byByZXRhaW4gdGhpcworc2NoZW1lIHdoZW4gdGhlIHVzZXIgcm90YXRlcyB0aGUgc2NyZWVuLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2dyaWR2aWV3X2hvcml6b250YWwucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5Ib3Jpem9udGFsIHNjcm9sbGluZzwvaDQ+Cis8cD5Ib3Jpem9udGFsbHkgc2Nyb2xsaW5nIGxpc3RzIGZpeCB0aGUgdmVydGljYWwgYXhpcyBvZiB0aGUgaXRlbSBncmlkLiBDb21wYXJlZCB0byB2ZXJ0aWNhbGx5CitzY3JvbGxpbmcgbGlzdHMsIHRoZSBzb3J0aW5nIGNoYW5nZXMgc2xpZ2h0bHkgdG8gYSB0b3AtZG93biBhbmQgbGVmdC10by1yaWdodCBhcnJhbmdlbWVudC4gRW1wbG95Cit0aGUgc2FtZSB0ZWNobmlxdWUgb2YgY3V0dGluZyBvZmYgdGhlIGl0ZW1zIGluIHRoZSByaWdodG1vc3QgY29sdW1uIHRvIGluZGljYXRlIHRoZSBzY3JvbGxpbmcKK2RpcmVjdGlvbi48L3A+Cis8cD5Eb24ndCB1c2Ugc2Nyb2xsaW5nIHRhYnMgYXMgYSBtZWFucyB0byBzd2l0Y2ggdmlld3MgaW4gY29uanVuY3Rpb24gd2l0aCBob3Jpem9udGFsbHkgc2Nyb2xsaW5nIGdyaWQKK2xpc3RzLCBiZWNhdXNlIHRoZSBob3Jpem9udGFsIGdlc3R1cmUgZm9yIHZpZXcgYW5kIGNvbnRlbnQgbmF2aWdhdGlvbiB3aWxsIGNvbmZsaWN0LiBJZiB5b3Ugc2hvdworc2Nyb2xsaW5nIHRhYnMgZm9yIHZpZXcgbmF2aWdhdGlvbiB0b2dldGhlciB3aXRoIGEgZ3JpZCBsaXN0LCB1c2UgdmVydGljYWwgZ3JpZCBzY3JvbGxpbmcgZm9yIGxpc3QKK25hdmlnYXRpb24uPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKworPGgyIGlkPSJ3aXRoLWxhYmVscyI+R3JpZCBMaXN0IHdpdGggTGFiZWxzPC9oMj4KKworPHA+VXNlIGxhYmVscyB0byBkaXNwbGF5IGFkZGl0aW9uYWwgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBmb3IgeW91ciBncmlkIGxpc3QgaXRlbXMuPC9wPgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvZ3JpZHZpZXdfc3R5bGUucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5TdHlsZTwvaDQ+Cis8cD5Vc2Ugc2VtaS10cmFuc3BhcmVudCBwYW5lbHMgb24gdG9wIG9mIHRoZSBncmlkIGxpc3QgaXRlbXMgdG8gZGlzcGxheSB5b3VyIGxhYmVscy4gVGhpcyBhbGxvd3MgeW91IHRvCitjb250cm9sIHRoZSBjb250cmFzdCBhbmQgZW5zdXJlcyBsZWdpYmlsaXR5IG9mIHRoZSBsYWJlbHMgd2hpbGUgbGV0dGluZyB0aGUgY29udGVudCAic2hpbmUgdGhyb3VnaCIuPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5Y2FiZi4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIEJ1aWxkaW5nIEJsb2NrcwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi08c3R5bGU+Ci0jbGFuZGluZy1ncmFwaGljLWNvbnRhaW5lciB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLX0KLQotI3RleHQtb3ZlcmxheSB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgbGVmdDogMTBweDsKLSAgdG9wOiA0NzJweDsKLSAgd2lkdGg6IDQ1MHB4OwotfQotPC9zdHlsZT4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIganVzdC1saW5rcyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gIDwvZGl2PgotPC9kaXY+Ci0KLQotICAgICAgICAgIAotCi08ZGl2IGlkPSJsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIj4KLSAgPGRpdiBpZD0idGV4dC1vdmVybGF5Ij4KLSAgICBZb3VyIGludmVudG9yeSBvZiByZWFkeS10by11c2UgZWxlbWVudHMgZm9yIGNyZWF0aW5nIG91dHN0YW5kaW5nIGFwcHMuCi0gICAgPGJyPjxicj4KLSAgICA8YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIiBjbGFzcz0ibGFuZGluZy1wYWdlLWxpbmsiPlRhYnM8L2E+Ci0gIDwvZGl2PgotCi0gIDxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPgotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9idWlsZGluZ19ibG9ja3NfbGFuZGluZy5wbmciPgotICA8L2E+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLQotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2luZGV4LmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvaW5kZXguamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiNDkxNQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2luZGV4LmpkCkBAIC0wLDAgKzEsMjkgQEAKK3BhZ2UudGl0bGU9QnVpbGRpbmcgQmxvY2tzCitoZWFkZXIuanVzdExpbmtzPTEKK2Zvb3Rlci5oaWRlPTEKK0BqZDpib2R5CisKKzxzdHlsZT4KKyNsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjdGV4dC1vdmVybGF5IHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAxMHB4OworICB0b3A6IDQ3MnB4OworICB3aWR0aDogNDUwcHg7Cit9Cis8L3N0eWxlPgorCis8ZGl2IGlkPSJsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIj4KKyAgPGRpdiBpZD0idGV4dC1vdmVybGF5Ij4KKyAgICBZb3VyIGludmVudG9yeSBvZiByZWFkeS10by11c2UgZWxlbWVudHMgZm9yIGNyZWF0aW5nIG91dHN0YW5kaW5nIGFwcHMuCisgICAgPGJyPjxicj4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiIGNsYXNzPSJsYW5kaW5nLXBhZ2UtbGluayI+VGFiczwvYT4KKyAgPC9kaXY+CisKKyAgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9idWlsZGluZ19ibG9ja3NfbGFuZGluZy5wbmciPgorICA8L2E+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmQxM2Q5Li4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gTGlzdHMKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+TGlzdHM8L2gyPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotCi0gICAgICAgICAgCi0KLTxwPkxpc3RzIHByZXNlbnQgbXVsdGlwbGUgbGluZSBpdGVtcyBpbiBhIHZlcnRpY2FsIGFycmFuZ2VtZW50LiBUaGV5IGNhbiBiZSB1c2VkIGZvciBkYXRhIHNlbGVjdGlvbiBhcwotd2VsbCBhcyBkcmlsbGRvd24gbmF2aWdhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY2xlYXJmaXgiPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9saXN0c19tYWluLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQgd2l0aC1jYWxsb3V0cyI+Ci0KLTxvbD4KLTxsaT4KLTxoND5TZWN0aW9uIERpdmlkZXI8L2g0PgotPHA+VXNlIHNlY3Rpb24gZGl2aWRlcnMgdG8gb3JnYW5pemUgdGhlIGNvbnRlbnQgb2YgeW91ciBsaXN0IGludG8gZ3JvdXBzIGFuZCBmYWNpbGl0YXRlIHNjYW5uaW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08aDQ+TGluZSBJdGVtczwvaDQ+Ci08cD5MaXN0IGl0ZW1zIGNhbiBhY2NvbW1vZGF0ZSBhIHdpZGUgcmFuZ2Ugb2YgZGF0YSB0eXBlcyBpbiBkaWZmZXJlbnQgYXJyYW5nZW1lbnRzLCBpbmNsdWRpbmcKLSBzaW1wbGUgc2luZ2xlLWxpbmUgaXRlbXMsIG11bHRpLWxpbmUgaXRlbXMsIGFuZCBjdXN0b20gaXRlbXMgd2l0aCBpY29ucywgY2hlY2tib3hlcywgYW5kIGFjdGlvbgotIGJ1dHRvbnMuPC9wPgotPC9saT4KLTwvb2w+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYTg2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5qZApAQCAtMCwwICsxLDMxIEBACitwYWdlLnRpdGxlPUxpc3RzCitAamQ6Ym9keQorCis8cD5MaXN0cyBwcmVzZW50IG11bHRpcGxlIGxpbmUgaXRlbXMgaW4gYSB2ZXJ0aWNhbCBhcnJhbmdlbWVudC4gVGhleSBjYW4gYmUgdXNlZCBmb3IgZGF0YSBzZWxlY3Rpb24gYXMKK3dlbGwgYXMgZHJpbGxkb3duIG5hdmlnYXRpb24uPC9wPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNsZWFyZml4Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9saXN0c19tYWluLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQgd2l0aC1jYWxsb3V0cyI+CisKKzxvbD4KKzxsaT4KKzxoND5TZWN0aW9uIERpdmlkZXI8L2g0PgorPHA+VXNlIHNlY3Rpb24gZGl2aWRlcnMgdG8gb3JnYW5pemUgdGhlIGNvbnRlbnQgb2YgeW91ciBsaXN0IGludG8gZ3JvdXBzIGFuZCBmYWNpbGl0YXRlIHNjYW5uaW5nLjwvcD4KKzwvbGk+Cis8bGk+Cis8aDQ+TGluZSBJdGVtczwvaDQ+Cis8cD5MaXN0IGl0ZW1zIGNhbiBhY2NvbW1vZGF0ZSBhIHdpZGUgcmFuZ2Ugb2YgZGF0YSB0eXBlcyBpbiBkaWZmZXJlbnQgYXJyYW5nZW1lbnRzLCBpbmNsdWRpbmcKKyBzaW1wbGUgc2luZ2xlLWxpbmUgaXRlbXMsIG11bHRpLWxpbmUgaXRlbXMsIGFuZCBjdXN0b20gaXRlbXMgd2l0aCBpY29ucywgY2hlY2tib3hlcywgYW5kIGFjdGlvbgorIGJ1dHRvbnMuPC9wPgorPC9saT4KKzwvb2w+CisKKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OTg5Yy4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gUGlja2VycwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5QaWNrZXJzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5QaWNrZXJzIHByb3ZpZGUgYSBzaW1wbGUgd2F5IHRvIHNlbGVjdCBhIHNpbmdsZSB2YWx1ZSBmcm9tIGEgc2V0LiBJbiBhZGRpdGlvbiB0byB0b3VjaGluZyB0aGUKLXVwL2Rvd24gYXJyb3cgYnV0dG9ucywgaXQncyBwb3NzaWJsZSB0byBzZXQgdGhlIGRlc2lyZWQgdmFsdWUgZnJvbSB0aGUga2V5Ym9hcmQgb3IgdmlhIGEgc3dpcGUKLWdlc3R1cmUuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi0yIj4mbmJzcDs8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcGlja2VyX3NwYWNlLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+U3BhY2UgY29uc2lkZXJhdGlvbnM8L2g0PgotPHA+UGlja2VycyBjYW4gYmUgdXNlZCBpbmxpbmUgb24gYSBmb3JtLCBidXQgdGhlaXIgcmVsYXRpdmVseSBsYXJnZSBmb290cHJpbnQgaXMgYmVzdCBzdWl0ZWQgZm9yCi1kaXNwbGF5IGluIGEgZGlhbG9nLiBGb3IgaW5saW5lIGRpc3BsYXksIGNvbnNpZGVyIHVzaW5nIG1vcmUgY29tcGFjdCBjb250cm9scyBzdWNoIGFzIHRleHQgZmllbGRzIG9yCi1zcGlubmVycy48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGgyIGlkPSJkYXRlLXRpbWUiPkRhdGUgYW5kIHRpbWUgcGlja2VyczwvaDI+Ci0KLTxwPkFuZHJvaWQgcHJvdmlkZXMgdGhlc2UgYXMgcmVhZHktdG8tdXNlIGRpYWxvZ3MuIEVhY2ggcGlja2VyIGlzIGEgZGlhbG9nIHdpdGggYSBzZXQgb2YgY29udHJvbHMgZm9yCi1lbnRlcmluZyB0aGUgcGFydHMgb2YgdGhlIGRhdGUgKG1vbnRoLCBkYXksIHllYXIpIG9yIHRpbWUgKGhvdXIsIG1pbnV0ZSwgQU0vUE0pLiBVc2luZyB0aGVzZSBpbiB5b3VyCi1hcHAgaGVscHMgZW5zdXJlIHRoYXQgYSB1c2VyJ3Mgc3BlY2lmaWNhdGlvbiBvZiBhIGRhdGEgb3IgdGltZSBpbnB1dCBpcyB2YWxpZCBhbmQgZm9ybWF0dGVkCi1jb3JyZWN0bHkuIFRoZSBmb3JtYXQgb2YgYSB0aW1lIGFuZCBkYXRlIHBpY2tlciBhZGp1c3RzIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGxvY2FsZS48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9waWNrZXJfZGF0ZXRpbWUucG5nIj4KLQotCi0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmMjE4NwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuamQKQEAgLTAsMCArMSwzMiBAQAorcGFnZS50aXRsZT1QaWNrZXJzCitAamQ6Ym9keQorCis8cD5QaWNrZXJzIHByb3ZpZGUgYSBzaW1wbGUgd2F5IHRvIHNlbGVjdCBhIHNpbmdsZSB2YWx1ZSBmcm9tIGEgc2V0LiBJbiBhZGRpdGlvbiB0byB0b3VjaGluZyB0aGUKK3VwL2Rvd24gYXJyb3cgYnV0dG9ucywgaXQncyBwb3NzaWJsZSB0byBzZXQgdGhlIGRlc2lyZWQgdmFsdWUgZnJvbSB0aGUga2V5Ym9hcmQgb3IgdmlhIGEgc3dpcGUKK2dlc3R1cmUuPC9wPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi0yIj4mbmJzcDs8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9waWNrZXJfc3BhY2UucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxoND5TcGFjZSBjb25zaWRlcmF0aW9uczwvaDQ+Cis8cD5QaWNrZXJzIGNhbiBiZSB1c2VkIGlubGluZSBvbiBhIGZvcm0sIGJ1dCB0aGVpciByZWxhdGl2ZWx5IGxhcmdlIGZvb3RwcmludCBpcyBiZXN0IHN1aXRlZCBmb3IKK2Rpc3BsYXkgaW4gYSBkaWFsb2cuIEZvciBpbmxpbmUgZGlzcGxheSwgY29uc2lkZXIgdXNpbmcgbW9yZSBjb21wYWN0IGNvbnRyb2xzIHN1Y2ggYXMgdGV4dCBmaWVsZHMgb3IKK3NwaW5uZXJzLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImRhdGUtdGltZSI+RGF0ZSBhbmQgdGltZSBwaWNrZXJzPC9oMj4KKworPHA+QW5kcm9pZCBwcm92aWRlcyB0aGVzZSBhcyByZWFkeS10by11c2UgZGlhbG9ncy4gRWFjaCBwaWNrZXIgaXMgYSBkaWFsb2cgd2l0aCBhIHNldCBvZiBjb250cm9scyBmb3IKK2VudGVyaW5nIHRoZSBwYXJ0cyBvZiB0aGUgZGF0ZSAobW9udGgsIGRheSwgeWVhcikgb3IgdGltZSAoaG91ciwgbWludXRlLCBBTS9QTSkuIFVzaW5nIHRoZXNlIGluIHlvdXIKK2FwcCBoZWxwcyBlbnN1cmUgdGhhdCBhIHVzZXIncyBzcGVjaWZpY2F0aW9uIG9mIGEgZGF0YSBvciB0aW1lIGlucHV0IGlzIHZhbGlkIGFuZCBmb3JtYXR0ZWQKK2NvcnJlY3RseS4gVGhlIGZvcm1hdCBvZiBhIHRpbWUgYW5kIGRhdGUgcGlja2VyIGFkanVzdHMgYXV0b21hdGljYWxseSB0byB0aGUgbG9jYWxlLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcGlja2VyX2RhdGV0aW1lLnBuZyI+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxODNiYy4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIFByb2dyZXNzIGFuZCBBY3Rpdml0eQotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLQotCi0gICAgICAgICAgCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgIDxoMiBpZD0ic3lzdGVtIj5GZWVkYmFjazwvaDI+Ci0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gIDwvZGl2PgotPC9kaXY+Ci0KLTxwPldoZW4gYW4gb3BlcmF0aW9uIG9mIGludGVyZXN0IHRvIHRoZSB1c2VyIGlzIHRha2luZyBwbGFjZSBvdmVyIGEgcmVsYXRpdmVseSBsb25nIHBlcmlvZCBvZiB0aW1lLAotcHJvdmlkZSB2aXN1YWwgZmVlZGJhY2sgdGhhdCBpdCdzIHN0aWxsIGhhcHBlbmluZyBhbmQgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgY29tcGxldGVkLjwvcD4KLTxoMiBpZD0icHJvZ3Jlc3MiPlByb2dyZXNzPC9oMj4KLQotPHA+SWYgeW91IGtub3cgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIG9wZXJhdGlvbiB0aGF0IGhhcyBiZWVuIGNvbXBsZXRlZCwgdXNlIGEgZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyCi10byBnaXZlIHRoZSB1c2VyIGEgc2Vuc2Ugb2YgaG93IG11Y2ggbG9uZ2VyIGl0IHdpbGwgdGFrZS48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcm9ncmVzc19kb3dubG9hZC5wbmciPgotCi08cD5UaGUgcHJvZ3Jlc3MgYmFyIHNob3VsZCBhbHdheXMgdHJhdmVsIGZyb20gMCUgdG8gMTAwJSBjb21wbGV0aW9uLiBBdm9pZCBzZXR0aW5nIHRoZSBiYXIgdG8gYSBsb3dlcgotdmFsdWUgdGhhbiBhIHByZXZpb3VzIHZhbHVlLCBvciB1c2luZyB0aGUgc2FtZSBwcm9ncmVzcyBiYXIgdG8gcmVwcmVzZW50IHRoZSBwcm9ncmVzcyBvZiBtdWx0aXBsZQotZXZlbnRzLCBzaW5jZSBkb2luZyBzbyBtYWtlcyB0aGUgZGlzcGxheSBtZWFuaW5nbGVzcy4gSWYgeW91J3JlIG5vdCBzdXJlIGhvdyBsb25nIGEgcGFydGljdWxhcgotb3BlcmF0aW9uIHdpbGwgdGFrZSwgdXNlIGFuIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcm9ncmVzc190aGVtZXMucG5nIj4KLTxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgUHJvZ3Jlc3MgYmFyIGluIEhvbG8gRGFyayBhbmQgSG9sbyBMaWdodC4KLTwvZGl2PgotCi08aDIgaWQ9ImFjdGl2aXR5Ij5BY3Rpdml0eTwvaDI+Ci0KLTxwPklmIHlvdSBkb24ndCBrbm93IGhvdyBtdWNoIGxvbmdlciBhbiBvcGVyYXRpb24gd2lsbCBjb250aW51ZSwgdXNlIGFuIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MKLWluZGljYXRvci4gVGhlcmUgYXJlIHR3byBzdHlsZXMgYXZhaWxhYmxlOiBhIGZsYXQgYmFyIGFuZCBhIGNpcmNsZS4gVXNlIHRoZSBvbmUgdGhhdCBiZXN0IGZpdHMgdGhlCi1hdmFpbGFibGUgc3BhY2UuPC9wPgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3Byb2dyZXNzX2FjdGl2aXR5LnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTcgd2l0aC1jYWxsb3V0cyI+Ci0KLSAgICA8b2w+Ci0gICAgICA8bGkgY2xhc3M9InZhbHVlLTEiPjxoND5BY3Rpdml0eSBiYXIgKHNob3duIHdpdGggdGhlIEhvbG8gRGFyayB0aGVtZSk8L2g0PgotICAgICAgICA8cD4KLQotQW4gaW5kZXRlcm1pbmF0ZSBhY3Rpdml0eSBiYXIgaXMgdXNlZCBhdCB0aGUgc3RhcnQgb2YgYW4gYXBwbGljYXRpb24gZG93bmxvYWQgYmVjYXVzZSBNYXJrZXQgaGFzbid0Ci1iZWVuIGFibGUgdG8gY29udGFjdCB0aGUgc2VydmVyIHlldCwgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgbG9uZyBpdCB3aWxsIHRha2UgZm9yCi10aGUgZG93bmxvYWQgdG8gYmVnaW4uCi0KLSAgICAgICAgPC9wPgotICAgICAgPC9saT4KLSAgICA8L29sPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3Byb2dyZXNzX2FjdGl2aXR5Mi5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03IHdpdGgtY2FsbG91dHMiPgotCi0gICAgPG9sPgotICAgICAgPGxpIGNsYXNzPSJ2YWx1ZS0yIj48aDQ+QWN0aXZpdHkgY2lyY2xlIChzaG93biB3aXRoIHRoZSBIb2xvIExpZ2h0IHRoZW1lKTwvaDQ+Ci0gICAgICAgIDxwPgotCi1BbiBpbmRldGVybWluYXRlIGFjdGl2aXR5IGNpcmNsZSBpcyB1c2VkIGluIHRoZSBHbWFpbCBhcHBsaWNhdGlvbiB3aGVuIGEgbWVzc2FnZSBpcyBiZWluZwotbG9hZGVkIGJlY2F1c2UgaXQncyBub3QgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGhvdyBsb25nIGl0IHdpbGwgdGFrZSB0byBkb3dubG9hZCB0aGUgZW1haWwuCi0KLSAgICAgICAgPC9wPgotICAgICAgPC9saT4KLSAgICA8L29sPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxwPllvdSBzaG91bGQgb25seSB1c2Ugb25lIGFjdGl2aXR5IGluZGljYXRvciBvbiBzY3JlZW4gcGVyIGFjdGl2aXR5LCBhbmQgaXQgc2hvdWxkIGFwcHJvcHJpYXRlbHkgc2l6ZWQKLWZvciB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4gRm9yIGV4YW1wbGUsIHRoZSBsYXJnZXN0IGFjdGl2aXR5IGNpcmNsZSB3b3JrcyB3ZWxsIHdoZW4gZGlzcGxheWVkIGluIGEKLWJsYW5rIGNvbnRlbnQgYXJlYSwgYnV0IG5vdCBpbiBhIHNtYWxsZXIgZGlhbG9nIGJveC48L3A+Ci0KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjM2RlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5qZApAQCAtMCwwICsxLDgwIEBACitwYWdlLnRpdGxlPVByb2dyZXNzIGFuZCBBY3Rpdml0eQoraGVhZGVyLnRpdGxlPUZlZWRiYWNrCitAamQ6Ym9keQorCis8cD5XaGVuIGFuIG9wZXJhdGlvbiBvZiBpbnRlcmVzdCB0byB0aGUgdXNlciBpcyB0YWtpbmcgcGxhY2Ugb3ZlciBhIHJlbGF0aXZlbHkgbG9uZyBwZXJpb2Qgb2YgdGltZSwKK3Byb3ZpZGUgdmlzdWFsIGZlZWRiYWNrIHRoYXQgaXQncyBzdGlsbCBoYXBwZW5pbmcgYW5kIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNvbXBsZXRlZC48L3A+Cis8aDIgaWQ9InByb2dyZXNzIj5Qcm9ncmVzczwvaDI+CisKKzxwPklmIHlvdSBrbm93IHRoZSBwZXJjZW50YWdlIG9mIHRoZSBvcGVyYXRpb24gdGhhdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHVzZSBhIGRldGVybWluYXRlIHByb2dyZXNzIGJhcgordG8gZ2l2ZSB0aGUgdXNlciBhIHNlbnNlIG9mIGhvdyBtdWNoIGxvbmdlciBpdCB3aWxsIHRha2UuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcm9ncmVzc19kb3dubG9hZC5wbmciPgorCis8cD5UaGUgcHJvZ3Jlc3MgYmFyIHNob3VsZCBhbHdheXMgdHJhdmVsIGZyb20gMCUgdG8gMTAwJSBjb21wbGV0aW9uLiBBdm9pZCBzZXR0aW5nIHRoZSBiYXIgdG8gYSBsb3dlcgordmFsdWUgdGhhbiBhIHByZXZpb3VzIHZhbHVlLCBvciB1c2luZyB0aGUgc2FtZSBwcm9ncmVzcyBiYXIgdG8gcmVwcmVzZW50IHRoZSBwcm9ncmVzcyBvZiBtdWx0aXBsZQorZXZlbnRzLCBzaW5jZSBkb2luZyBzbyBtYWtlcyB0aGUgZGlzcGxheSBtZWFuaW5nbGVzcy4gSWYgeW91J3JlIG5vdCBzdXJlIGhvdyBsb25nIGEgcGFydGljdWxhcgorb3BlcmF0aW9uIHdpbGwgdGFrZSwgdXNlIGFuIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgaW5kaWNhdG9yLjwvcD4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3Byb2dyZXNzX3RoZW1lcy5wbmciPgorPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICBQcm9ncmVzcyBiYXIgaW4gSG9sbyBEYXJrIGFuZCBIb2xvIExpZ2h0LgorPC9kaXY+CisKKzxoMiBpZD0iYWN0aXZpdHkiPkFjdGl2aXR5PC9oMj4KKworPHA+SWYgeW91IGRvbid0IGtub3cgaG93IG11Y2ggbG9uZ2VyIGFuIG9wZXJhdGlvbiB3aWxsIGNvbnRpbnVlLCB1c2UgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcworaW5kaWNhdG9yLiBUaGVyZSBhcmUgdHdvIHN0eWxlcyBhdmFpbGFibGU6IGEgZmxhdCBiYXIgYW5kIGEgY2lyY2xlLiBVc2UgdGhlIG9uZSB0aGF0IGJlc3QgZml0cyB0aGUKK2F2YWlsYWJsZSBzcGFjZS48L3A+CisKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcm9ncmVzc19hY3Rpdml0eS5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03IHdpdGgtY2FsbG91dHMiPgorCisgICAgPG9sPgorICAgICAgPGxpIGNsYXNzPSJ2YWx1ZS0xIj48aDQ+QWN0aXZpdHkgYmFyIChzaG93biB3aXRoIHRoZSBIb2xvIERhcmsgdGhlbWUpPC9oND4KKyAgICAgICAgPHA+CisKK0FuIGluZGV0ZXJtaW5hdGUgYWN0aXZpdHkgYmFyIGlzIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIGFwcGxpY2F0aW9uIGRvd25sb2FkIGJlY2F1c2UgR29vZ2xlIFBsYXkgaGFzbid0CitiZWVuIGFibGUgdG8gY29udGFjdCB0aGUgc2VydmVyIHlldCwgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgbG9uZyBpdCB3aWxsIHRha2UgZm9yCit0aGUgZG93bmxvYWQgdG8gYmVnaW4uCisKKyAgICAgICAgPC9wPgorICAgICAgPC9saT4KKyAgICA8L29sPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcHJvZ3Jlc3NfYWN0aXZpdHkyLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTcgd2l0aC1jYWxsb3V0cyI+CisKKyAgICA8b2w+CisgICAgICA8bGkgY2xhc3M9InZhbHVlLTIiPjxoND5BY3Rpdml0eSBjaXJjbGUgKHNob3duIHdpdGggdGhlIEhvbG8gTGlnaHQgdGhlbWUpPC9oND4KKyAgICAgICAgPHA+CisKK0FuIGluZGV0ZXJtaW5hdGUgYWN0aXZpdHkgY2lyY2xlIGlzIHVzZWQgaW4gdGhlIEdtYWlsIGFwcGxpY2F0aW9uIHdoZW4gYSBtZXNzYWdlIGlzIGJlaW5nCitsb2FkZWQgYmVjYXVzZSBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaG93IGxvbmcgaXQgd2lsbCB0YWtlIHRvIGRvd25sb2FkIHRoZSBlbWFpbC4KKworICAgICAgICA8L3A+CisgICAgICA8L2xpPgorICAgIDwvb2w+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPHA+WW91IHNob3VsZCBvbmx5IHVzZSBvbmUgYWN0aXZpdHkgaW5kaWNhdG9yIG9uIHNjcmVlbiBwZXIgYWN0aXZpdHksIGFuZCBpdCBzaG91bGQgYXBwcm9wcmlhdGVseSBzaXplZAorZm9yIHRoZSBzdXJyb3VuZGluZyBjb250ZXh0LiBGb3IgZXhhbXBsZSwgdGhlIGxhcmdlc3QgYWN0aXZpdHkgY2lyY2xlIHdvcmtzIHdlbGwgd2hlbiBkaXNwbGF5ZWQgaW4gYQorYmxhbmsgY29udGVudCBhcmVhLCBidXQgbm90IGluIGEgc21hbGxlciBkaWFsb2cgYm94LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTlhOTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gU2Nyb2xsaW5nCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlNjcm9sbGluZzwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+U2Nyb2xsaW5nIGFsbG93cyB0aGUgdXNlciB0byBuYXZpZ2F0ZSB0byBjb250ZW50IGluIHRoZSBvdmVyZmxvdyB1c2luZyBhIHN3aXBlIGdlc3R1cmUuIFRoZQotc2Nyb2xsaW5nIHNwZWVkIGlzIHByb3BvcnRpb25hbCB0byB0aGUgc3BlZWQgb2YgdGhlIGdlc3R1cmUuPC9wPgotPGgyIGlkPSJpbmRpY2F0b3IiPlNjcm9sbCBJbmRpY2F0b3I8L2gyPgotCi08cD5BcHBlYXJzIGR1cmluZyBzY3JvbGxpbmcgdG8gaW5kaWNhdGUgd2hhdCBwb3J0aW9uIG9mIHRoZSBjb250ZW50IGlzIGN1cnJlbnRseSBpbiB2aWV3LjwvcD4KLQotPGRpdiBjbGFzcz0iZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMyI+Ci0gIDx2aWRlbyBjbGFzcz0icGxheS1vbi1ob3ZlciIgYXV0b3BsYXk+Ci0gICAgPHNvdXJjZSBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRpY2F0b3IubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgotICAgIDxzb3VyY2Ugc3JjPSIuLi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kaWNhdG9yLndlYm0iIHR5cGU9InZpZGVvL3dlYm0iPgotICAgIDxzb3VyY2Ugc3JjPSIuLi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kaWNhdG9yLm9ndiIgdHlwZT0idmlkZW8vb2dnIj4KLSAgPC92aWRlbz4KLTwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICA8ZGl2IGNsYXNzPSJ2aWRlby1pbnN0cnVjdGlvbnMiPiZuYnNwOzwvZGl2PgotPC9kaXY+Ci0KLTxoMiBpZD0iaW5kZXgtc2Nyb2xsaW5nIj5JbmRleCBTY3JvbGxpbmc8L2gyPgotCi08cD5JbiBhZGRpdGlvbiB0byB0cmFkaXRpb25hbCBzY3JvbGxpbmcsIGEgbG9uZyBhbHBoYWJldGljYWwgbGlzdCBjYW4gYWxzbyBvZmZlciBpbmRleCBzY3JvbGxpbmc6IGEgd2F5Ci10byBxdWlja2x5IG5hdmlnYXRlIHRvIHRoZSBpdGVtcyB0aGF0IGJlZ2luIHdpdGggYSBwYXJ0aWN1bGFyIGxldHRlci4gV2l0aCBpbmRleCBzY3JvbGxpbmcsIGEgc2Nyb2xsCi1pbmRpY2F0b3IgYXBwZWFycyBldmVuIHdoZW4gdGhlIHVzZXIgaXNuJ3Qgc2Nyb2xsaW5nLiBUb3VjaGluZyBvciBkcmFnZ2luZyBpdCBjYXVzZXMgdGhlIGN1cnJlbnQKLWxldHRlciB0byBwb3AgdXAgaW4gYSBwcm9taW5lbnQgd2F5LjwvcD4KLQotPGRpdiBjbGFzcz0iZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMyI+Ci0gIDx2aWRlbyBjbGFzcz0icGxheS1vbi1ob3ZlciIgYXV0b3BsYXk+Ci0gICAgPHNvdXJjZSBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRleC5tcDQiIHR5cGU9InZpZGVvL21wNCI+Ci0gICAgPHNvdXJjZSBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRleC53ZWJtIiB0eXBlPSJ2aWRlby93ZWJtIj4KLSAgICA8c291cmNlIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc2Nyb2xsX2luZGV4Lm9ndiIgdHlwZT0idmlkZW8vb2dnIj4KLSAgPC92aWRlbz4KLTwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICA8ZGl2IGNsYXNzPSJ2aWRlby1pbnN0cnVjdGlvbnMiPiZuYnNwOzwvZGl2PgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTUxNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuamQKQEAgLTAsMCArMSwzNyBAQAorcGFnZS50aXRsZT1TY3JvbGxpbmcKK0BqZDpib2R5CisKKzxwPlNjcm9sbGluZyBhbGxvd3MgdGhlIHVzZXIgdG8gbmF2aWdhdGUgdG8gY29udGVudCBpbiB0aGUgb3ZlcmZsb3cgdXNpbmcgYSBzd2lwZSBnZXN0dXJlLiBUaGUKK3Njcm9sbGluZyBzcGVlZCBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNwZWVkIG9mIHRoZSBnZXN0dXJlLjwvcD4KKzxoMiBpZD0iaW5kaWNhdG9yIj5TY3JvbGwgSW5kaWNhdG9yPC9oMj4KKworPHA+QXBwZWFycyBkdXJpbmcgc2Nyb2xsaW5nIHRvIGluZGljYXRlIHdoYXQgcG9ydGlvbiBvZiB0aGUgY29udGVudCBpcyBjdXJyZW50bHkgaW4gdmlldy48L3A+CisKKzxkaXYgY2xhc3M9ImZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tMTMiPgorICA8dmlkZW8gY2xhc3M9InBsYXktb24taG92ZXIiIGF1dG9wbGF5PgorICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3Njcm9sbF9pbmRpY2F0b3IubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgorICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3Njcm9sbF9pbmRpY2F0b3Iud2VibSIgdHlwZT0idmlkZW8vd2VibSI+CisgICAgPHNvdXJjZSBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvc2Nyb2xsX2luZGljYXRvci5vZ3YiIHR5cGU9InZpZGVvL29nZyI+CisgIDwvdmlkZW8+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgPGRpdiBjbGFzcz0idmlkZW8taW5zdHJ1Y3Rpb25zIj4mbmJzcDs8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImluZGV4LXNjcm9sbGluZyI+SW5kZXggU2Nyb2xsaW5nPC9oMj4KKworPHA+SW4gYWRkaXRpb24gdG8gdHJhZGl0aW9uYWwgc2Nyb2xsaW5nLCBhIGxvbmcgYWxwaGFiZXRpY2FsIGxpc3QgY2FuIGFsc28gb2ZmZXIgaW5kZXggc2Nyb2xsaW5nOiBhIHdheQordG8gcXVpY2tseSBuYXZpZ2F0ZSB0byB0aGUgaXRlbXMgdGhhdCBiZWdpbiB3aXRoIGEgcGFydGljdWxhciBsZXR0ZXIuIFdpdGggaW5kZXggc2Nyb2xsaW5nLCBhIHNjcm9sbAoraW5kaWNhdG9yIGFwcGVhcnMgZXZlbiB3aGVuIHRoZSB1c2VyIGlzbid0IHNjcm9sbGluZy4gVG91Y2hpbmcgb3IgZHJhZ2dpbmcgaXQgY2F1c2VzIHRoZSBjdXJyZW50CitsZXR0ZXIgdG8gcG9wIHVwIGluIGEgcHJvbWluZW50IHdheS48L3A+CisKKzxkaXYgY2xhc3M9ImZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tMTMiPgorICA8dmlkZW8gY2xhc3M9InBsYXktb24taG92ZXIiIGF1dG9wbGF5PgorICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3Njcm9sbF9pbmRleC5tcDQiIHR5cGU9InZpZGVvL21wNCI+CisgICAgPHNvdXJjZSBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvc2Nyb2xsX2luZGV4LndlYm0iIHR5cGU9InZpZGVvL3dlYm0iPgorICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3Njcm9sbF9pbmRleC5vZ3YiIHR5cGU9InZpZGVvL29nZyI+CisgIDwvdmlkZW8+Cis8L2Rpdj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgPGRpdiBjbGFzcz0idmlkZW8taW5zdHJ1Y3Rpb25zIj4mbmJzcDs8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmMTgyMy4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBTZWVrIEJhcnMgYW5kIFNsaWRlcnMKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+U2VlayBCYXJzIGFuZCBTbGlkZXJzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5JbnRlcmFjdGl2ZSBzbGlkZXJzIG1ha2UgaXQgcG9zc2libGUgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUgcmFuZ2Ugb2YgdmFsdWVzCi1ieSBtb3ZpbmcgdGhlIHNsaWRlciB0aHVtYi4gVGhlIHNtYWxsZXN0IHZhbHVlIGlzIHRvIHRoZSBsZWZ0LCB0aGUgbGFyZ2VzdCB0byB0aGUgcmlnaHQuIFRoZQotaW50ZXJhY3RpdmUgbmF0dXJlIG9mIHRoZSBzbGlkZXIgbWFrZXMgaXQgYSBncmVhdCBjaG9pY2UgZm9yIHNldHRpbmdzIHRoYXQgcmVmbGVjdCBpbnRlbnNpdHkgbGV2ZWxzLAotc3VjaCBhcyB2b2x1bWUsIGJyaWdodG5lc3MsIG9yIGNvbG9yIHNhdHVyYXRpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9zZWVrYmFyX2V4YW1wbGUucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08aDQ+RXhhbXBsZTwvaDQ+Ci08cD5JbnRlcmFjdGl2ZSBzbGlkZXIgdG8gc2V0IHRoZSByaW5nZXIgdm9sdW1lLiBUaGUgdmFsdWUgY2FuIGVpdGhlciBiZSBzZXQgdGhyb3VnaCB0aGUgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2xzIG9yIGludGVyYWN0aXZlbHkgdmlhIGEgZ2VzdHVyZS48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9zZWVrYmFyX3N0eWxlLnBuZyI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgU2VlayBiYXJzIGluIEhvbG8gTGlnaHQgJmFtcDsgRGFyawotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4mbmJzcDs8L2Rpdj4KLTwvZGl2PgotCi0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MDdkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuamQKQEAgLTAsMCArMSwzNiBAQAorcGFnZS50aXRsZT1TZWVrIEJhcnMgYW5kIFNsaWRlcnMKK0BqZDpib2R5CisKKzxwPkludGVyYWN0aXZlIHNsaWRlcnMgbWFrZSBpdCBwb3NzaWJsZSB0byBzZWxlY3QgYSB2YWx1ZSBmcm9tIGEgY29udGludW91cyBvciBkaXNjcmV0ZSByYW5nZSBvZiB2YWx1ZXMKK2J5IG1vdmluZyB0aGUgc2xpZGVyIHRodW1iLiBUaGUgc21hbGxlc3QgdmFsdWUgaXMgdG8gdGhlIGxlZnQsIHRoZSBsYXJnZXN0IHRvIHRoZSByaWdodC4gVGhlCitpbnRlcmFjdGl2ZSBuYXR1cmUgb2YgdGhlIHNsaWRlciBtYWtlcyBpdCBhIGdyZWF0IGNob2ljZSBmb3Igc2V0dGluZ3MgdGhhdCByZWZsZWN0IGludGVuc2l0eSBsZXZlbHMsCitzdWNoIGFzIHZvbHVtZSwgYnJpZ2h0bmVzcywgb3IgY29sb3Igc2F0dXJhdGlvbi48L3A+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvc2Vla2Jhcl9leGFtcGxlLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGg0PkV4YW1wbGU8L2g0PgorPHA+SW50ZXJhY3RpdmUgc2xpZGVyIHRvIHNldCB0aGUgcmluZ2VyIHZvbHVtZS4gVGhlIHZhbHVlIGNhbiBlaXRoZXIgYmUgc2V0IHRocm91Z2ggdGhlIGhhcmR3YXJlIHZvbHVtZSBjb250cm9scyBvciBpbnRlcmFjdGl2ZWx5IHZpYSBhIGdlc3R1cmUuPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zZWVrYmFyX3N0eWxlLnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgU2VlayBiYXJzIGluIEhvbG8gTGlnaHQgJmFtcDsgRGFyaworICAgIDwvZGl2PgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4mbmJzcDs8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjlkMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBTcGlubmVycwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5TcGlubmVyczwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+U3Bpbm5lcnMgcHJvdmlkZSBhIHF1aWNrIHdheSB0byBzZWxlY3Qgb25lIHZhbHVlIGZyb20gYSBzZXQuIEluIHRoZSBkZWZhdWx0IHN0YXRlLCBhIHNwaW5uZXIgc2hvd3MKLWl0cyBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUuIFRvdWNoaW5nIHRoZSBzcGlubmVyIGRpc3BsYXlzIGEgZHJvcGRvd24gbWVudSB3aXRoIGFsbCBvdGhlciBhdmFpbGFibGUKLXZhbHVlcywgZnJvbSB3aGljaCB0aGUgdXNlciBjYW4gc2VsZWN0IGEgbmV3IG9uZS48L3A+Ci0KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc3Bpbm5lcnNfZm9ybS5wbmciPgotCi08aDQ+U3Bpbm5lcnMgaW4gZm9ybXM8L2g0PgotPHA+U3Bpbm5lcnMgYXJlIHVzZWZ1bCBmb3IgZGF0YSBwaWNraW5nIGluIGZvcm1zLiBUaGV5IGFyZSBjb21wYWN0IGFuZCBpbnRlZ3JhdGUgbmljZWx5IHdpdGggb3RoZXIKLWNvbXBvbmVudHMuIFVzZSBzcGlubmVycyBpbiBmb3JtcyBmb3IgYm90aCBzaW1wbGUgZGF0YSBpbnB1dCBhbmQgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBpbnB1dAotZmllbGRzLiBGb3IgZXhhbXBsZSwgYSB0ZXh0IGZpZWxkIG1pZ2h0IGxldCB5b3UgZWRpdCBhbiBlbWFpbCBhZGRyZXNzIGZvciBhIGNvbnRhY3QsIHdoaWxlIGl0cwotYXNzb2NpYXRlZCBzcGlubmVyIGFsbG93cyB5b3UgdG8gc2VsZWN0IHdoZXRoZXIgaXQncyBhIEhvbWUgb3IgV29yayBhZGRyZXNzLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc3Bpbm5lcnNfYWN0aW9uYmFyLnBuZyI+Ci0KLTxoND5TcGlubmVycyBpbiBhY3Rpb24gYmFyczwvaDQ+Ci08cD5Vc2Ugc3Bpbm5lcnMgaW4gYWN0aW9uIGJhcnMgdG8gc3dpdGNoIHZpZXdzLiBGb3IgZXhhbXBsZSwgR21haWwgdXNlcyBhIHNwaW5uZXIgdG8gcGVybWl0IHN3aXRjaGluZwotYmV0d2VlbiBhY2NvdW50cyBvciBjb21tb25seSB1c2VkIGxhYmVscy4gU3Bpbm5lcnMgYXJlIHVzZWZ1bCB3aGVuIGNoYW5naW5nIHRoZSB2aWV3IGlzIGltcG9ydGFudCB0bwoteW91ciBhcHAsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYSBmcmVxdWVudCBvY2N1cnJlbmNlLiBJbiBjYXNlcyB3aGVyZSB2aWV3IHN3aXRjaGluZyBpcyBmcmVxdWVudCwgdXNlCi10YWJzLjwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc3Bpbm5lcnNfaG9sb2xpZ2h0YW5kZGFyay5wbmciPgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICBTcGlubmVycyBpbiB0aGUgSG9sbyBEYXJrIGFuZCBIb2xvIExpZ2h0IHRoZW1lcywgaW4gdmFyaW91cyBzdGF0ZXMuCi08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMWE1N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5qZApAQCAtMCwwICsxLDM3IEBACitwYWdlLnRpdGxlPVNwaW5uZXJzCitAamQ6Ym9keQorCis8cD5TcGlubmVycyBwcm92aWRlIGEgcXVpY2sgd2F5IHRvIHNlbGVjdCBvbmUgdmFsdWUgZnJvbSBhIHNldC4gSW4gdGhlIGRlZmF1bHQgc3RhdGUsIGEgc3Bpbm5lciBzaG93cworaXRzIGN1cnJlbnRseSBzZWxlY3RlZCB2YWx1ZS4gVG91Y2hpbmcgdGhlIHNwaW5uZXIgZGlzcGxheXMgYSBkcm9wZG93biBtZW51IHdpdGggYWxsIG90aGVyIGF2YWlsYWJsZQordmFsdWVzLCBmcm9tIHdoaWNoIHRoZSB1c2VyIGNhbiBzZWxlY3QgYSBuZXcgb25lLjwvcD4KKworCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3NwaW5uZXJzX2Zvcm0ucG5nIj4KKworPGg0PlNwaW5uZXJzIGluIGZvcm1zPC9oND4KKzxwPlNwaW5uZXJzIGFyZSB1c2VmdWwgZm9yIGRhdGEgcGlja2luZyBpbiBmb3Jtcy4gVGhleSBhcmUgY29tcGFjdCBhbmQgaW50ZWdyYXRlIG5pY2VseSB3aXRoIG90aGVyCitjb21wb25lbnRzLiBVc2Ugc3Bpbm5lcnMgaW4gZm9ybXMgZm9yIGJvdGggc2ltcGxlIGRhdGEgaW5wdXQgYW5kIGluIGNvbWJpbmF0aW9uIHdpdGggb3RoZXIgaW5wdXQKK2ZpZWxkcy4gRm9yIGV4YW1wbGUsIGEgdGV4dCBmaWVsZCBtaWdodCBsZXQgeW91IGVkaXQgYW4gZW1haWwgYWRkcmVzcyBmb3IgYSBjb250YWN0LCB3aGlsZSBpdHMKK2Fzc29jaWF0ZWQgc3Bpbm5lciBhbGxvd3MgeW91IHRvIHNlbGVjdCB3aGV0aGVyIGl0J3MgYSBIb21lIG9yIFdvcmsgYWRkcmVzcy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvc3Bpbm5lcnNfYWN0aW9uYmFyLnBuZyI+CisKKzxoND5TcGlubmVycyBpbiBhY3Rpb24gYmFyczwvaDQ+Cis8cD5Vc2Ugc3Bpbm5lcnMgaW4gYWN0aW9uIGJhcnMgdG8gc3dpdGNoIHZpZXdzLiBGb3IgZXhhbXBsZSwgR21haWwgdXNlcyBhIHNwaW5uZXIgdG8gcGVybWl0IHN3aXRjaGluZworYmV0d2VlbiBhY2NvdW50cyBvciBjb21tb25seSB1c2VkIGxhYmVscy4gU3Bpbm5lcnMgYXJlIHVzZWZ1bCB3aGVuIGNoYW5naW5nIHRoZSB2aWV3IGlzIGltcG9ydGFudCB0bworeW91ciBhcHAsIGJ1dCBub3QgbmVjZXNzYXJpbHkgYSBmcmVxdWVudCBvY2N1cnJlbmNlLiBJbiBjYXNlcyB3aGVyZSB2aWV3IHN3aXRjaGluZyBpcyBmcmVxdWVudCwgdXNlCit0YWJzLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zcGlubmVyc19ob2xvbGlnaHRhbmRkYXJrLnBuZyI+Cis8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgIFNwaW5uZXJzIGluIHRoZSBIb2xvIERhcmsgYW5kIEhvbG8gTGlnaHQgdGhlbWVzLCBpbiB2YXJpb3VzIHN0YXRlcy4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YWY1NDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBTd2l0Y2hlcwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5Td2l0Y2hlczwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+U3dpdGNoZXMgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IG9wdGlvbnMuIFRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiBzd2l0Y2hlczogY2hlY2tib3hlcywgcmFkaW8KLWJ1dHRvbnMsIGFuZCBvbi9vZmYgc3dpdGNoZXMuPC9wPgotPGgyIGlkPSJjaGVja2JveGVzIj5DaGVja2JveGVzPC9oMj4KLQotPHA+Q2hlY2tib3hlcyBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgbXVsdGlwbGUgb3B0aW9ucyBmcm9tIGEgc2V0LiBBdm9pZCB1c2luZyBhIHNpbmdsZSBjaGVja2JveCB0bwotdHVybiBhbiBvcHRpb24gb2ZmIG9yIG9uLiBJbnN0ZWFkLCB1c2UgYW4gb24vb2ZmIHN3aXRjaC48L3A+Ci0KLTxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Ci0gIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9zd2l0Y2hlc19jaGVja2JveGVzLnBuZyI+Ci08L2Rpdj4KLQotPGgyIGlkPSJyYWRpby1idXR0b25zIj5SYWRpbyBCdXR0b25zPC9oMj4KLQotPHA+UmFkaW8gYnV0dG9ucyBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3Qgb25lIG9wdGlvbiBmcm9tIGEgc2V0LiBVc2UgcmFkaW8gYnV0dG9ucyBmb3IgZXhjbHVzaXZlCi1zZWxlY3Rpb24gaWYgeW91IHRoaW5rIHRoYXQgdGhlIHVzZXIgbmVlZHMgdG8gc2VlIGFsbCBhdmFpbGFibGUgb3B0aW9ucyBzaWRlLWJ5LXNpZGUuIE90aGVyd2lzZSwKLWNvbnNpZGVyIGEgc3Bpbm5lciwgd2hpY2ggdXNlcyBsZXNzIHNwYWNlLjwvcD4KLQotPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KLSAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3N3aXRjaGVzX3JhZGlvcy5wbmciPgotPC9kaXY+Ci0KLTxoMiBpZD0ic3dpdGNoZXMiPk9uL29mZiBTd2l0Y2hlczwvaDI+Ci0KLTxwPk9uL29mZiBzd2l0Y2hlcyB0b2dnbGUgdGhlIHN0YXRlIG9mIGEgc2luZ2xlIHNldHRpbmdzIG9wdGlvbi48L3A+Ci0KLTxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+Ci0gIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9zd2l0Y2hlc19zd2l0Y2hlcy5wbmciPgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuamQgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDdlMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuamQKQEAgLTAsMCArMSwzMSBAQAorcGFnZS50aXRsZT1Td2l0Y2hlcworQGpkOmJvZHkKKworPHA+U3dpdGNoZXMgYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IG9wdGlvbnMuIFRoZXJlIGFyZSB0aHJlZSBraW5kcyBvZiBzd2l0Y2hlczogY2hlY2tib3hlcywgcmFkaW8KK2J1dHRvbnMsIGFuZCBvbi9vZmYgc3dpdGNoZXMuPC9wPgorPGgyIGlkPSJjaGVja2JveGVzIj5DaGVja2JveGVzPC9oMj4KKworPHA+Q2hlY2tib3hlcyBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgbXVsdGlwbGUgb3B0aW9ucyBmcm9tIGEgc2V0LiBBdm9pZCB1c2luZyBhIHNpbmdsZSBjaGVja2JveCB0bwordHVybiBhbiBvcHRpb24gb2ZmIG9yIG9uLiBJbnN0ZWFkLCB1c2UgYW4gb24vb2ZmIHN3aXRjaC48L3A+CisKKzxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CisgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3N3aXRjaGVzX2NoZWNrYm94ZXMucG5nIj4KKzwvZGl2PgorCis8aDIgaWQ9InJhZGlvLWJ1dHRvbnMiPlJhZGlvIEJ1dHRvbnM8L2gyPgorCis8cD5SYWRpbyBidXR0b25zIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBvbmUgb3B0aW9uIGZyb20gYSBzZXQuIFVzZSByYWRpbyBidXR0b25zIGZvciBleGNsdXNpdmUKK3NlbGVjdGlvbiBpZiB5b3UgdGhpbmsgdGhhdCB0aGUgdXNlciBuZWVkcyB0byBzZWUgYWxsIGF2YWlsYWJsZSBvcHRpb25zIHNpZGUtYnktc2lkZS4gT3RoZXJ3aXNlLAorY29uc2lkZXIgYSBzcGlubmVyLCB3aGljaCB1c2VzIGxlc3Mgc3BhY2UuPC9wPgorCis8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgorICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zd2l0Y2hlc19yYWRpb3MucG5nIj4KKzwvZGl2PgorCis8aDIgaWQ9InN3aXRjaGVzIj5Pbi9vZmYgU3dpdGNoZXM8L2gyPgorCis8cD5Pbi9vZmYgc3dpdGNoZXMgdG9nZ2xlIHRoZSBzdGF0ZSBvZiBhIHNpbmdsZSBzZXR0aW5ncyBvcHRpb24uPC9wPgorCis8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgorICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zd2l0Y2hlc19zd2l0Y2hlcy5wbmciPgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjBlNTIuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIFRhYnMKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+VGFiczwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3RhYnNfb3ZlcnZpZXcucG5nIj4KLQotPHA+VGFicyBpbiB0aGUgYWN0aW9uIGJhciBtYWtlIGl0IGVhc3kgdG8gZXhwbG9yZSBhbmQgc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50IHZpZXdzIG9yIGZ1bmN0aW9uYWwKLWFzcGVjdHMgb2YgeW91ciBhcHAsIG9yIHRvIGJyb3dzZSBjYXRlZ29yaXplZCBkYXRhIHNldHMuPC9wPgotCi0KLTxoMiBpZD0ic2Nyb2xsYWJsZSI+U2Nyb2xsYWJsZSBUYWJzPC9oMj4KLQotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPHA+U2Nyb2xsaW5nIHRhYiBjb250cm9scyBjYW4gY29udGFpbiBhIGxhcmdlciBudW1iZXIgb2YgaXRlbXMgdGhhbiBhIHN0YW5kYXJkIHRhYiBjb250cm9sLiBUbyBuYXZpZ2F0ZQotdG8gdGhlIG5leHQvcHJldmlvdXMgdmlldywgc3dpcGUgbGVmdCBvciByaWdodC48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPHZpZGVvIHdpZHRoPSI0MDAiIGNsYXNzPSJ3aXRoLXNoYWRvdyBwbGF5LW9uLWhvdmVyIiBhdXRvcGxheT4KLSAgICAgIDxzb3VyY2Ugc3JjPSIuLi9zdGF0aWMvY29udGVudC90YWJzX3Njcm9sbHkubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgotICAgICAgPHNvdXJjZSBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3RhYnNfc2Nyb2xseS53ZWJtIiB0eXBlPSJ2aWRlby93ZWJtIj4KLSAgICAgIDxzb3VyY2Ugc3JjPSIuLi9zdGF0aWMvY29udGVudC90YWJzX3Njcm9sbHkub2d2IiB0eXBlPSJ2aWRlby9vZ2ciPgotICAgIDwvdmlkZW8+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgU2Nyb2xsaW5nIHRhYnMgaW4gQW5kcm9pZCBNYXJrZXQuCi0gICAgICA8ZGl2IGNsYXNzPSJ2aWRlby1pbnN0cnVjdGlvbnMiPiZuYnNwOzwvZGl2PgotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotPGgyIGlkPSJmaXhlZCI+Rml4ZWQgVGFiczwvaDI+Ci0KLQotPHA+Rml4ZWQgdGFicyBkaXNwbGF5IGFsbCBpdGVtcyBjb25jdXJyZW50bHkuIFRvIG5hdmlnYXRlIHRvIGEgZGlmZmVyZW50IHZpZXcsIHRvdWNoIHRoZSB0YWIuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGFic19zdGFuZGFyZC5wbmciPgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICBUYWJzIGluIEhvbG8gRGFyayAmYW1wOyBMaWdodC4KLTwvZGl2PgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGFic195b3V0dWJlLnBuZyI+Ci08ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gIFRhYnMgaW4gdGhlIFlvdVR1YmUgYXBwLgotPC9kaXY+Ci0KLQotCi08aDIgaWQ9InN0YWNrZWQiPlN0YWNrZWQgVGFiczwvaDI+Ci0KLQotPHA+SWYgdmlldyBuYXZpZ2F0aW9uIGlzIGVzc2VudGlhbCB0byB5b3VyIGFwcCwgeW91IGNhbiBicmVhayBvdXQgdGFicyBpbnRvIGEgc2VwYXJhdGUgYWN0aW9uIGJhci4gVGhpcwotcGVybWl0cyBmYXN0IHZpZXcgc3dpdGNoaW5nIGV2ZW4gb24gbmFycm93ZXIgc2NyZWVucy48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90YWJzX3N0YWNrZWQucG5nIj4KLQotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3RhYnMuamQgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODU0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmpkCkBAIC0wLDAgKzEsNTkgQEAKK3BhZ2UudGl0bGU9VGFicworQGpkOmJvZHkKKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGFic19vdmVydmlldy5wbmciPgorCis8cD5UYWJzIGluIHRoZSBhY3Rpb24gYmFyIG1ha2UgaXQgZWFzeSB0byBleHBsb3JlIGFuZCBzd2l0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgdmlld3Mgb3IgZnVuY3Rpb25hbAorYXNwZWN0cyBvZiB5b3VyIGFwcCwgb3IgdG8gYnJvd3NlIGNhdGVnb3JpemVkIGRhdGEgc2V0cy48L3A+CisKKworPGgyIGlkPSJzY3JvbGxhYmxlIj5TY3JvbGxhYmxlIFRhYnM8L2gyPgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCis8cD5TY3JvbGxpbmcgdGFiIGNvbnRyb2xzIGNhbiBjb250YWluIGEgbGFyZ2VyIG51bWJlciBvZiBpdGVtcyB0aGFuIGEgc3RhbmRhcmQgdGFiIGNvbnRyb2wuIFRvIG5hdmlnYXRlCit0byB0aGUgbmV4dC9wcmV2aW91cyB2aWV3LCBzd2lwZSBsZWZ0IG9yIHJpZ2h0LjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8dmlkZW8gd2lkdGg9IjQwMCIgY2xhc3M9IndpdGgtc2hhZG93IHBsYXktb24taG92ZXIiIGF1dG9wbGF5PgorICAgICAgPHNvdXJjZSBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGFic19zY3JvbGx5Lm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KKyAgICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RhYnNfc2Nyb2xseS53ZWJtIiB0eXBlPSJ2aWRlby93ZWJtIj4KKyAgICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RhYnNfc2Nyb2xseS5vZ3YiIHR5cGU9InZpZGVvL29nZyI+CisgICAgPC92aWRlbz4KKyAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgICAgICBTY3JvbGxpbmcgdGFicyBpbiBHb29nbGUgUGxheS4KKyAgICAgIDxkaXYgY2xhc3M9InZpZGVvLWluc3RydWN0aW9ucyI+Jm5ic3A7PC9kaXY+CisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworCis8aDIgaWQ9ImZpeGVkIj5GaXhlZCBUYWJzPC9oMj4KKworCis8cD5GaXhlZCB0YWJzIGRpc3BsYXkgYWxsIGl0ZW1zIGNvbmN1cnJlbnRseS4gVG8gbmF2aWdhdGUgdG8gYSBkaWZmZXJlbnQgdmlldywgdG91Y2ggdGhlIHRhYi48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RhYnNfc3RhbmRhcmQucG5nIj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgVGFicyBpbiBIb2xvIERhcmsgJmFtcDsgTGlnaHQuCis8L2Rpdj4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGFic195b3V0dWJlLnBuZyI+Cis8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgIFRhYnMgaW4gdGhlIFlvdVR1YmUgYXBwLgorPC9kaXY+CisKKworCis8aDIgaWQ9InN0YWNrZWQiPlN0YWNrZWQgVGFiczwvaDI+CisKKworPHA+SWYgdmlldyBuYXZpZ2F0aW9uIGlzIGVzc2VudGlhbCB0byB5b3VyIGFwcCwgeW91IGNhbiBicmVhayBvdXQgdGFicyBpbnRvIGEgc2VwYXJhdGUgYWN0aW9uIGJhci4gVGhpcworcGVybWl0cyBmYXN0IHZpZXcgc3dpdGNoaW5nIGV2ZW4gb24gbmFycm93ZXIgc2NyZWVucy48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RhYnNfc3RhY2tlZC5wbmciPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWM0MmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBUZXh0IEZpZWxkcwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5UZXh0IEZpZWxkczwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+VGV4dCBmaWVsZHMgYWxsb3cgdGhlIHVzZXIgdG8gdHlwZSB0ZXh0IGludG8geW91ciBhcHAuIFRoZXkgY2FuIGJlIGVpdGhlciBzaW5nbGUgbGluZSBvciBtdWx0aS1saW5lLgotVG91Y2hpbmcgYSB0ZXh0IGZpZWxkIHBsYWNlcyB0aGUgY3Vyc29yIGFuZCBhdXRvbWF0aWNhbGx5IGRpc3BsYXlzIHRoZSBrZXlib2FyZC4gSW4gYWRkaXRpb24gdG8KLXR5cGluZywgdGV4dCBmaWVsZHMgYWxsb3cgZm9yIGEgdmFyaWV0eSBvZiBvdGhlciBhY3Rpdml0aWVzLCBzdWNoIGFzIHRleHQgc2VsZWN0aW9uIChjdXQsIGNvcHksCi1wYXN0ZSkgYW5kIGRhdGEgbG9va3VwIHZpYSBhdXRvLWNvbXBsZXRpb24uPC9wPgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTEyIj4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90ZXh0X2lucHV0X3NpbmdsZXZzbXVsdGlsaW5lLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGg0PlNpbmdsZSBsaW5lIGFuZCBtdWx0aSBsaW5lPC9oND4KLTxwPlNpbmdsZS1saW5lIGZpZWxkcyBhdXRvbWF0aWNhbGx5IHNjcm9sbCB0aGVpciBjb250ZW50IHRvIHRoZSBsZWZ0IGFzIHRoZSB0ZXh0IGlucHV0IGN1cnNvciByZWFjaGVzCi10aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW5wdXQgZmllbGQuIE11bHRpLWxpbmUgdGV4dCBmaWVsZHMgYXV0b21hdGljYWxseSBicmVhayB0byBhIG5ldyBsaW5lIGZvcgotb3ZlcmZsb3cgdGV4dCBhbmQgc2Nyb2xsIHZlcnRpY2FsbHkgd2hlbiB0aGUgY3Vyc29yIHJlYWNoZXMgdGhlIGxvd2VyIGVkZ2UuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGV4dF9pbnB1dF90eXBlc2FuZHR5cGVkb3duLnBuZyI+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08aDQ+VGV4dCBmaWVsZCB0eXBlczwvaDQ+Ci08cD5UZXh0IGZpZWxkcyBjYW4gaGF2ZSBkaWZmZXJlbnQgdHlwZXMsIHN1Y2ggYXMgbnVtYmVyLCBtZXNzYWdlLCBvciBlbWFpbCBhZGRyZXNzLiBUaGUgdHlwZSBkZXRlcm1pbmVzCi13aGF0IGtpbmQgb2YgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBpbnNpZGUgdGhlIGZpZWxkLCBhbmQgbWF5IHByb21wdCB0aGUgdmlydHVhbCBrZXlib2FyZCB0bwotb3B0aW1pemUgaXRzIGxheW91dCBmb3IgZnJlcXVlbnRseSB1c2VkIGNoYXJhY3RlcnMuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0PkF1dG8tY29tcGxldGUgdGV4dCBmaWVsZHM8L2g0PgotPHA+VXNlIGF1dG8tY29tcGxldGUgdGV4dCBmaWVsZHMgdG8gcHJlc2VudCByZWFsLXRpbWUgY29tcGxldGlvbnMgb3Igc2VhcmNoIHJlc3VsdHMgaW4gcG9wdXBzLCBzbyB1c2VycwotY2FuIGVudGVyIGluZm9ybWF0aW9uIG1vcmUgYWNjdXJhdGVseSBhbmQgZWZmaWNpZW50bHkuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxoMiBpZD0idGV4dC1zZWxlY3Rpb24iPlRleHQgU2VsZWN0aW9uPC9oMj4KLQotPHA+VXNlcnMgY2FuIHNlbGVjdCBhbnkgd29yZCBpbiBhIHRleHQgZmllbGQgd2l0aCBhIGxvbmcgcHJlc3MuIFRoaXMgYWN0aW9uIHRyaWdnZXJzIGEgdGV4dCBzZWxlY3Rpb24KLW1vZGUgdGhhdCBmYWNpbGl0YXRlcyBleHRlbmRpbmcgdGhlIHNlbGVjdGlvbiBvciBjaG9vc2luZyBhbiBhY3Rpb24gdG8gcGVyZm9ybSBvbiB0aGUgc2VsZWN0ZWQgdGV4dC4KLVNlbGVjdGlvbiBtb2RlIGluY2x1ZGVzOjwvcD4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGV4dF9pbnB1dF90ZXh0c2VsZWN0aW9uLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQgd2l0aC1jYWxsb3V0cyI+Ci0KLTxvbD4KLTxsaT4KLTxoND5Db250ZXh0dWFsIGFjdGlvbiBiYXI8L2g0PgotPHA+QSBjb250ZXh0dWFsIGFjdGlvbiBiYXIgKENBQikgZGlzcGxheXMgdGhlIGFjdGlvbnMgYXZhaWxhYmxlIHRvIHBlcmZvcm0gb24gdGhlIHNlbGVjdGlvbjoKLSB0eXBpY2FsbHkgY3V0LCBjb3B5LCBhbmQgcGFzdGUsIGJ1dCBhcHBzIGNhbiBpbnNlcnQgYWRkaXRpb25hbCBjb21tYW5kcyBhcyBuZWVkZWQuPC9wPgotPC9saT4KLTxsaT4KLTxoND5TZWxlY3Rpb24gaGFuZGxlczwvaDQ+Ci08cD5TZWxlY3Rpb24gaGFuZGxlcyBjYW4gYmUgZHJhZ2dlZCB0byBzZWxlY3QgbW9yZSBvciBsZXNzIHRleHQgd2hpbGUgcmVtYWluaW5nIGluIHNlbGVjdGlvbiBtb2RlLjwvcD4KLTwvbGk+Ci08L29sPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuamQgYi9kb2NzL2h0bWwvZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEwNDIwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuamQKQEAgLTAsMCArMSw3MCBAQAorcGFnZS50aXRsZT1UZXh0IEZpZWxkcworQGpkOmJvZHkKKworPHA+VGV4dCBmaWVsZHMgYWxsb3cgdGhlIHVzZXIgdG8gdHlwZSB0ZXh0IGludG8geW91ciBhcHAuIFRoZXkgY2FuIGJlIGVpdGhlciBzaW5nbGUgbGluZSBvciBtdWx0aS1saW5lLgorVG91Y2hpbmcgYSB0ZXh0IGZpZWxkIHBsYWNlcyB0aGUgY3Vyc29yIGFuZCBhdXRvbWF0aWNhbGx5IGRpc3BsYXlzIHRoZSBrZXlib2FyZC4gSW4gYWRkaXRpb24gdG8KK3R5cGluZywgdGV4dCBmaWVsZHMgYWxsb3cgZm9yIGEgdmFyaWV0eSBvZiBvdGhlciBhY3Rpdml0aWVzLCBzdWNoIGFzIHRleHQgc2VsZWN0aW9uIChjdXQsIGNvcHksCitwYXN0ZSkgYW5kIGRhdGEgbG9va3VwIHZpYSBhdXRvLWNvbXBsZXRpb24uPC9wPgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTEyIj4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RleHRfaW5wdXRfc2luZ2xldnNtdWx0aWxpbmUucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDQ+U2luZ2xlIGxpbmUgYW5kIG11bHRpIGxpbmU8L2g0PgorPHA+U2luZ2xlLWxpbmUgZmllbGRzIGF1dG9tYXRpY2FsbHkgc2Nyb2xsIHRoZWlyIGNvbnRlbnQgdG8gdGhlIGxlZnQgYXMgdGhlIHRleHQgaW5wdXQgY3Vyc29yIHJlYWNoZXMKK3RoZSByaWdodCBlZGdlIG9mIHRoZSBpbnB1dCBmaWVsZC4gTXVsdGktbGluZSB0ZXh0IGZpZWxkcyBhdXRvbWF0aWNhbGx5IGJyZWFrIHRvIGEgbmV3IGxpbmUgZm9yCitvdmVyZmxvdyB0ZXh0IGFuZCBzY3JvbGwgdmVydGljYWxseSB3aGVuIHRoZSBjdXJzb3IgcmVhY2hlcyB0aGUgbG93ZXIgZWRnZS48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RleHRfaW5wdXRfdHlwZXNhbmR0eXBlZG93bi5wbmciPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPGg0PlRleHQgZmllbGQgdHlwZXM8L2g0PgorPHA+VGV4dCBmaWVsZHMgY2FuIGhhdmUgZGlmZmVyZW50IHR5cGVzLCBzdWNoIGFzIG51bWJlciwgbWVzc2FnZSwgb3IgZW1haWwgYWRkcmVzcy4gVGhlIHR5cGUgZGV0ZXJtaW5lcword2hhdCBraW5kIG9mIGNoYXJhY3RlcnMgYXJlIGFsbG93ZWQgaW5zaWRlIHRoZSBmaWVsZCwgYW5kIG1heSBwcm9tcHQgdGhlIHZpcnR1YWwga2V5Ym9hcmQgdG8KK29wdGltaXplIGl0cyBsYXlvdXQgZm9yIGZyZXF1ZW50bHkgdXNlZCBjaGFyYWN0ZXJzLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5BdXRvLWNvbXBsZXRlIHRleHQgZmllbGRzPC9oND4KKzxwPlVzZSBhdXRvLWNvbXBsZXRlIHRleHQgZmllbGRzIHRvIHByZXNlbnQgcmVhbC10aW1lIGNvbXBsZXRpb25zIG9yIHNlYXJjaCByZXN1bHRzIGluIHBvcHVwcywgc28gdXNlcnMKK2NhbiBlbnRlciBpbmZvcm1hdGlvbiBtb3JlIGFjY3VyYXRlbHkgYW5kIGVmZmljaWVudGx5LjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9InRleHQtc2VsZWN0aW9uIj5UZXh0IFNlbGVjdGlvbjwvaDI+CisKKzxwPlVzZXJzIGNhbiBzZWxlY3QgYW55IHdvcmQgaW4gYSB0ZXh0IGZpZWxkIHdpdGggYSBsb25nIHByZXNzLiBUaGlzIGFjdGlvbiB0cmlnZ2VycyBhIHRleHQgc2VsZWN0aW9uCittb2RlIHRoYXQgZmFjaWxpdGF0ZXMgZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24gb3IgY2hvb3NpbmcgYW4gYWN0aW9uIHRvIHBlcmZvcm0gb24gdGhlIHNlbGVjdGVkIHRleHQuCitTZWxlY3Rpb24gbW9kZSBpbmNsdWRlczo8L3A+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGV4dF9pbnB1dF90ZXh0c2VsZWN0aW9uLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQgd2l0aC1jYWxsb3V0cyI+CisKKzxvbD4KKzxsaT4KKzxoND5Db250ZXh0dWFsIGFjdGlvbiBiYXI8L2g0PgorPHA+QSBjb250ZXh0dWFsIGFjdGlvbiBiYXIgKENBQikgZGlzcGxheXMgdGhlIGFjdGlvbnMgYXZhaWxhYmxlIHRvIHBlcmZvcm0gb24gdGhlIHNlbGVjdGlvbjoKKyB0eXBpY2FsbHkgY3V0LCBjb3B5LCBhbmQgcGFzdGUsIGJ1dCBhcHBzIGNhbiBpbnNlcnQgYWRkaXRpb25hbCBjb21tYW5kcyBhcyBuZWVkZWQuPC9wPgorPC9saT4KKzxsaT4KKzxoND5TZWxlY3Rpb24gaGFuZGxlczwvaDQ+Cis8cD5TZWxlY3Rpb24gaGFuZGxlcyBjYW4gYmUgZHJhZ2dlZCB0byBzZWxlY3QgbW9yZSBvciBsZXNzIHRleHQgd2hpbGUgcmVtYWluaW5nIGluIHNlbGVjdGlvbiBtb2RlLjwvcD4KKzwvbGk+Cis8L29sPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2Rlc2lnbl90b2MuY3MgYi9kb2NzL2h0bWwvZGVzaWduL2Rlc2lnbl90b2MuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliNThkOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vZGVzaWduX3RvYy5jcwpAQCAtMCwwICsxLDY5IEBACis8dWwgaWQ9Im5hdiI+CisKKyAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+CisgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorCisgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgorICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgorICAgIDx1bD4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisKKyAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+CisgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KKyAgICA8L3VsPgorICA8L2xpPgorCisgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgorICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+CisgICAgPHVsPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmRlc2lnbi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+ZGVzaWduL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgorICAgIDwvdWw+CisgIDwvbGk+CisKKyAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+CisgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kZXNpZ24vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KKyAgPC9saT4KKworICA8bGk+CisgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+aW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KKyAgPC9saT4KKworPC91bD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2Rvd25sb2Fkcy9pbmRleC5odG1sIGIvZG9jcy9odG1sL2Rlc2lnbi9kb3dubG9hZHMvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxMGIyOS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL2Rvd25sb2Fkcy9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIERvd25sb2FkcwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5Eb3dubG9hZHM8L2gyPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotCi0gICAgICAgICAgCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotCi08cD5XYW50IGV2ZXJ5dGhpbmc/IFdlJ3ZlIGJ1bmRsZWQgYWxsIHRoZSBkb3dubG9hZHMgYXZhaWxhYmxlIG9uIEFuZHJvaWQgRGVzaWduIGludG8gYSBzaW5nbGUgWklQIGZpbGUuCi1Zb3UgY2FuIGFsc28gZG93bmxvYWQgaW5kaXZpZHVhbCBmaWxlcyBsaXN0ZWQgYmVsb3cuPC9wPgotPHA+WW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24gaW4geW91ciBhcHBzIGFuZCB0byBkZXZlbG9wIHlvdXIgYXBwcy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08cD4KLSAgPGEgY2xhc3M9ImRvd25sb2FkLWJ1dHRvbiIgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9BbmRyb2lkX0Rlc2lnbl9Eb3dubG9hZHNfMjAxMjAyMjkuemlwIj5Eb3dubG9hZCBBbGw8L2E+Ci08L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGgyIGlkPSJzdGVuY2lscyI+U3RlbmNpbHMgYW5kIFNvdXJjZXM8L2gyPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotPHA+RHJhZyBhbmQgZHJvcCB5b3VyIHdheSB0byBiZWF1dGlmdWxseSBkZXNpZ25lZCBJY2UgQ3JlYW0gU2FuZHdpY2ggYXBwcy4gVGhlIHN0ZW5jaWxzIGZlYXR1cmUgdGhlCi1yaWNoIHR5cG9ncmFwaHksIGNvbG9ycywgaW50ZXJhY3RpdmUgY29udHJvbHMsIGFuZCBpY29ucyBmb3VuZCB0aHJvdWdob3V0IEFuZHJvaWQgNC4wLCBhbG9uZyB3aXRoCi1waG9uZSBhbmQgdGFibGV0IG91dGxpbmVzIHRvIGZyYW1lIHlvdXIgY3JlYXRpb25zLiBTb3VyY2UgZmlsZXMgZm9yIGljb25zIGFuZCBjb250cm9scyBhcmUgYWxzbwotYXZhaWxhYmxlLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZG93bmxvYWRzX3N0ZW5jaWxzLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08cD4KLSAgPGEgY2xhc3M9ImRvd25sb2FkLWJ1dHRvbiIgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9BbmRyb2lkX0Rlc2lnbl9GaXJld29ya3NfU3RlbmNpbF8yMDEyMDIyOS5wbmciPkFkb2JlJnJlZzsgRmlyZXdvcmtzJnJlZzsgUE5HIFN0ZW5jaWw8L2E+Ci0gIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fT21uaUdyYWZmbGVfU3RlbmNpbF8yMDEyMDIyOS5ncmFmZmxlIj5PbW5pJnJlZzsgT21uaUdyYWZmbGUmcmVnOyBTdGVuY2lsPC9hPgotICA8YSBjbGFzcz0iZG93bmxvYWQtYnV0dG9uIiBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL0FuZHJvaWRfRGVzaWduX0hvbG9fV2lkZ2V0c18yMDEyMDIyOS56aXAiPkFkb2JlJnJlZzsgUGhvdG9zaG9wJnJlZzsgU291cmNlczwvYT4KLTwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9ImFjdGlvbi1iYXItaWNvbi1wYWNrIj5BY3Rpb24gQmFyIEljb24gUGFjazwvaDI+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08cD5BY3Rpb24gYmFyIGljb25zIGFyZSBncmFwaGljIGJ1dHRvbnMgdGhhdCByZXByZXNlbnQgdGhlIG1vc3QgaW1wb3J0YW50IGFjdGlvbnMgcGVvcGxlIGNhbiB0YWtlCi13aXRoaW4geW91ciBhcHAuIDxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPk1vcmUgb24gQWN0aW9uIEJhciBJY29ub2dyYXBoeTwvYT48L3A+Ci08cD5UaGUgZG93bmxvYWQgcGFja2FnZSBpbmNsdWRlcyBpY29ucyB0aGF0IGFyZSBzY2FsZWQgZm9yIHZhcmlvdXMgc2NyZWVuIGRlbnNpdGllcyBhbmQgc3VpdGFibGUgZm9yCi11c2Ugd2l0aCB0aGUgSG9sbyBMaWdodCBhbmQgSG9sbyBEYXJrIHRoZW1lcy4gVGhlIHBhY2thZ2UgYWxzbyBpbmNsdWRlcyB1bnN0eWxlZCBpY29ucyB0aGF0IHlvdSBjYW4KLW1vZGlmeSB0byBtYXRjaCB5b3VyIHRoZW1lLCBwbHVzIHNvdXJjZSBmaWxlcy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9zdHlsZS5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotPHA+Ci0gIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fSWNvbnNfMjAxMjAyMjkuemlwIj5BY3Rpb24gQmFyIEljb24gUGFjazwvYT4KLTwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9InN0eWxlIj5TdHlsZTwvaDI+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+Um9ib3RvPC9oND4KLTxwPkljZSBDcmVhbSBTYW5kd2ljaCBpbnRyb2R1Y2VkIGEgbmV3IHR5cGUgZmFtaWx5IG5hbWVkIFJvYm90bywgY3JlYXRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZQotcmVxdWlyZW1lbnRzIG9mIFVJIGFuZCBoaWdoLXJlc29sdXRpb24gc2NyZWVucy48L3A+Ci08cD48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwjYWN0aW9uYmFyIj5Nb3JlIG9uIFJvYm90bzwvYT48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2Rvd25sb2Fkc19yb2JvdG9fc3BlY2ltZW5fcHJldmlldy5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotPHA+Ci0gIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vUm9ib3RvX0hpbnRlZF8yMDExMTEyOS56aXAiPlJvYm90bzwvYT4KLSAgPGEgY2xhc3M9ImRvd25sb2FkLWJ1dHRvbiIgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9Sb2JvdG9fU3BlY2ltZW5fQm9va18yMDExMTEyOS5wZGYiPlNwZWNpbWVuIEJvb2s8L2E+Ci08L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5Db2xvcjwvaDQ+Ci08cD5CbHVlIGlzIHRoZSBzdGFuZGFyZCBhY2NlbnQgY29sb3IgaW4gQW5kcm9pZCdzIGNvbG9yIHBhbGV0dGUuIEVhY2ggY29sb3IgaGFzIGEgY29ycmVzcG9uZGluZyBkYXJrZXIKLXNoYWRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBjb21wbGVtZW50IHdoZW4gbmVlZGVkLjwvcD4KLTxwPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPk1vcmUgb24gQ29sb3I8L2E+PC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9kb3dubG9hZHNfY29sb3Jfc3dhdGNoZXMucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxwPgotICA8YSBjbGFzcz0iZG93bmxvYWQtYnV0dG9uIiBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL0FuZHJvaWRfRGVzaWduX0NvbG9yX1N3YXRjaGVzXzIwMTIwMjI5LnppcCI+Q29sb3IgU3dhdGNoZXM8L2E+Ci08L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2Rvd25sb2Fkcy9pbmRleC5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vZG93bmxvYWRzL2luZGV4LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOGM0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2Rvd25sb2Fkcy9pbmRleC5qZApAQCAtMCwwICsxLDEyMSBAQAorcGFnZS50aXRsZT1Eb3dubG9hZHMKK0BqZDpib2R5CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgorCis8cD5XYW50IGV2ZXJ5dGhpbmc/IFdlJ3ZlIGJ1bmRsZWQgYWxsIHRoZSBkb3dubG9hZHMgYXZhaWxhYmxlIG9uIEFuZHJvaWQgRGVzaWduIGludG8gYSBzaW5nbGUgWklQIGZpbGUuCitZb3UgY2FuIGFsc28gZG93bmxvYWQgaW5kaXZpZHVhbCBmaWxlcyBsaXN0ZWQgYmVsb3cuPC9wPgorPHA+WW91IG1heSB1c2UgdGhlc2UgbWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24gaW4geW91ciBhcHBzIGFuZCB0byBkZXZlbG9wIHlvdXIgYXBwcy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCis8cD4KKyAgPGEgY2xhc3M9ImRvd25sb2FkLWJ1dHRvbiIgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9BbmRyb2lkX0Rlc2lnbl9Eb3dubG9hZHNfMjAxMjAyMjkuemlwIj5Eb3dubG9hZCBBbGw8L2E+Cis8L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGgyIGlkPSJzdGVuY2lscyI+U3RlbmNpbHMgYW5kIFNvdXJjZXM8L2gyPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPHA+RHJhZyBhbmQgZHJvcCB5b3VyIHdheSB0byBiZWF1dGlmdWxseSBkZXNpZ25lZCBJY2UgQ3JlYW0gU2FuZHdpY2ggYXBwcy4gVGhlIHN0ZW5jaWxzIGZlYXR1cmUgdGhlCityaWNoIHR5cG9ncmFwaHksIGNvbG9ycywgaW50ZXJhY3RpdmUgY29udHJvbHMsIGFuZCBpY29ucyBmb3VuZCB0aHJvdWdob3V0IEFuZHJvaWQgNC4wLCBhbG9uZyB3aXRoCitwaG9uZSBhbmQgdGFibGV0IG91dGxpbmVzIHRvIGZyYW1lIHlvdXIgY3JlYXRpb25zLiBTb3VyY2UgZmlsZXMgZm9yIGljb25zIGFuZCBjb250cm9scyBhcmUgYWxzbworYXZhaWxhYmxlLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9kb3dubG9hZHNfc3RlbmNpbHMucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxwPgorICA8YSBjbGFzcz0iZG93bmxvYWQtYnV0dG9uIiBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL0FuZHJvaWRfRGVzaWduX0ZpcmV3b3Jrc19TdGVuY2lsXzIwMTIwMjI5LnBuZyI+QWRvYmUmcmVnOyBGaXJld29ya3MmcmVnOyBQTkcgU3RlbmNpbDwvYT4KKyAgPGEgY2xhc3M9ImRvd25sb2FkLWJ1dHRvbiIgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9BbmRyb2lkX0Rlc2lnbl9PbW5pR3JhZmZsZV9TdGVuY2lsXzIwMTIwMjI5LmdyYWZmbGUiPk9tbmkmcmVnOyBPbW5pR3JhZmZsZSZyZWc7IFN0ZW5jaWw8L2E+CisgIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fSG9sb19XaWRnZXRzXzIwMTIwMjI5LnppcCI+QWRvYmUmcmVnOyBQaG90b3Nob3AmcmVnOyBTb3VyY2VzPC9hPgorPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxoMiBpZD0iYWN0aW9uLWJhci1pY29uLXBhY2siPkFjdGlvbiBCYXIgSWNvbiBQYWNrPC9oMj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxwPkFjdGlvbiBiYXIgaWNvbnMgYXJlIGdyYXBoaWMgYnV0dG9ucyB0aGF0IHJlcHJlc2VudCB0aGUgbW9zdCBpbXBvcnRhbnQgYWN0aW9ucyBwZW9wbGUgY2FuIHRha2UKK3dpdGhpbiB5b3VyIGFwcC4gPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5Nb3JlIG9uIEFjdGlvbiBCYXIgSWNvbm9ncmFwaHk8L2E+PC9wPgorPHA+VGhlIGRvd25sb2FkIHBhY2thZ2UgaW5jbHVkZXMgaWNvbnMgdGhhdCBhcmUgc2NhbGVkIGZvciB2YXJpb3VzIHNjcmVlbiBkZW5zaXRpZXMgYW5kIHN1aXRhYmxlIGZvcgordXNlIHdpdGggdGhlIEhvbG8gTGlnaHQgYW5kIEhvbG8gRGFyayB0aGVtZXMuIFRoZSBwYWNrYWdlIGFsc28gaW5jbHVkZXMgdW5zdHlsZWQgaWNvbnMgdGhhdCB5b3UgY2FuCittb2RpZnkgdG8gbWF0Y2ggeW91ciB0aGVtZSwgcGx1cyBzb3VyY2UgZmlsZXMuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9zdHlsZS5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPHA+CisgIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fSWNvbnNfMjAxMjAyMjkuemlwIj5BY3Rpb24gQmFyIEljb24gUGFjazwvYT4KKzwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9InN0eWxlIj5TdHlsZTwvaDI+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+Um9ib3RvPC9oND4KKzxwPkljZSBDcmVhbSBTYW5kd2ljaCBpbnRyb2R1Y2VkIGEgbmV3IHR5cGUgZmFtaWx5IG5hbWVkIFJvYm90bywgY3JlYXRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZQorcmVxdWlyZW1lbnRzIG9mIFVJIGFuZCBoaWdoLXJlc29sdXRpb24gc2NyZWVucy48L3A+Cis8cD48YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCNhY3Rpb25iYXIiPk1vcmUgb24gUm9ib3RvPC9hPjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9kb3dubG9hZHNfcm9ib3RvX3NwZWNpbWVuX3ByZXZpZXcucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxwPgorICA8YSBjbGFzcz0iZG93bmxvYWQtYnV0dG9uIiBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL1JvYm90b19IaW50ZWRfMjAxMTExMjkuemlwIj5Sb2JvdG88L2E+CisgIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vUm9ib3RvX1NwZWNpbWVuX0Jvb2tfMjAxMTExMjkucGRmIj5TcGVjaW1lbiBCb29rPC9hPgorPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+Q29sb3I8L2g0PgorPHA+Qmx1ZSBpcyB0aGUgc3RhbmRhcmQgYWNjZW50IGNvbG9yIGluIEFuZHJvaWQncyBjb2xvciBwYWxldHRlLiBFYWNoIGNvbG9yIGhhcyBhIGNvcnJlc3BvbmRpbmcgZGFya2VyCitzaGFkZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgY29tcGxlbWVudCB3aGVuIG5lZWRlZC48L3A+Cis8cD48YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL3N0eWxlL2NvbG9yLmh0bWwiPk1vcmUgb24gQ29sb3I8L2E+PC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2Rvd25sb2Fkc19jb2xvcl9zd2F0Y2hlcy5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPHA+CisgIDxhIGNsYXNzPSJkb3dubG9hZC1idXR0b24iIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fQ29sb3JfU3dhdGNoZXNfMjAxMjAyMjkuemlwIj5Db2xvciBTd2F0Y2hlczwvYT4KKzwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGY4ZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBDcmVhdGl2ZSBWaXNpb24KLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+Q3JlYXRpdmUgVmlzaW9uPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvY3JlYXRpdmVfdmlzaW9uX21haW4ucG5nIj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxwPkljZSBDcmVhbSBTYW5kd2ljaCAoQW5kcm9pZCA0LjApIG1hcmtzIGEgbWFqb3IgbWlsZXN0b25lIGZvciBBbmRyb2lkIGRlc2lnbi4gV2UgdG91Y2hlZCBuZWFybHkgZXZlcnkKLXBpeGVsIG9mIHRoZSBzeXN0ZW0gYXMgd2UgZXhwYW5kZWQgdGhlIG5ldyBkZXNpZ24gYXBwcm9hY2hlcyBpbnRyb2R1Y2VkIGluIEhvbmV5Y29tYiB0YWJsZXRzIHRvIGFsbAotdHlwZXMgb2YgbW9iaWxlIGRldmljZXMuIFN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgYmFzaWMgZWxlbWVudHMsIHdlIGludHJvZHVjZWQgYSBuZXcgZm9udCwgUm9ib3RvLAotZGVzaWduZWQgZm9yIGhpZ2gtcmVzb2x1dGlvbiBkaXNwbGF5cy4gT3RoZXIgYmlnIGNoYW5nZXMgaW5jbHVkZSBmcmFtZXdvcmstbGV2ZWwgYWN0aW9uIGJhcnMgb24KLXBob25lcyBhbmQgc3VwcG9ydCBmb3IgbmV3IHBob25lcyB3aXRob3V0IHBoeXNpY2FsIGJ1dHRvbnMuPC9wPgotPHA+V2UgZm9jdXNlZCB0aGUgZGVzaWduIHdvcmsgd2l0aCB0aHJlZSBvdmVyYXJjaGluZyBnb2FscyBmb3Igb3VyIGNvcmUgYXBwcyBhbmQgdGhlIHN5c3RlbSBhdCBsYXJnZS4KLUFzIHlvdSBkZXNpZ24gYXBwcyB0byB3b3JrIHdpdGggQW5kcm9pZCwgY29uc2lkZXIgdGhlc2UgZ29hbHM6PC9wPgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxoND5FbmNoYW50IG1lPC9oND4KLTxwPkJlYXV0eSBpcyBtb3JlIHRoYW4gc2tpbiBkZWVwLiBBbmRyb2lkIGFwcHMgYXJlIHNsZWVrIGFuZCBhZXN0aGV0aWNhbGx5IHBsZWFzaW5nIG9uIG11bHRpcGxlIGxldmVscy4KLVRyYW5zaXRpb25zIGFyZSBmYXN0IGFuZCBjbGVhcjsgbGF5b3V0IGFuZCB0eXBvZ3JhcGh5IGFyZSBjcmlzcCBhbmQgbWVhbmluZ2Z1bC4gQXBwIGljb25zIGFyZSB3b3Jrcwotb2YgYXJ0IGluIHRoZWlyIG93biByaWdodC4gSnVzdCBsaWtlIGEgd2VsbC1tYWRlIHRvb2wsIHlvdXIgYXBwIHNob3VsZCBzdHJpdmUgdG8gY29tYmluZSBiZWF1dHksCi1zaW1wbGljaXR5IGFuZCBwdXJwb3NlIHRvIGNyZWF0ZSBhIG1hZ2ljYWwgZXhwZXJpZW5jZSB0aGF0IGlzIGVmZm9ydGxlc3MgYW5kIHBvd2VyZnVsLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5TaW1wbGlmeSBteSBsaWZlPC9oND4KLTxwPkFuZHJvaWQgYXBwcyBtYWtlIGxpZmUgZWFzaWVyIGFuZCBhcmUgZWFzeSB0byB1bmRlcnN0YW5kLiBXaGVuIHBlb3BsZSB1c2UgeW91ciBhcHAgZm9yIHRoZSBmaXJzdAotdGltZSwgdGhleSBzaG91bGQgaW50dWl0aXZlbHkgZ3Jhc3AgdGhlIG1vc3QgaW1wb3J0YW50IGZlYXR1cmVzLiBUaGUgZGVzaWduIHdvcmsgZG9lc24ndCBzdG9wIGF0IHRoZQotZmlyc3QgdXNlLCB0aG91Z2guIEFuZHJvaWQgYXBwcyByZW1vdmUgb25nb2luZyBjaG9yZXMgbGlrZSBmaWxlIG1hbmFnZW1lbnQgYW5kIHN5bmNpbmcuIFNpbXBsZSB0YXNrcwotbmV2ZXIgcmVxdWlyZSBjb21wbGV4IHByb2NlZHVyZXMsIGFuZCBjb21wbGV4IHRhc2tzIGFyZSB0YWlsb3JlZCB0byB0aGUgaHVtYW4gaGFuZCBhbmQgbWluZC4gUGVvcGxlCi1vZiBhbGwgYWdlcyBhbmQgY3VsdHVyZXMgZmVlbCBmaXJtbHkgaW4gY29udHJvbCwgYW5kIGFyZSBuZXZlciBvdmVyd2hlbG1lZCBieSB0b28gbWFueSBjaG9pY2VzIG9yCi1pcnJlbGV2YW50IGZsYXNoLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxoND5NYWtlIG1lIGFtYXppbmc8L2g0PgotPHA+SXQncyBub3QgZW5vdWdoIHRvIG1ha2UgYW4gYXBwIHRoYXQgaXMgZWFzeSB0byB1c2UuIEFuZHJvaWQgYXBwcyBlbXBvd2VyIHBlb3BsZSB0byB0cnkgbmV3IHRoaW5ncwotYW5kIHRvIHVzZSBhcHBzIGluIGludmVudGl2ZSBuZXcgd2F5cy4gQW5kcm9pZCBsZXRzIHBlb3BsZSBjb21iaW5lIGFwcGxpY2F0aW9ucyBpbnRvIG5ldyB3b3JrZmxvd3MKLXRocm91Z2ggbXVsdGl0YXNraW5nLCBub3RpZmljYXRpb25zLCBhbmQgc2hhcmluZyBhY3Jvc3MgYXBwcy4gQXQgdGhlIHNhbWUgdGltZSwgeW91ciBhcHAgc2hvdWxkIGZlZWwKLXBlcnNvbmFsLCBnaXZpbmcgcGVvcGxlIGFjY2VzcyB0byBzdXBlcmIgdGVjaG5vbG9neSB3aXRoIGNsYXJpdHkgYW5kIGdyYWNlLjwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyYjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmpkCkBAIC0wLDAgKzEsNDggQEAKK3BhZ2UudGl0bGU9Q3JlYXRpdmUgVmlzaW9uCitAamQ6Ym9keQorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9jcmVhdGl2ZV92aXNpb25fbWFpbi5wbmciPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KKworPHA+SWNlIENyZWFtIFNhbmR3aWNoIChBbmRyb2lkIDQuMCkgbWFya3MgYSBtYWpvciBtaWxlc3RvbmUgZm9yIEFuZHJvaWQgZGVzaWduLiBXZSB0b3VjaGVkIG5lYXJseSBldmVyeQorcGl4ZWwgb2YgdGhlIHN5c3RlbSBhcyB3ZSBleHBhbmRlZCB0aGUgbmV3IGRlc2lnbiBhcHByb2FjaGVzIGludHJvZHVjZWQgaW4gSG9uZXljb21iIHRhYmxldHMgdG8gYWxsCit0eXBlcyBvZiBtb2JpbGUgZGV2aWNlcy4gU3RhcnRpbmcgd2l0aCB0aGUgbW9zdCBiYXNpYyBlbGVtZW50cywgd2UgaW50cm9kdWNlZCBhIG5ldyBmb250LCBSb2JvdG8sCitkZXNpZ25lZCBmb3IgaGlnaC1yZXNvbHV0aW9uIGRpc3BsYXlzLiBPdGhlciBiaWcgY2hhbmdlcyBpbmNsdWRlIGZyYW1ld29yay1sZXZlbCBhY3Rpb24gYmFycyBvbgorcGhvbmVzIGFuZCBzdXBwb3J0IGZvciBuZXcgcGhvbmVzIHdpdGhvdXQgcGh5c2ljYWwgYnV0dG9ucy48L3A+Cis8cD5XZSBmb2N1c2VkIHRoZSBkZXNpZ24gd29yayB3aXRoIHRocmVlIG92ZXJhcmNoaW5nIGdvYWxzIGZvciBvdXIgY29yZSBhcHBzIGFuZCB0aGUgc3lzdGVtIGF0IGxhcmdlLgorQXMgeW91IGRlc2lnbiBhcHBzIHRvIHdvcmsgd2l0aCBBbmRyb2lkLCBjb25zaWRlciB0aGVzZSBnb2Fsczo8L3A+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPGg0PkVuY2hhbnQgbWU8L2g0PgorPHA+QmVhdXR5IGlzIG1vcmUgdGhhbiBza2luIGRlZXAuIEFuZHJvaWQgYXBwcyBhcmUgc2xlZWsgYW5kIGFlc3RoZXRpY2FsbHkgcGxlYXNpbmcgb24gbXVsdGlwbGUgbGV2ZWxzLgorVHJhbnNpdGlvbnMgYXJlIGZhc3QgYW5kIGNsZWFyOyBsYXlvdXQgYW5kIHR5cG9ncmFwaHkgYXJlIGNyaXNwIGFuZCBtZWFuaW5nZnVsLiBBcHAgaWNvbnMgYXJlIHdvcmtzCitvZiBhcnQgaW4gdGhlaXIgb3duIHJpZ2h0LiBKdXN0IGxpa2UgYSB3ZWxsLW1hZGUgdG9vbCwgeW91ciBhcHAgc2hvdWxkIHN0cml2ZSB0byBjb21iaW5lIGJlYXV0eSwKK3NpbXBsaWNpdHkgYW5kIHB1cnBvc2UgdG8gY3JlYXRlIGEgbWFnaWNhbCBleHBlcmllbmNlIHRoYXQgaXMgZWZmb3J0bGVzcyBhbmQgcG93ZXJmdWwuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPGg0PlNpbXBsaWZ5IG15IGxpZmU8L2g0PgorPHA+QW5kcm9pZCBhcHBzIG1ha2UgbGlmZSBlYXNpZXIgYW5kIGFyZSBlYXN5IHRvIHVuZGVyc3RhbmQuIFdoZW4gcGVvcGxlIHVzZSB5b3VyIGFwcCBmb3IgdGhlIGZpcnN0Cit0aW1lLCB0aGV5IHNob3VsZCBpbnR1aXRpdmVseSBncmFzcCB0aGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMuIFRoZSBkZXNpZ24gd29yayBkb2Vzbid0IHN0b3AgYXQgdGhlCitmaXJzdCB1c2UsIHRob3VnaC4gQW5kcm9pZCBhcHBzIHJlbW92ZSBvbmdvaW5nIGNob3JlcyBsaWtlIGZpbGUgbWFuYWdlbWVudCBhbmQgc3luY2luZy4gU2ltcGxlIHRhc2tzCituZXZlciByZXF1aXJlIGNvbXBsZXggcHJvY2VkdXJlcywgYW5kIGNvbXBsZXggdGFza3MgYXJlIHRhaWxvcmVkIHRvIHRoZSBodW1hbiBoYW5kIGFuZCBtaW5kLiBQZW9wbGUKK29mIGFsbCBhZ2VzIGFuZCBjdWx0dXJlcyBmZWVsIGZpcm1seSBpbiBjb250cm9sLCBhbmQgYXJlIG5ldmVyIG92ZXJ3aGVsbWVkIGJ5IHRvbyBtYW55IGNob2ljZXMgb3IKK2lycmVsZXZhbnQgZmxhc2guPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPGg0Pk1ha2UgbWUgYW1hemluZzwvaDQ+Cis8cD5JdCdzIG5vdCBlbm91Z2ggdG8gbWFrZSBhbiBhcHAgdGhhdCBpcyBlYXN5IHRvIHVzZS4gQW5kcm9pZCBhcHBzIGVtcG93ZXIgcGVvcGxlIHRvIHRyeSBuZXcgdGhpbmdzCithbmQgdG8gdXNlIGFwcHMgaW4gaW52ZW50aXZlIG5ldyB3YXlzLiBBbmRyb2lkIGxldHMgcGVvcGxlIGNvbWJpbmUgYXBwbGljYXRpb25zIGludG8gbmV3IHdvcmtmbG93cwordGhyb3VnaCBtdWx0aXRhc2tpbmcsIG5vdGlmaWNhdGlvbnMsIGFuZCBzaGFyaW5nIGFjcm9zcyBhcHBzLiBBdCB0aGUgc2FtZSB0aW1lLCB5b3VyIGFwcCBzaG91bGQgZmVlbAorcGVyc29uYWwsIGdpdmluZyBwZW9wbGUgYWNjZXNzIHRvIHN1cGVyYiB0ZWNobm9sb2d5IHdpdGggY2xhcml0eSBhbmQgZ3JhY2UuPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTBhOTBkLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIERlc2lnbiBQcmluY2lwbGVzCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkRlc2lnbiBQcmluY2lwbGVzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5UaGVzZSBkZXNpZ24gcHJpbmNpcGxlcyB3ZXJlIGRldmVsb3BlZCBieSBhbmQgZm9yIHRoZSBBbmRyb2lkIFVzZXIgRXhwZXJpZW5jZSBUZWFtIHRvIGtlZXAgdXNlcnMnCi1iZXN0IGludGVyZXN0cyBpbiBtaW5kLiBDb25zaWRlciB0aGVtIGFzIHlvdSBhcHBseSB5b3VyIG93biBjcmVhdGl2aXR5IGFuZCBkZXNpZ24gdGhpbmtpbmcuIERldmlhdGUKLXdpdGggcHVycG9zZS48L3A+Ci0KLTxoMiBpZD0iZW5jaGFudC1tZSI+RW5jaGFudCBNZTwvaDI+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+RGVsaWdodCBtZSBpbiBzdXJwcmlzaW5nIHdheXM8L2g0PgotPHA+QSBiZWF1dGlmdWwgc3VyZmFjZSwgYSBjYXJlZnVsbHktcGxhY2VkIGFuaW1hdGlvbiwgb3IgYSB3ZWxsLXRpbWVkIHNvdW5kIGVmZmVjdCBpcyBhIGpveSB0bwotZXhwZXJpZW5jZS4gU3VidGxlIGVmZmVjdHMgY29udHJpYnV0ZSB0byBhIGZlZWxpbmcgb2YgZWZmb3J0bGVzc25lc3MgYW5kIGEgc2Vuc2UgdGhhdCBhIHBvd2VyZnVsCi1mb3JjZSBpcyBhdCBoYW5kLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19kZWxpZ2h0LnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+UmVhbCBvYmplY3RzIGFyZSBtb3JlIGZ1biB0aGFuIGJ1dHRvbnMgYW5kIG1lbnVzPC9oND4KLTxwPkFsbG93IHBlb3BsZSB0byBkaXJlY3RseSB0b3VjaCBhbmQgbWFuaXB1bGF0ZSBvYmplY3RzIGluIHlvdXIgYXBwLiBJdCByZWR1Y2VzIHRoZSBjb2duaXRpdmUgZWZmb3J0Ci1uZWVkZWQgdG8gcGVyZm9ybSBhIHRhc2sgd2hpbGUgbWFraW5nIGl0IG1vcmUgZW1vdGlvbmFsbHkgc2F0aXNmeWluZy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfcmVhbF9vYmplY3RzLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+TGV0IG1lIG1ha2UgaXQgbWluZTwvaDQ+Ci08cD5QZW9wbGUgbG92ZSB0byBhZGQgcGVyc29uYWwgdG91Y2hlcyBiZWNhdXNlIGl0IGhlbHBzIHRoZW0gZmVlbCBhdCBob21lIGFuZCBpbiBjb250cm9sLiBQcm92aWRlCi1zZW5zaWJsZSwgYmVhdXRpZnVsIGRlZmF1bHRzLCBidXQgYWxzbyBjb25zaWRlciBmdW4sIG9wdGlvbmFsIGN1c3RvbWl6YXRpb25zIHRoYXQgZG9uJ3QgaGluZGVyCi1wcmltYXJ5IHRhc2tzLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19tYWtlX2l0X21pbmUucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5HZXQgdG8ga25vdyBtZTwvaDQ+Ci08cD5MZWFybiBwZW9wbGVzJyBwcmVmZXJlbmNlcyBvdmVyIHRpbWUuIFJhdGhlciB0aGFuIGFza2luZyB0aGVtIHRvIG1ha2UgdGhlIHNhbWUgY2hvaWNlcyBvdmVyIGFuZAotb3ZlciwgcGxhY2UgcHJldmlvdXMgY2hvaWNlcyB3aXRoaW4gZWFzeSByZWFjaC48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfZ2V0X3RvX2tub3dfbWUucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9InNpbXBsaWZ5LW15LWxpZmUiPlNpbXBsaWZ5IE15IExpZmU8L2gyPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0PktlZXAgaXQgYnJpZWY8L2g0PgotPHA+VXNlIHNob3J0IHBocmFzZXMgd2l0aCBzaW1wbGUgd29yZHMuIFBlb3BsZSBhcmUgbGlrZWx5IHRvIHNraXAgc2VudGVuY2VzIGlmIHRoZXkncmUgbG9uZy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfa2VlcF9pdF9icmllZi5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0PlBpY3R1cmVzIGFyZSBmYXN0ZXIgdGhhbiB3b3JkczwvaDQ+Ci08cD5Db25zaWRlciB1c2luZyBwaWN0dXJlcyB0byBleHBsYWluIGlkZWFzLiBUaGV5IGdldCBwZW9wbGUncyBhdHRlbnRpb24gYW5kIGNhbiBiZSBtdWNoIG1vcmUgZWZmaWNpZW50Ci10aGFuIHdvcmRzLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19waWN0dXJlcy5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0PkRlY2lkZSBmb3IgbWUgYnV0IGxldCBtZSBoYXZlIHRoZSBmaW5hbCBzYXk8L2g0PgotPHA+VGFrZSB5b3VyIGJlc3QgZ3Vlc3MgYW5kIGFjdCByYXRoZXIgdGhhbiBhc2tpbmcgZmlyc3QuIFRvbyBtYW55IGNob2ljZXMgYW5kIGRlY2lzaW9ucyBtYWtlIHBlb3BsZQotdW5oYXBweS4gSnVzdCBpbiBjYXNlIHlvdSBnZXQgaXQgd3JvbmcsIGFsbG93IGZvciAndW5kbycuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2RlY2lkZV9mb3JfbWUucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5Pbmx5IHNob3cgd2hhdCBJIG5lZWQgd2hlbiBJIG5lZWQgaXQ8L2g0PgotPHA+UGVvcGxlIGdldCBvdmVyd2hlbG1lZCB3aGVuIHRoZXkgc2VlIHRvbyBtdWNoIGF0IG9uY2UuIEJyZWFrIHRhc2tzIGFuZCBpbmZvcm1hdGlvbiBpbnRvIHNtYWxsLAotZGlnZXN0aWJsZSBjaHVua3MuIEhpZGUgb3B0aW9ucyB0aGF0IGFyZW4ndCBlc3NlbnRpYWwgYXQgdGhlIG1vbWVudCwgYW5kIHRlYWNoIHBlb3BsZSBhcyB0aGV5IGdvLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19pbmZvcm1hdGlvbl93aGVuX25lZWRfaXQucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5JIHNob3VsZCBhbHdheXMga25vdyB3aGVyZSBJIGFtPC9oND4KLTxwPkdpdmUgcGVvcGxlIGNvbmZpZGVuY2UgdGhhdCB0aGV5IGtub3cgdGhlaXIgd2F5IGFyb3VuZC4gTWFrZSBwbGFjZXMgaW4geW91ciBhcHAgbG9vayBkaXN0aW5jdCBhbmQKLXVzZSB0cmFuc2l0aW9ucyB0byBzaG93IHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NyZWVucy4gUHJvdmlkZSBmZWVkYmFjayBvbiB0YXNrcyBpbiBwcm9ncmVzcy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfbmF2aWdhdGlvbi5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0Pk5ldmVyIGxvc2UgbXkgc3R1ZmY8L2g0PgotPHA+U2F2ZSB3aGF0IHBlb3BsZSB0b29rIHRpbWUgdG8gY3JlYXRlIGFuZCBsZXQgdGhlbSBhY2Nlc3MgaXQgZnJvbSBhbnl3aGVyZS4gUmVtZW1iZXIgc2V0dGluZ3MsCi1wZXJzb25hbCB0b3VjaGVzLCBhbmQgY3JlYXRpb25zIGFjcm9zcyBwaG9uZXMsIHRhYmxldHMsIGFuZCBjb21wdXRlcnMuIEl0IG1ha2VzIHVwZ3JhZGluZyB0aGUKLWVhc2llc3QgdGhpbmcgaW4gdGhlIHdvcmxkLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19uZXZlcl9sb3NlX3N0dWZmLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+SWYgaXQgbG9va3MgdGhlIHNhbWUsIGl0IHNob3VsZCBhY3QgdGhlIHNhbWU8L2g0PgotPHA+SGVscCBwZW9wbGUgZGlzY2VybiBmdW5jdGlvbmFsIGRpZmZlcmVuY2VzIGJ5IG1ha2luZyB0aGVtIHZpc3VhbGx5IGRpc3RpbmN0IHJhdGhlciB0aGFuIHN1YnRsZS4KLUF2b2lkIG1vZGVzLCB3aGljaCBhcmUgcGxhY2VzIHRoYXQgbG9vayBzaW1pbGFyIGJ1dCBhY3QgZGlmZmVyZW50bHkgb24gdGhlIHNhbWUgaW5wdXQuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2xvb2tzX3NhbWUucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5Pbmx5IGludGVycnVwdCBtZSBpZiBpdCdzIGltcG9ydGFudDwvaDQ+Ci08cD5MaWtlIGEgZ29vZCBwZXJzb25hbCBhc3Npc3RhbnQsIHNoaWVsZCBwZW9wbGUgZnJvbSB1bmltcG9ydGFudCBtaW51dGlhZS4gUGVvcGxlIHdhbnQgdG8gc3RheQotZm9jdXNlZCwgYW5kIHVubGVzcyBpdCdzIGNyaXRpY2FsIGFuZCB0aW1lLXNlbnNpdGl2ZSwgYW4gaW50ZXJydXB0aW9uIGNhbiBiZSB0YXhpbmcgYW5kIGZydXN0cmF0aW5nLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19pbXBvcnRhbnRfaW50ZXJydXB0aW9uLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGgyIGlkPSJtYWtlLW1lLWFtYXppbmciPk1ha2UgTWUgQW1hemluZzwvaDI+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+R2l2ZSBtZSB0cmlja3MgdGhhdCB3b3JrIGV2ZXJ5d2hlcmU8L2g0PgotPHA+UGVvcGxlIGZlZWwgZ3JlYXQgd2hlbiB0aGV5IGZpZ3VyZSB0aGluZ3Mgb3V0IGZvciB0aGVtc2VsdmVzLiBNYWtlIHlvdXIgYXBwIGVhc2llciB0byBsZWFybiBieQotbGV2ZXJhZ2luZyB2aXN1YWwgcGF0dGVybnMgYW5kIG11c2NsZSBtZW1vcnkgZnJvbSBvdGhlciBBbmRyb2lkIGFwcHMuIEZvciBleGFtcGxlLCB0aGUgc3dpcGUgZ2VzdHVyZQotbWF5IGJlIGEgZ29vZCBuYXZpZ2F0aW9uYWwgc2hvcnRjdXQuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3RyaWNrcy5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0Pkl0J3Mgbm90IG15IGZhdWx0PC9oND4KLTxwPkJlIGdlbnRsZSBpbiBob3cgeW91IHByb21wdCBwZW9wbGUgdG8gbWFrZSBjb3JyZWN0aW9ucy4gVGhleSB3YW50IHRvIGZlZWwgc21hcnQgd2hlbiB0aGV5IHVzZSB5b3VyCi1hcHAuIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBnaXZlIGNsZWFyIHJlY292ZXJ5IGluc3RydWN0aW9ucyBidXQgc3BhcmUgdGhlbSB0aGUgdGVjaG5pY2FsIGRldGFpbHMuCi1JZiB5b3UgY2FuIGZpeCBpdCBiZWhpbmQgdGhlIHNjZW5lcywgZXZlbiBiZXR0ZXIuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2Vycm9yLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+U3ByaW5rbGUgZW5jb3VyYWdlbWVudDwvaDQ+Ci08cD5CcmVhayBjb21wbGV4IHRhc2tzIGludG8gc21hbGxlciBzdGVwcyB0aGF0IGNhbiBiZSBlYXNpbHkgYWNjb21wbGlzaGVkLiBHaXZlIGZlZWRiYWNrIG9uIGFjdGlvbnMsCi1ldmVuIGlmIGl0J3MganVzdCBhIHN1YnRsZSBnbG93LjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19zcHJpbmtsZV9lbmNvdXJhZ2VtZW50LnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+RG8gdGhlIGhlYXZ5IGxpZnRpbmcgZm9yIG1lPC9oND4KLTxwPk1ha2Ugbm92aWNlcyBmZWVsIGxpa2UgZXhwZXJ0cyBieSBlbmFibGluZyB0aGVtIHRvIGRvIHRoaW5ncyB0aGV5IG5ldmVyIHRob3VnaHQgdGhleSBjb3VsZC4gRm9yCi1leGFtcGxlLCBzaG9ydGN1dHMgdGhhdCBjb21iaW5lIG11bHRpcGxlIHBob3RvIGVmZmVjdHMgY2FuIG1ha2UgYW1hdGV1ciBwaG90b2dyYXBocyBsb29rIGFtYXppbmcgaW4KLW9ubHkgYSBmZXcgc3RlcHMuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2hlYXZ5X2xpZnRpbmcucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5NYWtlIGltcG9ydGFudCB0aGluZ3MgZmFzdDwvaDQ+Ci08cD5Ob3QgYWxsIGFjdGlvbnMgYXJlIGVxdWFsLiBEZWNpZGUgd2hhdCdzIG1vc3QgaW1wb3J0YW50IGluIHlvdXIgYXBwIGFuZCBtYWtlIGl0IGVhc3kgdG8gZmluZCBhbmQKLWZhc3QgdG8gdXNlLCBsaWtlIHRoZSBzaHV0dGVyIGJ1dHRvbiBpbiBhIGNhbWVyYSwgb3IgdGhlIHBhdXNlIGJ1dHRvbiBpbiBhIG11c2ljIHBsYXllci48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfbWFrZV9pbXBvcnRhbnRfZmFzdC5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWI0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuamQKQEAgLTAsMCArMSwzMDAgQEAKK3BhZ2UudGl0bGU9RGVzaWduIFByaW5jaXBsZXMKK0BqZDpib2R5CisKKzxwPlRoZXNlIGRlc2lnbiBwcmluY2lwbGVzIHdlcmUgZGV2ZWxvcGVkIGJ5IGFuZCBmb3IgdGhlIEFuZHJvaWQgVXNlciBFeHBlcmllbmNlIFRlYW0gdG8ga2VlcCB1c2VycycKK2Jlc3QgaW50ZXJlc3RzIGluIG1pbmQuIENvbnNpZGVyIHRoZW0gYXMgeW91IGFwcGx5IHlvdXIgb3duIGNyZWF0aXZpdHkgYW5kIGRlc2lnbiB0aGlua2luZy4gRGV2aWF0ZQord2l0aCBwdXJwb3NlLjwvcD4KKworPGgyIGlkPSJlbmNoYW50LW1lIj5FbmNoYW50IE1lPC9oMj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5EZWxpZ2h0IG1lIGluIHN1cnByaXNpbmcgd2F5czwvaDQ+Cis8cD5BIGJlYXV0aWZ1bCBzdXJmYWNlLCBhIGNhcmVmdWxseS1wbGFjZWQgYW5pbWF0aW9uLCBvciBhIHdlbGwtdGltZWQgc291bmQgZWZmZWN0IGlzIGEgam95IHRvCitleHBlcmllbmNlLiBTdWJ0bGUgZWZmZWN0cyBjb250cmlidXRlIHRvIGEgZmVlbGluZyBvZiBlZmZvcnRsZXNzbmVzcyBhbmQgYSBzZW5zZSB0aGF0IGEgcG93ZXJmdWwKK2ZvcmNlIGlzIGF0IGhhbmQuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfZGVsaWdodC5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0PlJlYWwgb2JqZWN0cyBhcmUgbW9yZSBmdW4gdGhhbiBidXR0b25zIGFuZCBtZW51czwvaDQ+Cis8cD5BbGxvdyBwZW9wbGUgdG8gZGlyZWN0bHkgdG91Y2ggYW5kIG1hbmlwdWxhdGUgb2JqZWN0cyBpbiB5b3VyIGFwcC4gSXQgcmVkdWNlcyB0aGUgY29nbml0aXZlIGVmZm9ydAorbmVlZGVkIHRvIHBlcmZvcm0gYSB0YXNrIHdoaWxlIG1ha2luZyBpdCBtb3JlIGVtb3Rpb25hbGx5IHNhdGlzZnlpbmcuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfcmVhbF9vYmplY3RzLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+TGV0IG1lIG1ha2UgaXQgbWluZTwvaDQ+Cis8cD5QZW9wbGUgbG92ZSB0byBhZGQgcGVyc29uYWwgdG91Y2hlcyBiZWNhdXNlIGl0IGhlbHBzIHRoZW0gZmVlbCBhdCBob21lIGFuZCBpbiBjb250cm9sLiBQcm92aWRlCitzZW5zaWJsZSwgYmVhdXRpZnVsIGRlZmF1bHRzLCBidXQgYWxzbyBjb25zaWRlciBmdW4sIG9wdGlvbmFsIGN1c3RvbWl6YXRpb25zIHRoYXQgZG9uJ3QgaGluZGVyCitwcmltYXJ5IHRhc2tzLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX21ha2VfaXRfbWluZS5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0PkdldCB0byBrbm93IG1lPC9oND4KKzxwPkxlYXJuIHBlb3BsZXMnIHByZWZlcmVuY2VzIG92ZXIgdGltZS4gUmF0aGVyIHRoYW4gYXNraW5nIHRoZW0gdG8gbWFrZSB0aGUgc2FtZSBjaG9pY2VzIG92ZXIgYW5kCitvdmVyLCBwbGFjZSBwcmV2aW91cyBjaG9pY2VzIHdpdGhpbiBlYXN5IHJlYWNoLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2dldF90b19rbm93X21lLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGgyIGlkPSJzaW1wbGlmeS1teS1saWZlIj5TaW1wbGlmeSBNeSBMaWZlPC9oMj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5LZWVwIGl0IGJyaWVmPC9oND4KKzxwPlVzZSBzaG9ydCBwaHJhc2VzIHdpdGggc2ltcGxlIHdvcmRzLiBQZW9wbGUgYXJlIGxpa2VseSB0byBza2lwIHNlbnRlbmNlcyBpZiB0aGV5J3JlIGxvbmcuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfa2VlcF9pdF9icmllZi5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0PlBpY3R1cmVzIGFyZSBmYXN0ZXIgdGhhbiB3b3JkczwvaDQ+Cis8cD5Db25zaWRlciB1c2luZyBwaWN0dXJlcyB0byBleHBsYWluIGlkZWFzLiBUaGV5IGdldCBwZW9wbGUncyBhdHRlbnRpb24gYW5kIGNhbiBiZSBtdWNoIG1vcmUgZWZmaWNpZW50Cit0aGFuIHdvcmRzLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX3BpY3R1cmVzLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+RGVjaWRlIGZvciBtZSBidXQgbGV0IG1lIGhhdmUgdGhlIGZpbmFsIHNheTwvaDQ+Cis8cD5UYWtlIHlvdXIgYmVzdCBndWVzcyBhbmQgYWN0IHJhdGhlciB0aGFuIGFza2luZyBmaXJzdC4gVG9vIG1hbnkgY2hvaWNlcyBhbmQgZGVjaXNpb25zIG1ha2UgcGVvcGxlCit1bmhhcHB5LiBKdXN0IGluIGNhc2UgeW91IGdldCBpdCB3cm9uZywgYWxsb3cgZm9yICd1bmRvJy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19kZWNpZGVfZm9yX21lLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+T25seSBzaG93IHdoYXQgSSBuZWVkIHdoZW4gSSBuZWVkIGl0PC9oND4KKzxwPlBlb3BsZSBnZXQgb3ZlcndoZWxtZWQgd2hlbiB0aGV5IHNlZSB0b28gbXVjaCBhdCBvbmNlLiBCcmVhayB0YXNrcyBhbmQgaW5mb3JtYXRpb24gaW50byBzbWFsbCwKK2RpZ2VzdGlibGUgY2h1bmtzLiBIaWRlIG9wdGlvbnMgdGhhdCBhcmVuJ3QgZXNzZW50aWFsIGF0IHRoZSBtb21lbnQsIGFuZCB0ZWFjaCBwZW9wbGUgYXMgdGhleSBnby48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19pbmZvcm1hdGlvbl93aGVuX25lZWRfaXQucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5JIHNob3VsZCBhbHdheXMga25vdyB3aGVyZSBJIGFtPC9oND4KKzxwPkdpdmUgcGVvcGxlIGNvbmZpZGVuY2UgdGhhdCB0aGV5IGtub3cgdGhlaXIgd2F5IGFyb3VuZC4gTWFrZSBwbGFjZXMgaW4geW91ciBhcHAgbG9vayBkaXN0aW5jdCBhbmQKK3VzZSB0cmFuc2l0aW9ucyB0byBzaG93IHJlbGF0aW9uc2hpcHMgYW1vbmcgc2NyZWVucy4gUHJvdmlkZSBmZWVkYmFjayBvbiB0YXNrcyBpbiBwcm9ncmVzcy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19uYXZpZ2F0aW9uLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+TmV2ZXIgbG9zZSBteSBzdHVmZjwvaDQ+Cis8cD5TYXZlIHdoYXQgcGVvcGxlIHRvb2sgdGltZSB0byBjcmVhdGUgYW5kIGxldCB0aGVtIGFjY2VzcyBpdCBmcm9tIGFueXdoZXJlLiBSZW1lbWJlciBzZXR0aW5ncywKK3BlcnNvbmFsIHRvdWNoZXMsIGFuZCBjcmVhdGlvbnMgYWNyb3NzIHBob25lcywgdGFibGV0cywgYW5kIGNvbXB1dGVycy4gSXQgbWFrZXMgdXBncmFkaW5nIHRoZQorZWFzaWVzdCB0aGluZyBpbiB0aGUgd29ybGQuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfbmV2ZXJfbG9zZV9zdHVmZi5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0PklmIGl0IGxvb2tzIHRoZSBzYW1lLCBpdCBzaG91bGQgYWN0IHRoZSBzYW1lPC9oND4KKzxwPkhlbHAgcGVvcGxlIGRpc2Nlcm4gZnVuY3Rpb25hbCBkaWZmZXJlbmNlcyBieSBtYWtpbmcgdGhlbSB2aXN1YWxseSBkaXN0aW5jdCByYXRoZXIgdGhhbiBzdWJ0bGUuCitBdm9pZCBtb2Rlcywgd2hpY2ggYXJlIHBsYWNlcyB0aGF0IGxvb2sgc2ltaWxhciBidXQgYWN0IGRpZmZlcmVudGx5IG9uIHRoZSBzYW1lIGlucHV0LjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2xvb2tzX3NhbWUucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5Pbmx5IGludGVycnVwdCBtZSBpZiBpdCdzIGltcG9ydGFudDwvaDQ+Cis8cD5MaWtlIGEgZ29vZCBwZXJzb25hbCBhc3Npc3RhbnQsIHNoaWVsZCBwZW9wbGUgZnJvbSB1bmltcG9ydGFudCBtaW51dGlhZS4gUGVvcGxlIHdhbnQgdG8gc3RheQorZm9jdXNlZCwgYW5kIHVubGVzcyBpdCdzIGNyaXRpY2FsIGFuZCB0aW1lLXNlbnNpdGl2ZSwgYW4gaW50ZXJydXB0aW9uIGNhbiBiZSB0YXhpbmcgYW5kIGZydXN0cmF0aW5nLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2ltcG9ydGFudF9pbnRlcnJ1cHRpb24ucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9Im1ha2UtbWUtYW1hemluZyI+TWFrZSBNZSBBbWF6aW5nPC9oMj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5HaXZlIG1lIHRyaWNrcyB0aGF0IHdvcmsgZXZlcnl3aGVyZTwvaDQ+Cis8cD5QZW9wbGUgZmVlbCBncmVhdCB3aGVuIHRoZXkgZmlndXJlIHRoaW5ncyBvdXQgZm9yIHRoZW1zZWx2ZXMuIE1ha2UgeW91ciBhcHAgZWFzaWVyIHRvIGxlYXJuIGJ5CitsZXZlcmFnaW5nIHZpc3VhbCBwYXR0ZXJucyBhbmQgbXVzY2xlIG1lbW9yeSBmcm9tIG90aGVyIEFuZHJvaWQgYXBwcy4gRm9yIGV4YW1wbGUsIHRoZSBzd2lwZSBnZXN0dXJlCittYXkgYmUgYSBnb29kIG5hdmlnYXRpb25hbCBzaG9ydGN1dC48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc190cmlja3MucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5JdCdzIG5vdCBteSBmYXVsdDwvaDQ+Cis8cD5CZSBnZW50bGUgaW4gaG93IHlvdSBwcm9tcHQgcGVvcGxlIHRvIG1ha2UgY29ycmVjdGlvbnMuIFRoZXkgd2FudCB0byBmZWVsIHNtYXJ0IHdoZW4gdGhleSB1c2UgeW91cgorYXBwLiBJZiBzb21ldGhpbmcgZ29lcyB3cm9uZywgZ2l2ZSBjbGVhciByZWNvdmVyeSBpbnN0cnVjdGlvbnMgYnV0IHNwYXJlIHRoZW0gdGhlIHRlY2huaWNhbCBkZXRhaWxzLgorSWYgeW91IGNhbiBmaXggaXQgYmVoaW5kIHRoZSBzY2VuZXMsIGV2ZW4gYmV0dGVyLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2Vycm9yLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+U3ByaW5rbGUgZW5jb3VyYWdlbWVudDwvaDQ+Cis8cD5CcmVhayBjb21wbGV4IHRhc2tzIGludG8gc21hbGxlciBzdGVwcyB0aGF0IGNhbiBiZSBlYXNpbHkgYWNjb21wbGlzaGVkLiBHaXZlIGZlZWRiYWNrIG9uIGFjdGlvbnMsCitldmVuIGlmIGl0J3MganVzdCBhIHN1YnRsZSBnbG93LjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wcmluY2lwbGVzX3Nwcmlua2xlX2VuY291cmFnZW1lbnQucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5EbyB0aGUgaGVhdnkgbGlmdGluZyBmb3IgbWU8L2g0PgorPHA+TWFrZSBub3ZpY2VzIGZlZWwgbGlrZSBleHBlcnRzIGJ5IGVuYWJsaW5nIHRoZW0gdG8gZG8gdGhpbmdzIHRoZXkgbmV2ZXIgdGhvdWdodCB0aGV5IGNvdWxkLiBGb3IKK2V4YW1wbGUsIHNob3J0Y3V0cyB0aGF0IGNvbWJpbmUgbXVsdGlwbGUgcGhvdG8gZWZmZWN0cyBjYW4gbWFrZSBhbWF0ZXVyIHBob3RvZ3JhcGhzIGxvb2sgYW1hemluZyBpbgorb25seSBhIGZldyBzdGVwcy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19oZWF2eV9saWZ0aW5nLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+TWFrZSBpbXBvcnRhbnQgdGhpbmdzIGZhc3Q8L2g0PgorPHA+Tm90IGFsbCBhY3Rpb25zIGFyZSBlcXVhbC4gRGVjaWRlIHdoYXQncyBtb3N0IGltcG9ydGFudCBpbiB5b3VyIGFwcCBhbmQgbWFrZSBpdCBlYXN5IHRvIGZpbmQgYW5kCitmYXN0IHRvIHVzZSwgbGlrZSB0aGUgc2h1dHRlciBidXR0b24gaW4gYSBjYW1lcmEsIG9yIHRoZSBwYXVzZSBidXR0b24gaW4gYSBtdXNpYyBwbGF5ZXIuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfbWFrZV9pbXBvcnRhbnRfZmFzdC5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODgxZDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIFVJIE92ZXJ2aWV3Ci0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlVJIE92ZXJ2aWV3PC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5BbmRyb2lkJ3Mgc3lzdGVtIFVJIHByb3ZpZGVzIHRoZSBmcmFtZXdvcmsgb24gdG9wIG9mIHdoaWNoIHlvdSBidWlsZCB5b3VyIGFwcC4gSW1wb3J0YW50IGFzcGVjdHMKLWluY2x1ZGUgdGhlIEhvbWUgc2NyZWVuIGV4cGVyaWVuY2UsIGdsb2JhbCBkZXZpY2UgbmF2aWdhdGlvbiwgYW5kIG5vdGlmaWNhdGlvbnMuPC9wPgotPHA+WW91ciBhcHAgd2lsbCBwbGF5IGFuIGltcG9ydGFudCBwYXJ0IGluIGtlZXBpbmcgdGhlIG92ZXJhbGwgQW5kcm9pZCBleHBlcmllbmNlIGNvbnNpc3RlbnQgYW5kCi1lbmpveWFibGUgdG8gdXNlLiBBdCB0aGUgZW5kIG9mIHRoaXMgY2hhcHRlciB3ZSBpbnRyb2R1Y2UgdGhlIG1haW4gZWxlbWVudHMgZm9yIGFjaGlldmluZyB0aGlzIGdvYWwKLWluIHlvdXIgYXBwLjwvcD4KLTxwPlJlYWQgb24gZm9yIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGFzcGVjdHMgb2YgdGhlIEFuZHJvaWQgdXNlciBpbnRlcmZhY2UuPC9wPgotCi08aDIgaWQ9ImhvbWUtYWxsLWFwcHMtcmVjZW50cyI+SG9tZSwgQWxsIEFwcHMsIGFuZCBSZWNlbnRzPC9oMj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3VpX292ZXJ2aWV3X2hvbWVfc2NyZWVuLnBuZyI+Ci0KLTxoND5Ib21lIHNjcmVlbjwvaDQ+Ci08cD5Ib21lIGlzIGEgY3VzdG9taXphYmxlIHNwYWNlIHRoYXQgaG91c2VzIGFwcCBzaG9ydGN1dHMsIGZvbGRlcnMgYW5kIHdpZGdldHMuIE5hdmlnYXRlIGJldHdlZW4KLWRpZmZlcmVudCBob21lIHNjcmVlbiBwYW5lbHMgYnkgc3dpcGluZyBsZWZ0IGFuZCByaWdodC48L3A+Ci08cD5UaGUgRmF2b3JpdGVzIFRyYXkgYXQgdGhlIGJvdHRvbSBhbHdheXMga2VlcHMgeW91ciBtb3N0IGltcG9ydGFudCBzaG9ydGN1dHMgYW5kIGZvbGRlcnMgaW4gdmlldwotcmVnYXJkbGVzcyBvZiB3aGljaCBwYW5lbCBpcyBjdXJyZW50bHkgc2hvd2luZy48L3A+Ci08cD5BY2Nlc3MgdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGFwcHMgYW5kIHdpZGdldHMgYnkgdG91Y2hpbmcgdGhlIEFsbCBBcHBzIGJ1dHRvbiBhdCB0aGUgY2VudGVyIG9mCi10aGUgRmF2b3JpdGVzIFRyYXkuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC91aV9vdmVydmlld19hbGxfYXBwcy5wbmciPgotCi08aDQ+QWxsIGFwcHMgc2NyZWVuPC9oND4KLTxwPlRoZSBBbGwgQXBwcyBzY3JlZW4gbGV0cyB5b3UgYnJvd3NlIHRoZSBlbnRpcmUgc2V0IG9mIGFwcHMgYW5kIHdpZGdldHMgdGhhdCBhcmUgaW5zdGFsbGVkIG9uIHlvdXIKLWRldmljZS48L3A+Ci08cD5Vc2VycyBjYW4gZHJhZyBhbiBhcHAgb3Igd2lkZ2V0IGljb24gZnJvbSB0aGUgQWxsIEFwcHMgc2NyZWVuIGFuZCBwbGFjZSBpdCBpbiBhbnkgZW1wdHkgbG9jYXRpb24gb24KLWFueSBIb21lIHNjcmVlbi48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3VpX292ZXJ2aWV3X3JlY2VudHMucG5nIj4KLQotPGg0PlJlY2VudHMgc2NyZWVuPC9oND4KLTxwPlJlY2VudHMgcHJvdmlkZXMgYW4gZWZmaWNpZW50IHdheSBvZiBzd2l0Y2hpbmcgYmV0d2VlbiByZWNlbnRseSB1c2VkIGFwcGxpY2F0aW9ucy4gSXQgcHJvdmlkZXMgYQotY2xlYXIgbmF2aWdhdGlvbiBwYXRoIGJldHdlZW4gbXVsdGlwbGUgb25nb2luZyB0YXNrcy48L3A+Ci08cD5UaGUgUmVjZW50cyBidXR0b24gYXQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG5hdmlnYXRpb24gYmFyIGRpc3BsYXlzIHRoZSBhcHBzIHRoYXQgdGhlIHVzZXIgaGFzCi1pbnRlcmFjdGVkIHdpdGggbW9zdCByZWNlbnRseS4gVGhleSBhcmUgb3JnYW5pemVkIGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciB3aXRoIHRoZSBtb3N0Ci1yZWNlbnRseSB1c2VkIGFwcCBhdCB0aGUgYm90dG9tLjwvcD4KLTxwPlN3aXRjaCB0byBhbiBhcHAgYnkgdG91Y2hpbmcgaXQuIFJlbW92ZSBhbiBpdGVtIGJ5IHN3aXBpbmcgbGVmdCBvciByaWdodC48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGgyIGlkPSJzeXN0ZW0tYmFycyI+U3lzdGVtIEJhcnM8L2gyPgotCi08cD5UaGUgc3lzdGVtIGJhcnMgYXJlIHNjcmVlbiBhcmVhcyBkZWRpY2F0ZWQgdG8gdGhlIGRpc3BsYXkgb2Ygbm90aWZpY2F0aW9ucywgY29tbXVuaWNhdGlvbiBvZiBkZXZpY2UKLXN0YXR1cywgYW5kIGRldmljZSBuYXZpZ2F0aW9uLiBUeXBpY2FsbHkgdGhlIHN5c3RlbSBiYXJzIGFyZSBkaXNwbGF5ZWQgY29uY3VycmVudGx5IHdpdGggeW91ciBhcHAuCi1BcHBzIHRoYXQgZGlzcGxheSBpbW1lcnNpdmUgY29udGVudCwgc3VjaCBhcyBtb3ZpZXMgb3IgaW1hZ2VzLCBjYW4gdGVtcG9yYXJpbHkgaGlkZSB0aGUgc3lzdGVtIGJhcnMKLXRvIGFsbG93IHRoZSB1c2VyIHRvIGVuam95IGZ1bGwgc2NyZWVuIGNvbnRlbnQgd2l0aG91dCBkaXN0cmFjdGlvbi48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC91aV9vdmVydmlld19zeXN0ZW1fdWkucG5nIj4KLQotPGRpdiBjbGFzcz0id2l0aC1jYWxsb3V0cyI+Ci0KLTxvbD4KLTxsaT4KLTxoND5TdGF0dXMgQmFyPC9oND4KLTxwPkRpc3BsYXlzIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBvbiB0aGUgbGVmdCBhbmQgc3RhdHVzLCBzdWNoIGFzIHRpbWUsIGJhdHRlcnkgbGV2ZWwsIG9yIHNpZ25hbAotICBzdHJlbmd0aCwgb24gdGhlIHJpZ2h0LiBTd2lwZSBkb3duIGZyb20gdGhlIHN0YXR1cyBiYXIgdG8gc2hvdyBub3RpZmljYXRpb24gZGV0YWlscy48L3A+Ci08L2xpPgotPGxpPgotPGg0Pk5hdmlnYXRpb24gQmFyPC9oND4KLTxwPk5ldyBmb3IgcGhvbmVzIGluIEFuZHJvaWQgNC4wLCB0aGUgbmF2aWdhdGlvbiBiYXIgaXMgcHJlc2VudCBvbmx5IG9uIGRldmljZXMgdGhhdCBkb24ndCBoYXZlCi0gIHRoZSB0cmFkaXRpb25hbCBoYXJkd2FyZSBrZXlzLiBJdCBob3VzZXMgdGhlIGRldmljZSBuYXZpZ2F0aW9uIGNvbnRyb2xzIEJhY2ssIEhvbWUsIGFuZAotICBSZWNlbnRzLCBhbmQgYWxzbyBkaXNwbGF5cyBhIG1lbnUgZm9yIGFwcHMgd3JpdHRlbiBmb3IgQW5kcm9pZCAyLjMgb3IgZWFybGllci48L3A+Ci08L2xpPgotPGxpPgotPGg0PkNvbWJpbmVkIEJhcjwvaDQ+Ci08cD5PbiB0YWJsZXQgZm9ybSBmYWN0b3JzIHRoZSBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFycyBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBiYXIgYXQgdGhlCi0gIGJvdHRvbSBvZiB0aGUgc2NyZWVuLjwvcD4KLTwvbGk+Ci08L29sPgotCi08L2Rpdj4KLQotPGgyIGlkPSJub3RpZmljYXRpb25zIj5Ob3RpZmljYXRpb25zPC9oMj4KLQotPHA+Tm90aWZpY2F0aW9ucyBhcmUgYnJpZWYgbWVzc2FnZXMgdGhhdCB1c2VycyBjYW4gYWNjZXNzIGF0IGFueSB0aW1lIGZyb20gdGhlIHN0YXR1cyBiYXIuIFRoZXkKLXByb3ZpZGUgdXBkYXRlcywgcmVtaW5kZXJzLCBvciBpbmZvcm1hdGlvbiB0aGF0J3MgaW1wb3J0YW50LCBidXQgbm90IGNyaXRpY2FsIGVub3VnaCB0byB3YXJyYW50Ci1pbnRlcnJ1cHRpbmcgdGhlIHVzZXIuIE9wZW4gdGhlIG5vdGlmaWNhdGlvbnMgZHJhd2VyIGJ5IHN3aXBpbmcgZG93biBvbiB0aGUgc3RhdHVzIGJhci4gVG91Y2hpbmcgYQotbm90aWZpY2F0aW9uIG9wZW5zIHRoZSBhc3NvY2lhdGVkIGFwcC4gPGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Nb3JlIG9uIE5vdGlmaWNhdGlvbnM8L2E+PC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC91aV9vdmVydmlld19ub3RpZmljYXRpb25zLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L25vdGlmaWNhdGlvbnNfZGlzbWlzcy5wbmciPgotCi08cD5Nb3N0IG5vdGlmaWNhdGlvbnMgaGF2ZSBhIG9uZS1saW5lIHRpdGxlIGFuZCBhIG9uZS1saW5lIG1lc3NhZ2UuIFRoZSByZWNvbW1lbmRlZCBsYXlvdXQgZm9yIGEKLW5vdGlmaWNhdGlvbiBpbmNsdWRlcyB0d28gbGluZXMuIElmIG5lY2Vzc2FyeSwgeW91IGNhbiBhZGQgYSB0aGlyZCBsaW5lLiBUaW1lc3RhbXBzIGFyZSBvcHRpb25hbC48L3A+Ci08cD5Td2lwaW5nIGEgbm90aWZpY2F0aW9uIHJpZ2h0IG9yIGxlZnQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBub3RpZmljYXRpb24gZHJhd2VyLjwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLTxoMiBpZD0iYXBwIj5Db21tb24gQXBwIFVJPC9oMj4KLQotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC91aV9vdmVydmlld19hcHBfdWkucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiB3aXRoLWNhbGxvdXRzIj4KLQotPHA+QSB0eXBpY2FsIEFuZHJvaWQgYXBwIGNvbnNpc3RzIG9mIGFjdGlvbiBiYXJzIGFuZCB0aGUgYXBwIGNvbnRlbnQgYXJlYS48L3A+Ci08b2w+Ci08bGk+Ci08aDQ+TWFpbiBBY3Rpb24gQmFyPC9oND4KLTxwPlRoZSBjb21tYW5kIGFuZCBjb250cm9sIGNlbnRlciBmb3IgeW91ciBhcHAuIFRoZSBtYWluIGFjdGlvbiBiYXIgaW5jbHVkZXMgZWxlbWVudHMgZm9yCi0gIG5hdmlnYXRpbmcgeW91ciBhcHAncyBoaWVyYXJjaHkgYW5kIHZpZXdzLCBhbmQgYWxzbyBzdXJmYWNlcyB0aGUgbW9zdCBpbXBvcnRhbnQgYWN0aW9ucy48L3A+Ci08cD48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+TW9yZSBvbiB0aGUgQWN0aW9uIEJhcjwvYT48L3A+Ci08L2xpPgotPGxpPgotPGg0PlZpZXcgQ29udHJvbDwvaDQ+Ci08cD5BbGxvd3MgdXNlcnMgdG8gc3dpdGNoIGJldHdlZW4gdGhlIGRpZmZlcmVudCB2aWV3cyB0aGF0IHlvdXIgYXBwIHByb3ZpZGVzLiBWaWV3cyB0eXBpY2FsbHkKLSAgY29uc2lzdCBvZiBkaWZmZXJlbnQgYXJyYW5nZW1lbnRzIG9mIHlvdXIgZGF0YSBvciBkaWZmZXJlbnQgZnVuY3Rpb25hbCBhc3BlY3RzIG9mIHlvdXIgYXBwLjwvcD4KLTwvbGk+Ci08bGk+Ci08aDQ+Q29udGVudCBBcmVhPC9oND4KLTxwPlRoZSBzcGFjZSB3aGVyZSB0aGUgY29udGVudCBvZiB5b3VyIGFwcCBpcyBkaXNwbGF5ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxoND5TcGxpdCBBY3Rpb24gQmFyPC9oND4KLTxwPlNwbGl0IGFjdGlvbiBiYXJzIHByb3ZpZGUgYSB3YXkgdG8gZGlzdHJpYnV0ZSBhY3Rpb25zIGFjcm9zcyBhZGRpdGlvbmFsIGJhcnMgbG9jYXRlZCBiZWxvdwotICB0aGUgbWFpbiBhY3Rpb24gYmFyIG9yIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4gSW4gdGhpcyBleGFtcGxlLCBhIHNwbGl0IGFjdGlvbiBiYXIgbW92ZXMKLSAgaW1wb3J0YW50IGFjdGlvbnMgdGhhdCB3b24ndCBmaXQgaW4gdGhlIG1haW4gYmFyIHRvIHRoZSBib3R0b20uPC9wPgotPC9saT4KLTwvb2w+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3LmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNkZDA2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5qZApAQCAtMCwwICsxLDE0OSBAQAorcGFnZS50aXRsZT1VSSBPdmVydmlldworQGpkOmJvZHkKKworPHA+QW5kcm9pZCdzIHN5c3RlbSBVSSBwcm92aWRlcyB0aGUgZnJhbWV3b3JrIG9uIHRvcCBvZiB3aGljaCB5b3UgYnVpbGQgeW91ciBhcHAuIEltcG9ydGFudCBhc3BlY3RzCitpbmNsdWRlIHRoZSBIb21lIHNjcmVlbiBleHBlcmllbmNlLCBnbG9iYWwgZGV2aWNlIG5hdmlnYXRpb24sIGFuZCBub3RpZmljYXRpb25zLjwvcD4KKzxwPllvdXIgYXBwIHdpbGwgcGxheSBhbiBpbXBvcnRhbnQgcGFydCBpbiBrZWVwaW5nIHRoZSBvdmVyYWxsIEFuZHJvaWQgZXhwZXJpZW5jZSBjb25zaXN0ZW50IGFuZAorZW5qb3lhYmxlIHRvIHVzZS4gQXQgdGhlIGVuZCBvZiB0aGlzIGNoYXB0ZXIgd2UgaW50cm9kdWNlIHRoZSBtYWluIGVsZW1lbnRzIGZvciBhY2hpZXZpbmcgdGhpcyBnb2FsCitpbiB5b3VyIGFwcC48L3A+Cis8cD5SZWFkIG9uIGZvciBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IGltcG9ydGFudCBhc3BlY3RzIG9mIHRoZSBBbmRyb2lkIHVzZXIgaW50ZXJmYWNlLjwvcD4KKworPGgyIGlkPSJob21lLWFsbC1hcHBzLXJlY2VudHMiPkhvbWUsIEFsbCBBcHBzLCBhbmQgUmVjZW50czwvaDI+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X2hvbWVfc2NyZWVuLnBuZyI+CisKKzxoND5Ib21lIHNjcmVlbjwvaDQ+Cis8cD5Ib21lIGlzIGEgY3VzdG9taXphYmxlIHNwYWNlIHRoYXQgaG91c2VzIGFwcCBzaG9ydGN1dHMsIGZvbGRlcnMgYW5kIHdpZGdldHMuIE5hdmlnYXRlIGJldHdlZW4KK2RpZmZlcmVudCBob21lIHNjcmVlbiBwYW5lbHMgYnkgc3dpcGluZyBsZWZ0IGFuZCByaWdodC48L3A+Cis8cD5UaGUgRmF2b3JpdGVzIFRyYXkgYXQgdGhlIGJvdHRvbSBhbHdheXMga2VlcHMgeW91ciBtb3N0IGltcG9ydGFudCBzaG9ydGN1dHMgYW5kIGZvbGRlcnMgaW4gdmlldworcmVnYXJkbGVzcyBvZiB3aGljaCBwYW5lbCBpcyBjdXJyZW50bHkgc2hvd2luZy48L3A+Cis8cD5BY2Nlc3MgdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGFwcHMgYW5kIHdpZGdldHMgYnkgdG91Y2hpbmcgdGhlIEFsbCBBcHBzIGJ1dHRvbiBhdCB0aGUgY2VudGVyIG9mCit0aGUgRmF2b3JpdGVzIFRyYXkuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X2FsbF9hcHBzLnBuZyI+CisKKzxoND5BbGwgYXBwcyBzY3JlZW48L2g0PgorPHA+VGhlIEFsbCBBcHBzIHNjcmVlbiBsZXRzIHlvdSBicm93c2UgdGhlIGVudGlyZSBzZXQgb2YgYXBwcyBhbmQgd2lkZ2V0cyB0aGF0IGFyZSBpbnN0YWxsZWQgb24geW91cgorZGV2aWNlLjwvcD4KKzxwPlVzZXJzIGNhbiBkcmFnIGFuIGFwcCBvciB3aWRnZXQgaWNvbiBmcm9tIHRoZSBBbGwgQXBwcyBzY3JlZW4gYW5kIHBsYWNlIGl0IGluIGFueSBlbXB0eSBsb2NhdGlvbiBvbgorYW55IEhvbWUgc2NyZWVuLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS91aV9vdmVydmlld19yZWNlbnRzLnBuZyI+CisKKzxoND5SZWNlbnRzIHNjcmVlbjwvaDQ+Cis8cD5SZWNlbnRzIHByb3ZpZGVzIGFuIGVmZmljaWVudCB3YXkgb2Ygc3dpdGNoaW5nIGJldHdlZW4gcmVjZW50bHkgdXNlZCBhcHBsaWNhdGlvbnMuIEl0IHByb3ZpZGVzIGEKK2NsZWFyIG5hdmlnYXRpb24gcGF0aCBiZXR3ZWVuIG11bHRpcGxlIG9uZ29pbmcgdGFza3MuPC9wPgorPHA+VGhlIFJlY2VudHMgYnV0dG9uIGF0IHRoZSByaWdodCBzaWRlIG9mIHRoZSBuYXZpZ2F0aW9uIGJhciBkaXNwbGF5cyB0aGUgYXBwcyB0aGF0IHRoZSB1c2VyIGhhcworaW50ZXJhY3RlZCB3aXRoIG1vc3QgcmVjZW50bHkuIFRoZXkgYXJlIG9yZ2FuaXplZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIgd2l0aCB0aGUgbW9zdAorcmVjZW50bHkgdXNlZCBhcHAgYXQgdGhlIGJvdHRvbS48L3A+Cis8cD5Td2l0Y2ggdG8gYW4gYXBwIGJ5IHRvdWNoaW5nIGl0LiBSZW1vdmUgYW4gaXRlbSBieSBzd2lwaW5nIGxlZnQgb3IgcmlnaHQuPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxoMiBpZD0ic3lzdGVtLWJhcnMiPlN5c3RlbSBCYXJzPC9oMj4KKworPHA+VGhlIHN5c3RlbSBiYXJzIGFyZSBzY3JlZW4gYXJlYXMgZGVkaWNhdGVkIHRvIHRoZSBkaXNwbGF5IG9mIG5vdGlmaWNhdGlvbnMsIGNvbW11bmljYXRpb24gb2YgZGV2aWNlCitzdGF0dXMsIGFuZCBkZXZpY2UgbmF2aWdhdGlvbi4gVHlwaWNhbGx5IHRoZSBzeXN0ZW0gYmFycyBhcmUgZGlzcGxheWVkIGNvbmN1cnJlbnRseSB3aXRoIHlvdXIgYXBwLgorQXBwcyB0aGF0IGRpc3BsYXkgaW1tZXJzaXZlIGNvbnRlbnQsIHN1Y2ggYXMgbW92aWVzIG9yIGltYWdlcywgY2FuIHRlbXBvcmFyaWx5IGhpZGUgdGhlIHN5c3RlbSBiYXJzCit0byBhbGxvdyB0aGUgdXNlciB0byBlbmpveSBmdWxsIHNjcmVlbiBjb250ZW50IHdpdGhvdXQgZGlzdHJhY3Rpb24uPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS91aV9vdmVydmlld19zeXN0ZW1fdWkucG5nIj4KKworPGRpdiBjbGFzcz0id2l0aC1jYWxsb3V0cyI+CisKKzxvbD4KKzxsaT4KKzxoND5TdGF0dXMgQmFyPC9oND4KKzxwPkRpc3BsYXlzIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBvbiB0aGUgbGVmdCBhbmQgc3RhdHVzLCBzdWNoIGFzIHRpbWUsIGJhdHRlcnkgbGV2ZWwsIG9yIHNpZ25hbAorICBzdHJlbmd0aCwgb24gdGhlIHJpZ2h0LiBTd2lwZSBkb3duIGZyb20gdGhlIHN0YXR1cyBiYXIgdG8gc2hvdyBub3RpZmljYXRpb24gZGV0YWlscy48L3A+Cis8L2xpPgorPGxpPgorPGg0Pk5hdmlnYXRpb24gQmFyPC9oND4KKzxwPk5ldyBmb3IgcGhvbmVzIGluIEFuZHJvaWQgNC4wLCB0aGUgbmF2aWdhdGlvbiBiYXIgaXMgcHJlc2VudCBvbmx5IG9uIGRldmljZXMgdGhhdCBkb24ndCBoYXZlCisgIHRoZSB0cmFkaXRpb25hbCBoYXJkd2FyZSBrZXlzLiBJdCBob3VzZXMgdGhlIGRldmljZSBuYXZpZ2F0aW9uIGNvbnRyb2xzIEJhY2ssIEhvbWUsIGFuZAorICBSZWNlbnRzLCBhbmQgYWxzbyBkaXNwbGF5cyBhIG1lbnUgZm9yIGFwcHMgd3JpdHRlbiBmb3IgQW5kcm9pZCAyLjMgb3IgZWFybGllci48L3A+Cis8L2xpPgorPGxpPgorPGg0PkNvbWJpbmVkIEJhcjwvaDQ+Cis8cD5PbiB0YWJsZXQgZm9ybSBmYWN0b3JzIHRoZSBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFycyBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBiYXIgYXQgdGhlCisgIGJvdHRvbSBvZiB0aGUgc2NyZWVuLjwvcD4KKzwvbGk+Cis8L29sPgorCis8L2Rpdj4KKworPGgyIGlkPSJub3RpZmljYXRpb25zIj5Ob3RpZmljYXRpb25zPC9oMj4KKworPHA+Tm90aWZpY2F0aW9ucyBhcmUgYnJpZWYgbWVzc2FnZXMgdGhhdCB1c2VycyBjYW4gYWNjZXNzIGF0IGFueSB0aW1lIGZyb20gdGhlIHN0YXR1cyBiYXIuIFRoZXkKK3Byb3ZpZGUgdXBkYXRlcywgcmVtaW5kZXJzLCBvciBpbmZvcm1hdGlvbiB0aGF0J3MgaW1wb3J0YW50LCBidXQgbm90IGNyaXRpY2FsIGVub3VnaCB0byB3YXJyYW50CitpbnRlcnJ1cHRpbmcgdGhlIHVzZXIuIE9wZW4gdGhlIG5vdGlmaWNhdGlvbnMgZHJhd2VyIGJ5IHN3aXBpbmcgZG93biBvbiB0aGUgc3RhdHVzIGJhci4gVG91Y2hpbmcgYQorbm90aWZpY2F0aW9uIG9wZW5zIHRoZSBhc3NvY2lhdGVkIGFwcC4gPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk1vcmUgb24gTm90aWZpY2F0aW9uczwvYT48L3A+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdWlfb3ZlcnZpZXdfbm90aWZpY2F0aW9ucy5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfZGlzbWlzcy5wbmciPgorCis8cD5Nb3N0IG5vdGlmaWNhdGlvbnMgaGF2ZSBhIG9uZS1saW5lIHRpdGxlIGFuZCBhIG9uZS1saW5lIG1lc3NhZ2UuIFRoZSByZWNvbW1lbmRlZCBsYXlvdXQgZm9yIGEKK25vdGlmaWNhdGlvbiBpbmNsdWRlcyB0d28gbGluZXMuIElmIG5lY2Vzc2FyeSwgeW91IGNhbiBhZGQgYSB0aGlyZCBsaW5lLiBUaW1lc3RhbXBzIGFyZSBvcHRpb25hbC48L3A+Cis8cD5Td2lwaW5nIGEgbm90aWZpY2F0aW9uIHJpZ2h0IG9yIGxlZnQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBub3RpZmljYXRpb24gZHJhd2VyLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCisKKzxoMiBpZD0iYXBwIj5Db21tb24gQXBwIFVJPC9oMj4KKworCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X2FwcF91aS5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IHdpdGgtY2FsbG91dHMiPgorCis8cD5BIHR5cGljYWwgQW5kcm9pZCBhcHAgY29uc2lzdHMgb2YgYWN0aW9uIGJhcnMgYW5kIHRoZSBhcHAgY29udGVudCBhcmVhLjwvcD4KKzxvbD4KKzxsaT4KKzxoND5NYWluIEFjdGlvbiBCYXI8L2g0PgorPHA+VGhlIGNvbW1hbmQgYW5kIGNvbnRyb2wgY2VudGVyIGZvciB5b3VyIGFwcC4gVGhlIG1haW4gYWN0aW9uIGJhciBpbmNsdWRlcyBlbGVtZW50cyBmb3IKKyAgbmF2aWdhdGluZyB5b3VyIGFwcCdzIGhpZXJhcmNoeSBhbmQgdmlld3MsIGFuZCBhbHNvIHN1cmZhY2VzIHRoZSBtb3N0IGltcG9ydGFudCBhY3Rpb25zLjwvcD4KKzxwPjxhIGhyZWY9IntAZG9jUm9vdH1kZXNpZ24vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPk1vcmUgb24gdGhlIEFjdGlvbiBCYXI8L2E+PC9wPgorPC9saT4KKzxsaT4KKzxoND5WaWV3IENvbnRyb2w8L2g0PgorPHA+QWxsb3dzIHVzZXJzIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdmlld3MgdGhhdCB5b3VyIGFwcCBwcm92aWRlcy4gVmlld3MgdHlwaWNhbGx5CisgIGNvbnNpc3Qgb2YgZGlmZmVyZW50IGFycmFuZ2VtZW50cyBvZiB5b3VyIGRhdGEgb3IgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXNwZWN0cyBvZiB5b3VyIGFwcC48L3A+Cis8L2xpPgorPGxpPgorPGg0PkNvbnRlbnQgQXJlYTwvaDQ+Cis8cD5UaGUgc3BhY2Ugd2hlcmUgdGhlIGNvbnRlbnQgb2YgeW91ciBhcHAgaXMgZGlzcGxheWVkLjwvcD4KKzwvbGk+Cis8bGk+Cis8aDQ+U3BsaXQgQWN0aW9uIEJhcjwvaDQ+Cis8cD5TcGxpdCBhY3Rpb24gYmFycyBwcm92aWRlIGEgd2F5IHRvIGRpc3RyaWJ1dGUgYWN0aW9ucyBhY3Jvc3MgYWRkaXRpb25hbCBiYXJzIGxvY2F0ZWQgYmVsb3cKKyAgdGhlIG1haW4gYWN0aW9uIGJhciBvciBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIEluIHRoaXMgZXhhbXBsZSwgYSBzcGxpdCBhY3Rpb24gYmFyIG1vdmVzCisgIGltcG9ydGFudCBhY3Rpb25zIHRoYXQgd29uJ3QgZml0IGluIHRoZSBtYWluIGJhciB0byB0aGUgYm90dG9tLjwvcD4KKzwvbGk+Cis8L29sPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2luZGV4Lmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODNhYTQuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIFdlbGNvbWUKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJzdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3RhdGljL2RlZmF1bHQuY3NzIj4KLQotPHN0eWxlPgotI2xhbmRpbmctZ3JhcGhpYy1jb250YWluZXIgewotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci19Ci0KLSN0ZXh0LW92ZXJsYXkgewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGxlZnQ6IDEwcHg7Ci0gIHRvcDogNDcycHg7Ci0gIHdpZHRoOiAyODBweDsKLX0KLTwvc3R5bGU+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9ImluZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSJzdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InN0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InN0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InN0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJzdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJzdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InN0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJzdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0ic3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0icGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJwYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0icGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InBhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0icGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJwYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0icGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0icGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InBhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9InBhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0icGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJwYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImJ1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImJ1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImJ1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJidWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSJidWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImJ1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9ImJ1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSJkb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotCi0KLSAgICAgICAgICAKLQotPGRpdiBpZD0ibGFuZGluZy1ncmFwaGljLWNvbnRhaW5lciI+Ci0gIDxkaXYgaWQ9InRleHQtb3ZlcmxheSI+Ci0gICAgV2VsY29tZSB0byA8c3Ryb25nPkFuZHJvaWQgRGVzaWduPC9zdHJvbmc+LCB5b3VyIHBsYWNlIGZvciBsZWFybmluZyBob3cgdG8gZGVzaWduIGV4Y2VwdGlvbmFsIEFuZHJvaWQgYXBwcy4KLSAgICA8YnI+PGJyPgotICAgIDxhIGhyZWY9ImdldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIiBjbGFzcz0ibGFuZGluZy1wYWdlLWxpbmsiPkNyZWF0aXZlIFZpc2lvbjwvYT4KLSAgPC9kaXY+Ci0KLSAgPGEgaHJlZj0iZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPgotICAgIDxpbWcgc3JjPSJzdGF0aWMvY29udGVudC9pbmRleF9sYW5kaW5nX3BhZ2UucG5nIj4KLSAgPC9hPgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0KLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9InN0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0ic3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL2luZGV4LmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9pbmRleC5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDA0YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9pbmRleC5qZApAQCAtMCwwICsxLDI5IEBACitwYWdlLnRpdGxlPQoraGVhZGVyLmhpZGU9MQorZm9vdGVyLmhpZGU9MQorQGpkOmJvZHkKKworPHN0eWxlPgorI2xhbmRpbmctZ3JhcGhpYy1jb250YWluZXIgeworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyN0ZXh0LW92ZXJsYXkgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDEwcHg7CisgIHRvcDogNDcycHg7CisgIHdpZHRoOiAyODBweDsKK30KKzwvc3R5bGU+CisKKzxkaXYgaWQ9ImxhbmRpbmctZ3JhcGhpYy1jb250YWluZXIiPgorICA8ZGl2IGlkPSJ0ZXh0LW92ZXJsYXkiPgorICAgIFdlbGNvbWUgdG8gPHN0cm9uZz5BbmRyb2lkIERlc2lnbjwvc3Ryb25nPiwgeW91ciBwbGFjZSBmb3IgbGVhcm5pbmcgaG93IHRvIGRlc2lnbiBleGNlcHRpb25hbCBBbmRyb2lkIGFwcHMuCisgICAgPGJyPjxicj4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIiBjbGFzcz0ibGFuZGluZy1wYWdlLWxpbmsiPkNyZWF0aXZlIFZpc2lvbjwvYT4KKyAgPC9kaXY+CisKKyAgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+CisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvaW5kZXhfbGFuZGluZ19wYWdlLnBuZyI+CisgIDwvYT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX2Jhc2ljcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfYmFzaWNzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX2Jhc2ljcy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9iYXNpY3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9jYWIucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX2NhYi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9jYWIucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfY2FiLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9hY3Rpb25faWNvbnMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fYWN0aW9uX2ljb25zLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fYWN0aW9uX2ljb25zLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fYWN0aW9uX2ljb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9jb25zaWRlcmF0aW9ucy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9jb25zaWRlcmF0aW9ucy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX2NvbnNpZGVyYXRpb25zLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fY29uc2lkZXJhdGlvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX2RlZmF1bHRfdGFicy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9kZWZhdWx0X3RhYnMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9kZWZhdWx0X3RhYnMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9kZWZhdWx0X3RhYnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX292ZXJmbG93LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX292ZXJmbG93LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fb3ZlcmZsb3cucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9vdmVyZmxvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fb3ZlcnZpZXcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fb3ZlcnZpZXcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9vdmVydmlldy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX292ZXJ2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9yb3RhdGlvbi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9yb3RhdGlvbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX3JvdGF0aW9uLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fcm90YXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX3NoYXJlX3BhY2sucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fc2hhcmVfcGFjay5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX3NoYXJlX3BhY2sucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9zaGFyZV9wYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9zcGlubmVyLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX3NwaW5uZXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl9zcGlubmVyLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fc3Bpbm5lci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fdGFibGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fdGFibGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl90YWJsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX3RhYmxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FjdGlvbl9iYXJfcGF0dGVybl91cF9hcHBfaWNvbi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl91cF9hcHBfaWNvbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX3VwX2FwcF9pY29uLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fdXBfYXBwX2ljb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9ib29rX2RldGFpbF9wYWdlX2ZsaXAucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX2Jvb2tfZGV0YWlsX3BhZ2VfZmxpcC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9ib29rX2RldGFpbF9wYWdlX2ZsaXAucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfYm9va19kZXRhaWxfcGFnZV9mbGlwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfZml4ZWR0YWJzLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9maXhlZHRhYnMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfZml4ZWR0YWJzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX2ZpeGVkdGFicy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX2dhbGxlcnlfZmlsbXN0cmlwLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nYWxsZXJ5X2ZpbG1zdHJpcC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9nYWxsZXJ5X2ZpbG1zdHJpcC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nYWxsZXJ5X2ZpbG1zdHJpcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX2dtYWlsLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nbWFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9nbWFpbC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX2dtYWlsX3N3aXBlLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nbWFpbF9zd2lwZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9nbWFpbF9zd2lwZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nbWFpbF9zd2lwZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX21hcmtldC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfbWFya2V0LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX21hcmtldC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9tYXJrZXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9tdXNpY19sbmRzY3AucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX211c2ljX2xuZHNjcC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9tdXNpY19sbmRzY3AucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfbXVzaWNfbG5kc2NwLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfb3ZlcnZpZXcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX292ZXJ2aWV3LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX292ZXJ2aWV3LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX292ZXJ2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfcGVvcGxlX2RldGFpbC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfcGVvcGxlX2RldGFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9wZW9wbGVfZGV0YWlsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX3Blb3BsZV9kZXRhaWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9zY3JvbGx0YWJzLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9zY3JvbGx0YWJzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX3Njcm9sbHRhYnMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfc2Nyb2xsdGFicy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX3Nob3J0Y3V0X29uX2l0ZW0ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX3Nob3J0Y3V0X29uX2l0ZW0ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfc2hvcnRjdXRfb25faXRlbS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9zaG9ydGN1dF9vbl9pdGVtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2J1aWxkaW5nX2Jsb2Nrc19sYW5kaW5nLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYnVpbGRpbmdfYmxvY2tzX2xhbmRpbmcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2J1aWxkaW5nX2Jsb2Nrc19sYW5kaW5nLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9idWlsZGluZ19ibG9ja3NfbGFuZGluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9idXR0b25zX2Jhc2ljLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYnV0dG9uc19iYXNpYy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYnV0dG9uc19iYXNpYy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYnV0dG9uc19iYXNpYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9idXR0b25zX2JvcmRlcmxlc3MucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9idXR0b25zX2JvcmRlcmxlc3MucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2J1dHRvbnNfYm9yZGVybGVzcy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvYnV0dG9uc19ib3JkZXJsZXNzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2J1dHRvbnNfZGVmYXVsdF9zbWFsbC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2J1dHRvbnNfZGVmYXVsdF9zbWFsbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvYnV0dG9uc19kZWZhdWx0X3NtYWxsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9idXR0b25zX2RlZmF1bHRfc21hbGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvY29sb3Jfc3BlY3RydW0ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9jb2xvcl9zcGVjdHJ1bS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvY29sb3Jfc3BlY3RydW0ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2NvbG9yX3NwZWN0cnVtLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2NvbXBhdGliaWxpdHlfbGVnYWN5X2FwcHMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9jb21wYXRpYmlsaXR5X2xlZ2FjeV9hcHBzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9jb21wYXRpYmlsaXR5X2xlZ2FjeV9hcHBzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9jb21wYXRpYmlsaXR5X2xlZ2FjeV9hcHBzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2NvbXBhdGliaWxpdHlfcGh5c2ljYWxfYnV0dG9ucy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2NvbXBhdGliaWxpdHlfcGh5c2ljYWxfYnV0dG9ucy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvY29tcGF0aWJpbGl0eV9waHlzaWNhbF9idXR0b25zLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9jb21wYXRpYmlsaXR5X3BoeXNpY2FsX2J1dHRvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvY29tcGF0aWJpbGl0eV92aXJ0dWFsX25hdi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2NvbXBhdGliaWxpdHlfdmlydHVhbF9uYXYucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2NvbXBhdGliaWxpdHlfdmlydHVhbF9uYXYucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2NvbXBhdGliaWxpdHlfdmlydHVhbF9uYXYucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvY3JlYXRpdmVfdmlzaW9uX21haW4ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9jcmVhdGl2ZV92aXNpb25fbWFpbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvY3JlYXRpdmVfdmlzaW9uX21haW4ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2NyZWF0aXZlX3Zpc2lvbl9tYWluLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2Rlc2lnbl9lbGVtZW50c19sYW5kaW5nLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGVzaWduX2VsZW1lbnRzX2xhbmRpbmcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2Rlc2lnbl9lbGVtZW50c19sYW5kaW5nLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9kZXNpZ25fZWxlbWVudHNfbGFuZGluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kZXZpY2VzX2Rpc3BsYXlzX2RlbnNpdHkucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9kZXZpY2VzX2Rpc3BsYXlzX2RlbnNpdHkucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2RldmljZXNfZGlzcGxheXNfZGVuc2l0eS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGV2aWNlc19kaXNwbGF5c19kZW5zaXR5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2RldmljZXNfZGlzcGxheXNfbWFpbi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2RldmljZXNfZGlzcGxheXNfbWFpbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZGV2aWNlc19kaXNwbGF5c19tYWluLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9kZXZpY2VzX2Rpc3BsYXlzX21haW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZGlhbG9nc19leGFtcGxlcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2RpYWxvZ3NfZXhhbXBsZXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2RpYWxvZ3NfZXhhbXBsZXMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2RpYWxvZ3NfZXhhbXBsZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZGlhbG9nc19tYWluLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGlhbG9nc19tYWluLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kaWFsb2dzX21haW4ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2RpYWxvZ3NfbWFpbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kaWFsb2dzX3BvcHVwc19leGFtcGxlLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGlhbG9nc19wb3B1cHNfZXhhbXBsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZGlhbG9nc19wb3B1cHNfZXhhbXBsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGlhbG9nc19wb3B1cHNfZXhhbXBsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kaWFsb2dzX3RvYXN0cy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2RpYWxvZ3NfdG9hc3RzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kaWFsb2dzX3RvYXN0cy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGlhbG9nc190b2FzdHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZGlhbG9nc193X25vX3RpdGxlLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGlhbG9nc193X25vX3RpdGxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kaWFsb2dzX3dfbm9fdGl0bGUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2RpYWxvZ3Nfd19ub190aXRsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kaWFsb2dzX3dfdGl0bGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9kaWFsb2dzX3dfdGl0bGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2RpYWxvZ3Nfd190aXRsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZGlhbG9nc193X3RpdGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2Rvd25sb2Fkc19jb2xvcl9zd2F0Y2hlcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2Rvd25sb2Fkc19jb2xvcl9zd2F0Y2hlcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZG93bmxvYWRzX2NvbG9yX3N3YXRjaGVzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9kb3dubG9hZHNfY29sb3Jfc3dhdGNoZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZG93bmxvYWRzX3JvYm90b19zcGVjaW1lbl9wcmV2aWV3LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZG93bmxvYWRzX3JvYm90b19zcGVjaW1lbl9wcmV2aWV3LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kb3dubG9hZHNfcm9ib3RvX3NwZWNpbWVuX3ByZXZpZXcucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2Rvd25sb2Fkc19yb2JvdG9fc3BlY2ltZW5fcHJldmlldy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9kb3dubG9hZHNfc3RlbmNpbHMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9kb3dubG9hZHNfc3RlbmNpbHMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2Rvd25sb2Fkc19zdGVuY2lscy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZG93bmxvYWRzX3N0ZW5jaWxzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfZG91YmxldG91Y2gucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX2RvdWJsZXRvdWNoLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9nZXN0dXJlX2RvdWJsZXRvdWNoLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX2RvdWJsZXRvdWNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfZHJhZy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2dlc3R1cmVfZHJhZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9kcmFnLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX2RyYWcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9sb25ndG91Y2gucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX2xvbmd0b3VjaC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9sb25ndG91Y2gucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2dlc3R1cmVfbG9uZ3RvdWNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfcGluY2hjbG9zZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2dlc3R1cmVfcGluY2hjbG9zZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9waW5jaGNsb3NlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX3BpbmNoY2xvc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9waW5jaG9wZW4ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX3BpbmNob3Blbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9waW5jaG9wZW4ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2dlc3R1cmVfcGluY2hvcGVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfc3dpcGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX3N3aXBlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9nZXN0dXJlX3N3aXBlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX3N3aXBlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfdG91Y2gucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX3RvdWNoLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9nZXN0dXJlX3RvdWNoLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9nZXN0dXJlX3RvdWNoLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X2V4YW1wbGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ncmlkdmlld19leGFtcGxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ncmlkdmlld19leGFtcGxlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ncmlkdmlld19leGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X2hvcml6b250YWwucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ncmlkdmlld19ob3Jpem9udGFsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ncmlkdmlld19ob3Jpem9udGFsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ncmlkdmlld19ob3Jpem9udGFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X292ZXJ2aWV3LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZ3JpZHZpZXdfb3ZlcnZpZXcucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2dyaWR2aWV3X292ZXJ2aWV3LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ncmlkdmlld19vdmVydmlldy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ncmlkdmlld19zdHlsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2dyaWR2aWV3X3N0eWxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ncmlkdmlld19zdHlsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvZ3JpZHZpZXdfc3R5bGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ3JpZHZpZXdfdmVydGljYWwucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ncmlkdmlld192ZXJ0aWNhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvZ3JpZHZpZXdfdmVydGljYWwucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2dyaWR2aWV3X3ZlcnRpY2FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9jb2xvcnMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfY29sb3JzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9hY3Rpb25iYXJfY29sb3JzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfY29sb3JzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9mb2NhbC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9mb2NhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX2ZvY2FsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfZm9jYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX3NpemUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfc2l6ZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX3NpemUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9zaXplLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9zdHlsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9zdHlsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX3N0eWxlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfc3R5bGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZXhhbXBsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2xhdW5jaGVyX2V4YW1wbGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2xhdW5jaGVyX2V4YW1wbGUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2xhdW5jaGVyX2V4YW1wbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZXhhbXBsZTIucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9sYXVuY2hlcl9leGFtcGxlMi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZXhhbXBsZTIucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2xhdW5jaGVyX2V4YW1wbGUyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2xhdW5jaGVyX2ZvY2FsLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZm9jYWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2xhdW5jaGVyX2ZvY2FsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9sYXVuY2hlcl9mb2NhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9sYXVuY2hlcl9zaXplLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfbGF1bmNoZXJfc2l6ZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbGF1bmNoZXJfc2l6ZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfbGF1bmNoZXJfc2l6ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9sYXVuY2hlcl9zdHlsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2xhdW5jaGVyX3N0eWxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9sYXVuY2hlcl9zdHlsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfbGF1bmNoZXJfc3R5bGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX2V4YW1wbGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fZXhhbXBsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX2V4YW1wbGUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9leGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9mb2NhbC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9mb2NhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX2ZvY2FsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fZm9jYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX3NpemUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fc2l6ZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX3NpemUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9zaXplLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9zdHlsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9zdHlsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX3N0eWxlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fc3R5bGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfb3ZlcnZpZXcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9vdmVydmlldy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfb3ZlcnZpZXcucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X292ZXJ2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X3NtYWxsX2NvbG9ycy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X3NtYWxsX2NvbG9ycy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfc21hbGxfY29sb3JzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9jb2xvcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfc21hbGxfZXhhbXBsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X3NtYWxsX2V4YW1wbGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X3NtYWxsX2V4YW1wbGUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X3NtYWxsX2V4YW1wbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfc21hbGxfZm9jYWwucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9mb2NhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfc21hbGxfZm9jYWwucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X3NtYWxsX2ZvY2FsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X3NtYWxsX3NpemUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9zaXplLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9zbWFsbF9zaXplLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9zaXplLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X3NtYWxsX3N0eWxlLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfc21hbGxfc3R5bGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X3NtYWxsX3N0eWxlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9zdHlsZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9pbmRleF9sYW5kaW5nX3BhZ2UucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9pbmRleF9sYW5kaW5nX3BhZ2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2luZGV4X2xhbmRpbmdfcGFnZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvaW5kZXhfbGFuZGluZ19wYWdlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L2xpc3RzX21haW4ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9saXN0c19tYWluLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9saXN0c19tYWluLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9saXN0c19tYWluLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L21ldHJpY3NfNDgucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tZXRyaWNzXzQ4LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9tZXRyaWNzXzQ4LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tZXRyaWNzXzQ4LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L21ldHJpY3NfY2xvc2V1cC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL21ldHJpY3NfY2xvc2V1cC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWV0cmljc19jbG9zZXVwLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tZXRyaWNzX2Nsb3NldXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWV0cmljc19kaWFncmFtLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbWV0cmljc19kaWFncmFtLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9tZXRyaWNzX2RpYWdyYW0ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL21ldHJpY3NfZGlhZ3JhbS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9tZXRyaWNzX2Zvcm1zLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbWV0cmljc19mb3Jtcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWV0cmljc19mb3Jtcy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbWV0cmljc19mb3Jtcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9taWdyYXRpbmdfaWNvbnMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taWdyYXRpbmdfaWNvbnMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L21pZ3JhdGluZ19pY29ucy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbWlncmF0aW5nX2ljb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L21pZ3JhdGluZ19pb3NfZGlhbGVycy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL21pZ3JhdGluZ19pb3NfZGlhbGVycy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlncmF0aW5nX2lvc19kaWFsZXJzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taWdyYXRpbmdfaW9zX2RpYWxlcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlncmF0aW5nX2lvc19nYWxsZXJpZXMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taWdyYXRpbmdfaW9zX2dhbGxlcmllcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlncmF0aW5nX2lvc19nYWxsZXJpZXMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL21pZ3JhdGluZ19pb3NfZ2FsbGVyaWVzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L21pZ3JhdGluZ19pb3Nfc2V0dGluZ3MucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taWdyYXRpbmdfaW9zX3NldHRpbmdzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9taWdyYXRpbmdfaW9zX3NldHRpbmdzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taWdyYXRpbmdfaW9zX3NldHRpbmdzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L21pZ3JhdGluZ191aV9lbGVtZW50cy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL21pZ3JhdGluZ191aV9lbGVtZW50cy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlncmF0aW5nX3VpX2VsZW1lbnRzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taWdyYXRpbmdfdWlfZWxlbWVudHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9taXNjX2Z1bGxfZ2FsYXh5bmV4dXNfYmxhbmtfbGFuZF9zcGFuMTMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL21pc2NfZnVsbF9nYWxheHluZXh1c19ibGFua19sYW5kX3NwYW4xMy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9taXNjX2Z1bGxfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuNS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL21pc2NfZnVsbF9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW41LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9taXNjX2Z1bGxfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuNS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjkucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9taXNjX2Z1bGxfZ2FsYXh5bmV4dXNfYmxhbmtfcG9ydF9zcGFuOS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjkucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL21pc2NfZnVsbF9nYWxheHluZXh1c19ibGFua19wb3J0X3NwYW45LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9leHBhbmQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfZXhwYW5kLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9tdWx0aXBhbmVfZXhwYW5kLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfZXhwYW5kLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9zaG93LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbXVsdGlwYW5lX3Nob3cucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9zaG93LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfc2hvdy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9tdWx0aXBhbmVfc3RhY2sucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfc3RhY2sucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9zdGFjay5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbXVsdGlwYW5lX3N0YWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9zdHJldGNoLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbXVsdGlwYW5lX3N0cmV0Y2gucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9zdHJldGNoLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfc3RyZXRjaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9tdWx0aXBhbmVfdmlld190YWJsZXQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfdmlld190YWJsZXQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV92aWV3X3RhYmxldC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbXVsdGlwYW5lX3ZpZXdfdGFibGV0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV92aWV3cy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL211bHRpcGFuZV92aWV3cy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbXVsdGlwYW5lX3ZpZXdzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9tdWx0aXBhbmVfdmlld3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbmF2aWdhdGlvbl9iZXR3ZWVuX3NpYmxpbmdzX2dtYWlsLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbmF2aWdhdGlvbl9iZXR3ZWVuX3NpYmxpbmdzX2dtYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfZ21haWwucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL25hdmlnYXRpb25fYmV0d2Vlbl9zaWJsaW5nc19nbWFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfbWFya2V0MS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL25hdmlnYXRpb25fYmV0d2Vlbl9zaWJsaW5nc19tYXJrZXQxLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfbWFya2V0MS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbmF2aWdhdGlvbl9iZXR3ZWVuX3NpYmxpbmdzX21hcmtldDEucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbmF2aWdhdGlvbl9iZXR3ZWVuX3NpYmxpbmdzX21hcmtldDIucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfbWFya2V0Mi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbmF2aWdhdGlvbl9iZXR3ZWVuX3NpYmxpbmdzX21hcmtldDIucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL25hdmlnYXRpb25fYmV0d2Vlbl9zaWJsaW5nc19tYXJrZXQyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fZnJvbV9vdXRzaWRlX2JhY2sucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2Zyb21fb3V0c2lkZV9iYWNrLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX2Zyb21fb3V0c2lkZV9iYWNrLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2Zyb21fb3V0c2lkZV9iYWNrLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fZnJvbV9vdXRzaWRlX3VwLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbmF2aWdhdGlvbl9mcm9tX291dHNpZGVfdXAucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fZnJvbV9vdXRzaWRlX3VwLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2Zyb21fb3V0c2lkZV91cC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX3VwX3ZzX2JhY2tfZ21haWwucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX3VwX3ZzX2JhY2tfZ21haWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fdXBfdnNfYmFja19nbWFpbC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbmF2aWdhdGlvbl91cF92c19iYWNrX2dtYWlsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fd2l0aF9iYWNrX2FuZF91cC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL25hdmlnYXRpb25fd2l0aF9iYWNrX2FuZF91cC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbmF2aWdhdGlvbl93aXRoX2JhY2tfYW5kX3VwLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX3dpdGhfYmFja19hbmRfdXAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19kaXNtaXNzLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19kaXNtaXNzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX2Rpc21pc3MucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfZGlzbWlzcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fYWRkaXRpb25hbF9mYWlsLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FkZGl0aW9uYWxfZmFpbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FkZGl0aW9uYWxfZmFpbC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FkZGl0aW9uYWxfZmFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fYWRkaXRpb25hbF93aW4ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ub3RpZmljYXRpb25zX3BhdHRlcm5fYWRkaXRpb25hbF93aW4ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25vdGlmaWNhdGlvbnNfcGF0dGVybl9hZGRpdGlvbmFsX3dpbi5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FkZGl0aW9uYWxfd2luLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25vdGlmaWNhdGlvbnNfcGF0dGVybl9hbmF0b215LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FuYXRvbXkucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L25vdGlmaWNhdGlvbnNfcGF0dGVybl9hbmF0b215LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9ub3RpZmljYXRpb25zX3BhdHRlcm5fYW5hdG9teS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fZGlhbG9nX3RvYXN0LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2RpYWxvZ190b2FzdC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2RpYWxvZ190b2FzdC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2RpYWxvZ190b2FzdC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fb25nb2luZ19tdXNpYy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfcGF0dGVybl9vbmdvaW5nX211c2ljLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fb25nb2luZ19tdXNpYy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX29uZ29pbmdfbXVzaWMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3Bob25lX2ljb25zLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3Bob25lX2ljb25zLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fcGhvbmVfaWNvbnMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfcGF0dGVybl9waG9uZV9pY29ucy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fcGhvbmVfdGlja2VyLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3Bob25lX3RpY2tlci5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3Bob25lX3RpY2tlci5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3Bob25lX3RpY2tlci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fcmVhbF90aW1lX3Blb3BsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfcGF0dGVybl9yZWFsX3RpbWVfcGVvcGxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fcmVhbF90aW1lX3Blb3BsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3JlYWxfdGltZV9wZW9wbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3NvY2lhbF9mYWlsLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3NvY2lhbF9mYWlsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fc29jaWFsX2ZhaWwucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfcGF0dGVybl9zb2NpYWxfZmFpbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fdGFibGV0LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3RhYmxldC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3RhYmxldC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3RhYmxldC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wYXR0ZXJuc19sYW5kaW5nLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcGF0dGVybnNfbGFuZGluZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcGF0dGVybnNfbGFuZGluZy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcGF0dGVybnNfbGFuZGluZy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9waWNrZXJfZGF0ZXRpbWUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9waWNrZXJfZGF0ZXRpbWUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3BpY2tlcl9kYXRldGltZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcGlja2VyX2RhdGV0aW1lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3BpY2tlcl9zcGFjZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3BpY2tlcl9zcGFjZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcGlja2VyX3NwYWNlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9waWNrZXJfc3BhY2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19kZWNpZGVfZm9yX21lLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19kZWNpZGVfZm9yX21lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2RlY2lkZV9mb3JfbWUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfZGVjaWRlX2Zvcl9tZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2RlbGlnaHQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2RlbGlnaHQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfZGVsaWdodC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19kZWxpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfZXJyb3IucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2Vycm9yLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2Vycm9yLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2Vycm9yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfZ2V0X3RvX2tub3dfbWUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2dldF90b19rbm93X21lLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2dldF90b19rbm93X21lLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2dldF90b19rbm93X21lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfaGVhdnlfbGlmdGluZy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfaGVhdnlfbGlmdGluZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19oZWF2eV9saWZ0aW5nLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2hlYXZ5X2xpZnRpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19pbXBvcnRhbnRfaW50ZXJydXB0aW9uLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19pbXBvcnRhbnRfaW50ZXJydXB0aW9uLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2ltcG9ydGFudF9pbnRlcnJ1cHRpb24ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfaW1wb3J0YW50X2ludGVycnVwdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2luZm9ybWF0aW9uX3doZW5fbmVlZF9pdC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfaW5mb3JtYXRpb25fd2hlbl9uZWVkX2l0LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2luZm9ybWF0aW9uX3doZW5fbmVlZF9pdC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19pbmZvcm1hdGlvbl93aGVuX25lZWRfaXQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19rZWVwX2l0X2JyaWVmLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19rZWVwX2l0X2JyaWVmLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2tlZXBfaXRfYnJpZWYucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfa2VlcF9pdF9icmllZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX2xvb2tzX3NhbWUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX2xvb2tzX3NhbWUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfbG9va3Nfc2FtZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19sb29rc19zYW1lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfbWFrZV9pbXBvcnRhbnRfZmFzdC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfbWFrZV9pbXBvcnRhbnRfZmFzdC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19tYWtlX2ltcG9ydGFudF9mYXN0LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX21ha2VfaW1wb3J0YW50X2Zhc3QucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19tYWtlX2l0X21pbmUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX21ha2VfaXRfbWluZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19tYWtlX2l0X21pbmUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfbWFrZV9pdF9taW5lLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3ByaW5jaXBsZXNfbmF2aWdhdGlvbi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfbmF2aWdhdGlvbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19uYXZpZ2F0aW9uLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcmluY2lwbGVzX25hdmlnYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19uZXZlcl9sb3NlX3N0dWZmLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19uZXZlcl9sb3NlX3N0dWZmLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX25ldmVyX2xvc2Vfc3R1ZmYucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfbmV2ZXJfbG9zZV9zdHVmZi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3BpY3R1cmVzLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19waWN0dXJlcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19waWN0dXJlcy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19waWN0dXJlcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3JlYWxfb2JqZWN0cy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfcmVhbF9vYmplY3RzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3JlYWxfb2JqZWN0cy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19yZWFsX29iamVjdHMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJpbmNpcGxlc19zcHJpbmtsZV9lbmNvdXJhZ2VtZW50LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc19zcHJpbmtsZV9lbmNvdXJhZ2VtZW50LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3Nwcmlua2xlX2VuY291cmFnZW1lbnQucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfc3ByaW5rbGVfZW5jb3VyYWdlbWVudC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3RyaWNrcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3ByaW5jaXBsZXNfdHJpY2tzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9wcmluY2lwbGVzX3RyaWNrcy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvcHJpbmNpcGxlc190cmlja3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJvZ3Jlc3NfYWN0aXZpdHkucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcm9ncmVzc19hY3Rpdml0eS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJvZ3Jlc3NfYWN0aXZpdHkucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3Byb2dyZXNzX2FjdGl2aXR5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Byb2dyZXNzX2FjdGl2aXR5Mi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3Byb2dyZXNzX2FjdGl2aXR5Mi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJvZ3Jlc3NfYWN0aXZpdHkyLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcm9ncmVzc19hY3Rpdml0eTIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJvZ3Jlc3NfZG93bmxvYWQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcm9ncmVzc19kb3dubG9hZC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJvZ3Jlc3NfZG93bmxvYWQucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3Byb2dyZXNzX2Rvd25sb2FkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Byb2dyZXNzX3RoZW1lcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3Byb2dyZXNzX3RoZW1lcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvcHJvZ3Jlc3NfdGhlbWVzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9wcm9ncmVzc190aGVtZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc2Nyb2xsX2luZGV4Lm1wNCBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc2Nyb2xsX2luZGV4Lm1wNApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kZXgubXA0CnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3Njcm9sbF9pbmRleC5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kZXgub2d2IGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kZXgub2d2CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRleC5vZ3YKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc2Nyb2xsX2luZGV4Lm9ndgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRleC53ZWJtIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kZXgud2VibQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kZXgud2VibQpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kZXgud2VibQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRpY2F0b3IubXA0IGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kaWNhdG9yLm1wNApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kaWNhdG9yLm1wNApyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kaWNhdG9yLm1wNApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRpY2F0b3Iub2d2IGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kaWNhdG9yLm9ndgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zY3JvbGxfaW5kaWNhdG9yLm9ndgpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kaWNhdG9yLm9ndgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRpY2F0b3Iud2VibSBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc2Nyb2xsX2luZGljYXRvci53ZWJtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3Njcm9sbF9pbmRpY2F0b3Iud2VibQpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zY3JvbGxfaW5kaWNhdG9yLndlYm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zZWVrYmFyX2V4YW1wbGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zZWVrYmFyX2V4YW1wbGUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3NlZWtiYXJfZXhhbXBsZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc2Vla2Jhcl9leGFtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3NlZWtiYXJfc3R5bGUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zZWVrYmFyX3N0eWxlLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zZWVrYmFyX3N0eWxlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zZWVrYmFyX3N0eWxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3NlbGVjdGlvbl9hZGp1c3RpbmdfYWN0aW9ucy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3NlbGVjdGlvbl9hZGp1c3RpbmdfYWN0aW9ucy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2FkanVzdGluZ19hY3Rpb25zLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zZWxlY3Rpb25fYWRqdXN0aW5nX2FjdGlvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2NhYl9iaWcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zZWxlY3Rpb25fY2FiX2JpZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2NhYl9iaWcucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3NlbGVjdGlvbl9jYWJfYmlnLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3NlbGVjdGlvbl9jYWJfZXhhbXBsZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3NlbGVjdGlvbl9jYWJfZXhhbXBsZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2NhYl9leGFtcGxlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zZWxlY3Rpb25fY2FiX2V4YW1wbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2NvbnRleHRfbWVudS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3NlbGVjdGlvbl9jb250ZXh0X21lbnUucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3NlbGVjdGlvbl9jb250ZXh0X21lbnUucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3NlbGVjdGlvbl9jb250ZXh0X21lbnUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3Bpbm5lcnNfYWN0aW9uYmFyLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3Bpbm5lcnNfYWN0aW9uYmFyLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zcGlubmVyc19hY3Rpb25iYXIucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3NwaW5uZXJzX2FjdGlvbmJhci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zcGlubmVyc19mb3JtLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3Bpbm5lcnNfZm9ybS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3Bpbm5lcnNfZm9ybS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3Bpbm5lcnNfZm9ybS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zcGlubmVyc19ob2xvbGlnaHRhbmRkYXJrLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3Bpbm5lcnNfaG9sb2xpZ2h0YW5kZGFyay5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3Bpbm5lcnNfaG9sb2xpZ2h0YW5kZGFyay5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3Bpbm5lcnNfaG9sb2xpZ2h0YW5kZGFyay5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2lwZV90YWJzLm1wNCBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy5tcDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpcGVfdGFicy5tcDQKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy5tcDQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2lwZV90YWJzLm9ndiBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy5vZ3YKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpcGVfdGFicy5vZ3YKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy5vZ3YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2lwZV90YWJzLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpcGVfdGFicy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2lwZV90YWJzLndlYm0gYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXBlX3RhYnMud2VibQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2lwZV90YWJzLndlYm0KcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpcGVfdGFicy53ZWJtCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpcGVfdmlld3MucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zd2lwZV92aWV3cy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpcGVfdmlld3MucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXBlX3ZpZXdzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3N3aXBlX3ZpZXdzMi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXBlX3ZpZXdzMi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpcGVfdmlld3MyLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zd2lwZV92aWV3czIucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpdGNoZXNfY2hlY2tib3hlcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXRjaGVzX2NoZWNrYm94ZXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3N3aXRjaGVzX2NoZWNrYm94ZXMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXRjaGVzX2NoZWNrYm94ZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3dpdGNoZXNfcmFkaW9zLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpdGNoZXNfcmFkaW9zLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2l0Y2hlc19yYWRpb3MucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXRjaGVzX3JhZGlvcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2l0Y2hlc19zd2l0Y2hlcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3N3aXRjaGVzX3N3aXRjaGVzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC9zd2l0Y2hlc19zd2l0Y2hlcy5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvc3dpdGNoZXNfc3dpdGNoZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3lzdGVtX3VpX2xhbmRpbmcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS9zeXN0ZW1fdWlfbGFuZGluZy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvc3lzdGVtX3VpX2xhbmRpbmcucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3N5c3RlbV91aV9sYW5kaW5nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RhYnNfb3ZlcnZpZXcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX292ZXJ2aWV3LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90YWJzX292ZXJ2aWV3LnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX292ZXJ2aWV3LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RhYnNfc2Nyb2xseS5tcDQgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RhYnNfc2Nyb2xseS5tcDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGFic19zY3JvbGx5Lm1wNApyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX3Njcm9sbHkubXA0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGFic19zY3JvbGx5Lm9ndiBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGFic19zY3JvbGx5Lm9ndgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90YWJzX3Njcm9sbHkub2d2CnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3RhYnNfc2Nyb2xseS5vZ3YKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90YWJzX3Njcm9sbHkud2VibSBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGFic19zY3JvbGx5LndlYm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGFic19zY3JvbGx5LndlYm0KcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGFic19zY3JvbGx5LndlYm0KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90YWJzX3N0YWNrZWQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX3N0YWNrZWQucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RhYnNfc3RhY2tlZC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGFic19zdGFja2VkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RhYnNfc3RhbmRhcmQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX3N0YW5kYXJkLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90YWJzX3N0YW5kYXJkLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX3N0YW5kYXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RhYnNfeW91dHViZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RhYnNfeW91dHViZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGFic195b3V0dWJlLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90YWJzX3lvdXR1YmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGV4dF9pbnB1dF9ob2xvZGFya2FuZGxpZ2h0LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGV4dF9pbnB1dF9ob2xvZGFya2FuZGxpZ2h0LnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90ZXh0X2lucHV0X2hvbG9kYXJrYW5kbGlnaHQucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3RleHRfaW5wdXRfaG9sb2RhcmthbmRsaWdodC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90ZXh0X2lucHV0X3NpbmdsZXZzbXVsdGlsaW5lLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGV4dF9pbnB1dF9zaW5nbGV2c211bHRpbGluZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGV4dF9pbnB1dF9zaW5nbGV2c211bHRpbGluZS5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGV4dF9pbnB1dF9zaW5nbGV2c211bHRpbGluZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90ZXh0X2lucHV0X3RleHRzZWxlY3Rpb24ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90ZXh0X2lucHV0X3RleHRzZWxlY3Rpb24ucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RleHRfaW5wdXRfdGV4dHNlbGVjdGlvbi5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvdGV4dF9pbnB1dF90ZXh0c2VsZWN0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RleHRfaW5wdXRfdHlwZXNhbmR0eXBlZG93bi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RleHRfaW5wdXRfdHlwZXNhbmR0eXBlZG93bi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGV4dF9pbnB1dF90eXBlc2FuZHR5cGVkb3duLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90ZXh0X2lucHV0X3R5cGVzYW5kdHlwZWRvd24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGhlbWVzX2hvbG9fZGFyay5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RoZW1lc19ob2xvX2RhcmsucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RoZW1lc19ob2xvX2RhcmsucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3RoZW1lc19ob2xvX2RhcmsucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGhlbWVzX2hvbG9faW52ZXJzZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RoZW1lc19ob2xvX2ludmVyc2UucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RoZW1lc19ob2xvX2ludmVyc2UucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3RoZW1lc19ob2xvX2ludmVyc2UucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGhlbWVzX2hvbG9fbGlnaHQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90aGVtZXNfaG9sb19saWdodC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdGhlbWVzX2hvbG9fbGlnaHQucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3RoZW1lc19ob2xvX2xpZ2h0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RvdWNoX2ZlZWRiYWNrX2NvbW11bmljYXRpb24ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19jb21tdW5pY2F0aW9uLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90b3VjaF9mZWVkYmFja19jb21tdW5pY2F0aW9uLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19jb21tdW5pY2F0aW9uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RvdWNoX2ZlZWRiYWNrX21hbmlwdWxhdGlvbi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RvdWNoX2ZlZWRiYWNrX21hbmlwdWxhdGlvbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdG91Y2hfZmVlZGJhY2tfbWFuaXB1bGF0aW9uLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19tYW5pcHVsYXRpb24ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdG91Y2hfZmVlZGJhY2tfcmVhY3Rpb25fcmVzcG9uc2UucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19yZWFjdGlvbl9yZXNwb25zZS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdG91Y2hfZmVlZGJhY2tfcmVhY3Rpb25fcmVzcG9uc2UucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3RvdWNoX2ZlZWRiYWNrX3JlYWN0aW9uX3Jlc3BvbnNlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3RvdWNoX2ZlZWRiYWNrX3N0YXRlcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3RvdWNoX2ZlZWRiYWNrX3N0YXRlcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdG91Y2hfZmVlZGJhY2tfc3RhdGVzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19zdGF0ZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdHlwb2dyYXBoeV9hbHBoYXMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X2FscGhhcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdHlwb2dyYXBoeV9hbHBoYXMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3R5cG9ncmFwaHlfYWxwaGFzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3R5cG9ncmFwaHlfZGVmYXVsdHMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X2RlZmF1bHRzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC90eXBvZ3JhcGh5X2RlZmF1bHRzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X2RlZmF1bHRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3R5cG9ncmFwaHlfbWFpbi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3R5cG9ncmFwaHlfbWFpbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdHlwb2dyYXBoeV9tYWluLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X21haW4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdHlwb2dyYXBoeV9zaXplcy5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3R5cG9ncmFwaHlfc2l6ZXMucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3R5cG9ncmFwaHlfc2l6ZXMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3R5cG9ncmFwaHlfc2l6ZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdWlfb3ZlcnZpZXdfYWxsX2FwcHMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19hbGxfYXBwcy5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdWlfb3ZlcnZpZXdfYWxsX2FwcHMucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X2FsbF9hcHBzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3VpX292ZXJ2aWV3X2FwcF91aS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X2FwcF91aS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdWlfb3ZlcnZpZXdfYXBwX3VpLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19hcHBfdWkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdWlfb3ZlcnZpZXdfaG9tZV9zY3JlZW4ucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19ob21lX3NjcmVlbi5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdWlfb3ZlcnZpZXdfaG9tZV9zY3JlZW4ucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X2hvbWVfc2NyZWVuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3VpX292ZXJ2aWV3X25vdGlmaWNhdGlvbnMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19ub3RpZmljYXRpb25zLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC91aV9vdmVydmlld19ub3RpZmljYXRpb25zLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19ub3RpZmljYXRpb25zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3VpX292ZXJ2aWV3X3JlY2VudHMucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19yZWNlbnRzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC91aV9vdmVydmlld19yZWNlbnRzLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19yZWNlbnRzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3VpX292ZXJ2aWV3X3N5c3RlbV91aS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL21lZGlhL3VpX292ZXJ2aWV3X3N5c3RlbV91aS5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvdWlfb3ZlcnZpZXdfc3lzdGVtX3VpLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS91aV9vdmVydmlld19zeXN0ZW1fdWkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvd2hhdHNfbmV3X2FjdGlvbl9iYXIucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS93aGF0c19uZXdfYWN0aW9uX2Jhci5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NvbnRlbnQvd2hhdHNfbmV3X2FjdGlvbl9iYXIucG5nCnJlbmFtZSB0byBkb2NzL2h0bWwvZGVzaWduL21lZGlhL3doYXRzX25ld19hY3Rpb25fYmFyLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3doYXRzX25ld19tdWx0aXBhbmVsLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvd2hhdHNfbmV3X211bHRpcGFuZWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3doYXRzX25ld19tdWx0aXBhbmVsLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS93aGF0c19uZXdfbXVsdGlwYW5lbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY29udGVudC93aGF0c19uZXdfbXVsdGlzZWxlY3QucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS93aGF0c19uZXdfbXVsdGlzZWxlY3QucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3doYXRzX25ld19tdWx0aXNlbGVjdC5wbmcKcmVuYW1lIHRvIGRvY3MvaHRtbC9kZXNpZ24vbWVkaWEvd2hhdHNfbmV3X211bHRpc2VsZWN0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3doYXRzX25ld19uYXZfYmFyLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vbWVkaWEvd2hhdHNfbmV3X25hdl9iYXIucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9jb250ZW50L3doYXRzX25ld19uYXZfYmFyLnBuZwpyZW5hbWUgdG8gZG9jcy9odG1sL2Rlc2lnbi9tZWRpYS93aGF0c19uZXdfbmF2X2Jhci5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjZkMDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBBY3Rpb24gQmFyCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkFjdGlvbiBCYXI8L2gyPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotCi0gICAgICAgICAgCi0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fb3ZlcnZpZXcucG5nIj4KLQotPHA+VGhlIDxlbT5hY3Rpb24gYmFyPC9lbT4gaXMgYXJndWFibHkgdGhlIG1vc3QgaW1wb3J0YW50IHN0cnVjdHVyYWwgZWxlbWVudCBvZiBhbiBBbmRyb2lkIGFwcC4gSXQncyBhCi1kZWRpY2F0ZWQgcGllY2Ugb2YgcmVhbCBlc3RhdGUgYXQgdGhlIHRvcCBvZiBlYWNoIHNjcmVlbiB0aGF0IGlzIGdlbmVyYWxseSBwZXJzaXN0ZW50IHRocm91Z2hvdXQgdGhlCi1hcHAuPC9wPgotPHA+PHN0cm9uZz5UaGUgbWFpbiBwdXJwb3NlIG9mIHRoZSBhY3Rpb24gYmFyIGlzIHRvPC9zdHJvbmc+OjwvcD4KLTx1bD4KLTxsaT5NYWtlIGltcG9ydGFudCBhY3Rpb25zIChzdWNoIGFzIDxlbT5OZXc8L2VtPiBvciA8ZW0+U2VhcmNoPC9lbT4sIGV0YykgcHJvbWluZW50IGFuZCBhY2Nlc3NpYmxlIGluIGEgcHJlZGljdGFibGUKLSAgIHdheS48L2xpPgotPGxpPlN1cHBvcnQgY29uc2lzdGVudCBuYXZpZ2F0aW9uIGFuZCB2aWV3IHN3aXRjaGluZyB3aXRoaW4gYXBwcy48L2xpPgotPGxpPlJlZHVjZSBjbHV0dGVyIGJ5IHByb3ZpZGluZyBhbiBhY3Rpb24gb3ZlcmZsb3cgZm9yIHJhcmVseSB1c2VkIGFjdGlvbnMuPC9saT4KLTxsaT5Qcm92aWRlIGEgZGVkaWNhdGVkIHNwYWNlIGZvciBnaXZpbmcgeW91ciBhcHAgYW4gaWRlbnRpdHkuPC9saT4KLTwvdWw+Ci08cD5JZiB5b3UncmUgbmV3IHRvIHdyaXRpbmcgQW5kcm9pZCBhcHBzLCBub3RlIHRoYXQgdGhlIGFjdGlvbiBiYXIgaXMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBkZXNpZ24KLWVsZW1lbnRzIHlvdSBjYW4gaW1wbGVtZW50LiBGb2xsb3dpbmcgdGhlIGd1aWRlbGluZXMgZGVzY3JpYmVkIGhlcmUgd2lsbCBnbyBhIGxvbmcgd2F5IHRvd2FyZCBtYWtpbmcKLXlvdXIgYXBwJ3MgaW50ZXJmYWNlIGNvbnNpc3RlbnQgd2l0aCB0aGUgY29yZSBBbmRyb2lkIGFwcHMuPC9wPgotPGgyIGlkPSJvcmdhbml6YXRpb24iPkdlbmVyYWwgT3JnYW5pemF0aW9uPC9oMj4KLQotPHA+VGhlIGFjdGlvbiBiYXIgaXMgc3BsaXQgaW50byBmb3VyIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWFzIHRoYXQgYXBwbHkgdG8gbW9zdCBhcHBzLjwvcD4KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX2Jhc2ljcy5wbmciPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03IHdpdGgtY2FsbG91dHMiPgotCi0gICAgPG9sPgotICAgICAgPGxpIGNsYXNzPSJ2YWx1ZS0xIj48aDQ+QXBwIGljb248L2g0PgotICAgICAgICA8cD4KLQotVGhlIGFwcCBpY29uIGVzdGFibGlzaGVzIHlvdXIgYXBwJ3MgaWRlbnRpdHkuIEl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgZGlmZmVyZW50IGxvZ28gb3IgYnJhbmRpbmcKLWlmIHlvdSB3aXNoLgotSW1wb3J0YW50OiBJZiB0aGUgYXBwIGlzIGN1cnJlbnRseSBub3QgZGlzcGxheWluZyB0aGUgdG9wLWxldmVsIHNjcmVlbiwgYmUgc3VyZSB0byBkaXNwbGF5IHRoZSBVcAotY2FyZXQgdG8gdGhlIGxlZnQgb2YgdGhlIGFwcCBpY29uLCBzbyB0aGUgdXNlciBjYW4gbmF2aWdhdGUgdXAgdGhlIGhpZXJhcmNoeS4gRm9yIG1vcmUgZGlzY3Vzc2lvbiBvZgotVXAgbmF2aWdhdGlvbiwgc2VlIHRoZSA8YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+IHBhdHRlcm4uCi0KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+Ci0gIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fdXBfYXBwX2ljb24ucG5nIj4KLSAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgIEFwcCBpY29uIHdpdGggYW5kIHdpdGhvdXQgInVwIiBhZmZvcmRhbmNlLgotICA8L2Rpdj4KLTwvZGl2PgotCi0gICAgICAgIDwvcD4KLSAgICAgIDwvbGk+Ci0gICAgPC9vbD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiB3aXRoLWNhbGxvdXRzIj4KLQotICAgIDxvbD4KLSAgICAgIDxsaSBjbGFzcz0idmFsdWUtMiI+PGg0PlZpZXcgY29udHJvbDwvaDQ+Ci0gICAgICAgIDxwPgotCi1JZiB5b3VyIGFwcCBkaXNwbGF5cyBkYXRhIGluIGRpZmZlcmVudCB2aWV3cywgdGhpcyBzZWdtZW50IG9mIHRoZSBhY3Rpb24gYmFyIGFsbG93cyB1c2VycyB0byBzd2l0Y2gKLXZpZXdzLiBFeGFtcGxlcyBvZiB2aWV3LXN3aXRjaGluZyBjb250cm9scyBhcmUgZHJvcC1kb3duIG1lbnVzIG9yIHRhYiBjb250cm9scy4gCi0KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLQotSWYgeW91ciBhcHAgZG9lc24ndCBzdXBwb3J0IGRpZmZlcmVudCB2aWV3cywgeW91IGNhbiBhbHNvIHVzZSB0aGlzIHNwYWNlIHRvIGRpc3BsYXkgbm9uLWludGVyYWN0aXZlCi1jb250ZW50LCBzdWNoIGFzIGFuIGFwcCB0aXRsZSBvciBsb25nZXIgYnJhbmRpbmcgaW5mb3JtYXRpb24uCi0KLSAgICAgICAgPC9wPgotICAgICAgPC9saT4KLSAgICAgIDxsaSBjbGFzcz0idmFsdWUtMyI+PGg0PkFjdGlvbiBidXR0b25zPC9oND4KLSAgICAgICAgPHA+Ci0KLVNob3cgdGhlIG1vc3QgaW1wb3J0YW50IGFjdGlvbnMgb2YgeW91ciBhcHAgaW4gdGhlIGFjdGlvbnMgc2VjdGlvbi4gQWN0aW9ucyB0aGF0IGRvbid0IGZpdCBpbiB0aGUKLWFjdGlvbiBiYXIgYXJlIG1vdmVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlIGFjdGlvbiBvdmVyZmxvdy4KLQotICAgICAgICA8L3A+Ci0gICAgICA8L2xpPgotICAgICAgPGxpIGNsYXNzPSJ2YWx1ZS00Ij48aDQ+QWN0aW9uIG92ZXJmbG93PC9oND4KLSAgICAgICAgPHA+Ci0KLU1vdmUgbGVzcyBvZnRlbiB1c2VkIGFjdGlvbnMgdG8gdGhlIGFjdGlvbiBvdmVyZmxvdy4KLQotICAgICAgICA8L3A+Ci0gICAgICA8L2xpPgotICAgIDwvb2w+Ci0gIDwvZGl2PgotPC9kaXY+Ci0KLTxoMiBpZD0iYWRhcHRpbmctcm90YXRpb24iPkFkYXB0aW5nIHRvIFJvdGF0aW9uIGFuZCBEaWZmZXJlbnQgU2NyZWVuIFNpemVzPC9oMj4KLQotPHA+T25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBVSSBpc3N1ZXMgdG8gY29uc2lkZXIgd2hlbiBjcmVhdGluZyBhbiBhcHAgaXMgaG93IHRvIGFkanVzdCB0byBzY3JlZW4KLXJvdGF0aW9uIG9uIGRpZmZlcmVudCBzY3JlZW4gc2l6ZXMuPC9wPgotPHA+WW91IGNhbiBhZGFwdCB0byBzdWNoIGNoYW5nZXMgYnkgdXNpbmcgPGVtPnNwbGl0IGFjdGlvbiBiYXJzPC9lbT4sIHdoaWNoIGFsbG93IHlvdSB0byBkaXN0cmlidXRlIGFjdGlvbiBiYXIKLWNvbnRlbnQgYWNyb3NzIG11bHRpcGxlIGJhcnMgbG9jYXRlZCBiZWxvdyB0aGUgbWFpbiBhY3Rpb24gYmFyIG9yIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fcm90YXRpb24ucG5nIj4KLTxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgU3BsaXQgYWN0aW9uIGJhciBzaG93aW5nIGFjdGlvbiBidXR0b25zIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiBpbiB2ZXJ0aWNhbCBvcmllbnRhdGlvbi4KLTwvZGl2PgotCi08aDIgaWQ9ImNvbnNpZGVyYXRpb25zLXNwbGl0LWFjdGlvbi1iYXJzIj5MYXlvdXQgQ29uc2lkZXJhdGlvbnMgZm9yIFNwbGl0IEFjdGlvbiBCYXJzPC9oMj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCB3aXRoLWNhbGxvdXRzIj4KLQotPHA+V2hlbiBzcGxpdHRpbmcgdXAgY29udGVudCBhY3Jvc3MgbXVsdGlwbGUgYWN0aW9uIGJhcnMsIHlvdSBnZW5lcmFsbHkgaGF2ZSB0aHJlZSBwb3NzaWJsZSBsb2NhdGlvbnMKLWZvciBhY3Rpb24gYmFyIGNvbnRlbnQ6PC9wPgotPG9sPgotPGxpPjxzdHJvbmc+TWFpbiBhY3Rpb24gYmFyPC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPlRvcCBiYXI8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+Qm90dG9tIGJhcjwvc3Ryb25nPjwvbGk+Ci08L29sPgotPHA+SWYgdGhlIHVzZXIgY2FuIG5hdmlnYXRlIHVwIHRoZSBoaWVyYXJjaHkgZnJvbSBhIGdpdmVuIHNjcmVlbiwgdGhlIG1haW4gYWN0aW9uIGJhciBjb250YWlucyB0aGUgdXAKLWNhcmV0LCBhdCBhIG1pbmltdW0uPC9wPgotPHA+VG8gYWxsb3cgdGhlIHVzZXIgdG8gcXVpY2tseSBzd2l0Y2ggYmV0d2VlbiB0aGUgdmlld3MgeW91ciBhcHAgcHJvdmlkZXMsIHVzZSB0YWJzIG9yIGEgc3Bpbm5lciBpbgotdGhlIHRvcCBiYXIuPC9wPgotPHA+VG8gZGlzcGxheSBhY3Rpb25zIGFuZCwgaWYgbmVjZXNzYXJ5LCB0aGUgYWN0aW9uIG92ZXJmbG93LCB1c2UgdGhlIGJvdHRvbSBiYXIuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi0zIj4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fY29uc2lkZXJhdGlvbnMucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9ImNvbnRleHR1YWwiPkNvbnRleHR1YWwgQWN0aW9uIEJhcnM8L2gyPgotCi08cD5BIDxlbT5jb250ZXh0dWFsIGFjdGlvbiBiYXIgKENBQik8L2VtPiBpcyBhIHRlbXBvcmFyeSBhY3Rpb24gYmFyIHRoYXQgb3ZlcmxheXMgdGhlIGFwcCdzIGFjdGlvbiBiYXIgZm9yIHRoZQotZHVyYXRpb24gb2YgYSBwYXJ0aWN1bGFyIHN1Yi10YXNrLiBDQUJzIGFyZSBtb3N0IHR5cGljYWxseSB1c2VkIGZvciB0YXNrcyB0aGF0IGludm9sdmUgYWN0aW5nIG9uCi1zZWxlY3RlZCBkYXRhIG9yIHRleHQuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9jYWIucG5nIj4KLTxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgQ29udGV4dHVhbCBhY3Rpb24gYmFyIHNob3duIGluIEJyb3dzZXIgYW5kIEdtYWlsCi08L2Rpdj4KLQotPHA+VGhlIHNlbGVjdGlvbiBDQUIgYXBwZWFycyBhZnRlciBhIGxvbmcgcHJlc3Mgb24gYSBzZWxlY3RhYmxlIGRhdGEgaXRlbSB0cmlnZ2VycyBzZWxlY3Rpb24gbW9kZS48L3A+Ci08cD48c3Ryb25nPkZyb20gaGVyZSB0aGUgdXNlciBjYW48L3N0cm9uZz46PC9wPgotPHVsPgotPGxpPlNlbGVjdCBhZGRpdGlvbmFsIGVsZW1lbnRzIGJ5IHRvdWNoaW5nIHRoZW0uPC9saT4KLTxsaT5UcmlnZ2VyIGFuIGFjdGlvbiBmcm9tIHRoZSBDQUIgdGhhdCBhcHBsaWVzIHRvIGFsbCBzZWxlY3RlZCBkYXRhIGl0ZW1zLiBUaGUgQ0FCIHRoZW4KLSAgIGF1dG9tYXRpY2FsbHkgZGlzbWlzc2VzIGl0c2VsZi48L2xpPgotPGxpPkRpc21pc3MgdGhlIENBQiB2aWEgdGhlIG5hdmlnYXRpb24gYmFyJ3MgQmFjayBidXR0b24gb3IgdGhlIENBQidzIGNoZWNrbWFyayBidXR0b24uIFRoaXMgcmVtb3ZlcwotICAgdGhlIENBQiBhbG9uZyB3aXRoIGFsbCBzZWxlY3Rpb24gaGlnaGxpZ2h0cy48L2xpPgotPC91bD4KLTxwPlVzZSBDQUJzIHdoZW5ldmVyIHlvdSBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgZGF0YSB2aWEgbG9uZyBwcmVzcy4gWW91IGNhbiBjb250cm9sIHRoZSBhY3Rpb24KLWNvbnRlbnQgb2YgYSBDQUIgaW4gb3JkZXIgdG8gaW5zZXJ0IHRoZSBhY3Rpb25zIHlvdSB3b3VsZCBsaWtlIHRoZSB1c2VyIHRvIGJlIGFibGUgdG8gcGVyZm9ybS48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlICJTZWxlY3Rpb24iIHBhdHRlcm4uPC9wPgotPGgyIGlkPSJlbGVtZW50cyI+QWN0aW9uIEJhciBFbGVtZW50czwvaDI+Ci0KLTxoND5UYWJzPC9oND4KLTxwPjxlbT5UYWJzPC9lbT4gZGlzcGxheSBhcHAgdmlld3MgY29uY3VycmVudGx5IGFuZCBtYWtlIGl0IGVhc3kgdG8gZXhwbG9yZSBhbmQgc3dpdGNoIGJldHdlZW4gdGhlbS4gVXNlIHRhYnMKLWlmIHlvdSBleHBlY3QgeW91ciB1c2VycyB0byBzd2l0Y2ggdmlld3MgZnJlcXVlbnRseS48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90YWJzX3lvdXR1YmUucG5nIj4KLQotPHA+VGhlcmUgYXJlIHR3byB0eXBlcyBvZiB0YWJzOiBmaXhlZCBhbmQgc2Nyb2xsYWJsZS48L3A+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08aDQ+U2Nyb2xsYWJsZSB0YWJzPC9oND4KLTxwPjxlbT5TY3JvbGxhYmxlIHRhYnM8L2VtPiBhbHdheXMgdGFrZSB1cCB0aGUgZW50aXJlIHdpZHRoIG9mIHRoZSBiYXIsIHdpdGggdGhlIGN1cnJlbnRseSBhY3RpdmUgdmlldyBpdGVtIGluCi10aGUgY2VudGVyLCBhbmQgdGhlcmVmb3JlIG5lZWQgdG8gbGl2ZSBpbiBhIGRlZGljYXRlZCBiYXIuIFNjcm9sbGFibGUgdGFicyBjYW4gdGhlbXNlbHZlcyBiZQotc2Nyb2xsZWQgaG9yaXpvbnRhbGx5IHRvIGJyaW5nIG1vcmUgdGFicyBpbnRvIHZpZXcuPC9wPgotPHA+VXNlIHNjcm9sbGFibGUgdGFicyBpZiB5b3UgaGF2ZSBhIGxhcmdlIG51bWJlciBvZiB2aWV3cyBvciBpZiB5b3UncmUgdW5zdXJlIGhvdyBtYW55IHZpZXdzIHdpbGwgYmUKLWRpc3BsYXllZCBiZWNhdXNlIHlvdXIgYXBwIGluc2VydHMgdmlld3MgZHluYW1pY2FsbHkgKGZvciBleGFtcGxlLCBvcGVuIGNoYXRzIGluIGEgbWVzc2FnaW5nIGFwcAotdGhhdCB0aGUgdXNlciBjYW4gbmF2aWdhdGUgYmV0d2VlbikuIFNjcm9sbGFibGUgdGFicyBzaG91bGQgYWx3YXlzIGFsbG93IHRoZSB1c2VyIHRvIG5hdmlnYXRlCi1iZXR3ZWVuIHRoZSB2aWV3cyBieSBzd2lwaW5nIGxlZnQgb3IgcmlnaHQgb24gdGhlIGNvbnRlbnQgYXJlYSBhcyB3ZWxsIGFzIHN3aXBpbmcgdGhlIHRhYnMKLXRoZW1zZWx2ZXMuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotICAgIDx2aWRlbyB3aWR0aD0iNDAwIiBjbGFzcz0id2l0aC1zaGFkb3cgcGxheS1vbi1ob3ZlciIgYXV0b3BsYXk+Ci0gICAgICA8c291cmNlIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGFic19zY3JvbGx5Lm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KLSAgICAgIDxzb3VyY2Ugc3JjPSIuLi9zdGF0aWMvY29udGVudC90YWJzX3Njcm9sbHkud2VibSIgdHlwZT0idmlkZW8vd2VibSI+Ci0gICAgICA8c291cmNlIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGFic19zY3JvbGx5Lm9ndiIgdHlwZT0idmlkZW8vb2dnIj4KLSAgICA8L3ZpZGVvPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFNjcm9sbGluZyB0YWJzIGluIEFuZHJvaWQgTWFya2V0LgotICAgICAgPGRpdiBjbGFzcz0idmlkZW8taW5zdHJ1Y3Rpb25zIj4mbmJzcDs8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0PkZpeGVkIHRhYnM8L2g0PgotPHA+PGVtPkZpeGVkIHRhYnM8L2VtPiBhcmUgYWx3YXlzIHZpc2libGUgb24gdGhlIHNjcmVlbiwgYW5kIGNhbid0IGJlIG1vdmVkIG91dCBvZiB0aGUgd2F5IGxpa2Ugc2Nyb2xsYWJsZQotdGFicy4gRml4ZWQgdGFicyBpbiB0aGUgbWFpbiBhY3Rpb24gYmFyIGNhbiBtb3ZlIHRvIHRoZSB0b3AgYmFyIHdoZW4gdGhlIHNjcmVlbiBvcmllbnRhdGlvbiBjaGFuZ2VzLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX2RlZmF1bHRfdGFicy5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIERlZmF1bHQgZml4ZWQgdGFicyBzaG93biBpbiBIb2xvIERhcmsgJmFtcDsgTGlnaHQuCi0gICAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLTxoND5TcGlubmVyczwvaDQ+Ci08cD5BIDxlbT5zcGlubmVyPC9lbT4gaXMgYSBkcm9wLWRvd24gbWVudSB0aGF0IGFsbG93cyB1c2VycyB0byBzd2l0Y2ggYmV0d2VlbiB2aWV3cyBvZiB5b3VyIGFwcC4gPC9wPgotPHA+PHN0cm9uZz5Vc2Ugc3Bpbm5lcnMgcmF0aGVyIHRoYW4gdGFicyBpbiB0aGUgbWFpbiBhY3Rpb24gYmFyIGlmPC9zdHJvbmc+OjwvcD4KLTx1bD4KLTxsaT5Zb3UgZG9uJ3Qgd2FudCB0byBnaXZlIHVwIHRoZSB2ZXJ0aWNhbCBzY3JlZW4gcmVhbCBlc3RhdGUgZm9yIGEgZGVkaWNhdGVkIHRhYiBiYXIuPC9saT4KLTxsaT5Zb3UgZXhwZWN0IHlvdXIgYXBwJ3MgdXNlcnMgdG8gc3dpdGNoIHZpZXdzIGluZnJlcXVlbnRseS48L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX3NwaW5uZXIucG5nIj4KLSAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gICAgICBBY3Rpb24gYmFyIHNwaW5uZXIgZnJvbSBDYWxlbmRhciBhcHBsaWNhdGlvbi4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDQ+QWN0aW9uIGJ1dHRvbnM8L2g0PgotPHA+PGVtPkFjdGlvbiBidXR0b25zPC9lbT4gb24gdGhlIGFjdGlvbiBiYXIgc3VyZmFjZSB5b3VyIGFwcCdzIG1vc3QgaW1wb3J0YW50IGFjdGl2aXRpZXMuIFRoaW5rIGFib3V0IHdoaWNoCi1idXR0b25zIHdpbGwgZ2V0IHVzZWQgbW9zdCBvZnRlbiwgYW5kIG9yZGVyIHRoZW0gYWNjb3JkaW5nbHkuIERlcGVuZGluZyBvbiBhdmFpbGFibGUgc2NyZWVuIHJlYWwKLWVzdGF0ZSwgdGhlIHN5c3RlbSBzaG93cyB5b3VyIG1vc3QgaW1wb3J0YW50IGFjdGlvbnMgYXMgYWN0aW9uIGJ1dHRvbnMgYW5kIG1vdmVzIHRoZSByZXN0IHRvIHRoZQotYWN0aW9uIG92ZXJmbG93LiBUaGUgYWN0aW9uIGJhciBhbmQgdGhlIGFjdGlvbiBvdmVyZmxvdyBzaG91bGQgb25seSBwcmVzZW50IGFjdGlvbnMgdG8gdGhlIHVzZXIgdGhhdAotYXJlIGF2YWlsYWJsZS4gSWYgYW4gYWN0aW9uIGlzIHVuYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQsIGhpZGUgaXQuIERvIG5vdCBzaG93IGl0IGFzCi1kaXNhYmxlZC48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fYWN0aW9uX2ljb25zLnBuZyI+Ci08ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gIEEgc2FtcGxpbmcgb2YgYWN0aW9uIGJ1dHRvbnMgdXNlZCB0aHJvdWdob3V0IHRoZSBHbWFpbCBhcHBsaWNhdGlvbi4KLTwvZGl2PgotCi08cD5Gb3IgZ3VpZGFuY2Ugb24gcHJpb3JpdGl6aW5nIGFjdGlvbnMsIHVzZSB0aGUgRklUIHNjaGVtZS48L3A+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08cD48c3Ryb25nPkYgJm1kYXNoOyBGcmVxdWVudDwvc3Ryb25nPjwvcD4KLTx1bD4KLTxsaT5XaWxsIHBlb3BsZSB1c2UgdGhpcyBhY3Rpb24gYXQgbGVhc3QgNyBvdXQgb2YgMTAgdGltZXMgdGhleSB2aXNpdCB0aGUgc2NyZWVuPzwvbGk+Ci08bGk+V2lsbCB0aGV5IHR5cGljYWxseSB1c2UgaXQgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdz88L2xpPgotPGxpPldvdWxkIHRha2luZyBhbiBleHRyYSBzdGVwIGV2ZXJ5IHRpbWUgdHJ1bHkgYmUgYnVyZGVuc29tZT88L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxwPjxzdHJvbmc+SSAmbWRhc2g7IEltcG9ydGFudDwvc3Ryb25nPjwvcD4KLTx1bD4KLTxsaT5EbyB5b3Ugd2FudCBldmVyeW9uZSB0byBkaXNjb3ZlciB0aGlzIGFjdGlvbiBiZWNhdXNlIGl0J3MgZXNwZWNpYWxseSBjb29sIG9yIGEgc2VsbGluZyBwb2ludD88L2xpPgotPGxpPklzIGl0IHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGVmZm9ydGxlc3MgaW4gdGhlIHJhcmUgY2FzZXMgaXQncyBuZWVkZWQ/PC9saT4KLTwvdWw+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08cD48c3Ryb25nPlQgJm1kYXNoOyBUeXBpY2FsPC9zdHJvbmc+PC9wPgotPHVsPgotPGxpPklzIGl0IHR5cGljYWxseSBwcmVzZW50ZWQgYXMgYSBmaXJzdC1jbGFzcyBhY3Rpb24gaW4gc2ltaWxhciBhcHBzPzwvbGk+Ci08bGk+R2l2ZW4gdGhlIGNvbnRleHQsIHdvdWxkIHBlb3BsZSBiZSBzdXJwcmlzZWQgaWYgaXQgd2VyZSBidXJpZWQgaW4gdGhlIGFjdGlvbiBvdmVyZmxvdz88L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08cD5JZiBlaXRoZXIgRiwgSSwgb3IgVCBhcHBseSwgdGhlbiBpdCdzIGFwcHJvcHJpYXRlIGZvciB0aGUgYWN0aW9uIGJhci4gT3RoZXJ3aXNlLCBpdCBiZWxvbmdzIGluIHRoZQotYWN0aW9uIG92ZXJmbG93LjwvcD4KLQotPHA+Ci0KLVByZS1kZWZpbmVkIGdseXBocyBzaG91bGQgYmUgdXNlZCBmb3IgY2VydGFpbiBjb21tb24gYWN0aW9ucyBzdWNoIGFzICJyZWZyZXNoIiBhbmQgInNoYXJlLiIgVGhlCi1kb3dubG9hZCBsaW5rIGJlbG93IHByb3ZpZGVzIGEgcGFja2FnZSB3aXRoIGljb25zIHRoYXQgYXJlIHNjYWxlZCBmb3IgdmFyaW91cyBzY3JlZW4gZGVuc2l0aWVzIGFuZAotYXJlIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCB0aGUgSG9sbyBMaWdodCBhbmQgSG9sbyBEYXJrIHRoZW1lcy4gVGhlIHBhY2thZ2UgYWxzbyBpbmNsdWRlcyB1bnN0eWxlZAotaWNvbnMgdGhhdCB5b3UgY2FuIG1vZGlmeSB0byBtYXRjaCB5b3VyIHRoZW1lLCBpbiBhZGRpdGlvbiB0byBBZG9iZSZyZWc7IElsbHVzdHJhdG9yJnJlZzsgc291cmNlCi1maWxlcyBmb3IgZnVydGhlciBjdXN0b21pemF0aW9uLgotCi08L3A+Ci08cD4KLQotPGEgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9BbmRyb2lkX0Rlc2lnbl9JY29uc18yMDEyMDIyOS56aXAiPkRvd25sb2FkIHRoZSBBY3Rpb24gQmFyIEljb24gUGFjazwvYT4KLQotPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0PkFjdGlvbiBvdmVyZmxvdzwvaDQ+Ci08cD5UaGUgYWN0aW9uIG92ZXJmbG93IGluIHRoZSBhY3Rpb24gYmFyIHByb3ZpZGVzIGFjY2VzcyB0byB5b3VyIGFwcCdzIGxlc3MgZnJlcXVlbnRseSB1c2VkIGFjdGlvbnMuCi1UaGUgb3ZlcmZsb3cgaWNvbiBvbmx5IGFwcGVhcnMgb24gcGhvbmVzIHRoYXQgaGF2ZSBubyBtZW51IGhhcmR3YXJlIGtleXMuIFBob25lcyB3aXRoIG1lbnUga2V5cwotZGlzcGxheSB0aGUgYWN0aW9uIG92ZXJmbG93IHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUga2V5LjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYWN0aW9uX2Jhcl9wYXR0ZXJuX292ZXJmbG93LnBuZyI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgQWN0aW9uIG92ZXJmbG93IGlzIHBpbm5lZCB0byB0aGUgcmlnaHQgc2lkZS4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08cD5Ib3cgbWFueSBhY3Rpb25zIHdpbGwgZml0IGluIHRoZSBtYWluIGFjdGlvbiBiYXI/IEFjdGlvbiBiYXIgY2FwYWNpdHkgaXMgY29udHJvbGxlZCBieSB0aGUgZm9sbG93aW5nCi1ydWxlczo8L3A+Ci08dWw+Ci08bGk+QWN0aW9uIGJ1dHRvbnMgaW4gdGhlIG1haW4gYWN0aW9uIGJhciBtYXkgbm90IG9jY3VweSBtb3JlIHRoYW4gNTAlIG9mIHRoZSBiYXIncyB3aWR0aC4gQWN0aW9uCi0gIGJ1dHRvbnMgb24gYm90dG9tIGFjdGlvbiBiYXJzIGNhbiB1c2UgdGhlIGVudGlyZSB3aWR0aC48L2xpPgotPGxpPlRoZSBzY3JlZW4gd2lkdGggaW4gZGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbHMKLSAgKDxhY3JvbnltIHRpdGxlPSJEZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscy4gT25lIGRwIGlzIG9uZSBwaXhlbCBvbiBhIDE2MCBkcGkgc2NyZWVuLiI+ZHA8L2Fjcm9ueW0+KQotICBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgZml0IGluIHRoZSBtYWluIGFjdGlvbiBiYXI6PHVsPgotPGxpPnNtYWxsZXIgdGhhbiAzNjAgZHAgPSAyIGljb25zPC9saT4KLTxsaT4zNjAtNDk5IGRwID0gMyBpY29uczwvbGk+Ci08bGk+NTAwLTU5OSBkcCA9IDQgaWNvbnM8L2xpPgotPGxpPjYwMCBkcCBhbmQgbGFyZ2VyID0gNSBpY29uczwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fdGFibGUucG5nIj4KLTxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgSW4gdGhlIGFib3ZlIHRhYmxlICJvIiBkZW5vdGVzIGFuIGFjdGlvbiBiYXIgaXRlbSBhbmQgIj0iIGFuIG92ZXJmbG93IGljb24uCi08L2Rpdj4KLQotPGg0PlNoYXJpbmcgZGF0YTwvaDQ+Ci08cD5XaGVuZXZlciB5b3VyIGFwcCBwZXJtaXRzIHNoYXJpbmcgb2YgZGF0YSwgc3VjaCBhcyBpbWFnZXMgb3IgbW92aWUgY2xpcHMsIHVzZSBhIDxlbT5zaGFyZSBhY3Rpb24KLXByb3ZpZGVyPC9lbT4gaW4geW91ciBhY3Rpb24gYmFyLiBUaGUgc2hhcmUgYWN0aW9uIHByb3ZpZGVyIGlzIGRlc2lnbmVkIHRvIHNwZWVkIHVwIHNoYXJpbmcgYnkKLWRpc3BsYXlpbmcgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBzaGFyaW5nIHNlcnZpY2UgbmV4dCB0byBhIHNwaW5uZXIgYnV0dG9uIHRoYXQgY29udGFpbnMgb3RoZXIKLXNoYXJpbmcgb3B0aW9ucy48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hY3Rpb25fYmFyX3BhdHRlcm5fc2hhcmVfcGFjay5wbmciPgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICBUaGUgR2FsbGVyeSBhcHAncyBzaGFyZSBhY3Rpb24gcHJvdmlkZXIgd2l0aCBleHRlbmRlZCBzcGlubmVyIGZvciBhZGRpdGlvbmFsIHNoYXJpbmcgb3B0aW9ucy4KLTwvZGl2PgotCi08aDIgaWQ9ImNoZWNrbGlzdCI+QWN0aW9uIEJhciBDaGVja2xpc3Q8L2gyPgotCi08cD5XaGVuIHBsYW5uaW5nIHlvdXIgc3BsaXQgYWN0aW9uIGJhcnMsIGFzayB5b3Vyc2VsZiBxdWVzdGlvbnMgbGlrZSB0aGVzZTo8L3A+Ci08aDQ+SG93IGltcG9ydGFudCBpcyB2aWV3IG5hdmlnYXRpb24gdG8gdGhlIHRhc2s/PC9oND4KLTxwPklmIHZpZXcgbmF2aWdhdGlvbiBpcyB2ZXJ5IGltcG9ydGFudCB0byB5b3VyIGFwcCwgdXNlIHRhYnMgKGZvciBmYXN0ZXN0IHZpZXctc3dpdGNoaW5nKSBvciBzcGlubmVycy48L3A+Ci08aDQ+V2hpY2ggb2YgdGhlIGFwcCdzIGFjdGlvbnMgbmVlZCB0byBiZSBjb25zaXN0ZW50bHkgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIGFjdGlvbiBiYXIsIGFuZCB3aGljaCBjYW4gYmUgbW92ZWQgdG8gdGhlIGFjdGlvbiBvdmVyZmxvdz88L2g0PgotPHA+VXNlIHRoZSA8YWNyb255bSB0aXRsZT0iRnJlcXVlbnQsIEltcG9ydGFudCBvciBUeXBpY2FsIj5GSVQ8L2Fjcm9ueW0+IHNjaGVtZSB0byBkZWNpZGUgaWYgYWN0aW9ucwotYXJlIGRpc3BsYXllZCBhdCB0aGUgdG9wLWxldmVsIG9yIGNhbiBiZSBtb3ZlZCB0byB0aGUgYWN0aW9uIG92ZXJmbG93LiBJZiB0aGUgbnVtYmVyIG9mIHRvcC1sZXZlbAotYWN0aW9ucyBleGNlZWRzIHRoZSBjYXBhY2l0eSBvZiB0aGUgbWFpbiBhY3Rpb24gYmFyLCBkaXNwbGF5IHRoZW0gc2VwYXJhdGVseSBpbiBhIGJvdHRvbSBhY3Rpb24gYmFyLjwvcD4KLTxoND5XaGF0IGVsc2UgaXMgaW1wb3J0YW50IGVub3VnaCB0byB3YXJyYW50IGNvbnRpbnVvdXMgZGlzcGxheT88L2g0PgotPHA+U29tZXRpbWVzIGl0IGlzIGltcG9ydGFudCB0byBkaXNwbGF5IGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZm9yIHlvdXIgYXBwIHRoYXQncyBhbHdheXMgdmlzaWJsZS4KLUV4YW1wbGVzIGFyZSB0aGUgbnVtYmVyIG9mIHVucmVhZCBtZXNzYWdlcyBpbiBhIG1lc3NhZ2luZyBpbmJveCB2aWV3IG9yIHRoZSBOb3cgUGxheWluZyBpbmZvcm1hdGlvbgotaW4gYSBtdXNpYyBwbGF5ZXIuIENhcmVmdWxseSBwbGFuIHdoaWNoIGltcG9ydGFudCBpbmZvcm1hdGlvbiB5b3Ugd291bGQgbGlrZSB0byBkaXNwbGF5IGFuZAotc3RydWN0dXJlIHlvdXIgYWN0aW9uIGJhcnMgYWNjb3JkaW5nbHkuPC9wPgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvYWN0aW9uYmFyLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9hY3Rpb25iYXIuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzZjQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvYWN0aW9uYmFyLmpkCkBAIC0wLDAgKzEsMzU0IEBACitwYWdlLnRpdGxlPUFjdGlvbiBCYXIKK0BqZDpib2R5CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl9vdmVydmlldy5wbmciPgorCis8cD5UaGUgPGVtPmFjdGlvbiBiYXI8L2VtPiBpcyBhcmd1YWJseSB0aGUgbW9zdCBpbXBvcnRhbnQgc3RydWN0dXJhbCBlbGVtZW50IG9mIGFuIEFuZHJvaWQgYXBwLiBJdCdzIGEKK2RlZGljYXRlZCBwaWVjZSBvZiByZWFsIGVzdGF0ZSBhdCB0aGUgdG9wIG9mIGVhY2ggc2NyZWVuIHRoYXQgaXMgZ2VuZXJhbGx5IHBlcnNpc3RlbnQgdGhyb3VnaG91dCB0aGUKK2FwcC48L3A+Cis8cD48c3Ryb25nPlRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIGFjdGlvbiBiYXIgaXMgdG88L3N0cm9uZz46PC9wPgorPHVsPgorPGxpPk1ha2UgaW1wb3J0YW50IGFjdGlvbnMgKHN1Y2ggYXMgPGVtPk5ldzwvZW0+IG9yIDxlbT5TZWFyY2g8L2VtPiwgZXRjKSBwcm9taW5lbnQgYW5kIGFjY2Vzc2libGUgaW4gYSBwcmVkaWN0YWJsZQorICAgd2F5LjwvbGk+Cis8bGk+U3VwcG9ydCBjb25zaXN0ZW50IG5hdmlnYXRpb24gYW5kIHZpZXcgc3dpdGNoaW5nIHdpdGhpbiBhcHBzLjwvbGk+Cis8bGk+UmVkdWNlIGNsdXR0ZXIgYnkgcHJvdmlkaW5nIGFuIGFjdGlvbiBvdmVyZmxvdyBmb3IgcmFyZWx5IHVzZWQgYWN0aW9ucy48L2xpPgorPGxpPlByb3ZpZGUgYSBkZWRpY2F0ZWQgc3BhY2UgZm9yIGdpdmluZyB5b3VyIGFwcCBhbiBpZGVudGl0eS48L2xpPgorPC91bD4KKzxwPklmIHlvdSdyZSBuZXcgdG8gd3JpdGluZyBBbmRyb2lkIGFwcHMsIG5vdGUgdGhhdCB0aGUgYWN0aW9uIGJhciBpcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGRlc2lnbgorZWxlbWVudHMgeW91IGNhbiBpbXBsZW1lbnQuIEZvbGxvd2luZyB0aGUgZ3VpZGVsaW5lcyBkZXNjcmliZWQgaGVyZSB3aWxsIGdvIGEgbG9uZyB3YXkgdG93YXJkIG1ha2luZworeW91ciBhcHAncyBpbnRlcmZhY2UgY29uc2lzdGVudCB3aXRoIHRoZSBjb3JlIEFuZHJvaWQgYXBwcy48L3A+Cis8aDIgaWQ9Im9yZ2FuaXphdGlvbiI+R2VuZXJhbCBPcmdhbml6YXRpb248L2gyPgorCis8cD5UaGUgYWN0aW9uIGJhciBpcyBzcGxpdCBpbnRvIGZvdXIgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXJlYXMgdGhhdCBhcHBseSB0byBtb3N0IGFwcHMuPC9wPgorPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9iYXNpY3MucG5nIj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyB3aXRoLWNhbGxvdXRzIj4KKworICAgIDxvbD4KKyAgICAgIDxsaSBjbGFzcz0idmFsdWUtMSI+PGg0PkFwcCBpY29uPC9oND4KKyAgICAgICAgPHA+CisKK1RoZSBhcHAgaWNvbiBlc3RhYmxpc2hlcyB5b3VyIGFwcCdzIGlkZW50aXR5LiBJdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIGRpZmZlcmVudCBsb2dvIG9yIGJyYW5kaW5nCitpZiB5b3Ugd2lzaC4KK0ltcG9ydGFudDogSWYgdGhlIGFwcCBpcyBjdXJyZW50bHkgbm90IGRpc3BsYXlpbmcgdGhlIHRvcC1sZXZlbCBzY3JlZW4sIGJlIHN1cmUgdG8gZGlzcGxheSB0aGUgVXAKK2NhcmV0IHRvIHRoZSBsZWZ0IG9mIHRoZSBhcHAgaWNvbiwgc28gdGhlIHVzZXIgY2FuIG5hdmlnYXRlIHVwIHRoZSBoaWVyYXJjaHkuIEZvciBtb3JlIGRpc2N1c3Npb24gb2YKK1VwIG5hdmlnYXRpb24sIHNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+IHBhdHRlcm4uCisKKzxkaXYgY2xhc3M9ImZpZ3VyZSI+CisgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl91cF9hcHBfaWNvbi5wbmciPgorICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgICAgQXBwIGljb24gd2l0aCBhbmQgd2l0aG91dCAidXAiIGFmZm9yZGFuY2UuCisgIDwvZGl2PgorPC9kaXY+CisKKyAgICAgICAgPC9wPgorICAgICAgPC9saT4KKyAgICA8L29sPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IHdpdGgtY2FsbG91dHMiPgorCisgICAgPG9sPgorICAgICAgPGxpIGNsYXNzPSJ2YWx1ZS0yIj48aDQ+VmlldyBjb250cm9sPC9oND4KKyAgICAgICAgPHA+CisKK0lmIHlvdXIgYXBwIGRpc3BsYXlzIGRhdGEgaW4gZGlmZmVyZW50IHZpZXdzLCB0aGlzIHNlZ21lbnQgb2YgdGhlIGFjdGlvbiBiYXIgYWxsb3dzIHVzZXJzIHRvIHN3aXRjaAordmlld3MuIEV4YW1wbGVzIG9mIHZpZXctc3dpdGNoaW5nIGNvbnRyb2xzIGFyZSBkcm9wLWRvd24gbWVudXMgb3IgdGFiIGNvbnRyb2xzLiAKKworICAgICAgICA8L3A+CisgICAgICAgIDxwPgorCitJZiB5b3VyIGFwcCBkb2Vzbid0IHN1cHBvcnQgZGlmZmVyZW50IHZpZXdzLCB5b3UgY2FuIGFsc28gdXNlIHRoaXMgc3BhY2UgdG8gZGlzcGxheSBub24taW50ZXJhY3RpdmUKK2NvbnRlbnQsIHN1Y2ggYXMgYW4gYXBwIHRpdGxlIG9yIGxvbmdlciBicmFuZGluZyBpbmZvcm1hdGlvbi4KKworICAgICAgICA8L3A+CisgICAgICA8L2xpPgorICAgICAgPGxpIGNsYXNzPSJ2YWx1ZS0zIj48aDQ+QWN0aW9uIGJ1dHRvbnM8L2g0PgorICAgICAgICA8cD4KKworU2hvdyB0aGUgbW9zdCBpbXBvcnRhbnQgYWN0aW9ucyBvZiB5b3VyIGFwcCBpbiB0aGUgYWN0aW9ucyBzZWN0aW9uLiBBY3Rpb25zIHRoYXQgZG9uJ3QgZml0IGluIHRoZQorYWN0aW9uIGJhciBhcmUgbW92ZWQgYXV0b21hdGljYWxseSB0byB0aGUgYWN0aW9uIG92ZXJmbG93LgorCisgICAgICAgIDwvcD4KKyAgICAgIDwvbGk+CisgICAgICA8bGkgY2xhc3M9InZhbHVlLTQiPjxoND5BY3Rpb24gb3ZlcmZsb3c8L2g0PgorICAgICAgICA8cD4KKworTW92ZSBsZXNzIG9mdGVuIHVzZWQgYWN0aW9ucyB0byB0aGUgYWN0aW9uIG92ZXJmbG93LgorCisgICAgICAgIDwvcD4KKyAgICAgIDwvbGk+CisgICAgPC9vbD4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGgyIGlkPSJhZGFwdGluZy1yb3RhdGlvbiI+QWRhcHRpbmcgdG8gUm90YXRpb24gYW5kIERpZmZlcmVudCBTY3JlZW4gU2l6ZXM8L2gyPgorCis8cD5PbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IFVJIGlzc3VlcyB0byBjb25zaWRlciB3aGVuIGNyZWF0aW5nIGFuIGFwcCBpcyBob3cgdG8gYWRqdXN0IHRvIHNjcmVlbgorcm90YXRpb24gb24gZGlmZmVyZW50IHNjcmVlbiBzaXplcy48L3A+Cis8cD5Zb3UgY2FuIGFkYXB0IHRvIHN1Y2ggY2hhbmdlcyBieSB1c2luZyA8ZW0+c3BsaXQgYWN0aW9uIGJhcnM8L2VtPiwgd2hpY2ggYWxsb3cgeW91IHRvIGRpc3RyaWJ1dGUgYWN0aW9uIGJhcgorY29udGVudCBhY3Jvc3MgbXVsdGlwbGUgYmFycyBsb2NhdGVkIGJlbG93IHRoZSBtYWluIGFjdGlvbiBiYXIgb3IgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX3JvdGF0aW9uLnBuZyI+Cis8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgIFNwbGl0IGFjdGlvbiBiYXIgc2hvd2luZyBhY3Rpb24gYnV0dG9ucyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4gaW4gdmVydGljYWwgb3JpZW50YXRpb24uCis8L2Rpdj4KKworPGgyIGlkPSJjb25zaWRlcmF0aW9ucy1zcGxpdC1hY3Rpb24tYmFycyI+TGF5b3V0IENvbnNpZGVyYXRpb25zIGZvciBTcGxpdCBBY3Rpb24gQmFyczwvaDI+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTggd2l0aC1jYWxsb3V0cyI+CisKKzxwPldoZW4gc3BsaXR0aW5nIHVwIGNvbnRlbnQgYWNyb3NzIG11bHRpcGxlIGFjdGlvbiBiYXJzLCB5b3UgZ2VuZXJhbGx5IGhhdmUgdGhyZWUgcG9zc2libGUgbG9jYXRpb25zCitmb3IgYWN0aW9uIGJhciBjb250ZW50OjwvcD4KKzxvbD4KKzxsaT48c3Ryb25nPk1haW4gYWN0aW9uIGJhcjwvc3Ryb25nPjwvbGk+Cis8bGk+PHN0cm9uZz5Ub3AgYmFyPC9zdHJvbmc+PC9saT4KKzxsaT48c3Ryb25nPkJvdHRvbSBiYXI8L3N0cm9uZz48L2xpPgorPC9vbD4KKzxwPklmIHRoZSB1c2VyIGNhbiBuYXZpZ2F0ZSB1cCB0aGUgaGllcmFyY2h5IGZyb20gYSBnaXZlbiBzY3JlZW4sIHRoZSBtYWluIGFjdGlvbiBiYXIgY29udGFpbnMgdGhlIHVwCitjYXJldCwgYXQgYSBtaW5pbXVtLjwvcD4KKzxwPlRvIGFsbG93IHRoZSB1c2VyIHRvIHF1aWNrbHkgc3dpdGNoIGJldHdlZW4gdGhlIHZpZXdzIHlvdXIgYXBwIHByb3ZpZGVzLCB1c2UgdGFicyBvciBhIHNwaW5uZXIgaW4KK3RoZSB0b3AgYmFyLjwvcD4KKzxwPlRvIGRpc3BsYXkgYWN0aW9ucyBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhlIGFjdGlvbiBvdmVyZmxvdywgdXNlIHRoZSBib3R0b20gYmFyLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tMyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fY29uc2lkZXJhdGlvbnMucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImNvbnRleHR1YWwiPkNvbnRleHR1YWwgQWN0aW9uIEJhcnM8L2gyPgorCis8cD5BIDxlbT5jb250ZXh0dWFsIGFjdGlvbiBiYXIgKENBQik8L2VtPiBpcyBhIHRlbXBvcmFyeSBhY3Rpb24gYmFyIHRoYXQgb3ZlcmxheXMgdGhlIGFwcCdzIGFjdGlvbiBiYXIgZm9yIHRoZQorZHVyYXRpb24gb2YgYSBwYXJ0aWN1bGFyIHN1Yi10YXNrLiBDQUJzIGFyZSBtb3N0IHR5cGljYWxseSB1c2VkIGZvciB0YXNrcyB0aGF0IGludm9sdmUgYWN0aW5nIG9uCitzZWxlY3RlZCBkYXRhIG9yIHRleHQuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX2NhYi5wbmciPgorPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICBDb250ZXh0dWFsIGFjdGlvbiBiYXIgc2hvd24gaW4gQnJvd3NlciBhbmQgR21haWwKKzwvZGl2PgorCis8cD5UaGUgc2VsZWN0aW9uIENBQiBhcHBlYXJzIGFmdGVyIGEgbG9uZyBwcmVzcyBvbiBhIHNlbGVjdGFibGUgZGF0YSBpdGVtIHRyaWdnZXJzIHNlbGVjdGlvbiBtb2RlLjwvcD4KKzxwPjxzdHJvbmc+RnJvbSBoZXJlIHRoZSB1c2VyIGNhbjwvc3Ryb25nPjo8L3A+Cis8dWw+Cis8bGk+U2VsZWN0IGFkZGl0aW9uYWwgZWxlbWVudHMgYnkgdG91Y2hpbmcgdGhlbS48L2xpPgorPGxpPlRyaWdnZXIgYW4gYWN0aW9uIGZyb20gdGhlIENBQiB0aGF0IGFwcGxpZXMgdG8gYWxsIHNlbGVjdGVkIGRhdGEgaXRlbXMuIFRoZSBDQUIgdGhlbgorICAgYXV0b21hdGljYWxseSBkaXNtaXNzZXMgaXRzZWxmLjwvbGk+Cis8bGk+RGlzbWlzcyB0aGUgQ0FCIHZpYSB0aGUgbmF2aWdhdGlvbiBiYXIncyBCYWNrIGJ1dHRvbiBvciB0aGUgQ0FCJ3MgY2hlY2ttYXJrIGJ1dHRvbi4gVGhpcyByZW1vdmVzCisgICB0aGUgQ0FCIGFsb25nIHdpdGggYWxsIHNlbGVjdGlvbiBoaWdobGlnaHRzLjwvbGk+Cis8L3VsPgorPHA+VXNlIENBQnMgd2hlbmV2ZXIgeW91IGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCBkYXRhIHZpYSBsb25nIHByZXNzLiBZb3UgY2FuIGNvbnRyb2wgdGhlIGFjdGlvbgorY29udGVudCBvZiBhIENBQiBpbiBvcmRlciB0byBpbnNlcnQgdGhlIGFjdGlvbnMgeW91IHdvdWxkIGxpa2UgdGhlIHVzZXIgdG8gYmUgYWJsZSB0byBwZXJmb3JtLjwvcD4KKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgIlNlbGVjdGlvbiIgcGF0dGVybi48L3A+Cis8aDIgaWQ9ImVsZW1lbnRzIj5BY3Rpb24gQmFyIEVsZW1lbnRzPC9oMj4KKworPGg0PlRhYnM8L2g0PgorPHA+PGVtPlRhYnM8L2VtPiBkaXNwbGF5IGFwcCB2aWV3cyBjb25jdXJyZW50bHkgYW5kIG1ha2UgaXQgZWFzeSB0byBleHBsb3JlIGFuZCBzd2l0Y2ggYmV0d2VlbiB0aGVtLiBVc2UgdGFicworaWYgeW91IGV4cGVjdCB5b3VyIHVzZXJzIHRvIHN3aXRjaCB2aWV3cyBmcmVxdWVudGx5LjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGFic195b3V0dWJlLnBuZyI+CisKKzxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgdGFiczogZml4ZWQgYW5kIHNjcm9sbGFibGUuPC9wPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPGg0PlNjcm9sbGFibGUgdGFiczwvaDQ+Cis8cD48ZW0+U2Nyb2xsYWJsZSB0YWJzPC9lbT4gYWx3YXlzIHRha2UgdXAgdGhlIGVudGlyZSB3aWR0aCBvZiB0aGUgYmFyLCB3aXRoIHRoZSBjdXJyZW50bHkgYWN0aXZlIHZpZXcgaXRlbSBpbgordGhlIGNlbnRlciwgYW5kIHRoZXJlZm9yZSBuZWVkIHRvIGxpdmUgaW4gYSBkZWRpY2F0ZWQgYmFyLiBTY3JvbGxhYmxlIHRhYnMgY2FuIHRoZW1zZWx2ZXMgYmUKK3Njcm9sbGVkIGhvcml6b250YWxseSB0byBicmluZyBtb3JlIHRhYnMgaW50byB2aWV3LjwvcD4KKzxwPlVzZSBzY3JvbGxhYmxlIHRhYnMgaWYgeW91IGhhdmUgYSBsYXJnZSBudW1iZXIgb2Ygdmlld3Mgb3IgaWYgeW91J3JlIHVuc3VyZSBob3cgbWFueSB2aWV3cyB3aWxsIGJlCitkaXNwbGF5ZWQgYmVjYXVzZSB5b3VyIGFwcCBpbnNlcnRzIHZpZXdzIGR5bmFtaWNhbGx5IChmb3IgZXhhbXBsZSwgb3BlbiBjaGF0cyBpbiBhIG1lc3NhZ2luZyBhcHAKK3RoYXQgdGhlIHVzZXIgY2FuIG5hdmlnYXRlIGJldHdlZW4pLiBTY3JvbGxhYmxlIHRhYnMgc2hvdWxkIGFsd2F5cyBhbGxvdyB0aGUgdXNlciB0byBuYXZpZ2F0ZQorYmV0d2VlbiB0aGUgdmlld3MgYnkgc3dpcGluZyBsZWZ0IG9yIHJpZ2h0IG9uIHRoZSBjb250ZW50IGFyZWEgYXMgd2VsbCBhcyBzd2lwaW5nIHRoZSB0YWJzCit0aGVtc2VsdmVzLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8dmlkZW8gd2lkdGg9IjQwMCIgY2xhc3M9IndpdGgtc2hhZG93IHBsYXktb24taG92ZXIiIGF1dG9wbGF5PgorICAgICAgPHNvdXJjZSBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGFic19zY3JvbGx5Lm1wNCIgdHlwZT0idmlkZW8vbXA0Ij4KKyAgICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RhYnNfc2Nyb2xseS53ZWJtIiB0eXBlPSJ2aWRlby93ZWJtIj4KKyAgICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RhYnNfc2Nyb2xseS5vZ3YiIHR5cGU9InZpZGVvL29nZyI+CisgICAgPC92aWRlbz4KKyAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgICAgICBTY3JvbGxpbmcgdGFicyBpbiBHb29nbGUgUGxheS4KKyAgICAgIDxkaXYgY2xhc3M9InZpZGVvLWluc3RydWN0aW9ucyI+Jm5ic3A7PC9kaXY+CisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5GaXhlZCB0YWJzPC9oND4KKzxwPjxlbT5GaXhlZCB0YWJzPC9lbT4gYXJlIGFsd2F5cyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4sIGFuZCBjYW4ndCBiZSBtb3ZlZCBvdXQgb2YgdGhlIHdheSBsaWtlIHNjcm9sbGFibGUKK3RhYnMuIEZpeGVkIHRhYnMgaW4gdGhlIG1haW4gYWN0aW9uIGJhciBjYW4gbW92ZSB0byB0aGUgdG9wIGJhciB3aGVuIHRoZSBzY3JlZW4gb3JpZW50YXRpb24gY2hhbmdlcy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX2RlZmF1bHRfdGFicy5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIERlZmF1bHQgZml4ZWQgdGFicyBzaG93biBpbiBIb2xvIERhcmsgJmFtcDsgTGlnaHQuCisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5TcGlubmVyczwvaDQ+Cis8cD5BIDxlbT5zcGlubmVyPC9lbT4gaXMgYSBkcm9wLWRvd24gbWVudSB0aGF0IGFsbG93cyB1c2VycyB0byBzd2l0Y2ggYmV0d2VlbiB2aWV3cyBvZiB5b3VyIGFwcC4gPC9wPgorPHA+PHN0cm9uZz5Vc2Ugc3Bpbm5lcnMgcmF0aGVyIHRoYW4gdGFicyBpbiB0aGUgbWFpbiBhY3Rpb24gYmFyIGlmPC9zdHJvbmc+OjwvcD4KKzx1bD4KKzxsaT5Zb3UgZG9uJ3Qgd2FudCB0byBnaXZlIHVwIHRoZSB2ZXJ0aWNhbCBzY3JlZW4gcmVhbCBlc3RhdGUgZm9yIGEgZGVkaWNhdGVkIHRhYiBiYXIuPC9saT4KKzxsaT5Zb3UgZXhwZWN0IHlvdXIgYXBwJ3MgdXNlcnMgdG8gc3dpdGNoIHZpZXdzIGluZnJlcXVlbnRseS48L2xpPgorPC91bD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hY3Rpb25fYmFyX3BhdHRlcm5fc3Bpbm5lci5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEFjdGlvbiBiYXIgc3Bpbm5lciBmcm9tIENhbGVuZGFyIGFwcGxpY2F0aW9uLgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxoND5BY3Rpb24gYnV0dG9uczwvaDQ+Cis8cD48ZW0+QWN0aW9uIGJ1dHRvbnM8L2VtPiBvbiB0aGUgYWN0aW9uIGJhciBzdXJmYWNlIHlvdXIgYXBwJ3MgbW9zdCBpbXBvcnRhbnQgYWN0aXZpdGllcy4gVGhpbmsgYWJvdXQgd2hpY2gKK2J1dHRvbnMgd2lsbCBnZXQgdXNlZCBtb3N0IG9mdGVuLCBhbmQgb3JkZXIgdGhlbSBhY2NvcmRpbmdseS4gRGVwZW5kaW5nIG9uIGF2YWlsYWJsZSBzY3JlZW4gcmVhbAorZXN0YXRlLCB0aGUgc3lzdGVtIHNob3dzIHlvdXIgbW9zdCBpbXBvcnRhbnQgYWN0aW9ucyBhcyBhY3Rpb24gYnV0dG9ucyBhbmQgbW92ZXMgdGhlIHJlc3QgdG8gdGhlCithY3Rpb24gb3ZlcmZsb3cuIFRoZSBhY3Rpb24gYmFyIGFuZCB0aGUgYWN0aW9uIG92ZXJmbG93IHNob3VsZCBvbmx5IHByZXNlbnQgYWN0aW9ucyB0byB0aGUgdXNlciB0aGF0CithcmUgYXZhaWxhYmxlLiBJZiBhbiBhY3Rpb24gaXMgdW5hdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgY29udGV4dCwgaGlkZSBpdC4gRG8gbm90IHNob3cgaXQgYXMKK2Rpc2FibGVkLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX2FjdGlvbl9pY29ucy5wbmciPgorPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICBBIHNhbXBsaW5nIG9mIGFjdGlvbiBidXR0b25zIHVzZWQgdGhyb3VnaG91dCB0aGUgR21haWwgYXBwbGljYXRpb24uCis8L2Rpdj4KKworPHA+Rm9yIGd1aWRhbmNlIG9uIHByaW9yaXRpemluZyBhY3Rpb25zLCB1c2UgdGhlIEZJVCBzY2hlbWUuPC9wPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPHA+PHN0cm9uZz5GICZtZGFzaDsgRnJlcXVlbnQ8L3N0cm9uZz48L3A+Cis8dWw+Cis8bGk+V2lsbCBwZW9wbGUgdXNlIHRoaXMgYWN0aW9uIGF0IGxlYXN0IDcgb3V0IG9mIDEwIHRpbWVzIHRoZXkgdmlzaXQgdGhlIHNjcmVlbj88L2xpPgorPGxpPldpbGwgdGhleSB0eXBpY2FsbHkgdXNlIGl0IHNldmVyYWwgdGltZXMgaW4gYSByb3c/PC9saT4KKzxsaT5Xb3VsZCB0YWtpbmcgYW4gZXh0cmEgc3RlcCBldmVyeSB0aW1lIHRydWx5IGJlIGJ1cmRlbnNvbWU/PC9saT4KKzwvdWw+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCis8cD48c3Ryb25nPkkgJm1kYXNoOyBJbXBvcnRhbnQ8L3N0cm9uZz48L3A+Cis8dWw+Cis8bGk+RG8geW91IHdhbnQgZXZlcnlvbmUgdG8gZGlzY292ZXIgdGhpcyBhY3Rpb24gYmVjYXVzZSBpdCdzIGVzcGVjaWFsbHkgY29vbCBvciBhIHNlbGxpbmcgcG9pbnQ/PC9saT4KKzxsaT5JcyBpdCBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBlZmZvcnRsZXNzIGluIHRoZSByYXJlIGNhc2VzIGl0J3MgbmVlZGVkPzwvbGk+Cis8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPHA+PHN0cm9uZz5UICZtZGFzaDsgVHlwaWNhbDwvc3Ryb25nPjwvcD4KKzx1bD4KKzxsaT5JcyBpdCB0eXBpY2FsbHkgcHJlc2VudGVkIGFzIGEgZmlyc3QtY2xhc3MgYWN0aW9uIGluIHNpbWlsYXIgYXBwcz88L2xpPgorPGxpPkdpdmVuIHRoZSBjb250ZXh0LCB3b3VsZCBwZW9wbGUgYmUgc3VycHJpc2VkIGlmIGl0IHdlcmUgYnVyaWVkIGluIHRoZSBhY3Rpb24gb3ZlcmZsb3c/PC9saT4KKzwvdWw+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPHA+SWYgZWl0aGVyIEYsIEksIG9yIFQgYXBwbHksIHRoZW4gaXQncyBhcHByb3ByaWF0ZSBmb3IgdGhlIGFjdGlvbiBiYXIuIE90aGVyd2lzZSwgaXQgYmVsb25ncyBpbiB0aGUKK2FjdGlvbiBvdmVyZmxvdy48L3A+CisKKzxwPgorCitQcmUtZGVmaW5lZCBnbHlwaHMgc2hvdWxkIGJlIHVzZWQgZm9yIGNlcnRhaW4gY29tbW9uIGFjdGlvbnMgc3VjaCBhcyAicmVmcmVzaCIgYW5kICJzaGFyZS4iIFRoZQorZG93bmxvYWQgbGluayBiZWxvdyBwcm92aWRlcyBhIHBhY2thZ2Ugd2l0aCBpY29ucyB0aGF0IGFyZSBzY2FsZWQgZm9yIHZhcmlvdXMgc2NyZWVuIGRlbnNpdGllcyBhbmQKK2FyZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhlIEhvbG8gTGlnaHQgYW5kIEhvbG8gRGFyayB0aGVtZXMuIFRoZSBwYWNrYWdlIGFsc28gaW5jbHVkZXMgdW5zdHlsZWQKK2ljb25zIHRoYXQgeW91IGNhbiBtb2RpZnkgdG8gbWF0Y2ggeW91ciB0aGVtZSwgaW4gYWRkaXRpb24gdG8gQWRvYmUmcmVnOyBJbGx1c3RyYXRvciZyZWc7IHNvdXJjZQorZmlsZXMgZm9yIGZ1cnRoZXIgY3VzdG9taXphdGlvbi4KKworPC9wPgorPHA+CisKKzxhIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fSWNvbnNfMjAxMjAyMjkuemlwIj5Eb3dubG9hZCB0aGUgQWN0aW9uIEJhciBJY29uIFBhY2s8L2E+CisKKzwvcD4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5BY3Rpb24gb3ZlcmZsb3c8L2g0PgorPHA+VGhlIGFjdGlvbiBvdmVyZmxvdyBpbiB0aGUgYWN0aW9uIGJhciBwcm92aWRlcyBhY2Nlc3MgdG8geW91ciBhcHAncyBsZXNzIGZyZXF1ZW50bHkgdXNlZCBhY3Rpb25zLgorVGhlIG92ZXJmbG93IGljb24gb25seSBhcHBlYXJzIG9uIHBob25lcyB0aGF0IGhhdmUgbm8gbWVudSBoYXJkd2FyZSBrZXlzLiBQaG9uZXMgd2l0aCBtZW51IGtleXMKK2Rpc3BsYXkgdGhlIGFjdGlvbiBvdmVyZmxvdyB3aGVuIHRoZSB1c2VyIHByZXNzZXMgdGhlIGtleS48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX292ZXJmbG93LnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgQWN0aW9uIG92ZXJmbG93IGlzIHBpbm5lZCB0byB0aGUgcmlnaHQgc2lkZS4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8cD5Ib3cgbWFueSBhY3Rpb25zIHdpbGwgZml0IGluIHRoZSBtYWluIGFjdGlvbiBiYXI/IEFjdGlvbiBiYXIgY2FwYWNpdHkgaXMgY29udHJvbGxlZCBieSB0aGUgZm9sbG93aW5nCitydWxlczo8L3A+Cis8dWw+Cis8bGk+QWN0aW9uIGJ1dHRvbnMgaW4gdGhlIG1haW4gYWN0aW9uIGJhciBtYXkgbm90IG9jY3VweSBtb3JlIHRoYW4gNTAlIG9mIHRoZSBiYXIncyB3aWR0aC4gQWN0aW9uCisgIGJ1dHRvbnMgb24gYm90dG9tIGFjdGlvbiBiYXJzIGNhbiB1c2UgdGhlIGVudGlyZSB3aWR0aC48L2xpPgorPGxpPlRoZSBzY3JlZW4gd2lkdGggaW4gZGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbHMKKyAgKDxhY3JvbnltIHRpdGxlPSJEZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscy4gT25lIGRwIGlzIG9uZSBwaXhlbCBvbiBhIDE2MCBkcGkgc2NyZWVuLiI+ZHA8L2Fjcm9ueW0+KQorICBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgZml0IGluIHRoZSBtYWluIGFjdGlvbiBiYXI6PHVsPgorPGxpPnNtYWxsZXIgdGhhbiAzNjAgZHAgPSAyIGljb25zPC9saT4KKzxsaT4zNjAtNDk5IGRwID0gMyBpY29uczwvbGk+Cis8bGk+NTAwLTU5OSBkcCA9IDQgaWNvbnM8L2xpPgorPGxpPjYwMCBkcCBhbmQgbGFyZ2VyID0gNSBpY29uczwvbGk+Cis8L3VsPgorPC9saT4KKzwvdWw+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2FjdGlvbl9iYXJfcGF0dGVybl90YWJsZS5wbmciPgorPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICBJbiB0aGUgYWJvdmUgdGFibGUgIm8iIGRlbm90ZXMgYW4gYWN0aW9uIGJhciBpdGVtIGFuZCAiPSIgYW4gb3ZlcmZsb3cgaWNvbi4KKzwvZGl2PgorCis8aDQ+U2hhcmluZyBkYXRhPC9oND4KKzxwPldoZW5ldmVyIHlvdXIgYXBwIHBlcm1pdHMgc2hhcmluZyBvZiBkYXRhLCBzdWNoIGFzIGltYWdlcyBvciBtb3ZpZSBjbGlwcywgdXNlIGEgPGVtPnNoYXJlIGFjdGlvbgorcHJvdmlkZXI8L2VtPiBpbiB5b3VyIGFjdGlvbiBiYXIuIFRoZSBzaGFyZSBhY3Rpb24gcHJvdmlkZXIgaXMgZGVzaWduZWQgdG8gc3BlZWQgdXAgc2hhcmluZyBieQorZGlzcGxheWluZyB0aGUgbW9zdCByZWNlbnRseSB1c2VkIHNoYXJpbmcgc2VydmljZSBuZXh0IHRvIGEgc3Bpbm5lciBidXR0b24gdGhhdCBjb250YWlucyBvdGhlcgorc2hhcmluZyBvcHRpb25zLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYWN0aW9uX2Jhcl9wYXR0ZXJuX3NoYXJlX3BhY2sucG5nIj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgVGhlIEdhbGxlcnkgYXBwJ3Mgc2hhcmUgYWN0aW9uIHByb3ZpZGVyIHdpdGggZXh0ZW5kZWQgc3Bpbm5lciBmb3IgYWRkaXRpb25hbCBzaGFyaW5nIG9wdGlvbnMuCis8L2Rpdj4KKworPGgyIGlkPSJjaGVja2xpc3QiPkFjdGlvbiBCYXIgQ2hlY2tsaXN0PC9oMj4KKworPHA+V2hlbiBwbGFubmluZyB5b3VyIHNwbGl0IGFjdGlvbiBiYXJzLCBhc2sgeW91cnNlbGYgcXVlc3Rpb25zIGxpa2UgdGhlc2U6PC9wPgorPGg0PkhvdyBpbXBvcnRhbnQgaXMgdmlldyBuYXZpZ2F0aW9uIHRvIHRoZSB0YXNrPzwvaDQ+Cis8cD5JZiB2aWV3IG5hdmlnYXRpb24gaXMgdmVyeSBpbXBvcnRhbnQgdG8geW91ciBhcHAsIHVzZSB0YWJzIChmb3IgZmFzdGVzdCB2aWV3LXN3aXRjaGluZykgb3Igc3Bpbm5lcnMuPC9wPgorPGg0PldoaWNoIG9mIHRoZSBhcHAncyBhY3Rpb25zIG5lZWQgdG8gYmUgY29uc2lzdGVudGx5IGF2YWlsYWJsZSBkaXJlY3RseSBmcm9tIHRoZSBhY3Rpb24gYmFyLCBhbmQgd2hpY2ggY2FuIGJlIG1vdmVkIHRvIHRoZSBhY3Rpb24gb3ZlcmZsb3c/PC9oND4KKzxwPlVzZSB0aGUgPGFjcm9ueW0gdGl0bGU9IkZyZXF1ZW50LCBJbXBvcnRhbnQgb3IgVHlwaWNhbCI+RklUPC9hY3JvbnltPiBzY2hlbWUgdG8gZGVjaWRlIGlmIGFjdGlvbnMKK2FyZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcC1sZXZlbCBvciBjYW4gYmUgbW92ZWQgdG8gdGhlIGFjdGlvbiBvdmVyZmxvdy4gSWYgdGhlIG51bWJlciBvZiB0b3AtbGV2ZWwKK2FjdGlvbnMgZXhjZWVkcyB0aGUgY2FwYWNpdHkgb2YgdGhlIG1haW4gYWN0aW9uIGJhciwgZGlzcGxheSB0aGVtIHNlcGFyYXRlbHkgaW4gYSBib3R0b20gYWN0aW9uIGJhci48L3A+Cis8aDQ+V2hhdCBlbHNlIGlzIGltcG9ydGFudCBlbm91Z2ggdG8gd2FycmFudCBjb250aW51b3VzIGRpc3BsYXk/PC9oND4KKzxwPlNvbWV0aW1lcyBpdCBpcyBpbXBvcnRhbnQgdG8gZGlzcGxheSBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZvciB5b3VyIGFwcCB0aGF0J3MgYWx3YXlzIHZpc2libGUuCitFeGFtcGxlcyBhcmUgdGhlIG51bWJlciBvZiB1bnJlYWQgbWVzc2FnZXMgaW4gYSBtZXNzYWdpbmcgaW5ib3ggdmlldyBvciB0aGUgTm93IFBsYXlpbmcgaW5mb3JtYXRpb24KK2luIGEgbXVzaWMgcGxheWVyLiBDYXJlZnVsbHkgcGxhbiB3aGljaCBpbXBvcnRhbnQgaW5mb3JtYXRpb24geW91IHdvdWxkIGxpa2UgdG8gZGlzcGxheSBhbmQKK3N0cnVjdHVyZSB5b3VyIGFjdGlvbiBiYXJzIGFjY29yZGluZ2x5LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDgyODAuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gQXBwbGljYXRpb24gU3RydWN0dXJlCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkFwcGxpY2F0aW9uIFN0cnVjdHVyZTwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+QXBwcyBjb21lIGluIG1hbnkgdmFyaWV0aWVzIHRoYXQgYWRkcmVzcyB2ZXJ5IGRpZmZlcmVudCBuZWVkcy4gRm9yIGV4YW1wbGU6PC9wPgotPHVsPgotPGxpPkFwcHMgc3VjaCBhcyBDYWxjdWxhdG9yIG9yIENhbWVyYSB0aGF0IGFyZSBidWlsdCBhcm91bmQgYSBzaW5nbGUgZm9jdXNlZCBhY3Rpdml0eSBoYW5kbGVkIGZyb20gYQotICBzaW5nbGUgc2NyZWVuPC9saT4KLTxsaT5BcHBzIHN1Y2ggYXMgUGhvbmUgd2hvc2UgbWFpbiBwdXJwb3NlIGlzIHRvIHN3aXRjaCBiZXR3ZWVuIGRpZmZlcmVudCBhY3Rpdml0aWVzIHdpdGhvdXQgZGVlcGVyCi0gIG5hdmlnYXRpb248L2xpPgotPGxpPkFwcHMgc3VjaCBhcyBHbWFpbCBvciBNYXJrZXQgdGhhdCBjb21iaW5lIGEgYnJvYWQgc2V0IG9mIGRhdGEgdmlld3Mgd2l0aCBkZWVwIG5hdmlnYXRpb248L2xpPgotPC91bD4KLTxwPllvdXIgYXBwJ3Mgc3RydWN0dXJlIGRlcGVuZHMgbGFyZ2VseSBvbiB0aGUgY29udGVudCBhbmQgdGFza3MgeW91IHdhbnQgdG8gc3VyZmFjZSBmb3IgeW91ciB1c2Vycy48L3A+Ci08aDIgaWQ9ImdlbmVyYWwtc3RydWN0dXJlIj5HZW5lcmFsIFN0cnVjdHVyZTwvaDI+Ci0KLTxwPkEgdHlwaWNhbCBBbmRyb2lkIGFwcCBjb25zaXN0cyBvZiB0b3AgbGV2ZWwgYW5kIGRldGFpbC9lZGl0IHZpZXdzLiBJZiB0aGUgbmF2aWdhdGlvbiBoaWVyYXJjaHkgaXMKLWRlZXAgYW5kIGNvbXBsZXgsIGNhdGVnb3J5IHZpZXdzIGNvbm5lY3QgdG9wIGxldmVsIGFuZCBkZXRhaWwgdmlld3MuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX292ZXJ2aWV3LnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08aDQ+VG9wIGxldmVsIHZpZXdzPC9oND4KLTxwPlRoZSB0b3AgbGV2ZWwgb2YgdGhlIGFwcCB0eXBpY2FsbHkgY29uc2lzdHMgb2YgdGhlIGRpZmZlcmVudCB2aWV3cyB0aGF0IHlvdXIgYXBwIHN1cHBvcnRzLiBUaGUgdmlld3MKLWVpdGhlciBzaG93IGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgb2YgdGhlIHNhbWUgZGF0YSBvciBleHBvc2UgYW4gYWx0b2dldGhlciBkaWZmZXJlbnQgZnVuY3Rpb25hbAotZmFjZXQgb2YgeW91ciBhcHAuPC9wPgotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMyI+Jm5ic3A7PC9kaXY+Ci0KLTxoND5DYXRlZ29yeSB2aWV3czwvaDQ+Ci08cD5DYXRlZ29yeSB2aWV3cyBhbGxvdyB5b3UgdG8gZHJpbGwgZGVlcGVyIGludG8geW91ciBkYXRhLjwvcD4KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTExIj4mbmJzcDs8L2Rpdj4KLQotPGg0PkRldGFpbC9lZGl0IHZpZXc8L2g0PgotPHA+VGhlIGRldGFpbC9lZGl0IHZpZXcgaXMgd2hlcmUgeW91IGNvbnN1bWUgb3IgY3JlYXRlIGRhdGEuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxoMiBpZD0idG9wLWxldmVsIj5Ub3AgTGV2ZWw8L2gyPgotCi08cD5UaGUgbGF5b3V0IG9mIHlvdXIgc3RhcnQgc2NyZWVuIHJlcXVpcmVzIHNwZWNpYWwgYXR0ZW50aW9uLiBUaGlzIGlzIHRoZSBmaXJzdCBzY3JlZW4gcGVvcGxlIHNlZQotYWZ0ZXIgbGF1bmNoaW5nIHlvdXIgYXBwLCBzbyBpdCBzaG91bGQgYmUgYW4gZXF1YWxseSByZXdhcmRpbmcgZXhwZXJpZW5jZSBmb3IgbmV3IGFuZCBmcmVxdWVudAotdmlzaXRvcnMgYWxpa2UuPC9wPgotPHA+QXNrIHlvdXJzZWxmOiAiV2hhdCBhcmUgbXkgdHlwaWNhbCB1c2VycyBtb3N0IGxpa2VseSBnb2luZyB0byB3YW50IHRvIGRvIGluIG15IGFwcD8iLCBhbmQgc3RydWN0dXJlCi15b3VyIHN0YXJ0IHNjcmVlbiBleHBlcmllbmNlIGFjY29yZGluZ2x5LjwvcD4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5QdXQgY29udGVudCBmb3J3YXJkPC9oND4KLTxwPk1hbnkgYXBwcyBmb2N1cyBvbiB0aGUgY29udGVudCBkaXNwbGF5LiBBdm9pZCBuYXZpZ2F0aW9uLW9ubHkgc2NyZWVucyBhbmQgaW5zdGVhZCBsZXQgcGVvcGxlIGdldCB0bwotdGhlIG1lYXQgb2YgeW91ciBhcHAgcmlnaHQgYXdheSBieSBtYWtpbmcgY29udGVudCB0aGUgY2VudGVycGllY2Ugb2YgeW91ciBzdGFydCBzY3JlZW4uIENob29zZQotbGF5b3V0cyB0aGF0IGFyZSB2aXN1YWxseSBlbmdhZ2luZyBhbmQgYXBwcm9wcmlhdGUgZm9yIHRoZSBkYXRhIHR5cGUgYW5kIHNjcmVlbiBzaXplLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9tYXJrZXQucG5nIj4KLSAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gICAgICBNYXJrZXQncyBzdGFydCBzY3JlZW4gcHJpbWFyaWx5IGFsbG93cyBuYXZpZ2F0aW9uIGludG8gdGhlIHN0b3JlcyBmb3IgQXBwcywgTXVzaWMsIEJvb2tzLAotICAgICAgTW92aWVzIGFuZCBHYW1lcy4gSXQgaXMgYWxzbyBlbnJpY2hlZCB3aXRoIHRhaWxvcmVkIHJlY29tbWVuZGF0aW9ucyBhbmQgcHJvbW90aW9ucyB0aGF0Ci0gICAgICBzdXJmYWNlIGNvbnRlbnQgb2YgaW50ZXJlc3QgdG8gdGhlIHVzZXIuIFNlYXJjaCBpcyByZWFkaWx5IGF2YWlsYWJsZSBmcm9tIHRoZSBhY3Rpb24gYmFyLgotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+U2V0IHVwIGFjdGlvbiBiYXJzIGZvciBuYXZpZ2F0aW9uIGFuZCBhY3Rpb25zPC9oND4KLTxwPkFsbCBzY3JlZW5zIGluIHlvdXIgYXBwIHNob3VsZCBkaXNwbGF5IGFjdGlvbiBiYXJzIHRvIHByb3ZpZGUgY29uc2lzdGVudCBuYXZpZ2F0aW9uIGFuZCBzdXJmYWNlCi1pbXBvcnRhbnQgYWN0aW9ucy48L3A+Ci08cD5BdCB0aGUgdG9wIGxldmVsLCBzcGVjaWFsIGNvbnNpZGVyYXRpb25zIGFwcGx5IHRvIHRoZSBhY3Rpb24gYmFyOjwvcD4KLTx1bD4KLTxsaT5Vc2UgdGhlIGFjdGlvbiBiYXIgdG8gZGlzcGxheSB5b3VyIGFwcCdzIGljb24gb3IgdGl0bGUuPC9saT4KLTxsaT5JZiB5b3VyIHRvcCBsZXZlbCBjb25zaXN0cyBvZiBtdWx0aXBsZSB2aWV3cywgb3IgaWYgc3dpdGNoaW5nIGJldHdlZW4gZGF0YSBmcm9tIGRpZmZlcmVudCB1c2VyCi0gIGFjY291bnRzIGlzIGEgc2lnbmlmaWNhbnQgdXNlIGNhc2UsIG1ha2Ugc3VyZSB0aGF0IGl0J3MgZWFzeSBmb3IgdGhlIHVzZXIgdG8gbmF2aWdhdGUgYmV0d2VlbiB0aGVtCi0gIGJ5IGFkZGluZyB2aWV3IGNvbnRyb2xzIHRvIHlvdXIgYWN0aW9uIGJhci48L2xpPgotPGxpPklmIHlvdXIgYXBwIGFsbG93cyBwZW9wbGUgdG8gY3JlYXRlIGNvbnRlbnQsIGNvbnNpZGVyIG1ha2luZyB0aGUgY29udGVudCBhY2Nlc3NpYmxlIHJpZ2h0IGZyb20gdGhlCi0gIHRvcCBsZXZlbC48L2xpPgotPGxpPklmIHlvdXIgY29udGVudCBpcyBzZWFyY2hhYmxlLCBpbmNsdWRlIHRoZSBTZWFyY2ggYWN0aW9uIGluIHRoZSBhY3Rpb24gYmFyIHNvIHBlb3BsZSBjYW4gY3V0Ci0gIHRocm91Z2ggdGhlIG5hdmlnYXRpb24gaGllcmFyY2h5LjwvbGk+Ci08L3VsPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX2dtYWlsLnBuZyI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgRW1haWwgaXMgYWJvdXQgcHJvZHVjdGl2aXR5LCBzbyBhbiBlZmZpY2llbnQsIGVhc3ktdG8tc2tpbSBsaXN0IHdpdGggaGlnaGVyIGRhdGEgZGVuc2l0eSB3b3JrcwotICAgICAgd2VsbC4gTmF2aWdhdGlvbiBzdXBwb3J0cyBzd2l0Y2hpbmcgYmV0d2VlbiBhY2NvdW50cyBhbmQgcmVjZW50IGxhYmVscy4gSWNvbnMgZm9yIGNyZWF0aW5nIGEKLSAgICAgIG5ldyBtZXNzYWdlIG9yIHNlYXJjaGluZyBhcmUgcHJvbWluZW50IGluIHRoZSBzcGxpdCBhY3Rpb24gYmFyIGF0IHRoZSBib3R0b20uCi0gICAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5DcmVhdGUgYW4gaWRlbnRpdHkgZm9yIHlvdXIgYXBwPC9oND4KLTxwPkNyZWF0aW5nIGFuIGlkZW50aXR5IGZvciB5b3VyIGFwcCBnb2VzIGJleW9uZCB0aGUgYWN0aW9uIGJhci4gWW91ciBhcHAgY29tbXVuaWNhdGVzIGl0cyBpZGVudGl0eQotdGhyb3VnaCBpdHMgZGF0YSwgdGhlIHdheSB0aGF0IGRhdGEgaXMgYXJyYW5nZWQsIGFuZCBob3cgcGVvcGxlIGludGVyYWN0IHdpdGggaXQuIEVzcGVjaWFsbHkgZm9yCi1tZWRpYS1yaWNoIGFwcGxpY2F0aW9ucywgdHJ5IHRvIGNyZWF0ZSB1bmlxdWUgbGF5b3V0cyB0aGF0IHNob3djYXNlIHlvdXIgZGF0YSBhbmQgZ28gYmV5b25kIHRoZQotbW9ub3Rvbnkgb2Ygc2ltcGxlIGxpc3Qgdmlld3MuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX211c2ljX2xuZHNjcC5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFRoZSAzRCBjYXJvdXNlbCBjZWxlYnJhdGVzIGNvdmVyIGFydCBhbmQgZXN0YWJsaXNoZXMgYSB1bmlxdWUgaWRlbnRpdHkgZm9yIHRoZSBNdXNpYyBhcHAuCi0gICAgICBEZWZhdWx0aW5nIHRvIHRoZSBSZWNlbnQgdmlldyBrZWVwcyB0aGUgZm9jdXMgb24gbXVzaWMgdGhlIHVzZXIgaGFzIGJlZW4gbGlzdGVuaW5nIHRvIGxhdGVseS4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9ImNhdGVnb3JpZXMiPkNhdGVnb3JpZXM8L2gyPgotCi08cD5HZW5lcmFsbHksIHRoZSBwdXJwb3NlIG9mIGEgZGVlcCwgZGF0YS1kcml2ZW4gYXBwIGlzIHRvIG5hdmlnYXRlIHRocm91Z2ggb3JnYW5pemF0aW9uYWwgY2F0ZWdvcmllcwotdG8gdGhlIGRldGFpbCBsZXZlbCwgd2hlcmUgZGF0YSBjYW4gYmUgdmlld2VkIGFuZCBtYW5hZ2VkLiBNaW5pbWl6ZSBwZXJjZWl2ZWQgbmF2aWdhdGlvbiBlZmZvcnQgYnkKLWtlZXBpbmcgeW91ciBhcHBzIHNoYWxsb3cuPC9wPgotPHA+RXZlbiB0aG91Z2ggdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBuYXZpZ2F0aW9uIHN0ZXBzIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZSBkZXRhaWwgdmlld3MgaXMKLXR5cGljYWxseSBkaWN0YXRlZCBieSB0aGUgc3RydWN0dXJlIG9mIHlvdXIgYXBwJ3MgY29udGVudCwgdGhlcmUgYXJlIHNldmVyYWwgd2F5cyB5b3UgY2FuIGN1dCBkb3duCi1vbiB0aGUgcGVyY2VwdGlvbiBvZiBvbmVyb3VzIG5hdmlnYXRpb24uPC9wPgotPGg0PlVzZSB0YWJzIHRvIGNvbWJpbmUgY2F0ZWdvcnkgc2VsZWN0aW9uIGFuZCBkYXRhIGRpc3BsYXk8L2g0PgotPHA+VGhpcyBjYW4gYmUgc3VjY2Vzc2Z1bCBpZiB0aGUgY2F0ZWdvcmllcyBhcmUgZmFtaWxpYXIgb3IgdGhlIG51bWJlciBvZiBjYXRlZ29yaWVzIGlzIHNtYWxsLiBJdCBoYXMKLXRoZSBhZHZhbnRhZ2UgdGhhdCBhIGxldmVsIG9mIGhpZXJhcmNoeSBpcyByZW1vdmVkIGFuZCBkYXRhIHJlbWFpbnMgYXQgdGhlIGNlbnRlciBvZiB0aGUgdXNlcidzCi1hdHRlbnRpb24uIE5hdmlnYXRpbmcgbGF0ZXJhbGx5IGJldHdlZW4gZGF0YS1yaWNoIGNhdGVnb3JpZXMgaXMgbW9yZSBha2luIHRvIGEgY2FzdWFsIGJyb3dzaW5nCi1leHBlcmllbmNlIHRoYW4gdG8gYW4gZXhwbGljaXQgbmF2aWdhdGlvbiBzdGVwLjwvcD4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi08cD5JZiB0aGUgY2F0ZWdvcmllcyBhcmUgZmFtaWxpYXIsIHByZWRpY3RhYmxlLCBvciBjbG9zZWx5IHJlbGF0ZWQsIHVzZSBzY3JvbGxpbmcgdGFicyAod2hlcmUgbm90IGFsbAotaXRlbXMgYXJlIGluIHZpZXcgc2ltdWx0YW5lb3VzbHkpLiBLZWVwIHRoZSBudW1iZXIgb2Ygc2Nyb2xsaW5nIHRhYnMgYXQgYSBtYW5hZ2VhYmxlIGxldmVsIHRvCi1taW5pbWl6ZSBuYXZpZ2F0aW9uYWwgZWZmb3J0LiBSdWxlIG9mIHRodW1iOiBubyBtb3JlIHRoYW4gNSZuZGFzaDs3IHRhYnMuPC9wPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfc2Nyb2xsdGFicy5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIE1hcmtldCB1c2VzIHRhYnMgdG8gc2ltdWx0YW5lb3VzbHkgc2hvdyBjYXRlZ29yeSBjaG9pY2UgYW5kIGNvbnRlbnQuIFRvIG5hdmlnYXRlIGJldHdlZW4KLSAgICAgIGNhdGVnb3JpZXMsIHVzZXJzIGNhbiBzd2lwZSBsZWZ0L3JpZ2h0IG9uIHRoZSBjb250ZW50LgotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotPHA+SWYgdGhlIGNhdGVnb3JpZXMgaW4gdGhlIHRhYnMgYXJlIG5vdCBjbG9zZWx5IHJlbGF0ZWQsIGZhdm9yIGZpeGVkIHRhYnMsIHNvIHRoYXQgYWxsIGNhdGVnb3JpZXMgYXJlCi1pbiB2aWV3IGF0IHRoZSBzYW1lIHRpbWUuPC9wPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfZml4ZWR0YWJzLnBuZyI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgWW91VHViZSB1c2VzIGZpeGVkIHRhYnMgdG8gc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50LCByZWxhdGl2ZWx5IHVucmVsYXRlZCBmdW5jdGlvbmFsIGFyZWFzLgotICAgIDwvZGl2PgotCi0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGg0PkFsbG93IGN1dHRpbmcgdGhyb3VnaCBoaWVyYXJjaGllczwvaDQ+Ci08cD5UYWtlIGFkdmFudGFnZSBvZiBzaG9ydGN1dHMgdGhhdCBhbGxvdyBwZW9wbGUgdG8gcmVhY2ggdGhlaXIgZ29hbHMgcXVpY2tlci4gVG8gYWxsb3cgdG9wLWxldmVsCi1pbnZvY2F0aW9uIG9mIGFjdGlvbnMgZm9yIGEgZGF0YSBpdGVtIGZyb20gd2l0aGluIGxpc3Qgb3IgZ3JpZCB2aWV3cywgZGlzcGxheSBwcm9taW5lbnQgYWN0aW9ucwotZGlyZWN0bHkgb24gbGlzdCB2aWV3IGl0ZW1zIHVzaW5nIGRyb3AtZG93bnMgb3Igc3BsaXQgbGlzdCBpdGVtcy4gVGhpcyBsZXRzIHBlb3BsZSBpbnZva2UgYWN0aW9ucyBvbgotZGF0YSB3aXRob3V0IGhhdmluZyB0byBuYXZpZ2F0ZSBhbGwgdGhlIHdheSBkb3duIHRoZSBoaWVyYXJjaHkuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9zaG9ydGN1dF9vbl9pdGVtLnBuZyI+Ci08ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gIE11c2ljIGFsbG93cyB0aGUgdXNlciB0byBhY3QgdXBvbiBhIGRhdGEgaXRlbSAoc29uZykgZnJvbSB3aXRoaW4gdGhlIGNhdGVnb3J5IHZpZXcgKGFsYnVtKSwKLSAgdGhlcmVieSByZW1vdmluZyB0aGUgbmVlZCB0byBuYXZpZ2F0ZSBhbGwgdGhlIHdheSBkb3duIHRvIHRoZSBzb25nJ3MgZGV0YWlsIHZpZXcuCi08L2Rpdj4KLQotPGg0PkFjdGluZyB1cG9uIG11bHRpcGxlIGRhdGEgaXRlbXM8L2g0PgotPHA+RXZlbiB0aG91Z2ggY2F0ZWdvcnkgdmlld3MgbW9zdGx5IHNlcnZlIHRvIGd1aWRlIHBlb3BsZSB0byBjb250ZW50IGRldGFpbCwga2VlcCBpbiBtaW5kIHRoYXQgdGhlcmUKLWFyZSBvZnRlbiBnb29kIHJlYXNvbnMgdG8gYWN0IG9uIGNvbGxlY3Rpb25zIG9mIGRhdGEgYXMgd2VsbC48L3A+Ci08cD5Gb3IgZXhhbXBsZSwgaWYgeW91IGFsbG93IHBlb3BsZSB0byBkZWxldGUgYW4gaXRlbSBpbiBhIGRldGFpbCB2aWV3LCB5b3Ugc2hvdWxkIGFsc28gYWxsb3cgdGhlbSB0bwotZGVsZXRlIG11bHRpcGxlIGl0ZW1zIGluIHRoZSBjYXRlZ29yeSB2aWV3LiBBbmFseXplIHdoaWNoIGRldGFpbCB2aWV3IGFjdGlvbnMgYXJlIGFwcGxpY2FibGUgdG8KLWNvbGxlY3Rpb25zIG9mIGl0ZW1zLiBUaGVuIHVzZSBtdWx0aS1zZWxlY3QgdG8gYWxsb3cgYXBwbGljYXRpb24gb2YgdGhvc2UgYWN0aW9ucyB0byBtdWx0aXBsZSBpdGVtcwotaW4gYSBjYXRlZ29yeSB2aWV3LjwvcD4KLTxoMiBpZD0iZGV0YWlscyI+RGV0YWlsczwvaDI+Ci0KLTxwPlRoZSBkZXRhaWwgdmlldyBhbGxvd3MgeW91IHRvIHZpZXcgYW5kIGFjdCBvbiB5b3VyIGRhdGEuIFRoZSBsYXlvdXQgb2YgdGhlIGRldGFpbCB2aWV3IGRlcGVuZHMgb24KLXRoZSBkYXRhIHR5cGUgYmVpbmcgZGlzcGxheWVkLCBhbmQgdGhlcmVmb3JlIGRpZmZlcnMgd2lkZWx5IGFtb25nIGFwcHMuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotPGg0PkxheW91dDwvaDQ+Ci08cD5Db25zaWRlciB0aGUgYWN0aXZpdGllcyBwZW9wbGUgd2lsbCBwZXJmb3JtIGluIHRoZSBkZXRhaWwgdmlldyBhbmQgYXJyYW5nZSB0aGUgbGF5b3V0IGFjY29yZGluZ2x5LgotRm9yIGltbWVyc2l2ZSBjb250ZW50LCBtYWtlIHVzZSBvZiB0aGUgbGlnaHRzLW91dCBtb2RlIHRvIGFsbG93IGZvciBkaXN0cmFjdGlvbi1mcmVlIHZpZXdpbmcgb2YKLWZ1bGwtc2NyZWVuIGNvbnRlbnQuPC9wPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2FwcF9zdHJ1Y3R1cmVfcGVvcGxlX2RldGFpbC5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX2Jvb2tfZGV0YWlsX3BhZ2VfZmxpcC5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIEdvb2dsZSBCb29rcycgZGV0YWlsIHZpZXcgaXMgYWxsIGFib3V0IHJlcGxpY2F0aW5nIHRoZSBleHBlcmllbmNlIG9mIHJlYWRpbmcgYW4gYWN0dWFsIGJvb2suCi0gICAgICBUaGUgcGFnZS1mbGlwIGFuaW1hdGlvbiByZWluZm9yY2VzIHRoYXQgbm90aW9uLiBUbyBjcmVhdGUgYW4gaW1tZXJzaXZlIGV4cGVyaWVuY2UgdGhlIGFwcAotICAgICAgZW50ZXJzIGxpZ2h0cy1vdXQgbW9kZSwgd2hpY2ggaGlkZXMgYWxsIHN5c3RlbSBVSSBhZmZvcmRhbmNlcy4KLSAgICA8L2Rpdj4KLQotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBQZW9wbGUgYXBwJ3MgZGV0YWlsIHZpZXcgaXMgdG8gc3VyZmFjZSBjb21tdW5pY2F0aW9uIG9wdGlvbnMuIFRoZSBsaXN0IHZpZXcKLSAgICAgIGFsbG93cyBmb3IgZWZmaWNpZW50IHNjYW5uaW5nIGFuZCBxdWljayBhY2Nlc3Mgb2YgcGhvbmUgbnVtYmVycywgZW1haWwgYWRkcmVzc2VzIGFuZCBvdGhlcgotICAgICAgaW5mb3JtYXRpb24gaXRlbXMuIFNwbGl0IGl0ZW1zIGFyZSB1c2VkIHRvIGNvbWJpbmUgY2FsbGluZyBhbmQgbWVzc2FnaW5nIGludG8gb25lIGNvbXBhY3QgbGluZQotICAgICAgaXRlbS4KLSAgICA8L2Rpdj4KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGg0Pk1ha2UgbmF2aWdhdGlvbiBiZXR3ZWVuIGRldGFpbCB2aWV3cyBlZmZpY2llbnQ8L2g0PgotPHA+SWYgeW91ciB1c2VycyBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gbG9vayBhdCBtdWx0aXBsZSBpdGVtcyBpbiBzZXF1ZW5jZSwgYWxsb3cgdGhlbSB0byBuYXZpZ2F0ZQotYmV0d2VlbiBpdGVtcyBmcm9tIHdpdGhpbiB0aGUgZGV0YWlsIHZpZXcuIFVzZSBzd2lwZSB2aWV3cyBvciBvdGhlciB0ZWNobmlxdWVzLCBzdWNoIGFzIGZpbG1zdHJpcHMsCi10byBhY2hpZXZlIHRoaXMuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvYXBwX3N0cnVjdHVyZV9nbWFpbF9zd2lwZS5wbmciPgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICBHbWFpbCB1c2luZyBzd2lwZSB2aWV3cyB0byBuYXZpZ2F0ZSBmcm9tIGRldGFpbCB2aWV3IHRvIGRldGFpbCB2aWV3LgotPC9kaXY+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9hcHBfc3RydWN0dXJlX2dhbGxlcnlfZmlsbXN0cmlwLnBuZyI+Ci08ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgc3dpcGUgZ2VzdHVyZXMgdG8gbW92ZSBsZWZ0IG9yIHJpZ2h0IHRocm91Z2ggaW1hZ2VzLCBHYWxsZXJ5IHByb3ZpZGVzIGEKLSAgZmlsbXN0cmlwIGNvbnRyb2wgdGhhdCBsZXRzIHBlb3BsZSBxdWlja2x5IGp1bXAgdG8gc3BlY2lmaWMgaW1hZ2VzLgotPC9kaXY+Ci0KLTxoMiBpZD0iY2hlY2tsaXN0Ij5DaGVja2xpc3Q8L2gyPgotCi08dWw+Ci08bGk+Ci08cD5GaW5kIHdheXMgdG8gZGlzcGxheSB1c2VmdWwgY29udGVudCBvbiB5b3VyIHN0YXJ0IHNjcmVlbi48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIGFjdGlvbiBiYXJzIHRvIHByb3ZpZGUgY29uc2lzdGVudCBuYXZpZ2F0aW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5LZWVwIHlvdXIgaGllcmFyY2hpZXMgc2hhbGxvdyBieSB1c2luZyBob3Jpem9udGFsIG5hdmlnYXRpb24gYW5kIHNob3J0Y3V0cy48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIG11bHRpLXNlbGVjdCB0byBhbGxvdyB0aGUgdXNlciB0byBhY3Qgb24gY29sbGVjdGlvbnMgb2YgZGF0YS48L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsb3cgZm9yIHF1aWNrIG5hdmlnYXRpb24gYmV0d2VlbiBkZXRhaWwgaXRlbXMgd2l0aCBzd2lwZSB2aWV3cy48L3A+Ci08L2xpPgotPC91bD4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuamQgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0YjEyZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5qZApAQCAtMCwwICsxLDI1NCBAQAorcGFnZS50aXRsZT1BcHBsaWNhdGlvbiBTdHJ1Y3R1cmUKK0BqZDpib2R5CisKKzxwPkFwcHMgY29tZSBpbiBtYW55IHZhcmlldGllcyB0aGF0IGFkZHJlc3MgdmVyeSBkaWZmZXJlbnQgbmVlZHMuIEZvciBleGFtcGxlOjwvcD4KKzx1bD4KKzxsaT5BcHBzIHN1Y2ggYXMgQ2FsY3VsYXRvciBvciBDYW1lcmEgdGhhdCBhcmUgYnVpbHQgYXJvdW5kIGEgc2luZ2xlIGZvY3VzZWQgYWN0aXZpdHkgaGFuZGxlZCBmcm9tIGEKKyAgc2luZ2xlIHNjcmVlbjwvbGk+Cis8bGk+QXBwcyBzdWNoIGFzIFBob25lIHdob3NlIG1haW4gcHVycG9zZSBpcyB0byBzd2l0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgYWN0aXZpdGllcyB3aXRob3V0IGRlZXBlcgorICBuYXZpZ2F0aW9uPC9saT4KKzxsaT5BcHBzIHN1Y2ggYXMgR21haWwgb3IgR29vZ2xlIFBsYXkgdGhhdCBjb21iaW5lIGEgYnJvYWQgc2V0IG9mIGRhdGEgdmlld3Mgd2l0aCBkZWVwIG5hdmlnYXRpb248L2xpPgorPC91bD4KKzxwPllvdXIgYXBwJ3Mgc3RydWN0dXJlIGRlcGVuZHMgbGFyZ2VseSBvbiB0aGUgY29udGVudCBhbmQgdGFza3MgeW91IHdhbnQgdG8gc3VyZmFjZSBmb3IgeW91ciB1c2Vycy48L3A+Cis8aDIgaWQ9ImdlbmVyYWwtc3RydWN0dXJlIj5HZW5lcmFsIFN0cnVjdHVyZTwvaDI+CisKKzxwPkEgdHlwaWNhbCBBbmRyb2lkIGFwcCBjb25zaXN0cyBvZiB0b3AgbGV2ZWwgYW5kIGRldGFpbC9lZGl0IHZpZXdzLiBJZiB0aGUgbmF2aWdhdGlvbiBoaWVyYXJjaHkgaXMKK2RlZXAgYW5kIGNvbXBsZXgsIGNhdGVnb3J5IHZpZXdzIGNvbm5lY3QgdG9wIGxldmVsIGFuZCBkZXRhaWwgdmlld3MuPC9wPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfb3ZlcnZpZXcucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxoND5Ub3AgbGV2ZWwgdmlld3M8L2g0PgorPHA+VGhlIHRvcCBsZXZlbCBvZiB0aGUgYXBwIHR5cGljYWxseSBjb25zaXN0cyBvZiB0aGUgZGlmZmVyZW50IHZpZXdzIHRoYXQgeW91ciBhcHAgc3VwcG9ydHMuIFRoZSB2aWV3cworZWl0aGVyIHNob3cgZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgc2FtZSBkYXRhIG9yIGV4cG9zZSBhbiBhbHRvZ2V0aGVyIGRpZmZlcmVudCBmdW5jdGlvbmFsCitmYWNldCBvZiB5b3VyIGFwcC48L3A+Cis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0zIj4mbmJzcDs8L2Rpdj4KKworPGg0PkNhdGVnb3J5IHZpZXdzPC9oND4KKzxwPkNhdGVnb3J5IHZpZXdzIGFsbG93IHlvdSB0byBkcmlsbCBkZWVwZXIgaW50byB5b3VyIGRhdGEuPC9wPgorPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMTEiPiZuYnNwOzwvZGl2PgorCis8aDQ+RGV0YWlsL2VkaXQgdmlldzwvaDQ+Cis8cD5UaGUgZGV0YWlsL2VkaXQgdmlldyBpcyB3aGVyZSB5b3UgY29uc3VtZSBvciBjcmVhdGUgZGF0YS48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGgyIGlkPSJ0b3AtbGV2ZWwiPlRvcCBMZXZlbDwvaDI+CisKKzxwPlRoZSBsYXlvdXQgb2YgeW91ciBzdGFydCBzY3JlZW4gcmVxdWlyZXMgc3BlY2lhbCBhdHRlbnRpb24uIFRoaXMgaXMgdGhlIGZpcnN0IHNjcmVlbiBwZW9wbGUgc2VlCithZnRlciBsYXVuY2hpbmcgeW91ciBhcHAsIHNvIGl0IHNob3VsZCBiZSBhbiBlcXVhbGx5IHJld2FyZGluZyBleHBlcmllbmNlIGZvciBuZXcgYW5kIGZyZXF1ZW50Cit2aXNpdG9ycyBhbGlrZS48L3A+Cis8cD5Bc2sgeW91cnNlbGY6ICJXaGF0IGFyZSBteSB0eXBpY2FsIHVzZXJzIG1vc3QgbGlrZWx5IGdvaW5nIHRvIHdhbnQgdG8gZG8gaW4gbXkgYXBwPyIsIGFuZCBzdHJ1Y3R1cmUKK3lvdXIgc3RhcnQgc2NyZWVuIGV4cGVyaWVuY2UgYWNjb3JkaW5nbHkuPC9wPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPGg0PlB1dCBjb250ZW50IGZvcndhcmQ8L2g0PgorPHA+TWFueSBhcHBzIGZvY3VzIG9uIHRoZSBjb250ZW50IGRpc3BsYXkuIEF2b2lkIG5hdmlnYXRpb24tb25seSBzY3JlZW5zIGFuZCBpbnN0ZWFkIGxldCBwZW9wbGUgZ2V0IHRvCit0aGUgbWVhdCBvZiB5b3VyIGFwcCByaWdodCBhd2F5IGJ5IG1ha2luZyBjb250ZW50IHRoZSBjZW50ZXJwaWVjZSBvZiB5b3VyIHN0YXJ0IHNjcmVlbi4gQ2hvb3NlCitsYXlvdXRzIHRoYXQgYXJlIHZpc3VhbGx5IGVuZ2FnaW5nIGFuZCBhcHByb3ByaWF0ZSBmb3IgdGhlIGRhdGEgdHlwZSBhbmQgc2NyZWVuIHNpemUuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfbWFya2V0LnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgVGhlIEdvb2dsZSBQbGF5IGFwcCdzIHN0YXJ0IHNjcmVlbiBwcmltYXJpbHkgYWxsb3dzIG5hdmlnYXRpb24gaW50byB0aGUgc3RvcmVzIGZvciBBcHBzLCBNdXNpYywgQm9va3MsCisgICAgICBNb3ZpZXMgYW5kIEdhbWVzLiBJdCBpcyBhbHNvIGVucmljaGVkIHdpdGggdGFpbG9yZWQgcmVjb21tZW5kYXRpb25zIGFuZCBwcm9tb3Rpb25zIHRoYXQKKyAgICAgIHN1cmZhY2UgY29udGVudCBvZiBpbnRlcmVzdCB0byB0aGUgdXNlci4gU2VhcmNoIGlzIHJlYWRpbHkgYXZhaWxhYmxlIGZyb20gdGhlIGFjdGlvbiBiYXIuCisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxoND5TZXQgdXAgYWN0aW9uIGJhcnMgZm9yIG5hdmlnYXRpb24gYW5kIGFjdGlvbnM8L2g0PgorPHA+QWxsIHNjcmVlbnMgaW4geW91ciBhcHAgc2hvdWxkIGRpc3BsYXkgYWN0aW9uIGJhcnMgdG8gcHJvdmlkZSBjb25zaXN0ZW50IG5hdmlnYXRpb24gYW5kIHN1cmZhY2UKK2ltcG9ydGFudCBhY3Rpb25zLjwvcD4KKzxwPkF0IHRoZSB0b3AgbGV2ZWwsIHNwZWNpYWwgY29uc2lkZXJhdGlvbnMgYXBwbHkgdG8gdGhlIGFjdGlvbiBiYXI6PC9wPgorPHVsPgorPGxpPlVzZSB0aGUgYWN0aW9uIGJhciB0byBkaXNwbGF5IHlvdXIgYXBwJ3MgaWNvbiBvciB0aXRsZS48L2xpPgorPGxpPklmIHlvdXIgdG9wIGxldmVsIGNvbnNpc3RzIG9mIG11bHRpcGxlIHZpZXdzLCBvciBpZiBzd2l0Y2hpbmcgYmV0d2VlbiBkYXRhIGZyb20gZGlmZmVyZW50IHVzZXIKKyAgYWNjb3VudHMgaXMgYSBzaWduaWZpY2FudCB1c2UgY2FzZSwgbWFrZSBzdXJlIHRoYXQgaXQncyBlYXN5IGZvciB0aGUgdXNlciB0byBuYXZpZ2F0ZSBiZXR3ZWVuIHRoZW0KKyAgYnkgYWRkaW5nIHZpZXcgY29udHJvbHMgdG8geW91ciBhY3Rpb24gYmFyLjwvbGk+Cis8bGk+SWYgeW91ciBhcHAgYWxsb3dzIHBlb3BsZSB0byBjcmVhdGUgY29udGVudCwgY29uc2lkZXIgbWFraW5nIHRoZSBjb250ZW50IGFjY2Vzc2libGUgcmlnaHQgZnJvbSB0aGUKKyAgdG9wIGxldmVsLjwvbGk+Cis8bGk+SWYgeW91ciBjb250ZW50IGlzIHNlYXJjaGFibGUsIGluY2x1ZGUgdGhlIFNlYXJjaCBhY3Rpb24gaW4gdGhlIGFjdGlvbiBiYXIgc28gcGVvcGxlIGNhbiBjdXQKKyAgdGhyb3VnaCB0aGUgbmF2aWdhdGlvbiBoaWVyYXJjaHkuPC9saT4KKzwvdWw+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nbWFpbC5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEVtYWlsIGlzIGFib3V0IHByb2R1Y3Rpdml0eSwgc28gYW4gZWZmaWNpZW50LCBlYXN5LXRvLXNraW0gbGlzdCB3aXRoIGhpZ2hlciBkYXRhIGRlbnNpdHkgd29ya3MKKyAgICAgIHdlbGwuIE5hdmlnYXRpb24gc3VwcG9ydHMgc3dpdGNoaW5nIGJldHdlZW4gYWNjb3VudHMgYW5kIHJlY2VudCBsYWJlbHMuIEljb25zIGZvciBjcmVhdGluZyBhCisgICAgICBuZXcgbWVzc2FnZSBvciBzZWFyY2hpbmcgYXJlIHByb21pbmVudCBpbiB0aGUgc3BsaXQgYWN0aW9uIGJhciBhdCB0aGUgYm90dG9tLgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+Q3JlYXRlIGFuIGlkZW50aXR5IGZvciB5b3VyIGFwcDwvaDQ+Cis8cD5DcmVhdGluZyBhbiBpZGVudGl0eSBmb3IgeW91ciBhcHAgZ29lcyBiZXlvbmQgdGhlIGFjdGlvbiBiYXIuIFlvdXIgYXBwIGNvbW11bmljYXRlcyBpdHMgaWRlbnRpdHkKK3Rocm91Z2ggaXRzIGRhdGEsIHRoZSB3YXkgdGhhdCBkYXRhIGlzIGFycmFuZ2VkLCBhbmQgaG93IHBlb3BsZSBpbnRlcmFjdCB3aXRoIGl0LiBFc3BlY2lhbGx5IGZvcgorbWVkaWEtcmljaCBhcHBsaWNhdGlvbnMsIHRyeSB0byBjcmVhdGUgdW5pcXVlIGxheW91dHMgdGhhdCBzaG93Y2FzZSB5b3VyIGRhdGEgYW5kIGdvIGJleW9uZCB0aGUKK21vbm90b255IG9mIHNpbXBsZSBsaXN0IHZpZXdzLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX211c2ljX2xuZHNjcC5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIFRoZSAzRCBjYXJvdXNlbCBjZWxlYnJhdGVzIGNvdmVyIGFydCBhbmQgZXN0YWJsaXNoZXMgYSB1bmlxdWUgaWRlbnRpdHkgZm9yIHRoZSBNdXNpYyBhcHAuCisgICAgICBEZWZhdWx0aW5nIHRvIHRoZSBSZWNlbnQgdmlldyBrZWVwcyB0aGUgZm9jdXMgb24gbXVzaWMgdGhlIHVzZXIgaGFzIGJlZW4gbGlzdGVuaW5nIHRvIGxhdGVseS4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImNhdGVnb3JpZXMiPkNhdGVnb3JpZXM8L2gyPgorCis8cD5HZW5lcmFsbHksIHRoZSBwdXJwb3NlIG9mIGEgZGVlcCwgZGF0YS1kcml2ZW4gYXBwIGlzIHRvIG5hdmlnYXRlIHRocm91Z2ggb3JnYW5pemF0aW9uYWwgY2F0ZWdvcmllcwordG8gdGhlIGRldGFpbCBsZXZlbCwgd2hlcmUgZGF0YSBjYW4gYmUgdmlld2VkIGFuZCBtYW5hZ2VkLiBNaW5pbWl6ZSBwZXJjZWl2ZWQgbmF2aWdhdGlvbiBlZmZvcnQgYnkKK2tlZXBpbmcgeW91ciBhcHBzIHNoYWxsb3cuPC9wPgorPHA+RXZlbiB0aG91Z2ggdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBuYXZpZ2F0aW9uIHN0ZXBzIGZyb20gdGhlIHRvcCBsZXZlbCBkb3duIHRvIHRoZSBkZXRhaWwgdmlld3MgaXMKK3R5cGljYWxseSBkaWN0YXRlZCBieSB0aGUgc3RydWN0dXJlIG9mIHlvdXIgYXBwJ3MgY29udGVudCwgdGhlcmUgYXJlIHNldmVyYWwgd2F5cyB5b3UgY2FuIGN1dCBkb3duCitvbiB0aGUgcGVyY2VwdGlvbiBvZiBvbmVyb3VzIG5hdmlnYXRpb24uPC9wPgorPGg0PlVzZSB0YWJzIHRvIGNvbWJpbmUgY2F0ZWdvcnkgc2VsZWN0aW9uIGFuZCBkYXRhIGRpc3BsYXk8L2g0PgorPHA+VGhpcyBjYW4gYmUgc3VjY2Vzc2Z1bCBpZiB0aGUgY2F0ZWdvcmllcyBhcmUgZmFtaWxpYXIgb3IgdGhlIG51bWJlciBvZiBjYXRlZ29yaWVzIGlzIHNtYWxsLiBJdCBoYXMKK3RoZSBhZHZhbnRhZ2UgdGhhdCBhIGxldmVsIG9mIGhpZXJhcmNoeSBpcyByZW1vdmVkIGFuZCBkYXRhIHJlbWFpbnMgYXQgdGhlIGNlbnRlciBvZiB0aGUgdXNlcidzCithdHRlbnRpb24uIE5hdmlnYXRpbmcgbGF0ZXJhbGx5IGJldHdlZW4gZGF0YS1yaWNoIGNhdGVnb3JpZXMgaXMgbW9yZSBha2luIHRvIGEgY2FzdWFsIGJyb3dzaW5nCitleHBlcmllbmNlIHRoYW4gdG8gYW4gZXhwbGljaXQgbmF2aWdhdGlvbiBzdGVwLjwvcD4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgorCis8cD5JZiB0aGUgY2F0ZWdvcmllcyBhcmUgZmFtaWxpYXIsIHByZWRpY3RhYmxlLCBvciBjbG9zZWx5IHJlbGF0ZWQsIHVzZSBzY3JvbGxpbmcgdGFicyAod2hlcmUgbm90IGFsbAoraXRlbXMgYXJlIGluIHZpZXcgc2ltdWx0YW5lb3VzbHkpLiBLZWVwIHRoZSBudW1iZXIgb2Ygc2Nyb2xsaW5nIHRhYnMgYXQgYSBtYW5hZ2VhYmxlIGxldmVsIHRvCittaW5pbWl6ZSBuYXZpZ2F0aW9uYWwgZWZmb3J0LiBSdWxlIG9mIHRodW1iOiBubyBtb3JlIHRoYW4gNSZuZGFzaDs3IHRhYnMuPC9wPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9zY3JvbGx0YWJzLnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgR29vZ2xlIFBsYXkgdXNlcyB0YWJzIHRvIHNpbXVsdGFuZW91c2x5IHNob3cgY2F0ZWdvcnkgY2hvaWNlIGFuZCBjb250ZW50LiBUbyBuYXZpZ2F0ZSBiZXR3ZWVuCisgICAgICBjYXRlZ29yaWVzLCB1c2VycyBjYW4gc3dpcGUgbGVmdC9yaWdodCBvbiB0aGUgY29udGVudC4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxwPklmIHRoZSBjYXRlZ29yaWVzIGluIHRoZSB0YWJzIGFyZSBub3QgY2xvc2VseSByZWxhdGVkLCBmYXZvciBmaXhlZCB0YWJzLCBzbyB0aGF0IGFsbCBjYXRlZ29yaWVzIGFyZQoraW4gdmlldyBhdCB0aGUgc2FtZSB0aW1lLjwvcD4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2FwcF9zdHJ1Y3R1cmVfZml4ZWR0YWJzLnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgWW91VHViZSB1c2VzIGZpeGVkIHRhYnMgdG8gc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50LCByZWxhdGl2ZWx5IHVucmVsYXRlZCBmdW5jdGlvbmFsIGFyZWFzLgorICAgIDwvZGl2PgorCisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGg0PkFsbG93IGN1dHRpbmcgdGhyb3VnaCBoaWVyYXJjaGllczwvaDQ+Cis8cD5UYWtlIGFkdmFudGFnZSBvZiBzaG9ydGN1dHMgdGhhdCBhbGxvdyBwZW9wbGUgdG8gcmVhY2ggdGhlaXIgZ29hbHMgcXVpY2tlci4gVG8gYWxsb3cgdG9wLWxldmVsCitpbnZvY2F0aW9uIG9mIGFjdGlvbnMgZm9yIGEgZGF0YSBpdGVtIGZyb20gd2l0aGluIGxpc3Qgb3IgZ3JpZCB2aWV3cywgZGlzcGxheSBwcm9taW5lbnQgYWN0aW9ucworZGlyZWN0bHkgb24gbGlzdCB2aWV3IGl0ZW1zIHVzaW5nIGRyb3AtZG93bnMgb3Igc3BsaXQgbGlzdCBpdGVtcy4gVGhpcyBsZXRzIHBlb3BsZSBpbnZva2UgYWN0aW9ucyBvbgorZGF0YSB3aXRob3V0IGhhdmluZyB0byBuYXZpZ2F0ZSBhbGwgdGhlIHdheSBkb3duIHRoZSBoaWVyYXJjaHkuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX3Nob3J0Y3V0X29uX2l0ZW0ucG5nIj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgTXVzaWMgYWxsb3dzIHRoZSB1c2VyIHRvIGFjdCB1cG9uIGEgZGF0YSBpdGVtIChzb25nKSBmcm9tIHdpdGhpbiB0aGUgY2F0ZWdvcnkgdmlldyAoYWxidW0pLAorICB0aGVyZWJ5IHJlbW92aW5nIHRoZSBuZWVkIHRvIG5hdmlnYXRlIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIHNvbmcncyBkZXRhaWwgdmlldy4KKzwvZGl2PgorCis8aDQ+QWN0aW5nIHVwb24gbXVsdGlwbGUgZGF0YSBpdGVtczwvaDQ+Cis8cD5FdmVuIHRob3VnaCBjYXRlZ29yeSB2aWV3cyBtb3N0bHkgc2VydmUgdG8gZ3VpZGUgcGVvcGxlIHRvIGNvbnRlbnQgZGV0YWlsLCBrZWVwIGluIG1pbmQgdGhhdCB0aGVyZQorYXJlIG9mdGVuIGdvb2QgcmVhc29ucyB0byBhY3Qgb24gY29sbGVjdGlvbnMgb2YgZGF0YSBhcyB3ZWxsLjwvcD4KKzxwPkZvciBleGFtcGxlLCBpZiB5b3UgYWxsb3cgcGVvcGxlIHRvIGRlbGV0ZSBhbiBpdGVtIGluIGEgZGV0YWlsIHZpZXcsIHlvdSBzaG91bGQgYWxzbyBhbGxvdyB0aGVtIHRvCitkZWxldGUgbXVsdGlwbGUgaXRlbXMgaW4gdGhlIGNhdGVnb3J5IHZpZXcuIEFuYWx5emUgd2hpY2ggZGV0YWlsIHZpZXcgYWN0aW9ucyBhcmUgYXBwbGljYWJsZSB0bworY29sbGVjdGlvbnMgb2YgaXRlbXMuIFRoZW4gdXNlIG11bHRpLXNlbGVjdCB0byBhbGxvdyBhcHBsaWNhdGlvbiBvZiB0aG9zZSBhY3Rpb25zIHRvIG11bHRpcGxlIGl0ZW1zCitpbiBhIGNhdGVnb3J5IHZpZXcuPC9wPgorPGgyIGlkPSJkZXRhaWxzIj5EZXRhaWxzPC9oMj4KKworPHA+VGhlIGRldGFpbCB2aWV3IGFsbG93cyB5b3UgdG8gdmlldyBhbmQgYWN0IG9uIHlvdXIgZGF0YS4gVGhlIGxheW91dCBvZiB0aGUgZGV0YWlsIHZpZXcgZGVwZW5kcyBvbgordGhlIGRhdGEgdHlwZSBiZWluZyBkaXNwbGF5ZWQsIGFuZCB0aGVyZWZvcmUgZGlmZmVycyB3aWRlbHkgYW1vbmcgYXBwcy48L3A+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCis8aDQ+TGF5b3V0PC9oND4KKzxwPkNvbnNpZGVyIHRoZSBhY3Rpdml0aWVzIHBlb3BsZSB3aWxsIHBlcmZvcm0gaW4gdGhlIGRldGFpbCB2aWV3IGFuZCBhcnJhbmdlIHRoZSBsYXlvdXQgYWNjb3JkaW5nbHkuCitGb3IgaW1tZXJzaXZlIGNvbnRlbnQsIG1ha2UgdXNlIG9mIHRoZSBsaWdodHMtb3V0IG1vZGUgdG8gYWxsb3cgZm9yIGRpc3RyYWN0aW9uLWZyZWUgdmlld2luZyBvZgorZnVsbC1zY3JlZW4gY29udGVudC48L3A+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX3Blb3BsZV9kZXRhaWwucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX2Jvb2tfZGV0YWlsX3BhZ2VfZmxpcC5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEdvb2dsZSBCb29rcycgZGV0YWlsIHZpZXcgaXMgYWxsIGFib3V0IHJlcGxpY2F0aW5nIHRoZSBleHBlcmllbmNlIG9mIHJlYWRpbmcgYW4gYWN0dWFsIGJvb2suCisgICAgICBUaGUgcGFnZS1mbGlwIGFuaW1hdGlvbiByZWluZm9yY2VzIHRoYXQgbm90aW9uLiBUbyBjcmVhdGUgYW4gaW1tZXJzaXZlIGV4cGVyaWVuY2UgdGhlIGFwcAorICAgICAgZW50ZXJzIGxpZ2h0cy1vdXQgbW9kZSwgd2hpY2ggaGlkZXMgYWxsIHN5c3RlbSBVSSBhZmZvcmRhbmNlcy4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIFRoZSBwdXJwb3NlIG9mIHRoZSBQZW9wbGUgYXBwJ3MgZGV0YWlsIHZpZXcgaXMgdG8gc3VyZmFjZSBjb21tdW5pY2F0aW9uIG9wdGlvbnMuIFRoZSBsaXN0IHZpZXcKKyAgICAgIGFsbG93cyBmb3IgZWZmaWNpZW50IHNjYW5uaW5nIGFuZCBxdWljayBhY2Nlc3Mgb2YgcGhvbmUgbnVtYmVycywgZW1haWwgYWRkcmVzc2VzIGFuZCBvdGhlcgorICAgICAgaW5mb3JtYXRpb24gaXRlbXMuIFNwbGl0IGl0ZW1zIGFyZSB1c2VkIHRvIGNvbWJpbmUgY2FsbGluZyBhbmQgbWVzc2FnaW5nIGludG8gb25lIGNvbXBhY3QgbGluZQorICAgICAgaXRlbS4KKyAgICA8L2Rpdj4KKyAgPC9kaXY+Cis8L2Rpdj4KKworPGg0Pk1ha2UgbmF2aWdhdGlvbiBiZXR3ZWVuIGRldGFpbCB2aWV3cyBlZmZpY2llbnQ8L2g0PgorPHA+SWYgeW91ciB1c2VycyBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gbG9vayBhdCBtdWx0aXBsZSBpdGVtcyBpbiBzZXF1ZW5jZSwgYWxsb3cgdGhlbSB0byBuYXZpZ2F0ZQorYmV0d2VlbiBpdGVtcyBmcm9tIHdpdGhpbiB0aGUgZGV0YWlsIHZpZXcuIFVzZSBzd2lwZSB2aWV3cyBvciBvdGhlciB0ZWNobmlxdWVzLCBzdWNoIGFzIGZpbG1zdHJpcHMsCit0byBhY2hpZXZlIHRoaXMuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9hcHBfc3RydWN0dXJlX2dtYWlsX3N3aXBlLnBuZyI+Cis8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgIEdtYWlsIHVzaW5nIHN3aXBlIHZpZXdzIHRvIG5hdmlnYXRlIGZyb20gZGV0YWlsIHZpZXcgdG8gZGV0YWlsIHZpZXcuCis8L2Rpdj4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvYXBwX3N0cnVjdHVyZV9nYWxsZXJ5X2ZpbG1zdHJpcC5wbmciPgorPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICBJbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIHN3aXBlIGdlc3R1cmVzIHRvIG1vdmUgbGVmdCBvciByaWdodCB0aHJvdWdoIGltYWdlcywgR2FsbGVyeSBwcm92aWRlcyBhCisgIGZpbG1zdHJpcCBjb250cm9sIHRoYXQgbGV0cyBwZW9wbGUgcXVpY2tseSBqdW1wIHRvIHNwZWNpZmljIGltYWdlcy4KKzwvZGl2PgorCis8aDIgaWQ9ImNoZWNrbGlzdCI+Q2hlY2tsaXN0PC9oMj4KKworPHVsPgorPGxpPgorPHA+RmluZCB3YXlzIHRvIGRpc3BsYXkgdXNlZnVsIGNvbnRlbnQgb24geW91ciBzdGFydCBzY3JlZW4uPC9wPgorPC9saT4KKzxsaT4KKzxwPlVzZSBhY3Rpb24gYmFycyB0byBwcm92aWRlIGNvbnNpc3RlbnQgbmF2aWdhdGlvbi48L3A+Cis8L2xpPgorPGxpPgorPHA+S2VlcCB5b3VyIGhpZXJhcmNoaWVzIHNoYWxsb3cgYnkgdXNpbmcgaG9yaXpvbnRhbCBuYXZpZ2F0aW9uIGFuZCBzaG9ydGN1dHMuPC9wPgorPC9saT4KKzxsaT4KKzxwPlVzZSBtdWx0aS1zZWxlY3QgdG8gYWxsb3cgdGhlIHVzZXIgdG8gYWN0IG9uIGNvbGxlY3Rpb25zIG9mIGRhdGEuPC9wPgorPC9saT4KKzxsaT4KKzxwPkFsbG93IGZvciBxdWljayBuYXZpZ2F0aW9uIGJldHdlZW4gZGV0YWlsIGl0ZW1zIHdpdGggc3dpcGUgdmlld3MuPC9wPgorPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU1OWY1Li4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5Ci0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkJhY2t3YXJkcyBDb21wYXRpYmlsaXR5PC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5TaWduaWZpY2FudCBjaGFuZ2VzIGluIEFuZHJvaWQgMy4wIGluY2x1ZGVkOjwvcD4KLTx1bD4KLTxsaT5EZXByZWNhdGlvbiBvZiBuYXZpZ2F0aW9uIGhhcmR3YXJlIGtleXMgKEJhY2ssIE1lbnUsIFNlYXJjaCwgSG9tZSkgaW4gZmF2b3Igb2YgaGFuZGxpbmcgbmF2aWdhdGlvbgotICB2aWEgdmlydHVhbCBjb250cm9scyAoQmFjaywgSG9tZSwgUmVjZW50cykuPC9saT4KLTxsaT5Sb2J1c3QgcGF0dGVybiBmb3IgdGhlIHVzZSBvZiBtZW51cyBpbiBhY3Rpb24gYmFycy48L2xpPgotPC91bD4KLTxwPkFuZHJvaWQgNC4wIGJyaW5ncyB0aGVzZSBjaGFuZ2VzIGZvciB0YWJsZXRzIHRvIHRoZSBwaG9uZSBwbGF0Zm9ybS48L3A+Ci0KLTxoMiBpZD0ib2xkZXItaGFyZHdhcmUiPkFkYXB0aW5nIEFuZHJvaWQgNC4wIHRvIE9sZGVyIEhhcmR3YXJlIGFuZCBBcHBzPC9oMj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLTxoND5QaG9uZXMgd2l0aCB2aXJ0dWFsIG5hdmlnYXRpb24gY29udHJvbHM8L2g0PgotPHA+QW5kcm9pZCBhcHBzIHdyaXR0ZW4gZm9yIEFuZHJvaWQgMy4wIGFuZCBsYXRlciBkaXNwbGF5IGFjdGlvbnMgaW4gdGhlIGFjdGlvbiBiYXIuIEFjdGlvbnMgdGhhdCBkb24ndAotZml0IGluIHRoZSBhY3Rpb24gYmFyIG9yIGFyZW4ndCBpbXBvcnRhbnQgZW5vdWdoIHRvIGJlIGRpc3BsYXllZCBhdCB0aGUgdG9wIGxldmVsIGFwcGVhciBpbiB0aGUKLWFjdGlvbiBvdmVyZmxvdy48L3A+Ci08cD5Vc2VycyBhY2Nlc3MgdGhlIGFjdGlvbiBvdmVyZmxvdyBieSB0b3VjaGluZyBpdCBpbiB0aGUgYWN0aW9uIGJhci48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2NvbXBhdGliaWxpdHlfdmlydHVhbF9uYXYucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0PlBob25lcyB3aXRoIHBoeXNpY2FsIG5hdmlnYXRpb24ga2V5czwvaDQ+Ci08cD5BbmRyb2lkIHBob25lcyB3aXRoIHRyYWRpdGlvbmFsIG5hdmlnYXRpb24gaGFyZHdhcmUga2V5cyBkb24ndCBkaXNwbGF5IHRoZSB2aXJ0dWFsIG5hdmlnYXRpb24gYmFyIGF0Ci10aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIEluc3RlYWQsIHRoZSBhY3Rpb24gb3ZlcmZsb3cgaXMgYXZhaWxhYmxlIGZyb20gdGhlIG1lbnUgaGFyZHdhcmUga2V5LiBUaGUKLXJlc3VsdGluZyBhY3Rpb25zIHBvcHVwIGhhcyB0aGUgc2FtZSBzdHlsZSBhcyBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IGlzIGRpc3BsYXllZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9jb21wYXRpYmlsaXR5X3BoeXNpY2FsX2J1dHRvbnMucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0PkxlZ2FjeSBhcHBzIG9uIHBob25lcyB3aXRoIHZpcnR1YWwgbmF2aWdhdGlvbiBjb250cm9sczwvaDQ+Ci08cD5XaGVuIHlvdSBydW4gYW4gYXBwIHRoYXQgd2FzIGJ1aWx0IGZvciBBbmRyb2lkIDIuMyBvciBlYXJsaWVyIG9uIGEgcGhvbmUgd2l0aCB2aXJ0dWFsIG5hdmlnYXRpb24KLWNvbnRyb2xzLCBhbiBhY3Rpb24gb3ZlcmZsb3cgY29udHJvbCBhcHBlYXJzIGF0IHRoZSByaWdodCBzaWRlIG9mIHRoZSB2aXJ0dWFsIG5hdmlnYXRpb24gYmFyLiBZb3UKLWNhbiB0b3VjaCB0aGUgY29udHJvbCB0byBkaXNwbGF5IHRoZSBhcHAncyBhY3Rpb25zIGluIHRoZSB0cmFkaXRpb25hbCBBbmRyb2lkIG1lbnUgc3R5bGluZy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2NvbXBhdGliaWxpdHlfbGVnYWN5X2FwcHMucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFlMzM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5LmpkCkBAIC0wLDAgKzEsNjEgQEAKK3BhZ2UudGl0bGU9QmFja3dhcmRzIENvbXBhdGliaWxpdHkKK0BqZDpib2R5CisKKzxwPlNpZ25pZmljYW50IGNoYW5nZXMgaW4gQW5kcm9pZCAzLjAgaW5jbHVkZWQ6PC9wPgorPHVsPgorPGxpPkRlcHJlY2F0aW9uIG9mIG5hdmlnYXRpb24gaGFyZHdhcmUga2V5cyAoQmFjaywgTWVudSwgU2VhcmNoLCBIb21lKSBpbiBmYXZvciBvZiBoYW5kbGluZyBuYXZpZ2F0aW9uCisgIHZpYSB2aXJ0dWFsIGNvbnRyb2xzIChCYWNrLCBIb21lLCBSZWNlbnRzKS48L2xpPgorPGxpPlJvYnVzdCBwYXR0ZXJuIGZvciB0aGUgdXNlIG9mIG1lbnVzIGluIGFjdGlvbiBiYXJzLjwvbGk+Cis8L3VsPgorPHA+QW5kcm9pZCA0LjAgYnJpbmdzIHRoZXNlIGNoYW5nZXMgZm9yIHRhYmxldHMgdG8gdGhlIHBob25lIHBsYXRmb3JtLjwvcD4KKworPGgyIGlkPSJvbGRlci1oYXJkd2FyZSI+QWRhcHRpbmcgQW5kcm9pZCA0LjAgdG8gT2xkZXIgSGFyZHdhcmUgYW5kIEFwcHM8L2gyPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPGg0PlBob25lcyB3aXRoIHZpcnR1YWwgbmF2aWdhdGlvbiBjb250cm9sczwvaDQ+Cis8cD5BbmRyb2lkIGFwcHMgd3JpdHRlbiBmb3IgQW5kcm9pZCAzLjAgYW5kIGxhdGVyIGRpc3BsYXkgYWN0aW9ucyBpbiB0aGUgYWN0aW9uIGJhci4gQWN0aW9ucyB0aGF0IGRvbid0CitmaXQgaW4gdGhlIGFjdGlvbiBiYXIgb3IgYXJlbid0IGltcG9ydGFudCBlbm91Z2ggdG8gYmUgZGlzcGxheWVkIGF0IHRoZSB0b3AgbGV2ZWwgYXBwZWFyIGluIHRoZQorYWN0aW9uIG92ZXJmbG93LjwvcD4KKzxwPlVzZXJzIGFjY2VzcyB0aGUgYWN0aW9uIG92ZXJmbG93IGJ5IHRvdWNoaW5nIGl0IGluIHRoZSBhY3Rpb24gYmFyLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9jb21wYXRpYmlsaXR5X3ZpcnR1YWxfbmF2LnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5QaG9uZXMgd2l0aCBwaHlzaWNhbCBuYXZpZ2F0aW9uIGtleXM8L2g0PgorPHA+QW5kcm9pZCBwaG9uZXMgd2l0aCB0cmFkaXRpb25hbCBuYXZpZ2F0aW9uIGhhcmR3YXJlIGtleXMgZG9uJ3QgZGlzcGxheSB0aGUgdmlydHVhbCBuYXZpZ2F0aW9uIGJhciBhdAordGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiBJbnN0ZWFkLCB0aGUgYWN0aW9uIG92ZXJmbG93IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBtZW51IGhhcmR3YXJlIGtleS4gVGhlCityZXN1bHRpbmcgYWN0aW9ucyBwb3B1cCBoYXMgdGhlIHNhbWUgc3R5bGUgYXMgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCBpcyBkaXNwbGF5ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9jb21wYXRpYmlsaXR5X3BoeXNpY2FsX2J1dHRvbnMucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPGg0PkxlZ2FjeSBhcHBzIG9uIHBob25lcyB3aXRoIHZpcnR1YWwgbmF2aWdhdGlvbiBjb250cm9sczwvaDQ+Cis8cD5XaGVuIHlvdSBydW4gYW4gYXBwIHRoYXQgd2FzIGJ1aWx0IGZvciBBbmRyb2lkIDIuMyBvciBlYXJsaWVyIG9uIGEgcGhvbmUgd2l0aCB2aXJ0dWFsIG5hdmlnYXRpb24KK2NvbnRyb2xzLCBhbiBhY3Rpb24gb3ZlcmZsb3cgY29udHJvbCBhcHBlYXJzIGF0IHRoZSByaWdodCBzaWRlIG9mIHRoZSB2aXJ0dWFsIG5hdmlnYXRpb24gYmFyLiBZb3UKK2NhbiB0b3VjaCB0aGUgY29udHJvbCB0byBkaXNwbGF5IHRoZSBhcHAncyBhY3Rpb25zIGluIHRoZSB0cmFkaXRpb25hbCBBbmRyb2lkIG1lbnUgc3R5bGluZy48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvY29tcGF0aWJpbGl0eV9sZWdhY3lfYXBwcy5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ODgxN2YuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIEdlc3R1cmVzCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkdlc3R1cmVzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5HZXN0dXJlcyBhbGxvdyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHlvdXIgYXBwIGJ5IG1hbmlwdWxhdGluZyB0aGUgc2NyZWVuIG9iamVjdHMgeW91IHByb3ZpZGUuIFRoZQotZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBjb3JlIGdlc3R1cmUgc2V0IHRoYXQgaXMgc3VwcG9ydGVkIGluIEFuZHJvaWQuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9nZXN0dXJlX3RvdWNoLnBuZyI+Ci0KLTxoND5Ub3VjaDwvaDQ+Ci08cD5UcmlnZ2VycyB0aGUgZGVmYXVsdCBmdW5jdGlvbmFsaXR5IGZvciBhIGdpdmVuIGl0ZW0uPC9wPgotCi08dWw+Ci0gIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgotICAgIDxoND5BY3Rpb248L2g0PgotICAgIDxwPlByZXNzLCBsaWZ0PC9wPjwvbGk+Ci08L3VsPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9nZXN0dXJlX2xvbmd0b3VjaC5wbmciPgotCi08aDQ+TG9uZyBwcmVzczwvaDQ+Ci08cD5FbnRlcnMgZGF0YSBzZWxlY3Rpb24gbW9kZS4gQWxsb3dzIHlvdSB0byBzZWxlY3Qgb25lIG9yIG1vcmUgaXRlbXMgaW4gYSB2aWV3IGFuZCBhY3QgdXBvbgotICB0aGUgZGF0YSB1c2luZyBhIGNvbnRleHR1YWwgYWN0aW9uIGJhci4gQXZvaWQgdXNpbmcgbG9uZyBwcmVzcyBmb3Igc2hvd2luZyBjb250ZXh0dWFsIG1lbnVzLjwvcD4KLQotPHVsPgotICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gYWN0aW9uIj4KLSAgICA8aDQ+QWN0aW9uPC9oND4KLSAgICA8cD5QcmVzcywgd2FpdCwgbGlmdDwvcD48L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9zd2lwZS5wbmciPgotCi08aDQ+U3dpcGU8L2g0PgotPHA+U2Nyb2xscyBvdmVyZmxvd2luZyBjb250ZW50LCBvciBuYXZpZ2F0ZXMgYmV0d2VlbiB2aWV3cyBpbiB0aGUgc2FtZSBoaWVyYXJjaHkuPC9wPgotCi08dWw+Ci0gIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgotICAgIDxoND5BY3Rpb248L2g0PgotICAgIDxwPlByZXNzLCBtb3ZlLCBsaWZ0PC9wPjwvbGk+Ci08L3VsPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9kcmFnLnBuZyI+Ci0KLTxoND5EcmFnPC9oND4KLTxwPlJlYXJyYW5nZXMgZGF0YSB3aXRoaW4gYSB2aWV3LCBvciBtb3ZlcyBkYXRhIGludG8gYSBjb250YWluZXIgKGUuZy4gZm9sZGVycyBvbiBIb21lIFNjcmVlbikuPC9wPgotCi08dWw+Ci0gIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgotICAgIDxoND5BY3Rpb248L2g0PgotICAgIDxwPkxvbmcgcHJlc3MsIG1vdmUsIGxpZnQ8L3A+PC9saT4KLTwvdWw+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfZG91YmxldG91Y2gucG5nIj4KLQotPGg0PkRvdWJsZSB0b3VjaDwvaDQ+Ci08cD5ab29tcyBpbnRvIGNvbnRlbnQuIEFsc28gdXNlZCBhcyBhIHNlY29uZGFyeSBnZXN0dXJlIGZvciB0ZXh0IHNlbGVjdGlvbi48L3A+Ci0KLTx1bD4KLSAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIGFjdGlvbiI+Ci0gICAgPGg0PkFjdGlvbjwvaDQ+Ci0gICAgPHA+VHdvIHRvdWNoZXMgaW4gcXVpY2sgc3VjY2Vzc2lvbjwvcD48L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvZ2VzdHVyZV9waW5jaG9wZW4ucG5nIj4KLQotPGg0PlBpbmNoIG9wZW48L2g0PgotPHA+Wm9vbXMgaW50byBjb250ZW50LjwvcD4KLQotPHVsPgotICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gYWN0aW9uIj4KLSAgICA8aDQ+QWN0aW9uPC9oND4KLSAgICA8cD4yLWZpbmdlciBwcmVzcywgbW92ZSBvdXR3YXJkcywgbGlmdDwvcD48L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2dlc3R1cmVfcGluY2hjbG9zZS5wbmciPgotCi08aDQ+UGluY2ggY2xvc2U8L2g0PgotPHA+Wm9vbXMgb3V0IG9mIGNvbnRlbnQuPC9wPgotCi08dWw+Ci0gIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgotICAgIDxoND5BY3Rpb248L2g0PgotICAgIDxwPjItZmluZ2VyIHByZXNzLCBtb3ZlIGlud2FyZHMsIGxpZnQ8L3A+PC9saT4KLTwvdWw+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2dlc3R1cmVzLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9nZXN0dXJlcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY4ZGYyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9nZXN0dXJlcy5qZApAQCAtMCwwICsxLDExNSBAQAorcGFnZS50aXRsZT1HZXN0dXJlcworQGpkOmJvZHkKKworPHA+R2VzdHVyZXMgYWxsb3cgdXNlcnMgdG8gaW50ZXJhY3Qgd2l0aCB5b3VyIGFwcCBieSBtYW5pcHVsYXRpbmcgdGhlIHNjcmVlbiBvYmplY3RzIHlvdSBwcm92aWRlLiBUaGUKK2ZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgY29yZSBnZXN0dXJlIHNldCB0aGF0IGlzIHN1cHBvcnRlZCBpbiBBbmRyb2lkLjwvcD4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9nZXN0dXJlX3RvdWNoLnBuZyI+CisKKzxoND5Ub3VjaDwvaDQ+Cis8cD5UcmlnZ2VycyB0aGUgZGVmYXVsdCBmdW5jdGlvbmFsaXR5IGZvciBhIGdpdmVuIGl0ZW0uPC9wPgorCis8dWw+CisgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgorICAgIDxoND5BY3Rpb248L2g0PgorICAgIDxwPlByZXNzLCBsaWZ0PC9wPjwvbGk+Cis8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2dlc3R1cmVfbG9uZ3RvdWNoLnBuZyI+CisKKzxoND5Mb25nIHByZXNzPC9oND4KKzxwPkVudGVycyBkYXRhIHNlbGVjdGlvbiBtb2RlLiBBbGxvd3MgeW91IHRvIHNlbGVjdCBvbmUgb3IgbW9yZSBpdGVtcyBpbiBhIHZpZXcgYW5kIGFjdCB1cG9uCisgIHRoZSBkYXRhIHVzaW5nIGEgY29udGV4dHVhbCBhY3Rpb24gYmFyLiBBdm9pZCB1c2luZyBsb25nIHByZXNzIGZvciBzaG93aW5nIGNvbnRleHR1YWwgbWVudXMuPC9wPgorCis8dWw+CisgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgorICAgIDxoND5BY3Rpb248L2g0PgorICAgIDxwPlByZXNzLCB3YWl0LCBsaWZ0PC9wPjwvbGk+Cis8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2dlc3R1cmVfc3dpcGUucG5nIj4KKworPGg0PlN3aXBlPC9oND4KKzxwPlNjcm9sbHMgb3ZlcmZsb3dpbmcgY29udGVudCwgb3IgbmF2aWdhdGVzIGJldHdlZW4gdmlld3MgaW4gdGhlIHNhbWUgaGllcmFyY2h5LjwvcD4KKworPHVsPgorICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gYWN0aW9uIj4KKyAgICA8aDQ+QWN0aW9uPC9oND4KKyAgICA8cD5QcmVzcywgbW92ZSwgbGlmdDwvcD48L2xpPgorPC91bD4KKworICA8L2Rpdj4KKzwvZGl2PgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvZ2VzdHVyZV9kcmFnLnBuZyI+CisKKzxoND5EcmFnPC9oND4KKzxwPlJlYXJyYW5nZXMgZGF0YSB3aXRoaW4gYSB2aWV3LCBvciBtb3ZlcyBkYXRhIGludG8gYSBjb250YWluZXIgKGUuZy4gZm9sZGVycyBvbiBIb21lIFNjcmVlbikuPC9wPgorCis8dWw+CisgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgorICAgIDxoND5BY3Rpb248L2g0PgorICAgIDxwPkxvbmcgcHJlc3MsIG1vdmUsIGxpZnQ8L3A+PC9saT4KKzwvdWw+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvZ2VzdHVyZV9kb3VibGV0b3VjaC5wbmciPgorCis8aDQ+RG91YmxlIHRvdWNoPC9oND4KKzxwPlpvb21zIGludG8gY29udGVudC4gQWxzbyB1c2VkIGFzIGEgc2Vjb25kYXJ5IGdlc3R1cmUgZm9yIHRleHQgc2VsZWN0aW9uLjwvcD4KKworPHVsPgorICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gYWN0aW9uIj4KKyAgICA8aDQ+QWN0aW9uPC9oND4KKyAgICA8cD5Ud28gdG91Y2hlcyBpbiBxdWljayBzdWNjZXNzaW9uPC9wPjwvbGk+Cis8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2dlc3R1cmVfcGluY2hvcGVuLnBuZyI+CisKKzxoND5QaW5jaCBvcGVuPC9oND4KKzxwPlpvb21zIGludG8gY29udGVudC48L3A+CisKKzx1bD4KKyAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIGFjdGlvbiI+CisgICAgPGg0PkFjdGlvbjwvaDQ+CisgICAgPHA+Mi1maW5nZXIgcHJlc3MsIG1vdmUgb3V0d2FyZHMsIGxpZnQ8L3A+PC9saT4KKzwvdWw+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2dlc3R1cmVfcGluY2hjbG9zZS5wbmciPgorCis8aDQ+UGluY2ggY2xvc2U8L2g0PgorPHA+Wm9vbXMgb3V0IG9mIGNvbnRlbnQuPC9wPgorCis8dWw+CisgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiBhY3Rpb24iPgorICAgIDxoND5BY3Rpb248L2g0PgorICAgIDxwPjItZmluZ2VyIHByZXNzLCBtb3ZlIGlud2FyZHMsIGxpZnQ8L3A+PC9saT4KKzwvdWw+CisKKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvaW5kZXguaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzYmFhOS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gRGVzaWduIFBhdHRlcm5zCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLTxzdHlsZT4KLSNsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIHsKLSAgcG9zaXRpb246IHJlbGF0aXZlOwotfQotCi0jdGV4dC1vdmVybGF5IHsKLSAgcG9zaXRpb246IGFic29sdXRlOwotICBsZWZ0OiAxMHB4OwotICB0b3A6IDQ5MnB4OwotICB3aWR0aDogMjAwcHg7Ci19Ci08L3N0eWxlPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciBqdXN0LWxpbmtzIj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0gICAgICAgICAgCi0KLTxkaXYgaWQ9ImxhbmRpbmctZ3JhcGhpYy1jb250YWluZXIiPgotICA8ZGl2IGlkPSJ0ZXh0LW92ZXJsYXkiPgotICAgIERlc2lnbiBhcHBzIHRoYXQgYmVoYXZlIGluIGEgY29uc2lzdGVudCwgcHJlZGljdGFibGUgZmFzaGlvbi4KLSAgICA8YnI+PGJyPgotICAgIDxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCIgY2xhc3M9ImxhbmRpbmctcGFnZS1saW5rIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+Ci0gIDwvZGl2PgotCi0gIDxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+Ci0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3BhdHRlcm5zX2xhbmRpbmcucG5nIj4KLSAgPC9hPgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0KLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL2luZGV4LmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9pbmRleC5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzJlNGRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9pbmRleC5qZApAQCAtMCwwICsxLDI5IEBACitwYWdlLnRpdGxlPVBhdHRlcm5zCitoZWFkZXIuanVzdExpbmtzPTEKK2Zvb3Rlci5oaWRlPTEKK0BqZDpib2R5CisKKzxzdHlsZT4KKyNsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIHsKKyAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCisjdGV4dC1vdmVybGF5IHsKKyAgcG9zaXRpb246IGFic29sdXRlOworICBsZWZ0OiAxMHB4OworICB0b3A6IDQ5MnB4OworICB3aWR0aDogMjAwcHg7Cit9Cis8L3N0eWxlPgorCis8ZGl2IGlkPSJsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIj4KKyAgPGRpdiBpZD0idGV4dC1vdmVybGF5Ij4KKyAgICBEZXNpZ24gYXBwcyB0aGF0IGJlaGF2ZSBpbiBhIGNvbnNpc3RlbnQsIHByZWRpY3RhYmxlIGZhc2hpb24uCisgICAgPGJyPjxicj4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL3BhdHRlcm5zL25ldy00LTAuaHRtbCIgY2xhc3M9ImxhbmRpbmctcGFnZS1saW5rIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+CisgIDwvZGl2PgorCisgIDxhIGhyZWY9IntAZG9jUm9vdH1kZXNpZ24vcGF0dGVybnMvbmV3LTQtMC5odG1sIj4KKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9wYXR0ZXJuc19sYW5kaW5nLnBuZyI+CisgIDwvYT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjVjOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBNdWx0aS1wYW5lIExheW91dHMKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+TXVsdGktcGFuZSBMYXlvdXRzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5XaGVuIHdyaXRpbmcgYW4gYXBwIGZvciBBbmRyb2lkLCBrZWVwIGluIG1pbmQgdGhhdCBBbmRyb2lkIGRldmljZXMgY29tZSBpbiBtYW55IGRpZmZlcmVudCBzY3JlZW4KLXNpemVzIGFuZCB0eXBlcy4gTWFrZSBzdXJlIHRoYXQgeW91ciBhcHAgY29uc2lzdGVudGx5IHByb3ZpZGVzIGEgYmFsYW5jZWQgYW5kIGFlc3RoZXRpY2FsbHkgcGxlYXNpbmcKLWxheW91dCBieSBhZGp1c3RpbmcgaXRzIGNvbnRlbnQgdG8gdmFyeWluZyBzY3JlZW4gc2l6ZXMgYW5kIG9yaWVudGF0aW9ucy48L3A+Ci08cD48ZW0+UGFuZWxzPC9lbT4gYXJlIGEgZ3JlYXQgd2F5IGZvciB5b3VyIGFwcCB0byBhY2hpZXZlIHRoaXMuIFRoZXkgYWxsb3cgeW91IHRvIGNvbWJpbmUgbXVsdGlwbGUgdmlld3MgaW50bwotb25lIGNvbXBvdW5kIHZpZXcgd2hlbiBhIGxvdCBvZiBob3Jpem9udGFsIHNjcmVlbiByZWFsIGVzdGF0ZSBpcyBhdmFpbGFibGUgYW5kIGJ5IHNwbGl0dGluZyB0aGVtIHVwCi13aGVuIGxlc3Mgc3BhY2UgaXMgYXZhaWxhYmxlLjwvcD4KLTxoMiBpZD0iY29tYmluaW5nLXZpZXdzIj5Db21iaW5pbmcgTXVsdGlwbGUgVmlld3MgSW50byBPbmU8L2gyPgotCi08cD5PbiBzbWFsbGVyIGRldmljZXMgeW91ciBjb250ZW50IGlzIHR5cGljYWxseSBkaXZpZGVkIGludG8gYSBtYXN0ZXIgZ3JpZCBvciBsaXN0IHZpZXcgYW5kIGEgZGV0YWlsCi12aWV3LiBUb3VjaGluZyBhbiBpdGVtIGluIHRoZSBtYXN0ZXIgdmlldyBvcGVucyBhIGRpZmZlcmVudCBzY3JlZW4gc2hvd2luZyB0aGF0IGl0ZW0ncyBkZXRhaWwKLWluZm9ybWF0aW9uLjwvcD4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV92aWV3cy5wbmciPgotCi08cD5CZWNhdXNlIHRhYmxldHMgaGF2ZSBtb3JlIHNjcmVlbiByZWFsIGVzdGF0ZSB0aGFuIHBob25lcywgeW91IGNhbiB1c2UgcGFuZWxzIHRvIGNvbWJpbmUgdGhlIHJlbGF0ZWQKLWxpc3QgYW5kIGRldGFpbCB2aWV3cyBpbnRvIGEgc2luZ2xlIGNvbXBvdW5kIHZpZXcuIFRoaXMgdXNlcyB0aGUgYWRkaXRpb25hbCBzcGFjZSBtb3JlIGVmZmljaWVudGx5Ci1hbmQgbWFrZXMgbmF2aWdhdGluZyB0aGUgYXBwIGVhc2llci4gPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbXVsdGlwYW5lX3ZpZXdfdGFibGV0LnBuZyI+Ci0KLTxwPkluIGdlbmVyYWwsIHVzZSB0aGUgcGFuZSBvbiB0aGUgcmlnaHQgdG8gcHJlc2VudCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpdGVtIHlvdSBzZWxlY3RlZCBpbiB0aGUKLWxlZnQgcGFuZS4gTWFrZSBzdXJlIHRvIGtlZXAgdGhlIGl0ZW0gaW4gdGhlIGxlZnQgcGFuZSBzZWxlY3RlZCBpbiBvcmRlciB0byBlc3RhYmxpc2ggdGhlCi1yZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcGFuZWxzLjwvcD4KLTxoMiBpZD0ib3JpZW50YXRpb24iPkNvbXBvdW5kIFZpZXdzIGFuZCBPcmllbnRhdGlvbiBDaGFuZ2VzPC9oMj4KLQotPHA+U2NyZWVucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHJlZ2FyZGxlc3Mgb2Ygb3JpZW50YXRpb24uIElmIHlvdSB1c2UgYSBjb21wb3VuZCB2aWV3IGluCi1vbmUgb3JpZW50YXRpb24sIGRvbid0IHNwbGl0IGl0IHVwIHdoZW4gdGhlIHVzZXIgcm90YXRlcyB0aGUgc2NyZWVuLiBUaGVyZSBhcmUgc2V2ZXJhbCB0ZWNobmlxdWVzCi15b3UgY2FuIHVzZSB0byBhZGp1c3QgdGhlIGxheW91dCBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2Ugd2hpbGUga2VlcGluZyBmdW5jdGlvbmFsIHBhcml0eSBpbnRhY3QuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9tdWx0aXBhbmVfc3RyZXRjaC5wbmciPgotICAgIAotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5TdHJldGNoL2NvbXByZXNzPC9oND4KLTxwPkFkanVzdCB0aGUgY29sdW1uIHdpZHRoIG9mIHlvdXIgbGVmdCBwYW5lIHRvIGFjaGlldmUgYSBiYWxhbmNlZCBsYXlvdXQgaW4gYm90aCBvcmllbnRhdGlvbnMuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9zdGFjay5wbmciPgotICAgIAotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5TdGFjazwvaDQ+Ci08cD5SZWFycmFuZ2UgdGhlIHBhbmVscyBvbiB5b3VyIHNjcmVlbiB0byBtYXRjaCB0aGUgb3JpZW50YXRpb24uPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L211bHRpcGFuZV9leHBhbmQucG5nIj4KLSAgICAKLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+RXhwYW5kL2NvbGxhcHNlPC9oND4KLTxwPldoZW4gdGhlIGRldmljZSByb3RhdGVzLCBjb2xsYXBzZSB0aGUgbGVmdCBwYW5lIHZpZXcgdG8gb25seSBzaG93IHRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbi4KLVByb3ZpZGUgYW4gPGVtPmV4cGFuZDwvZW0+IGNvbnRyb2wgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gYnJpbmcgdGhlIGxlZnQgcGFuZSBjb250ZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsCi13aWR0aCBhbmQgdmljZSB2ZXJzYS48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbXVsdGlwYW5lX3Nob3cucG5nIj4KLSAgICAKLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+U2hvdy9oaWRlPC9oND4KLTxwPkFmdGVyIHJvdGF0aW5nIHRoZSBkZXZpY2UsIHNob3cgdGhlIHJpZ2h0IHBhbmUgaW4gZnVsbHNjcmVlbiB2aWV3LiBVc2UgdGhlIFVwIGljb24gaW4gdGhlIGFjdGlvbiBiYXIKLXRvIHNob3cgdGhlIGxlZnQgcGFuZWwgYW5kIGFsbG93IG5hdmlnYXRpb24gdG8gYSBkaWZmZXJlbnQgZW1haWwuIEhpZGUgdGhlIGxlZnQgcGFuZWwgYnkgdG91Y2hpbmcKLXRoZSBjb250ZW50IGluIHRoZSBkZXRhaWwgcGFuZWwuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxoMiBpZD0iY2hlY2tsaXN0Ij5DaGVja2xpc3Q8L2gyPgotCi08dWw+Ci08bGk+Ci08cD5QbGFuIGluIGFkdmFuY2Ugb24gaG93IHlvdXIgYXBwIHNjYWxlcyB0byBkaWZmZXJlbnQgc2NyZWVuIHNpemVzIGFuZCBzY3JlZW4gb3JpZW50YXRpb25zLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JZGVudGlmeSB0aGUgbW9zdCBhcHByb3ByaWF0ZSBtZXRob2QgZm9yIHRoZSBwYW5lbHMgaW4geW91ciBjb21wb3VuZCB2aWV3cyB0byByZW9yZ2FuaXplCi0gIHRoZW1zZWx2ZXMgd2hlbiBzY3JlZW4gb3JpZW50YXRpb24gY2hhbmdlcy48L3A+Ci08L2xpPgotPGxpPgotPHA+TG9vayBmb3Igb3Bwb3J0dW5pdGllcyB0byBjb25zb2xpZGF0ZSB5b3VyIHZpZXdzIGludG8gbXVsdGktcGFuZWwgY29tcG91bmQgdmlld3MuPC9wPgotPC9saT4KLTxsaT4KLTxwPk1ha2Ugc3VyZSB0aGF0IHlvdXIgc2NyZWVucyBwcm92aWRlIGZ1bmN0aW9uYWwgcGFyaXR5IGFmdGVyIHRoZSBzY3JlZW4gb3JpZW50YXRpb24KLSAgY2hhbmdlcy48L3A+Ci08L2xpPgotPC91bD4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjNlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5qZApAQCAtMCwwICsxLDExMCBAQAorcGFnZS50aXRsZT1NdWx0aS1wYW5lIExheW91dHMKK0BqZDpib2R5CisKKzxwPldoZW4gd3JpdGluZyBhbiBhcHAgZm9yIEFuZHJvaWQsIGtlZXAgaW4gbWluZCB0aGF0IEFuZHJvaWQgZGV2aWNlcyBjb21lIGluIG1hbnkgZGlmZmVyZW50IHNjcmVlbgorc2l6ZXMgYW5kIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3VyIGFwcCBjb25zaXN0ZW50bHkgcHJvdmlkZXMgYSBiYWxhbmNlZCBhbmQgYWVzdGhldGljYWxseSBwbGVhc2luZworbGF5b3V0IGJ5IGFkanVzdGluZyBpdHMgY29udGVudCB0byB2YXJ5aW5nIHNjcmVlbiBzaXplcyBhbmQgb3JpZW50YXRpb25zLjwvcD4KKzxwPjxlbT5QYW5lbHM8L2VtPiBhcmUgYSBncmVhdCB3YXkgZm9yIHlvdXIgYXBwIHRvIGFjaGlldmUgdGhpcy4gVGhleSBhbGxvdyB5b3UgdG8gY29tYmluZSBtdWx0aXBsZSB2aWV3cyBpbnRvCitvbmUgY29tcG91bmQgdmlldyB3aGVuIGEgbG90IG9mIGhvcml6b250YWwgc2NyZWVuIHJlYWwgZXN0YXRlIGlzIGF2YWlsYWJsZSBhbmQgYnkgc3BsaXR0aW5nIHRoZW0gdXAKK3doZW4gbGVzcyBzcGFjZSBpcyBhdmFpbGFibGUuPC9wPgorPGgyIGlkPSJjb21iaW5pbmctdmlld3MiPkNvbWJpbmluZyBNdWx0aXBsZSBWaWV3cyBJbnRvIE9uZTwvaDI+CisKKzxwPk9uIHNtYWxsZXIgZGV2aWNlcyB5b3VyIGNvbnRlbnQgaXMgdHlwaWNhbGx5IGRpdmlkZWQgaW50byBhIG1hc3RlciBncmlkIG9yIGxpc3QgdmlldyBhbmQgYSBkZXRhaWwKK3ZpZXcuIFRvdWNoaW5nIGFuIGl0ZW0gaW4gdGhlIG1hc3RlciB2aWV3IG9wZW5zIGEgZGlmZmVyZW50IHNjcmVlbiBzaG93aW5nIHRoYXQgaXRlbSdzIGRldGFpbAoraW5mb3JtYXRpb24uPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9tdWx0aXBhbmVfdmlld3MucG5nIj4KKworPHA+QmVjYXVzZSB0YWJsZXRzIGhhdmUgbW9yZSBzY3JlZW4gcmVhbCBlc3RhdGUgdGhhbiBwaG9uZXMsIHlvdSBjYW4gdXNlIHBhbmVscyB0byBjb21iaW5lIHRoZSByZWxhdGVkCitsaXN0IGFuZCBkZXRhaWwgdmlld3MgaW50byBhIHNpbmdsZSBjb21wb3VuZCB2aWV3LiBUaGlzIHVzZXMgdGhlIGFkZGl0aW9uYWwgc3BhY2UgbW9yZSBlZmZpY2llbnRseQorYW5kIG1ha2VzIG5hdmlnYXRpbmcgdGhlIGFwcCBlYXNpZXIuIDwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbXVsdGlwYW5lX3ZpZXdfdGFibGV0LnBuZyI+CisKKzxwPkluIGdlbmVyYWwsIHVzZSB0aGUgcGFuZSBvbiB0aGUgcmlnaHQgdG8gcHJlc2VudCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpdGVtIHlvdSBzZWxlY3RlZCBpbiB0aGUKK2xlZnQgcGFuZS4gTWFrZSBzdXJlIHRvIGtlZXAgdGhlIGl0ZW0gaW4gdGhlIGxlZnQgcGFuZSBzZWxlY3RlZCBpbiBvcmRlciB0byBlc3RhYmxpc2ggdGhlCityZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgcGFuZWxzLjwvcD4KKzxoMiBpZD0ib3JpZW50YXRpb24iPkNvbXBvdW5kIFZpZXdzIGFuZCBPcmllbnRhdGlvbiBDaGFuZ2VzPC9oMj4KKworPHA+U2NyZWVucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHJlZ2FyZGxlc3Mgb2Ygb3JpZW50YXRpb24uIElmIHlvdSB1c2UgYSBjb21wb3VuZCB2aWV3IGluCitvbmUgb3JpZW50YXRpb24sIGRvbid0IHNwbGl0IGl0IHVwIHdoZW4gdGhlIHVzZXIgcm90YXRlcyB0aGUgc2NyZWVuLiBUaGVyZSBhcmUgc2V2ZXJhbCB0ZWNobmlxdWVzCit5b3UgY2FuIHVzZSB0byBhZGp1c3QgdGhlIGxheW91dCBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2Ugd2hpbGUga2VlcGluZyBmdW5jdGlvbmFsIHBhcml0eSBpbnRhY3QuPC9wPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL211bHRpcGFuZV9zdHJldGNoLnBuZyI+CisgICAgCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPGg0PlN0cmV0Y2gvY29tcHJlc3M8L2g0PgorPHA+QWRqdXN0IHRoZSBjb2x1bW4gd2lkdGggb2YgeW91ciBsZWZ0IHBhbmUgdG8gYWNoaWV2ZSBhIGJhbGFuY2VkIGxheW91dCBpbiBib3RoIG9yaWVudGF0aW9ucy48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9tdWx0aXBhbmVfc3RhY2sucG5nIj4KKyAgICAKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+U3RhY2s8L2g0PgorPHA+UmVhcnJhbmdlIHRoZSBwYW5lbHMgb24geW91ciBzY3JlZW4gdG8gbWF0Y2ggdGhlIG9yaWVudGF0aW9uLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL211bHRpcGFuZV9leHBhbmQucG5nIj4KKyAgICAKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+RXhwYW5kL2NvbGxhcHNlPC9oND4KKzxwPldoZW4gdGhlIGRldmljZSByb3RhdGVzLCBjb2xsYXBzZSB0aGUgbGVmdCBwYW5lIHZpZXcgdG8gb25seSBzaG93IHRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbi4KK1Byb3ZpZGUgYW4gPGVtPmV4cGFuZDwvZW0+IGNvbnRyb2wgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gYnJpbmcgdGhlIGxlZnQgcGFuZSBjb250ZW50IGJhY2sgdG8gaXRzIG9yaWdpbmFsCit3aWR0aCBhbmQgdmljZSB2ZXJzYS48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9tdWx0aXBhbmVfc2hvdy5wbmciPgorICAgIAorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxoND5TaG93L2hpZGU8L2g0PgorPHA+QWZ0ZXIgcm90YXRpbmcgdGhlIGRldmljZSwgc2hvdyB0aGUgcmlnaHQgcGFuZSBpbiBmdWxsc2NyZWVuIHZpZXcuIFVzZSB0aGUgVXAgaWNvbiBpbiB0aGUgYWN0aW9uIGJhcgordG8gc2hvdyB0aGUgbGVmdCBwYW5lbCBhbmQgYWxsb3cgbmF2aWdhdGlvbiB0byBhIGRpZmZlcmVudCBlbWFpbC4gSGlkZSB0aGUgbGVmdCBwYW5lbCBieSB0b3VjaGluZwordGhlIGNvbnRlbnQgaW4gdGhlIGRldGFpbCBwYW5lbC48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGgyIGlkPSJjaGVja2xpc3QiPkNoZWNrbGlzdDwvaDI+CisKKzx1bD4KKzxsaT4KKzxwPlBsYW4gaW4gYWR2YW5jZSBvbiBob3cgeW91ciBhcHAgc2NhbGVzIHRvIGRpZmZlcmVudCBzY3JlZW4gc2l6ZXMgYW5kIHNjcmVlbiBvcmllbnRhdGlvbnMuPC9wPgorPC9saT4KKzxsaT4KKzxwPklkZW50aWZ5IHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1ldGhvZCBmb3IgdGhlIHBhbmVscyBpbiB5b3VyIGNvbXBvdW5kIHZpZXdzIHRvIHJlb3JnYW5pemUKKyAgdGhlbXNlbHZlcyB3aGVuIHNjcmVlbiBvcmllbnRhdGlvbiBjaGFuZ2VzLjwvcD4KKzwvbGk+Cis8bGk+Cis8cD5Mb29rIGZvciBvcHBvcnR1bml0aWVzIHRvIGNvbnNvbGlkYXRlIHlvdXIgdmlld3MgaW50byBtdWx0aS1wYW5lbCBjb21wb3VuZCB2aWV3cy48L3A+Cis8L2xpPgorPGxpPgorPHA+TWFrZSBzdXJlIHRoYXQgeW91ciBzY3JlZW5zIHByb3ZpZGUgZnVuY3Rpb25hbCBwYXJpdHkgYWZ0ZXIgdGhlIHNjcmVlbiBvcmllbnRhdGlvbgorICBjaGFuZ2VzLjwvcD4KKzwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4N2I1ZS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBOYXZpZ2F0aW9uIHdpdGggQmFjayBhbmQgVXAKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+TmF2aWdhdGlvbiB3aXRoIEJhY2sgYW5kIFVwPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5Db25zaXN0ZW50IG5hdmlnYXRpb24gaXMgYW4gZXNzZW50aWFsIGNvbXBvbmVudCBvZiB0aGUgb3ZlcmFsbCB1c2VyIGV4cGVyaWVuY2UuIEZldyB0aGluZ3MgZnJ1c3RyYXRlCi11c2VycyBtb3JlIHRoYW4gYmFzaWMgbmF2aWdhdGlvbiB0aGF0IGJlaGF2ZXMgaW4gaW5jb25zaXN0ZW50IGFuZCB1bmV4cGVjdGVkIHdheXMuIEFuZHJvaWQgMy4wCi1pbnRyb2R1Y2VkIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIGdsb2JhbCBuYXZpZ2F0aW9uIGJlaGF2aW9yLiBUaG91Z2h0ZnVsbHkgZm9sbG93aW5nIHRoZQotZ3VpZGVsaW5lcyBmb3IgQmFjayBhbmQgVXAgd2lsbCBtYWtlIHlvdXIgYXBwJ3MgbmF2aWdhdGlvbiBwcmVkaWN0YWJsZSBhbmQgcmVsaWFibGUgZm9yIHlvdXIgdXNlcnMuPC9wPgotPHA+QW5kcm9pZCAyLjMgYW5kIGVhcmxpZXIgcmVsaWVkIHVwb24gdGhlIHN5c3RlbSA8ZW0+QmFjazwvZW0+IGJ1dHRvbiBmb3Igc3VwcG9ydGluZyBuYXZpZ2F0aW9uIHdpdGhpbiBhbgotYXBwLiBXaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgYWN0aW9uIGJhcnMgaW4gQW5kcm9pZCAzLjAsIGEgc2Vjb25kIG5hdmlnYXRpb24gbWVjaGFuaXNtIGFwcGVhcmVkOgotdGhlIDxlbT5VcDwvZW0+IGJ1dHRvbiwgY29uc2lzdGluZyBvZiB0aGUgYXBwIGljb24gYW5kIGEgbGVmdC1wb2ludCBjYXJldC48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX3dpdGhfYmFja19hbmRfdXAucG5nIj4KLQotPGgyIGlkPSJ1cC12cy1iYWNrIj5VcCB2cy4gQmFjazwvaDI+Ci0KLTxwPlRoZSBVcCBidXR0b24gaXMgdXNlZCB0byBuYXZpZ2F0ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzCi1iZXR3ZWVuIHNjcmVlbnMuIEZvciBpbnN0YW5jZSwgaWYgc2NyZWVuIEEgZGlzcGxheXMgYSBsaXN0IG9mIGl0ZW1zLCBhbmQgc2VsZWN0aW5nIGFuIGl0ZW0gbGVhZHMgdG8KLXNjcmVlbiBCICh3aGljaCBwcmVzZW50cyB0aGF0IGl0ZW0gaW4gbW9yZSBkZXRhaWwpLCB0aGVuIHNjcmVlbiBCIHNob3VsZCBvZmZlciBhbiBVcCBidXR0b24gdGhhdAotcmV0dXJucyB0byBzY3JlZW4gQS48L3A+Ci08cD5JZiBhIHNjcmVlbiBpcyB0aGUgdG9wbW9zdCBvbmUgaW4gYW4gYXBwIChpLmUuIHRoZSBob21lIG9mIHRoZSBhcHApLCBpdCBzaG91bGQgbm90IHByZXNlbnQgYW4gVXAKLWJ1dHRvbi48L3A+Ci08cD5UaGUgc3lzdGVtIEJhY2sga2V5IGlzIHVzZWQgdG8gbmF2aWdhdGUgYmFzZWQgb24gdGhlIGhpc3Rvcnkgb2Ygc2NyZWVucyB0aGUgdXNlciBoYXMgcmVjZW50bHkgc2VlbiwKLWluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciZtZGFzaDtpbiBlZmZlY3QsIHRoZSB0ZW1wb3JhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2NyZWVucy48L3A+Ci08cD5XaGVuIHRoZSBwcmV2aW91c2x5IHZpZXdlZCBzY3JlZW4gaXMgYWxzbyB0aGUgaGllcmFyY2hpY2FsIHBhcmVudCBvZiB0aGUgY3VycmVudCBzY3JlZW4sIHByZXNzaW5nCi10aGUgQmFjayBrZXkgd2lsbCBoYXZlIHRoZSBzYW1lIHJlc3VsdCBhcyBwcmVzc2luZyBhbiBVcCBidXR0b24gLS0gdGhpcyBpcyBhIGNvbW1vbiBvY2N1cnJlbmNlLgotSG93ZXZlciwgdW5saWtlIHRoZSBVcCBidXR0b24sIHdoaWNoIGVuc3VyZXMgdGhlIHVzZXIgcmVtYWlucyB3aXRoaW4geW91ciBhcHAsIHRoZSBCYWNrIGtleSBjYW4KLXJldHVybiB0aGUgdXNlciB0byB0aGUgSG9tZSBzY3JlZW4sIG9yIGV2ZW4gdG8gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24uPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbmF2aWdhdGlvbl91cF92c19iYWNrX2dtYWlsLnBuZyI+Ci0KLTxwPlRoZSBCYWNrIGtleSBhbHNvIHN1cHBvcnRzIGEgZmV3IGJlaGF2aW9ycyBub3QgZGlyZWN0bHkgdGllZCB0byBzY3JlZW4tdG8tc2NyZWVuIG5hdmlnYXRpb246PC9wPgotPHVsPgotPGxpPkJhY2sgZGlzbWlzc2VzIGZsb2F0aW5nIHdpbmRvd3MgKGRpYWxvZ3MsIHBvcHVwcyk8L2xpPgotPGxpPkJhY2sgZGlzbWlzc2VzIGNvbnRleHR1YWwgYWN0aW9uIGJhcnMsIGFuZCByZW1vdmVzIHRoZSBoaWdobGlnaHQgZnJvbSB0aGUgc2VsZWN0ZWQgaXRlbXM8L2xpPgotPGxpPkJhY2sgaGlkZXMgdGhlIG9uc2NyZWVuIGtleWJvYXJkIChJTUUpPC9saT4KLTwvdWw+Ci08aDIgaWQ9IndpdGhpbi1hcHAiPk5hdmlnYXRpb24gV2l0aGluIFlvdXIgQXBwPC9oMj4KLQotPGg0Pk5hdmlnYXRpbmcgdG8gc2NyZWVucyB3aXRoIG11bHRpcGxlIGVudHJ5IHBvaW50czwvaDQ+Ci08cD5Tb21ldGltZXMgYSBzY3JlZW4gZG9lc24ndCBoYXZlIGEgc3RyaWN0IHBvc2l0aW9uIHdpdGhpbiB0aGUgYXBwJ3MgaGllcmFyY2h5LCBhbmQgY2FuIGJlIHJlYWNoZWQKLWZyb20gbXVsdGlwbGUgZW50cnkgcG9pbnRzJm1kYXNoO2UuZy4sIGEgc2V0dGluZ3Mgc2NyZWVuIHdoaWNoIGNhbiBiZSBuYXZpZ2F0ZWQgdG8gZnJvbSBhbnkgc2NyZWVuCi1pbiB5b3VyIGFwcC4gSW4gdGhpcyBjYXNlLCB0aGUgVXAgYnV0dG9uIHNob3VsZCBjaG9vc2UgdG8gcmV0dXJuIHRvIHRoZSByZWZlcnJpbmcgc2NyZWVuLCBiZWhhdmluZwotaWRlbnRpY2FsbHkgdG8gQmFjay48L3A+Ci08aDQ+Q2hhbmdpbmcgdmlldyB3aXRoaW4gYSBzY3JlZW48L2g0PgotPHA+Q2hhbmdpbmcgdmlldyBvcHRpb25zIGZvciBhIHNjcmVlbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIFVwIG9yIEJhY2s6IHRoZSBzY3JlZW4gaXMgc3RpbGwKLWluIHRoZSBzYW1lIHBsYWNlIHdpdGhpbiB0aGUgYXBwJ3MgaGllcmFyY2h5LCBhbmQgbm8gbmV3IG5hdmlnYXRpb24gaGlzdG9yeSBpcyBjcmVhdGVkLjwvcD4KLTxwPkV4YW1wbGVzIG9mIHN1Y2ggdmlldyBjaGFuZ2VzIGFyZTo8L3A+Ci08dWw+Ci08bGk+U3dpdGNoaW5nIHZpZXdzIHVzaW5nIHRhYnMgYW5kL29yIGxlZnQtYW5kLXJpZ2h0IHN3aXBlczwvbGk+Ci08bGk+U3dpdGNoaW5nIHZpZXdzIHVzaW5nIGEgZHJvcGRvd24gKGFrYSBjb2xsYXBzZWQgdGFicyk8L2xpPgotPGxpPkZpbHRlcmluZyBhIGxpc3Q8L2xpPgotPGxpPlNvcnRpbmcgYSBsaXN0PC9saT4KLTxsaT5DaGFuZ2luZyBkaXNwbGF5IGNoYXJhY3RlcmlzdGljcyAoZS5nLiB6b29taW5nKTwvbGk+Ci08L3VsPgotPGg0Pk5hdmlnYXRpbmcgYmV0d2VlbiBzaWJsaW5nIHNjcmVlbnM8L2g0PgotPHA+V2hlbiB5b3VyIGFwcCBzdXBwb3J0cyBuYXZpZ2F0aW9uIGZyb20gYSBsaXN0IG9mIGl0ZW1zIHRvIGEgZGV0YWlsIHZpZXcgb2Ygb25lIG9mIHRob3NlIGl0ZW1zLCBpdCdzCi1vZnRlbiBkZXNpcmFibGUgdG8gc3VwcG9ydCBkaXJlY3Rpb24gbmF2aWdhdGlvbiBmcm9tIHRoYXQgaXRlbSB0byBhbm90aGVyIG9uZSB3aGljaCBwcmVjZWRlcyBvcgotZm9sbG93cyBpdCBpbiB0aGUgbGlzdC4gRm9yIGV4YW1wbGUsIGluIEdtYWlsLCBpdCdzIGVhc3kgdG8gc3dpcGUgbGVmdCBvciByaWdodCBmcm9tIGEgY29udmVyc2F0aW9uCi10byB2aWV3IGEgbmV3ZXIgb3Igb2xkZXIgb25lIGluIHRoZSBzYW1lIEluYm94LiBKdXN0IGFzIHdoZW4gY2hhbmdpbmcgdmlldyB3aXRoaW4gYSBzY3JlZW4sIHN1Y2gKLW5hdmlnYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBiZWhhdmlvciBvZiBVcCBvciBCYWNrLjwvcD4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fYmV0d2Vlbl9zaWJsaW5nc19nbWFpbC5wbmciPgotCi08cD5Ib3dldmVyLCBhIG5vdGFibGUgZXhjZXB0aW9uIHRvIHRoaXMgb2NjdXJzIHdoZW4gYnJvd3NpbmcgYmV0d2VlbiAicmVsYXRlZCIgZGV0YWlsIHZpZXdzIG5vdCB0aWVkCi10b2dldGhlciBieSB0aGUgcmVmZXJyaW5nIGxpc3QmbWRhc2g7Zm9yIGV4YW1wbGUsIHdoZW4gYnJvd3NpbmcgaW4gdGhlIE1hcmtldCBiZXR3ZWVuIGFwcHMgZnJvbQotdGhlIHNhbWUgZGV2ZWxvcGVyLCBvciBhbGJ1bXMgYnkgdGhlIHNhbWUgYXJ0aXN0LiBJbiB0aGVzZSBjYXNlcywgZm9sbG93aW5nIGVhY2ggbGluayBkb2VzIGNyZWF0ZQotaGlzdG9yeSwgY2F1c2luZyB0aGUgQmFjayBidXR0b24gdG8gc3RlcCB0aHJvdWdoIGVhY2ggc2NyZWVuIG9mIHJlbGF0ZWQgY29udGVudCB3aGljaCBoYXMgYmVlbgotdmlld2VkLiBVcCBzaG91bGQgY29udGludWUgdG8gYnlwYXNzIHRoZXNlIHJlbGF0ZWQgc2NyZWVucyBhbmQgbmF2aWdhdGUgdG8gdGhlIG1vc3QgcmVjZW50bHkgdmlld2VkCi1jb250YWluZXIgc2NyZWVuLjwvcD4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L25hdmlnYXRpb25fYmV0d2Vlbl9zaWJsaW5nc19tYXJrZXQxLnBuZyI+Ci0KLTxwPllvdSBoYXZlIHRoZSBhYmlsaXR5IHRvIG1ha2UgdGhlIFVwIGJlaGF2aW9yIGV2ZW4gc21hcnRlciBiYXNlZCBvbiB5b3VyIGtub3dsZWRnZSBvZiBkZXRhaWwKLXZpZXcuIElmIHdlIGV4dGVuZCBvdXIgTWFya2V0IHNhbXBsZSBmcm9tIGFib3ZlLCBpbWFnaW5lIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgZnJvbSB0aGUgbGFzdCBCb29rCi12aWV3ZWQgdG8gdGhlIGRldGFpbHMgZm9yIHRoZSBNb3ZpZSBhZGFwdGF0aW9uLiBJbiB0aGF0IGNhc2UsIFVwIGNhbiByZXR1cm4gdG8gYSBjb250YWluZXIgKE1vdmllcykKLXdoaWNoIHRoZSB1c2VyIGhhZCBub3QgcHJldmlvdXNseSBuYXZpZ2F0ZWQgdGhyb3VnaC48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfbWFya2V0Mi5wbmciPgotCi08aDIgaWQ9ImZyb20tb3V0c2lkZSI+TmF2aWdhdGlvbiBGcm9tIE91dHNpZGUgWW91ciBBcHA8L2gyPgotCi08cD5UaGVyZSBhcmUgdHdvIGNhdGVnb3JpZXMgb2YgbmF2aWdhdGlvbiBmcm9tIG91dHNpZGUgeW91ciBhcHAgdG8gc2NyZWVucyBkZWVwIHdpdGhpbiB0aGUgYXBwJ3MKLWhpZXJhcmNoeTo8L3A+Ci08dWw+Ci08bGk+QXBwLXRvLWFwcCBuYXZpZ2F0aW9uLCBzdWNoIGFzIHZpYSBpbnRlbnQgY29tcGxldGlvbi48L2xpPgotPGxpPlN5c3RlbS10by1hcHAgbmF2aWdhdGlvbiwgc3VjaCBhcyB2aWEgbm90aWZpY2F0aW9ucyBhbmQgaG9tZSBzY3JlZW4gd2lkZ2V0cy48L2xpPgotPC91bD4KLTxwPkdtYWlsIHByb3ZpZGVzIGV4YW1wbGVzIG9mIGVhY2ggb2YgdGhlc2UuIEZvciBhcHAtdG8tYXBwIG5hdmlnYXRpb24sIGEgIlNoYXJlIiBpbnRlbnQgZ29lcyBkaXJlY3RseQotdG8gdGhlIGNvbXBvc2Ugc2NyZWVuLiBGb3Igc3lzdGVtLXRvLWFwcCBuYXZpZ2F0aW9uLCBib3RoIGEgbmV3IG1lc3NhZ2Ugbm90aWZpY2F0aW9uIGFuZCBhIGhvbWUKLXNjcmVlbiB3aWRnZXQgY2FuIGJ5cGFzcyB0aGUgSW5ib3ggc2NyZWVuLCB0YWtpbmcgdGhlIHVzZXIgZGlyZWN0bHkgdG8gYSBjb252ZXJzYXRpb24gdmlldy48L3A+Ci08aDQ+QXBwLXRvLWFwcCBuYXZpZ2F0aW9uPC9oND4KLTxwPldoZW4gbmF2aWdhdGluZyBkZWVwIGludG8geW91ciBhcHAncyBoaWVyYXJjaHkgZGlyZWN0bHkgZnJvbSBhbm90aGVyIGFwcCB2aWEgYW4gaW50ZW50LCBCYWNrIHdpbGwKLXJldHVybiB0byB0aGUgcmVmZXJyaW5nIGFwcC48L3A+Ci08cD5UaGUgVXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKLS0gSWYgdGhlIGRlc3RpbmF0aW9uIHNjcmVlbiBpcyB0eXBpY2FsbHkgcmVhY2hlZCBmcm9tIG9uZSBwYXJ0aWN1bGFyIHNjcmVlbiB3aXRoaW4geW91ciBhcHAsIFVwCi0gIHNob3VsZCBuYXZpZ2F0ZSB0byB0aGF0IHNjcmVlbi4KLS0gT3RoZXJ3aXNlLCBVcCBzaG91bGQgbmF2aWdhdGUgdG8gdGhlIHRvcG1vc3QgKCJIb21lIikgc2NyZWVuIG9mIHlvdXIgYXBwLjwvcD4KLTxwPkZvciBleGFtcGxlLCBhZnRlciBjaG9vc2luZyB0byBzaGFyZSBhIGJvb2sgYmVpbmcgdmlld2VkIGluIE1hcmtldCwgdGhlIHVzZXIgbmF2aWdhdGVzIGRpcmVjdGx5IHRvCi1HbWFpbCdzIGNvbXBvc2Ugc2NyZWVuLiBGcm9tIHRoZXJlLCBVcCByZXR1cm5zIHRvIHRoZSBJbmJveCAod2hpY2ggaGFwcGVucyB0byBiZSBib3RoIHRoZQotdHlwaWNhbCByZWZlcnJlciB0byBjb21wb3NlLCBhcyB3ZWxsIGFzIHRoZSB0b3Btb3N0IHNjcmVlbiBvZiB0aGUgYXBwKSwgd2hpbGUgQmFjayByZXR1cm5zIHRvCi1NYXJrZXQuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbmF2aWdhdGlvbl9mcm9tX291dHNpZGVfdXAucG5nIj4KLQotPGg0PlN5c3RlbS10by1hcHAgbmF2aWdhdGlvbjwvaDQ+Ci08cD5JZiB5b3VyIGFwcCB3YXMgcmVhY2hlZCB2aWEgdGhlIHN5c3RlbSBtZWNoYW5pc21zIG9mIG5vdGlmaWNhdGlvbnMgb3IgaG9tZSBzY3JlZW4gd2lkZ2V0cywgVXAKLWJlaGF2ZXMgYXMgZGVzY3JpYmVkIGZvciBhcHAtdG8tYXBwIG5hdmlnYXRpb24sIGFib3ZlLjwvcD4KLTxwPkZvciB0aGUgQmFjayBrZXksIHlvdSBzaG91bGQgbWFrZSBuYXZpZ2F0aW9uIG1vcmUgcHJlZGljdGFibHkgYnkgaW5zZXJ0aW5nIGludG8gdGhlIHRhc2sncyBiYWNrCi1zdGFjayB0aGUgY29tcGxldGUgdXB3YXJkIG5hdmlnYXRpb24gcGF0aCB0byB0aGUgYXBwJ3MgdG9wbW9zdCBzY3JlZW4uIFRoaXMgd2F5LCBhIHVzZXIgd2hvIGhhcwotZm9yZ290dGVuIGhvdyB0aGV5IGVudGVyZWQgeW91ciBhcHAgY2FuIHNhZmVseSBuYXZpZ2F0ZSB0byB0aGUgYXBwJ3MgdG9wbW9zdCBzY3JlZW4gYmVmb3JlIGV4aXRpbmcKLWl0LjwvcD4KLTxwPkZvciBleGFtcGxlLCBHbWFpbCdzIEhvbWUgc2NyZWVuIHdpZGdldCBoYXMgYSBidXR0b24gZm9yIGRpdmluZyBkaXJlY3RseSB0byBpdHMgY29tcG9zZSBzY3JlZW4uCi1BZnRlciBmb2xsb3dpbmcgdGhhdCBwYXRoLCB0aGUgQmFjayBrZXkgZmlyc3QgcmV0dXJucyB0byB0aGUgSW5ib3gsIGFuZCBmcm9tIHRoZXJlIGNvbnRpbnVlcyB0bwotSG9tZS48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9uYXZpZ2F0aW9uX2Zyb21fb3V0c2lkZV9iYWNrLnBuZyI+Ci0KLQotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvbmF2aWdhdGlvbi5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvbmF2aWdhdGlvbi5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzVjZDgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmpkCkBAIC0wLDAgKzEsMTE2IEBACitwYWdlLnRpdGxlPU5hdmlnYXRpb24gd2l0aCBCYWNrIGFuZCBVcAorQGpkOmJvZHkKKworPHA+Q29uc2lzdGVudCBuYXZpZ2F0aW9uIGlzIGFuIGVzc2VudGlhbCBjb21wb25lbnQgb2YgdGhlIG92ZXJhbGwgdXNlciBleHBlcmllbmNlLiBGZXcgdGhpbmdzIGZydXN0cmF0ZQordXNlcnMgbW9yZSB0aGFuIGJhc2ljIG5hdmlnYXRpb24gdGhhdCBiZWhhdmVzIGluIGluY29uc2lzdGVudCBhbmQgdW5leHBlY3RlZCB3YXlzLiBBbmRyb2lkIDMuMAoraW50cm9kdWNlZCBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgbmF2aWdhdGlvbiBiZWhhdmlvci4gVGhvdWdodGZ1bGx5IGZvbGxvd2luZyB0aGUKK2d1aWRlbGluZXMgZm9yIEJhY2sgYW5kIFVwIHdpbGwgbWFrZSB5b3VyIGFwcCdzIG5hdmlnYXRpb24gcHJlZGljdGFibGUgYW5kIHJlbGlhYmxlIGZvciB5b3VyIHVzZXJzLjwvcD4KKzxwPkFuZHJvaWQgMi4zIGFuZCBlYXJsaWVyIHJlbGllZCB1cG9uIHRoZSBzeXN0ZW0gPGVtPkJhY2s8L2VtPiBidXR0b24gZm9yIHN1cHBvcnRpbmcgbmF2aWdhdGlvbiB3aXRoaW4gYW4KK2FwcC4gV2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIGFjdGlvbiBiYXJzIGluIEFuZHJvaWQgMy4wLCBhIHNlY29uZCBuYXZpZ2F0aW9uIG1lY2hhbmlzbSBhcHBlYXJlZDoKK3RoZSA8ZW0+VXA8L2VtPiBidXR0b24sIGNvbnNpc3Rpbmcgb2YgdGhlIGFwcCBpY29uIGFuZCBhIGxlZnQtcG9pbnQgY2FyZXQuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX3dpdGhfYmFja19hbmRfdXAucG5nIj4KKworPGgyIGlkPSJ1cC12cy1iYWNrIj5VcCB2cy4gQmFjazwvaDI+CisKKzxwPlRoZSBVcCBidXR0b24gaXMgdXNlZCB0byBuYXZpZ2F0ZSB3aXRoaW4gYW4gYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIGhpZXJhcmNoaWNhbCByZWxhdGlvbnNoaXBzCitiZXR3ZWVuIHNjcmVlbnMuIEZvciBpbnN0YW5jZSwgaWYgc2NyZWVuIEEgZGlzcGxheXMgYSBsaXN0IG9mIGl0ZW1zLCBhbmQgc2VsZWN0aW5nIGFuIGl0ZW0gbGVhZHMgdG8KK3NjcmVlbiBCICh3aGljaCBwcmVzZW50cyB0aGF0IGl0ZW0gaW4gbW9yZSBkZXRhaWwpLCB0aGVuIHNjcmVlbiBCIHNob3VsZCBvZmZlciBhbiBVcCBidXR0b24gdGhhdAorcmV0dXJucyB0byBzY3JlZW4gQS48L3A+Cis8cD5JZiBhIHNjcmVlbiBpcyB0aGUgdG9wbW9zdCBvbmUgaW4gYW4gYXBwIChpLmUuIHRoZSBob21lIG9mIHRoZSBhcHApLCBpdCBzaG91bGQgbm90IHByZXNlbnQgYW4gVXAKK2J1dHRvbi48L3A+Cis8cD5UaGUgc3lzdGVtIEJhY2sga2V5IGlzIHVzZWQgdG8gbmF2aWdhdGUgYmFzZWQgb24gdGhlIGhpc3Rvcnkgb2Ygc2NyZWVucyB0aGUgdXNlciBoYXMgcmVjZW50bHkgc2VlbiwKK2luIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlciZtZGFzaDtpbiBlZmZlY3QsIHRoZSB0ZW1wb3JhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gc2NyZWVucy48L3A+Cis8cD5XaGVuIHRoZSBwcmV2aW91c2x5IHZpZXdlZCBzY3JlZW4gaXMgYWxzbyB0aGUgaGllcmFyY2hpY2FsIHBhcmVudCBvZiB0aGUgY3VycmVudCBzY3JlZW4sIHByZXNzaW5nCit0aGUgQmFjayBrZXkgd2lsbCBoYXZlIHRoZSBzYW1lIHJlc3VsdCBhcyBwcmVzc2luZyBhbiBVcCBidXR0b24gLS0gdGhpcyBpcyBhIGNvbW1vbiBvY2N1cnJlbmNlLgorSG93ZXZlciwgdW5saWtlIHRoZSBVcCBidXR0b24sIHdoaWNoIGVuc3VyZXMgdGhlIHVzZXIgcmVtYWlucyB3aXRoaW4geW91ciBhcHAsIHRoZSBCYWNrIGtleSBjYW4KK3JldHVybiB0aGUgdXNlciB0byB0aGUgSG9tZSBzY3JlZW4sIG9yIGV2ZW4gdG8gYSBkaWZmZXJlbnQgYXBwbGljYXRpb24uPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX3VwX3ZzX2JhY2tfZ21haWwucG5nIj4KKworPHA+VGhlIEJhY2sga2V5IGFsc28gc3VwcG9ydHMgYSBmZXcgYmVoYXZpb3JzIG5vdCBkaXJlY3RseSB0aWVkIHRvIHNjcmVlbi10by1zY3JlZW4gbmF2aWdhdGlvbjo8L3A+Cis8dWw+Cis8bGk+QmFjayBkaXNtaXNzZXMgZmxvYXRpbmcgd2luZG93cyAoZGlhbG9ncywgcG9wdXBzKTwvbGk+Cis8bGk+QmFjayBkaXNtaXNzZXMgY29udGV4dHVhbCBhY3Rpb24gYmFycywgYW5kIHJlbW92ZXMgdGhlIGhpZ2hsaWdodCBmcm9tIHRoZSBzZWxlY3RlZCBpdGVtczwvbGk+Cis8bGk+QmFjayBoaWRlcyB0aGUgb25zY3JlZW4ga2V5Ym9hcmQgKElNRSk8L2xpPgorPC91bD4KKzxoMiBpZD0id2l0aGluLWFwcCI+TmF2aWdhdGlvbiBXaXRoaW4gWW91ciBBcHA8L2gyPgorCis8aDQ+TmF2aWdhdGluZyB0byBzY3JlZW5zIHdpdGggbXVsdGlwbGUgZW50cnkgcG9pbnRzPC9oND4KKzxwPlNvbWV0aW1lcyBhIHNjcmVlbiBkb2Vzbid0IGhhdmUgYSBzdHJpY3QgcG9zaXRpb24gd2l0aGluIHRoZSBhcHAncyBoaWVyYXJjaHksIGFuZCBjYW4gYmUgcmVhY2hlZAorZnJvbSBtdWx0aXBsZSBlbnRyeSBwb2ludHMmbWRhc2g7ZS5nLiwgYSBzZXR0aW5ncyBzY3JlZW4gd2hpY2ggY2FuIGJlIG5hdmlnYXRlZCB0byBmcm9tIGFueSBzY3JlZW4KK2luIHlvdXIgYXBwLiBJbiB0aGlzIGNhc2UsIHRoZSBVcCBidXR0b24gc2hvdWxkIGNob29zZSB0byByZXR1cm4gdG8gdGhlIHJlZmVycmluZyBzY3JlZW4sIGJlaGF2aW5nCitpZGVudGljYWxseSB0byBCYWNrLjwvcD4KKzxoND5DaGFuZ2luZyB2aWV3IHdpdGhpbiBhIHNjcmVlbjwvaDQ+Cis8cD5DaGFuZ2luZyB2aWV3IG9wdGlvbnMgZm9yIGEgc2NyZWVuIGRvZXMgbm90IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgVXAgb3IgQmFjazogdGhlIHNjcmVlbiBpcyBzdGlsbAoraW4gdGhlIHNhbWUgcGxhY2Ugd2l0aGluIHRoZSBhcHAncyBoaWVyYXJjaHksIGFuZCBubyBuZXcgbmF2aWdhdGlvbiBoaXN0b3J5IGlzIGNyZWF0ZWQuPC9wPgorPHA+RXhhbXBsZXMgb2Ygc3VjaCB2aWV3IGNoYW5nZXMgYXJlOjwvcD4KKzx1bD4KKzxsaT5Td2l0Y2hpbmcgdmlld3MgdXNpbmcgdGFicyBhbmQvb3IgbGVmdC1hbmQtcmlnaHQgc3dpcGVzPC9saT4KKzxsaT5Td2l0Y2hpbmcgdmlld3MgdXNpbmcgYSBkcm9wZG93biAoYWthIGNvbGxhcHNlZCB0YWJzKTwvbGk+Cis8bGk+RmlsdGVyaW5nIGEgbGlzdDwvbGk+Cis8bGk+U29ydGluZyBhIGxpc3Q8L2xpPgorPGxpPkNoYW5naW5nIGRpc3BsYXkgY2hhcmFjdGVyaXN0aWNzIChlLmcuIHpvb21pbmcpPC9saT4KKzwvdWw+Cis8aDQ+TmF2aWdhdGluZyBiZXR3ZWVuIHNpYmxpbmcgc2NyZWVuczwvaDQ+Cis8cD5XaGVuIHlvdXIgYXBwIHN1cHBvcnRzIG5hdmlnYXRpb24gZnJvbSBhIGxpc3Qgb2YgaXRlbXMgdG8gYSBkZXRhaWwgdmlldyBvZiBvbmUgb2YgdGhvc2UgaXRlbXMsIGl0J3MKK29mdGVuIGRlc2lyYWJsZSB0byBzdXBwb3J0IGRpcmVjdGlvbiBuYXZpZ2F0aW9uIGZyb20gdGhhdCBpdGVtIHRvIGFub3RoZXIgb25lIHdoaWNoIHByZWNlZGVzIG9yCitmb2xsb3dzIGl0IGluIHRoZSBsaXN0LiBGb3IgZXhhbXBsZSwgaW4gR21haWwsIGl0J3MgZWFzeSB0byBzd2lwZSBsZWZ0IG9yIHJpZ2h0IGZyb20gYSBjb252ZXJzYXRpb24KK3RvIHZpZXcgYSBuZXdlciBvciBvbGRlciBvbmUgaW4gdGhlIHNhbWUgSW5ib3guIEp1c3QgYXMgd2hlbiBjaGFuZ2luZyB2aWV3IHdpdGhpbiBhIHNjcmVlbiwgc3VjaAorbmF2aWdhdGlvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIFVwIG9yIEJhY2suPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfZ21haWwucG5nIj4KKworPHA+SG93ZXZlciwgYSBub3RhYmxlIGV4Y2VwdGlvbiB0byB0aGlzIG9jY3VycyB3aGVuIGJyb3dzaW5nIGJldHdlZW4gInJlbGF0ZWQiIGRldGFpbCB2aWV3cyBub3QgdGllZAordG9nZXRoZXIgYnkgdGhlIHJlZmVycmluZyBsaXN0Jm1kYXNoO2ZvciBleGFtcGxlLCB3aGVuIGJyb3dzaW5nIG9uIEdvb2dsZSBQbGF5IGJldHdlZW4gYXBwcyBmcm9tCit0aGUgc2FtZSBkZXZlbG9wZXIsIG9yIGFsYnVtcyBieSB0aGUgc2FtZSBhcnRpc3QuIEluIHRoZXNlIGNhc2VzLCBmb2xsb3dpbmcgZWFjaCBsaW5rIGRvZXMgY3JlYXRlCitoaXN0b3J5LCBjYXVzaW5nIHRoZSBCYWNrIGJ1dHRvbiB0byBzdGVwIHRocm91Z2ggZWFjaCBzY3JlZW4gb2YgcmVsYXRlZCBjb250ZW50IHdoaWNoIGhhcyBiZWVuCit2aWV3ZWQuIFVwIHNob3VsZCBjb250aW51ZSB0byBieXBhc3MgdGhlc2UgcmVsYXRlZCBzY3JlZW5zIGFuZCBuYXZpZ2F0ZSB0byB0aGUgbW9zdCByZWNlbnRseSB2aWV3ZWQKK2NvbnRhaW5lciBzY3JlZW4uPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2JldHdlZW5fc2libGluZ3NfbWFya2V0MS5wbmciPgorCis8cD5Zb3UgaGF2ZSB0aGUgYWJpbGl0eSB0byBtYWtlIHRoZSBVcCBiZWhhdmlvciBldmVuIHNtYXJ0ZXIgYmFzZWQgb24geW91ciBrbm93bGVkZ2Ugb2YgZGV0YWlsCit2aWV3LiBJZiB3ZSBleHRlbmQgb3VyIEdvb2dsZSBQbGF5IHNhbXBsZSBmcm9tIGFib3ZlLCBpbWFnaW5lIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWQgZnJvbSB0aGUgbGFzdCBCb29rCit2aWV3ZWQgdG8gdGhlIGRldGFpbHMgZm9yIHRoZSBNb3ZpZSBhZGFwdGF0aW9uLiBJbiB0aGF0IGNhc2UsIFVwIGNhbiByZXR1cm4gdG8gYSBjb250YWluZXIgKE1vdmllcykKK3doaWNoIHRoZSB1c2VyIGhhZCBub3QgcHJldmlvdXNseSBuYXZpZ2F0ZWQgdGhyb3VnaC48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL25hdmlnYXRpb25fYmV0d2Vlbl9zaWJsaW5nc19tYXJrZXQyLnBuZyI+CisKKzxoMiBpZD0iZnJvbS1vdXRzaWRlIj5OYXZpZ2F0aW9uIEZyb20gT3V0c2lkZSBZb3VyIEFwcDwvaDI+CisKKzxwPlRoZXJlIGFyZSB0d28gY2F0ZWdvcmllcyBvZiBuYXZpZ2F0aW9uIGZyb20gb3V0c2lkZSB5b3VyIGFwcCB0byBzY3JlZW5zIGRlZXAgd2l0aGluIHRoZSBhcHAncworaGllcmFyY2h5OjwvcD4KKzx1bD4KKzxsaT5BcHAtdG8tYXBwIG5hdmlnYXRpb24sIHN1Y2ggYXMgdmlhIGludGVudCBjb21wbGV0aW9uLjwvbGk+Cis8bGk+U3lzdGVtLXRvLWFwcCBuYXZpZ2F0aW9uLCBzdWNoIGFzIHZpYSBub3RpZmljYXRpb25zIGFuZCBob21lIHNjcmVlbiB3aWRnZXRzLjwvbGk+Cis8L3VsPgorPHA+R21haWwgcHJvdmlkZXMgZXhhbXBsZXMgb2YgZWFjaCBvZiB0aGVzZS4gRm9yIGFwcC10by1hcHAgbmF2aWdhdGlvbiwgYSAiU2hhcmUiIGludGVudCBnb2VzIGRpcmVjdGx5Cit0byB0aGUgY29tcG9zZSBzY3JlZW4uIEZvciBzeXN0ZW0tdG8tYXBwIG5hdmlnYXRpb24sIGJvdGggYSBuZXcgbWVzc2FnZSBub3RpZmljYXRpb24gYW5kIGEgaG9tZQorc2NyZWVuIHdpZGdldCBjYW4gYnlwYXNzIHRoZSBJbmJveCBzY3JlZW4sIHRha2luZyB0aGUgdXNlciBkaXJlY3RseSB0byBhIGNvbnZlcnNhdGlvbiB2aWV3LjwvcD4KKzxoND5BcHAtdG8tYXBwIG5hdmlnYXRpb248L2g0PgorPHA+V2hlbiBuYXZpZ2F0aW5nIGRlZXAgaW50byB5b3VyIGFwcCdzIGhpZXJhcmNoeSBkaXJlY3RseSBmcm9tIGFub3RoZXIgYXBwIHZpYSBhbiBpbnRlbnQsIEJhY2sgd2lsbAorcmV0dXJuIHRvIHRoZSByZWZlcnJpbmcgYXBwLjwvcD4KKzxwPlRoZSBVcCBidXR0b24gaXMgaGFuZGxlZCBhcyBmb2xsb3dzOgorLSBJZiB0aGUgZGVzdGluYXRpb24gc2NyZWVuIGlzIHR5cGljYWxseSByZWFjaGVkIGZyb20gb25lIHBhcnRpY3VsYXIgc2NyZWVuIHdpdGhpbiB5b3VyIGFwcCwgVXAKKyAgc2hvdWxkIG5hdmlnYXRlIHRvIHRoYXQgc2NyZWVuLgorLSBPdGhlcndpc2UsIFVwIHNob3VsZCBuYXZpZ2F0ZSB0byB0aGUgdG9wbW9zdCAoIkhvbWUiKSBzY3JlZW4gb2YgeW91ciBhcHAuPC9wPgorPHA+Rm9yIGV4YW1wbGUsIGFmdGVyIGNob29zaW5nIHRvIHNoYXJlIGEgYm9vayBiZWluZyB2aWV3ZWQgb24gR29vZ2xlIFBsYXksIHRoZSB1c2VyIG5hdmlnYXRlcyBkaXJlY3RseSB0bworR21haWwncyBjb21wb3NlIHNjcmVlbi4gRnJvbSB0aGVyZSwgVXAgcmV0dXJucyB0byB0aGUgSW5ib3ggKHdoaWNoIGhhcHBlbnMgdG8gYmUgYm90aCB0aGUKK3R5cGljYWwgcmVmZXJyZXIgdG8gY29tcG9zZSwgYXMgd2VsbCBhcyB0aGUgdG9wbW9zdCBzY3JlZW4gb2YgdGhlIGFwcCksIHdoaWxlIEJhY2sgcmV0dXJucyB0bworR29vZ2xlIFBsYXkuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9uYXZpZ2F0aW9uX2Zyb21fb3V0c2lkZV91cC5wbmciPgorCis8aDQ+U3lzdGVtLXRvLWFwcCBuYXZpZ2F0aW9uPC9oND4KKzxwPklmIHlvdXIgYXBwIHdhcyByZWFjaGVkIHZpYSB0aGUgc3lzdGVtIG1lY2hhbmlzbXMgb2Ygbm90aWZpY2F0aW9ucyBvciBob21lIHNjcmVlbiB3aWRnZXRzLCBVcAorYmVoYXZlcyBhcyBkZXNjcmliZWQgZm9yIGFwcC10by1hcHAgbmF2aWdhdGlvbiwgYWJvdmUuPC9wPgorPHA+Rm9yIHRoZSBCYWNrIGtleSwgeW91IHNob3VsZCBtYWtlIG5hdmlnYXRpb24gbW9yZSBwcmVkaWN0YWJseSBieSBpbnNlcnRpbmcgaW50byB0aGUgdGFzaydzIGJhY2sKK3N0YWNrIHRoZSBjb21wbGV0ZSB1cHdhcmQgbmF2aWdhdGlvbiBwYXRoIHRvIHRoZSBhcHAncyB0b3Btb3N0IHNjcmVlbi4gVGhpcyB3YXksIGEgdXNlciB3aG8gaGFzCitmb3Jnb3R0ZW4gaG93IHRoZXkgZW50ZXJlZCB5b3VyIGFwcCBjYW4gc2FmZWx5IG5hdmlnYXRlIHRvIHRoZSBhcHAncyB0b3Btb3N0IHNjcmVlbiBiZWZvcmUgZXhpdGluZworaXQuPC9wPgorPHA+Rm9yIGV4YW1wbGUsIEdtYWlsJ3MgSG9tZSBzY3JlZW4gd2lkZ2V0IGhhcyBhIGJ1dHRvbiBmb3IgZGl2aW5nIGRpcmVjdGx5IHRvIGl0cyBjb21wb3NlIHNjcmVlbi4KK0FmdGVyIGZvbGxvd2luZyB0aGF0IHBhdGgsIHRoZSBCYWNrIGtleSBmaXJzdCByZXR1cm5zIHRvIHRoZSBJbmJveCwgYW5kIGZyb20gdGhlcmUgY29udGludWVzIHRvCitIb21lLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbmF2aWdhdGlvbl9mcm9tX291dHNpZGVfYmFjay5wbmciPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9uZXctNC0wLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25ldy00LTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyY2JjMi4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25ldy00LTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBOZXcgaW4gQW5kcm9pZCA0LjAKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+TmV3IGluIEFuZHJvaWQgNC4wPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0Pk5hdmlnYXRpb24gYmFyPC9oND4KLTxwPkFuZHJvaWQgNC4wIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRyYWRpdGlvbmFsIGhhcmR3YXJlIGtleXMgb24gcGhvbmVzIGJ5IHJlcGxhY2luZyB0aGVtIHdpdGggYQotdmlydHVhbCBuYXZpZ2F0aW9uIGJhciB0aGF0IGhvdXNlcyB0aGUgQmFjaywgSG9tZSBhbmQgUmVjZW50cyBidXR0b25zLiBSZWFkIHRoZQotPGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPiBwYXR0ZXJuIHRvIGxlYXJuIGhvdyB0aGUgT1MgYWRhcHRzIHRvCi1waG9uZXMgd2l0aCBoYXJkd2FyZSBidXR0b25zIGFuZCBob3cgcHJlLUFuZHJvaWQgMy4wIGFwcHMgdGhhdCByZWx5IG9uIG1lbnUga2V5cyBhcmUgc3VwcG9ydGVkLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvd2hhdHNfbmV3X25hdl9iYXIucG5nIj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5BY3Rpb24gYmFyPC9oND4KLTxwPlRoZSBhY3Rpb24gYmFyIGlzIHRoZSBtb3N0IGltcG9ydGFudCBzdHJ1Y3R1cmFsIGVsZW1lbnQgb2YgYW4gQW5kcm9pZCBhcHAuIEl0IHByb3ZpZGVzIGNvbnNpc3RlbnQKLW5hdmlnYXRpb24gYWNyb3NzIHRoZSBwbGF0Zm9ybSBhbmQgYWxsb3dzIHlvdXIgYXBwIHRvIHN1cmZhY2UgYWN0aW9ucy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3doYXRzX25ld19hY3Rpb25fYmFyLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+TXVsdGktcGFuZSBsYXlvdXRzPC9oND4KLTxwPkNyZWF0aW5nIGFwcHMgdGhhdCBzY2FsZSB3ZWxsIGFjcm9zcyBkaWZmZXJlbnQgZm9ybSBmYWN0b3JzIGFuZCBzY3JlZW4gc2l6ZXMgaXMgaW1wb3J0YW50IGluIHRoZQotQW5kcm9pZCB3b3JsZC4gTXVsdGktcGFuZSBsYXlvdXRzIGFsbG93IHlvdSB0byBjb21iaW5lIGRpZmZlcmVudCBhY3Rpdml0aWVzIHRoYXQgc2hvdyBzZXBhcmF0ZWx5IG9uCi1zbWFsbGVyIGRldmljZXMgaW50byByaWNoZXIgY29tcG91bmQgdmlld3MgZm9yIHRhYmxldHMuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC93aGF0c19uZXdfbXVsdGlwYW5lbC5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPGg0PlNlbGVjdGlvbjwvaDQ+Ci08cD5UaGUgbG9uZyBwcmVzcyBnZXN0dXJlIHdoaWNoIHdhcyB0cmFkaXRpb25hbGx5IHVzZWQgdG8gc2hvdyBjb250ZXh0dWFsIGFjdGlvbnMgZm9yIG9iamVjdHMgaXMgbm93Ci11c2VkIGZvciBkYXRhIHNlbGVjdGlvbi4gV2hlbiBzZWxlY3RpbmcgZGF0YSwgY29udGV4dHVhbCBhY3Rpb24gYmFycyBhbGxvdyB5b3UgdG8gc3VyZmFjZSBhY3Rpb25zLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvd2hhdHNfbmV3X211bHRpc2VsZWN0LnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25ldy00LTAuamQgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25ldy00LTAuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlYmJhNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvbmV3LTQtMC5qZApAQCAtMCwwICsxLDcxIEBACitwYWdlLnRpdGxlPU5ldyBpbiBBbmRyb2lkIDQuMAorQGpkOmJvZHkKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxoND5OYXZpZ2F0aW9uIGJhcjwvaDQ+Cis8cD5BbmRyb2lkIDQuMCByZW1vdmVzIHRoZSBuZWVkIGZvciB0cmFkaXRpb25hbCBoYXJkd2FyZSBrZXlzIG9uIHBob25lcyBieSByZXBsYWNpbmcgdGhlbSB3aXRoIGEKK3ZpcnR1YWwgbmF2aWdhdGlvbiBiYXIgdGhhdCBob3VzZXMgdGhlIEJhY2ssIEhvbWUgYW5kIFJlY2VudHMgYnV0dG9ucy4gUmVhZCB0aGUKKzxhIGhyZWY9IntAZG9jUm9vdH1kZXNpZ24vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPiBwYXR0ZXJuIHRvIGxlYXJuIGhvdyB0aGUgT1MgYWRhcHRzIHRvCitwaG9uZXMgd2l0aCBoYXJkd2FyZSBidXR0b25zIGFuZCBob3cgcHJlLUFuZHJvaWQgMy4wIGFwcHMgdGhhdCByZWx5IG9uIG1lbnUga2V5cyBhcmUgc3VwcG9ydGVkLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS93aGF0c19uZXdfbmF2X2Jhci5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0PkFjdGlvbiBiYXI8L2g0PgorPHA+VGhlIGFjdGlvbiBiYXIgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHN0cnVjdHVyYWwgZWxlbWVudCBvZiBhbiBBbmRyb2lkIGFwcC4gSXQgcHJvdmlkZXMgY29uc2lzdGVudAorbmF2aWdhdGlvbiBhY3Jvc3MgdGhlIHBsYXRmb3JtIGFuZCBhbGxvd3MgeW91ciBhcHAgdG8gc3VyZmFjZSBhY3Rpb25zLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS93aGF0c19uZXdfYWN0aW9uX2Jhci5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0Pk11bHRpLXBhbmUgbGF5b3V0czwvaDQ+Cis8cD5DcmVhdGluZyBhcHBzIHRoYXQgc2NhbGUgd2VsbCBhY3Jvc3MgZGlmZmVyZW50IGZvcm0gZmFjdG9ycyBhbmQgc2NyZWVuIHNpemVzIGlzIGltcG9ydGFudCBpbiB0aGUKK0FuZHJvaWQgd29ybGQuIE11bHRpLXBhbmUgbGF5b3V0cyBhbGxvdyB5b3UgdG8gY29tYmluZSBkaWZmZXJlbnQgYWN0aXZpdGllcyB0aGF0IHNob3cgc2VwYXJhdGVseSBvbgorc21hbGxlciBkZXZpY2VzIGludG8gcmljaGVyIGNvbXBvdW5kIHZpZXdzIGZvciB0YWJsZXRzLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS93aGF0c19uZXdfbXVsdGlwYW5lbC5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPGg0PlNlbGVjdGlvbjwvaDQ+Cis8cD5UaGUgbG9uZyBwcmVzcyBnZXN0dXJlIHdoaWNoIHdhcyB0cmFkaXRpb25hbGx5IHVzZWQgdG8gc2hvdyBjb250ZXh0dWFsIGFjdGlvbnMgZm9yIG9iamVjdHMgaXMgbm93Cit1c2VkIGZvciBkYXRhIHNlbGVjdGlvbi4gV2hlbiBzZWxlY3RpbmcgZGF0YSwgY29udGV4dHVhbCBhY3Rpb24gYmFycyBhbGxvdyB5b3UgdG8gc3VyZmFjZSBhY3Rpb25zLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS93aGF0c19uZXdfbXVsdGlzZWxlY3QucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlhZjQxOC4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBOb3RpZmljYXRpb25zCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPk5vdGlmaWNhdGlvbnM8L2gyPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotCi0gICAgICAgICAgCi0KLTxwPlRoZSBub3RpZmljYXRpb24gc3lzdGVtIGFsbG93cyB5b3VyIGFwcCB0byBrZWVwIHRoZSB1c2VyIGluZm9ybWVkIGFib3V0IGltcG9ydGFudCBldmVudHMsIHN1Y2ggYXMKLW5ldyBtZXNzYWdlcyBpbiBhIGNoYXQgYXBwIG9yIGEgY2FsZW5kYXIgZXZlbnQuPC9wPgotPHA+VG8gY3JlYXRlIGFuIGFwcCB0aGF0IGZlZWxzIHN0cmVhbWxpbmVkLCBwbGVhc2FudCwgYW5kIHJlc3BlY3RmdWwsIGl0IGlzIGltcG9ydGFudCB0byBkZXNpZ24geW91cgotbm90aWZpY2F0aW9ucyBjYXJlZnVsbHkuIE5vdGlmaWNhdGlvbnMgZW1ib2R5IHlvdXIgYXBwJ3Mgdm9pY2UsIGFuZCBjb250cmlidXRlIHRvIHlvdXIgYXBwJ3MKLXBlcnNvbmFsaXR5LiBVbndhbnRlZCBvciB1bmltcG9ydGFudCBub3RpZmljYXRpb25zIGNhbiBhbm5veSB0aGUgdXNlciwgc28gdXNlIHRoZW0ganVkaWNpb3VzbHkuPC9wPgotPGg0PldoZW4gdG8gZGlzcGxheSBhIG5vdGlmaWNhdGlvbjwvaDQ+Ci08cD5UbyBjcmVhdGUgYW4gYXBwbGljYXRpb24gdGhhdCBwZW9wbGUgbG92ZSwgaXQncyBpbXBvcnRhbnQgdG8gcmVjb2duaXplIHRoYXQgdGhlIHVzZXIncyBhdHRlbnRpb24gYW5kCi1mb2N1cyBpcyBhIHJlc291cmNlIHRoYXQgbXVzdCBiZSBwcm90ZWN0ZWQuIFRvIHVzZSBhbiBhbmFsb2d5IHRoYXQgbWlnaHQgcmVzb25hdGUgd2l0aCBzb2Z0d2FyZQotZGV2ZWxvcGVycywgdGhlIHVzZXIgaXMgbm90IGEgbWV0aG9kIHRoYXQgY2FuIGJlIGludm9rZWQgdG8gcmV0dXJuIGEgdmFsdWUuICBUaGUgdXNlcidzIGZvY3VzIGlzIGEKLXJlc291cmNlIG1vcmUgYWtpbiB0byBhIHRocmVhZCwgYW5kIGNyZWF0aW5nIGEgbm90aWZpY2F0aW9uIG1vbWVudGFyaWx5IGJsb2NrcyB0aGUgdXNlciB0aHJlYWQgYXMKLXRoZXkgcHJvY2VzcyBhbmQgdGhlbiBkaXNtaXNzIHRoZSBpbnRlcnJ1cHRpdmUgbm90aWZpY2F0aW9uLjwvcD4KLTxwPkFuZHJvaWQncyBub3RpZmljYXRpb24gc3lzdGVtIGhhcyBiZWVuIGRlc2lnbmVkIHRvIHF1aWNrbHkgaW5mb3JtIHVzZXJzIG9mIGV2ZW50cyB3aGlsZSB0aGV5IGZvY3VzCi1vbiBhIHRhc2ssIGJ1dCBpdCBpcyBub25ldGhlbGVzcyBzdGlsbCBpbXBvcnRhbnQgdG8gYmUgY29uc2NpZW50aW91cyB3aGVuIGRlY2lkaW5nIHRvIGNyZWF0ZSBhCi1ub3RpZmljYXRpb24uPC9wPgotPHA+V2hpbGUgd2VsbCBiZWhhdmVkIGFwcHMgZ2VuZXJhbGx5IG9ubHkgc3BlYWsgd2hlbiBzcG9rZW4gdG8sIHRoZXJlIGFyZSBzb21lIGxpbWl0ZWQgY2FzZXMgd2hlcmUgYW4KLWFwcCBhY3R1YWxseSBzaG91bGQgaW50ZXJydXB0IHRoZSB1c2VyIHdpdGggYW4gdW5wcm9tcHRlZCBub3RpZmljYXRpb24uPC9wPgotPHA+Tm90aWZpY2F0aW9ucyBzaG91bGQgYmUgdXNlZCBwcmltYXJpbHkgZm9yIDxzdHJvbmc+dGltZSBzZW5zaXRpdmUgZXZlbnRzPC9zdHJvbmc+LCBhbmQgZXNwZWNpYWxseSBpZiB0aGVzZQotc3luY2hyb25vdXMgZXZlbnRzIDxzdHJvbmc+aW52b2x2ZSBvdGhlciBwZW9wbGU8L3N0cm9uZz4uIEZvciBpbnN0YW5jZSwgYW4gaW5jb21pbmcgY2hhdCBpcyBhIHJlYWwgdGltZSBhbmQKLXN5bmNocm9ub3VzIGZvcm0gb2YgY29tbXVuaWNhdGlvbjogdGhlcmUgaXMgYW5vdGhlciB1c2VyIGFjdGl2ZWx5IHdhaXRpbmcgb24geW91IHRvIHJlc3BvbmQuCi1DYWxlbmRhciBldmVudHMgYXJlIGFub3RoZXIgZ29vZCBleGFtcGxlIG9mIHdoZW4gdG8gdXNlIGEgbm90aWZpY2F0aW9uIGFuZCBncmFiIHRoZSB1c2VyJ3MKLWF0dGVudGlvbiwgYmVjYXVzZSB0aGUgZXZlbnQgaXMgaW1taW5lbnQsIGFuZCBjYWxlbmRhciBldmVudHMgb2Z0ZW4gaW52b2x2ZSBvdGhlciBwZW9wbGUuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3JlYWxfdGltZV9wZW9wbGUucG5nIj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi08aDQ+V2hlbiBub3QgdG8gZGlzcGxheSBhIG5vdGlmaWNhdGlvbjwvaDQ+Ci08cD5UaGVyZSBhcmUgaG93ZXZlciBtYW55IG90aGVyIGNhc2VzIHdoZXJlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIG5vdCBiZSB1c2VkOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkRvbid0IG5vdGlmeSB0aGUgdXNlciBvZiBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBkaXJlY3RlZCBzcGVjaWZpY2FsbHkgYXQgdGhlbSwgb3IgaW5mb3JtYXRpb24KLXRoYXQgaXMgbm90IHRydWx5IHRpbWUgc2Vuc2l0aXZlLiAgRm9yIGluc3RhbmNlIHRoZSBhc3luY2hyb25vdXMgYW5kIHVuZGlyZWN0ZWQgdXBkYXRlcyBmbG93aW5nCi10aHJvdWdoIGEgc29jaWFsIG5ldHdvcmsgZG8gbm90IHdhcnJhbnQgYSByZWFsIHRpbWUgaW50ZXJydXB0aW9uLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Eb24ndCBjcmVhdGUgYSBub3RpZmljYXRpb24gaWYgdGhlIHJlbGV2YW50IG5ldyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgb24gc2NyZWVuLiBJbnN0ZWFkLCB1c2UKLXRoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24gaXRzZWxmIHRvIG5vdGlmeSB0aGUgdXNlciBvZiBuZXcgaW5mb3JtYXRpb24gZGlyZWN0bHkgaW4gY29udGV4dC4gRm9yCi1pbnN0YW5jZSwgYSBjaGF0IGFwcGxpY2F0aW9uIHNob3VsZCBub3QgY3JlYXRlIHN5c3RlbSBub3RpZmljYXRpb25zIHdoaWxlIHRoZSB1c2VyIGlzIGFjdGl2ZWx5Ci1jaGF0dGluZyB3aXRoIGFub3RoZXIgdXNlci48L3A+Ci08L2xpPgotPGxpPgotPHA+RG9uJ3QgaW50ZXJydXB0IHRoZSB1c2VyIGZvciBsb3cgbGV2ZWwgdGVjaG5pY2FsIG9wZXJhdGlvbnMsIGxpa2Ugc2F2aW5nIG9yIHN5bmNpbmcgaW5mb3JtYXRpb24sCi1vciB1cGRhdGluZyBhbiBhcHBsaWNhdGlvbiwgaWYgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBzeXN0ZW0gdG8gc2ltcGx5IHRha2UgY2FyZSBvZiBpdHNlbGYgd2l0aG91dAotaW52b2x2aW5nIHRoZSB1c2VyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Eb24ndCBpbnRlcnJ1cHQgdGhlIHVzZXIgdG8gaW5mb3JtIHRoZW0gb2YgYW4gZXJyb3IgaWYgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBhcHBsaWNhdGlvbiB0bwotcXVpY2tseSByZWNvdmVyIGZyb20gdGhlIGVycm9yIG9uIGl0cyBvd24gd2l0aG91dCB0aGUgdXNlciB0YWtpbmcgYW55IGFjdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+RG9uJ3QgdXNlIG5vdGlmaWNhdGlvbnMgZm9yIHNlcnZpY2VzIHRoYXQgdGhlIHVzZXIgY2Fubm90IG1hbnVhbGx5IHN0YXJ0IG9yIHN0b3AuPC9wPgotPC9saT4KLTxsaT4KLTxwPkRvbid0IGNyZWF0ZSBzdXBlcmZsdW91cyBub3RpZmljYXRpb25zIGp1c3QgdG8gZ2V0IHlvdXIgYnJhbmQgaW4gZnJvbnQgb2YgdXNlcnMuIFN1Y2gKLW5vdGlmaWNhdGlvbnMgd2lsbCBvbmx5IGZydXN0cmF0ZSBhbmQgbGlrZWx5IGFsaWVuYXRlIHlvdXIgYXVkaWVuY2UuIFRoZSBiZXN0IHdheSB0byBwcm92aWRlIHRoZQotdXNlciB3aXRoIGEgc21hbGwgYW1vdW50IG9mIHVwZGF0ZWQgaW5mb3JtYXRpb24gYW5kIHRvIGtlZXAgdGhlbSBlbmdhZ2VkIHdpdGggeW91ciBhcHBsaWNhdGlvbiBpcyB0bwotZGV2ZWxvcCBhIHdpZGdldCB0aGF0IHRoZXkgY2FuIGNob29zZSB0byBwbGFjZSBvbiB0aGVpciBob21lIHNjcmVlbi48L3A+Ci08L2xpPgotPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3NvY2lhbF9mYWlsLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGgyIGlkPSJkZXNpZ24tZ3VpZGVsaW5lcyI+RGVzaWduIEd1aWRlbGluZXM8L2gyPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fYW5hdG9teS5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0Pk1ha2UgaXQgcGVyc29uYWw8L2g0PgotPHA+Rm9yIG5vdGlmaWNhdGlvbnMgb2YgaXRlbXMgc2VudCBieSBhbm90aGVyIHVzZXIgKHN1Y2ggYXMgYSBtZXNzYWdlIG9yIHN0YXR1cyB1cGRhdGUpLCBpbmNsdWRlIHRoYXQKLXBlcnNvbidzIGltYWdlLjwvcD4KLTxwPlJlbWVtYmVyIHRvIGluY2x1ZGUgdGhlIGFwcCBpY29uIGFzIGEgc2Vjb25kYXJ5IGljb24gaW4gdGhlIG5vdGlmaWNhdGlvbiwgc28gdGhhdCB0aGUgdXNlciBjYW4KLXN0aWxsIGlkZW50aWZ5IHdoaWNoIGFwcCBwb3N0ZWQgaXQuPC9wPiAgICAKLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDQ+TmF2aWdhdGUgdG8gdGhlIHJpZ2h0IHBsYWNlPC9oND4KLTxwPldoZW4gdGhlIHVzZXIgdG91Y2hlcyBhIG5vdGlmaWNhdGlvbiwgYmUgb3BlbiB5b3VyIGFwcCB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIHVzZXIgY2FuIGNvbnN1bWUgYW5kCi1hY3QgdXBvbiB0aGUgZGF0YSByZWZlcmVuY2VkIGluIHRoZSBub3RpZmljYXRpb24uIEluIG1vc3QgY2FzZXMgdGhpcyB3aWxsIGJlIHRoZSBkZXRhaWwgdmlldyBvZiBhCi1zaW5nbGUgZGF0YSBpdGVtIChlLmcuIGEgbWVzc2FnZSksIGJ1dCBpdCBtaWdodCBhbHNvIGJlIGEgc3VtbWFyeSB2aWV3IGlmIHRoZSBub3RpZmljYXRpb24gaXMKLXN0YWNrZWQgKHNlZSA8ZW0+U3RhY2tlZCBub3RpZmljYXRpb25zPC9lbT4gYmVsb3cpIGFuZCByZWZlcmVuY2VzIG11bHRpcGxlIGl0ZW1zLiBJZiBpbiBhbnkgb2YgdGhvc2UgY2FzZXMKLXRoZSB1c2VyIGlzIHRha2VuIHRvIGEgaGllcmFyY2h5IGxldmVsIGJlbG93IHlvdXIgYXBwJ3MgdG9wLWxldmVsLCBpbnNlcnQgbmF2aWdhdGlvbiBpbnRvIHlvdXIgYXBwJ3MKLWJhY2sgc3RhY2sgdG8gYWxsb3cgdGhlbSB0byBuYXZpZ2F0ZSB0byB5b3VyIGFwcCdzIHRvcCBsZXZlbCB1c2luZyB0aGUgc3lzdGVtIGJhY2sga2V5LiBGb3IgbW9yZQotaW5mb3JtYXRpb24sIHNlZSB0aGUgY2hhcHRlciBvbiA8ZW0+U3lzdGVtLXRvLWFwcCBuYXZpZ2F0aW9uPC9lbT4gaW4gdGhlCi08YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+IGRlc2lnbiBwYXR0ZXJuLjwvcD4KLTxoND5UaW1lc3RhbXBzIGZvciB0aW1lIHNlbnNpdGl2ZSBldmVudHM8L2g0PgotPHA+QnkgZGVmYXVsdCwgc3RhbmRhcmQgQW5kcm9pZCBub3RpZmljYXRpb25zIGluY2x1ZGUgYSB0aW1lc3RhbXAgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gQ29uc2lkZXIKLXdoZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyB2YWx1YWJsZSBpbiB0aGUgY29udGV4dCBvZiB5b3VyIG5vdGlmaWNhdGlvbi4gSWYgdGhlIHRpbWVzdGFtcCBpcyBub3QKLXZhbHVhYmxlLCBjb25zaWRlciBpZiB0aGUgZXZlbnQgaXMgaW1wb3J0YW50IGVub3VnaCB0byB3YXJyYW50IGdyYWJiaW5nIHRoZSB1c2VyJ3MgYXR0ZW50aW9uIHdpdGggYQotbm90aWZpY2F0aW9uLiBJZiB0aGUgbm90aWZpY2F0aW9uIGlzIGltcG9ydGFudCBlbm91Z2gsIGRlY2lkZSBpZiB5b3Ugd291bGQgbGlrZSB0byBvcHQgb3V0IG9mCi1kaXNwbGF5aW5nIHRoZSB0aW1lc3RhbXAuPC9wPgotPHA+SW5jbHVkZSBhIHRpbWVzdGFtcCBpZiB0aGUgdXNlciBsaWtlbHkgbmVlZHMgdG8ga25vdyBob3cgbG9uZyBhZ28gdGhlIG5vdGlmaWNhdGlvbiBvY2N1cnJlZC4gR29vZAotY2FuZGlkYXRlcyBmb3IgdGltZXN0YW1wcyBpbmNsdWRlIGNvbW11bmljYXRpb24gbm90aWZpY2F0aW9ucyAoZW1haWwsIG1lc3NhZ2luZywgY2hhdCwgdm9pY2VtYWlsKQotd2hlcmUgdGhlIHVzZXIgbWF5IG5lZWQgdGhlIHRpbWVzdGFtcCBpbmZvcm1hdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIGEgbWVzc2FnZSBvciB0bwotdGFpbG9yIGEgcmVzcG9uc2UuPC9wPgotPGg0PlN0YWNrIHlvdXIgbm90aWZpY2F0aW9uczwvaDQ+Ci08cD5JZiB5b3VyIGFwcCBjcmVhdGVzIGEgbm90aWZpY2F0aW9uIHdoaWxlIGFub3RoZXIgb2YgdGhlIHNhbWUgdHlwZSBpcyBzdGlsbCBwZW5kaW5nLCBhdm9pZCBjcmVhdGluZwotYW4gYWx0b2dldGhlciBuZXcgbm90aWZpY2F0aW9uIG9iamVjdC4gSW5zdGVhZCwgc3RhY2sgdGhlIG5vdGlmaWNhdGlvbi48L3A+Ci08cD5BIHN0YWNrZWQgbm90aWZpY2F0aW9uIGJ1aWxkcyBhIHN1bW1hcnkgZGVzY3JpcHRpb24gYW5kIGFsbG93cyB0aGUgdXNlciB0byB1bmRlcnN0YW5kIGhvdyBtYW55Ci1ub3RpZmljYXRpb25zIG9mIGEgcGFydGljdWxhciBraW5kIGFyZSBwZW5kaW5nLjwvcD4KLTxwPjxzdHJvbmc+RG9uJ3Q8L3N0cm9uZz46PC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FkZGl0aW9uYWxfZmFpbC5wbmciPgotCi08cD48c3Ryb25nPkRvPC9zdHJvbmc+OjwvcD4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L25vdGlmaWNhdGlvbnNfcGF0dGVybl9hZGRpdGlvbmFsX3dpbi5wbmciPgotCi08cD5JZiB5b3Uga2VlcCB0aGUgc3VtbWFyeSBhbmQgZGV0YWlsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzY3JlZW5zLCBhIHN0YWNrZWQgbm90aWZpY2F0aW9uIG1heSBuZWVkCi10byBvcGVuIHRvIGEgZGlmZmVyZW50IHBsYWNlIGluIHRoZSBhcHAgdGhhbiBhIHNpbmdsZSBub3RpZmljYXRpb24uPC9wPgotPHA+Rm9yIGV4YW1wbGUsIGEgc2luZ2xlIGVtYWlsIG5vdGlmaWNhdGlvbiBzaG91bGQgYWx3YXlzIG9wZW4gdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGVtYWlsLCB3aGVyZWFzIGEKLXN0YWNrZWQgZW1haWwgbm90aWZpY2F0aW9uIG9wZW5zIHRvIHRoZSBJbmJveCB2aWV3LjwvcD4KLTxoND5DbGVhbiB1cCBhZnRlciB5b3Vyc2VsZjwvaDQ+Ci08cD5KdXN0IGxpa2UgY2FsZW5kYXIgZXZlbnRzLCBzb21lIG5vdGlmaWNhdGlvbnMgYWxlcnQgdGhlIHVzZXIgdG8gYW4gZXZlbnQgdGhhdCBoYXBwZW5zIGF0IGEKLXBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gQWZ0ZXIgdGhhdCBtb21lbnQgaGFzIHBhc3NlZCwgdGhlIG5vdGlmaWNhdGlvbiBpcyBsaWtlbHkgbm90IGltcG9ydGFudCB0bwotdGhlIHVzZXIgYW55bW9yZSwgYW5kIHlvdSBzaG91bGQgY29uc2lkZXIgcmVtb3ZpbmcgaXQgYXV0b21hdGljYWxseS4gIFRoZSBzYW1lIGlzIHRydWUgZm9yIGFjdGl2ZQotY2hhdCBjb252ZXJzYXRpb25zIG9yIHZvaWNlbWFpbCBtZXNzYWdlcyB0aGUgdXNlciBoYXMgbGlzdGVuZWQgdG8sIHVzZXJzIHNob3VsZCBub3QgaGF2ZSB0byBtYW51YWxseQotZGlzbWlzcyBub3RpZmljYXRpb25zIGluZGVwZW5kZW50bHkgZnJvbSB0YWtpbmcgYWN0aW9uIG9uIHRoZW0uPC9wPgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLTxoND5Qcm92aWRlIGEgcGVlayBpbnRvIHlvdXIgbm90aWZpY2F0aW9uPC9oND4KLTxwPllvdSBjYW4gcHJvdmlkZSBhIHNob3J0IHByZXZpZXcgb2YgeW91ciBub3RpZmljYXRpb24ncyBjb250ZW50IGJ5IHByb3ZpZGluZyBvcHRpb25hbCB0aWNrZXIgdGV4dC4KLVRoZSB0aWNrZXIgdGV4dCBpcyBzaG93biBmb3IgYSBzaG9ydCBhbW91bnQgb2YgdGltZSB3aGVuIHRoZSBub3RpZmljYXRpb24gZW50ZXJzIHRoZSBzeXN0ZW0gYW5kIHRoZW4KLWhpZGVzIGF1dG9tYXRpY2FsbHkuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fcGhvbmVfdGlja2VyLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGg0Pk1ha2Ugbm90aWZpY2F0aW9ucyBvcHRpb25hbDwvaDQ+Ci08cD5Vc2VycyBzaG91bGQgYWx3YXlzIGJlIGluIGNvbnRyb2wgb2Ygbm90aWZpY2F0aW9ucy4gQWxsb3cgdGhlIHVzZXIgdG8gc2lsZW5jZSB0aGUgbm90aWZpY2F0aW9ucyBmcm9tCi15b3VyIGFwcCBieSBhZGRpbmcgYSBub3RpZmljYXRpb24gc2V0dGluZ3MgaXRlbSB0byB5b3VyIGFwcGxpY2F0aW9uIHNldHRpbmdzLjwvcD4KLTxoND5Vc2UgZGlzdGluY3QgaWNvbnM8L2g0PgotPHA+QnkgZ2xhbmNpbmcgYXQgdGhlIG5vdGlmaWNhdGlvbiBhcmVhLCB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXNjZXJuIHdoYXQgbm90aWZpY2F0aW9uIHR5cGVzIGFyZQotY3VycmVudGx5IHBlbmRpbmcuPC9wPgotPHA+PHN0cm9uZz5Ebzwvc3Ryb25nPjo8L3A+Ci08dWw+Ci08bGk+TG9vayBhdCB0aGUgbm90aWZpY2F0aW9uIGljb25zIHRoZSBBbmRyb2lkIGFwcHMgYWxyZWFkeSBwcm92aWRlIGFuZCBjcmVhdGUgbm90aWZpY2F0aW9uIGljb25zIGZvcgotICB5b3VyIGFwcCB0aGF0IGFyZSBzdWZmaWNpZW50bHkgZGlzdGluY3QgaW4gYXBwZWFyYW5jZS48L2xpPgotPC91bD4KLTxwPjxzdHJvbmc+RG9uJ3Q8L3N0cm9uZz46PC9wPgotPHVsPgotPGxpPlVzZSBjb2xvciB0byBkaXN0aW5ndWlzaCB5b3VyIGFwcCBmcm9tIG90aGVycy4gTm90aWZpY2F0aW9uIGljb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgbW9ub2Nocm9tZS48L2xpPgotPC91bD4KLQotPGgyIGlkPSJpbnRlcmFjdGluZy13aXRoLW5vdGlmaWNhdGlvbnMiPkludGVyYWN0aW5nIFdpdGggTm90aWZpY2F0aW9uczwvaDI+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L25vdGlmaWNhdGlvbnNfcGF0dGVybl9waG9uZV9pY29ucy5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPHA+Tm90aWZpY2F0aW9ucyBhcmUgaW5kaWNhdGVkIGJ5IGljb25zIGluIHRoZSBub3RpZmljYXRpb24gYXJlYSBhbmQgY2FuIGJlIGFjY2Vzc2VkIGJ5IG9wZW5pbmcgdGhlCi1ub3RpZmljYXRpb24gZHJhd2VyLjwvcD4KLTxwPkluc2lkZSB0aGUgZHJhd2VyLCBub3RpZmljYXRpb25zIGFyZSBjaHJvbm9sb2dpY2FsbHkgc29ydGVkIHdpdGggdGhlIGxhdGVzdCBvbmUgb24gdG9wLiBUb3VjaGluZyBhCi1ub3RpZmljYXRpb24gb3BlbnMgdGhlIGFzc29jaWF0ZWQgYXBwIHRvIGRldGFpbGVkIGNvbnRlbnQgbWF0Y2hpbmcgdGhlIG5vdGlmaWNhdGlvbi4gU3dpcGluZyBsZWZ0IG9yCi1yaWdodCBvbiBhIG5vdGlmaWNhdGlvbiByZW1vdmVzIGl0IGZyb20gdGhlIGRyYXdlci48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLTxwPk9uIHRhYmxldHMsIHRoZSBub3RpZmljYXRpb24gYXJlYSBpcyBpbnRlZ3JhdGVkIHdpdGggdGhlIHN5c3RlbSBiYXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLiBUaGUKLW5vdGlmaWNhdGlvbiBkcmF3ZXIgaXMgb3BlbmVkIGJ5IHRvdWNoaW5nIGFueXdoZXJlIGluc2lkZSB0aGUgbm90aWZpY2F0aW9uIGFyZWEuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fdGFibGV0LnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbm90aWZpY2F0aW9uc19wYXR0ZXJuX29uZ29pbmdfbXVzaWMucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLTxoND5PbmdvaW5nIG5vdGlmaWNhdGlvbnM8L2g0PgotPHA+T25nb2luZyBub3RpZmljYXRpb25zIGtlZXAgdXNlcnMgaW5mb3JtZWQgYWJvdXQgYW4gb25nb2luZyBwcm9jZXNzIGluIHRoZSBiYWNrZ3JvdW5kLiBGb3IgZXhhbXBsZSwKLW11c2ljIHBsYXllcnMgYW5ub3VuY2UgdGhlIGN1cnJlbnRseSBwbGF5aW5nIHRyYWNrIGluIHRoZSBub3RpZmljYXRpb24gc3lzdGVtIGFuZCBjb250aW51ZSB0byBkbyBzbwotdW50aWwgdGhlIHVzZXIgc3RvcHMgdGhlIHBsYXliYWNrLiBUaGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gc2hvdyB0aGUgdXNlciBmZWVkYmFjayBmb3IgbG9uZ2VyIHRhc2tzCi1saWtlIGRvd25sb2FkaW5nIGEgZmlsZSwgb3IgZW5jb2RpbmcgYSB2aWRlby4gT25nb2luZyBub3RpZmljYXRpb25zIGNhbm5vdCBiZSBtYW51YWxseSByZW1vdmVkIGZyb20KLXRoZSBub3RpZmljYXRpb24gZHJhd2VyLjwvcD4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi0xMiI+Ci0KLTxoND5EaWFsb2dzIGFuZCB0b2FzdHMgYXJlIGZvciBmZWVkYmFjayBub3Qgbm90aWZpY2F0aW9uPC9oND4KLTxwPllvdXIgYXBwIHNob3VsZCBub3QgY3JlYXRlIGEgZGlhbG9nIG9yIHRvYXN0IGlmIGl0IGlzIG5vdCBjdXJyZW50bHkgb24gc2NyZWVuLiBEaWFsb2dzIGFuZCBUb2FzdHMKLXNob3VsZCBvbmx5IGJlIGRpc3BsYXllZCBhcyB0aGUgaW1tZWRpYXRlIHJlc3BvbnNlIHRvIHRoZSB1c2VyIHRha2luZyBhbiBhY3Rpb24gaW5zaWRlIG9mIHlvdXIgYXBwLgotRm9yIGluc3RhbmNlLCBkaWFsb2dzIGNhbiBiZSB1c2VkIHRvIGNvbmZpcm0gdGhhdCB0aGUgdXNlciB1bmRlcnN0YW5kcyB0aGUgc2V2ZXJpdHkgb2YgYW4gYWN0aW9uLAotYW5kIHRvYXN0cyBjYW4gZWNobyBiYWNrIHRoYXQgYW4gYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0YWtlbi48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9ub3RpZmljYXRpb25zX3BhdHRlcm5fZGlhbG9nX3RvYXN0LnBuZyI+Ci0KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuamQgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4OGEwMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5qZApAQCAtMCwwICsxLDIzNiBAQAorcGFnZS50aXRsZT1Ob3RpZmljYXRpb25zCitAamQ6Ym9keQorCis8cD5UaGUgbm90aWZpY2F0aW9uIHN5c3RlbSBhbGxvd3MgeW91ciBhcHAgdG8ga2VlcCB0aGUgdXNlciBpbmZvcm1lZCBhYm91dCBpbXBvcnRhbnQgZXZlbnRzLCBzdWNoIGFzCituZXcgbWVzc2FnZXMgaW4gYSBjaGF0IGFwcCBvciBhIGNhbGVuZGFyIGV2ZW50LjwvcD4KKzxwPlRvIGNyZWF0ZSBhbiBhcHAgdGhhdCBmZWVscyBzdHJlYW1saW5lZCwgcGxlYXNhbnQsIGFuZCByZXNwZWN0ZnVsLCBpdCBpcyBpbXBvcnRhbnQgdG8gZGVzaWduIHlvdXIKK25vdGlmaWNhdGlvbnMgY2FyZWZ1bGx5LiBOb3RpZmljYXRpb25zIGVtYm9keSB5b3VyIGFwcCdzIHZvaWNlLCBhbmQgY29udHJpYnV0ZSB0byB5b3VyIGFwcCdzCitwZXJzb25hbGl0eS4gVW53YW50ZWQgb3IgdW5pbXBvcnRhbnQgbm90aWZpY2F0aW9ucyBjYW4gYW5ub3kgdGhlIHVzZXIsIHNvIHVzZSB0aGVtIGp1ZGljaW91c2x5LjwvcD4KKzxoND5XaGVuIHRvIGRpc3BsYXkgYSBub3RpZmljYXRpb248L2g0PgorPHA+VG8gY3JlYXRlIGFuIGFwcGxpY2F0aW9uIHRoYXQgcGVvcGxlIGxvdmUsIGl0J3MgaW1wb3J0YW50IHRvIHJlY29nbml6ZSB0aGF0IHRoZSB1c2VyJ3MgYXR0ZW50aW9uIGFuZAorZm9jdXMgaXMgYSByZXNvdXJjZSB0aGF0IG11c3QgYmUgcHJvdGVjdGVkLiBUbyB1c2UgYW4gYW5hbG9neSB0aGF0IG1pZ2h0IHJlc29uYXRlIHdpdGggc29mdHdhcmUKK2RldmVsb3BlcnMsIHRoZSB1c2VyIGlzIG5vdCBhIG1ldGhvZCB0aGF0IGNhbiBiZSBpbnZva2VkIHRvIHJldHVybiBhIHZhbHVlLiAgVGhlIHVzZXIncyBmb2N1cyBpcyBhCityZXNvdXJjZSBtb3JlIGFraW4gdG8gYSB0aHJlYWQsIGFuZCBjcmVhdGluZyBhIG5vdGlmaWNhdGlvbiBtb21lbnRhcmlseSBibG9ja3MgdGhlIHVzZXIgdGhyZWFkIGFzCit0aGV5IHByb2Nlc3MgYW5kIHRoZW4gZGlzbWlzcyB0aGUgaW50ZXJydXB0aXZlIG5vdGlmaWNhdGlvbi48L3A+Cis8cD5BbmRyb2lkJ3Mgbm90aWZpY2F0aW9uIHN5c3RlbSBoYXMgYmVlbiBkZXNpZ25lZCB0byBxdWlja2x5IGluZm9ybSB1c2VycyBvZiBldmVudHMgd2hpbGUgdGhleSBmb2N1cworb24gYSB0YXNrLCBidXQgaXQgaXMgbm9uZXRoZWxlc3Mgc3RpbGwgaW1wb3J0YW50IHRvIGJlIGNvbnNjaWVudGlvdXMgd2hlbiBkZWNpZGluZyB0byBjcmVhdGUgYQorbm90aWZpY2F0aW9uLjwvcD4KKzxwPldoaWxlIHdlbGwgYmVoYXZlZCBhcHBzIGdlbmVyYWxseSBvbmx5IHNwZWFrIHdoZW4gc3Bva2VuIHRvLCB0aGVyZSBhcmUgc29tZSBsaW1pdGVkIGNhc2VzIHdoZXJlIGFuCithcHAgYWN0dWFsbHkgc2hvdWxkIGludGVycnVwdCB0aGUgdXNlciB3aXRoIGFuIHVucHJvbXB0ZWQgbm90aWZpY2F0aW9uLjwvcD4KKzxwPk5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlIHVzZWQgcHJpbWFyaWx5IGZvciA8c3Ryb25nPnRpbWUgc2Vuc2l0aXZlIGV2ZW50czwvc3Ryb25nPiwgYW5kIGVzcGVjaWFsbHkgaWYgdGhlc2UKK3N5bmNocm9ub3VzIGV2ZW50cyA8c3Ryb25nPmludm9sdmUgb3RoZXIgcGVvcGxlPC9zdHJvbmc+LiBGb3IgaW5zdGFuY2UsIGFuIGluY29taW5nIGNoYXQgaXMgYSByZWFsIHRpbWUgYW5kCitzeW5jaHJvbm91cyBmb3JtIG9mIGNvbW11bmljYXRpb246IHRoZXJlIGlzIGFub3RoZXIgdXNlciBhY3RpdmVseSB3YWl0aW5nIG9uIHlvdSB0byByZXNwb25kLgorQ2FsZW5kYXIgZXZlbnRzIGFyZSBhbm90aGVyIGdvb2QgZXhhbXBsZSBvZiB3aGVuIHRvIHVzZSBhIG5vdGlmaWNhdGlvbiBhbmQgZ3JhYiB0aGUgdXNlcidzCithdHRlbnRpb24sIGJlY2F1c2UgdGhlIGV2ZW50IGlzIGltbWluZW50LCBhbmQgY2FsZW5kYXIgZXZlbnRzIG9mdGVuIGludm9sdmUgb3RoZXIgcGVvcGxlLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3JlYWxfdGltZV9wZW9wbGUucG5nIj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+V2hlbiBub3QgdG8gZGlzcGxheSBhIG5vdGlmaWNhdGlvbjwvaDQ+Cis8cD5UaGVyZSBhcmUgaG93ZXZlciBtYW55IG90aGVyIGNhc2VzIHdoZXJlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIG5vdCBiZSB1c2VkOjwvcD4KKzx1bD4KKzxsaT4KKzxwPkRvbid0IG5vdGlmeSB0aGUgdXNlciBvZiBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBkaXJlY3RlZCBzcGVjaWZpY2FsbHkgYXQgdGhlbSwgb3IgaW5mb3JtYXRpb24KK3RoYXQgaXMgbm90IHRydWx5IHRpbWUgc2Vuc2l0aXZlLiAgRm9yIGluc3RhbmNlIHRoZSBhc3luY2hyb25vdXMgYW5kIHVuZGlyZWN0ZWQgdXBkYXRlcyBmbG93aW5nCit0aHJvdWdoIGEgc29jaWFsIG5ldHdvcmsgZG8gbm90IHdhcnJhbnQgYSByZWFsIHRpbWUgaW50ZXJydXB0aW9uLjwvcD4KKzwvbGk+Cis8bGk+Cis8cD5Eb24ndCBjcmVhdGUgYSBub3RpZmljYXRpb24gaWYgdGhlIHJlbGV2YW50IG5ldyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgb24gc2NyZWVuLiBJbnN0ZWFkLCB1c2UKK3RoZSBVSSBvZiB0aGUgYXBwbGljYXRpb24gaXRzZWxmIHRvIG5vdGlmeSB0aGUgdXNlciBvZiBuZXcgaW5mb3JtYXRpb24gZGlyZWN0bHkgaW4gY29udGV4dC4gRm9yCitpbnN0YW5jZSwgYSBjaGF0IGFwcGxpY2F0aW9uIHNob3VsZCBub3QgY3JlYXRlIHN5c3RlbSBub3RpZmljYXRpb25zIHdoaWxlIHRoZSB1c2VyIGlzIGFjdGl2ZWx5CitjaGF0dGluZyB3aXRoIGFub3RoZXIgdXNlci48L3A+Cis8L2xpPgorPGxpPgorPHA+RG9uJ3QgaW50ZXJydXB0IHRoZSB1c2VyIGZvciBsb3cgbGV2ZWwgdGVjaG5pY2FsIG9wZXJhdGlvbnMsIGxpa2Ugc2F2aW5nIG9yIHN5bmNpbmcgaW5mb3JtYXRpb24sCitvciB1cGRhdGluZyBhbiBhcHBsaWNhdGlvbiwgaWYgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBzeXN0ZW0gdG8gc2ltcGx5IHRha2UgY2FyZSBvZiBpdHNlbGYgd2l0aG91dAoraW52b2x2aW5nIHRoZSB1c2VyLjwvcD4KKzwvbGk+Cis8bGk+Cis8cD5Eb24ndCBpbnRlcnJ1cHQgdGhlIHVzZXIgdG8gaW5mb3JtIHRoZW0gb2YgYW4gZXJyb3IgaWYgaXQgaXMgcG9zc2libGUgZm9yIHRoZSBhcHBsaWNhdGlvbiB0bworcXVpY2tseSByZWNvdmVyIGZyb20gdGhlIGVycm9yIG9uIGl0cyBvd24gd2l0aG91dCB0aGUgdXNlciB0YWtpbmcgYW55IGFjdGlvbi48L3A+Cis8L2xpPgorPGxpPgorPHA+RG9uJ3QgdXNlIG5vdGlmaWNhdGlvbnMgZm9yIHNlcnZpY2VzIHRoYXQgdGhlIHVzZXIgY2Fubm90IG1hbnVhbGx5IHN0YXJ0IG9yIHN0b3AuPC9wPgorPC9saT4KKzxsaT4KKzxwPkRvbid0IGNyZWF0ZSBzdXBlcmZsdW91cyBub3RpZmljYXRpb25zIGp1c3QgdG8gZ2V0IHlvdXIgYnJhbmQgaW4gZnJvbnQgb2YgdXNlcnMuIFN1Y2gKK25vdGlmaWNhdGlvbnMgd2lsbCBvbmx5IGZydXN0cmF0ZSBhbmQgbGlrZWx5IGFsaWVuYXRlIHlvdXIgYXVkaWVuY2UuIFRoZSBiZXN0IHdheSB0byBwcm92aWRlIHRoZQordXNlciB3aXRoIGEgc21hbGwgYW1vdW50IG9mIHVwZGF0ZWQgaW5mb3JtYXRpb24gYW5kIHRvIGtlZXAgdGhlbSBlbmdhZ2VkIHdpdGggeW91ciBhcHBsaWNhdGlvbiBpcyB0bworZGV2ZWxvcCBhIHdpZGdldCB0aGF0IHRoZXkgY2FuIGNob29zZSB0byBwbGFjZSBvbiB0aGVpciBob21lIHNjcmVlbi48L3A+Cis8L2xpPgorPC91bD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9ub3RpZmljYXRpb25zX3BhdHRlcm5fc29jaWFsX2ZhaWwucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImRlc2lnbi1ndWlkZWxpbmVzIj5EZXNpZ24gR3VpZGVsaW5lczwvaDI+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX2FuYXRvbXkucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5NYWtlIGl0IHBlcnNvbmFsPC9oND4KKzxwPkZvciBub3RpZmljYXRpb25zIG9mIGl0ZW1zIHNlbnQgYnkgYW5vdGhlciB1c2VyIChzdWNoIGFzIGEgbWVzc2FnZSBvciBzdGF0dXMgdXBkYXRlKSwgaW5jbHVkZSB0aGF0CitwZXJzb24ncyBpbWFnZS48L3A+Cis8cD5SZW1lbWJlciB0byBpbmNsdWRlIHRoZSBhcHAgaWNvbiBhcyBhIHNlY29uZGFyeSBpY29uIGluIHRoZSBub3RpZmljYXRpb24sIHNvIHRoYXQgdGhlIHVzZXIgY2FuCitzdGlsbCBpZGVudGlmeSB3aGljaCBhcHAgcG9zdGVkIGl0LjwvcD4gICAgCisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGg0Pk5hdmlnYXRlIHRvIHRoZSByaWdodCBwbGFjZTwvaDQ+Cis8cD5XaGVuIHRoZSB1c2VyIHRvdWNoZXMgYSBub3RpZmljYXRpb24sIGJlIG9wZW4geW91ciBhcHAgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSB1c2VyIGNhbiBjb25zdW1lIGFuZAorYWN0IHVwb24gdGhlIGRhdGEgcmVmZXJlbmNlZCBpbiB0aGUgbm90aWZpY2F0aW9uLiBJbiBtb3N0IGNhc2VzIHRoaXMgd2lsbCBiZSB0aGUgZGV0YWlsIHZpZXcgb2YgYQorc2luZ2xlIGRhdGEgaXRlbSAoZS5nLiBhIG1lc3NhZ2UpLCBidXQgaXQgbWlnaHQgYWxzbyBiZSBhIHN1bW1hcnkgdmlldyBpZiB0aGUgbm90aWZpY2F0aW9uIGlzCitzdGFja2VkIChzZWUgPGVtPlN0YWNrZWQgbm90aWZpY2F0aW9uczwvZW0+IGJlbG93KSBhbmQgcmVmZXJlbmNlcyBtdWx0aXBsZSBpdGVtcy4gSWYgaW4gYW55IG9mIHRob3NlIGNhc2VzCit0aGUgdXNlciBpcyB0YWtlbiB0byBhIGhpZXJhcmNoeSBsZXZlbCBiZWxvdyB5b3VyIGFwcCdzIHRvcC1sZXZlbCwgaW5zZXJ0IG5hdmlnYXRpb24gaW50byB5b3VyIGFwcCdzCitiYWNrIHN0YWNrIHRvIGFsbG93IHRoZW0gdG8gbmF2aWdhdGUgdG8geW91ciBhcHAncyB0b3AgbGV2ZWwgdXNpbmcgdGhlIHN5c3RlbSBiYWNrIGtleS4gRm9yIG1vcmUKK2luZm9ybWF0aW9uLCBzZWUgdGhlIGNoYXB0ZXIgb24gPGVtPlN5c3RlbS10by1hcHAgbmF2aWdhdGlvbjwvZW0+IGluIHRoZQorPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+IGRlc2lnbiBwYXR0ZXJuLjwvcD4KKzxoND5UaW1lc3RhbXBzIGZvciB0aW1lIHNlbnNpdGl2ZSBldmVudHM8L2g0PgorPHA+QnkgZGVmYXVsdCwgc3RhbmRhcmQgQW5kcm9pZCBub3RpZmljYXRpb25zIGluY2x1ZGUgYSB0aW1lc3RhbXAgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gQ29uc2lkZXIKK3doZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyB2YWx1YWJsZSBpbiB0aGUgY29udGV4dCBvZiB5b3VyIG5vdGlmaWNhdGlvbi4gSWYgdGhlIHRpbWVzdGFtcCBpcyBub3QKK3ZhbHVhYmxlLCBjb25zaWRlciBpZiB0aGUgZXZlbnQgaXMgaW1wb3J0YW50IGVub3VnaCB0byB3YXJyYW50IGdyYWJiaW5nIHRoZSB1c2VyJ3MgYXR0ZW50aW9uIHdpdGggYQorbm90aWZpY2F0aW9uLiBJZiB0aGUgbm90aWZpY2F0aW9uIGlzIGltcG9ydGFudCBlbm91Z2gsIGRlY2lkZSBpZiB5b3Ugd291bGQgbGlrZSB0byBvcHQgb3V0IG9mCitkaXNwbGF5aW5nIHRoZSB0aW1lc3RhbXAuPC9wPgorPHA+SW5jbHVkZSBhIHRpbWVzdGFtcCBpZiB0aGUgdXNlciBsaWtlbHkgbmVlZHMgdG8ga25vdyBob3cgbG9uZyBhZ28gdGhlIG5vdGlmaWNhdGlvbiBvY2N1cnJlZC4gR29vZAorY2FuZGlkYXRlcyBmb3IgdGltZXN0YW1wcyBpbmNsdWRlIGNvbW11bmljYXRpb24gbm90aWZpY2F0aW9ucyAoZW1haWwsIG1lc3NhZ2luZywgY2hhdCwgdm9pY2VtYWlsKQord2hlcmUgdGhlIHVzZXIgbWF5IG5lZWQgdGhlIHRpbWVzdGFtcCBpbmZvcm1hdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIGEgbWVzc2FnZSBvciB0bwordGFpbG9yIGEgcmVzcG9uc2UuPC9wPgorPGg0PlN0YWNrIHlvdXIgbm90aWZpY2F0aW9uczwvaDQ+Cis8cD5JZiB5b3VyIGFwcCBjcmVhdGVzIGEgbm90aWZpY2F0aW9uIHdoaWxlIGFub3RoZXIgb2YgdGhlIHNhbWUgdHlwZSBpcyBzdGlsbCBwZW5kaW5nLCBhdm9pZCBjcmVhdGluZworYW4gYWx0b2dldGhlciBuZXcgbm90aWZpY2F0aW9uIG9iamVjdC4gSW5zdGVhZCwgc3RhY2sgdGhlIG5vdGlmaWNhdGlvbi48L3A+Cis8cD5BIHN0YWNrZWQgbm90aWZpY2F0aW9uIGJ1aWxkcyBhIHN1bW1hcnkgZGVzY3JpcHRpb24gYW5kIGFsbG93cyB0aGUgdXNlciB0byB1bmRlcnN0YW5kIGhvdyBtYW55Citub3RpZmljYXRpb25zIG9mIGEgcGFydGljdWxhciBraW5kIGFyZSBwZW5kaW5nLjwvcD4KKzxwPjxzdHJvbmc+RG9uJ3Q8L3N0cm9uZz46PC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9ub3RpZmljYXRpb25zX3BhdHRlcm5fYWRkaXRpb25hbF9mYWlsLnBuZyI+CisKKzxwPjxzdHJvbmc+RG88L3N0cm9uZz46PC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9ub3RpZmljYXRpb25zX3BhdHRlcm5fYWRkaXRpb25hbF93aW4ucG5nIj4KKworPHA+SWYgeW91IGtlZXAgdGhlIHN1bW1hcnkgYW5kIGRldGFpbCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc2NyZWVucywgYSBzdGFja2VkIG5vdGlmaWNhdGlvbiBtYXkgbmVlZAordG8gb3BlbiB0byBhIGRpZmZlcmVudCBwbGFjZSBpbiB0aGUgYXBwIHRoYW4gYSBzaW5nbGUgbm90aWZpY2F0aW9uLjwvcD4KKzxwPkZvciBleGFtcGxlLCBhIHNpbmdsZSBlbWFpbCBub3RpZmljYXRpb24gc2hvdWxkIGFsd2F5cyBvcGVuIHRvIHRoZSBjb250ZW50IG9mIHRoZSBlbWFpbCwgd2hlcmVhcyBhCitzdGFja2VkIGVtYWlsIG5vdGlmaWNhdGlvbiBvcGVucyB0byB0aGUgSW5ib3ggdmlldy48L3A+Cis8aDQ+Q2xlYW4gdXAgYWZ0ZXIgeW91cnNlbGY8L2g0PgorPHA+SnVzdCBsaWtlIGNhbGVuZGFyIGV2ZW50cywgc29tZSBub3RpZmljYXRpb25zIGFsZXJ0IHRoZSB1c2VyIHRvIGFuIGV2ZW50IHRoYXQgaGFwcGVucyBhdCBhCitwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIEFmdGVyIHRoYXQgbW9tZW50IGhhcyBwYXNzZWQsIHRoZSBub3RpZmljYXRpb24gaXMgbGlrZWx5IG5vdCBpbXBvcnRhbnQgdG8KK3RoZSB1c2VyIGFueW1vcmUsIGFuZCB5b3Ugc2hvdWxkIGNvbnNpZGVyIHJlbW92aW5nIGl0IGF1dG9tYXRpY2FsbHkuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBhY3RpdmUKK2NoYXQgY29udmVyc2F0aW9ucyBvciB2b2ljZW1haWwgbWVzc2FnZXMgdGhlIHVzZXIgaGFzIGxpc3RlbmVkIHRvLCB1c2VycyBzaG91bGQgbm90IGhhdmUgdG8gbWFudWFsbHkKK2Rpc21pc3Mgbm90aWZpY2F0aW9ucyBpbmRlcGVuZGVudGx5IGZyb20gdGFraW5nIGFjdGlvbiBvbiB0aGVtLjwvcD4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCis8aDQ+UHJvdmlkZSBhIHBlZWsgaW50byB5b3VyIG5vdGlmaWNhdGlvbjwvaDQ+Cis8cD5Zb3UgY2FuIHByb3ZpZGUgYSBzaG9ydCBwcmV2aWV3IG9mIHlvdXIgbm90aWZpY2F0aW9uJ3MgY29udGVudCBieSBwcm92aWRpbmcgb3B0aW9uYWwgdGlja2VyIHRleHQuCitUaGUgdGlja2VyIHRleHQgaXMgc2hvd24gZm9yIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUgd2hlbiB0aGUgbm90aWZpY2F0aW9uIGVudGVycyB0aGUgc3lzdGVtIGFuZCB0aGVuCitoaWRlcyBhdXRvbWF0aWNhbGx5LjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9ub3RpZmljYXRpb25zX3BhdHRlcm5fcGhvbmVfdGlja2VyLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGg0Pk1ha2Ugbm90aWZpY2F0aW9ucyBvcHRpb25hbDwvaDQ+Cis8cD5Vc2VycyBzaG91bGQgYWx3YXlzIGJlIGluIGNvbnRyb2wgb2Ygbm90aWZpY2F0aW9ucy4gQWxsb3cgdGhlIHVzZXIgdG8gc2lsZW5jZSB0aGUgbm90aWZpY2F0aW9ucyBmcm9tCit5b3VyIGFwcCBieSBhZGRpbmcgYSBub3RpZmljYXRpb24gc2V0dGluZ3MgaXRlbSB0byB5b3VyIGFwcGxpY2F0aW9uIHNldHRpbmdzLjwvcD4KKzxoND5Vc2UgZGlzdGluY3QgaWNvbnM8L2g0PgorPHA+QnkgZ2xhbmNpbmcgYXQgdGhlIG5vdGlmaWNhdGlvbiBhcmVhLCB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXNjZXJuIHdoYXQgbm90aWZpY2F0aW9uIHR5cGVzIGFyZQorY3VycmVudGx5IHBlbmRpbmcuPC9wPgorPHA+PHN0cm9uZz5Ebzwvc3Ryb25nPjo8L3A+Cis8dWw+Cis8bGk+TG9vayBhdCB0aGUgbm90aWZpY2F0aW9uIGljb25zIHRoZSBBbmRyb2lkIGFwcHMgYWxyZWFkeSBwcm92aWRlIGFuZCBjcmVhdGUgbm90aWZpY2F0aW9uIGljb25zIGZvcgorICB5b3VyIGFwcCB0aGF0IGFyZSBzdWZmaWNpZW50bHkgZGlzdGluY3QgaW4gYXBwZWFyYW5jZS48L2xpPgorPC91bD4KKzxwPjxzdHJvbmc+RG9uJ3Q8L3N0cm9uZz46PC9wPgorPHVsPgorPGxpPlVzZSBjb2xvciB0byBkaXN0aW5ndWlzaCB5b3VyIGFwcCBmcm9tIG90aGVycy4gTm90aWZpY2F0aW9uIGljb25zIHNob3VsZCBnZW5lcmFsbHkgYmUgbW9ub2Nocm9tZS48L2xpPgorPC91bD4KKworPGgyIGlkPSJpbnRlcmFjdGluZy13aXRoLW5vdGlmaWNhdGlvbnMiPkludGVyYWN0aW5nIFdpdGggTm90aWZpY2F0aW9uczwvaDI+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3Bob25lX2ljb25zLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCis8cD5Ob3RpZmljYXRpb25zIGFyZSBpbmRpY2F0ZWQgYnkgaWNvbnMgaW4gdGhlIG5vdGlmaWNhdGlvbiBhcmVhIGFuZCBjYW4gYmUgYWNjZXNzZWQgYnkgb3BlbmluZyB0aGUKK25vdGlmaWNhdGlvbiBkcmF3ZXIuPC9wPgorPHA+SW5zaWRlIHRoZSBkcmF3ZXIsIG5vdGlmaWNhdGlvbnMgYXJlIGNocm9ub2xvZ2ljYWxseSBzb3J0ZWQgd2l0aCB0aGUgbGF0ZXN0IG9uZSBvbiB0b3AuIFRvdWNoaW5nIGEKK25vdGlmaWNhdGlvbiBvcGVucyB0aGUgYXNzb2NpYXRlZCBhcHAgdG8gZGV0YWlsZWQgY29udGVudCBtYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uLiBTd2lwaW5nIGxlZnQgb3IKK3JpZ2h0IG9uIGEgbm90aWZpY2F0aW9uIHJlbW92ZXMgaXQgZnJvbSB0aGUgZHJhd2VyLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPHA+T24gdGFibGV0cywgdGhlIG5vdGlmaWNhdGlvbiBhcmVhIGlzIGludGVncmF0ZWQgd2l0aCB0aGUgc3lzdGVtIGJhciBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uIFRoZQorbm90aWZpY2F0aW9uIGRyYXdlciBpcyBvcGVuZWQgYnkgdG91Y2hpbmcgYW55d2hlcmUgaW5zaWRlIHRoZSBub3RpZmljYXRpb24gYXJlYS48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX3RhYmxldC5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbm90aWZpY2F0aW9uc19wYXR0ZXJuX29uZ29pbmdfbXVzaWMucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5PbmdvaW5nIG5vdGlmaWNhdGlvbnM8L2g0PgorPHA+T25nb2luZyBub3RpZmljYXRpb25zIGtlZXAgdXNlcnMgaW5mb3JtZWQgYWJvdXQgYW4gb25nb2luZyBwcm9jZXNzIGluIHRoZSBiYWNrZ3JvdW5kLiBGb3IgZXhhbXBsZSwKK211c2ljIHBsYXllcnMgYW5ub3VuY2UgdGhlIGN1cnJlbnRseSBwbGF5aW5nIHRyYWNrIGluIHRoZSBub3RpZmljYXRpb24gc3lzdGVtIGFuZCBjb250aW51ZSB0byBkbyBzbwordW50aWwgdGhlIHVzZXIgc3RvcHMgdGhlIHBsYXliYWNrLiBUaGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gc2hvdyB0aGUgdXNlciBmZWVkYmFjayBmb3IgbG9uZ2VyIHRhc2tzCitsaWtlIGRvd25sb2FkaW5nIGEgZmlsZSwgb3IgZW5jb2RpbmcgYSB2aWRlby4gT25nb2luZyBub3RpZmljYXRpb25zIGNhbm5vdCBiZSBtYW51YWxseSByZW1vdmVkIGZyb20KK3RoZSBub3RpZmljYXRpb24gZHJhd2VyLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi0xMiI+CisKKzxoND5EaWFsb2dzIGFuZCB0b2FzdHMgYXJlIGZvciBmZWVkYmFjayBub3Qgbm90aWZpY2F0aW9uPC9oND4KKzxwPllvdXIgYXBwIHNob3VsZCBub3QgY3JlYXRlIGEgZGlhbG9nIG9yIHRvYXN0IGlmIGl0IGlzIG5vdCBjdXJyZW50bHkgb24gc2NyZWVuLiBEaWFsb2dzIGFuZCBUb2FzdHMKK3Nob3VsZCBvbmx5IGJlIGRpc3BsYXllZCBhcyB0aGUgaW1tZWRpYXRlIHJlc3BvbnNlIHRvIHRoZSB1c2VyIHRha2luZyBhbiBhY3Rpb24gaW5zaWRlIG9mIHlvdXIgYXBwLgorRm9yIGluc3RhbmNlLCBkaWFsb2dzIGNhbiBiZSB1c2VkIHRvIGNvbmZpcm0gdGhhdCB0aGUgdXNlciB1bmRlcnN0YW5kcyB0aGUgc2V2ZXJpdHkgb2YgYW4gYWN0aW9uLAorYW5kIHRvYXN0cyBjYW4gZWNobyBiYWNrIHRoYXQgYW4gYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB0YWtlbi48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL25vdGlmaWNhdGlvbnNfcGF0dGVybl9kaWFsb2dfdG9hc3QucG5nIj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWE4MDQyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gUHVyZSBBbmRyb2lkCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlB1cmUgQW5kcm9pZDwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+TW9zdCBkZXZlbG9wZXJzIHdhbnQgdG8gZGlzdHJpYnV0ZSB0aGVpciBhcHBzIG9uIG11bHRpcGxlIHBsYXRmb3Jtcy4gQXMgeW91IHBsYW4geW91ciBhcHAgZm9yCi1BbmRyb2lkLCBrZWVwIGluIG1pbmQgdGhhdCBkaWZmZXJlbnQgcGxhdGZvcm1zIHBsYXkgYnkgZGlmZmVyZW50IHJ1bGVzIGFuZCBjb252ZW50aW9ucy4gRGVzaWduCi1kZWNpc2lvbnMgdGhhdCBtYWtlIHBlcmZlY3Qgc2Vuc2Ugb24gb25lIHBsYXRmb3JtIHdpbGwgbG9vayBhbmQgZmVlbCBtaXNwbGFjZWQgaW4gdGhlIGNvbnRleHQgb2YgYQotZGlmZmVyZW50IHBsYXRmb3JtLiBXaGlsZSBhICJkZXNpZ24gb25jZSwgc2hpcCBhbnl3aGVyZSIgYXBwcm9hY2ggbWlnaHQgc2F2ZSB5b3UgdGltZSB1cC1mcm9udCwgeW91Ci1ydW4gdGhlIHZlcnkgcmVhbCByaXNrIG9mIGNyZWF0aW5nIGluY29uc2lzdGVudCBhcHBzIHRoYXQgYWxpZW5hdGUgdXNlcnMuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcKLWd1aWRlbGluZXMgdG8gYXZvaWQgdGhlIG1vc3QgY29tbW9uIHRyYXBzIGFuZCBwaXRmYWxscy48L3A+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotPGg0PkRvbid0IG1pbWljIFVJIGVsZW1lbnRzIGZyb20gb3RoZXIgcGxhdGZvcm1zPC9oND4KLTxwPlBsYXRmb3JtcyB0eXBpY2FsbHkgcHJvdmlkZSBhIGNhcmVmdWxseSBkZXNpZ25lZCBzZXQgb2YgVUkgZWxlbWVudHMgdGhhdCBhcmUgdGhlbWVkIGluIGEgdmVyeQotZGlzdGluY3RpdmUgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHNvbWUgcGxhdGZvcm1zIGFkdm9jYXRlIHJvdW5kZWQgY29ybmVycyBmb3IgdGhlaXIgYnV0dG9ucywgb3RoZXJzCi11c2UgZ3JhZGllbnRzIGluIHRoZWlyIHRpdGxlIGJhcnMuIEluIHNvbWUgY2FzZXMsIGVsZW1lbnRzIG1heSBoYXZlIHRoZSBzYW1lIHB1cnBvc2UsIGJ1dCBhcmUKLWRlc2lnbmVkIHRvIHdvcmsgYSBiaXQgZGlmZmVyZW50bHkuPC9wPgotPHA+QXMgeW91IGJ1aWxkIHlvdXIgYXBwIGZvciBBbmRyb2lkLCBkb24ndCBjYXJyeSBvdmVyIHRoZW1lZCBVSSBlbGVtZW50cyBmcm9tIG90aGVyIHBsYXRmb3JtcyBhbmQKLWRvbid0IG1pbWljIHRoZWlyIHNwZWNpZmljIGJlaGF2aW9ycy4gUmV2aWV3IHRoZSA8YSBocmVmPSIuLi9idWlsZGluZy0KLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+IHNlY3Rpb24gaW4gdGhpcyBzdHlsZWd1aWRlIHRvIGxlYXJuIGFib3V0IEFuZHJvaWQncyBtb3N0IGltcG9ydGFudCBVSSBlbGVtZW50cwotYW5kIHRoZSB3YXkgdGhleSBsb29rIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCB0aGVtZXMuIEFsc28gZXhhbWluZSBBbmRyb2lkJ3MgcGxhdGZvcm0gYXBwcyB0byBnZXQgYQotc2Vuc2Ugb2YgaG93IGVsZW1lbnRzIGFyZSBhcHBsaWVkIGluIHRoZSBjb250ZXh0IG9mIGFuIGFwcC4gSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZSB0aGVtZSBvZiBVSQotZWxlbWVudHMsIGN1c3RvbWl6ZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHlvdXIgc3BlY2lmaWMgYnJhbmRpbmcgLSBhbmQgbm90IGFjY29yZGluZyB0byB0aGUKLWNvbnZlbnRpb25zIG9mIGEgZGlmZmVyZW50IHBsYXRmb3JtLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbWlncmF0aW5nX3VpX2VsZW1lbnRzLnBuZyI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgU2FtcGxpbmcgb2YgVUkgZWxlbWVudHMgZnJvbSBBbmRyb2lkLCBpT1MgYW5kIFdpbmRvd3MgUGhvbmUgNy4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5Eb24ndCBjYXJyeSBvdmVyIHBsYXRmb3JtLXNwZWNpZmljIGljb25zPC9oND4KLTxwPlBsYXRmb3JtcyB0eXBpY2FsbHkgcHJvdmlkZSBzZXRzIG9mIGljb25zIGZvciBjb21tb24gZnVuY3Rpb25hbGl0eSwgc3VjaCBhcyBzaGFyaW5nLCBjcmVhdGluZyBhIG5ldwotZG9jdW1lbnQgb3IgZGVsZXRpbmcuPC9wPgotPHA+QXMgeW91IGFyZSBtaWdyYXRpbmcgeW91ciBhcHAgdG8gQW5kcm9pZCwgcGxlYXNlIHN3YXAgb3V0IHBsYXRmb3JtLXNwZWNpZmljIGljb25zIHdpdGggdGhlaXIgQW5kcm9pZAotY291bnRlcnBhcnRzLjwvcD4KLTxwPllvdSBjYW4gZmluZCBhIHdpZGUgdmFyaWV0eSBvZiBpY29ucyBmb3IgdXNlIGluIHlvdXIgYXBwIGluIHRoZSBBbmRyb2lkIFNESy48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L21pZ3JhdGluZ19pY29ucy5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFNhbXBsaW5nIG9mIGljb25zIGZyb20gQW5kcm9pZCwgaU9TIGFuZCBXaW5kb3dzIFBob25lIDcuCi0gICAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+RG9uJ3QgdXNlIGJvdHRvbSB0YWIgYmFyczwvaDQ+Ci08cD5PdGhlciBwbGF0Zm9ybXMgdXNlIHRoZSBib3R0b20gdGFiIGJhciB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgYXBwJ3Mgdmlld3MuIFBlciBwbGF0Zm9ybSBjb252ZW50aW9uLAotQW5kcm9pZCdzIHRhYnMgZm9yIHZpZXcgY29udHJvbCBhcmUgc2hvd24gaW4gYWN0aW9uIGJhcnMgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuIGluc3RlYWQuIEluCi1hZGRpdGlvbiwgQW5kcm9pZCBhcHBzIG1heSB1c2UgYSBib3R0b20gYmFyIHRvIGRpc3BsYXkgYWN0aW9ucyBvbiBhIHNwbGl0IGFjdGlvbiBiYXIuPC9wPgotPHA+WW91IHNob3VsZCBmb2xsb3cgdGhpcyBndWlkZWxpbmUgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBleHBlcmllbmNlIHdpdGggb3RoZXIgYXBwcyBvbiB0aGUgQW5kcm9pZAotcGxhdGZvcm0gYW5kIHRvIGF2b2lkIGNvbmZ1c2lvbiBiZXR3ZWVuIGFjdGlvbnMgYW5kIHZpZXcgc3dpdGNoaW5nIG9uIEFuZHJvaWQuPC9wPgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIHByb3Blcmx5IHVzZSBhY3Rpb24gYmFycyBmb3IgdmlldyBjb250cm9sLCBzZWUKLTxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyczwvYT4uPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9taWdyYXRpbmdfaW9zX2RpYWxlcnMucG5nIj4KLSAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gICAgICBBbmRyb2lkIGRpYWxlciB3aXRoIHRhYnMgaW4gYW4gYWN0aW9uIGJhciB2cy4gYm90dG9tIHRhYnMgaW4gaU9TLgotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+RG9uJ3QgdXNlIGxhYmVsZWQgYmFjayBidXR0b25zIG9uIGFjdGlvbiBiYXJzPC9oND4KLTxwPk90aGVyIHBsYXRmb3JtcyB1c2UgYW4gZXhwbGljaXQgYmFjayBidXR0b24gd2l0aCBsYWJlbCB0byBhbGxvdyB0aGUgdXNlciB0byBuYXZpZ2F0ZSB1cCB0aGUKLWFwcGxpY2F0aW9uJ3MgaGllcmFyY2h5LiBJbnN0ZWFkLCBBbmRyb2lkIHVzZXMgdGhlIG1haW4gYWN0aW9uIGJhcidzIGFwcCBpY29uIGZvciBoaWVyYXJjaGljYWwKLW5hdmlnYXRpb24gYW5kIHRoZSBuYXZpZ2F0aW9uIGJhcidzIGJhY2sgYnV0dG9uIGZvciB0ZW1wb3JhbCBuYXZpZ2F0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKLXBsZWFzZSByZXZpZXcgdGhlIDxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT4gcGF0dGVybi48L3A+Ci08cD5Gb2xsb3cgdGhpcyBndWlkZWxpbmUgdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgbmF2aWdhdGlvbiBleHBlcmllbmNlIGFjcm9zcyB0aGUgcGxhdGZvcm0uPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9taWdyYXRpbmdfaW9zX2dhbGxlcmllcy5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIEFuZHJvaWQgYWN0aW9uIGJhciB3aXRoIHVwIGNhcmV0IHZzLiBpT1MgbGFiZWxlZCAiQmFjayIgYnV0dG9uLgotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgotCi08aDQ+RG9uJ3QgdXNlIHJpZ2h0LXBvaW50aW5nIGNhcmV0cyBvbiBsaW5lIGl0ZW1zPC9oND4KLTxwPkEgY29tbW9uIHBhdHRlcm4gb24gb3RoZXIgcGxhdGZvcm1zIGlzIHRoZSBkaXNwbGF5IG9mIHJpZ2h0LXBvaW50aW5nIGNhcmV0cyBvbiBsaW5lIGl0ZW1zIHRoYXQgYWxsb3cKLXRoZSB1c2VyIHRvIGRyaWxsIGRlZXBlciBpbnRvIGFkZGl0aW9uYWwgY29udGVudC48L3A+Ci08cD5BbmRyb2lkIGRvZXMgbm90IHVzZSBzdWNoIGluZGljYXRvcnMgb24gZHJpbGwtZG93biBsaW5lIGl0ZW1zLiBBdm9pZCB0aGVtIHRvIHN0YXkgY29uc2lzdGVudCB3aXRoCi10aGUgcGxhdGZvcm0gYW5kIGluIG9yZGVyIHRvIG5vdCBoYXZlIHRoZSB1c2VyIGd1ZXNzIGFzIHRvIHdoYXQgdGhlIG1lYW5pbmcgb2YgdGhvc2UgY2FyZXRzIG1heSBiZS48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L21pZ3JhdGluZ19pb3Nfc2V0dGluZ3MucG5nIj4KLSAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gICAgICBBbmRyb2lkIHNldHRpbmdzIHdpdGhvdXQgcmlnaHQtcG9pbnRpbmcgY2FyZXRzIGluIGxpbmUgaXRlbXMgdnMuIGlPUyBzZXR0aW5ncy4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDIgaWQ9ImRldmljZS1pbmRlcGVuZGVuY2UiPkRldmljZSBJbmRlcGVuZGVuY2U8L2gyPgotCi08cD5SZW1lbWJlciB0aGF0IHlvdXIgYXBwIHdpbGwgcnVuIG9uIGEgd2lkZSB2YXJpZXR5IG9mIGRpZmZlcmVudCBzY3JlZW4gc2l6ZXMuIENyZWF0ZSB2aXN1YWwgYXNzZXRzCi1mb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcyBhbmQgZGVuc2l0aWVzIGFuZCBtYWtlIHVzZSBvZiBjb25jZXB0cyBzdWNoIGFzIG11bHRpLXBhbmUgbGF5b3V0cyB0bwotYXBwcm9wcmlhdGVseSBzY2FsZSB5b3VyIFVJIG9uIGRpZmZlcmVudCBkZXZpY2UgZm9ybSBmYWN0b3JzLjwvcD4KLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIDxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+IGFzCi13ZWxsIGFzIDxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+IGluIHRoaXMgZGVzaWduIGd1aWRlLjwvcD4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDEzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5qZApAQCAtMCwwICsxLDEzNiBAQAorcGFnZS50aXRsZT1QdXJlIEFuZHJvaWQKK0BqZDpib2R5CisKKzxwPk1vc3QgZGV2ZWxvcGVycyB3YW50IHRvIGRpc3RyaWJ1dGUgdGhlaXIgYXBwcyBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMuIEFzIHlvdSBwbGFuIHlvdXIgYXBwIGZvcgorQW5kcm9pZCwga2VlcCBpbiBtaW5kIHRoYXQgZGlmZmVyZW50IHBsYXRmb3JtcyBwbGF5IGJ5IGRpZmZlcmVudCBydWxlcyBhbmQgY29udmVudGlvbnMuIERlc2lnbgorZGVjaXNpb25zIHRoYXQgbWFrZSBwZXJmZWN0IHNlbnNlIG9uIG9uZSBwbGF0Zm9ybSB3aWxsIGxvb2sgYW5kIGZlZWwgbWlzcGxhY2VkIGluIHRoZSBjb250ZXh0IG9mIGEKK2RpZmZlcmVudCBwbGF0Zm9ybS4gV2hpbGUgYSAiZGVzaWduIG9uY2UsIHNoaXAgYW55d2hlcmUiIGFwcHJvYWNoIG1pZ2h0IHNhdmUgeW91IHRpbWUgdXAtZnJvbnQsIHlvdQorcnVuIHRoZSB2ZXJ5IHJlYWwgcmlzayBvZiBjcmVhdGluZyBpbmNvbnNpc3RlbnQgYXBwcyB0aGF0IGFsaWVuYXRlIHVzZXJzLiBDb25zaWRlciB0aGUgZm9sbG93aW5nCitndWlkZWxpbmVzIHRvIGF2b2lkIHRoZSBtb3N0IGNvbW1vbiB0cmFwcyBhbmQgcGl0ZmFsbHMuPC9wPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxoND5Eb24ndCBtaW1pYyBVSSBlbGVtZW50cyBmcm9tIG90aGVyIHBsYXRmb3JtczwvaDQ+Cis8cD5QbGF0Zm9ybXMgdHlwaWNhbGx5IHByb3ZpZGUgYSBjYXJlZnVsbHkgZGVzaWduZWQgc2V0IG9mIFVJIGVsZW1lbnRzIHRoYXQgYXJlIHRoZW1lZCBpbiBhIHZlcnkKK2Rpc3RpbmN0aXZlIGZhc2hpb24uIEZvciBleGFtcGxlLCBzb21lIHBsYXRmb3JtcyBhZHZvY2F0ZSByb3VuZGVkIGNvcm5lcnMgZm9yIHRoZWlyIGJ1dHRvbnMsIG90aGVycwordXNlIGdyYWRpZW50cyBpbiB0aGVpciB0aXRsZSBiYXJzLiBJbiBzb21lIGNhc2VzLCBlbGVtZW50cyBtYXkgaGF2ZSB0aGUgc2FtZSBwdXJwb3NlLCBidXQgYXJlCitkZXNpZ25lZCB0byB3b3JrIGEgYml0IGRpZmZlcmVudGx5LjwvcD4KKzxwPkFzIHlvdSBidWlsZCB5b3VyIGFwcCBmb3IgQW5kcm9pZCwgZG9uJ3QgY2Fycnkgb3ZlciB0aGVtZWQgVUkgZWxlbWVudHMgZnJvbSBvdGhlciBwbGF0Zm9ybXMgYW5kCitkb24ndCBtaW1pYyB0aGVpciBzcGVjaWZpYyBiZWhhdmlvcnMuIFJldmlldyB0aGUKKzxhIGhyZWY9IntAZG9jUm9vdH1kZXNpZ24vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT4KK3NlY3Rpb24gaW4gdGhpcyBzdHlsZWd1aWRlIHRvIGxlYXJuIGFib3V0IEFuZHJvaWQncyBtb3N0IGltcG9ydGFudCBVSSBlbGVtZW50cworYW5kIHRoZSB3YXkgdGhleSBsb29rIGluIHRoZSBzeXN0ZW0gZGVmYXVsdCB0aGVtZXMuIEFsc28gZXhhbWluZSBBbmRyb2lkJ3MgcGxhdGZvcm0gYXBwcyB0byBnZXQgYQorc2Vuc2Ugb2YgaG93IGVsZW1lbnRzIGFyZSBhcHBsaWVkIGluIHRoZSBjb250ZXh0IG9mIGFuIGFwcC4gSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZSB0aGVtZSBvZiBVSQorZWxlbWVudHMsIGN1c3RvbWl6ZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHlvdXIgc3BlY2lmaWMgYnJhbmRpbmcgLSBhbmQgbm90IGFjY29yZGluZyB0byB0aGUKK2NvbnZlbnRpb25zIG9mIGEgZGlmZmVyZW50IHBsYXRmb3JtLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9taWdyYXRpbmdfdWlfZWxlbWVudHMucG5nIj4KKyAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgICAgICBTYW1wbGluZyBvZiBVSSBlbGVtZW50cyBmcm9tIEFuZHJvaWQsIGlPUyBhbmQgV2luZG93cyBQaG9uZSA3LgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPGg0PkRvbid0IGNhcnJ5IG92ZXIgcGxhdGZvcm0tc3BlY2lmaWMgaWNvbnM8L2g0PgorPHA+UGxhdGZvcm1zIHR5cGljYWxseSBwcm92aWRlIHNldHMgb2YgaWNvbnMgZm9yIGNvbW1vbiBmdW5jdGlvbmFsaXR5LCBzdWNoIGFzIHNoYXJpbmcsIGNyZWF0aW5nIGEgbmV3Citkb2N1bWVudCBvciBkZWxldGluZy48L3A+Cis8cD5BcyB5b3UgYXJlIG1pZ3JhdGluZyB5b3VyIGFwcCB0byBBbmRyb2lkLCBwbGVhc2Ugc3dhcCBvdXQgcGxhdGZvcm0tc3BlY2lmaWMgaWNvbnMgd2l0aCB0aGVpciBBbmRyb2lkCitjb3VudGVycGFydHMuPC9wPgorPHA+WW91IGNhbiBmaW5kIGEgd2lkZSB2YXJpZXR5IG9mIGljb25zIGZvciB1c2UgaW4geW91ciBhcHAgaW4gdGhlIEFuZHJvaWQgU0RLLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9taWdyYXRpbmdfaWNvbnMucG5nIj4KKyAgICA8ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+CisgICAgICBTYW1wbGluZyBvZiBpY29ucyBmcm9tIEFuZHJvaWQsIGlPUyBhbmQgV2luZG93cyBQaG9uZSA3LgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPGg0PkRvbid0IHVzZSBib3R0b20gdGFiIGJhcnM8L2g0PgorPHA+T3RoZXIgcGxhdGZvcm1zIHVzZSB0aGUgYm90dG9tIHRhYiBiYXIgdG8gc3dpdGNoIGJldHdlZW4gdGhlIGFwcCdzIHZpZXdzLiBQZXIgcGxhdGZvcm0gY29udmVudGlvbiwKK0FuZHJvaWQncyB0YWJzIGZvciB2aWV3IGNvbnRyb2wgYXJlIHNob3duIGluIGFjdGlvbiBiYXJzIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiBpbnN0ZWFkLiBJbgorYWRkaXRpb24sIEFuZHJvaWQgYXBwcyBtYXkgdXNlIGEgYm90dG9tIGJhciB0byBkaXNwbGF5IGFjdGlvbnMgb24gYSBzcGxpdCBhY3Rpb24gYmFyLjwvcD4KKzxwPllvdSBzaG91bGQgZm9sbG93IHRoaXMgZ3VpZGVsaW5lIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgZXhwZXJpZW5jZSB3aXRoIG90aGVyIGFwcHMgb24gdGhlIEFuZHJvaWQKK3BsYXRmb3JtIGFuZCB0byBhdm9pZCBjb25mdXNpb24gYmV0d2VlbiBhY3Rpb25zIGFuZCB2aWV3IHN3aXRjaGluZyBvbiBBbmRyb2lkLjwvcD4KKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwcm9wZXJseSB1c2UgYWN0aW9uIGJhcnMgZm9yIHZpZXcgY29udHJvbCwgc2VlCis8YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyczwvYT4uPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL21pZ3JhdGluZ19pb3NfZGlhbGVycy5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEFuZHJvaWQgZGlhbGVyIHdpdGggdGFicyBpbiBhbiBhY3Rpb24gYmFyIHZzLiBib3R0b20gdGFicyBpbiBpT1MuCisgICAgPC9kaXY+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxoND5Eb24ndCB1c2UgbGFiZWxlZCBiYWNrIGJ1dHRvbnMgb24gYWN0aW9uIGJhcnM8L2g0PgorPHA+T3RoZXIgcGxhdGZvcm1zIHVzZSBhbiBleHBsaWNpdCBiYWNrIGJ1dHRvbiB3aXRoIGxhYmVsIHRvIGFsbG93IHRoZSB1c2VyIHRvIG5hdmlnYXRlIHVwIHRoZQorYXBwbGljYXRpb24ncyBoaWVyYXJjaHkuIEluc3RlYWQsIEFuZHJvaWQgdXNlcyB0aGUgbWFpbiBhY3Rpb24gYmFyJ3MgYXBwIGljb24gZm9yIGhpZXJhcmNoaWNhbAorbmF2aWdhdGlvbiBhbmQgdGhlIG5hdmlnYXRpb24gYmFyJ3MgYmFjayBidXR0b24gZm9yIHRlbXBvcmFsIG5hdmlnYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLAorcGxlYXNlIHJldmlldyB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+IHBhdHRlcm4uPC9wPgorPHA+Rm9sbG93IHRoaXMgZ3VpZGVsaW5lIHRvIHByb3ZpZGUgYSBjb25zaXN0ZW50IG5hdmlnYXRpb24gZXhwZXJpZW5jZSBhY3Jvc3MgdGhlIHBsYXRmb3JtLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9taWdyYXRpbmdfaW9zX2dhbGxlcmllcy5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEFuZHJvaWQgYWN0aW9uIGJhciB3aXRoIHVwIGNhcmV0IHZzLiBpT1MgbGFiZWxlZCAiQmFjayIgYnV0dG9uLgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8aDQ+RG9uJ3QgdXNlIHJpZ2h0LXBvaW50aW5nIGNhcmV0cyBvbiBsaW5lIGl0ZW1zPC9oND4KKzxwPkEgY29tbW9uIHBhdHRlcm4gb24gb3RoZXIgcGxhdGZvcm1zIGlzIHRoZSBkaXNwbGF5IG9mIHJpZ2h0LXBvaW50aW5nIGNhcmV0cyBvbiBsaW5lIGl0ZW1zIHRoYXQgYWxsb3cKK3RoZSB1c2VyIHRvIGRyaWxsIGRlZXBlciBpbnRvIGFkZGl0aW9uYWwgY29udGVudC48L3A+Cis8cD5BbmRyb2lkIGRvZXMgbm90IHVzZSBzdWNoIGluZGljYXRvcnMgb24gZHJpbGwtZG93biBsaW5lIGl0ZW1zLiBBdm9pZCB0aGVtIHRvIHN0YXkgY29uc2lzdGVudCB3aXRoCit0aGUgcGxhdGZvcm0gYW5kIGluIG9yZGVyIHRvIG5vdCBoYXZlIHRoZSB1c2VyIGd1ZXNzIGFzIHRvIHdoYXQgdGhlIG1lYW5pbmcgb2YgdGhvc2UgY2FyZXRzIG1heSBiZS48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbWlncmF0aW5nX2lvc19zZXR0aW5ncy5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEFuZHJvaWQgc2V0dGluZ3Mgd2l0aG91dCByaWdodC1wb2ludGluZyBjYXJldHMgaW4gbGluZSBpdGVtcyB2cy4gaU9TIHNldHRpbmdzLgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxoMiBpZD0iZGV2aWNlLWluZGVwZW5kZW5jZSI+RGV2aWNlIEluZGVwZW5kZW5jZTwvaDI+CisKKzxwPlJlbWVtYmVyIHRoYXQgeW91ciBhcHAgd2lsbCBydW4gb24gYSB3aWRlIHZhcmlldHkgb2YgZGlmZmVyZW50IHNjcmVlbiBzaXplcy4gQ3JlYXRlIHZpc3VhbCBhc3NldHMKK2ZvciBkaWZmZXJlbnQgc2NyZWVuIHNpemVzIGFuZCBkZW5zaXRpZXMgYW5kIG1ha2UgdXNlIG9mIGNvbmNlcHRzIHN1Y2ggYXMgbXVsdGktcGFuZSBsYXlvdXRzIHRvCithcHByb3ByaWF0ZWx5IHNjYWxlIHlvdXIgVUkgb24gZGlmZmVyZW50IGRldmljZSBmb3JtIGZhY3RvcnMuPC9wPgorPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPiBhcword2VsbCBhcyA8YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+IGluIHRoaXMgZGVzaWduIGd1aWRlLjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM2YTg0Li4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gU2VsZWN0aW9uCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlNlbGVjdGlvbjwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+QW5kcm9pZCAzLjAgaW50cm9kdWNlZCB0aGUgPGVtPmxvbmcgcHJlc3M8L2VtPiBnZXN0dXJlJm1kYXNoO3RoYXQgaXMsIGEgdG91Y2ggdGhhdCdzIGhlbGQgaW4gdGhlIHNhbWUKLXBvc2l0aW9uIGZvciBhIG1vbWVudCZtZGFzaDthcyB0aGUgZ2xvYmFsIGdlc3R1cmUgdG8gc2VsZWN0IGRhdGEuIFRoaXMgYWZmZWN0cyB0aGUgd2F5IHlvdSBzaG91bGQKLWhhbmRsZSBtdWx0aS1zZWxlY3QgYW5kIGNvbnRleHR1YWwgYWN0aW9ucyBpbiB5b3VyIGFwcHMuPC9wPgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLTxoND5XaGF0IGhhcyBjaGFuZ2VkPzwvaDQ+Ci08cD5JbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBBbmRyb2lkLCB0aGUgbG9uZyBwcmVzcyBnZXN0dXJlIHdhcyB1bml2ZXJzYWxseSB1c2VkIHRvIGRpc3BsYXkgY29udGV4dHVhbAotYWN0aW9ucyBmb3IgYSBnaXZlbiBkYXRhIGl0ZW0gaW4gYSBjb250ZXh0dWFsIG1lbnUuPC9wPgotPHA+VGhpcyBwYXR0ZXJuIGNoYW5nZWQgd2l0aCBBbmRyb2lkIDMuMC4gVGhlIGxvbmcgcHJlc3MgZ2VzdHVyZSBpcyBub3cgdXNlZCB0byBzZWxlY3QgZGF0YSwgY29tYmluaW5nCi1jb250ZXh0dWFsIGFjdGlvbnMgYW5kIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3Igc2VsZWN0ZWQgZGF0YSBpbnRvIGEgbmV3IGVsZW1lbnQgY2FsbGVkCi10aGUgY29udGV4dHVhbCBhY3Rpb24gYmFyIChDQUIpLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2NvbnRleHRfbWVudS5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFRyYWRpdGlvbmFsIHVzZSBvZiB0aGUgbG9uZyBwcmVzcyBnZXN0dXJlIHRvIHNob3cgY29udGV4dHVhbCBtZW51cy4KLSAgICA8L2Rpdj4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08aDQ+VXNpbmcgdGhlIGNvbnRleHR1YWwgYWN0aW9uIGJhciAoQ0FCKTwvaDQ+Ci08cD5UaGUgc2VsZWN0aW9uIENBQiBpcyBhIHRlbXBvcmFyeSBhY3Rpb24gYmFyIHRoYXQgb3ZlcmxheXMgeW91ciBhcHAncyBjdXJyZW50IGFjdGlvbiBiYXIgd2hpbGUgZGF0YQotaXMgc2VsZWN0ZWQuIEl0IGFwcGVhcnMgYWZ0ZXIgdGhlIHVzZXIgbG9uZyBwcmVzc2VzIG9uIGEgc2VsZWN0YWJsZSBkYXRhIGl0ZW0uPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc2VsZWN0aW9uX2NhYl9iaWcucG5nIj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08cD5Gcm9tIGhlcmUgdGhlIHVzZXIgY2FuOjwvcD4KLTx1bD4KLTxsaT5TZWxlY3QgYWRkaXRpb25hbCBkYXRhIGl0ZW1zIGJ5IHRvdWNoaW5nIHRoZW0uPC9saT4KLTxsaT5UcmlnZ2VyIGFuIGFjdGlvbiBmcm9tIHRoZSBDQUIgdGhhdCBhcHBsaWVzIHRvIGFsbCBoaWdobGlnaHRlZCBkYXRhIGl0ZW1zLiBUaGUgQ0FCIHRoZW4KLSAgYXV0b21hdGljYWxseSBkaXNtaXNzZXMgaXRzZWxmLjwvbGk+Ci08bGk+RGlzbWlzcyB0aGUgQ0FCIHZpYSB0aGUgbmF2aWdhdGlvbiBiYXIncyBCYWNrIGJ1dHRvbiBvciB0aGUgQ0FCJ3MgY2hlY2ttYXJrIGJ1dHRvbi4gVGhpcyByZW1vdmVzCi0gIHRoZSBDQUIgYWxvbmcgd2l0aCBhbGwgc2VsZWN0aW9uIGhpZ2hsaWdodHMuPC9saT4KLTwvdWw+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3NlbGVjdGlvbl9jYWJfZXhhbXBsZS5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08aDQ+U2VsZWN0aW5nIENBQiBhY3Rpb25zPC9oND4KLTxwPllvdSBjYW4gZGVjaWRlIHdoaWNoIGFjdGlvbnMgYW5kIGVsZW1lbnRzIGFwcGVhciBpbiB0aGUgQ0FCLiBVc2UgdGhlIGd1aWRlbGluZXMgaW4gdGhlIDxhIGhyZWY9ImFjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyCi1wYXR0ZXJuPC9hPiB0byBkZWNpZGUgd2hpY2ggaXRlbXMgdG8gc3VyZmFjZSBhdCB0aGUgdG9wIGxldmVsIGFuZCB3aGljaCB0byBtb3ZlIHRvIHRoZQotYWN0aW9uIG92ZXJmbG93LjwvcD4KLTxoND5EeW5hbWljYWxseSBhZGp1c3QgQ0FCIGFjdGlvbnM8L2g0PgotPHA+SW4gbW9zdCBjYXNlcyB5b3UgbmVlZCB0byBhZGp1c3QgdGhlIGFjdGlvbnMgaW4gdGhlIENBQiBkeW5hbWljYWxseSBhcyB0aGUgdXNlciBhZGRzIG1vcmUgaXRlbXMgdG8KLXRoZSBzZWxlY3Rpb24uIEFjdGlvbnMgdGhhdCBhcHBseSB0byBhIHNpbmdsZSBzZWxlY3RlZCBkYXRhIGl0ZW0gZG9uJ3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gbXVsdGlwbGUKLXNlbGVjdGVkIGRhdGEgaXRlbXMgb2YgdGhlIHNhbWUga2luZC48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3NlbGVjdGlvbl9hZGp1c3RpbmdfYWN0aW9ucy5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIEFkanVzdGluZyBhY3Rpb25zIGluIHRoZSBDQUIgYXMgYWRkaXRpb25hbCBpdGVtcyBhcmUgc2VsZWN0ZWQuCi0gICAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGgyIGlkPSJjaGVja2xpc3QiPkNoZWNrbGlzdDwvaDI+Ci0KLTx1bD4KLTxsaT4KLTxwPldoZW5ldmVyIHlvdXIgYXBwIHN1cHBvcnRzIHRoZSBzZWxlY3Rpb24gb2YgbXVsdGlwbGUgZGF0YSBpdGVtcywgbWFrZSB1c2Ugb2YgdGhlIGNvbnRleHR1YWwgYWN0aW9uCi0gIGJhciAoQ0FCKS48L3A+Ci08L2xpPgotPGxpPgotPHA+UmVzZXJ2ZSB0aGUgbG9uZyBwcmVzcyBnZXN0dXJlIGZvciBzZWxlY3Rpb24gZXhjbHVzaXZlbHkuIERvbid0IHVzZSBpdCB0byBkaXNwbGF5IHRyYWRpdGlvbmFsCi0gIGNvbnRleHR1YWwgbWVudXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIHlvdSBkb24ndCBzdXBwb3J0IG11bHRpLXNlbGVjdGlvbiB3aXRoaW4gYSBsaXN0LCBsb25nIHByZXNzIHNob3VsZCBkbyBub3RoaW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QbGFuIHRoZSBhY3Rpb25zIHlvdSB3YW50IHRvIGRpc3BsYXkgaW5zaWRlIG9mIGEgQ0FCIGluIHRoZSBzYW1lIHdheSB5b3Ugd291bGQgcGxhbiB0aGUgYWN0aW9ucwotICBpbnNpZGUgeW91ciBhcHAncyBhY3Rpb24gYmFyLjwvcD4KLTwvbGk+Ci08L3VsPgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvc2VsZWN0aW9uLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9zZWxlY3Rpb24uamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlZTkwZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvc2VsZWN0aW9uLmpkCkBAIC0wLDAgKzEsMTAwIEBACitwYWdlLnRpdGxlPVNlbGVjdGlvbgorQGpkOmJvZHkKKworPHA+QW5kcm9pZCAzLjAgaW50cm9kdWNlZCB0aGUgPGVtPmxvbmcgcHJlc3M8L2VtPiBnZXN0dXJlJm1kYXNoO3RoYXQgaXMsIGEgdG91Y2ggdGhhdCdzIGhlbGQgaW4gdGhlIHNhbWUKK3Bvc2l0aW9uIGZvciBhIG1vbWVudCZtZGFzaDthcyB0aGUgZ2xvYmFsIGdlc3R1cmUgdG8gc2VsZWN0IGRhdGEuIFRoaXMgYWZmZWN0cyB0aGUgd2F5IHlvdSBzaG91bGQKK2hhbmRsZSBtdWx0aS1zZWxlY3QgYW5kIGNvbnRleHR1YWwgYWN0aW9ucyBpbiB5b3VyIGFwcHMuPC9wPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5XaGF0IGhhcyBjaGFuZ2VkPzwvaDQ+Cis8cD5JbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBBbmRyb2lkLCB0aGUgbG9uZyBwcmVzcyBnZXN0dXJlIHdhcyB1bml2ZXJzYWxseSB1c2VkIHRvIGRpc3BsYXkgY29udGV4dHVhbAorYWN0aW9ucyBmb3IgYSBnaXZlbiBkYXRhIGl0ZW0gaW4gYSBjb250ZXh0dWFsIG1lbnUuPC9wPgorPHA+VGhpcyBwYXR0ZXJuIGNoYW5nZWQgd2l0aCBBbmRyb2lkIDMuMC4gVGhlIGxvbmcgcHJlc3MgZ2VzdHVyZSBpcyBub3cgdXNlZCB0byBzZWxlY3QgZGF0YSwgY29tYmluaW5nCitjb250ZXh0dWFsIGFjdGlvbnMgYW5kIHNlbGVjdGlvbiBtYW5hZ2VtZW50IGZ1bmN0aW9ucyBmb3Igc2VsZWN0ZWQgZGF0YSBpbnRvIGEgbmV3IGVsZW1lbnQgY2FsbGVkCit0aGUgY29udGV4dHVhbCBhY3Rpb24gYmFyIChDQUIpLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zZWxlY3Rpb25fY29udGV4dF9tZW51LnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgVHJhZGl0aW9uYWwgdXNlIG9mIHRoZSBsb25nIHByZXNzIGdlc3R1cmUgdG8gc2hvdyBjb250ZXh0dWFsIG1lbnVzLgorICAgIDwvZGl2PgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxoND5Vc2luZyB0aGUgY29udGV4dHVhbCBhY3Rpb24gYmFyIChDQUIpPC9oND4KKzxwPlRoZSBzZWxlY3Rpb24gQ0FCIGlzIGEgdGVtcG9yYXJ5IGFjdGlvbiBiYXIgdGhhdCBvdmVybGF5cyB5b3VyIGFwcCdzIGN1cnJlbnQgYWN0aW9uIGJhciB3aGlsZSBkYXRhCitpcyBzZWxlY3RlZC4gSXQgYXBwZWFycyBhZnRlciB0aGUgdXNlciBsb25nIHByZXNzZXMgb24gYSBzZWxlY3RhYmxlIGRhdGEgaXRlbS48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3NlbGVjdGlvbl9jYWJfYmlnLnBuZyI+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworPHA+RnJvbSBoZXJlIHRoZSB1c2VyIGNhbjo8L3A+Cis8dWw+Cis8bGk+U2VsZWN0IGFkZGl0aW9uYWwgZGF0YSBpdGVtcyBieSB0b3VjaGluZyB0aGVtLjwvbGk+Cis8bGk+VHJpZ2dlciBhbiBhY3Rpb24gZnJvbSB0aGUgQ0FCIHRoYXQgYXBwbGllcyB0byBhbGwgaGlnaGxpZ2h0ZWQgZGF0YSBpdGVtcy4gVGhlIENBQiB0aGVuCisgIGF1dG9tYXRpY2FsbHkgZGlzbWlzc2VzIGl0c2VsZi48L2xpPgorPGxpPkRpc21pc3MgdGhlIENBQiB2aWEgdGhlIG5hdmlnYXRpb24gYmFyJ3MgQmFjayBidXR0b24gb3IgdGhlIENBQidzIGNoZWNrbWFyayBidXR0b24uIFRoaXMgcmVtb3ZlcworICB0aGUgQ0FCIGFsb25nIHdpdGggYWxsIHNlbGVjdGlvbiBoaWdobGlnaHRzLjwvbGk+Cis8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3NlbGVjdGlvbl9jYWJfZXhhbXBsZS5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCis8aDQ+U2VsZWN0aW5nIENBQiBhY3Rpb25zPC9oND4KKzxwPllvdSBjYW4gZGVjaWRlIHdoaWNoIGFjdGlvbnMgYW5kIGVsZW1lbnRzIGFwcGVhciBpbiB0aGUgQ0FCLiBVc2UgdGhlIGd1aWRlbGluZXMgaW4gdGhlIDxhIGhyZWY9ImFjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyCitwYXR0ZXJuPC9hPiB0byBkZWNpZGUgd2hpY2ggaXRlbXMgdG8gc3VyZmFjZSBhdCB0aGUgdG9wIGxldmVsIGFuZCB3aGljaCB0byBtb3ZlIHRvIHRoZQorYWN0aW9uIG92ZXJmbG93LjwvcD4KKzxoND5EeW5hbWljYWxseSBhZGp1c3QgQ0FCIGFjdGlvbnM8L2g0PgorPHA+SW4gbW9zdCBjYXNlcyB5b3UgbmVlZCB0byBhZGp1c3QgdGhlIGFjdGlvbnMgaW4gdGhlIENBQiBkeW5hbWljYWxseSBhcyB0aGUgdXNlciBhZGRzIG1vcmUgaXRlbXMgdG8KK3RoZSBzZWxlY3Rpb24uIEFjdGlvbnMgdGhhdCBhcHBseSB0byBhIHNpbmdsZSBzZWxlY3RlZCBkYXRhIGl0ZW0gZG9uJ3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gbXVsdGlwbGUKK3NlbGVjdGVkIGRhdGEgaXRlbXMgb2YgdGhlIHNhbWUga2luZC48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvc2VsZWN0aW9uX2FkanVzdGluZ19hY3Rpb25zLnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgQWRqdXN0aW5nIGFjdGlvbnMgaW4gdGhlIENBQiBhcyBhZGRpdGlvbmFsIGl0ZW1zIGFyZSBzZWxlY3RlZC4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8aDIgaWQ9ImNoZWNrbGlzdCI+Q2hlY2tsaXN0PC9oMj4KKworPHVsPgorPGxpPgorPHA+V2hlbmV2ZXIgeW91ciBhcHAgc3VwcG9ydHMgdGhlIHNlbGVjdGlvbiBvZiBtdWx0aXBsZSBkYXRhIGl0ZW1zLCBtYWtlIHVzZSBvZiB0aGUgY29udGV4dHVhbCBhY3Rpb24KKyAgYmFyIChDQUIpLjwvcD4KKzwvbGk+Cis8bGk+Cis8cD5SZXNlcnZlIHRoZSBsb25nIHByZXNzIGdlc3R1cmUgZm9yIHNlbGVjdGlvbiBleGNsdXNpdmVseS4gRG9uJ3QgdXNlIGl0IHRvIGRpc3BsYXkgdHJhZGl0aW9uYWwKKyAgY29udGV4dHVhbCBtZW51cy48L3A+Cis8L2xpPgorPGxpPgorPHA+SWYgeW91IGRvbid0IHN1cHBvcnQgbXVsdGktc2VsZWN0aW9uIHdpdGhpbiBhIGxpc3QsIGxvbmcgcHJlc3Mgc2hvdWxkIGRvIG5vdGhpbmcuPC9wPgorPC9saT4KKzxsaT4KKzxwPlBsYW4gdGhlIGFjdGlvbnMgeW91IHdhbnQgdG8gZGlzcGxheSBpbnNpZGUgb2YgYSBDQUIgaW4gdGhlIHNhbWUgd2F5IHlvdSB3b3VsZCBwbGFuIHRoZSBhY3Rpb25zCisgIGluc2lkZSB5b3VyIGFwcCdzIGFjdGlvbiBiYXIuPC9wPgorPC9saT4KKzwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYzlmMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIFN3aXBlIFZpZXdzCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlN3aXBlIFZpZXdzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5FZmZpY2llbnQgbmF2aWdhdGlvbiBpcyBvbmUgb2YgdGhlIGNvcm5lcnN0b25lcyBvZiBhIHdlbGwtZGVzaWduZWQgYXBwLiBXaGlsZSBhcHBzIGFyZSBnZW5lcmFsbHkKLWJ1aWx0IGluIGEgaGllcmFyY2hpY2FsIGZhc2hpb24sIHRoZXJlIGFyZSBpbnN0YW5jZXMgd2hlcmUgaG9yaXpvbnRhbCBuYXZpZ2F0aW9uIGNhbiBmbGF0dGVuCi12ZXJ0aWNhbCBoaWVyYXJjaGllcyBhbmQgbWFrZSBhY2Nlc3MgdG8gcmVsYXRlZCBkYXRhIGl0ZW1zIGZhc3RlciBhbmQgbW9yZSBlbmpveWFibGUuIFN3aXBlIHZpZXdzCi1hbGxvdyB0aGUgdXNlciB0byBlZmZpY2llbnRseSBtb3ZlIGZyb20gaXRlbSB0byBpdGVtIHVzaW5nIGEgc2ltcGxlIGdlc3R1cmUgYW5kIHRoZXJlYnkgbWFrZQotYnJvd3NpbmcgYW5kIGNvbnN1bWluZyBkYXRhIGEgbW9yZSBmbHVlbnQgZXhwZXJpZW5jZS48L3A+Ci08aDIgaWQ9ImRldGFpbC12aWV3cyI+U3dpcGluZyBCZXR3ZWVuIERldGFpbCBWaWV3czwvaDI+Ci0KLTxwPkFuIGFwcCdzIGRhdGEgaXMgb2Z0ZW4gb3JnYW5pemVkIGluIGEgbWFzdGVyL2RldGFpbCByZWxhdGlvbnNoaXA6IFRoZSB1c2VyIGNhbiB2aWV3IGEgbGlzdCBvZgotcmVsYXRlZCBkYXRhIGl0ZW1zLCBzdWNoIGFzIGltYWdlcywgY2hhdHMsIG9yIGVtYWlscywgYW5kIHRoZW4gcGljayBvbmUgb2YgdGhlIGl0ZW1zIHRvIHNlZSB0aGUKLWRldGFpbCBjb250ZW50cyBpbiBhIHNlcGFyYXRlIHNjcmVlbi48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9zd2lwZV92aWV3cy5wbmciPgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICBNYXN0ZXIgKGxlZnQpIGFuZCBkZXRhaWwgKHJpZ2h0KSB2aWV3cy4KLTwvZGl2PgotCi08cD5PbiBhIHBob25lLCBzaW5jZSB0aGUgbWFzdGVyIGFuZCBkZXRhaWwgYXJlIG9uIHNlcGFyYXRlIHNjcmVlbnMsIHRoaXMgdHlwaWNhbGx5IHJlcXVpcmVzIHRoZSB1c2VyIHRvCi1qdW1wIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIGxpc3QgYW5kIHRoZSBkZXRhaWwgdmlldywgYWthICJwb2dvLXN0aWNraW5nIi48L3A+Ci08cD5JbiBjYXNlcyB3aGVyZSB1c2VycyB3aWxsIHdhbnQgdG8gdmlldyBtdWx0aXBsZSBkZXRhaWwgaXRlbXMgaW4gc3VjY2Vzc2lvbiwgYXZvaWQgcG9nby1zdGlja2luZyBieQotdXNpbmcgdGhlIHN3aXBlIGdlc3R1cmUgdG8gbmF2aWdhdGUgdG8gdGhlIG5leHQvcHJldmlvdXMgZGV0YWlsIHZpZXcuPC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc3dpcGVfdmlld3MyLnBuZyI+Ci08ZGl2IGNsYXNzPSJmaWd1cmUtY2FwdGlvbiI+Ci0gIE5hdmlnYXRpbmcgYmV0d2VlbiBjb25zZWN1dGl2ZSBFbWFpbCBtZXNzYWdlcyB1c2luZyB0aGUgc3dpcGUgZ2VzdHVyZS4KLTwvZGl2PgotCi08aDIgaWQ9ImJldHdlZW4tdGFicyI+U3dpcGluZyBCZXR3ZWVuIFRhYnM8L2gyPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotICAgIDxkaXYgY2xhc3M9ImZyYW1lZC1nYWxheHluZXh1cy1wb3J0LXNwYW4tNSI+Ci0gICAgICA8dmlkZW8gY2xhc3M9InBsYXktb24taG92ZXIiIGF1dG9wbGF5PgotICAgICAgICA8c291cmNlIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc3dpcGVfdGFicy5tcDQiIHR5cGU9InZpZGVvL21wNCI+Ci0gICAgICAgIDxzb3VyY2Ugc3JjPSIuLi9zdGF0aWMvY29udGVudC9zd2lwZV90YWJzLndlYm0iIHR5cGU9InZpZGVvL3dlYm0iPgotICAgICAgICA8c291cmNlIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvc3dpcGVfdGFicy5vZ3YiIHR5cGU9InZpZGVvL29nZyI+Ci0gICAgICA8L3ZpZGVvPgotICAgIDwvZGl2PgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFBlb3BsZSBhcHAgd2l0aCBzd2lwZSBnZXN0dXJlIG5hdmlnYXRpb24gYmV0d2VlbiB0b3AtbGV2ZWwgc2NyZWVucy4KLSAgICAgIDxkaXYgY2xhc3M9InZpZGVvLWluc3RydWN0aW9ucyI+Jm5ic3A7PC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi08cD5JZiB5b3VyIGFwcCB1c2VzIGFjdGlvbiBiYXIgdGFicywgdXNlIHN3aXBlIHRvIG5hdmlnYXRlIGJldHdlZW4gdGhlIGRpZmZlcmVudCB2aWV3cy48L3A+Ci08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KLQotPGgyIGlkPSJjaGVja2xpc3QiPkNoZWNrbGlzdDwvaDI+Ci0KLTx1bD4KLTxsaT4KLTxwPlVzZSBzd2lwZSB0byBxdWlja2x5IG5hdmlnYXRlIGJldHdlZW4gZGV0YWlsIHZpZXdzIG9yIHRhYnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRyYW5zaXRpb24gYmV0d2VlbiB0aGUgdmlld3MgYXMgdGhlIHVzZXIgcGVyZm9ybXMgdGhlIHN3aXBlIGdlc3R1cmUuIERvIG5vdCB3YWl0IGZvciB0aGUKLSAgZ2VzdHVyZSB0byBjb21wbGV0ZSBhbmQgdGhlbiB0cmFuc2l0aW9uIGJldHdlZW4gdmlld3MuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIHlvdSB1c2VkIGJ1dHRvbnMgaW4gdGhlIHBhc3QgZm9yIHByZXZpb3VzL25leHQgbmF2aWdhdGlvbiwgcmVwbGFjZSB0aGVtIHdpdGgKLSAgdGhlIHN3aXBlIGdlc3R1cmUuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNvbnNpZGVyIGFkZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGluIHlvdXIgZGV0YWlsIHZpZXcgdGhhdCBpbmZvcm1zIHRoZSB1c2VyIGFib3V0IHRoZQotICByZWxhdGl2ZSBsaXN0IHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBpdGVtLjwvcD4KLTwvbGk+Ci08L3VsPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9wYXR0ZXJucy9zd2lwZS12aWV3cy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvc3dpcGUtdmlld3MuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkNjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vcGF0dGVybnMvc3dpcGUtdmlld3MuamQKQEAgLTAsMCArMSw3NCBAQAorcGFnZS50aXRsZT1Td2lwZSBWaWV3cworQGpkOmJvZHkKKworPHA+RWZmaWNpZW50IG5hdmlnYXRpb24gaXMgb25lIG9mIHRoZSBjb3JuZXJzdG9uZXMgb2YgYSB3ZWxsLWRlc2lnbmVkIGFwcC4gV2hpbGUgYXBwcyBhcmUgZ2VuZXJhbGx5CitidWlsdCBpbiBhIGhpZXJhcmNoaWNhbCBmYXNoaW9uLCB0aGVyZSBhcmUgaW5zdGFuY2VzIHdoZXJlIGhvcml6b250YWwgbmF2aWdhdGlvbiBjYW4gZmxhdHRlbgordmVydGljYWwgaGllcmFyY2hpZXMgYW5kIG1ha2UgYWNjZXNzIHRvIHJlbGF0ZWQgZGF0YSBpdGVtcyBmYXN0ZXIgYW5kIG1vcmUgZW5qb3lhYmxlLiBTd2lwZSB2aWV3cworYWxsb3cgdGhlIHVzZXIgdG8gZWZmaWNpZW50bHkgbW92ZSBmcm9tIGl0ZW0gdG8gaXRlbSB1c2luZyBhIHNpbXBsZSBnZXN0dXJlIGFuZCB0aGVyZWJ5IG1ha2UKK2Jyb3dzaW5nIGFuZCBjb25zdW1pbmcgZGF0YSBhIG1vcmUgZmx1ZW50IGV4cGVyaWVuY2UuPC9wPgorPGgyIGlkPSJkZXRhaWwtdmlld3MiPlN3aXBpbmcgQmV0d2VlbiBEZXRhaWwgVmlld3M8L2gyPgorCis8cD5BbiBhcHAncyBkYXRhIGlzIG9mdGVuIG9yZ2FuaXplZCBpbiBhIG1hc3Rlci9kZXRhaWwgcmVsYXRpb25zaGlwOiBUaGUgdXNlciBjYW4gdmlldyBhIGxpc3Qgb2YKK3JlbGF0ZWQgZGF0YSBpdGVtcywgc3VjaCBhcyBpbWFnZXMsIGNoYXRzLCBvciBlbWFpbHMsIGFuZCB0aGVuIHBpY2sgb25lIG9mIHRoZSBpdGVtcyB0byBzZWUgdGhlCitkZXRhaWwgY29udGVudHMgaW4gYSBzZXBhcmF0ZSBzY3JlZW4uPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zd2lwZV92aWV3cy5wbmciPgorPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICBNYXN0ZXIgKGxlZnQpIGFuZCBkZXRhaWwgKHJpZ2h0KSB2aWV3cy4KKzwvZGl2PgorCis8cD5PbiBhIHBob25lLCBzaW5jZSB0aGUgbWFzdGVyIGFuZCBkZXRhaWwgYXJlIG9uIHNlcGFyYXRlIHNjcmVlbnMsIHRoaXMgdHlwaWNhbGx5IHJlcXVpcmVzIHRoZSB1c2VyIHRvCitqdW1wIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIGxpc3QgYW5kIHRoZSBkZXRhaWwgdmlldywgYWthICJwb2dvLXN0aWNraW5nIi48L3A+Cis8cD5JbiBjYXNlcyB3aGVyZSB1c2VycyB3aWxsIHdhbnQgdG8gdmlldyBtdWx0aXBsZSBkZXRhaWwgaXRlbXMgaW4gc3VjY2Vzc2lvbiwgYXZvaWQgcG9nby1zdGlja2luZyBieQordXNpbmcgdGhlIHN3aXBlIGdlc3R1cmUgdG8gbmF2aWdhdGUgdG8gdGhlIG5leHQvcHJldmlvdXMgZGV0YWlsIHZpZXcuPC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zd2lwZV92aWV3czIucG5nIj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgTmF2aWdhdGluZyBiZXR3ZWVuIGNvbnNlY3V0aXZlIEVtYWlsIG1lc3NhZ2VzIHVzaW5nIHRoZSBzd2lwZSBnZXN0dXJlLgorPC9kaXY+CisKKzxoMiBpZD0iYmV0d2Vlbi10YWJzIj5Td2lwaW5nIEJldHdlZW4gVGFiczwvaDI+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCisgICAgPGRpdiBjbGFzcz0iZnJhbWVkLWdhbGF4eW5leHVzLXBvcnQtc3Bhbi01Ij4KKyAgICAgIDx2aWRlbyBjbGFzcz0icGxheS1vbi1ob3ZlciIgYXV0b3BsYXk+CisgICAgICAgIDxzb3VyY2Ugc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3N3aXBlX3RhYnMubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgorICAgICAgICA8c291cmNlIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zd2lwZV90YWJzLndlYm0iIHR5cGU9InZpZGVvL3dlYm0iPgorICAgICAgICA8c291cmNlIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9zd2lwZV90YWJzLm9ndiIgdHlwZT0idmlkZW8vb2dnIj4KKyAgICAgIDwvdmlkZW8+CisgICAgPC9kaXY+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgUGVvcGxlIGFwcCB3aXRoIHN3aXBlIGdlc3R1cmUgbmF2aWdhdGlvbiBiZXR3ZWVuIHRvcC1sZXZlbCBzY3JlZW5zLgorICAgICAgPGRpdiBjbGFzcz0idmlkZW8taW5zdHJ1Y3Rpb25zIj4mbmJzcDs8L2Rpdj4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKzxwPklmIHlvdXIgYXBwIHVzZXMgYWN0aW9uIGJhciB0YWJzLCB1c2Ugc3dpcGUgdG8gbmF2aWdhdGUgYmV0d2VlbiB0aGUgZGlmZmVyZW50IHZpZXdzLjwvcD4KKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8aDIgaWQ9ImNoZWNrbGlzdCI+Q2hlY2tsaXN0PC9oMj4KKworPHVsPgorPGxpPgorPHA+VXNlIHN3aXBlIHRvIHF1aWNrbHkgbmF2aWdhdGUgYmV0d2VlbiBkZXRhaWwgdmlld3Mgb3IgdGFicy48L3A+Cis8L2xpPgorPGxpPgorPHA+VHJhbnNpdGlvbiBiZXR3ZWVuIHRoZSB2aWV3cyBhcyB0aGUgdXNlciBwZXJmb3JtcyB0aGUgc3dpcGUgZ2VzdHVyZS4gRG8gbm90IHdhaXQgZm9yIHRoZQorICBnZXN0dXJlIHRvIGNvbXBsZXRlIGFuZCB0aGVuIHRyYW5zaXRpb24gYmV0d2VlbiB2aWV3cy48L3A+Cis8L2xpPgorPGxpPgorPHA+SWYgeW91IHVzZWQgYnV0dG9ucyBpbiB0aGUgcGFzdCBmb3IgcHJldmlvdXMvbmV4dCBuYXZpZ2F0aW9uLCByZXBsYWNlIHRoZW0gd2l0aAorICB0aGUgc3dpcGUgZ2VzdHVyZS48L3A+Cis8L2xpPgorPGxpPgorPHA+Q29uc2lkZXIgYWRkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gaW4geW91ciBkZXRhaWwgdmlldyB0aGF0IGluZm9ybXMgdGhlIHVzZXIgYWJvdXQgdGhlCisgIHJlbGF0aXZlIGxpc3QgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGl0ZW0uPC9wPgorPC9saT4KKzwvdWw+CisKKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2NhbGxvdXQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY2FsbG91dC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDlmMzQuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvY2FsbG91dC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9kZWZhdWx0LmNzcyBiL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2RlZmF1bHQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWExZGIzLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2RlZmF1bHQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjMzICswLDAgQEAKLS8qIGNvbG9yIGRlZmluaXRpb25zICovCi0vKiAxNiBjb2x1bW4gbGF5b3V0ICovCi0vKiBjbGVhcmZpeCBpZGlvbSAqLwotLyogY29tbW9uIG1peGlucyAqLwotLyogcGFnZSBsYXlvdXQgKyB0b3AtbGV2ZWwgc3R5bGVzICovCi06Oi13ZWJraXQtc2VsZWN0aW9uLAotOjotbW96LXNlbGVjdGlvbiwKLTo6c2VsZWN0aW9uIHsKLSAgYmFja2dyb3VuZC1jb2xvcjogIzAwOTljYzsKLSAgY29sb3I6ICNmZmY7IH0KLQotaHRtbCwgYm9keSB7Ci0gIGhlaWdodDogMTAwJTsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwOwotICBiYWNrZ3JvdW5kOiAjZWVlIG5vbmUgbm8tcmVwZWF0IGZpeGVkIHRvcCBsZWZ0OwotICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWdyYWRpZW50KGxpbmVhciwgMTAwJSAwJSwgMTAwJSAxMDAlLCBmcm9tKCNkZGRkZGQpLCBjb2xvci1zdG9wKDI1JSwgI2YyZjJmMiksIGNvbG9yLXN0b3AoNzUlLCAjZjJmMmYyKSwgdG8oI2RkZGRkZCkpOwotICBiYWNrZ3JvdW5kLWltYWdlOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsICNkZGRkZGQsICNmMmYyZjIsICNmMmYyZjIsICNkZGRkZGQpOwotICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKLSAgLyogcHJldmVudCBzdWJwaXhlbCBhbnRpYWxpYXNpbmcsIHdoaWNoIHRoaWNrZW5zIHRoZSB0ZXh0ICovCi0gIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7Ci0gIC8qIG9wZW50eXBlIGZ0dyAqLyB9Ci0KLWJvZHkgewotICBjb2xvcjogIzU1NTU1NTsKLSAgZm9udDogMTRweC8yMHB4IFJvYm90bywgc2Fucy1zZXJpZjsKLSAgZm9udC13ZWlnaHQ6IDQwMDsgfQotCi0jcGFnZS1jb250YWluZXIgewotICB3aWR0aDogOTQwcHg7Ci0gIG1hcmdpbjogMCA0MHB4OyB9Ci0KLSNwYWdlLWhlYWRlciB7Ci0gIGhlaWdodDogODBweDsKLSAgbWFyZ2luLWJvdHRvbTogMjBweDsKLSAgZm9udC1zaXplOiA0OHB4OwotICBsaW5lLWhlaWdodDogNDhweDsKLSAgZm9udC13ZWlnaHQ6IDEwMDsKLSAgcGFkZGluZy1sZWZ0OiAxMHB4OyB9Ci0gICNwYWdlLWhlYWRlciBhIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgdG9wOiAyMHB4OwotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBjb2xvcjogIzU1NTU1NSAhaW1wb3J0YW50OyB9Ci0KLSNtYWluLXJvdyB7Ci0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsgfQotICAjbWFpbi1yb3c6YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICIuIjsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgICBoZWlnaHQ6IDA7Ci0gICAgY2xlYXI6IGJvdGg7Ci0gICAgdmlzaWJpbGl0eTogaGlkZGVuOyB9Ci0gICogaHRtbCAjbWFpbi1yb3cgewotICAgIGhlaWdodDogMXB4OyB9Ci0KLSNwYWdlLWZvb3RlciB7Ci0gIG1hcmdpbi1sZWZ0OiAxOTBweDsKLSAgbWFyZ2luLXRvcDogODBweDsKLSAgY29sb3I6ICM5OTk5OTk7Ci0gIHBhZGRpbmctYm90dG9tOiA0MHB4OwotICBmb250LXNpemU6IDEycHg7Ci0gIGxpbmUtaGVpZ2h0OiAxNXB4OyB9Ci0gICNwYWdlLWZvb3RlciBhIHsKLSAgICBjb2xvcjogIzc3Nzc3NzsgfQotICAjcGFnZS1mb290ZXIgI2NvcHlyaWdodCB7Ci0gICAgbWFyZ2luLWJvdHRvbTogMTBweDsgfQotCi0jbmF2IHsKLSAgd2lkdGg6IDE2MHB4OwotICBtYXJnaW4tcmlnaHQ6IDIwcHg7Ci0gIGZsb2F0OiBsZWZ0OyB9Ci0KLSNjb250ZW50IHsKLSAgd2lkdGg6IDc2MHB4OwotICBmbG9hdDogbGVmdDsgfQotCi1hLAotYTp2aXNpdGVkIHsKLSAgY29sb3I6ICMzMzMzMzM7IH0KLQotYTpob3ZlciwKLWFjcm9ueW06aG92ZXIgewotICBjb2xvcjogIzdhYTFiMCAhaW1wb3J0YW50OyB9Ci0KLWE6Zm9jdXMsCi1hOmFjdGl2ZSB7Ci0gIGNvbG9yOiAjMzNiNWU1ICFpbXBvcnRhbnQ7IH0KLQotaW1nIHsKLSAgYm9yZGVyOiBub25lOyB9Ci0KLXVsIHsKLSAgbWFyZ2luOiAwOwotICBwYWRkaW5nOiAwOyB9Ci0KLXN0cm9uZyB7Ci0gIGZvbnQtd2VpZ2h0OiA1MDA7IH0KLQotZW0gewotICBmb250LXN0eWxlOiBpdGFsaWM7IH0KLQotY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgbW9ub3NwYWNlOyB9Ci0KLWFjcm9ueW0gewotICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkICM1NTU1NTU7Ci0gIGN1cnNvcjogaGVscDsgfQotCi1hY3JvbnltOmhvdmVyIHsKLSAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzdhYTFiMDsgfQotCi1pbWcud2l0aC1zaGFkb3csCi12aWRlby53aXRoLXNoYWRvdyB7Ci0gIGJveC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMjUpOyB9Ci0KLS8qIGRpc2Nsb3N1cmVzIG1peGluICovCi0vKiBjb250ZW50IGxheW91dCAqLwotLmxheW91dC1jb250ZW50LXJvdyB7Ci0gIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsgfQotICAubGF5b3V0LWNvbnRlbnQtcm93OmFmdGVyIHsKLSAgICBjb250ZW50OiAiLiI7Ci0gICAgZGlzcGxheTogYmxvY2s7Ci0gICAgaGVpZ2h0OiAwOwotICAgIGNsZWFyOiBib3RoOwotICAgIHZpc2liaWxpdHk6IGhpZGRlbjsgfQotICAqIGh0bWwgLmxheW91dC1jb250ZW50LXJvdyB7Ci0gICAgaGVpZ2h0OiAxcHg7IH0KLQotLmxheW91dC1jb250ZW50LWNvbCB7Ci0gIGZsb2F0OiBsZWZ0OwotICBtYXJnaW4tbGVmdDogMjBweDsgfQotICAubGF5b3V0LWNvbnRlbnQtY29sOmZpcnN0LWNoaWxkIHsKLSAgICBtYXJnaW4tbGVmdDogMDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sLnNwYW4tMSB7Ci0gIHdpZHRoOiA0MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0yIHsKLSAgd2lkdGg6IDEwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0zIHsKLSAgd2lkdGg6IDE2MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi00IHsKLSAgd2lkdGg6IDIyMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi01IHsKLSAgd2lkdGg6IDI4MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi02IHsKLSAgd2lkdGg6IDM0MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi03IHsKLSAgd2lkdGg6IDQwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi04IHsKLSAgd2lkdGg6IDQ2MHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi05IHsKLSAgd2lkdGg6IDUyMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0xMCB7Ci0gIHdpZHRoOiA1ODBweDsgfQotCi0ubGF5b3V0LWNvbnRlbnQtY29sLnNwYW4tMTEgewotICB3aWR0aDogNjQwcHg7IH0KLQotLmxheW91dC1jb250ZW50LWNvbC5zcGFuLTEyIHsKLSAgd2lkdGg6IDcwMHB4OyB9Ci0KLS5sYXlvdXQtY29udGVudC1jb2wuc3Bhbi0xMyB7Ci0gIHdpZHRoOiA3NjBweDsgfQotCi0udnNwYWNlLnNpemUtMSB7Ci0gIGhlaWdodDogMTBweDsgfQotCi0udnNwYWNlLnNpemUtMiB7Ci0gIGhlaWdodDogMjBweDsgfQotCi0udnNwYWNlLnNpemUtMyB7Ci0gIGhlaWdodDogMzBweDsgfQotCi0udnNwYWNlLnNpemUtNCB7Ci0gIGhlaWdodDogNDBweDsgfQotCi0udnNwYWNlLnNpemUtNSB7Ci0gIGhlaWdodDogNTBweDsgfQotCi0udnNwYWNlLnNpemUtNiB7Ci0gIGhlaWdodDogNjBweDsgfQotCi0udnNwYWNlLnNpemUtNyB7Ci0gIGhlaWdodDogNzBweDsgfQotCi0udnNwYWNlLnNpemUtOCB7Ci0gIGhlaWdodDogODBweDsgfQotCi0udnNwYWNlLnNpemUtOSB7Ci0gIGhlaWdodDogOTBweDsgfQotCi0udnNwYWNlLnNpemUtMTAgewotICBoZWlnaHQ6IDEwMHB4OyB9Ci0KLS52c3BhY2Uuc2l6ZS0xMSB7Ci0gIGhlaWdodDogMTEwcHg7IH0KLQotLnZzcGFjZS5zaXplLTEyIHsKLSAgaGVpZ2h0OiAxMjBweDsgfQotCi0udnNwYWNlLnNpemUtMTMgewotICBoZWlnaHQ6IDEzMHB4OyB9Ci0KLS52c3BhY2Uuc2l6ZS0xNCB7Ci0gIGhlaWdodDogMTQwcHg7IH0KLQotLnZzcGFjZS5zaXplLTE1IHsKLSAgaGVpZ2h0OiAxNTBweDsgfQotCi0udnNwYWNlLnNpemUtMTYgewotICBoZWlnaHQ6IDE2MHB4OyB9Ci0KLS8qIG5hdiAqLwotI25hdiB7Ci0gIC8qIHNlY3Rpb24gaGVhZGVyIGRpdnMgKi8KLSAgLyogZXhwYW5kZWQgc2VjdGlvbiBoZWFkZXIgZGl2cyAqLwotICAvKiBzdWJsaW5rcyAqLyB9Ci0gICNuYXYgbGkgewotICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLSAgICBmb250LXNpemU6IDE0cHg7Ci0gICAgbGluZS1oZWlnaHQ6IDEwcHg7IH0KLSAgI25hdiBhIHsKLSAgICBjb2xvcjogIzU1NTU1NTsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7IH0KLSAgI25hdiBsaS5zZWxlY3RlZCA+IGEsCi0gICNuYXYgbGkuc2VsZWN0ZWQgLm5hdi1zZWN0aW9uLWhlYWRlciBhIHsKLSAgICBmb250LXdlaWdodDogNTAwOwotICAgIGNvbG9yOiAjMDA5OWNjICFpbXBvcnRhbnQ7IH0KLSAgI25hdiAubmF2LXNlY3Rpb24taGVhZGVyIHsKLSAgICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gICAgcGFkZGluZzogMTBweDsKLSAgICBtYXJnaW4tYm90dG9tOiAxcHg7Ci0gICAgLyogc2VjdGlvbiBoZWFkZXIgbGlua3MgKi8gfQotICAgICNuYXYgLm5hdi1zZWN0aW9uLWhlYWRlciBhIHsKLSAgICAgIGNvbG9yOiAjMzMzMzMzOwotICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IH0KLSAgICAjbmF2IC5uYXYtc2VjdGlvbi1oZWFkZXI6YWZ0ZXIgewotICAgICAgY29udGVudDogJyc7Ci0gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoZGlzY2xvc3VyZV9kb3duLnBuZykgbm8tcmVwZWF0IHNjcm9sbCB0b3AgbGVmdDsKLSAgICAgIHdpZHRoOiAxMHB4OwotICAgICAgaGVpZ2h0OiAxMHB4OwotICAgICAgZGlzcGxheTogYmxvY2s7Ci0gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgICB0b3A6IDEwcHg7Ci0gICAgICByaWdodDogMTBweDsgfQotICAgICNuYXYgLm5hdi1zZWN0aW9uLWhlYWRlci5lbXB0eTphZnRlciB7Ci0gICAgICBkaXNwbGF5OiBub25lOyB9Ci0gICNuYXYgbGkuZXhwYW5kZWQgLm5hdi1zZWN0aW9uLWhlYWRlciB7Ci0gICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA1KTsgfQotICAgICNuYXYgbGkuZXhwYW5kZWQgLm5hdi1zZWN0aW9uLWhlYWRlcjphZnRlciB7Ci0gICAgICBjb250ZW50OiAnJzsKLSAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybChkaXNjbG9zdXJlX3VwLnBuZykgbm8tcmVwZWF0IHNjcm9sbCB0b3AgbGVmdDsKLSAgICAgIHdpZHRoOiAxMHB4OwotICAgICAgaGVpZ2h0OiAxMHB4OyB9Ci0gICNuYXYgPiBsaSA+IHVsIHsKLSAgICBoZWlnaHQ6IDA7Ci0gICAgb3ZlcmZsb3c6IGhpZGRlbjsKLSAgICBtYXJnaW4tYm90dG9tOiAwOyB9Ci0gICAgI25hdiA+IGxpID4gdWwuYW5pbWF0ZS1oZWlnaHQgewotICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBoZWlnaHQgMC4yNXMgZWFzZS1pbjsKLSAgICAgIC1tb3otdHJhbnNpdGlvbjogaGVpZ2h0IDAuMjVzIGVhc2UtaW47Ci0gICAgICB0cmFuc2l0aW9uOiBoZWlnaHQgMC4yNXMgZWFzZS1pbjsgfQotICAgICNuYXYgPiBsaSA+IHVsIGxpIHsKLSAgICAgIHBhZGRpbmc6IDEwcHggMTBweCAxMXB4IDEwcHg7IH0KLSAgI25hdiA+IGxpLmV4cGFuZGVkID4gdWwgewotICAgIGhlaWdodDogYXV0bzsgfQotICAgICNuYXYgPiBsaS5leHBhbmRlZCA+IHVsIGxpIHsKLSAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMyk7IH0KLSAgI25hdiAjYmFjay1kYWMtc2VjdGlvbiB7Ci0gICAgcGFkZGluZzogMTBweDsKLSAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgfQotICAgICNuYXYgI2JhY2stZGFjLXNlY3Rpb24gYSB7Ci0gICAgICBjb2xvcjogIzMzMzMzMzsKLSAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9Ci0KLS8qIGNvbnRlbnQgaGVhZGVyICovCi0uY29udGVudC1oZWFkZXIgewotICBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzMzYjVlNTsKLSAgaGVpZ2h0OiAzMHB4OyB9Ci0gIC5jb250ZW50LWhlYWRlciBoMiB7Ci0gICAgYm9yZGVyLWJvdHRvbTogMDsgfQotICAuY29udGVudC1oZWFkZXIuanVzdC1saW5rcyB7Ci0gICAgYm9yZGVyLWJvdHRvbTogMDsgfQotCi0uY29udGVudC1mb290ZXIgewotICBib3JkZXItdG9wOiAxcHggc29saWQgIzMzYjVlNTsKLSAgbWFyZ2luLXRvcDogMTBweDsKLSAgaGVpZ2h0OiAzMHB4OyB9Ci0KLS5wYWdpbmctbGlua3MgewotICBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLSAgLnBhZ2luZy1saW5rcyBhIHsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgZm9udC1zaXplOiAxNHB4OwotICAgIGxpbmUtaGVpZ2h0OiAzMHB4OwotICAgIGNvbG9yOiAjNTU1NTU1OwotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB9Ci0gIC5wYWdpbmctbGlua3MgLnByZXYtcGFnZS1saW5rIHsKLSAgICBkaXNwbGF5OiBub25lOwotICAgIGxlZnQ6IC01cHg7IH0KLSAgICAucGFnaW5nLWxpbmtzIC5wcmV2LXBhZ2UtbGluazpiZWZvcmUgewotICAgICAgY29udGVudDogJyc7Ci0gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoZGlzY2xvc3VyZV9sZWZ0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCB0b3AgbGVmdDsKLSAgICAgIHdpZHRoOiAxMHB4OwotICAgICAgaGVpZ2h0OiAxMHB4OwotICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7IH0KLSAgLnBhZ2luZy1saW5rcyAubmV4dC1wYWdlLWxpbmsgewotICAgIGRpc3BsYXk6IG5vbmU7Ci0gICAgcmlnaHQ6IDEwcHg7IH0KLSAgICAucGFnaW5nLWxpbmtzIC5uZXh0LXBhZ2UtbGluazphZnRlciB7Ci0gICAgICBjb250ZW50OiAnJzsKLSAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybChkaXNjbG9zdXJlX3JpZ2h0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCB0b3AgbGVmdDsKLSAgICAgIHdpZHRoOiAxMHB4OwotICAgICAgaGVpZ2h0OiAxMHB4OwotICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgICAgbWFyZ2luLWxlZnQ6IDVweDsgfQotCi0vKiBjb250ZW50IGJvZHkgKi8KLUAtd2Via2l0LWtleWZyYW1lcyBnbG93aGVhZGVyIHsKLSAgZnJvbSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzMzYjVlNTsKLSAgICBjb2xvcjogIzAwMDsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwOyB9Ci0KLSAgdG8gewotICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICAgIGNvbG9yOiAjMzNiNWU1OwotICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMzM2I1ZTU7IH0gfQotCi1ALW1vei1rZXlmcmFtZXMgZ2xvd2hlYWRlciB7Ci0gIGZyb20gewotICAgIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci0gICAgY29sb3I6ICMwMDA7Ci0gICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzAwMDsgfQotCi0gIHRvIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKLSAgICBjb2xvcjogIzMzYjVlNTsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMzNiNWU1OyB9IH0KLQotQGtleWZyYW1lcyBnbG93aGVhZGVyIHsKLSAgZnJvbSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzMzYjVlNTsKLSAgICBjb2xvcjogIzAwMDsKLSAgICBib3JkZXItYm90dG9tLWNvbG9yOiAjMDAwOyB9Ci0KLSAgdG8gewotICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwotICAgIGNvbG9yOiAjMzNiNWU1OwotICAgIGJvcmRlci1ib3R0b20tY29sb3I6ICMzM2I1ZTU7IH0gfQotCi0jY29udGVudCBwLAotI2NvbnRlbnQgdWwsCi0jY29udGVudCBvbCwKLSNjb250ZW50IGgzIHsKLSAgbWFyZ2luOiAwIDEwcHggMTBweCAxMHB4OyB9Ci0jY29udGVudCBoMiB7Ci0gIHBhZGRpbmctbGVmdDogMTBweDsKLSAgcGFkZGluZy1yaWdodDogMTBweDsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsKLSAgZm9udC1zaXplOiAxNnB4OwotICBsaW5lLWhlaWdodDogMzBweDsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgY29sb3I6ICMzM2I1ZTU7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzNiNWU1OwotICBoZWlnaHQ6IDMwcHg7IH0KLSAgI2NvbnRlbnQgaDI6dGFyZ2V0IHsKLSAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBnbG93aGVhZGVyOwotICAgIC1tb3otYW5pbWF0aW9uLW5hbWU6IGdsb3doZWFkZXI7Ci0gICAgYW5pbWF0aW9uLW5hbWU6IGdsb3doZWFkZXI7Ci0gICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IDAuN3M7Ci0gICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IDAuN3M7Ci0gICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAwLjdzOwotICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7Ci0gICAgLW1vei1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsKLSAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDsgfQotI2NvbnRlbnQgaHIgewotICBib3JkZXI6IDA7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzNiNWU1OwotICBtYXJnaW4tYm90dG9tOiAyMHB4OyB9Ci0jY29udGVudCBoMyB7Ci0gIGNvbG9yOiAjMzNiNWU1OwotICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwotICBmb250LXNpemU6IDE0cHg7Ci0gIGxpbmUtaGVpZ2h0OiAyMHB4OwotICBmb250LXdlaWdodDogNTAwOyB9Ci0jY29udGVudCBoNCB7Ci0gIG1hcmdpbjogMCAxMHB4OwotICBjb2xvcjogIzMzMzMzMzsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgZm9udC1zaXplOiAxNHB4OwotICBsaW5lLWhlaWdodDogMjBweDsgfQotI2NvbnRlbnQgc3Ryb25nIHsKLSAgY29sb3I6ICMzMzMzMzM7IH0KLSNjb250ZW50IHVsIGxpLAotI2NvbnRlbnQgb2wgbGkgewotICBtYXJnaW4tbGVmdDogMjBweDsgfQotICAjY29udGVudCB1bCBsaSBoNCwKLSAgI2NvbnRlbnQgb2wgbGkgaDQgewotICAgIG1hcmdpbjogMDsgfQotICAjY29udGVudCB1bCBsaSBwLAotICAjY29udGVudCBvbCBsaSBwIHsKLSAgICBtYXJnaW4tbGVmdDogMDsgfQotI2NvbnRlbnQgdWwgbGkgewotICBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLSAgbGlzdC1zdHlsZS10eXBlOiBub25lOwotICBwb3NpdGlvbjogcmVsYXRpdmU7IH0KLSAgI2NvbnRlbnQgdWwgbGk6YmVmb3JlIHsKLSAgICBjb250ZW50OiAnXDIwMjInOwotICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hOwotICAgIGZvbnQtc2l6ZTogMTRweDsKLSAgICBsaW5lLWhlaWdodDogMjBweDsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgbGVmdDogLTIwcHg7Ci0gICAgdG9wOiAtMXB4OyB9Ci0jY29udGVudCBvbCB7Ci0gIGNvdW50ZXItcmVzZXQ6IGl0ZW07IH0KLSAgI2NvbnRlbnQgb2wgbGkgewotICAgIGZvbnQtc2l6ZTogMTRweDsKLSAgICBsaW5lLWhlaWdodDogMjBweDsKLSAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci0gICAgcG9zaXRpb246IHJlbGF0aXZlOyB9Ci0gICAgI2NvbnRlbnQgb2wgbGk6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6IGNvdW50ZXIoaXRlbSkgIi4gIjsKLSAgICAgIGNvdW50ZXItaW5jcmVtZW50OiBpdGVtOwotICAgICAgcG9zaXRpb246IGFic29sdXRlOwotICAgICAgbGVmdDogLTIwcHg7Ci0gICAgICB0b3A6IDA7IH0KLSAgICAjY29udGVudCBvbCBsaS52YWx1ZS0xOmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiMS4gIjsgfQotICAgICNjb250ZW50IG9sIGxpLnZhbHVlLTI6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICIyLiAiOyB9Ci0gICAgI2NvbnRlbnQgb2wgbGkudmFsdWUtMzpiZWZvcmUgewotICAgICAgY29udGVudDogIjMuICI7IH0KLSAgICAjY29udGVudCBvbCBsaS52YWx1ZS00OmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiNC4gIjsgfQotICAgICNjb250ZW50IG9sIGxpLnZhbHVlLTU6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICI1LiAiOyB9Ci0gICAgI2NvbnRlbnQgb2wgbGkudmFsdWUtNjpiZWZvcmUgewotICAgICAgY29udGVudDogIjYuICI7IH0KLSAgICAjY29udGVudCBvbCBsaS52YWx1ZS03OmJlZm9yZSB7Ci0gICAgICBjb250ZW50OiAiNy4gIjsgfQotICAgICNjb250ZW50IG9sIGxpLnZhbHVlLTg6YmVmb3JlIHsKLSAgICAgIGNvbnRlbnQ6ICI4LiAiOyB9Ci0gICAgI2NvbnRlbnQgb2wgbGkudmFsdWUtOTpiZWZvcmUgewotICAgICAgY29udGVudDogIjkuICI7IH0KLSAgICAjY29udGVudCBvbCBsaS52YWx1ZS0xMDpiZWZvcmUgewotICAgICAgY29udGVudDogIjEwLiAiOyB9Ci0jY29udGVudCAud2l0aC1jYWxsb3V0cyBvbCBsaSB7Ci0gIGxpc3Qtc3R5bGUtcG9zaXRpb246IGluc2lkZTsKLSAgbWFyZ2luLWxlZnQ6IDA7IH0KLSAgI2NvbnRlbnQgLndpdGgtY2FsbG91dHMgb2wgbGk6YmVmb3JlIHsKLSAgICBwb3NpdGlvbjogc3RhdGljOwotICAgIGRpc3BsYXk6IGlubGluZTsKLSAgICBsZWZ0OiAwOwotICAgIGZsb2F0OiBsZWZ0OwotICAgIHdpZHRoOiAxN3B4OwotICAgIGNvbG9yOiAjMzNiNWU1OwotICAgIGZvbnQtd2VpZ2h0OiA1MDA7IH0KLQotLyogc3BlY2lhbCBsaXN0IGl0ZW1zICovCi1saS5uby1idWxsZXQgewotICBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgIWltcG9ydGFudDsgfQotCi0jY29udGVudCBsaS53aXRoLWljb24gewotICBwb3NpdGlvbjogcmVsYXRpdmU7Ci0gIG1hcmdpbi1sZWZ0OiA0MHB4OwotICBtaW4taGVpZ2h0OiAzMHB4OyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbiBwIHsKLSAgICBtYXJnaW4tbGVmdDogMCAhaW1wb3J0YW50OyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbjpiZWZvcmUgewotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICBsZWZ0OiAtNDBweDsKLSAgICB0b3A6IDA7Ci0gICAgY29udGVudDogJyc7Ci0gICAgd2lkdGg6IDMwcHg7Ci0gICAgaGVpZ2h0OiAzMHB4OyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbi50YWJsZXQ6YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWNvX3Bob25lX3RhYmxldC5wbmcpOyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbi53ZWI6YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWNvX3dlYi5wbmcpOyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbi5jaGVja2xpc3Q6YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWNvX2NoZWNrbGlzdC5wbmcpOyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbi5hY3Rpb246YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWNvX2FjdGlvbi5wbmcpOyB9Ci0gICNjb250ZW50IGxpLndpdGgtaWNvbi51c2U6YmVmb3JlIHsKLSAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaWNvX3VzZS5wbmcpOyB9Ci0KLS8qIGZpZ3VyZXMgYW5kIGNhbGxvdXRzICovCi0uZmlndXJlIHsKLSAgcG9zaXRpb246IHJlbGF0aXZlOyB9Ci0gIC5maWd1cmUucGFkLWJlbG93IHsKLSAgICBtYXJnaW4tYm90dG9tOiAyMHB4OyB9Ci0gIC5maWd1cmUgLmZpZ3VyZS1jYWxsb3V0IHsKLSAgICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gICAgY29sb3I6ICNmZmY7Ci0gICAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgICBmb250LXNpemU6IDE2cHg7Ci0gICAgbGluZS1oZWlnaHQ6IDIzcHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybChjYWxsb3V0LnBuZykgbm8tcmVwZWF0IHNjcm9sbCA1MCUgNTAlOwotICAgIHBhZGRpbmctcmlnaHQ6IDJweDsKLSAgICB3aWR0aDogMzBweDsKLSAgICBoZWlnaHQ6IDI5cHg7Ci0gICAgei1pbmRleDogMTAwMDsgfQotICAgIC5maWd1cmUgLmZpZ3VyZS1jYWxsb3V0LnRvcCB7Ci0gICAgICB0b3A6IC05cHg7IH0KLSAgICAuZmlndXJlIC5maWd1cmUtY2FsbG91dC5yaWdodCB7Ci0gICAgICByaWdodDogLTVweDsgfQotCi0uZmlndXJlLWNhcHRpb24gewotICBtYXJnaW46IDAgMTBweCAyMHB4IDEwcHg7Ci0gIGZvbnQtc2l6ZTogMTRweDsKLSAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotCi0vKiByb3dzIG9mIGZpZ3VyZXMgKi8KLS5maWd1cmUtcm93IHsKLSAgZm9udC1zaXplOiAwOwotICBsaW5lLWhlaWdodDogMDsKLSAgLyogdG8gcHJldmVudCBzcGFjZSBiZXR3ZWVuIGZpZ3VyZXMgKi8gfQotICAuZmlndXJlLXJvdyAuZmlndXJlIHsKLSAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ci0gICAgdmVydGljYWwtYWxpZ246IHRvcDsgfQotICAuZmlndXJlLXJvdyAuZmlndXJlICsgLmZpZ3VyZSB7Ci0gICAgbWFyZ2luLWxlZnQ6IDEwcHg7Ci0gICAgLyogcmVpbnRyb2R1Y2Ugc3BhY2UgYmV0d2VlbiBmaWd1cmVzICovIH0KLQotLyogdmlkZW8gIGNvbnRhaW5lcnMgKi8KLS5mcmFtZWQtZ2FsYXh5bmV4dXMtbGFuZC1zcGFuLTEzIHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKGNvbnRlbnQvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX2xhbmRfc3BhbjEzLnBuZykgbm8tcmVwZWF0IHNjcm9sbCB0b3AgbGVmdDsKLSAgcGFkZGluZzogNDJweCAxMjJweCA2MnB4IDEyNnB4OwotICBvdmVyZmxvdzogaGlkZGVuOyB9Ci0gIC5mcmFtZWQtZ2FsYXh5bmV4dXMtbGFuZC1zcGFuLTEzLCAuZnJhbWVkLWdhbGF4eW5leHVzLWxhbmQtc3Bhbi0xMyB2aWRlbywgLmZyYW1lZC1nYWxheHluZXh1cy1sYW5kLXNwYW4tMTMgaW1nIHsKLSAgICB3aWR0aDogNTEycHg7Ci0gICAgaGVpZ2h0OiAyODZweDsgfQotCi0uZnJhbWVkLWdhbGF4eW5leHVzLXBvcnQtc3Bhbi05IHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKGNvbnRlbnQvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjkucG5nKSBuby1yZXBlYXQgc2Nyb2xsIHRvcCBsZWZ0OwotICBwYWRkaW5nOiA5NXB4IDEyMnB4IDEwN3B4IDEyNHB4OwotICBvdmVyZmxvdzogaGlkZGVuOyB9Ci0gIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTksIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTkgdmlkZW8sIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTkgaW1nIHsKLSAgICB3aWR0aDogMjc0cHg7Ci0gICAgaGVpZ2h0OiA0ODhweDsgfQotCi0uZnJhbWVkLWdhbGF4eW5leHVzLXBvcnQtc3Bhbi01IHsKLSAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKGNvbnRlbnQvbWlzY19mdWxsX2dhbGF4eW5leHVzX2JsYW5rX3BvcnRfc3BhbjUucG5nKSBuby1yZXBlYXQgc2Nyb2xsIHRvcCBsZWZ0OwotICBwYWRkaW5nOiA3NXB4IDMxcHggNzZweCAzM3B4OwotICBvdmVyZmxvdzogaGlkZGVuOyB9Ci0gIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTUsIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTUgdmlkZW8sIC5mcmFtZWQtZ2FsYXh5bmV4dXMtcG9ydC1zcGFuLTUgaW1nIHsKLSAgICB3aWR0aDogMjE2cHg7Ci0gICAgaGVpZ2h0OiAzODRweDsgfQotCi0vKiBsYW5kaW5nIHBhZ2UgZGlzY2xvc3VyZXMgKi8KLS5sYW5kaW5nLXBhZ2UtbGluayB7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgZm9udC13ZWlnaHQ6IDUwMDsKLSAgY29sb3I6ICMzMzMzMzM7IH0KLSAgLmxhbmRpbmctcGFnZS1saW5rOmFmdGVyIHsKLSAgICBjb250ZW50OiAnJzsKLSAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCB1cmwoZGlzY2xvc3VyZV9yaWdodC5wbmcpIG5vLXJlcGVhdCBzY3JvbGwgdG9wIGxlZnQ7Ci0gICAgd2lkdGg6IDEwcHg7Ci0gICAgaGVpZ2h0OiAxMHB4OwotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgICBtYXJnaW4tbGVmdDogNXB4OyB9Ci0KLS8qIHRvb2x0aXBzICovCi0udG9vbHRpcC1ib3ggewotICBwb3NpdGlvbjogYWJzb2x1dGU7Ci0gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC45KTsKLSAgYm9yZGVyLXJhZGl1czogMnB4OwotICBmb250LXNpemU6IDE0cHg7Ci0gIGxpbmUtaGVpZ2h0OiAyMHB4OwotICBjb2xvcjogI2ZmZjsKLSAgcGFkZGluZzogNnB4IDEwcHg7Ci0gIG1heC13aWR0aDogMjUwcHg7Ci0gIHotaW5kZXg6IDEwMDAwOyB9Ci0gIC50b29sdGlwLWJveC5iZWxvdzphZnRlciB7Ci0gICAgcG9zaXRpb246IGFic29sdXRlOwotICAgIGNvbnRlbnQ6ICcnOwotICAgIGxpbmUtaGVpZ2h0OiAwOwotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIHRvcDogLTEwcHg7Ci0gICAgbGVmdDogNXB4OwotICAgIGJvcmRlcjogNXB4IHNvbGlkIHRyYW5zcGFyZW50OwotICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHJnYmEoMCwgMCwgMCwgMC45KTsgfQotCi0vKiB2aWRlbyBub3RlICovCi0udmlkZW8taW5zdHJ1Y3Rpb25zIHsKLSAgbWFyZ2luLXRvcDogMTBweDsKLSAgbWFyZ2luLWJvdHRvbTogMTBweDsgfQotICAudmlkZW8taW5zdHJ1Y3Rpb25zOmJlZm9yZSB7Ci0gICAgY29udGVudDogJyc7Ci0gICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgdXJsKGljb19tb3ZpZV9pbmxpbmUucG5nKSBuby1yZXBlYXQgc2Nyb2xsIHRvcCBsZWZ0OwotICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKLSAgICB3aWR0aDogMTJweDsKLSAgICBoZWlnaHQ6IDEycHg7Ci0gICAgbWFyZ2luLXJpZ2h0OiA4cHg7IH0KLSAgLnZpZGVvLWluc3RydWN0aW9uczphZnRlciB7Ci0gICAgY29udGVudDogJ0NsaWNrIHRvIHJlcGxheSBtb3ZpZS4nOyB9Ci0KLS8qIGRvd25sb2FkIGJ1dHRvbnMgKi8KLS5kb3dubG9hZC1idXR0b24gewotICBkaXNwbGF5OiBibG9jazsKLSAgbWFyZ2luLWJvdHRvbTogNXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gIGJhY2tncm91bmQtY29sb3I6ICMzM2I1ZTU7Ci0gIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Ci0gIGZvbnQtd2VpZ2h0OiA1MDA7Ci0gIGJveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwotICBwYWRkaW5nOiA2cHggMTJweDsKLSAgYm9yZGVyLXJhZGl1czogMnB4OyB9Ci0gIC5kb3dubG9hZC1idXR0b246aG92ZXIsIC5kb3dubG9hZC1idXR0b246Zm9jdXMgewotICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDk5Y2M7Ci0gICAgY29sb3I6ICNmZmYgIWltcG9ydGFudDsgfQotICAuZG93bmxvYWQtYnV0dG9uOmFjdGl2ZSB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsgfQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvZGVmYXVsdC5qcyBiL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2RlZmF1bHQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTNkZDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvZGVmYXVsdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKLSAgLy8gcHJlcCBuYXYgZXhwYW5kb3MKLSAgdmFyIHBhZ2VQYXRoID0gZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWU7Ci0gIGlmIChwYWdlUGF0aC5pbmRleE9mKFNJVEVfUk9PVCkgPT0gMCkgewotICAgIHBhZ2VQYXRoID0gcGFnZVBhdGguc3Vic3RyKFNJVEVfUk9PVC5sZW5ndGgpOwotICAgIGlmIChwYWdlUGF0aCA9PSAnJyB8fCBwYWdlUGF0aC5jaGFyQXQocGFnZVBhdGgubGVuZ3RoIC0gMSkgPT0gJy8nKSB7Ci0gICAgICBwYWdlUGF0aCArPSAnaW5kZXguaHRtbCc7Ci0gICAgfQotICB9Ci0KLSAgaWYgKFNJVEVfUk9PVC5tYXRjaCgvXC5cLlwvLykgfHwgU0lURV9ST09UID09ICcnKSB7Ci0gICAgLy8gSWYgcnVubmluZyBsb2NhbGx5LCBTSVRFX1JPT1Qgd2lsbCBiZSBhIHJlbGF0aXZlIHBhdGgsIHNvIGFjY291bnQgZm9yIHRoYXQgYnkKLSAgICAvLyBmaW5kaW5nIHRoZSByZWxhdGl2ZSBVUkwgdG8gdGhpcyBwYWdlLiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gZmluZCBsaW5rcyBvbiB0aGUgcGFnZQotICAgIC8vIGxlYWRpbmcgYmFjayB0byB0aGlzIHBhZ2UuCi0gICAgdmFyIHBhdGhQYXJ0cyA9IHBhZ2VQYXRoLnNwbGl0KCcvJyk7Ci0gICAgdmFyIHJlbGF0aXZlUGFnZVBhdGhQYXJ0cyA9IFtdOwotICAgIHZhciB1cERpcnMgPSAoU0lURV9ST09ULm1hdGNoKC8oXC5cLlwvKSsvKSB8fCBbJyddKVswXS5sZW5ndGggLyAzOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXBEaXJzOyBpKyspIHsKLSAgICAgIHJlbGF0aXZlUGFnZVBhdGhQYXJ0cy5wdXNoKCcuLicpOwotICAgIH0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVwRGlyczsgaSsrKSB7Ci0gICAgICByZWxhdGl2ZVBhZ2VQYXRoUGFydHMucHVzaChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtICh1cERpcnMgLSBpKSAtIDFdKTsKLSAgICB9Ci0gICAgcmVsYXRpdmVQYWdlUGF0aFBhcnRzLnB1c2gocGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXSk7Ci0gICAgcGFnZVBhdGggPSByZWxhdGl2ZVBhZ2VQYXRoUGFydHMuam9pbignLycpOwotICB9IGVsc2UgewotICAgIC8vIE90aGVyd2lzZSB0aGUgcGFnZSBwYXRoIHNob3VsZCBiZSBhbiBhYnNvbHV0ZSBVUkwuCi0gICAgcGFnZVBhdGggPSBTSVRFX1JPT1QgKyBwYWdlUGF0aDsKLSAgfQotCi0gIC8vIHNlbGVjdCBjdXJyZW50IHBhZ2UgaW4gc2lkZW5hdiBhbmQgc2V0IHVwIHByZXYvbmV4dCBsaW5rcyBpZiB0aGV5IGV4aXN0Ci0gIHZhciAkc2VsTmF2TGluayA9ICQoJyNuYXYnKS5maW5kKCdhW2hyZWY9IicgKyBwYWdlUGF0aCArICciXScpOwotICBpZiAoJHNlbE5hdkxpbmsubGVuZ3RoKSB7Ci0gICAgJHNlbExpc3RJdGVtID0gJHNlbE5hdkxpbmsuY2xvc2VzdCgnbGknKTsKLQotICAgICRzZWxMaXN0SXRlbS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKLSAgICAkc2VsTGlzdEl0ZW0uY2xvc2VzdCgnbGkubmF2LXNlY3Rpb24nKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLQotICAgIC8vIHNldCB1cCBwcmV2IGxpbmtzCi0gICAgdmFyICRwcmV2TGluayA9IFtdOwotICAgIHZhciAkcHJldkxpc3RJdGVtID0gJHNlbExpc3RJdGVtLnByZXYoJ2xpJyk7Ci0gICAgaWYgKCRwcmV2TGlzdEl0ZW0ubGVuZ3RoKSB7Ci0gICAgICBpZiAoJHByZXZMaXN0SXRlbS5oYXNDbGFzcygnbmF2LXNlY3Rpb24nKSkgewotICAgICAgICAvLyBqdW1wIHRvIGxhc3QgdG9waWMgb2YgcHJldmlvdXMgc2VjdGlvbgotICAgICAgICAkcHJldkxpbmsgPSAkcHJldkxpc3RJdGVtLmZpbmQoJ2E6bGFzdCcpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8ganVtcCB0byBwcmV2aW91cyB0b3BpYyBpbiB0aGlzIHNlY3Rpb24KLSAgICAgICAgJHByZXZMaW5rID0gJHByZXZMaXN0SXRlbS5maW5kKCdhOmVxKDApJyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIGp1bXAgdG8gdGhpcyBzZWN0aW9uJ3MgaW5kZXggcGFnZSAoaWYgaXQgZXhpc3RzKQotICAgICAgJHByZXZMaW5rID0gJHNlbExpc3RJdGVtLnBhcmVudHMoJ2xpJykuZmluZCgnYScpOwotICAgIH0KLQotICAgIGlmICgkcHJldkxpbmsubGVuZ3RoKSB7Ci0gICAgICB2YXIgcHJldkhyZWYgPSAkcHJldkxpbmsuYXR0cignaHJlZicpOwotICAgICAgaWYgKHByZXZIcmVmID09IFNJVEVfUk9PVCArICdpbmRleC5odG1sJykgewotICAgICAgICAvLyBEb24ndCBzaG93IFByZXZpb3VzIHdoZW4gaXQgbGVhZHMgdG8gdGhlIGhvbWVwYWdlCi0gICAgICAgICQoJy5wcmV2LXBhZ2UtbGluaycpLmhpZGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQoJy5wcmV2LXBhZ2UtbGluaycpLmF0dHIoJ2hyZWYnLCBwcmV2SHJlZikuc2hvdygpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAkKCcucHJldi1wYWdlLWxpbmsnKS5oaWRlKCk7Ci0gICAgfQotCi0gICAgLy8gc2V0IHVwIG5leHQgbGlua3MKLSAgICB2YXIgJG5leHRMaW5rID0gW107Ci0gICAgaWYgKCRzZWxMaXN0SXRlbS5oYXNDbGFzcygnbmF2LXNlY3Rpb24nKSkgewotICAgICAgLy8gd2UncmUgb24gYW4gaW5kZXggcGFnZSwganVtcCB0byB0aGUgZmlyc3QgdG9waWMKLSAgICAgICRuZXh0TGluayA9ICRzZWxMaXN0SXRlbS5maW5kKCd1bCcpLmZpbmQoJ2E6ZXEoMCknKQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBqdW1wIHRvIHRoZSBuZXh0IHRvcGljIGluIHRoaXMgc2VjdGlvbiAoaWYgaXQgZXhpc3RzKQotICAgICAgJG5leHRMaW5rID0gJHNlbExpc3RJdGVtLm5leHQoJ2xpJykuZmluZCgnYTplcSgwKScpOwotICAgICAgaWYgKCEkbmV4dExpbmsubGVuZ3RoKSB7Ci0gICAgICAgIC8vIG5vIG1vcmUgdG9waWNzIGluIHRoaXMgc2VjdGlvbiwganVtcCB0byB0aGUgZmlyc3QgdG9waWMgaW4gdGhlIG5leHQgc2VjdGlvbgotICAgICAgICAkbmV4dExpbmsgPSAkc2VsTGlzdEl0ZW0ucGFyZW50cygnbGknKS5uZXh0KCdsaS5uYXYtc2VjdGlvbicpLmZpbmQoJ2E6ZXEoMCknKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRuZXh0TGluay5sZW5ndGgpIHsKLSAgICAgICQoJy5uZXh0LXBhZ2UtbGluaycpLmF0dHIoJ2hyZWYnLCAkbmV4dExpbmsuYXR0cignaHJlZicpKS5zaG93KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICQoJy5uZXh0LXBhZ2UtbGluaycpLmhpZGUoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTZXQgdXAgZXhwYW5kL2NvbGxhcHNlIGJlaGF2aW9yCi0gICQoJyNuYXYgbGkubmF2LXNlY3Rpb24nKS5jbGljayhmdW5jdGlvbigpIHsKLSAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZXhwYW5kZWQnKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGhpZGUgb3RoZXIKLSAgICB2YXIgJG9sZCA9ICQoJyNuYXYgbGkubmF2LXNlY3Rpb24uZXhwYW5kZWQnKTsKLSAgICBpZiAoJG9sZC5sZW5ndGgpIHsKLSAgICAgIHZhciAkb2xkVWwgPSAkb2xkLmNoaWxkcmVuKCd1bCcpOwotICAgICAgJG9sZFVsLmNzcygnaGVpZ2h0JywgJG9sZFVsLmhlaWdodCgpICsgJ3B4Jyk7Ci0gICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICAgJG9sZFVsCi0gICAgICAgICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGUtaGVpZ2h0JykKLSAgICAgICAgICAgIC5jc3MoJ2hlaWdodCcsICcnKTsKLSAgICAgIH0sIDApOwotICAgICAgJG9sZC5yZW1vdmVDbGFzcygnZXhwYW5kZWQnKTsKLSAgICB9Ci0KLSAgICAvLyBzaG93IG1lCi0gICAgJCh0aGlzKS5hZGRDbGFzcygnZXhwYW5kZWQnKTsKLSAgICB2YXIgJHVsID0gJCh0aGlzKS5jaGlsZHJlbigndWwnKTsKLSAgICB2YXIgZXhwYW5kZWRIZWlnaHQgPSAkdWwuaGVpZ2h0KCk7Ci0gICAgJHVsCi0gICAgICAgIC5yZW1vdmVDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKQotICAgICAgICAuY3NzKCdoZWlnaHQnLCAwKTsKLSAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKLSAgICAgICR1bAotICAgICAgICAgIC5hZGRDbGFzcygnYW5pbWF0ZS1oZWlnaHQnKQotICAgICAgICAgIC5jc3MoJ2hlaWdodCcsIGV4cGFuZGVkSGVpZ2h0ICsgJ3B4Jyk7Ci0gICAgfSwgMCk7Ci0gIH0pOwotCi0gIC8vIFN0b3AgZXhwYW5kL2NvbGxhcHNlIGJlaGF2aW9yIHdoZW4gY2xpY2tpbmcgb24gbmF2IHNlY3Rpb24gbGlua3MgKHNpbmNlIHdlJ3JlIG5hdmlnYXRpbmcgYXdheQotICAvLyBmcm9tIHRoZSBwYWdlKQotICAkKCcubmF2LXNlY3Rpb24taGVhZGVyJykuZmluZCgnYTplcSgwKScpLmNsaWNrKGZ1bmN0aW9uKGV2dCkgewotICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9KTsKLQotICAvLyBTZXQgdXAgcGxheS1vbi1ob3ZlciA8dmlkZW8+IHRhZ3MuCi0gICQoJ3ZpZGVvLnBsYXktb24taG92ZXInKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKCl7Ci0gICAgJCh0aGlzKS5nZXQoMCkubG9hZCgpOyAvLyBpbiBjYXNlIHRoZSB2aWRlbyBpc24ndCBzZWVrYWJsZQotICAgICQodGhpcykuZ2V0KDApLnBsYXkoKTsKLSAgfSk7Ci0KLSAgLy8gU2V0IHVwIHRvb2x0aXBzCi0gIHZhciBUT09MVElQX01BUkdJTiA9IDEwOwotICAkKCdhY3JvbnltJykuZWFjaChmdW5jdGlvbigpIHsKLSAgICB2YXIgJHRhcmdldCA9ICQodGhpcyk7Ci0gICAgdmFyICR0b29sdGlwID0gJCgnPGRpdj4nKQotICAgICAgICAuYWRkQ2xhc3MoJ3Rvb2x0aXAtYm94JykKLSAgICAgICAgLnRleHQoJHRhcmdldC5hdHRyKCd0aXRsZScpKQotICAgICAgICAuaGlkZSgpCi0gICAgICAgIC5hcHBlbmRUbygnYm9keScpOwotICAgICR0YXJnZXQucmVtb3ZlQXR0cigndGl0bGUnKTsKLQotICAgICR0YXJnZXQuaG92ZXIoZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBpbgotICAgICAgdmFyIHRhcmdldFJlY3QgPSAkdGFyZ2V0Lm9mZnNldCgpOwotICAgICAgdGFyZ2V0UmVjdC53aWR0aCA9ICR0YXJnZXQud2lkdGgoKTsKLSAgICAgIHRhcmdldFJlY3QuaGVpZ2h0ID0gJHRhcmdldC5oZWlnaHQoKTsKLQotICAgICAgJHRvb2x0aXAuY3NzKHsKLSAgICAgICAgbGVmdDogdGFyZ2V0UmVjdC5sZWZ0LAotICAgICAgICB0b3A6IHRhcmdldFJlY3QudG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyBUT09MVElQX01BUkdJTgotICAgICAgfSk7Ci0gICAgICAkdG9vbHRpcC5hZGRDbGFzcygnYmVsb3cnKTsKLSAgICAgICR0b29sdGlwLnNob3coKTsKLSAgICB9LCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIG91dAotICAgICAgJHRvb2x0aXAuaGlkZSgpOwotICAgIH0pOwotICB9KTsKLQotICAvLyBTZXQgdXAgPGgyPiBkZWVwbGlua3MKLSAgJCgnaDInKS5jbGljayhmdW5jdGlvbigpIHsKLSAgICB2YXIgaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7Ci0gICAgaWYgKGlkKSB7Ci0gICAgICBkb2N1bWVudC5sb2NhdGlvbi5oYXNoID0gaWQ7Ci0gICAgfQotICB9KTsKLX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2Rpc2Nsb3N1cmVfZG93bi5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9kaXNjbG9zdXJlX2Rvd24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNmZjRkLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2Rpc2Nsb3N1cmVfZG93bi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9kaXNjbG9zdXJlX2xlZnQucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvZGlzY2xvc3VyZV9sZWZ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3ODQ1ZS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9kaXNjbG9zdXJlX2xlZnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvZGlzY2xvc3VyZV9yaWdodC5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9kaXNjbG9zdXJlX3JpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiY2ViMS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9kaXNjbG9zdXJlX3JpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2Rpc2Nsb3N1cmVfdXAucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvZGlzY2xvc3VyZV91cC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjZkOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvZGlzY2xvc3VyZV91cC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9pY29fYWN0aW9uLnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb19hY3Rpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU0Y2M3Li4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb19hY3Rpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX2dvb2QucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX2dvb2QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmViZTFjLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb19nb29kLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb19tb3ZpZV9pbmxpbmUucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX21vdmllX2lubGluZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmI1YzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX21vdmllX2lubGluZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9pY29fcGhvbmVfdGFibGV0LnBuZyBiL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb19waG9uZV90YWJsZXQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNiODc2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb19waG9uZV90YWJsZXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX3VzZS5wbmcgYi9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9pY29fdXNlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NjhiMy4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9pY29fdXNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2ljb193ZWIucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX3dlYi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDhlM2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX3dlYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9pY29fd3JvbmcucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvaWNvX3dyb25nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdkMDRjZS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy9pY29fd3JvbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyBiL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZGM4MGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qIQotICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2MS42LjIKLSAqIGh0dHA6Ly9qcXVlcnkuY29tLwotICoKLSAqIENvcHlyaWdodCAyMDExLCBKb2huIFJlc2lnCi0gKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KLSAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKLSAqCi0gKiBJbmNsdWRlcyBTaXp6bGUuanMKLSAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIERvam8gRm91bmRhdGlvbgotICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgotICoKLSAqIERhdGU6IFRodSBKdW4gMzAgMTQ6MTY6NTYgMjAxMSAtMDQwMAotICovCi0oZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjdihhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGNzKGEpe2lmKCFjZ1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2h8fChjaD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNoLmZyYW1lQm9yZGVyPWNoLndpZHRoPWNoLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNoKTtpZighY2l8fCFjaC5jcmVhdGVFbGVtZW50KWNpPShjaC5jb250ZW50V2luZG93fHxjaC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNpLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjaS5jbG9zZSgpO2Q9Y2kuY3JlYXRlRWxlbWVudChhKSxjaS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2gpfWNnW2FdPWV9cmV0dXJuIGNnW2FdfWZ1bmN0aW9uIGNyKGEsYil7dmFyIGM9e307Zi5lYWNoKGNtLmNvbmNhdC5hcHBseShbXSxjbS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGNxKCl7Y249Yn1mdW5jdGlvbiBjcCgpe3NldFRpbWVvdXQoY3EsMCk7cmV0dXJuIGNuPWYubm93KCl9ZnVuY3Rpb24gY2YoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjZSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBiJChhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gYlooYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBiWShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiQy50ZXN0KGEpP2QoYSxlKTpiWShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiliWShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYlgoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJSLGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9YlgoYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9YlgoYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJXKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYk4pLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiQShhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiP2J2OmJ3O2lmKGQ+MCl7YyE9PSJib3JkZXIiJiZmLmVhY2goZSxmdW5jdGlvbigpe2N8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK3RoaXMpKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZCsicHgifWQ9YngoYSxiLGIpO2lmKGQ8MHx8ZD09bnVsbClkPWEuc3R5bGVbYl18fDA7ZD1wYXJzZUZsb2F0KGQpfHwwLGMmJmYuZWFjaChlLGZ1bmN0aW9uKCl7ZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrdGhpcykpfHwwKX0pO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYm0oYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmUsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibChhKXtmLm5vZGVOYW1lKGEsImlucHV0Iik/YmsoYSk6ImdldEVsZW1lbnRzQnlUYWdOYW1lImluIGEmJmYuZ3JlcChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLGJrKX1mdW5jdGlvbiBiayhhKXtpZihhLnR5cGU9PT0iY2hlY2tib3gifHxhLnR5cGU9PT0icmFkaW8iKWEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkfWZ1bmN0aW9uIGJqKGEpe3JldHVybiJnZXRFbGVtZW50c0J5VGFnTmFtZSJpbiBhP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKToicXVlcnlTZWxlY3RvckFsbCJpbiBhP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJpKGEsYil7dmFyIGM7aWYoYi5ub2RlVHlwZT09PTEpe2IuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKSxjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihjPT09Im9iamVjdCIpYi5vdXRlckhUTUw9YS5vdXRlckhUTUw7ZWxzZSBpZihjIT09ImlucHV0Inx8YS50eXBlIT09ImNoZWNrYm94IiYmYS50eXBlIT09InJhZGlvIil7aWYoYz09PSJvcHRpb24iKWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ7ZWxzZSBpZihjPT09ImlucHV0Inx8Yz09PSJ0ZXh0YXJlYSIpYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWV9ZWxzZSBhLmNoZWNrZWQmJihiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQpLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKTtiLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pfX1mdW5jdGlvbiBiaChhLGIpe2lmKGIubm9kZVR5cGU9PT0xJiYhIWYuaGFzRGF0YShhKSl7dmFyIGM9Zi5leHBhbmRvLGQ9Zi5kYXRhKGEpLGU9Zi5kYXRhKGIsZCk7aWYoZD1kW2NdKXt2YXIgZz1kLmV2ZW50cztlPWVbY109Zi5leHRlbmQoe30sZCk7aWYoZyl7ZGVsZXRlIGUuaGFuZGxlLGUuZXZlbnRzPXt9O2Zvcih2YXIgaCBpbiBnKWZvcih2YXIgaT0wLGo9Z1toXS5sZW5ndGg7aTxqO2krKylmLmV2ZW50LmFkZChiLGgrKGdbaF1baV0ubmFtZXNwYWNlPyIuIjoiIikrZ1toXVtpXS5uYW1lc3BhY2UsZ1toXVtpXSxnW2hdW2ldLmRhdGEpfX19fWZ1bmN0aW9uIGJnKGEsYil7cmV0dXJuIGYubm9kZU5hbWUoYSwidGFibGUiKT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxhLmFwcGVuZENoaWxkKGEub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTphfWZ1bmN0aW9uIFcoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoUi50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gVihhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gTihhLGIpe3JldHVybihhJiZhIT09IioiP2ErIi4iOiIiKStiLnJlcGxhY2UoeiwiYCIpLnJlcGxhY2UoQSwiJiIpfWZ1bmN0aW9uIE0oYSl7dmFyIGIsYyxkLGUsZyxoLGksaixrLGwsbSxuLG8scD1bXSxxPVtdLHI9Zi5fZGF0YSh0aGlzLCJldmVudHMiKTtpZighKGEubGl2ZUZpcmVkPT09dGhpc3x8IXJ8fCFyLmxpdmV8fGEudGFyZ2V0LmRpc2FibGVkfHxhLmJ1dHRvbiYmYS50eXBlPT09ImNsaWNrIikpe2EubmFtZXNwYWNlJiYobj1uZXcgUmVnRXhwKCIoXnxcXC4pIithLm5hbWVzcGFjZS5zcGxpdCgiLiIpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpKSxhLmxpdmVGaXJlZD10aGlzO3ZhciBzPXIubGl2ZS5zbGljZSgwKTtmb3IoaT0wO2k8cy5sZW5ndGg7aSsrKWc9c1tpXSxnLm9yaWdUeXBlLnJlcGxhY2UoeCwiIik9PT1hLnR5cGU/cS5wdXNoKGcuc2VsZWN0b3IpOnMuc3BsaWNlKGktLSwxKTtlPWYoYS50YXJnZXQpLmNsb3Nlc3QocSxhLmN1cnJlbnRUYXJnZXQpO2ZvcihqPTAsaz1lLmxlbmd0aDtqPGs7aisrKXttPWVbal07Zm9yKGk9MDtpPHMubGVuZ3RoO2krKyl7Zz1zW2ldO2lmKG0uc2VsZWN0b3I9PT1nLnNlbGVjdG9yJiYoIW58fG4udGVzdChnLm5hbWVzcGFjZSkpJiYhbS5lbGVtLmRpc2FibGVkKXtoPW0uZWxlbSxkPW51bGw7aWYoZy5wcmVUeXBlPT09Im1vdXNlZW50ZXIifHxnLnByZVR5cGU9PT0ibW91c2VsZWF2ZSIpYS50eXBlPWcucHJlVHlwZSxkPWYoYS5yZWxhdGVkVGFyZ2V0KS5jbG9zZXN0KGcuc2VsZWN0b3IpWzBdLGQmJmYuY29udGFpbnMoaCxkKSYmKGQ9aCk7KCFkfHxkIT09aCkmJnAucHVzaCh7ZWxlbTpoLGhhbmRsZU9iajpnLGxldmVsOm0ubGV2ZWx9KX19fWZvcihqPTAsaz1wLmxlbmd0aDtqPGs7aisrKXtlPXBbal07aWYoYyYmZS5sZXZlbD5jKWJyZWFrO2EuY3VycmVudFRhcmdldD1lLmVsZW0sYS5kYXRhPWUuaGFuZGxlT2JqLmRhdGEsYS5oYW5kbGVPYmo9ZS5oYW5kbGVPYmosbz1lLmhhbmRsZU9iai5vcmlnSGFuZGxlci5hcHBseShlLmVsZW0sYXJndW1lbnRzKTtpZihvPT09ITF8fGEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7Yz1lLmxldmVsLG89PT0hMSYmKGI9ITEpO2lmKGEuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVha319cmV0dXJuIGJ9fWZ1bmN0aW9uIEsoYSxjLGQpe3ZhciBlPWYuZXh0ZW5kKHt9LGRbMF0pO2UudHlwZT1hLGUub3JpZ2luYWxFdmVudD17fSxlLmxpdmVGaXJlZD1iLGYuZXZlbnQuaGFuZGxlLmNhbGwoYyxlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZkWzBdLnByZXZlbnREZWZhdWx0KCl9ZnVuY3Rpb24gRSgpe3JldHVybiEwfWZ1bmN0aW9uIEQoKXtyZXR1cm4hMX1mdW5jdGlvbiBtKGEsYyxkKXt2YXIgZT1jKyJkZWZlciIsZz1jKyJxdWV1ZSIsaD1jKyJtYXJrIixpPWYuZGF0YShhLGUsYiwhMCk7aSYmKGQ9PT0icXVldWUifHwhZi5kYXRhKGEsZyxiLCEwKSkmJihkPT09Im1hcmsifHwhZi5kYXRhKGEsaCxiLCEwKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5kYXRhKGEsZyxiLCEwKSYmIWYuZGF0YShhLGgsYiwhMCkmJihmLnJlbW92ZURhdGEoYSxlLCEwKSxpLnJlc29sdmUoKSl9LDApfWZ1bmN0aW9uIGwoYSl7Zm9yKHZhciBiIGluIGEpaWYoYiE9PSJ0b0pTT04iKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGsoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaiwiJDEtJDIiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTmFOKGQpP2kudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkOnBhcnNlRmxvYXQoZCl9Y2F0Y2goZyl7fWYuZGF0YShhLGMsZCl9ZWxzZSBkPWJ9cmV0dXJuIGR9dmFyIGM9YS5kb2N1bWVudCxkPWEubmF2aWdhdG9yLGU9YS5sb2NhdGlvbixmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSigpe2lmKCFlLmlzUmVhZHkpe3RyeXtjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3NldFRpbWVvdXQoSiwxKTtyZXR1cm59ZS5yZWFkeSgpfX12YXIgZT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgZS5mbi5pbml0KGEsYixoKX0sZj1hLmpRdWVyeSxnPWEuJCxoLGk9L14oPzpbXjxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L1xkLyxuPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPik/JC8sbz0vXltcXSw6e31cc10qJC8scD0vXFwoPzpbIlxcXC9iZm5ydF18dVswLTlhLWZBLUZdezR9KS9nLHE9LyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLHI9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxzPS8od2Via2l0KVsgXC9dKFtcdy5dKykvLHQ9LyhvcGVyYSkoPzouKnZlcnNpb24pP1sgXC9dKFtcdy5dKykvLHU9Lyhtc2llKSAoW1x3Ll0rKS8sdj0vKG1vemlsbGEpKD86Lio/IHJ2OihbXHcuXSspKT8vLHc9Ly0oW2Etel0pL2lnLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSx5PWQudXNlckFnZW50LHosQSxCLEM9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxEPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksRT1BcnJheS5wcm90b3R5cGUucHVzaCxGPUFycmF5LnByb3RvdHlwZS5zbGljZSxHPVN0cmluZy5wcm90b3R5cGUudHJpbSxIPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLEk9e307ZS5mbj1lLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZSxpbml0OmZ1bmN0aW9uKGEsZCxmKXt2YXIgZyxoLGosaztpZighYSlyZXR1cm4gdGhpcztpZihhLm5vZGVUeXBlKXt0aGlzLmNvbnRleHQ9dGhpc1swXT1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYoYT09PSJib2R5IiYmIWQmJmMuYm9keSl7dGhpcy5jb250ZXh0PWMsdGhpc1swXT1jLmJvZHksdGhpcy5zZWxlY3Rvcj1hLHRoaXMubGVuZ3RoPTE7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJzdHJpbmciKXthLmNoYXJBdCgwKSE9PSI8Inx8YS5jaGFyQXQoYS5sZW5ndGgtMSkhPT0iPiJ8fGEubGVuZ3RoPDM/Zz1pLmV4ZWMoYSk6Zz1bbnVsbCxhLG51bGxdO2lmKGcmJihnWzFdfHwhZCkpe2lmKGdbMV0pe2Q9ZCBpbnN0YW5jZW9mIGU/ZFswXTpkLGs9ZD9kLm93bmVyRG9jdW1lbnR8fGQ6YyxqPW4uZXhlYyhhKSxqP2UuaXNQbGFpbk9iamVjdChkKT8oYT1bYy5jcmVhdGVFbGVtZW50KGpbMV0pXSxlLmZuLmF0dHIuY2FsbChhLGQsITApKTphPVtrLmNyZWF0ZUVsZW1lbnQoalsxXSldOihqPWUuYnVpbGRGcmFnbWVudChbZ1sxXV0sW2tdKSxhPShqLmNhY2hlYWJsZT9lLmNsb25lKGouZnJhZ21lbnQpOmouZnJhZ21lbnQpLmNoaWxkTm9kZXMpO3JldHVybiBlLm1lcmdlKHRoaXMsYSl9aD1jLmdldEVsZW1lbnRCeUlkKGdbMl0pO2lmKGgmJmgucGFyZW50Tm9kZSl7aWYoaC5pZCE9PWdbMl0pcmV0dXJuIGYuZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09aH10aGlzLmNvbnRleHQ9Yyx0aGlzLnNlbGVjdG9yPWE7cmV0dXJuIHRoaXN9cmV0dXJuIWR8fGQuanF1ZXJ5PyhkfHxmKS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoZCkuZmluZChhKX1pZihlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGYucmVhZHkoYSk7YS5zZWxlY3RvciE9PWImJih0aGlzLnNlbGVjdG9yPWEuc2VsZWN0b3IsdGhpcy5jb250ZXh0PWEuY29udGV4dCk7cmV0dXJuIGUubWFrZUFycmF5KGEsdGhpcyl9LHNlbGVjdG9yOiIiLGpxdWVyeToiMS42LjIiLGxlbmd0aDowLHNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gRi5jYWxsKHRoaXMsMCl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD90aGlzLnRvQXJyYXkoKTphPDA/dGhpc1t0aGlzLmxlbmd0aCthXTp0aGlzW2FdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuY29uc3RydWN0b3IoKTtlLmlzQXJyYXkoYSk/RS5hcHBseShkLGEpOmUubWVyZ2UoZCxhKSxkLnByZXZPYmplY3Q9dGhpcyxkLmNvbnRleHQ9dGhpcy5jb250ZXh0LGI9PT0iZmluZCI/ZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNlbGVjdG9yPyIgIjoiIikrYzpiJiYoZC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyIuIitiKyIoIitjKyIpIik7cmV0dXJuIGR9LGVhY2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS5lYWNoKHRoaXMsYSxiKX0scmVhZHk6ZnVuY3Rpb24oYSl7ZS5iaW5kUmVhZHkoKSxBLmRvbmUoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09LTE/dGhpcy5zbGljZShhKTp0aGlzLnNsaWNlKGEsK2ErMSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKEYuYXBwbHkodGhpcyxhcmd1bWVudHMpLCJzbGljZSIsRi5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhlLm1hcCh0aGlzLGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuY2FsbChiLGMsYil9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6RSxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0sZS5mbi5pbml0LnByb3RvdHlwZT1lLmZuLGUuZXh0ZW5kPWUuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGEsYyxkLGYsZyxoLGk9YXJndW1lbnRzWzBdfHx7fSxqPTEsaz1hcmd1bWVudHMubGVuZ3RoLGw9ITE7dHlwZW9mIGk9PSJib29sZWFuIiYmKGw9aSxpPWFyZ3VtZW50c1sxXXx8e30saj0yKSx0eXBlb2YgaSE9Im9iamVjdCImJiFlLmlzRnVuY3Rpb24oaSkmJihpPXt9KSxrPT09aiYmKGk9dGhpcywtLWopO2Zvcig7ajxrO2orKylpZigoYT1hcmd1bWVudHNbal0pIT1udWxsKWZvcihjIGluIGEpe2Q9aVtjXSxmPWFbY107aWYoaT09PWYpY29udGludWU7bCYmZiYmKGUuaXNQbGFpbk9iamVjdChmKXx8KGc9ZS5pc0FycmF5KGYpKSk/KGc/KGc9ITEsaD1kJiZlLmlzQXJyYXkoZCk/ZDpbXSk6aD1kJiZlLmlzUGxhaW5PYmplY3QoZCk/ZDp7fSxpW2NdPWUuZXh0ZW5kKGwsaCxmKSk6ZiE9PWImJihpW2NdPWYpfXJldHVybiBpfSxlLmV4dGVuZCh7bm9Db25mbGljdDpmdW5jdGlvbihiKXthLiQ9PT1lJiYoYS4kPWcpLGImJmEualF1ZXJ5PT09ZSYmKGEualF1ZXJ5PWYpO3JldHVybiBlfSxpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP2UucmVhZHlXYWl0Kys6ZS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMCYmIS0tZS5yZWFkeVdhaXR8fGEhPT0hMCYmIWUuaXNSZWFkeSl7aWYoIWMuYm9keSlyZXR1cm4gc2V0VGltZW91dChlLnJlYWR5LDEpO2UuaXNSZWFkeT0hMDtpZihhIT09ITAmJi0tZS5yZWFkeVdhaXQ+MClyZXR1cm47QS5yZXNvbHZlV2l0aChjLFtlXSksZS5mbi50cmlnZ2VyJiZlKGMpLnRyaWdnZXIoInJlYWR5IikudW5iaW5kKCJyZWFkeSIpfX0sYmluZFJlYWR5OmZ1bmN0aW9uKCl7aWYoIUEpe0E9ZS5fRGVmZXJyZWQoKTtpZihjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiKXJldHVybiBzZXRUaW1lb3V0KGUucmVhZHksMSk7aWYoYy5hZGRFdmVudExpc3RlbmVyKWMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQiwhMSksYS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixlLnJlYWR5LCExKTtlbHNlIGlmKGMuYXR0YWNoRXZlbnQpe2MuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksYS5hdHRhY2hFdmVudCgib25sb2FkIixlLnJlYWR5KTt2YXIgYj0hMTt0cnl7Yj1hLmZyYW1lRWxlbWVudD09bnVsbH1jYXRjaChkKXt9Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwmJmImJkooKX19fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iZnVuY3Rpb24ifSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGEpe3JldHVybiBlLnR5cGUoYSk9PT0iYXJyYXkifSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmdHlwZW9mIGE9PSJvYmplY3QiJiYic2V0SW50ZXJ2YWwiaW4gYX0saXNOYU46ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGx8fCFtLnRlc3QoYSl8fGlzTmFOKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpJW0MuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTtpZihhLmNvbnN0cnVjdG9yJiYhRC5jYWxsKGEsImNvbnN0cnVjdG9yIikmJiFELmNhbGwoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMTt2YXIgYztmb3IoYyBpbiBhKTtyZXR1cm4gYz09PWJ8fEQuY2FsbChhLGMpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBhfSxwYXJzZUpTT046ZnVuY3Rpb24oYil7aWYodHlwZW9mIGIhPSJzdHJpbmcifHwhYilyZXR1cm4gbnVsbDtiPWUudHJpbShiKTtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIpO2lmKG8udGVzdChiLnJlcGxhY2UocCwiQCIpLnJlcGxhY2UocSwiXSIpLnJlcGxhY2UociwiIikpKXJldHVybihuZXcgRnVuY3Rpb24oInJldHVybiAiK2IpKSgpO2UuZXJyb3IoIkludmFsaWQgSlNPTjogIitiKX0scGFyc2VYTUw6ZnVuY3Rpb24oYixjLGQpe2EuRE9NUGFyc2VyPyhkPW5ldyBET01QYXJzZXIsYz1kLnBhcnNlRnJvbVN0cmluZyhiLCJ0ZXh0L3htbCIpKTooYz1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGMuYXN5bmM9ImZhbHNlIixjLmxvYWRYTUwoYikpLGQ9Yy5kb2N1bWVudEVsZW1lbnQsKCFkfHwhZC5ub2RlTmFtZXx8ZC5ub2RlTmFtZT09PSJwYXJzZXJlcnJvciIpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitiKTtyZXR1cm4gY30sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2Uodyx4KX0sbm9kZU5hbWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT09Yi50b1VwcGVyQ2FzZSgpfSxlYWNoOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZixnPTAsaD1hLmxlbmd0aCxpPWg9PT1ifHxlLmlzRnVuY3Rpb24oYSk7aWYoZCl7aWYoaSl7Zm9yKGYgaW4gYSlpZihjLmFwcGx5KGFbZl0sZCk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmFwcGx5KGFbZysrXSxkKT09PSExKWJyZWFrfWVsc2UgaWYoaSl7Zm9yKGYgaW4gYSlpZihjLmNhbGwoYVtmXSxmLGFbZl0pPT09ITEpYnJlYWt9ZWxzZSBmb3IoO2c8aDspaWYoYy5jYWxsKGFbZ10sZyxhW2crK10pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRyaW06Rz9mdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjpHLmNhbGwoYSl9OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKGssIiIpLnJlcGxhY2UobCwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihhLGIpe3ZhciBjPWJ8fFtdO2lmKGEhPW51bGwpe3ZhciBkPWUudHlwZShhKTthLmxlbmd0aD09bnVsbHx8ZD09PSJzdHJpbmcifHxkPT09ImZ1bmN0aW9uInx8ZD09PSJyZWdleHAifHxlLmlzV2luZG93KGEpP0UuY2FsbChjLGEpOmUubWVyZ2UoYyxhKX1yZXR1cm4gY30saW5BcnJheTpmdW5jdGlvbihhLGIpe2lmKEgpcmV0dXJuIEguY2FsbChiLGEpO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihiW2NdPT09YSlyZXR1cm4gYztyZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLmxlbmd0aCxlPTA7aWYodHlwZW9mIGMubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGY9Yy5sZW5ndGg7ZTxmO2UrKylhW2QrK109Y1tlXTtlbHNlIHdoaWxlKGNbZV0hPT1iKWFbZCsrXT1jW2UrK107YS5sZW5ndGg9ZDtyZXR1cm4gYX0sZ3JlcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZTtjPSEhYztmb3IodmFyIGY9MCxnPWEubGVuZ3RoO2Y8ZztmKyspZT0hIWIoYVtmXSxmKSxjIT09ZSYmZC5wdXNoKGFbZl0pO3JldHVybiBkfSxtYXA6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGcsaD1bXSxpPTAsaj1hLmxlbmd0aCxrPWEgaW5zdGFuY2VvZiBlfHxqIT09YiYmdHlwZW9mIGo9PSJudW1iZXIiJiYoaj4wJiZhWzBdJiZhW2otMV18fGo9PT0wfHxlLmlzQXJyYXkoYSkpO2lmKGspZm9yKDtpPGo7aSsrKWY9YyhhW2ldLGksZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO2Vsc2UgZm9yKGcgaW4gYSlmPWMoYVtnXSxnLGQpLGYhPW51bGwmJihoW2gubGVuZ3RoXT1mKTtyZXR1cm4gaC5jb25jYXQuYXBwbHkoW10saCl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGMpe2lmKHR5cGVvZiBjPT0ic3RyaW5nIil7dmFyIGQ9YVtjXTtjPWEsYT1kfWlmKCFlLmlzRnVuY3Rpb24oYSkpcmV0dXJuIGI7dmFyIGY9Ri5jYWxsKGFyZ3VtZW50cywyKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYXBwbHkoYyxmLmNvbmNhdChGLmNhbGwoYXJndW1lbnRzKSkpfTtnLmd1aWQ9YS5ndWlkPWEuZ3VpZHx8Zy5ndWlkfHxlLmd1aWQrKztyZXR1cm4gZ30sYWNjZXNzOmZ1bmN0aW9uKGEsYyxkLGYsZyxoKXt2YXIgaT1hLmxlbmd0aDtpZih0eXBlb2YgYz09Im9iamVjdCIpe2Zvcih2YXIgaiBpbiBjKWUuYWNjZXNzKGEsaixjW2pdLGYsZyxkKTtyZXR1cm4gYX1pZihkIT09Yil7Zj0haCYmZiYmZS5pc0Z1bmN0aW9uKGQpO2Zvcih2YXIgaz0wO2s8aTtrKyspZyhhW2tdLGMsZj9kLmNhbGwoYVtrXSxrLGcoYVtrXSxjKSk6ZCxoKTtyZXR1cm4gYX1yZXR1cm4gaT9nKGFbMF0sYyk6Yn0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9LHVhTWF0Y2g6ZnVuY3Rpb24oYSl7YT1hLnRvTG93ZXJDYXNlKCk7dmFyIGI9cy5leGVjKGEpfHx0LmV4ZWMoYSl8fHUuZXhlYyhhKXx8YS5pbmRleE9mKCJjb21wYXRpYmxlIik8MCYmdi5leGVjKGEpfHxbXTtyZXR1cm57YnJvd3NlcjpiWzFdfHwiIix2ZXJzaW9uOmJbMl18fCIwIn19LHN1YjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtyZXR1cm4gbmV3IGEuZm4uaW5pdChiLGMpfWUuZXh0ZW5kKCEwLGEsdGhpcyksYS5zdXBlcmNsYXNzPXRoaXMsYS5mbj1hLnByb3RvdHlwZT10aGlzKCksYS5mbi5jb25zdHJ1Y3Rvcj1hLGEuc3ViPXRoaXMuc3ViLGEuZm4uaW5pdD1mdW5jdGlvbihkLGYpe2YmJmYgaW5zdGFuY2VvZiBlJiYhKGYgaW5zdGFuY2VvZiBhKSYmKGY9YShmKSk7cmV0dXJuIGUuZm4uaW5pdC5jYWxsKHRoaXMsZCxmLGIpfSxhLmZuLmluaXQucHJvdG90eXBlPWEuZm47dmFyIGI9YShjKTtyZXR1cm4gYX0sYnJvd3Nlcjp7fX0pLGUuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe0lbIltvYmplY3QgIitiKyJdIl09Yi50b0xvd2VyQ2FzZSgpfSksej1lLnVhTWF0Y2goeSksei5icm93c2VyJiYoZS5icm93c2VyW3ouYnJvd3Nlcl09ITAsZS5icm93c2VyLnZlcnNpb249ei52ZXJzaW9uKSxlLmJyb3dzZXIud2Via2l0JiYoZS5icm93c2VyLnNhZmFyaT0hMCksai50ZXN0KCIgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9CPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihCPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQiksZS5yZWFkeSgpKX0pO3JldHVybiBlfSgpLGc9ImRvbmUgZmFpbCBpc1Jlc29sdmVkIGlzUmVqZWN0ZWQgcHJvbWlzZSB0aGVuIGFsd2F5cyBwaXBlIi5zcGxpdCgiICIpLGg9W10uc2xpY2U7Zi5leHRlbmQoe19EZWZlcnJlZDpmdW5jdGlvbigpe3ZhciBhPVtdLGIsYyxkLGU9e2RvbmU6ZnVuY3Rpb24oKXtpZighZCl7dmFyIGM9YXJndW1lbnRzLGcsaCxpLGosaztiJiYoaz1iLGI9MCk7Zm9yKGc9MCxoPWMubGVuZ3RoO2c8aDtnKyspaT1jW2ddLGo9Zi50eXBlKGkpLGo9PT0iYXJyYXkiP2UuZG9uZS5hcHBseShlLGkpOmo9PT0iZnVuY3Rpb24iJiZhLnB1c2goaSk7ayYmZS5yZXNvbHZlV2l0aChrWzBdLGtbMV0pfXJldHVybiB0aGlzfSxyZXNvbHZlV2l0aDpmdW5jdGlvbihlLGYpe2lmKCFkJiYhYiYmIWMpe2Y9Znx8W10sYz0xO3RyeXt3aGlsZShhWzBdKWEuc2hpZnQoKS5hcHBseShlLGYpfWZpbmFsbHl7Yj1bZSxmXSxjPTB9fXJldHVybiB0aGlzfSxyZXNvbHZlOmZ1bmN0aW9uKCl7ZS5yZXNvbHZlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGlzUmVzb2x2ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWN8fCEhYn0sY2FuY2VsOmZ1bmN0aW9uKCl7ZD0xLGE9W107cmV0dXJuIHRoaXN9fTtyZXR1cm4gZX0sRGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5fRGVmZXJyZWQoKSxjPWYuX0RlZmVycmVkKCksZDtmLmV4dGVuZChiLHt0aGVuOmZ1bmN0aW9uKGEsYyl7Yi5kb25lKGEpLmZhaWwoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBiLmRvbmUuYXBwbHkoYixhcmd1bWVudHMpLmZhaWwuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxmYWlsOmMuZG9uZSxyZWplY3RXaXRoOmMucmVzb2x2ZVdpdGgscmVqZWN0OmMucmVzb2x2ZSxpc1JlamVjdGVkOmMuaXNSZXNvbHZlZCxwaXBlOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYywicmVqZWN0Il19LGZ1bmN0aW9uKGEsYyl7dmFyIGU9Y1swXSxnPWNbMV0saDtmLmlzRnVuY3Rpb24oZSk/YlthXShmdW5jdGlvbigpe2g9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaCYmZi5pc0Z1bmN0aW9uKGgucHJvbWlzZSk/aC5wcm9taXNlKCkudGhlbihkLnJlc29sdmUsZC5yZWplY3QpOmRbZ10oaCl9KTpiW2FdKGRbZ10pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbCl7aWYoZClyZXR1cm4gZDtkPWE9e319dmFyIGM9Zy5sZW5ndGg7d2hpbGUoYy0tKWFbZ1tjXV09YltnW2NdXTtyZXR1cm4gYX19KSxiLmRvbmUoYy5jYW5jZWwpLmZhaWwoYi5jYW5jZWwpLGRlbGV0ZSBiLmNhbmNlbCxhJiZhLmNhbGwoYixiKTtyZXR1cm4gYn0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBpKGEpe3JldHVybiBmdW5jdGlvbihjKXtiW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9oLmNhbGwoYXJndW1lbnRzLDApOmMsLS1lfHxnLnJlc29sdmVXaXRoKGcsaC5jYWxsKGIsMCkpfX12YXIgYj1hcmd1bWVudHMsYz0wLGQ9Yi5sZW5ndGgsZT1kLGc9ZDw9MSYmYSYmZi5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/YTpmLkRlZmVycmVkKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihpKGMpLGcucmVqZWN0KTotLWU7ZXx8Zy5yZXNvbHZlV2l0aChnLGIpfWVsc2UgZyE9PWEmJmcucmVzb2x2ZVdpdGgoZyxkP1thXTpbXSk7cmV0dXJuIGcucHJvbWlzZSgpfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1jLmRvY3VtZW50RWxlbWVudCxkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxhLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLGU9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpWzBdO2lmKCFkfHwhZC5sZW5ndGh8fCFlKXJldHVybnt9O2c9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSxoPWcuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSksaT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLGs9e2xlYWRpbmdXaGl0ZXNwYWNlOmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTMsdGJvZHk6IWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLGh0bWxTZXJpYWxpemU6ISFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVuZ3RoLHN0eWxlOi90b3AvLnRlc3QoZS5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhyZWZOb3JtYWxpemVkOmUuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNpdHk6L14wLjU1JC8udGVzdChlLnN0eWxlLm9wYWNpdHkpLGNzc0Zsb2F0OiEhZS5zdHlsZS5jc3NGbG9hdCxjaGVja09uOmkudmFsdWU9PT0ib24iLG9wdFNlbGVjdGVkOmguc2VsZWN0ZWQsZ2V0U2V0QXR0cmlidXRlOmEuY2xhc3NOYW1lIT09InQiLHN1Ym1pdEJ1YmJsZXM6ITAsY2hhbmdlQnViYmxlczohMCxmb2N1c2luQnViYmxlczohMSxkZWxldGVFeHBhbmRvOiEwLG5vQ2xvbmVFdmVudDohMCxpbmxpbmVCbG9ja05lZWRzTGF5b3V0OiExLHNocmlua1dyYXBCbG9ja3M6ITEscmVsaWFibGVNYXJnaW5SaWdodDohMH0saS5jaGVja2VkPSEwLGsubm9DbG9uZUNoZWNrZWQ9aS5jbG9uZU5vZGUoITApLmNoZWNrZWQsZy5kaXNhYmxlZD0hMCxrLm9wdERpc2FibGVkPSFoLmRpc2FibGVkO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKHYpe2suZGVsZXRlRXhwYW5kbz0hMX0hYS5hZGRFdmVudExpc3RlbmVyJiZhLmF0dGFjaEV2ZW50JiZhLmZpcmVFdmVudCYmKGEuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxhLmNsb25lTm9kZSghMCkuZmlyZUV2ZW50KCJvbmNsaWNrIikpLGk9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGkudmFsdWU9InQiLGkuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9aS52YWx1ZT09PSJ0IixpLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxhLmFwcGVuZENoaWxkKGkpLGw9Yy5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbC5hcHBlbmRDaGlsZChhLmZpcnN0Q2hpbGQpLGsuY2hlY2tDbG9uZT1sLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxhLmlubmVySFRNTD0iIixhLnN0eWxlLndpZHRoPWEuc3R5bGUucGFkZGluZ0xlZnQ9IjFweCIsbT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sbz1jLmNyZWF0ZUVsZW1lbnQobT8iZGl2IjoiYm9keSIpLHA9e3Zpc2liaWxpdHk6ImhpZGRlbiIsd2lkdGg6MCxoZWlnaHQ6MCxib3JkZXI6MCxtYXJnaW46MH0sbSYmZi5leHRlbmQocCx7cG9zaXRpb246ImFic29sdXRlIixsZWZ0Oi0xZTMsdG9wOi0xZTN9KTtmb3IodCBpbiBwKW8uc3R5bGVbdF09cFt0XTtvLmFwcGVuZENoaWxkKGEpLG49bXx8YixuLmluc2VydEJlZm9yZShvLG4uZmlyc3RDaGlsZCksay5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLmJveE1vZGVsPWEub2Zmc2V0V2lkdGg9PT0yLCJ6b29tImluIGEuc3R5bGUmJihhLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsYS5zdHlsZS56b29tPTEsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWEub2Zmc2V0V2lkdGg9PT0yLGEuc3R5bGUuZGlzcGxheT0iIixhLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixrLnNocmlua1dyYXBCbG9ja3M9YS5vZmZzZXRXaWR0aCE9PTIpLGEuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHU9cVswXS5vZmZzZXRIZWlnaHQ9PT0wLHFbMF0uc3R5bGUuZGlzcGxheT0iIixxWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGsucmVsaWFibGVIaWRkZW5PZmZzZXRzPXUmJnFbMF0ub2Zmc2V0SGVpZ2h0PT09MCxhLmlubmVySFRNTD0iIixjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihqPWMuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5zdHlsZS53aWR0aD0iMCIsai5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChqKSxrLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCksby5pbm5lckhUTUw9IiIsbi5yZW1vdmVDaGlsZChvKTtpZihhLmF0dGFjaEV2ZW50KWZvcih0IGlue3N1Ym1pdDoxLGNoYW5nZToxLGZvY3VzaW46MX0pcz0ib24iK3QsdT1zIGluIGEsdXx8KGEuc2V0QXR0cmlidXRlKHMsInJldHVybjsiKSx1PXR5cGVvZiBhW3NdPT0iZnVuY3Rpb24iKSxrW3QrIkJ1YmJsZXMiXT11O289bD1nPWg9bT1qPWE9aT1udWxsO3JldHVybiBrfSgpLGYuYm94TW9kZWw9Zi5zdXBwb3J0LmJveE1vZGVsO3ZhciBpPS9eKD86XHsuKlx9fFxbLipcXSkkLyxqPS8oW2Etel0pKFtBLVpdKS9nO2YuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoZi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9mLmNhY2hlW2FbZi5leHBhbmRvXV06YVtmLmV4cGFuZG9dO3JldHVybiEhYSYmIWwoYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBnPWYuZXhwYW5kbyxoPXR5cGVvZiBjPT0ic3RyaW5nIixpLGo9YS5ub2RlVHlwZSxrPWo/Zi5jYWNoZTphLGw9aj9hW2YuZXhwYW5kb106YVtmLmV4cGFuZG9dJiZmLmV4cGFuZG87aWYoKCFsfHxlJiZsJiYha1tsXVtnXSkmJmgmJmQ9PT1iKXJldHVybjtsfHwoaj9hW2YuZXhwYW5kb109bD0rK2YudXVpZDpsPWYuZXhwYW5kbyksa1tsXXx8KGtbbF09e30sanx8KGtbbF0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9rW2xdW2ddPWYuZXh0ZW5kKGtbbF1bZ10sYyk6a1tsXT1mLmV4dGVuZChrW2xdLGMpO2k9a1tsXSxlJiYoaVtnXXx8KGlbZ109e30pLGk9aVtnXSksZCE9PWImJihpW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihjPT09ImV2ZW50cyImJiFpW2NdKXJldHVybiBpW2ddJiZpW2ddLmV2ZW50cztyZXR1cm4gaD9pW2YuY2FtZWxDYXNlKGMpXXx8aVtjXTppfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihiLGMsZCl7aWYoISFmLmFjY2VwdERhdGEoYikpe3ZhciBlPWYuZXhwYW5kbyxnPWIubm9kZVR5cGUsaD1nP2YuY2FjaGU6YixpPWc/YltmLmV4cGFuZG9dOmYuZXhwYW5kbztpZighaFtpXSlyZXR1cm47aWYoYyl7dmFyIGo9ZD9oW2ldW2VdOmhbaV07aWYoail7ZGVsZXRlIGpbY107aWYoIWwoaikpcmV0dXJufX1pZihkKXtkZWxldGUgaFtpXVtlXTtpZighbChoW2ldKSlyZXR1cm59dmFyIGs9aFtpXVtlXTtmLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8aCE9YT9kZWxldGUgaFtpXTpoW2ldPW51bGwsaz8oaFtpXT17fSxnfHwoaFtpXS50b0pTT049Zi5ub29wKSxoW2ldW2VdPWspOmcmJihmLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYltmLmV4cGFuZG9dOmIucmVtb3ZlQXR0cmlidXRlP2IucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyk6YltmLmV4cGFuZG9dPW51bGwpfX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWYubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4gYiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn1yZXR1cm4hMH19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkPW51bGw7aWYodHlwZW9mIGE9PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7ZD1mLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEpe3ZhciBlPXRoaXNbMF0uYXR0cmlidXRlcyxnO2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKylnPWVbaF0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1mLmNhbWVsQ2FzZShnLnN1YnN0cmluZyg1KSksayh0aGlzWzBdLGcsZFtnXSkpfX1yZXR1cm4gZH1pZih0eXBlb2YgYT09Im9iamVjdCIpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZGF0YSh0aGlzLGEpfSk7dmFyIGo9YS5zcGxpdCgiLiIpO2pbMV09alsxXT8iLiIralsxXToiIjtpZihjPT09Yil7ZD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitqWzFdKyIhIixbalswXV0pLGQ9PT1iJiZ0aGlzLmxlbmd0aCYmKGQ9Zi5kYXRhKHRoaXNbMF0sYSksZD1rKHRoaXNbMF0sYSxkKSk7cmV0dXJuIGQ9PT1iJiZqWzFdP3RoaXMuZGF0YShqWzBdKTpkfXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGQ9W2pbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIralsxXSsiISIsZCksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitqWzFdKyIhIixkKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGMpe2EmJihjPShjfHwiZngiKSsibWFyayIsZi5kYXRhKGEsYywoZi5kYXRhKGEsYyxiLCEwKXx8MCkrMSwhMCkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYyxkKXthIT09ITAmJihkPWMsYz1hLGE9ITEpO2lmKGMpe2Q9ZHx8ImZ4Ijt2YXIgZT1kKyJtYXJrIixnPWE/MDooZi5kYXRhKGMsZSxiLCEwKXx8MSktMTtnP2YuZGF0YShjLGUsZywhMCk6KGYucmVtb3ZlRGF0YShjLGUsITApLG0oYyxkLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxjLGQpe2lmKGEpe2M9KGN8fCJmeCIpKyJxdWV1ZSI7dmFyIGU9Zi5kYXRhKGEsYyxiLCEwKTtkJiYoIWV8fGYuaXNBcnJheShkKT9lPWYuZGF0YShhLGMsZi5tYWtlQXJyYXkoZCksITApOmUucHVzaChkKSk7cmV0dXJuIGV8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0pKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlIiwhMCksbShhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKCl7dmFyIGM9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGMsYil9LGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuX0RlZmVycmVkKCksITApKWgrKyxsLmRvbmUobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbj0vW1xuXHRccl0vZyxvPS9ccysvLHA9L1xyL2cscT0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscj0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSxzPS9eYSg/OnJlYSk/JC9pLHQ9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdT0vXDp8Xm9uLyx2LHc7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChvKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChvKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG4sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChvKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiO2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKylpZigoIiAiK3RoaXNbY10uY2xhc3NOYW1lKyIgIikucmVwbGFjZShuLCIgIikuaW5kZXhPZihiKT4tMSlyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGEpe3ZhciBjLGQsZT10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihlKXtjPWYudmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tlLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZSwidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9ZS52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShwLCIiKTpkPT1udWxsPyIiOmR9cmV0dXJuIGJ9dmFyIGc9Zi5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZCl7dmFyIGU9Zih0aGlzKSxoO2lmKHRoaXMubm9kZVR5cGU9PT0xKXtnP2g9YS5jYWxsKHRoaXMsZCxlLnZhbCgpKTpoPWEsaD09bnVsbD9oPSIiOnR5cGVvZiBoPT0ibnVtYmVyIj9oKz0iIjpmLmlzQXJyYXkoaCkmJihoPWYubWFwKGgsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6YSsiIn0pKSxjPWYudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1t0aGlzLnR5cGVdO2lmKCFjfHwhKCJzZXQiaW4gYyl8fGMuc2V0KHRoaXMsaCwidmFsdWUiKT09PWIpdGhpcy52YWx1ZT1ofX0pfX0pLGYuZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiFifHxiLnNwZWNpZmllZD9hLnZhbHVlOmEudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiLGM9YS5zZWxlY3RlZEluZGV4LGQ9W10sZT1hLm9wdGlvbnMsZz1hLnR5cGU9PT0ic2VsZWN0LW9uZSI7aWYoYzwwKXJldHVybiBudWxsO2Zvcih2YXIgaD1nP2M6MCxpPWc/YysxOmUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoai5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hai5kaXNhYmxlZDpqLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWoucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoai5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGopLnZhbCgpO2lmKGcpcmV0dXJuIGI7ZC5wdXNoKGIpfX1pZihnJiYhZC5sZW5ndGgmJmUubGVuZ3RoKXJldHVybiBmKGVbY10pLnZhbCgpO3JldHVybiBkfSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyRml4Ont0YWJpbmRleDoidGFiSW5kZXgifSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnPWEubm9kZVR5cGU7aWYoIWF8fGc9PT0zfHxnPT09OHx8Zz09PTIpcmV0dXJuIGI7aWYoZSYmYyBpbiBmLmF0dHJGbilyZXR1cm4gZihhKVtjXShkKTtpZighKCJnZXRBdHRyaWJ1dGUiaW4gYSkpcmV0dXJuIGYucHJvcChhLGMsZCk7dmFyIGgsaSxqPWchPT0xfHwhZi5pc1hNTERvYyhhKTtqJiYoYz1mLmF0dHJGaXhbY118fGMsaT1mLmF0dHJIb29rc1tjXSxpfHwodC50ZXN0KGMpP2k9dzp2JiZjIT09ImNsYXNzTmFtZSImJihmLm5vZGVOYW1lKGEsImZvcm0iKXx8dS50ZXN0KGMpKSYmKGk9dikpKTtpZihkIT09Yil7aWYoZD09PW51bGwpe2YucmVtb3ZlQXR0cihhLGMpO3JldHVybiBifWlmKGkmJiJzZXQiaW4gaSYmaiYmKGg9aS5zZXQoYSxkLGMpKSE9PWIpcmV0dXJuIGg7YS5zZXRBdHRyaWJ1dGUoYywiIitkKTtyZXR1cm4gZH1pZihpJiYiZ2V0ImluIGkmJmomJihoPWkuZ2V0KGEsYykpIT09bnVsbClyZXR1cm4gaDtoPWEuZ2V0QXR0cmlidXRlKGMpO3JldHVybiBoPT09bnVsbD9iOmh9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYzthLm5vZGVUeXBlPT09MSYmKGI9Zi5hdHRyRml4W2JdfHxiLGYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoYik6KGYuYXR0cihhLGIsIiIpLGEucmVtb3ZlQXR0cmlidXRlTm9kZShhLmdldEF0dHJpYnV0ZU5vZGUoYikpKSx0LnRlc3QoYikmJihjPWYucHJvcEZpeFtiXXx8YilpbiBhJiYoYVtjXT0hMSkpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKHEudGVzdChhLm5vZGVOYW1lKSYmYS5wYXJlbnROb2RlKWYuZXJyb3IoInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCIpO2Vsc2UgaWYoIWYuc3VwcG9ydC5yYWRpb1ZhbHVlJiZiPT09InJhZGlvIiYmZi5ub2RlTmFtZShhLCJpbnB1dCIpKXt2YXIgYz1hLnZhbHVlO2Euc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKTtyZXR1cm4gYn19fSx0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiSW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6ci50ZXN0KGEubm9kZU5hbWUpfHxzLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fSx2YWx1ZTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYodiYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdi5nZXQoYSxiKTtyZXR1cm4gYiBpbiBhP2EudmFsdWU6bnVsbH0sc2V0OmZ1bmN0aW9uKGEsYixjKXtpZih2JiZmLm5vZGVOYW1lKGEsImJ1dHRvbiIpKXJldHVybiB2LnNldChhLGIsYyk7YS52YWx1ZT1ifX19LHByb3BGaXg6e3RhYmluZGV4OiJ0YWJJbmRleCIscmVhZG9ubHk6InJlYWRPbmx5IiwiZm9yIjoiaHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6ImNlbGxTcGFjaW5nIixjZWxscGFkZGluZzoiY2VsbFBhZGRpbmciLHJvd3NwYW46InJvd1NwYW4iLGNvbHNwYW46ImNvbFNwYW4iLHVzZW1hcDoidXNlTWFwIixmcmFtZWJvcmRlcjoiZnJhbWVCb3JkZXIiLGNvbnRlbnRlZGl0YWJsZToiY29udGVudEVkaXRhYmxlIn0scHJvcDpmdW5jdGlvbihhLGMsZCl7dmFyIGU9YS5ub2RlVHlwZTtpZighYXx8ZT09PTN8fGU9PT04fHxlPT09MilyZXR1cm4gYjt2YXIgZyxoLGk9ZSE9PTF8fCFmLmlzWE1MRG9jKGEpO2kmJihjPWYucHJvcEZpeFtjXXx8YyxoPWYucHJvcEhvb2tzW2NdKTtyZXR1cm4gZCE9PWI/aCYmInNldCJpbiBoJiYoZz1oLnNldChhLGQsYykpIT09Yj9nOmFbY109ZDpoJiYiZ2V0ImluIGgmJihnPWguZ2V0KGEsYykpIT09Yj9nOmFbY119LHByb3BIb29rczp7fX0pLHc9e2dldDpmdW5jdGlvbihhLGMpe3JldHVybiBmLnByb3AoYSxjKT9jLnRvTG93ZXJDYXNlKCk6Yn0sc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtiPT09ITE/Zi5yZW1vdmVBdHRyKGEsYyk6KGQ9Zi5wcm9wRml4W2NdfHxjLGQgaW4gYSYmKGFbZF09ITApLGEuc2V0QXR0cmlidXRlKGMsYy50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGN9fSxmLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlfHwoZi5hdHRyRml4PWYucHJvcEZpeCx2PWYuYXR0ckhvb2tzLm5hbWU9Zi5hdHRySG9va3MudGl0bGU9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiZkLm5vZGVWYWx1ZSE9PSIiP2Qubm9kZVZhbHVlOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO2lmKGQpe2Qubm9kZVZhbHVlPWI7cmV0dXJuIGJ9fX0sZi5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe2YuYXR0ckhvb2tzW2JdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2JdLHtzZXQ6ZnVuY3Rpb24oYSxjKXtpZihjPT09IiIpe2Euc2V0QXR0cmlidXRlKGIsImF1dG8iKTtyZXR1cm4gY319fSl9KSksZi5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHxmLmVhY2goWyJocmVmIiwic3JjIiwid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGMpe2YuYXR0ckhvb2tzW2NdPWYuZXh0ZW5kKGYuYXR0ckhvb2tzW2NdLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGUoYywyKTtyZXR1cm4gZD09PW51bGw/YjpkfX0pfSksZi5zdXBwb3J0LnN0eWxlfHwoZi5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0LnRvTG93ZXJDYXNlKCl8fGJ9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9IiIrYn19KSxmLnN1cHBvcnQub3B0U2VsZWN0ZWR8fChmLnByb3BIb29rcy5zZWxlY3RlZD1mLmV4dGVuZChmLnByb3BIb29rcy5zZWxlY3RlZCx7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpfX0pKSxmLnN1cHBvcnQuY2hlY2tPbnx8Zi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfX19KSxmLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtmLnZhbEhvb2tzW3RoaXNdPWYuZXh0ZW5kKGYudmFsSG9va3NbdGhpc10se3NldDpmdW5jdGlvbihhLGIpe2lmKGYuaXNBcnJheShiKSlyZXR1cm4gYS5jaGVja2VkPWYuaW5BcnJheShmKGEpLnZhbCgpLGIpPj0wfX0pfSk7dmFyIHg9L1wuKC4qKSQvLHk9L14oPzp0ZXh0YXJlYXxpbnB1dHxzZWxlY3QpJC9pLHo9L1wuL2csQT0vIC9nLEI9L1teXHdccy58YF0vZyxDPWZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoQiwiXFwkJiIpfTtmLmV2ZW50PXthZGQ6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04KXtpZihkPT09ITEpZD1EO2Vsc2UgaWYoIWQpcmV0dXJuO3ZhciBnLGg7ZC5oYW5kbGVyJiYoZz1kLGQ9Zy5oYW5kbGVyKSxkLmd1aWR8fChkLmd1aWQ9Zi5ndWlkKyspO3ZhciBpPWYuX2RhdGEoYSk7aWYoIWkpcmV0dXJuO3ZhciBqPWkuZXZlbnRzLGs9aS5oYW5kbGU7anx8KGkuZXZlbnRzPWo9e30pLGt8fChpLmhhbmRsZT1rPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuaGFuZGxlLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpOmJ9KSxrLmVsZW09YSxjPWMuc3BsaXQoIiAiKTt2YXIgbCxtPTAsbjt3aGlsZShsPWNbbSsrXSl7aD1nP2YuZXh0ZW5kKHt9LGcpOntoYW5kbGVyOmQsZGF0YTplfSxsLmluZGV4T2YoIi4iKT4tMT8obj1sLnNwbGl0KCIuIiksbD1uLnNoaWZ0KCksaC5uYW1lc3BhY2U9bi5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpKToobj1bXSxoLm5hbWVzcGFjZT0iIiksaC50eXBlPWwsaC5ndWlkfHwoaC5ndWlkPWQuZ3VpZCk7dmFyIG89altsXSxwPWYuZXZlbnQuc3BlY2lhbFtsXXx8e307aWYoIW8pe289altsXT1bXTtpZighcC5zZXR1cHx8cC5zZXR1cC5jYWxsKGEsZSxuLGspPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihsLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitsLGspfXAuYWRkJiYocC5hZGQuY2FsbChhLGgpLGguaGFuZGxlci5ndWlkfHwoaC5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksby5wdXNoKGgpLGYuZXZlbnQuZ2xvYmFsW2xdPSEwfWE9bnVsbH19LGdsb2JhbDp7fSxyZW1vdmU6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04KXtkPT09ITEmJihkPUQpO3ZhciBnLGgsaSxqLGs9MCxsLG0sbixvLHAscSxyLHM9Zi5oYXNEYXRhKGEpJiZmLl9kYXRhKGEpLHQ9cyYmcy5ldmVudHM7aWYoIXN8fCF0KXJldHVybjtjJiZjLnR5cGUmJihkPWMuaGFuZGxlcixjPWMudHlwZSk7aWYoIWN8fHR5cGVvZiBjPT0ic3RyaW5nIiYmYy5jaGFyQXQoMCk9PT0iLiIpe2M9Y3x8IiI7Zm9yKGggaW4gdClmLmV2ZW50LnJlbW92ZShhLGgrYyk7cmV0dXJufWM9Yy5zcGxpdCgiICIpO3doaWxlKGg9Y1trKytdKXtyPWgscT1udWxsLGw9aC5pbmRleE9mKCIuIik8MCxtPVtdLGx8fChtPWguc3BsaXQoIi4iKSxoPW0uc2hpZnQoKSxuPW5ldyBSZWdFeHAoIihefFxcLikiK2YubWFwKG0uc2xpY2UoMCkuc29ydCgpLEMpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpKSxwPXRbaF07aWYoIXApY29udGludWU7aWYoIWQpe2ZvcihqPTA7ajxwLmxlbmd0aDtqKyspe3E9cFtqXTtpZihsfHxuLnRlc3QocS5uYW1lc3BhY2UpKWYuZXZlbnQucmVtb3ZlKGEscixxLmhhbmRsZXIsaikscC5zcGxpY2Uoai0tLDEpfWNvbnRpbnVlfW89Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtmb3Ioaj1lfHwwO2o8cC5sZW5ndGg7aisrKXtxPXBbal07aWYoZC5ndWlkPT09cS5ndWlkKXtpZihsfHxuLnRlc3QocS5uYW1lc3BhY2UpKWU9PW51bGwmJnAuc3BsaWNlKGotLSwxKSxvLnJlbW92ZSYmby5yZW1vdmUuY2FsbChhLHEpO2lmKGUhPW51bGwpYnJlYWt9fWlmKHAubGVuZ3RoPT09MHx8ZSE9bnVsbCYmcC5sZW5ndGg9PT0xKSghby50ZWFyZG93bnx8by50ZWFyZG93bi5jYWxsKGEsbSk9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxoLHMuaGFuZGxlKSxnPW51bGwsZGVsZXRlIHRbaF19aWYoZi5pc0VtcHR5T2JqZWN0KHQpKXt2YXIgdT1zLmhhbmRsZTt1JiYodS5lbGVtPW51bGwpLGRlbGV0ZSBzLmV2ZW50cyxkZWxldGUgcy5oYW5kbGUsZi5pc0VtcHR5T2JqZWN0KHMpJiZmLnJlbW92ZURhdGEoYSxiLCEwKX19fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7dmFyIGg9Yy50eXBlfHxjLGk9W10sajtoLmluZGV4T2YoIiEiKT49MCYmKGg9aC5zbGljZSgwLC0xKSxqPSEwKSxoLmluZGV4T2YoIi4iKT49MCYmKGk9aC5zcGxpdCgiLiIpLGg9aS4KLXNoaWZ0KCksaS5zb3J0KCkpO2lmKCEhZSYmIWYuZXZlbnQuY3VzdG9tRXZlbnRbaF18fCEhZi5ldmVudC5nbG9iYWxbaF0pe2M9dHlwZW9mIGM9PSJvYmplY3QiP2NbZi5leHBhbmRvXT9jOm5ldyBmLkV2ZW50KGgsYyk6bmV3IGYuRXZlbnQoaCksYy50eXBlPWgsYy5leGNsdXNpdmU9aixjLm5hbWVzcGFjZT1pLmpvaW4oIi4iKSxjLm5hbWVzcGFjZV9yZT1uZXcgUmVnRXhwKCIoXnxcXC4pIitpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpO2lmKGd8fCFlKWMucHJldmVudERlZmF1bHQoKSxjLnN0b3BQcm9wYWdhdGlvbigpO2lmKCFlKXtmLmVhY2goZi5jYWNoZSxmdW5jdGlvbigpe3ZhciBhPWYuZXhwYW5kbyxiPXRoaXNbYV07YiYmYi5ldmVudHMmJmIuZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGIuaGFuZGxlLmVsZW0pfSk7cmV0dXJufWlmKGUubm9kZVR5cGU9PT0zfHxlLm5vZGVUeXBlPT09OClyZXR1cm47Yy5yZXN1bHQ9YixjLnRhcmdldD1lLGQ9ZCE9bnVsbD9mLm1ha2VBcnJheShkKTpbXSxkLnVuc2hpZnQoYyk7dmFyIGs9ZSxsPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2Rve3ZhciBtPWYuX2RhdGEoaywiaGFuZGxlIik7Yy5jdXJyZW50VGFyZ2V0PWssbSYmbS5hcHBseShrLGQpLGwmJmYuYWNjZXB0RGF0YShrKSYma1tsXSYma1tsXS5hcHBseShrLGQpPT09ITEmJihjLnJlc3VsdD0hMSxjLnByZXZlbnREZWZhdWx0KCkpLGs9ay5wYXJlbnROb2RlfHxrLm93bmVyRG9jdW1lbnR8fGs9PT1jLnRhcmdldC5vd25lckRvY3VtZW50JiZhfXdoaWxlKGsmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpO2lmKCFjLmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgbixvPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYoKCFvLl9kZWZhdWx0fHxvLl9kZWZhdWx0LmNhbGwoZS5vd25lckRvY3VtZW50LGMpPT09ITEpJiYoaCE9PSJjbGljayJ8fCFmLm5vZGVOYW1lKGUsImEiKSkmJmYuYWNjZXB0RGF0YShlKSl7dHJ5e2wmJmVbaF0mJihuPWVbbF0sbiYmKGVbbF09bnVsbCksZi5ldmVudC50cmlnZ2VyZWQ9aCxlW2hdKCkpfWNhdGNoKHApe31uJiYoZVtsXT1uKSxmLmV2ZW50LnRyaWdnZXJlZD1ifX1yZXR1cm4gYy5yZXN1bHR9fSxoYW5kbGU6ZnVuY3Rpb24oYyl7Yz1mLmV2ZW50LmZpeChjfHxhLmV2ZW50KTt2YXIgZD0oKGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSkuc2xpY2UoMCksZT0hYy5leGNsdXNpdmUmJiFjLm5hbWVzcGFjZSxnPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtnWzBdPWMsYy5jdXJyZW50VGFyZ2V0PXRoaXM7Zm9yKHZhciBoPTAsaT1kLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj1kW2hdO2lmKGV8fGMubmFtZXNwYWNlX3JlLnRlc3Qoai5uYW1lc3BhY2UpKXtjLmhhbmRsZXI9ai5oYW5kbGVyLGMuZGF0YT1qLmRhdGEsYy5oYW5kbGVPYmo9ajt2YXIgaz1qLmhhbmRsZXIuYXBwbHkodGhpcyxnKTtrIT09YiYmKGMucmVzdWx0PWssaz09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKTtpZihjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWt9fXJldHVybiBjLnJlc3VsdH0scHJvcHM6ImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQ9YTthPWYuRXZlbnQoZCk7Zm9yKHZhciBlPXRoaXMucHJvcHMubGVuZ3RoLGc7ZTspZz10aGlzLnByb3BzWy0tZV0sYVtnXT1kW2ddO2EudGFyZ2V0fHwoYS50YXJnZXQ9YS5zcmNFbGVtZW50fHxjKSxhLnRhcmdldC5ub2RlVHlwZT09PTMmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSwhYS5yZWxhdGVkVGFyZ2V0JiZhLmZyb21FbGVtZW50JiYoYS5yZWxhdGVkVGFyZ2V0PWEuZnJvbUVsZW1lbnQ9PT1hLnRhcmdldD9hLnRvRWxlbWVudDphLmZyb21FbGVtZW50KTtpZihhLnBhZ2VYPT1udWxsJiZhLmNsaWVudFghPW51bGwpe3ZhciBoPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fGMsaT1oLmRvY3VtZW50RWxlbWVudCxqPWguYm9keTthLnBhZ2VYPWEuY2xpZW50WCsoaSYmaS5zY3JvbGxMZWZ0fHxqJiZqLnNjcm9sbExlZnR8fDApLShpJiZpLmNsaWVudExlZnR8fGomJmouY2xpZW50TGVmdHx8MCksYS5wYWdlWT1hLmNsaWVudFkrKGkmJmkuc2Nyb2xsVG9wfHxqJiZqLnNjcm9sbFRvcHx8MCktKGkmJmkuY2xpZW50VG9wfHxqJiZqLmNsaWVudFRvcHx8MCl9YS53aGljaD09bnVsbCYmKGEuY2hhckNvZGUhPW51bGx8fGEua2V5Q29kZSE9bnVsbCkmJihhLndoaWNoPWEuY2hhckNvZGUhPW51bGw/YS5jaGFyQ29kZTphLmtleUNvZGUpLCFhLm1ldGFLZXkmJmEuY3RybEtleSYmKGEubWV0YUtleT1hLmN0cmxLZXkpLCFhLndoaWNoJiZhLmJ1dHRvbiE9PWImJihhLndoaWNoPWEuYnV0dG9uJjE/MTphLmJ1dHRvbiYyPzM6YS5idXR0b24mND8yOjApO3JldHVybiBhfSxndWlkOjFlOCxwcm94eTpmLnByb3h5LHNwZWNpYWw6e3JlYWR5OntzZXR1cDpmLmJpbmRSZWFkeSx0ZWFyZG93bjpmLm5vb3B9LGxpdmU6e2FkZDpmdW5jdGlvbihhKXtmLmV2ZW50LmFkZCh0aGlzLE4oYS5vcmlnVHlwZSxhLnNlbGVjdG9yKSxmLmV4dGVuZCh7fSxhLHtoYW5kbGVyOk0sZ3VpZDphLmhhbmRsZXIuZ3VpZH0pKX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsTihhLm9yaWdUeXBlLGEuc2VsZWN0b3IpLGEpfX0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19fSxmLnJlbW92ZUV2ZW50PWMucmVtb3ZlRXZlbnRMaXN0ZW5lcj9mdW5jdGlvbihhLGIsYyl7YS5yZW1vdmVFdmVudExpc3RlbmVyJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoYixjLCExKX06ZnVuY3Rpb24oYSxiLGMpe2EuZGV0YWNoRXZlbnQmJmEuZGV0YWNoRXZlbnQoIm9uIitiLGMpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucHJldmVudERlZmF1bHQpcmV0dXJuIG5ldyBmLkV2ZW50KGEsYik7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5yZXR1cm5WYWx1ZT09PSExfHxhLmdldFByZXZlbnREZWZhdWx0JiZhLmdldFByZXZlbnREZWZhdWx0KCk/RTpEKTp0aGlzLnR5cGU9YSxiJiZmLmV4dGVuZCh0aGlzLGIpLHRoaXMudGltZVN0YW1wPWYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1FO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUU7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUUsdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkQsaXNQcm9wYWdhdGlvblN0b3BwZWQ6RCxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpEfTt2YXIgRj1mdW5jdGlvbihhKXt2YXIgYj1hLnJlbGF0ZWRUYXJnZXQsYz0hMSxkPWEudHlwZTthLnR5cGU9YS5kYXRhLGIhPT10aGlzJiYoYiYmKGM9Zi5jb250YWlucyh0aGlzLGIpKSxjfHwoZi5ldmVudC5oYW5kbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1kKSl9LEc9ZnVuY3Rpb24oYSl7YS50eXBlPWEuZGF0YSxmLmV2ZW50LmhhbmRsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O2YuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPXtzZXR1cDpmdW5jdGlvbihjKXtmLmV2ZW50LmFkZCh0aGlzLGIsYyYmYy5zZWxlY3Rvcj9HOkYsYSl9LHRlYXJkb3duOmZ1bmN0aW9uKGEpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYixhJiZhLnNlbGVjdG9yP0c6Ril9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oYSxiKXtpZighZi5ub2RlTmFtZSh0aGlzLCJmb3JtIikpZi5ldmVudC5hZGQodGhpcywiY2xpY2suc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1iLnR5cGU7KGM9PT0ic3VibWl0Inx8Yz09PSJpbWFnZSIpJiZmKGIpLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGgmJksoInN1Ym1pdCIsdGhpcyxhcmd1bWVudHMpfSksZi5ldmVudC5hZGQodGhpcywia2V5cHJlc3Muc3BlY2lhbFN1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1iLnR5cGU7KGM9PT0idGV4dCJ8fGM9PT0icGFzc3dvcmQiKSYmZihiKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoJiZhLmtleUNvZGU9PT0xMyYmSygic3VibWl0Iix0aGlzLGFyZ3VtZW50cyl9KTtlbHNlIHJldHVybiExfSx0ZWFyZG93bjpmdW5jdGlvbihhKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbFN1Ym1pdCIpfX0pO2lmKCFmLnN1cHBvcnQuY2hhbmdlQnViYmxlcyl7dmFyIEgsST1mdW5jdGlvbihhKXt2YXIgYj1hLnR5cGUsYz1hLnZhbHVlO2I9PT0icmFkaW8ifHxiPT09ImNoZWNrYm94Ij9jPWEuY2hlY2tlZDpiPT09InNlbGVjdC1tdWx0aXBsZSI/Yz1hLnNlbGVjdGVkSW5kZXg+LTE/Zi5tYXAoYS5vcHRpb25zLGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVjdGVkfSkuam9pbigiLSIpOiIiOmYubm9kZU5hbWUoYSwic2VsZWN0IikmJihjPWEuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIGN9LEo9ZnVuY3Rpb24oYyl7dmFyIGQ9Yy50YXJnZXQsZSxnO2lmKCEheS50ZXN0KGQubm9kZU5hbWUpJiYhZC5yZWFkT25seSl7ZT1mLl9kYXRhKGQsIl9jaGFuZ2VfZGF0YSIpLGc9SShkKSwoYy50eXBlIT09ImZvY3Vzb3V0Inx8ZC50eXBlIT09InJhZGlvIikmJmYuX2RhdGEoZCwiX2NoYW5nZV9kYXRhIixnKTtpZihlPT09Ynx8Zz09PWUpcmV0dXJuO2lmKGUhPW51bGx8fGcpYy50eXBlPSJjaGFuZ2UiLGMubGl2ZUZpcmVkPWIsZi5ldmVudC50cmlnZ2VyKGMsYXJndW1lbnRzWzFdLGQpfX07Zi5ldmVudC5zcGVjaWFsLmNoYW5nZT17ZmlsdGVyczp7Zm9jdXNvdXQ6SixiZWZvcmVkZWFjdGl2YXRlOkosY2xpY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1mLm5vZGVOYW1lKGIsImlucHV0Iik/Yi50eXBlOiIiOyhjPT09InJhZGlvInx8Yz09PSJjaGVja2JveCJ8fGYubm9kZU5hbWUoYiwic2VsZWN0IikpJiZKLmNhbGwodGhpcyxhKX0sa2V5ZG93bjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldCxjPWYubm9kZU5hbWUoYiwiaW5wdXQiKT9iLnR5cGU6IiI7KGEua2V5Q29kZT09PTEzJiYhZi5ub2RlTmFtZShiLCJ0ZXh0YXJlYSIpfHxhLmtleUNvZGU9PT0zMiYmKGM9PT0iY2hlY2tib3gifHxjPT09InJhZGlvIil8fGM9PT0ic2VsZWN0LW11bHRpcGxlIikmJkouY2FsbCh0aGlzLGEpfSxiZWZvcmVhY3RpdmF0ZTpmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtmLl9kYXRhKGIsIl9jaGFuZ2VfZGF0YSIsSShiKSl9fSxzZXR1cDpmdW5jdGlvbihhLGIpe2lmKHRoaXMudHlwZT09PSJmaWxlIilyZXR1cm4hMTtmb3IodmFyIGMgaW4gSClmLmV2ZW50LmFkZCh0aGlzLGMrIi5zcGVjaWFsQ2hhbmdlIixIW2NdKTtyZXR1cm4geS50ZXN0KHRoaXMubm9kZU5hbWUpfSx0ZWFyZG93bjpmdW5jdGlvbihhKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuc3BlY2lhbENoYW5nZSIpO3JldHVybiB5LnRlc3QodGhpcy5ub2RlTmFtZSl9fSxIPWYuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVycyxILmZvY3VzPUguYmVmb3JlYWN0aXZhdGV9Zi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZShhKXt2YXIgYz1mLmV2ZW50LmZpeChhKTtjLnR5cGU9YixjLm9yaWdpbmFsRXZlbnQ9e30sZi5ldmVudC50cmlnZ2VyKGMsbnVsbCxjLnRhcmdldCksYy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYS5wcmV2ZW50RGVmYXVsdCgpfXZhciBkPTA7Zi5ldmVudC5zcGVjaWFsW2JdPXtzZXR1cDpmdW5jdGlvbigpe2QrKz09PTAmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLGUsITApfSx0ZWFyZG93bjpmdW5jdGlvbigpey0tZD09PTAmJmMucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGUsITApfX19KSxmLmVhY2goWyJiaW5kIiwib25lIl0sZnVuY3Rpb24oYSxjKXtmLmZuW2NdPWZ1bmN0aW9uKGEsZCxlKXt2YXIgZztpZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgaCBpbiBhKXRoaXNbY10oaCxkLGFbaF0sZSk7cmV0dXJuIHRoaXN9aWYoYXJndW1lbnRzLmxlbmd0aD09PTJ8fGQ9PT0hMSllPWQsZD1iO2M9PT0ib25lIj8oZz1mdW5jdGlvbihhKXtmKHRoaXMpLnVuYmluZChhLGcpO3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZy5ndWlkPWUuZ3VpZHx8Zi5ndWlkKyspOmc9ZTtpZihhPT09InVubG9hZCImJmMhPT0ib25lIil0aGlzLm9uZShhLGQsZSk7ZWxzZSBmb3IodmFyIGk9MCxqPXRoaXMubGVuZ3RoO2k8ajtpKyspZi5ldmVudC5hZGQodGhpc1tpXSxhLGcsZCk7cmV0dXJuIHRoaXN9fSksZi5mbi5leHRlbmQoe3VuYmluZDpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ib2JqZWN0IiYmIWEucHJldmVudERlZmF1bHQpZm9yKHZhciBjIGluIGEpdGhpcy51bmJpbmQoYyxhW2NdKTtlbHNlIGZvcih2YXIgZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LnJlbW92ZSh0aGlzW2RdLGEsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmxpdmUoYixjLGQsYSl9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLnVuYmluZCgibGl2ZSIpOnRoaXMuZGllKGIsbnVsbCxjLGEpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzWzBdKXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXNbMF0sITApfSx0b2dnbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YXJndW1lbnRzLGM9YS5ndWlkfHxmLmd1aWQrKyxkPTAsZT1mdW5jdGlvbihjKXt2YXIgZT0oZi5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pO3ZhciBMPXtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQiLG1vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifTtmLmVhY2goWyJsaXZlIiwiZGllIl0sZnVuY3Rpb24oYSxjKXtmLmZuW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe3ZhciBoLGk9MCxqLGssbCxtPWd8fHRoaXMuc2VsZWN0b3Isbj1nP3RoaXM6Zih0aGlzLmNvbnRleHQpO2lmKHR5cGVvZiBhPT0ib2JqZWN0IiYmIWEucHJldmVudERlZmF1bHQpe2Zvcih2YXIgbyBpbiBhKW5bY10obyxkLGFbb10sbSk7cmV0dXJuIHRoaXN9aWYoYz09PSJkaWUiJiYhYSYmZyYmZy5jaGFyQXQoMCk9PT0iLiIpe24udW5iaW5kKGcpO3JldHVybiB0aGlzfWlmKGQ9PT0hMXx8Zi5pc0Z1bmN0aW9uKGQpKWU9ZHx8RCxkPWI7YT0oYXx8IiIpLnNwbGl0KCIgIik7d2hpbGUoKGg9YVtpKytdKSE9bnVsbCl7aj14LmV4ZWMoaCksaz0iIixqJiYoaz1qWzBdLGg9aC5yZXBsYWNlKHgsIiIpKTtpZihoPT09ImhvdmVyIil7YS5wdXNoKCJtb3VzZWVudGVyIitrLCJtb3VzZWxlYXZlIitrKTtjb250aW51ZX1sPWgsTFtoXT8oYS5wdXNoKExbaF0rayksaD1oK2spOmg9KExbaF18fGgpK2s7aWYoYz09PSJsaXZlIilmb3IodmFyIHA9MCxxPW4ubGVuZ3RoO3A8cTtwKyspZi5ldmVudC5hZGQobltwXSwibGl2ZS4iK04oaCxtKSx7ZGF0YTpkLHNlbGVjdG9yOm0saGFuZGxlcjplLG9yaWdUeXBlOmgsb3JpZ0hhbmRsZXI6ZSxwcmVUeXBlOmx9KTtlbHNlIG4udW5iaW5kKCJsaXZlLiIrTihoLG0pLGUpfXJldHVybiB0aGlzfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLmJpbmQoYixhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHUoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wLGg9ZC5sZW5ndGg7ZzxoO2crKyl7dmFyIGk9ZFtnXTtpZihpKXt2YXIgaj0hMTtpPWlbYV07d2hpbGUoaSl7aWYoaS5zaXpjYWNoZT09PWMpe2o9ZFtpLnNpenNldF07YnJlYWt9aWYoaS5ub2RlVHlwZT09PTEpe2Z8fChpLnNpemNhY2hlPWMsaS5zaXpzZXQ9Zyk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihpPT09Yil7aj0hMDticmVha319ZWxzZSBpZihrLmZpbHRlcihiLFtpXSkubGVuZ3RoPjApe2o9aTticmVha319aT1pW2FdfWRbZ109an19fWZ1bmN0aW9uIHQoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wLGg9ZC5sZW5ndGg7ZzxoO2crKyl7dmFyIGk9ZFtnXTtpZihpKXt2YXIgaj0hMTtpPWlbYV07d2hpbGUoaSl7aWYoaS5zaXpjYWNoZT09PWMpe2o9ZFtpLnNpenNldF07YnJlYWt9aS5ub2RlVHlwZT09PTEmJiFmJiYoaS5zaXpjYWNoZT1jLGkuc2l6c2V0PWcpO2lmKGkubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2o9aTticmVha31pPWlbYV19ZFtnXT1qfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPTAsZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGc9ITEsaD0hMCxpPS9cXC9nLGo9L1xXLztbMCwwXS5zb3J0KGZ1bmN0aW9uKCl7aD0hMTtyZXR1cm4gMH0pO3ZhciBrPWZ1bmN0aW9uKGIsZCxmLGcpe2Y9Znx8W10sZD1kfHxjO3ZhciBoPWQ7aWYoZC5ub2RlVHlwZSE9PTEmJmQubm9kZVR5cGUhPT05KXJldHVybltdO2lmKCFifHx0eXBlb2YgYiE9InN0cmluZyIpcmV0dXJuIGY7dmFyIGksaixuLG8scSxyLHMsdCx1PSEwLHc9ay5pc1hNTChkKSx4PVtdLHk9Yjtkb3thLmV4ZWMoIiIpLGk9YS5leGVjKHkpO2lmKGkpe3k9aVszXSx4LnB1c2goaVsxXSk7aWYoaVsyXSl7bz1pWzNdO2JyZWFrfX19d2hpbGUoaSk7aWYoeC5sZW5ndGg+MSYmbS5leGVjKGIpKWlmKHgubGVuZ3RoPT09MiYmbC5yZWxhdGl2ZVt4WzBdXSlqPXYoeFswXSt4WzFdLGQpO2Vsc2V7aj1sLnJlbGF0aXZlW3hbMF1dP1tkXTprKHguc2hpZnQoKSxkKTt3aGlsZSh4Lmxlbmd0aCliPXguc2hpZnQoKSxsLnJlbGF0aXZlW2JdJiYoYis9eC5zaGlmdCgpKSxqPXYoYixqKX1lbHNleyFnJiZ4Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXcmJmwubWF0Y2guSUQudGVzdCh4WzBdKSYmIWwubWF0Y2guSUQudGVzdCh4W3gubGVuZ3RoLTFdKSYmKHE9ay5maW5kKHguc2hpZnQoKSxkLHcpLGQ9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldClbMF06cS5zZXRbMF0pO2lmKGQpe3E9Zz97ZXhwcjp4LnBvcCgpLHNldDpwKGcpfTprLmZpbmQoeC5wb3AoKSx4Lmxlbmd0aD09PTEmJih4WzBdPT09In4ifHx4WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHcpLGo9cS5leHByP2suZmlsdGVyKHEuZXhwcixxLnNldCk6cS5zZXQseC5sZW5ndGg+MD9uPXAoaik6dT0hMTt3aGlsZSh4Lmxlbmd0aClyPXgucG9wKCkscz1yLGwucmVsYXRpdmVbcl0/cz14LnBvcCgpOnI9IiIscz09bnVsbCYmKHM9ZCksbC5yZWxhdGl2ZVtyXShuLHMsdyl9ZWxzZSBuPXg9W119bnx8KG49aiksbnx8ay5lcnJvcihyfHxiKTtpZihlLmNhbGwobik9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWYucHVzaC5hcHBseShmLG4pO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtuW3RdIT1udWxsO3QrKyluW3RdJiYoblt0XT09PSEwfHxuW3RdLm5vZGVUeXBlPT09MSYmay5jb250YWlucyhkLG5bdF0pKSYmZi5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtuW3RdIT1udWxsO3QrKyluW3RdJiZuW3RdLm5vZGVUeXBlPT09MSYmZi5wdXNoKGpbdF0pO2Vsc2UgcChuLGYpO28mJihrKG8saCxmLGcpLGsudW5pcXVlU29ydChmKSk7cmV0dXJuIGZ9O2sudW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZihyKXtnPWgsYS5zb3J0KHIpO2lmKGcpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxrLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhhLG51bGwsbnVsbCxiKX0say5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxrLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKCFhKXJldHVybltdO2Zvcih2YXIgZT0wLGY9bC5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7dmFyIGcsaD1sLm9yZGVyW2VdO2lmKGc9bC5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7dmFyIGo9Z1sxXTtnLnNwbGljZSgxLDEpO2lmKGouc3Vic3RyKGoubGVuZ3RoLTEpIT09IlxcIil7Z1sxXT0oZ1sxXXx8IiIpLnJlcGxhY2UoaSwiIiksZD1sLmZpbmRbaF0oZyxiLGMpO2lmKGQhPW51bGwpe2E9YS5yZXBsYWNlKGwubWF0Y2hbaF0sIiIpO2JyZWFrfX19fWR8fChkPXR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIj9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIik6W10pO3JldHVybntzZXQ6ZCxleHByOmF9fSxrLmZpbHRlcj1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZixnLGg9YSxpPVtdLGo9YyxtPWMmJmNbMF0mJmsuaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2Zvcih2YXIgbiBpbiBsLmZpbHRlcilpZigoZj1sLmxlZnRNYXRjaFtuXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7dmFyIG8scCxxPWwuZmlsdGVyW25dLHI9ZlsxXTtnPSExLGYuc3BsaWNlKDEsMSk7aWYoci5zdWJzdHIoci5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO2o9PT1pJiYoaT1bXSk7aWYobC5wcmVGaWx0ZXJbbl0pe2Y9bC5wcmVGaWx0ZXJbbl0oZixqLGQsaSxlLG0pO2lmKCFmKWc9bz0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcih2YXIgcz0wOyhwPWpbc10pIT1udWxsO3MrKylpZihwKXtvPXEocCxmLHMsaik7dmFyIHQ9ZV4hIW87ZCYmbyE9bnVsbD90P2c9ITA6altzXT0hMTp0JiYoaS5wdXNoKHApLGc9ITApfWlmKG8hPT1iKXtkfHwoaj1pKSxhPWEucmVwbGFjZShsLm1hdGNoW25dLCIiKTtpZighZylyZXR1cm5bXTticmVha319aWYoYT09PWgpaWYoZz09bnVsbClrLmVycm9yKGEpO2Vsc2UgYnJlYWs7aD1hfXJldHVybiBqfSxrLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYX07dmFyIGw9ay5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lEOi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxDTEFTUzovXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMqKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKD86KFsnIl0pKC4qPylcM3woIz8oPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikqKXwpfClccypcXS8sVEFHOi9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLENISUxEOi86KG9ubHl8bnRofGxhc3R8Zmlyc3QpLWNoaWxkKD86XChccyooZXZlbnxvZGR8KD86WytcLV0/XGQrfCg/OlsrXC1dP1xkKik/blxzKig/OlsrXC1dXHMqXGQrKT8pKVxzKlwpKT8vLFBPUzovOihudGh8ZXF8Z3R8bHR8Zmlyc3R8bGFzdHxldmVufG9kZCkoPzpcKChcZCopXCkpPyg/PVteXC1dfCQpLyxQU0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy99LGxlZnRNYXRjaDp7fSxhdHRyTWFwOnsiY2xhc3MiOiJjbGFzc05hbWUiLCJmb3IiOiJodG1sRm9yIn0sYXR0ckhhbmRsZTp7aHJlZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInR5cGUiKX19LHJlbGF0aXZlOnsiKyI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYj09InN0cmluZyIsZD1jJiYhai50ZXN0KGIpLGU9YyYmIWQ7ZCYmKGI9Yi50b0xvd2VyQ2FzZSgpKTtmb3IodmFyIGY9MCxnPWEubGVuZ3RoLGg7ZjxnO2YrKylpZihoPWFbZl0pe3doaWxlKChoPWgucHJldmlvdXNTaWJsaW5nKSYmaC5ub2RlVHlwZSE9PTEpO2FbZl09ZXx8aCYmaC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9ofHwhMTpoPT09Yn1lJiZrLmZpbHRlcihiLGEsITApfSwiPiI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPXR5cGVvZiBiPT0ic3RyaW5nIixlPTAsZj1hLmxlbmd0aDtpZihkJiYhai50ZXN0KGIpKXtiPWIudG9Mb3dlckNhc2UoKTtmb3IoO2U8ZjtlKyspe2M9YVtlXTtpZihjKXt2YXIgZz1jLnBhcmVudE5vZGU7YVtlXT1nLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2c6ITF9fX1lbHNle2Zvcig7ZTxmO2UrKyljPWFbZV0sYyYmKGFbZV09ZD9jLnBhcmVudE5vZGU6Yy5wYXJlbnROb2RlPT09Yik7ZCYmay5maWx0ZXIoYixhLCEwKX19LCIiOmZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmPWQrKyxnPXU7dHlwZW9mIGI9PSJzdHJpbmciJiYhai50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZT1iLGc9dCksZygicGFyZW50Tm9kZSIsYixmLGEsZSxjKX0sIn4iOmZ1bmN0aW9uKGEsYixjKXt2YXIgZSxmPWQrKyxnPXU7dHlwZW9mIGI9PSJzdHJpbmciJiYhai50ZXN0KGIpJiYoYj1iLnRvTG93ZXJDYXNlKCksZT1iLGc9dCksZygicHJldmlvdXNTaWJsaW5nIixiLGYsYSxlLGMpfX0sZmluZDp7SUQ6ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWMpe3ZhciBkPWIuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGQmJmQucGFyZW50Tm9kZT9bZF06W119fSxOQU1FOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeU5hbWUhPSJ1bmRlZmluZWQiKXt2YXIgYz1bXSxkPWIuZ2V0RWxlbWVudHNCeU5hbWUoYVsxXSk7Zm9yKHZhciBlPTAsZj1kLmxlbmd0aDtlPGY7ZSsrKWRbZV0uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1hWzFdJiZjLnB1c2goZFtlXSk7cmV0dXJuIGMubGVuZ3RoPT09MD9udWxsOmN9fSxUQUc6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCIpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSl9fSxwcmVGaWx0ZXI6e0NMQVNTOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXthPSIgIithWzFdLnJlcGxhY2UoaSwiIikrIiAiO2lmKGYpcmV0dXJuIGE7Zm9yKHZhciBnPTAsaDsoaD1iW2ddKSE9bnVsbDtnKyspaCYmKGVeKGguY2xhc3NOYW1lJiYoIiAiK2guY2xhc3NOYW1lKyIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywiICIpLmluZGV4T2YoYSk+PTApP2N8fGQucHVzaChoKTpjJiYoYltnXT0hMSkpO3JldHVybiExfSxJRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGksIiIpfSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVsxXS5yZXBsYWNlKGksIiIpLnRvTG93ZXJDYXNlKCl9LENISUxEOmZ1bmN0aW9uKGEpe2lmKGFbMV09PT0ibnRoIil7YVsyXXx8ay5lcnJvcihhWzBdKSxhWzJdPWFbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCIiKTt2YXIgYj0vKC0/KShcZCopKD86bihbK1wtXT9cZCopKT8vLmV4ZWMoYVsyXT09PSJldmVuIiYmIjJuInx8YVsyXT09PSJvZGQiJiYiMm4rMSJ8fCEvXEQvLnRlc3QoYVsyXSkmJiIwbisiK2FbMl18fGFbMl0pO2FbMl09YlsxXSsoYlsyXXx8MSktMCxhWzNdPWJbM10tMH1lbHNlIGFbMl0mJmsuZXJyb3IoYVswXSk7YVswXT1kKys7cmV0dXJuIGF9LEFUVFI6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciBnPWFbMV09YVsxXS5yZXBsYWNlKGksIiIpOyFmJiZsLmF0dHJNYXBbZ10mJihhWzFdPWwuYXR0ck1hcFtnXSksYVs0XT0oYVs0XXx8YVs1XXx8IiIpLnJlcGxhY2UoaSwiIiksYVsyXT09PSJ+PSImJihhWzRdPSIgIithWzRdKyIgIik7cmV0dXJuIGF9LFBTRVVETzpmdW5jdGlvbihiLGMsZCxlLGYpe2lmKGJbMV09PT0ibm90IilpZigoYS5leGVjKGJbM10pfHwiIikubGVuZ3RoPjF8fC9eXHcvLnRlc3QoYlszXSkpYlszXT1rKGJbM10sbnVsbCxudWxsLGMpO2Vsc2V7dmFyIGc9ay5maWx0ZXIoYlszXSxjLGQsITBeZik7ZHx8ZS5wdXNoLmFwcGx5KGUsZyk7cmV0dXJuITF9ZWxzZSBpZihsLm1hdGNoLlBPUy50ZXN0KGJbMF0pfHxsLm1hdGNoLkNISUxELnRlc3QoYlswXSkpcmV0dXJuITA7cmV0dXJuIGJ9LFBPUzpmdW5jdGlvbihhKXthLnVuc2hpZnQoITApO3JldHVybiBhfX0sZmlsdGVyczp7ZW5hYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSExJiZhLnR5cGUhPT0iaGlkZGVuIn0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5jaGVja2VkPT09ITB9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe2EucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7cmV0dXJuIGEuc2VsZWN0ZWQ9PT0hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiEhYS5maXJzdENoaWxkfSxlbXB0eTpmdW5jdGlvbihhKXtyZXR1cm4hYS5maXJzdENoaWxkfSxoYXM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiEhayhjWzNdLGEpLmxlbmd0aH0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybi9oXGQvaS50ZXN0KGEubm9kZU5hbWUpfSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIiksYz1hLnR5cGU7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJ0ZXh0Ij09PWMmJihiPT09Y3x8Yj09PW51bGwpfSxyYWRpbzpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInJhZGlvIj09PWEudHlwZX0sY2hlY2tib3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJjaGVja2JveCI9PT1hLnR5cGV9LGZpbGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJmaWxlIj09PWEudHlwZX0scGFzc3dvcmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJwYXNzd29yZCI9PT1hLnR5cGV9LHN1Ym1pdDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYic3VibWl0Ij09PWEudHlwZX0saW1hZ2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJpbWFnZSI9PT1hLnR5cGV9LHJlc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJyZXNldCI9PT1hLnR5cGV9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGI9PT0iaW5wdXQiJiYiYnV0dG9uIj09PWEudHlwZXx8Yj09PSJidXR0b24ifSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4vaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSl9LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09YS5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnR9fSxzZXRGaWx0ZXJzOntmaXJzdDpmdW5jdGlvbihhLGIpe3JldHVybiBiPT09MH0sbGFzdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYj09PWQubGVuZ3RoLTF9LGV2ZW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MH0sb2RkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTF9LGx0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYjxjWzNdLTB9LGd0OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYj5jWzNdLTB9LG50aDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9LGVxOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn19LGZpbHRlcjp7UFNFVURPOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMV0sZj1sLmZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKTtpZihlPT09ImNvbnRhaW5zIilyZXR1cm4oYS50ZXh0Q29udGVudHx8YS5pbm5lclRleHR8fGsuZ2V0VGV4dChbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfWsuZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGM9YlsxXSxkPWE7c3dpdGNoKGMpe2Nhc2Uib25seSI6Y2FzZSJmaXJzdCI6d2hpbGUoZD1kLnByZXZpb3VzU2libGluZylpZihkLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtpZihjPT09ImZpcnN0IilyZXR1cm4hMDtkPWE7Y2FzZSJsYXN0Ijp3aGlsZShkPWQubmV4dFNpYmxpbmcpaWYoZC5ub2RlVHlwZT09PTEpcmV0dXJuITE7cmV0dXJuITA7Y2FzZSJudGgiOnZhciBlPWJbMl0sZj1iWzNdO2lmKGU9PT0xJiZmPT09MClyZXR1cm4hMDt2YXIgZz1iWzBdLGg9YS5wYXJlbnROb2RlO2lmKGgmJihoLnNpemNhY2hlIT09Z3x8IWEubm9kZUluZGV4KSl7dmFyIGk9MDtmb3IoZD1oLmZpcnN0Q2hpbGQ7ZDtkPWQubmV4dFNpYmxpbmcpZC5ub2RlVHlwZT09PTEmJihkLm5vZGVJbmRleD0rK2kpO2guc2l6Y2FjaGU9Z312YXIgaj1hLm5vZGVJbmRleC1mO3JldHVybiBlPT09MD9qPT09MDpqJWU9PT0wJiZqL2U+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bC5hdHRySGFuZGxlW2NdP2wuYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6Zj09PSI9Ij9lPT09ZzpmPT09Iio9Ij9lLmluZGV4T2YoZyk+PTA6Zj09PSJ+PSI/KCIgIitlKyIgIikuaW5kZXhPZihnKT49MDpnP2Y9PT0iIT0iP2UhPT1nOmY9PT0iXj0iP2UuaW5kZXhPZihnKT09PTA6Zj09PSIkPSI/ZS5zdWJzdHIoZS5sZW5ndGgtZy5sZW5ndGgpPT09ZzpmPT09Inw9Ij9lPT09Z3x8ZS5zdWJzdHIoMCxnLmxlbmd0aCsxKT09PWcrIi0iOiExOmUmJmQhPT0hMX0sUE9TOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWJbMl0sZj1sLnNldEZpbHRlcnNbZV07aWYoZilyZXR1cm4gZihhLGMsYixkKX19fSxtPWwubWF0Y2guUE9TLG49ZnVuY3Rpb24oYSxiKXtyZXR1cm4iXFwiKyhiLTArMSl9O2Zvcih2YXIgbyBpbiBsLm1hdGNoKWwubWF0Y2hbb109bmV3IFJlZ0V4cChsLm1hdGNoW29dLnNvdXJjZSsvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UpLGwubGVmdE1hdGNoW29dPW5ldyBSZWdFeHAoLyheKD86LnxccnxcbikqPykvLnNvdXJjZStsLm1hdGNoW29dLnNvdXJjZS5yZXBsYWNlKC9cXChcZCspL2csbikpO3ZhciBwPWZ1bmN0aW9uKGEsYil7YT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhLDApO2lmKGIpe2IucHVzaC5hcHBseShiLGEpO3JldHVybiBifXJldHVybiBhfTt0cnl7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcywwKVswXS5ub2RlVHlwZX1jYXRjaChxKXtwPWZ1bmN0aW9uKGEsYil7dmFyIGM9MCxkPWJ8fFtdO2lmKGUuY2FsbChhKT09PSJbb2JqZWN0IEFycmF5XSIpQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZCxhKTtlbHNlIGlmKHR5cGVvZiBhLmxlbmd0aD09Im51bWJlciIpZm9yKHZhciBmPWEubGVuZ3RoO2M8ZjtjKyspZC5wdXNoKGFbY10pO2Vsc2UgZm9yKDthW2NdO2MrKylkLnB1c2goYVtjXSk7cmV0dXJuIGR9fXZhciByLHM7Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/cj1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtnPSEwO3JldHVybiAwfWlmKCFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9ufHwhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbilyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxO3JldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjQ/LTE6MX06KHI9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7Zz0hMDtyZXR1cm4gMH1pZihhLnNvdXJjZUluZGV4JiZiLnNvdXJjZUluZGV4KXJldHVybiBhLnNvdXJjZUluZGV4LWIuc291cmNlSW5kZXg7dmFyIGMsZCxlPVtdLGY9W10saD1hLnBhcmVudE5vZGUsaT1iLnBhcmVudE5vZGUsaj1oO2lmKGg9PT1pKXJldHVybiBzKGEsYik7aWYoIWgpcmV0dXJuLTE7aWYoIWkpcmV0dXJuIDE7d2hpbGUoaillLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7aj1pO3doaWxlKGopZi51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2M9ZS5sZW5ndGgsZD1mLmxlbmd0aDtmb3IodmFyIGs9MDtrPGMmJms8ZDtrKyspaWYoZVtrXSE9PWZba10pcmV0dXJuIHMoZVtrXSxmW2tdKTtyZXR1cm4gaz09PWM/cyhhLGZba10sLTEpOnMoZVtrXSxiLDEpfSxzPWZ1bmN0aW9uKGEsYixjKXtpZihhPT09YilyZXR1cm4gYzt2YXIgZD1hLm5leHRTaWJsaW5nO3doaWxlKGQpe2lmKGQ9PT1iKXJldHVybi0xO2Q9ZC5uZXh0U2libGluZ31yZXR1cm4gMX0pLGsuZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYj0iIixjO2Zvcih2YXIgZD0wO2FbZF07ZCsrKWM9YVtkXSxjLm5vZGVUeXBlPT09M3x8Yy5ub2RlVHlwZT09PTQ/Yis9Yy5ub2RlVmFsdWU6Yy5ub2RlVHlwZSE9PTgmJihiKz1rLmdldFRleHQoYy5jaGlsZE5vZGVzKSk7cmV0dXJuIGJ9LGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpLGU9Yy5kb2N1bWVudEVsZW1lbnQ7YS5pbm5lckhUTUw9IjxhIG5hbWU9JyIrZCsiJy8+IixlLmluc2VydEJlZm9yZShhLGUuZmlyc3RDaGlsZCksYy5nZXRFbGVtZW50QnlJZChkKSYmKGwuZmluZC5JRD1mdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGMuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhZCl7dmFyIGU9Yy5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZT9lLmlkPT09YVsxXXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKS5ub2RlVmFsdWU9PT1hWzFdP1tlXTpiOltdfX0sbC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBhLm5vZGVUeXBlPT09MSYmYyYmYy5ub2RlVmFsdWU9PT1ifSksZS5yZW1vdmVDaGlsZChhKSxlPWE9bnVsbH0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5hcHBlbmRDaGlsZChjLmNyZWF0ZUNvbW1lbnQoIiIpKSxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoPjAmJihsLmZpbmQuVEFHPWZ1bmN0aW9uKGEsYil7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKTtpZihhWzFdPT09IioiKXt2YXIgZD1bXTtmb3IodmFyIGU9MDtjW2VdO2UrKyljW2VdLm5vZGVUeXBlPT09MSYmZC5wdXNoKGNbZV0pO2M9ZH1yZXR1cm4gY30pLGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IixhLmZpcnN0Q2hpbGQmJnR5cGVvZiBhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlIT0idW5kZWZpbmVkIiYmYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIT09IiMiJiYobC5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIiwyKX0pLGE9bnVsbH0oKSxjLnF1ZXJ5U2VsZWN0b3JBbGwmJmZ1bmN0aW9uKCl7dmFyIGE9ayxiPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0iX19zaXp6bGVfXyI7Yi5pbm5lckhUTUw9IjxwIGNsYXNzPSdURVNUJz48L3A+IjtpZighYi5xdWVyeVNlbGVjdG9yQWxsfHxiLnF1ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoIT09MCl7az1mdW5jdGlvbihiLGUsZixnKXtlPWV8fGM7aWYoIWcmJiFrLmlzWE1MKGUpKXt2YXIgaD0vXihcdyskKXxeXC4oW1x3XC1dKyQpfF4jKFtcd1wtXSskKS8uZXhlYyhiKTtpZihoJiYoZS5ub2RlVHlwZT09PTF8fGUubm9kZVR5cGU9PT05KSl7aWYoaFsxXSlyZXR1cm4gcChlLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLGYpO2lmKGhbMl0mJmwuZmluZC5DTEFTUyYmZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBwKGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShoWzJdKSxmKX1pZihlLm5vZGVUeXBlPT09OSl7aWYoYj09PSJib2R5IiYmZS5ib2R5KXJldHVybiBwKFtlLmJvZHldLGYpO2lmKGgmJmhbM10pe3ZhciBpPWUuZ2V0RWxlbWVudEJ5SWQoaFszXSk7aWYoIWl8fCFpLnBhcmVudE5vZGUpcmV0dXJuIHAoW10sZik7aWYoaS5pZD09PWhbM10pcmV0dXJuIHAoW2ldLGYpfXRyeXtyZXR1cm4gcChlLnF1ZXJ5U2VsZWN0b3JBbGwoYiksZil9Y2F0Y2goail7fX1lbHNlIGlmKGUubm9kZVR5cGU9PT0xJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT0ib2JqZWN0Iil7dmFyIG09ZSxuPWUuZ2V0QXR0cmlidXRlKCJpZCIpLG89bnx8ZCxxPWUucGFyZW50Tm9kZSxyPS9eXHMqWyt+XS8udGVzdChiKTtuP289by5yZXBsYWNlKC8nL2csIlxcJCYiKTplLnNldEF0dHJpYnV0ZSgiaWQiLG8pLHImJnEmJihlPWUucGFyZW50Tm9kZSk7dHJ5e2lmKCFyfHxxKXJldHVybiBwKGUucXVlcnlTZWxlY3RvckFsbCgiW2lkPSciK28rIiddICIrYiksZil9Y2F0Y2gocyl7fWZpbmFsbHl7bnx8bS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gYShiLGUsZixnKX07Zm9yKHZhciBlIGluIGEpa1tlXT1hW2VdO2I9bnVsbH19KCksZnVuY3Rpb24oKXt2YXIgYT1jLmRvY3VtZW50RWxlbWVudCxiPWEubWF0Y2hlc1NlbGVjdG9yfHxhLm1vek1hdGNoZXNTZWxlY3Rvcnx8YS53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGEubXNNYXRjaGVzU2VsZWN0b3I7aWYoYil7dmFyIGQ9IWIuY2FsbChjLmNyZWF0ZUVsZW1lbnQoImRpdiIpLCJkaXYiKSxlPSExO3RyeXtiLmNhbGwoYy5kb2N1bWVudEVsZW1lbnQsIlt0ZXN0IT0nJ106c2l6emxlIil9Y2F0Y2goZil7ZT0hMH1rLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGMpe2M9Yy5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCI9JyQxJ10iKTtpZighay5pc1hNTChhKSl0cnl7aWYoZXx8IWwubWF0Y2guUFNFVURPLnRlc3QoYykmJiEvIT0vLnRlc3QoYykpe3ZhciBmPWIuY2FsbChhLGMpO2lmKGZ8fCFkfHxhLmRvY3VtZW50JiZhLmRvY3VtZW50Lm5vZGVUeXBlIT09MTEpcmV0dXJuIGZ9fWNhdGNoKGcpe31yZXR1cm4gayhjLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfX19KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaW5uZXJIVE1MPSI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7aWYoISFhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCE9PTApe2EubGFzdENoaWxkLmNsYXNzTmFtZT0iZSI7aWYoYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoPT09MSlyZXR1cm47bC5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIpLGwuZmluZC5DTEFTUz1mdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9InVuZGVmaW5lZCImJiFjKXJldHVybiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoYVsxXSl9LGE9bnVsbH19KCksYy5kb2N1bWVudEVsZW1lbnQuY29udGFpbnM/ay5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiBhIT09YiYmKGEuY29udGFpbnM/YS5jb250YWlucyhiKTohMCl9OmMuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2suY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4hIShhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpJjE2KX06ay5jb250YWlucz1mdW5jdGlvbigpe3JldHVybiExfSxrLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPShhP2Eub3duZXJEb2N1bWVudHx8YTowKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/Yi5ub2RlTmFtZSE9PSJIVE1MIjohMX07dmFyIHY9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9IiIsZj1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGM9bC5tYXRjaC5QU0VVRE8uZXhlYyhhKSllKz1jWzBdLGE9YS5yZXBsYWNlKGwubWF0Y2guUFNFVURPLCIiKTthPWwucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGc9MCxoPWYubGVuZ3RoO2c8aDtnKyspayhhLGZbZ10sZCk7cmV0dXJuIGsuZmlsdGVyKGUsZCl9O2YuZmluZD1rLGYuZXhwcj1rLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1rLnVuaXF1ZVNvcnQsZi50ZXh0PWsuZ2V0VGV4dCxmLmlzWE1MRG9jPWsuaXNYTUwsZi5jb250YWlucz1rLmNvbnRhaW5zfSgpO3ZhciBPPS9VbnRpbCQvLFA9L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sUT0vLC8sUj0vXi5bXjojXFtcLixdKiQvLFM9QXJyYXkucHJvdG90eXBlLnNsaWNlLFQ9Zi5leHByLm1hdGNoLlBPUyxVPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhXKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVyh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/Zi5maWx0ZXIoYSx0aGlzKS5sZW5ndGg+MDp0aGlzLmZpbHRlcihhKS5sZW5ndGg+MCl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXSxkLGUsZz10aGlzWzBdO2lmKGYuaXNBcnJheShhKSl7dmFyIGgsaSxqPXt9LGs9MTtpZihnJiZhLmxlbmd0aCl7Zm9yKGQ9MCxlPWEubGVuZ3RoO2Q8ZTtkKyspaT1hW2RdLGpbaV18fChqW2ldPVQudGVzdChpKT9mKGksYnx8dGhpcy5jb250ZXh0KTppKTt3aGlsZShnJiZnLm93bmVyRG9jdW1lbnQmJmchPT1iKXtmb3IoaSBpbiBqKWg9altpXSwoaC5qcXVlcnk/aC5pbmRleChnKT4tMTpmKGcpLmlzKGgpKSYmYy5wdXNoKHtzZWxlY3RvcjppLGVsZW06ZyxsZXZlbDprfSk7Zz1nLnBhcmVudE5vZGUsaysrfX1yZXR1cm4gY312YXIgbD1ULnRlc3QoYSl8fHR5cGVvZiBhIT0ic3RyaW5nIj9mKGEsYnx8dGhpcy5jb250ZXh0KTowO2ZvcihkPTAsZT10aGlzLmxlbmd0aDtkPGU7ZCsrKXtnPXRoaXNbZF07d2hpbGUoZyl7aWYobD9sLmluZGV4KGcpPi0xOmYuZmluZC5tYXRjaGVzU2VsZWN0b3IoZyxhKSl7Yy5wdXNoKGcpO2JyZWFrfWc9Zy5wYXJlbnROb2RlO2lmKCFnfHwhZy5vd25lckRvY3VtZW50fHxnPT09Ynx8Zy5ub2RlVHlwZT09PTExKWJyZWFrfX1jPWMubGVuZ3RoPjE/Zi51bmlxdWUoYyk6YztyZXR1cm4gdGhpcy5wdXNoU3RhY2soYywiY2xvc2VzdCIsYSl9LGluZGV4OmZ1bmN0aW9uKGEpe2lmKCFhfHx0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGE/ZihhKTp0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhWKGNbMF0pfHxWKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpLGc9Uy5jYWxsKGFyZ3VtZW50cyk7Ty50ZXN0KGEpfHwoZD1jKSxkJiZ0eXBlb2YgZD09InN0cmluZyImJihlPWYuZmlsdGVyKGQsZSkpLGU9dGhpcy5sZW5ndGg+MSYmIVVbYV0/Zi51bmlxdWUoZSk6ZSwodGhpcy5sZW5ndGg+MXx8US50ZXN0KGQpKSYmUC50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGUsYSxnLmpvaW4oIiwiKSl9fSksZi5leHRlbmQoe2ZpbHRlcjpmdW5jdGlvbihhLGIsYyl7YyYmKGE9Ijpub3QoIithKyIpIik7cmV0dXJuIGIubGVuZ3RoPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGJbMF0sYSk/W2JbMF1dOltdOmYuZmluZC5tYXRjaGVzKGEsYil9LGRpcjpmdW5jdGlvbihhLGMsZCl7dmFyIGU9W10sZz1hW2NdO3doaWxlKGcmJmcubm9kZVR5cGUhPT05JiYoZD09PWJ8fGcubm9kZVR5cGUhPT0xfHwhZihnKS5pcyhkKSkpZy5ub2RlVHlwZT09PTEmJmUucHVzaChnKSxnPWdbY107cmV0dXJuIGV9LG50aDpmdW5jdGlvbihhLGIsYyxkKXtiPWJ8fDE7dmFyIGU9MDtmb3IoO2E7YT1hW2NdKWlmKGEubm9kZVR5cGU9PT0xJiYrK2U9PT1iKWJyZWFrO3JldHVybiBhfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7dmFyIGM9W107Zm9yKDthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWImJmMucHVzaChhKTtyZXR1cm4gY319KTt2YXIgWD0vIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLFk9L15ccysvLFo9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywkPS88KFtcdzpdKykvLF89Lzx0Ym9keS9pLGJhPS88fCYjP1x3KzsvLGJiPS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYmM9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmQ9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZT0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZj17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtiZi5vcHRncm91cD1iZi5vcHRpb24sYmYudGJvZHk9YmYudGZvb3Q9YmYuY29sZ3JvdXA9YmYuY2FwdGlvbj1iZi50aGVhZCxiZi50aD1iZi50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJmLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MudGV4dChhLmNhbGwodGhpcyxiLGMudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9Im9iamVjdCImJmEhPT1iKXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gZi50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zihhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYoYXJndW1lbnRzWzBdKS50b0FycmF5KCkpO3JldHVybiBhfX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZDsoZD10aGlzW2NdKSE9bnVsbDtjKyspaWYoIWF8fGYuZmlsdGVyKGEsW2RdKS5sZW5ndGgpIWImJmQubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSxmLmNsZWFuRGF0YShbZF0pKSxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFgsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmIudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVkudGVzdChhKSkmJiFiZlsoJC5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWiwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiYy50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iZyh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJtKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpO2ImJmJbMF0mJihpPWJbMF0ub3duZXJEb2N1bWVudHx8YlswXSksaS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwoaT1jKSxhLmxlbmd0aD09PTEmJnR5cGVvZiBhWzBdPT0ic3RyaW5nIiYmYVswXS5sZW5ndGg8NTEyJiZpPT09YyYmYVswXS5jaGFyQXQoMCk9PT0iPCImJiFiYi50ZXN0KGFbMF0pJiYoZi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFiYy50ZXN0KGFbMF0pKSYmKGc9ITAsaD1mLmZyYWdtZW50c1thWzBdXSxoJiZoIT09MSYmKGU9aCkpLGV8fChlPWkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGYuY2xlYW4oYSxpLGUsZCkpLGcmJihmLmZyYWdtZW50c1thWzBdXT1oP2U6MSk7cmV0dXJue2ZyYWdtZW50OmUsY2FjaGVhYmxlOmd9fSxmLmZyYWdtZW50cz17fSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYyl7dmFyIGQ9W10sZT1mKGMpLGc9dGhpcy5sZW5ndGg9PT0xJiZ0aGlzWzBdLnBhcmVudE5vZGU7aWYoZyYmZy5ub2RlVHlwZT09PTExJiZnLmNoaWxkTm9kZXMubGVuZ3RoPT09MSYmZS5sZW5ndGg9PT0xKXtlW2JdKHRoaXNbMF0pO3JldHVybiB0aGlzfWZvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9KGg+MD90aGlzLmNsb25lKCEwKTp0aGlzKS5nZXQoKTtmKGVbaF0pW2JdKGopLGQ9ZC5jb25jYXQoagotKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5jbG9uZU5vZGUoITApLGUsZyxoO2lmKCghZi5zdXBwb3J0Lm5vQ2xvbmVFdmVudHx8IWYuc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCkmJihhLm5vZGVUeXBlPT09MXx8YS5ub2RlVHlwZT09PTExKSYmIWYuaXNYTUxEb2MoYSkpe2JpKGEsZCksZT1iaihhKSxnPWJqKGQpO2ZvcihoPTA7ZVtoXTsrK2gpYmkoZVtoXSxnW2hdKX1pZihiKXtiaChhLGQpO2lmKGMpe2U9YmooYSksZz1iaihkKTtmb3IoaD0wO2VbaF07KytoKWJoKGVbaF0sZ1toXSl9fWU9Zz1udWxsO3JldHVybiBkfSxjbGVhbjpmdW5jdGlvbihhLGIsZCxlKXt2YXIgZztiPWJ8fGMsdHlwZW9mIGIuY3JlYXRlRWxlbWVudD09InVuZGVmaW5lZCImJihiPWIub3duZXJEb2N1bWVudHx8YlswXSYmYlswXS5vd25lckRvY3VtZW50fHxjKTt2YXIgaD1bXSxpO2Zvcih2YXIgaj0wLGs7KGs9YVtqXSkhPW51bGw7aisrKXt0eXBlb2Ygaz09Im51bWJlciImJihrKz0iIik7aWYoIWspY29udGludWU7aWYodHlwZW9mIGs9PSJzdHJpbmciKWlmKCFiYS50ZXN0KGspKWs9Yi5jcmVhdGVUZXh0Tm9kZShrKTtlbHNle2s9ay5yZXBsYWNlKFosIjwkMT48LyQyPiIpO3ZhciBsPSgkLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbT1iZltsXXx8YmYuX2RlZmF1bHQsbj1tWzBdLG89Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD1fLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWS50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFkuZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJsKGtbaV0pO2Vsc2UgYmwoayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZC50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5leHBhbmRvLGc9Zi5ldmVudC5zcGVjaWFsLGg9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBpPTAsajsoaj1hW2ldKSE9bnVsbDtpKyspe2lmKGoubm9kZU5hbWUmJmYubm9EYXRhW2oubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1qW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdJiZkW2NdW2VdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGsgaW4gYi5ldmVudHMpZ1trXT9mLmV2ZW50LnJlbW92ZShqLGspOmYucmVtb3ZlRXZlbnQoaixrLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9aD9kZWxldGUgaltmLmV4cGFuZG9dOmoucmVtb3ZlQXR0cmlidXRlJiZqLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJuPS9hbHBoYVwoW14pXSpcKS9pLGJvPS9vcGFjaXR5PShbXildKikvLGJwPS8oW0EtWl18Xm1zKS9nLGJxPS9eLT9cZCsoPzpweCk/JC9pLGJyPS9eLT9cZC8sYnM9L15bK1wtXT0vLGJ0PS9bXitcLVwuXGRlXSsvZyxidT17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sYnY9WyJMZWZ0IiwiUmlnaHQiXSxidz1bIlRvcCIsIkJvdHRvbSJdLGJ4LGJ5LGJ6O2YuZm4uY3NzPWZ1bmN0aW9uKGEsYyl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTImJmM9PT1iKXJldHVybiB0aGlzO3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYywhMCxmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGQhPT1iP2Yuc3R5bGUoYSxjLGQpOmYuY3NzKGEsYyl9KX0sZi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxiKXtpZihiKXt2YXIgYz1ieChhLCJvcGFjaXR5Iiwib3BhY2l0eSIpO3JldHVybiBjPT09IiI/IjEiOmN9cmV0dXJuIGEuc3R5bGUub3BhY2l0eX19fSxjc3NOdW1iZXI6e2ZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjpmLnN1cHBvcnQuY3NzRmxvYXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCJ9LHN0eWxlOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhYSYmYS5ub2RlVHlwZSE9PTMmJmEubm9kZVR5cGUhPT04JiYhIWEuc3R5bGUpe3ZhciBnLGgsaT1mLmNhbWVsQ2FzZShjKSxqPWEuc3R5bGUsaz1mLmNzc0hvb2tzW2ldO2M9Zi5jc3NQcm9wc1tpXXx8aTtpZihkPT09Yil7aWYoayYmImdldCJpbiBrJiYoZz1rLmdldChhLCExLGUpKSE9PWIpcmV0dXJuIGc7cmV0dXJuIGpbY119aD10eXBlb2YgZDtpZihoPT09Im51bWJlciImJmlzTmFOKGQpfHxkPT1udWxsKXJldHVybjtoPT09InN0cmluZyImJmJzLnRlc3QoZCkmJihkPStkLnJlcGxhY2UoYnQsIiIpK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIiksaD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYngpcmV0dXJuIGJ4KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQShhLGIsZCk7Zi5zd2FwKGEsYnUsZnVuY3Rpb24oKXtlPWJBKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJxLnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBiby50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlO2Muem9vbT0xO3ZhciBlPWYuaXNOYU4oYik/IiI6ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2MuZmlsdGVyPWJuLnRlc3QoZyk/Zy5yZXBsYWNlKGJuLGUpOmcrIiAiK2V9fSksZihmdW5jdGlvbigpe2Yuc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0fHwoZi5jc3NIb29rcy5tYXJnaW5SaWdodD17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM7Zi5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LGZ1bmN0aW9uKCl7Yj9jPWJ4KGEsIm1hcmdpbi1yaWdodCIsIm1hcmdpblJpZ2h0Iik6Yz1hLnN0eWxlLm1hcmdpblJpZ2h0fSk7cmV0dXJuIGN9fSl9KSxjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihieT1mdW5jdGlvbihhLGMpe3ZhciBkLGUsZztjPWMucmVwbGFjZShicCwiLSQxIikudG9Mb3dlckNhc2UoKTtpZighKGU9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSlyZXR1cm4gYjtpZihnPWUuZ2V0Q29tcHV0ZWRTdHlsZShhLG51bGwpKWQ9Zy5nZXRQcm9wZXJ0eVZhbHVlKGMpLGQ9PT0iIiYmIWYuY29udGFpbnMoYS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGQ9Zi5zdHlsZShhLGMpKTtyZXR1cm4gZH0pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJ6PWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1hLmN1cnJlbnRTdHlsZSYmYS5jdXJyZW50U3R5bGVbYl0sZT1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGVbYl0sZj1hLnN0eWxlOyFicS50ZXN0KGQpJiZici50ZXN0KGQpJiYoYz1mLmxlZnQsZSYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZi5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmR8fDAsZD1mLnBpeGVsTGVmdCsicHgiLGYubGVmdD1jLGUmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWUpKTtyZXR1cm4gZD09PSIiPyJhdXRvIjpkfSksYng9Ynl8fGJ6LGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkI9LyUyMC9nLGJDPS9cW1xdJC8sYkQ9L1xyP1xuL2csYkU9LyMuKiQvLGJGPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYkc9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJIPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8d2lkZ2V0KTokLyxiST0vXig/OkdFVHxIRUFEKSQvLGJKPS9eXC9cLy8sYks9L1w/LyxiTD0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTT0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiTj0vXHMrLyxiTz0vKFs/Jl0pXz1bXiZdKi8sYlA9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJRPWYuZm4ubG9hZCxiUj17fSxiUz17fSxiVCxiVTt0cnl7YlQ9ZS5ocmVmfWNhdGNoKGJWKXtiVD1jLmNyZWF0ZUVsZW1lbnQoImEiKSxiVC5ocmVmPSIiLGJUPWJULmhyZWZ9YlU9YlAuZXhlYyhiVC50b0xvd2VyQ2FzZSgpKXx8W10sZi5mbi5leHRlbmQoe2xvYWQ6ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBhIT0ic3RyaW5nIiYmYlEpcmV0dXJuIGJRLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7dmFyIGU9YS5pbmRleE9mKCIgIik7aWYoZT49MCl7dmFyIGc9YS5zbGljZShlLGEubGVuZ3RoKTthPWEuc2xpY2UoMCxlKX12YXIgaD0iR0VUIjtjJiYoZi5pc0Z1bmN0aW9uKGMpPyhkPWMsYz1iKTp0eXBlb2YgYz09Im9iamVjdCImJihjPWYucGFyYW0oYyxmLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksaD0iUE9TVCIpKTt2YXIgaT10aGlzO2YuYWpheCh7dXJsOmEsdHlwZTpoLGRhdGFUeXBlOiJodG1sIixkYXRhOmMsY29tcGxldGU6ZnVuY3Rpb24oYSxiLGMpe2M9YS5yZXNwb25zZVRleHQsYS5pc1Jlc29sdmVkKCkmJihhLmRvbmUoZnVuY3Rpb24oYSl7Yz1hfSksaS5odG1sKGc/ZigiPGRpdj4iKS5hcHBlbmQoYy5yZXBsYWNlKGJMLCIiKSkuZmluZChnKTpjKSksZCYmaS5lYWNoKGQsW2MsYixhXSl9fSk7cmV0dXJuIHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBmLnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSl9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHM/Zi5tYWtlQXJyYXkodGhpcy5lbGVtZW50cyk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHxiTS50ZXN0KHRoaXMubm9kZU5hbWUpfHxiRy50ZXN0KHRoaXMudHlwZSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9Zih0aGlzKS52YWwoKTtyZXR1cm4gYz09bnVsbD9udWxsOmYuaXNBcnJheShjKT9mLm1hcChjLGZ1bmN0aW9uKGEsYyl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShiRCwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoYkQsIlxyXG4iKX19KS5nZXQoKX19KSxmLmVhY2goImFqYXhTdGFydCBhamF4U3RvcCBhamF4Q29tcGxldGUgYWpheEVycm9yIGFqYXhTdWNjZXNzIGFqYXhTZW5kIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7Zi5mbltiXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iaW5kKGIsYSl9fSksZi5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGEsYyl7ZltjXT1mdW5jdGlvbihhLGQsZSxnKXtmLmlzRnVuY3Rpb24oZCkmJihnPWd8fGUsZT1kLGQ9Yik7cmV0dXJuIGYuYWpheCh7dHlwZTpjLHVybDphLGRhdGE6ZCxzdWNjZXNzOmUsZGF0YVR5cGU6Z30pfX0pLGYuZXh0ZW5kKHtnZXRTY3JpcHQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gZi5nZXQoYSxiLGMsInNjcmlwdCIpfSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5nZXQoYSxiLGMsImpzb24iKX0sYWpheFNldHVwOmZ1bmN0aW9uKGEsYil7Yj9mLmV4dGVuZCghMCxhLGYuYWpheFNldHRpbmdzLGIpOihiPWEsYT1mLmV4dGVuZCghMCxmLmFqYXhTZXR0aW5ncyxiKSk7Zm9yKHZhciBjIGlue2NvbnRleHQ6MSx1cmw6MX0pYyBpbiBiP2FbY109YltjXTpjIGluIGYuYWpheFNldHRpbmdzJiYoYVtjXT1mLmFqYXhTZXR0aW5nc1tjXSk7cmV0dXJuIGF9LGFqYXhTZXR0aW5nczp7dXJsOmJULGlzTG9jYWw6YkgudGVzdChiVVsxXSksZ2xvYmFsOiEwLHR5cGU6IkdFVCIsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsYWNjZXB0czp7eG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHRleHQ6InRleHQvcGxhaW4iLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsIioiOiIqLyoifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0In0sY29udmVydGVyczp7IiogdGV4dCI6YS5TdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6Zi5wYXJzZUpTT04sInRleHQgeG1sIjpmLnBhcnNlWE1MfX0sYWpheFByZWZpbHRlcjpiVyhiUiksYWpheFRyYW5zcG9ydDpiVyhiUyksYWpheDpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIHcoYSxjLGwsbSl7aWYocyE9PTIpe3M9MixxJiZjbGVhclRpbWVvdXQocSkscD1iLG49bXx8IiIsdi5yZWFkeVN0YXRlPWE/NDowO3ZhciBvLHIsdSx3PWw/YlooZCx2LGwpOmIseCx5O2lmKGE+PTIwMCYmYTwzMDB8fGE9PT0zMDQpe2lmKGQuaWZNb2RpZmllZCl7aWYoeD12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpZi5sYXN0TW9kaWZpZWRba109eDtpZih5PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkV0YWciKSlmLmV0YWdba109eX1pZihhPT09MzA0KWM9Im5vdG1vZGlmaWVkIixvPSEwO2Vsc2UgdHJ5e3I9YiQoZCx3KSxjPSJzdWNjZXNzIixvPSEwfWNhdGNoKHope2M9InBhcnNlcmVycm9yIix1PXp9fWVsc2V7dT1jO2lmKCFjfHxhKWM9ImVycm9yIixhPDAmJihhPTApfXYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PWMsbz9oLnJlc29sdmVXaXRoKGUsW3IsYyx2XSk6aC5yZWplY3RXaXRoKGUsW3YsYyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5yZXNvbHZlV2l0aChlLFt2LGNdKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5fRGVmZXJyZWQoKSxqPWQuc3RhdHVzQ29kZXx8e30sayxsPXt9LG09e30sbixvLHAscSxyLHM9MCx0LHUsdj17cmVhZHlTdGF0ZTowLHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oYSxiKXtpZighcyl7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO2E9bVtjXT1tW2NdfHxhLGxbYV09Yn1yZXR1cm4gdGhpc30sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHM9PT0yP246bnVsbH0sZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oYSl7dmFyIGM7aWYocz09PTIpe2lmKCFvKXtvPXt9O3doaWxlKGM9YkYuZXhlYyhuKSlvW2NbMV0udG9Mb3dlckNhc2UoKV09Y1syXX1jPW9bYS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gYz09PWI/bnVsbDpjfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3N8fChkLm1pbWVUeXBlPWEpO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihhKXthPWF8fCJhYm9ydCIscCYmcC5hYm9ydChhKSx3KDAsYSk7cmV0dXJuIHRoaXN9fTtoLnByb21pc2Uodiksdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCx2LmNvbXBsZXRlPWkuZG9uZSx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJFLCIiKS5yZXBsYWNlKGJKLGJVWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYk4pLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJQLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iVVsxXSYmclsyXT09YlVbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiVVszXXx8KGJVWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGJYKGJSLGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJJLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJLLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSksaz1kLnVybDtpZihkLmNhY2hlPT09ITEpe3ZhciB4PWYubm93KCkseT1kLnVybC5yZXBsYWNlKGJPLCIkMV89Iit4KTtkLnVybD15Kyh5PT09ZC51cmw/KGJLLnRlc3QoZC51cmwpPyImIjoiPyIpKyJfPSIreDoiIil9fShkLmRhdGEmJmQuaGFzQ29udGVudCYmZC5jb250ZW50VHlwZSE9PSExfHxjLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGQuY29udGVudFR5cGUpLGQuaWZNb2RpZmllZCYmKGs9a3x8ZC51cmwsZi5sYXN0TW9kaWZpZWRba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGYubGFzdE1vZGlmaWVkW2tdKSxmLmV0YWdba10mJnYuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW2tdKSksdi5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGQuZGF0YVR5cGVzWzBdJiZkLmFjY2VwdHNbZC5kYXRhVHlwZXNbMF1dP2QuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0rKGQuZGF0YVR5cGVzWzBdIT09IioiPyIsICovKjsgcT0wLjAxIjoiIik6ZC5hY2NlcHRzWyIqIl0pO2Zvcih1IGluIGQuaGVhZGVycyl2LnNldFJlcXVlc3RIZWFkZXIodSxkLmhlYWRlcnNbdV0pO2lmKGQuYmVmb3JlU2VuZCYmKGQuYmVmb3JlU2VuZC5jYWxsKGUsdixkKT09PSExfHxzPT09Mikpe3YuYWJvcnQoKTtyZXR1cm4hMX1mb3IodSBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W3VdKGRbdV0pO3A9YlgoYlMsZCxjLHYpO2lmKCFwKXcoLTEsIk5vIFRyYW5zcG9ydCIpO2Vsc2V7di5yZWFkeVN0YXRlPTEsdCYmZy50cmlnZ2VyKCJhamF4U2VuZCIsW3YsZF0pLGQuYXN5bmMmJmQudGltZW91dD4wJiYocT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7di5hYm9ydCgidGltZW91dCIpfSxkLnRpbWVvdXQpKTt0cnl7cz0xLHAuc2VuZChsLHcpfWNhdGNoKHope3N0YXR1czwyP3coLTEseik6Zi5lcnJvcih6KX19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpYlkoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkIsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgYl89Zi5ub3coKSxjYT0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitiXysrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjYS50ZXN0KGIudXJsKXx8ZSYmY2EudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2EsbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNhLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2I9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNkKWNkW2FdKDAsMSl9OiExLGNjPTAsY2Q7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNlKCl8fGNmKCl9OmNlLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2ImJmRlbGV0ZSBjZFtpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjYyxjYiYmKGNkfHwoY2Q9e30sZihhKS51bmxvYWQoY2IpKSxjZFtpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY2c9e30sY2gsY2ksY2o9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNrPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY2wsY209W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY24sY289YS53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGEubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHxhLm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWU7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjcigic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjcyhkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjcigiaGlkZSIsMyksYSxiLGMpO2Zvcih2YXIgZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKylpZih0aGlzW2RdLnN0eWxlKXt2YXIgZz1mLmNzcyh0aGlzW2RdLCJkaXNwbGF5Iik7ZyE9PSJub25lIiYmIWYuX2RhdGEodGhpc1tkXSwib2xkZGlzcGxheSIpJiZmLl9kYXRhKHRoaXNbZF0sIm9sZGRpc3BsYXkiLGcpfWZvcihkPTA7ZDxlO2QrKyl0aGlzW2RdLnN0eWxlJiYodGhpc1tkXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGNyKCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuc3BlZWQoYixjLGQpO2lmKGYuaXNFbXB0eU9iamVjdChhKSlyZXR1cm4gdGhpcy5lYWNoKGUuY29tcGxldGUsWyExXSk7YT1mLmV4dGVuZCh7fSxhKTtyZXR1cm4gdGhpc1tlLnF1ZXVlPT09ITE/ImVhY2giOiJxdWV1ZSJdKGZ1bmN0aW9uKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJihmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dD8oaj1jcyh0aGlzLm5vZGVOYW1lKSxqPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOih0aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsdGhpcy5zdHlsZS56b29tPTEpKTp0aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlrPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY2oudGVzdChoKT9rW2g9PT0idG9nZ2xlIj9kPyJzaG93IjoiaGlkZSI6aF0oKToobD1jay5leGVjKGgpLG09ay5jdXIoKSxsPyhuPXBhcnNlRmxvYXQobFsyXSksbz1sWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbyE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobnx8MSkrbyksbT0obnx8MSkvay5jdXIoKSptLGYuc3R5bGUodGhpcyxpLG0rbykpLGxbMV0mJihuPShsWzFdPT09Ii09Ij8tMToxKSpuK20pLGsuY3VzdG9tKG0sbixvKSk6ay5jdXN0b20obSxoLCIiKSk7cmV0dXJuITB9KX0sc3RvcDpmdW5jdGlvbihhLGIpe2EmJnRoaXMucXVldWUoW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBhPWYudGltZXJzLGM9YS5sZW5ndGg7Ynx8Zi5fdW5tYXJrKCEwLHRoaXMpO3doaWxlKGMtLSlhW2NdLmVsZW09PT10aGlzJiYoYiYmYVtjXSghMCksYS5zcGxpY2UoYywxKSl9KSxifHx0aGlzLmRlcXVldWUoKTtyZXR1cm4gdGhpc319KSxmLmVhY2goe3NsaWRlRG93bjpjcigic2hvdyIsMSksc2xpZGVVcDpjcigiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3IoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQsZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSE9PSExP2YuZGVxdWV1ZSh0aGlzKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGQuc3RlcChhKX12YXIgZD10aGlzLGU9Zi5meCxnO3RoaXMuc3RhcnRUaW1lPWNufHxjcCgpLHRoaXMuc3RhcnQ9YSx0aGlzLmVuZD1iLHRoaXMudW5pdD1jfHx0aGlzLnVuaXR8fChmLmNzc051bWJlclt0aGlzLnByb3BdPyIiOiJweCIpLHRoaXMubm93PXRoaXMuc3RhcnQsdGhpcy5wb3M9dGhpcy5zdGF0ZT0wLGguZWxlbT10aGlzLmVsZW0saCgpJiZmLnRpbWVycy5wdXNoKGgpJiYhY2wmJihjbz8oY2w9ITAsZz1mdW5jdGlvbigpe2NsJiYoY28oZyksZS50aWNrKCkpfSxjbyhnKSk6Y2w9c2V0SW50ZXJ2YWwoZS50aWNrLGUuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCx0aGlzLmN1c3RvbSh0aGlzLnByb3A9PT0id2lkdGgifHx0aGlzLnByb3A9PT0iaGVpZ2h0Ij8xOjAsdGhpcy5jdXIoKSksZih0aGlzLmVsZW0pLnNob3coKX0saGlkZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuaGlkZT0hMCx0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDApfSxzdGVwOmZ1bmN0aW9uKGEpe3ZhciBiPWNufHxjcCgpLGM9ITAsZD10aGlzLmVsZW0sZT10aGlzLm9wdGlvbnMsZyxoO2lmKGF8fGI+PWUuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGUuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGcgaW4gZS5hbmltYXRlZFByb3BlcnRpZXMpZS5hbmltYXRlZFByb3BlcnRpZXNbZ10hPT0hMCYmKGM9ITEpO2lmKGMpe2Uub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2Quc3R5bGVbIm92ZXJmbG93IitiXT1lLm92ZXJmbG93W2FdfSksZS5oaWRlJiZmKGQpLmhpZGUoKTtpZihlLmhpZGV8fGUuc2hvdylmb3IodmFyIGkgaW4gZS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShkLGksZS5vcmlnW2ldKTtlLmNvbXBsZXRlLmNhbGwoZCl9cmV0dXJuITF9ZS5kdXJhdGlvbj09SW5maW5pdHk/dGhpcy5ub3c9YjooaD1iLXRoaXMuc3RhcnRUaW1lLHRoaXMuc3RhdGU9aC9lLmR1cmF0aW9uLHRoaXMucG9zPWYuZWFzaW5nW2UuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF1dKHRoaXMuc3RhdGUsaCwwLDEsZS5kdXJhdGlvbiksdGhpcy5ub3c9dGhpcy5zdGFydCsodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3MpLHRoaXMudXBkYXRlKCk7cmV0dXJuITB9fSxmLmV4dGVuZChmLmZ4LHt0aWNrOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPWYudGltZXJzLGI9MDtiPGEubGVuZ3RoOysrYilhW2JdKCl8fGEuc3BsaWNlKGItLSwxKTthLmxlbmd0aHx8Zi5meC5zdG9wKCl9LGludGVydmFsOjEzLHN0b3A6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKGNsKSxjbD1udWxsfSxzcGVlZHM6e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sc3RlcDp7b3BhY2l0eTpmdW5jdGlvbihhKXtmLnN0eWxlKGEuZWxlbSwib3BhY2l0eSIsYS5ub3cpfSxfZGVmYXVsdDpmdW5jdGlvbihhKXthLmVsZW0uc3R5bGUmJmEuZWxlbS5zdHlsZVthLnByb3BdIT1udWxsP2EuZWxlbS5zdHlsZVthLnByb3BdPShhLnByb3A9PT0id2lkdGgifHxhLnByb3A9PT0iaGVpZ2h0Ij9NYXRoLm1heCgwLGEubm93KTphLm5vdykrYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmV4cHImJmYuZXhwci5maWx0ZXJzJiYoZi5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZ3JlcChmLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH0pO3ZhciBjdD0vXnQoPzphYmxlfGR8aCkkL2ksY3U9L14oPzpib2R5fGh0bWwpJC9pOyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiaW4gYy5kb2N1bWVudEVsZW1lbnQ/Zi5mbi5vZmZzZXQ9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpc1swXSxjO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGIpO3RyeXtjPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2goZCl7fXZhciBlPWIub3duZXJEb2N1bWVudCxnPWUuZG9jdW1lbnRFbGVtZW50O2lmKCFjfHwhZi5jb250YWlucyhnLGIpKXJldHVybiBjP3t0b3A6Yy50b3AsbGVmdDpjLmxlZnR9Ont0b3A6MCxsZWZ0OjB9O3ZhciBoPWUuYm9keSxpPWN2KGUpLGo9Zy5jbGllbnRUb3B8fGguY2xpZW50VG9wfHwwLGs9Zy5jbGllbnRMZWZ0fHxoLmNsaWVudExlZnR8fDAsbD1pLnBhZ2VZT2Zmc2V0fHxmLnN1cHBvcnQuYm94TW9kZWwmJmcuc2Nyb2xsVG9wfHxoLnNjcm9sbFRvcCxtPWkucGFnZVhPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxMZWZ0fHxoLnNjcm9sbExlZnQsbj1jLnRvcCtsLWosbz1jLmxlZnQrbS1rO3JldHVybnt0b3A6bixsZWZ0Om99fTpmLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO2lmKGEpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7aWYoIWJ8fCFiLm93bmVyRG9jdW1lbnQpcmV0dXJuIG51bGw7aWYoYj09PWIub3duZXJEb2N1bWVudC5ib2R5KXJldHVybiBmLm9mZnNldC5ib2R5T2Zmc2V0KGIpO2Yub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgYyxkPWIub2Zmc2V0UGFyZW50LGU9YixnPWIub3duZXJEb2N1bWVudCxoPWcuZG9jdW1lbnRFbGVtZW50LGk9Zy5ib2R5LGo9Zy5kZWZhdWx0VmlldyxrPWo/ai5nZXRDb21wdXRlZFN0eWxlKGIsbnVsbCk6Yi5jdXJyZW50U3R5bGUsbD1iLm9mZnNldFRvcCxtPWIub2Zmc2V0TGVmdDt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiZiIT09aSYmYiE9PWgpe2lmKGYub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYoIWYub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzfHwhY3QudGVzdChiLm5vZGVOYW1lKSkmJihsKz1wYXJzZUZsb2F0KGMuYm9yZGVyVG9wV2lkdGgpfHwwLG0rPXBhcnNlRmxvYXQoYy5ib3JkZXJMZWZ0V2lkdGgpfHwwKSxlPWQsZD1iLm9mZnNldFBhcmVudCksZi5vZmZzZXQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCImJihsKz1NYXRoLm1heChoLnNjcm9sbFRvcCxpLnNjcm9sbFRvcCksbSs9TWF0aC5tYXgoaC5zY3JvbGxMZWZ0LGkuc2Nyb2xsTGVmdCkpO3JldHVybnt0b3A6bCxsZWZ0Om19fSxmLm9mZnNldD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBhPWMuYm9keSxiPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZCxlLGcsaCxpPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGo9IjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7Zi5leHRlbmQoYi5zdHlsZSx7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAsYm9yZGVyOjAsd2lkdGg6IjFweCIsaGVpZ2h0OiIxcHgiLHZpc2liaWxpdHk6ImhpZGRlbiJ9KSxiLmlubmVySFRNTD1qLGEuaW5zZXJ0QmVmb3JlKGIsYS5maXJzdENoaWxkKSxkPWIuZmlyc3RDaGlsZCxlPWQuZmlyc3RDaGlsZCxoPWQubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkLHRoaXMuZG9lc05vdEFkZEJvcmRlcj1lLm9mZnNldFRvcCE9PTUsdGhpcy5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscz1oLm9mZnNldFRvcD09PTUsZS5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLGUuc3R5bGUudG9wPSIyMHB4Iix0aGlzLnN1cHBvcnRzRml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsdGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSx0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PWEub2Zmc2V0VG9wIT09aSxhLnJlbW92ZUNoaWxkKGIpLGYub2Zmc2V0LmluaXRpYWxpemU9Zi5ub29wfSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yub2Zmc2V0LmluaXRpYWxpemUoKSxmLm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3UudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3UudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3YoZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3YodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhJiZhLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYSxkLCJwYWRkaW5nIikpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiJiZiLnN0eWxlP3BhcnNlRmxvYXQoZi5jc3MoYixkLGE/Im1hcmdpbiI6ImJvcmRlciIpKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY107cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8ZS5kb2N1bWVudC5ib2R5WyJjbGllbnQiK2NdfHxnfWlmKGUubm9kZVR5cGU9PT05KXJldHVybiBNYXRoLm1heChlLmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitjXSxlLmJvZHlbInNjcm9sbCIrY10sZS5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIrY10sZS5ib2R5WyJvZmZzZXQiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK2NdKTtpZihhPT09Yil7dmFyIGg9Zi5jc3MoZSxkKSxpPXBhcnNlRmxvYXQoaCk7cmV0dXJuIGYuaXNOYU4oaSk/aDppfXJldHVybiB0aGlzLmNzcyhkLHR5cGVvZiBhPT0ic3RyaW5nIj9hOmErInB4Iil9fSksYS5qUXVlcnk9YS4kPWZ9KSh3aW5kb3cpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL29wZW5fbmV3X3BhZ2UucG5nIGIvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvb3Blbl9uZXdfcGFnZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTdlM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdGF0aWMvb3Blbl9uZXdfcGFnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyBiL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGMzODkyLi4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKgotQ29weXJpZ2h0IChjKSAyMDEwLCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotQ29kZSBsaWNlbnNlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2U6Ci1odHRwOi8vZGV2ZWxvcGVyLnlhaG9vLmNvbS95dWkvbGljZW5zZS5odG1sCi12ZXJzaW9uOiAzLjMuMAotYnVpbGQ6IDMxNjcKLSovCi1odG1se2NvbG9yOiMwMDA7YmFja2dyb3VuZDojRkZGO31ib2R5LGRpdixkbCxkdCxkZCx1bCxvbCxsaSxoMSxoMixoMyxoNCxoNSxoNixwcmUsY29kZSxmb3JtLGZpZWxkc2V0LGxlZ2VuZCxpbnB1dCx0ZXh0YXJlYSxwLGJsb2NrcXVvdGUsdGgsdGR7bWFyZ2luOjA7cGFkZGluZzowO310YWJsZXtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9ZmllbGRzZXQsaW1ne2JvcmRlcjowO31hZGRyZXNzLGNhcHRpb24sY2l0ZSxjb2RlLGRmbixlbSxzdHJvbmcsdGgsdmFye2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDt9bGl7bGlzdC1zdHlsZTpub25lO31jYXB0aW9uLHRoe3RleHQtYWxpZ246bGVmdDt9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6bm9ybWFsO31xOmJlZm9yZSxxOmFmdGVye2NvbnRlbnQ6Jyc7fWFiYnIsYWNyb255bXtib3JkZXI6MDtmb250LXZhcmlhbnQ6bm9ybWFsO31zdXB7dmVydGljYWwtYWxpZ246dGV4dC10b3A7fXN1Ynt2ZXJ0aWNhbC1hbGlnbjp0ZXh0LWJvdHRvbTt9aW5wdXQsdGV4dGFyZWEsc2VsZWN0e2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdDt9aW5wdXQsdGV4dGFyZWEsc2VsZWN0eypmb250LXNpemU6MTAwJTt9bGVnZW5ke2NvbG9yOiMwMDA7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvY29sb3IuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvY29sb3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhM2M0NS4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2NvbG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gQ29sb3IKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotPHN0eWxlPgotICAuY29sb3Itcm93IHsKLSAgICB3aWR0aDogNzQwcHg7Ci0gICAgbWFyZ2luLWxlZnQ6IDEwcHggIWltcG9ydGFudDsKLSAgICBtYXJnaW4tcmlnaHQ6IDEwcHggIWltcG9ydGFudDsKLQotICAgIGRpc3BsYXk6ICAgICAgICAgYm94OwotICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwotICAgIGRpc3BsYXk6ICAgIC1tb3otYm94OwotCi0gICAgICAgICAgICBib3gtb3JpZW50OiBob3Jpem9udGFsOwotICAgIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDsKLSAgICAgICAtbW96LWJveC1vcmllbnQ6IGhvcml6b250YWw7Ci0KLSAgICBjdXJzb3I6IHBvaW50ZXI7Ci0KLSAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lOwotICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Ci0gICAgLyogbmVzdGVkIHVzZXItc2VsZWN0IGluIEZGIGlzIGJyb2tlbiBhcyBvZiBKYW4gMjAxMiwgZG9uJ3QgdXNlIGl0ICovCi0gIH0KLQotICAuY29sb3Itcm93LWNvbnRhaW5lciB7Ci0gICAgbGluZS1oZWlnaHQ6IDA7IC8qIHRvIHJlbW92ZSBtb3JlIHRvcCBzcGFjZSBpbiBGRiBmb3IgLW1vei1ib3ggZWxlbWVudHMgKi8KLSAgfQotCi0gIC5jb2xvci1yb3ctY29udGFpbmVyICsgLmNvbG9yLXJvdy1jb250YWluZXIgewotICAgIG1hcmdpbi10b3A6IC0xMHB4ICFpbXBvcnRhbnQ7Ci0gIH0KLQotICAuY29sb3Itcm93IGxpIHsKLSAgICBtYXJnaW4tbGVmdDogMCAhaW1wb3J0YW50OwotICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKLSAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci0gICAgaGVpZ2h0OiA4MHB4OwotICAgIGRpc3BsYXk6IGJsb2NrOwotCi0gICAgICAgICAgICBib3gtZmxleDogMTsKLSAgICAtd2Via2l0LWJveC1mbGV4OiAxOwotICAgICAgIC1tb3otYm94LWZsZXg6IDE7Ci0gIH0KLQotICAuY29sb3Itcm93IGxpOmJlZm9yZSB7Ci0gICAgZGlzcGxheTogbm9uZTsKLSAgfQotCi0gIC5jb2xvci1yb3cgbGkudGhpbiB7Ci0gICAgaGVpZ2h0OiA0MHB4OwotICB9Ci0KLSAgLmNvbG9yLXJvdyBsaSBzcGFuIHsKLSAgICBkaXNwbGF5OiBub25lOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICB0b3A6IC0zMHB4OwotICAgIGxlZnQ6IDUwJTsKLSAgICBtYXJnaW4tbGVmdDogLTIuNWVtOwotICAgIHdpZHRoOiA1ZW07Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKLSAgICBwYWRkaW5nOiAxMHB4OwotICAgIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gICAgbGluZS1oZWlnaHQ6IDIwcHg7Ci0gICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgIGJveC1zaGFkb3c6IDAgNXB4IDVweCByZ2JhKDAsMCwwLDAuMSk7Ci0gICAgY3Vyc29yOiB0ZXh0OwotCi0gICAgICAgICAgICB1c2VyLXNlbGVjdDogdGV4dDsKLSAgICAtd2Via2l0LXVzZXItc2VsZWN0OiB0ZXh0OwotICAgIC8qIG5lc3RlZCB1c2VyLXNlbGVjdCBpbiBGRiBpcyBicm9rZW4gYXMgb2YgSmFuIDIwMTIsIGRvbid0IHVzZSBpdCAqLwotICB9Ci0KLSAgLmNvbG9yLXJvdyBsaTpob3ZlciBzcGFuIHsKLSAgICBkaXNwbGF5OiBibG9jazsKLSAgfQotCi0gIC8qLmNvbG9yLXJvdyBsaSBzcGFuOmJlZm9yZSB7Ci0gICAgY29sb3I6ICM5OTk7Ci0gICAgY29udGVudDogJ2NvcHkgJzsKLSAgfSovCi0KLSAgLyogdHJpYW5nbGUgY2FsbG91dCAqLwotICAuY29sb3Itcm93IGxpIHNwYW46YWZ0ZXIgewotICAgIGNvbnRlbnQ6ICcnOwotICAgIGRpc3BsYXk6IGJsb2NrOwotICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgICBsZWZ0OiA1MCU7Ci0gICAgYm90dG9tOiAtMTZweDsKLSAgICBib3JkZXI6IDhweCBzb2xpZCB0cmFuc3BhcmVudDsKLSAgICBib3JkZXItdG9wLWNvbG9yOiAjZmZmOwotICAgIHdpZHRoOiAwOwotICAgIGhlaWdodDogMDsKLSAgICBtYXJnaW4tbGVmdDogLThweDsKLSAgfQotPC9zdHlsZT4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+Q29sb3I8L2gyPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotCi0gICAgICAgICAgCi0KLTxwPlVzZSBjb2xvciBwcmltYXJpbHkgZm9yIGVtcGhhc2lzLiBDaG9vc2UgY29sb3JzIHRoYXQgZml0IHdpdGggeW91ciBicmFuZCBhbmQgcHJvdmlkZSBnb29kIGNvbnRyYXN0Ci1iZXR3ZWVuIHZpc3VhbCBjb21wb25lbnRzLiBOb3RlIHRoYXQgcmVkIGFuZCBncmVlbiBtYXkgYmUgaW5kaXN0aW5ndWlzaGFibGUgdG8gY29sb3ItYmxpbmQgdXNlcnMuPC9wPgotCi0gICAgPGRpdiBjbGFzcz0iY29sb3Itcm93LWNvbnRhaW5lciI+Ci0gICAgICA8dWwgY2xhc3M9ImNvbG9yLXJvdyI+Ci0gICAgICAgIDxsaT48c3Bhbj4jMzNiNWU1PC9zcGFuPjwvbGk+Ci0gICAgICAgIDxsaT48c3Bhbj4jYWE2NmNjPC9zcGFuPjwvbGk+Ci0gICAgICAgIDxsaT48c3Bhbj4jOTljYzAwPC9zcGFuPjwvbGk+Ci0gICAgICAgIDxsaT48c3Bhbj4jZmZiYjMzPC9zcGFuPjwvbGk+Ci0gICAgICAgIDxsaT48c3Bhbj4jZmY0NDQ0PC9zcGFuPjwvbGk+Ci0gICAgICA8L3VsPgotICAgIDwvZGl2PgotCi0gICAgPGRpdiBjbGFzcz0iY29sb3Itcm93LWNvbnRhaW5lciI+Ci0gICAgICA8dWwgY2xhc3M9ImNvbG9yLXJvdyI+Ci0gICAgICAgIDxsaSBjbGFzcz0idGhpbiI+PHNwYW4+IzAwOTljYzwvc3Bhbj48L2xpPgotICAgICAgICA8bGkgY2xhc3M9InRoaW4iPjxzcGFuPiM5OTMzY2M8L3NwYW4+PC9saT4KLSAgICAgICAgPGxpIGNsYXNzPSJ0aGluIj48c3Bhbj4jNjY5OTAwPC9zcGFuPjwvbGk+Ci0gICAgICAgIDxsaSBjbGFzcz0idGhpbiI+PHNwYW4+I2ZmODgwMDwvc3Bhbj48L2xpPgotICAgICAgICA8bGkgY2xhc3M9InRoaW4iPjxzcGFuPiNjYzAwMDA8L3NwYW4+PC9saT4KLSAgICAgIDwvdWw+Ci0gICAgPC9kaXY+Ci0KLTxoMiBpZD0icGFsZXR0ZSI+UGFsZXR0ZTwvaDI+Ci0KLTxwPkJsdWUgaXMgdGhlIHN0YW5kYXJkIGFjY2VudCBjb2xvciBpbiBBbmRyb2lkJ3MgY29sb3IgcGFsZXR0ZS4gRWFjaCBjb2xvciBoYXMgYSBjb3JyZXNwb25kaW5nIGRhcmtlcgotc2hhZGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIGNvbXBsZW1lbnQgd2hlbiBuZWVkZWQuPC9wPgotPHA+PGEgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9BbmRyb2lkX0Rlc2lnbl9Db2xvcl9Td2F0Y2hlc18yMDEyMDIyOS56aXAiPkRvd25sb2FkIHRoZSBzd2F0Y2hlczwvYT48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9jb2xvcl9zcGVjdHJ1bS5wbmciPgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLTxzY3JpcHQ+Ci0gICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewotICAgICQoJy5jb2xvci1yb3cgbGknKS5lYWNoKGZ1bmN0aW9uKCkgewotICAgICAgdmFyIGNvbG9yID0gJCh0aGlzKS50ZXh0KCk7Ci0gICAgICAkKHRoaXMpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsIGNvbG9yKTsKLSAgICAgICQodGhpcykuZmluZCgnc3BhbicpCi0gICAgICAgICAgLmNzcygnY29sb3InLCBjb2xvcikKLSAgICAgICAgICAudGV4dChjb2xvci50b1VwcGVyQ2FzZSgpKTsKLSAgICB9KTsKLSAgICAKLSAgfSk7Ci08L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS9jb2xvci5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvY29sb3IuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZjdjNgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvY29sb3IuamQKQEAgLTAsMCArMSwxMzQgQEAKK3BhZ2UudGl0bGU9Q29sb3IKK0BqZDpib2R5CisKKzxzdHlsZT4KKyAgLmNvbG9yLXJvdyB7CisgICAgd2lkdGg6IDc0MHB4OworICAgIG1hcmdpbi1sZWZ0OiAxMHB4ICFpbXBvcnRhbnQ7CisgICAgbWFyZ2luLXJpZ2h0OiAxMHB4ICFpbXBvcnRhbnQ7CisKKyAgICBkaXNwbGF5OiAtd2Via2l0LWJveDsKKyAgICBkaXNwbGF5OiAgICAtbW96LWJveDsKKyAgICBkaXNwbGF5OiAgICAgICAgIGJveDsKKworICAgIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDsKKyAgICAgICAtbW96LWJveC1vcmllbnQ6IGhvcml6b250YWw7CisgICAgICAgICAgICBib3gtb3JpZW50OiBob3Jpem9udGFsOworCisgICAgY3Vyc29yOiBwb2ludGVyOworCisgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKKyAgICAgICAgICAgIHVzZXItc2VsZWN0OiBub25lOworICAgIC8qIG5lc3RlZCB1c2VyLXNlbGVjdCBpbiBGRiBpcyBicm9rZW4gYXMgb2YgSmFuIDIwMTIsIGRvbid0IHVzZSBpdCAqLworICB9CisKKyAgLmNvbG9yLXJvdy1jb250YWluZXIgeworICAgIGxpbmUtaGVpZ2h0OiAwOyAvKiB0byByZW1vdmUgbW9yZSB0b3Agc3BhY2UgaW4gRkYgZm9yIC1tb3otYm94IGVsZW1lbnRzICovCisgIH0KKworICAuY29sb3Itcm93LWNvbnRhaW5lciArIC5jb2xvci1yb3ctY29udGFpbmVyIHsKKyAgICBtYXJnaW4tdG9wOiAtMTBweCAhaW1wb3J0YW50OworICB9CisKKyAgLmNvbG9yLXJvdyBsaSB7CisgICAgbWFyZ2luLWxlZnQ6IDAgIWltcG9ydGFudDsKKyAgICBwb3NpdGlvbjogcmVsYXRpdmU7CisgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOworICAgIGhlaWdodDogODBweDsKKyAgICBkaXNwbGF5OiBibG9jazsKKworICAgIC13ZWJraXQtYm94LWZsZXg6IDE7CisgICAgICAgLW1vei1ib3gtZmxleDogMTsKKyAgICAgICAgICAgIGJveC1mbGV4OiAxOworICB9CisKKyAgLmNvbG9yLXJvdyBsaTpiZWZvcmUgeworICAgIGRpc3BsYXk6IG5vbmU7CisgIH0KKworICAuY29sb3Itcm93IGxpLnRoaW4geworICAgIGhlaWdodDogNDBweDsKKyAgfQorCisgIC5jb2xvci1yb3cgbGkgc3BhbiB7CisgICAgZGlzcGxheTogbm9uZTsKKyAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgdG9wOiAtMzBweDsKKyAgICBsZWZ0OiA1MCU7CisgICAgbWFyZ2luLWxlZnQ6IC0yLjVlbTsKKyAgICB3aWR0aDogNWVtOworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LXdlaWdodDogNjAwOworICAgIGxpbmUtaGVpZ2h0OiAyMHB4OworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKKyAgICBib3gtc2hhZG93OiAwIDVweCA1cHggcmdiYSgwLDAsMCwwLjEpOworICAgIGN1cnNvcjogdGV4dDsKKworICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7CisgICAgICAgICAgICB1c2VyLXNlbGVjdDogdGV4dDsKKyAgICAvKiBuZXN0ZWQgdXNlci1zZWxlY3QgaW4gRkYgaXMgYnJva2VuIGFzIG9mIEphbiAyMDEyLCBkb24ndCB1c2UgaXQgKi8KKyAgfQorCisgIC5jb2xvci1yb3cgbGk6aG92ZXIgc3BhbiB7CisgICAgZGlzcGxheTogYmxvY2s7CisgIH0KKworICAvKiB0cmlhbmdsZSBjYWxsb3V0ICovCisgIC5jb2xvci1yb3cgbGkgc3BhbjphZnRlciB7CisgICAgY29udGVudDogJyc7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGxlZnQ6IDUwJTsKKyAgICBib3R0b206IC0xNnB4OworICAgIGJvcmRlcjogOHB4IHNvbGlkIHRyYW5zcGFyZW50OworICAgIGJvcmRlci10b3AtY29sb3I6ICNmZmY7CisgICAgd2lkdGg6IDA7CisgICAgaGVpZ2h0OiAwOworICAgIG1hcmdpbi1sZWZ0OiAtOHB4OworICB9Cis8L3N0eWxlPgorCis8cD5Vc2UgY29sb3IgcHJpbWFyaWx5IGZvciBlbXBoYXNpcy4gQ2hvb3NlIGNvbG9ycyB0aGF0IGZpdCB3aXRoIHlvdXIgYnJhbmQgYW5kIHByb3ZpZGUgZ29vZCBjb250cmFzdAorYmV0d2VlbiB2aXN1YWwgY29tcG9uZW50cy4gTm90ZSB0aGF0IHJlZCBhbmQgZ3JlZW4gbWF5IGJlIGluZGlzdGluZ3Vpc2hhYmxlIHRvIGNvbG9yLWJsaW5kIHVzZXJzLjwvcD4KKworICAgIDxkaXYgY2xhc3M9ImNvbG9yLXJvdy1jb250YWluZXIiPgorICAgICAgPHVsIGNsYXNzPSJjb2xvci1yb3ciPgorICAgICAgICA8bGk+PHNwYW4+IzMzYjVlNTwvc3Bhbj48L2xpPgorICAgICAgICA8bGk+PHNwYW4+I2FhNjZjYzwvc3Bhbj48L2xpPgorICAgICAgICA8bGk+PHNwYW4+Izk5Y2MwMDwvc3Bhbj48L2xpPgorICAgICAgICA8bGk+PHNwYW4+I2ZmYmIzMzwvc3Bhbj48L2xpPgorICAgICAgICA8bGk+PHNwYW4+I2ZmNDQ0NDwvc3Bhbj48L2xpPgorICAgICAgPC91bD4KKyAgICA8L2Rpdj4KKworICAgIDxkaXYgY2xhc3M9ImNvbG9yLXJvdy1jb250YWluZXIiPgorICAgICAgPHVsIGNsYXNzPSJjb2xvci1yb3ciPgorICAgICAgICA8bGkgY2xhc3M9InRoaW4iPjxzcGFuPiMwMDk5Y2M8L3NwYW4+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJ0aGluIj48c3Bhbj4jOTkzM2NjPC9zcGFuPjwvbGk+CisgICAgICAgIDxsaSBjbGFzcz0idGhpbiI+PHNwYW4+IzY2OTkwMDwvc3Bhbj48L2xpPgorICAgICAgICA8bGkgY2xhc3M9InRoaW4iPjxzcGFuPiNmZjg4MDA8L3NwYW4+PC9saT4KKyAgICAgICAgPGxpIGNsYXNzPSJ0aGluIj48c3Bhbj4jY2MwMDAwPC9zcGFuPjwvbGk+CisgICAgICA8L3VsPgorICAgIDwvZGl2PgorCis8aDIgaWQ9InBhbGV0dGUiPlBhbGV0dGU8L2gyPgorCis8cD5CbHVlIGlzIHRoZSBzdGFuZGFyZCBhY2NlbnQgY29sb3IgaW4gQW5kcm9pZCdzIGNvbG9yIHBhbGV0dGUuIEVhY2ggY29sb3IgaGFzIGEgY29ycmVzcG9uZGluZyBkYXJrZXIKK3NoYWRlIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBjb21wbGVtZW50IHdoZW4gbmVlZGVkLjwvcD4KKzxwPjxhIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fQ29sb3JfU3dhdGNoZXNfMjAxMjAyMjkuemlwIj5Eb3dubG9hZCB0aGUgc3dhdGNoZXM8L2E+PC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9jb2xvcl9zcGVjdHJ1bS5wbmciPgorCis8c2NyaXB0PgorICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKKyAgICAkKCcuY29sb3Itcm93IGxpJykuZWFjaChmdW5jdGlvbigpIHsKKyAgICAgIHZhciBjb2xvciA9ICQodGhpcykudGV4dCgpOworICAgICAgJCh0aGlzKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCBjb2xvcik7CisgICAgICAkKHRoaXMpLmZpbmQoJ3NwYW4nKQorICAgICAgICAgIC5jc3MoJ2NvbG9yJywgY29sb3IpCisgICAgICAgICAgLnRleHQoY29sb3IudG9VcHBlckNhc2UoKSk7CisgICAgfSk7CisgICAgCisgIH0pOworPC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWUwODc2Li4wMDAwMDAwCi0tLSBhL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIERldmljZXMgYW5kIERpc3BsYXlzCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkRldmljZXMgYW5kIERpc3BsYXlzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5BbmRyb2lkIHBvd2VycyBtaWxsaW9ucyBvZiBwaG9uZXMsIHRhYmxldHMsIGFuZCBvdGhlciBkZXZpY2VzIGluIGEgd2lkZSB2YXJpZXR5IG9mIHNjcmVlbiBzaXplcyBhbmQKLWZvcm0gZmFjdG9ycy4gQnkgdGFraW5nIGFkdmFudGFnZSBvZiBBbmRyb2lkJ3MgZmxleGlibGUgbGF5b3V0IHN5c3RlbSwgeW91IGNhbiBjcmVhdGUgYXBwcyB0aGF0Ci1ncmFjZWZ1bGx5IHNjYWxlIGZyb20gbGFyZ2UgdGFibGV0cyB0byBzbWFsbGVyIHBob25lcy48L3A+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9kZXZpY2VzX2Rpc3BsYXlzX21haW4ucG5nIj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08aDQ+QmUgZmxleGlibGU8L2g0PgotPHA+U3RyZXRjaCBhbmQgY29tcHJlc3MgeW91ciBsYXlvdXRzIHRvIGFjY29tbW9kYXRlIHZhcmlvdXMgaGVpZ2h0cyBhbmQgd2lkdGhzLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5PcHRpbWl6ZSBsYXlvdXRzPC9oND4KLTxwPk9uIGxhcmdlciBkZXZpY2VzLCB0YWtlIGFkdmFudGFnZSBvZiBleHRyYSBzY3JlZW4gcmVhbCBlc3RhdGUuIENyZWF0ZSBjb21wb3VuZCB2aWV3cyB0aGF0IGNvbWJpbmUKLW11bHRpcGxlIHZpZXdzIHRvIHJldmVhbCBtb3JlIGNvbnRlbnQgYW5kIGVhc2UgbmF2aWdhdGlvbi48L3A+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08aDQ+QXNzZXRzIGZvciBhbGw8L2g0PgotPHA+UHJvdmlkZSByZXNvdXJjZXMgZm9yIGRpZmZlcmVudCBzY3JlZW4gZGVuc2l0aWVzICg8YWNyb255bSB0aXRsZT0iRG90cyBwZXIgaW5jaCI+RFBJPC9hY3JvbnltPikgdG8KLWVuc3VyZSB0aGF0IHlvdXIgYXBwIGxvb2tzIGdyZWF0IG9uIGFueSBkZXZpY2UuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIj4KLSAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2RldmljZXNfZGlzcGxheXNfZGVuc2l0eS5wbmciPgotPC9kaXY+Ci0KLTxoND5TdHJhdGVnaWVzPC9oND4KLTxwPlNvIHdoZXJlIGRvIHlvdSBiZWdpbiB3aGVuIGRlc2lnbmluZyBmb3IgbXVsdGlwbGUgc2NyZWVucz8gT25lIGFwcHJvYWNoIGlzIHRvIHdvcmsgaW4gdGhlIGJhc2UKLXN0YW5kYXJkIChtZWRpdW0gc2l6ZSwgPGFjcm9ueW0gdGl0bGU9Ik1lZGl1bSBkZW5zaXR5ICgxNjAgZHBpKSI+TURQSTwvYWNyb255bT4pIGFuZCBzY2FsZSBpdCB1cCBvcgotZG93biBmb3IgdGhlIG90aGVyIGJ1Y2tldHMuIEFub3RoZXIgYXBwcm9hY2ggaXMgdG8gc3RhcnQgd2l0aCB0aGUgZGV2aWNlIHdpdGggdGhlIGxhcmdlc3Qgc2NyZWVuCi1zaXplLCBhbmQgdGhlbiBzY2FsZSBkb3duIGFuZCBmaWd1cmUgb3V0IHRoZSBVSSBjb21wcm9taXNlcyB5b3UnbGwgbmVlZCB0byBtYWtlIG9uIHNtYWxsZXIgc2NyZWVucy48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGlzIHRvcGljLCBwbGVhc2UgdmlzaXQgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUKLVNjcmVlbnM8L2E+LjwvcD4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2RldmljZXMtZGlzcGxheXMuamQgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2RldmljZXMtZGlzcGxheXMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVmZTI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5qZApAQCAtMCwwICsxLDQ1IEBACitwYWdlLnRpdGxlPURldmljZXMgYW5kIERpc3BsYXlzCitAamQ6Ym9keQorCis8cD5BbmRyb2lkIHBvd2VycyBtaWxsaW9ucyBvZiBwaG9uZXMsIHRhYmxldHMsIGFuZCBvdGhlciBkZXZpY2VzIGluIGEgd2lkZSB2YXJpZXR5IG9mIHNjcmVlbiBzaXplcyBhbmQKK2Zvcm0gZmFjdG9ycy4gQnkgdGFraW5nIGFkdmFudGFnZSBvZiBBbmRyb2lkJ3MgZmxleGlibGUgbGF5b3V0IHN5c3RlbSwgeW91IGNhbiBjcmVhdGUgYXBwcyB0aGF0CitncmFjZWZ1bGx5IHNjYWxlIGZyb20gbGFyZ2UgdGFibGV0cyB0byBzbWFsbGVyIHBob25lcy48L3A+CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2RldmljZXNfZGlzcGxheXNfbWFpbi5wbmciPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxoND5CZSBmbGV4aWJsZTwvaDQ+Cis8cD5TdHJldGNoIGFuZCBjb21wcmVzcyB5b3VyIGxheW91dHMgdG8gYWNjb21tb2RhdGUgdmFyaW91cyBoZWlnaHRzIGFuZCB3aWR0aHMuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KKworPGg0Pk9wdGltaXplIGxheW91dHM8L2g0PgorPHA+T24gbGFyZ2VyIGRldmljZXMsIHRha2UgYWR2YW50YWdlIG9mIGV4dHJhIHNjcmVlbiByZWFsIGVzdGF0ZS4gQ3JlYXRlIGNvbXBvdW5kIHZpZXdzIHRoYXQgY29tYmluZQorbXVsdGlwbGUgdmlld3MgdG8gcmV2ZWFsIG1vcmUgY29udGVudCBhbmQgZWFzZSBuYXZpZ2F0aW9uLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxoND5Bc3NldHMgZm9yIGFsbDwvaDQ+Cis8cD5Qcm92aWRlIHJlc291cmNlcyBmb3IgZGlmZmVyZW50IHNjcmVlbiBkZW5zaXRpZXMgKDxhY3JvbnltIHRpdGxlPSJEb3RzIHBlciBpbmNoIj5EUEk8L2Fjcm9ueW0+KSB0bworZW5zdXJlIHRoYXQgeW91ciBhcHAgbG9va3MgZ3JlYXQgb24gYW55IGRldmljZS48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiPgorICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9kZXZpY2VzX2Rpc3BsYXlzX2RlbnNpdHkucG5nIj4KKzwvZGl2PgorCis8aDQ+U3RyYXRlZ2llczwvaDQ+Cis8cD5TbyB3aGVyZSBkbyB5b3UgYmVnaW4gd2hlbiBkZXNpZ25pbmcgZm9yIG11bHRpcGxlIHNjcmVlbnM/IE9uZSBhcHByb2FjaCBpcyB0byB3b3JrIGluIHRoZSBiYXNlCitzdGFuZGFyZCAobWVkaXVtIHNpemUsIDxhY3JvbnltIHRpdGxlPSJNZWRpdW0gZGVuc2l0eSAoMTYwIGRwaSkiPk1EUEk8L2Fjcm9ueW0+KSBhbmQgc2NhbGUgaXQgdXAgb3IKK2Rvd24gZm9yIHRoZSBvdGhlciBidWNrZXRzLiBBbm90aGVyIGFwcHJvYWNoIGlzIHRvIHN0YXJ0IHdpdGggdGhlIGRldmljZSB3aXRoIHRoZSBsYXJnZXN0IHNjcmVlbgorc2l6ZSwgYW5kIHRoZW4gc2NhbGUgZG93biBhbmQgZmlndXJlIG91dCB0aGUgVUkgY29tcHJvbWlzZXMgeW91J2xsIG5lZWQgdG8gbWFrZSBvbiBzbWFsbGVyIHNjcmVlbnMuPC9wPgorPHA+Rm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYywgcGxlYXNlIHZpc2l0IDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sIj5TdXBwb3J0aW5nIE11bHRpcGxlCitTY3JlZW5zPC9hPi48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTU0ZGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS9pY29ub2dyYXBoeS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIEljb25vZ3JhcGh5Ci0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPkljb25vZ3JhcGh5PC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfb3ZlcnZpZXcucG5nIj4KLQotPHA+QW4gaWNvbiBpcyBhIGdyYXBoaWMgdGhhdCB0YWtlcyB1cCBhIHNtYWxsIHBvcnRpb24gb2Ygc2NyZWVuIHJlYWwgZXN0YXRlIGFuZCBwcm92aWRlcyBhIHF1aWNrLAotaW50dWl0aXZlIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFjdGlvbiwgYSBzdGF0dXMsIG9yIGFuIGFwcC48L3A+Ci0KLQotCi08aDIgaWQ9ImxhdW5jaGVyIj5MYXVuY2hlcjwvaDI+Ci0KLTxwPlRoZSBsYXVuY2hlciBpY29uIGlzIHRoZSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgeW91ciBhcHAgb24gdGhlIEhvbWUgb3IgQWxsIEFwcHMgc2NyZWVuLiBTaW5jZSB0aGUKLXVzZXIgY2FuIGNoYW5nZSB0aGUgSG9tZSBzY3JlZW4ncyB3YWxscGFwZXIsIG1ha2Ugc3VyZSB0aGF0IHlvdXIgbGF1bmNoZXIgaWNvbiBpcyBjbGVhcmx5IHZpc2libGUgb24KLWFueSB0eXBlIG9mIGJhY2tncm91bmQuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9sYXVuY2hlcl9zaXplLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2xhdW5jaGVyX2ZvY2FsLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2xhdW5jaGVyX3N0eWxlLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aDQ+U2l6ZXMgJmFtcDsgc2NhbGU8L2g0PgotCi0gICAgPHVsPgotICAgICAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIHRhYmxldCI+Ci0gICAgICAgIDxwPkxhdW5jaGVyIGljb25zIG9uIGEgbW9iaWxlIGRldmljZSBtdXN0IGJlIDxzdHJvbmc+NDh4NDggPGFjcm9ueW0gdGl0bGU9IkRlbnNpdHktaW5kZXBlbmRlbnQgcGl4ZWxzLiBPbmUgZHAgaXMgb25lIHBpeGVsIG9uIGEgMTYwIGRwaSBzY3JlZW4uIj5kcDwvYWNyb255bT48L3N0cm9uZz4uPC9wPjwvbGk+Ci0gICAgICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gd2ViIj4KLSAgICAgICAgPHA+TGF1bmNoZXIgaWNvbnMgZm9yIGRpc3BsYXkgaW4gTWFya2V0IG11c3QgYmUgPHN0cm9uZz41MTJ4NTEyIHBpeGVsczwvc3Ryb25nPi48L3A+PC9saT4KLSAgICA8L3VsPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxoND5Qcm9wb3J0aW9uczwvaDQ+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gdGFibGV0Ij4KLSAgICAgICAgPHA+RnVsbCBhc3NldCwgPHN0cm9uZz40OHg0OCBkcDwvc3Ryb25nPjwvcD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxoND5TdHlsZTwvaDQ+Ci08cD5Vc2UgYSBkaXN0aW5jdCBzaWxob3VldHRlLiBUaHJlZS1kaW1lbnNpb25hbCwgZnJvbnQgdmlldywgd2l0aCBhIHNsaWdodCBwZXJzcGVjdGl2ZSBhcyBpZiB2aWV3ZWQKLWZyb20gYWJvdmUsIHNvIHRoYXQgdXNlcnMgcGVyY2VpdmUgc29tZSBkZXB0aC48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAmbmJzcDsKLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2xhdW5jaGVyX2V4YW1wbGUucG5nIj4KLQotICA8L2Rpdj4KLSAgPCEtLSAyIGZyZWUgY29sdW1ucyAtLT4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi0xMiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZXhhbXBsZTIucG5nIj4KLQotICAgIDxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi0gIDwvZGl2PgotICA8IS0tIDEgZnJlZSBjb2x1bW5zIC0tPgotPC9kaXY+Ci0KLQotPGgyIGlkPSJhY3Rpb24tYmFyIj5BY3Rpb24gQmFyPC9oMj4KLQotPHA+Ci0KLUFjdGlvbiBiYXIgaWNvbnMgYXJlIGdyYXBoaWMgYnV0dG9ucyB0aGF0IHJlcHJlc2VudCB0aGUgbW9zdCBpbXBvcnRhbnQgYWN0aW9ucyBwZW9wbGUgY2FuIHRha2UKLXdpdGhpbiB5b3VyIGFwcC4gRWFjaCBvbmUgc2hvdWxkIGVtcGxveSBhIHNpbXBsZSBtZXRhcGhvciByZXByZXNlbnRpbmcgYSBzaW5nbGUgY29uY2VwdCB0aGF0IG1vc3QKLXBlb3BsZSBjYW4gZ3Jhc3AgYXQgYSBnbGFuY2UuCi0KLTwvcD4KLTxwPgotCi1QcmUtZGVmaW5lZCBnbHlwaHMgc2hvdWxkIGJlIHVzZWQgZm9yIGNlcnRhaW4gY29tbW9uIGFjdGlvbnMgc3VjaCBhcyAicmVmcmVzaCIgYW5kICJzaGFyZS4iIFRoZQotZG93bmxvYWQgbGluayBiZWxvdyBwcm92aWRlcyBhIHBhY2thZ2Ugd2l0aCBpY29ucyB0aGF0IGFyZSBzY2FsZWQgZm9yIHZhcmlvdXMgc2NyZWVuIGRlbnNpdGllcyBhbmQKLWFyZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhlIEhvbG8gTGlnaHQgYW5kIEhvbG8gRGFyayB0aGVtZXMuIFRoZSBwYWNrYWdlIGFsc28gaW5jbHVkZXMgdW5zdHlsZWQKLWljb25zIHRoYXQgeW91IGNhbiBtb2RpZnkgdG8gbWF0Y2ggeW91ciB0aGVtZSwgaW4gYWRkaXRpb24gdG8gQWRvYmUmcmVnOyBJbGx1c3RyYXRvciZyZWc7IHNvdXJjZQotZmlsZXMgZm9yIGZ1cnRoZXIgY3VzdG9taXphdGlvbi4KLQotPC9wPgotPHA+Ci0KLTxhIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vQW5kcm9pZF9EZXNpZ25fSWNvbnNfMjAxMjAyMjkuemlwIj5Eb3dubG9hZCB0aGUgQWN0aW9uIEJhciBJY29uIFBhY2s8L2E+Ci0KLTwvcD4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX3NpemUucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX2ZvY2FsLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L2ljb25vZ3JhcGh5X2FjdGlvbmJhcl9zdHlsZS5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGg0PlNpemVzICZhbXA7IHNjYWxlPC9oND4KLQotICAgIDx1bD4KLSAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgotICAgICAgICA8cD5BY3Rpb24gYmFyIGljb25zIGZvciBwaG9uZXMgc2hvdWxkIGJlIDxzdHJvbmc+MzJ4MzIgPGFjcm9ueW0gdGl0bGU9IkRlbnNpdHktaW5kZXBlbmRlbnQgcGl4ZWxzLiBPbmUgZHAgaXMgb25lIHBpeGVsIG9uIGEgMTYwIGRwaSBzY3JlZW4uIj5kcDwvYWNyb255bT48L3N0cm9uZz4uPC9wPjwvbGk+Ci0gICAgPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aDQ+Rm9jYWwgYXJlYSAmYW1wOyBwcm9wb3J0aW9uczwvaDQ+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gdGFibGV0Ij4KLSAgICAgICAgPHA+RnVsbCBhc3NldCwgPHN0cm9uZz4zMngzMiBkcDwvc3Ryb25nPjwvcD4KLSAgICAgICAgPHA+T3B0aWNhbCBzcXVhcmUsIDxzdHJvbmc+MjR4MjQgZHA8L3N0cm9uZz48L3A+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08aDQ+U3R5bGU8L2g0PgotPHA+UGljdG9ncmFwaGljLCBmbGF0LCBub3QgdG9vIGRldGFpbGVkLCB3aXRoIHNtb290aCBjdXJ2ZXMgb3Igc2hhcnAgc2hhcGVzLiBJZiB0aGUgZ3JhcGhpYyBpcyB0aGluLAotcm90YXRlIGl0IDQ1JmRlZzsgbGVmdCBvciByaWdodCB0byBmaWxsIHRoZSBmb2NhbCBzcGFjZS4gVGhlIHRoaWNrbmVzcyBvZiB0aGUgc3Ryb2tlcyBhbmQgbmVnYXRpdmUKLXNwYWNlcyBzaG91bGQgYmUgYSBtaW5pbXVtIG9mIDIgZHAuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tMyI+Ci0KLTxoND5Db2xvcnM8L2g0PgotPHA+Q29sb3JzOiA8c3Ryb25nPiMzMzMzMzM8L3N0cm9uZz48YnIgLz4KLUVuYWJsZWQ6IDxzdHJvbmc+NjAlPC9zdHJvbmc+IG9wYWNpdHk8YnIgLz4KLURpc2FibGVkOiA8c3Ryb25nPjMwJTwvc3Ryb25nPiBvcGFjaXR5PC9wPgotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxwPkNvbG9yczogPHN0cm9uZz4jRkZGRkZGPC9zdHJvbmc+PGJyIC8+Ci1FbmFibGVkOiA8c3Ryb25nPjgwJTwvc3Ryb25nPiBvcGFjaXR5PGJyIC8+Ci1EaXNhYmxlZDogPHN0cm9uZz4zMCU8L3N0cm9uZz4gb3BhY2l0eTwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX2NvbG9ycy5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotPGgyIGlkPSJzbWFsbC1jb250ZXh0dWFsIj5TbWFsbCAvIENvbnRleHR1YWwgSWNvbnM8L2gyPgotCi08cD5XaXRoaW4gdGhlIGJvZHkgb2YgeW91ciBhcHAsIHVzZSBzbWFsbCBpY29ucyB0byBzdXJmYWNlIGFjdGlvbnMgYW5kL29yIHByb3ZpZGUgc3RhdHVzIGZvciBzcGVjaWZpYwotaXRlbXMuIEZvciBleGFtcGxlLCBpbiB0aGUgR21haWwgYXBwLCBlYWNoIG1lc3NhZ2UgaGFzIGEgc3RhciBpY29uIHRoYXQgbWFya3MgdGhlIG1lc3NhZ2UgYXMKLWltcG9ydGFudC48L3A+Ci0KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfc21hbGxfc2l6ZS5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9zbWFsbF9mb2NhbC5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9zbWFsbF9zdHlsZS5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi0gICAgPGg0PlNpemVzICZhbXA7IHNjYWxlPC9oND4KLQotICAgIDx1bD4KLSAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgotICAgICAgICA8cD5TbWFsbCBpY29ucyBzaG91bGQgYmUgPHN0cm9uZz4xNngxNiA8YWNyb255bSB0aXRsZT0iRGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbHMuIE9uZSBkcCBpcyBvbmUgcGl4ZWwgb24gYSAxNjAgZHBpIHNjcmVlbi4iPmRwPC9hY3JvbnltPjwvc3Ryb25nPi48L3A+PC9saT4KLSAgICA8L3VsPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxoND5Gb2NhbCBhcmVhICZhbXA7IHByb3BvcnRpb25zPC9oND4KLQotICAgIDx1bD4KLSAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgotICAgICAgICA8cD5GdWxsIGFzc2V0LCA8c3Ryb25nPjE2eDE2IGRwPC9zdHJvbmc+PC9wPgotICAgICAgICA8cD5PcHRpY2FsIHNxdWFyZSwgPHN0cm9uZz4xMngxMiBkcDwvc3Ryb25nPjwvcD4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxoND5TdHlsZTwvaDQ+Ci08cD5OZXV0cmFsLCBmbGF0LCBhbmQgc2ltcGxlLiBGaWxsZWQgc2hhcGVzIGFyZSBlYXNpZXIgdG8gc2VlIHRoYW4gdGhpbiBzdHJva2VzLiBVc2UgYSBzaW5nbGUgdmlzdWFsCi1tZXRhcGhvciBzbyB0aGF0IGEgdXNlciBjYW4gZWFzaWx5IHJlY29nbml6ZSBhbmQgdW5kZXJzdGFuZCBpdHMgcHVycG9zZS48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9zbWFsbF9jb2xvcnMucG5nIj4KLQotICAgIDxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgotCi08aDQ+Q29sb3JzPC9oND4KLTxwPlVzZSBub24tbmV1dHJhbCBjb2xvcnMgc3BhcmluZ2x5IGFuZCB3aXRoIHB1cnBvc2UuIEZvciBleGFtcGxlLCBHbWFpbCB1c2VzIHllbGxvdyBpbiB0aGUgc3RhciBpY29uCi10byBpbmRpY2F0ZSBhIGJvb2ttYXJrZWQgbWVzc2FnZS4gSWYgYW4gaWNvbiBpcyBhY3Rpb25hYmxlLCBjaG9vc2UgYSBjb2xvciB0aGF0IGNvbnRyYXN0cyB3ZWxsIHdpdGgKLXRoZSBiYWNrZ3JvdW5kLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfc21hbGxfZXhhbXBsZS5wbmciPgotCi0gIDwvZGl2PgotICA8IS0tIDIgZnJlZSBjb2x1bW5zIC0tPgotPC9kaXY+Ci0KLQotPGgyIGlkPSJub3RpZmljYXRpb24iPk5vdGlmaWNhdGlvbiBJY29uczwvaDI+Ci0KLTxwPklmIHlvdXIgYXBwIGdlbmVyYXRlcyBub3RpZmljYXRpb25zLCBwcm92aWRlIGFuIGljb24gdGhhdCB0aGUgc3lzdGVtIGNhbiBkaXNwbGF5IGluIHRoZSBzdGF0dXMgYmFyCi13aGVuZXZlciBhIG5ldyBub3RpZmljYXRpb24gaXMgYXZhaWxhYmxlLjwvcD4KLQotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fc2l6ZS5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fZm9jYWwucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvaWNvbm9ncmFwaHlfbm90aWZpY2F0aW9uX3N0eWxlLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aDQ+U2l6ZXMgJmFtcDsgc2NhbGU8L2g0PgotCi0gICAgPHVsPgotICAgICAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIHRhYmxldCI+Ci0gICAgICAgIDxwPk5vdGlmaWNhdGlvbiBpY29ucyBtdXN0IGJlIDxzdHJvbmc+MjR4MjQgPGFjcm9ueW0gdGl0bGU9IkRlbnNpdHktaW5kZXBlbmRlbnQgcGl4ZWxzLiBPbmUgZHAgaXMgb25lIHBpeGVsIG9uIGEgMTYwIGRwaSBzY3JlZW4uIj5kcDwvYWNyb255bT48L3N0cm9uZz4uPC9wPjwvbGk+Ci0gICAgPC91bD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLSAgICA8aDQ+Rm9jYWwgYXJlYSAmYW1wOyBwcm9wb3J0aW9uczwvaDQ+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gdGFibGV0Ij4KLSAgICAgICAgPHA+RnVsbCBhc3NldCwgPHN0cm9uZz4yNHgyNCBkcDwvc3Ryb25nPjwvcD4KLSAgICAgICAgPHA+T3B0aWNhbCBzcXVhcmUsIDxzdHJvbmc+MjJ4MjIgZHA8L3N0cm9uZz48L3A+Ci0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotCi08aDQ+U3R5bGU8L2g0PgotPHA+S2VlcCB0aGUgc3R5bGUgZmxhdCBhbmQgc2ltcGxlLCB1c2luZyB0aGUgc2FtZSBzaW5nbGUsIHZpc3VhbCBtZXRhcGhvciBhcyB5b3VyIGxhdW5jaGVyIGljb24uPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxoND5Db2xvcnM8L2g0PgotPHA+Tm90aWZpY2F0aW9uIGljb25zIG11c3QgYmUgZW50aXJlbHkgd2hpdGUuIEFsc28sIHRoZSBzeXN0ZW0gbWF5IHNjYWxlIGRvd24gYW5kL29yIGRhcmtlbiB0aGUgaWNvbnMuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fZXhhbXBsZS5wbmciPgotCi0gIDwvZGl2PgotICA8IS0tIDIgZnJlZSBjb2x1bW5zIC0tPgotPC9kaXY+Ci0KLQotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtZm9vdGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4mbmJzcDs8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0gICAgICAgIDwvZGl2PgotCi0gICAgICA8L2Rpdj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1mb290ZXIiPgotCi0gICAgICAgIDxwIGlkPSJjb3B5cmlnaHQiPgotICAgICAgICAgIEV4Y2VwdCBhcyBub3RlZCwgdGhpcyBjb250ZW50IGlzIGxpY2Vuc2VkIHVuZGVyCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMi41LyI+Ci0gICAgICAgICAgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjU8L2E+Ljxicj4KLSAgICAgICAgICBGb3IgZGV0YWlscyBhbmQgcmVzdHJpY3Rpb25zLCBzZWUgdGhlCi0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9saWNlbnNlLmh0bWwiPkNvbnRlbnQgTGljZW5zZTwvYT4uCi0gICAgICAgIDwvcD4KLQotICAgICAgICA8cD4KLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3Rlcm1zLmh0bWwiPlNpdGUgVGVybXMgb2YgU2VydmljZTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vcHJpdmFjeS5odG1sIj5Qcml2YWN5IFBvbGljeTwvYT4gJm5kYXNoOwotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QnJhbmQgR3VpZGVsaW5lczwvYT4KLSAgICAgICAgPC9wPgotCi0gICAgICA8L2Rpdj4KLSAgICA8L2Rpdj4KLQotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvanF1ZXJ5LTEuNi4yLm1pbi5qcyI+PC9zY3JpcHQ+Ci0gICAgPHNjcmlwdD4KLSAgICB2YXIgU0lURV9ST09UID0gJy4uLyc7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KLQotCi0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBnYUpzSG9zdCA9ICgoImh0dHBzOiIgPT0gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2wpID8gImh0dHBzOi8vc3NsLiIgOiAiaHR0cDovL3d3dy4iKTsKLSAgICBkb2N1bWVudC53cml0ZSh1bmVzY2FwZSgiJTNDc2NyaXB0IHNyYz0nIiArIGdhSnNIb3N0ICsgImdvb2dsZS1hbmFseXRpY3MuY29tL2dhLmpzJyB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnJTNFJTNDL3NjcmlwdCUzRSIpKTsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIHBhZ2VUcmFja2VyID0gX2dhdC5fZ2V0VHJhY2tlcigiVUEtNTgzMTE1NS0xIik7Ci0gICAgcGFnZVRyYWNrZXIuX3RyYWNrUGFnZXZpZXcoKTsKLSAgICA8L3NjcmlwdD4KLSAgPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS9pY29ub2dyYXBoeS5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvaWNvbm9ncmFwaHkuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1ZTQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvaWNvbm9ncmFwaHkuamQKQEAgLTAsMCArMSwzNDAgQEAKK3BhZ2UudGl0bGU9SWNvbm9ncmFwaHkKK0BqZDpib2R5CisKKzxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X292ZXJ2aWV3LnBuZyI+CisKKzxwPkFuIGljb24gaXMgYSBncmFwaGljIHRoYXQgdGFrZXMgdXAgYSBzbWFsbCBwb3J0aW9uIG9mIHNjcmVlbiByZWFsIGVzdGF0ZSBhbmQgcHJvdmlkZXMgYSBxdWljaywKK2ludHVpdGl2ZSByZXByZXNlbnRhdGlvbiBvZiBhbiBhY3Rpb24sIGEgc3RhdHVzLCBvciBhbiBhcHAuPC9wPgorCisKKworPGgyIGlkPSJsYXVuY2hlciI+TGF1bmNoZXI8L2gyPgorCis8cD5UaGUgbGF1bmNoZXIgaWNvbiBpcyB0aGUgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIHlvdXIgYXBwIG9uIHRoZSBIb21lIG9yIEFsbCBBcHBzIHNjcmVlbi4gU2luY2UgdGhlCit1c2VyIGNhbiBjaGFuZ2UgdGhlIEhvbWUgc2NyZWVuJ3Mgd2FsbHBhcGVyLCBtYWtlIHN1cmUgdGhhdCB5b3VyIGxhdW5jaGVyIGljb24gaXMgY2xlYXJseSB2aXNpYmxlIG9uCithbnkgdHlwZSBvZiBiYWNrZ3JvdW5kLjwvcD4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9sYXVuY2hlcl9zaXplLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZm9jYWwucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9sYXVuY2hlcl9zdHlsZS5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGg0PlNpemVzICZhbXA7IHNjYWxlPC9oND4KKworICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgorICAgICAgICA8cD5MYXVuY2hlciBpY29ucyBvbiBhIG1vYmlsZSBkZXZpY2UgbXVzdCBiZSA8c3Ryb25nPjQ4eDQ4IDxhY3JvbnltIHRpdGxlPSJEZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscy4gT25lIGRwIGlzIG9uZSBwaXhlbCBvbiBhIDE2MCBkcGkgc2NyZWVuLiI+ZHA8L2Fjcm9ueW0+PC9zdHJvbmc+LjwvcD48L2xpPgorICAgICAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIHdlYiI+CisgICAgICAgIDxwPkxhdW5jaGVyIGljb25zIGZvciBkaXNwbGF5IG9uIEdvb2dsZSBQbGF5IG11c3QgYmUgPHN0cm9uZz41MTJ4NTEyIHBpeGVsczwvc3Ryb25nPi48L3A+PC9saT4KKyAgICA8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxoND5Qcm9wb3J0aW9uczwvaDQ+CisKKyAgICA8dWw+CisgICAgICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gdGFibGV0Ij4KKyAgICAgICAgPHA+RnVsbCBhc3NldCwgPHN0cm9uZz40OHg0OCBkcDwvc3Ryb25nPjwvcD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxoND5TdHlsZTwvaDQ+Cis8cD5Vc2UgYSBkaXN0aW5jdCBzaWxob3VldHRlLiBUaHJlZS1kaW1lbnNpb25hbCwgZnJvbnQgdmlldywgd2l0aCBhIHNsaWdodCBwZXJzcGVjdGl2ZSBhcyBpZiB2aWV3ZWQKK2Zyb20gYWJvdmUsIHNvIHRoYXQgdXNlcnMgcGVyY2VpdmUgc29tZSBkZXB0aC48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKyAgICAmbmJzcDsKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTciPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfbGF1bmNoZXJfZXhhbXBsZS5wbmciPgorCisgIDwvZGl2PgorICA8IS0tIDIgZnJlZSBjb2x1bW5zIC0tPgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTEyIj4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X2xhdW5jaGVyX2V4YW1wbGUyLnBuZyI+CisKKyAgICA8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworICA8L2Rpdj4KKyAgPCEtLSAxIGZyZWUgY29sdW1ucyAtLT4KKzwvZGl2PgorCisKKzxoMiBpZD0iYWN0aW9uLWJhciI+QWN0aW9uIEJhcjwvaDI+CisKKzxwPgorCitBY3Rpb24gYmFyIGljb25zIGFyZSBncmFwaGljIGJ1dHRvbnMgdGhhdCByZXByZXNlbnQgdGhlIG1vc3QgaW1wb3J0YW50IGFjdGlvbnMgcGVvcGxlIGNhbiB0YWtlCit3aXRoaW4geW91ciBhcHAuIEVhY2ggb25lIHNob3VsZCBlbXBsb3kgYSBzaW1wbGUgbWV0YXBob3IgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNvbmNlcHQgdGhhdCBtb3N0CitwZW9wbGUgY2FuIGdyYXNwIGF0IGEgZ2xhbmNlLgorCis8L3A+Cis8cD4KKworUHJlLWRlZmluZWQgZ2x5cGhzIHNob3VsZCBiZSB1c2VkIGZvciBjZXJ0YWluIGNvbW1vbiBhY3Rpb25zIHN1Y2ggYXMgInJlZnJlc2giIGFuZCAic2hhcmUuIiBUaGUKK2Rvd25sb2FkIGxpbmsgYmVsb3cgcHJvdmlkZXMgYSBwYWNrYWdlIHdpdGggaWNvbnMgdGhhdCBhcmUgc2NhbGVkIGZvciB2YXJpb3VzIHNjcmVlbiBkZW5zaXRpZXMgYW5kCithcmUgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSBIb2xvIExpZ2h0IGFuZCBIb2xvIERhcmsgdGhlbWVzLiBUaGUgcGFja2FnZSBhbHNvIGluY2x1ZGVzIHVuc3R5bGVkCitpY29ucyB0aGF0IHlvdSBjYW4gbW9kaWZ5IHRvIG1hdGNoIHlvdXIgdGhlbWUsIGluIGFkZGl0aW9uIHRvIEFkb2JlJnJlZzsgSWxsdXN0cmF0b3ImcmVnOyBzb3VyY2UKK2ZpbGVzIGZvciBmdXJ0aGVyIGN1c3RvbWl6YXRpb24uCisKKzwvcD4KKzxwPgorCis8YSBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL0FuZHJvaWRfRGVzaWduX0ljb25zXzIwMTIwMjI5LnppcCI+RG93bmxvYWQgdGhlIEFjdGlvbiBCYXIgSWNvbiBQYWNrPC9hPgorCis8L3A+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX3NpemUucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfZm9jYWwucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9hY3Rpb25iYXJfc3R5bGUucG5nIj4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxoND5TaXplcyAmYW1wOyBzY2FsZTwvaDQ+CisKKyAgICA8dWw+CisgICAgICA8bGkgY2xhc3M9Im5vLWJ1bGxldCB3aXRoLWljb24gdGFibGV0Ij4KKyAgICAgICAgPHA+QWN0aW9uIGJhciBpY29ucyBmb3IgcGhvbmVzIHNob3VsZCBiZSA8c3Ryb25nPjMyeDMyIDxhY3JvbnltIHRpdGxlPSJEZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscy4gT25lIGRwIGlzIG9uZSBwaXhlbCBvbiBhIDE2MCBkcGkgc2NyZWVuLiI+ZHA8L2Fjcm9ueW0+PC9zdHJvbmc+LjwvcD48L2xpPgorICAgIDwvdWw+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGg0PkZvY2FsIGFyZWEgJmFtcDsgcHJvcG9ydGlvbnM8L2g0PgorCisgICAgPHVsPgorICAgICAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIHRhYmxldCI+CisgICAgICAgIDxwPkZ1bGwgYXNzZXQsIDxzdHJvbmc+MzJ4MzIgZHA8L3N0cm9uZz48L3A+CisgICAgICAgIDxwPk9wdGljYWwgc3F1YXJlLCA8c3Ryb25nPjI0eDI0IGRwPC9zdHJvbmc+PC9wPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPGg0PlN0eWxlPC9oND4KKzxwPlBpY3RvZ3JhcGhpYywgZmxhdCwgbm90IHRvbyBkZXRhaWxlZCwgd2l0aCBzbW9vdGggY3VydmVzIG9yIHNoYXJwIHNoYXBlcy4gSWYgdGhlIGdyYXBoaWMgaXMgdGhpbiwKK3JvdGF0ZSBpdCA0NSZkZWc7IGxlZnQgb3IgcmlnaHQgdG8gZmlsbCB0aGUgZm9jYWwgc3BhY2UuIFRoZSB0aGlja25lc3Mgb2YgdGhlIHN0cm9rZXMgYW5kIG5lZ2F0aXZlCitzcGFjZXMgc2hvdWxkIGJlIGEgbWluaW11bSBvZiAyIGRwLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTMiPgorCis8aDQ+Q29sb3JzPC9oND4KKzxwPkNvbG9yczogPHN0cm9uZz4jMzMzMzMzPC9zdHJvbmc+PGJyIC8+CitFbmFibGVkOiA8c3Ryb25nPjYwJTwvc3Ryb25nPiBvcGFjaXR5PGJyIC8+CitEaXNhYmxlZDogPHN0cm9uZz4zMCU8L3N0cm9uZz4gb3BhY2l0eTwvcD4KKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgorCis8cD5Db2xvcnM6IDxzdHJvbmc+I0ZGRkZGRjwvc3Ryb25nPjxiciAvPgorRW5hYmxlZDogPHN0cm9uZz44MCU8L3N0cm9uZz4gb3BhY2l0eTxiciAvPgorRGlzYWJsZWQ6IDxzdHJvbmc+MzAlPC9zdHJvbmc+IG9wYWNpdHk8L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfYWN0aW9uYmFyX2NvbG9ycy5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKworPGgyIGlkPSJzbWFsbC1jb250ZXh0dWFsIj5TbWFsbCAvIENvbnRleHR1YWwgSWNvbnM8L2gyPgorCis8cD5XaXRoaW4gdGhlIGJvZHkgb2YgeW91ciBhcHAsIHVzZSBzbWFsbCBpY29ucyB0byBzdXJmYWNlIGFjdGlvbnMgYW5kL29yIHByb3ZpZGUgc3RhdHVzIGZvciBzcGVjaWZpYworaXRlbXMuIEZvciBleGFtcGxlLCBpbiB0aGUgR21haWwgYXBwLCBlYWNoIG1lc3NhZ2UgaGFzIGEgc3RhciBpY29uIHRoYXQgbWFya3MgdGhlIG1lc3NhZ2UgYXMKK2ltcG9ydGFudC48L3A+CisKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9zaXplLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvaWNvbm9ncmFwaHlfc21hbGxfZm9jYWwucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9zbWFsbF9zdHlsZS5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGg0PlNpemVzICZhbXA7IHNjYWxlPC9oND4KKworICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgorICAgICAgICA8cD5TbWFsbCBpY29ucyBzaG91bGQgYmUgPHN0cm9uZz4xNngxNiA8YWNyb255bSB0aXRsZT0iRGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbHMuIE9uZSBkcCBpcyBvbmUgcGl4ZWwgb24gYSAxNjAgZHBpIHNjcmVlbi4iPmRwPC9hY3JvbnltPjwvc3Ryb25nPi48L3A+PC9saT4KKyAgICA8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxoND5Gb2NhbCBhcmVhICZhbXA7IHByb3BvcnRpb25zPC9oND4KKworICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgorICAgICAgICA8cD5GdWxsIGFzc2V0LCA8c3Ryb25nPjE2eDE2IGRwPC9zdHJvbmc+PC9wPgorICAgICAgICA8cD5PcHRpY2FsIHNxdWFyZSwgPHN0cm9uZz4xMngxMiBkcDwvc3Ryb25nPjwvcD4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKzxoND5TdHlsZTwvaDQ+Cis8cD5OZXV0cmFsLCBmbGF0LCBhbmQgc2ltcGxlLiBGaWxsZWQgc2hhcGVzIGFyZSBlYXNpZXIgdG8gc2VlIHRoYW4gdGhpbiBzdHJva2VzLiBVc2UgYSBzaW5nbGUgdmlzdWFsCittZXRhcGhvciBzbyB0aGF0IGEgdXNlciBjYW4gZWFzaWx5IHJlY29nbml6ZSBhbmQgdW5kZXJzdGFuZCBpdHMgcHVycG9zZS48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X3NtYWxsX2NvbG9ycy5wbmciPgorCisgICAgPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+CisKKzxoND5Db2xvcnM8L2g0PgorPHA+VXNlIG5vbi1uZXV0cmFsIGNvbG9ycyBzcGFyaW5nbHkgYW5kIHdpdGggcHVycG9zZS4gRm9yIGV4YW1wbGUsIEdtYWlsIHVzZXMgeWVsbG93IGluIHRoZSBzdGFyIGljb24KK3RvIGluZGljYXRlIGEgYm9va21hcmtlZCBtZXNzYWdlLiBJZiBhbiBpY29uIGlzIGFjdGlvbmFibGUsIGNob29zZSBhIGNvbG9yIHRoYXQgY29udHJhc3RzIHdlbGwgd2l0aAordGhlIGJhY2tncm91bmQuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X3NtYWxsX2V4YW1wbGUucG5nIj4KKworICA8L2Rpdj4KKyAgPCEtLSAyIGZyZWUgY29sdW1ucyAtLT4KKzwvZGl2PgorCisKKzxoMiBpZD0ibm90aWZpY2F0aW9uIj5Ob3RpZmljYXRpb24gSWNvbnM8L2gyPgorCis8cD5JZiB5b3VyIGFwcCBnZW5lcmF0ZXMgbm90aWZpY2F0aW9ucywgcHJvdmlkZSBhbiBpY29uIHRoYXQgdGhlIHN5c3RlbSBjYW4gZGlzcGxheSBpbiB0aGUgc3RhdHVzIGJhcgord2hlbmV2ZXIgYSBuZXcgbm90aWZpY2F0aW9uIGlzIGF2YWlsYWJsZS48L3A+CisKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fc2l6ZS5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9mb2NhbC5wbmciPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2ljb25vZ3JhcGh5X25vdGlmaWNhdGlvbl9zdHlsZS5wbmciPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGg0PlNpemVzICZhbXA7IHNjYWxlPC9oND4KKworICAgIDx1bD4KKyAgICAgIDxsaSBjbGFzcz0ibm8tYnVsbGV0IHdpdGgtaWNvbiB0YWJsZXQiPgorICAgICAgICA8cD5Ob3RpZmljYXRpb24gaWNvbnMgbXVzdCBiZSA8c3Ryb25nPjI0eDI0IDxhY3JvbnltIHRpdGxlPSJEZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscy4gT25lIGRwIGlzIG9uZSBwaXhlbCBvbiBhIDE2MCBkcGkgc2NyZWVuLiI+ZHA8L2Fjcm9ueW0+PC9zdHJvbmc+LjwvcD48L2xpPgorICAgIDwvdWw+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCisgICAgPGg0PkZvY2FsIGFyZWEgJmFtcDsgcHJvcG9ydGlvbnM8L2g0PgorCisgICAgPHVsPgorICAgICAgPGxpIGNsYXNzPSJuby1idWxsZXQgd2l0aC1pY29uIHRhYmxldCI+CisgICAgICAgIDxwPkZ1bGwgYXNzZXQsIDxzdHJvbmc+MjR4MjQgZHA8L3N0cm9uZz48L3A+CisgICAgICAgIDxwPk9wdGljYWwgc3F1YXJlLCA8c3Ryb25nPjIyeDIyIGRwPC9zdHJvbmc+PC9wPgorICAgICAgPC9saT4KKyAgICA8L3VsPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KKworPGg0PlN0eWxlPC9oND4KKzxwPktlZXAgdGhlIHN0eWxlIGZsYXQgYW5kIHNpbXBsZSwgdXNpbmcgdGhlIHNhbWUgc2luZ2xlLCB2aXN1YWwgbWV0YXBob3IgYXMgeW91ciBsYXVuY2hlciBpY29uLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgorCisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCis8aDQ+Q29sb3JzPC9oND4KKzxwPk5vdGlmaWNhdGlvbiBpY29ucyBtdXN0IGJlIGVudGlyZWx5IHdoaXRlLiBBbHNvLCB0aGUgc3lzdGVtIG1heSBzY2FsZSBkb3duIGFuZC9vciBkYXJrZW4gdGhlIGljb25zLjwvcD4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9pY29ub2dyYXBoeV9ub3RpZmljYXRpb25fZXhhbXBsZS5wbmciPgorCisgIDwvZGl2PgorICA8IS0tIDIgZnJlZSBjb2x1bW5zIC0tPgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2luZGV4Lmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YWM1OGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS9pbmRleC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIERlc2lnbiBFbGVtZW50cwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi08c3R5bGU+Ci0jbGFuZGluZy1ncmFwaGljLWNvbnRhaW5lciB7Ci0gIHBvc2l0aW9uOiByZWxhdGl2ZTsKLX0KLQotI3RleHQtb3ZlcmxheSB7Ci0gIHBvc2l0aW9uOiBhYnNvbHV0ZTsKLSAgbGVmdDogMTBweDsKLSAgdG9wOiA0MDJweDsKLSAgd2lkdGg6IDIyMHB4OwotfQotPC9zdHlsZT4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIganVzdC1saW5rcyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gIDwvZGl2PgotPC9kaXY+Ci0KLQotICAgICAgICAgIAotCi08ZGl2IGlkPSJsYW5kaW5nLWdyYXBoaWMtY29udGFpbmVyIj4KLSAgPGRpdiBpZD0idGV4dC1vdmVybGF5Ij4KLSAgICBCdWlsZCB2aXN1YWxseSBjb21wZWxsaW5nIGFwcHMgdGhhdCBsb29rIGdyZWF0IG9uIGFueSBkZXZpY2UuIAotICAgIDxicj48YnI+Ci0gICAgPGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIiBjbGFzcz0ibGFuZGluZy1wYWdlLWxpbmsiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPgotICA8L2Rpdj4KLQotICA8YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPgotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9kZXNpZ25fZWxlbWVudHNfbGFuZGluZy5wbmciPgotICA8L2E+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLQotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvaW5kZXguamQgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2luZGV4LmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDZhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL2luZGV4LmpkCkBAIC0wLDAgKzEsMjkgQEAKK3BhZ2UudGl0bGU9U3R5bGUKK2hlYWRlci5qdXN0TGlua3M9MQorZm9vdGVyLmhpZGU9MQorQGpkOmJvZHkKKworPHN0eWxlPgorI2xhbmRpbmctZ3JhcGhpYy1jb250YWluZXIgeworICBwb3NpdGlvbjogcmVsYXRpdmU7Cit9CisKKyN0ZXh0LW92ZXJsYXkgeworICBwb3NpdGlvbjogYWJzb2x1dGU7CisgIGxlZnQ6IDEwcHg7CisgIHRvcDogNDAycHg7CisgIHdpZHRoOiAyMjBweDsKK30KKzwvc3R5bGU+CisKKzxkaXYgaWQ9ImxhbmRpbmctZ3JhcGhpYy1jb250YWluZXIiPgorICA8ZGl2IGlkPSJ0ZXh0LW92ZXJsYXkiPgorICAgIEJ1aWxkIHZpc3VhbGx5IGNvbXBlbGxpbmcgYXBwcyB0aGF0IGxvb2sgZ3JlYXQgb24gYW55IGRldmljZS4gCisgICAgPGJyPjxicj4KKyAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9ZGVzaWduL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCIgY2xhc3M9ImxhbmRpbmctcGFnZS1saW5rIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT4KKyAgPC9kaXY+CisKKyAgPGEgaHJlZj0ie0Bkb2NSb290fWRlc2lnbi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPgorICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL2Rlc2lnbl9lbGVtZW50c19sYW5kaW5nLnBuZyI+CisgIDwvYT4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiOWRkMC4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBNZXRyaWNzIGFuZCBHcmlkcwotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5NZXRyaWNzIGFuZCBHcmlkczwvaDI+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhZ2luZy1saW5rcyBsYXlvdXQtY29udGVudC1jb2wgc3Bhbi00Ij4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9InByZXYtcGFnZS1saW5rIj5QcmV2aW91czwvYT4KLSAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9Im5leHQtcGFnZS1saW5rIj5OZXh0PC9hPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgCi0KLSAgICAgICAgICAKLQotPHA+RGV2aWNlcyB2YXJ5IG5vdCBvbmx5IGluIHBoeXNpY2FsIHNpemUsIGJ1dCBhbHNvIGluIHNjcmVlbiBkZW5zaXR5ICg8YWNyb255bSB0aXRsZT0iRG90cyBwZXIKLWluY2giPkRQSTwvYWNyb255bT4pLiBUbyBzaW1wbGlmeSB0aGUgd2F5IHlvdSBkZXNpZ24gZm9yIG11bHRpcGxlIHNjcmVlbnMsIHRoaW5rIG9mIGVhY2ggZGV2aWNlIGFzCi1mYWxsaW5nIGludG8gYSBwYXJ0aWN1bGFyIHNpemUgYnVja2V0IGFuZCBkZW5zaXR5IGJ1Y2tldC4gVGhlIHNpemUgYnVja2V0cyBhcmUgPGVtPmhhbmRzZXQ8L2VtPiAoc21hbGxlciB0aGFuCi02MDA8YWNyb255bSB0aXRsZT0iRGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbHMuIE9uZSBkcCBpcyBvbmUgcGl4ZWwgb24gYSAxNjAgZHBpCi1zY3JlZW4uIj5kcDwvYWNyb255bT4pIGFuZCA8ZW0+dGFibGV0PC9lbT4gKGxhcmdlciB0aGFuIG9yIGVxdWFsIDYwMGRwKS4gVGhlIGRlbnNpdHkgYnVja2V0cyBhcmUgPGFjcm9ueW0KLXRpdGxlPSJMb3cgZGVuc2l0eSAoMTIwIGRwaSkiPkxEUEk8L2Fjcm9ueW0+LCA8YWNyb255bSB0aXRsZT0iTWVkaXVtIGRlbnNpdHkgKDE2MAotZHBpKSI+TURQSTwvYWNyb255bT4sIDxhY3JvbnltIHRpdGxlPSJIaWdoIGRlbnNpdHkgKDI0MCBkcGkpIj5IRFBJPC9hY3JvbnltPiwgYW5kIDxhY3JvbnltIHRpdGxlCi09IkV4dHJhLWhpZ2ggZGVuc2l0eSAoMzIwIGRwaSkiPlhIRFBJPC9hY3JvbnltPi4gT3B0aW1pemUgeW91ciBhcHBsaWNhdGlvbidzIFVJIGJ5IGRlc2lnbmluZwotYWx0ZXJuYXRpdmUgbGF5b3V0cyBmb3Igc29tZSBvZiB0aGUgZGlmZmVyZW50IHNpemUgYnVja2V0cywgYW5kIHByb3ZpZGUgYWx0ZXJuYXRpdmUgYml0bWFwIGltYWdlcwotZm9yIGRpZmZlcmVudCBkZW5zaXR5IGJ1Y2tldHMuPC9wPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi04Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9tZXRyaWNzX2RpYWdyYW0ucG5nIj4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+Ci0KLTxoND5TcGFjZSBjb25zaWRlcmF0aW9uczwvaDQ+Ci08cD5EZXZpY2VzIHZhcnkgaW4gdGhlIGFtb3VudCBvZiBkZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscyAoZHApIHRoZXkgY2FuIGRpc3BsYXkuPC9wPgotPHA+VG8gc2VlIG1vcmUsIHZpc2l0IHRoZQotPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPgotU2NyZWVuIFNpemVzIGFuZCBEZW5zaXRpZXMgRGV2aWNlIERhc2hib2FyZDwvYT4uPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxoMiBpZD0iNDhkcC1yaHl0aG0iPjQ4ZHAgUmh5dGhtPC9oMj4KLQotPHA+VG91Y2hhYmxlIFVJIGNvbXBvbmVudHMgYXJlIGdlbmVyYWxseSBsYWlkIG91dCBhbG9uZyA0OGRwIHVuaXRzLjwvcD4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L21ldHJpY3NfNDgucG5nIj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxoND5XaHkgNDhkcD88L2g0PgotPHA+T24gYXZlcmFnZSwgNDhkcCB0cmFuc2xhdGUgdG8gYSBwaHlzaWNhbCBzaXplIG9mIGFib3V0IDltbSAod2l0aCBzb21lIHZhcmlhYmlsaXR5KS4gVGhpcyBpcwotY29tZm9ydGFibHkgaW4gdGhlIHJhbmdlIG9mIHJlY29tbWVuZGVkIHRhcmdldCBzaXplcyAoNy0xMCBtbSkgZm9yIHRvdWNoc2NyZWVuIG9iamVjdHMgYW5kIHVzZXJzCi13aWxsIGJlIGFibGUgdG8gcmVsaWFibHkgYW5kIGFjY3VyYXRlbHkgdGFyZ2V0IHRoZW0gd2l0aCB0aGVpciBmaW5nZXJzLjwvcD4KLTxwPklmIHlvdSBkZXNpZ24geW91ciBlbGVtZW50cyB0byBiZSBhdCBsZWFzdCA0OGRwIGhpZ2ggYW5kIHdpZGUgeW91IGNhbiBndWFyYW50ZWUgdGhhdDo8L3A+Ci08dWw+Ci08bGk+eW91ciB0YXJnZXRzIHdpbGwgbmV2ZXIgYmUgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHJlY29tbWVuZGVkIHRhcmdldCBzaXplIG9mIDdtbSByZWdhcmRsZXNzIG9mCi0gIHdoYXQgc2NyZWVuIHRoZXkgYXJlIGRpc3BsYXllZCBvbi48L2xpPgotPGxpPnlvdSBzdHJpa2UgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBvdmVyYWxsIGluZm9ybWF0aW9uIGRlbnNpdHkgb24gdGhlIG9uZSBoYW5kLCBhbmQKLSAgdGFyZ2V0YWJpbGl0eSBvZiBVSSBlbGVtZW50cyBvbiB0aGUgb3RoZXIuPC9saT4KLTwvdWw+Ci0KLTxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC9tZXRyaWNzX2Nsb3NldXAucG5nIj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMiI+Jm5ic3A7PC9kaXY+Ci0KLTxoND5NaW5kIHRoZSBnYXBzPC9oND4KLTxwPlNwYWNpbmcgYmV0d2VlbiBlYWNoIFVJIGVsZW1lbnQgaXMgOGRwLjwvcD4KLQotPGgyIGlkPSJleGFtcGxlcyI+RXhhbXBsZXM8L2gyPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvbWV0cmljc19mb3Jtcy5wbmciPgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvbWV0cmljcy1ncmlkcy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvbWV0cmljcy1ncmlkcy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmI5YWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS9tZXRyaWNzLWdyaWRzLmpkCkBAIC0wLDAgKzEsNjEgQEAKK3BhZ2UudGl0bGU9TWV0cmljcyBhbmQgR3JpZHMKK0BqZDpib2R5CisKKzxwPkRldmljZXMgdmFyeSBub3Qgb25seSBpbiBwaHlzaWNhbCBzaXplLCBidXQgYWxzbyBpbiBzY3JlZW4gZGVuc2l0eSAoPGFjcm9ueW0gdGl0bGU9IkRvdHMgcGVyCitpbmNoIj5EUEk8L2Fjcm9ueW0+KS4gVG8gc2ltcGxpZnkgdGhlIHdheSB5b3UgZGVzaWduIGZvciBtdWx0aXBsZSBzY3JlZW5zLCB0aGluayBvZiBlYWNoIGRldmljZSBhcworZmFsbGluZyBpbnRvIGEgcGFydGljdWxhciBzaXplIGJ1Y2tldCBhbmQgZGVuc2l0eSBidWNrZXQuIFRoZSBzaXplIGJ1Y2tldHMgYXJlIDxlbT5oYW5kc2V0PC9lbT4gKHNtYWxsZXIgdGhhbgorNjAwPGFjcm9ueW0gdGl0bGU9IkRlbnNpdHktaW5kZXBlbmRlbnQgcGl4ZWxzLiBPbmUgZHAgaXMgb25lIHBpeGVsIG9uIGEgMTYwIGRwaQorc2NyZWVuLiI+ZHA8L2Fjcm9ueW0+KSBhbmQgPGVtPnRhYmxldDwvZW0+IChsYXJnZXIgdGhhbiBvciBlcXVhbCA2MDBkcCkuIFRoZSBkZW5zaXR5IGJ1Y2tldHMgYXJlIDxhY3JvbnltCit0aXRsZT0iTG93IGRlbnNpdHkgKDEyMCBkcGkpIj5MRFBJPC9hY3JvbnltPiwgPGFjcm9ueW0gdGl0bGU9Ik1lZGl1bSBkZW5zaXR5ICgxNjAKK2RwaSkiPk1EUEk8L2Fjcm9ueW0+LCA8YWNyb255bSB0aXRsZT0iSGlnaCBkZW5zaXR5ICgyNDAgZHBpKSI+SERQSTwvYWNyb255bT4sIGFuZCA8YWNyb255bSB0aXRsZQorPSJFeHRyYS1oaWdoIGRlbnNpdHkgKDMyMCBkcGkpIj5YSERQSTwvYWNyb255bT4uIE9wdGltaXplIHlvdXIgYXBwbGljYXRpb24ncyBVSSBieSBkZXNpZ25pbmcKK2FsdGVybmF0aXZlIGxheW91dHMgZm9yIHNvbWUgb2YgdGhlIGRpZmZlcmVudCBzaXplIGJ1Y2tldHMsIGFuZCBwcm92aWRlIGFsdGVybmF0aXZlIGJpdG1hcCBpbWFnZXMKK2ZvciBkaWZmZXJlbnQgZGVuc2l0eSBidWNrZXRzLjwvcD4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOCI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS9tZXRyaWNzX2RpYWdyYW0ucG5nIj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKzxoND5TcGFjZSBjb25zaWRlcmF0aW9uczwvaDQ+Cis8cD5EZXZpY2VzIHZhcnkgaW4gdGhlIGFtb3VudCBvZiBkZW5zaXR5LWluZGVwZW5kZW50IHBpeGVscyAoZHApIHRoZXkgY2FuIGRpc3BsYXkuPC9wPgorPHA+VG8gc2VlIG1vcmUsIHZpc2l0IHRoZQorPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPgorU2NyZWVuIFNpemVzIGFuZCBEZW5zaXRpZXMgRGV2aWNlIERhc2hib2FyZDwvYT4uPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxoMiBpZD0iNDhkcC1yaHl0aG0iPjQ4ZHAgUmh5dGhtPC9oMj4KKworPHA+VG91Y2hhYmxlIFVJIGNvbXBvbmVudHMgYXJlIGdlbmVyYWxseSBsYWlkIG91dCBhbG9uZyA0OGRwIHVuaXRzLjwvcD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbWV0cmljc180OC5wbmciPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0yIj4mbmJzcDs8L2Rpdj4KKworPGg0PldoeSA0OGRwPzwvaDQ+Cis8cD5PbiBhdmVyYWdlLCA0OGRwIHRyYW5zbGF0ZSB0byBhIHBoeXNpY2FsIHNpemUgb2YgYWJvdXQgOW1tICh3aXRoIHNvbWUgdmFyaWFiaWxpdHkpLiBUaGlzIGlzCitjb21mb3J0YWJseSBpbiB0aGUgcmFuZ2Ugb2YgcmVjb21tZW5kZWQgdGFyZ2V0IHNpemVzICg3LTEwIG1tKSBmb3IgdG91Y2hzY3JlZW4gb2JqZWN0cyBhbmQgdXNlcnMKK3dpbGwgYmUgYWJsZSB0byByZWxpYWJseSBhbmQgYWNjdXJhdGVseSB0YXJnZXQgdGhlbSB3aXRoIHRoZWlyIGZpbmdlcnMuPC9wPgorPHA+SWYgeW91IGRlc2lnbiB5b3VyIGVsZW1lbnRzIHRvIGJlIGF0IGxlYXN0IDQ4ZHAgaGlnaCBhbmQgd2lkZSB5b3UgY2FuIGd1YXJhbnRlZSB0aGF0OjwvcD4KKzx1bD4KKzxsaT55b3VyIHRhcmdldHMgd2lsbCBuZXZlciBiZSBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gcmVjb21tZW5kZWQgdGFyZ2V0IHNpemUgb2YgN21tIHJlZ2FyZGxlc3Mgb2YKKyAgd2hhdCBzY3JlZW4gdGhleSBhcmUgZGlzcGxheWVkIG9uLjwvbGk+Cis8bGk+eW91IHN0cmlrZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIG92ZXJhbGwgaW5mb3JtYXRpb24gZGVuc2l0eSBvbiB0aGUgb25lIGhhbmQsIGFuZAorICB0YXJnZXRhYmlsaXR5IG9mIFVJIGVsZW1lbnRzIG9uIHRoZSBvdGhlci48L2xpPgorPC91bD4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbWV0cmljc19jbG9zZXVwLnBuZyI+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTIiPiZuYnNwOzwvZGl2PgorCis8aDQ+TWluZCB0aGUgZ2FwczwvaDQ+Cis8cD5TcGFjaW5nIGJldHdlZW4gZWFjaCBVSSBlbGVtZW50IGlzIDhkcC48L3A+CisKKzxoMiBpZD0iZXhhbXBsZXMiPkV4YW1wbGVzPC9oMj4KKworPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvbWV0cmljc19mb3Jtcy5wbmciPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS90aGVtZXMuaHRtbCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvdGhlbWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Mjk5NzguLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS90aGVtZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBUaGVtZXMKLSAgICA8L3RpdGxlPgotICAgIDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiIgdHlwZT0iaW1hZ2UveC1pY29uIiBocmVmPSIvZmF2aWNvbi5pY28iPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOnJlZ3VsYXIsbWVkaXVtLHRoaW4saXRhbGljLG1lZGl1bWl0YWxpYyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMveXVpLTMuMy4wLXJlc2V0LW1pbi5jc3MiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL2RlZmF1bHQuY3NzIj4KLQotICA8L2hlYWQ+Ci0gIDxib2R5PgotCi0gICAgPGRpdiBpZD0icGFnZS1jb250YWluZXIiPgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ248L2E+PC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9Im1haW4tcm93Ij4KLQotICAgICAgICA8dWwgaWQ9Im5hdiI+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+R2V0IFN0YXJ0ZWQ8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9jcmVhdGl2ZS12aXNpb24uaHRtbCI+Q3JlYXRpdmUgVmlzaW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC9wcmluY2lwbGVzLmh0bWwiPkRlc2lnbiBQcmluY2lwbGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9nZXQtc3RhcnRlZC91aS1vdmVydmlldy5odG1sIj5VSSBPdmVydmlldzwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3N0eWxlL2luZGV4Lmh0bWwiPlN0eWxlPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvZGV2aWNlcy1kaXNwbGF5cy5odG1sIj5EZXZpY2VzIGFuZCBEaXNwbGF5czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdGhlbWVzLmh0bWwiPlRoZW1lczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdG91Y2gtZmVlZGJhY2suaHRtbCI+VG91Y2ggRmVlZGJhY2s8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL21ldHJpY3MtZ3JpZHMuaHRtbCI+TWV0cmljcyBhbmQgR3JpZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3R5cG9ncmFwaHkuaHRtbCI+VHlwb2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvY29sb3IuaHRtbCI+Q29sb3I8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2ljb25vZ3JhcGh5Lmh0bWwiPkljb25vZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS93cml0aW5nLmh0bWwiPldyaXRpbmcgU3R5bGU8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9wYXR0ZXJucy9pbmRleC5odG1sIj5QYXR0ZXJuczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25ldy00LTAuaHRtbCI+TmV3IGluIEFuZHJvaWQgNC4wPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9nZXN0dXJlcy5odG1sIj5HZXN0dXJlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYXBwLXN0cnVjdHVyZS5odG1sIj5BcHAgU3RydWN0dXJlPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uYXZpZ2F0aW9uLmh0bWwiPk5hdmlnYXRpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FjdGlvbmJhci5odG1sIj5BY3Rpb24gQmFyPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9tdWx0aS1wYW5lLWxheW91dHMuaHRtbCI+TXVsdGktcGFuZSBMYXlvdXRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zd2lwZS12aWV3cy5odG1sIj5Td2lwZSBWaWV3czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc2VsZWN0aW9uLmh0bWwiPlNlbGVjdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbm90aWZpY2F0aW9ucy5odG1sIj5Ob3RpZmljYXRpb25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9jb21wYXRpYmlsaXR5Lmh0bWwiPkNvbXBhdGliaWxpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3B1cmUtYW5kcm9pZC5odG1sIj5QdXJlIEFuZHJvaWQ8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvaW5kZXguaHRtbCI+QnVpbGRpbmcgQmxvY2tzPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RhYnMuaHRtbCI+VGFiczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2xpc3RzLmh0bWwiPkxpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZ3JpZC1saXN0cy5odG1sIj5HcmlkIExpc3RzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Nyb2xsaW5nLmh0bWwiPlNjcm9sbGluZzwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NwaW5uZXJzLmh0bWwiPlNwaW5uZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvYnV0dG9ucy5odG1sIj5CdXR0b25zPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGV4dC1maWVsZHMuaHRtbCI+VGV4dCBGaWVsZHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zZWVrLWJhcnMuaHRtbCI+U2VlayBCYXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcHJvZ3Jlc3MuaHRtbCI+UHJvZ3Jlc3MgJmFtcDsgQWN0aXZpdHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zd2l0Y2hlcy5odG1sIj5Td2l0Y2hlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2RpYWxvZ3MuaHRtbCI+RGlhbG9nczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3BpY2tlcnMuaHRtbCI+UGlja2VyczwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIgZW1wdHkiPjxhIGhyZWY9Ii4uL2Rvd25sb2Fkcy9pbmRleC5odG1sIj5Eb3dubG9hZHM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxkaXYgaWQ9ImJhY2stZGFjLXNlY3Rpb24iPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkRldmVsb3BlcnM8L2E+PC9kaXY+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICA8L3VsPgotCi0gICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgotCi0gICAgICAgICAgCi0gICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93IGNvbnRlbnQtaGVhZGVyIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgotICAgICAgICAgICAgICA8aDI+VGhlbWVzPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90aGVtZXNfaG9sb19saWdodC5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIEdtYWlsIGluIEhvbG8gTGlnaHQuCi0gICAgPC9kaXY+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdGhlbWVzX2hvbG9fZGFyay5wbmciPgotICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KLSAgICAgIFNldHRpbmdzIGluIEhvbG8gRGFyay4KLSAgICA8L2Rpdj4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90aGVtZXNfaG9sb19pbnZlcnNlLnBuZyI+Ci0gICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICAgICAgVGFsayBpbiBIb2xvIExpZ2h0IHdpdGggZGFyayBhY3Rpb24gYmFyLgotICAgIDwvZGl2PgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPHA+VGhlbWVzIGFyZSBBbmRyb2lkJ3MgbWVjaGFuaXNtIGZvciBhcHBseWluZyBhIGNvbnNpc3RlbnQgc3R5bGUgdG8gYW4gYXBwIG9yIGFjdGl2aXR5LiBUaGUgc3R5bGUKLXNwZWNpZmllcyB0aGUgdmlzdWFsIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnRzIHRoYXQgbWFrZSB1cCB5b3VyIHVzZXIgaW50ZXJmYWNlLCBzdWNoIGFzIGNvbG9yLAotaGVpZ2h0LCBwYWRkaW5nIGFuZCBmb250IHNpemUuIFRvIHByb21vdGUgZ3JlYXRlciBjb2hlc2lvbiBiZXR3ZWVuIGFsbCBhcHBzIG9uIHRoZSBwbGF0Zm9ybSwgQW5kcm9pZAotcHJvdmlkZXMgdGhyZWUgc3lzdGVtIHRoZW1lcyB0aGF0IHlvdSBjYW4gY2hvb3NlIGZyb20gd2hlbiBidWlsZGluZyBhcHBzIGZvciBJY2UgQ3JlYW0gU2FuZHdpY2g6PC9wPgotPHVsPgotPGxpPkhvbG8gTGlnaHQ8L2xpPgotPGxpPkhvbG8gRGFyazwvbGk+Ci08bGk+SG9sbyBMaWdodCB3aXRoIGRhcmsgYWN0aW9uIGJhcnM8L2xpPgotPC91bD4KLTxwPkFwcGx5aW5nIHRoZXNlIHRoZW1lcyB3aWxsIGdvIGEgbG9uZyB3YXkgaW4gaGVscGluZyB5b3UgdG8gYnVpbGQgYXBwcyB0aGF0IGZpdCByaWdodCBpbnRvIHRoZQotZ2VuZXJhbCB2aXN1YWwgbGFuZ3VhZ2Ugb2YgQW5kcm9pZC48L3A+Ci08cD5QaWNrIHRoZSBzeXN0ZW0gdGhlbWUgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIG5lZWRzIGFuZCBkZXNpZ24gYWVzdGhldGljcyBmb3IgeW91ciBhcHAuIElmIHlvdXIKLWRlc2lyZSBpcyB0byBoYXZlIGEgbW9yZSBkaXN0aW5jdCBsb29rIGZvciB5b3VyIGFwcCwgdXNpbmcgb25lIG9mIHRoZSBzeXN0ZW0gdGhlbWVzIGFzIGEgc3RhcnRpbmcKLXBvaW50IGZvciB5b3VyIGN1c3RvbWl6YXRpb25zIGlzIGEgZ29vZCBpZGVhLiBUaGUgc3lzdGVtIHRoZW1lcyBwcm92aWRlIGEgc29saWQgZm91bmRhdGlvbiBvbiB0b3AKLW9mIHdoaWNoIHlvdSBjYW4gc2VsZWN0aXZlbHkgaW1wbGVtZW50IHlvdXIgb3duIHZpc3VhbCBzdHlsaW5ncy48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3RoZW1lcy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvdGhlbWVzLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTZhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3RoZW1lcy5qZApAQCAtMCwwICsxLDQyIEBACitwYWdlLnRpdGxlPVRoZW1lcworQGpkOmJvZHkKKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNSI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90aGVtZXNfaG9sb19saWdodC5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIEdtYWlsIGluIEhvbG8gTGlnaHQuCisgICAgPC9kaXY+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90aGVtZXNfaG9sb19kYXJrLnBuZyI+CisgICAgPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgorICAgICAgU2V0dGluZ3MgaW4gSG9sbyBEYXJrLgorICAgIDwvZGl2PgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdGhlbWVzX2hvbG9faW52ZXJzZS5wbmciPgorICAgIDxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgICAgIFRhbGsgaW4gSG9sbyBMaWdodCB3aXRoIGRhcmsgYWN0aW9uIGJhci4KKyAgICA8L2Rpdj4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNyI+CisKKzxwPlRoZW1lcyBhcmUgQW5kcm9pZCdzIG1lY2hhbmlzbSBmb3IgYXBwbHlpbmcgYSBjb25zaXN0ZW50IHN0eWxlIHRvIGFuIGFwcCBvciBhY3Rpdml0eS4gVGhlIHN0eWxlCitzcGVjaWZpZXMgdGhlIHZpc3VhbCBwcm9wZXJ0aWVzIG9mIHRoZSBlbGVtZW50cyB0aGF0IG1ha2UgdXAgeW91ciB1c2VyIGludGVyZmFjZSwgc3VjaCBhcyBjb2xvciwKK2hlaWdodCwgcGFkZGluZyBhbmQgZm9udCBzaXplLiBUbyBwcm9tb3RlIGdyZWF0ZXIgY29oZXNpb24gYmV0d2VlbiBhbGwgYXBwcyBvbiB0aGUgcGxhdGZvcm0sIEFuZHJvaWQKK3Byb3ZpZGVzIHRocmVlIHN5c3RlbSB0aGVtZXMgdGhhdCB5b3UgY2FuIGNob29zZSBmcm9tIHdoZW4gYnVpbGRpbmcgYXBwcyBmb3IgSWNlIENyZWFtIFNhbmR3aWNoOjwvcD4KKzx1bD4KKzxsaT5Ib2xvIExpZ2h0PC9saT4KKzxsaT5Ib2xvIERhcms8L2xpPgorPGxpPkhvbG8gTGlnaHQgd2l0aCBkYXJrIGFjdGlvbiBiYXJzPC9saT4KKzwvdWw+Cis8cD5BcHBseWluZyB0aGVzZSB0aGVtZXMgd2lsbCBnbyBhIGxvbmcgd2F5IGluIGhlbHBpbmcgeW91IHRvIGJ1aWxkIGFwcHMgdGhhdCBmaXQgcmlnaHQgaW50byB0aGUKK2dlbmVyYWwgdmlzdWFsIGxhbmd1YWdlIG9mIEFuZHJvaWQuPC9wPgorPHA+UGljayB0aGUgc3lzdGVtIHRoZW1lIHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBuZWVkcyBhbmQgZGVzaWduIGFlc3RoZXRpY3MgZm9yIHlvdXIgYXBwLiBJZiB5b3VyCitkZXNpcmUgaXMgdG8gaGF2ZSBhIG1vcmUgZGlzdGluY3QgbG9vayBmb3IgeW91ciBhcHAsIHVzaW5nIG9uZSBvZiB0aGUgc3lzdGVtIHRoZW1lcyBhcyBhIHN0YXJ0aW5nCitwb2ludCBmb3IgeW91ciBjdXN0b21pemF0aW9ucyBpcyBhIGdvb2QgaWRlYS4gVGhlIHN5c3RlbSB0aGVtZXMgcHJvdmlkZSBhIHNvbGlkIGZvdW5kYXRpb24gb24gdG9wCitvZiB3aGljaCB5b3UgY2FuIHNlbGVjdGl2ZWx5IGltcGxlbWVudCB5b3VyIG93biB2aXN1YWwgc3R5bGluZ3MuPC9wPgorCisgIDwvZGl2PgorPC9kaXY+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYzA4ZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sPgotPGh0bWwgbGFuZz0iZW4iPgotICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci0gICAgPHRpdGxlPgotCi1BbmRyb2lkIERlc2lnbiAtIFRvdWNoIEZlZWRiYWNrCi0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlRvdWNoIEZlZWRiYWNrPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAtMTAwcHgiPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KLQotPHA+VXNlIGNvbG9yIGFuZCBpbGx1bWluYXRpb24gdG8gcmVzcG9uZCB0byB0b3VjaGVzLCByZWluZm9yY2UgdGhlIHJlc3VsdGluZyBiZWhhdmlvcnMgb2YgZ2VzdHVyZXMsIGFuZAotaW5kaWNhdGUgd2hhdCBhY3Rpb25zIGFyZSBlbmFibGVkIGFuZCBkaXNhYmxlZC48L3A+Ci08cD5XaGVuZXZlciBhIHVzZXIgdG91Y2hlcyBhbiBhY3Rpb25hYmxlIGFyZWEgaW4geW91ciBhcHAsIHByb3ZpZGUgYSB2aXN1YWwgcmVzcG9uc2UuIFRoaXMgbGV0cyB0aGUKLXVzZXIga25vdyB3aGljaCBvYmplY3Qgd2FzIHRvdWNoZWQgYW5kIHRoYXQgeW91ciBhcHAgaXMgImxpc3RlbmluZyIuPC9wPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90b3VjaF9mZWVkYmFja19yZWFjdGlvbl9yZXNwb25zZS5wbmciPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxoND5TdGF0ZXM8L2g0PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KLQotPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3RvdWNoX2ZlZWRiYWNrX3N0YXRlcy5wbmciPgotPGRpdiBjbGFzcz0iZmlndXJlLWNhcHRpb24iPgotICBNb3N0IG9mIEFuZHJvaWQncyBVSSBlbGVtZW50cyBoYXZlIHRvdWNoLWZlZWRiYWNrIGJ1aWx0IGluLCBpbmNsdWRpbmcgc3RhdGVzIHRoYXQgaW5kaWNhdGUKLSAgd2hldGhlciB0b3VjaGluZyB0aGUgZWxlbWVudCB3aWxsIGhhdmUgYW55IGVmZmVjdC4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS00Ij4mbmJzcDs8L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0KLTxoND5Db21tdW5pY2F0aW9uPC9oND4KLTxwPldoZW4geW91ciBvYmplY3RzIHJlYWN0IHRvIG1vcmUgY29tcGxleCBnZXN0dXJlcywgaGVscCB1c2VycyB1bmRlcnN0YW5kIHdoYXQgdGhlIG91dGNvbWUgb2YgdGhlCi1vcGVyYXRpb24gd2lsbCBiZS4gRm9yIGV4YW1wbGUsIGluIFJlY2VudHMsIHdoZW4geW91IHN0YXJ0IHN3aXBpbmcgYSB0aHVtYm5haWwgbGVmdCBvciByaWdodCwgaXQKLXN0YXJ0cyB0byBkaW0uIFRoaXMgaGVscHMgdGhlIHVzZXIgdW5kZXJzdGFuZCB0aGF0IHN3aXBpbmcgd2lsbCBjYXVzZSB0aGUgaXRlbSB0byBiZSByZW1vdmVkLjwvcD4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdG91Y2hfZmVlZGJhY2tfbWFuaXB1bGF0aW9uLnBuZyI+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdG91Y2hfZmVlZGJhY2tfY29tbXVuaWNhdGlvbi5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMyI+Jm5ic3A7PC9kaXY+Ci0KLTxoND5Cb3VuZGFyaWVzPC9oND4KLTxwPldoZW4gdXNlcnMgdHJ5IHRvIHNjcm9sbCBwYXN0IHRoZSB1cHBlciBvciBsb3dlciBsaW1pdCBvZiBhIHNjcm9sbGFibGUgYXJlYSwgY29tbXVuaWNhdGUgdGhlCi1ib3VuZGFyeSB3aXRoIGEgdmlzdWFsIGN1ZS4gRm9yIGV4YW1wbGUsIGlmIGEgdXNlciBhdHRlbXB0cyB0byBzY3JvbGwgcGFzdCB0aGUgZmlyc3QgaG9tZSBzY3JlZW4KLXBhbmVsLCB0aGUgc2NyZWVuIGNvbnRlbnQgdGlsdHMgdG8gdGhlIHJpZ2h0IHRvIGluZGljYXRlIHRoYXQgZnVydGhlciBuYXZpZ2F0aW9uIGluIHRoaXMgZGlyZWN0aW9uCi1pcyBub3QgcG9zc2libGUuIE1hbnkgb2YgQW5kcm9pZCdzIHNjcm9sbGFibGUgVUkgd2lkZ2V0cyAoZS5nLiBsaXN0cyBvciBncmlkIGxpc3RzKSBhbHJlYWR5IGhhdmUKLXN1cHBvcnQgZm9yIGJvdW5kYXJ5IGZlZWRiYWNrIGJ1aWx0IGluLiBJZiB5b3UgYXJlIGJ1aWxkaW5nIGN1c3RvbSwga2VlcCBib3VuZGFyeSBmZWVkYmFjayBpbiBtaW5kCi1hbmQgcHJvdmlkZSBpdCBmcm9tIHdpdGhpbiB5b3VyIGFwcC48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmpkIGIvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS90b3VjaC1mZWVkYmFjay5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmU3MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS90b3VjaC1mZWVkYmFjay5qZApAQCAtMCwwICsxLDY3IEBACitwYWdlLnRpdGxlPVRvdWNoIEZlZWRiYWNrCitAamQ6Ym9keQorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciIHN0eWxlPSJtYXJnaW4tYm90dG9tOiAtMTAwcHgiPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi03Ij4KKworPHA+VXNlIGNvbG9yIGFuZCBpbGx1bWluYXRpb24gdG8gcmVzcG9uZCB0byB0b3VjaGVzLCByZWluZm9yY2UgdGhlIHJlc3VsdGluZyBiZWhhdmlvcnMgb2YgZ2VzdHVyZXMsIGFuZAoraW5kaWNhdGUgd2hhdCBhY3Rpb25zIGFyZSBlbmFibGVkIGFuZCBkaXNhYmxlZC48L3A+Cis8cD5XaGVuZXZlciBhIHVzZXIgdG91Y2hlcyBhbiBhY3Rpb25hYmxlIGFyZWEgaW4geW91ciBhcHAsIHByb3ZpZGUgYSB2aXN1YWwgcmVzcG9uc2UuIFRoaXMgbGV0cyB0aGUKK3VzZXIga25vdyB3aGljaCBvYmplY3Qgd2FzIHRvdWNoZWQgYW5kIHRoYXQgeW91ciBhcHAgaXMgImxpc3RlbmluZyIuPC9wPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9ZGVzaWduL21lZGlhL3RvdWNoX2ZlZWRiYWNrX3JlYWN0aW9uX3Jlc3BvbnNlLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGg0PlN0YXRlczwvaDQ+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19zdGF0ZXMucG5nIj4KKzxkaXYgY2xhc3M9ImZpZ3VyZS1jYXB0aW9uIj4KKyAgTW9zdCBvZiBBbmRyb2lkJ3MgVUkgZWxlbWVudHMgaGF2ZSB0b3VjaC1mZWVkYmFjayBidWlsdCBpbiwgaW5jbHVkaW5nIHN0YXRlcyB0aGF0IGluZGljYXRlCisgIHdoZXRoZXIgdG91Y2hpbmcgdGhlIGVsZW1lbnQgd2lsbCBoYXZlIGFueSBlZmZlY3QuCis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtNCI+Jm5ic3A7PC9kaXY+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgorCis8aDQ+Q29tbXVuaWNhdGlvbjwvaDQ+Cis8cD5XaGVuIHlvdXIgb2JqZWN0cyByZWFjdCB0byBtb3JlIGNvbXBsZXggZ2VzdHVyZXMsIGhlbHAgdXNlcnMgdW5kZXJzdGFuZCB3aGF0IHRoZSBvdXRjb21lIG9mIHRoZQorb3BlcmF0aW9uIHdpbGwgYmUuIEZvciBleGFtcGxlLCBpbiBSZWNlbnRzLCB3aGVuIHlvdSBzdGFydCBzd2lwaW5nIGEgdGh1bWJuYWlsIGxlZnQgb3IgcmlnaHQsIGl0CitzdGFydHMgdG8gZGltLiBUaGlzIGhlbHBzIHRoZSB1c2VyIHVuZGVyc3RhbmQgdGhhdCBzd2lwaW5nIHdpbGwgY2F1c2UgdGhlIGl0ZW0gdG8gYmUgcmVtb3ZlZC48L3A+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdG91Y2hfZmVlZGJhY2tfbWFuaXB1bGF0aW9uLnBuZyI+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90b3VjaF9mZWVkYmFja19jb21tdW5pY2F0aW9uLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0zIj4mbmJzcDs8L2Rpdj4KKworPGg0PkJvdW5kYXJpZXM8L2g0PgorPHA+V2hlbiB1c2VycyB0cnkgdG8gc2Nyb2xsIHBhc3QgdGhlIHVwcGVyIG9yIGxvd2VyIGxpbWl0IG9mIGEgc2Nyb2xsYWJsZSBhcmVhLCBjb21tdW5pY2F0ZSB0aGUKK2JvdW5kYXJ5IHdpdGggYSB2aXN1YWwgY3VlLiBGb3IgZXhhbXBsZSwgaWYgYSB1c2VyIGF0dGVtcHRzIHRvIHNjcm9sbCBwYXN0IHRoZSBmaXJzdCBob21lIHNjcmVlbgorcGFuZWwsIHRoZSBzY3JlZW4gY29udGVudCB0aWx0cyB0byB0aGUgcmlnaHQgdG8gaW5kaWNhdGUgdGhhdCBmdXJ0aGVyIG5hdmlnYXRpb24gaW4gdGhpcyBkaXJlY3Rpb24KK2lzIG5vdCBwb3NzaWJsZS4gTWFueSBvZiBBbmRyb2lkJ3Mgc2Nyb2xsYWJsZSBVSSB3aWRnZXRzIChlLmcuIGxpc3RzIG9yIGdyaWQgbGlzdHMpIGFscmVhZHkgaGF2ZQorc3VwcG9ydCBmb3IgYm91bmRhcnkgZmVlZGJhY2sgYnVpbHQgaW4uIElmIHlvdSBhcmUgYnVpbGRpbmcgY3VzdG9tLCBrZWVwIGJvdW5kYXJ5IGZlZWRiYWNrIGluIG1pbmQKK2FuZCBwcm92aWRlIGl0IGZyb20gd2l0aGluIHlvdXIgYXBwLjwvcD4KKworICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3R5cG9ncmFwaHkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliNmQ0Yi4uMDAwMDAwMAotLS0gYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3R5cG9ncmFwaHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08IURPQ1RZUEUgaHRtbD4KLTxodG1sIGxhbmc9ImVuIj4KLSAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotICAgIDx0aXRsZT4KLQotQW5kcm9pZCBEZXNpZ24gLSBUeXBvZ3JhcGh5Ci0gICAgPC90aXRsZT4KLSAgICA8bGluayByZWw9InNob3J0Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iL2Zhdmljb24uaWNvIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bzpyZWd1bGFyLG1lZGl1bSx0aGluLGl0YWxpYyxtZWRpdW1pdGFsaWMiPgotICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vc3RhdGljL3l1aS0zLjMuMC1yZXNldC1taW4uY3NzIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy9kZWZhdWx0LmNzcyI+Ci0KLSAgPC9oZWFkPgotICA8Ym9keT4KLQotICAgIDxkaXYgaWQ9InBhZ2UtY29udGFpbmVyIj4KLQotICAgICAgPGRpdiBpZD0icGFnZS1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkFuZHJvaWQgRGVzaWduPC9hPjwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJtYWluLXJvdyI+Ci0KLSAgICAgICAgPHVsIGlkPSJuYXYiPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkdldCBTdGFydGVkPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvY3JlYXRpdmUtdmlzaW9uLmh0bWwiPkNyZWF0aXZlIFZpc2lvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvcHJpbmNpcGxlcy5odG1sIj5EZXNpZ24gUHJpbmNpcGxlczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vZ2V0LXN0YXJ0ZWQvdWktb3ZlcnZpZXcuaHRtbCI+VUkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9zdHlsZS9pbmRleC5odG1sIj5TdHlsZTwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2RldmljZXMtZGlzcGxheXMuaHRtbCI+RGV2aWNlcyBhbmQgRGlzcGxheXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RoZW1lcy5odG1sIj5UaGVtZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3RvdWNoLWZlZWRiYWNrLmh0bWwiPlRvdWNoIEZlZWRiYWNrPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9tZXRyaWNzLWdyaWRzLmh0bWwiPk1ldHJpY3MgYW5kIEdyaWRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90eXBvZ3JhcGh5Lmh0bWwiPlR5cG9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL2NvbG9yLmh0bWwiPkNvbG9yPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9pY29ub2dyYXBoeS5odG1sIj5JY29ub2dyYXBoeTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvd3JpdGluZy5odG1sIj5Xcml0aW5nIFN0eWxlPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vcGF0dGVybnMvaW5kZXguaHRtbCI+UGF0dGVybnM8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9uZXctNC0wLmh0bWwiPk5ldyBpbiBBbmRyb2lkIDQuMDwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvZ2VzdHVyZXMuaHRtbCI+R2VzdHVyZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2FwcC1zdHJ1Y3R1cmUuaHRtbCI+QXBwIFN0cnVjdHVyZTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmF2aWdhdGlvbi5odG1sIj5OYXZpZ2F0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hY3Rpb25iYXIuaHRtbCI+QWN0aW9uIEJhcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbXVsdGktcGFuZS1sYXlvdXRzLmh0bWwiPk11bHRpLXBhbmUgTGF5b3V0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvc3dpcGUtdmlld3MuaHRtbCI+U3dpcGUgVmlld3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3NlbGVjdGlvbi5odG1sIj5TZWxlY3Rpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25vdGlmaWNhdGlvbnMuaHRtbCI+Tm90aWZpY2F0aW9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvY29tcGF0aWJpbGl0eS5odG1sIj5Db21wYXRpYmlsaXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9wdXJlLWFuZHJvaWQuaHRtbCI+UHVyZSBBbmRyb2lkPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2luZGV4Lmh0bWwiPkJ1aWxkaW5nIEJsb2NrczwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90YWJzLmh0bWwiPlRhYnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9saXN0cy5odG1sIj5MaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2dyaWQtbGlzdHMuaHRtbCI+R3JpZCBMaXN0czwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Njcm9sbGluZy5odG1sIj5TY3JvbGxpbmc8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zcGlubmVycy5odG1sIj5TcGlubmVyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL2J1dHRvbnMuaHRtbCI+QnV0dG9uczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3RleHQtZmllbGRzLmh0bWwiPlRleHQgRmllbGRzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc2Vlay1iYXJzLmh0bWwiPlNlZWsgQmFyczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3Byb2dyZXNzLmh0bWwiPlByb2dyZXNzICZhbXA7IEFjdGl2aXR5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3dpdGNoZXMuaHRtbCI+U3dpdGNoZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9kaWFsb2dzLmh0bWwiPkRpYWxvZ3M8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9waWNrZXJzLmh0bWwiPlBpY2tlcnM8L2E+PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9saT4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIGVtcHR5Ij48YSBocmVmPSIuLi9kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8ZGl2IGlkPSJiYWNrLWRhYy1zZWN0aW9uIj48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5EZXZlbG9wZXJzPC9hPjwvZGl2PgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgPC91bD4KLQotICAgICAgICA8ZGl2IGlkPSJjb250ZW50Ij4KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWhlYWRlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi05Ij4KLSAgICAgICAgICAgICAgPGgyPlR5cG9ncmFwaHk8L2gyPgotICAgICAgICAgICAgPC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotCi0gICAgICAgICAgCi0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3R5cG9ncmFwaHlfbWFpbi5wbmciPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi01Ij4KLQotPHA+VGhlIEFuZHJvaWQgZGVzaWduIGxhbmd1YWdlIHJlbGllcyBvbiB0cmFkaXRpb25hbCB0eXBvZ3JhcGhpYyB0b29scyBzdWNoIGFzIHNjYWxlLCBzcGFjZSwgcmh5dGhtLAotYW5kIGFsaWdubWVudCB3aXRoIGFuIHVuZGVybHlpbmcgZ3JpZC4gU3VjY2Vzc2Z1bCBkZXBsb3ltZW50IG9mIHRoZXNlIHRvb2xzIGlzIGVzc2VudGlhbCB0byBoZWxwCi11c2VycyBxdWlja2x5IHVuZGVyc3RhbmQgYSBzY3JlZW4gb2YgaW5mb3JtYXRpb24uIFRvIHN1cHBvcnQgc3VjaCB1c2Ugb2YgdHlwb2dyYXBoeSwgSWNlIENyZWFtCi1TYW5kd2ljaCBpbnRyb2R1Y2VkIGEgbmV3IHR5cGUgZmFtaWx5IG5hbWVkIFJvYm90bywgY3JlYXRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSByZXF1aXJlbWVudHMgb2YgVUkKLWFuZCBoaWdoLXJlc29sdXRpb24gc2NyZWVucy4gVGhlIGN1cnJlbnQgVGV4dFZpZXcgZnJhbWV3b3JrIHN1cHBvcnRzIHJlZ3VsYXIsIGJvbGQsIGl0YWxpYywgYW5kIGJvbGQKLWl0YWxpYyB3ZWlnaHRzIGJ5IGRlZmF1bHQuPC9wPgotCi0gICAgPGltZyBzcmM9Ii4uL3N0YXRpYy9jb250ZW50L3R5cG9ncmFwaHlfYWxwaGFzLnBuZyI+Ci0KLTxwPjxhIGhyZWY9Imh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vYW5kcm9pZC9kZXNpZ24vUm9ib3RvX0hpbnRlZF8yMDExMTEyOS56aXAiPkRvd25sb2FkIFJvYm90bzwvYT48L3A+Ci08cD48YSBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL1JvYm90b19TcGVjaW1lbl9Cb29rXzIwMTExMTI5LnBkZiI+U3BlY2ltZW4gQm9vazwvYT48L3A+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGhyPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotPGg0PkRlZmF1bHQgdHlwZSBjb2xvcnM8L2g0PgotPHA+VGhlIEFuZHJvaWQgVUkgdXNlcyB0aGUgZm9sbG93aW5nIGRlZmF1bHQgY29sb3Igc3R5bGVzOiA8Y29kZT50ZXh0Q29sb3JQcmltYXJ5PC9jb2RlPiBhbmQKLTxjb2RlPnRleHRDb2xvclNlY29uZGFyeTwvY29kZT4uIEZvciBsaWdodCB0aGVtZXMgdXNlIDxjb2RlPnRleHRDb2xvclByaW1hcnlJbnZlcnNlPC9jb2RlPiBhbmQKLTxjb2RlPnRleHRDb2xvclNlY29uZGFyeUludmVyc2U8L2NvZGU+LiBUaGUgZnJhbWV3b3JrIHRleHQgY29sb3Igc3R5bGVzIGFsc28gc3VwcG9ydCB2YXJpYW50cyBmb3IKLXRvdWNoIGZlZWRiYWNrIHN0YXRlcyB3aGVuIHVzZWQgaW5zaWRlIFVJIGVsZW1lbnRzLjwvcD4KLQotICAgIDxpbWcgc3JjPSIuLi9zdGF0aWMvY29udGVudC90eXBvZ3JhcGh5X2RlZmF1bHRzLnBuZyI+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi08aDQ+VHlwb2dyYXBoaWMgU2NhbGU8L2g0PgotPHA+Q29udHJhc3QgaW4gdHlwZSBzaXplcyBjYW4gZ28gYSBsb25nIHdheSB0byBjcmVhdGUgb3JkZXJlZCwgdW5kZXJzdGFuZGFibGUgbGF5b3V0cy4gSG93ZXZlciwgdG9vCi1tYW55IGRpZmZlcmVudCBzaXplcyBpbiB0aGUgc2FtZSBVSSBjYW4gYmUgbWVzc3kuIFRoZSBBbmRyb2lkIGZyYW1ld29yayB1c2VzIHRoZSBmb2xsb3dpbmcgbGltaXRlZAotc2V0IG9mIHR5cGUgc2l6ZXM6PC9wPgotCi08aW1nIHNyYz0iLi4vc3RhdGljL2NvbnRlbnQvdHlwb2dyYXBoeV9zaXplcy5wbmciPgotCi08cD5Vc2VycyBjYW4gc2VsZWN0IGEgc3lzdGVtLXdpZGUgc2NhbGluZyBmYWN0b3IgZm9yIHRleHQgaW4gdGhlIFNldHRpbmdzIGFwcC4gSW4gb3JkZXIgdG8gc3VwcG9ydAotdGhlc2UgYWNjZXNzaWJpbGl0eSBmZWF0dXJlcywgdHlwZSBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHNjYWxlLWluZGVwZW5kZW50IHBpeGVscwotKDxhY3JvbnltIHRpdGxlPSJTY2FsZS1pbmRlcGVuZGVudCBwaXhlbHMuIE9uZSBzcCBpcyBvbmUgcGl4ZWwgb24gYSAxNjAgZHBpIHNjcmVlbiBpZiB0aGUgdXNlcidzIGdsb2JhbCB0ZXh0IHNjYWxlIGlzIHNldCB0byAxMDAlLiI+c3A8L2Fjcm9ueW0+KQotd2hlcmV2ZXIgcG9zc2libGUuIExheW91dHMgc3VwcG9ydGluZyBzY2FsYWJsZSB0eXBlcyBzaG91bGQgYmUgdGVzdGVkIGFnYWluc3QgdGhlc2Ugc2V0dGluZ3MuPC9wPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLQotCi0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1mb290ZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTkiPiZuYnNwOzwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLSAgICAgICAgPC9kaXY+Ci0KLSAgICAgIDwvZGl2PgotCi0gICAgICA8ZGl2IGlkPSJwYWdlLWZvb3RlciI+Ci0KLSAgICAgICAgPHAgaWQ9ImNvcHlyaWdodCI+Ci0gICAgICAgICAgRXhjZXB0IGFzIG5vdGVkLCB0aGlzIGNvbnRlbnQgaXMgbGljZW5zZWQgdW5kZXIKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8yLjUvIj4KLSAgICAgICAgICBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNTwvYT4uPGJyPgotICAgICAgICAgIEZvciBkZXRhaWxzIGFuZCByZXN0cmljdGlvbnMsIHNlZSB0aGUKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2xpY2Vuc2UuaHRtbCI+Q29udGVudCBMaWNlbnNlPC9hPi4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vdGVybXMuaHRtbCI+U2l0ZSBUZXJtcyBvZiBTZXJ2aWNlPC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9wcml2YWN5Lmh0bWwiPlByaXZhY3kgUG9saWN5PC9hPiAmbmRhc2g7Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5CcmFuZCBHdWlkZWxpbmVzPC9hPgotICAgICAgICA8L3A+Ci0KLSAgICAgIDwvZGl2PgotICAgIDwvZGl2PgotCi0gICAgPHNjcmlwdCBzcmM9Ii4uL3N0YXRpYy9qcXVlcnktMS42LjIubWluLmpzIj48L3NjcmlwdD4KLSAgICA8c2NyaXB0PgotICAgIHZhciBTSVRFX1JPT1QgPSAnLi4vJzsKLSAgICA8L3NjcmlwdD4KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2RlZmF1bHQuanMiPjwvc2NyaXB0PgotCi0KLSAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgdmFyIGdhSnNIb3N0ID0gKCgiaHR0cHM6IiA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCkgPyAiaHR0cHM6Ly9zc2wuIiA6ICJodHRwOi8vd3d3LiIpOwotICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKCIlM0NzY3JpcHQgc3JjPSciICsgZ2FKc0hvc3QgKyAiZ29vZ2xlLWFuYWx5dGljcy5jb20vZ2EuanMnIHR5cGU9J3RleHQvamF2YXNjcmlwdCclM0UlM0Mvc2NyaXB0JTNFIikpOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgcGFnZVRyYWNrZXIgPSBfZ2F0Ll9nZXRUcmFja2VyKCJVQS01ODMxMTU1LTEiKTsKLSAgICBwYWdlVHJhY2tlci5fdHJhY2tQYWdldmlldygpOwotICAgIDwvc2NyaXB0PgotICA8L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3R5cG9ncmFwaHkuamQgYi9kb2NzL2h0bWwvZGVzaWduL3N0eWxlL3R5cG9ncmFwaHkuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyZmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvdHlwb2dyYXBoeS5qZApAQCAtMCwwICsxLDU2IEBACitwYWdlLnRpdGxlPVR5cG9ncmFwaHkKK0BqZDpib2R5CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTgiPgorCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1kZXNpZ24vbWVkaWEvdHlwb2dyYXBoeV9tYWluLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTUiPgorCis8cD5UaGUgQW5kcm9pZCBkZXNpZ24gbGFuZ3VhZ2UgcmVsaWVzIG9uIHRyYWRpdGlvbmFsIHR5cG9ncmFwaGljIHRvb2xzIHN1Y2ggYXMgc2NhbGUsIHNwYWNlLCByaHl0aG0sCithbmQgYWxpZ25tZW50IHdpdGggYW4gdW5kZXJseWluZyBncmlkLiBTdWNjZXNzZnVsIGRlcGxveW1lbnQgb2YgdGhlc2UgdG9vbHMgaXMgZXNzZW50aWFsIHRvIGhlbHAKK3VzZXJzIHF1aWNrbHkgdW5kZXJzdGFuZCBhIHNjcmVlbiBvZiBpbmZvcm1hdGlvbi4gVG8gc3VwcG9ydCBzdWNoIHVzZSBvZiB0eXBvZ3JhcGh5LCBJY2UgQ3JlYW0KK1NhbmR3aWNoIGludHJvZHVjZWQgYSBuZXcgdHlwZSBmYW1pbHkgbmFtZWQgUm9ib3RvLCBjcmVhdGVkIHNwZWNpZmljYWxseSBmb3IgdGhlIHJlcXVpcmVtZW50cyBvZiBVSQorYW5kIGhpZ2gtcmVzb2x1dGlvbiBzY3JlZW5zLiBUaGUgY3VycmVudCBUZXh0VmlldyBmcmFtZXdvcmsgc3VwcG9ydHMgcmVndWxhciwgYm9sZCwgaXRhbGljLCBhbmQgYm9sZAoraXRhbGljIHdlaWdodHMgYnkgZGVmYXVsdC48L3A+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X2FscGhhcy5wbmciPgorCis8cD48YSBocmVmPSJodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2FuZHJvaWQvZGVzaWduL1JvYm90b19IaW50ZWRfMjAxMTExMjkuemlwIj5Eb3dubG9hZCBSb2JvdG88L2E+PC9wPgorPHA+PGEgaHJlZj0iaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9hbmRyb2lkL2Rlc2lnbi9Sb2JvdG9fU3BlY2ltZW5fQm9va18yMDExMTEyOS5wZGYiPlNwZWNpbWVuIEJvb2s8L2E+PC9wPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxocj4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKzxoND5EZWZhdWx0IHR5cGUgY29sb3JzPC9oND4KKzxwPlRoZSBBbmRyb2lkIFVJIHVzZXMgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGNvbG9yIHN0eWxlczogPGNvZGU+dGV4dENvbG9yUHJpbWFyeTwvY29kZT4gYW5kCis8Y29kZT50ZXh0Q29sb3JTZWNvbmRhcnk8L2NvZGU+LiBGb3IgbGlnaHQgdGhlbWVzIHVzZSA8Y29kZT50ZXh0Q29sb3JQcmltYXJ5SW52ZXJzZTwvY29kZT4gYW5kCis8Y29kZT50ZXh0Q29sb3JTZWNvbmRhcnlJbnZlcnNlPC9jb2RlPi4gVGhlIGZyYW1ld29yayB0ZXh0IGNvbG9yIHN0eWxlcyBhbHNvIHN1cHBvcnQgdmFyaWFudHMgZm9yCit0b3VjaCBmZWVkYmFjayBzdGF0ZXMgd2hlbiB1c2VkIGluc2lkZSBVSSBlbGVtZW50cy48L3A+CisKKyAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X2RlZmF1bHRzLnBuZyI+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCis8aDQ+VHlwb2dyYXBoaWMgU2NhbGU8L2g0PgorPHA+Q29udHJhc3QgaW4gdHlwZSBzaXplcyBjYW4gZ28gYSBsb25nIHdheSB0byBjcmVhdGUgb3JkZXJlZCwgdW5kZXJzdGFuZGFibGUgbGF5b3V0cy4gSG93ZXZlciwgdG9vCittYW55IGRpZmZlcmVudCBzaXplcyBpbiB0aGUgc2FtZSBVSSBjYW4gYmUgbWVzc3kuIFRoZSBBbmRyb2lkIGZyYW1ld29yayB1c2VzIHRoZSBmb2xsb3dpbmcgbGltaXRlZAorc2V0IG9mIHR5cGUgc2l6ZXM6PC9wPgorCis8aW1nIHNyYz0ie0Bkb2NSb290fWRlc2lnbi9tZWRpYS90eXBvZ3JhcGh5X3NpemVzLnBuZyI+CisKKzxwPlVzZXJzIGNhbiBzZWxlY3QgYSBzeXN0ZW0td2lkZSBzY2FsaW5nIGZhY3RvciBmb3IgdGV4dCBpbiB0aGUgU2V0dGluZ3MgYXBwLiBJbiBvcmRlciB0byBzdXBwb3J0Cit0aGVzZSBhY2Nlc3NpYmlsaXR5IGZlYXR1cmVzLCB0eXBlIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gc2NhbGUtaW5kZXBlbmRlbnQgcGl4ZWxzCisoPGFjcm9ueW0gdGl0bGU9IlNjYWxlLWluZGVwZW5kZW50IHBpeGVscy4gT25lIHNwIGlzIG9uZSBwaXhlbCBvbiBhIDE2MCBkcGkgc2NyZWVuIGlmIHRoZSB1c2VyJ3MgZ2xvYmFsIHRleHQgc2NhbGUgaXMgc2V0IHRvIDEwMCUuIj5zcDwvYWNyb255bT4pCit3aGVyZXZlciBwb3NzaWJsZS4gTGF5b3V0cyBzdXBwb3J0aW5nIHNjYWxhYmxlIHR5cGVzIHNob3VsZCBiZSB0ZXN0ZWQgYWdhaW5zdCB0aGVzZSBzZXR0aW5ncy48L3A+CisKKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvd3JpdGluZy5odG1sIGIvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS93cml0aW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmNlODguLjAwMDAwMDAKLS0tIGEvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS93cml0aW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWw+Ci08aHRtbCBsYW5nPSJlbiI+Ci0gIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLSAgICA8dGl0bGU+Ci0KLUFuZHJvaWQgRGVzaWduIC0gV3JpdGluZyBTdHlsZQotICAgIDwvdGl0bGU+Ci0gICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Ii9mYXZpY29uLmljbyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Sb2JvdG86cmVndWxhcixtZWRpdW0sdGhpbixpdGFsaWMsbWVkaXVtaXRhbGljIj4KLSAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0YXRpYy95dWktMy4zLjAtcmVzZXQtbWluLmNzcyI+Ci0gICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9zdGF0aWMvZGVmYXVsdC5jc3MiPgotCi08c3R5bGU+Ci0KLS8qIFVJIHRhYmxlcyAqLwotCi0udWlfdGFibGUgewotICB3aWR0aDogMTAwJTsKLSAgYmFja2dyb3VuZDogIzI4MjgyODsKLSAgY29sb3I6ICNmZmY7Ci0gIGJvcmRlci1yYWRpdXM6IDJweDsKLSAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4yNSk7Ci0gIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7Ci19Ci0KLS51aV90YWJsZSB0aCwKLS51aV90YWJsZSB0ZCB7Ci0gIHBhZGRpbmc6IDVweCAxMHB4OwotfQotCi0udWlfdGFibGUgdGhlYWQgdGggewotICBmb250LXdlaWdodDogNjAwOwotfQotCi0udWlfdGFibGUgdGZvb3QgdGQgewotICBib3JkZXItdG9wOiAxcHggc29saWQgIzQ5NDk0OTsKLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzQ5NDk0OTsKLSAgdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0udWlfdGFibGUgdGZvb3QgdGQ6bGFzdC1jaGlsZCB7Ci0gIGJvcmRlci1yaWdodDogMDsKLX0KLQotLmxpc3RfaXRlbV9tYXJnaW5zIHsKLSAgbWFyZ2luLWxlZnQ6IDMwcHggIWltcG9ydGFudDsKLX0KLQotLmV4YW1wbGVfbGFiZWwgewotICBtYXJnaW4tYm90dG9tOiAxMHB4OwotICBwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50IG5vbmUgbm8tcmVwZWF0IHNjcm9sbCAwcHggM3B4OwotfQotCi0uZXhhbXBsZV9sYWJlbC5iYWQgewotICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vc3RhdGljL2ljb193cm9uZy5wbmcpOwotfQotCi0uZXhhbXBsZV9sYWJlbC5nb29kIHsKLSAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL3N0YXRpYy9pY29fZ29vZC5wbmcpOwotfQotCi08L3N0eWxlPgotCi0gIDwvaGVhZD4KLSAgPGJvZHk+Ci0KLSAgICA8ZGl2IGlkPSJwYWdlLWNvbnRhaW5lciI+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtaGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5BbmRyb2lkIERlc2lnbjwvYT48L2Rpdj4KLQotICAgICAgPGRpdiBpZD0ibWFpbi1yb3ciPgotCi0gICAgICAgIDx1bCBpZD0ibmF2Ij4KLQotICAgICAgICAgIDxsaSBjbGFzcz0ibmF2LXNlY3Rpb24iPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibmF2LXNlY3Rpb24taGVhZGVyIj48YSBocmVmPSIuLi9pbmRleC5odG1sIj5HZXQgU3RhcnRlZDwvYT48L2Rpdj4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL2NyZWF0aXZlLXZpc2lvbi5odG1sIj5DcmVhdGl2ZSBWaXNpb248L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3ByaW5jaXBsZXMuaHRtbCI+RGVzaWduIFByaW5jaXBsZXM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2dldC1zdGFydGVkL3VpLW92ZXJ2aWV3Lmh0bWwiPlVJIE92ZXJ2aWV3PC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciI+PGEgaHJlZj0iLi4vc3R5bGUvaW5kZXguaHRtbCI+U3R5bGU8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9kZXZpY2VzLWRpc3BsYXlzLmh0bWwiPkRldmljZXMgYW5kIERpc3BsYXlzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90aGVtZXMuaHRtbCI+VGhlbWVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS90b3VjaC1mZWVkYmFjay5odG1sIj5Ub3VjaCBGZWVkYmFjazwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvbWV0cmljcy1ncmlkcy5odG1sIj5NZXRyaWNzIGFuZCBHcmlkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvdHlwb2dyYXBoeS5odG1sIj5UeXBvZ3JhcGh5PC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9zdHlsZS9jb2xvci5odG1sIj5Db2xvcjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vc3R5bGUvaWNvbm9ncmFwaHkuaHRtbCI+SWNvbm9ncmFwaHk8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3N0eWxlL3dyaXRpbmcuaHRtbCI+V3JpdGluZyBTdHlsZTwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2luZGV4Lmh0bWwiPlBhdHRlcm5zPC9hPjwvZGl2PgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvbmV3LTQtMC5odG1sIj5OZXcgaW4gQW5kcm9pZCA0LjA8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2dlc3R1cmVzLmh0bWwiPkdlc3R1cmVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9hcHAtc3RydWN0dXJlLmh0bWwiPkFwcCBTdHJ1Y3R1cmU8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL25hdmlnYXRpb24uaHRtbCI+TmF2aWdhdGlvbjwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvYWN0aW9uYmFyLmh0bWwiPkFjdGlvbiBCYXI8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL211bHRpLXBhbmUtbGF5b3V0cy5odG1sIj5NdWx0aS1wYW5lIExheW91dHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL3N3aXBlLXZpZXdzLmh0bWwiPlN3aXBlIFZpZXdzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9zZWxlY3Rpb24uaHRtbCI+U2VsZWN0aW9uPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9wYXR0ZXJucy9ub3RpZmljYXRpb25zLmh0bWwiPk5vdGlmaWNhdGlvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL3BhdHRlcm5zL2NvbXBhdGliaWxpdHkuaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vcGF0dGVybnMvcHVyZS1hbmRyb2lkLmh0bWwiPlB1cmUgQW5kcm9pZDwvYT48L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpIGNsYXNzPSJuYXYtc2VjdGlvbiI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYXYtc2VjdGlvbi1oZWFkZXIiPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9pbmRleC5odG1sIj5CdWlsZGluZyBCbG9ja3M8L2E+PC9kaXY+Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvdGFicy5odG1sIj5UYWJzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvbGlzdHMuaHRtbCI+TGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9ncmlkLWxpc3RzLmh0bWwiPkdyaWQgTGlzdHM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9zY3JvbGxpbmcuaHRtbCI+U2Nyb2xsaW5nPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3Mvc3Bpbm5lcnMuaHRtbCI+U3Bpbm5lcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9idXR0b25zLmh0bWwiPkJ1dHRvbnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy90ZXh0LWZpZWxkcy5odG1sIj5UZXh0IEZpZWxkczwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3NlZWstYmFycy5odG1sIj5TZWVrIEJhcnM8L2E+PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2J1aWxkaW5nLWJsb2Nrcy9wcm9ncmVzcy5odG1sIj5Qcm9ncmVzcyAmYW1wOyBBY3Rpdml0eTwvYT48L2xpPgotICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vYnVpbGRpbmctYmxvY2tzL3N3aXRjaGVzLmh0bWwiPlN3aXRjaGVzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvZGlhbG9ncy5odG1sIj5EaWFsb2dzPC9hPjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9idWlsZGluZy1ibG9ja3MvcGlja2Vycy5odG1sIj5QaWNrZXJzPC9hPjwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgIDwvbGk+Ci0KLSAgICAgICAgICA8bGkgY2xhc3M9Im5hdi1zZWN0aW9uIj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9Im5hdi1zZWN0aW9uLWhlYWRlciBlbXB0eSI+PGEgaHJlZj0iLi4vZG93bmxvYWRzL2luZGV4Lmh0bWwiPkRvd25sb2FkczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGRpdiBpZD0iYmFjay1kYWMtc2VjdGlvbiI+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+RGV2ZWxvcGVyczwvYT48L2Rpdj4KLSAgICAgICAgICA8L2xpPgotCi0gICAgICAgIDwvdWw+Ci0KLSAgICAgICAgPGRpdiBpZD0iY29udGVudCI+Ci0KLSAgICAgICAgICAKLSAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3cgY29udGVudC1oZWFkZXIiPgotICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Ci0gICAgICAgICAgICAgIDxoMj5Xcml0aW5nIFN0eWxlPC9oMj4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgICAgPGRpdiBjbGFzcz0icGFnaW5nLWxpbmtzIGxheW91dC1jb250ZW50LWNvbCBzcGFuLTQiPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0icHJldi1wYWdlLWxpbmsiPlByZXZpb3VzPC9hPgotICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0ibmV4dC1wYWdlLWxpbmsiPk5leHQ8L2E+Ci0gICAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICA8L2Rpdj4KLSAgICAgICAgICAKLQotICAgICAgICAgIAotCi08cD5XaGVuIGNob29zaW5nIHdvcmRzIGZvciB5b3VyIGFwcDo8L3A+Ci08b2w+Ci08bGk+Ci08cD48c3Ryb25nPktlZXAgaXQgYnJpZWYuPC9zdHJvbmc+IEJlIGNvbmNpc2UsIHNpbXBsZSBhbmQgcHJlY2lzZS4gU3RhcnQgd2l0aCBhIDMwIGNoYXJhY3RlciBsaW1pdCAoaW5jbHVkaW5nCi0gICBzcGFjZXMpLCBhbmQgZG9uJ3QgdXNlIG1vcmUgdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3Ryb25nPktlZXAgaXQgc2ltcGxlLjwvc3Ryb25nPiBQcmV0ZW5kIHlvdSdyZSBzcGVha2luZyB0byBzb21lb25lIHdobydzIHNtYXJ0IGFuZCBjb21wZXRlbnQsIGJ1dCBkb2Vzbid0Ci0gICBrbm93IHRlY2huaWNhbCBqYXJnb24gYW5kIG1heSBub3Qgc3BlYWsgRW5nbGlzaCB2ZXJ5IHdlbGwuIFVzZSBzaG9ydCB3b3JkcywgYWN0aXZlIHZlcmJzLCBhbmQKLSAgIGNvbW1vbiBub3Vucy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHN0cm9uZz5CZSBmcmllbmRseS48L3N0cm9uZz4gVXNlIGNvbnRyYWN0aW9ucy4gVGFsayBkaXJlY3RseSB0byB0aGUgcmVhZGVyIHVzaW5nIHNlY29uZCBwZXJzb24gKCJ5b3UiKS4gSWYKLSAgIHlvdXIgdGV4dCBkb2Vzbid0IHJlYWQgdGhlIHdheSB5b3UnZCBzYXkgaXQgaW4gY2FzdWFsIGNvbnZlcnNhdGlvbiwgaXQncyBwcm9iYWJseSBub3QgdGhlIHdheQotICAgeW91IHNob3VsZCB3cml0ZSBpdC4gRG9uJ3QgYmUgYWJydXB0IG9yIGFubm95aW5nIGFuZCBtYWtlIHRoZSB1c2VyIGZlZWwgc2FmZSwgaGFwcHkgYW5kCi0gICBlbmVyZ2l6ZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzdHJvbmc+UHV0IHRoZSBtb3N0IGltcG9ydGFudCB0aGluZyBmaXJzdC48L3N0cm9uZz4gVGhlIGZpcnN0IHR3byB3b3JkcyAoYXJvdW5kIDExIGNoYXJhY3RlcnMsIGluY2x1ZGluZwotICAgc3BhY2VzKSBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCBhIHRhc3RlIG9mIHRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpbiB0aGUgc3RyaW5nLiBJZiB0aGV5Ci0gICBkb24ndCwgc3RhcnQgb3Zlci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHN0cm9uZz5EZXNjcmliZSBvbmx5IHdoYXQncyBuZWNlc3NhcnksIGFuZCBubyBtb3JlLjwvc3Ryb25nPiBEb24ndCB0cnkgdG8gZXhwbGFpbiBzdWJ0bGUgZGlmZmVyZW5jZXMuIFRoZXkKLSAgIHdpbGwgYmUgbG9zdCBvbiBtb3N0IHVzZXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3Ryb25nPkF2b2lkIHJlcGV0aXRpb24uPC9zdHJvbmc+IElmIGEgc2lnbmlmaWNhbnQgdGVybSBnZXRzIHJlcGVhdGVkIHdpdGhpbiBhIHNjcmVlbiBvciBibG9jayBvZiB0ZXh0LCBmaW5kCi0gICBhIHdheSB0byB1c2UgaXQganVzdCBvbmNlLjwvcD4KLTwvbGk+Ci08L29sPgotCi08aDIgaWQ9ImV4YW1wbGVzIj5FeGFtcGxlczwvaDI+Ci0KLTxvbD48bGkgY2xhc3M9InZhbHVlLTEiPjxzdHJvbmc+S2VlcCBpdCBicmllZi48L3N0cm9uZz4gRnJvbSB0aGUgc2V0dXAgd2l6YXJkOjwvb2w+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYgbGlzdF9pdGVtX21hcmdpbnMiPgotCi0gICAgPGRpdiBjbGFzcz0iZXhhbXBsZV9sYWJlbCBiYWQiPlRvbyBmb3JtYWw8L2Rpdj4KLQotICAgIDx0YWJsZSBjbGFzcz0idWlfdGFibGUgZ29vZCI+PHRib2R5Pjx0cj48dGQ+Ci0gICAgQ29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGNhbWUgd2l0aCB5b3VyIHBob25lIGZvciBmdXJ0aGVyIGluc3RydWN0aW9ucy4KLSAgICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+QmV0dGVyPC9kaXY+Ci0KLSAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGdvb2QiPjx0Ym9keT48dHI+PHRkPgotICAgIFJlYWQgdGhlIGluc3RydWN0aW9ucyB0aGF0IGNhbWUgd2l0aCB5b3VyIHBob25lLgotICAgIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxvbD48bGkgY2xhc3M9InZhbHVlLTIiPjxzdHJvbmc+S2VlcCBpdCBzaW1wbGUuPC9zdHJvbmc+IEZyb20gdGhlIExvY2F0aW9uIHNldHRpbmdzIHNjcmVlbjo8L29sPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IGxpc3RfaXRlbV9tYXJnaW5zIj4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgYmFkIj5Db25mdXNpbmc8L2Rpdj4KLQotICAgIDx0YWJsZSBjbGFzcz0idWlfdGFibGUgYmFkIj4KLSAgICA8dGhlYWQ+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aD4KLSAgICAgICAgVXNlIEdQUyBzYXRlbGxpdGVzCi0gICAgICAgIDwvdGg+Ci0gICAgICA8L3RyPgotICAgIDwvdGhlYWQ+Ci0gICAgPHRib2R5PgotICAgICAgPHRyPgotICAgICAgICA8dGQ+Ci0gICAgICAgIFdoZW4gbG9jYXRpbmcsIGFjY3VyYXRlIHRvIHN0cmVldCBsZXZlbC4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90Ym9keT4KLSAgICA8L3RhYmxlPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+QmV0dGVyPC9kaXY+Ci0KLSAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGdvb2QiPgotICAgIDx0aGVhZD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoPgotICAgICAgICBHUFMKLSAgICAgICAgPC90aD4KLSAgICAgIDwvdHI+Ci0gICAgPC90aGVhZD4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgTGV0IGFwcHMgdXNlIHNhdGVsbGl0ZXMgdG8gcGlucG9pbnQgeW91ciBsb2NhdGlvbi4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90Ym9keT4KLSAgICA8L3RhYmxlPgotCi0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgotCi08b2w+PGxpIGNsYXNzPSJ2YWx1ZS0zIj48c3Ryb25nPkJlIGZyaWVuZGx5Ljwvc3Ryb25nPiBEaWFsb2cgdGhhdCBhcHBlYXJzIHdoZW4gYW4gYXBwbGljYXRpb24KLWNyYXNoZXM6PC9vbD4KLQotPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiBsaXN0X2l0ZW1fbWFyZ2lucyI+Ci0KLSAgICA8ZGl2IGNsYXNzPSJleGFtcGxlX2xhYmVsIGJhZCI+Q29uZnVzaW5nIGFuZCBhbm5veWluZyZtZGFzaDsiU29ycnkiIGp1c3QgcnVicyBzYWx0IGluIHRoZQotICAgIHdvdW5kLjwvZGl2PgotCi0gICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBiYWQiPgotICAgIDx0aGVhZD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRoIGNvbHNwYW49IjMiPgotICAgICAgICBTb3JyeSEKLSAgICAgICAgPC90aD4KLSAgICAgIDwvdHI+Ci0gICAgPC90aGVhZD4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4KLSAgICAgICAgQWN0aXZpdHkgTXlBcHBBY3Rpdml0eSAoaW4gYXBwbGljYXRpb24gTXlBcHApCi0gICAgICAgIGlzIG5vdCByZXNwb25kaW5nLgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3Rib2R5PgotICAgIDx0Zm9vdD4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHdpZHRoPSIzMyUiPkZvcmNlIGNsb3NlPC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIzMyUiPldhaXQ8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjMzJSI+UmVwb3J0PC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90Ym9keT4KLSAgICA8L3RhYmxlPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+U2hvcnRlciwgbW9yZSBkaXJlY3QsIG5vIGZhdXgtYXBvbG9nZXRpYyB0aXRsZTo8YnI+PGJyPjwvZGl2PgotCi0gICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBnb29kIj4KLSAgICA8dGhlYWQ+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aCBjb2xzcGFuPSIzIj4KLSAgICAgICAgTXlBcHAgaXNuJ3QgcmVzcG9uZGluZy4KLSAgICAgICAgPC90aD4KLSAgICAgIDwvdHI+Ci0gICAgPC90aGVhZD4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4KLSAgICAgICAgRG8geW91IHdhbnQgdG8gY2xvc2UgaXQ/Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGJvZHk+Ci0gICAgPHRmb290PgotICAgICAgPHRyPgotICAgICAgICA8dGQgd2lkdGg9IjMzJSI+V2FpdDwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMzMlIj5SZXBvcnQ8L3RkPgotICAgICAgICA8dGQgd2lkdGg9IjMzJSI+Q2xvc2U8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLSAgPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+Ci0KLTxvbD48bGkgY2xhc3M9InZhbHVlLTQiPjxzdHJvbmc+UHV0IHRoZSBtb3N0IGltcG9ydGFudCB0aGluZyBmaXJzdC48L3N0cm9uZz48L29sPgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IGxpc3RfaXRlbV9tYXJnaW5zIj4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgYmFkIj5Ub3AgbmV3cyBsYXN0PC9kaXY+Ci0KLSAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGJhZCI+PHRib2R5Pjx0cj48dGQ+Ci0gICAgNzcgb3RoZXIgcGVvcGxlICsxJ2QgdGhpcywgaW5jbHVkaW5nIExhcnJ5IFBhZ2UuCi0gICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KLQotICA8L2Rpdj4KLSAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+Ci0KLSAgICA8ZGl2IGNsYXNzPSJleGFtcGxlX2xhYmVsIGdvb2QiPlRvcCBuZXdzIGZpcnN0PC9kaXY+Ci0KLSAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGdvb2QiPjx0Ym9keT48dHI+PHRkPgotICAgIExhcnJ5IFBhZ2UgYW5kIDc3IG90aGVycyArMSdkIHRoaXMuCi0gICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IGxpc3RfaXRlbV9tYXJnaW5zIj4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgYmFkIj5UYXNrIGxhc3Q8L2Rpdj4KLQotICAgIDx0YWJsZSBjbGFzcz0idWlfdGFibGUgYmFkIj48dGJvZHk+PHRyPjx0ZD4KLSAgICBUb3VjaCBOZXh0IHRvIGNvbXBsZXRlIHNldHVwIHVzaW5nIGEgV2ktRmkgY29ubmVjdGlvbi4KLSAgICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgotCi0gIDwvZGl2PgotICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KLQotICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+VGFzayBmaXJzdDwvZGl2PgotCi0gICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBnb29kIj48dGJvZHk+PHRyPjx0ZD4KLSAgICBUbyBmaW5pc2ggc2V0dXAgdXNpbmcgV2ktRmksIHRvdWNoIE5leHQuCi0gICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KLQotPG9sPjxsaSBjbGFzcz0idmFsdWUtNSI+PHN0cm9uZz5EZXNjcmliZSBvbmx5IHdoYXQncyBuZWNlc3NhcnksIGFuZCBubyBtb3JlLjwvc3Ryb25nPjwvb2w+Ci0KLTxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYgbGlzdF9pdGVtX21hcmdpbnMiPgotCi0gICAgPGRpdiBjbGFzcz0iZXhhbXBsZV9sYWJlbCBiYWQiPkZyb20gYSBTZXR1cCBXaXphcmQgc2NyZWVuPC9kaXY+Ci0KLSAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGJhZCI+Ci0gICAgPHRoZWFkPgotICAgICAgPHRyPgotICAgICAgICA8dGg+Ci0gICAgICAgIFNpZ25pbmcgaW4uLi4KLSAgICAgICAgPC90aD4KLSAgICAgIDwvdHI+Ci0gICAgPC90aGVhZD4KLSAgICA8dGJvZHk+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgWW91ciBwaG9uZSBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoPGJyPgotICAgICAgICBHb29nbGUgc2VydmVycyB0byBzaWduIGluIHRvIHlvdXIgYWNjb3VudC48YnI+Ci0gICAgICAgIFRoaXMgbWF5IHRha2UgdXAgdG8gZml2ZSBtaW51dGVzLgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICA8L3Rib2R5PgotICAgIDwvdGFibGU+Ci0KLSAgPC9kaXY+Ci0gIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgotCi0gICAgPGRpdiBjbGFzcz0iZXhhbXBsZV9sYWJlbCBnb29kIj5Gcm9tIGEgU2V0dXAgV2l6YXJkIHNjcmVlbjwvZGl2PgotCi0gICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBnb29kIj4KLSAgICA8dGhlYWQ+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aD4KLSAgICAgICAgU2lnbmluZyBpbi4uLgotICAgICAgICA8L3RoPgotICAgICAgPC90cj4KLSAgICA8L3RoZWFkPgotICAgIDx0Ym9keT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPgotICAgICAgICBZb3VyIHBob25lIGlzIGNvbnRhY3RpbmcgR29vZ2xlLjxicj4KLSAgICAgICAgVGhpcyBjYW4gdGFrZSB1cCB0byA1IG1pbnV0ZXMuCi0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGJvZHk+Ci0gICAgPC90YWJsZT4KLQotICA8L2Rpdj4KLTwvZGl2PgotCi0KLQotICAgICAgICAgIAotICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyBjb250ZW50LWZvb3RlciI+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tOSI+Jm5ic3A7PC9kaXY+Ci0gICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYWdpbmctbGlua3MgbGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNCI+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJwcmV2LXBhZ2UtbGluayI+UHJldmlvdXM8L2E+Ci0gICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJuZXh0LXBhZ2UtbGluayI+TmV4dDwvYT4KLSAgICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIDwvZGl2PgotICAgICAgICAgIAotICAgICAgICA8L2Rpdj4KLQotICAgICAgPC9kaXY+Ci0KLSAgICAgIDxkaXYgaWQ9InBhZ2UtZm9vdGVyIj4KLQotICAgICAgICA8cCBpZD0iY29weXJpZ2h0Ij4KLSAgICAgICAgICBFeGNlcHQgYXMgbm90ZWQsIHRoaXMgY29udGVudCBpcyBsaWNlbnNlZCB1bmRlcgotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzIuNS8iPgotICAgICAgICAgIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41PC9hPi48YnI+Ci0gICAgICAgICAgRm9yIGRldGFpbHMgYW5kIHJlc3RyaWN0aW9ucywgc2VlIHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vbGljZW5zZS5odG1sIj5Db250ZW50IExpY2Vuc2U8L2E+LgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS90ZXJtcy5odG1sIj5TaXRlIFRlcm1zIG9mIFNlcnZpY2U8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3ByaXZhY3kuaHRtbCI+UHJpdmFjeSBQb2xpY3k8L2E+ICZuZGFzaDsKLSAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2JyYW5kaW5nLmh0bWwiPkJyYW5kIEd1aWRlbGluZXM8L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9kaXY+Ci0gICAgPC9kaXY+Ci0KLSAgICA8c2NyaXB0IHNyYz0iLi4vc3RhdGljL2pxdWVyeS0xLjYuMi5taW4uanMiPjwvc2NyaXB0PgotICAgIDxzY3JpcHQ+Ci0gICAgdmFyIFNJVEVfUk9PVCA9ICcuLi8nOwotICAgIDwvc2NyaXB0PgotICAgIDxzY3JpcHQgc3JjPSIuLi9zdGF0aWMvZGVmYXVsdC5qcyI+PC9zY3JpcHQ+Ci0KLQotICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLSAgICB2YXIgZ2FKc0hvc3QgPSAoKCJodHRwczoiID09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSA/ICJodHRwczovL3NzbC4iIDogImh0dHA6Ly93d3cuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoIiUzQ3NjcmlwdCBzcmM9JyIgKyBnYUpzSG9zdCArICJnb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcycgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyUzRSUzQy9zY3JpcHQlM0UiKSk7Ci0gICAgPC9zY3JpcHQ+Ci0gICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIHZhciBwYWdlVHJhY2tlciA9IF9nYXQuX2dldFRyYWNrZXIoIlVBLTU4MzExNTUtMSIpOwotICAgIHBhZ2VUcmFja2VyLl90cmFja1BhZ2V2aWV3KCk7Ci0gICAgPC9zY3JpcHQ+Ci0gIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvd3JpdGluZy5qZCBiL2RvY3MvaHRtbC9kZXNpZ24vc3R5bGUvd3JpdGluZy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGZkMDNlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2Rlc2lnbi9zdHlsZS93cml0aW5nLmpkCkBAIC0wLDAgKzEsMzMwIEBACitwYWdlLnRpdGxlPVdyaXRpbmcgU3R5bGUKK0BqZDpib2R5CisKKzxzdHlsZT4KKworLyogVUkgdGFibGVzICovCisKKy51aV90YWJsZSB7CisgIHdpZHRoOiAxMDAlOworICBiYWNrZ3JvdW5kOiAjMjgyODI4OworICBjb2xvcjogI2ZmZjsKKyAgYm9yZGVyLXJhZGl1czogMnB4OworICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjI1KTsKKyAgYm9yZGVyLWNvbGxhcHNlOiBzZXBhcmF0ZTsKK30KKworLnVpX3RhYmxlIHRoLAorLnVpX3RhYmxlIHRkIHsKKyAgcGFkZGluZzogNXB4IDEwcHg7Cit9CisKKy51aV90YWJsZSB0aGVhZCB0aCB7CisgIGZvbnQtd2VpZ2h0OiA2MDA7Cit9CisKKy51aV90YWJsZSB0Zm9vdCB0ZCB7CisgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjNDk0OTQ5OworICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNDk0OTQ5OworICB0ZXh0LWFsaWduOiBjZW50ZXI7Cit9CisKKy51aV90YWJsZSB0Zm9vdCB0ZDpsYXN0LWNoaWxkIHsKKyAgYm9yZGVyLXJpZ2h0OiAwOworfQorCisubGlzdF9pdGVtX21hcmdpbnMgeworICBtYXJnaW4tbGVmdDogMzBweCAhaW1wb3J0YW50OworfQorCisuZXhhbXBsZV9sYWJlbCB7CisgIG1hcmdpbi1ib3R0b206IDEwcHg7CisgIHBhZGRpbmctbGVmdDogMjBweDsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZSBuby1yZXBlYXQgc2Nyb2xsIDBweCAzcHg7Cit9CisKKy5leGFtcGxlX2xhYmVsLmJhZCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCh7QGRvY1Jvb3R9YXNzZXRzL2Rlc2lnbi9pY29fd3JvbmcucG5nKTsKK30KKworLmV4YW1wbGVfbGFiZWwuZ29vZCB7CisgIGJhY2tncm91bmQtaW1hZ2U6IHVybCh7QGRvY1Jvb3R9YXNzZXRzL2Rlc2lnbi9pY29fZ29vZC5wbmcpOworfQorCis8L3N0eWxlPgorCis8cD5XaGVuIGNob29zaW5nIHdvcmRzIGZvciB5b3VyIGFwcDo8L3A+Cis8b2w+Cis8bGk+Cis8cD48c3Ryb25nPktlZXAgaXQgYnJpZWYuPC9zdHJvbmc+IEJlIGNvbmNpc2UsIHNpbXBsZSBhbmQgcHJlY2lzZS4gU3RhcnQgd2l0aCBhIDMwIGNoYXJhY3RlciBsaW1pdCAoaW5jbHVkaW5nCisgICBzcGFjZXMpLCBhbmQgZG9uJ3QgdXNlIG1vcmUgdW5sZXNzIGFic29sdXRlbHkgbmVjZXNzYXJ5LjwvcD4KKzwvbGk+Cis8bGk+Cis8cD48c3Ryb25nPktlZXAgaXQgc2ltcGxlLjwvc3Ryb25nPiBQcmV0ZW5kIHlvdSdyZSBzcGVha2luZyB0byBzb21lb25lIHdobydzIHNtYXJ0IGFuZCBjb21wZXRlbnQsIGJ1dCBkb2Vzbid0CisgICBrbm93IHRlY2huaWNhbCBqYXJnb24gYW5kIG1heSBub3Qgc3BlYWsgRW5nbGlzaCB2ZXJ5IHdlbGwuIFVzZSBzaG9ydCB3b3JkcywgYWN0aXZlIHZlcmJzLCBhbmQKKyAgIGNvbW1vbiBub3Vucy48L3A+Cis8L2xpPgorPGxpPgorPHA+PHN0cm9uZz5CZSBmcmllbmRseS48L3N0cm9uZz4gVXNlIGNvbnRyYWN0aW9ucy4gVGFsayBkaXJlY3RseSB0byB0aGUgcmVhZGVyIHVzaW5nIHNlY29uZCBwZXJzb24gKCJ5b3UiKS4gSWYKKyAgIHlvdXIgdGV4dCBkb2Vzbid0IHJlYWQgdGhlIHdheSB5b3UnZCBzYXkgaXQgaW4gY2FzdWFsIGNvbnZlcnNhdGlvbiwgaXQncyBwcm9iYWJseSBub3QgdGhlIHdheQorICAgeW91IHNob3VsZCB3cml0ZSBpdC4gRG9uJ3QgYmUgYWJydXB0IG9yIGFubm95aW5nIGFuZCBtYWtlIHRoZSB1c2VyIGZlZWwgc2FmZSwgaGFwcHkgYW5kCisgICBlbmVyZ2l6ZWQuPC9wPgorPC9saT4KKzxsaT4KKzxwPjxzdHJvbmc+UHV0IHRoZSBtb3N0IGltcG9ydGFudCB0aGluZyBmaXJzdC48L3N0cm9uZz4gVGhlIGZpcnN0IHR3byB3b3JkcyAoYXJvdW5kIDExIGNoYXJhY3RlcnMsIGluY2x1ZGluZworICAgc3BhY2VzKSBzaG91bGQgaW5jbHVkZSBhdCBsZWFzdCBhIHRhc3RlIG9mIHRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpbiB0aGUgc3RyaW5nLiBJZiB0aGV5CisgICBkb24ndCwgc3RhcnQgb3Zlci48L3A+Cis8L2xpPgorPGxpPgorPHA+PHN0cm9uZz5EZXNjcmliZSBvbmx5IHdoYXQncyBuZWNlc3NhcnksIGFuZCBubyBtb3JlLjwvc3Ryb25nPiBEb24ndCB0cnkgdG8gZXhwbGFpbiBzdWJ0bGUgZGlmZmVyZW5jZXMuIFRoZXkKKyAgIHdpbGwgYmUgbG9zdCBvbiBtb3N0IHVzZXJzLjwvcD4KKzwvbGk+Cis8bGk+Cis8cD48c3Ryb25nPkF2b2lkIHJlcGV0aXRpb24uPC9zdHJvbmc+IElmIGEgc2lnbmlmaWNhbnQgdGVybSBnZXRzIHJlcGVhdGVkIHdpdGhpbiBhIHNjcmVlbiBvciBibG9jayBvZiB0ZXh0LCBmaW5kCisgICBhIHdheSB0byB1c2UgaXQganVzdCBvbmNlLjwvcD4KKzwvbGk+Cis8L29sPgorCis8aDIgaWQ9ImV4YW1wbGVzIj5FeGFtcGxlczwvaDI+CisKKzxvbD48bGkgY2xhc3M9InZhbHVlLTEiPjxzdHJvbmc+S2VlcCBpdCBicmllZi48L3N0cm9uZz4gRnJvbSB0aGUgc2V0dXAgd2l6YXJkOjwvb2w+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYgbGlzdF9pdGVtX21hcmdpbnMiPgorCisgICAgPGRpdiBjbGFzcz0iZXhhbXBsZV9sYWJlbCBiYWQiPlRvbyBmb3JtYWw8L2Rpdj4KKworICAgIDx0YWJsZSBjbGFzcz0idWlfdGFibGUgZ29vZCI+PHRib2R5Pjx0cj48dGQ+CisgICAgQ29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGNhbWUgd2l0aCB5b3VyIHBob25lIGZvciBmdXJ0aGVyIGluc3RydWN0aW9ucy4KKyAgICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+QmV0dGVyPC9kaXY+CisKKyAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGdvb2QiPjx0Ym9keT48dHI+PHRkPgorICAgIFJlYWQgdGhlIGluc3RydWN0aW9ucyB0aGF0IGNhbWUgd2l0aCB5b3VyIHBob25lLgorICAgIDwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+CisKKzxvbD48bGkgY2xhc3M9InZhbHVlLTIiPjxzdHJvbmc+S2VlcCBpdCBzaW1wbGUuPC9zdHJvbmc+IEZyb20gdGhlIExvY2F0aW9uIHNldHRpbmdzIHNjcmVlbjo8L29sPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IGxpc3RfaXRlbV9tYXJnaW5zIj4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgYmFkIj5Db25mdXNpbmc8L2Rpdj4KKworICAgIDx0YWJsZSBjbGFzcz0idWlfdGFibGUgYmFkIj4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+CisgICAgICAgIDx0aD4KKyAgICAgICAgVXNlIEdQUyBzYXRlbGxpdGVzCisgICAgICAgIDwvdGg+CisgICAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgIFdoZW4gbG9jYXRpbmcsIGFjY3VyYXRlIHRvIHN0cmVldCBsZXZlbC4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+QmV0dGVyPC9kaXY+CisKKyAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGdvb2QiPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoPgorICAgICAgICBHUFMKKyAgICAgICAgPC90aD4KKyAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgTGV0IGFwcHMgdXNlIHNhdGVsbGl0ZXMgdG8gcGlucG9pbnQgeW91ciBsb2NhdGlvbi4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorCisgIDwvZGl2PgorPC9kaXY+CisKKzxkaXYgY2xhc3M9InZzcGFjZSBzaXplLTEiPiZuYnNwOzwvZGl2PgorCis8b2w+PGxpIGNsYXNzPSJ2YWx1ZS0zIj48c3Ryb25nPkJlIGZyaWVuZGx5Ljwvc3Ryb25nPiBEaWFsb2cgdGhhdCBhcHBlYXJzIHdoZW4gYW4gYXBwbGljYXRpb24KK2NyYXNoZXM6PC9vbD4KKworPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtcm93Ij4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiBsaXN0X2l0ZW1fbWFyZ2lucyI+CisKKyAgICA8ZGl2IGNsYXNzPSJleGFtcGxlX2xhYmVsIGJhZCI+Q29uZnVzaW5nIGFuZCBhbm5veWluZyZtZGFzaDsiU29ycnkiIGp1c3QgcnVicyBzYWx0IGluIHRoZQorICAgIHdvdW5kLjwvZGl2PgorCisgICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBiYWQiPgorICAgIDx0aGVhZD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIGNvbHNwYW49IjMiPgorICAgICAgICBTb3JyeSEKKyAgICAgICAgPC90aD4KKyAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4KKyAgICAgICAgQWN0aXZpdHkgTXlBcHBBY3Rpdml0eSAoaW4gYXBwbGljYXRpb24gTXlBcHApCisgICAgICAgIGlzIG5vdCByZXNwb25kaW5nLgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3Rib2R5PgorICAgIDx0Zm9vdD4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkIHdpZHRoPSIzMyUiPkZvcmNlIGNsb3NlPC90ZD4KKyAgICAgICAgPHRkIHdpZHRoPSIzMyUiPldhaXQ8L3RkPgorICAgICAgICA8dGQgd2lkdGg9IjMzJSI+UmVwb3J0PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+U2hvcnRlciwgbW9yZSBkaXJlY3QsIG5vIGZhdXgtYXBvbG9nZXRpYyB0aXRsZTo8YnI+PGJyPjwvZGl2PgorCisgICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBnb29kIj4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+CisgICAgICAgIDx0aCBjb2xzcGFuPSIzIj4KKyAgICAgICAgTXlBcHAgaXNuJ3QgcmVzcG9uZGluZy4KKyAgICAgICAgPC90aD4KKyAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgICAgICA8dHI+CisgICAgICAgIDx0ZCBjb2xzcGFuPSIzIj4KKyAgICAgICAgRG8geW91IHdhbnQgdG8gY2xvc2UgaXQ/CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGJvZHk+CisgICAgPHRmb290PgorICAgICAgPHRyPgorICAgICAgICA8dGQgd2lkdGg9IjMzJSI+V2FpdDwvdGQ+CisgICAgICAgIDx0ZCB3aWR0aD0iMzMlIj5SZXBvcnQ8L3RkPgorICAgICAgICA8dGQgd2lkdGg9IjMzJSI+Q2xvc2U8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+CisKKyAgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idnNwYWNlIHNpemUtMSI+Jm5ic3A7PC9kaXY+CisKKzxvbD48bGkgY2xhc3M9InZhbHVlLTQiPjxzdHJvbmc+UHV0IHRoZSBtb3N0IGltcG9ydGFudCB0aGluZyBmaXJzdC48L3N0cm9uZz48L29sPgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IGxpc3RfaXRlbV9tYXJnaW5zIj4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgYmFkIj5Ub3AgbmV3cyBsYXN0PC9kaXY+CisKKyAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGJhZCI+PHRib2R5Pjx0cj48dGQ+CisgICAgNzcgb3RoZXIgcGVvcGxlICsxJ2QgdGhpcywgaW5jbHVkaW5nIExhcnJ5IFBhZ2UuCisgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KKworICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0ibGF5b3V0LWNvbnRlbnQtY29sIHNwYW4tNiI+CisKKyAgICA8ZGl2IGNsYXNzPSJleGFtcGxlX2xhYmVsIGdvb2QiPlRvcCBuZXdzIGZpcnN0PC9kaXY+CisKKyAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGdvb2QiPjx0Ym9keT48dHI+PHRkPgorICAgIExhcnJ5IFBhZ2UgYW5kIDc3IG90aGVycyArMSdkIHRoaXMuCisgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1yb3ciPgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02IGxpc3RfaXRlbV9tYXJnaW5zIj4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgYmFkIj5UYXNrIGxhc3Q8L2Rpdj4KKworICAgIDx0YWJsZSBjbGFzcz0idWlfdGFibGUgYmFkIj48dGJvZHk+PHRyPjx0ZD4KKyAgICBUb3VjaCBOZXh0IHRvIGNvbXBsZXRlIHNldHVwIHVzaW5nIGEgV2ktRmkgY29ubmVjdGlvbi4KKyAgICA8L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPgorCisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJsYXlvdXQtY29udGVudC1jb2wgc3Bhbi02Ij4KKworICAgIDxkaXYgY2xhc3M9ImV4YW1wbGVfbGFiZWwgZ29vZCI+VGFzayBmaXJzdDwvZGl2PgorCisgICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBnb29kIj48dGJvZHk+PHRyPjx0ZD4KKyAgICBUbyBmaW5pc2ggc2V0dXAgdXNpbmcgV2ktRmksIHRvdWNoIE5leHQuCisgICAgPC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT4KKworICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGNsYXNzPSJ2c3BhY2Ugc2l6ZS0xIj4mbmJzcDs8L2Rpdj4KKworPG9sPjxsaSBjbGFzcz0idmFsdWUtNSI+PHN0cm9uZz5EZXNjcmliZSBvbmx5IHdoYXQncyBuZWNlc3NhcnksIGFuZCBubyBtb3JlLjwvc3Ryb25nPjwvb2w+CisKKzxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LXJvdyI+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYgbGlzdF9pdGVtX21hcmdpbnMiPgorCisgICAgPGRpdiBjbGFzcz0iZXhhbXBsZV9sYWJlbCBiYWQiPkZyb20gYSBTZXR1cCBXaXphcmQgc2NyZWVuPC9kaXY+CisKKyAgICA8dGFibGUgY2xhc3M9InVpX3RhYmxlIGJhZCI+CisgICAgPHRoZWFkPgorICAgICAgPHRyPgorICAgICAgICA8dGg+CisgICAgICAgIFNpZ25pbmcgaW4uLi4KKyAgICAgICAgPC90aD4KKyAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHk+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD4KKyAgICAgICAgWW91ciBwaG9uZSBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoPGJyPgorICAgICAgICBHb29nbGUgc2VydmVycyB0byBzaWduIGluIHRvIHlvdXIgYWNjb3VudC48YnI+CisgICAgICAgIFRoaXMgbWF5IHRha2UgdXAgdG8gZml2ZSBtaW51dGVzLgorICAgICAgICA8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+CisKKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9ImxheW91dC1jb250ZW50LWNvbCBzcGFuLTYiPgorCisgICAgPGRpdiBjbGFzcz0iZXhhbXBsZV9sYWJlbCBnb29kIj5Gcm9tIGEgU2V0dXAgV2l6YXJkIHNjcmVlbjwvZGl2PgorCisgICAgPHRhYmxlIGNsYXNzPSJ1aV90YWJsZSBnb29kIj4KKyAgICA8dGhlYWQ+CisgICAgICA8dHI+CisgICAgICAgIDx0aD4KKyAgICAgICAgU2lnbmluZyBpbi4uLgorICAgICAgICA8L3RoPgorICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorICAgIDx0Ym9keT4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPgorICAgICAgICBZb3VyIHBob25lIGlzIGNvbnRhY3RpbmcgR29vZ2xlLjxicj4KKyAgICAgICAgVGhpcyBjYW4gdGFrZSB1cCB0byA1IG1pbnV0ZXMuCisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKworICA8L2Rpdj4KKzwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL2FwcGVuZGl4L2luc3RhbGwtbG9jYXRpb24uamQgYi9kb2NzL2h0bWwvZ3VpZGUvYXBwZW5kaXgvaW5zdGFsbC1sb2NhdGlvbi5qZAppbmRleCBlNWVkMjI2Li42M2EzODE3IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvYXBwZW5kaXgvaW5zdGFsbC1sb2NhdGlvbi5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvYXBwZW5kaXgvaW5zdGFsbC1sb2NhdGlvbi5qZApAQCAtMTcyLDkgKzE3Miw5IEBACiBiZWZvcmUgdGhlIGV4dGVybmFsIHN0b3JhZ2UgaXMgbW91bnRlZCB0byB0aGUgZGV2aWNlLiBJZiB5b3VyIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBvbiB0aGUKIGV4dGVybmFsIHN0b3JhZ2UsIGl0IGNhbiBuZXZlciByZWNlaXZlIHRoaXMgYnJvYWRjYXN0LjwvZGQ+CiAgIDxkdD5Db3B5IFByb3RlY3Rpb248L2R0PgotICAgIDxkZD5Zb3VyIGFwcGxpY2F0aW9uIGNhbm5vdCBiZSBpbnN0YWxsZWQgdG8gYSBkZXZpY2UncyBTRCBjYXJkIGlmIGl0IHVzZXMgQW5kcm9pZCBNYXJrZXQncyAKLSAgICAgIENvcHkgUHJvdGVjdGlvbiBmZWF0dXJlLiBIb3dldmVyLCBpZiB5b3UgdXNlIEFuZHJvaWQgTWFya2V0J3MgCi0gICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+IGluc3RlYWQsIHlvdXIgCisgICAgPGRkPllvdXIgYXBwbGljYXRpb24gY2Fubm90IGJlIGluc3RhbGxlZCB0byBhIGRldmljZSdzIFNEIGNhcmQgaWYgaXQgdXNlcyBHb29nbGUgUGxheSdzIAorICAgICAgQ29weSBQcm90ZWN0aW9uIGZlYXR1cmUuIEhvd2V2ZXIsIGlmIHlvdSB1c2UgR29vZ2xlIFBsYXkncyAKKyAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nLmh0bWwiPkFwcGxpY2F0aW9uIExpY2Vuc2luZzwvYT4gaW5zdGVhZCwgeW91ciAKICAgICAgIGFwcGxpY2F0aW9uIDxlbT5jYW48L2VtPiBiZSBpbnN0YWxsZWQgdG8gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgc3RvcmFnZSwgaW5jbHVkaW5nIFNEIGNhcmRzLjwvZGQ+CiA8L2RsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuamQKaW5kZXggZDliMjE1NS4uM2U1MDJkNyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5qZApAQCAtMSw0ICsxLDQgQEAKLXBhZ2UudGl0bGU9TWFya2V0IEZpbHRlcnMKK3BhZ2UudGl0bGU9RmlsdGVycyBvbiBHb29nbGUgUGxheQogQGpkOmJvZHkKIAogPGRpdiBpZD0icXYtd3JhcHBlciI+CkBAIC02LDE1ICs2LDE1IEBACiAKIDxoMj5RdWlja3ZpZXc8L2gyPgogPHVsPgotPGxpPkFuZHJvaWQgTWFya2V0IGFwcGxpZXMgZmlsdGVycyB0aGF0IGNvbnRyb2wgd2hpY2ggQW5kcm9pZC1wb3dlcmVkIGRldmljZXMgY2FuIGFjY2VzcyB5b3VyCi1hcHBsaWNhdGlvbiBvbiBNYXJrZXQuPC9saT4KKzxsaT5Hb29nbGUgUGxheSBhcHBsaWVzIGZpbHRlcnMgdGhhdCBjb250cm9sIHdoaWNoIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2VzIGNhbiBhY2Nlc3MgeW91cgorYXBwbGljYXRpb24gd2hlbiB0aGUgdXNlciBpcyB2aXNpdGluZyB0aGUgc3RvcmUuPC9saT4KIDxsaT5GaWx0ZXJpbmcgaXMgZGV0ZXJtaW5lZCBieSBjb21wYXJpbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb25zIHRoYXQgeW91IGRlY2xhcmUgaW4geW91IGFwcCdzCiBtYW5pZmVzdCBmaWxlIHRvIHRoZSBjb25maWd1cmF0aW9ucyBkZWZpbmVkIGJ5IHRoZSBkZXZpY2UsIGFzIHdlbGwgYXMgb3RoZXIgZmFjdG9ycy48L2xpPiA8L3VsPgogCiA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CiAKIDxvbD4KLSAgPGxpPjxhIGhyZWY9IiNob3ctZmlsdGVycy13b3JrIj5Ib3cgRmlsdGVycyBXb3JrIGluIEFuZHJvaWQgTWFya2V0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjaG93LWZpbHRlcnMtd29yayI+SG93IEZpbHRlcnMgV29yayBvbiBHb29nbGUgUGxheTwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iI21hbmlmZXN0LWZpbHRlcnMiPkZpbHRlcmluZyBiYXNlZCBvbiBNYW5pZmVzdCBFbGVtZW50czwvYT4KICAgICA8b2w+CiAgICAgICA8bGk+PGEgaHJlZj0iI2FkdmFuY2VkLWZpbHRlcnMiPkFkdmFuY2VkIG1hbmlmZXN0IGZpbHRlcnM8L2E+PC9saT4KQEAgLTQ3LDEwICs0NywxMCBAQAogPGRpdiBpZD0icXYtZXh0cmEiPgogICA8aW1nIGlkPSJydWxlIiBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmciPgogICA8ZGl2IGlkPSJxdi1zdWItcnVsZSI+Ci0gICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fbWFya2V0LmpwZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjA7cGFkZGluZzowIDVweDsiPgotICAgIDxoMiBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPkludGVyZXN0ZWQgaW4gcHVibGlzaGluZyB5b3VyIGFwcCBvbiBBbmRyb2lkIE1hcmtldD88L2gyPgorICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX3BsYXkucG5nIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjAgNXB4OyI+CisgICAgPGgyIHN0eWxlPSJjb2xvcjojNjY5OTk5O3BhZGRpbmctdG9wOjFlbTsiPkludGVyZXN0ZWQgaW4gcHVibGlzaGluZyB5b3VyIGFwcCBvbiBHb29nbGUgUGxheT88L2gyPgogICAgIDxwPjxhIGlkPSJwdWJsaXNoLWxpbmsiCi1ocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPkdvIHRvIEFuZHJvaWQgTWFya2V0PC9hPiB0byBjcmVhdGUgYSBwdWJsaXNoZXIKK2hyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5HbyB0byBHb29nbGUgUGxheTwvYT4gdG8gY3JlYXRlIGEgcHVibGlzaGVyCiBhY2NvdW50IGFuZCB1cGxvYWQgeW91ciBhcHAuPC9wPjwvZGl2PgogPC9kaXY+CiAKQEAgLTU4LDQ0ICs1OCw0NCBAQAogPC9kaXY+CiAKIAotPHA+V2hlbiBhIHVzZXIgc2VhcmNoZXMgb3IgYnJvd3NlcyBpbiBBbmRyb2lkIE1hcmtldCBvbiBhbiBBbmRyb2lkIGRldmljZSwgdGhlIHJlc3VsdHMgYXJlIGZpbHRlcmVkCis8cD5XaGVuIGEgdXNlciBzZWFyY2hlcyBvciBicm93c2VzIG9uIEdvb2dsZSBQbGF5IG9uIGFuIEFuZHJvaWQgZGV2aWNlLCB0aGUgcmVzdWx0cyBhcmUgZmlsdGVyZWQKIGJhc2VkIG9uIHdoaWNoIGFwcGxpY2F0aW9ucyBhcmUgY29tcGF0aWJsZSB3aXRoIHRoYXQgZGV2aWNlLiBGb3IgZXhhbXBsZSwgaWYgYW4gYXBwbGljYXRpb24KLXJlcXVpcmVzIGEgY2FtZXJhIChhcyBzcGVjaWZpZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG1hbmlmZXN0IGZpbGUpLCB0aGVuIEFuZHJvaWQgTWFya2V0IHdpbGwgbm90IHNob3cKK3JlcXVpcmVzIGEgY2FtZXJhIChhcyBzcGVjaWZpZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG1hbmlmZXN0IGZpbGUpLCB0aGVuIEdvb2dsZSBQbGF5IHdpbGwgbm90IHNob3cKIHRoZSBhcHAgb24gYW55IGRldmljZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBjYW1lcmEuPC9wPgogCiA8cD5EZWNsYXJhdGlvbnMgaW4gdGhlIG1hbmlmZXN0IGZpbGUgdGhhdCBhcmUgY29tcGFyZWQgdG8gdGhlIGRldmljZSdzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHRoZQogb25seSBwYXJ0IG9mIGhvdyBhcHBsaWNhdGlvbnMgYXJlIGZpbHRlcmVkLiBGaWx0ZXJpbmcgbWlnaHQgYWxzbyBvY2N1ciBkdWUgdG8gdGhlIHVzZXIncyBjb3VudHJ5IGFuZAogY2FycmllciwgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgYSBTSU0gY2FyZCwgYW5kIG90aGVyIGZhY3RvcnMuIDwvcD4KIAotPHA+Q2hhbmdlcyB0byB0aGUgQW5kcm9pZCBNYXJrZXQgZmlsdGVycyBhcmUgaW5kZXBlbmRlbnQgb2YgY2hhbmdlcyB0byB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBpdHNlbGYuCi1UaGlzIGRvY3VtZW50IGlzIHVwZGF0ZWQgcGVyaW9kaWNhbGx5IHRvIHJlZmxlY3QgYW55IGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIHdheSBBbmRyb2lkIE1hcmtldAorPHA+Q2hhbmdlcyB0byB0aGUgR29vZ2xlIFBsYXkgZmlsdGVycyBhcmUgaW5kZXBlbmRlbnQgb2YgY2hhbmdlcyB0byB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBpdHNlbGYuCitUaGlzIGRvY3VtZW50IGlzIHVwZGF0ZWQgcGVyaW9kaWNhbGx5IHRvIHJlZmxlY3QgYW55IGNoYW5nZXMgdGhhdCBhZmZlY3QgdGhlIHdheSBHb29nbGUgUGxheQogZmlsdGVycyBhcHBsaWNhdGlvbnMuPC9wPgogCiAKLTxoMiBpZD0iaG93LWZpbHRlcnMtd29yayI+SG93IEZpbHRlcnMgV29yayBpbiBBbmRyb2lkIE1hcmtldDwvaDI+Cis8aDIgaWQ9Imhvdy1maWx0ZXJzLXdvcmsiPkhvdyBGaWx0ZXJzIFdvcmsgb24gR29vZ2xlIFBsYXk8L2gyPgogCi08cD5BbmRyb2lkIE1hcmtldCB1c2VzIHRoZSBmaWx0ZXIgcmVzdHJpY3Rpb25zIGRlc2NyaWJlZCBiZWxvdyB0byBkZXRlcm1pbmUKKzxwPkdvb2dsZSBQbGF5IHVzZXMgdGhlIGZpbHRlciByZXN0cmljdGlvbnMgZGVzY3JpYmVkIGJlbG93IHRvIGRldGVybWluZQogd2hldGhlciB0byBzaG93IHlvdXIgYXBwbGljYXRpb24gdG8gYSB1c2VyIHdobyBpcyBicm93c2luZyBvciBzZWFyY2hpbmcgZm9yCi1hcHBsaWNhdGlvbnMgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwLiBXaGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gZGlzcGxheSB5b3VyIGFwcCwKLU1hcmtldCBjaGVja3MgdGhlIGRldmljZSdzIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBjb25maWd1cmF0aW9uLCBhcyB3ZWxsIGFzIGl0J3MKK2FwcGxpY2F0aW9ucyBmcm9tIHRoZSBHb29nbGUgUGxheSBhcHAuIFdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byBkaXNwbGF5IHlvdXIgYXBwLAorR29vZ2xlIFBsYXkgY2hlY2tzIHRoZSBkZXZpY2UncyBoYXJkd2FyZSBhbmQgc29mdHdhcmUgY29uZmlndXJhdGlvbiwgYXMgd2VsbCBhcyBpdCdzCiBjYXJyaWVyLCBsb2NhdGlvbiwgYW5kIG90aGVyIGNoYXJhY3RlcmlzdGljcy4gSXQgdGhlbiBjb21wYXJlcyB0aG9zZSBhZ2FpbnN0IHRoZQogcmVzdHJpY3Rpb25zIGFuZCBkZXBlbmRlbmNpZXMgZXhwcmVzc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbidzCiBtYW5pZmVzdCBmaWxlIGFuZCBwdWJsaXNoaW5nIGRldGFpbHMuIElmIHRoZSBhcHBsaWNhdGlvbiBpcwotY29tcGF0aWJsZSB3aXRoIHRoZSBkZXZpY2UgYWNjb3JkaW5nIHRvIHRoZSBmaWx0ZXIgcnVsZXMsIE1hcmtldCBkaXNwbGF5cyB0aGUKLWFwcGxpY2F0aW9uIHRvIHRoZSB1c2VyLiBPdGhlcndpc2UsIE1hcmtldCBoaWRlcyB5b3VyIGFwcGxpY2F0aW9uIGZyb20gc2VhcmNoCitjb21wYXRpYmxlIHdpdGggdGhlIGRldmljZSBhY2NvcmRpbmcgdG8gdGhlIGZpbHRlciBydWxlcywgR29vZ2xlIFBsYXkgZGlzcGxheXMgdGhlCithcHBsaWNhdGlvbiB0byB0aGUgdXNlci4gT3RoZXJ3aXNlLCBHb29nbGUgUGxheSBoaWRlcyB5b3VyIGFwcGxpY2F0aW9uIGZyb20gc2VhcmNoCiByZXN1bHRzIGFuZCBjYXRlZ29yeSBicm93c2luZywgZXZlbiBpZiBhIHVzZXIgc3BlY2lmaWNhbGx5IHJlcXVlc3RzCi10aGUgYXBwIGJ5IGNsaWNraW5nIGEgZGVlcCBsaW5rIHRoYXQgcG9pbnRzIGRpcmVjdGx5IHRvIHRoZSBhcHAncyBJRCB3aXRoaW4gTWFya2V0Li48L3A+Cit0aGUgYXBwIGJ5IGNsaWNraW5nIGEgZGVlcCBsaW5rIHRoYXQgcG9pbnRzIGRpcmVjdGx5IHRvIHRoZSBhcHAncyBJRCB3aXRoaW4gR29vZ2xlIFBsYXkuLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hlbiB1c2VycyBicm93c2UgdGhlIDxhCi1ocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tIj5BbmRyb2lkIE1hcmtldCB3ZWIgc2l0ZTwvYT4sIHRoZXkgY2FuIHNlZSBhbGwgcHVibGlzaGVkCi1hcHBsaWNhdGlvbnMuIFRoZSBBbmRyb2lkIE1hcmtldCB3ZWIgc2l0ZSBjb21wYXJlcyB0aGUgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzIHRvIGVhY2ggb2YgdGhlCitocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMiPkdvb2dsZSBQbGF5IHdlYiBzaXRlPC9hPiwgdGhleSBjYW4gc2VlIGFsbCBwdWJsaXNoZWQKK2FwcGxpY2F0aW9ucy4gVGhlIEdvb2dsZSBQbGF5IHdlYiBzaXRlIGNvbXBhcmVzIHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMgdG8gZWFjaCBvZiB0aGUKIHVzZXIncyByZWdpc3RlcmVkIGRldmljZXMgZm9yIGNvbXBhdGliaWxpdHksIHRob3VnaCwgYW5kIG9ubHkgYWxsb3dzIHRoZW0gdG8gaW5zdGFsbCB0aGUgYXBwbGljYXRpb24KIGlmIGl0J3MgY29tcGF0aWJsZSB3aXRoIHRoZWlyIGRldmljZS48L3A+CiAKIDxwPllvdSBjYW4gdXNlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgYXZhaWxhYmxlIGZpbHRlcnMgZm9yIHlvdXIgYXBwLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBzZXQgYQogPGNvZGU+bWluU2RrVmVyc2lvbjwvY29kZT4gcmVxdWlyZW1lbnQgb2YgPGNvZGU+IjQiPC9jb2RlPiBhbmQgc2V0IDxjb2RlPnNtYWxsU2NyZWVucz0iZmFsc2UiPC9jb2RlPgotaW4gdGhlIGFwcCwgdGhlbiB3aGVuIHVwbG9hZGluZyB0aGUgYXBwIHRvIE1hcmtldCB5b3UgY291bGQgdGFyZ2V0IEV1cm9wZWFuIGNvdW50cmllcyAoY2FycmllcnMpCi1vbmx5LiBBbmRyb2lkIE1hcmtldCdzIGZpbHRlcnMgd2lsbCB0aHVzIHByZXZlbnQgdGhlIGFwcGxpY2F0aW9uIGZyb20gYmVpbmcgYXZhaWxhYmxlIG9uIGFueSBkZXZpY2UKK2luIHRoZSBhcHAsIHRoZW4gd2hlbiB1cGxvYWRpbmcgdGhlIGFwcCB0byBHb29nbGUgUGxheSB5b3UgY291bGQgdGFyZ2V0IEV1cm9wZWFuIGNvdW50cmllcyAoY2FycmllcnMpCitvbmx5LiBHb29nbGUgUGxheSdzIGZpbHRlcnMgd2lsbCB0aHVzIHByZXZlbnQgdGhlIGFwcGxpY2F0aW9uIGZyb20gYmVpbmcgYXZhaWxhYmxlIG9uIGFueSBkZXZpY2UKIHRoYXQgZG9lcyBub3QgbWF0Y2ggYWxsIHRocmVlIG9mIHRoZXNlIHJlcXVpcmVtZW50cy4gPC9wPgogCiA8cD5BbGwgZmlsdGVyaW5nIHJlc3RyaWN0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIGFuIGFwcGxpY2F0aW9uJ3MgdmVyc2lvbiBhbmQgY2FuCkBAIC0xMDYsMTUgKzEwNiwxNSBAQAogCiA8aDIgaWQ9Im1hbmlmZXN0LWZpbHRlcnMiPkZpbHRlcmluZyBiYXNlZCBvbiBNYW5pZmVzdCBFbGVtZW50czwvaDI+CiAKLTxwPk1vc3QgTWFya2V0IGZpbHRlcnMgYXJlIHRyaWdnZXJlZCBieSBlbGVtZW50cyB3aXRoaW4gYW4gYXBwbGljYXRpb24ncworPHA+TW9zdCBmaWx0ZXJzIGFyZSB0cmlnZ2VyZWQgYnkgZWxlbWVudHMgd2l0aGluIGFuIGFwcGxpY2F0aW9uJ3MKIG1hbmlmZXN0IGZpbGUsIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWludHJvLmh0bWwiPkFuZHJvaWRNYW5pZmVzdC54bWw8L2E+CiAoYWx0aG91Z2ggbm90IGV2ZXJ5dGhpbmcgaW4gdGhlIG1hbmlmZXN0IGZpbGUgY2FuIHRyaWdnZXIgZmlsdGVyaW5nKS4KLVRhYmxlIDEgbGlzdHMgdGhlIG1hbmlmZXN0IGVsZW1lbnRzIHRoYXQgeW91IHNob3VsZCB1c2UgdG8gdHJpZ2dlciBBbmRyb2lkCi1NYXJrZXQgZmlsdGVyaW5nLCBhbmQgZXhwbGFpbnMgaG93IHRoZSBmaWx0ZXJpbmcgZm9yIGVhY2ggZWxlbWVudCB3b3Jrcy48L3A+CitUYWJsZSAxIGxpc3RzIHRoZSBtYW5pZmVzdCBlbGVtZW50cyB0aGF0IHlvdSBzaG91bGQgdXNlIHRvIHRyaWdnZXIKK2ZpbHRlcmluZywgYW5kIGV4cGxhaW5zIGhvdyB0aGUgZmlsdGVyaW5nIGZvciBlYWNoIGVsZW1lbnQgd29ya3MuPC9wPgogCiA8cCBpZD0idGFibGUxIiBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAxLjwvc3Ryb25nPiBNYW5pZmVzdCBlbGVtZW50cyB0aGF0Ci10cmlnZ2VyIGZpbHRlcmluZyBvbiBNYXJrZXQuPC9wPgordHJpZ2dlciBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXkuPC9wPgogPHRhYmxlPgogICA8dHI+CiAgICAgPHRoPk1hbmlmZXN0IEVsZW1lbnQ8L3RoPgpAQCAtMTI5LDE5ICsxMjksMTkgQEAKIAogPHA+QW4gYXBwbGljYXRpb24gaW5kaWNhdGVzIHRoZSBzY3JlZW4gc2l6ZXMgdGhhdCBpdCBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgYnkKIHNldHRpbmcgYXR0cmlidXRlcyBvZiB0aGUgPGNvZGU+Jmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7PC9jb2RlPiBlbGVtZW50LiBXaGVuCi10aGUgYXBwbGljYXRpb24gaXMgcHVibGlzaGVkLCBNYXJrZXQgdXNlcyB0aG9zZSBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSB3aGV0aGVyCit0aGUgYXBwbGljYXRpb24gaXMgcHVibGlzaGVkLCBHb29nbGUgUGxheSB1c2VzIHRob3NlIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKIHRvIHNob3cgdGhlIGFwcGxpY2F0aW9uIHRvIHVzZXJzLCBiYXNlZCBvbiB0aGUgc2NyZWVuIHNpemVzIG9mIHRoZWlyCiBkZXZpY2VzLiA8L3A+CiAKLTxwPkFzIGEgZ2VuZXJhbCBydWxlLCBNYXJrZXQgYXNzdW1lcyB0aGF0IHRoZSBwbGF0Zm9ybSBvbiB0aGUgZGV2aWNlIGNhbiBhZGFwdAorPHA+QXMgYSBnZW5lcmFsIHJ1bGUsIEdvb2dsZSBQbGF5IGFzc3VtZXMgdGhhdCB0aGUgcGxhdGZvcm0gb24gdGhlIGRldmljZSBjYW4gYWRhcHQKIHNtYWxsZXIgbGF5b3V0cyB0byBsYXJnZXIgc2NyZWVucywgYnV0IGNhbm5vdCBhZGFwdCBsYXJnZXIgbGF5b3V0cyB0byBzbWFsbGVyCiBzY3JlZW5zLiBUaHVzLCBpZiBhbiBhcHBsaWNhdGlvbiBkZWNsYXJlcyBzdXBwb3J0IGZvciAibm9ybWFsIiBzY3JlZW4gc2l6ZSBvbmx5LAotTWFya2V0IG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBhdmFpbGFibGUgdG8gYm90aCBub3JtYWwtIGFuZCBsYXJnZS1zY3JlZW4gZGV2aWNlcywKK0dvb2dsZSBQbGF5IG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBhdmFpbGFibGUgdG8gYm90aCBub3JtYWwtIGFuZCBsYXJnZS1zY3JlZW4gZGV2aWNlcywKIGJ1dCBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBzbyB0aGF0IGl0IGlzIG5vdCBhdmFpbGFibGUgdG8gc21hbGwtc2NyZWVuCiBkZXZpY2VzLjwvcD4KIAogPHA+SWYgYW4gYXBwbGljYXRpb24gZG9lcyBub3QgZGVjbGFyZSBhdHRyaWJ1dGVzIGZvcgotPGNvZGU+Jmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7PC9jb2RlPiwgTWFya2V0IHVzZXMgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aG9zZQorPGNvZGU+Jmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7PC9jb2RlPiwgR29vZ2xlIFBsYXkgdXNlcyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRob3NlCiBhdHRyaWJ1dGVzLCB3aGljaCB2YXJ5IGJ5IEFQSSBMZXZlbC4gU3BlY2lmaWNhbGx5OiA8L3A+CiAKIDx1bD4KQEAgLTE1MCw3ICsxNTAsNyBAQAogbWluU2RrVmVyc2lvbjwvYT48L2NvZGU+IG9yIDxjb2RlPjxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCN0YXJnZXQiPmFuZHJvaWQ6CiB0YXJnZXRTZGtWZXJzaW9uPC9hPjwvY29kZT4gdG8gMyBvciBsb3dlciwgdGhlIDxjb2RlPiZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0OzwvY29kZT4gZWxlbWVudCBpdHNlbGYKLWlzIHVuZGVmaW5lZCBhbmQgbm8gYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlLiBJbiB0aGlzIGNhc2UsIE1hcmtldCBhc3N1bWVzIHRoYXQKK2lzIHVuZGVmaW5lZCBhbmQgbm8gYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlLiBJbiB0aGlzIGNhc2UsIEdvb2dsZSBQbGF5IGFzc3VtZXMgdGhhdAogdGhlIGFwcGxpY2F0aW9uIGlzIGRlc2lnbmVkIGZvciBub3JtYWwtc2l6ZSBzY3JlZW5zIGFuZCBzaG93cyB0aGUgYXBwbGljYXRpb24gdG8KIGRldmljZXMgdGhhdCBoYXZlIG5vcm1hbCBvciBsYXJnZXIgc2NyZWVucy4gPC9wPgogCkBAIC0xNjYsMTkgKzE2NiwxOSBAQAogICAgIDxwPjxzdHJvbmc+RXhhbXBsZSAxPC9zdHJvbmc+PGJyIC8+CiAgICAgVGhlIG1hbmlmZXN0IGRlY2xhcmVzIDxjb2RlPiZsdDt1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiJmd0OzwvY29kZT4KICAgICBhbmQgZG9lcyBub3QgaW5jbHVkZSBhIDxjb2RlPiZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0OzwvY29kZT4gZWxlbWVudC4KLSAgICA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogQW5kcm9pZCBNYXJrZXQgZG9lcyBub3Qgc2hvdyB0aGUgYXBwIHRvIGEgdXNlciBvZiBhCi0gICAgc21hbGwtc2NyZWVuIGRldmljZSwgYnV0IGRvZXMgc2hvdyBpdCB0byB1c2VycyBvZiBub3JtYWwgYW5kIGxhcmdlLXNjcmVlbgotICAgIGRldmljZXMsIHVubGVzcyAgb3RoZXIgZmlsdGVycyBhbHNvIGV4Y2x1ZGUgdGhvc2UgZGV2aWNlcy4gPC9wPgorICAgIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSB3aWxsIG5vdCBzaG93IHRoZSBhcHAgdG8gYSB1c2VyIG9mIGEKKyAgICBzbWFsbC1zY3JlZW4gZGV2aWNlLCBidXQgd2lsbCBzaG93IGl0IHRvIHVzZXJzIG9mIG5vcm1hbCBhbmQgbGFyZ2Utc2NyZWVuCisgICAgZGV2aWNlcywgdW5sZXNzICBvdGhlciBmaWx0ZXJzIGFwcGx5LiA8L3A+CiAgICAgPHA+PHN0cm9uZz5FeGFtcGxlIDI8YnIgLz4KICAgICA8L3N0cm9uZz5UaGUgbWFuaWZlc3QgZGVjbGFyZXMgPGNvZGU+Jmx0O3VzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIKICAgICBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjQiJmd0OzwvY29kZT4gYW5kIGRvZXMgbm90IGluY2x1ZGUgYQogICAgIDxjb2RlPiZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0OzwvY29kZT4gZWxlbWVudC4KLSAgICA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogQW5kcm9pZCBNYXJrZXQgd2lsbCBzaG93IHRoZSBhcHAgdG8gdXNlcnMgb24gYWxsCisgICAgPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEdvb2dsZSBQbGF5IHdpbGwgc2hvdyB0aGUgYXBwIHRvIHVzZXJzIG9uIGFsbAogICAgIGRldmljZXMsIHVubGVzcyBvdGhlciBmaWx0ZXJzIGFwcGx5LiA8L3A+CiAgICAgPHA+PHN0cm9uZz5FeGFtcGxlIDM8YnIgLz4KICAgICA8L3N0cm9uZz5UaGUgbWFuaWZlc3QgZGVjbGFyZXMgPGNvZGU+Jmx0O3VzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNCImZ3Q7PC9jb2RlPgogICAgIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGEgPGNvZGU+Jmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7PC9jb2RlPiBlbGVtZW50LgotICAgIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBBbmRyb2lkIE1hcmtldCB3aWxsIHNob3cgdGhlIGFwcCB0byBhbGwgdXNlcnMsCisgICAgPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEdvb2dsZSBQbGF5IHdpbGwgc2hvdyB0aGUgYXBwIHRvIGFsbCB1c2VycywKICAgICB1bmxlc3MgIG90aGVyIGZpbHRlcnMgYXBwbHkuIDwvcD4KICAgICA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZGVjbGFyZSBzdXBwb3J0IGZvciBzY3JlZW4gc2l6ZXMgaW4geW91cgogICAgIGFwcGxpY2F0aW9uLCBzZWUgPGNvZGU+PGEKQEAgLTE5NSwxMSArMTk1LDExIEBACiAgICAgQ29uZmlndXJhdGlvbjogPGJyIC8+CiAgICAga2V5Ym9hcmQsIG5hdmlnYXRpb24sIHRvdWNoIHNjcmVlbjwvdGQ+CiAgICAgPHRkIHZhbGlnbj0idG9wIj48cD5BbiBhcHBsaWNhdGlvbiBjYW4KLSAgICByZXF1ZXN0IGNlcnRhaW4gaGFyZHdhcmUgZmVhdHVyZXMsIGFuZCBBbmRyb2lkIE1hcmtldCB3aWxsICBzaG93IHRoZSBhcHAgb25seSBvbiBkZXZpY2VzIHRoYXQgaGF2ZSB0aGUgcmVxdWlyZWQgaGFyZHdhcmUuPC9wPgorICAgIHJlcXVlc3QgY2VydGFpbiBoYXJkd2FyZSBmZWF0dXJlcywgYW5kIEdvb2dsZSBQbGF5IHdpbGwgIHNob3cgdGhlIGFwcCBvbmx5IG9uIGRldmljZXMgdGhhdCBoYXZlIHRoZSByZXF1aXJlZCBoYXJkd2FyZS48L3A+CiAgICAgICA8cD48c3Ryb25nPkV4YW1wbGUgMTxiciAvPgotICAgICAgPC9zdHJvbmc+VGhlIG1hbmlmZXN0IGluY2x1ZGVzIDxjb2RlPiZsdDt1c2VzLWNvbmZpZ3VyYXRpb24gYW5kcm9pZDpyZXFGaXZlV2F5TmF2PSZxdW90O3RydWUmcXVvdDsgLyZndDs8L2NvZGU+LCBhbmQgYSB1c2VyIGlzIHNlYXJjaGluZyBmb3IgYXBwcyBvbiBhIGRldmljZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBmaXZlLXdheSBuYXZpZ2F0aW9uYWwgY29udHJvbC4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEFuZHJvaWQgTWFya2V0IHdpbGwgbm90IHNob3cgdGhlIGFwcCB0byB0aGUgdXNlci4gPC9wPgorICAgICAgPC9zdHJvbmc+VGhlIG1hbmlmZXN0IGluY2x1ZGVzIDxjb2RlPiZsdDt1c2VzLWNvbmZpZ3VyYXRpb24gYW5kcm9pZDpyZXFGaXZlV2F5TmF2PSZxdW90O3RydWUmcXVvdDsgLyZndDs8L2NvZGU+LCBhbmQgYSB1c2VyIGlzIHNlYXJjaGluZyBmb3IgYXBwcyBvbiBhIGRldmljZSB0aGF0IGRvZXMgbm90IGhhdmUgYSBmaXZlLXdheSBuYXZpZ2F0aW9uYWwgY29udHJvbC4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEdvb2dsZSBQbGF5IHdpbGwgbm90IHNob3cgdGhlIGFwcCB0byB0aGUgdXNlci4gPC9wPgogICAgICAgPHA+PHN0cm9uZz5FeGFtcGxlIDI8YnIgLz4KLSAgICAgIDwvc3Ryb25nPlRoZSBtYW5pZmVzdCBkb2VzIG5vdCBpbmNsdWRlIGEgPGNvZGU+Jmx0O3VzZXMtY29uZmlndXJhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQuIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBBbmRyb2lkIE1hcmtldCB3aWxsIHNob3cgdGhlIGFwcCB0byBhbGwgdXNlcnMsIHVubGVzcyBvdGhlciBmaWx0ZXJzIGFwcGx5LjwvcD4KKyAgICAgIDwvc3Ryb25nPlRoZSBtYW5pZmVzdCBkb2VzIG5vdCBpbmNsdWRlIGEgPGNvZGU+Jmx0O3VzZXMtY29uZmlndXJhdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQuIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSB3aWxsIHNob3cgdGhlIGFwcCB0byBhbGwgdXNlcnMsIHVubGVzcyBvdGhlciBmaWx0ZXJzIGFwcGx5LjwvcD4KIDxwPkZvciBtb3JlIGRldGFpbHMsIHNlZSAgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1jb25maWd1cmF0aW9uLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtY29uZmlndXJhdGlvbiZndDs8L2NvZGU+PC9hPi48L3A+PC90ZD4KICAgPC90cj4KQEAgLTIxOCwxNiArMjE4LDE2IEBACiAgICAgICA8L3N0cm9uZz5UaGUgbWFuaWZlc3QgaW5jbHVkZXMgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZQogYW5kcm9pZDpuYW1lPSZxdW90O2FuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmxpZ2h0JnF1b3Q7IC8mZ3Q7PC9jb2RlPiwgYW5kIGEgdXNlcgogaXMgc2VhcmNoaW5nIGZvciBhcHBzIG9uIGEgZGV2aWNlIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGxpZ2h0IHNlbnNvci4KLTxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBBbmRyb2lkIE1hcmtldCB3aWxsIG5vdCBzaG93IHRoZSBhcHAgdG8gdGhlIHVzZXIuIDwvcD4KKzxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSB3aWxsIG5vdCBzaG93IHRoZSBhcHAgdG8gdGhlIHVzZXIuIDwvcD4KICAgICAgIDxwPjxzdHJvbmc+RXhhbXBsZSAyPGJyIC8+CiAgICAgICA8L3N0cm9uZz5UaGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZSBhIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPgotZWxlbWVudC4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEFuZHJvaWQgTWFya2V0IHdpbGwgc2hvdyB0aGUgYXBwIHRvIGFsbCB1c2VycywKK2VsZW1lbnQuIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSB3aWxsIHNob3cgdGhlIGFwcCB0byBhbGwgdXNlcnMsCiB1bmxlc3Mgb3RoZXIgZmlsdGVycyBhcHBseS48L3A+CiAgICAgICA8cD5Gb3IgY29tcGxldGUgaW5mb3JtYXRpb24sIHNlZSA8Y29kZT48YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sIj4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvYT4KIDwvY29kZT4uPC9wPgotICAgICAgPHA+PGVtPkZpbHRlcmluZyBiYXNlZCBvbiBpbXBsaWVkIGZlYXR1cmVzOjwvZW0+IEluIHNvbWUgY2FzZXMsIEFuZHJvaWQKLU1hcmtldCBpbnRlcnByZXRzIHBlcm1pc3Npb25zIHJlcXVlc3RlZCB0aHJvdWdoCisgICAgICA8cD48ZW0+RmlsdGVyaW5nIGJhc2VkIG9uIGltcGxpZWQgZmVhdHVyZXM6PC9lbT4gSW4gc29tZSBjYXNlcywgR29vZ2xlCitQbGF5IGludGVycHJldHMgcGVybWlzc2lvbnMgcmVxdWVzdGVkIHRocm91Z2gKIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcyBmZWF0dXJlIHJlcXVpcmVtZW50cyBlcXVpdmFsZW50CiB0byB0aG9zZSBkZWNsYXJlZCBpbiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMuIFNlZSA8YQogaHJlZj0iI3VzZXMtcGVybWlzc2lvbi1maWx0ZXJpbmciPjxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPjwvYT4sCkBAIC0yNDUsMTkgKzI0NSwxOSBAQAogICAgICAgPHA+PHN0cm9uZz5FeGFtcGxlIDE8YnIgLz4KICAgICAgIDwvc3Ryb25nPkFuIGFwcAogICAgICAgICByZXF1ZXN0cyBtdWx0aXBsZSBPcGVuR0wtRVMgdmVyc2lvbnMgYnkgc3BlY2lmeWluZyA8Y29kZT5vcGVuR2xFc1ZlcnNpb248L2NvZGU+IG11bHRpcGxlIHRpbWVzIGluIHRoZQotICAgICAgICBtYW5pZmVzdC4gIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBNYXJrZXQgYXNzdW1lcyB0aGF0IHRoZSBhcHAgcmVxdWlyZXMgdGhlIGhpZ2hlc3Qgb2YgdGhlIGluZGljYXRlZCB2ZXJzaW9ucy48L3A+CisgICAgICAgIG1hbmlmZXN0LiAgPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEdvb2dsZSBQbGF5IGFzc3VtZXMgdGhhdCB0aGUgYXBwIHJlcXVpcmVzIHRoZSBoaWdoZXN0IG9mIHRoZSBpbmRpY2F0ZWQgdmVyc2lvbnMuPC9wPgogPHA+PHN0cm9uZz5FeGFtcGxlIDI8YnIgLz4KIDwvc3Ryb25nPkFuIGFwcAotICAgICAgICByZXF1ZXN0cyBPcGVuR0wtRVMgdmVyc2lvbiAxLjEsIGFuZCBhIHVzZXIgaXMgc2VhcmNoaW5nIGZvciBhcHBzIG9uIGEgZGV2aWNlIHRoYXQgc3VwcG9ydHMgT3BlbkdMLUVTIHZlcnNpb24gMi4wLiA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogQW5kcm9pZCBNYXJrZXQgd2lsbCBzaG93IHRoZSBhcHAgdG8gdGhlIHVzZXIsIHVubGVzcyBvdGhlciBmaWx0ZXJzIGFwcGx5LiBJZiBhCi0gIGRldmljZSByZXBvcnRzIHRoYXQgaXQgc3VwcG9ydHMgT3BlbkdMLUVTIHZlcnNpb24gPGVtPlg8L2VtPiwgIE1hcmtldCBhc3N1bWVzIHRoYXQgaXQKKyAgICAgICAgcmVxdWVzdHMgT3BlbkdMLUVTIHZlcnNpb24gMS4xLCBhbmQgYSB1c2VyIGlzIHNlYXJjaGluZyBmb3IgYXBwcyBvbiBhIGRldmljZSB0aGF0IHN1cHBvcnRzIE9wZW5HTC1FUyB2ZXJzaW9uIDIuMC4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEdvb2dsZSBQbGF5IHdpbGwgc2hvdyB0aGUgYXBwIHRvIHRoZSB1c2VyLCB1bmxlc3Mgb3RoZXIgZmlsdGVycyBhcHBseS4gSWYgYQorICBkZXZpY2UgcmVwb3J0cyB0aGF0IGl0IHN1cHBvcnRzIE9wZW5HTC1FUyB2ZXJzaW9uIDxlbT5YPC9lbT4sICBHb29nbGUgUGxheSBhc3N1bWVzIHRoYXQgaXQKICAgYWxzbyBzdXBwb3J0cyBhbnkgdmVyc2lvbiBlYXJsaWVyIHRoYW4gPGVtPlg8L2VtPi4KIDwvcD4KIDxwPjxzdHJvbmc+RXhhbXBsZSAzPGJyIC8+CiA8L3N0cm9uZz5BIHVzZXIgaXMgc2VhcmNoaW5nIGZvciBhcHBzIG9uIGEgZGV2aWNlIHRoYXQgZG9lcyBub3QKLSAgICAgICAgcmVwb3J0IGFuIE9wZW5HTC1FUyB2ZXJzaW9uIChmb3IgZXhhbXBsZSwgYSBkZXZpY2UgcnVubmluZyBBbmRyb2lkIDEuNSBvciBlYXJsaWVyKS4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEFuZHJvaWQgTWFya2V0IGFzc3VtZXMgdGhhdCB0aGUgZGV2aWNlCi0gIHN1cHBvcnRzIG9ubHkgT3BlbkdMLUVTIDEuMC4gTWFya2V0IHdpbGwgb25seSBzaG93IHRoZSB1c2VyIGFwcHMgdGhhdCBkbyBub3Qgc3BlY2lmeSA8Y29kZT5vcGVuR2xFc1ZlcnNpb248L2NvZGU+LCBvciBhcHBzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW4gT3BlbkdMLUVTIHZlcnNpb24gaGlnaGVyIHRoYW4gMS4wLiA8L3A+CisgICAgICAgIHJlcG9ydCBhbiBPcGVuR0wtRVMgdmVyc2lvbiAoZm9yIGV4YW1wbGUsIGEgZGV2aWNlIHJ1bm5pbmcgQW5kcm9pZCAxLjUgb3IgZWFybGllcikuIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSBhc3N1bWVzIHRoYXQgdGhlIGRldmljZQorICBzdXBwb3J0cyBvbmx5IE9wZW5HTC1FUyAxLjAuIEdvb2dsZSBQbGF5IHdpbGwgb25seSBzaG93IHRoZSB1c2VyIGFwcHMgdGhhdCBkbyBub3Qgc3BlY2lmeSA8Y29kZT5vcGVuR2xFc1ZlcnNpb248L2NvZGU+LCBvciBhcHBzIHRoYXQgZG8gbm90IHNwZWNpZnkgYW4gT3BlbkdMLUVTIHZlcnNpb24gaGlnaGVyIHRoYW4gMS4wLiA8L3A+CiAgICAgICA8cD48c3Ryb25nPkV4YW1wbGUgNDxiciAvPgotICAgICAgPC9zdHJvbmc+VGhlIG1hbmlmZXN0IGRvZXMgbm90IHNwZWNpZnkgPGNvZGU+b3BlbkdsRXNWZXJzaW9uPC9jb2RlPi4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEFuZHJvaWQgTWFya2V0IHdpbGwgc2hvdyB0aGUgYXBwIHRvIGFsbCB1c2VycywgdW5sZXNzIG90aGVyIGZpbHRlcnMgYXBwbHkuIDwvcD4KKyAgICAgIDwvc3Ryb25nPlRoZSBtYW5pZmVzdCBkb2VzIG5vdCBzcGVjaWZ5IDxjb2RlPm9wZW5HbEVzVmVyc2lvbjwvY29kZT4uIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSB3aWxsIHNob3cgdGhlIGFwcCB0byBhbGwgdXNlcnMsIHVubGVzcyBvdGhlciBmaWx0ZXJzIGFwcGx5LiA8L3A+CiA8cD5Gb3IgbW9yZSBkZXRhaWxzLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+PC9hPi48L3A+PC90ZD4KICAgPC90cj4KQEAgLTI2OCwyOCArMjY4LDI4IEBACiAgICAgPHRkIHZhbGlnbj0idG9wIj48cD5BbiBhcHBsaWNhdGlvbiBjYW4gcmVxdWlyZSBzcGVjaWZpYwogICAgIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgcHJlc2VudCBvbiB0aGUgZGV2aWNlLiA8L3A+CiAgICAgICA8cD48c3Ryb25nPkV4YW1wbGUgMTxiciAvPgotICAgICAgPC9zdHJvbmc+QW4gYXBwIHJlcXVpcmVzIHRoZSA8Y29kZT5jb20uZ29vZ2xlLmFuZHJvaWQubWFwczwvY29kZT4gbGlicmFyeSwgYW5kIGEgdXNlciBpcyBzZWFyY2hpbmcgZm9yIGFwcHMgb24gYSBkZXZpY2UgdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSA8Y29kZT5jb20uZ29vZ2xlLmFuZHJvaWQubWFwczwvY29kZT4gbGlicmFyeS4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEFuZHJvaWQgTWFya2V0IHdpbGwgbm90IHNob3cgdGhlIGFwcCB0byB0aGUgdXNlci4gPC9wPgorICAgICAgPC9zdHJvbmc+QW4gYXBwIHJlcXVpcmVzIHRoZSA8Y29kZT5jb20uZ29vZ2xlLmFuZHJvaWQubWFwczwvY29kZT4gbGlicmFyeSwgYW5kIGEgdXNlciBpcyBzZWFyY2hpbmcgZm9yIGFwcHMgb24gYSBkZXZpY2UgdGhhdCBkb2VzIG5vdCBoYXZlIHRoZSA8Y29kZT5jb20uZ29vZ2xlLmFuZHJvaWQubWFwczwvY29kZT4gbGlicmFyeS4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEdvb2dsZSBQbGF5IHdpbGwgbm90IHNob3cgdGhlIGFwcCB0byB0aGUgdXNlci4gPC9wPgogICAgICAgPHA+PHN0cm9uZz5FeGFtcGxlIDI8L3N0cm9uZz48YnIgLz4KLSAgICAgICAgVGhlIG1hbmlmZXN0IGRvZXMgbm90IGluY2x1ZGUgYSA8Y29kZT4mbHQ7dXNlcy1saWJyYXJ5Jmd0OzwvY29kZT4gZWxlbWVudC4gPHN0cm9uZz5SZXN1bHQ8L3N0cm9uZz46IEFuZHJvaWQgTWFya2V0IHdpbGwgc2hvdyB0aGUgYXBwIHRvIGFsbCB1c2VycywgdW5sZXNzIG90aGVyIGZpbHRlcnMgYXBwbHkuPC9wPgorICAgICAgICBUaGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZSBhIDxjb2RlPiZsdDt1c2VzLWxpYnJhcnkmZ3Q7PC9jb2RlPiBlbGVtZW50LiA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogR29vZ2xlIFBsYXkgd2lsbCBzaG93IHRoZSBhcHAgdG8gYWxsIHVzZXJzLCB1bmxlc3Mgb3RoZXIgZmlsdGVycyBhcHBseS48L3A+CiA8cD5Gb3IgbW9yZSBkZXRhaWxzLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1saWJyYXJ5LWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtbGlicmFyeSZndDs8L2NvZGU+PC9hPi48L3A+PC90ZD4KICAgPC90cj4KICAgPHRyIGlkPSJ1c2VzLXBlcm1pc3Npb24tZmlsdGVyaW5nIj4KICAgICA8dGQgdmFsaWduPSJ0b3AiIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij48Y29kZT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtcGVybWlzc2lvbi1lbGVtZW50Lmh0bWwiPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9hPjwvY29kZT48L3RkPgogICAgIDx0ZCB2YWxpZ249InRvcCI+Jm5ic3A7PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0cmljdGx5LCBBbmRyb2lkIE1hcmtldCBkb2VzIG5vdCBmaWx0ZXIgYmFzZWQgb24KKyAgICA8dGQgdmFsaWduPSJ0b3AiPlN0cmljdGx5LCBHb29nbGUgUGxheSBkb2VzIG5vdCBmaWx0ZXIgYmFzZWQgb24KIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSG93ZXZlciwgaXQgZG9lcyByZWFkIHRoZQogZWxlbWVudHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBoYXJkd2FyZSBmZWF0dXJlIHJlcXVpcmVtZW50cwogdGhhdCBtYXkgbm90IGhhdmUgYmVlbiBwcm9wZXJseSBkZWNsYXJlZCBpbiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4KIGVsZW1lbnRzLiBGb3IgZXhhbXBsZSwgaWYgYW4gYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIDxjb2RlPkNBTUVSQTwvY29kZT4KIHBlcm1pc3Npb24gYnV0IGRvZXMgbm90IGRlY2xhcmUgYSA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudCBmb3IKLTxjb2RlPmFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhPC9jb2RlPiwgQW5kcm9pZCBNYXJrZXQgY29uc2lkZXJzIHRoYXQgdGhlCis8Y29kZT5hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTwvY29kZT4sIEdvb2dsZSBQbGF5IGNvbnNpZGVycyB0aGF0IHRoZQogYXBwbGljYXRpb24gcmVxdWlyZXMgYSBjYW1lcmEgYW5kIHNob3VsZCBub3QgYmUgc2hvd24gdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbwogbm90IG9mZmVyIGEgY2FtZXJhLjwvcD4KICAgICA8cD5JbiBnZW5lcmFsLCBpZiBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0cyBoYXJkd2FyZS1yZWxhdGVkIHBlcm1pc3Npb25zLAotQW5kcm9pZCBNYXJrZXQgYXNzdW1lcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGUgdW5kZXJseWluZyBoYXJkd2FyZQorR29vZ2xlIFBsYXkgYXNzdW1lcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiByZXF1aXJlcyB0aGUgdW5kZXJseWluZyBoYXJkd2FyZQogZmVhdHVyZXMsIGV2ZW4gdGhvdWdoIHRoZXJlIG1pZ2h0IGJlIG5vIGNvcnJlc3BvbmRpbmcgdG8KLTxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBkZWNsYXJhdGlvbnMuIEFuZHJvaWQgTWFya2V0IHRoZW4gc2V0cyB1cAorPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGRlY2xhcmF0aW9ucy4gR29vZ2xlIFBsYXkgdGhlbiBzZXRzIHVwCiBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlIGZlYXR1cmVzIGltcGxpZWQgYnkgdGhlIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPgogZGVjbGFyYXRpb25zLjwvcD4KICAgICA8cD5Gb3IgYSBsaXN0IG9mIHBlcm1pc3Npb25zIHRoYXQgaW1wbHkgaGFyZHdhcmUgZmVhdHVyZXMsIHNlZQpAQCAtMzA1LDkgKzMwNSw5IEBACiAgICAgPHRkIHZhbGlnbj0idG9wIj48cD5BbiBhcHBsaWNhdGlvbiBjYW4gcmVxdWlyZSBhIG1pbmltdW0gQVBJIGxldmVsLiAgPC9wPgogICAgICAgPHA+PHN0cm9uZz5FeGFtcGxlIDE8L3N0cm9uZz48YnIgLz4KICAgICAgICAgVGhlIG1hbmlmZXN0IGluY2x1ZGVzIDxjb2RlPiZsdDt1c2VzLXNkawotICAgICAgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSZxdW90OzMmcXVvdDsmZ3Q7PC9jb2RlPiwgYW5kIHRoZSBhcHAgdXNlcyBBUElzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFQSSBMZXZlbCAzLiBBIHVzZXIgaXMgc2VhcmNoaW5nIGZvciBhcHBzIG9uIGEgZGV2aWNlIHRoYXQgaGFzIEFQSSBMZXZlbCAyLiA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogQW5kcm9pZCBNYXJrZXQgd2lsbCBub3Qgc2hvdyB0aGUgYXBwIHRvIHRoZSB1c2VyLiA8L3A+CisgICAgICBhbmRyb2lkOm1pblNka1ZlcnNpb249JnF1b3Q7MyZxdW90OyZndDs8L2NvZGU+LCBhbmQgdGhlIGFwcCB1c2VzIEFQSXMgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gQVBJIExldmVsIDMuIEEgdXNlciBpcyBzZWFyY2hpbmcgZm9yIGFwcHMgb24gYSBkZXZpY2UgdGhhdCBoYXMgQVBJIExldmVsIDIuIDxzdHJvbmc+UmVzdWx0PC9zdHJvbmc+OiBHb29nbGUgUGxheSB3aWxsIG5vdCBzaG93IHRoZSBhcHAgdG8gdGhlIHVzZXIuIDwvcD4KICAgICAgIDxwPjxzdHJvbmc+RXhhbXBsZSAyPC9zdHJvbmc+PGJyIC8+Ci0gICAgICBUaGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5taW5TZGtWZXJzaW9uPC9jb2RlPiwgYW5kIHRoZSBhcHAgdXNlcyBBUElzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFQSSBMZXZlbCAzLiBBIHVzZXIgaXMgc2VhcmNoaW5nIGZvciBhcHBzIG9uIGEgZGV2aWNlIHRoYXQgaGFzIEFQSSBMZXZlbCAyLiA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogQW5kcm9pZCBNYXJrZXQgYXNzdW1lcyB0aGF0IDxjb2RlPm1pblNka1ZlcnNpb248L2NvZGU+IGlzICZxdW90OzEmcXVvdDsgYW5kIHRoYXQgdGhlIGFwcCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHZlcnNpb25zIG9mIEFuZHJvaWQuIE1hcmtldCAgc2hvd3MgdGhlIGFwcCB0byB0aGUgdXNlciBhbmQgYWxsb3dzIHRoZSB1c2VyIHRvIGRvd25sb2FkIHRoZSBhcHAuIFRoZSBhcHAgY3Jhc2hlcyBhdCBydW50aW1lLiA8L3A+CisgICAgICBUaGUgbWFuaWZlc3QgZG9lcyBub3QgaW5jbHVkZSA8Y29kZT5taW5TZGtWZXJzaW9uPC9jb2RlPiwgYW5kIHRoZSBhcHAgdXNlcyBBUElzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIEFQSSBMZXZlbCAzLiBBIHVzZXIgaXMgc2VhcmNoaW5nIGZvciBhcHBzIG9uIGEgZGV2aWNlIHRoYXQgaGFzIEFQSSBMZXZlbCAyLiA8c3Ryb25nPlJlc3VsdDwvc3Ryb25nPjogR29vZ2xlIFBsYXkgYXNzdW1lcyB0aGF0IDxjb2RlPm1pblNka1ZlcnNpb248L2NvZGU+IGlzICZxdW90OzEmcXVvdDsgYW5kIHRoYXQgdGhlIGFwcCBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHZlcnNpb25zIG9mIEFuZHJvaWQuIEdvb2dsZSBQbGF5ICBzaG93cyB0aGUgYXBwIHRvIHRoZSB1c2VyIGFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gZG93bmxvYWQgdGhlIGFwcC4gVGhlIGFwcCBjcmFzaGVzIGF0IHJ1bnRpbWUuIDwvcD4KICAgICA8cD5CZWNhdXNlIHlvdSB3YW50IHRvIGF2b2lkIHRoaXMgc2Vjb25kIHNjZW5hcmlvLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgYWx3YXlzIGRlY2xhcmUgYSA8Y29kZT5taW5TZGtWZXJzaW9uPC9jb2RlPi4gRm9yIGRldGFpbHMsIHNlZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjbWluIj48Y29kZT5hbmRyb2lkOm1pblNka1ZlcnNpb248L2NvZGU+PC9hPi48L3A+PC90ZD4KICAgPC90cj4KQEAgLTMxNiw3ICszMTYsNyBAQAogICAgIDx0ZCB2YWxpZ249InRvcCI+PHA+PGVtPkRlcHJlY2F0ZWQuPC9lbT4gQW5kcm9pZAogICAgIDIuMSBhbmQgbGF0ZXIgZG8gbm90IGNoZWNrIG9yIGVuZm9yY2UgdGhlIDxjb2RlPm1heFNka1ZlcnNpb248L2NvZGU+IGF0dHJpYnV0ZSwgYW5kCiAgICAgdGhlIFNESyB3aWxsIG5vdCBjb21waWxlIGlmIDxjb2RlPm1heFNka1ZlcnNpb248L2NvZGU+IGlzIHNldCBpbiBhbiBhcHAncyBtYW5pZmVzdC4gRm9yIGRldmljZXMgYWxyZWFkeQotICAgIGNvbXBpbGVkIHdpdGggPGNvZGU+bWF4U2RrVmVyc2lvbjwvY29kZT4sIE1hcmtldCB3aWxsIHJlc3BlY3QgaXQgYW5kIHVzZSBpdCBmb3IKKyAgICBjb21waWxlZCB3aXRoIDxjb2RlPm1heFNka1ZlcnNpb248L2NvZGU+LCBHb29nbGUgUGxheSB3aWxsIHJlc3BlY3QgaXQgYW5kIHVzZSBpdCBmb3IKICAgICBmaWx0ZXJpbmcuPC9wPgogPHA+IERlY2xhcmluZyA8Y29kZT5tYXhTZGtWZXJzaW9uPC9jb2RlPiBpcyA8ZW0+bm90PC9lbT4gcmVjb21tZW5kZWQuIEZvciBkZXRhaWxzLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5odG1sI21heCI+PGNvZGU+YW5kcm9pZDptYXhTZGtWZXJzaW9uPC9jb2RlPjwvYT4uPC9wPjwvdGQ+CkBAIC0zMjcsNyArMzI3LDcgQEAKIAogPGgzIGlkPSJhZHZhbmNlZC1maWx0ZXJzIj5BZHZhbmNlZCBtYW5pZmVzdCBmaWx0ZXJzPC9oMz4KIAotPHA+SW4gYWRkaXRpb24gdG8gdGhlIG1hbmlmZXN0IGVsZW1lbnRzIGluIDxhIGhyZWY9IiN0YWJsZTEiPnRhYmxlIDE8L2E+LCBBbmRyb2lkIE1hcmtldCBjYW4gYWxzbworPHA+SW4gYWRkaXRpb24gdG8gdGhlIG1hbmlmZXN0IGVsZW1lbnRzIGluIDxhIGhyZWY9IiN0YWJsZTEiPnRhYmxlIDE8L2E+LCBHb29nbGUgUGxheSBjYW4gYWxzbwogZmlsdGVyIGFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUgYWR2YW5jZWQgbWFuaWZlc3QgZWxlbWVudHMgaW4gdGFibGUgMi48L3A+CiAKIDxwPlRoZXNlIG1hbmlmZXN0IGVsZW1lbnRzIGFuZCB0aGUgZmlsdGVyaW5nIHRoZXkgdHJpZ2dlciBhcmUgZm9yIGV4Y2VwdGlvbmFsIHVzZS1jYXNlcwpAQCAtMzM2LDE0ICszMzYsMTQgQEAKIHRoZXNlIGZpbHRlcnM8L3N0cm9uZz4uPC9wPgogCiA8cCBpZD0idGFibGUyIiBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAyLjwvc3Ryb25nPiBBZHZhbmNlZCBtYW5pZmVzdCBlbGVtZW50cyBmb3IKLUFuZHJvaWQgTWFya2V0IGZpbHRlcmluZy48L3A+CitHb29nbGUgUGxheSBmaWx0ZXJpbmcuPC9wPgogPHRhYmxlPgogICA8dHI+PHRoPk1hbmlmZXN0IEVsZW1lbnQ8L3RoPjx0aD5TdW1tYXJ5PC90aD48L3RyPgogICA8dHI+CiAgICAgPHRkPjxub2JyPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvY29tcGF0aWJsZS1zY3JlZW5zLWVsZW1lbnQuaHRtbCI+e0Bjb2RlCiAmbHQ7Y29tcGF0aWJsZS1zY3JlZW5zJmd0O308L2E+PC9ub2JyPjwvdGQ+CiAgICAgPHRkPgotICAgICAgPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gaWYgdGhlIGRldmljZSBzY3JlZW4gc2l6ZSBhbmQgZGVuc2l0eSBkb2VzIG5vdCBtYXRjaAorICAgICAgPHA+R29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gaWYgdGhlIGRldmljZSBzY3JlZW4gc2l6ZSBhbmQgZGVuc2l0eSBkb2VzIG5vdCBtYXRjaAogYW55IG9mIHRoZSBzY3JlZW4gY29uZmlndXJhdGlvbnMgKGRlY2xhcmVkIGJ5IGEge0Bjb2RlICZsdDtzY3JlZW4mZ3Q7fSBlbGVtZW50KSBpbiB0aGUge0Bjb2RlCiAmbHQ7Y29tcGF0aWJsZS1zY3JlZW5zJmd0O30gZWxlbWVudC48L3A+CiAgICAgICA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBOb3JtYWxseSwgPHN0cm9uZz55b3Ugc2hvdWxkIG5vdCB1c2UKQEAgLTM2MCw3ICszNjAsNyBAQAogICAgIDx0ZD48bm9icj48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLWdsLXRleHR1cmUtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0O308L2E+PC9ub2JyPjwvdGQ+CiAgICAgPHRkPgotICAgICAgPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gdW5sZXNzIG9uZSBvciBtb3JlIG9mIHRoZSBHTCB0ZXh0dXJlIGNvbXByZXNzaW9uCisgICAgICA8cD5Hb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiB1bmxlc3Mgb25lIG9yIG1vcmUgb2YgdGhlIEdMIHRleHR1cmUgY29tcHJlc3Npb24KIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhcmUgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS4gPC9wPgogICAgIDwvdGQ+CiAgIDwvdHI+CkBAIC0zNzAsMTYgKzM3MCwxNiBAQAogCiA8aDIgaWQ9Im90aGVyLWZpbHRlcnMiPk90aGVyIEZpbHRlcnM8L2gyPgogCi08cD5BbmRyb2lkIE1hcmtldCB1c2VzIG90aGVyIGFwcGxpY2F0aW9uIGNoYXJhY3RlcmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzaG93IG9yIGhpZGUgYW4gYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciB1c2VyIG9uIGEgZ2l2ZW4gZGV2aWNlLCBhcyBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93LiA8L3A+Cis8cD5Hb29nbGUgUGxheSB1c2VzIG90aGVyIGFwcGxpY2F0aW9uIGNoYXJhY3RlcmlzdGljcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBzaG93IG9yIGhpZGUgYW4gYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciB1c2VyIG9uIGEgZ2l2ZW4gZGV2aWNlLCBhcyBkZXNjcmliZWQgaW4gdGhlIHRhYmxlIGJlbG93LiA8L3A+CiAKIDxwIGlkPSJ0YWJsZTMiIGNsYXNzPSJ0YWJsZS1jYXB0aW9uIj48c3Ryb25nPlRhYmxlIDMuPC9zdHJvbmc+IEFwcGxpY2F0aW9uIGFuZCBwdWJsaXNoaW5nCi1jaGFyYWN0ZXJpc3RpY3MgdGhhdCBhZmZlY3QgZmlsdGVyaW5nIG9uIE1hcmtldC48L3A+CitjaGFyYWN0ZXJpc3RpY3MgdGhhdCBhZmZlY3QgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5LjwvcD4KIDx0YWJsZT4gPHRyPgogICAgIDx0aD5GaWx0ZXIgTmFtZTwvdGg+IDx0aD5Ib3cgSXQgV29ya3M8L3RoPiA8L3RyPgogCiAgIDx0cj4KICAgICA8dGQgdmFsaWduPSJ0b3AiPlB1Ymxpc2hpbmcgU3RhdHVzPC90ZD4gPHRkIHZhbGlnbj0idG9wIj48cD5Pbmx5IHB1Ymxpc2hlZCBhcHBsaWNhdGlvbnMgd2lsbCBhcHBlYXIgaW4KLSAgICAgIHNlYXJjaGVzIGFuZCBicm93c2luZyB3aXRoaW4gQW5kcm9pZCBNYXJrZXQuPC9wPiA8cD5FdmVuIGlmIGFuIGFwcCBpcyB1bnB1Ymxpc2hlZCwgaXQgY2FuCisgICAgICBzZWFyY2hlcyBhbmQgYnJvd3Npbmcgd2l0aGluIEdvb2dsZSBQbGF5LjwvcD4gPHA+RXZlbiBpZiBhbiBhcHAgaXMgdW5wdWJsaXNoZWQsIGl0IGNhbgogICAgICAgICBiZSBpbnN0YWxsZWQgaWYgdXNlcnMgY2FuIHNlZSBpdCBpbiB0aGVpciBEb3dubG9hZHMgYXJlYSBhbW9uZyB0aGVpciBwdXJjaGFzZWQsCiAgICAgICAgIGluc3RhbGxlZCwgb3IgcmVjZW50bHkgdW5pbnN0YWxsZWQgYXBwcy48L3A+IDxwPklmIGFuIGFwcGxpY2F0aW9uIGhhcyBiZWVuCiAgIHN1c3BlbmRlZCwgdXNlcnMgd2lsbCBub3QgYmUgYWJsZSB0byByZWluc3RhbGwgb3IgdXBkYXRlIGl0LCBldmVuIGlmIGl0IGFwcGVhcnMgaW4gdGhlaXIgRG93bmxvYWRzLjwvcD4gPC90ZD48L3RyPgpAQCAtMzkwLDEwICszOTAsMTAgQEAKIGNvdW50cnkgKGFzIGRldGVybWluZWQgYnkgU0lNIGNhcnJpZXIpIGluIHdoaWNoIHBhaWQgYXBwcyBhcmUgYXZhaWxhYmxlLjwvcD48L3RkPgogPC90cj4gPHRyPgogICA8dGQgdmFsaWduPSJ0b3AiPkNvdW50cnkgLyBDYXJyaWVyIFRhcmdldGluZzwvdGQ+IDx0ZCB2YWxpZ249InRvcCI+IDxwPldoZW4geW91IHVwbG9hZCB5b3VyIGFwcCB0bwotICAgIHRoZSBBbmRyb2lkIE1hcmtldCwgeW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgY291bnRyaWVzIHRvIHRhcmdldC4gVGhlIGFwcCB3aWxsIG9ubHkKKyAgICBHb29nbGUgUGxheSwgeW91IGNhbiBzZWxlY3Qgc3BlY2lmaWMgY291bnRyaWVzIHRvIHRhcmdldC4gVGhlIGFwcCB3aWxsIG9ubHkKICAgICBiZSB2aXNpYmxlIHRvIHRoZSBjb3VudHJpZXMgKGNhcnJpZXJzKSB0aGF0IHlvdSBzZWxlY3QsIGFzIGZvbGxvd3M6PC9wPgogICAgIDx1bD48bGk+PHA+QSBkZXZpY2UncyBjb3VudHJ5IGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGNhcnJpZXIsIGlmIGEgY2FycmllciBpcwotICAgICAgYXZhaWxhYmxlLiBJZiBubyBjYXJyaWVyIGNhbiBiZSBkZXRlcm1pbmVkLCB0aGUgTWFya2V0IGFwcGxpY2F0aW9uIHRyaWVzIHRvCisgICAgICBhdmFpbGFibGUuIElmIG5vIGNhcnJpZXIgY2FuIGJlIGRldGVybWluZWQsIEdvb2dsZSBQbGF5IHRyaWVzIHRvCiAgICAgICBkZXRlcm1pbmUgdGhlIGNvdW50cnkgYmFzZWQgb24gSVAuPC9wPjwvbGk+IDxsaT48cD5DYXJyaWVyIGlzIGRldGVybWluZWQgYmFzZWQgb24KICAgICAgIHRoZSBkZXZpY2UncyBTSU0gKGZvciBHU00gZGV2aWNlcyksIG5vdCB0aGUgY3VycmVudCByb2FtaW5nIGNhcnJpZXIuPC9wPjwvbGk+PC91bD4KIDwvdGQ+IDwvdHI+IDx0cj4KQEAgLTQwNCwyMiArNDA0LDIyIEBACiAgICAgICBBbmRyb2lkIE5ESz88L2E+PC9wPiA8L3RyPiA8dHI+CiAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Q29weS1Qcm90ZWN0ZWQgQXBwbGljYXRpb25zPC90ZD4gPHRkIHZhbGlnbj0idG9wIj48cD5UbwogICAgICAgICAgIGNvcHkgcHJvdGVjdCBhbiBhcHBsaWNhdGlvbiwgc2V0IGNvcHkgcHJvdGVjdGlvbiB0byAiT24iIHdoZW4geW91IGNvbmZpZ3VyZSBwdWJsaXNoaW5nCi1vcHRpb25zIGZvciB5b3VyIGFwcGxpY2F0aW9uLiBNYXJrZXQgd2lsbCBub3Qgc2hvdyBjb3B5LXByb3RlY3RlZCBhcHBsaWNhdGlvbnMgb24KK29wdGlvbnMgZm9yIHlvdXIgYXBwbGljYXRpb24uIEdvb2dsZSBQbGF5IHdpbGwgbm90IHNob3cgY29weS1wcm90ZWN0ZWQgYXBwbGljYXRpb25zIG9uCiBkZXZlbG9wZXIgZGV2aWNlcyBvciB1bnJlbGVhc2VkIGRldmljZXMuPC9wPjwvdGQ+IDwvdHI+IDwvdGFibGU+CiAKIAogCiA8aDIgaWQ9Ik11bHRpQXBrcyI+UHVibGlzaGluZyBNdWx0aXBsZSBBUEtzIHdpdGggRGlmZmVyZW50IEZpbHRlcnM8L2gyPgogCi08cD5Tb21lIHNwZWNpZmljIEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgYWxsb3cgeW91IHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcyBmb3IgdGhlIHNhbWUKKzxwPlNvbWUgc3BlY2lmaWMgR29vZ2xlIFBsYXkgZmlsdGVycyBhbGxvdyB5b3UgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIGZvciB0aGUgc2FtZQogYXBwbGljYXRpb24gaW4gb3JkZXIgdG8gcHJvdmlkZSBhIGRpZmZlcmVudCBBUEsgdG8gZGlmZmVyZW50IGRldmljZSBjb25maWd1cmF0aW9ucy4gRm9yIGV4YW1wbGUsIGlmCiB5b3UncmUgY3JlYXRpbmcgYSB2aWRlbyBnYW1lIHRoYXQgdXNlcyBoaWdoLWZpZGVsaXR5IGdyYXBoaWMgYXNzZXRzLCB5b3UgbWlnaHQgd2FudCB0byBjcmVhdGUKIHR3byBBUEtzIHRoYXQgZWFjaCBzdXBwb3J0IGRpZmZlcmVudCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZvcm1hdHMuIFRoaXMgd2F5LCB5b3UgY2FuIHJlZHVjZSB0aGUKIHNpemUgb2YgdGhlIEFQSyBmaWxlIGJ5IGluY2x1ZGluZyBvbmx5IHRoZSB0ZXh0dXJlcyB0aGF0IGFyZSByZXF1aXJlZCBmb3IgZWFjaCBkZXZpY2UKLWNvbmZpZ3VyYXRpb24uIERlcGVuZGluZyBvbiBlYWNoIGRldmljZSdzIHN1cHBvcnQgZm9yIHlvdXIgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzLCBBbmRyb2lkCi1NYXJrZXQgd2lsbCBkZWxpdmVyIGl0IHRoZSBBUEsgdGhhdCB5b3UndmUgZGVjbGFyZWQgdG8gc3VwcG9ydCB0aGF0IGRldmljZS48L3A+Citjb25maWd1cmF0aW9uLiBEZXBlbmRpbmcgb24gZWFjaCBkZXZpY2UncyBzdXBwb3J0IGZvciB5b3VyIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cywgR29vZ2xlCitQbGF5IHdpbGwgZGVsaXZlciBpdCB0aGUgQVBLIHRoYXQgeW91J3ZlIGRlY2xhcmVkIHRvIHN1cHBvcnQgdGhhdCBkZXZpY2UuPC9wPgogCi08cD5DdXJyZW50bHksIEFuZHJvaWQgTWFya2V0IGFsbG93cyB5b3UgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIGZvciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBvbmx5Cis8cD5DdXJyZW50bHksIEdvb2dsZSBQbGF5IGFsbG93cyB5b3UgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIGZvciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBvbmx5CiB3aGVuIGVhY2ggQVBLIHByb3ZpZGVzIGRpZmZlcmVudCBmaWx0ZXJzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnM6PC9wPgogPHVsPgogICA8bGk+T3BlbkdMIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cwpAQCAtNDQwLDcgKzQ0MCw3IEBACiA8L3VsPgogCiA8cD5BbGwgb3RoZXIgZmlsdGVycyBzdGlsbCB3b3JrIHRoZSBzYW1lIGFzIHVzdWFsLCBidXQgdGhlc2UgdGhyZWUgYXJlIHRoZSBvbmx5IGZpbHRlcnMgdGhhdCBjYW4KLWRpc3Rpbmd1aXNoIG9uZSBBUEsgZnJvbSBhbm90aGVyIHdpdGhpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nIG9uIEFuZHJvaWQgTWFya2V0LiBGb3IgZXhhbXBsZSwKK2Rpc3Rpbmd1aXNoIG9uZSBBUEsgZnJvbSBhbm90aGVyIHdpdGhpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nIG9uIEdvb2dsZSBQbGF5LiBGb3IgZXhhbXBsZSwKIHlvdSA8ZW0+Y2Fubm90PC9lbT4gcHVibGlzaCBtdWx0aXBsZSBBUEtzIGZvciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBpZiB0aGUgQVBLcyBkaWZmZXIgb25seSBiYXNlZCBvbgogd2hldGhlciB0aGUgZGV2aWNlIGhhcyBhIGNhbWVyYS48L3A+CiAKQEAgLTQ1MCw1ICs0NTAsNSBAQAogcmVxdWlyZXMgdGhhdCB5b3UgZm9sbG93IHNwZWNpZmljIHJ1bGVzIHdpdGhpbiB5b3VyIGZpbHRlcnMgYW5kIHRoYXQgeW91IHBheSBleHRyYSBhdHRlbnRpb24gdG8gdGhlCiB2ZXJzaW9uIGNvZGVzIGZvciBlYWNoIEFQSyB0byBlbnN1cmUgcHJvcGVyIHVwZGF0ZSBwYXRocyBmb3IgZWFjaCBjb25maWd1cmF0aW9uLjwvcD4KIAotPHA+SWYgeW91IG5lZWQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIG9uIEFuZHJvaWQgTWFya2V0LCByZWFkIDxhCis8cD5JZiB5b3UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3Mgb24gR29vZ2xlIFBsYXksIHJlYWQgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvcHVibGlzaGluZy9tdWx0aXBsZS1hcGtzLmh0bWwiPk11bHRpcGxlIEFQSyBTdXBwb3J0PC9hPi48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZGV2ZWxvcGluZy9idWlsZGluZy9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL2J1aWxkaW5nL2luZGV4LmpkCmluZGV4IDU5YzQ2NDUuLjU2OWNkMjggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL2J1aWxkaW5nL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9kZXZlbG9waW5nL2J1aWxkaW5nL2luZGV4LmpkCkBAIC0yNyw4ICsyNyw4IEBACiAgIDxwPlRvIHJ1biBhbiBhcHBsaWNhdGlvbiBvbiBhbiBlbXVsYXRvciBvciBkZXZpY2UsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIHNpZ25lZCB1c2luZyBkZWJ1ZyBvcgogICByZWxlYXNlIG1vZGUuIFlvdSB0eXBpY2FsbHkgd2FudCB0byBzaWduIHlvdXIgYXBwbGljYXRpb24gaW4gZGVidWcgbW9kZSB3aGVuIHlvdSBkZXZlbG9wIGFuZCB0ZXN0CiAgIHlvdXIgYXBwbGljYXRpb24sIGJlY2F1c2UgdGhlIGJ1aWxkIHRvb2xzIHVzZSBhIGRlYnVnIGtleSB3aXRoIGEga25vd24gcGFzc3dvcmQgc28geW91IGRvIG5vdCBoYXZlCi0gIHRvIGVudGVyIGl0IGV2ZXJ5IHRpbWUgeW91IGJ1aWxkLiBXaGVuIHlvdSBhcmUgcmVhZHkgdG8gcmVsZWFzZSB0aGUgYXBwbGljYXRpb24gdG8gQW5kcm9pZAotICBNYXJrZXQsIHlvdSBtdXN0IHNpZ24gdGhlIGFwcGxpY2F0aW9uIGluIHJlbGVhc2UgbW9kZSwgdXNpbmcgeW91ciBvd24gcHJpdmF0ZSBrZXkuPC9wPgorICB0byBlbnRlciBpdCBldmVyeSB0aW1lIHlvdSBidWlsZC4gV2hlbiB5b3UgYXJlIHJlYWR5IHRvIHJlbGVhc2UgdGhlIGFwcGxpY2F0aW9uIHRvIEdvb2dsZQorICBQbGF5LCB5b3UgbXVzdCBzaWduIHRoZSBhcHBsaWNhdGlvbiBpbiByZWxlYXNlIG1vZGUsIHVzaW5nIHlvdXIgb3duIHByaXZhdGUga2V5LjwvcD4KIAogICA8cD5Gb3J0dW5hdGVseSwgRWNsaXBzZSBvciB5b3VyIEFudCBidWlsZCBzY3JpcHQgc2lnbnMgdGhlIGFwcGxpY2F0aW9uIGZvciB5b3UgaW4gZGVidWcgbW9kZQogICB3aGVuIHlvdSBidWlsZCB5b3VyIGFwcGxpY2F0aW9uLiBZb3UgY2FuIGFsc28gZWFzaWx5IHNldHVwIEVjbGlwc2Ugb3IgeW91ciBBbnQgYnVpbGQgdG8gc2lnbiB5b3VyCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzIGIvZG9jcy9odG1sL2d1aWRlL2d1aWRlX3RvYy5jcwppbmRleCBmZDJlYzkzLi45ZDUwNjRlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvZ3VpZGVfdG9jLmNzCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9ndWlkZV90b2MuY3MKQEAgLTQ0NCwxMiArNDQ0LDEyIEBACiAgIDwvbGk+CiAKICAgPGxpPgotICAgIDxzcGFuIGNsYXNzPSJoZWFkaW5nIj4KLSAgICAgIDxzcGFuIGNsYXNzPSJlbiI+QW5kcm9pZCBNYXJrZXQgVG9waWNzPC9zcGFuPgotICAgIDwvc3Bhbj4KKyAgICA8aDI+CisgICAgICA8c3BhbiBjbGFzcz0iZW4iPkdvb2dsZSBQbGF5IFRvcGljczwvc3Bhbj4KKyAgICA8L2gyPgogICAgIDx1bD4KICAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+Ci0gICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5QdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0PC9zcGFuPgorICAgICAgICAgIDxzcGFuIGNsYXNzPSJlbiI+UHVibGlzaGluZyBvbiBHb29nbGUgUGxheTwvc3Bhbj4KICAgICAgICAgICA8L2E+PC9saT4KICAgICAgIDxsaSBjbGFzcz0idG9nZ2xlLWxpc3QiPgogICAgICAgICA8ZGl2PjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/Pmd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+CkBAIC00OTYsNyArNDk2LDcgQEAKICAgICAgICAgPC91bD4KICAgICAgIDwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+Ci0gICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5NYXJrZXQgRmlsdGVyczwvc3Bhbj48L2E+CisgICAgICAgICAgPHNwYW4gY2xhc3M9ImVuIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9zcGFuPjwvYT4KICAgICAgIDwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+Z3VpZGUvbWFya2V0L3B1Ymxpc2hpbmcvbXVsdGlwbGUtYXBrcy5odG1sIj4KICAgICAgICAgICA8c3BhbiBjbGFzcz0iZW4iPk11bHRpcGxlIEFQSyBTdXBwb3J0PC9zcGFuPjwvYT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9pbmRleC5qZAppbmRleCAzOGY3MWMwLi44Mzc4NDcyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL2luZGV4LmpkCkBAIC0zNCw5ICszNCw5IEBACiBkZXNpZ25pbmcgYSB1c2VyIGludGVyZmFjZSBhbmQgc2V0dGluZyB1cCByZXNvdXJjZXMgdG8gc3RvcmluZyAKIGRhdGEgYW5kIHVzaW5nIHBlcm1pc3Npb25zICZtZGFzaDsgYXMgbmVlZGVkLjwvZGQ+CiAKLTxkdD48Yj5BbmRyb2lkIE1hcmtldCBUb3BpY3M8L2I+PC9kdD4KLTxkZD5Eb2N1bWVudGF0aW9uIGZvciB0b3BpY3MgdGhhdCBjb25jZXJuIHB1Ymxpc2hpbmcgYW5kIG1vbmV0aXppbmcgYXBwbGljYXRpb25zIG9uIEFuZHJvaWQKLU1hcmtldCwgc3VjaCBhcyBob3cgdG8gZW5mb3JjZSBsaWNlbnNpbmcgcG9saWNpZXMgYW5kIGltcGxlbWVudCBpbi1hcHAgYmlsbGluZy48L2RkPgorPGR0PjxiPkdvb2dsZSBQbGF5IFRvcGljczwvYj48L2R0PgorPGRkPkRvY3VtZW50YXRpb24gZm9yIHRvcGljcyB0aGF0IGNvbmNlcm4gcHVibGlzaGluZyBhbmQgbW9uZXRpemluZyBhcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXksCitzdWNoIGFzIGhvdyB0byBlbmZvcmNlIGxpY2Vuc2luZyBwb2xpY2llcyBhbmQgaW1wbGVtZW50IGluLWFwcCBiaWxsaW5nLjwvZGQ+CiAKIDxkdD48Yj5EZXZlbG9waW5nPC9iPjwvZHQ+CiA8ZGQ+RGlyZWN0aW9ucyBmb3IgdXNpbmcgQW5kcm9pZCdzIGRldmVsb3BtZW50IGFuZCBkZWJ1Z2dpbmcgdG9vbHMsIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfYWRtaW4uamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19hZG1pbi5qZAppbmRleCBhODRlYjRlLi4wZjg2OWFiIDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19hZG1pbi5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19hZG1pbi5qZApAQCAtMzgsMTkgKzM4LDE5IEBACiBmZXcgYWRtaW5pc3RyYXRpdmUgdGFza3MsIGluY2x1ZGluZyBzZXR0aW5nIHVwIGFuZCBtYWludGFpbmluZyB5b3VyIHByb2R1Y3QgbGlzdCBvbiB0aGUgcHVibGlzaGVyCiBzaXRlLCByZWdpc3RlcmluZyB0ZXN0IGFjY291bnRzLCBhbmQgaGFuZGxpbmcgcmVmdW5kcyB3aGVuIG5lY2Vzc2FyeS48L3A+CiAKLTxwPllvdSBtdXN0IGhhdmUgYW4gQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIGFjY291bnQgdG8gcmVnaXN0ZXIgdGVzdCBhY2NvdW50cy4gQW5kIHlvdSBtdXN0IGhhdmUgYQorPHA+WW91IG11c3QgaGF2ZSBhIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBhY2NvdW50IHRvIHJlZ2lzdGVyIHRlc3QgYWNjb3VudHMuIEFuZCB5b3UgbXVzdCBoYXZlIGEKIEdvb2dsZSBDaGVja291dCBtZXJjaGFudCBhY2NvdW50IHRvIGNyZWF0ZSBhIHByb2R1Y3QgbGlzdCBhbmQgaXNzdWUgcmVmdW5kcyB0byB5b3VyIHVzZXJzLiBJZiB5b3UKLWFscmVhZHkgaGF2ZSBhIHB1Ymxpc2hlciBhY2NvdW50IG9uIEFuZHJvaWQgTWFya2V0LCB5b3UgY2FuIHVzZSB5b3VyIGV4aXN0aW5nIGFjY291bnQuIFlvdSBkbyBub3QKK2FscmVhZHkgaGF2ZSBhIHB1Ymxpc2hlciBhY2NvdW50IG9uIEdvb2dsZSBQbGF5LCB5b3UgY2FuIHVzZSB5b3VyIGV4aXN0aW5nIGFjY291bnQuIFlvdSBkbyBub3QKIG5lZWQgdG8gcmVnaXN0ZXIgZm9yIGEgbmV3IGFjY291bnQgdG8gc3VwcG9ydCBpbi1hcHAgYmlsbGluZy4gSWYgeW91IGRvIG5vdCBoYXZlIGEgcHVibGlzaGVyCi1hY2NvdW50LCB5b3UgY2FuIHJlZ2lzdGVyIGFzIGFuIEFuZHJvaWQgTWFya2V0IGRldmVsb3BlciBhbmQgc2V0IHVwIGEgcHVibGlzaGVyIGFjY291bnQgYXQgdGhlCi1BbmRyb2lkIE1hcmtldCA8YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPnB1Ymxpc2hlciBzaXRlPC9hPi4gSWYgeW91IGRvIG5vdCBoYXZlIGEKK2FjY291bnQsIHlvdSBjYW4gcmVnaXN0ZXIgYXMgYSBHb29nbGUgUGxheSBkZXZlbG9wZXIgYW5kIHNldCB1cCBhIHB1Ymxpc2hlciBhY2NvdW50IGF0IHRoZQorR29vZ2xlIFBsYXkgPGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPnB1Ymxpc2hlciBzaXRlPC9hPi4gSWYgeW91IGRvIG5vdCBoYXZlIGEKIEdvb2dsZSBDaGVja291dCBtZXJjaGFudCBhY2NvdW50LCB5b3UgY2FuIHJlZ2lzdGVyIGZvciBvbmUgYXQgdGhlIDxhCiBocmVmPSJodHRwOi8vY2hlY2tvdXQuZ29vZ2xlLmNvbSI+R29vZ2xlIENoZWNrb3V0IHNpdGU8L2E+LjwvcD4KIAogPGgyIGlkPSJiaWxsaW5nLWxpc3Qtc2V0dXAiPkNyZWF0aW5nIGEgUHJvZHVjdCBMaXN0PC9oMj4KIAotPHA+VGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlIHByb3ZpZGVzIGEgcHJvZHVjdCBsaXN0IGZvciBlYWNoIG9mIHlvdXIgcHVibGlzaGVkCi1hcHBsaWNhdGlvbnMuIFlvdSBjYW4gc2VsbCBhbiBpdGVtIHVzaW5nIEFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgZmVhdHVyZSBvbmx5IGlmIHRoZSBpdGVtIGlzCis8cD5UaGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUgcHJvdmlkZXMgYSBwcm9kdWN0IGxpc3QgZm9yIGVhY2ggb2YgeW91ciBwdWJsaXNoZWQKK2FwcGxpY2F0aW9ucy4gWW91IGNhbiBzZWxsIGFuIGl0ZW0gdXNpbmcgR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBmZWF0dXJlIG9ubHkgaWYgdGhlIGl0ZW0gaXMKIGxpc3RlZCBvbiBhbiBhcHBsaWNhdGlvbidzIHByb2R1Y3QgbGlzdC4gRWFjaCBhcHBsaWNhdGlvbiBoYXMgaXRzIG93biBwcm9kdWN0IGxpc3Q7IHlvdSBjYW5ub3Qgc2VsbAogaXRlbXMgdGhhdCBhcmUgbGlzdGVkIGluIGFub3RoZXIgYXBwbGljYXRpb24ncyBwcm9kdWN0IGxpc3QuPC9wPgogCkBAIC03Nyw3ICs3Nyw3IEBACiA8L3A+CiAKIDxwPllvdSBjYW4gY3JlYXRlIGEgcHJvZHVjdCBsaXN0IGZvciBhbnkgcHVibGlzaGVkIGFwcGxpY2F0aW9uIG9yIGFueSBkcmFmdCBhcHBsaWNhdGlvbiB0aGF0J3MgYmVlbgotdXBsb2FkZWQgYW5kIHNhdmVkIHRvIHRoZSBBbmRyb2lkIE1hcmtldCBzaXRlLiBIb3dldmVyLCB5b3UgbXVzdCBoYXZlIGEgR29vZ2xlIENoZWNrb3V0IG1lcmNoYW50Cit1cGxvYWRlZCBhbmQgc2F2ZWQgdG8gdGhlIEdvb2dsZSBQbGF5IHNpdGUuIEhvd2V2ZXIsIHlvdSBtdXN0IGhhdmUgYSBHb29nbGUgQ2hlY2tvdXQgbWVyY2hhbnQKIGFjY291bnQgYW5kIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IG11c3QgaW5jbHVkZSB0aGUgPGNvZGU+Y29tLmFuZHJvaWQudmVuZGluZy5CSUxMSU5HPC9jb2RlPgogcGVybWlzc2lvbi4gSWYgYW4gYXBwbGljYXRpb24ncyBtYW5pZmVzdCBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgcGVybWlzc2lvbiwgeW91IHdpbGwgYmUgYWJsZSB0byBlZGl0CiBleGlzdGluZyBpdGVtcyBpbiB0aGUgcHJvZHVjdCBsaXN0IGJ1dCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBhZGQgbmV3IGl0ZW1zIHRvIHRoZSBsaXN0LiBGb3IgbW9yZQpAQCAtMTA0LDggKzEwNCw4IEBACiA8cD5UbyBhZGQgYW4gaXRlbSB0byBhIHByb2R1Y3QgbGlzdCB1c2luZyB0aGUgSW4tYXBwIFByb2R1Y3RzIFVJLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgogCiA8b2w+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPkxvZyBpbjwvYT4gdG8geW91ciBwdWJsaXNoZXIgYWNjb3VudC48L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+QWxsIEFuZHJvaWQgTWFya2V0IGxpc3RpbmdzPC9zdHJvbmc+IHBhbmVsLCB1bmRlciB0aGUgYXBwbGljYXRpb24gbmFtZSwgY2xpY2sKKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5Mb2cgaW48L2E+IHRvIHlvdXIgcHVibGlzaGVyIGFjY291bnQuPC9saT4KKyAgPGxpPkluIHRoZSA8c3Ryb25nPkFsbCBHb29nbGUgUGxheSBsaXN0aW5nczwvc3Ryb25nPiBwYW5lbCwgdW5kZXIgdGhlIGFwcGxpY2F0aW9uIG5hbWUsIGNsaWNrCiAgIDxzdHJvbmc+SW4tYXBwIFByb2R1Y3RzPC9zdHJvbmc+LjwvbGk+CiAgIDxsaT5PbiB0aGUgSW4tYXBwIFByb2R1Y3RzIExpc3QgcGFnZSwgY2xpY2sgPHN0cm9uZz5BZGQgaW4tYXBwIHByb2R1Y3Q8L3N0cm9uZz4uPC9saT4KICAgPGxpPk9uIHRoZSBDcmVhdGUgTmV3IEluLWFwcCBQcm9kdWN0IHBhZ2UgKHNlZSBmaWd1cmUgMyksIHByb3ZpZGUgZGV0YWlscyBhYm91dCB0aGUgaXRlbSB5b3UgYXJlCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgPGxpPjxzdHJvbmc+UHVibGlzaGluZyBTdGF0ZTwvc3Ryb25nPgogICAgIDxwPkFuIGl0ZW0ncyBwdWJsaXNoaW5nIHN0YXRlIGNhbiBiZSA8c3Ryb25nPlB1Ymxpc2hlZDwvc3Ryb25nPiBvciA8c3Ryb25nPlVucHVibGlzaGVkCiAgICAgPC9zdHJvbmc+LiBUbyBiZSB2aXNpYmxlIHRvIGEgdXNlciBkdXJpbmcgY2hlY2tvdXQsIGFuIGl0ZW0ncyBwdWJsaXNoaW5nIHN0YXRlIG11c3QgYmUgc2V0IHRvCi0gICAgPHN0cm9uZz5QdWJsaXNoZWQ8L3N0cm9uZz4gYW5kIHRoZSBpdGVtJ3MgYXBwbGljYXRpb24gbXVzdCBiZSBwdWJsaXNoZWQgb24gQW5kcm9pZCBNYXJrZXQuPC9wPgorICAgIDxzdHJvbmc+UHVibGlzaGVkPC9zdHJvbmc+IGFuZCB0aGUgaXRlbSdzIGFwcGxpY2F0aW9uIG11c3QgYmUgcHVibGlzaGVkIG9uIEdvb2dsZSBQbGF5LjwvcD4KICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIGlzIG5vdCB0cnVlIGZvciB0ZXN0IGFjY291bnRzLiBBbiBpdGVtIGlzIHZpc2libGUgdG8KICAgICBhIHRlc3QgYWNjb3VudCBpZiB0aGUgYXBwbGljYXRpb24gaXMgbm90IHB1Ymxpc2hlZCBhbmQgdGhlIGl0ZW0gaXMgcHVibGlzaGVkLiBTZWUgPGEKICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ190ZXN0aW5nLmh0bWwjYmlsbGluZy10ZXN0aW5nLXJlYWwiPlRlc3RpbmcgSW4tYXBwCkBAIC0xNjcsOSArMTY3LDkgQEAKICAgICA8cD5Zb3UgbXVzdCBwcm92aWRlIGEgZGVmYXVsdCBwcmljZSBpbiB5b3VyIGhvbWUgY3VycmVuY3kuIFlvdSBjYW4gYWxzbyBwcm92aWRlIHByaWNlcyBpbiBvdGhlcgogICAgIGN1cnJlbmNpZXMsIGJ1dCB5b3UgY2FuIGRvIHRoaXMgb25seSBpZiBhIGN1cnJlbmN5J3MgY29ycmVzcG9uZGluZyBjb3VudHJ5IGlzIGxpc3RlZCBhcyBhCiAgICAgdGFyZ2V0IGNvdW50cnkgZm9yIHlvdXIgYXBwbGljYXRpb24uIFlvdSBjYW4gc3BlY2lmeSB0YXJnZXQgY291bnRyaWVzIG9uIHRoZSBFZGl0IEFwcGxpY2F0aW9uCi0gICAgcGFnZSBpbiB0aGUgQW5kcm9pZCBNYXJrZXQgZGV2ZWxvcGVyIGNvbnNvbGUuPC9wPgorICAgIHBhZ2UgaW4gdGhlIEdvb2dsZSBQbGF5IGRldmVsb3BlciBjb25zb2xlLjwvcD4KICAgICA8cD5UbyBzcGVjaWZ5IHByaWNlcyBpbiBvdGhlciBjdXJyZW5jaWVzLCB5b3UgY2FuIG1hbnVhbGx5IGVudGVyIHRoZSBwcmljZSBmb3IgZWFjaAotICAgIGN1cnJlbmN5IG9yIHlvdSBjYW4gY2xpY2sgPHN0cm9uZz5BdXRvIEZpbGw8L3N0cm9uZz4gYW5kIGxldCBBbmRyb2lkIE1hcmtldCBkbyBhIG9uZS10aW1lCisgICAgY3VycmVuY3kgb3IgeW91IGNhbiBjbGljayA8c3Ryb25nPkF1dG8gRmlsbDwvc3Ryb25nPiBhbmQgbGV0IEdvb2dsZSBQbGF5IGRvIGEgb25lLXRpbWUKICAgICBjb252ZXJzaW9uIGZyb20geW91ciBob21lIGN1cnJlbmN5IHRvIHRoZSBjdXJyZW5jaWVzIHlvdSBhcmUgdGFyZ2V0aW5nIChzZWUgZmlndXJlIDQpLjwvcD4KICAgPC9saT4KIDwvdWw+CkBAIC0zNTcsOCArMzU3LDggQEAKIDxwPlRvIGltcG9ydCB0aGUgaXRlbXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHlvdXIgQ1NWIGZpbGUsIGRvIHRoZSBmb2xsb3dpbmc6PC9wPgogCiA8b2w+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPkxvZyBpbjwvYT4gdG8geW91ciBwdWJsaXNoZXIgYWNjb3VudC48L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+QWxsIEFuZHJvaWQgTWFya2V0IGxpc3RpbmdzPC9zdHJvbmc+IHBhbmVsLCB1bmRlciB0aGUgYXBwbGljYXRpb24gbmFtZSwgY2xpY2sKKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5Mb2cgaW48L2E+IHRvIHlvdXIgcHVibGlzaGVyIGFjY291bnQuPC9saT4KKyAgPGxpPkluIHRoZSA8c3Ryb25nPkFsbCBHb29nbGUgUGxheSBsaXN0aW5nczwvc3Ryb25nPiBwYW5lbCwgdW5kZXIgdGhlIGFwcGxpY2F0aW9uIG5hbWUsIGNsaWNrCiAgIDxzdHJvbmc+SW4tYXBwIFByb2R1Y3RzPC9zdHJvbmc+LjwvbGk+CiAgIDxsaT5PbiB0aGUgSW4tYXBwIFByb2R1Y3RzIExpc3QgcGFnZSwgY2xpY2sgPHN0cm9uZz5DaG9vc2UgRmlsZTwvc3Ryb25nPiBhbmQgc2VsZWN0IHlvdXIgQ1NWCiBmaWxlLgpAQCAtMzgxLDE3ICszODEsMTcgQEAKIAogPGgzIGlkPSJiaWxsaW5nLXB1cmNoYXNlLXR5cGUiPkNob29zaW5nIGEgUHVyY2hhc2UgVHlwZTwvaDM+CiAKLTxwPkFuIGl0ZW0ncyBwdXJjaGFzZSB0eXBlIGNvbnRyb2xzIGhvdyBBbmRyb2lkIE1hcmtldCBtYW5hZ2VzIHRoZSBwdXJjaGFzZSBvZiB0aGUgaXRlbS4gVGhlcmUgYXJlCis8cD5BbiBpdGVtJ3MgcHVyY2hhc2UgdHlwZSBjb250cm9scyBob3cgR29vZ2xlIFBsYXkgbWFuYWdlcyB0aGUgcHVyY2hhc2Ugb2YgdGhlIGl0ZW0uIFRoZXJlIGFyZQogdHdvIHB1cmNoYXNlIHR5cGVzOiAibWFuYWdlZCBwZXIgdXNlciBhY2NvdW50IiBhbmQgInVubWFuYWdlZC4iPC9wPgogCiA8cD5JdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIHBlciB1c2VyIGFjY291bnQgY2FuIGJlIHB1cmNoYXNlZCBvbmx5IG9uY2UgcGVyIHVzZXIgYWNjb3VudC4gV2hlbiBhbiBpdGVtCi1pcyBtYW5hZ2VkIHBlciB1c2VyIGFjY291bnQsIEFuZHJvaWQgTWFya2V0IHBlcm1hbmVudGx5IHN0b3JlcyB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gZm9yIGVhY2gKLWl0ZW0gb24gYSBwZXItdXNlciBiYXNpcy4gVGhpcyBlbmFibGVzIHlvdSB0byBxdWVyeSBBbmRyb2lkIE1hcmtldCB3aXRoIHRoZQoraXMgbWFuYWdlZCBwZXIgdXNlciBhY2NvdW50LCBHb29nbGUgUGxheSBwZXJtYW5lbnRseSBzdG9yZXMgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIGZvciBlYWNoCitpdGVtIG9uIGEgcGVyLXVzZXIgYmFzaXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gcXVlcnkgR29vZ2xlIFBsYXkgd2l0aCB0aGUKIDxjb2RlPlJFU1RPUkVfVFJBTlNBQ1RJT05TPC9jb2RlPiByZXF1ZXN0IGFuZCByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgaXRlbXMgYSBzcGVjaWZpYyB1c2VyIGhhcwogcHVyY2hhc2VkLjwvcD4KIAotPHA+SWYgYSB1c2VyIGF0dGVtcHRzIHRvIHB1cmNoYXNlIGEgbWFuYWdlZCBpdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBwdXJjaGFzZWQsIEFuZHJvaWQgTWFya2V0Ci1kaXNwbGF5cyBhbiAiSXRlbSBhbHJlYWR5IHB1cmNoYXNlZCIgZXJyb3IuIFRoaXMgb2NjdXJzIGR1cmluZyBjaGVja291dCwgd2hlbiBBbmRyb2lkIE1hcmtldAorPHA+SWYgYSB1c2VyIGF0dGVtcHRzIHRvIHB1cmNoYXNlIGEgbWFuYWdlZCBpdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBwdXJjaGFzZWQsIEdvb2dsZSBQbGF5CitkaXNwbGF5cyBhbiAiSXRlbSBhbHJlYWR5IHB1cmNoYXNlZCIgZXJyb3IuIFRoaXMgb2NjdXJzIGR1cmluZyBjaGVja291dCwgd2hlbiBHb29nbGUgUGxheQogZGlzcGxheXMgdGhlIHByaWNlIGFuZCBkZXNjcmlwdGlvbiBpbmZvcm1hdGlvbiBvbiB0aGUgY2hlY2tvdXQgcGFnZS4gV2hlbiB0aGUgdXNlciBkaXNtaXNzZXMgdGhlCiBlcnJvciBtZXNzYWdlLCB0aGUgY2hlY2tvdXQgcGFnZSBkaXNhcHBlYXJzIGFuZCB0aGUgdXNlciByZXR1cm5zIHRvIHlvdXIgdXNlciBpbnRlcmZhY2UuIEFzIGEgYmVzdAogcHJhY3RpY2UsIHlvdXIgYXBwbGljYXRpb24gc2hvdWxkIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBzZWVpbmcgdGhpcyBlcnJvci4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbgpAQCAtNDA0LDEwICs0MDQsMTAgQEAKIHVzZXIgcmVpbnN0YWxscyB5b3VyIGFwcGxpY2F0aW9uLCB3aXBlcyB0aGUgZGF0YSBvbiB0aGVpciBkZXZpY2UsIG9yIGluc3RhbGxzIHlvdXIgYXBwbGljYXRpb24gb24gYQogbmV3IGRldmljZS48L3A+CiAKLTxwPkl0ZW1zIHRoYXQgYXJlIHVubWFuYWdlZCBkbyBub3QgaGF2ZSB0aGVpciB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzdG9yZWQgb24gQW5kcm9pZCBNYXJrZXQsCi13aGljaCBtZWFucyB5b3UgY2Fubm90IHF1ZXJ5IEFuZHJvaWQgTWFya2V0IHRvIHJldHJpZXZlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIGZvciBpdGVtcyB3aG9zZQorPHA+SXRlbXMgdGhhdCBhcmUgdW5tYW5hZ2VkIGRvIG5vdCBoYXZlIHRoZWlyIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIHN0b3JlZCBvbiBHb29nbGUgUGxheSwKK3doaWNoIG1lYW5zIHlvdSBjYW5ub3QgcXVlcnkgR29vZ2xlIFBsYXkgdG8gcmV0cmlldmUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gZm9yIGl0ZW1zIHdob3NlCiBwdXJjaGFzZSB0eXBlIGlzIGxpc3RlZCBhcyB1bm1hbmFnZWQuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbgotb2YgdW5tYW5hZ2VkIGl0ZW1zLiBBbHNvLCB1bm1hbmFnZWQgaXRlbXMgY2FuIGJlIHB1cmNoYXNlZCBtdWx0aXBsZSB0aW1lcyBhcyBmYXIgYXMgQW5kcm9pZCBNYXJrZXQKK29mIHVubWFuYWdlZCBpdGVtcy4gQWxzbywgdW5tYW5hZ2VkIGl0ZW1zIGNhbiBiZSBwdXJjaGFzZWQgbXVsdGlwbGUgdGltZXMgYXMgZmFyIGFzIEdvb2dsZSBQbGF5CiBpcyBjb25jZXJuZWQsIHNvIGl0J3MgYWxzbyB1cCB0byB5b3UgdG8gY29udHJvbCBob3cgbWFueSB0aW1lcyBhbiB1bm1hbmFnZWQgaXRlbSBjYW4gYmUKIHB1cmNoYXNlZC48L3A+CiAKQEAgLTQxNywxMCArNDE3LDEwIEBACiAKIDxoMiBpZD0iYmlsbGluZy1yZWZ1bmRzIj5IYW5kbGluZyBSZWZ1bmRzPC9oMj4KIAotPHA+SW4tYXBwIGJpbGxpbmcgZG9lcyBub3QgYWxsb3cgdXNlcnMgdG8gc2VuZCBhIHJlZnVuZCByZXF1ZXN0IHRvIEFuZHJvaWQgTWFya2V0LiBSZWZ1bmRzIGZvcgorPHA+SW4tYXBwIGJpbGxpbmcgZG9lcyBub3QgYWxsb3cgdXNlcnMgdG8gc2VuZCBhIHJlZnVuZCByZXF1ZXN0IHRvIEdvb2dsZSBQbGF5LiBSZWZ1bmRzIGZvcgogaW4tYXBwIHB1cmNoYXNlcyBtdXN0IGJlIGRpcmVjdGVkIHRvIHlvdSAodGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlcikuIFlvdSBjYW4gdGhlbiBwcm9jZXNzIHRoZQotcmVmdW5kIHRocm91Z2ggeW91ciBHb29nbGUgQ2hlY2tvdXQgbWVyY2hhbnQgYWNjb3VudC4gV2hlbiB5b3UgZG8gdGhpcywgQW5kcm9pZCBNYXJrZXQgcmVjZWl2ZXMgYQotcmVmdW5kIG5vdGlmaWNhdGlvbiBmcm9tIEdvb2dsZSBDaGVja291dCwgYW5kIEFuZHJvaWQgTWFya2V0IHNlbmRzIGEgcmVmdW5kIG1lc3NhZ2UgdG8geW91cgorcmVmdW5kIHRocm91Z2ggeW91ciBHb29nbGUgQ2hlY2tvdXQgbWVyY2hhbnQgYWNjb3VudC4gV2hlbiB5b3UgZG8gdGhpcywgR29vZ2xlIFBsYXkgcmVjZWl2ZXMgYQorcmVmdW5kIG5vdGlmaWNhdGlvbiBmcm9tIEdvb2dsZSBDaGVja291dCwgYW5kIEdvb2dsZSBQbGF5IHNlbmRzIGEgcmVmdW5kIG1lc3NhZ2UgdG8geW91cgogYXBwbGljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX292ZXJ2aWV3Lmh0bWwjYmlsbGluZy1hY3Rpb24tbm90aWZ5Ij5IYW5kbGluZwogSU5fQVBQX05PVElGWSBtZXNzYWdlczwvYT4gYW5kIDxhCkBAIC00MzQsOSArNDM0LDkgQEAKIAogPGgyIGlkPSJiaWxsaW5nLXRlc3Rpbmctc2V0dXAiPlNldHRpbmcgVXAgVGVzdCBBY2NvdW50czwvaDI+CiAKLTxwPlRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZSBsZXRzIHlvdSBzZXQgdXAgb25lIG9yIG1vcmUgdGVzdCBhY2NvdW50cy4gQSB0ZXN0IGFjY291bnQgaXMgYQorPHA+VGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlIGxldHMgeW91IHNldCB1cCBvbmUgb3IgbW9yZSB0ZXN0IGFjY291bnRzLiBBIHRlc3QgYWNjb3VudCBpcyBhCiByZWd1bGFyIEdvb2dsZSBhY2NvdW50IHRoYXQgeW91IHJlZ2lzdGVyIG9uIHRoZSBwdWJsaXNoZXIgc2l0ZSBhcyBhIHRlc3QgYWNjb3VudC4gVGVzdCBhY2NvdW50cyBhcmUKLWF1dGhvcml6ZWQgdG8gbWFrZSBpbi1hcHAgcHVyY2hhc2VzIGZyb20gYXBwbGljYXRpb25zIHRoYXQgeW91IGhhdmUgdXBsb2FkZWQgdG8gdGhlIEFuZHJvaWQgTWFya2V0CithdXRob3JpemVkIHRvIG1ha2UgaW4tYXBwIHB1cmNoYXNlcyBmcm9tIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBoYXZlIHVwbG9hZGVkIHRvIHRoZSBHb29nbGUgUGxheQogc2l0ZSBidXQgaGF2ZSBub3QgeWV0IHB1Ymxpc2hlZC48L3A+CiAKIDxwPllvdSBjYW4gdXNlIGFueSBHb29nbGUgYWNjb3VudCBhcyBhIHRlc3QgYWNjb3VudC4gVGVzdCBhY2NvdW50cyBhcmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxldApAQCAtNDU4LDcgKzQ1OCw3IEBACiA8cD5UbyBhZGQgdGVzdCBhY2NvdW50cyB0byB5b3VyIHB1Ymxpc2hlciBhY2NvdW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgogCiA8b2w+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPkxvZyBpbjwvYT4gdG8geW91ciBwdWJsaXNoZXIgYWNjb3VudC48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPkxvZyBpbjwvYT4gdG8geW91ciBwdWJsaXNoZXIgYWNjb3VudC48L2xpPgogICA8bGk+T24gdGhlIHVwcGVyIGxlZnQgcGFydCBvZiB0aGUgcGFnZSwgdW5kZXIgeW91ciBuYW1lLCBjbGljayA8c3Ryb25nPkVkaXQgcHJvZmlsZTwvc3Ryb25nPi48L2xpPgogICA8bGk+T24gdGhlIEVkaXQgUHJvZmlsZSBwYWdlLCBzY3JvbGwgZG93biB0byB0aGUgTGljZW5zaW5nICZhbXA7IEluLWFwcCBCaWxsaW5nIHBhbmVsIChzZWUgZmlndXJlCiAgIDUpLjwvbGk+CkBAIC00ODAsNyArNDgwLDcgQEAKIGNvcnJlY3QgZm9ydW0sIHlvdSBjYW4gZ2V0IHRoZSBzdXBwb3J0IHlvdSBuZWVkIG1vcmUgcXVpY2tseS48L3A+CiAKIDxwIGNsYXNzPSJ0YWJsZS1jYXB0aW9uIiBpZD0ic3VwcG9ydC10YWJsZSI+PHN0cm9uZz5UYWJsZSAyLjwvc3Ryb25nPiBEZXZlbG9wZXIgc3VwcG9ydCByZXNvdXJjZXMKLWZvciBBbmRyb2lkIE1hcmtldCBpbi1hcHAgYmlsbGluZy48L3A+Citmb3IgR29vZ2xlIFBsYXkgaW4tYXBwIGJpbGxpbmcuPC9wPgogCiA8dGFibGU+CiAKQEAgLTUwMiw4ICs1MDIsOCBAQAogYW5kcm9pZDwvYT48L3RkPgogPC90cj4KIDx0cj4KLTx0ZD5NYXJrZXQgYmlsbGluZyBpc3N1ZSB0cmFja2VyPC90ZD4KLTx0ZD48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbWFya2V0YmlsbGluZy9pc3N1ZXMvIj5NYXJrZXQgYmlsbGluZworPHRkPkJpbGxpbmcgaXNzdWUgdHJhY2tlcjwvdGQ+Cis8dGQ+PGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL21hcmtldGJpbGxpbmcvaXNzdWVzLyI+QmlsbGluZwogcHJvamVjdCBpc3N1ZSB0cmFja2VyPC9hPjwvdGQ+CiA8dGQ+QnVnIGFuZCBpc3N1ZSByZXBvcnRzIHJlbGF0ZWQgc3BlY2lmaWNhbGx5IHRvIGluLWFwcCBiaWxsaW5nIHNhbXBsZSBjb2RlLjwvdGQ+CiA8L3RyPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfYmVzdF9wcmFjdGljZXMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19iZXN0X3ByYWN0aWNlcy5qZAppbmRleCBkOTc3NmFmLi5lMTAwY2U1IDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19iZXN0X3ByYWN0aWNlcy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19iZXN0X3ByYWN0aWNlcy5qZApAQCAtMzIsNyArMzIsNyBAQAogCiA8cD5BcyB5b3UgZGVzaWduIHlvdXIgaW4tYXBwIGJpbGxpbmcgaW1wbGVtZW50YXRpb24sIGJlIHN1cmUgdG8gZm9sbG93IHRoZSBzZWN1cml0eSBhbmQgZGVzaWduCiBndWlkZWxpbmVzIHRoYXQgYXJlIGRpc2N1c3NlZCBpbiB0aGlzIGRvY3VtZW50LiBUaGVzZSBndWlkZWxpbmVzIGFyZSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlcyBmb3IKLWFueW9uZSB3aG8gaXMgdXNpbmcgQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlLjwvcD4KK2FueW9uZSB3aG8gaXMgdXNpbmcgR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlLjwvcD4KIAogPGgyPlNlY3VyaXR5IEJlc3QgUHJhY3RpY2VzPC9oMj4KIApAQCAtOTIsNyArOTIsNyBAQAogbm9uY2VzIG9uIHRoZSBzZXJ2ZXIuPC9wPgogCiA8aDQ+VGFrZSBhY3Rpb24gYWdhaW5zdCB0cmFkZW1hcmsgYW5kIGNvcHlyaWdodCBpbmZyaW5nZW1lbnQ8L2g0PgotPHA+SWYgeW91IHNlZSB5b3VyIGNvbnRlbnQgYmVpbmcgcmVkaXN0cmlidXRlZCBvbiBBbmRyb2lkIE1hcmtldCwgYWN0IHF1aWNrbHkgYW5kIGRlY2lzaXZlbHkuIEZpbGUgYQorPHA+SWYgeW91IHNlZSB5b3VyIGNvbnRlbnQgYmVpbmcgcmVkaXN0cmlidXRlZCBvbiBHb29nbGUgUGxheSwgYWN0IHF1aWNrbHkgYW5kIGRlY2lzaXZlbHkuIEZpbGUgYQogPGEgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/aGw9ZW4mYW1wO2Fuc3dlcj0xNDE1MTEiPnRyYWRlbWFyayBub3RpY2UKIG9mIGluZnJpbmdlbWVudDwvYT4gb3IgYSA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vYW5kcm9pZF9kbWNhLmh0bWwiPmNvcHlyaWdodCBub3RpY2Ugb2YKIGluZnJpbmdlbWVudDwvYT4uPC9wPgpAQCAtMTAyLDcgKzEwMiw3IEBACiBwdXJjaGFzZSBzdGF0ZSBvZiB0aGUgdW5sb2NrZWQgY29udGVudCB3aGVuZXZlciBhIHVzZXIgYWNjZXNzZXMgdGhlIGNvbnRlbnQuIFRoaXMgYWxsb3dzIHlvdSB0bwogcmV2b2tlIHVzZSB3aGVuIG5lY2Vzc2FyeSBhbmQgbWluaW1pemUgcGlyYWN5LjwvcD4KIAotPGg0PlByb3RlY3QgeW91ciBBbmRyb2lkIE1hcmtldCBwdWJsaWMga2V5PC9oND4KKzxoND5Qcm90ZWN0IHlvdXIgR29vZ2xlIFBsYXkgcHVibGljIGtleTwvaDQ+CiA8cD5UbyBrZWVwIHlvdXIgcHVibGljIGtleSBzYWZlIGZyb20gbWFsaWNpb3VzIHVzZXJzIGFuZCBoYWNrZXJzLCBkbyBub3QgZW1iZWQgaXQgaW4gYW55IGNvZGUgYXMgYQogbGl0ZXJhbCBzdHJpbmcuIEluc3RlYWQsIGNvbnN0cnVjdCB0aGUgc3RyaW5nIGF0IHJ1bnRpbWUgZnJvbSBwaWVjZXMgb3IgdXNlIGJpdCBtYW5pcHVsYXRpb24gKGZvcgogZXhhbXBsZSwgWE9SIHdpdGggc29tZSBvdGhlciBzdHJpbmcpIHRvIGhpZGUgdGhlIGFjdHVhbCBrZXkuIFRoZSBrZXkgaXRzZWxmIGlzIG5vdCBzZWNyZXQKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX2ludGVncmF0ZS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX2ludGVncmF0ZS5qZAppbmRleCA2MDE3NTgzLi5iNDlkYzI1IDEwMDc1NQotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19pbnRlZ3JhdGUuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfaW50ZWdyYXRlLmpkCkBAIC0zNSw4ICszNSw4IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5BbmRyb2lkIE1hcmtldCBJbi1hcHAgQmlsbGluZyBwcm92aWRlcyBhIHN0cmFpZ2h0Zm9yd2FyZCwgc2ltcGxlIGludGVyZmFjZSBmb3Igc2VuZGluZyBpbi1hcHAKLWJpbGxpbmcgcmVxdWVzdHMgYW5kIG1hbmFnaW5nIGluLWFwcCBiaWxsaW5nIHRyYW5zYWN0aW9ucyB1c2luZyBBbmRyb2lkIE1hcmtldC4gVGhpcyBkb2N1bWVudCBoZWxwcworPHA+SW4tYXBwIEJpbGxpbmcgb24gR29vZ2xlIFBsYXkgcHJvdmlkZXMgYSBzdHJhaWdodGZvcndhcmQsIHNpbXBsZSBpbnRlcmZhY2UgZm9yIHNlbmRpbmcgaW4tYXBwCitiaWxsaW5nIHJlcXVlc3RzIGFuZCBtYW5hZ2luZyBpbi1hcHAgYmlsbGluZyB0cmFuc2FjdGlvbnMgdXNpbmcgR29vZ2xlIFBsYXkuIFRoaXMgZG9jdW1lbnQgaGVscHMKIHlvdSBpbXBsZW1lbnQgaW4tYXBwIGJpbGxpbmcgYnkgc3RlcHBpbmcgdGhyb3VnaCB0aGUgcHJpbWFyeSBpbXBsZW1lbnRhdGlvbiB0YXNrcywgdXNpbmcgdGhlIGluLWFwcAogYmlsbGluZyBzYW1wbGUgYXBwbGljYXRpb24gYXMgYW4gZXhhbXBsZS48L3A+CiAKQEAgLTUzLDIzICs1MywyMyBAQAogICA8bGk+PGEgaHJlZj0iI2JpbGxpbmctcGVybWlzc2lvbiI+VXBkYXRlIHlvdXIgQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlPC9hPi48L2xpPgogICA8bGk+PGEgaHJlZj0iI2JpbGxpbmctc2VydmljZSI+Q3JlYXRlIGEgU2VydmljZTwvYT4gYW5kIGJpbmQgaXQgdG8gdGhlCiAgIDxjb2RlPk1hcmtldEJpbGxpbmdTZXJ2aWNlPC9jb2RlPiBzbyB5b3VyIGFwcGxpY2F0aW9uIGNhbiBzZW5kIGJpbGxpbmcgcmVxdWVzdHMgYW5kIHJlY2VpdmUKLSAgYmlsbGluZyByZXNwb25zZXMgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uPC9saT4KKyAgYmlsbGluZyByZXNwb25zZXMgZnJvbSBHb29nbGUgUGxheS48L2xpPgogICA8bGk+PGEgaHJlZj0iI2JpbGxpbmctYnJvYWRjYXN0LXJlY2VpdmVyIj5DcmVhdGUgYSBCcm9hZGNhc3RSZWNlaXZlcjwvYT4gdG8gaGFuZGxlIGJyb2FkY2FzdAotICBpbnRlbnRzIGZyb20gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLjwvbGk+CisgIGludGVudHMgZnJvbSBHb29nbGUgUGxheS48L2xpPgogICA8bGk+PGEgaHJlZj0iI2JpbGxpbmctc2lnbmF0dXJlcyI+Q3JlYXRlIGEgc2VjdXJpdHkgcHJvY2Vzc2luZyBjb21wb25lbnQ8L2E+IHRvIHZlcmlmeSB0aGUKLSAgaW50ZWdyaXR5IG9mIHRoZSB0cmFuc2FjdGlvbiBtZXNzYWdlcyB0aGF0IGFyZSBzZW50IGJ5IEFuZHJvaWQgTWFya2V0IC48L2xpPgorICBpbnRlZ3JpdHkgb2YgdGhlIHRyYW5zYWN0aW9uIG1lc3NhZ2VzIHRoYXQgYXJlIHNlbnQgYnkgR29vZ2xlIFBsYXkuPC9saT4KICAgPGxpPjxhIGhyZWY9IiNiaWxsaW5nLWltcGxlbWVudCI+TW9kaWZ5IHlvdXIgYXBwbGljYXRpb24gY29kZTwvYT4gdG8gc3VwcG9ydCBpbi1hcHAgYmlsbGluZy48L2xpPgogPC9vbD4KIAogPGgyIGlkPSJiaWxsaW5nLWRvd25sb2FkIj5Eb3dubG9hZGluZyB0aGUgU2FtcGxlIEFwcGxpY2F0aW9uPC9oMj4KIAogPHA+VGhlIGluLWFwcCBiaWxsaW5nIHNhbXBsZSBhcHBsaWNhdGlvbiBzaG93cyB5b3UgaG93IHRvIHBlcmZvcm0gc2V2ZXJhbCB0YXNrcyB0aGF0IGFyZSBjb21tb24gdG8KLWFsbCBBbmRyb2lkIE1hcmtldCBpbi1hcHAgYmlsbGluZyBpbXBsZW1lbnRhdGlvbnMsIGluY2x1ZGluZzo8L3A+CithbGwgaW4tYXBwIGJpbGxpbmcgaW1wbGVtZW50YXRpb25zLCBpbmNsdWRpbmc6PC9wPgogCiA8dWw+Ci0gIDxsaT5TZW5kaW5nIGluLWFwcCBiaWxsaW5nIHJlcXVlc3RzIHRvIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbi48L2xpPgotICA8bGk+SGFuZGxpbmcgc3luY2hyb25vdXMgcmVzcG9uc2VzIGZyb20gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLjwvbGk+Ci0gIDxsaT5IYW5kbGluZyBicm9hZGNhc3QgaW50ZW50cyAoYXN5bmNocm9ub3VzIHJlc3BvbnNlcykgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPlNlbmRpbmcgaW4tYXBwIGJpbGxpbmcgcmVxdWVzdHMgdG8gR29vZ2xlIFBsYXkuPC9saT4KKyAgPGxpPkhhbmRsaW5nIHN5bmNocm9ub3VzIHJlc3BvbnNlcyBmcm9tIEdvb2dsZSBQbGF5LjwvbGk+CisgIDxsaT5IYW5kbGluZyBicm9hZGNhc3QgaW50ZW50cyAoYXN5bmNocm9ub3VzIHJlc3BvbnNlcykgZnJvbSBHb29nbGUgUGxheS48L2xpPgogICA8bGk+VXNpbmcgaW4tYXBwIGJpbGxpbmcgc2VjdXJpdHkgbWVjaGFuaXNtcyB0byB2ZXJpZnkgdGhlIGludGVncml0eSBvZiBiaWxsaW5nIHJlc3BvbnNlcy48L2xpPgogICA8bGk+Q3JlYXRpbmcgYSB1c2VyIGludGVyZmFjZSB0aGF0IGxldHMgdXNlcnMgc2VsZWN0IGl0ZW1zIGZvciBwdXJjaGFzZS48L2xpPgogPC91bD4KQEAgLTkxLDggKzkxLDggQEAKIAogPHRyPgogPHRkPklNYXJrZXRCaWxsaW5nU2VydmljZS5haWRsPC90ZD4KLTx0ZD5BbmRyb2lkIEludGVyZmFjZSBEZWZpbml0aW9uIExpYnJhcnkgKEFJREwpIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBJUEMgaW50ZXJmYWNlIHRvIEFuZHJvaWQKLU1hcmtldCdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgKDxjb2RlPk1hcmtldEJpbGxpbmdTZXJ2aWNlPC9jb2RlPikuPC90ZD4KKzx0ZD5BbmRyb2lkIEludGVyZmFjZSBEZWZpbml0aW9uIExpYnJhcnkgKEFJREwpIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBJUEMgaW50ZXJmYWNlIHRvIEdvb2dsZQorUGxheSdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgKDxjb2RlPk1hcmtldEJpbGxpbmdTZXJ2aWNlPC9jb2RlPikuPC90ZD4KIDwvdHI+CiAKIDx0cj4KQEAgLTEwOSwxMiArMTA5LDEyIEBACiA8dHI+CiAgIDx0ZD5CaWxsaW5nUmVjZWl2ZXIuamF2YTwvdGQ+CiAgIDx0ZD5BIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IHRoYXQgcmVjZWl2ZXMgYXN5bmNocm9ub3VzIHJlc3BvbnNlIG1lc3NhZ2VzCi0gIChicm9hZGNhc3QgaW50ZW50cykgZnJvbSBBbmRyb2lkIE1hcmtldC4gRm9yd2FyZHMgYWxsIG1lc3NhZ2VzIHRvIHRoZQorICAoYnJvYWRjYXN0IGludGVudHMpIGZyb20gR29vZ2xlIFBsYXkuIEZvcndhcmRzIGFsbCBtZXNzYWdlcyB0byB0aGUKICAgPGNvZGU+QmlsbGluZ1NlcnZpY2U8L2NvZGU+LjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+QmlsbGluZ1NlcnZpY2UuamF2YTwvdGQ+Ci0gIDx0ZD5BIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfSB0aGF0IHNlbmRzIG1lc3NhZ2VzIHRvIEFuZHJvaWQgTWFya2V0IG9uIGJlaGFsZiBvZiB0aGUKKyAgPHRkPkEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9IHRoYXQgc2VuZHMgbWVzc2FnZXMgdG8gR29vZ2xlIFBsYXkgb24gYmVoYWxmIG9mIHRoZQogICBhcHBsaWNhdGlvbiBieSBjb25uZWN0aW5nIChiaW5kaW5nKSB0byB0aGUgPGNvZGU+TWFya2V0QmlsbGluZ1NlcnZpY2U8L2NvZGU+LjwvdGQ+CiA8L3RyPgogCkBAIC0xMzYsOCArMTM2LDggQEAKIAogPHRyPgogPHRkPkNvbnN0cy5qYXZhPC90ZD4KLTx0ZD5EZWZpbmVzIHZhcmlvdXMgQW5kcm9pZCBNYXJrZXQgY29uc3RhbnRzIGFuZCBzYW1wbGUgYXBwbGljYXRpb24gY29uc3RhbnRzLiBBbGwgY29uc3RhbnRzIHRoYXQKLWFyZSBkZWZpbmVkIGJ5IEFuZHJvaWQgTWFya2V0IG11c3QgYmUgZGVmaW5lZCB0aGUgc2FtZSB3YXkgaW4geW91ciBhcHBsaWNhdGlvbi48L3RkPgorPHRkPkRlZmluZXMgdmFyaW91cyBHb29nbGUgUGxheSBjb25zdGFudHMgYW5kIHNhbXBsZSBhcHBsaWNhdGlvbiBjb25zdGFudHMuIEFsbCBjb25zdGFudHMgdGhhdAorYXJlIGRlZmluZWQgYnkgR29vZ2xlIFBsYXkgbXVzdCBiZSBkZWZpbmVkIHRoZSBzYW1lIHdheSBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvdGQ+CiA8L3RyPgogCiA8dHI+CkBAIC0xNzEsNyArMTcxLDcgQEAKIAogPHVsPgogICA8bGk+Q29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIHRoZSBzYW1wbGUgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPlVwbG9hZGluZyB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIHRvIEFuZHJvaWQgTWFya2V0LjwvbGk+CisgIDxsaT5VcGxvYWRpbmcgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiB0byBHb29nbGUgUGxheS48L2xpPgogICA8bGk+U2V0dGluZyB1cCB0ZXN0IGFjY291bnRzIGFuZCBydW5uaW5nIHRoZSBzYW1wbGUgYXBwbGljYXRpb24uPC9saT4KIDwvdWw+CiAKQEAgLTE4NiwxMiArMTg2LDEyIEBACiBmb2xsb3dpbmc6PC9wPgogCiA8b2w+Ci0gIDxsaT48c3Ryb25nPkFkZCB5b3VyIEFuZHJvaWQgTWFya2V0IHB1YmxpYyBrZXkgdG8gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBjb2RlLjwvc3Ryb25nPgorICA8bGk+PHN0cm9uZz5BZGQgeW91ciBHb29nbGUgUGxheSBwdWJsaWMga2V5IHRvIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gY29kZS48L3N0cm9uZz4KICAgICA8cD5UaGlzIGVuYWJsZXMgdGhlIGFwcGxpY2F0aW9uIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9mIHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiB0aGF0IGlzCi0gICAgcmV0dXJuZWQgZnJvbSBBbmRyb2lkIE1hcmtldC4gVG8gYWRkIHlvdXIgcHVibGljIGtleSB0byB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGNvZGUsIGRvIHRoZQorICAgIHJldHVybmVkIGZyb20gR29vZ2xlIFBsYXkuIFRvIGFkZCB5b3VyIHB1YmxpYyBrZXkgdG8gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBjb2RlLCBkbyB0aGUKICAgICBmb2xsb3dpbmc6PC9wPgogICAgIDxvbD4KLSAgICAgIDxsaT5Mb2cgaW4gdG8geW91ciBBbmRyb2lkIE1hcmtldCA8YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPnB1Ymxpc2hlcgorICAgICAgPGxpPkxvZyBpbiB0byB5b3VyIEdvb2dsZSBQbGF5IDxhIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5wdWJsaXNoZXIKICAgICAgIGFjY291bnQ8L2E+LjwvbGk+CiAgICAgICA8bGk+T24gdGhlIHVwcGVyIGxlZnQgcGFydCBvZiB0aGUgcGFnZSwgdW5kZXIgeW91ciBuYW1lLCBjbGljayA8c3Ryb25nPkVkaXQKICAgICAgIFByb2ZpbGU8L3N0cm9uZz4uPC9saT4KQEAgLTIwOCw3ICsyMDgsNyBAQAogICAgIDwvb2w+CiAgIDwvbGk+CiAgIDxsaT48c3Ryb25nPkNoYW5nZSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBzYW1wbGUgYXBwbGljYXRpb24uPC9zdHJvbmc+Ci0gICAgPHA+VGhlIGN1cnJlbnQgcGFja2FnZSBuYW1lIGlzIDxjb2RlPmNvbS5leGFtcGxlLmR1bmdlb25zPC9jb2RlPi4gQW5kcm9pZCBNYXJrZXQgZG9lcyBub3QgbGV0CisgICAgPHA+VGhlIGN1cnJlbnQgcGFja2FnZSBuYW1lIGlzIDxjb2RlPmNvbS5leGFtcGxlLmR1bmdlb25zPC9jb2RlPi4gR29vZ2xlIFBsYXkgZG9lcyBub3QgbGV0CiAgICAgeW91IHVwbG9hZCBhcHBsaWNhdGlvbnMgd2l0aCBwYWNrYWdlIG5hbWVzIHRoYXQgY29udGFpbiA8Y29kZT5jb20uZXhhbXBsZTwvY29kZT4sIHNvIHlvdSBtdXN0CiAgICAgY2hhbmdlIHRoZSBwYWNrYWdlIG5hbWUgdG8gc29tZXRoaW5nIGVsc2UuPC9wPgogICA8L2xpPgpAQCAtMjIxLDE0ICsyMjEsMTQgQEAKIDxoMz5VcGxvYWRpbmcgdGhlIHNhbXBsZSBhcHBsaWNhdGlvbjwvaDM+CiAKIDxwPkFmdGVyIHlvdSBidWlsZCBhIHJlbGVhc2UgdmVyc2lvbiBvZiB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uIGFuZCBzaWduIGl0LCB5b3UgbmVlZCB0byB1cGxvYWQgaXQgYXMKLWEgZHJhZnQgdG8gdGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlLiBZb3UgYWxzbyBuZWVkIHRvIGNyZWF0ZSBhIHByb2R1Y3QgbGlzdCBmb3IgdGhlIGluLWFwcAorYSBkcmFmdCB0byB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUuIFlvdSBhbHNvIG5lZWQgdG8gY3JlYXRlIGEgcHJvZHVjdCBsaXN0IGZvciB0aGUgaW4tYXBwCiBpdGVtcyB0aGF0IGFyZSBhdmFpbGFibGUgZm9yIHB1cmNoYXNlIGluIHRoZSBzYW1wbGUgYXBwbGljYXRpb24uIFRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHNob3cgeW91CiBob3cgdG8gZG8gdGhpcy48L3A+CiA8b2w+Ci0gIDxsaT48c3Ryb25nPlVwbG9hZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gdG8gQW5kcm9pZCBNYXJrZXQuPC9zdHJvbmc+CisgIDxsaT48c3Ryb25nPlVwbG9hZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHRoZSBzYW1wbGUgYXBwbGljYXRpb24gdG8gR29vZ2xlIFBsYXkuPC9zdHJvbmc+CiAgICAgPHA+RG8gbm90IHB1Ymxpc2ggdGhlIHNhbXBsZSBhcHBsaWNhdGlvbjsgbGVhdmUgaXQgYXMgYW4gdW5wdWJsaXNoZWQgZHJhZnQgYXBwbGljYXRpb24uIFRoZQogICAgIHNhbXBsZSBhcHBsaWNhdGlvbiBpcyBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyBvbmx5IGFuZCBzaG91bGQgbm90IGJlIG1hZGUgcHVibGljbHkgYXZhaWxhYmxlCi0gICAgb24gQW5kcm9pZCBNYXJrZXQuIFRvIGxlYXJuIGhvdyB0byB1cGxvYWQgYW4gYXBwbGljYXRpb24gdG8gQW5kcm9pZCBNYXJrZXQsIHNlZSA8YQorICAgIG9uIEdvb2dsZSBQbGF5LiBUbyBsZWFybiBob3cgdG8gdXBsb2FkIGFuIGFwcGxpY2F0aW9uIHRvIEdvb2dsZSBQbGF5LCBzZWUgPGEKICAgICBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTEzNDY5Ij5VcGxvYWRpbmcKICAgICBhcHBsaWNhdGlvbnM8L2E+LjwvcD4KICAgPC9saT4KQEAgLTI1Myw3ICsyNTMsNyBAQAogb250byBhIGRldmljZSB0byBydW4gaXQuIFRvIHJ1biB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uLCBkbyB0aGUgZm9sbG93aW5nOjwvcD4KIAogPG9sPgotICA8bGk+PHN0cm9uZz5NYWtlIHN1cmUgeW91IGhhdmUgYXQgbGVhc3Qgb25lIHRlc3QgYWNjb3VudCByZWdpc3RlcmVkIHVuZGVyIHlvdXIgQW5kcm9pZCBNYXJrZXQKKyAgPGxpPjxzdHJvbmc+TWFrZSBzdXJlIHlvdSBoYXZlIGF0IGxlYXN0IG9uZSB0ZXN0IGFjY291bnQgcmVnaXN0ZXJlZCB1bmRlciB5b3VyIEdvb2dsZSBQbGF5CiAgIHB1Ymxpc2hlciBhY2NvdW50Ljwvc3Ryb25nPgogICAgIDxwPllvdSBjYW5ub3QgcHVyY2hhc2UgaXRlbXMgZnJvbSB5b3Vyc2VsZiAoR29vZ2xlIENoZWNrb3V0IHByb2hpYml0cyB0aGlzKSwgc28geW91IG5lZWQgdG8KICAgICBjcmVhdGUgYXQgbGVhc3Qgb25lIHRlc3QgYWNjb3VudCB0aGF0IHlvdSBjYW4gdXNlIHRvIHB1cmNoYXNlIGl0ZW1zIGluIHRoZSBzYW1wbGUgYXBwbGljYXRpb24uCkBAIC0yNjEsMTggKzI2MSwxOCBAQAogICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX3Rlc3RpbmcuaHRtbCNiaWxsaW5nLXRlc3Rpbmctc2V0dXAiPlNldHRpbmcgdXAgVGVzdAogICAgIEFjY291bnRzPC9hPi48L3A+CiAgIDwvbGk+Ci0gIDxsaT48c3Ryb25nPlZlcmlmeSB0aGF0IHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgYSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBNYXJrZXQKKyAgPGxpPjxzdHJvbmc+VmVyaWZ5IHRoYXQgeW91ciBkZXZpY2UgaXMgcnVubmluZyBhIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoZSBHb29nbGUgUGxheQogICBhcHBsaWNhdGlvbiBvciB0aGUgTXlBcHBzIGFwcGxpY2F0aW9uLjwvc3Ryb25nPgogICAgIDxwPklmIHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCAzLjAsIGluLWFwcCBiaWxsaW5nIHJlcXVpcmVzIHZlcnNpb24gNS4wLjEyIChvciBoaWdoZXIpIG9mCiAgICAgdGhlIE15QXBwcyBhcHBsaWNhdGlvbi4gSWYgeW91ciBkZXZpY2UgaXMgcnVubmluZyBhbnkgb3RoZXIgdmVyc2lvbiBvZiBBbmRyb2lkLCBpbi1hcHAgYmlsbGluZwotICAgIHJlcXVpcmVzIHZlcnNpb24gMi4zLjQgKG9yIGhpZ2hlcikgb2YgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLiBUbyBsZWFybiBob3cgdG8gY2hlY2sgdGhlCi0gICAgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24sIHNlZSA8YQotICAgIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xOTA4NjAiPlVwZGF0aW5nIEFuZHJvaWQKLSAgICBNYXJrZXQ8L2E+LjwvcD4KKyAgICByZXF1aXJlcyB2ZXJzaW9uIDIuMy40IChvciBoaWdoZXIpIG9mIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbi4gVG8gbGVhcm4gaG93IHRvIGNoZWNrIHRoZQorICAgIHZlcnNpb24gb2YgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLCBzZWUgPGEKKyAgICBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTkwODYwIj5VcGRhdGluZyBHb29nbGUKKyAgICBQbGF5PC9hPi48L3A+CiAgIDwvbGk+CiAgIDxsaT48c3Ryb25nPkluc3RhbGwgdGhlIGFwcGxpY2F0aW9uIG9udG8geW91ciBkZXZpY2UuPC9zdHJvbmc+Ci0gICAgPHA+RXZlbiB0aG91Z2ggeW91IHVwbG9hZGVkIHRoZSBhcHBsaWNhdGlvbiB0byBBbmRyb2lkIE1hcmtldCwgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBwdWJsaXNoZWQsCi0gICAgc28geW91IGNhbm5vdCBkb3dubG9hZCBpdCBmcm9tIEFuZHJvaWQgTWFya2V0IHRvIGEgZGV2aWNlLiBJbnN0ZWFkLCB5b3UgbXVzdCBpbnN0YWxsIHRoZQorICAgIDxwPkV2ZW4gdGhvdWdoIHlvdSB1cGxvYWRlZCB0aGUgYXBwbGljYXRpb24gdG8gR29vZ2xlIFBsYXksIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgcHVibGlzaGVkLAorICAgIHNvIHlvdSBjYW5ub3QgZG93bmxvYWQgaXQgZnJvbSBHb29nbGUgUGxheSB0byBhIGRldmljZS4gSW5zdGVhZCwgeW91IG11c3QgaW5zdGFsbCB0aGUKICAgICBhcHBsaWNhdGlvbiBvbnRvIHlvdXIgZGV2aWNlLiBUbyBsZWFybiBob3cgdG8gaW5zdGFsbCBhbiBhcHBsaWNhdGlvbiBvbnRvIGEgZGV2aWNlLCBzZWUgPGEKICAgICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy9idWlsZGluZy9idWlsZGluZy1jbWRsaW5lLmh0bWwjUnVubmluZ09uRGV2aWNlIj5SdW5uaW5nIG9uIGEKICAgICBkZXZpY2U8L2E+LjwvcD4KQEAgLTI4MCw3ICsyODAsNyBAQAogIDxsaT48c3Ryb25nPk1ha2Ugb25lIG9mIHlvdXIgdGVzdCBhY2NvdW50cyB0aGUgcHJpbWFyeSBhY2NvdW50IG9uIHlvdXIgZGV2aWNlLjwvc3Ryb25nPgogICAgIDxwPlRoZSBwcmltYXJ5IGFjY291bnQgb24geW91ciBkZXZpY2UgbXVzdCBiZSBvbmUgb2YgdGhlIDxhCiAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfYWRtaW4uaHRtbCNiaWxsaW5nLXRlc3Rpbmctc2V0dXAiPnRlc3QgYWNjb3VudHM8L2E+Ci0gICAgdGhhdCB5b3UgcmVnaXN0ZXJlZCBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgc2l0ZS4gSWYgdGhlIHByaW1hcnkgYWNjb3VudCBvbiB5b3VyIGRldmljZSBpcyBub3QgYQorICAgIHRoYXQgeW91IHJlZ2lzdGVyZWQgb24gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlLiBJZiB0aGUgcHJpbWFyeSBhY2NvdW50IG9uIHlvdXIgZGV2aWNlIGlzIG5vdCBhCiAgICAgdGVzdCBhY2NvdW50LCB5b3UgbXVzdCBkbyBhIGZhY3RvcnkgcmVzZXQgb2YgdGhlIGRldmljZSBhbmQgdGhlbiBzaWduIGluIHdpdGggb25lIG9mIHlvdXIgdGVzdAogICAgIGFjY291bnRzLiBUbyBwZXJmb3JtIGEgZmFjdG9yeSByZXNldCwgZG8gdGhlIGZvbGxvd2luZzo8L3A+CiAgICAgPG9sPgpAQCAtMzA2LDcgKzMwNiw3IEBACiA8aDIgaWQ9ImJpbGxpbmctYWRkLWFpZGwiPkFkZGluZyB0aGUgQUlETCBmaWxlIHRvIHlvdXIgcHJvamVjdDwvaDI+CiAKIDxwPlRoZSBzYW1wbGUgYXBwbGljYXRpb24gY29udGFpbnMgYW4gQW5kcm9pZCBJbnRlcmZhY2UgRGVmaW5pdGlvbiBMYW5ndWFnZSAoQUlETCkgZmlsZSwgIHdoaWNoCi1kZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlCitkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlCiAoPGNvZGU+TWFya2V0QmlsbGluZ1NlcnZpY2U8L2NvZGU+KS4gV2hlbiB5b3UgYWRkIHRoaXMgZmlsZSB0byB5b3VyIHByb2plY3QsIHRoZSBBbmRyb2lkIGJ1aWxkCiBlbnZpcm9ubWVudCBjcmVhdGVzIGFuIGludGVyZmFjZSBmaWxlICg8Y29kZT5JTWFya2V0QmlsbGluZ1NlcnZpY2UuamF2YTwvY29kZT4pLiBZb3UgY2FuIHRoZW4gdXNlCiB0aGlzIGludGVyZmFjZSB0byBtYWtlIGJpbGxpbmcgcmVxdWVzdHMgYnkgaW52b2tpbmcgSVBDIG1ldGhvZCBjYWxscy48L3A+CkBAIC0zMzMsMjkgKzMzMywyOSBAQAogCiA8aDIgaWQ9ImJpbGxpbmctcGVybWlzc2lvbiI+VXBkYXRpbmcgWW91ciBBcHBsaWNhdGlvbidzIE1hbmlmZXN0PC9oMj4KIAotPHA+SW4tYXBwIGJpbGxpbmcgcmVsaWVzIG9uIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiwgd2hpY2ggaGFuZGxlcyBhbGwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuCi15b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgQW5kcm9pZCBNYXJrZXQgc2VydmVyLiBUbyB1c2UgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCB5b3VyCis8cD5Jbi1hcHAgYmlsbGluZyByZWxpZXMgb24gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLCB3aGljaCBoYW5kbGVzIGFsbCBjb21tdW5pY2F0aW9uIGJldHdlZW4KK3lvdXIgYXBwbGljYXRpb24gYW5kIHRoZSBHb29nbGUgUGxheSBzZXJ2ZXIuIFRvIHVzZSB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24sIHlvdXIKIGFwcGxpY2F0aW9uIG11c3QgcmVxdWVzdCB0aGUgcHJvcGVyIHBlcm1pc3Npb24uIFlvdSBjYW4gZG8gdGhpcyBieSBhZGRpbmcgdGhlCiA8Y29kZT5jb20uYW5kcm9pZC52ZW5kaW5nLkJJTExJTkc8L2NvZGU+IHBlcm1pc3Npb24gdG8geW91ciBBbmRyb2lkTWFuaWZlc3QueG1sIGZpbGUuIElmIHlvdXIKIGFwcGxpY2F0aW9uIGRvZXMgbm90IGRlY2xhcmUgdGhlIGluLWFwcCBiaWxsaW5nIHBlcm1pc3Npb24sIGJ1dCBhdHRlbXB0cyB0byBzZW5kIGJpbGxpbmcgcmVxdWVzdHMsCi1BbmRyb2lkIE1hcmtldCB3aWxsIHJlZnVzZSB0aGUgcmVxdWVzdHMgYW5kIHJlc3BvbmQgd2l0aCBhIDxjb2RlPlJFU1VMVF9ERVZFTE9QRVJfRVJST1I8L2NvZGU+CitHb29nbGUgUGxheSB3aWxsIHJlZnVzZSB0aGUgcmVxdWVzdHMgYW5kIHJlc3BvbmQgd2l0aCBhIDxjb2RlPlJFU1VMVF9ERVZFTE9QRVJfRVJST1I8L2NvZGU+CiByZXNwb25zZSBjb2RlLjwvcD4KIAogPHA+SW4gYWRkaXRpb24gdG8gdGhlIGJpbGxpbmcgcGVybWlzc2lvbiwgeW91IG5lZWQgdG8gZGVjbGFyZSB0aGUge0BsaW5rCiBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IHRoYXQgeW91IHdpbGwgdXNlIHRvIHJlY2VpdmUgYXN5bmNocm9ub3VzIHJlc3BvbnNlIG1lc3NhZ2VzCi0oYnJvYWRjYXN0IGludGVudHMpIGZyb20gQW5kcm9pZCBNYXJrZXQsIGFuZCB5b3UgbmVlZCB0byBkZWNsYXJlIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0KLXRoYXQgeW91IHdpbGwgdXNlIHRvIGJpbmQgd2l0aCB0aGUgPGNvZGU+SU1hcmtldEJpbGxpbmdTZXJ2aWNlPC9jb2RlPiBhbmQgc2VuZCBtZXNzYWdlcyB0byBBbmRyb2lkCi1NYXJrZXQuIFlvdSBtdXN0IGFsc28gZGVjbGFyZSA8YQorKGJyb2FkY2FzdCBpbnRlbnRzKSBmcm9tIEdvb2dsZSBQbGF5LCBhbmQgeW91IG5lZWQgdG8gZGVjbGFyZSB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9Cit0aGF0IHlvdSB3aWxsIHVzZSB0byBiaW5kIHdpdGggdGhlIDxjb2RlPklNYXJrZXRCaWxsaW5nU2VydmljZTwvY29kZT4gYW5kIHNlbmQgbWVzc2FnZXMgdG8gR29vZ2xlCitQbGF5LiBZb3UgbXVzdCBhbHNvIGRlY2xhcmUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvaW50ZW50LWZpbHRlci1lbGVtZW50Lmh0bWwiPmludGVudCBmaWx0ZXJzPC9hPiBmb3IgdGhlIHtAbGluawogYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfSBzbyB0aGF0IHRoZSBBbmRyb2lkIHN5c3RlbSBrbm93cyBob3cgdG8gaGFuZGxlIHRoZSBicm9hZGNhc3QKLWludGVudHMgdGhhdCBhcmUgc2VudCBmcm9tIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbi48L3A+CitpbnRlbnRzIHRoYXQgYXJlIHNlbnQgZnJvbSB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24uPC9wPgogCiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBob3cgdGhlIGluLWFwcCBiaWxsaW5nIHNhbXBsZSBhcHBsaWNhdGlvbiBkZWNsYXJlcyB0aGUgYmlsbGluZyBwZXJtaXNzaW9uLAogdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9LCB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9LCBhbmQgdGhlIGludGVudAogZmlsdGVycy4gSW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiwgPGNvZGU+QmlsbGluZ1JlY2VpdmVyPC9jb2RlPiBpcyB0aGUge0BsaW5rCi1hbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IHRoYXQgaGFuZGxlcyBicm9hZGNhc3QgaW50ZW50cyBmcm9tIHRoZSBBbmRyb2lkIE1hcmtldAorYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfSB0aGF0IGhhbmRsZXMgYnJvYWRjYXN0IGludGVudHMgZnJvbSB0aGUgR29vZ2xlIFBsYXkKIGFwcGxpY2F0aW9uIGFuZCA8Y29kZT5CaWxsaW5nU2VydmljZTwvY29kZT4gaXMgdGhlIHtAbGluayBhbmRyb2lkLmFwcC5TZXJ2aWNlfSB0aGF0IHNlbmRzIHJlcXVlc3RzCi10byB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uPC9wPgordG8gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLjwvcD4KIAogPHByZT4KICZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8mZ3Q7CkBAIC0zOTEsMTEgKzM5MSwxMSBAQAogPGgyIGlkPSJiaWxsaW5nLXNlcnZpY2UiPkNyZWF0aW5nIGEgTG9jYWwgU2VydmljZTwvaDI+CiAKIDxwPllvdXIgYXBwbGljYXRpb24gbXVzdCBoYXZlIGEgbG9jYWwge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9IHRvIGZhY2lsaXRhdGUgbWVzc2FnaW5nIGJldHdlZW4KLXlvdXIgYXBwbGljYXRpb24gYW5kIEFuZHJvaWQgTWFya2V0LiBBdCBhIG1pbmltdW0sIHRoaXMgc2VydmljZSBtdXN0IGRvIHRoZSBmb2xsb3dpbmc6PC9wPgoreW91ciBhcHBsaWNhdGlvbiBhbmQgR29vZ2xlIFBsYXkuIEF0IGEgbWluaW11bSwgdGhpcyBzZXJ2aWNlIG11c3QgZG8gdGhlIGZvbGxvd2luZzo8L3A+CiAKIDx1bD4KICAgPGxpPkJpbmQgdG8gdGhlIDxjb2RlPk1hcmtldEJpbGxpbmdTZXJ2aWNlPC9jb2RlPi4KLSAgPGxpPlNlbmQgYmlsbGluZyByZXF1ZXN0cyAoYXMgSVBDIG1ldGhvZCBjYWxscykgdG8gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLiBUaGUgZml2ZSB0eXBlcworICA8bGk+U2VuZCBiaWxsaW5nIHJlcXVlc3RzIChhcyBJUEMgbWV0aG9kIGNhbGxzKSB0byB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24uIFRoZSBmaXZlIHR5cGVzCiAgIG9mIGJpbGxpbmcgcmVxdWVzdHMgaW5jbHVkZToKICAgICA8dWw+CiAgICAgICA8bGk+PGNvZGU+Q0hFQ0tfQklMTElOR19TVVBQT1JURUQ8L2NvZGU+IHJlcXVlc3RzPC9saT4KQEAgLTQ3NCw3ICs0NzQsNyBAQAoga2V5IGNhbiBoYXZlIHRoZSBmb2xsb3dpbmcgZml2ZSB2YWx1ZXM6PC9wPgogCiA8dWw+Ci0gIDxsaT48Y29kZT5DSEVDS19CSUxMSU5HX1NVUFBPUlRFRDwvY29kZT4mbWRhc2g7dmVyaWZpZXMgdGhhdCB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24KKyAgPGxpPjxjb2RlPkNIRUNLX0JJTExJTkdfU1VQUE9SVEVEPC9jb2RlPiZtZGFzaDt2ZXJpZmllcyB0aGF0IHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbgogICBzdXBwb3J0cyBpbi1hcHAgYmlsbGluZy48L2xpPgogICA8bGk+PGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4mbWRhc2g7c2VuZHMgYSBwdXJjaGFzZSByZXF1ZXN0IGZvciBhbiBpbi1hcHAgaXRlbS48L2xpPgogICA8bGk+PGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPiZtZGFzaDtyZXRyaWV2ZXMgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gZm9yIGEgcHVyY2hhc2UKQEAgLTUxMCw3ICs1MTAsNyBAQAogCiA8aDQ+VmVyaWZ5aW5nIHRoYXQgaW4tYXBwIGJpbGxpbmcgaXMgc3VwcG9ydGVkIChDSEVDS19CSUxMSU5HX1NVUFBQT1JURUQpPC9oND4KIAotPHA+VGhlIGZvbGxvd2luZyBjb2RlIHNhbXBsZSBzaG93cyBob3cgdG8gdmVyaWZ5IHdoZXRoZXIgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHN1cHBvcnRzCis8cD5UaGUgZm9sbG93aW5nIGNvZGUgc2FtcGxlIHNob3dzIGhvdyB0byB2ZXJpZnkgd2hldGhlciB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc3VwcG9ydHMKIGluLWFwcCBiaWxsaW5nLiBJbiB0aGUgc2FtcGxlLCA8Y29kZT5tU2VydmljZTwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2YgdGhlCiA8Y29kZT5NYXJrZXRCaWxsaW5nU2VydmljZTwvY29kZT4gaW50ZXJmYWNlLjwvcD4KIApAQCAtNTMzLDcgKzUzMyw3IEBACiAgIDxsaT48Y29kZT5SRVNVTFRfQklMTElOR19VTkFWQUlMQUJMRTwvY29kZT4mbWRhc2g7aW4tYXBwIGJpbGxpbmcgaXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBBUEkKICAgdmVyc2lvbiB5b3Ugc3BlY2lmaWVkIGlzIG5vdCByZWNvZ25pemVkIG9yIHRoZSB1c2VyIGlzIG5vdCBlbGlnaWJsZSB0byBtYWtlIGluLWFwcCBwdXJjaGFzZXMgKGZvcgogICBleGFtcGxlLCB0aGUgdXNlciByZXNpZGVzIGluIGEgY291bnRyeSB0aGF0IHByb2hpYml0cyBpbi1hcHAgcHVyY2hhc2VzKS48L2xpPgotICA8bGk+PGNvZGU+UkVTVUxUX0VSUk9SPC9jb2RlPiZtZGFzaDt0aGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyB3aXRoIHRoZSBBbmRyb2lkIE1hcmtldAorICA8bGk+PGNvZGU+UkVTVUxUX0VSUk9SPC9jb2RlPiZtZGFzaDt0aGVyZSB3YXMgYW4gZXJyb3IgY29ubmVjdGluZyB3aXRoIHRoZSBHb29nbGUgUGxheQogICBhcHBsaWNhdGlvbi48L2xpPgogICA8bGk+PGNvZGU+UkVTVUxUX0RFVkVMT1BFUl9FUlJPUjwvY29kZT4mbWRhc2g7dGhlIGFwcGxpY2F0aW9uIGlzIHRyeWluZyB0byBtYWtlIGFuIGluLWFwcCBiaWxsaW5nCiAgIHJlcXVlc3QgYnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgbm90IGRlY2xhcmVkIHRoZSA8Y29kZT5jb20uYW5kcm9pZC52ZW5kaW5nLkJJTExJTkc8L2NvZGU+CkBAIC01NDYsMTAgKzU0NiwxMCBAQAogCiA8cD5XZSByZWNvbW1lbmQgdGhhdCB5b3UgaW52b2tlIHRoZSA8Y29kZT5DSEVDS19CSUxMSU5HX1NVUFBPUlRFRDwvY29kZT4gcmVxdWVzdCB3aXRoaW4gYQogPGNvZGU+UmVtb3RlRXhjZXB0aW9uPC9jb2RlPiBibG9jay4gV2hlbiB5b3VyIGNvZGUgdGhyb3dzIGEgPGNvZGU+UmVtb3RlRXhjZXB0aW9uPC9jb2RlPiBpdAotaW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBtZXRob2QgY2FsbCBmYWlsZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIGlzIG91dAoraW5kaWNhdGVzIHRoYXQgdGhlIHJlbW90ZSBtZXRob2QgY2FsbCBmYWlsZWQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIGlzIG91dAogb2YgZGF0ZSBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZC4gSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHByb3ZpZGUgdXNlcnMgd2l0aCBhbiBlcnJvciBtZXNzYWdlIHRoYXQKIGNvbnRhaW5zIGEgbGluayB0byB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xOTA4NjAiPlVwZGF0aW5nIEFuZHJvaWQgTWFya2V0PC9hPgoraHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTE5MDg2MCI+VXBkYXRpbmcgR29vZ2xlIFBsYXk8L2E+CiBIZWxwIHRvcGljLjwvcD4KIAogPHA+VGhlIHNhbXBsZSBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgaG93IHlvdSBjYW4gaGFuZGxlIHRoaXMgZXJyb3IgY29uZGl0aW9uIChzZWUKQEAgLTU2MSwxNiArNTYxLDE2IEBACiAKIDx1bD4KICAgPGxpPlNlbmQgdGhlIDxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+IHJlcXVlc3QuPC9saT4KLSAgPGxpPkxhdW5jaCB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnR9IHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQKKyAgPGxpPkxhdW5jaCB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnR9IHRoYXQgaXMgcmV0dXJuZWQgZnJvbSB0aGUgR29vZ2xlIFBsYXkKICAgYXBwbGljYXRpb24uPC9saT4KLSAgPGxpPkhhbmRsZSB0aGUgYnJvYWRjYXN0IGludGVudHMgdGhhdCBhcmUgc2VudCBieSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uPC9saT4KKyAgPGxpPkhhbmRsZSB0aGUgYnJvYWRjYXN0IGludGVudHMgdGhhdCBhcmUgc2VudCBieSB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24uPC9saT4KIDwvdWw+CiAKIDxoNT5NYWtpbmcgdGhlIHJlcXVlc3Q8L2g1PgogCiA8cD5Zb3UgbXVzdCBzcGVjaWZ5IGZvdXIga2V5cyBpbiB0aGUgcmVxdWVzdCB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9LiBUaGUgZm9sbG93aW5nIGNvZGUgc2FtcGxlCiBzaG93cyBob3cgdG8gc2V0IHRoZXNlIGtleXMgYW5kIG1ha2UgYSBwdXJjaGFzZSByZXF1ZXN0IGZvciBhIHNpbmdsZSBpbi1hcHAgaXRlbS4gSW4gdGhlIHNhbXBsZSwKLTxjb2RlPm1Qcm9kdWN0SWQ8L2NvZGU+IGlzIHRoZSBBbmRyb2lkIE1hcmtldCBwcm9kdWN0IElEIG9mIGFuIGluLWFwcCBpdGVtICh3aGljaCBpcyBsaXN0ZWQgaW4gdGhlCis8Y29kZT5tUHJvZHVjdElkPC9jb2RlPiBpcyB0aGUgR29vZ2xlIFBsYXkgcHJvZHVjdCBJRCBvZiBhbiBpbi1hcHAgaXRlbSAod2hpY2ggaXMgbGlzdGVkIGluIHRoZQogYXBwbGljYXRpb24ncyA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19hZG1pbi5odG1sI2JpbGxpbmctbGlzdC1zZXR1cCI+cHJvZHVjdAogbGlzdDwvYT4pLCBhbmQgPGNvZGU+bVNlcnZpY2U8L2NvZGU+IGlzIGFuIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5NYXJrZXRCaWxsaW5nU2VydmljZTwvY29kZT4KIGludGVyZmFjZS48L3A+CkBAIC02NDQsMjUgKzY0NCwyNSBAQAogY29udGV4dCBhbmQgbm90IGFuIGFwcGxpY2F0aW9uIGNvbnRleHQuIEFsc28sIHlvdSBjYW5ub3QgdXNlIHRoZSA8Y29kZT5zaW5nbGVUb3A8L2NvZGU+IDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuaHRtbCNsbW9kZSI+bGF1bmNoIG1vZGU8L2E+IHRvIGxhdW5jaCB0aGUKIHBlbmRpbmcgaW50ZW50LiBJZiB5b3UgZG8gZWl0aGVyIG9mIHRoZXNlLCB0aGUgQW5kcm9pZCBzeXN0ZW0gd2lsbCBub3QgYXR0YWNoIHRoZSBwZW5kaW5nIGludGVudCB0bwoteW91ciBhcHBsaWNhdGlvbiBwcm9jZXNzLiBJbnN0ZWFkLCBpdCB3aWxsIGJyaW5nIEFuZHJvaWQgTWFya2V0IHRvIHRoZSBmb3JlZ3JvdW5kLCBkaXNydXB0aW5nIHlvdXIKK3lvdXIgYXBwbGljYXRpb24gcHJvY2Vzcy4gSW5zdGVhZCwgaXQgd2lsbCBicmluZyBHb29nbGUgUGxheSB0byB0aGUgZm9yZWdyb3VuZCwgZGlzcnVwdGluZyB5b3VyCiBhcHBsaWNhdGlvbi48L3A+CiAKIDxoNT5IYW5kbGluZyBicm9hZGNhc3QgaW50ZW50czwvaDU+CiAKIDxwPkEgPGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4gcmVxdWVzdCBhbHNvIHRyaWdnZXJzIHR3byBhc3luY2hyb25vdXMgcmVzcG9uc2VzIChicm9hZGNhc3QKLWludGVudHMpLiBGaXJzdCwgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHNlbmRzIGEgPGNvZGU+UkVTUE9OU0VfQ09ERTwvY29kZT4gYnJvYWRjYXN0IGludGVudCwKK2ludGVudHMpLiBGaXJzdCwgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHNlbmRzIGEgPGNvZGU+UkVTUE9OU0VfQ09ERTwvY29kZT4gYnJvYWRjYXN0IGludGVudCwKIHdoaWNoIHByb3ZpZGVzIGVycm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0LiBJZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBnZW5lcmF0ZSBhbgogZXJyb3IsIHRoZSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50IHJldHVybnMgPGNvZGU+UkVTVUxUX09LPC9jb2RlPiwgd2hpY2gKIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgc2VudC4gKFRvIGJlIGNsZWFyLCBhIDxjb2RlPlJFU1VMVF9PSzwvY29kZT4gcmVzcG9uc2UKIGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlIHJlcXVlc3RlZCBwdXJjaGFzZSB3YXMgc3VjY2Vzc2Z1bDsgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3Qgd2FzIHNlbnQKLXN1Y2Nlc3NmdWxseSB0byBBbmRyb2lkIE1hcmtldC4pPC9wPgorc3VjY2Vzc2Z1bGx5IHRvIEdvb2dsZSBQbGF5Lik8L3A+CiAKIDxwPk5leHQsIHdoZW4gdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiBjaGFuZ2VzIHN0YXRlIChmb3IgZXhhbXBsZSwgdGhlIHB1cmNoYXNlIGlzIHN1Y2Nlc3NmdWxseQotY2hhcmdlZCB0byBhIGNyZWRpdCBjYXJkIG9yIHRoZSB1c2VyIGNhbmNlbHMgdGhlIHB1cmNoYXNlKSwgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHNlbmRzIGFuCitjaGFyZ2VkIHRvIGEgY3JlZGl0IGNhcmQgb3IgdGhlIHVzZXIgY2FuY2VscyB0aGUgcHVyY2hhc2UpLCB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc2VuZHMgYW4KIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQuIFRoaXMgbWVzc2FnZSBjb250YWlucyBhIG5vdGlmaWNhdGlvbiBJRCwgd2hpY2ggeW91IGNhbgogdXNlIHRvIHJldHJpZXZlIHRoZSB0cmFuc2FjdGlvbiBkZXRhaWxzIGZvciB0aGUgPGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4gcmVxdWVzdC48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBhbHNvIHNlbmRzCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gYWxzbyBzZW5kcwogYW4gPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gZm9yIHJlZnVuZHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX292ZXJ2aWV3Lmh0bWwjYmlsbGluZy1hY3Rpb24tbm90aWZ5Ij5IYW5kbGluZwogSU5fQVBQX05PVElGWSBtZXNzYWdlczwvYT4uPC9wPgpAQCAtNjcwLDcgKzY3MCw3IEBACiA8cD5CZWNhdXNlIHRoZSBwdXJjaGFzZSBwcm9jZXNzIGlzIG5vdCBpbnN0YW50YW5lb3VzIGFuZCBjYW4gdGFrZSBzZXZlcmFsIHNlY29uZHMgKG9yIG1vcmUpLCB5b3UKIG11c3QgYXNzdW1lIHRoYXQgYSBwdXJjaGFzZSByZXF1ZXN0IGlzIHBlbmRpbmcgZnJvbSB0aGUgdGltZSB5b3UgcmVjZWl2ZSBhIDxjb2RlPlJFU1VMVF9PSzwvY29kZT4KIG1lc3NhZ2UgdW50aWwgeW91IHJlY2VpdmUgYW4gPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLiBXaGlsZSB0aGUKLXRyYW5zYWN0aW9uIGlzIHBlbmRpbmcsIHRoZSBBbmRyb2lkIE1hcmtldCBjaGVja291dCBVSSBkaXNwbGF5cyBhbiAiQXV0aG9yaXppbmcgcHVyY2hhc2UuLi4iCit0cmFuc2FjdGlvbiBpcyBwZW5kaW5nLCB0aGUgR29vZ2xlIFBsYXkgY2hlY2tvdXQgVUkgZGlzcGxheXMgYW4gIkF1dGhvcml6aW5nIHB1cmNoYXNlLi4uIgogbm90aWZpY2F0aW9uOyBob3dldmVyLCB0aGlzIG5vdGlmaWNhdGlvbiBpcyBkaXNtaXNzZWQgYWZ0ZXIgNjAgc2Vjb25kcyBhbmQgeW91IHNob3VsZCBub3QgcmVseSBvbgogdGhpcyBub3RpZmljYXRpb24gYXMgeW91ciBwcmltYXJ5IG1lYW5zIG9mIGNvbnZleWluZyB0cmFuc2FjdGlvbiBzdGF0dXMgdG8gdXNlcnMuIEluc3RlYWQsIHdlCiByZWNvbW1lbmQgdGhhdCB5b3UgZG8gdGhlIGZvbGxvd2luZzo8L3A+CkBAIC02OTMsMTIgKzY5MywxMiBAQAogYmUgc3VyZSB0aGF0IHlvdXIgcGVuZGluZyBzdGF0dXMgVUkgZG9lcyBub3QgYmxvY2sgeW91ciBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgYXZvaWQKIHVzaW5nIGEgaG92ZXJpbmcgcHJvZ3Jlc3Mgd2hlZWwgdG8gY29udmV5IHRoZSBzdGF0dXMgb2YgYSBwZW5kaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgYSBwZW5kaW5nCiB0cmFuc2FjdGlvbiBjb3VsZCBsYXN0IGEgbG9uZyB0aW1lLCBwYXJ0aWN1bGFybHkgaWYgYSBkZXZpY2UgbG9zZXMgbmV0d29yayBjb25uZWN0aXZpdHkgYW5kIGNhbm5vdAotcmVjZWl2ZSB0cmFuc2FjdGlvbiB1cGRhdGVzIGZyb20gQW5kcm9pZCBNYXJrZXQuPC9wPgorcmVjZWl2ZSB0cmFuc2FjdGlvbiB1cGRhdGVzIGZyb20gR29vZ2xlIFBsYXkuPC9wPgogCiA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+IElmIGEgdXNlciBwdXJjaGFzZXMgYSBtYW5hZ2VkIGl0ZW0sIHlvdSBtdXN0IHByZXZlbnQKIHRoZSB1c2VyIGZyb20gcHVyY2hhc2luZyB0aGUgaXRlbSBhZ2FpbiB3aGlsZSB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gaXMgcGVuZGluZy4gSWYgYSB1c2VyCi1hdHRlbXB0cyB0byBwdXJjaGFzZSBhIG1hbmFnZWQgaXRlbSB0d2ljZSwgYW5kIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBpcyBzdGlsbCBwZW5kaW5nLCBBbmRyb2lkCi1NYXJrZXQgd2lsbCBkaXNwbGF5IGFuIGVycm9yIHRvIHRoZSB1c2VyOyBob3dldmVyLCBBbmRyb2lkIE1hcmtldCB3aWxsIG5vdCBzZW5kIGFuIGVycm9yIHRvIHlvdXIKK2F0dGVtcHRzIHRvIHB1cmNoYXNlIGEgbWFuYWdlZCBpdGVtIHR3aWNlLCBhbmQgdGhlIGZpcnN0IHRyYW5zYWN0aW9uIGlzIHN0aWxsIHBlbmRpbmcsIEdvb2dsZQorUGxheSB3aWxsIGRpc3BsYXkgYW4gZXJyb3IgdG8gdGhlIHVzZXI7IGhvd2V2ZXIsIEdvb2dsZSBQbGF5IHdpbGwgbm90IHNlbmQgYW4gZXJyb3IgdG8geW91cgogYXBwbGljYXRpb24gbm90aWZ5aW5nIHlvdSB0aGF0IHRoZSBzZWNvbmQgcHVyY2hhc2UgcmVxdWVzdCB3YXMgY2FuY2VsZWQuIFRoaXMgbWlnaHQgY2F1c2UgeW91cgogYXBwbGljYXRpb24gdG8gZ2V0IHN0dWNrIGluIGEgcGVuZGluZyBzdGF0ZSB3aGlsZSBpdCB3YWl0cyBmb3IgYW4gPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gbWVzc2FnZQogZm9yIHRoZSBzZWNvbmQgcHVyY2hhc2UgcmVxdWVzdC48L3A+CkBAIC03MzAsNyArNzMwLDcgQEAKIDxjb2RlPkFQSV9WRVJTSU9OPC9jb2RlPiwgYW5kIDxjb2RlPlBBQ0tBR0VfTkFNRTwvY29kZT4uIFRoZSBhZGRpdGlvbmFsIGtleXMgYXJlIHRoZW4gYWRkZWQgdG8gdGhlCiBidW5kbGUgcHJpb3IgdG8gaW52b2tpbmcgdGhlIDxjb2RlPnNlbmRCaWxsaW5nUmVxdWVzdCgpPC9jb2RlPiBtZXRob2QuIFRoZQogPGNvZGU+UkVRVUVTVF9OT05DRTwvY29kZT4ga2V5IGNvbnRhaW5zIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIG5vbmNlIChudW1iZXIgdXNlZCBvbmNlKSB0aGF0IHlvdQotbXVzdCBnZW5lcmF0ZS4gVGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHJldHVybnMgdGhpcyBub25jZSB3aXRoIHRoZQorbXVzdCBnZW5lcmF0ZS4gVGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHJldHVybnMgdGhpcyBub25jZSB3aXRoIHRoZQogPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gYnJvYWRjYXN0IGludGVudCBzbyB5b3UgY2FuIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZQogdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24uIFRoZSA8Y29kZT5OT1RJRllfSURTPC9jb2RlPiBrZXkgY29udGFpbnMgYW4gYXJyYXkgb2Ygbm90aWZpY2F0aW9uIElEcywKIHdoaWNoIHlvdSByZWNlaXZlZCBpbiB0aGUgPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gYnJvYWRjYXN0IGludGVudC48L3A+CkBAIC03NDEsOSArNzQxLDkgQEAKIHJlcXVlc3QgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QuPC9wPgogCiA8cD5BIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gcmVxdWVzdCBhbHNvIHRyaWdnZXJzIHR3byBhc3luY2hyb25vdXMgcmVzcG9uc2VzCi0oYnJvYWRjYXN0IGludGVudHMpLiBGaXJzdCwgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHNlbmRzIGEgPGNvZGU+UkVTUE9OU0VfQ09ERTwvY29kZT4KKyhicm9hZGNhc3QgaW50ZW50cykuIEZpcnN0LCB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPgogYnJvYWRjYXN0IGludGVudCwgd2hpY2ggcHJvdmlkZXMgc3RhdHVzIGFuZCBlcnJvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdC4gTmV4dCwgaWYgdGhlCi1yZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLCB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5QVVJDSEFTRV9TVEFURV9DSEFOR0VEPC9jb2RlPgorcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCwgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHNlbmRzIGEgPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4KIGJyb2FkY2FzdCBpbnRlbnQuIFRoaXMgbWVzc2FnZSBjb250YWlucyBkZXRhaWxlZCB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbi4gVGhlIHRyYW5zYWN0aW9uCiBpbmZvcm1hdGlvbiBpcyBjb250YWluZWQgaW4gYSBzaWduZWQgSlNPTiBzdHJpbmcgKHVuZW5jcnlwdGVkKS4gVGhlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIHNpZ25hdHVyZQogc28geW91IGNhbiB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUgc2lnbmVkIHN0cmluZy48L3A+CkBAIC03ODMsOCArNzgzLDggQEAKIDxjb2RlPlJFU1BPTlNFX0NPREU8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQuIFRoaXMgYnJvYWRjYXN0IGludGVudCBwcm92aWRlcyBzdGF0dXMgYW5kIGVycm9yCiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdC48L3A+CiAKLTxwPllvdSBtdXN0IHNlbmQgYSBjb25maXJtYXRpb24gd2hlbiB5b3UgcmVjZWl2ZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIEFuZHJvaWQgTWFya2V0LiBJZiB5b3UKLWRvbid0IHNlbmQgYSBjb25maXJtYXRpb24gbWVzc2FnZSwgQW5kcm9pZCBNYXJrZXQgd2lsbCBjb250aW51ZSBzZW5kaW5nCis8cD5Zb3UgbXVzdCBzZW5kIGEgY29uZmlybWF0aW9uIHdoZW4geW91IHJlY2VpdmUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBHb29nbGUgUGxheS4gSWYgeW91Citkb24ndCBzZW5kIGEgY29uZmlybWF0aW9uIG1lc3NhZ2UsIEdvb2dsZSBQbGF5IHdpbGwgY29udGludWUgc2VuZGluZwogPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gbWVzc2FnZXMgZm9yIHRoZSB0cmFuc2FjdGlvbnMgeW91IGhhdmUgbm90IGNvbmZpcm1lZC4gQWxzbywKIHlvdXIgYXBwbGljYXRpb24gbXVzdCBiZSBhYmxlIHRvIGhhbmRsZSA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBtZXNzYWdlcyB0aGF0IGNvbnRhaW4gbXVsdGlwbGUKIG9yZGVycy48L3A+CkBAIC03OTIsNyArNzkyLDcgQEAKIDxwPkluIGFkZGl0aW9uLCBhcyBhIGJlc3QgcHJhY3RpY2UsIHlvdSBzaG91bGQgbm90IHNlbmQgYSA8Y29kZT5DT05GSVJNX05PVElGSUNBVElPTlM8L2NvZGU+IHJlcXVlc3QKIGZvciBhIHB1cmNoYXNlZCBpdGVtIHVudGlsIHlvdSBoYXZlIGRlbGl2ZXJlZCB0aGUgaXRlbSB0byB0aGUgdXNlci4gVGhpcyB3YXksIGlmIHlvdXIgYXBwbGljYXRpb24KIGNyYXNoZXMgb3Igc29tZXRoaW5nIGVsc2UgcHJldmVudHMgeW91ciBhcHBsaWNhdGlvbiBmcm9tIGRlbGl2ZXJpbmcgdGhlIHByb2R1Y3QsIHlvdXIgYXBwbGljYXRpb24KLXdpbGwgc3RpbGwgcmVjZWl2ZSBhbiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50IGZyb20gQW5kcm9pZCBNYXJrZXQgaW5kaWNhdGluZword2lsbCBzdGlsbCByZWNlaXZlIGFuIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQgZnJvbSBHb29nbGUgUGxheSBpbmRpY2F0aW5nCiB0aGF0IHlvdSBuZWVkIHRvIGRlbGl2ZXIgdGhlIHByb2R1Y3QuPC9wPgogCiA8aDQ+UmVzdG9yaW5nIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIChSRVNUT1JFX1RSQU5TQUNUSU9OUyk8L2g0PgpAQCAtODE3LDcgKzgxNyw3IEBACiA8Y29kZT5BUElfVkVSU0lPTjwvY29kZT4sIGFuZCA8Y29kZT5QQUNLQUdFX05BTUU8L2NvZGU+LiBUaGUgYWRkaXRpb25hbCA8Y29kZT5SRVFVRVNUX05PTkNFPC9jb2RlPgoga2V5IGlzIHRoZW4gYWRkZWQgdG8gdGhlIGJ1bmRsZSBwcmlvciB0byBpbnZva2luZyB0aGUgPGNvZGU+c2VuZEJpbGxpbmdSZXF1ZXN0KCk8L2NvZGU+IG1ldGhvZC4gVGhlCiA8Y29kZT5SRVFVRVNUX05PTkNFPC9jb2RlPiBrZXkgY29udGFpbnMgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbm9uY2UgKG51bWJlciB1c2VkIG9uY2UpIHRoYXQgeW91Ci1tdXN0IGdlbmVyYXRlLiBUaGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gcmV0dXJucyB0aGlzIG5vbmNlIHdpdGggdGhlIHRyYW5zYWN0aW9ucyBpbmZvcm1hdGlvbgorbXVzdCBnZW5lcmF0ZS4gVGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHJldHVybnMgdGhpcyBub25jZSB3aXRoIHRoZSB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24KIGNvbnRhaW5lZCBpbiB0aGUgPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gYnJvYWRjYXN0IGludGVudCBzbyB5b3UgY2FuIHZlcmlmeSB0aGUKIGludGVncml0eSBvZiB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24uPC9wPgogCkBAIC04MjcsOSArODI3LDkgQEAKIHJlcXVlc3QgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QuPC9wPgogCiA8cD5BIDxjb2RlPlJFU1RPUkVfVFJBTlNBQ1RJT05TPC9jb2RlPiByZXF1ZXN0IGFsc28gdHJpZ2dlcnMgdHdvIGFzeW5jaHJvbm91cyByZXNwb25zZXMgKGJyb2FkY2FzdAotaW50ZW50cykuIEZpcnN0LCB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LAoraW50ZW50cykuIEZpcnN0LCB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LAogd2hpY2ggcHJvdmlkZXMgc3RhdHVzIGFuZCBlcnJvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWVzdC4gTmV4dCwgaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWwsCi10aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5QVVJDSEFTRV9TVEFURV9DSEFOR0VEPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LiBUaGlzCit0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5QVVJDSEFTRV9TVEFURV9DSEFOR0VEPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LiBUaGlzCiBtZXNzYWdlIGNvbnRhaW5zIHRoZSBkZXRhaWxlZCB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbi4gVGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiBhCiBzaWduZWQgSlNPTiBzdHJpbmcgKHVuZW5jcnlwdGVkKS4gVGhlIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIHNpZ25hdHVyZSBzbyB5b3UgY2FuIHZlcmlmeSB0aGUgaW50ZWdyaXR5CiBvZiB0aGUgc2lnbmVkIHN0cmluZy48L3A+CkBAIC04NDIsNyArODQyLDcgQEAKIAogPHA+WW91IG1heSBhbHNvIHdhbnQgeW91ciB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZX0gdG8gcmVjZWl2ZSBpbnRlbnQgbWVzc2FnZXMgZnJvbSB5b3VyIHtAbGluawogYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyfS4gWW91IGNhbiB1c2UgdGhlc2UgaW50ZW50IG1lc3NhZ2VzIHRvIGNvbnZleSB0aGUgaW5mb3JtYXRpb24gdGhhdAotd2FzIHNlbnQgYXN5bmNocm9ub3VzbHkgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gdG8geW91ciB7QGxpbmsKK3dhcyBzZW50IGFzeW5jaHJvbm91c2x5IGZyb20gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHRvIHlvdXIge0BsaW5rCiBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9LiBUbyBzZWUgYW4gZXhhbXBsZSBvZiBob3cgeW91IGNhbiBzZW5kIGFuZCByZWNlaXZlIHRoZXNlIGludGVudAogbWVzc2FnZXMsIHNlZSB0aGUgPGNvZGU+QmlsbGluZ1JlY2VpdmVyLmphdmE8L2NvZGU+IGFuZCA8Y29kZT5CaWxsaW5nU2VydmljZS5qYXZhPC9jb2RlPiBmaWxlcyBpbgogdGhlIHNhbXBsZSBhcHBsaWNhdGlvbi4gWW91IGNhbiB1c2UgdGhlc2Ugc2FtcGxlcyBhcyBhIGJhc2lzIGZvciB5b3VyIG93biBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciwKQEAgLTg1MSwxNiArODUxLDE2IEBACiAKIDxoMiBpZD0iYmlsbGluZy1icm9hZGNhc3QtcmVjZWl2ZXIiPkNyZWF0aW5nIGEgQnJvYWRjYXN0UmVjZWl2ZXI8L2gyPgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gdXNlcyBicm9hZGNhc3QgaW50ZW50cyB0byBzZW5kIGFzeW5jaHJvbm91cyBiaWxsaW5nIHJlc3BvbnNlcyB0bworPHA+VGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHVzZXMgYnJvYWRjYXN0IGludGVudHMgdG8gc2VuZCBhc3luY2hyb25vdXMgYmlsbGluZyByZXNwb25zZXMgdG8KIHlvdXIgYXBwbGljYXRpb24uIFRvIHJlY2VpdmUgdGhlc2UgaW50ZW50IG1lc3NhZ2VzLCB5b3UgbmVlZCB0byBjcmVhdGUgYSB7QGxpbmsKIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn0gdGhhdCBjYW4gaGFuZGxlIHRoZSBmb2xsb3dpbmcgaW50ZW50czo8L3A+CiAKIDx1bD4KICAgPGxpPmNvbS5hbmRyb2lkLnZlbmRpbmcuYmlsbGluZy5SRVNQT05TRV9DT0RFCi0gIDxwPlRoaXMgYnJvYWRjYXN0IGludGVudCBjb250YWlucyBhbiBBbmRyb2lkIE1hcmtldCByZXNwb25zZSBjb2RlLCBhbmQgaXMgc2VudCBhZnRlciB5b3UgbWFrZSBhbgorICA8cD5UaGlzIGJyb2FkY2FzdCBpbnRlbnQgY29udGFpbnMgYSBHb29nbGUgUGxheSByZXNwb25zZSBjb2RlLCBhbmQgaXMgc2VudCBhZnRlciB5b3UgbWFrZSBhbgogICBpbi1hcHAgYmlsbGluZyByZXF1ZXN0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzcG9uc2UgY29kZXMgdGhhdCBhcmUgc2VudCB3aXRoIHRoaXMKICAgcmVzcG9uc2UsIHNlZSA8YQotICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuaHRtbCNiaWxsaW5nLWNvZGVzIj5BbmRyb2lkIE1hcmtldCBSZXNwb25zZQorICBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuaHRtbCNiaWxsaW5nLWNvZGVzIj5Hb29nbGUgUGxheSBSZXNwb25zZQogICBDb2RlcyBmb3IgSW4tYXBwIEJpbGxpbmc8L2E+LjwvcD4KICAgPC9saT4KICAgPGxpPmNvbS5hbmRyb2lkLnZlbmRpbmcuYmlsbGluZy5JTl9BUFBfTk9USUZZCkBAIC04OTUsMTggKzg5NSwxOCBAQAogICA8dGQ+PGNvZGU+Y29tLmFuZHJvaWQudmVuZGluZy5iaWxsaW5nLlJFU1BPTlNFX0NPREU8L2NvZGU+PC90ZD4KICAgPHRkPjxjb2RlPnJlcXVlc3RfaWQ8L2NvZGU+PC90ZD4KICAgPHRkPkEgPGNvZGU+bG9uZzwvY29kZT4gcmVwcmVzZW50aW5nIGEgcmVxdWVzdCBJRC4gQSByZXF1ZXN0IElEIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBiaWxsaW5nCi0gIHJlcXVlc3QgYW5kIGlzIHJldHVybmVkIGJ5IEFuZHJvaWQgTWFya2V0IGF0IHRoZSB0aW1lIGEgcmVxdWVzdCBpcyBtYWRlLjwvdGQ+CisgIHJlcXVlc3QgYW5kIGlzIHJldHVybmVkIGJ5IEdvb2dsZSBQbGF5IGF0IHRoZSB0aW1lIGEgcmVxdWVzdCBpcyBtYWRlLjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+Y29tLmFuZHJvaWQudmVuZGluZy5iaWxsaW5nLlJFU1BPTlNFX0NPREU8L2NvZGU+PC90ZD4KICAgPHRkPjxjb2RlPnJlc3BvbnNlX2NvZGU8L2NvZGU+PC90ZD4KLSAgPHRkPkFuIDxjb2RlPmludDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBhY3R1YWwgQW5kcm9pZCBNYXJrZXQgc2VydmVyIHJlc3BvbnNlIGNvZGUuPC90ZD4KKyAgPHRkPkFuIDxjb2RlPmludDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBhY3R1YWwgR29vZ2xlIFBsYXkgc2VydmVyIHJlc3BvbnNlIGNvZGUuPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5jb20uYW5kcm9pZC52ZW5kaW5nLmJpbGxpbmcuSU5fQVBQX05PVElGWTwvY29kZT48L3RkPgogICA8dGQ+PGNvZGU+bm90aWZpY2F0aW9uX2lkPC9jb2RlPjwvdGQ+CiAgIDx0ZD5BIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBub3RpZmljYXRpb24gSUQgZm9yIGEgZ2l2ZW4gcHVyY2hhc2Ugc3RhdGUgY2hhbmdlLgotICBBbmRyb2lkIE1hcmtldCBub3RpZmllcyB5b3Ugd2hlbiB0aGVyZSBpcyBhIHB1cmNoYXNlIHN0YXRlIGNoYW5nZSBhbmQgdGhlIG5vdGlmaWNhdGlvbiBpbmNsdWRlcyBhCisgIEdvb2dsZSBQbGF5IG5vdGlmaWVzIHlvdSB3aGVuIHRoZXJlIGlzIGEgcHVyY2hhc2Ugc3RhdGUgY2hhbmdlIGFuZCB0aGUgbm90aWZpY2F0aW9uIGluY2x1ZGVzIGEKICAgdW5pcXVlIG5vdGlmaWNhdGlvbiBJRC4gVG8gZ2V0IHRoZSBkZXRhaWxzIG9mIHRoZSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UsIHlvdSBzZW5kIHRoZSBub3RpZmljYXRpb24KICAgSUQgd2l0aCB0aGUgPGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPiByZXF1ZXN0LjwvdGQ+CiA8L3RyPgpAQCAtOTMzLDE2ICs5MzMsMTYgQEAKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkJpbGxpbmdSZWNlaXZlciI7CiAKLSAgLy8gSW50ZW50IGFjdGlvbnMgdGhhdCB3ZSByZWNlaXZlIGluIHRoZSBCaWxsaW5nUmVjZWl2ZXIgZnJvbSBBbmRyb2lkIE1hcmtldC4KLSAgLy8gVGhlc2UgYXJlIGRlZmluZWQgYnkgQW5kcm9pZCBNYXJrZXQgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgorICAvLyBJbnRlbnQgYWN0aW9ucyB0aGF0IHdlIHJlY2VpdmUgaW4gdGhlIEJpbGxpbmdSZWNlaXZlciBmcm9tIEdvb2dsZSBQbGF5LgorICAvLyBUaGVzZSBhcmUgZGVmaW5lZCBieSBHb29nbGUgUGxheSBhbmQgY2Fubm90IGJlIGNoYW5nZWQuCiAgIC8vIFRoZSBzYW1wbGUgYXBwbGljYXRpb24gZGVmaW5lcyB0aGVzZSBpbiB0aGUgQ29uc3RzLmphdmEgZmlsZS4KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX05PVElGWSA9ICJjb20uYW5kcm9pZC52ZW5kaW5nLmJpbGxpbmcuSU5fQVBQX05PVElGWSI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRVNQT05TRV9DT0RFID0gImNvbS5hbmRyb2lkLnZlbmRpbmcuYmlsbGluZy5SRVNQT05TRV9DT0RFIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BVUkNIQVNFX1NUQVRFX0NIQU5HRUQgPQogICAgICJjb20uYW5kcm9pZC52ZW5kaW5nLmJpbGxpbmcuUFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRCI7CiAKLSAgLy8gVGhlIGludGVudCBleHRyYXMgdGhhdCBhcmUgcGFzc2VkIGluIGFuIGludGVudCBmcm9tIEFuZHJvaWQgTWFya2V0LgotICAvLyBUaGVzZSBhcmUgZGVmaW5lZCBieSBBbmRyb2lkIE1hcmtldCBhbmQgY2Fubm90IGJlIGNoYW5nZWQuCisgIC8vIFRoZSBpbnRlbnQgZXh0cmFzIHRoYXQgYXJlIHBhc3NlZCBpbiBhbiBpbnRlbnQgZnJvbSBHb29nbGUgUGxheS4KKyAgLy8gVGhlc2UgYXJlIGRlZmluZWQgYnkgR29vZ2xlIFBsYXkgYW5kIGNhbm5vdCBiZSBjaGFuZ2VkLgogICAvLyBUaGUgc2FtcGxlIGFwcGxpY2F0aW9uIGRlZmluZXMgdGhlc2UgaW4gdGhlIENvbnN0cy5qYXZhIGZpbGUuCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElGSUNBVElPTl9JRCA9ICJub3RpZmljYXRpb25faWQiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkFQUF9TSUdORURfREFUQSA9ICJpbmFwcF9zaWduZWRfZGF0YSI7CkBAIC05NzQsNyArOTc0LDcgQEAKIH0KIDwvcHJlPgogCi08cD5JbiBhZGRpdGlvbiB0byByZWNlaXZpbmcgYnJvYWRjYXN0IGludGVudHMgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24sIHlvdXIge0BsaW5rCis8cD5JbiBhZGRpdGlvbiB0byByZWNlaXZpbmcgYnJvYWRjYXN0IGludGVudHMgZnJvbSB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24sIHlvdXIge0BsaW5rCiBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IG11c3QgaGFuZGxlIHRoZSBpbmZvcm1hdGlvbiBpdCByZWNlaXZlZCBpbiB0aGUgYnJvYWRjYXN0IGludGVudHMuCiBVc3VhbGx5LCB5b3VyIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IGRvZXMgdGhpcyBieSBzZW5kaW5nIHRoZSBpbmZvcm1hdGlvbiB0byBhCiBsb2NhbCBzZXJ2aWNlIChkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbikuIFRoZSA8Y29kZT5CaWxsaW5nUmVjZWl2ZXIuamF2YTwvY29kZT4gZmlsZSBpbiB0aGUKQEAgLTk4NSw4ICs5ODUsOCBAQAogCiA8aDIgaWQ9ImJpbGxpbmctc2lnbmF0dXJlcyI+VmVyaWZ5aW5nIFNpZ25hdHVyZXMgYW5kIE5vbmNlczwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSB1c2VzIHR3byBtZWNoYW5pc21zIHRvIGhlbHAgdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlCi10cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZSBmcm9tIEFuZHJvaWQgTWFya2V0OiBub25jZXMgYW5kIHNpZ25hdHVyZXMuIEEgbm9uY2UgKG51bWJlciB1c2VkCis8cD5Hb29nbGUgUGxheSdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgdXNlcyB0d28gbWVjaGFuaXNtcyB0byBoZWxwIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZQordHJhbnNhY3Rpb24gaW5mb3JtYXRpb24geW91IHJlY2VpdmUgZnJvbSBHb29nbGUgUGxheTogbm9uY2VzIGFuZCBzaWduYXR1cmVzLiBBIG5vbmNlIChudW1iZXIgdXNlZAogb25jZSkgaXMgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgbnVtYmVyIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBnZW5lcmF0ZXMgYW5kIHNlbmRzIHdpdGggZXZlcnkKIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gYW5kIDxjb2RlPlJFU1RPUkVfVFJBTlNBQ1RJT05TPC9jb2RlPiByZXF1ZXN0LiBUaGUgbm9uY2UgaXMKIHJldHVybmVkIHdpdGggdGhlIDxjb2RlPlBVUkNIQVNFX1NUQVRFX0NIQU5HRUQ8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQsIGVuYWJsaW5nIHlvdSB0byB2ZXJpZnkgdGhhdApAQCAtMTAyMywxMiArMTAyMywxMiBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfYmVzdF9wcmFjdGljZXMuaHRtbCI+U2VjdXJpdHkgYW5kIERlc2lnbjwvYT4gYW5kCiBvYmZ1c2NhdGUgeW91ciBjb2RlLjwvcD4KIAotPHA+WW91IHdpbGwgbmVlZCB0byB1c2UgeW91ciBBbmRyb2lkIE1hcmtldCBwdWJsaWMga2V5IHRvIHBlcmZvcm0gdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uIFRoZQotZm9sbG93aW5nIHByb2NlZHVyZSBzaG93cyB5b3UgaG93IHRvIHJldHJpZXZlIEJhc2U2NC1lbmNvZGVkIHB1YmxpYyBrZXkgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQKKzxwPllvdSB3aWxsIG5lZWQgdG8gdXNlIHlvdXIgR29vZ2xlIFBsYXkgcHVibGljIGtleSB0byBwZXJmb3JtIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBUaGUKK2ZvbGxvd2luZyBwcm9jZWR1cmUgc2hvd3MgeW91IGhvdyB0byByZXRyaWV2ZSBCYXNlNjQtZW5jb2RlZCBwdWJsaWMga2V5IGZyb20gdGhlIEdvb2dsZSBQbGF5CiBwdWJsaXNoZXIgc2l0ZS48L3A+CiAKIDxvbD4KLSAgPGxpPkxvZyBpbiB0byB5b3VyIDxhIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+cHVibGlzaGVyIGFjY291bnQ8L2E+LjwvbGk+CisgIDxsaT5Mb2cgaW4gdG8geW91ciA8YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+cHVibGlzaGVyIGFjY291bnQ8L2E+LjwvbGk+CiAgIDxsaT5PbiB0aGUgdXBwZXIgbGVmdCBwYXJ0IG9mIHRoZSBwYWdlLCB1bmRlciB5b3VyIG5hbWUsIGNsaWNrIDxzdHJvbmc+RWRpdCBwcm9maWxlPC9zdHJvbmc+LjwvbGk+CiAgIDxsaT5PbiB0aGUgRWRpdCBQcm9maWxlIHBhZ2UsIHNjcm9sbCBkb3duIHRvIHRoZSBMaWNlbnNpbmcgJmFtcDsgSW4tYXBwIEJpbGxpbmcgcGFuZWwgKHNlZSBmaWd1cmUKICAgMikuPC9saT4KQEAgLTEwODAsOCArMTA4MCw4IEBACiAKIDxoMz5DcmVhdGluZyBhIHVzZXIgaW50ZXJmYWNlIGZvciBzZWxlY3RpbmcgaXRlbXM8L2gzPgogCi08cD5Zb3UgbXVzdCBwcm92aWRlIHVzZXJzIHdpdGggYSBtZWFucyBmb3Igc2VsZWN0aW5nIGl0ZW1zIHRoYXQgdGhleSB3YW50IHRvIHB1cmNoYXNlLiBBbmRyb2lkCi1NYXJrZXQgcHJvdmlkZXMgdGhlIGNoZWNrb3V0IHVzZXIgaW50ZXJmYWNlICh3aGljaCBpcyB3aGVyZSB0aGUgdXNlciBwcm92aWRlcyBhIGZvcm0gb2YgcGF5bWVudCBhbmQKKzxwPllvdSBtdXN0IHByb3ZpZGUgdXNlcnMgd2l0aCBhIG1lYW5zIGZvciBzZWxlY3RpbmcgaXRlbXMgdGhhdCB0aGV5IHdhbnQgdG8gcHVyY2hhc2UuIEdvb2dsZQorUGxheSBwcm92aWRlcyB0aGUgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UgKHdoaWNoIGlzIHdoZXJlIHRoZSB1c2VyIHByb3ZpZGVzIGEgZm9ybSBvZiBwYXltZW50IGFuZAogYXBwcm92ZXMgdGhlIHB1cmNoYXNlKSwgYnV0IHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGEgY29udHJvbCAod2lkZ2V0KSB0aGF0IGludm9rZXMgdGhlCiA8Y29kZT5zZW5kQmlsbGluZ1JlcXVlc3QoKTwvY29kZT4gbWV0aG9kIHdoZW4gYSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmb3IgcHVyY2hhc2UuPC9wPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19vdmVydmlldy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX292ZXJ2aWV3LmpkCmluZGV4IDhmOWZkNGMuLmI1OTM4MTEgMTAwNzU1Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX292ZXJ2aWV3LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX292ZXJ2aWV3LmpkCkBAIC0zOCwyNCArMzgsMjQgQEAKIDwvZGl2PgogPC9kaXY+CiAKLTxwPkFuZHJvaWQgTWFya2V0IEluLWFwcCBCaWxsaW5nIGlzIGFuIEFuZHJvaWQgTWFya2V0IHNlcnZpY2UgdGhhdCBwcm92aWRlcyBjaGVja291dCBwcm9jZXNzaW5nIGZvcgorPHA+SW4tYXBwIEJpbGxpbmcgaXMgYSBHb29nbGUgUGxheSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgY2hlY2tvdXQgcHJvY2Vzc2luZyBmb3IKIGluLWFwcCBwdXJjaGFzZXMuIFRvIHVzZSB0aGUgc2VydmljZSwgeW91ciBhcHBsaWNhdGlvbiBzZW5kcyBhIGJpbGxpbmcgcmVxdWVzdCBmb3IgYSBzcGVjaWZpYyBpbi1hcHAKIHByb2R1Y3QuIFRoZSBzZXJ2aWNlIHRoZW4gaGFuZGxlcyBhbGwgb2YgdGhlIGNoZWNrb3V0IGRldGFpbHMgZm9yIHRoZSB0cmFuc2FjdGlvbiwgaW5jbHVkaW5nCiByZXF1ZXN0aW5nIGFuZCB2YWxpZGF0aW5nIHRoZSBmb3JtIG9mIHBheW1lbnQgYW5kIHByb2Nlc3NpbmcgdGhlIGZpbmFuY2lhbCB0cmFuc2FjdGlvbi4gV2hlbiB0aGUKIGNoZWNrb3V0IHByb2Nlc3MgaXMgY29tcGxldGUsIHRoZSBzZXJ2aWNlIHNlbmRzIHlvdXIgYXBwbGljYXRpb24gdGhlIHB1cmNoYXNlIGRldGFpbHMsIHN1Y2ggYXMgdGhlCiBvcmRlciBudW1iZXIsIHRoZSBvcmRlciBkYXRlIGFuZCB0aW1lLCBhbmQgdGhlIHByaWNlIHBhaWQuIEF0IG5vIHBvaW50IGRvZXMgeW91ciBhcHBsaWNhdGlvbiBoYXZlIHRvCi1oYW5kbGUgYW55IGZpbmFuY2lhbCB0cmFuc2FjdGlvbnM7IHRoYXQgcm9sZSBpcyBwcm92aWRlZCBieSBBbmRyb2lkIE1hcmtldCdzIGluLWFwcCBiaWxsaW5nCitoYW5kbGUgYW55IGZpbmFuY2lhbCB0cmFuc2FjdGlvbnM7IHRoYXQgcm9sZSBpcyBwcm92aWRlZCBieSBHb29nbGUgUGxheSdzIGluLWFwcCBiaWxsaW5nCiBzZXJ2aWNlLjwvcD4KIAogPGgyIGlkPSJiaWxsaW5nLWFyY2giPkluLWFwcCBCaWxsaW5nIEFyY2hpdGVjdHVyZTwvaDI+CiAKIDxwPkluLWFwcCBiaWxsaW5nIHVzZXMgYW4gYXN5bmNocm9ub3VzIG1lc3NhZ2UgbG9vcCB0byBjb252ZXkgYmlsbGluZyByZXF1ZXN0cyBhbmQgYmlsbGluZyByZXNwb25zZXMKLWJldHdlZW4geW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlci4gSW4gcHJhY3RpY2UsIHlvdXIgYXBwbGljYXRpb24gbmV2ZXIgZGlyZWN0bHkKLWNvbW11bmljYXRlcyB3aXRoIHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgKHNlZSBmaWd1cmUgMSkuIEluc3RlYWQsIHlvdXIgYXBwbGljYXRpb24gc2VuZHMgYmlsbGluZwotcmVxdWVzdHMgdG8gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIG92ZXIgaW50ZXJwcm9jZXNzIGNvbW11bmljYXRpb24gKElQQykgYW5kIHJlY2VpdmVzCi1wdXJjaGFzZSByZXNwb25zZXMgZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gaW4gdGhlIGZvcm0gb2YgYXN5bmNocm9ub3VzIGJyb2FkY2FzdAotaW50ZW50cy4gWW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBtYW5hZ2UgYW55IG5ldHdvcmsgY29ubmVjdGlvbnMgYmV0d2VlbiBpdHNlbGYgYW5kIHRoZSBBbmRyb2lkCi1NYXJrZXQgc2VydmVyIG9yIHVzZSBhbnkgc3BlY2lhbCBBUElzIGZyb20gdGhlIEFuZHJvaWQgcGxhdGZvcm0uPC9wPgorYmV0d2VlbiB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgR29vZ2xlIFBsYXkgc2VydmVyLiBJbiBwcmFjdGljZSwgeW91ciBhcHBsaWNhdGlvbiBuZXZlciBkaXJlY3RseQorY29tbXVuaWNhdGVzIHdpdGggdGhlIEdvb2dsZSBQbGF5IHNlcnZlciAoc2VlIGZpZ3VyZSAxKS4gSW5zdGVhZCwgeW91ciBhcHBsaWNhdGlvbiBzZW5kcyBiaWxsaW5nCityZXF1ZXN0cyB0byB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb3ZlciBpbnRlcnByb2Nlc3MgY29tbXVuaWNhdGlvbiAoSVBDKSBhbmQgcmVjZWl2ZXMKK3B1cmNoYXNlIHJlc3BvbnNlcyBmcm9tIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBpbiB0aGUgZm9ybSBvZiBhc3luY2hyb25vdXMgYnJvYWRjYXN0CitpbnRlbnRzLiBZb3VyIGFwcGxpY2F0aW9uIGRvZXMgbm90IG1hbmFnZSBhbnkgbmV0d29yayBjb25uZWN0aW9ucyBiZXR3ZWVuIGl0c2VsZiBhbmQgdGhlIEdvb2dsZQorUGxheSBzZXJ2ZXIgb3IgdXNlIGFueSBzcGVjaWFsIEFQSXMgZnJvbSB0aGUgQW5kcm9pZCBwbGF0Zm9ybS48L3A+CiAKIDxwPlNvbWUgaW4tYXBwIGJpbGxpbmcgaW1wbGVtZW50YXRpb25zIG1heSBhbHNvIHVzZSBhIHByaXZhdGUgcmVtb3RlIHNlcnZlciB0byBkZWxpdmVyIGNvbnRlbnQgb3IKIHZhbGlkYXRlIHRyYW5zYWN0aW9ucywgYnV0IGEgcmVtb3RlIHNlcnZlciBpcyBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50IGluLWFwcCBiaWxsaW5nLiBBIHJlbW90ZQpAQCAtNzAsMTYgKzcwLDE2IEBACiA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9iaWxsaW5nX2FyY2gucG5nIiBhbHQ9IiIgaGVpZ2h0PSI1ODIiIC8+CiA8cCBjbGFzcz0iaW1nLWNhcHRpb24iPgogICA8c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBZb3VyIGFwcGxpY2F0aW9uIHNlbmRzIGFuZCByZWNlaXZlcyBiaWxsaW5nIG1lc3NhZ2VzIHRocm91Z2ggdGhlCi0gIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCB3aGljaCBoYW5kbGVzIGFsbCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlci48L3A+CisgIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLCB3aGljaCBoYW5kbGVzIGFsbCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEdvb2dsZSBQbGF5IHNlcnZlci48L3A+CiA8L2Rpdj4KIAogPHA+QSB0eXBpY2FsIGluLWFwcCBiaWxsaW5nIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiB0aHJlZSBjb21wb25lbnRzOjwvcD4KIDx1bD4KICAgPGxpPkEge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2V9IChuYW1lZCA8Y29kZT5CaWxsaW5nU2VydmljZTwvY29kZT4gaW4gdGhlIHNhbXBsZSBhcHBsaWNhdGlvbiksCi0gIHdoaWNoIHByb2Nlc3NlcyBwdXJjaGFzZSBtZXNzYWdlcyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBhbmQgc2VuZHMgYmlsbGluZyByZXF1ZXN0cyB0byBBbmRyb2lkCi0gIE1hcmtldCdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UuPC9saT4KKyAgd2hpY2ggcHJvY2Vzc2VzIHB1cmNoYXNlIG1lc3NhZ2VzIGZyb20gdGhlIGFwcGxpY2F0aW9uIGFuZCBzZW5kcyBiaWxsaW5nIHJlcXVlc3RzIHRvIHRoZSBHb29nbGUKKyAgUGxheSBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlLjwvbGk+CiAgIDxsaT5BIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXJ9IChuYW1lZCA8Y29kZT5CaWxsaW5nUmVjZWl2ZXI8L2NvZGU+IGluIHRoZSBzYW1wbGUKLSAgYXBwbGljYXRpb24pLCB3aGljaCByZWNlaXZlcyBhbGwgYXN5bmNocm9ub3VzIGJpbGxpbmcgcmVzcG9uc2VzIGZyb20gdGhlIEFuZHJvaWQgTWFya2V0CisgIGFwcGxpY2F0aW9uKSwgd2hpY2ggcmVjZWl2ZXMgYWxsIGFzeW5jaHJvbm91cyBiaWxsaW5nIHJlc3BvbnNlcyBmcm9tIHRoZSBHb29nbGUgUGxheQogICBhcHBsaWNhdGlvbi48L2xpPgogICA8bGk+QSBzZWN1cml0eSBjb21wb25lbnQgKG5hbWVkIDxjb2RlPlNlY3VyaXR5PC9jb2RlPiBpbiB0aGUgc2FtcGxlIGFwcGxpY2F0aW9uKSwgd2hpY2ggcGVyZm9ybXMKICAgc2VjdXJpdHktcmVsYXRlZCB0YXNrcywgc3VjaCBhcyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFuZCBub25jZSBnZW5lcmF0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbgpAQCAtOTksMTkgKzk5LDE5IEBACiAKIDxwPkluIGFkZGl0aW9uIHRvIHRoZXNlIGNvbXBvbmVudHMsIHlvdXIgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIGEgd2F5IHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0CiB1c2VycycgcHVyY2hhc2VzIGFuZCBzb21lIHNvcnQgb2YgdXNlciBpbnRlcmZhY2UgdGhhdCBsZXRzIHVzZXJzIHNlbGVjdCBpdGVtcyB0byBwdXJjaGFzZS4gWW91IGRvCi1ub3QgbmVlZCB0byBwcm92aWRlIGEgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UuIFdoZW4gYSB1c2VyIGluaXRpYXRlcyBhbiBpbi1hcHAgcHVyY2hhc2UsIHRoZSBBbmRyb2lkCi1NYXJrZXQgYXBwbGljYXRpb24gcHJlc2VudHMgdGhlIGNoZWNrb3V0IHVzZXIgaW50ZXJmYWNlIHRvIHlvdXIgdXNlci4gV2hlbiB0aGUgdXNlciBjb21wbGV0ZXMgdGhlCitub3QgbmVlZCB0byBwcm92aWRlIGEgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UuIFdoZW4gYSB1c2VyIGluaXRpYXRlcyBhbiBpbi1hcHAgcHVyY2hhc2UsIHRoZSBHb29nbGUKK1BsYXkgYXBwbGljYXRpb24gcHJlc2VudHMgdGhlIGNoZWNrb3V0IHVzZXIgaW50ZXJmYWNlIHRvIHlvdXIgdXNlci4gV2hlbiB0aGUgdXNlciBjb21wbGV0ZXMgdGhlCiBjaGVja291dCBwcm9jZXNzLCB5b3VyIGFwcGxpY2F0aW9uIHJlc3VtZXMuPC9wPgogCiA8aDIgaWQ9ImJpbGxpbmctbXNncyI+SW4tYXBwIEJpbGxpbmcgTWVzc2FnZXM8L2gyPgogCi08cD5XaGVuIHRoZSB1c2VyIGluaXRpYXRlcyBhIHB1cmNoYXNlLCB5b3VyIGFwcGxpY2F0aW9uIHNlbmRzIGJpbGxpbmcgbWVzc2FnZXMgdG8gQW5kcm9pZCBNYXJrZXQncworPHA+V2hlbiB0aGUgdXNlciBpbml0aWF0ZXMgYSBwdXJjaGFzZSwgeW91ciBhcHBsaWNhdGlvbiBzZW5kcyBiaWxsaW5nIG1lc3NhZ2VzIHRvIEdvb2dsZSBQbGF5J3MKIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgKG5hbWVkIDxjb2RlPk1hcmtldEJpbGxpbmdTZXJ2aWNlPC9jb2RlPikgdXNpbmcgc2ltcGxlIElQQyBtZXRob2QgY2FsbHMuIFRoZQotQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gcmVzcG9uZHMgdG8gYWxsIGJpbGxpbmcgcmVxdWVzdHMgc3luY2hyb25vdXNseSwgcHJvdmlkaW5nIHlvdXIKLWFwcGxpY2F0aW9uIHdpdGggc3RhdHVzIG5vdGlmaWNhdGlvbnMgYW5kIG90aGVyIGluZm9ybWF0aW9uLiBUaGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gYWxzbworR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gcmVzcG9uZHMgdG8gYWxsIGJpbGxpbmcgcmVxdWVzdHMgc3luY2hyb25vdXNseSwgcHJvdmlkaW5nIHlvdXIKK2FwcGxpY2F0aW9uIHdpdGggc3RhdHVzIG5vdGlmaWNhdGlvbnMgYW5kIG90aGVyIGluZm9ybWF0aW9uLiBUaGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gYWxzbwogcmVzcG9uZHMgdG8gc29tZSBiaWxsaW5nIHJlcXVlc3RzIGFzeW5jaHJvbm91c2x5LCBwcm92aWRpbmcgeW91ciBhcHBsaWNhdGlvbiB3aXRoIGVycm9yIG1lc3NhZ2VzIGFuZAogZGV0YWlsZWQgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24uIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGJhc2ljIHJlcXVlc3QtcmVzcG9uc2UKLW1lc3NhZ2luZyB0aGF0IHRha2VzIHBsYWNlIGJldHdlZW4geW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLjwvcD4KK21lc3NhZ2luZyB0aGF0IHRha2VzIHBsYWNlIGJldHdlZW4geW91ciBhcHBsaWNhdGlvbiBhbmQgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLjwvcD4KIAogPGgzIGlkPSJiaWxsaW5nLXJlcXVlc3QiPkluLWFwcCBiaWxsaW5nIHJlcXVlc3RzPC9oMz4KIApAQCAtMTMzLDMxICsxMzMsMzEgQEAKIAogPHA+T25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBrZXlzIHRoYXQgZXZlcnkgcmVxdWVzdCBCdW5kbGUgbXVzdCBoYXZlIGlzIHRoZQogPGNvZGU+QklMTElOR19SRVFVRVNUPC9jb2RlPiBrZXkuIFRoaXMga2V5IGxldHMgeW91IHNwZWNpZnkgdGhlIHR5cGUgb2YgYmlsbGluZyByZXF1ZXN0IHlvdSBhcmUKLW1ha2luZy4gQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZml2ZSB0eXBlcyBvZiBiaWxsaW5nCittYWtpbmcuIEdvb2dsZSBQbGF5J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGZpdmUgdHlwZXMgb2YgYmlsbGluZwogcmVxdWVzdHM6PC9wPgogCiA8dWw+CiAgIDxsaT48Y29kZT5DSEVDS19CSUxMSU5HX1NVUFBPUlRFRDwvY29kZT4KLSAgICA8cD5UaGlzIHJlcXVlc3QgdmVyaWZpZXMgdGhhdCB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gc3VwcG9ydHMgaW4tYXBwIGJpbGxpbmcuIFlvdQorICAgIDxwPlRoaXMgcmVxdWVzdCB2ZXJpZmllcyB0aGF0IHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBzdXBwb3J0cyBpbi1hcHAgYmlsbGluZy4gWW91CiAgICAgdXN1YWxseSBzZW5kIHRoaXMgcmVxdWVzdCB3aGVuIHlvdXIgYXBwbGljYXRpb24gZmlyc3Qgc3RhcnRzIHVwLiBUaGlzIHJlcXVlc3QgaXMgdXNlZnVsIGlmIHlvdQogICAgIHdhbnQgdG8gZW5hYmxlIG9yIGRpc2FibGUgY2VydGFpbiBVSSBmZWF0dXJlcyB0aGF0IGFyZSByZWxldmFudCBvbmx5IHRvIGluLWFwcCBiaWxsaW5nLjwvcD4KICAgPC9saT4KICAgPGxpPjxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+Ci0gICAgPHA+VGhpcyByZXF1ZXN0IHNlbmRzIGEgcHVyY2hhc2UgbWVzc2FnZSB0byB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gYW5kIGlzIHRoZSBmb3VuZGF0aW9uCisgICAgPHA+VGhpcyByZXF1ZXN0IHNlbmRzIGEgcHVyY2hhc2UgbWVzc2FnZSB0byB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gYW5kIGlzIHRoZSBmb3VuZGF0aW9uCiAgICAgb2YgaW4tYXBwIGJpbGxpbmcuIFlvdSBzZW5kIHRoaXMgcmVxdWVzdCB3aGVuIGEgdXNlciBpbmRpY2F0ZXMgdGhhdCBoZSBvciBzaGUgd2FudHMgdG8gcHVyY2hhc2UKLSAgICBhbiBpdGVtIGluIHlvdXIgYXBwbGljYXRpb24uIEFuZHJvaWQgTWFya2V0IHRoZW4gaGFuZGxlcyB0aGUgZmluYW5jaWFsIHRyYW5zYWN0aW9uIGJ5IGRpc3BsYXlpbmcKKyAgICBhbiBpdGVtIGluIHlvdXIgYXBwbGljYXRpb24uIEdvb2dsZSBQbGF5IHRoZW4gaGFuZGxlcyB0aGUgZmluYW5jaWFsIHRyYW5zYWN0aW9uIGJ5IGRpc3BsYXlpbmcKICAgICB0aGUgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UuPC9wPgogICA8L2xpPgogICA8bGk+PGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPgogICAgIDxwPlRoaXMgcmVxdWVzdCByZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UuIEEgcHVyY2hhc2UgY2hhbmdlcyBzdGF0ZSB3aGVuCiAgICAgYSByZXF1ZXN0ZWQgcHVyY2hhc2UgaXMgYmlsbGVkIHN1Y2Nlc3NmdWxseSBvciB3aGVuIGEgdXNlciBjYW5jZWxzIGEgdHJhbnNhY3Rpb24gZHVyaW5nCi0gICAgY2hlY2tvdXQuIEl0IGNhbiBhbHNvIG9jY3VyIHdoZW4gYSBwcmV2aW91cyBwdXJjaGFzZSBpcyByZWZ1bmRlZC4gQW5kcm9pZCBNYXJrZXQgbm90aWZpZXMgeW91cgorICAgIGNoZWNrb3V0LiBJdCBjYW4gYWxzbyBvY2N1ciB3aGVuIGEgcHJldmlvdXMgcHVyY2hhc2UgaXMgcmVmdW5kZWQuIEdvb2dsZSBQbGF5IG5vdGlmaWVzIHlvdXIKICAgICBhcHBsaWNhdGlvbiB3aGVuIGEgcHVyY2hhc2UgY2hhbmdlcyBzdGF0ZSwgc28geW91IG9ubHkgbmVlZCB0byBzZW5kIHRoaXMgcmVxdWVzdCB3aGVuIHRoZXJlIGlzCiAgICAgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gdG8gcmV0cmlldmUuPC9wPgogICA8L2xpPgogICA8bGk+PGNvZGU+Q09ORklSTV9OT1RJRklDQVRJT05TPC9jb2RlPgogICAgIDxwPlRoaXMgcmVxdWVzdCBhY2tub3dsZWRnZXMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHJlY2VpdmVkIHRoZSBkZXRhaWxzIG9mIGEgcHVyY2hhc2Ugc3RhdGUKLSAgICBjaGFuZ2UuIEFuZHJvaWQgTWFya2V0IHNlbmRzIHB1cmNoYXNlIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIHlvdXIgYXBwbGljYXRpb24gdW50aWwgeW91CisgICAgY2hhbmdlLiBHb29nbGUgUGxheSBzZW5kcyBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byB5b3VyIGFwcGxpY2F0aW9uIHVudGlsIHlvdQogICAgIGNvbmZpcm0gdGhhdCB5b3UgcmVjZWl2ZWQgdGhlbS48L3A+CiAgIDwvbGk+CiAgIDxsaT48Y29kZT5SRVNUT1JFX1RSQU5TQUNUSU9OUzwvY29kZT4KQEAgLTE3MSw3ICsxNzEsNyBAQAogCiA8aDMgaWQ9ImJpbGxpbmctcmVzcG9uc2UiPkluLWFwcCBCaWxsaW5nIFJlc3BvbnNlczwvaDM+CiAKLTxwPlRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiByZXNwb25kcyB0byBpbi1hcHAgYmlsbGluZyByZXF1ZXN0cyB3aXRoIGJvdGggc3luY2hyb25vdXMgYW5kCis8cD5UaGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gcmVzcG9uZHMgdG8gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdHMgd2l0aCBib3RoIHN5bmNocm9ub3VzIGFuZAogYXN5bmNocm9ub3VzIHJlc3BvbnNlcy4gVGhlIHN5bmNocm9ub3VzIHJlc3BvbnNlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSB3aXRoIHRoZSBmb2xsb3dpbmcKIHRocmVlIGtleXM6PC9wPgogCkBAIC0xOTYsOSArMTk2LDkgQEAKIAogPHVsPgogICAgIDxsaT48Y29kZT5jb20uYW5kcm9pZC52ZW5kaW5nLmJpbGxpbmcuUkVTUE9OU0VfQ09ERTwvY29kZT4KLSAgICA8cD5UaGlzIHJlc3BvbnNlIGNvbnRhaW5zIGFuIEFuZHJvaWQgTWFya2V0IHNlcnZlciByZXNwb25zZSBjb2RlLCBhbmQgaXMgc2VudCBhZnRlciB5b3UgbWFrZSBhbgorICAgIDxwPlRoaXMgcmVzcG9uc2UgY29udGFpbnMgYSBHb29nbGUgUGxheSBzZXJ2ZXIgcmVzcG9uc2UgY29kZSwgYW5kIGlzIHNlbnQgYWZ0ZXIgeW91IG1ha2UgYW4KICAgICBpbi1hcHAgYmlsbGluZyByZXF1ZXN0LiBBIHNlcnZlciByZXNwb25zZSBjb2RlIGNhbiBpbmRpY2F0ZSB0aGF0IGEgYmlsbGluZyByZXF1ZXN0IHdhcwotICAgIHN1Y2Nlc3NmdWxseSBzZW50IHRvIEFuZHJvaWQgTWFya2V0IG9yIGl0IGNhbiBpbmRpY2F0ZSB0aGF0IHNvbWUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGEgYmlsbGluZworICAgIHN1Y2Nlc3NmdWxseSBzZW50IHRvIEdvb2dsZSBQbGF5IG9yIGl0IGNhbiBpbmRpY2F0ZSB0aGF0IHNvbWUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGEgYmlsbGluZwogICAgIHJlcXVlc3QuIFRoaXMgcmVzcG9uc2UgaXMgPGVtPm5vdDwvZW0+IHVzZWQgdG8gcmVwb3J0IGFueSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2VzIChzdWNoIGFzIHJlZnVuZAogICAgIG9yIHB1cmNoYXNlIGluZm9ybWF0aW9uKS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc3BvbnNlIGNvZGVzIHRoYXQgYXJlIHNlbnQgd2l0aCB0aGlzCiAgICAgcmVzcG9uc2UsIHNlZSA8YQpAQCAtMjUzLDcgKzI1Myw3IEBACiA8b2w+CiAgIDxsaT5Zb3VyIGFwcGxpY2F0aW9uIHNlbmRzIGEgcHVyY2hhc2UgcmVxdWVzdCAoPGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4gdHlwZSksIHNwZWNpZnlpbmcgYQogICBwcm9kdWN0IElEIGFuZCBvdGhlciBwYXJhbWV0ZXJzLjwvbGk+Ci0gIDxsaT5UaGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gc2VuZHMgeW91ciBhcHBsaWNhdGlvbiBhIEJ1bmRsZSB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgPGxpPlRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBzZW5kcyB5b3VyIGFwcGxpY2F0aW9uIGEgQnVuZGxlIHdpdGggdGhlIGZvbGxvd2luZyBrZXlzOgogICA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiwgPGNvZGU+UFVSQ0hBU0VfSU5URU5UPC9jb2RlPiwgYW5kIDxjb2RlPlJFUVVFU1RfSUQ8L2NvZGU+LiBUaGUKICAgPGNvZGU+UFVSQ0hBU0VfSU5URU5UPC9jb2RlPiBrZXkgcHJvdmlkZXMgYSB7QGxpbmsgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudH0sIHdoaWNoIHlvdXIKICAgYXBwbGljYXRpb24gdXNlcyB0byBzdGFydCB0aGUgY2hlY2tvdXQgVUkgZm9yIHRoZSBnaXZlbiBwcm9kdWN0IElELjwvbGk+CkBAIC0yNjIsMjAgKzI2MiwyMCBAQAogICAgIGNvbnRleHQgYW5kIG5vdCBhbiBhcHBsaWNhdGlvbiBjb250ZXh0LjwvcD4KICAgPC9saT4KICAgPGxpPldoZW4gdGhlIGNoZWNrb3V0IGZsb3cgZmluaXNoZXMgKHRoYXQgaXMsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSBwdXJjaGFzZXMgdGhlIGl0ZW0gb3IgY2FuY2VscwotICB0aGUgcHVyY2hhc2UpLCBBbmRyb2lkIE1hcmtldCBzZW5kcyB5b3VyIGFwcGxpY2F0aW9uIGEgbm90aWZpY2F0aW9uIG1lc3NhZ2UgKGFuCisgIHRoZSBwdXJjaGFzZSksIEdvb2dsZSBQbGF5IHNlbmRzIHlvdXIgYXBwbGljYXRpb24gYSBub3RpZmljYXRpb24gbWVzc2FnZSAoYW4KICAgPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gYnJvYWRjYXN0IGludGVudCkuIFRoZSBub3RpZmljYXRpb24gbWVzc2FnZSBpbmNsdWRlcyBhIG5vdGlmaWNhdGlvbiBJRCwKICAgd2hpY2ggcmVmZXJlbmNlcyB0aGUgdHJhbnNhY3Rpb24uPC9saT4KICAgPGxpPllvdXIgYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIGJ5IHNlbmRpbmcgYQogICA8Y29kZT5HRVRfUFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gcmVxdWVzdCwgc3BlY2lmeWluZyB0aGUgbm90aWZpY2F0aW9uIElEIGZvciB0aGUKICAgdHJhbnNhY3Rpb24uPC9saT4KLSAgPGxpPlRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBzZW5kcyBhIEJ1bmRsZSB3aXRoIGEgPGNvZGU+UkVTUE9OU0VfQ09ERTwvY29kZT4ga2V5IGFuZCBhIAorICA8bGk+VGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHNlbmRzIGEgQnVuZGxlIHdpdGggYSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBrZXkgYW5kIGEgCiAgIDxjb2RlPlJFUVVFU1RfSUQ8L2NvZGU+IGtleS4KLSAgPGxpPkFuZHJvaWQgTWFya2V0IHNlbmRzIHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiB0byB5b3VyIGFwcGxpY2F0aW9uIGluIGEKKyAgPGxpPkdvb2dsZSBQbGF5IHNlbmRzIHRoZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiB0byB5b3VyIGFwcGxpY2F0aW9uIGluIGEKICAgPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gYnJvYWRjYXN0IGludGVudC48L2xpPgogICA8bGk+WW91ciBhcHBsaWNhdGlvbiBjb25maXJtcyB0aGF0IHlvdSByZWNlaXZlZCB0aGUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBnaXZlbgogICBub3RpZmljYXRpb24gSUQgYnkgc2VuZGluZyBhIGNvbmZpcm1hdGlvbiBtZXNzYWdlICg8Y29kZT5DT05GSVJNX05PVElGSUNBVElPTlM8L2NvZGU+IHR5cGUpLAogICBzcGVjaWZ5aW5nIHRoZSBub3RpZmljYXRpb24gSUQgZm9yIHdoaWNoIHlvdSByZWNlaXZlZCB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbi48L2xpPgotICA8bGk+VGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHNlbmRzIHlvdXIgYXBwbGljYXRpb24gYSBCdW5kbGUgd2l0aCBhCisgIDxsaT5UaGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gc2VuZHMgeW91ciBhcHBsaWNhdGlvbiBhIEJ1bmRsZSB3aXRoIGEKICAgPGNvZGU+UkVTUE9OU0VfQ09ERTwvY29kZT4ga2V5IGFuZCBhIDxjb2RlPlJFUVVFU1RfSUQ8L2NvZGU+IGtleS48L2xpPgogPC9vbD4KIApAQCAtMjg0LDEzICsyODQsMTMgQEAKICAgPHN0cm9uZz5GaWd1cmUgMi48L3N0cm9uZz4gTWVzc2FnZSBzZXF1ZW5jZSBmb3IgYSBwdXJjaGFzZSByZXF1ZXN0LgogPC9wPgogCi08cD5LZWVwIGluIG1pbmQsIHlvdSBtdXN0IHNlbmQgYSBjb25maXJtYXRpb24gd2hlbiB5b3UgcmVjZWl2ZSB0cmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIEFuZHJvaWQKLU1hcmtldCAoc3RlcCA4IGluIGZpZ3VyZSAyKS4gSWYgeW91IGRvbid0IHNlbmQgYSBjb25maXJtYXRpb24gbWVzc2FnZSwgQW5kcm9pZCBNYXJrZXQgd2lsbAorPHA+S2VlcCBpbiBtaW5kLCB5b3UgbXVzdCBzZW5kIGEgY29uZmlybWF0aW9uIHdoZW4geW91IHJlY2VpdmUgdHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBHb29nbGUKK1BsYXkgKHN0ZXAgOCBpbiBmaWd1cmUgMikuIElmIHlvdSBkb24ndCBzZW5kIGEgY29uZmlybWF0aW9uIG1lc3NhZ2UsIEdvb2dsZSBQbGF5IHdpbGwKIGNvbnRpbnVlIHNlbmRpbmcgPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gbWVzc2FnZXMgZm9yIHRoZSB0cmFuc2FjdGlvbnMgeW91IGhhdmUgbm90CiBjb25maXJtZWQuIEFzIGEgYmVzdCBwcmFjdGljZSwgeW91IHNob3VsZCBub3Qgc2VuZCBhIDxjb2RlPkNPTkZJUk1fTk9USUZJQ0FUSU9OUzwvY29kZT4gcmVxdWVzdCBmb3IKIGEgcHVyY2hhc2VkIGl0ZW0gdW50aWwgeW91IGhhdmUgZGVsaXZlcmVkIHRoZSBpdGVtIHRvIHRoZSB1c2VyLiBUaGlzIHdheSwgaWYgeW91ciBhcHBsaWNhdGlvbgogY3Jhc2hlcyBvciBzb21ldGhpbmcgZWxzZSBwcmV2ZW50cyB5b3VyIGFwcGxpY2F0aW9uIGZyb20gZGVsaXZlcmluZyB0aGUgcHJvZHVjdCwgeW91ciBhcHBsaWNhdGlvbgotd2lsbCBzdGlsbCByZWNlaXZlIGFuIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQgZnJvbSBBbmRyb2lkIE1hcmtldCBpbmRpY2F0aW5nCit3aWxsIHN0aWxsIHJlY2VpdmUgYW4gPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gYnJvYWRjYXN0IGludGVudCBmcm9tIEdvb2dsZSBQbGF5IGluZGljYXRpbmcKIHRoYXQgeW91IG5lZWQgdG8gZGVsaXZlciB0aGUgcHJvZHVjdC4gQWxzbywgYXMgYSBiZXN0IHByYWN0aWNlLCB5b3VyIGFwcGxpY2F0aW9uIG11c3QgYmUgYWJsZSB0bwogaGFuZGxlIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IG1lc3NhZ2VzIHRoYXQgY29udGFpbiBtdWx0aXBsZSBvcmRlcnMuPC9wPgogCkBAIC0zMDcsNyArMzA3LDcgQEAKIDwvZGl2PgogCiA8cD5UaGUgcmVxdWVzdCB0cmlnZ2VycyB0aHJlZSByZXNwb25zZXMuIFRoZSBmaXJzdCBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gd2l0aCBhCi08Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBrZXkgYW5kIGEgPGNvZGU+UkVRVUVTVF9JRDwvY29kZT4ga2V5LiBOZXh0LCB0aGUgQW5kcm9pZCBNYXJrZXQKKzxjb2RlPlJFU1BPTlNFX0NPREU8L2NvZGU+IGtleSBhbmQgYSA8Y29kZT5SRVFVRVNUX0lEPC9jb2RlPiBrZXkuIE5leHQsIHRoZSBHb29nbGUgUGxheQogYXBwbGljYXRpb24gc2VuZHMgYSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LCB3aGljaCBwcm92aWRlcyBzdGF0dXMgaW5mb3JtYXRpb24KIG9yIGVycm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1ZXN0LiBBcyBhbHdheXMsIHRoZSA8Y29kZT5SRVNQT05TRV9DT0RFPC9jb2RlPiBtZXNzYWdlIHJlZmVyZW5jZXMKIGEgc3BlY2lmaWMgcmVxdWVzdCBJRCwgc28geW91IGNhbiBkZXRlcm1pbmUgd2hpY2ggcmVxdWVzdCBhIDxjb2RlPlJFU1BPTlNFX0NPREU8L2NvZGU+IG1lc3NhZ2UKQEAgLTMzOCwxOCArMzM4LDE4IEBACiBpcyB1bmF2YWlsYWJsZSBiZWNhdXNlIHRoZSBBUEkgdmVyc2lvbiB5b3Ugc3BlY2lmaWVkIGlzIHVucmVjb2duaXplZCBvciB0aGUgdXNlciBpcyBub3QgZWxpZ2libGUgdG8KIG1ha2UgaW4tYXBwIHB1cmNoYXNlcyAoZm9yIGV4YW1wbGUsIHRoZSB1c2VyIHJlc2lkZXMgaW4gYSBjb3VudHJ5IHRoYXQgZG9lcyBub3QgYWxsb3cgaW4tYXBwCiBiaWxsaW5nKS4gQSA8Y29kZT5TRVJWRVJfRVJST1I8L2NvZGU+IGNhbiBhbHNvIGJlIHJldHVybmVkLCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoCi10aGUgQW5kcm9pZCBNYXJrZXQgc2VydmVyLjwvcD4KK3RoZSBHb29nbGUgUGxheSBzZXJ2ZXIuPC9wPgogCiA8aDMgaWQ9ImJpbGxpbmctYWN0aW9uLW5vdGlmeSI+SGFuZGxpbmcgSU5fQVBQX05PVElGWSBtZXNzYWdlczwvaDM+CiAKLTxwPlVzdWFsbHksIHlvdXIgYXBwbGljYXRpb24gcmVjZWl2ZXMgYW4gPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gYnJvYWRjYXN0IGludGVudCBmcm9tIEFuZHJvaWQKLU1hcmtldCBpbiByZXNwb25zZSB0byBhIDxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+IG1lc3NhZ2UgKHNlZSBmaWd1cmUgMikuIFRoZQorPHA+VXN1YWxseSwgeW91ciBhcHBsaWNhdGlvbiByZWNlaXZlcyBhbiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50IGZyb20gR29vZ2xlCitQbGF5IGluIHJlc3BvbnNlIHRvIGEgPGNvZGU+UkVRVUVTVF9QVVJDSEFTRTwvY29kZT4gbWVzc2FnZSAoc2VlIGZpZ3VyZSAyKS4gVGhlCiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50IGluZm9ybXMgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHRoZSBzdGF0ZSBvZiBhIHJlcXVlc3RlZAogcHVyY2hhc2UgaGFzIGNoYW5nZWQuIFRvIHJldHJpZXZlIHRoZSBkZXRhaWxzIG9mIHRoYXQgcHVyY2hhc2UsIHlvdXIgYXBwbGljYXRpb24gc2VuZHMgYQotPGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPiByZXF1ZXN0LiBBbmRyb2lkIE1hcmtldCByZXNwb25kcyB3aXRoIGEKKzxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gcmVxdWVzdC4gR29vZ2xlIFBsYXkgcmVzcG9uZHMgd2l0aCBhCiA8Y29kZT5QVVJDSEFTRV9TVEFURV9DSEFOR0VEPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LCB3aGljaCBjb250YWlucyB0aGUgZGV0YWlscyBvZiB0aGUgcHVyY2hhc2UKIHN0YXRlIGNoYW5nZS4gWW91ciBhcHBsaWNhdGlvbiB0aGVuIHNlbmRzIGEgPGNvZGU+Q09ORklSTV9OT1RJRklDQVRJT05TPC9jb2RlPiBtZXNzYWdlLCBpbmZvcm1pbmcKLUFuZHJvaWQgTWFya2V0IHRoYXQgeW91IGhhdmUgcmVjZWl2ZWQgdGhlIHB1cmNoYXNlIHN0YXRlIGNoYW5nZSBpbmZvcm1hdGlvbi48L3A+CitHb29nbGUgUGxheSB0aGF0IHlvdSBoYXZlIHJlY2VpdmVkIHRoZSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UgaW5mb3JtYXRpb24uPC9wPgogCiA8cD5JbiBzb21lIHNwZWNpYWwgY2FzZXMsIHlvdSBtYXkgcmVjZWl2ZSBtdWx0aXBsZSA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBtZXNzYWdlcyBldmVuIHRob3VnaAogeW91IGhhdmUgY29uZmlybWVkIHJlY2VpcHQgb2YgdGhlIHB1cmNoYXNlIGluZm9ybWF0aW9uLCBvciB5b3UgbWF5IHJlY2VpdmUKQEAgLTM1OCwxMyArMzU4LDEzIEBACiAKIDxoND5IYW5kbGluZyBtdWx0aXBsZSBJTl9BUFBfTk9USUZZIG1lc3NhZ2VzPC9oND4KIAotPHA+V2hlbiBBbmRyb2lkIE1hcmtldCByZWNlaXZlcyBhIDxjb2RlPkNPTkZJUk1fTk9USUZJQ0FUSU9OUzwvY29kZT4gbWVzc2FnZSBmb3IgYSBnaXZlbgorPHA+V2hlbiBHb29nbGUgUGxheSByZWNlaXZlcyBhIDxjb2RlPkNPTkZJUk1fTk9USUZJQ0FUSU9OUzwvY29kZT4gbWVzc2FnZSBmb3IgYSBnaXZlbgogPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gbWVzc2FnZSwgaXQgdXN1YWxseSBzdG9wcyBzZW5kaW5nIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+Ci1pbnRlbnRzIGZvciB0aGF0IDxjb2RlPlBVUkNIQVNFX1NUQVRFX0NIQU5HRUQ8L2NvZGU+IG1lc3NhZ2UuIFNvbWV0aW1lcywgaG93ZXZlciwgQW5kcm9pZAotTWFya2V0IG1heSBzZW5kIHJlcGVhdGVkIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IGludGVudHMgZm9yIGEKK2ludGVudHMgZm9yIHRoYXQgPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gbWVzc2FnZS4gU29tZXRpbWVzLCBob3dldmVyLCBHb29nbGUKK1BsYXkgbWF5IHNlbmQgcmVwZWF0ZWQgPGNvZGU+SU5fQVBQX05PVElGWTwvY29kZT4gaW50ZW50cyBmb3IgYQogPGNvZGU+UFVSQ0hBU0VfU1RBVEVfQ0hBTkdFRDwvY29kZT4gbWVzc2FnZSBldmVuIHRob3VnaCB5b3VyIGFwcGxpY2F0aW9uIGhhcyBzZW50IGEKIDxjb2RlPkNPTkZJUk1fTk9USUZJQ0FUSU9OUzwvY29kZT4gbWVzc2FnZS4gVGhpcyBjYW4gb2NjdXIgaWYgYSBkZXZpY2UgbG9zZXMgbmV0d29yayBjb25uZWN0aXZpdHkKLXdoaWxlIHlvdSBhcmUgc2VuZGluZyB0aGUgPGNvZGU+Q09ORklSTV9OT1RJRklDQVRJT05TPC9jb2RlPiBtZXNzYWdlLiBJbiB0aGlzIGNhc2UsIEFuZHJvaWQgTWFya2V0Cit3aGlsZSB5b3UgYXJlIHNlbmRpbmcgdGhlIDxjb2RlPkNPTkZJUk1fTk9USUZJQ0FUSU9OUzwvY29kZT4gbWVzc2FnZS4gSW4gdGhpcyBjYXNlLCBHb29nbGUgUGxheQogbWlnaHQgbm90IHJlY2VpdmUgeW91ciA8Y29kZT5DT05GSVJNX05PVElGSUNBVElPTlM8L2NvZGU+IG1lc3NhZ2UgYW5kIGl0IGNvdWxkIHNlbmQgbXVsdGlwbGUKIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IG1lc3NhZ2VzIHVudGlsIGl0IHJlY2VpdmVzIGFja25vd2xlZGdlbWVudCB0aGF0IHlvdSByZWNlaXZlZCB0aGUKIHRyYW5zYWN0aW9uIG1lc3NhZ2UuIFRoZXJlZm9yZSwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IGJlIGFibGUgdG8gcmVjb2duaXplIHRoYXQgdGhlIHN1YnNlcXVlbnQKQEAgLTM5MCw3ICszOTAsNyBAQAogCiA8cD5JbiB0aGUgZmlyc3QgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBtYXkgcmVjZWl2ZSBhbiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50CiB3aGVuIGEgdXNlciBoYXMgeW91ciBhcHBsaWNhdGlvbiBpbnN0YWxsZWQgb24gdHdvIChvciBtb3JlKSBkZXZpY2VzIGFuZCB0aGUgdXNlciBtYWtlcyBhbiBpbi1hcHAKLXB1cmNoYXNlIGZyb20gb25lIG9mIHRoZSBkZXZpY2VzLiBJbiB0aGlzIGNhc2UsIEFuZHJvaWQgTWFya2V0IHNlbmRzIGFuIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+CitwdXJjaGFzZSBmcm9tIG9uZSBvZiB0aGUgZGV2aWNlcy4gSW4gdGhpcyBjYXNlLCBHb29nbGUgUGxheSBzZW5kcyBhbiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPgogbWVzc2FnZSB0byB0aGUgc2Vjb25kIGRldmljZSwgaW5mb3JtaW5nIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZXJlIGlzIGEgcHVyY2hhc2Ugc3RhdGUgY2hhbmdlLiBZb3VyCiBhcHBsaWNhdGlvbiBjYW4gaGFuZGxlIHRoaXMgbWVzc2FnZSB0aGUgc2FtZSB3YXkgaXQgaGFuZGxlcyB0aGUgcmVzcG9uc2UgZnJvbSBhbgogYXBwbGljYXRpb24taW5pdGlhdGVkIDxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+IG1lc3NhZ2UsIHNvIHRoYXQgdWx0aW1hdGVseSB5b3VyIGFwcGxpY2F0aW9uCkBAIC00MDAsOCArNDAwLDggQEAKIHRvICJtYW5hZ2VkIHBlciB1c2VyIGFjY291bnQuIjwvcD4KIAogPHA+SW4gdGhlIHNlY29uZCBjYXNlLCB5b3VyIGFwcGxpY2F0aW9uIGNhbiByZWNlaXZlIGFuIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQKLXdoZW4gQW5kcm9pZCBNYXJrZXQgcmVjZWl2ZXMgYSByZWZ1bmQgbm90aWZpY2F0aW9uIGZyb20gR29vZ2xlIENoZWNrb3V0LiBJbiB0aGlzIGNhc2UsIEFuZHJvaWQKLU1hcmtldCBzZW5kcyBhbiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBtZXNzYWdlIHRvIHlvdXIgYXBwbGljYXRpb24uIFlvdXIgYXBwbGljYXRpb24gY2FuIGhhbmRsZQord2hlbiBHb29nbGUgUGxheSByZWNlaXZlcyBhIHJlZnVuZCBub3RpZmljYXRpb24gZnJvbSBHb29nbGUgQ2hlY2tvdXQuIEluIHRoaXMgY2FzZSwgR29vZ2xlCitQbGF5IHNlbmRzIGFuIDxjb2RlPklOX0FQUF9OT1RJRlk8L2NvZGU+IG1lc3NhZ2UgdG8geW91ciBhcHBsaWNhdGlvbi4gWW91ciBhcHBsaWNhdGlvbiBjYW4gaGFuZGxlCiB0aGlzIG1lc3NhZ2UgdGhlIHNhbWUgd2F5IGl0IGhhbmRsZXMgcmVzcG9uc2VzIGZyb20gYW4gYXBwbGljYXRpb24taW5pdGlhdGVkCiA8Y29kZT5SRVFVRVNUX1BVUkNIQVNFPC9jb2RlPiBtZXNzYWdlIHNvIHRoYXQgdWx0aW1hdGVseSB5b3VyIGFwcGxpY2F0aW9uIHJlY2VpdmVzIGEKIDxjb2RlPlBVUkNIQVNFX1NUQVRFX0NIQU5HRUQ8L2NvZGU+IG1lc3NhZ2UgdGhhdCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaXRlbSB0aGF0IGhhcyBiZWVuCkBAIC00MTcsMTMgKzQxNywxMyBAQAogPGgyIGlkPSJiaWxsaW5nLXNlY3VyaXR5Ij5TZWN1cml0eSBDb250cm9sczwvaDI+CiAKIDxwPlRvIGhlbHAgZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIHRoYXQgaXMgc2VudCB0byB5b3VyIGFwcGxpY2F0aW9uLAotQW5kcm9pZCBNYXJrZXQgc2lnbnMgdGhlIEpTT04gc3RyaW5nIHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5QVVJDSEFTRV9TVEFURV9DSEFOR0VEPC9jb2RlPgotYnJvYWRjYXN0IGludGVudC4gQW5kcm9pZCBNYXJrZXQgdXNlcyB0aGUgcHJpdmF0ZSBrZXkgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggeW91ciBwdWJsaXNoZXIgYWNjb3VudAorR29vZ2xlIFBsYXkgc2lnbnMgdGhlIEpTT04gc3RyaW5nIHRoYXQgaXMgY29udGFpbmVkIGluIHRoZSA8Y29kZT5QVVJDSEFTRV9TVEFURV9DSEFOR0VEPC9jb2RlPgorYnJvYWRjYXN0IGludGVudC4gR29vZ2xlIFBsYXkgdXNlcyB0aGUgcHJpdmF0ZSBrZXkgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggeW91ciBwdWJsaXNoZXIgYWNjb3VudAogdG8gY3JlYXRlIHRoaXMgc2lnbmF0dXJlLiBUaGUgcHVibGlzaGVyIHNpdGUgZ2VuZXJhdGVzIGFuIFJTQSBrZXkgcGFpciBmb3IgZWFjaCBwdWJsaXNoZXIgYWNjb3VudC4KIFlvdSBjYW4gZmluZCB0aGUgcHVibGljIGtleSBwb3J0aW9uIG9mIHRoaXMga2V5IHBhaXIgb24geW91ciBhY2NvdW50J3MgcHJvZmlsZSBwYWdlLiBJdCBpcyB0aGUgc2FtZQotcHVibGljIGtleSB0aGF0IGlzIHVzZWQgd2l0aCBBbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcuPC9wPgorcHVibGljIGtleSB0aGF0IGlzIHVzZWQgd2l0aCBHb29nbGUgUGxheSBsaWNlbnNpbmcuPC9wPgogCi08cD5XaGVuIEFuZHJvaWQgTWFya2V0IHNpZ25zIGEgYmlsbGluZyByZXNwb25zZSwgaXQgaW5jbHVkZXMgdGhlIHNpZ25lZCBKU09OIHN0cmluZyAodW5lbmNyeXB0ZWQpCis8cD5XaGVuIEdvb2dsZSBQbGF5IHNpZ25zIGEgYmlsbGluZyByZXNwb25zZSwgaXQgaW5jbHVkZXMgdGhlIHNpZ25lZCBKU09OIHN0cmluZyAodW5lbmNyeXB0ZWQpCiBhbmQgdGhlIHNpZ25hdHVyZS4gV2hlbiB5b3VyIGFwcGxpY2F0aW9uIHJlY2VpdmVzIHRoaXMgc2lnbmVkIHJlc3BvbnNlIHlvdSBjYW4gdXNlIHRoZSBwdWJsaWMga2V5CiBwb3J0aW9uIG9mIHlvdXIgUlNBIGtleSBwYWlyIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlLiBCeSBwZXJmb3JtaW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24geW91IGNhbgogaGVscCBkZXRlY3QgcmVzcG9uc2VzIHRoYXQgaGF2ZSBiZWVuIHRhbXBlcmVkIHdpdGggb3IgdGhhdCBoYXZlIGJlZW4gc3Bvb2ZlZC4gWW91IGNhbiBwZXJmb3JtIHRoaXMKQEAgLTQzMSw5ICs0MzEsOSBAQAogcmVtb3RlIHNlcnZlciB0aGVuIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBwZXJmb3JtIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIG9uIHRoYXQgc2VydmVyLjwvcD4KIAogPHA+SW4tYXBwIGJpbGxpbmcgYWxzbyB1c2VzIG5vbmNlcyAoYSByYW5kb20gbnVtYmVyIHVzZWQgb25jZSkgdG8gaGVscCB2ZXJpZnkgdGhlIGludGVncml0eSBvZiB0aGUKLXB1cmNoYXNlIGluZm9ybWF0aW9uIHRoYXQncyByZXR1cm5lZCBmcm9tIEFuZHJvaWQgTWFya2V0LiBZb3VyIGFwcGxpY2F0aW9uIG11c3QgZ2VuZXJhdGUgYSBub25jZSBhbmQKK3B1cmNoYXNlIGluZm9ybWF0aW9uIHRoYXQncyByZXR1cm5lZCBmcm9tIEdvb2dsZSBQbGF5LiBZb3VyIGFwcGxpY2F0aW9uIG11c3QgZ2VuZXJhdGUgYSBub25jZSBhbmQKIHNlbmQgaXQgd2l0aCBhIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gcmVxdWVzdCBhbmQgYSA8Y29kZT5SRVNUT1JFX1RSQU5TQUNUSU9OUzwvY29kZT4KLXJlcXVlc3QuIFdoZW4gQW5kcm9pZCBNYXJrZXQgcmVjZWl2ZXMgdGhlIHJlcXVlc3QsIGl0IGFkZHMgdGhlIG5vbmNlIHRvIHRoZSBKU09OIHN0cmluZyB0aGF0CityZXF1ZXN0LiBXaGVuIEdvb2dsZSBQbGF5IHJlY2VpdmVzIHRoZSByZXF1ZXN0LCBpdCBhZGRzIHRoZSBub25jZSB0byB0aGUgSlNPTiBzdHJpbmcgdGhhdAogY29udGFpbnMgdGhlIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uLiBUaGUgSlNPTiBzdHJpbmcgaXMgdGhlbiBzaWduZWQgYW5kIHJldHVybmVkIHRvIHlvdXIKIGFwcGxpY2F0aW9uLiBXaGVuIHlvdXIgYXBwbGljYXRpb24gcmVjZWl2ZXMgdGhlIEpTT04gc3RyaW5nLCB5b3UgbmVlZCB0byB2ZXJpZnkgdGhlIG5vbmNlIGFzIHdlbGwgYXMKIHRoZSBzaWduYXR1cmUgb2YgdGhlIEpTT04gc3RyaW5nLjwvcD4KQEAgLTQ0NywyMCArNDQ3LDIwIEBACiBsaW1pdGF0aW9ucy48L3A+CiAKIDx1bD4KLSAgPGxpPkluLWFwcCBiaWxsaW5nIGNhbiBiZSBpbXBsZW1lbnRlZCBvbmx5IGluIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggQW5kcm9pZAotICBNYXJrZXQuPC9saT4KLSAgPGxpPllvdSBtdXN0IGhhdmUgYSBHb29nbGUgQ2hlY2tvdXQgTWVyY2hhbnQgYWNjb3VudCB0byB1c2UgQW5kcm9pZCBNYXJrZXQgSW4tYXBwIEJpbGxpbmcuPC9saT4KKyAgPGxpPkluLWFwcCBiaWxsaW5nIGNhbiBiZSBpbXBsZW1lbnRlZCBvbmx5IGluIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggR29vZ2xlCisgIFBsYXkuPC9saT4KKyAgPGxpPllvdSBtdXN0IGhhdmUgYSBHb29nbGUgQ2hlY2tvdXQgTWVyY2hhbnQgYWNjb3VudCB0byB1c2UgR29vZ2xlIFBsYXkgSW4tYXBwIEJpbGxpbmcuPC9saT4KICAgPGxpPklmIHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCAzLjAsIGluLWFwcCBiaWxsaW5nIHJlcXVpcmVzIHZlcnNpb24gNS4wLjEyIChvciBoaWdoZXIpIG9mCiAgIHRoZSBNeUFwcHMgYXBwbGljYXRpb24uIElmIHlvdXIgZGV2aWNlIGlzIHJ1bm5pbmcgYW55IG90aGVyIHZlcnNpb24gb2YgQW5kcm9pZCwgaW4tYXBwIGJpbGxpbmcKLSAgcmVxdWlyZXMgdmVyc2lvbiAyLjMuNCAob3IgaGlnaGVyKSBvZiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uPC9saT4KKyAgcmVxdWlyZXMgdmVyc2lvbiAyLjMuNCAob3IgaGlnaGVyKSBvZiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24uPC9saT4KICAgPGxpPkFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgaW4tYXBwIGJpbGxpbmcgb25seSBpZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCAxLjYgKEFQSSBsZXZlbCA0KQogICBvciBoaWdoZXIuPC9saT4KICAgPGxpPllvdSBjYW4gdXNlIGluLWFwcCBiaWxsaW5nIHRvIHNlbGwgb25seSBkaWdpdGFsIGNvbnRlbnQuIFlvdSBjYW5ub3QgdXNlIGluLWFwcCBiaWxsaW5nIHRvIHNlbGwKICAgcGh5c2ljYWwgZ29vZHMsIHBlcnNvbmFsIHNlcnZpY2VzLCBvciBhbnl0aGluZyB0aGF0IHJlcXVpcmVzIHBoeXNpY2FsIGRlbGl2ZXJ5LjwvbGk+Ci0gIDxsaT5BbmRyb2lkIE1hcmtldCBkb2VzIG5vdCBwcm92aWRlIGFueSBmb3JtIG9mIGNvbnRlbnQgZGVsaXZlcnkuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yCisgIDxsaT5Hb29nbGUgUGxheSBkb2VzIG5vdCBwcm92aWRlIGFueSBmb3JtIG9mIGNvbnRlbnQgZGVsaXZlcnkuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yCiAgIGRlbGl2ZXJpbmcgdGhlIGRpZ2l0YWwgY29udGVudCB0aGF0IHlvdSBzZWxsIGluIHlvdXIgYXBwbGljYXRpb25zLjwvbGk+CiAgIDxsaT5Zb3UgY2Fubm90IGltcGxlbWVudCBpbi1hcHAgYmlsbGluZyBvbiBhIGRldmljZSB0aGF0IG5ldmVyIGNvbm5lY3RzIHRvIHRoZSBuZXR3b3JrLiBUbwotICBjb21wbGV0ZSBpbi1hcHAgcHVyY2hhc2UgcmVxdWVzdHMsIGEgZGV2aWNlIG11c3QgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlciBvdmVyCisgIGNvbXBsZXRlIGluLWFwcCBwdXJjaGFzZSByZXF1ZXN0cywgYSBkZXZpY2UgbXVzdCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgR29vZ2xlIFBsYXkgc2VydmVyIG92ZXIKICAgdGhlIG5ldHdvcmsuIDwvbGk+CiA8L3VsPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuamQKaW5kZXggNWE3YmE1Ni4uZThjZjJlZTggMTAwNzU1Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX3JlZmVyZW5jZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19yZWZlcmVuY2UuamQKQEAgLTM2LDIwICszNiwyMCBAQAogPHA+VGhlIGZvbGxvd2luZyBkb2N1bWVudCBwcm92aWRlcyB0ZWNobmljYWwgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgZm9sbG93aW5nOjwvcD4KIAogPHVsPgotICA8bGk+PGEgaHJlZj0iI2JpbGxpbmctY29kZXMiPkFuZHJvaWQgTWFya2V0IFNlcnZlciBSZXNwb25zZSBDb2RlcyBmb3IgSW4tYXBwIEJpbGxpbmc8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNiaWxsaW5nLWNvZGVzIj5Hb29nbGUgUGxheSBTZXJ2ZXIgUmVzcG9uc2UgQ29kZXMgZm9yIEluLWFwcCBCaWxsaW5nPC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSIjYmlsbGluZy1pbnRlcmZhY2UiPkluLWFwcCBCaWxsaW5nIEludGVyZmFjZSBQYXJhbWV0ZXJzPC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSIjYmlsbGluZy1pbnRlbnRzIj5Jbi1hcHAgQmlsbGluZyBCcm9hZGNhc3QgSW50ZW50czwvYT48L2xpPgogPC91bD4KIAotPGgyIGlkPSJiaWxsaW5nLWNvZGVzIj5BbmRyb2lkIE1hcmtldCBTZXJ2ZXIgUmVzcG9uc2UgQ29kZXMgZm9yIEluLWFwcCBCaWxsaW5nPC9oMj4KKzxoMiBpZD0iYmlsbGluZy1jb2RlcyI+R29vZ2xlIFBsYXkgU2VydmVyIFJlc3BvbnNlIENvZGVzIGZvciBJbi1hcHAgQmlsbGluZzwvaDI+CiAKLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgYWxsIG9mIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgY29kZXMgdGhhdCBhcmUgc2VudCBmcm9tIEFuZHJvaWQgTWFya2V0IHRvCi15b3VyIGFwcGxpY2F0aW9uLiBBbmRyb2lkIE1hcmtldCBzZW5kcyB0aGVzZSByZXNwb25zZSBjb2RlcyBhc3luY2hyb25vdXNseSBhcworPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyBhbGwgb2YgdGhlIHNlcnZlciByZXNwb25zZSBjb2RlcyB0aGF0IGFyZSBzZW50IGZyb20gR29vZ2xlIFBsYXkgdG8KK3lvdXIgYXBwbGljYXRpb24uIEdvb2dsZSBQbGF5IHNlbmRzIHRoZXNlIHJlc3BvbnNlIGNvZGVzIGFzeW5jaHJvbm91c2x5IGFzCiA8Y29kZT5yZXNwb25zZV9jb2RlPC9jb2RlPiBleHRyYXMgaW4gdGhlIDxjb2RlPmNvbS5hbmRyb2lkLnZlbmRpbmcuYmlsbGluZy5SRVNQT05TRV9DT0RFPC9jb2RlPgogYnJvYWRjYXN0IGludGVudC4gWW91ciBhcHBsaWNhdGlvbiBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgcmVzcG9uc2UgY29kZXMuPC9wPgogCiA8cCBjbGFzcz0idGFibGUtY2FwdGlvbiIgaWQ9InJlc3BvbnNlLWNvZGVzLXRhYmxlIj48c3Ryb25nPlRhYmxlIDEuPC9zdHJvbmc+IFN1bW1hcnkgb2YgcmVzcG9uc2UKLWNvZGVzIHJldHVybmVkIGJ5IEFuZHJvaWQgTWFya2V0LjwvcD4KK2NvZGVzIHJldHVybmVkIGJ5IEdvb2dsZSBQbGF5LjwvcD4KIAogPHRhYmxlPgogCkBAIC04MCwxMyArODAsMTMgQEAKICAgPHRkPjxjb2RlPlJFU1VMVF9CSUxMSU5HX1VOQVZBSUxBQkxFPC9jb2RlPjwvdGQ+CiAgIDx0ZD4zPC90ZD4KICAgPHRkPkluZGljYXRlcyB0aGF0IGluLWFwcCBiaWxsaW5nIGlzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSB0aGUgPGNvZGU+QVBJX1ZFUlNJT048L2NvZGU+IHRoYXQgeW91Ci0gIHNwZWNpZmllZCBpcyBub3QgcmVjb2duaXplZCBieSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gb3IgdGhlIHVzZXIgaXMgaW5lbGlnaWJsZSBmb3IgaW4tYXBwCisgIHNwZWNpZmllZCBpcyBub3QgcmVjb2duaXplZCBieSB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb3IgdGhlIHVzZXIgaXMgaW5lbGlnaWJsZSBmb3IgaW4tYXBwCiAgIGJpbGxpbmcgKGZvciBleGFtcGxlLCB0aGUgdXNlciByZXNpZGVzIGluIGEgY291bnRyeSB0aGF0IHByb2hpYml0cyBpbi1hcHAgcHVyY2hhc2VzKS48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPlJFU1VMVF9JVEVNX1VOQVZBSUxBQkxFPC9jb2RlPjwvdGQ+CiAgIDx0ZD40PC90ZD4KLSAgPHRkPkluZGljYXRlcyB0aGF0IEFuZHJvaWQgTWFya2V0IGNhbm5vdCBmaW5kIHRoZSByZXF1ZXN0ZWQgaXRlbSBpbiB0aGUgYXBwbGljYXRpb24ncyBwcm9kdWN0CisgIDx0ZD5JbmRpY2F0ZXMgdGhhdCBHb29nbGUgUGxheSBjYW5ub3QgZmluZCB0aGUgcmVxdWVzdGVkIGl0ZW0gaW4gdGhlIGFwcGxpY2F0aW9uJ3MgcHJvZHVjdAogICBsaXN0LiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHByb2R1Y3QgSUQgaXMgbWlzc3BlbGxlZCBpbiB5b3VyIDxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+CiAgIHJlcXVlc3Qgb3IgaWYgYW4gaXRlbSBpcyB1bnB1Ymxpc2hlZCBpbiB0aGUgYXBwbGljYXRpb24ncyBwcm9kdWN0IGxpc3QuPC90ZD4KIDwvdHI+CkBAIC0xMDgsNyArMTA4LDcgQEAKIAogPGgyIGlkPSJiaWxsaW5nLWludGVyZmFjZSI+SW4tYXBwIEJpbGxpbmcgU2VydmljZSBJbnRlcmZhY2U8L2gyPgogCi08cD5UaGUgZm9sbG93aW5nIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgZm9yIEFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZS4gVGhlCis8cD5UaGUgZm9sbG93aW5nIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgZm9yIEdvb2dsZSBQbGF5J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZS4gVGhlCiBpbnRlcmZhY2UgaXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SU1hcmtldEJpbGxpbmdTZXJ2aWNlLmFpZGw8L2NvZGU+IGZpbGUsIHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhlCiBpbi1hcHAgYmlsbGluZyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfaW50ZWdyYXRlLmh0bWwjYmlsbGluZy1kb3dubG9hZCI+c2FtcGxlCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgPHRkPjxjb2RlPmludDwvY29kZT48L3RkPgogICA8dGQ+MTwvdGQ+CiAgIDx0ZD5ZZXM8L3RkPgotICA8dGQ+VGhlIHZlcnNpb24gb2YgQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIHlvdSBhcmUgdXNpbmcuIFRoZSBjdXJyZW50IHZlcnNpb24gaXMKKyAgPHRkPlRoZSB2ZXJzaW9uIG9mIEdvb2dsZSBQbGF5J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSB5b3UgYXJlIHVzaW5nLiBUaGUgY3VycmVudCB2ZXJzaW9uIGlzCiAgIDEuPC90ZD4KIDwvdHI+CiA8dHI+CkBAIC0xNjAsOCArMTYwLDggQEAKICAgPHRkPkFueSB2YWxpZCBwcm9kdWN0IGlkZW50aWZpZXIuPC90ZD4KICAgPHRkPlJlcXVpcmVkIGZvciA8Y29kZT5SRVFVRVNUX1BVUkNIQVNFPC9jb2RlPiByZXF1ZXN0cy48L3RkPgogICA8dGQ+VGhlIHByb2R1Y3QgSUQgb2YgdGhlIGl0ZW0geW91IGFyZSBtYWtpbmcgYSBiaWxsaW5nIHJlcXVlc3QgZm9yLiBFdmVyeSBpbi1hcHAgaXRlbSB0aGF0IHlvdQotICBzZWxsIHVzaW5nIEFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSBtdXN0IGhhdmUgYSB1bmlxdWUgcHJvZHVjdCBJRCwgd2hpY2ggeW91Ci0gIHNwZWNpZnkgb24gdGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlLjwvdGQ+CisgIHNlbGwgdXNpbmcgR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIG11c3QgaGF2ZSBhIHVuaXF1ZSBwcm9kdWN0IElELCB3aGljaCB5b3UKKyAgc3BlY2lmeSBvbiB0aGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUuPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5OT05DRTwvY29kZT48L3RkPgpAQCAtMTcyLDcgKzE3Miw3IEBACiAgIDx0ZD5BIG51bWJlciB1c2VkIG9uY2UuIFlvdXIgYXBwbGljYXRpb24gbXVzdCBnZW5lcmF0ZSBhbmQgc2VuZCBhIG5vbmNlIHdpdGggZWFjaAogICA8Y29kZT5HRVRfUFVSQ0hBU0VfSU5GT1JNQVRJT048L2NvZGU+IGFuZCA8Y29kZT5SRVNUT1JFX1RSQU5TQUNUSU9OUzwvY29kZT4gcmVxdWVzdC4gVGhlIG5vbmNlIGlzCiAgIHJldHVybmVkIHdpdGggdGhlIDxjb2RlPlBVUkNIQVNFX1NUQVRFX0NIQU5HRUQ8L2NvZGU+IGJyb2FkY2FzdCBpbnRlbnQsIHNvIHlvdSBjYW4gdXNlIHRoaXMgdmFsdWUKLSAgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdHJhbnNhY3Rpb24gcmVzcG9uc2VzIGZvcm0gQW5kcm9pZCBNYXJrZXQuPC90ZD4KKyAgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdHJhbnNhY3Rpb24gcmVzcG9uc2VzIGZvcm0gR29vZ2xlIFBsYXkuPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5OT1RJRllfSURTPC9jb2RlPjwvdGQ+CkBAIC0yMDIsMjAgKzIwMiwyMCBAQAogCiA8dWw+CiAgIDxsaT48Y29kZT5DSEVDS19CSUxMSU5HX1NVUFBPUlRFRDwvY29kZT4KLSAgICA8cD5UaGlzIHJlcXVlc3QgdmVyaWZpZXMgdGhhdCB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gc3VwcG9ydHMgaW4tYXBwIGJpbGxpbmcuIFlvdQorICAgIDxwPlRoaXMgcmVxdWVzdCB2ZXJpZmllcyB0aGF0IHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBzdXBwb3J0cyBpbi1hcHAgYmlsbGluZy4gWW91CiAgICAgdXN1YWxseSBzZW5kIHRoaXMgcmVxdWVzdCB3aGVuIHlvdXIgYXBwbGljYXRpb24gZmlyc3Qgc3RhcnRzIHVwLiBUaGlzIHJlcXVlc3QgaXMgdXNlZnVsIGlmIHlvdQogICAgIHdhbnQgdG8gZW5hYmxlIG9yIGRpc2FibGUgY2VydGFpbiBVSSBmZWF0dXJlcyB0aGF0IGFyZSByZWxldmFudCBvbmx5IHRvIGluLWFwcCBiaWxsaW5nLjwvcD4KICAgPC9saT4KICAgPGxpPjxjb2RlPlJFUVVFU1RfUFVSQ0hBU0U8L2NvZGU+Ci0gICAgPHA+VGhpcyByZXF1ZXN0IHNlbmRzIGEgcHVyY2hhc2UgbWVzc2FnZSB0byB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gYW5kIGlzIHRoZSBmb3VuZGF0aW9uCisgICAgPHA+VGhpcyByZXF1ZXN0IHNlbmRzIGEgcHVyY2hhc2UgbWVzc2FnZSB0byB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gYW5kIGlzIHRoZSBmb3VuZGF0aW9uCiAgICAgb2YgaW4tYXBwIGJpbGxpbmcuIFlvdSBzZW5kIHRoaXMgcmVxdWVzdCB3aGVuIGEgdXNlciBpbmRpY2F0ZXMgdGhhdCBoZSBvciBzaGUgd2FudHMgdG8gcHVyY2hhc2UKLSAgICBhbiBpdGVtIGluIHlvdXIgYXBwbGljYXRpb24uIEFuZHJvaWQgTWFya2V0IHRoZW4gaGFuZGxlcyB0aGUgZmluYW5jaWFsIHRyYW5zYWN0aW9uIGJ5IGRpc3BsYXlpbmcKKyAgICBhbiBpdGVtIGluIHlvdXIgYXBwbGljYXRpb24uIEdvb2dsZSBQbGF5IHRoZW4gaGFuZGxlcyB0aGUgZmluYW5jaWFsIHRyYW5zYWN0aW9uIGJ5IGRpc3BsYXlpbmcKICAgICB0aGUgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UuPC9wPgogICA8L2xpPgogICA8bGk+PGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPgogICAgIDxwPlRoaXMgcmVxdWVzdCByZXRyaWV2ZXMgdGhlIGRldGFpbHMgb2YgYSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UuIEEgcHVyY2hhc2Ugc3RhdGUgY2hhbmdlIGNhbgogICAgIG9jY3VyIHdoZW4gYSBwdXJjaGFzZSByZXF1ZXN0IGlzIGJpbGxlZCBzdWNjZXNzZnVsbHkgb3Igd2hlbiBhIHVzZXIgY2FuY2VscyBhIHRyYW5zYWN0aW9uIGR1cmluZwotICAgIGNoZWNrb3V0LiBJdCBjYW4gYWxzbyBvY2N1ciB3aGVuIGEgcHJldmlvdXMgcHVyY2hhc2UgaXMgcmVmdW5kZWQuIEFuZHJvaWQgTWFya2V0IG5vdGlmaWVzIHlvdXIKKyAgICBjaGVja291dC4gSXQgY2FuIGFsc28gb2NjdXIgd2hlbiBhIHByZXZpb3VzIHB1cmNoYXNlIGlzIHJlZnVuZGVkLiBHb29nbGUgUGxheSBub3RpZmllcyB5b3VyCiAgICAgYXBwbGljYXRpb24gd2hlbiBhIHB1cmNoYXNlIGNoYW5nZXMgc3RhdGUsIHNvIHlvdSBvbmx5IG5lZWQgdG8gc2VuZCB0aGlzIHJlcXVlc3Qgd2hlbiB0aGVyZSBpcwogICAgIHRyYW5zYWN0aW9uIGluZm9ybWF0aW9uIHRvIHJldHJpZXZlLjwvcD4KICAgPC9saT4KQEAgLTI5NCw4ICsyOTQsOCBAQAogCiA8aDIgaWQ9ImJpbGxpbmctaW50ZW50cyI+SW4tYXBwIEJpbGxpbmcgQnJvYWRjYXN0IEludGVudHM8L2gyPgogCi08cD5UaGUgZm9sbG93aW5nIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBpbi1hcHAgYmlsbGluZyBicm9hZGNhc3QgaW50ZW50cyB0aGF0IGFyZSBzZW50IGJ5IHRoZSBBbmRyb2lkCi1NYXJrZXQgYXBwbGljYXRpb24uIFRoZXNlIGJyb2FkY2FzdCBpbnRlbnRzIGluZm9ybSB5b3VyIGFwcGxpY2F0aW9uIGFib3V0IGluLWFwcCBiaWxsaW5nIGFjdGlvbnMKKzxwPlRoZSBmb2xsb3dpbmcgc2VjdGlvbiBkZXNjcmliZXMgdGhlIGluLWFwcCBiaWxsaW5nIGJyb2FkY2FzdCBpbnRlbnRzIHRoYXQgYXJlIHNlbnQgYnkgdGhlIEdvb2dsZQorUGxheSBhcHBsaWNhdGlvbi4gVGhlc2UgYnJvYWRjYXN0IGludGVudHMgaW5mb3JtIHlvdXIgYXBwbGljYXRpb24gYWJvdXQgaW4tYXBwIGJpbGxpbmcgYWN0aW9ucwogdGhhdCBoYXZlIG9jY3VycmVkLiBZb3VyIGFwcGxpY2F0aW9uIG11c3QgaW1wbGVtZW50IGEge0BsaW5rIGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcn0gdG8KIHJlY2VpdmUgdGhlc2UgYnJvYWRjYXN0IGludGVudHMsIHN1Y2ggYXMgdGhlIDxjb2RlPkJpbGxpbmdSZWNlaXZlcjwvY29kZT4gdGhhdCdzIHNob3duIGluIHRoZSBpbi1hcHAKIGJpbGxpbmcgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfaW50ZWdyYXRlLmh0bWwjYmlsbGluZy1kb3dubG9hZCI+c2FtcGxlCkBAIC0zMDMsMjEgKzMwMywyMSBAQAogCiA8aDQ+Y29tLmFuZHJvaWQudmVuZGluZy5iaWxsaW5nLlJFU1BPTlNFX0NPREU8L2g0PgogCi08cD5UaGlzIGJyb2FkY2FzdCBpbnRlbnQgY29udGFpbnMgYW4gQW5kcm9pZCBNYXJrZXQgcmVzcG9uc2UgY29kZSwgYW5kIGlzIHNlbnQgYWZ0ZXIgeW91IG1ha2UgYW4KKzxwPlRoaXMgYnJvYWRjYXN0IGludGVudCBjb250YWlucyBhIEdvb2dsZSBQbGF5IHJlc3BvbnNlIGNvZGUsIGFuZCBpcyBzZW50IGFmdGVyIHlvdSBtYWtlIGFuCiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0LiBBIHNlcnZlciByZXNwb25zZSBjb2RlIGNhbiBpbmRpY2F0ZSB0aGF0IGEgYmlsbGluZyByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkKLXNlbnQgdG8gQW5kcm9pZCBNYXJrZXQgb3IgaXQgY2FuIGluZGljYXRlIHRoYXQgc29tZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgYSBiaWxsaW5nIHJlcXVlc3QuIFRoaXMKK3NlbnQgdG8gR29vZ2xlIFBsYXkgb3IgaXQgY2FuIGluZGljYXRlIHRoYXQgc29tZSBlcnJvciBvY2N1cnJlZCBkdXJpbmcgYSBiaWxsaW5nIHJlcXVlc3QuIFRoaXMKIGludGVudCBpcyBub3QgdXNlZCB0byByZXBvcnQgYW55IHB1cmNoYXNlIHN0YXRlIGNoYW5nZXMgKHN1Y2ggYXMgcmVmdW5kIG9yIHB1cmNoYXNlIGluZm9ybWF0aW9uKS4KIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNwb25zZSBjb2RlcyB0aGF0IGFyZSBzZW50IHdpdGggdGhpcyByZXNwb25zZSwgc2VlIDxhCi1ocmVmPSIjYmlsbGluZy1jb2RlcyI+QW5kcm9pZCBNYXJrZXQgUmVzcG9uc2UgQ29kZXMgZm9yIEluLWFwcCBCaWxsaW5nPC9hPi4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbgoraHJlZj0iI2JpbGxpbmctY29kZXMiPkdvb2dsZSBQbGF5IFJlc3BvbnNlIENvZGVzIGZvciBJbi1hcHAgQmlsbGluZzwvYT4uIFRoZSBzYW1wbGUgYXBwbGljYXRpb24KIGFzc2lnbnMgdGhpcyBicm9hZGNhc3QgaW50ZW50IHRvIGEgY29uc3RhbnQgbmFtZWQgPGNvZGU+QUNUSU9OX1JFU1BPTlNFX0NPREU8L2NvZGU+LjwvcD4KIAogPGg1PkV4dHJhczwvaDU+CiAKIDx1bCB0eXBlPSJub25lIj4KICAgPGxpPjxjb2RlPnJlcXVlc3RfaWQ8L2NvZGU+Jm1kYXNoO2EgPGNvZGU+bG9uZzwvY29kZT4gcmVwcmVzZW50aW5nIGEgcmVxdWVzdCBJRC4gQSByZXF1ZXN0IElECi0gIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBiaWxsaW5nIHJlcXVlc3QgYW5kIGlzIHJldHVybmVkIGJ5IEFuZHJvaWQgTWFya2V0IGF0IHRoZSB0aW1lIGEgcmVxdWVzdCBpcworICBpZGVudGlmaWVzIGEgc3BlY2lmaWMgYmlsbGluZyByZXF1ZXN0IGFuZCBpcyByZXR1cm5lZCBieSBHb29nbGUgUGxheSBhdCB0aGUgdGltZSBhIHJlcXVlc3QgaXMKICAgbWFkZS48L2xpPgotICA8bGk+PGNvZGU+cmVzcG9uc2VfY29kZTwvY29kZT4mbWRhc2g7YW4gPGNvZGU+aW50PC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZlcgorICA8bGk+PGNvZGU+cmVzcG9uc2VfY29kZTwvY29kZT4mbWRhc2g7YW4gPGNvZGU+aW50PC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIEdvb2dsZSBQbGF5IHNlcnZlcgogICByZXNwb25zZSBjb2RlLjwvbGk+CiA8L3VsPgogCkBAIC0zMzUsNyArMzM1LDcgQEAKIAogPHVsIHR5cGU9Im5vbmUiPgogICA8bGk+PGNvZGU+bm90aWZpY2F0aW9uX2lkPC9jb2RlPiZtZGFzaDthIDxjb2RlPlN0cmluZzwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBub3RpZmljYXRpb24gSUQgZm9yCi0gIGEgZ2l2ZW4gcHVyY2hhc2Ugc3RhdGUgY2hhbmdlLiBBbmRyb2lkIE1hcmtldCBub3RpZmllcyB5b3Ugd2hlbiB0aGVyZSBpcyBhIHB1cmNoYXNlIHN0YXRlIGNoYW5nZQorICBhIGdpdmVuIHB1cmNoYXNlIHN0YXRlIGNoYW5nZS4gR29vZ2xlIFBsYXkgbm90aWZpZXMgeW91IHdoZW4gdGhlcmUgaXMgYSBwdXJjaGFzZSBzdGF0ZSBjaGFuZ2UKICAgYW5kIHRoZSBub3RpZmljYXRpb24gaW5jbHVkZXMgYSB1bmlxdWUgbm90aWZpY2F0aW9uIElELiBUbyBnZXQgdGhlIGRldGFpbHMgb2YgdGhlIHB1cmNoYXNlIHN0YXRlCiAgIGNoYW5nZSwgeW91IHNlbmQgdGhlIG5vdGlmaWNhdGlvbiBJRCB3aXRoIHRoZSA8Y29kZT5HRVRfUFVSQ0hBU0VfSU5GT1JNQVRJT048L2NvZGU+IHJlcXVlc3QuPC9saT4KIDwvdWw+CkBAIC0zNzUsMTUgKzM3NSwxNSBAQAogPHRyPgogICA8dGQ+bm9uY2U8L3RkPgogICA8dGQ+QSBudW1iZXIgdXNlZCBvbmNlLiBZb3VyIGFwcGxpY2F0aW9uIGdlbmVyYXRlcyB0aGUgbm9uY2UgYW5kIHNlbmRzIGl0IHdpdGggdGhlCi0gIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gcmVxdWVzdC4gQW5kcm9pZCBNYXJrZXQgc2VuZHMgdGhlIG5vbmNlIGJhY2sgYXMgcGFydCBvZiB0aGUKKyAgPGNvZGU+R0VUX1BVUkNIQVNFX0lORk9STUFUSU9OPC9jb2RlPiByZXF1ZXN0LiBHb29nbGUgUGxheSBzZW5kcyB0aGUgbm9uY2UgYmFjayBhcyBwYXJ0IG9mIHRoZQogICBKU09OIHN0cmluZyBzbyB5b3UgY2FuIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBtZXNzYWdlLjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+bm90aWZpY2F0aW9uSWQ8L3RkPgogICA8dGQ+QSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGlzIHNlbnQgd2l0aCBhbiA8Y29kZT5JTl9BUFBfTk9USUZZPC9jb2RlPiBicm9hZGNhc3QgaW50ZW50LiBFYWNoCiAgIDxjb2RlPm5vdGlmaWNhdGlvbklkPC9jb2RlPiBjb3JyZXNwb25kcyB0byBhIHNwZWNpZnkgbWVzc2FnZSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgcmV0cmlldmVkIG9uCi0gIHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIuIFlvdXIgYXBwbGljYXRpb24gc2VuZHMgYmFjayB0aGUgPGNvZGU+bm90aWZpY2F0aW9uSWQ8L2NvZGU+IHdpdGggdGhlCi0gIDxjb2RlPkdFVF9QVVJDSEFTRV9JTkZPUk1BVElPTjwvY29kZT4gbWVzc2FnZSBzbyBBbmRyb2lkIE1hcmtldCBjYW4gZGV0ZXJtaW5lIHdoaWNoIG1lc3NhZ2VzIHlvdQorICB0aGUgR29vZ2xlIFBsYXkgc2VydmVyLiBZb3VyIGFwcGxpY2F0aW9uIHNlbmRzIGJhY2sgdGhlIDxjb2RlPm5vdGlmaWNhdGlvbklkPC9jb2RlPiB3aXRoIHRoZQorICA8Y29kZT5HRVRfUFVSQ0hBU0VfSU5GT1JNQVRJT048L2NvZGU+IG1lc3NhZ2Ugc28gR29vZ2xlIFBsYXkgY2FuIGRldGVybWluZSB3aGljaCBtZXNzYWdlcyB5b3UKICAgYXJlIHJldHJpZXZpbmcuPC90ZD4KIDwvdHI+CiA8dHI+CkBAIC0zOTgsNyArMzk4LDcgQEAKIDx0cj4KICAgPHRkPnByb2R1Y3RJZDwvdGQ+CiAgIDx0ZD5UaGUgaXRlbSdzIHByb2R1Y3QgaWRlbnRpZmllci4gRXZlcnkgaXRlbSBoYXMgYSBwcm9kdWN0IElELCB3aGljaCB5b3UgbXVzdCBzcGVjaWZ5IGluIHRoZQotICBhcHBsaWNhdGlvbidzIHByb2R1Y3QgbGlzdCBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUuPC90ZD4KKyAgYXBwbGljYXRpb24ncyBwcm9kdWN0IGxpc3Qgb24gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlLjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+cHVyY2hhc2VUaW1lPC90ZD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX3Rlc3RpbmcuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ190ZXN0aW5nLmpkCmluZGV4IDU0NTMwNDcuLjc3YWEzZWQgMTAwNzU1Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX3Rlc3RpbmcuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfdGVzdGluZy5qZApAQCAtMzIsMTYgKzMyLDE2IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUgcHJvdmlkZXMgc2V2ZXJhbCB0b29scyB0aGF0IGhlbHAgeW91IHRlc3QgeW91ciBpbi1hcHAgYmlsbGluZworPHA+VGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlIHByb3ZpZGVzIHNldmVyYWwgdG9vbHMgdGhhdCBoZWxwIHlvdSB0ZXN0IHlvdXIgaW4tYXBwIGJpbGxpbmcKIGltcGxlbWVudGF0aW9uIGJlZm9yZSBpdCBpcyBwdWJsaXNoZWQuIFlvdSBjYW4gdXNlIHRoZXNlIHRvb2xzIHRvIGNyZWF0ZSB0ZXN0IGFjY291bnRzIGFuZCBwdXJjaGFzZQogc3BlY2lhbCByZXNlcnZlZCBpdGVtcyB0aGF0IHNlbmQgc3RhdGljIGJpbGxpbmcgcmVzcG9uc2VzIHRvIHlvdXIgYXBwbGljYXRpb24uPC9wPgogCiA8cD5UbyB0ZXN0IGluLWFwcCBiaWxsaW5nIGluIGFuIGFwcGxpY2F0aW9uIHlvdSBtdXN0IGluc3RhbGwgdGhlIGFwcGxpY2F0aW9uIG9uIGFuIEFuZHJvaWQtcG93ZXJlZAogZGV2aWNlLiBZb3UgY2Fubm90IHVzZSB0aGUgQW5kcm9pZCBlbXVsYXRvciB0byB0ZXN0IGluLWFwcCBiaWxsaW5nLiAgVGhlIGRldmljZSB5b3UgdXNlIGZvciB0ZXN0aW5nCiBtdXN0IHJ1biBhIHN0YW5kYXJkIHZlcnNpb24gb2YgdGhlIEFuZHJvaWQgMS42IG9yIGxhdGVyIHBsYXRmb3JtIChBUEkgbGV2ZWwgNCBvciBoaWdoZXIpLCBhbmQgaGF2ZQotdGhlIG1vc3QgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBpbnN0YWxsZWQuIElmIGEgZGV2aWNlIGlzIG5vdCBydW5uaW5nIHRoZQotbW9zdCBjdXJyZW50IEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIHdvbid0IGJlIGFibGUgdG8gc2VuZCBpbi1hcHAgYmlsbGluZwotcmVxdWVzdHMgdG8gQW5kcm9pZCBNYXJrZXQuIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBzZXQgdXAgYSBkZXZpY2UgZm9yIHVzZSBpbgordGhlIG1vc3QgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBpbnN0YWxsZWQuIElmIGEgZGV2aWNlIGlzIG5vdCBydW5uaW5nIHRoZQorbW9zdCBjdXJyZW50IEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLCB5b3VyIGFwcGxpY2F0aW9uIHdvbid0IGJlIGFibGUgdG8gc2VuZCBpbi1hcHAgYmlsbGluZworcmVxdWVzdHMgdG8gR29vZ2xlIFBsYXkuIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBzZXQgdXAgYSBkZXZpY2UgZm9yIHVzZSBpbgogZGV2ZWxvcGluZyBBbmRyb2lkIGFwcGxpY2F0aW9ucywgc2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL2RldmljZS5odG1sIj5Vc2luZyBIYXJkd2FyZQogRGV2aWNlczwvYT4uPC9wPgogCkBAIC01MCwxMiArNTAsMTIgQEAKIDxoMiBpZD0iYmlsbGluZy10ZXN0aW5nLXN0YXRpYyI+VGVzdGluZyBpbi1hcHAgcHVyY2hhc2VzIHdpdGggc3RhdGljIHJlc3BvbnNlczwvaDI+CiAKIDxwPldlIHJlY29tbWVuZCB0aGF0IHlvdSBmaXJzdCB0ZXN0IHlvdXIgaW4tYXBwIGJpbGxpbmcgaW1wbGVtZW50YXRpb24gdXNpbmcgc3RhdGljIHJlc3BvbnNlcyBmcm9tCi1BbmRyb2lkIE1hcmtldC4gVGhpcyBlbmFibGVzIHlvdSB0byB2ZXJpZnkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGlzIGhhbmRsaW5nIHRoZSBwcmltYXJ5IEFuZHJvaWQKLU1hcmtldCByZXNwb25zZXMgY29ycmVjdGx5IGFuZCB0aGF0IHlvdXIgYXBwbGljYXRpb24gaXMgYWJsZSB0byB2ZXJpZnkgc2lnbmF0dXJlcyBjb3JyZWN0bHkuPC9wPgorR29vZ2xlIFBsYXkuIFRoaXMgZW5hYmxlcyB5b3UgdG8gdmVyaWZ5IHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpcyBoYW5kbGluZyB0aGUgcHJpbWFyeSBHb29nbGUKK1BsYXkgcmVzcG9uc2VzIGNvcnJlY3RseSBhbmQgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGlzIGFibGUgdG8gdmVyaWZ5IHNpZ25hdHVyZXMgY29ycmVjdGx5LjwvcD4KIAogPHA+VG8gdGVzdCB5b3VyIGltcGxlbWVudGF0aW9uIHdpdGggc3RhdGljIHJlc3BvbnNlcywgeW91IG1ha2UgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCB1c2luZyBhCiBzcGVjaWFsIGl0ZW0gdGhhdCBoYXMgYSByZXNlcnZlZCBwcm9kdWN0IElELiBFYWNoIHJlc2VydmVkIHByb2R1Y3QgSUQgcmV0dXJucyBhIHNwZWNpZmljIHN0YXRpYwotcmVzcG9uc2UgZnJvbSBBbmRyb2lkIE1hcmtldC4gTm8gbW9uZXkgaXMgdHJhbnNmZXJyZWQgd2hlbiB5b3UgbWFrZSBpbi1hcHAgYmlsbGluZyByZXF1ZXN0cyB3aXRoIHRoZQorcmVzcG9uc2UgZnJvbSBHb29nbGUgUGxheS4gTm8gbW9uZXkgaXMgdHJhbnNmZXJyZWQgd2hlbiB5b3UgbWFrZSBpbi1hcHAgYmlsbGluZyByZXF1ZXN0cyB3aXRoIHRoZQogcmVzZXJ2ZWQgcHJvZHVjdCBJRHMuIEFsc28sIHlvdSBjYW5ub3Qgc3BlY2lmeSB0aGUgZm9ybSBvZiBwYXltZW50IHdoZW4geW91IG1ha2UgYSBiaWxsaW5nIHJlcXVlc3QKIHdpdGggYSByZXNlcnZlZCBwcm9kdWN0IElELiBGaWd1cmUgMSBzaG93cyB0aGUgY2hlY2tvdXQgZmxvdyBmb3IgdGhlIHJlc2VydmVkIGl0ZW0gdGhhdCBoYXMgdGhlCiBwcm9kdWN0IElEIGFuZHJvaWQudGVzdC5wdXJjaGFzZWQuPC9wPgpAQCAtNjUsNyArNjUsNyBAQAogICA8c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBDaGVja291dCBmbG93IGZvciB0aGUgc3BlY2lhbCByZXNlcnZlZCBpdGVtIGFuZHJvaWQudGVzdC5wdXJjaGFzZWQuCiA8L3A+CiAKLTxwPllvdSBkbyBub3QgbmVlZCB0byBsaXN0IHRoZSByZXNlcnZlZCBwcm9kdWN0cyBpbiB5b3VyIGFwcGxpY2F0aW9uJ3MgcHJvZHVjdCBsaXN0LiBBbmRyb2lkIE1hcmtldAorPHA+WW91IGRvIG5vdCBuZWVkIHRvIGxpc3QgdGhlIHJlc2VydmVkIHByb2R1Y3RzIGluIHlvdXIgYXBwbGljYXRpb24ncyBwcm9kdWN0IGxpc3QuIEdvb2dsZSBQbGF5CiBhbHJlYWR5IGtub3dzIGFib3V0IHRoZSByZXNlcnZlZCBwcm9kdWN0IElEcy4gQWxzbywgeW91IGRvIG5vdCBuZWVkIHRvIHVwbG9hZCB5b3VyIGFwcGxpY2F0aW9uIHRvCiB0aGUgcHVibGlzaGVyIHNpdGUgdG8gcGVyZm9ybSBzdGF0aWMgcmVzcG9uc2UgdGVzdHMgd2l0aCB0aGUgcmVzZXJ2ZWQgcHJvZHVjdCBJRHMuIFlvdSBjYW4gc2ltcGx5CiBpbnN0YWxsIHlvdXIgYXBwbGljYXRpb24gb24gYSBkZXZpY2UsIGxvZyBpbnRvIHRoZSBkZXZpY2UsIGFuZCBtYWtlIGJpbGxpbmcgcmVxdWVzdHMgdXNpbmcgdGhlCkBAIC03NSwyNCArNzUsMjQgQEAKIAogPHVsPgogICA8bGk+PHN0cm9uZz5hbmRyb2lkLnRlc3QucHVyY2hhc2VkPC9zdHJvbmc+Ci0gICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElELCBBbmRyb2lkIE1hcmtldCByZXNwb25kcyBhcworICAgIDxwPldoZW4geW91IG1ha2UgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCB3aXRoIHRoaXMgcHJvZHVjdCBJRCwgR29vZ2xlIFBsYXkgcmVzcG9uZHMgYXMKICAgICB0aG91Z2ggeW91IHN1Y2Nlc3NmdWxseSBwdXJjaGFzZWQgYW4gaXRlbS4gVGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgSlNPTiBzdHJpbmcsIHdoaWNoIGNvbnRhaW5zCiAgICAgZmFrZSBwdXJjaGFzZSBpbmZvcm1hdGlvbiAoZm9yIGV4YW1wbGUsIGEgZmFrZSBvcmRlciBJRCkuIEluIHNvbWUgY2FzZXMsIHRoZSBKU09OIHN0cmluZyBpcwogICAgIHNpZ25lZCBhbmQgdGhlIHJlc3BvbnNlIGluY2x1ZGVzIHRoZSBzaWduYXR1cmUgc28geW91IGNhbiB0ZXN0IHlvdXIgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbgogICAgIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZXNlIHJlc3BvbnNlcy48L3A+CiAgIDwvbGk+CiAgIDxsaT48c3Ryb25nPmFuZHJvaWQudGVzdC5jYW5jZWxlZDwvc3Ryb25nPgotICAgIDxwPldoZW4geW91IG1ha2UgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCB3aXRoIHRoaXMgcHJvZHVjdCBJRCBBbmRyb2lkIE1hcmtldCByZXNwb25kcyBhcworICAgIDxwPldoZW4geW91IG1ha2UgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCB3aXRoIHRoaXMgcHJvZHVjdCBJRCBHb29nbGUgUGxheSByZXNwb25kcyBhcwogICAgIHRob3VnaCB0aGUgcHVyY2hhc2Ugd2FzIGNhbmNlbGVkLiBUaGlzIGNhbiBvY2N1ciB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIGluIHRoZSBvcmRlcgogICAgIHByb2Nlc3MsIHN1Y2ggYXMgYW4gaW52YWxpZCBjcmVkaXQgY2FyZCwgb3Igd2hlbiB5b3UgY2FuY2VsIGEgdXNlcidzIG9yZGVyIGJlZm9yZSBpdCBpcwogICAgIGNoYXJnZWQuPC9wPgogICA8L2xpPgogICA8bGk+PHN0cm9uZz5hbmRyb2lkLnRlc3QucmVmdW5kZWQ8L3N0cm9uZz4KLSAgICA8cD5XaGVuIHlvdSBtYWtlIGFuIGluLWFwcCBiaWxsaW5nIHJlcXVlc3Qgd2l0aCB0aGlzIHByb2R1Y3QgSUQsIEFuZHJvaWQgTWFya2V0IHJlc3BvbmRzIGFzCi0gICAgdGhvdWdoIHRoZSBwdXJjaGFzZSB3YXMgcmVmdW5kZWQuIFJlZnVuZHMgY2Fubm90IGJlIGluaXRpYXRlZCB0aHJvdWdoIEFuZHJvaWQgTWFya2V0J3MgaW4tYXBwCisgICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElELCBHb29nbGUgUGxheSByZXNwb25kcyBhcworICAgIHRob3VnaCB0aGUgcHVyY2hhc2Ugd2FzIHJlZnVuZGVkLiBSZWZ1bmRzIGNhbm5vdCBiZSBpbml0aWF0ZWQgdGhyb3VnaCBHb29nbGUgUGxheSdzIGluLWFwcAogICAgIGJpbGxpbmcgc2VydmljZS4gUmVmdW5kcyBtdXN0IGJlIGluaXRpYXRlZCBieSB5b3UgKHRoZSBtZXJjaGFudCkuIEFmdGVyIHlvdSBwcm9jZXNzIGEgcmVmdW5kCiAgICAgcmVxdWVzdCB0aHJvdWdoIHlvdXIgR29vZ2xlIENoZWNrb3V0IGFjY291bnQsIGEgcmVmdW5kIG1lc3NhZ2UgaXMgc2VudCB0byB5b3VyIGFwcGxpY2F0aW9uIGJ5Ci0gICAgQW5kcm9pZCBNYXJrZXQuIFRoaXMgb2NjdXJzIG9ubHkgd2hlbiBBbmRyb2lkIE1hcmtldCBnZXRzIG5vdGlmaWNhdGlvbiBmcm9tIEdvb2dsZSBDaGVja291dCB0aGF0CisgICAgR29vZ2xlIFBsYXkuIFRoaXMgb2NjdXJzIG9ubHkgd2hlbiBHb29nbGUgUGxheSBnZXRzIG5vdGlmaWNhdGlvbiBmcm9tIEdvb2dsZSBDaGVja291dCB0aGF0CiAgICAgYSByZWZ1bmQgaGFzIGJlZW4gbWFkZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcmVmdW5kcywgc2VlIDxhCiAgICAgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfb3ZlcnZpZXcuaHRtbCNiaWxsaW5nLWFjdGlvbi1ub3RpZnkiPkhhbmRsaW5nCiAgICAgSU5fQVBQX05PVElGWSBtZXNzYWdlczwvYT4gYW5kIDxhCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICBQcmljaW5nPC9hPi48L3A+CiAgIDwvbGk+CiAgIDxsaT48c3Ryb25nPmFuZHJvaWQudGVzdC5pdGVtX3VuYXZhaWxhYmxlPC9zdHJvbmc+Ci0gICAgPHA+V2hlbiB5b3UgbWFrZSBhbiBpbi1hcHAgYmlsbGluZyByZXF1ZXN0IHdpdGggdGhpcyBwcm9kdWN0IElELCBBbmRyb2lkIE1hcmtldCByZXNwb25kcyBhcworICAgIDxwPldoZW4geW91IG1ha2UgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCB3aXRoIHRoaXMgcHJvZHVjdCBJRCwgR29vZ2xlIFBsYXkgcmVzcG9uZHMgYXMKICAgICB0aG91Z2ggdGhlIGl0ZW0gYmVpbmcgcHVyY2hhc2VkIHdhcyBub3QgbGlzdGVkIGluIHlvdXIgYXBwbGljYXRpb24ncyBwcm9kdWN0IGxpc3QuPC9wPgogICA8L2xpPgogPC91bD4KQEAgLTE4NSwyMCArMTg1LDIwIEBACiAgICAgPHA+WW91IGRvIG5vdCBuZWVkIHRvIHVzZSBhIHRlc3QgYWNjb3VudCBpZiB5b3UgYXJlIHRlc3Rpbmcgb25seSB3aXRoIHRoZSByZXNlcnZlZCBwcm9kdWN0CiAgICAgSURzLjwvcD4KICAgPC9saT4KLSAgPGxpPjxzdHJvbmc+VmVyaWZ5IHRoYXQgeW91ciBkZXZpY2UgaXMgcnVubmluZyBhIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIE1hcmtldAorICA8bGk+PHN0cm9uZz5WZXJpZnkgdGhhdCB5b3VyIGRldmljZSBpcyBydW5uaW5nIGEgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhlIEdvb2dsZSBQbGF5CiAgIGFwcGxpY2F0aW9uIG9yIHRoZSBNeUFwcHMgYXBwbGljYXRpb24uPC9zdHJvbmc+CiAgICAgPHA+SWYgeW91ciBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkIDMuMCwgaW4tYXBwIGJpbGxpbmcgcmVxdWlyZXMgdmVyc2lvbiA1LjAuMTIgKG9yIGhpZ2hlcikgb2YKICAgICB0aGUgTXlBcHBzIGFwcGxpY2F0aW9uLiBJZiB5b3VyIGRldmljZSBpcyBydW5uaW5nIGFueSBvdGhlciB2ZXJzaW9uIG9mIEFuZHJvaWQsIGluLWFwcCBiaWxsaW5nCi0gICAgcmVxdWlyZXMgdmVyc2lvbiAyLjMuNCAob3IgaGlnaGVyKSBvZiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uIFRvIGxlYXJuIGhvdyB0byBjaGVjayB0aGUKLSAgICB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiwgc2VlIDxhCi0gICAgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTE5MDg2MCI+VXBkYXRpbmcgQW5kcm9pZAotICAgIE1hcmtldDwvYT4uPC9wPgorICAgIHJlcXVpcmVzIHZlcnNpb24gMi4zLjQgKG9yIGhpZ2hlcikgb2YgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLiBUbyBsZWFybiBob3cgdG8gY2hlY2sgdGhlCisgICAgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24sIHNlZSA8YQorICAgIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xOTA4NjAiPlVwZGF0aW5nIEdvb2dsZQorICAgIFBsYXk8L2E+LjwvcD4KICAgPC9saT4KICAgPGxpPjxzdHJvbmc+UnVuIHlvdXIgYXBwbGljYXRpb24gYW5kIHB1cmNoYXNlIHRoZSByZXNlcnZlZCBwcm9kdWN0IElEcy48L3N0cm9uZz48L2xpPgogPC9vbD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogTWFraW5nIGluLWFwcCBiaWxsaW5nIHJlcXVlc3RzIHdpdGggdGhlIHJlc2VydmVkIHByb2R1Y3QgSURzCi1vdmVycmlkZXMgdGhlIHVzdWFsIEFuZHJvaWQgTWFya2V0IHByb2R1Y3Rpb24gc3lzdGVtLiBXaGVuIHlvdSBzZW5kIGFuIGluLWFwcCBiaWxsaW5nIHJlcXVlc3QgZm9yIGEKK292ZXJyaWRlcyB0aGUgdXN1YWwgR29vZ2xlIFBsYXkgcHJvZHVjdGlvbiBzeXN0ZW0uIFdoZW4geW91IHNlbmQgYW4gaW4tYXBwIGJpbGxpbmcgcmVxdWVzdCBmb3IgYQogcmVzZXJ2ZWQgcHJvZHVjdCBJRCwgdGhlIHF1YWxpdHkgb2Ygc2VydmljZSB3aWxsIG5vdCBiZSBjb21wYXJhYmxlIHRvIHRoZSBwcm9kdWN0aW9uCiBlbnZpcm9ubWVudC48L3A+CiAKQEAgLTIwNyw3ICsyMDcsNyBAQAogPHA+QWZ0ZXIgeW91IGZpbmlzaCB5b3VyIHN0YXRpYyByZXNwb25zZSB0ZXN0aW5nLCBhbmQgeW91IHZlcmlmeSB0aGF0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gaXMKIHdvcmtpbmcgaW4geW91ciBhcHBsaWNhdGlvbiwgeW91IGNhbiB0ZXN0IHlvdXIgaW4tYXBwIGJpbGxpbmcgaW1wbGVtZW50YXRpb24gYnkgbWFraW5nIGFjdHVhbCBpbi1hcHAKIHB1cmNoYXNlcy4gVGVzdGluZyByZWFsIGluLWFwcCBwdXJjaGFzZXMgZW5hYmxlcyB5b3UgdG8gdGVzdCB0aGUgZW5kLXRvLWVuZCBpbi1hcHAgYmlsbGluZwotZXhwZXJpZW5jZSwgaW5jbHVkaW5nIHRoZSBhY3R1YWwgcmVzcG9uc2VzIGZyb20gQW5kcm9pZCBNYXJrZXQgYW5kIHRoZSBhY3R1YWwgY2hlY2tvdXQgZmxvdyB0aGF0CitleHBlcmllbmNlLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCByZXNwb25zZXMgZnJvbSBHb29nbGUgUGxheSBhbmQgdGhlIGFjdHVhbCBjaGVja291dCBmbG93IHRoYXQKIHVzZXJzIHdpbGwgZXhwZXJpZW5jZSBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogWW91IGRvIG5vdCBuZWVkIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiB0byBkbyBlbmQtdG8tZW5kCkBAIC0yMTUsNyArMjE1LDcgQEAKIHRlc3RpbmcuPC9wPgogCiA8cD5UbyB0ZXN0IHlvdXIgaW4tYXBwIGJpbGxpbmcgaW1wbGVtZW50YXRpb24gd2l0aCBhY3R1YWwgaW4tYXBwIHB1cmNoYXNlcywgeW91IHdpbGwgbmVlZCB0bwotcmVnaXN0ZXIgYXQgbGVhc3Qgb25lIHRlc3QgYWNjb3VudCBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUuIFlvdSBjYW5ub3QgdXNlIHlvdXIKK3JlZ2lzdGVyIGF0IGxlYXN0IG9uZSB0ZXN0IGFjY291bnQgb24gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlLiBZb3UgY2Fubm90IHVzZSB5b3VyCiBkZXZlbG9wZXIgYWNjb3VudCB0byB0ZXN0IHRoZSBjb21wbGV0ZSBpbi1hcHAgcHVyY2hhc2UgcHJvY2VzcyBiZWNhdXNlIEdvb2dsZSBDaGVja291dCBkb2VzIG5vdCBsZXQKIHlvdSBidXkgaXRlbXMgZnJvbSB5b3Vyc2VsZi4gSWYgeW91IGhhdmUgbm90IHNldCB1cCB0ZXN0IGFjY291bnRzIGJlZm9yZSwgc2VlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvYmlsbGluZ19hZG1pbi5odG1sI2JpbGxpbmctdGVzdGluZy1zZXR1cCI+U2V0dGluZyB1cCB0ZXN0CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICBJRHM7IHlvdSBvbmx5IG5lZWQgdG8gdXBsb2FkIHlvdXIgYXBwbGljYXRpb24gYXMgYSBkcmFmdCBhcHBsaWNhdGlvbi4gSG93ZXZlciwgeW91IG11c3Qgc2lnbgogICAgIHlvdXIgYXBwbGljYXRpb24gd2l0aCB5b3VyIHJlbGVhc2Uga2V5IGJlZm9yZSB5b3UgdXBsb2FkIGl0IGFzIGEgZHJhZnQgYXBwbGljYXRpb24uIEFsc28sIHRoZQogICAgIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB1cGxvYWRlZCBhcHBsaWNhdGlvbiBtdXN0IG1hdGNoIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgYXBwbGljYXRpb24geW91Ci0gICAgbG9hZCB0byB5b3VyIGRldmljZSBmb3IgdGVzdGluZy4gVG8gbGVhcm4gaG93IHRvIHVwbG9hZCBhbiBhcHBsaWNhdGlvbiB0byBBbmRyb2lkIE1hcmtldCwgc2VlCisgICAgbG9hZCB0byB5b3VyIGRldmljZSBmb3IgdGVzdGluZy4gVG8gbGVhcm4gaG93IHRvIHVwbG9hZCBhbiBhcHBsaWNhdGlvbiB0byBHb29nbGUgUGxheSwgc2VlCiAgICAgPGEgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTExMzQ2OSI+VXBsb2FkaW5nCiAgICAgYXBwbGljYXRpb25zPC9hPi48L3A+CiAgIDwvbGk+CkBAIC0yNTcsNyArMjU3LDcgQEAKICAgICA8cD5UbyBwZXJmb3JtIGVuZC10by1lbmQgdGVzdGluZyBvZiBpbi1hcHAgYmlsbGluZywgdGhlIHByaW1hcnkgYWNjb3VudCBvbiB5b3VyIGRldmljZSBtdXN0IGJlCiAgICAgb25lIG9mIHRoZSA8YQogICAgIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX2FkbWluLmh0bWwjYmlsbGluZy10ZXN0aW5nLXNldHVwIj50ZXN0IGFjY291bnRzPC9hPgotICAgIHRoYXQgeW91IHJlZ2lzdGVyZWQgb24gdGhlIEFuZHJvaWQgTWFya2V0IHNpdGUuIElmIHRoZSBwcmltYXJ5IGFjY291bnQgb24geW91ciBkZXZpY2UgaXMgbm90IGEKKyAgICB0aGF0IHlvdSByZWdpc3RlcmVkIG9uIHRoZSBHb29nbGUgUGxheSBzaXRlLiBJZiB0aGUgcHJpbWFyeSBhY2NvdW50IG9uIHlvdXIgZGV2aWNlIGlzIG5vdCBhCiAgICAgdGVzdCBhY2NvdW50LCB5b3UgbXVzdCBkbyBhIGZhY3RvcnkgcmVzZXQgb2YgdGhlIGRldmljZSBhbmQgdGhlbiBzaWduIGluIHdpdGggb25lIG9mIHlvdXIgdGVzdAogICAgIGFjY291bnRzLiBUbyBwZXJmb3JtIGEgZmFjdG9yeSByZXNldCwgZG8gdGhlIGZvbGxvd2luZzo8L3A+CiAgICAgPG9sPgpAQCAtMjY5LDE0ICsyNjksMTQgQEAKICAgICAgIGRldmljZSBzZXR1cCBwcm9jZXNzLjwvbGk+CiAgICAgPC9vbD4KICAgPC9saT4KLSAgPGxpPjxzdHJvbmc+VmVyaWZ5IHRoYXQgeW91ciBkZXZpY2UgaXMgcnVubmluZyBhIHN1cHBvcnRlZCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIE1hcmtldAorICA8bGk+PHN0cm9uZz5WZXJpZnkgdGhhdCB5b3VyIGRldmljZSBpcyBydW5uaW5nIGEgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhlIEdvb2dsZSBQbGF5CiAgIGFwcGxpY2F0aW9uIG9yIHRoZSBNeUFwcHMgYXBwbGljYXRpb24uPC9zdHJvbmc+CiAgICAgPHA+SWYgeW91ciBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkIDMuMCwgaW4tYXBwIGJpbGxpbmcgcmVxdWlyZXMgdmVyc2lvbiA1LjAuMTIgKG9yIGhpZ2hlcikgb2YKICAgICB0aGUgTXlBcHBzIGFwcGxpY2F0aW9uLiBJZiB5b3VyIGRldmljZSBpcyBydW5uaW5nIGFueSBvdGhlciB2ZXJzaW9uIG9mIEFuZHJvaWQsIGluLWFwcCBiaWxsaW5nCi0gICAgcmVxdWlyZXMgdmVyc2lvbiAyLjMuNCAob3IgaGlnaGVyKSBvZiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24uIFRvIGxlYXJuIGhvdyB0byBjaGVjayB0aGUKLSAgICB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiwgc2VlIDxhCi0gICAgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zdXBwb3J0L2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTE5MDg2MCI+VXBkYXRpbmcgQW5kcm9pZAotICAgIE1hcmtldDwvYT4uPC9wPgorICAgIHJlcXVpcmVzIHZlcnNpb24gMi4zLjQgKG9yIGhpZ2hlcikgb2YgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uLiBUbyBsZWFybiBob3cgdG8gY2hlY2sgdGhlCisgICAgdmVyc2lvbiBvZiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24sIHNlZSA8YQorICAgIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc3VwcG9ydC9iaW4vYW5zd2VyLnB5P2Fuc3dlcj0xOTA4NjAiPlVwZGF0aW5nIEdvb2dsZQorICAgIFBsYXk8L2E+LjwvcD4KICAgPC9saT4KICAgPGxpPjxzdHJvbmc+TWFrZSBpbi1hcHAgcHVyY2hhc2VzIGluIHlvdXIgYXBwbGljYXRpb24uPC9zdHJvbmc+PC9saT4KIDwvb2w+CkBAIC0yODUsNyArMjg1LDcgQEAKIGRvIGEgZmFjdG9yeSByZXNldCwgbWFraW5nIHN1cmUgeW91IGxvZyBvbiB3aXRoIHlvdXIgcHJpbWFyeSBhY2NvdW50IGZpcnN0LjwvcD4KIAogPHA+V2hlbiB5b3UgYXJlIGZpbmlzaGVkIHRlc3RpbmcgeW91ciBpbi1hcHAgYmlsbGluZyBpbXBsZW1lbnRhdGlvbiwgeW91IGFyZSByZWFkeSB0bwotcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LiBZb3UgY2FuIGZvbGxvdyB0aGUgbm9ybWFsIHN0ZXBzIGZvciA8YQorcHVibGlzaCB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiBZb3UgY2FuIGZvbGxvdyB0aGUgbm9ybWFsIHN0ZXBzIGZvciA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHJlcGFyaW5nLmh0bWwiPnByZXBhcmluZzwvYT4sIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5odG1sIj5zaWduaW5nPC9hPiwgYW5kIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPnB1Ymxpc2hpbmcgeW91ciBhcHBsaWNhdGlvbjwvYT4uCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvaW5kZXguamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2JpbGxpbmcvaW5kZXguamQKaW5kZXggZmRmYTZmYS4uMDM2NzYxZiAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9iaWxsaW5nL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvYmlsbGluZy9pbmRleC5qZApAQCAtMzAsMTggKzMwLDE4IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5BbmRyb2lkIE1hcmtldCBJbi1hcHAgQmlsbGluZyBpcyBhbiBBbmRyb2lkIE1hcmtldCBzZXJ2aWNlIHRoYXQgbGV0cyB5b3Ugc2VsbCBkaWdpdGFsIGNvbnRlbnQgaW4KKzxwPkdvb2dsZSBQbGF5IEluLWFwcCBCaWxsaW5nIGlzIGEgR29vZ2xlIFBsYXkgc2VydmljZSB0aGF0IGxldHMgeW91IHNlbGwgZGlnaXRhbCBjb250ZW50IGluCiB5b3VyIGFwcGxpY2F0aW9ucy4gWW91IGNhbiB1c2UgdGhlIHNlcnZpY2UgdG8gc2VsbCBhIHdpZGUgcmFuZ2Ugb2YgY29udGVudCwgaW5jbHVkaW5nIGRvd25sb2FkYWJsZQogY29udGVudCBzdWNoIGFzIG1lZGlhIGZpbGVzIG9yIHBob3RvcywgYW5kIHZpcnR1YWwgY29udGVudCBzdWNoIGFzIGdhbWUgbGV2ZWxzIG9yIHBvdGlvbnMuPC9wPgogCi08cD5XaGVuIHlvdSB1c2UgQW5kcm9pZCBNYXJrZXQncyBpbi1hcHAgYmlsbGluZyBzZXJ2aWNlIHRvIHNlbGwgYW4gaXRlbSwgQW5kcm9pZCBNYXJrZXQgaGFuZGxlcyBhbGwKKzxwPldoZW4geW91IHVzZSBHb29nbGUgUGxheSdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgdG8gc2VsbCBhbiBpdGVtLCBHb29nbGUgUGxheSBoYW5kbGVzIGFsbAogY2hlY2tvdXQgZGV0YWlscyBzbyB5b3VyIGFwcGxpY2F0aW9uIG5ldmVyIGhhcyB0byBkaXJlY3RseSBwcm9jZXNzIGFueSBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zLgotQW5kcm9pZCBNYXJrZXQgdXNlcyB0aGUgc2FtZSBjaGVja291dCBzZXJ2aWNlIHRoYXQgaXMgdXNlZCBmb3IgYXBwbGljYXRpb24gcHVyY2hhc2VzLCBzbyB5b3VyIHVzZXJzCitHb29nbGUgUGxheSB1c2VzIHRoZSBzYW1lIGNoZWNrb3V0IHNlcnZpY2UgdGhhdCBpcyB1c2VkIGZvciBhcHBsaWNhdGlvbiBwdXJjaGFzZXMsIHNvIHlvdXIgdXNlcnMKIGV4cGVyaWVuY2UgYSBjb25zaXN0ZW50IGFuZCBmYW1pbGlhciBwdXJjaGFzZSBmbG93IChzZWUgZmlndXJlIDEpLiBBbHNvLCB0aGUgdHJhbnNhY3Rpb24gZmVlIGZvcgogaW4tYXBwIHB1cmNoYXNlcyBpcyB0aGUgc2FtZSBhcyB0aGUgdHJhbnNhY3Rpb24gZmVlIGZvciBhcHBsaWNhdGlvbiBwdXJjaGFzZXMgKDMwJSkuPC9wPgogCi08cD5BbnkgYXBwbGljYXRpb24gdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEFuZHJvaWQgTWFya2V0IGNhbiBpbXBsZW1lbnQgaW4tYXBwIGJpbGxpbmcuIE5vIHNwZWNpYWwKLWFjY291bnQgb3IgcmVnaXN0cmF0aW9uIGlzIHJlcXVpcmVkIG90aGVyIHRoYW4gYW4gQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIGFjY291bnQgYW5kIGEgR29vZ2xlCis8cD5BbnkgYXBwbGljYXRpb24gdGhhdCB5b3UgcHVibGlzaCB0aHJvdWdoIEdvb2dsZSBQbGF5IGNhbiBpbXBsZW1lbnQgaW4tYXBwIGJpbGxpbmcuIE5vIHNwZWNpYWwKK2FjY291bnQgb3IgcmVnaXN0cmF0aW9uIGlzIHJlcXVpcmVkIG90aGVyIHRoYW4gYSBHb29nbGUgUGxheSBhcHAgcHVibGlzaGVyIGFjY291bnQgYW5kIGEgR29vZ2xlCiBDaGVja291dCBNZXJjaGFudCBhY2NvdW50LiBBbHNvLCBiZWNhdXNlIHRoZSBzZXJ2aWNlIHVzZXMgbm8gZGVkaWNhdGVkIGZyYW1ld29yayBBUElzLCB5b3UgY2FuIGFkZAogaW4tYXBwIGJpbGxpbmcgdG8gYW55IGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBhIG1pbmltdW0gQVBJIGxldmVsIG9mIDQgb3IgaGlnaGVyLjwvcD4KIApAQCAtNTksMTEgKzU5LDExIEBACiA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9iaWxsaW5nX2NoZWNrb3V0X2Zsb3cucG5nIiBoZWlnaHQ9IjM4MiIgaWQ9ImZpZ3VyZTEiIC8+CiA8cCBjbGFzcz0iaW1nLWNhcHRpb24iPgogICA8c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBBcHBsaWNhdGlvbnMgaW5pdGlhdGUgaW4tYXBwIGJpbGxpbmcgcmVxdWVzdHMgdGhyb3VnaCB0aGVpciBvd24gVUkKLSAgKGZpcnN0IHNjcmVlbikuIEFuZHJvaWQgTWFya2V0IHJlc3BvbmRzIHRvIHRoZSByZXF1ZXN0IGJ5IHByb3ZpZGluZyB0aGUgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UKKyAgKGZpcnN0IHNjcmVlbikuIEdvb2dsZSBQbGF5IHJlc3BvbmRzIHRvIHRoZSByZXF1ZXN0IGJ5IHByb3ZpZGluZyB0aGUgY2hlY2tvdXQgdXNlciBpbnRlcmZhY2UKICAgKG1pZGRsZSBzY3JlZW4pLiBXaGVuIGNoZWNrb3V0IGlzIGNvbXBsZXRlLCB0aGUgYXBwbGljYXRpb24gcmVzdW1lcy4KIDwvcD4KIAotPHA+VG8gbGVhcm4gbW9yZSBhYm91dCBBbmRyb2lkIE1hcmtldCdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgYW5kIHN0YXJ0IGludGVncmF0aW5nIGl0IGludG8geW91cgorPHA+VG8gbGVhcm4gbW9yZSBhYm91dCBHb29nbGUgUGxheSdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgYW5kIHN0YXJ0IGludGVncmF0aW5nIGl0IGludG8geW91cgogYXBwbGljYXRpb25zLCByZWFkIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzOjwvcD4KIAogPGRsPgpAQCAtODgsNyArODgsNyBAQAogICAgIDxkZD5MZWFybiBob3cgdG8gc2V0IHVwIHlvdXIgcHJvZHVjdCBsaXN0LCByZWdpc3RlciB0ZXN0IGFjY291bnRzLCBhbmQgaGFuZGxlIHJlZnVuZHMuPC9kZD4KICAgPGR0PjxzdHJvbmc+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfcmVmZXJlbmNlLmh0bWwiPkluLWFwcCBCaWxsaW5nCiAgIFJlZmVyZW5jZTwvYT48L3N0cm9uZz48L2R0PgotICAgIDxkZD5HZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgQW5kcm9pZCBNYXJrZXQgcmVzcG9uc2UgY29kZXMgYW5kIHRoZSBpbi1hcHAgYmlsbGluZworICAgIDxkZD5HZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgR29vZ2xlIFBsYXkgcmVzcG9uc2UgY29kZXMgYW5kIHRoZSBpbi1hcHAgYmlsbGluZwogICAgIGludGVyZmFjZS48L2RkPgogPC9kbD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9leHBhbnNpb24tZmlsZXMuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2V4cGFuc2lvbi1maWxlcy5qZAppbmRleCBjZDliNTdhLi4wMWFjYjMzIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2V4cGFuc2lvbi1maWxlcy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2V4cGFuc2lvbi1maWxlcy5qZApAQCAtOCw3ICs4LDcgQEAKIDx1bD4KICAgPGxpPlJlY29tbWVuZGVkIGZvciBtb3N0IGFwcHMgdGhhdCBleGNlZWQgdGhlIDUwTUIgQVBLIGxpbWl0PC9saT4KICAgPGxpPllvdSBjYW4gcHJvdmlkZSB1cCB0byA0R0Igb2YgYWRkaXRpb25hbCBkYXRhIGZvciBlYWNoIEFQSzwvbGk+Ci0gIDxsaT5BbmRyb2lkIE1hcmtldCBob3N0cyBhbmQgc2VydmVzIHRoZSBleHBhbnNpb24gZmlsZXMgYXQgbm8gY2hhcmdlPC9saT4KKyAgPGxpPkdvb2dsZSBQbGF5IGhvc3RzIGFuZCBzZXJ2ZXMgdGhlIGV4cGFuc2lvbiBmaWxlcyBhdCBubyBjaGFyZ2U8L2xpPgogICA8bGk+VGhlIGZpbGVzIGNhbiBiZSBhbnkgZmlsZSB0eXBlIHlvdSB3YW50IGFuZCBhcmUgc2F2ZWQgdG8gdGhlIGRldmljZSdzIHNoYXJlZCBzdG9yYWdlPC9saT4KIDwvdWw+CiAKQEAgLTYxLDI4ICs2MSwyOCBAQAogCiAKIAotPHA+QW5kcm9pZCBNYXJrZXQgY3VycmVudGx5IHJlcXVpcmVzIHRoYXQgeW91ciBBUEsgZmlsZSBiZSBubyBtb3JlIHRoYW4gNTBNQi4gRm9yIG1vc3QKKzxwPkdvb2dsZSBQbGF5IGN1cnJlbnRseSByZXF1aXJlcyB0aGF0IHlvdXIgQVBLIGZpbGUgYmUgbm8gbW9yZSB0aGFuIDUwTUIuIEZvciBtb3N0CiBhcHBsaWNhdGlvbnMsIHRoaXMgaXMgcGxlbnR5IG9mIHNwYWNlIGZvciBhbGwgdGhlIGFwcGxpY2F0aW9uJ3MgY29kZSBhbmQgYXNzZXRzLgogSG93ZXZlciwgc29tZSBhcHBzIG5lZWQgbW9yZSBzcGFjZSBmb3IgaGlnaC1maWRlbGl0eSBncmFwaGljcywgbWVkaWEgZmlsZXMsIG9yIG90aGVyIGxhcmdlIGFzc2V0cy4KIFByZXZpb3VzbHksIGlmIHlvdXIgYXBwIGV4Y2VlZGVkIDUwTUIsIHlvdSBoYWQgdG8gaG9zdCBhbmQgZG93bmxvYWQgdGhlIGFkZGl0aW9uYWwgcmVzb3VyY2VzCiB5b3Vyc2VsZiB3aGVuIHRoZSB1c2VyIG9wZW5zIHRoZSBhcHAuIEhvc3RpbmcgYW5kIHNlcnZpbmcgdGhlIGV4dHJhIGZpbGVzIGNhbiBiZSBjb3N0bHksIGFuZCB0aGUKIHVzZXIgZXhwZXJpZW5jZSBpcyBvZnRlbiBsZXNzIHRoYW4gaWRlYWwuIFRvIG1ha2UgdGhpcyBwcm9jZXNzIGVhc2llciBmb3IgeW91IGFuZCBtb3JlIHBsZWFzYW50Ci1mb3IgdXNlcnMsIEFuZHJvaWQgTWFya2V0IGFsbG93cyB5b3UgdG8gYXR0YWNoIHR3byBsYXJnZSBleHBhbnNpb24gZmlsZXMgdGhhdCBzdXBwbGVtZW50IHlvdXIKK2ZvciB1c2VycywgR29vZ2xlIFBsYXkgYWxsb3dzIHlvdSB0byBhdHRhY2ggdHdvIGxhcmdlIGV4cGFuc2lvbiBmaWxlcyB0aGF0IHN1cHBsZW1lbnQgeW91cgogQVBLLjwvcD4KIAotPHA+QW5kcm9pZCBNYXJrZXQgaG9zdHMgdGhlIGV4cGFuc2lvbiBmaWxlcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgc2VydmVzIHRoZW0gdG8gdGhlIGRldmljZSBhdAorPHA+R29vZ2xlIFBsYXkgaG9zdHMgdGhlIGV4cGFuc2lvbiBmaWxlcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgc2VydmVzIHRoZW0gdG8gdGhlIGRldmljZSBhdAogbm8gY29zdCB0byB5b3UuIFRoZSBleHBhbnNpb24gZmlsZXMgYXJlIHNhdmVkIHRvIHRoZSBkZXZpY2UncyBzaGFyZWQgc3RvcmFnZSBsb2NhdGlvbiAodGhlCiBTRCBjYXJkIG9yIFVTQi1tb3VudGFibGUgcGFydGl0aW9uOyBhbHNvIGtub3duIGFzIHRoZSAiZXh0ZXJuYWwiIHN0b3JhZ2UpIHdoZXJlIHlvdXIgYXBwIGNhbiBhY2Nlc3MKLXRoZW0uIE9uIG1vc3QgZGV2aWNlcywgQW5kcm9pZCBNYXJrZXQgZG93bmxvYWRzIHRoZSBleHBhbnNpb24gZmlsZShzKSBhdCB0aGUgc2FtZSB0aW1lIGl0Cit0aGVtLiBPbiBtb3N0IGRldmljZXMsIEdvb2dsZSBQbGF5IGRvd25sb2FkcyB0aGUgZXhwYW5zaW9uIGZpbGUocykgYXQgdGhlIHNhbWUgdGltZSBpdAogZG93bmxvYWRzIHRoZSBBUEssIHNvIHlvdXIgYXBwbGljYXRpb24gaGFzIGV2ZXJ5dGhpbmcgaXQgbmVlZHMgd2hlbiB0aGUgdXNlciBvcGVucyBpdCBmb3IgdGhlCi1maXJzdCB0aW1lLiBJbiBzb21lIGNhc2VzLCBob3dldmVyLCB5b3VyIGFwcGxpY2F0aW9uIG11c3QgZG93bmxvYWQgdGhlIGZpbGVzIGZyb20gQW5kcm9pZCBNYXJrZXQKK2ZpcnN0IHRpbWUuIEluIHNvbWUgY2FzZXMsIGhvd2V2ZXIsIHlvdXIgYXBwbGljYXRpb24gbXVzdCBkb3dubG9hZCB0aGUgZmlsZXMgZnJvbSBHb29nbGUgUGxheQogd2hlbiB5b3VyIGFwcGxpY2F0aW9uIHN0YXJ0cy48L3A+CiAKIAogCiA8aDIgaWQ9Ik92ZXJ2aWV3Ij5PdmVydmlldzwvaDI+CiAKLTxwPkVhY2ggdGltZSB5b3UgdXBsb2FkIGFuIEFQSyB1c2luZyB0aGUgQW5kcm9pZCBNYXJrZXQgRGV2ZWxvcGVyIENvbnNvbGUsIHlvdSBoYXZlIHRoZSBvcHRpb24gdG8KKzxwPkVhY2ggdGltZSB5b3UgdXBsb2FkIGFuIEFQSyB1c2luZyB0aGUgR29vZ2xlIFBsYXkgQW5kcm9pZCBEZXZlbG9wZXIgQ29uc29sZSwgeW91IGhhdmUgdGhlIG9wdGlvbiB0bwogYWRkIG9uZSBvciB0d28gZXhwYW5zaW9uIGZpbGVzIHRvIHRoZSBBUEsuIEVhY2ggZmlsZSBjYW4gYmUgdXAgdG8gMkdCIGFuZCBpdCBjYW4gYmUgYW55IGZvcm1hdCB5b3UKIGNob29zZSwgYnV0IHdlIHJlY29tbWVuZCB5b3UgdXNlIGEgY29tcHJlc3NlZCBmaWxlIHRvIGNvbnNlcnZlIGJhbmR3aWR0aCBkdXJpbmcgdGhlIGRvd25sb2FkLgogQ29uY2VwdHVhbGx5LCBlYWNoIGV4cGFuc2lvbiBmaWxlIHBsYXlzIGEgZGlmZmVyZW50IHJvbGU6PC9wPgpAQCAtMTAyLDcgKzEwMiw3IEBACiA8cD5Ib3dldmVyLCBldmVuIGlmIHlvdXIgYXBwbGljYXRpb24gdXBkYXRlIHJlcXVpcmVzIG9ubHkgYSBuZXcgcGF0Y2ggZXhwYW5zaW9uIGZpbGUsIHlvdSBzdGlsbCBtdXN0CiB1cGxvYWQgYSBuZXcgQVBLIHdpdGggYW4gdXBkYXRlZCA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwjdmNvZGUiPntAY29kZQotdmVyc2lvbkNvZGV9PC9hPiBpbiB0aGUgbWFuaWZlc3QuIChUaGUgQW5kcm9pZCBNYXJrZXQKK3ZlcnNpb25Db2RlfTwvYT4gaW4gdGhlIG1hbmlmZXN0LiAoVGhlCiBEZXZlbG9wZXIgQ29uc29sZSBkb2VzIG5vdCBhbGxvdyB5b3UgdG8gdXBsb2FkIGFuIGV4cGFuc2lvbiBmaWxlIHRvIGFuIGV4aXN0aW5nIEFQSy4pPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgcGF0Y2ggZXhwYW5zaW9uIGZpbGUgaXMgc2VtYW50aWNhbGx5IHRoZSBzYW1lIGFzIHRoZQpAQCAtMTE1LDcgKzExNSw3IEBACiA8aDMgaWQ9IkZpbGVuYW1lIj5GaWxlIG5hbWUgZm9ybWF0PC9oMz4KIAogPHA+RWFjaCBleHBhbnNpb24gZmlsZSB5b3UgdXBsb2FkIGNhbiBiZSBhbnkgZm9ybWF0IHlvdSBjaG9vc2UgKFpJUCwgUERGLCBNUDQsIGV0Yy4pLiBSZWdhcmRsZXNzIG9mCi10aGUgZmlsZSB0eXBlLCBBbmRyb2lkIE1hcmtldCBjb25zaWRlcnMgdGhlbSBvcGFxdWUgYmluYXJ5IGJsb2JzIGFuZCByZW5hbWVzIHRoZSBmaWxlcwordGhlIGZpbGUgdHlwZSwgR29vZ2xlIFBsYXkgY29uc2lkZXJzIHRoZW0gb3BhcXVlIGJpbmFyeSBibG9icyBhbmQgcmVuYW1lcyB0aGUgZmlsZXMKIHVzaW5nIHRoZSBmb2xsb3dpbmcgc2NoZW1lOjwvcD4KIAogPHByZSBjbGFzcz0iY2xhc3NpYyBuby1wcmV0dHktcHJpbnQiPgpAQCAtMTMzLDcgKzEzMyw3IEBACiA8ZW0+Zmlyc3Q8L2VtPiBhc3NvY2lhdGVkIChpdCBtYXRjaGVzIHRoZSBhcHBsaWNhdGlvbidzIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCN2Y29kZSI+e0Bjb2RlIGFuZHJvaWQ6dmVyc2lvbkNvZGV9PC9hPgogdmFsdWUpLgotICAgIDxwPiJGaXJzdCIgaXMgZW1waGFzaXplZCBiZWNhdXNlIGFsdGhvdWdoIHRoZSBBbmRyb2lkIE1hcmtldCBEZXZlbG9wZXIgQ29uc29sZSBhbGxvd3MgeW91IHRvCisgICAgPHA+IkZpcnN0IiBpcyBlbXBoYXNpemVkIGJlY2F1c2UgYWx0aG91Z2ggdGhlIERldmVsb3BlciBDb25zb2xlIGFsbG93cyB5b3UgdG8KIHJlLXVzZSBhbiB1cGxvYWRlZCBleHBhbnNpb24gZmlsZSB3aXRoIGEgbmV3IEFQSywgdGhlIGV4cGFuc2lvbiBmaWxlJ3MgbmFtZSBkb2VzIG5vdCBjaGFuZ2UmbWRhc2g7aXQKIHJldGFpbnMgdGhlIHZlcnNpb24gYXBwbGllZCB0byBpdCB3aGVuIHlvdSBmaXJzdCB1cGxvYWRlZCB0aGUgZmlsZS48L3A+PC9kZD4KICAgPGR0PntAY29kZSAmbHQ7cGFja2FnZS1uYW1lJmd0O308L2R0PiAKQEAgLTE0Nyw5ICsxNDcsOSBAQAogCiA8aDMgaWQ9IlN0b3JhZ2VMb2NhdGlvbiI+U3RvcmFnZSBsb2NhdGlvbjwvaDM+CiAKLTxwPldoZW4gQW5kcm9pZCBNYXJrZXQgZG93bmxvYWRzIHlvdXIgZXhwYW5zaW9uIGZpbGVzIHRvIGEgZGV2aWNlLCBpdCBzYXZlcyB0aGVtIHRvIHRoZSBzeXN0ZW0ncworPHA+V2hlbiBHb29nbGUgUGxheSBkb3dubG9hZHMgeW91ciBleHBhbnNpb24gZmlsZXMgdG8gYSBkZXZpY2UsIGl0IHNhdmVzIHRoZW0gdG8gdGhlIHN5c3RlbSdzCiBzaGFyZWQgc3RvcmFnZSBsb2NhdGlvbi4gVG8gZW5zdXJlIHByb3BlciBiZWhhdmlvciwgeW91IG11c3Qgbm90IGRlbGV0ZSwgbW92ZSwgb3IgcmVuYW1lIHRoZQotZXhwYW5zaW9uIGZpbGVzLiBJbiB0aGUgZXZlbnQgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIG11c3QgcGVyZm9ybSB0aGUgZG93bmxvYWQgZnJvbSBBbmRyb2lkIE1hcmtldAorZXhwYW5zaW9uIGZpbGVzLiBJbiB0aGUgZXZlbnQgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIG11c3QgcGVyZm9ybSB0aGUgZG93bmxvYWQgZnJvbSBHb29nbGUgUGxheQogaXRzZWxmLCB5b3UgbXVzdCBzYXZlIHRoZSBmaWxlcyB0byB0aGUgZXhhY3Qgc2FtZSBsb2NhdGlvbi48L3A+CiAKIDxwPlRoZSBzcGVjaWZpYyBsb2NhdGlvbiBmb3IgeW91ciBleHBhbnNpb24gZmlsZXMgaXM6PC9wPgpAQCAtMTk0LDI3ICsxOTQsMjcgQEAKIAogPGgzIGlkPSJEb3dubG9hZFByb2Nlc3MiPkRvd25sb2FkIHByb2Nlc3M8L2gzPgogCi08cD5Nb3N0IG9mIHRoZSB0aW1lLCBBbmRyb2lkIE1hcmtldCBkb3dubG9hZHMgYW5kIHNhdmVzIHlvdXIgZXhwYW5zaW9uIGZpbGVzIGF0IHRoZSBzYW1lIHRpbWUgaXQKLWRvd25sb2FkcyB0aGUgQVBLIHRvIHRoZSBkZXZpY2UuIEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMgQW5kcm9pZCBNYXJrZXQKKzxwPk1vc3Qgb2YgdGhlIHRpbWUsIEdvb2dsZSBQbGF5IGRvd25sb2FkcyBhbmQgc2F2ZXMgeW91ciBleHBhbnNpb24gZmlsZXMgYXQgdGhlIHNhbWUgdGltZSBpdAorZG93bmxvYWRzIHRoZSBBUEsgdG8gdGhlIGRldmljZS4gSG93ZXZlciwgaW4gc29tZSBjYXNlcyBHb29nbGUgUGxheQogY2Fubm90IGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgb3IgdGhlIHVzZXIgbWlnaHQgaGF2ZSBkZWxldGVkIHByZXZpb3VzbHkgZG93bmxvYWRlZCBleHBhbnNpb24KIGZpbGVzLiBUbyBoYW5kbGUgdGhlc2Ugc2l0dWF0aW9ucywgeW91ciBhcHAgbXVzdCBiZSBhYmxlIHRvIGRvd25sb2FkIHRoZSBmaWxlcwotaXRzZWxmIHdoZW4gdGhlIG1haW4gYWN0aXZpdHkgc3RhcnRzLCB1c2luZyBhIFVSTCBwcm92aWRlZCBieSBBbmRyb2lkIE1hcmtldC48L3A+CitpdHNlbGYgd2hlbiB0aGUgbWFpbiBhY3Rpdml0eSBzdGFydHMsIHVzaW5nIGEgVVJMIHByb3ZpZGVkIGJ5IEdvb2dsZSBQbGF5LjwvcD4KIAogPHA+VGhlIGRvd25sb2FkIHByb2Nlc3MgZnJvbSBhIGhpZ2ggbGV2ZWwgbG9va3MgbGlrZSB0aGlzOjwvcD4KIAogPG9sPgotICA8bGk+VXNlciBzZWxlY3RzIHRvIGluc3RhbGwgeW91ciBhcHAgZnJvbSBBbmRyb2lkIE1hcmtldC48L2xpPgotICA8bGk+SWYgQW5kcm9pZCBNYXJrZXQgaXMgYWJsZSB0byBkb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGVzICh3aGljaCBpcyB0aGUgY2FzZSBmb3IgbW9zdAorICA8bGk+VXNlciBzZWxlY3RzIHRvIGluc3RhbGwgeW91ciBhcHAgZnJvbSBHb29nbGUgUGxheS48L2xpPgorICA8bGk+SWYgR29vZ2xlIFBsYXkgaXMgYWJsZSB0byBkb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGVzICh3aGljaCBpcyB0aGUgY2FzZSBmb3IgbW9zdAogZGV2aWNlcyksIGl0IGRvd25sb2FkcyB0aGVtIGFsb25nIHdpdGggdGhlIEFQSy4KLSAgICAgPHA+SWYgQW5kcm9pZCBNYXJrZXQgaXMgdW5hYmxlIHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMsIGl0IGRvd25sb2FkcyB0aGUKKyAgICAgPHA+SWYgR29vZ2xlIFBsYXkgaXMgdW5hYmxlIHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMsIGl0IGRvd25sb2FkcyB0aGUKIEFQSyBvbmx5LjwvcD4KICAgPC9saT4KICAgPGxpPldoZW4gdGhlIHVzZXIgbGF1bmNoZXMgeW91ciBhcHBsaWNhdGlvbiwgeW91ciBhcHAgbXVzdCBjaGVjayB3aGV0aGVyIHRoZSBleHBhbnNpb24gZmlsZXMgYXJlCiBhbHJlYWR5IHNhdmVkIG9uIHRoZSBkZXZpY2UuCiAgICAgPG9sPgogICAgICAgPGxpPklmIHllcywgeW91ciBhcHAgaXMgcmVhZHkgdG8gZ28uPC9saT4KLSAgICAgIDxsaT5JZiBubywgeW91ciBhcHAgbXVzdCBkb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGVzIG92ZXIgSFRUUCBmcm9tIEFuZHJvaWQgTWFya2V0LiBZb3VyIGFwcAotbXVzdCBzZW5kIGEgcmVxdWVzdCB0byB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IHVzaW5nIHRoZSBBbmRyb2lkIE1hcmtldCdzIDxhCisgICAgICA8bGk+SWYgbm8sIHlvdXIgYXBwIG11c3QgZG93bmxvYWQgdGhlIGV4cGFuc2lvbiBmaWxlcyBvdmVyIEhUVFAgZnJvbSBHb29nbGUgUGxheS4gWW91ciBhcHAKK211c3Qgc2VuZCBhIHJlcXVlc3QgdG8gdGhlIEdvb2dsZSBQbGF5IGNsaWVudCB1c2luZyB0aGUgR29vZ2xlIFBsYXkncyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiBzZXJ2aWNlLCB3aGljaAogcmVzcG9uZHMgd2l0aCB0aGUgbmFtZSwgZmlsZSBzaXplLCBhbmQgVVJMIGZvciBlYWNoIGV4cGFuc2lvbiBmaWxlLiBXaXRoIHRoaXMgaW5mb3JtYXRpb24sIHlvdSB0aGVuCiBkb3dubG9hZCB0aGUgZmlsZXMgYW5kIHNhdmUgdGhlbSB0byB0aGUgcHJvcGVyIDxhIGhyZWY9IiNTdG9yYWdlTG9jYXRpb24iPnN0b3JhZ2UgbG9jYXRpb248L2E+LjwvbGk+CkBAIC0yMjMsNyArMjIzLDcgQEAKIDwvb2w+CiAKIDxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkNhdXRpb246PC9zdHJvbmc+IEl0IGlzIGNyaXRpY2FsIHRoYXQgeW91IGluY2x1ZGUgdGhlIG5lY2Vzc2FyeSBjb2RlIHRvCi1kb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGVzIGZyb20gQW5kcm9pZCBNYXJrZXQgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGZpbGVzIGFyZSBub3QgYWxyZWFkeSBvbiB0aGUKK2Rvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgZnJvbSBHb29nbGUgUGxheSBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgZmlsZXMgYXJlIG5vdCBhbHJlYWR5IG9uIHRoZQogZGV2aWNlIHdoZW4geW91ciBhcHBsaWNhdGlvbiBzdGFydHMuIEFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gYWJvdXQgPGEKIGhyZWY9IiNEb3dubG9hZGluZyI+RG93bmxvYWRpbmcgdGhlIEV4cGFuc2lvbiBGaWxlczwvYT4sIHdlJ3ZlIG1hZGUgYSBsaWJyYXJ5IGF2YWlsYWJsZSB0byB5b3UgdGhhdAogZ3JlYXRseSBzaW1wbGlmaWVzIHRoaXMgcHJvY2VzcyBhbmQgcGVyZm9ybXMgdGhlIGRvd25sb2FkIGZyb20gYSBzZXJ2aWNlIHdpdGggYSBtaW5pbWFsIGFtb3VudCBvZgpAQCAtMjU4LDcgKzI1OCw3IEBACiBMaWJyYXJ5PC9hPi48L3A+CiAgIDwvbGk+CiAgIDxsaT5BZGQgbG9naWMgdG8geW91ciBhcHBsaWNhdGlvbidzIG1haW4gYWN0aXZpdHkgdGhhdCBjaGVja3Mgd2hldGhlciB0aGUgZXhwYW5zaW9uIGZpbGVzCi1hcmUgb24gdGhlIGRldmljZSB1cG9uIHN0YXJ0LXVwLiBJZiB0aGUgZmlsZXMgYXJlIG5vdCBvbiB0aGUgZGV2aWNlLCB1c2UgQW5kcm9pZCBNYXJrZXQncyA8YQorYXJlIG9uIHRoZSBkZXZpY2UgdXBvbiBzdGFydC11cC4gSWYgdGhlIGZpbGVzIGFyZSBub3Qgb24gdGhlIGRldmljZSwgdXNlIEdvb2dsZSBQbGF5J3MgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uIExpY2Vuc2luZzwvYT4gc2VydmljZSB0byByZXF1ZXN0IFVSTHMKIGZvciB0aGUgZXhwYW5zaW9uIGZpbGVzLCB0aGVuIGRvd25sb2FkIGFuZCBzYXZlIHRoZW0uCiAgICAgPHA+VG8gZ3JlYXRseSByZWR1Y2UgdGhlIGFtb3VudCBvZiBjb2RlIHlvdSBtdXN0IHdyaXRlIGFuZCBlbnN1cmUgYSBnb29kIHVzZXIgZXhwZXJpZW5jZQpAQCAtMjgwLDE1ICsyODAsMTUgQEAKIDxoMiBpZD0iUnVsZXMiPlJ1bGVzIGFuZCBMaW1pdGF0aW9uczwvaDI+CiAKIDxwPkFkZGluZyBBUEsgZXhwYW5zaW9uIGZpbGVzIGlzIGEgZmVhdHVyZSBhdmFpbGFibGUgd2hlbiB5b3UgdXBsb2FkIHlvdXIgYXBwbGljYXRpb24gdXNpbmcgdGhlCi1BbmRyb2lkIE1hcmtldCBEZXZlbG9wZXIgQ29uc29sZS4gV2hlbiB1cGxvYWRpbmcgeW91ciBhcHBsaWNhdGlvbiBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgdXBkYXRpbmcgYW4KK0RldmVsb3BlciBDb25zb2xlLiBXaGVuIHVwbG9hZGluZyB5b3VyIGFwcGxpY2F0aW9uIGZvciB0aGUgZmlyc3QgdGltZSBvciB1cGRhdGluZyBhbgogYXBwbGljYXRpb24gdGhhdCB1c2VzIGV4cGFuc2lvbiBmaWxlcywgeW91IG11c3QgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZyBydWxlcyBhbmQgbGltaXRhdGlvbnM6PC9wPgogCiA8b2wgdHlwZT0iSSI+CiAgIDxsaT5FYWNoIGV4cGFuc2lvbiBmaWxlIGNhbiBiZSBubyBtb3JlIHRoYW4gMkdCLjwvbGk+Ci0gIDxsaT5JbiBvcmRlciB0byBkb3dubG9hZCB5b3VyIGV4cGFuc2lvbiBmaWxlcyBmcm9tIEFuZHJvaWQgTWFya2V0LCA8c3Ryb25nPnRoZSB1c2VyIG11c3QgaGF2ZQotYWNxdWlyZWQgeW91ciBhcHBsaWNhdGlvbiBmcm9tIEFuZHJvaWQgTWFya2V0PC9zdHJvbmc+LiBBbmRyb2lkIE1hcmtldCB3aWxsIG5vdAorICA8bGk+SW4gb3JkZXIgdG8gZG93bmxvYWQgeW91ciBleHBhbnNpb24gZmlsZXMgZnJvbSBHb29nbGUgUGxheSwgPHN0cm9uZz50aGUgdXNlciBtdXN0IGhhdmUKK2FjcXVpcmVkIHlvdXIgYXBwbGljYXRpb24gZnJvbSBHb29nbGUgUGxheTwvc3Ryb25nPi4gR29vZ2xlIFBsYXkgd2lsbCBub3QKIHByb3ZpZGUgdGhlIFVSTHMgZm9yIHlvdXIgZXhwYW5zaW9uIGZpbGVzIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgaW5zdGFsbGVkIGJ5IG90aGVyIG1lYW5zLjwvbGk+Ci0gIDxsaT5XaGVuIHBlcmZvcm1pbmcgdGhlIGRvd25sb2FkIGZyb20gd2l0aGluIHlvdXIgYXBwbGljYXRpb24sIHRoZSBVUkwgdGhhdCBBbmRyb2lkIE1hcmtldAorICA8bGk+V2hlbiBwZXJmb3JtaW5nIHRoZSBkb3dubG9hZCBmcm9tIHdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uLCB0aGUgVVJMIHRoYXQgR29vZ2xlIFBsYXkKIHByb3ZpZGVzIGZvciBlYWNoIGZpbGUgaXMgdW5pcXVlIGZvciBldmVyeSBkb3dubG9hZCBhbmQgZWFjaCBvbmUgZXhwaXJlcyBzaG9ydGx5IGFmdGVyIGl0IGlzIGdpdmVuCiB0byB5b3VyIGFwcGxpY2F0aW9uLjwvbGk+CiAgIDxsaT5JZiB5b3UgdXBkYXRlIHlvdXIgYXBwbGljYXRpb24gd2l0aCBhIG5ldyBBUEsgb3IgdXBsb2FkIDxhCkBAIC0zMTMsNyArMzEzLDcgQEAKIGRpcmVjdG9yeTwvc3Ryb25nPi4gSWYgeW91IG11c3QgdW5wYWNrIHNvbWUgZGF0YSwgc2F2ZSBpdCBpbnRvIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkge0BsaW5rCiBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNnZXRFeHRlcm5hbEZpbGVzRGlyIGdldEV4dGVybmFsRmlsZXNEaXIoKX0uPC9saT4KICAgPGxpPjxzdHJvbmc+RG8gbm90IGRlbGV0ZSBvciByZW5hbWUgdGhlIHtAY29kZSAub2JifSBleHBhbnNpb24gZmlsZTwvc3Ryb25nPiAodW5sZXNzIHlvdSdyZQotcGVyZm9ybWluZyBhbiB1cGRhdGUpLiBEb2luZyBzbyB3aWxsIGNhdXNlIEFuZHJvaWQgTWFya2V0IChvciB5b3VyIGFwcCBpdHNlbGYpIHRvIHJlcGVhdGVkbHkKK3BlcmZvcm1pbmcgYW4gdXBkYXRlKS4gRG9pbmcgc28gd2lsbCBjYXVzZSBHb29nbGUgUGxheSAob3IgeW91ciBhcHAgaXRzZWxmKSB0byByZXBlYXRlZGx5CiBkb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGUuPC9saT4KICAgPGxpPldoZW4gdXBkYXRpbmcgYW4gZXhwYW5zaW9uIGZpbGUgbWFudWFsbHksIHlvdSBtdXN0IGRlbGV0ZSB0aGUgcHJldmlvdXMgZXhwYW5zaW9uIGZpbGUuPC9saT4KIDwvb2w+CkBAIC0zMjgsMTEgKzMyOCwxMSBAQAogCiA8aDIgaWQ9IkRvd25sb2FkaW5nIj5Eb3dubG9hZGluZyB0aGUgRXhwYW5zaW9uIEZpbGVzPC9oMj4KIAotPHA+SW4gbW9zdCBjYXNlcywgQW5kcm9pZCBNYXJrZXQgZG93bmxvYWRzIGFuZCBzYXZlcyB5b3VyIGV4cGFuc2lvbiBmaWxlcyB0byB0aGUgZGV2aWNlIGF0IHRoZSBzYW1lCis8cD5JbiBtb3N0IGNhc2VzLCBHb29nbGUgUGxheSBkb3dubG9hZHMgYW5kIHNhdmVzIHlvdXIgZXhwYW5zaW9uIGZpbGVzIHRvIHRoZSBkZXZpY2UgYXQgdGhlIHNhbWUKIHRpbWUgaXQgaW5zdGFsbHMgb3IgdXBkYXRlcyB0aGUgQVBLLiBUaGlzIHdheSwgdGhlIGV4cGFuc2lvbiBmaWxlcyBhcmUgYXZhaWxhYmxlIHdoZW4geW91cgogYXBwbGljYXRpb24gbGF1bmNoZXMgZm9yIHRoZSBmaXJzdCB0aW1lLiBIb3dldmVyLCBpbiBzb21lIGNhc2VzIHlvdXIgYXBwIG11c3QgZG93bmxvYWQgdGhlCiBleHBhbnNpb24gZmlsZXMgaXRzZWxmIGJ5IHJlcXVlc3RpbmcgdGhlbSBmcm9tIGEgVVJMIHByb3ZpZGVkIHRvIHlvdSBpbiBhIHJlc3BvbnNlCi1mcm9tIEFuZHJvaWQgTWFya2V0J3MgPGEKK2Zyb20gR29vZ2xlIFBsYXkncyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiBzZXJ2aWNlLjwvcD4KIAogPHA+VGhlIGJhc2ljIGxvZ2ljIHlvdSBuZWVkIHRvIGRvd25sb2FkIHlvdXIgZXhwYW5zaW9uIGZpbGVzIGlzIHRoZSBmb2xsb3dpbmc6PC9wPgpAQCAtMzQ1LDE1ICszNDUsMTUgQEAKICAgICAgIDxsaT5JZiB0aGUgZXhwYW5zaW9uIGZpbGVzIGFyZSB0aGVyZSwgeW91J3JlIGFsbCBzZXQgYW5kIHlvdXIgYXBwbGljYXRpb24gY2FuIGNvbnRpbnVlLjwvbGk+CiAgICAgICA8bGk+SWYgdGhlIGV4cGFuc2lvbiBmaWxlcyBhcmUgPGVtPm5vdDwvZW0+IHRoZXJlOgogICAgICAgICA8b2w+Ci0gICAgICAgICAgPGxpPlBlcmZvcm0gYSByZXF1ZXN0IHVzaW5nIEFuZHJvaWQgTWFya2V0J3MgPGEKKyAgICAgICAgICA8bGk+UGVyZm9ybSBhIHJlcXVlc3QgdXNpbmcgR29vZ2xlIFBsYXkncyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiB0byBnZXQgeW91cgogYXBwJ3MgZXhwYW5zaW9uIGZpbGUgbmFtZXMsIHNpemVzLCBhbmQgVVJMcy48L2xpPiAKLSAgICAgICAgICA8bGk+VXNlIHRoZSBVUkxzIHByb3ZpZGVkIGJ5IEFuZHJvaWQgTWFya2V0IHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgYW5kIHNhdmUKKyAgICAgICAgICA8bGk+VXNlIHRoZSBVUkxzIHByb3ZpZGVkIGJ5IEdvb2dsZSBQbGF5IHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgYW5kIHNhdmUKIHRoZSBleHBhbnNpb24gZmlsZXMuIFlvdSA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gc2F2ZSB0aGUgZmlsZXMgdG8gdGhlIDxhCiBocmVmPSIjU3RvcmFnZUxvY2F0aW9uIj5zaGFyZWQgc3RvcmFnZSBsb2NhdGlvbjwvYT4KICg8Y29kZT5BbmRyb2lkL29iYi8mbHQ7cGFja2FnZS1uYW1lJmd0Oy88L2NvZGU+KSBhbmQgdXNlIHRoZSBleGFjdCBmaWxlIG5hbWUgcHJvdmlkZWQKLWJ5IEFuZHJvaWQgTWFya2V0J3MgcmVzcG9uc2UuCi0gICAgICAgICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgVVJMIHRoYXQgQW5kcm9pZCBNYXJrZXQgcHJvdmlkZXMgZm9yIHlvdXIKK2J5IEdvb2dsZSBQbGF5J3MgcmVzcG9uc2UuCisgICAgICAgICAgICA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgVVJMIHRoYXQgR29vZ2xlIFBsYXkgcHJvdmlkZXMgZm9yIHlvdXIKIGV4cGFuc2lvbiBmaWxlcyBpcyB1bmlxdWUgZm9yIGV2ZXJ5IGRvd25sb2FkIGFuZCBlYWNoIG9uZSBleHBpcmVzIHNob3J0bHkgYWZ0ZXIgaXQgaXMgZ2l2ZW4gdG8KIHlvdXIgYXBwbGljYXRpb24uPC9wPgogICAgICAgICAgIDwvbGk+CkBAIC0zNjgsMTYgKzM2OCwxNiBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24gTGljZW5zaW5nPC9hPiBzZXJ2aWNlLiBJdCdzIHByaW1hcmlseQogZGVzaWduZWQgZm9yIHlvdSB0byBlbmZvcmNlCiBsaWNlbnNpbmcgcG9saWNpZXMgZm9yIHlvdXIgYXBwbGljYXRpb24gYW5kIGVuc3VyZSB0aGF0IHRoZSB1c2VyIGhhcyB0aGUgcmlnaHQgdG8KLXVzZSB5b3VyIGFwcCAoaGUgb3Igc2hlIHJpZ2h0ZnVsbHkgcGFpZCBmb3IgaXQgb24gQW5kcm9pZCBNYXJrZXQpLiBJbiBvcmRlciB0byBmYWNpbGl0YXRlIHRoZQordXNlIHlvdXIgYXBwIChoZSBvciBzaGUgcmlnaHRmdWxseSBwYWlkIGZvciBpdCBvbiBHb29nbGUgUGxheSkuIEluIG9yZGVyIHRvIGZhY2lsaXRhdGUgdGhlCiBleHBhbnNpb24gZmlsZSBmdW5jdGlvbmFsaXR5LCB0aGUgbGljZW5zaW5nIHNlcnZpY2UgaGFzIGJlZW4gZW5oYW5jZWQgdG8gcHJvdmlkZSBhIHJlc3BvbnNlCiB0byB5b3VyIGFwcGxpY2F0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIFVSTCBvZiB5b3VyIGFwcGxpY2F0aW9uJ3MgZXhwYW5zaW9uIGZpbGVzIHRoYXQgYXJlIGhvc3RlZAotb24gQW5kcm9pZCBNYXJrZXQuIFNvLCBldmVuIGlmIHlvdXIgYXBwbGljYXRpb24gaXMgZnJlZSBmb3IgdXNlcnMsIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIEFuZHJvaWQKLU1hcmtldCBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IChMVkwpIHRvIHVzZSBBUEsgZXhwYW5zaW9uIGZpbGVzLiBPZiBjb3Vyc2UsIGlmIHlvdXIgYXBwbGljYXRpb24KK29uIEdvb2dsZSBQbGF5LiBTbywgZXZlbiBpZiB5b3VyIGFwcGxpY2F0aW9uIGlzIGZyZWUgZm9yIHVzZXJzLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZQorTGljZW5zZSBWZXJpZmljYXRpb24gTGlicmFyeSAoTFZMKSB0byB1c2UgQVBLIGV4cGFuc2lvbiBmaWxlcy4gT2YgY291cnNlLCBpZiB5b3VyIGFwcGxpY2F0aW9uCiBpcyBmcmVlLCB5b3UgZG9uJ3QgbmVlZCB0byBlbmZvcmNlIGxpY2Vuc2UgdmVyaWZpY2F0aW9uJm1kYXNoO3lvdSBzaW1wbHkgbmVlZCB0aGUKIGxpYnJhcnkgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdCB0aGF0IHJldHVybnMgdGhlIFVSTCBvZiB5b3VyIGV4cGFuc2lvbiBmaWxlcy48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZXRoZXIgeW91ciBhcHBsaWNhdGlvbiBpcyBmcmVlIG9yIG5vdCwgQW5kcm9pZCBNYXJrZXQKLXJldHVybnMgdGhlIGV4cGFuc2lvbiBmaWxlIFVSTHMgb25seSBpZiB0aGUgdXNlciBhY3F1aXJlZCB5b3VyIGFwcGxpY2F0aW9uIGZyb20gQW5kcm9pZCBNYXJrZXQuPC9wPgorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gV2hldGhlciB5b3VyIGFwcGxpY2F0aW9uIGlzIGZyZWUgb3Igbm90LCBHb29nbGUgUGxheQorcmV0dXJucyB0aGUgZXhwYW5zaW9uIGZpbGUgVVJMcyBvbmx5IGlmIHRoZSB1c2VyIGFjcXVpcmVkIHlvdXIgYXBwbGljYXRpb24gZnJvbSBHb29nbGUgUGxheS48L3A+CiAKIDxwPkluIGFkZGl0aW9uIHRvIHRoZSBMVkwsIHlvdSBuZWVkIGEgc2V0IG9mIGNvZGUgdGhhdCBkb3dubG9hZHMgdGhlIGV4cGFuc2lvbiBmaWxlcwogb3ZlciBhbiBIVFRQIGNvbm5lY3Rpb24gYW5kIHNhdmVzIHRoZW0gdG8gdGhlIHByb3BlciBsb2NhdGlvbiBvbiB0aGUgZGV2aWNlJ3Mgc2hhcmVkIHN0b3JhZ2UuCkBAIC00MDgsOCArNDA4LDggQEAKIGRvd25sb2FkIHlvdXIgZXhwYW5zaW9uIGZpbGVzLiBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBleHBsYWluIGhvdyB0byBpbnRlZ3JhdGUKIHRoZSBsaWJyYXJ5IGludG8geW91ciBhcHBsaWNhdGlvbi48L3A+CiAKLTxwPklmIHlvdSdkIHJhdGhlciBkZXZlbG9wIHlvdXIgb3duIHNvbHV0aW9uIHRvIGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZXMgdXNpbmcgdGhlIEFuZHJvaWQKLU1hcmtldCBVUkxzLCB5b3UgbXVzdCBmb2xsb3cgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uCis8cD5JZiB5b3UnZCByYXRoZXIgZGV2ZWxvcCB5b3VyIG93biBzb2x1dGlvbiB0byBkb3dubG9hZCB0aGUgZXhwYW5zaW9uIGZpbGVzIHVzaW5nIHRoZSBHb29nbGUKK1BsYXkgVVJMcywgeW91IG11c3QgZm9sbG93IHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbgogTGljZW5zaW5nPC9hPiBkb2N1bWVudGF0aW9uIHRvIHBlcmZvcm0gYSBsaWNlbnNlIHJlcXVlc3QsIHRoZW4gcmV0cmlldmUgdGhlIGV4cGFuc2lvbiBmaWxlIG5hbWVzLAogc2l6ZXMsIGFuZCBVUkxzIGZyb20gdGhlIHJlc3BvbnNlIGV4dHJhcy4gWW91IHNob3VsZCB1c2UgdGhlIDxhIGhyZWY9IiNFeHBhbnNpb25Qb2xpY3kiPntAY29kZQogQVBLRXhwYW5zaW9uUG9saWN5fTwvYT4gY2xhc3MgKGluY2x1ZGVkIGluIHRoZSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5KSBhcyB5b3VyIGxpY2Vuc2luZwpAQCAtNDIxLDcgKzQyMSw3IEBACiAKIDxwPlRvIHVzZSBBUEsgZXhwYW5zaW9uIGZpbGVzIHdpdGggeW91ciBhcHBsaWNhdGlvbiBhbmQgcHJvdmlkZSB0aGUgYmVzdCB1c2VyIGV4cGVyaWVuY2Ugd2l0aAogbWluaW1hbCBlZmZvcnQgb24geW91ciBiZWhhbGYsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZSBEb3dubG9hZGVyIExpYnJhcnkgdGhhdCdzIGluY2x1ZGVkIGluIHRoZQotQW5kcm9pZCBNYXJrZXQgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UuIFRoaXMgbGlicmFyeSBkb3dubG9hZHMgeW91ciBleHBhbnNpb24gZmlsZXMgaW4gYQorR29vZ2xlIE1hcmtldCBBcGsgRXhwYW5zaW9uIHBhY2thZ2UuIFRoaXMgbGlicmFyeSBkb3dubG9hZHMgeW91ciBleHBhbnNpb24gZmlsZXMgaW4gYQogYmFja2dyb3VuZCBzZXJ2aWNlLCBzaG93cyBhIHVzZXIgbm90aWZpY2F0aW9uIHdpdGggdGhlIGRvd25sb2FkIHN0YXR1cywgaGFuZGxlcyBuZXR3b3JrCiBjb25uZWN0aXZpdHkgbG9zcywgcmVzdW1lcyB0aGUgZG93bmxvYWQgd2hlbiBwb3NzaWJsZSwgYW5kIG1vcmUuPC9wPgogCkBAIC00NDcsMTAgKzQ0NywxMSBAQAogZG93bmxvYWQgdHdvIHBhY2thZ2VzIGZyb20gdGhlIFNESyBNYW5hZ2VyIGFuZCBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpYnJhcmllcyB0byB5b3VyCiBhcHBsaWNhdGlvbi48L3A+CiAKLTxwPkZpcnN0LCBvcGVuIHRoZSBBbmRyb2lkIFNESyBNYW5hZ2VyLCBleHBhbmQgPGVtPkV4dHJhczwvZW0+IGFuZCBkb3dubG9hZDo8L3A+Cis8cD5GaXJzdCwgb3BlbiB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fXNkay9hZGRpbmctY29tcG9uZW50cy5odG1sIj5BbmRyb2lkIFNESyBNYW5hZ2VyPC9hPiwgZXhwYW5kCis8ZW0+RXh0cmFzPC9lbT4gYW5kIGRvd25sb2FkOjwvcD4KIDx1bD4KICAgPGxpPjxlbT5Hb29nbGUgTWFya2V0IExpY2Vuc2luZyBwYWNrYWdlPC9lbT48L2xpPgotICA8bGk+PGVtPkdvb2dsZSBNYXJrZXQgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2U8L2VtPjwvbGk+CisgIDxsaT48ZW0+R29vZ2xlIE1hcmtldCBBcGsgRXhwYW5zaW9uIHBhY2thZ2U8L2VtPjwvbGk+CiA8L3VsPgogCiA8cD5JZiB5b3UncmUgdXNpbmcgRWNsaXBzZSwgY3JlYXRlIGEgcHJvamVjdCBmb3IgZWFjaCBsaWJyYXJ5IGFuZCBhZGQgaXQgdG8geW91ciBhcHA6PC9wPgpAQCAtNDYzLDcgKzQ2NCw3IEBACiBzb3VyY2U8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgbGlicmFyeSBmcm9tIHRoZSB7QGNvZGUgJmx0O3NkayZndDsvZXh0cmFzL2dvb2dsZS99IGRpcmVjdG9yeQogKHtAY29kZSBtYXJrZXRfbGljZW5zaW5nL30gZm9yIHRoZSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IG9yIHtAY29kZQogbWFya2V0X2Fwa19leHBhbnNpb24vZG93bmxvYWRlcl9saWJyYXJ5L30gZm9yIHRoZSBEb3dubG9hZGVyIExpYnJhcnkpLjwvbGk+Ci0gICAgICA8bGk+U3BlY2lmeSBhIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPiBzdWNoIGFzICJBbmRyb2lkIE1hcmtldCBMaWNlbnNlIExpYnJhcnkiIGFuZCAiTWFya2V0CisgICAgICA8bGk+U3BlY2lmeSBhIDxlbT5Qcm9qZWN0IE5hbWU8L2VtPiBzdWNoIGFzICJHb29nbGUgUGxheSBMaWNlbnNlIExpYnJhcnkiIGFuZCAiR29vZ2xlIFBsYXkKIERvd25sb2FkZXIKIExpYnJhcnkiPC9saT4KICAgICAgIDxsaT5DbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi48L2xpPgpAQCAtNDk0LDE0ICs0OTUsMTQgQEAKIAogPHA+V2l0aCBib3RoIHRoZSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IGFuZCBEb3dubG9hZGVyIExpYnJhcnkgYWRkZWQgdG8geW91cgogYXBwbGljYXRpb24sIHlvdSdsbCBiZSBhYmxlIHRvIHF1aWNrbHkgaW50ZWdyYXRlIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIGV4cGFuc2lvbiBmaWxlcyBmcm9tCi1BbmRyb2lkIE1hcmtldC4gVGhlIGZvcm1hdCB0aGF0IHlvdSBjaG9vc2UgZm9yIHRoZSBleHBhbnNpb24gZmlsZXMgYW5kIGhvdyB5b3UgcmVhZCB0aGVtCitHb29nbGUgUGxheS4gVGhlIGZvcm1hdCB0aGF0IHlvdSBjaG9vc2UgZm9yIHRoZSBleHBhbnNpb24gZmlsZXMgYW5kIGhvdyB5b3UgcmVhZCB0aGVtCiBmcm9tIHRoZSBzaGFyZWQgc3RvcmFnZSBpcyBhIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgeW91IHNob3VsZCBjb25zaWRlciBiYXNlZCBvbiB5b3VyCiBhcHBsaWNhdGlvbiBuZWVkcy48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPlRpcDo8L3N0cm9uZz4gVGhlIEFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlIGluY2x1ZGVzIGEgc2FtcGxlCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5UaXA6PC9zdHJvbmc+IFRoZSBBcGsgRXhwYW5zaW9uIHBhY2thZ2UgaW5jbHVkZXMgYSBzYW1wbGUKIGFwcGxpY2F0aW9uCiB0aGF0IHNob3dzIGhvdyB0byB1c2UgdGhlIERvd25sb2FkZXIgTGlicmFyeSBpbiBhbiBhcHAuIFRoZSBzYW1wbGUgdXNlcyBhIHRoaXJkIGxpYnJhcnkKLWF2YWlsYWJsZSBpbiB0aGUgQVBLIEV4cGFuc2lvbiBMaWJyYXJ5IHBhY2thZ2UgY2FsbGVkIHRoZSBBUEsgRXhwYW5zaW9uIFppcCBMaWJyYXJ5LiBJZgorYXZhaWxhYmxlIGluIHRoZSBBcGsgRXhwYW5zaW9uIHBhY2thZ2UgY2FsbGVkIHRoZSBBUEsgRXhwYW5zaW9uIFppcCBMaWJyYXJ5LiBJZgogeW91IHBsYW4gb24KIHVzaW5nIFpJUCBmaWxlcyBmb3IgeW91ciBleHBhbnNpb24gZmlsZXMsIHdlIHN1Z2dlc3QgeW91IGFsc28gYWRkIHRoZSBBUEsgRXhwYW5zaW9uIFppcCBMaWJyYXJ5IHRvCiB5b3VyIGFwcGxpY2F0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBzZWN0aW9uIGJlbG93CkBAIC01MTcsMTAgKzUxOCwxMCBAQAogCiA8cHJlPgogJmx0O21hbmlmZXN0IC4uLj4KLSAgICAmbHQ7IS0tIFJlcXVpcmVkIHRvIGFjY2VzcyBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcgLS0+CisgICAgJmx0OyEtLSBSZXF1aXJlZCB0byBhY2Nlc3MgR29vZ2xlIFBsYXkgTGljZW5zaW5nIC0tPgogICAgICZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJjb20uYW5kcm9pZC52ZW5kaW5nLkNIRUNLX0xJQ0VOU0UiIC8+CiAKLSAgICAmbHQ7IS0tIFJlcXVpcmVkIHRvIGRvd25sb2FkIGZpbGVzIGZyb20gQW5kcm9pZCBNYXJrZXQgLS0+CisgICAgJmx0OyEtLSBSZXF1aXJlZCB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEdvb2dsZSBQbGF5IC0tPgogICAgICZsdDt1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CiAKICAgICAmbHQ7IS0tIFJlcXVpcmVkIHRvIGtlZXAgQ1BVIGFsaXZlIHdoaWxlIGRvd25sb2FkaW5nIGZpbGVzIChOT1QgdG8ga2VlcCBzY3JlZW4gYXdha2UpIC0tPgpAQCAtNTY5LDcgKzU3MCw3IEBACiA8ZGw+CiAgIDxkdD57QGNvZGUgZ2V0UHVibGljS2V5KCl9PC9kdD4KICAgICA8ZGQ+VGhpcyBtdXN0IHJldHVybiBhIHN0cmluZyB0aGF0IGlzIHRoZSBCYXNlNjQtZW5jb2RlZCBSU0EgcHVibGljIGtleSBmb3IgeW91ciBwdWJsaXNoZXIKLWFjY291bnQsIGF2YWlsYWJsZSBmcm9tIHRoZSBwcm9maWxlIHBhZ2Ugb24gdGhlIEFuZHJvaWQgTWFya2V0IERldmVsb3BlciBDb25zb2xlIChzZWUgPGEKK2FjY291bnQsIGF2YWlsYWJsZSBmcm9tIHRoZSBwcm9maWxlIHBhZ2Ugb24gdGhlIERldmVsb3BlciBDb25zb2xlIChzZWUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL3NldHRpbmctdXAuaHRtbCI+U2V0dGluZyBVcCBmb3IgTGljZW5zaW5nPC9hPikuPC9kZD4KICAgPGR0PntAY29kZSBnZXRTQUxUKCl9PC9kdD4KICAgICA8ZGQ+VGhpcyBtdXN0IHJldHVybiBhbiBhcnJheSBvZiByYW5kb20gYnl0ZXMgdGhhdCB0aGUgbGljZW5zaW5nIHtAY29kZSBQb2xpY3l9IHVzZXMgdG8KQEAgLTU4OCw3ICs1ODksNyBAQAogPHByZT4KIHB1YmxpYyBjbGFzcyBTYW1wbGVEb3dubG9hZGVyU2VydmljZSBleHRlbmRzIERvd25sb2FkZXJTZXJ2aWNlIHsKICAgICAvLyBZb3UgbXVzdCB1c2UgdGhlIHB1YmxpYyBrZXkgYmVsb25naW5nIHRvIHlvdXIgcHVibGlzaGVyIGFjY291bnQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFNjRfUFVCTElDX0tFWSA9ICJZb3VyQW5kcm9pZE1hcmtldExWTEtleSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRTY0X1BVQkxJQ19LRVkgPSAiWW91ckxWTEtleSI7CiAgICAgLy8gWW91IHNob3VsZCBhbHNvIG1vZGlmeSB0aGlzIHNhbHQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBTQUxUID0gbmV3IGJ5dGVbXSB7IDEsIDQyLCAtMTIsIC0xLCA1NCwgOTgsCiAgICAgICAgICAgICAtMTAwLCAtMTIsIDQzLCAyLCAtOCwgLTQsIDksIDUsIC0xMDYsIC0xMDcsIC0zMywgNDUsIC0xLCA4NApAQCAtNjEyLDggKzYxMyw4IEBACiA8L3ByZT4KIAogPHAgY2xhc3M9ImNhdXRpb24iPjxzdHJvbmc+Tm90aWNlOjwvc3Ryb25nPiBZb3UgbXVzdCB1cGRhdGUgdGhlIHtAY29kZSBCQVNFNjRfUFVCTElDX0tFWX0gdmFsdWUKLXRvIGJlIHRoZSBwdWJsaWMga2V5IGJlbG9uZ2luZyB0byB5b3VyIHB1Ymxpc2hlciBhY2NvdW50LiBZb3UgY2FuIGZpbmQgdGhlIGtleSBpbiB0aGUgQW5kcm9pZAotTWFya2V0IERldmVsb3BlciBDb25zb2xlIHVuZGVyIHlvdXIgcHJvZmlsZSBpbmZvcm1hdGlvbi4gVGhpcyBpcyBuZWNlc3NhcnkgZXZlbiB3aGVuIHRlc3RpbmcKK3RvIGJlIHRoZSBwdWJsaWMga2V5IGJlbG9uZ2luZyB0byB5b3VyIHB1Ymxpc2hlciBhY2NvdW50LiBZb3UgY2FuIGZpbmQgdGhlIGtleSBpbiB0aGUgRGV2ZWxvcGVyCitDb25zb2xlIHVuZGVyIHlvdXIgcHJvZmlsZSBpbmZvcm1hdGlvbi4gVGhpcyBpcyBuZWNlc3NhcnkgZXZlbiB3aGVuIHRlc3RpbmcKIHlvdXIgZG93bmxvYWRzLjwvcD4KIAogPHA+UmVtZW1iZXIgdG8gZGVjbGFyZSB0aGUgc2VydmljZSBpbiB5b3VyIG1hbmlmZXN0IGZpbGU6PC9wPgpAQCAtNjg2LDcgKzY4Nyw3IEBACiB2ZXJzaW9uQ29kZSl9PC9saT4KICAgICA8bGk+e0Bjb2RlIGRvZXNGaWxlRXhpc3QoQ29udGV4dCBjLCBTdHJpbmcgZmlsZU5hbWUsIGxvbmcgZmlsZVNpemUpfTwvbGk+CiAgIDwvdWw+Ci0gICAgPHA+Rm9yIGV4YW1wbGUsIHRoZSBzYW1wbGUgYXBwIHByb3ZpZGVkIGluIHRoZSBBUEsgRXhwYW5zaW9uIExpYnJhcnkgcGFja2FnZSBjYWxscyB0aGUKKyAgICA8cD5Gb3IgZXhhbXBsZSwgdGhlIHNhbXBsZSBhcHAgcHJvdmlkZWQgaW4gdGhlIEFwayBFeHBhbnNpb24gcGFja2FnZSBjYWxscyB0aGUKIGZvbGxvd2luZyBtZXRob2QgaW4gdGhlIGFjdGl2aXR5J3Mge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uQ3JlYXRlIG9uQ3JlYXRlKCl9IG1ldGhvZCB0byBjaGVjawogd2hldGhlciB0aGUgZXhwYW5zaW9uIGZpbGVzIGFscmVhZHkgZXhpc3Qgb24gdGhlIGRldmljZTo8L3A+CiA8cHJlPgpAQCAtODcyLDcgKzg3Myw3IEBACiA8L2RsPgogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+VGlwOjwvc3Ryb25nPiBGb3IgZXhhbXBsZXMgb2YgdGhlc2UgY2FsbGJhY2tzIHRoYXQgdXBkYXRlIHRoZSBkb3dubG9hZAogcHJvZ3Jlc3MgVUksIHNlZSB0aGUge0Bjb2RlIFNhbXBsZURvd25sb2FkZXJBY3Rpdml0eX0gaW4gdGhlIHNhbXBsZSBhcHAgcHJvdmlkZWQgd2l0aCB0aGUKLUFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlLjwvcD4KK0FwayBFeHBhbnNpb24gcGFja2FnZS48L3A+CiAKIDxwPlNvbWUgcHVibGljIG1ldGhvZHMgZm9yIHRoZSB7QGNvZGUgSURvd25sb2FkZXJTZXJ2aWNlfSBpbnRlcmZhY2UgeW91IG1pZ2h0IGZpbmQgdXNlZnVsIGFyZTo8L3A+CiAKQEAgLTg5OCwxMSArODk5LDExIEBACiAKIDxoMiBpZD0iRXhwYW5zaW9uUG9saWN5Ij5Vc2luZyBBUEtFeHBhbnNpb25Qb2xpY3k8L2gyPgogCi08cD5JZiB5b3UgZGVjaWRlIHRvIGJ1aWxkIHlvdXIgb3duIGRvd25sb2FkZXIgc2VydmljZSBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBBbmRyb2lkIE1hcmtldAorPHA+SWYgeW91IGRlY2lkZSB0byBidWlsZCB5b3VyIG93biBkb3dubG9hZGVyIHNlcnZpY2UgaW5zdGVhZCBvZiB1c2luZyB0aGUgR29vZ2xlIFBsYXkKIDxhIGhyZWY9IiNBYm91dExpYnJhcmllcyI+RG93bmxvYWRlciBMaWJyYXJ5PC9hPiwgeW91IHNob3VsZCBzdGlsbCB1c2UgdGhlIHtAY29kZQogQVBLRXhwYW5zaW9uUG9saWN5fSB0aGF0J3MgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkuIFRoZSB7QGNvZGUKIEFQS0V4cGFuc2lvblBvbGljeX0gY2xhc3MgaXMgbmVhcmx5IGlkZW50aWNhbCB0byB7QGNvZGUgU2VydmVyTWFuYWdlZFBvbGljeX0gKGF2YWlsYWJsZSBpbiB0aGUKLUFuZHJvaWQgTWFya2V0IExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkpIGJ1dCBpbmNsdWRlcyBhZGRpdGlvbmFsIGhhbmRsaW5nIGZvciB0aGUgQVBLIGV4cGFuc2lvbgorR29vZ2xlIFBsYXkgTGljZW5zZSBWZXJpZmljYXRpb24gTGlicmFyeSkgYnV0IGluY2x1ZGVzIGFkZGl0aW9uYWwgaGFuZGxpbmcgZm9yIHRoZSBBUEsgZXhwYW5zaW9uCiBmaWxlIHJlc3BvbnNlIGV4dHJhcy48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSA8ZW0+ZG8gdXNlPC9lbT4gdGhlIDxhCkBAIC0xMDM3LDcgKzEwMzgsNyBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPHA+VGhlIEFuZHJvaWQgTWFya2V0IEFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlIGluY2x1ZGVzIGEgbGlicmFyeSBjYWxsZWQgdGhlIEFQSworPHA+VGhlIEdvb2dsZSBNYXJrZXQgQXBrIEV4cGFuc2lvbiBwYWNrYWdlIGluY2x1ZGVzIGEgbGlicmFyeSBjYWxsZWQgdGhlIEFQSwogRXhwYW5zaW9uIFppcCBMaWJyYXJ5IChsb2NhdGVkIGluIHtAY29kZQogJmx0O3Nkaz4vZXh0cmFzL2dvb2dsZS9nb29nbGVfbWFya2V0X2Fwa19leHBhbnNpb24vemlwX2ZpbGUvfSkuIFRoaXMgaXMgYW4gb3B0aW9uYWwgbGlicmFyeSB0aGF0CiBoZWxwcyB5b3UgcmVhZCB5b3VyIGV4cGFuc2lvbgpAQCAtMTA4OSw3ICsxMDkwLDcgQEAKIHByb3ZpZGVyIHtAbGluayBhbmRyb2lkLm5ldC5Vcml9IGluIG9yZGVyIHRvIHByb3ZpZGUgZmlsZSBhY2Nlc3MgZm9yIGNlcnRhaW4gQW5kcm9pZCBBUElzIHRoYXQKIGV4cGVjdCB7QGxpbmsgYW5kcm9pZC5uZXQuVXJpfSBhY2Nlc3MgdG8gbWVkaWEgZmlsZXMuCiAgICAgICA8cD5UaGUgc2FtcGxlIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSBpbiB0aGUKLUFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlIGRlbW9uc3RyYXRlcyBhIHNjZW5hcmlvIGluIHdoaWNoIHRoaXMgY2xhc3MgaXMgdXNlZnVsCitBcGsgRXhwYW5zaW9uIHBhY2thZ2UgZGVtb25zdHJhdGVzIGEgc2NlbmFyaW8gaW4gd2hpY2ggdGhpcyBjbGFzcyBpcyB1c2VmdWwKIHRvIHNwZWNpZnkgYSB2aWRlbyB3aXRoIHtAbGluayBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcjc2V0VmlkZW9VUkkKIFZpZGVvVmlldy5zZXRWaWRlb1VSSSgpfS4gU2VlIHRoZSBzYW1wbGUgYXBwJ3MgY2xhc3Mge0Bjb2RlIFNhbXBsZVppcGZpbGVQcm92aWRlcn0gZm9yIGFuCiBleGFtcGxlIG9mIGhvdyB0byBleHRlbmQgdGhpcyBjbGFzcyB0byB1c2UgaW4geW91ciBhcHBsaWNhdGlvbi48L3A+PC9kZD4KQEAgLTExNDMsMjEgKzExNDQsMjEgQEAKIAogPGgzIGlkPSJUZXN0aW5nUmVhZGluZyI+VGVzdGluZyBmaWxlIHJlYWRzPC9oMz4KIAotPHA+QmVmb3JlIHlvdSB1cGxvYWQgeW91ciBhcHBsaWNhdGlvbiB0byBBbmRyb2lkIE1hcmtldCwgeW91Cis8cD5CZWZvcmUgeW91IHVwbG9hZCB5b3VyIGFwcGxpY2F0aW9uIHRvIEdvb2dsZSBQbGF5LCB5b3UKIHNob3VsZCB0ZXN0IHlvdXIgYXBwbGljYXRpb24ncyBhYmlsaXR5IHRvIHJlYWQgdGhlIGZpbGVzIGZyb20gdGhlIHNoYXJlZCBzdG9yYWdlLiBBbGwgeW91IG5lZWQgdG8gZG8KIGlzIGFkZCB0aGUgZmlsZXMgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uIG9uIHRoZSBkZXZpY2Ugc2hhcmVkIHN0b3JhZ2UgYW5kIGxhdW5jaCB5b3VyCiBhcHBsaWNhdGlvbjo8L3A+CiAKIDxvbD4KLSAgPGxpPk9uIHlvdXIgZGV2aWNlLCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBvbiB0aGUgc2hhcmVkIHN0b3JhZ2Ugd2hlcmUgQW5kcm9pZAotTWFya2V0IHdpbGwgc2F2ZSB5b3VyIGZpbGVzLgorICA8bGk+T24geW91ciBkZXZpY2UsIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5IG9uIHRoZSBzaGFyZWQgc3RvcmFnZSB3aGVyZSBHb29nbGUKK1BsYXkgd2lsbCBzYXZlIHlvdXIgZmlsZXMuCiAgIDxwPkZvciBleGFtcGxlLCBpZiB5b3VyIHBhY2thZ2UgbmFtZSBpcyB7QGNvZGUgY29tLmV4YW1wbGUuYW5kcm9pZH0sIHlvdSBuZWVkIHRvIGNyZWF0ZQogdGhlIGRpcmVjdG9yeSB7QGNvZGUgQW5kcm9pZC9vYmIvY29tLmV4YW1wbGUuYW5kcm9pZC99IG9uIHRoZSBzaGFyZWQgc3RvcmFnZSBzcGFjZS4gKFBsdWcgaW4KIHlvdXIgdGVzdCBkZXZpY2UgdG8geW91ciBjb21wdXRlciB0byBtb3VudCB0aGUgc2hhcmVkIHN0b3JhZ2UgYW5kIG1hbnVhbGx5IGNyZWF0ZSB0aGlzCiBkaXJlY3RvcnkuKTwvcD4KICAgPC9saT4KICAgPGxpPk1hbnVhbGx5IGFkZCB0aGUgZXhwYW5zaW9uIGZpbGVzIHRvIHRoYXQgZGlyZWN0b3J5LiBCZSBzdXJlIHRoYXQgeW91IHJlbmFtZSB5b3VyIGZpbGVzIHRvCi1tYXRjaCB0aGUgPGEgaHJlZj0iI0ZpbGVuYW1lIj5maWxlIG5hbWUgZm9ybWF0PC9hPiB0aGF0IEFuZHJvaWQgTWFya2V0IHdpbGwgdXNlLgorbWF0Y2ggdGhlIDxhIGhyZWY9IiNGaWxlbmFtZSI+ZmlsZSBuYW1lIGZvcm1hdDwvYT4gdGhhdCBHb29nbGUgUGxheSB3aWxsIHVzZS4KICAgPHA+Rm9yIGV4YW1wbGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGZpbGUgdHlwZSwgdGhlIG1haW4gZXhwYW5zaW9uIGZpbGUgZm9yIHRoZSB7QGNvZGUKIGNvbS5leGFtcGxlLmFuZHJvaWR9IGFwcGxpY2F0aW9uIHNob3VsZCBiZSB7QGNvZGUgbWFpbi4wMzAwMTEwLmNvbS5leGFtcGxlLmFuZHJvaWQub2JifS4KIFRoZSB2ZXJzaW9uIGNvZGUgY2FuIGJlIHdoYXRldmVyIHZhbHVlIHlvdSB3YW50LiBKdXN0IHJlbWVtYmVyOjwvcD4KQEAgLTExNjUsNyArMTE2Niw3IEBACiAgICAgPGxpPlRoZSBtYWluIGV4cGFuc2lvbiBmaWxlIGFsd2F5cyBzdGFydHMgd2l0aCB7QGNvZGUgbWFpbn0gYW5kIHRoZSBwYXRjaCBmaWxlIHN0YXJ0cyB3aXRoCiB7QGNvZGUgcGF0Y2h9LjwvbGk+CiAgICAgPGxpPlRoZSBwYWNrYWdlIG5hbWUgYWx3YXlzIG1hdGNoZXMgdGhhdCBvZiB0aGUgQVBLIHRvIHdoaWNoIHRoZSBmaWxlIGlzIGF0dGFjaGVkIG9uCi1BbmRyb2lkIE1hcmtldC4KK0dvb2dsZSBQbGF5LgogICA8L3VsPgogICA8L2xpPgogICA8bGk+Tm93IHRoYXQgdGhlIGV4cGFuc2lvbiBmaWxlKHMpIGFyZSBvbiB0aGUgZGV2aWNlLCB5b3UgY2FuIGluc3RhbGwgYW5kIHJ1biB5b3VyIGFwcGxpY2F0aW9uIHRvCkBAIC0xMTc1LDcgKzExNzYsNyBAQAogPHA+SGVyZSBhcmUgc29tZSByZW1pbmRlcnMgYWJvdXQgaGFuZGxpbmcgdGhlIGV4cGFuc2lvbiBmaWxlczo8L3A+CiA8dWw+CiAgIDxsaT48c3Ryb25nPkRvIG5vdCBkZWxldGUgb3IgcmVuYW1lPC9zdHJvbmc+IHRoZSB7QGNvZGUgLm9iYn0gZXhwYW5zaW9uIGZpbGVzIChldmVuIGlmIHlvdSB1bnBhY2sKLXRoZSBkYXRhIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uKS4gRG9pbmcgc28gd2lsbCBjYXVzZSBBbmRyb2lkIE1hcmtldCAob3IgeW91ciBhcHAgaXRzZWxmKSB0bwordGhlIGRhdGEgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24pLiBEb2luZyBzbyB3aWxsIGNhdXNlIEdvb2dsZSBQbGF5IChvciB5b3VyIGFwcCBpdHNlbGYpIHRvCiByZXBlYXRlZGx5IGRvd25sb2FkIHRoZSBleHBhbnNpb24gZmlsZS48L2xpPgogICA8bGk+PHN0cm9uZz5EbyBub3Qgc2F2ZSBvdGhlciBkYXRhIGludG8geW91ciA8Y29kZT5vYmIvPC9jb2RlPgogZGlyZWN0b3J5PC9zdHJvbmc+LiBJZiB5b3UgbXVzdCB1bnBhY2sgc29tZSBkYXRhLCBzYXZlIGl0IGludG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSB7QGxpbmsKQEAgLTExOTEsMTYgKzExOTIsMTYgQEAKIGZvciB0aGUgVVJMcywgZG93bmxvYWQgdGhlIGZpbGVzLCBhbmQgc2F2ZSB0aGVtIHRvIHRoZSBkZXZpY2UuPC9wPgogCiA8cD5UbyB0ZXN0IHlvdXIgYXBwbGljYXRpb24ncyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWFudWFsIGRvd25sb2FkIHByb2NlZHVyZSwgeW91IG11c3QgdXBsb2FkCi15b3VyIGFwcGxpY2F0aW9uIHRvIEFuZHJvaWQgTWFya2V0IGFzIGEgImRyYWZ0IiB0byBtYWtlIHlvdXIgZXhwYW5zaW9uIGZpbGVzIGF2YWlsYWJsZSBmb3IKK3lvdXIgYXBwbGljYXRpb24gdG8gR29vZ2xlIFBsYXkgYXMgYSAiZHJhZnQiIHRvIG1ha2UgeW91ciBleHBhbnNpb24gZmlsZXMgYXZhaWxhYmxlIGZvcgogZG93bmxvYWQ6PC9wPgogCiA8b2w+Ci0gIDxsaT5VcGxvYWQgeW91ciBBUEsgYW5kIGNvcnJlc3BvbmRpbmcgZXhwYW5zaW9uIGZpbGVzIHVzaW5nIHRoZSBBbmRyb2lkIE1hcmtldCBEZXZlbG9wZXIKKyAgPGxpPlVwbG9hZCB5b3VyIEFQSyBhbmQgY29ycmVzcG9uZGluZyBleHBhbnNpb24gZmlsZXMgdXNpbmcgdGhlIEdvb2dsZSBQbGF5IERldmVsb3BlcgogQ29uc29sZS48L2xpPgogICA8bGk+RmlsbCBpbiB0aGUgbmVjZXNzYXJ5IGFwcGxpY2F0aW9uIGRldGFpbHMgKHRpdGxlLCBzY3JlZW5zaG90cywgZXRjLikuIFlvdSBjYW4gY29tZSBiYWNrIGFuZAogZmluYWxpemUgdGhlc2UgZGV0YWlscyBiZWZvcmUgcHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uLgogICA8cD5DbGljayB0aGUgPHN0cm9uZz5TYXZlPC9zdHJvbmc+IGJ1dHRvbi4gPGVtPkRvIG5vdCBjbGljayBQdWJsaXNoLjwvZW0+IFRoaXMgc2F2ZXMKLXRoZSBhcHBsaWNhdGlvbiBhcyBhIGRyYWZ0LCBzdWNoIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpcyBub3QgcHVibGlzaGVkIGZvciBBbmRyb2lkIE1hcmtldCB1c2VycywKK3RoZSBhcHBsaWNhdGlvbiBhcyBhIGRyYWZ0LCBzdWNoIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpcyBub3QgcHVibGlzaGVkIGZvciBHb29nbGUgUGxheSB1c2VycywKIGJ1dCB0aGUgZXhwYW5zaW9uIGZpbGVzIGFyZSBhdmFpbGFibGUgZm9yIHlvdSB0byB0ZXN0IHRoZSBkb3dubG9hZCBwcm9jZXNzLjwvcD48L2xpPgogICA8bGk+SW5zdGFsbCB0aGUgYXBwbGljYXRpb24gb24geW91ciB0ZXN0IGRldmljZSB1c2luZyB0aGUgRWNsaXBzZSB0b29scyBvciA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL2RldmVsb3BpbmcvdG9vbHMvYWRiLmh0bWwiPntAY29kZSBhZGJ9PC9hPi48L2xpPgpAQCAtMTIxNSwyOSArMTIxNiwyOSBAQAogCiA8aDIgaWQ9IlVwZGF0aW5nIj5VcGRhdGluZyBZb3VyIEFwcGxpY2F0aW9uPC9oMj4KIAotPHA+T25lIG9mIHRoZSBncmVhdCBiZW5lZml0cyB0byB1c2luZyBleHBhbnNpb24gZmlsZXMgb24gQW5kcm9pZCBNYXJrZXQgaXMgdGhlIGFiaWxpdHkgdG8KLXVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGhvdXQgcmUtZG93bmxvYWRpbmcgYWxsIG9mIHRoZSBvcmlnaW5hbCBhc3NldHMuIEJlY2F1c2UgQW5kcm9pZCBNYXJrZXQKKzxwPk9uZSBvZiB0aGUgZ3JlYXQgYmVuZWZpdHMgdG8gdXNpbmcgZXhwYW5zaW9uIGZpbGVzIG9uIEdvb2dsZSBQbGF5IGlzIHRoZSBhYmlsaXR5IHRvCit1cGRhdGUgeW91ciBhcHBsaWNhdGlvbiB3aXRob3V0IHJlLWRvd25sb2FkaW5nIGFsbCBvZiB0aGUgb3JpZ2luYWwgYXNzZXRzLiBCZWNhdXNlIEdvb2dsZSBQbGF5CiBhbGxvd3MgeW91IHRvIHByb3ZpZGUgdHdvIGV4cGFuc2lvbiBmaWxlcyB3aXRoIGVhY2ggQVBLLCB5b3UgY2FuIHVzZSB0aGUgc2Vjb25kIGZpbGUgYXMgYSAicGF0Y2giCiB0aGF0IHByb3ZpZGVzIHVwZGF0ZXMgYW5kIG5ldyBhc3NldHMuIERvaW5nIHNvIGF2b2lkcyB0aGUKIG5lZWQgdG8gcmUtZG93bmxvYWQgdGhlIG1haW4gZXhwYW5zaW9uIGZpbGUgd2hpY2ggY291bGQgYmUgbGFyZ2UgYW5kIGV4cGVuc2l2ZSBmb3IgdXNlcnMuPC9wPgogCiA8cD5UaGUgcGF0Y2ggZXhwYW5zaW9uIGZpbGUgaXMgdGVjaG5pY2FsbHkgdGhlIHNhbWUgYXMgdGhlIG1haW4gZXhwYW5zaW9uIGZpbGUgYW5kIG5laXRoZXIKLXRoZSBBbmRyb2lkIHN5c3RlbSBub3IgQW5kcm9pZCBNYXJrZXQgcGVyZm9ybSBhY3R1YWwgcGF0Y2hpbmcgYmV0d2VlbiB5b3VyIG1haW4gYW5kIHBhdGNoIGV4cGFuc2lvbgordGhlIEFuZHJvaWQgc3lzdGVtIG5vciBHb29nbGUgUGxheSBwZXJmb3JtIGFjdHVhbCBwYXRjaGluZyBiZXR3ZWVuIHlvdXIgbWFpbiBhbmQgcGF0Y2ggZXhwYW5zaW9uCiBmaWxlcy4gWW91ciBhcHBsaWNhdGlvbiBjb2RlIG11c3QgcGVyZm9ybSBhbnkgbmVjZXNzYXJ5IHBhdGNoZXMgaXRzZWxmLjwvcD4KIAogPHA+SWYgeW91IHVzZSBaSVAgZmlsZXMgYXMgeW91ciBleHBhbnNpb24gZmlsZXMsIHRoZSA8YSBocmVmPSIjWmlwTGliIj5BUEsgRXhwYW5zaW9uIFppcAotTGlicmFyeTwvYT4gdGhhdCdzIGluY2x1ZGVkIHdpdGggdGhlIEFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlIGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvIG1lcmdlCitMaWJyYXJ5PC9hPiB0aGF0J3MgaW5jbHVkZWQgd2l0aCB0aGUgQXBrIEV4cGFuc2lvbiBwYWNrYWdlIGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvIG1lcmdlCiB5b3VyCiBwYXRjaCBmaWxlIHdpdGggdGhlIG1haW4gZXhwYW5zaW9uIGZpbGUuPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBFdmVuIGlmIHlvdSBvbmx5IG5lZWQgdG8gbWFrZSBjaGFuZ2VzIHRvIHRoZSBwYXRjaAotZXhwYW5zaW9uIGZpbGUsIHlvdSBtdXN0IHN0aWxsIHVwZGF0ZSB0aGUgQVBLIGluIG9yZGVyIGZvciBBbmRyb2lkIE1hcmtldCB0byBwZXJmb3JtIGFuIHVwZGF0ZS4KK2V4cGFuc2lvbiBmaWxlLCB5b3UgbXVzdCBzdGlsbCB1cGRhdGUgdGhlIEFQSyBpbiBvcmRlciBmb3IgR29vZ2xlIFBsYXkgdG8gcGVyZm9ybSBhbiB1cGRhdGUuCiBJZiB5b3UgZG9uJ3QgcmVxdWlyZSBjb2RlIGNoYW5nZXMgaW4gdGhlIGFwcGxpY2F0aW9uLCB5b3Ugc2hvdWxkIHNpbXBseSB1cGRhdGUgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCN2Y29kZSI+e0Bjb2RlIHZlcnNpb25Db2RlfTwvYT4gaW4gdGhlCiBtYW5pZmVzdC48L3A+CiAKIDxwPkFzIGxvbmcgYXMgeW91IGRvbid0IGNoYW5nZSB0aGUgbWFpbiBleHBhbnNpb24gZmlsZSB0aGF0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBBUEsKLWluIHRoZSBBbmRyb2lkIE1hcmtldCBEZXZlbG9wZXIgQ29uc29sZSwgdXNlcnMgd2hvIHByZXZpb3VzbHkgaW5zdGFsbGVkIHlvdXIgYXBwbGljYXRpb24gd2lsbCBub3QKK2luIHRoZSBEZXZlbG9wZXIgQ29uc29sZSwgdXNlcnMgd2hvIHByZXZpb3VzbHkgaW5zdGFsbGVkIHlvdXIgYXBwbGljYXRpb24gd2lsbCBub3QKIGRvd25sb2FkIHRoZSBtYWluIGV4cGFuc2lvbiBmaWxlLiBFeGlzdGluZyB1c2VycyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgQVBLIGFuZCB0aGUgbmV3IHBhdGNoCiBleHBhbnNpb24gZmlsZSAocmV0YWluaW5nIHRoZSBwcmV2aW91cyBtYWluIGV4cGFuc2lvbiBmaWxlKS48L3A+CiAKQEAgLTEyNDUsMTEgKzEyNDYsMTEgQEAKIAogPHVsPgogICA8bGk+VGhlcmUgY2FuIGJlIG9ubHkgdHdvIGV4cGFuc2lvbiBmaWxlcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBhdCBhIHRpbWUuIE9uZSBtYWluIGV4cGFuc2lvbgotZmlsZSBhbmQgb25lIHBhdGNoIGV4cGFuc2lvbiBmaWxlLiBEdXJpbmcgYW4gdXBkYXRlIHRvIGEgZmlsZSwgQW5kcm9pZCBNYXJrZXQgZGVsZXRlcyB0aGUKK2ZpbGUgYW5kIG9uZSBwYXRjaCBleHBhbnNpb24gZmlsZS4gRHVyaW5nIGFuIHVwZGF0ZSB0byBhIGZpbGUsIEdvb2dsZSBQbGF5IGRlbGV0ZXMgdGhlCiBwcmV2aW91cyB2ZXJzaW9uIChhbmQgc28gbXVzdCB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gcGVyZm9ybWluZyBtYW51YWwgdXBkYXRlcykuPC9saT4KICAgPGxpPldoZW4gYWRkaW5nIGEgcGF0Y2ggZXhwYW5zaW9uIGZpbGUsIHRoZSBBbmRyb2lkIHN5c3RlbSBkb2VzIG5vdCBhY3R1YWxseSBwYXRjaCB5b3VyCiBhcHBsaWNhdGlvbiBvciBtYWluIGV4cGFuc2lvbiBmaWxlLiBZb3UgbXVzdCBkZXNpZ24geW91ciBhcHBsaWNhdGlvbiB0byBzdXBwb3J0IHRoZSBwYXRjaCBkYXRhLgotSG93ZXZlciwgdGhlIEFQSyBFeHBhbnNpb24gTGlicmFyeSBwYWNrYWdlIGluY2x1ZGVzIGEgbGlicmFyeSBmb3IgdXNpbmcgWklQIGZpbGVzCitIb3dldmVyLCB0aGUgQXBrIEV4cGFuc2lvbiBwYWNrYWdlIGluY2x1ZGVzIGEgbGlicmFyeSBmb3IgdXNpbmcgWklQIGZpbGVzCiBhcyBleHBhbnNpb24gZmlsZXMsIHdoaWNoIG1lcmdlcyB0aGUgZGF0YSBmcm9tIHRoZSBwYXRjaCBmaWxlIGludG8gdGhlIG1haW4gZXhwYW5zaW9uIGZpbGUgc28KIHlvdSBjYW4gZWFzaWx5IHJlYWQgYWxsIHRoZSBleHBhbnNpb24gZmlsZSBkYXRhLjwvbGk+CiA8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvYWRkaW5nLWxpY2Vuc2luZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2FkZGluZy1saWNlbnNpbmcuamQKaW5kZXggZDFmZTgzOS4uZDRkZDAwOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvYWRkaW5nLWxpY2Vuc2luZy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9hZGRpbmctbGljZW5zaW5nLmpkCkBAIC04Miw3ICs4Miw3IEBACiAKIDxoMiBpZD0ibWFuaWZlc3QtcGVybWlzc2lvbiI+QWRkaW5nIHRoZSBMaWNlbnNpbmcgUGVybWlzc2lvbjwvaDI+CiAKLTxwPlRvIHVzZSB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gZm9yIHNlbmRpbmcgYSBsaWNlbnNlIGNoZWNrIHRvIHRoZQorPHA+VG8gdXNlIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBmb3Igc2VuZGluZyBhIGxpY2Vuc2UgY2hlY2sgdG8gdGhlCiBzZXJ2ZXIsIHlvdXIgYXBwbGljYXRpb24gbXVzdCByZXF1ZXN0IHRoZSBwcm9wZXIgcGVybWlzc2lvbiwKIDxjb2RlPmNvbS5hbmRyb2lkLnZlbmRpbmcuQ0hFQ0tfTElDRU5TRTwvY29kZT4uIElmIHlvdXIgYXBwbGljYXRpb24gZG9lcwogbm90IGRlY2xhcmUgdGhlIGxpY2Vuc2luZyBwZXJtaXNzaW9uIGJ1dCBhdHRlbXB0cyB0byBpbml0aWF0ZSBhIGxpY2Vuc2UgY2hlY2ssCkBAIC0xMDEsNyArMTAxLDcgQEAKIDxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPyZndDsKIAogJmx0O21hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgLi4uIiZndDsKLSAgICAmbHQ7IS0tIERldmljZXMgJmd0Oz0gMyBoYXZlIHZlcnNpb24gb2YgQW5kcm9pZCBNYXJrZXQgdGhhdCBzdXBwb3J0cyBsaWNlbnNpbmcuIC0tJmd0OworICAgICZsdDshLS0gRGV2aWNlcyAmZ3Q7PSAzIGhhdmUgdmVyc2lvbiBvZiBHb29nbGUgUGxheSB0aGF0IHN1cHBvcnRzIGxpY2Vuc2luZy4gLS0mZ3Q7CiAgICAgJmx0O3VzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIgLyZndDsKICAgICAmbHQ7IS0tIFJlcXVpcmVkIHBlcm1pc3Npb24gdG8gY2hlY2sgbGljZW5zaW5nLiAtLSZndDsKICAgICAmbHQ7dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iY29tLmFuZHJvaWQudmVuZGluZy5DSEVDS19MSUNFTlNFIiAvJmd0OwpAQCAtMTIzLDcgKzEyMyw3IEBACiA8aDI+U2VydmVyTWFuYWdlZFBvbGljeTwvaDI+CiAKIDxwPlRoZSBMVkwgaW5jbHVkZXMgYSBjb21wbGV0ZSB7QGNvZGUgUG9saWN5fSBpbXBsZW1lbnRhdGlvbiBjYWxsZWQgU2VydmVyTWFuYWdlZFBvbGljeQotdGhhdCBtYWtlcyB1c2Ugb2YgbGljZW5zZS1tYW5hZ2VtZW50IHNldHRpbmdzIHByb3ZpZGVkIGJ5IHRoZSBBbmRyb2lkIE1hcmtldAordGhhdCBtYWtlcyB1c2Ugb2YgbGljZW5zZS1tYW5hZ2VtZW50IHNldHRpbmdzIHByb3ZpZGVkIGJ5IHRoZSBHb29nbGUgUGxheQogc2VydmVyLiA8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tdG9wOi41ZW07Ij5Vc2Ugb2YgU2VydmVyTWFuYWdlZFBvbGljeSBhcyB0aGUgYmFzaXMgZm9yIHlvdXIKQEAgLTEzMyw3ICsxMzMsNyBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPHA+QW5kcm9pZCBNYXJrZXQgbGljZW5zaW5nIHNlcnZpY2UgZG9lcyBub3QgaXRzZWxmIGRldGVybWluZSB3aGV0aGVyIGEKKzxwPkdvb2dsZSBQbGF5IGxpY2Vuc2luZyBzZXJ2aWNlIGRvZXMgbm90IGl0c2VsZiBkZXRlcm1pbmUgd2hldGhlciBhCiBnaXZlbiB1c2VyIHdpdGggYSBnaXZlbiBsaWNlbnNlIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyB0byB5b3VyIGFwcGxpY2F0aW9uLgogUmF0aGVyLCB0aGF0IHJlc3BvbnNpYmlsaXR5IGlzIGxlZnQgdG8gYSB7QGNvZGUgUG9saWN5fSBpbXBsZW1lbnRhdGlvbiB0aGF0IHlvdSBwcm92aWRlCiBpbiB5b3VyIGFwcGxpY2F0aW9uLjwvcD4KQEAgLTIyNyw3ICsyMjcsNyBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvbGljZW5zaW5nLXJlZmVyZW5jZS5odG1sI2V4dHJhcyI+U2VydmVyIFJlc3BvbnNlIEV4dHJhczwvYT4KIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvbGk+CiA8bGk+VXNlcyBhbiBleHBvbmVudGlhbCBiYWNrb2ZmIHBlcmlvZCwgaWYgcmV0cnlpbmcgYW55IHJlcXVlc3RzIHRoZSByZXN1bHQgaW4KLWVycm9ycy4gTm90ZSB0aGF0IHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgYXV0b21hdGljYWxseSByZXRyaWVzIGZhaWxlZAorZXJyb3JzLiBOb3RlIHRoYXQgdGhlIEdvb2dsZSBQbGF5IGNsaWVudCBhdXRvbWF0aWNhbGx5IHJldHJpZXMgZmFpbGVkCiByZXF1ZXN0cywgc28gaW4gbW9zdCBjYXNlcyB0aGVyZSBpcyBubyBuZWVkIGZvciB5b3VyIHtAY29kZSBQb2xpY3l9IHRvIHJldHJ5IHRoZW0uPC9saT4KIDxsaT5Qcm92aWRlcyBmb3IgYSAiZ3JhY2UgcGVyaW9kIiB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBhY2Nlc3MgeW91cgogYXBwbGljYXRpb24gZm9yIGEgbGltaXRlZCB0aW1lIG9yIG51bWJlciBvZiB1c2VzLCB3aGlsZSBhIGxpY2Vuc2UgY2hlY2sgaXMgYmVpbmcKQEAgLTI4Niw3ICsyODYsNyBAQAogPHA+SW1wb3J0YW50bHksIGEga2V5IGZlYXR1cmUgb2YgU2VydmVyTWFuZ2VkUG9saWN5IGlzIGl0cyB1c2Ugb2YKIHNlcnZlci1wcm92aWRlZCBzZXR0aW5ncyBhcyB0aGUgYmFzaXMgZm9yIG1hbmFnaW5nIGxpY2Vuc2luZyBhY3Jvc3MgYW4KIGFwcGxpY2F0aW9uJ3MgcmVmdW5kIHBlcmlvZCBhbmQgdGhyb3VnaCB2YXJ5aW5nIG5ldHdvcmsgYW5kIGVycm9yIGNvbmRpdGlvbnMuCi1XaGVuIGFuIGFwcGxpY2F0aW9uIGNvbnRhY3RzIHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgZm9yIGEgbGljZW5zZSBjaGVjaywgdGhlCitXaGVuIGFuIGFwcGxpY2F0aW9uIGNvbnRhY3RzIHRoZSBHb29nbGUgUGxheSBzZXJ2ZXIgZm9yIGEgbGljZW5zZSBjaGVjaywgdGhlCiBzZXJ2ZXIgYXBwZW5kcyBzZXZlcmFsIHNldHRpbmdzIGFzIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgZXh0cmFzIGZpZWxkIG9mIGNlcnRhaW4KIGxpY2Vuc2UgcmVzcG9uc2UgdHlwZXMuIEZvciBleGFtcGxlLCB0aGUgc2VydmVyIHByb3ZpZGVzIHJlY29tbWVuZGVkIHZhbHVlcyBmb3IgdGhlCiBhcHBsaWNhdGlvbidzIGxpY2Vuc2UgdmFsaWRpdHkgcGVyaW9kLCByZXRyeSBncmFjZSBwZXJpb2QsIGFuZCBtYXhpbXVtIGFsbG93YWJsZQpAQCAtMjk4LDcgKzI5OCw3IEBACiBFeHRyYXM8L2E+LjwvcD4KIAogPHA+Rm9yIGNvbnZlbmllbmNlLCBiZXN0IHBlcmZvcm1hbmNlLCBhbmQgdGhlIGJlbmVmaXQgb2YgdXNpbmcgbGljZW5zZSBzZXR0aW5ncwotZnJvbSB0aGUgQW5kcm9pZCBNYXJrZXQgc2VydmVyLCA8c3Ryb25nPnVzaW5nIFNlcnZlck1hbmFnZWRQb2xpY3kgYXMgeW91cgorZnJvbSB0aGUgR29vZ2xlIFBsYXkgc2VydmVyLCA8c3Ryb25nPnVzaW5nIFNlcnZlck1hbmFnZWRQb2xpY3kgYXMgeW91cgogbGljZW5zaW5nIHtAY29kZSBQb2xpY3l9IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkPC9zdHJvbmc+LiA8L3A+CiAKIDxwPklmIHlvdSBhcmUgY29uY2VybmVkIGFib3V0IHRoZSBzZWN1cml0eSBvZiBsaWNlbnNlIHJlc3BvbnNlIGRhdGEgdGhhdCBpcwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKIDxwPkJlZm9yZSByZXF1ZXN0aW5nIG5ldyBwZXJtaXNzaW9ucyBmb3IgdGhlIDxlbT5zb2xlIHB1cnBvc2U8L2VtPiBvZiBhY3F1aXJpbmcKIGRldmljZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBmb3IgdXNlIGluIHlvdXIge0Bjb2RlIE9iZnVzY2F0b3J9LCBjb25zaWRlcgotaG93IGRvaW5nIHNvIG1pZ2h0IGFmZmVjdCB5b3VyIGFwcGxpY2F0aW9uIG9yIGl0cyBmaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQKK2hvdyBkb2luZyBzbyBtaWdodCBhZmZlY3QgeW91ciBhcHBsaWNhdGlvbiBvciBpdHMgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5CiAoc2luY2Ugc29tZSBwZXJtaXNzaW9ucyBjYW4gY2F1c2UgdGhlIFNESyBidWlsZCB0b29scyB0byBhZGQKIHRoZSBhc3NvY2lhdGVkIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPikuPC9wPgogCkBAIC02NDcsMTEgKzY0NywxMSBAQAogPGxpPkRpc3BsYXkgYSAiVHJ5IGFnYWluIiBkaWFsb2cgdG8gdGhlIHVzZXIsIGluY2x1ZGluZyBhIGJ1dHRvbiB0byBpbml0aWF0ZSBhCiBuZXcgbGljZW5zZSBjaGVjayBpZiB0aGUgPGNvZGU+cmVhc29uPC9jb2RlPiBzdXBwbGllZCBpcyB7QGNvZGUgUG9saWN5LlJFVFJZfS4gPC9saT4KIDxsaT5EaXNwbGF5IGEgIlB1cmNoYXNlIHRoaXMgYXBwbGljYXRpb24iIGRpYWxvZywgaW5jbHVkaW5nIGEgYnV0dG9uIHRoYXQKLWRlZXAtbGlua3MgdGhlIHVzZXIgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZGV0YWlscyBwYWdlIG9uIE1hcmtldCwgZnJvbSB3aGljaCB0aGUKK2RlZXAtbGlua3MgdGhlIHVzZXIgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgZGV0YWlscyBwYWdlIG9uIEdvb2dsZSBQbGF5LCBmcm9tIHdoaWNoIHRoZQogdXNlIGNhbiBwdXJjaGFzZSB0aGUgYXBwbGljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBzZXQgdXAgc3VjaAogbGlua3MsIHNlZSA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sI21hcmtldGludGVudCI+VXNpbmcgSW50ZW50cyB0bwotTGF1bmNoIHRoZSBNYXJrZXQgQXBwbGljYXRpb24gb24gYSBEZXZpY2U8L2E+LiA8L2xpPgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sI21hcmtldGludGVudCI+TGlua2luZyB0byB5b3VyIGFwcHMKK29uIEdvb2dsZSBQbGF5PC9hPi4gPC9saT4KIDxsaT5EaXNwbGF5IGEgVG9hc3Qgbm90aWZpY2F0aW9uIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGZlYXR1cmVzIG9mIHRoZQogYXBwbGljYXRpb24gYXJlIGxpbWl0ZWQgYmVjYXVzZSBpdCBpcyBub3QgbGljZW5zZWQuIDwvbGk+CiA8L3VsPgpAQCAtNjg4LDcgKzY4OCw3IEBACiAgICAgICAgICAgICAvLyBZb3VyIHJlc3BvbnNlIHNob3VsZCBhbHdheXMgaW5mb3JtIHRoZSB1c2VyIHRoYXQgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgICAvLyBpcyBub3QgbGljZW5zZWQsIGJ1dCB5b3VyIGJlaGF2aW9yIGF0IHRoYXQgcG9pbnQgY2FuIHZhcnkuIFlvdSBtaWdodAogICAgICAgICAgICAgLy8gcHJvdmlkZSB0aGUgdXNlciBhIGxpbWl0ZWQgYWNjZXNzIHZlcnNpb24gb2YgeW91ciBhcHAgb3IgeW91IGNhbgotICAgICAgICAgICAgLy8gdGFrZSB0aGVtIHRvIEFuZHJvaWQgTWFya2V0IHRvIHB1cmNoYXNlIHRoZSBhcHAuCisgICAgICAgICAgICAvLyB0YWtlIHRoZW0gdG8gR29vZ2xlIFBsYXkgdG8gcHVyY2hhc2UgdGhlIGFwcC4KICAgICAgICAgICAgIHNob3dEaWFsb2coRElBTE9HX0dPVE9NQVJLRVQpOwogICAgICAgICB9CiAgICAgfQpAQCAtNzA3LDE2ICs3MDcsMTYgQEAKIDxoMyBpZD0idGhyZWFkLWhhbmRsZXIiPkNyZWF0ZSBhIEhhbmRsZXIgZm9yIHBvc3RpbmcgZnJvbSBMaWNlbnNlQ2hlY2tlckNhbGxiYWNrCiB0byB0aGUgVUkgdGhyZWFkPC9oMz4KIAotPHA+RHVyaW5nIGEgbGljZW5zZSBjaGVjaywgdGhlIExWTCBwYXNzZXMgdGhlIHJlcXVlc3QgdG8gdGhlIEFuZHJvaWQgTWFya2V0Cis8cD5EdXJpbmcgYSBsaWNlbnNlIGNoZWNrLCB0aGUgTFZMIHBhc3NlcyB0aGUgcmVxdWVzdCB0byB0aGUgR29vZ2xlIFBsYXkKIGFwcGxpY2F0aW9uLCB3aGljaCBoYW5kbGVzIGNvbW11bmljYXRpb24gd2l0aCB0aGUgbGljZW5zaW5nIHNlcnZlci4gVGhlIExWTAogcGFzc2VzIHRoZSByZXF1ZXN0IG92ZXIgYXN5bmNocm9ub3VzIElQQyAodXNpbmcge0BsaW5rIGFuZHJvaWQub3MuQmluZGVyfSkgc28KIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBhbmQgbmV0d29yayBjb21tdW5pY2F0aW9uIGRvIG5vdCB0YWtlIHBsYWNlIG9uIGEgdGhyZWFkCi1tYW5hZ2VkIGJ5IHlvdXIgYXBwbGljYXRpb24uIFNpbWlsYXJseSwgd2hlbiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24KK21hbmFnZWQgYnkgeW91ciBhcHBsaWNhdGlvbi4gU2ltaWxhcmx5LCB3aGVuIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbgogcmVjZWl2ZXMgdGhlIHJlc3VsdCwgaXQgaW52b2tlcyBhICBjYWxsYmFjayBtZXRob2Qgb3ZlciBJUEMsIHdoaWNoIGluIHR1cm4KIGV4ZWN1dGVzIGluIGFuIElQQyB0aHJlYWQgcG9vbCBpbiB5b3VyIGFwcGxpY2F0aW9uJ3MgcHJvY2Vzcy48L3A+CiAKIDxwPlRoZSB7QGNvZGUgTGljZW5zZUNoZWNrZXJ9IGNsYXNzIG1hbmFnZXMgeW91ciBhcHBsaWNhdGlvbidzIElQQyBjb21tdW5pY2F0aW9uIHdpdGgKLXRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIHRoZSBjYWxsIHRoYXQgc2VuZHMgdGhlIHJlcXVlc3QgYW5kCit0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24sIGluY2x1ZGluZyB0aGUgY2FsbCB0aGF0IHNlbmRzIHRoZSByZXF1ZXN0IGFuZAogdGhlIGNhbGxiYWNrIHRoYXQgcmVjZWl2ZXMgdGhlIHJlc3BvbnNlLiB7QGNvZGUgTGljZW5zZUNoZWNrZXJ9IGFsc28gdHJhY2tzIG9wZW4gbGljZW5zZQogcmVxdWVzdHMgYW5kIG1hbmFnZXMgdGhlaXIgdGltZW91dHMuIDwvcD4KIApAQCAtODU4LDE0ICs4NTgsMTQgQEAKIAogPGgzIGlkPSJhY2NvdW50LWtleSI+RW1iZWQgeW91ciBwdWJsaWMga2V5IGZvciBsaWNlbnNpbmc8L2gzPgogCi08cD5Gb3IgZWFjaCBwdWJsaXNoZXIgYWNjb3VudCwgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZpY2UgYXV0b21hdGljYWxseQorPHA+Rm9yIGVhY2ggcHVibGlzaGVyIGFjY291bnQsIHRoZSBHb29nbGUgUGxheSBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkKIGdlbmVyYXRlcyBhICAyMDQ4LWJpdCBSU0EgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgdGhhdCBpcyB1c2VkIGV4Y2x1c2l2ZWx5IGZvcgogbGljZW5zaW5nLiBUaGUga2V5IHBhaXIgaXMgdW5pcXVlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwdWJsaXNoZXIgYWNjb3VudCBhbmQgaXMKIHNoYXJlZCBhY3Jvc3MgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBwdWJsaXNoZWQgdGhyb3VnaCB0aGUgYWNjb3VudC4gQWx0aG91Z2gKIGFzc29jaWF0ZWQgd2l0aCBhIHB1Ymxpc2hlciBhY2NvdW50LCB0aGUga2V5IHBhaXIgaXMgPGVtPm5vdDwvZW0+IHRoZSBzYW1lIGFzCiB0aGUga2V5IHRoYXQgeW91IHVzZSB0byBzaWduIHlvdXIgYXBwbGljYXRpb25zIChvciBkZXJpdmVkIGZyb20gaXQpLjwvcD4KIAotPHA+VGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlIGV4cG9zZXMgdGhlIHB1YmxpYyBrZXkgZm9yIGxpY2Vuc2luZyB0byBhbnkKKzxwPlRoZSBHb29nbGUgUGxheSBwdWJsaXNoZXIgc2l0ZSBleHBvc2VzIHRoZSBwdWJsaWMga2V5IGZvciBsaWNlbnNpbmcgdG8gYW55CiBkZXZlbG9wZXIgc2lnbmVkIGluIHRvIHRoZSBwdWJsaXNoZXIgYWNjb3VudCwgYnV0IGl0IGtlZXBzIHRoZSBwcml2YXRlIGtleQogaGlkZGVuIGZyb20gYWxsIHVzZXJzIGluIGEgc2VjdXJlIGxvY2F0aW9uLiBXaGVuIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGEKIGxpY2Vuc2UgY2hlY2sgZm9yIGFuIGFwcGxpY2F0aW9uIHB1Ymxpc2hlZCBpbiB5b3VyIGFjY291bnQsIHRoZSBsaWNlbnNpbmcgc2VydmVyCkBAIC04NzgsOCArODc4LDggQEAKIHlvdXIgYWNjb3VudCdzIHB1YmxpYyBrZXkgZm9yIGxpY2Vuc2luZzo8L3A+CiAKIDxvbD4KLTxsaT5HbyB0byB0aGUgQW5kcm9pZCBNYXJrZXQgPGEKLWhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+cHVibGlzaGVyIHNpdGU8L2E+IGFuZCBzaWduIGluLgorPGxpPkdvIHRvIHRoZSBHb29nbGUgUGxheSA8YQoraHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPnB1Ymxpc2hlciBzaXRlPC9hPiBhbmQgc2lnbiBpbi4KIE1ha2Ugc3VyZSB0aGF0IHlvdSBzaWduIGluIHRvIHRoZSBhY2NvdW50IGZyb20gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHlvdSBhcmUKIGxpY2Vuc2luZyBpcyBwdWJsaXNoZWQgKG9yIHdpbGwgYmUgcHVibGlzaGVkKS4gPC9saT4KIDxsaT5JbiB0aGUgYWNjb3VudCBob21lIHBhZ2UsIGxvY2F0ZSB0aGUgIkVkaXQgcHJvZmlsZSIgbGluayBhbmQgY2xpY2sgaXQuIDwvbGk+CkBAIC05MDcsNyArOTA3LDcgQEAKIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dH0gY2hhbmdlcywgYWRkIGEgY2FsbCB0byB0aGUge0Bjb2RlIExpY2Vuc2VDaGVja2VyfSdzCiA8Y29kZT5vbkRlc3Ryb3koKTwvY29kZT4gbWV0aG9kIGZyb20geW91ciBBY3Rpdml0eSdzCiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkjb25EZXN0cm95KCl9IGltcGxlbWVudGF0aW9uLiBUaGUgY2FsbCBjYXVzZXMgdGhlCi17QGNvZGUgTGljZW5zZUNoZWNrZXJ9IHRvIHByb3Blcmx5IGNsb3NlIGFueSBvcGVuIElQQyBjb25uZWN0aW9uIHRvIHRoZSBBbmRyb2lkIE1hcmtldAore0Bjb2RlIExpY2Vuc2VDaGVja2VyfSB0byBwcm9wZXJseSBjbG9zZSBhbnkgb3BlbiBJUEMgY29ubmVjdGlvbiB0byB0aGUgR29vZ2xlIFBsYXkKIGFwcGxpY2F0aW9uJ3MgSUxpY2Vuc2luZ1NlcnZpY2UgYW5kIHJlbW92ZXMgYW55IGxvY2FsIHJlZmVyZW5jZXMgdG8gdGhlIHNlcnZpY2UKIGFuZCBoYW5kbGVyLjwvcD4KIApAQCAtOTkyLDEzICs5OTIsMTMgQEAKIDxwPlNldmVyYWwgb2JmdXNjYXRvciBwcm9ncmFtcyBhcmUgYXZhaWxhYmxlIGZvciBBbmRyb2lkIGFwcGxpY2F0aW9ucywgaW5jbHVkaW5nCiA8YSBocmVmPSJodHRwOi8vcHJvZ3VhcmQuc291cmNlZm9yZ2UubmV0LyI+UHJvR3VhcmQ8L2E+LCB3aGljaCBhbHNvIG9mZmVycwogY29kZS1vcHRpbWl6YXRpb24gZmVhdHVyZXMuIFRoZSB1c2Ugb2YgUHJvR3VhcmQgb3IgYSBzaW1pbGFyIHByb2dyYW0gdG8gb2JmdXNjYXRlCi15b3VyIGNvZGUgaXMgPGVtPnN0cm9uZ2x5IHJlY29tbWVuZGVkPC9lbT4gZm9yIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgQW5kcm9pZAotTWFya2V0IExpY2Vuc2luZy4gPC9wPgoreW91ciBjb2RlIGlzIDxlbT5zdHJvbmdseSByZWNvbW1lbmRlZDwvZW0+IGZvciBhbGwgYXBwbGljYXRpb25zIHRoYXQgdXNlIEdvb2dsZQorUGxheSBMaWNlbnNpbmcuIDwvcD4KIAogPGgyIGlkPSJhcHAtcHVibGlzaGluZyI+UHVibGlzaGluZyBhIExpY2Vuc2VkIEFwcGxpY2F0aW9uPC9oMj4KIAogPHA+V2hlbiB5b3UgYXJlIGZpbmlzaGVkIHRlc3RpbmcgeW91ciBsaWNlbnNlIGltcGxlbWVudGF0aW9uLCB5b3UgYXJlIHJlYWR5IHRvCi1wdWJsaXNoIHRoZSBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldC4gRm9sbG93IHRoZSBub3JtYWwgc3RlcHMgdG8gPGEKK3B1Ymxpc2ggdGhlIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiBGb2xsb3cgdGhlIG5vcm1hbCBzdGVwcyB0byA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHJlcGFyaW5nLmh0bWwiPnByZXBhcmU8L2E+LCA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvYXBwLXNpZ25pbmcuaHRtbCI+c2lnbjwvYT4sIGFuZCB0aGVuIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPnB1Ymxpc2ggdGhlIGFwcGxpY2F0aW9uPC9hPi4KQEAgLTEwMjEsNyArMTAyMSw3IEBACiBzdXBwb3J0IHlvdSBuZWVkIG1vcmUgcXVpY2tseS4gPC9wPgogCiA8cCBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAyLjwvc3Ryb25nPiBEZXZlbG9wZXIgc3VwcG9ydCByZXNvdXJjZXMKLWZvciBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcgU2VydmljZS48L3A+Citmb3IgR29vZ2xlIFBsYXkgTGljZW5zaW5nIFNlcnZpY2UuPC9wPgogCiA8dGFibGU+CiAKQEAgLTEwNDUsOCArMTA0NSw4IEBACiA8L3RyPgogPHRyPgogPHRkIHJvd3NwYW49IjIiPkFjY291bnRzLCBwdWJsaXNoaW5nLCBhbmQgZGVwbG95bWVudCBpc3N1ZXM8L3RkPgotPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2ZvcnVtL3AvQW5kcm9pZCtNYXJrZXQiPkFuZHJvaWQKLU1hcmtldCBIZWxwIEZvcnVtPC9hPjwvdGQ+Cis8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldCI+R29vZ2xlIFBsYXkKK0hlbHAgRm9ydW08L2E+PC90ZD4KIDx0ZCByb3dzcGFuPSIyIj5QdWJsaXNoZXIgYWNjb3VudHMsIGxpY2Vuc2luZyBrZXkgcGFpciwgdGVzdCBhY2NvdW50cywgc2VydmVyCiByZXNwb25zZXMsIHRlc3QgcmVzcG9uc2VzLCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGFuZCByZXN1bHRzPC90ZD4KIDwvdHI+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4LmpkCmluZGV4IGYwODE3NmQuLjFmMTUzMDMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4LmpkCkBAIC0yLDM5ICsyLDM5IEBACiBAamQ6Ym9keQogCiAKLTxwPkFuZHJvaWQgTWFya2V0IG9mZmVycyBhIGxpY2Vuc2luZyBzZXJ2aWNlIHRoYXQgbGV0cyB5b3UgZW5mb3JjZSBsaWNlbnNpbmcgcG9saWNpZXMgZm9yCi1hcHBsaWNhdGlvbnMgdGhhdCB5b3UgcHVibGlzaCBvbiBBbmRyb2lkIE1hcmtldC4gV2l0aCBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcsIHlvdXIgYXBwbGljYXRpb24gY2FuCi1xdWVyeSBBbmRyb2lkIE1hcmtldCBhdCBydW4gdGltZSB0byBvYnRhaW4gdGhlIGxpY2Vuc2luZyBzdGF0dXMgZm9yIHRoZSBjdXJyZW50IHVzZXIsIHRoZW4gYWxsb3cgb3IKKzxwPkdvb2dsZSBQbGF5IG9mZmVycyBhIGxpY2Vuc2luZyBzZXJ2aWNlIHRoYXQgbGV0cyB5b3UgZW5mb3JjZSBsaWNlbnNpbmcgcG9saWNpZXMgZm9yCithcHBsaWNhdGlvbnMgdGhhdCB5b3UgcHVibGlzaCBvbiBHb29nbGUgUGxheS4gV2l0aCBHb29nbGUgUGxheSBMaWNlbnNpbmcsIHlvdXIgYXBwbGljYXRpb24gY2FuCitxdWVyeSBHb29nbGUgUGxheSBhdCBydW4gdGltZSB0byBvYnRhaW4gdGhlIGxpY2Vuc2luZyBzdGF0dXMgZm9yIHRoZSBjdXJyZW50IHVzZXIsIHRoZW4gYWxsb3cgb3IKIGRpc2FsbG93IGZ1cnRoZXIgdXNlIGFzIGFwcHJvcHJpYXRlLiA8L3A+CiAKIDxwPlVzaW5nIHRoZSBzZXJ2aWNlLCB5b3UgY2FuIGFwcGx5IGEgZmxleGlibGUgbGljZW5zaW5nIHBvbGljeSBvbiBhbiBhcHBsaWNhdGlvbi1ieS1hcHBsaWNhdGlvbgogYmFzaXMmbWRhc2g7ZWFjaCBhcHBsaWNhdGlvbiBjYW4gZW5mb3JjZSBsaWNlbnNpbmcgaW4gdGhlIHdheSBtb3N0IGFwcHJvcHJpYXRlIGZvciBpdC4gSWYgbmVjZXNzYXJ5LAotYW4gYXBwbGljYXRpb24gY2FuIGFwcGx5IGN1c3RvbSBjb25zdHJhaW50cyBiYXNlZCBvbiB0aGUgbGljZW5zaW5nIHN0YXR1cyBvYnRhaW5lZCBmcm9tIEFuZHJvaWQKLU1hcmtldC4gRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIGNhbiBjaGVjayB0aGUgbGljZW5zaW5nIHN0YXR1cyBhbmQgdGhlbiBhcHBseSBjdXN0b20gY29uc3RyYWludHMKK2FuIGFwcGxpY2F0aW9uIGNhbiBhcHBseSBjdXN0b20gY29uc3RyYWludHMgYmFzZWQgb24gdGhlIGxpY2Vuc2luZyBzdGF0dXMgb2J0YWluZWQgZnJvbSBHb29nbGUgUGxheS4KK0ZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjYW4gY2hlY2sgdGhlIGxpY2Vuc2luZyBzdGF0dXMgYW5kIHRoZW4gYXBwbHkgY3VzdG9tIGNvbnN0cmFpbnRzCiB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIHJ1biBpdCB1bmxpY2Vuc2VkIGZvciBhIHNwZWNpZmljIHZhbGlkaXR5IHBlcmlvZC4gQW4gYXBwbGljYXRpb24gY2FuIGFsc28KIHJlc3RyaWN0IHVzZSBvZiB0aGUgYXBwbGljYXRpb24gdG8gYSBzcGVjaWZpYyBkZXZpY2UsIGluIGFkZGl0aW9uIHRvIGFueSBvdGhlciBjb25zdHJhaW50cy4gPC9wPgogCiA8cD5UaGUgbGljZW5zaW5nIHNlcnZpY2UgaXMgYSBzZWN1cmUgbWVhbnMgb2YgY29udHJvbGxpbmcgYWNjZXNzIHRvIHlvdXIgYXBwbGljYXRpb25zLiBXaGVuIGFuCi1hcHBsaWNhdGlvbiBjaGVja3MgdGhlIGxpY2Vuc2luZyBzdGF0dXMsIHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgc2lnbnMgdGhlIGxpY2Vuc2luZyBzdGF0dXMKK2FwcGxpY2F0aW9uIGNoZWNrcyB0aGUgbGljZW5zaW5nIHN0YXR1cywgdGhlIEdvb2dsZSBQbGF5IHNlcnZlciBzaWducyB0aGUgbGljZW5zaW5nIHN0YXR1cwogcmVzcG9uc2UgdXNpbmcgYSBrZXkgcGFpciB0aGF0IGlzIHVuaXF1ZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGlzaGVyIGFjY291bnQuIFlvdXIgYXBwbGljYXRpb24KIHN0b3JlcyB0aGUgcHVibGljIGtleSBpbiBpdHMgY29tcGlsZWQgPGNvZGU+LmFwazwvY29kZT4gZmlsZSBhbmQgdXNlcyBpdCB0byB2ZXJpZnkgdGhlIGxpY2Vuc2luZwogc3RhdHVzIHJlc3BvbnNlLjwvcD4KIAotPHA+QW55IGFwcGxpY2F0aW9uIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBBbmRyb2lkIE1hcmtldCBjYW4gdXNlIHRoZSBBbmRyb2lkIE1hcmtldCBMaWNlbnNpbmcKKzxwPkFueSBhcHBsaWNhdGlvbiB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggR29vZ2xlIFBsYXkgY2FuIHVzZSB0aGUgR29vZ2xlIFBsYXkgTGljZW5zaW5nCiBzZXJ2aWNlLiBObyBzcGVjaWFsIGFjY291bnQgb3IgcmVnaXN0cmF0aW9uIGlzIG5lZWRlZC4gQWRkaXRpb25hbGx5LCBiZWNhdXNlIHRoZSBzZXJ2aWNlIHVzZXMgbm8KIGRlZGljYXRlZCBmcmFtZXdvcmsgQVBJcywgeW91IGNhbiBhZGQgbGljZW5zaW5nIHRvIGFueSBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgYSBtaW5pbXVtIEFQSSBsZXZlbCBvZgogMyBvciBoaWdoZXIuPC9wPgogCi08cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIHNlcnZpY2UgaXMgcHJpbWFyaWx5IGludGVuZGVkCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgR29vZ2xlIFBsYXkgTGljZW5zaW5nIHNlcnZpY2UgaXMgcHJpbWFyaWx5IGludGVuZGVkCiBmb3IgcGFpZCBhcHBsaWNhdGlvbnMgdGhhdCB3aXNoIHRvIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IHVzZXIgZGlkIGluIGZhY3QgcGF5IGZvciB0aGUgYXBwbGljYXRpb24KLW9uIEFuZHJvaWQgTWFya2V0LiBIb3dldmVyLCBhbnkgYXBwbGljYXRpb24gKGluY2x1ZGluZyBmcmVlIGFwcHMpIG1heSB1c2UgdGhlIGxpY2Vuc2luZyBzZXJ2aWNlCitvbiBHb29nbGUgUGxheS4gSG93ZXZlciwgYW55IGFwcGxpY2F0aW9uIChpbmNsdWRpbmcgZnJlZSBhcHBzKSBtYXkgdXNlIHRoZSBsaWNlbnNpbmcgc2VydmljZQogdG8gaW5pdGlhdGUgdGhlIGRvd25sb2FkIG9mIGFuIEFQSyBleHBhbnNpb24gZmlsZS4gSW4gd2hpY2ggY2FzZSwgdGhlIHJlcXVlc3QgdGhhdCB5b3VyIGFwcGxpY2F0aW9uCiBzZW5kcyB0byB0aGUgbGljZW5zaW5nIHNlcnZpY2UgaXMgbm90IHRvIGNoZWNrIHdoZXRoZXIgdGhlIHVzZXIgcGFpZCBmb3IgdGhlIGFwcCwgYnV0IHRvIHJlcXVlc3QgdGhlCiBVUkwgb2YgdGhlIGV4cGFuc2lvbiBmaWxlcy4gRm9yIGluZm9ybWF0aW9uIGFib3V0IGRvd25sb2FkaW5nIGV4cGFuc2lvbiBmaWxlcyBmb3IgeW91ciBhcHBsaWNhdGlvbiwKIHJlYWQgdGhlIGd1aWRlIHRvIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvZXhwYW5zaW9uLWZpbGVzLmh0bWwiPkFQSyBFeHBhbnNpb24gRmlsZXM8L2E+LjwvcD4KIAogCi08cD5UbyBsZWFybiBtb3JlIGFib3V0IEFuZHJvaWQgTWFya2V0J3MgYXBwbGljYXRpb24gbGljZW5zaW5nIHNlcnZpY2UgYW5kIHN0YXJ0IGludGVncmF0aW5nIGl0IGludG8KKzxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgR29vZ2xlIFBsYXkncyBhcHBsaWNhdGlvbiBsaWNlbnNpbmcgc2VydmljZSBhbmQgc3RhcnQgaW50ZWdyYXRpbmcgaXQgaW50bwogeW91ciBhcHBsaWNhdGlvbnMsIHJlYWQgdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wPgogCiA8ZGw+CkBAIC00NCw3ICs0NCw3IEBACiBsaWtlLjwvZGQ+CiAgIDxkdD48c3Ryb25nPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL3NldHRpbmctdXAuaHRtbCI+U2V0dGluZyBVcCBmb3IKIExpY2Vuc2luZzwvYT48L3N0cm9uZz48L2R0PgotICAgIDxkZD5FeHBsYWlucyBob3cgdG8gc2V0IHVwIHlvdXIgQW5kcm9pZCBNYXJrZXQgYWNjb3VudCwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuZAorICAgIDxkZD5FeHBsYWlucyBob3cgdG8gc2V0IHVwIHlvdXIgR29vZ2xlIFBsYXkgYWNjb3VudCwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuZAogdGVzdGluZyBlbnZpcm9ubWVudCBpbiBvcmRlciB0byBhZGQgbGljZW5zaW5nIHRvIHlvdXIgYXBwLjwvZGQ+CiAgIDxkdD48c3Ryb25nPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2FkZGluZy1saWNlbnNpbmcuaHRtbCI+QWRkaW5nCiBMaWNlbnNpbmcgdG8gWW91ciBBcHA8L2E+PC9zdHJvbmc+PC9kdD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2xpY2Vuc2luZy1yZWZlcmVuY2UuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9saWNlbnNpbmctcmVmZXJlbmNlLmpkCmluZGV4IGFjNWQ1OTYuLjBhN2UwMzMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2xpY2Vuc2luZy1yZWZlcmVuY2UuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvbGljZW5zaW5nLXJlZmVyZW5jZS5qZApAQCAtMTE3LDcgKzExNyw3IEBACiA8dHI+CiA8dGQ+PGVtPklMaWNlbnNpbmdTZXJ2aWNlPC9lbT48L3RkPgogPHRkPk9uZS13YXkgSVBDIGludGVyZmFjZSBvdmVyIHdoaWNoIGEgbGljZW5zZSBjaGVjayByZXF1ZXN0IGlzIHBhc3NlZCB0byB0aGUKLUFuZHJvaWQgTWFya2V0IGNsaWVudC48L3RkPgorR29vZ2xlIFBsYXkgY2xpZW50LjwvdGQ+CiA8L3RyPgogPHRyPgogPHRkPjxlbT5JTGljZW5zZVJlc3VsdExpc3RlbmVyPC9lbT48L3RkPgpAQCAtMTM3LDcgKzEzNyw3IEBACiBuZWNlc3NhcnkgaGFuZGxpbmcgb2YgdGhlc2UgcmVzcG9uc2UgY29kZXMgZm9yIHlvdS4gPC9wPgogCiA8cCBjbGFzcz0idGFibGUtY2FwdGlvbiI+PHN0cm9uZz5UYWJsZSAyLjwvc3Ryb25nPiBTdW1tYXJ5IG9mIHJlc3BvbnNlIGNvZGVzCi1yZXR1cm5lZCBieSB0aGUgQW5kcm9pZCBNYXJrZXQgc2VydmVyIGluIGEgbGljZW5zZSByZXNwb25zZS48L3A+CityZXR1cm5lZCBieSB0aGUgR29vZ2xlIFBsYXkgc2VydmVyIGluIGEgbGljZW5zZSByZXNwb25zZS48L3A+CiAKIDx0YWJsZT4KIApAQCAtMTc4LDcgKzE3OCw3IEBACiA8L3RyPgogPHRyPgogPHRkPntAY29kZSBFUlJPUl9DT05UQUNUSU5HX1NFUlZFUn08L3RkPgotPHRkPkxvY2FsIGVycm9yICZtZGFzaDsgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHdhcyBub3QgYWJsZSB0byByZWFjaCB0aGUKKzx0ZD5Mb2NhbCBlcnJvciAmbWRhc2g7IHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiB3YXMgbm90IGFibGUgdG8gcmVhY2ggdGhlCiBsaWNlbnNpbmcgc2VydmVyLCBwb3NzaWJseSBiZWNhdXNlIG9mIG5ldHdvcmsgYXZhaWxhYmlsaXR5IHByb2JsZW1zLiA8L3RkPgogPHRkPk5vPC90ZD4KIDx0ZD48L3RkPgpAQCAtMjE3LDEyICsyMTcsMTIgQEAKIDx0cj4KIDx0ZD57QGNvZGUgRVJST1JfTk9UX01BUktFVF9NQU5BR0VEfTwvdGQ+CiA8dGQ+U2VydmVyIGVycm9yICZtZGFzaDsgdGhlIGFwcGxpY2F0aW9uIChwYWNrYWdlIG5hbWUpIHdhcyBub3QgcmVjb2duaXplZCBieQotQW5kcm9pZCBNYXJrZXQuIDwvdGQ+CitHb29nbGUgUGxheS4gPC90ZD4KIDx0ZD5ObzwvdGQ+CiA8dGQ+PC90ZD4KIDx0ZD48ZW0+RG8gbm90IHJldHJ5IHRoZSBsaWNlbnNlIGNoZWNrLjwvZW0+CiA8cCBzdHlsZT0ibWFyZ2luLXRvcDouNWVtOyI+Q2FuIGluZGljYXRlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhcyBub3QgcHVibGlzaGVkCi10aHJvdWdoIEFuZHJvaWQgTWFya2V0IG9yIHRoYXQgdGhlcmUgaXMgYW4gZGV2ZWxvcG1lbnQgZXJyb3IgaW4gdGhlIGxpY2Vuc2luZwordGhyb3VnaCBHb29nbGUgUGxheSBvciB0aGF0IHRoZXJlIGlzIGFuIGRldmVsb3BtZW50IGVycm9yIGluIHRoZSBsaWNlbnNpbmcKIGltcGxlbWVudGF0aW9uLjwvcD4KIDwvdGQ+CiA8L3RyPgpAQCAtMjMzLDcgKzIzMyw3IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9zZXR0aW5nLXVwLmh0bWwjdGVzdC1lbnYiPgogU2V0dGluZyBVcCBUaGUgVGVzdGluZyBFbnZpcm9ubWVudDwvYT4sIHRoZSByZXNwb25zZSBjb2RlIGNhbiBiZSBtYW51YWxseQogb3ZlcnJpZGRlbiBmb3IgdGhlIGFwcGxpY2F0aW9uIGRldmVsb3BlciBhbmQgYW55IHJlZ2lzdGVyZWQgdGVzdCB1c2VycyB2aWEgdGhlCi1BbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZS4KK0dvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlLgogPGJyLz48YnIvPgogQWRkaXRpb25hbGx5LCBhcyBub3RlZCBhYm92ZSwgYXBwbGljYXRpb25zIHRoYXQgYXJlIGluIGRyYWZ0IG1vZGUgKGluIG90aGVyCiB3b3JkcywgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHVwbG9hZGVkIGJ1dCBoYXZlIDxlbT5uZXZlcjwvZW0+IGJlZW4KQEAgLTI2Myw3ICsyNjMsNyBAQAogc2V0dGluZ3MuIDwvcD4KIAogPHAgY2xhc3M9InRhYmxlLWNhcHRpb24iPjxzdHJvbmc+VGFibGUgMy48L3N0cm9uZz4gU3VtbWFyeSBvZgotbGljZW5zZS1tYW5hZ2VtZW50IHNldHRpbmdzIHN1cHBsaWVkIGJ5IHRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgaW4gYSBsaWNlbnNlCitsaWNlbnNlLW1hbmFnZW1lbnQgc2V0dGluZ3Mgc3VwcGxpZWQgYnkgdGhlIEdvb2dsZSBQbGF5IHNlcnZlciBpbiBhIGxpY2Vuc2UKIHJlc3BvbnNlLjwvcD4KIAogPHRhYmxlPgpAQCAtMzI5LDcgKzMyOSw3IEBACiAKIDxoNCBpZD0iVlQiPkxpY2Vuc2UgdmFsaWRpdHkgcGVyaW9kPC9oND4KIAotPHA+VGhlIEFuZHJvaWQgTWFya2V0IGxpY2Vuc2luZyBzZXJ2ZXIgc2V0cyBhIGxpY2Vuc2UgdmFsaWRpdHkgcGVyaW9kIGZvciBhbGwKKzxwPlRoZSBHb29nbGUgUGxheSBsaWNlbnNpbmcgc2VydmVyIHNldHMgYSBsaWNlbnNlIHZhbGlkaXR5IHBlcmlvZCBmb3IgYWxsCiBkb3dubG9hZGVkIGFwcGxpY2F0aW9ucy4gVGhlIHBlcmlvZCBleHByZXNzZXMgdGhlIGludGVydmFsIG9mIHRpbWUgb3ZlciB3aGljaCBhbgogYXBwbGljYXRpb24ncyBsaWNlbnNlIHN0YXR1cyBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyB1bmNoYW5naW5nIGFuZCBjYWNoZWFibGUgYnkKIGEgbGljZW5zaW5nIHtAY29kZSBQb2xpY3l9IGluIHRoZSBhcHBsaWNhdGlvbi4gVGhlIGxpY2Vuc2luZyBzZXJ2ZXIgaW5jbHVkZXMgdGhlCkBAIC0zNTEsNyArMzUxLDcgQEAKIAogPHA+VGhlIGxpY2Vuc2luZyBzZXJ2ZXIgbWFuYWdlcyB0aGUgdmFsaWRpdHkgcGVyaW9kIGFzIGEgbWVhbnMgb2YgaGVscGluZyB0aGUKIGFwcGxpY2F0aW9uIHByb3Blcmx5IGVuZm9yY2UgbGljZW5zaW5nIGFjcm9zcyB0aGUgcmVmdW5kIHBlcmlvZCBvZmZlcmVkIGJ5Ci1BbmRyb2lkIE1hcmtldCBmb3IgcGFpZCBhcHBsaWNhdGlvbnMuIEl0IHNldHMgdGhlIHZhbGlkaXR5IHBlcmlvZCBiYXNlZCBvbgorR29vZ2xlIFBsYXkgZm9yIHBhaWQgYXBwbGljYXRpb25zLiBJdCBzZXRzIHRoZSB2YWxpZGl0eSBwZXJpb2QgYmFzZWQgb24KIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHdhcyBwdXJjaGFzZWQgYW5kLCBpZiBzbywgaG93IGxvbmcgYWdvLiBTcGVjaWZpY2FsbHksCiB0aGUgc2VydmVyIHNldHMgYSB2YWxpZGl0eSBwZXJpb2QgYXMgZm9sbG93czo8L3A+CiAKQEAgLTM4MSwxNSArMzgxLDE1IEBACiAKIDxwPkluIHNvbWUgY2FzZXMsIHN5c3RlbSBvciBuZXR3b3JrIGNvbmRpdGlvbnMgY2FuIHByZXZlbnQgYW4gYXBwbGljYXRpb24ncwogbGljZW5zZSBjaGVjayBmcm9tIHJlYWNoaW5nIHRoZSBsaWNlbnNpbmcgc2VydmVyLCBvciBwcmV2ZW50IHRoZSBzZXJ2ZXIncwotcmVzcG9uc2UgZnJvbSByZWFjaGluZyB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IGFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgdGhlCityZXNwb25zZSBmcm9tIHJlYWNoaW5nIHRoZSBHb29nbGUgUGxheSBjbGllbnQgYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCB0aGUKIHVzZXIgbWlnaHQgbGF1bmNoIGFuIGFwcGxpY2F0aW9uIHdoZW4gdGhlcmUgaXMgbm8gY2VsbCBuZXR3b3JrIG9yIGRhdGEKIGNvbm5lY3Rpb24gYXZhaWxhYmxlJm1kYXNoO3N1Y2ggYXMgd2hlbiBvbiBhbiBhaXJwbGFuZSZtZGFzaDtvciB3aGVuIHRoZQogbmV0d29yayBjb25uZWN0aW9uIGlzIHVuc3RhYmxlIG9yIHRoZSBjZWxsIHNpZ25hbCBpcyB3ZWFrLiA8L3A+CiAKLTxwPldoZW4gbmV0d29yayBwcm9ibGVtcyBwcmV2ZW50IG9yIGludGVycnVwdCBhIGxpY2Vuc2UgY2hlY2ssIHRoZSBBbmRyb2lkCi1NYXJrZXQgY2xpZW50IG5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBieSByZXR1cm5pbmcgYSB7QGNvZGUgUkVUUll9IHJlc3BvbnNlIGNvZGUgdG8KKzxwPldoZW4gbmV0d29yayBwcm9ibGVtcyBwcmV2ZW50IG9yIGludGVycnVwdCBhIGxpY2Vuc2UgY2hlY2ssIHRoZSBHb29nbGUKK1BsYXkgY2xpZW50IG5vdGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBieSByZXR1cm5pbmcgYSB7QGNvZGUgUkVUUll9IHJlc3BvbnNlIGNvZGUgdG8KIHRoZSB7QGNvZGUgUG9saWN5fSdzIDxjb2RlPnByb2Nlc3NTZXJ2ZXJSZXNwb25zZSgpPC9jb2RlPiBtZXRob2QuIEluIHRoZSBjYXNlIG9mIHN5c3RlbQotcHJvYmxlbXMsIHN1Y2ggYXMgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgdW5hYmxlIHRvIGJpbmQgd2l0aCBBbmRyb2lkIE1hcmtldCdzCitwcm9ibGVtcywgc3VjaCBhcyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyB1bmFibGUgdG8gYmluZCB3aXRoIEdvb2dsZSBQbGF5J3MKIHtAY29kZSBJTGljZW5zaW5nU2VydmljZX0gaW1wbGVtZW50YXRpb24sIHRoZSB7QGNvZGUgTGljZW5zZUNoZWNrZXJ9IGxpYnJhcnkgaXRzZWxmIGNhbGxzIHRoZQogUG9saWN5IDxjb2RlPnByb2Nlc3NTZXJ2ZXJSZXNvbnNlKCk8L2NvZGU+IG1ldGhvZCB3aXRoIGEge0Bjb2RlIFJFVFJZfSByZXNwb25zZSBjb2RlLgogPC9wPgpAQCAtMzk3LDcgKzM5Nyw3IEBACiA8cD5JbiBnZW5lcmFsLCB0aGUge0Bjb2RlIFJFVFJZfSByZXNwb25zZSBjb2RlIGlzIGEgc2lnbmFsIHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGFuCiBlcnJvciBoYXMgb2NjdXJyZWQgdGhhdCBoYXMgcHJldmVudGVkIGEgbGljZW5zZSBjaGVjayBmcm9tIGNvbXBsZXRpbmcuCiAKLTxwPlRoZSBBbmRyb2lkIE1hcmtldCBzZXJ2ZXIgaGVscHMgYW4gYXBwbGljYXRpb24gdG8gbWFuYWdlIGxpY2Vuc2luZyB1bmRlcgorPHA+VGhlIEdvb2dsZSBQbGF5IHNlcnZlciBoZWxwcyBhbiBhcHBsaWNhdGlvbiB0byBtYW5hZ2UgbGljZW5zaW5nIHVuZGVyCiBlcnJvciBjb25kaXRpb25zIGJ5IHNldHRpbmcgYSByZXRyeSAiZ3JhY2UgcGVyaW9kIiBhbmQgYSByZWNvbW1lbmRlZCBtYXhpbXVtCiByZXRyaWVzIGNvdW50LiBUaGUgc2VydmVyIGluY2x1ZGVzIHRoZXNlIHZhbHVlcyBpbiBhbGwgbGljZW5zZSBjaGVjayByZXNwb25zZXMsCiBhcHBlbmRpbmcgdGhlbSBhcyBleHRyYXMgdW5kZXIgdGhlIGtleXMge0Bjb2RlIEdUfSBhbmQge0Bjb2RlIEdSfS4gPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvb3ZlcnZpZXcuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9vdmVydmlldy5qZAppbmRleCAzNTc2ZTI2Li4wNWEzYTQwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9vdmVydmlldy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9vdmVydmlldy5qZApAQCAtOSw5ICs5LDkgQEAKICAgCiAgIDxoMj5RdWlja3ZpZXc8L2gyPgogICA8dWw+Ci0gICAgPGxpPkxpY2Vuc2luZyBhbGxvd3MgeW91IHRvIHZlcmlmeSB5b3VyIGFwcCB3YXMgcHVyY2hhc2VkIGZyb20gQW5kcm9pZCBNYXJrZXQ8L2xpPgorICAgIDxsaT5MaWNlbnNpbmcgYWxsb3dzIHlvdSB0byB2ZXJpZnkgeW91ciBhcHAgd2FzIHB1cmNoYXNlZCBmcm9tIEdvb2dsZSBQbGF5PC9saT4KICAgICA8bGk+WW91ciBhcHAgbWFpbnRhaW5zIGNvbnRyb2wgb2YgaG93IGl0IGVuZm9yY2VzIGl0cyBsaWNlbnNpbmcgc3RhdHVzPC9saT4KLSAgICA8bGk+VGhlIHNlcnZpY2UgaXMgZnJlZSBmb3IgYWxsIGRldmVsb3BlcnMgd2hvIHB1Ymxpc2ggb24gQW5kcm9pZCBNYXJrZXQ8L2xpPgorICAgIDxsaT5UaGUgc2VydmljZSBpcyBmcmVlIGZvciBhbGwgZGV2ZWxvcGVycyB3aG8gcHVibGlzaCBvbiBHb29nbGUgUGxheTwvbGk+CiAgIDwvdWw+CiAgIAogICA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CkBAIC0yNiwxOSArMjYsMTkgQEAKIDwvZGl2PgogCiAKLTxwPkFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBpcyBhIG5ldHdvcmstYmFzZWQgc2VydmljZSB0aGF0IGxldHMgYW4gYXBwbGljYXRpb24gcXVlcnkgYSB0cnVzdGVkCi1BbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcgc2VydmVyIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBpcyBsaWNlbnNlZCB0byB0aGUgY3VycmVudAotZGV2aWNlIHVzZXIuIFRoZSBsaWNlbnNpbmcgc2VydmljZSBpcyBiYXNlZCBvbiB0aGUgY2FwYWJpbGl0eSBvZiB0aGUgQW5kcm9pZCBNYXJrZXQgbGljZW5zaW5nIHNlcnZlcgotdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIGxpY2Vuc2VkIHRvIHVzZSBhIGdpdmVuIGFwcGxpY2F0aW9uLiBBbmRyb2lkIE1hcmtldCBjb25zaWRlcnMgYQorPHA+R29vZ2xlIFBsYXkgTGljZW5zaW5nIGlzIGEgbmV0d29yay1iYXNlZCBzZXJ2aWNlIHRoYXQgbGV0cyBhbiBhcHBsaWNhdGlvbiBxdWVyeSBhIHRydXN0ZWQKK0dvb2dsZSBQbGF5IGxpY2Vuc2luZyBzZXJ2ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIGxpY2Vuc2VkIHRvIHRoZSBjdXJyZW50CitkZXZpY2UgdXNlci4gVGhlIGxpY2Vuc2luZyBzZXJ2aWNlIGlzIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBHb29nbGUgUGxheSBsaWNlbnNpbmcgc2VydmVyCit0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgbGljZW5zZWQgdG8gdXNlIGEgZ2l2ZW4gYXBwbGljYXRpb24uIEdvb2dsZSBQbGF5IGNvbnNpZGVycyBhCiB1c2VyIHRvIGJlIGxpY2Vuc2VkIGlmIHRoZSB1c2VyIGlzIGEgcmVjb3JkZWQgcHVyY2hhc2VyIG9mIHRoZSBhcHBsaWNhdGlvbi48L3A+CiAKIDxwPlRoZSByZXF1ZXN0IHN0YXJ0cyB3aGVuIHlvdXIgYXBwbGljYXRpb24gbWFrZXMgYSByZXF1ZXN0IHRvIGEgc2VydmljZSBob3N0ZWQgYnkKLXRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgYXBwbGljYXRpb24uIFRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiB0aGVuIHNlbmRzIGEgcmVxdWVzdCB0bwotdGhlIGxpY2Vuc2luZyBzZXJ2ZXIgYW5kIHJlY2VpdmVzIHRoZSByZXN1bHQuIFRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBzZW5kcwordGhlIEdvb2dsZSBQbGF5IGNsaWVudCBhcHBsaWNhdGlvbi4gVGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHRoZW4gc2VuZHMgYSByZXF1ZXN0IHRvCit0aGUgbGljZW5zaW5nIHNlcnZlciBhbmQgcmVjZWl2ZXMgdGhlIHJlc3VsdC4gVGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHNlbmRzCiB0aGUgcmVzdWx0IHRvIHlvdXIgYXBwbGljYXRpb24sIHdoaWNoIGNhbiBhbGxvdyBvciBkaXNhbGxvdyBmdXJ0aGVyIHVzZSBvZiB0aGUKIGFwcGxpY2F0aW9uIGFzIG5lZWRlZC48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIGEgcGFpZCBhcHBsaWNhdGlvbiBoYXMgYmVlbiB1cGxvYWRlZCB0byBBbmRyb2lkIE1hcmtldCBidXQKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIGEgcGFpZCBhcHBsaWNhdGlvbiBoYXMgYmVlbiB1cGxvYWRlZCB0byBHb29nbGUgUGxheSBidXQKIHNhdmVkIG9ubHkgYXMgYSBkcmFmdCBhcHBsaWNhdGlvbiAodGhlIGFwcCBpcyB1bnB1Ymxpc2hlZCksIHRoZSBsaWNlbnNpbmcgc2VydmVyIGNvbnNpZGVycyBhbGwgdXNlcnMKIHRvIGJlIGxpY2Vuc2VkIHVzZXJzIG9mIHRoZSBhcHBsaWNhdGlvbiAoYmVjYXVzZSBpdCdzIG5vdCBldmVuIHBvc3NpYmxlIHRvIHB1cmNoYXNlIHRoZSBhcHApLgogVGhpcyBleGNlcHRpb24gaXMgbmVjZXNzYXJ5IGluIG9yZGVyIGZvciB5b3UgdG8gcGVyZm9ybSB0ZXN0aW5nIG9mIHlvdXIgbGljZW5zaW5nCkBAIC00OCwzOSArNDgsMzkgQEAKIDxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9IndpZHRoOjQ2OXB4Ij4KIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2xpY2Vuc2luZ19hcmNoLnBuZyIgYWx0PSIiLz4KIDxwIGNsYXNzPSJpbWctY2FwdGlvbiI+PHN0cm9uZz5GaWd1cmUgMS48L3N0cm9uZz4gWW91ciBhcHBsaWNhdGlvbiBpbml0aWF0ZXMgYQotbGljZW5zZSBjaGVjayB0aHJvdWdoIHRoZSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IGFuZCB0aGUgQW5kcm9pZCBNYXJrZXQKLWNsaWVudCwgd2hpY2ggaGFuZGxlcyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIE1hcmtldCBzZXJ2ZXIuPC9wPgorbGljZW5zZSBjaGVjayB0aHJvdWdoIHRoZSBMaWNlbnNlIFZlcmlmaWNhdGlvbiBMaWJyYXJ5IGFuZCB0aGUgR29vZ2xlIFBsYXkKK2NsaWVudCwgd2hpY2ggaGFuZGxlcyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEdvb2dsZSBQbGF5IHNlcnZlci48L3A+CiA8L2Rpdj4KIAogCiA8cD5UbyBwcm9wZXJseSBpZGVudGlmeSB0aGUgdXNlciBhbmQgZGV0ZXJtaW5lIHRoZSBsaWNlbnNlIHN0YXR1cywgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIgcmVxdWlyZXMKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBhcHBsaWNhdGlvbiBhbmQgdXNlciZtZGFzaDt5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IHdvcmsKLXRvZ2V0aGVyIHRvIGFzc2VtYmxlIHRoZSBpbmZvcm1hdGlvbiBhbmQgdGhlIEFuZHJvaWQgTWFya2V0IGNsaWVudCBwYXNzZXMgaXQgdG8gdGhlIHNlcnZlci4gPC9wPgoraW5mb3JtYXRpb24gYWJvdXQgdGhlIGFwcGxpY2F0aW9uIGFuZCB1c2VyJm1kYXNoO3lvdXIgYXBwbGljYXRpb24gYW5kIHRoZSBHb29nbGUgUGxheSBjbGllbnQgd29yawordG9nZXRoZXIgdG8gYXNzZW1ibGUgdGhlIGluZm9ybWF0aW9uIGFuZCB0aGUgR29vZ2xlIFBsYXkgY2xpZW50IHBhc3NlcyBpdCB0byB0aGUgc2VydmVyLiA8L3A+CiAKIDxwPlRvIGhlbHAgeW91IGFkZCBsaWNlbnNpbmcgdG8geW91ciBhcHBsaWNhdGlvbiwgdGhlIEFuZHJvaWQgU0RLIHByb3ZpZGVzIGEgZG93bmxvYWRhYmxlIHNldCBvZgotbGlicmFyeSBzb3VyY2VzIHRoYXQgeW91IGNhbiBpbmNsdWRlIGluIHlvdXIgYXBwbGljYXRpb24gcHJvamVjdDogdGhlICJHb29nbGUgTWFya2V0IEJpbGxpbmcKK2xpYnJhcnkgc291cmNlcyB0aGF0IHlvdSBjYW4gaW5jbHVkZSBpbiB5b3VyIGFwcGxpY2F0aW9uIHByb2plY3Q6IHRoZSAiR29vZ2xlIE1hcmtldCBMaWNlbnNpbmcKIHBhY2thZ2UuIiBUaGUgTGljZW5zZSBWZXJpZmljYXRpb24gTGlicmFyeSAoTFZMKSBpcyBhIGxpYnJhcnkgeW91IGNhbiBhZGQgdG8geW91ciBhcHBsaWNhdGlvbiB0aGF0Ci1oYW5kbGVzIGFsbCBvZiB0aGUgbGljZW5zaW5nLXJlbGF0ZWQgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBBbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcgc2VydmljZS4gV2l0aAoraGFuZGxlcyBhbGwgb2YgdGhlIGxpY2Vuc2luZy1yZWxhdGVkIGNvbW11bmljYXRpb24gd2l0aCB0aGUgR29vZ2xlIFBsYXkgbGljZW5zaW5nIHNlcnZpY2UuIFdpdGgKIHRoZSBMVkwgYWRkZWQgdG8geW91ciBhcHBsaWNhdGlvbiwgeW91ciBhcHBsaWNhdGlvbiBjYW4gZGV0ZXJtaW5lIGl0cyBsaWNlbnNpbmcgc3RhdHVzIGZvciB0aGUKIGN1cnJlbnQgdXNlciBieSBzaW1wbHkgY2FsbGluZyBhIG1ldGhvZCBhbmQgaW1wbGVtZW50aW5nIGEgY2FsbGJhY2sgdGhhdCByZWNlaXZlcyB0aGUgc3RhdHVzCiByZXNwb25zZS48L3A+CiAKIDxwPllvdXIgYXBwbGljYXRpb24gZG9lcyBub3QgcXVlcnkgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIKLWRpcmVjdGx5LCBidXQgaW5zdGVhZCBjYWxscyB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IG92ZXIgcmVtb3RlIElQQyB0bworZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIGNhbGxzIHRoZSBHb29nbGUgUGxheSBjbGllbnQgb3ZlciByZW1vdGUgSVBDIHRvCiBpbml0aWF0ZSBhIGxpY2Vuc2UgcmVxdWVzdC4gSW4gdGhlIGxpY2Vuc2UgcmVxdWVzdDo8L3A+CiAKIDx1bD4KIDxsaT5Zb3VyIGFwcGxpY2F0aW9uIHByb3ZpZGVzOiBpdHMgcGFja2FnZSBuYW1lLCBhIG5vbmNlIHRoYXQgaXMgbGF0ZXIgdXNlZCB0bwogdmFsaWRhdGUgYW55IHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciwgYW5kIGEgY2FsbGJhY2sgb3ZlciB3aGljaCB0aGUKIHJlc3BvbnNlIGNhbiBiZSByZXR1cm5lZCBhc3luY2hyb25vdXNseS48L2xpPgotPGxpPlRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgY29sbGVjdHMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBhbmQgdGhlIGRldmljZSwKKzxsaT5UaGUgR29vZ2xlIFBsYXkgY2xpZW50IGNvbGxlY3RzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgYW5kIHRoZSBkZXZpY2UsCiBzdWNoIGFzIHRoZSBkZXZpY2UncyBwcmltYXJ5IEdvb2dsZSBhY2NvdW50IHVzZXJuYW1lLCBJTVNJLCBhbmQgb3RoZXIKIGluZm9ybWF0aW9uLiBJdCB0aGVuIHNlbmRzIHRoZSBsaWNlbnNlIGNoZWNrIHJlcXVlc3QgdG8gdGhlIHNlcnZlciBvbiBiZWhhbGYgb2YKIHlvdXIgYXBwbGljYXRpb24uPC9saT4KLTxsaT5UaGUgQW5kcm9pZCBNYXJrZXQgc2VydmVyIGV2YWx1YXRlcyB0aGUgcmVxdWVzdCB1c2luZyBhbGwgYXZhaWxhYmxlIGluZm9ybWF0aW9uLCBhdHRlbXB0aW5nCis8bGk+VGhlIEdvb2dsZSBQbGF5IHNlcnZlciBldmFsdWF0ZXMgdGhlIHJlcXVlc3QgdXNpbmcgYWxsIGF2YWlsYWJsZSBpbmZvcm1hdGlvbiwgYXR0ZW1wdGluZwogdG8gZXN0YWJsaXNoIHRoZSB1c2VyJ3MgaWRlbnRpdHkgdG8gYSBzdWZmaWNpZW50IGxldmVsIG9mIGNvbmZpZGVuY2UuIFRoZSBzZXJ2ZXIKIHRoZW4gY2hlY2tzIHRoZSB1c2VyIGlkZW50aXR5IGFnYWluc3QgcHVyY2hhc2UgcmVjb3JkcyBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQKLXJldHVybnMgYSBsaWNlbnNlIHJlc3BvbnNlLCB3aGljaCB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IHJldHVybnMgdG8geW91cgorcmV0dXJucyBhIGxpY2Vuc2UgcmVzcG9uc2UsIHdoaWNoIHRoZSBHb29nbGUgUGxheSBjbGllbnQgcmV0dXJucyB0byB5b3VyCiBhcHBsaWNhdGlvbiBvdmVyIHRoZSBJUEMgY2FsbGJhY2suPC9saT4KIDwvdWw+CiAKQEAgLTk3LDcgKzk3LDcgQEAKIDxoMiBpZD0iU2VjdXJlIj5MaWNlbnNlIFJlc3BvbnNlcyBhcmUgU2VjdXJlPC9oMj4KIAogPHA+VG8gZW5zdXJlIHRoZSBpbnRlZ3JpdHkgb2YgZWFjaCBsaWNlbnNlIHF1ZXJ5LCB0aGUgc2VydmVyIHNpZ25zIHRoZSBsaWNlbnNlCi1yZXNwb25zZSBkYXRhIHVzaW5nIGFuIFJTQSBrZXkgcGFpciB0aGF0IGlzIHNoYXJlZCBleGNsdXNpdmVseSBiZXR3ZWVuIHRoZSBBbmRyb2lkIE1hcmtldAorcmVzcG9uc2UgZGF0YSB1c2luZyBhbiBSU0Ega2V5IHBhaXIgdGhhdCBpcyBzaGFyZWQgZXhjbHVzaXZlbHkgYmV0d2VlbiB0aGUgR29vZ2xlIFBsYXkKIHNlcnZlciBhbmQgeW91LjwvcD4KIAogPHA+VGhlIGxpY2Vuc2luZyBzZXJ2aWNlIGdlbmVyYXRlcyBhIHNpbmdsZSBsaWNlbnNpbmcga2V5IHBhaXIgZm9yIGVhY2gKQEAgLTEyMCw3ICsxMjAsNyBAQAogd2hpY2ggaW5jbHVkZXMgdGhlIExpY2Vuc2UgVmVyaWZpY2F0aW9uIExpYnJhcnkgKExWTCkuIFRoZSBMVkwgZ3JlYXRseSBzaW1wbGlmaWVzIHRoZSBwcm9jZXNzIG9mCiBhZGRpbmcgbGljZW5zaW5nIHRvIHlvdXIgYXBwbGljYXRpb24gYW5kIGhlbHBzIGVuc3VyZSBhIG1vcmUgc2VjdXJlLCByb2J1c3QgaW1wbGVtZW50YXRpb24gZm9yIHlvdXIKIGFwcGxpY2F0aW9uLiBUaGUgTFZMIHByb3ZpZGVzIGludGVybmFsIGNsYXNzZXMgdGhhdCBoYW5kbGUgbW9zdCBvZiB0aGUgc3RhbmRhcmQgb3BlcmF0aW9ucyBvZiBhCi1saWNlbnNlIHF1ZXJ5LCBzdWNoIGFzIGNvbnRhY3RpbmcgdGhlIEFuZHJvaWQgTWFya2V0IGNsaWVudCB0byBpbml0aWF0ZSBhIGxpY2Vuc2UgcmVxdWVzdCBhbmQKK2xpY2Vuc2UgcXVlcnksIHN1Y2ggYXMgY29udGFjdGluZyB0aGUgR29vZ2xlIFBsYXkgY2xpZW50IHRvIGluaXRpYXRlIGEgbGljZW5zZSByZXF1ZXN0IGFuZAogdmVyaWZ5aW5nIGFuZCB2YWxpZGF0aW5nIHRoZSByZXNwb25zZXMuIEl0IGFsc28gZXhwb3NlcyBpbnRlcmZhY2VzIHRoYXQgbGV0IHlvdSBlYXNpbHkgcGx1ZyBpbiB5b3VyCiBjdXN0b20gY29kZSBmb3IgZGVmaW5pbmcgbGljZW5zaW5nIHBvbGljeSBhbmQgbWFuYWdpbmcgYWNjZXNzIGFzIG5lZWRlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBUaGUga2V5CiBMVkwgaW50ZXJmYWNlcyBhcmU6IDwvcD4KQEAgLTE3OSwxNyArMTc5LDE3IEBACiAKIDxoMiBpZD0iUmVxcyI+UmVxdWlyZW1lbnRzIGFuZCBMaW1pdGF0aW9uczwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBpcyBkZXNpZ25lZCB0byBsZXQgeW91IGFwcGx5IGxpY2Vuc2UgY29udHJvbHMgdG8KLWFwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQuIFRoZSBzZXJ2aWNlIGlzIG5vdAorPHA+R29vZ2xlIFBsYXkgTGljZW5zaW5nIGlzIGRlc2lnbmVkIHRvIGxldCB5b3UgYXBwbHkgbGljZW5zZSBjb250cm9scyB0bworYXBwbGljYXRpb25zIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBHb29nbGUgUGxheS4gVGhlIHNlcnZpY2UgaXMgbm90CiBkZXNpZ25lZCB0byBsZXQgeW91IGNvbnRyb2wgYWNjZXNzIHRvIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3QgcHVibGlzaGVkCi10aHJvdWdoIEFuZHJvaWQgTWFya2V0IG9yIHRoYXQgYXJlIHJ1biBvbiBkZXZpY2VzIHRoYXQgZG8gbm90IG9mZmVyIHRoZSBBbmRyb2lkCi1NYXJrZXQgY2xpZW50LiA8L3A+Cit0aHJvdWdoIEdvb2dsZSBQbGF5IG9yIHRoYXQgYXJlIHJ1biBvbiBkZXZpY2VzIHRoYXQgZG8gbm90IG9mZmVyIHRoZSBHb29nbGUKK1BsYXkgY2xpZW50LiA8L3A+CiAKIDxwPkhlcmUgYXJlIHNvbWUgcG9pbnRzIHRvIGtlZXAgaW4gbWluZCBhcyB5b3UgaW1wbGVtZW50IGxpY2Vuc2luZyBpbiB5b3VyCiBhcHBsaWNhdGlvbjogPC9wPgogCiA8dWw+Ci08bGk+QW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGUgc2VydmljZSBvbmx5IGlmIHRoZSBBbmRyb2lkIE1hcmtldCBjbGllbnQgaXMKKzxsaT5BbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZSBzZXJ2aWNlIG9ubHkgaWYgdGhlIEdvb2dsZSBQbGF5IGNsaWVudCBpcwogaW5zdGFsbGVkIG9uIGl0cyBob3N0IGRldmljZSBhbmQgdGhlIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgMS41IChBUEkgbGV2ZWwgMykKIG9yIGhpZ2hlci48L2xpPgogPGxpPlRvIGNvbXBsZXRlIGEgbGljZW5zZSBjaGVjaywgdGhlIGxpY2Vuc2luZyBzZXJ2ZXIgbXVzdCBiZSBhY2Nlc3NpYmxlIG92ZXIKQEAgLTIwMiw3ICsyMDIsNyBAQAogcHJhY3RpY2VzIGluIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnRzLCB5b3UgY2FuIGhlbHAgZW5zdXJlIHRoYXQgeW91ciBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlCiBzZWN1cmUuPC9saT4KIDxsaT5BZGRpbmcgbGljZW5zaW5nIHRvIGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgd2F5IHRoZSBhcHBsaWNhdGlvbgotZnVuY3Rpb25zIHdoZW4gcnVuIG9uIGEgZGV2aWNlIHRoYXQgZG9lcyBub3Qgb2ZmZXIgQW5kcm9pZCBNYXJrZXQuPC9saT4KK2Z1bmN0aW9ucyB3aGVuIHJ1biBvbiBhIGRldmljZSB0aGF0IGRvZXMgbm90IG9mZmVyIEdvb2dsZSBQbGF5LjwvbGk+CiA8bGk+WW91IGNhbiBpbXBsZW1lbnQgbGljZW5zaW5nIGNvbnRyb2xzIGZvciBhIGZyZWUgYXBwLCBidXQgb25seSBpZiB5b3UncmUgdXNpbmcgdGhlIHNlcnZpY2UgdG8gCiBwcm92aWRlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2V4cGFuc2lvbi1maWxlcy5odG1sIj5BUEsgZXhwYW5zaW9uIGZpbGVzPC9hPi48L2xpPgpAQCAtMjEyLDIwICsyMTIsMjAgQEAKIAogPGgyIGlkPSJDb3B5UHJvdGVjdGlvbiI+UmVwbGFjZW1lbnQgZm9yIENvcHkgUHJvdGVjdGlvbjwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBpcyBhIGZsZXhpYmxlLCBzZWN1cmUgbWVjaGFuaXNtIGZvciBjb250cm9sbGluZworPHA+R29vZ2xlIFBsYXkgTGljZW5zaW5nIGlzIGEgZmxleGlibGUsIHNlY3VyZSBtZWNoYW5pc20gZm9yIGNvbnRyb2xsaW5nCiBhY2Nlc3MgdG8geW91ciBhcHBsaWNhdGlvbnMuIEl0IGVmZmVjdGl2ZWx5IHJlcGxhY2VzIHRoZSBDb3B5IFByb3RlY3Rpb24KLW1lY2hhbmlzbSBvZmZlcmVkIG9uIEFuZHJvaWQgTWFya2V0IGFuZCBnaXZlcyB5b3Ugd2lkZXIgZGlzdHJpYnV0aW9uCittZWNoYW5pc20gb2ZmZXJlZCBvbiBHb29nbGUgUGxheSBhbmQgZ2l2ZXMgeW91IHdpZGVyIGRpc3RyaWJ1dGlvbgogcG90ZW50aWFsIGZvciB5b3VyIGFwcGxpY2F0aW9ucy4gPC9wPgogCiA8dWw+Ci08bGk+QSBsaW1pdGF0aW9uIG9mIHRoZSBsZWdhY3kgQ29weSBQcm90ZWN0aW9uIG1lY2hhbmlzbSBvbiBBbmRyb2lkIE1hcmtldCBpcworPGxpPkEgbGltaXRhdGlvbiBvZiB0aGUgbGVnYWN5IENvcHkgUHJvdGVjdGlvbiBtZWNoYW5pc20gb24gR29vZ2xlIFBsYXkgaXMKIHRoYXQgYXBwbGljYXRpb25zIHVzaW5nIGl0IGNhbiBiZSBpbnN0YWxsZWQgb25seSBvbiBjb21wYXRpYmxlIGRldmljZXMgdGhhdAogcHJvdmlkZSBhIHNlY3VyZSBpbnRlcm5hbCBzdG9yYWdlIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZSwgYSBjb3B5LXByb3RlY3RlZAotYXBwbGljYXRpb24gY2Fubm90IGJlIGRvd25sb2FkZWQgZnJvbSBNYXJrZXQgdG8gYSBkZXZpY2UgdGhhdCBwcm92aWRlcyByb290CithcHBsaWNhdGlvbiBjYW5ub3QgYmUgZG93bmxvYWRlZCBmcm9tIEdvb2dsZSBQbGF5IHRvIGEgZGV2aWNlIHRoYXQgcHJvdmlkZXMgcm9vdAogYWNjZXNzLCBhbmQgdGhlIGFwcGxpY2F0aW9uIGNhbm5vdCBiZSBpbnN0YWxsZWQgdG8gYSBkZXZpY2UncyBTRCBjYXJkLiA8L2xpPgotPGxpPldpdGggQW5kcm9pZCBNYXJrZXQgbGljZW5zaW5nLCB5b3UgY2FuIG1vdmUgdG8gYSBsaWNlbnNlLWJhc2VkIG1vZGVsIGluCis8bGk+V2l0aCBHb29nbGUgUGxheSBsaWNlbnNpbmcsIHlvdSBjYW4gbW92ZSB0byBhIGxpY2Vuc2UtYmFzZWQgbW9kZWwgaW4KIHdoaWNoIGFjY2VzcyBpcyBub3QgYm91bmQgdG8gdGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaG9zdCBkZXZpY2UsIGJ1dCB0byB5b3VyCi1wdWJsaXNoZXIgYWNjb3VudCBvbiBBbmRyb2lkIE1hcmtldCBhbmQgdGhlIGxpY2Vuc2luZyBwb2xpY3kgdGhhdCB5b3UgZGVmaW5lLgorcHVibGlzaGVyIGFjY291bnQgb24gR29vZ2xlIFBsYXkgYW5kIHRoZSBsaWNlbnNpbmcgcG9saWN5IHRoYXQgeW91IGRlZmluZS4KIFlvdXIgYXBwbGljYXRpb24gY2FuIGJlIGluc3RhbGxlZCBhbmQgY29udHJvbGxlZCBvbiBhbnkgY29tcGF0aWJsZSBkZXZpY2Ugb24KIGFueSBzdG9yYWdlLCBpbmNsdWRpbmcgU0QgY2FyZC48L2xpPgogPC91bD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL3NldHRpbmctdXAuamQgYi9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L2xpY2Vuc2luZy9zZXR0aW5nLXVwLmpkCmluZGV4IGM3OWY5MGIuLjE1MjE0ZDEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvbGljZW5zaW5nL3NldHRpbmctdXAuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL21hcmtldC9saWNlbnNpbmcvc2V0dGluZy11cC5qZApAQCAtMzEsMjcgKzMxLDI3IEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5CZWZvcmUgeW91IHN0YXJ0IGFkZGluZyBsaWNlbnNlIHZlcmlmaWNhdGlvbiB0byB5b3VyIGFwcGxpY2F0aW9uLCB5b3UgbmVlZCB0byBzZXQgdXAgeW91ciBBbmRyb2lkCi1NYXJrZXQgcHVibGlzaGluZyBhY2NvdW50LCB5b3VyIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBhbmQgdGVzdCBhY2NvdW50cyByZXF1aXJlZCB0byB2ZXJpZnkKKzxwPkJlZm9yZSB5b3Ugc3RhcnQgYWRkaW5nIGxpY2Vuc2UgdmVyaWZpY2F0aW9uIHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHNldCB1cCB5b3VyIEdvb2dsZQorUGxheSBwdWJsaXNoaW5nIGFjY291bnQsIHlvdXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGFuZCB0ZXN0IGFjY291bnRzIHJlcXVpcmVkIHRvIHZlcmlmeQogeW91ciBpbXBsZW1lbnRhdGlvbi48L3A+CiAKIAogPGgyIGlkPSJhY2NvdW50Ij5TZXR0aW5nIFVwIGEgUHVibGlzaGVyIEFjY291bnQ8L2gyPgogCi08cD5JZiB5b3UgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgcHVibGlzaGVyIGFjY291bnQgZm9yIEFuZHJvaWQgTWFya2V0LCB5b3UgbmVlZCB0byByZWdpc3RlciBmb3Igb25lCi11c2luZyB5b3VyIEdvb2dsZSBhY2NvdW50IGFuZCBhZ3JlZSB0byB0aGUgdGVybXMgb2Ygc2VydmljZSBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGU6PC9wPgorPHA+SWYgeW91IGRvbid0IGFscmVhZHkgaGF2ZSBhIHB1Ymxpc2hlciBhY2NvdW50IGZvciBHb29nbGUgUGxheSwgeW91IG5lZWQgdG8gcmVnaXN0ZXIgZm9yIG9uZQordXNpbmcgeW91ciBHb29nbGUgYWNjb3VudCBhbmQgYWdyZWUgdG8gdGhlIHRlcm1zIG9mIHNlcnZpY2Ugb24gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlOjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbTsiPjxhCi1ocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPmh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaDwvYT4KK2hyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5odHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaDwvYT4KIDwvcD4KIAogPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0PC9hPi48L3A+CitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24gR29vZ2xlIFBsYXk8L2E+LjwvcD4KIAotPHA+SWYgeW91IGFscmVhZHkgaGF2ZSBhIHB1Ymxpc2hlciBhY2NvdW50IG9uIEFuZHJvaWQgTWFya2V0LCB1c2UgeW91ciBleGlzdGluZworPHA+SWYgeW91IGFscmVhZHkgaGF2ZSBhIHB1Ymxpc2hlciBhY2NvdW50IG9uIEdvb2dsZSBQbGF5LCB1c2UgeW91ciBleGlzdGluZwogYWNjb3VudCB0byBzZXQgdXAgbGljZW5zaW5nLjwvcD4KIAotPHA+VXNpbmcgeW91ciBwdWJsaXNoZXIgYWNjb3VudCBvbiBBbmRyb2lkIE1hcmtldCwgeW91IGNhbjo8L3A+Cis8cD5Vc2luZyB5b3VyIHB1Ymxpc2hlciBhY2NvdW50IG9uIEdvb2dsZSBQbGF5LCB5b3UgY2FuOjwvcD4KIAogPHVsPgogPGxpPk9idGFpbiBhIHB1YmxpYyBrZXkgZm9yIGxpY2Vuc2luZzwvbGk+CkBAIC02Myw3ICs2Myw3IEBACiA8aDQ+QWRtaW5pc3RyYXRpdmUgc2V0dGluZ3MgZm9yIGxpY2Vuc2luZzwvaDQ+CiAKIDxwPllvdSBjYW4gbWFuYWdlIHNldmVyYWwKLWFkbWluaXN0cmF0aXZlIGNvbnRyb2xzIGZvciBBbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcgb24gdGhlIHB1Ymxpc2hlciBzaXRlLiBUaGUgY29udHJvbHMgYXJlIGF2YWlsYWJsZQorYWRtaW5pc3RyYXRpdmUgY29udHJvbHMgZm9yIEdvb2dsZSBQbGF5IGxpY2Vuc2luZyBvbiB0aGUgcHVibGlzaGVyIHNpdGUuIFRoZSBjb250cm9scyBhcmUgYXZhaWxhYmxlCiBpbiB0aGUgRWRpdCBQcm9maWxlIHBhZ2UsIGluIHRoZSAiTGljZW5zaW5nIiBwYW5lbCwgc2hvd24gaW4gZmlndXJlIDEuIFRoZSBjb250cm9scwogbGV0IHlvdTogPC9wPgogCkBAIC0xMTQsMTcgKzExNCwxNyBAQAogCiA8cD5BcyBkZXNjcmliZWQgZWFybGllciwgYXBwbGljYXRpb25zIGNoZWNrIGxpY2Vuc2luZyBzdGF0dXMgbm90IGJ5IGNvbnRhY3RpbmcKIHRoZSBsaWNlbnNpbmcgc2VydmVyIGRpcmVjdGx5LCBidXQgYnkgYmluZGluZyB0byBhIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlCi1BbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBhbmQgaW5pdGlhdGluZyBhIGxpY2Vuc2UgY2hlY2sgcmVxdWVzdC4gVGhlIEFuZHJvaWQKLU1hcmtldCBzZXJ2aWNlIHRoZW4gaGFuZGxlcyB0aGUgZGlyZWN0IGNvbW11bmljYXRpb24gd2l0aCB0aGUgbGljZW5zaW5nIHNlcnZlcgorR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gYW5kIGluaXRpYXRpbmcgYSBsaWNlbnNlIGNoZWNrIHJlcXVlc3QuIFRoZSBHb29nbGUKK1BsYXkgc2VydmljZSB0aGVuIGhhbmRsZXMgdGhlIGRpcmVjdCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGxpY2Vuc2luZyBzZXJ2ZXIKIGFuZCBmaW5hbGx5IHJvdXRlcyB0aGUgcmVzcG9uc2UgYmFjayB0byB5b3VyIGFwcGxpY2F0aW9uLiBUbyBkZWJ1ZyBhbmQgdGVzdAogbGljZW5zaW5nIGluIHlvdXIgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHNldCB1cCBhIHJ1bnRpbWUgZW52aXJvbm1lbnQgdGhhdAotaW5jbHVkZXMgdGhlIG5lY2Vzc2FyeSBBbmRyb2lkIE1hcmtldCBzZXJ2aWNlLCBzbyB0aGF0IHlvdXIgYXBwbGljYXRpb24gaXMgYWJsZQoraW5jbHVkZXMgdGhlIG5lY2Vzc2FyeSBHb29nbGUgUGxheSBzZXJ2aWNlLCBzbyB0aGF0IHlvdXIgYXBwbGljYXRpb24gaXMgYWJsZQogdG8gc2VuZCBsaWNlbnNlIGNoZWNrIHJlcXVlc3RzIHRvIHRoZSBsaWNlbnNpbmcgc2VydmVyLiA8L3A+CiAKIDxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgcnVudGltZSBlbnZpcm9ubWVudCB0aGF0IHlvdSBjYW4gdXNlOiA8L3A+CiAKIDx1bD4KLTxsaT5BbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlIHRoYXQgaW5jbHVkZXMgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uLCBvcjwvbGk+Cis8bGk+QW4gQW5kcm9pZC1wb3dlcmVkIGRldmljZSB0aGF0IGluY2x1ZGVzIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiwgb3I8L2xpPgogPGxpPkFuIEFuZHJvaWQgZW11bGF0b3IgcnVubmluZyB0aGUgR29vZ2xlIEFQSXMgQWRkLW9uLCBBUEkgbGV2ZWwgOCAocmVsZWFzZSAyKQogb3IgaGlnaGVyPC9saT4KIDwvdWw+CkBAIC0xMzcsMTIgKzEzNywxMiBAQAogPHVsPgogPGxpPlJ1biBhIGNvbXBhdGlibGUgdmVyc2lvbiBvZiBBbmRyb2lkIDEuNSBvciBsYXRlciAoQVBJIGxldmVsCiAzIG9yIGhpZ2hlcikgcGxhdGZvcm0sIDxlbT5hbmQ8L2VtPiA8L2xpPgotPGxpPlJ1biBhIHN5c3RlbSBpbWFnZSBvbiB3aGljaCB0aGUgQW5kcm9pZCBNYXJrZXQgY2xpZW50IGFwcGxpY2F0aW9uCis8bGk+UnVuIGEgc3lzdGVtIGltYWdlIG9uIHdoaWNoIHRoZSBHb29nbGUgUGxheSBjbGllbnQgYXBwbGljYXRpb24KIGlzIHByZWluc3RhbGxlZC4gPC9saT4KIDwvdWw+CiAKLTxwPklmIEFuZHJvaWQgTWFya2V0IGlzIG5vdCBwcmVpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBpbWFnZSwgeW91ciBhcHBsaWNhdGlvbiB3b24ndAotYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBBbmRyb2lkIE1hcmtldCBsaWNlbnNpbmcgc2VydmVyLiA8L3A+Cis8cD5JZiBHb29nbGUgUGxheSBpcyBub3QgcHJlaW5zdGFsbGVkIGluIHRoZSBzeXN0ZW0gaW1hZ2UsIHlvdXIgYXBwbGljYXRpb24gd29uJ3QKK2JlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgR29vZ2xlIFBsYXkgbGljZW5zaW5nIHNlcnZlci4gPC9wPgogCiA8cD5Gb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gc2V0IHVwIGEgZGV2aWNlIGZvciB1c2UgaW4gZGV2ZWxvcGluZwogQW5kcm9pZCBhcHBsaWNhdGlvbnMsIHNlZSA8YQpAQCAtMTU0LDE2ICsxNTQsMTYgQEAKIGxpY2Vuc2luZy48L3A+CiAKIDxwPkJlY2F1c2UgdGhlIEFuZHJvaWQgcGxhdGZvcm1zIHByb3ZpZGVkIGluIHRoZSBBbmRyb2lkIFNESyA8ZW0+ZG8KLW5vdDwvZW0+IGluY2x1ZGUgQW5kcm9pZCBNYXJrZXQsIHlvdSBuZWVkIHRvIGRvd25sb2FkIHRoZSBHb29nbGUgQVBJcyBBZGQtT24KK25vdDwvZW0+IGluY2x1ZGUgR29vZ2xlIFBsYXksIHlvdSBuZWVkIHRvIGRvd25sb2FkIHRoZSBHb29nbGUgQVBJcyBBZGQtT24KIHBsYXRmb3JtLCBBUEkgbGV2ZWwgOCAob3IgaGlnaGVyKSwgZnJvbSB0aGUgU0RLIHJlcG9zaXRvcnkuIEFmdGVyIGRvd25sb2FkaW5nCiB0aGUgYWRkLW9uLCB5b3UgbmVlZCB0byBjcmVhdGUgYW4gQVZEIGNvbmZpZ3VyYXRpb24gdGhhdCB1c2VzIHRoYXQgc3lzdGVtIGltYWdlLgogPC9wPgogCi08cD5UaGUgR29vZ2xlIEFQSXMgQWRkLU9uIGRvZXMgbm90IGluY2x1ZGUgdGhlIGZ1bGwgQW5kcm9pZCBNYXJrZXQgY2xpZW50LgorPHA+VGhlIEdvb2dsZSBBUElzIEFkZC1PbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmdWxsIEdvb2dsZSBQbGF5IGNsaWVudC4KIEhvd2V2ZXIsIGl0IGRvZXMgcHJvdmlkZTogPC9wPgogCiA8dWw+Ci08bGk+QW4gQW5kcm9pZCBNYXJrZXQgYmFja2dyb3VuZCBzZXJ2aWNlIHRoYXQgaW1wbGVtZW50cyB0aGUKKzxsaT5BbiBHb29nbGUgUGxheSBiYWNrZ3JvdW5kIHNlcnZpY2UgdGhhdCBpbXBsZW1lbnRzIHRoZQogPGNvZGU+SUxpY2Vuc2luZ1NlcnZpY2U8L2NvZGU+IHJlbW90ZSBpbnRlcmZhY2UsIHNvIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBjYW4KIHNlbmQgbGljZW5zZSBjaGVja3Mgb3ZlciB0aGUgbmV0d29yayB0byB0aGUgbGljZW5zaW5nIHNlcnZlci4gPC9saT4KIDxsaT5BIHNldCBvZiB1bmRlcmx5aW5nIGFjY291bnQgc2VydmljZXMgdGhhdCBsZXQgeW91IGFkZCBhbiBhIEdvb2dsZSBhY2NvdW50IG9uCkBAIC0xNzQsOCArMTc0LDggQEAKIDwvdWw+CiAKIDxwPlNldmVyYWwgdmVyc2lvbnMgb2YgdGhlIGFkZC1vbiBhcmUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFNESyBNYW5hZ2VyLCBidXQgb25seQotPHN0cm9uZz5Hb29nbGUgQVBJcyBBZGQtT24sIEFQSSA4IChyZWxlYXNlIDIpIG9yIGhpZ2hlcjwvc3Ryb25nPiBpbmNsdWRlcyB0aGUgbmVjZXNzYXJ5IEFuZHJvaWQKLU1hcmtldCBzZXJ2aWNlcy48L3A+Cis8c3Ryb25nPkdvb2dsZSBBUElzIEFkZC1PbiwgQVBJIDggKHJlbGVhc2UgMikgb3IgaGlnaGVyPC9zdHJvbmc+IGluY2x1ZGVzIHRoZSBuZWNlc3NhcnkgR29vZ2xlCitQbGF5IHNlcnZpY2VzLjwvcD4KIAogCiA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9saWNlbnNpbmdfZ2FwaXNfOC5wbmciIGFsdD0iIi8+CkBAIC0yNTYsMTEgKzI1NiwxMSBAQAogCiA8cD5UbyBkb3dubG9hZCB0aGUgTFZMIGNvbXBvbmVudCBpbnRvIHlvdXIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIHVzZSB0aGUKIEFuZHJvaWQgU0RLIE1hbmFnZXIuIExhdW5jaCB0aGUgQW5kcm9pZCBTREsgTWFuYWdlciBhbmQgdGhlbgotc2VsZWN0IHRoZSAiTWFya2V0IExpY2Vuc2luZyIgY29tcG9uZW50LCBhcyBzaG93biBpbiBmaWd1cmUgMy4KK3NlbGVjdCB0aGUgIkdvb2dsZSBNYXJrZXQgTGljZW5zaW5nIiBjb21wb25lbnQsIGFzIHNob3duIGluIGZpZ3VyZSAzLgogQWNjZXB0IHRoZSB0ZXJtcyBhbmQgY2xpY2sgPHN0cm9uZz5JbnN0YWxsIFNlbGVjdGVkPC9zdHJvbmc+IHRvIGJlZ2luIHRoZSBkb3dubG9hZC4gPC9wPgogCiA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9saWNlbnNpbmdfcGFja2FnZS5wbmciIGFsdD0iIi8+Ci08cCBjbGFzcz0iaW1nLWNhcHRpb24iPjxzdHJvbmc+RmlndXJlIDMuPC9zdHJvbmc+IFRoZSBNYXJrZXQgTGljZW5zaW5nIHBhY2thZ2UgY29udGFpbnMgdGhlIExWTCBhbmQKKzxwIGNsYXNzPSJpbWctY2FwdGlvbiI+PHN0cm9uZz5GaWd1cmUgMy48L3N0cm9uZz4gVGhlIExpY2Vuc2luZyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBMVkwgYW5kCiB0aGUgTFZMIHNhbXBsZSBhcHBsaWNhdGlvbi48L3A+CiAKIDxwPldoZW4gdGhlIGRvd25sb2FkIGlzIGNvbXBsZXRlLCB0aGUgQW5kcm9pZCBTREsgTWFuYWdlciBpbnN0YWxscyBib3RoCkBAIC0yOTcsNyArMjk3LDcgQEAKIHRoYW4gdGhvc2UgaW4gZGVmYXVsdCBsb2NhdGlvbiBpbiB0aGUgU0RLLiA8L3A+CiAKIDxwPk1vdmluZyB0aGUgbGlicmFyeSBzb3VyY2VzIGlzIGltcG9ydGFudCBpcyBiZWNhdXNlLCB3aGVuIHlvdSBsYXRlciB1cGRhdGUgdGhlCi1NYXJrZXQgbGljZW5zaW5nIHBhY2thZ2UsIHRoZSBTREsgaW5zdGFsbHMgdGhlIG5ldyBmaWxlcyB0byB0aGUgc2FtZSBsb2NhdGlvbiBhcworTGljZW5zaW5nIHBhY2thZ2UsIHRoZSBTREsgaW5zdGFsbHMgdGhlIG5ldyBmaWxlcyB0byB0aGUgc2FtZSBsb2NhdGlvbiBhcwogdGhlIG9sZGVyIGZpbGVzLiBNb3ZpbmcgeW91ciB3b3JraW5nIGxpYnJhcnkgZmlsZXMgdG8gYSBzYWZlIGxvY2F0aW9uIGVuc3VyZXMKIHRoYXQgeW91ciB3b3JrIHdvbid0IGJlIGluYWR2ZXJ0ZW50bHkgb3ZlcndyaXR0ZW4gc2hvdWxkIHlvdSBkb3dubG9hZCBhIG5ldwogdmVyc2lvbiBvZiB0aGUgTFZMLjwvcD4KQEAgLTQzOCw3ICs0MzgsNyBAQAogCiA8aDIgaWQ9InRlc3QtZW52Ij5TZXR0aW5nIFVwIHRoZSBUZXN0aW5nIEVudmlyb25tZW50PC9oMj4KIAotPHA+VGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlIHByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdG9vbHMgdGhhdCBsZXQgeW91Cis8cD5UaGUgR29vZ2xlIFBsYXkgcHVibGlzaGVyIHNpdGUgcHJvdmlkZXMgY29uZmlndXJhdGlvbiB0b29scyB0aGF0IGxldCB5b3UKIGFuZCBvdGhlcnMgdGVzdCBsaWNlbnNpbmcgb24geW91ciBhcHBsaWNhdGlvbiBiZWZvcmUgaXQgaXMgcHVibGlzaGVkLiBBcyB5b3UgYXJlCiBpbXBsZW1lbnRpbmcgbGljZW5zaW5nLCB5b3UgY2FuIG1ha2UgdXNlIG9mIHRoZSBwdWJsaXNoZXIgc2l0ZSB0b29scyB0byB0ZXN0CiB5b3VyIGFwcGxpY2F0aW9uJ3MgUG9saWN5IGFuZCBoYW5kbGluZyBvZiBkaWZmZXJlbnQgbGljZW5zaW5nIHJlc3BvbnNlcyBhbmQKQEAgLTQ1NCw3ICs0NTQsNyBAQAogPGxpPkFuIG9wdGlvbmFsIHNldCBvZiB0ZXN0IGFjY291bnRzIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBzdGF0aWMgdGVzdAogcmVzcG9uc2Ugd2hlbiB0aGV5IGNoZWNrIHRoZSBsaWNlbnNlIG9mIGFuIGFwcGxpY2F0aW9uIHRoYXQgeW91IGhhdmUgdXBsb2FkZWQKIChyZWdhcmRsZXNzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIHB1Ymxpc2hlZCBvciBub3QpLjwvbGk+Ci08bGk+QSBydW50aW1lIGVudmlyb25tZW50IGZvciB0aGUgYXBwbGljYXRpb24gdGhhdCBpbmNsdWRlcyB0aGUgQW5kcm9pZCBNYXJrZXQKKzxsaT5BIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBHb29nbGUgUGxheQogYXBwbGljYXRpb24gb3IgR29vZ2xlIEFQSXMgQWRkLU9uLCBvbiB3aGljaCB0aGUgdXNlciBpcyBzaWduZWQgaW4gdG8gdGhlCiBwdWJsaXNoZXIgYWNjb3VudCBvciBvbmUgb2YgdGhlIHRlc3QgYWNjb3VudHMuPC9saT4KIDwvdWw+CkBAIC00NzIsNyArNDcyLDcgQEAKIAogPGgzIGlkPSJ0ZXN0LXJlc3BvbnNlIj5TZXR0aW5nIHRlc3QgcmVzcG9uc2VzIGZvciBsaWNlbnNlIGNoZWNrczwvaDM+CiAKLTxwPkFuZHJvaWQgTWFya2V0IHByb3ZpZGVzIGEgY29uZmlndXJhdGlvbiBzZXR0aW5nIGluIHlvdXIgcHVibGlzaGVyIGFjY291bnQKKzxwPkdvb2dsZSBQbGF5IHByb3ZpZGVzIGEgY29uZmlndXJhdGlvbiBzZXR0aW5nIGluIHlvdXIgcHVibGlzaGVyIGFjY291bnQKIHRoYXQgbGV0cyB5b3Ugb3ZlcnJpZGUgdGhlIG5vcm1hbCBwcm9jZXNzaW5nIG9mIGEgbGljZW5zZSBjaGVjayBhbmQgcmV0dXJuIGEKIHNwZWNpZmllZCBzdGF0aWMgcmVzcG9uc2UgY29kZS4gVGhlIHNldHRpbmcgaXMgZm9yIHRlc3Rpbmcgb25seSBhbmQgYXBwbGllcwogPGVtPm9ubHk8L2VtPiB0byBsaWNlbnNlIGNoZWNrcyBmb3IgYXBwbGljYXRpb25zIHRoYXQgeW91IGhhdmUgdXBsb2FkZWQsIG1hZGUgYnkKQEAgLTUyMiw3ICs1MjIsNyBAQAogPHA+SW4gc29tZSBjYXNlcywgeW91IG1pZ2h0IHdhbnQgdG8gbGV0IG11bHRpcGxlIHRlYW1zIG9mIGRldmVsb3BlcnMgdGVzdAogbGljZW5zaW5nIG9uIGFwcGxpY2F0aW9ucyB0aGF0IHdpbGwgdWx0aW1hdGVseSBiZSBwdWJsaXNoZWQgdGhyb3VnaCB5b3VyCiBwdWJsaXNoZXIgYWNjb3VudCwgYnV0IHdpdGhvdXQgZ2l2aW5nIHRoZW0gYWNjZXNzIHRvIHlvdXIgcHVibGlzaGVyIGFjY291bnQncwotc2lnbi1pbiBjcmVkZW50aWFscy4gVG8gbWVldCB0aGF0IG5lZWQsIHRoZSBBbmRyb2lkIE1hcmtldCBwdWJsaXNoZXIgc2l0ZSBsZXRzCitzaWduLWluIGNyZWRlbnRpYWxzLiBUbyBtZWV0IHRoYXQgbmVlZCwgdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlIGxldHMKIHlvdSBzZXQgdXAgb25lIG9yIG1vcmUgb3B0aW9uYWwgPGVtPnRlc3QgYWNjb3VudHM8L2VtPiAmbWRhc2g7IGFjY291bnRzIHRoYXQgYXJlCiBhdXRob3JpemVkIHRvIHF1ZXJ5IHRoZSBsaWNlbnNpbmcgc2VydmVyIGFuZCByZWNlaXZlIHN0YXRpYyB0ZXN0IHJlc3BvbnNlcyBmcm9tCiB5b3VyIHB1Ymxpc2hlciBhY2NvdW50LjwvcD4KQEAgLTYzMiwxMSArNjMyLDExIEBACiBlbnZpcm9ubWVudDwvaDM+CiAKIDxwPlRoZSBsaWNlbnNpbmcgc2VydmljZSBpcyBkZXNpZ25lZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMKLWxpY2Vuc2VkIHRvIHVzZSBhIGdpdmVuIGFwcGxpY2F0aW9uICZtZGFzaDsgZHVyaW5nIGEgbGljZW5zZSBjaGVjaywgdGhlIEFuZHJvaWQKLU1hcmtldCBhcHBsaWNhdGlvbiBnYXRoZXJzIHRoZSB1c2VyIElEIGZyb20gdGhlIHByaW1hcnkgYWNjb3VudCBvbiB0aGUgc3lzdGVtCitsaWNlbnNlZCB0byB1c2UgYSBnaXZlbiBhcHBsaWNhdGlvbiAmbWRhc2g7IGR1cmluZyBhIGxpY2Vuc2UgY2hlY2ssIHRoZSBHb29nbGUKK1BsYXkgYXBwbGljYXRpb24gZ2F0aGVycyB0aGUgdXNlciBJRCBmcm9tIHRoZSBwcmltYXJ5IGFjY291bnQgb24gdGhlIHN5c3RlbQogYW5kIHNlbmRzIGl0IHRvIHRoZSBzZXJ2ZXIsIHRvZ2V0aGVyIHdpdGggdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24KIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4gSG93ZXZlciwgaWYgdGhlcmUgaXMgbm8gdXNlciBpbmZvcm1hdGlvbiBhdmFpbGFibGUsIHRoZQotbGljZW5zZSBjaGVjayBjYW5ub3Qgc3VjY2VlZCwgc28gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHRlcm1pbmF0ZXMgdGhlCitsaWNlbnNlIGNoZWNrIGNhbm5vdCBzdWNjZWVkLCBzbyB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gdGVybWluYXRlcyB0aGUKIHJlcXVlc3QgYW5kIHJldHVybnMgYW4gZXJyb3IgdG8gdGhlIGFwcGxpY2F0aW9uLiA8L3A+CiAKIDxwPkR1cmluZyB0ZXN0aW5nLCB0byBlbnN1cmUgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGNhbiBzdWNjZXNzZnVsbHkgcXVlcnkgdGhlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvbWFya2V0L3B1Ymxpc2hpbmcvbXVsdGlwbGUtYXBrcy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvcHVibGlzaGluZy9tdWx0aXBsZS1hcGtzLmpkCmluZGV4IGZmNzBlODUuLmU3Y2ZhMzMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvcHVibGlzaGluZy9tdWx0aXBsZS1hcGtzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9tYXJrZXQvcHVibGlzaGluZy9tdWx0aXBsZS1hcGtzLmpkCkBAIC00NSw3ICs0NSw3IEBACiAKICAgPGgyPlNlZSBhbHNvPC9oMj4KIDxvbD4KLSAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fXNkay9jb21wYXRpYmlsaXR5LWxpYnJhcnkuaHRtbCI+Q29tcGF0aWJpbGl0eQogUGFja2FnZTwvYT48L2xpPgpAQCAtNTUsMTAgKzU1LDEwIEBACiA8L2Rpdj4KIDwvZGl2PgogCi08cD5NdWx0aXBsZSBBUEsgc3VwcG9ydCBpcyBhIGZlYXR1cmUgaW4gQW5kcm9pZCBNYXJrZXQgdGhhdCBhbGxvd3MgeW91IHRvIHB1Ymxpc2ggZGlmZmVyZW50IEFQS3MKKzxwPk11bHRpcGxlIEFQSyBzdXBwb3J0IGlzIGEgZmVhdHVyZSBvbiBHb29nbGUgUGxheSB0aGF0IGFsbG93cyB5b3UgdG8gcHVibGlzaCBkaWZmZXJlbnQgQVBLcwogZm9yIHlvdXIgYXBwbGljYXRpb24gdGhhdCBhcmUgZWFjaCB0YXJnZXRlZCB0byBkaWZmZXJlbnQgZGV2aWNlIGNvbmZpZ3VyYXRpb25zLiBFYWNoIEFQSyBpcyBhCiBjb21wbGV0ZSBhbmQgaW5kZXBlbmRlbnQgdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uLCBidXQgdGhleSBzaGFyZSB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nIG9uCi1BbmRyb2lkIE1hcmtldCBhbmQgbXVzdCBzaGFyZSB0aGUgc2FtZSBwYWNrYWdlIG5hbWUgYW5kIGJlIHNpZ25lZCB3aXRoIHRoZSBzYW1lIHJlbGVhc2Uga2V5LiBUaGlzCitHb29nbGUgUGxheSBhbmQgbXVzdCBzaGFyZSB0aGUgc2FtZSBwYWNrYWdlIG5hbWUgYW5kIGJlIHNpZ25lZCB3aXRoIHRoZSBzYW1lIHJlbGVhc2Uga2V5LiBUaGlzCiBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgY2FzZXMgaW4gd2hpY2ggeW91ciBhcHBsaWNhdGlvbiBjYW5ub3QgcmVhY2ggYWxsIGRlc2lyZWQgZGV2aWNlcyB3aXRoIGEgc2luZ2xlCiBBUEsuPC9wPgogCkBAIC03Myw4ICs3Myw4IEBACiAKIDxwPkFsdGhvdWdoIDxzdHJvbmc+d2UgZW5jb3VyYWdlIHlvdSB0byBkZXZlbG9wIGFuZCBwdWJsaXNoIGEgc2luZ2xlIEFQSzwvc3Ryb25nPiB0aGF0IHN1cHBvcnRzIGFzCiBtYW55IGRldmljZSBjb25maWd1cmF0aW9ucyBhcyBwb3NzaWJsZSwgZG9pbmcgc28gaXMgc29tZXRpbWVzIG5vdCBwb3NzaWJsZS4gVG8gaGVscAoteW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiBmb3IgYXMgbWFueSBkZXZpY2VzIGFzIHBvc3NpYmxlLCBBbmRyb2lkIE1hcmtldCBhbGxvd3MgeW91IHRvCi1wdWJsaXNoIG11bHRpcGxlIEFQS3MgdW5kZXIgdGhlIHNhbWUgYXBwbGljYXRpb24gbGlzdGluZy4gQW5kcm9pZCBNYXJrZXQgdGhlbiBzdXBwbGllcyBlYWNoIEFQSyB0bworeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiBmb3IgYXMgbWFueSBkZXZpY2VzIGFzIHBvc3NpYmxlLCBHb29nbGUgUGxheSBhbGxvd3MgeW91IHRvCitwdWJsaXNoIG11bHRpcGxlIEFQS3MgdW5kZXIgdGhlIHNhbWUgYXBwbGljYXRpb24gbGlzdGluZy4gR29vZ2xlIFBsYXkgdGhlbiBzdXBwbGllcyBlYWNoIEFQSyB0bwogdGhlIGFwcHJvcHJpYXRlIGRldmljZXMgYmFzZWQgb24gY29uZmlndXJhdGlvbiBzdXBwb3J0IHlvdSd2ZSBkZWNsYXJlZCBpbiB0aGUgbWFuaWZlc3QgZmlsZSBvZiBlYWNoCiBBUEsuPC9wPgogCkBAIC04Niw3ICs4Niw3IEBACiAgIDxsaT5TdXBwb3J0IGRpZmZlcmVudCBwbGF0Zm9ybSB2ZXJzaW9ucyB3aXRoIGVhY2ggQVBLLjwvbGk+CiA8L3VsPgogCi08cD5DdXJyZW50bHksIHRoZXNlIGFyZSB0aGUgb25seSBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzIHRoYXQgQW5kcm9pZCBNYXJrZXQgc3VwcG9ydHMgZm9yIHB1Ymxpc2hpbmcKKzxwPkN1cnJlbnRseSwgdGhlc2UgYXJlIHRoZSBvbmx5IGRldmljZSBjaGFyYWN0ZXJpc3RpY3MgdGhhdCBHb29nbGUgUGxheSBzdXBwb3J0cyBmb3IgcHVibGlzaGluZwogbXVsdGlwbGUgQVBLcyBhcyB0aGUgc2FtZSBhcHBsaWNhdGlvbi48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFlvdSBzaG91bGQgZ2VuZXJhbGx5IHVzZSBtdWx0aXBsZSBBUEtzIHRvIHN1cHBvcnQKQEAgLTEwMCw4ICsxMDAsOCBAQAogCiA8aDIgaWQ9IkNvbmNlcHRzIj5QdWJsaXNoaW5nIENvbmNlcHRzPC9oMj4KIAotPHA+QmVmb3JlIHlvdSBzdGFydCBwdWJsaXNoaW5nIG11bHRpcGxlIEFQS3Mgb24gQW5kcm9pZCBNYXJrZXQsIHlvdSBtdXN0IHVuZGVyc3RhbmQgYSBmZXcKLWNvbmNlcHRzIHJlZ2FyZGluZyBob3cgdGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlIHdvcmtzLjwvcD4KKzxwPkJlZm9yZSB5b3Ugc3RhcnQgcHVibGlzaGluZyBtdWx0aXBsZSBBUEtzIG9uIEdvb2dsZSBQbGF5LCB5b3UgbXVzdCB1bmRlcnN0YW5kIGEgZmV3Citjb25jZXB0cyByZWdhcmRpbmcgaG93IHRoZSBHb29nbGUgUGxheSBwdWJsaXNoZXIgc2l0ZSB3b3Jrcy48L3A+CiAKIDxoMyBpZD0iQWN0aXZlIj5BY3RpdmUgQVBLczwvaDM+CiAKQEAgLTExMSwyMCArMTExLDIwIEBACiAgIDxwPldoZW4gZWRpdGluZyB5b3VyIGFwcGxpY2F0aW9uLCB0aGVyZSBhcmUgdHdvIGJ1dHRvbnMgb24gdGhlIHRvcC1yaWdodCBzaWRlIG9mIHRoZSBwYWdlLiBUaGUKIGZpcnN0IGJ1dHRvbiBpcyBlaXRoZXIgPHN0cm9uZz5QdWJsaXNoPC9zdHJvbmc+IG9yIDxzdHJvbmc+VW5wdWJsaXNoPC9zdHJvbmc+IGFuZCB0aGUgc2Vjb25kCiBidXR0b24gaXMgYWx3YXlzIDxzdHJvbmc+U2F2ZTwvc3Ryb25nPiAoYnV0IGl0cyBiZWhhdmlvciBjaGFuZ2VzKS48L3A+Ci0gIDxwPldoZW4geW91ciBhcHBsaWNhdGlvbiBpcyBuZXcgb3IgeW91IGhhdmUgdW5wdWJsaXNoZWQgaXQgZnJvbSBNYXJrZXQsIHRoZSBmaXJzdAorICA8cD5XaGVuIHlvdXIgYXBwbGljYXRpb24gaXMgbmV3IG9yIHlvdSBoYXZlIHVucHVibGlzaGVkIGl0IGZyb20gR29vZ2xlIFBsYXksIHRoZSBmaXJzdAogYnV0dG9uIHNheXMgPHN0cm9uZz5QdWJsaXNoPC9zdHJvbmc+LiBDbGlja2luZyBpdCB3aWxsIHB1Ymxpc2ggYW55IEFQS3MgbGlzdGVkIGFzCi1BY3RpdmUsIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBvbiBBbmRyb2lkIE1hcmtldC4gQWxzbyB3aGlsZSB5b3VyIGFwcGxpY2F0aW9uIGlzIG5ldworQWN0aXZlLCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgb24gR29vZ2xlIFBsYXkuIEFsc28gd2hpbGUgeW91ciBhcHBsaWNhdGlvbiBpcyBuZXcKIG9yIHVucHVibGlzaGVkLCBjbGlja2luZyA8c3Ryb25nPlNhdmU8L3N0cm9uZz4gd2lsbCBzYXZlIGFueSBjaGFuZ2VzIHlvdSd2ZSBtYWRlLCBzdWNoCiBhcyBpbmZvcm1hdGlvbiBhZGRlZCB0byB0aGUgUHJvZHVjdCBkZXRhaWxzIGFuZCBBUEtzIHlvdSd2ZSB1cGxvYWRlZCwgYnV0IG5vdGhpbmcgaXMgbWFkZSB2aXNpYmxlIG9uCi1BbmRyb2lkIE1hcmtldCZtZGFzaDt0aGlzIGFsbG93cyB5b3UgdG8gc2F2ZSB5b3VyIGNoYW5nZXMgYW5kIHNpZ24gb3V0IG9mIHRoZSBwdWJsaXNoZXIgc2l0ZSBiZWZvcmUKK0dvb2dsZSBQbGF5Jm1kYXNoO3RoaXMgYWxsb3dzIHlvdSB0byBzYXZlIHlvdXIgY2hhbmdlcyBhbmQgc2lnbiBvdXQgb2YgdGhlIHB1Ymxpc2hlciBzaXRlIGJlZm9yZQogZGVjaWRpbmcgdG8gcHVibGlzaC48L3A+CiAgPHA+T25jZSB5b3UndmUgcHVibGlzaGVkIHlvdXIgYXBwbGljYXRpb24sIHRoZSBmaXJzdCBidXR0b24gY2hhbmdlcyB0bwogPHN0cm9uZz5VbnB1Ymxpc2g8L3N0cm9uZz4uIENsaWNraW5nIGl0IGluIHRoaXMgc3RhdGUgdW5wdWJsaXNoZXMgeW91ciBhcHBsaWNhdGlvbiBzbyB0aGF0IG5vbmUKLW9mIHRoZSBBUEtzIGFyZSBhdmFpbGFibGUgb24gQW5kcm9pZCBNYXJrZXQuIEFsc28gd2hpbGUgcHVibGlzaGVkLCB0aGUgYmVoYXZpb3Igb2YgdGhlCitvZiB0aGUgQVBLcyBhcmUgYXZhaWxhYmxlIG9uIEdvb2dsZSBQbGF5LiBBbHNvIHdoaWxlIHB1Ymxpc2hlZCwgdGhlIGJlaGF2aW9yIG9mIHRoZQogPHN0cm9uZz5TYXZlPC9zdHJvbmc+IGJ1dHRvbiBpcyBkaWZmZXJlbnQuIEluIHRoaXMgc3RhdGUsIGNsaWNraW5nIDxzdHJvbmc+U2F2ZTwvc3Ryb25nPiBub3QKLW9ubHkgc2F2ZXMgYWxsIHlvdXIgY2hhbmdlcywgYnV0IGFsc28gcHVibGlzaGVzIHRoZW0gdG8gQW5kcm9pZCBNYXJrZXQuIEZvciBleGFtcGxlLCBpZiB5b3UndmUKK29ubHkgc2F2ZXMgYWxsIHlvdXIgY2hhbmdlcywgYnV0IGFsc28gcHVibGlzaGVzIHRoZW0gdG8gR29vZ2xlIFBsYXkuIEZvciBleGFtcGxlLCBpZiB5b3UndmUKIGFscmVhZHkgcHVibGlzaGVkIHlvdXIgYXBwbGljYXRpb24gYW5kIHRoZW4gbWFrZSBjaGFuZ2VzIHRvIHlvdXIgcHJvZHVjdCBkZXRhaWxzIG9yIGFjdGl2YXRlIG5ldwotQVBLcywgY2xpY2tpbmcgPHN0cm9uZz5TYXZlPC9zdHJvbmc+IG1ha2VzIGFsbCB0aG9zZSBjaGFuZ2VzIGxpdmUgb24gQW5kcm9pZCBNYXJrZXQuPC9wPgorQVBLcywgY2xpY2tpbmcgPHN0cm9uZz5TYXZlPC9zdHJvbmc+IG1ha2VzIGFsbCB0aG9zZSBjaGFuZ2VzIGxpdmUgb24gR29vZ2xlIFBsYXkuPC9wPgogPC9kaXY+CiA8L2Rpdj4KIApAQCAtMTM1LDE0ICsxMzUsMTQgQEAKIHlvdSdyZSBhYm91dCB0byBwdWJsaXNoLjwvcD4KIAogPHA+SWYgdGhlcmUgYXJlIG5vIGVycm9ycywgYW55ICJhY3RpdmUiIEFQSyB3aWxsIGJlIHB1Ymxpc2hlZCB0bwotQW5kcm9pZCBNYXJrZXQgd2hlbiB5b3UgY2xpY2sgdGhlIDxzdHJvbmc+UHVibGlzaDwvc3Ryb25nPiBidXR0b24gKGlmIHRoZSBhcHBsaWNhdGlvbiBpcworR29vZ2xlIFBsYXkgd2hlbiB5b3UgY2xpY2sgdGhlIDxzdHJvbmc+UHVibGlzaDwvc3Ryb25nPiBidXR0b24gKGlmIHRoZSBhcHBsaWNhdGlvbiBpcwogdW5wdWJsaXNoZWQpIG9yIHdoZW4geW91IGNsaWNrIHRoZSA8c3Ryb25nPlNhdmU8L3N0cm9uZz4gYnV0dG9uIChpZiB0aGUgYXBwbGljYXRpb24gaXMKIGFscmVhZHkgcHVibGlzaGVkKS48L3A+CiAKIAogPGgzIGlkPSJTaW1wbGVBbmRBZHZhbmNlZCI+U2ltcGxlIG1vZGUgYW5kIGFkdmFuY2VkIG1vZGU8L2gzPgogCi08cD5UaGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUgcHJvdmlkZXMgdHdvIG1vZGVzIGZvciBtYW5hZ2luZyB0aGUgQVBLcyBhc3NvY2lhdGVkIHdpdGgKKzxwPlRoZSBHb29nbGUgUGxheSBwdWJsaXNoZXIgc2l0ZSBwcm92aWRlcyB0d28gbW9kZXMgZm9yIG1hbmFnaW5nIHRoZSBBUEtzIGFzc29jaWF0ZWQgd2l0aAogeW91ciBhcHBsaWNhdGlvbjogPGVtPnNpbXBsZSBtb2RlPC9lbT4gYW5kIDxlbT5hZHZhbmNlZCBtb2RlPC9lbT4uIFlvdSBjYW4gc3dpdGNoIGJldHdlZW4gdGhlc2UgYnkKIGNsaWNraW5nIHRoZQogbGluayBhdCB0aGUgdG9wLXJpZ2h0IGNvcm5lciBvZiB0aGUgPHN0cm9uZz5BUEsgZmlsZXM8L3N0cm9uZz4gdGFiLjwvcD4KQEAgLTE2NCwyMSArMTY0LDIxIEBACiAKIDxoMiBpZD0iSG93SXRXb3JrcyI+SG93IE11bHRpcGxlIEFQS3MgV29yazwvaDI+CiAKLTxwPlRoZSBjb25jZXB0IGZvciB1c2luZyBtdWx0aXBsZSBBUEtzIG9uIEFuZHJvaWQgTWFya2V0IGlzIHRoYXQgeW91IGhhdmUganVzdCBvbmUgZW50cnkgaW4KLUFuZHJvaWQgTWFya2V0IGZvciB5b3VyIGFwcGxpY2F0aW9uLCBidXQgZGlmZmVyZW50IGRldmljZXMgbWlnaHQgZG93bmxvYWQgYSBkaWZmZXJlbnQgQVBLLiBUaGlzCis8cD5UaGUgY29uY2VwdCBmb3IgdXNpbmcgbXVsdGlwbGUgQVBLcyBvbiBHb29nbGUgUGxheSBpcyB0aGF0IHlvdSBoYXZlIGp1c3Qgb25lIGVudHJ5IGluCitHb29nbGUgUGxheSBmb3IgeW91ciBhcHBsaWNhdGlvbiwgYnV0IGRpZmZlcmVudCBkZXZpY2VzIG1pZ2h0IGRvd25sb2FkIGEgZGlmZmVyZW50IEFQSy4gVGhpcwogbWVhbnMgdGhhdDo8L3A+CiAKIDx1bD4KICAgPGxpPllvdSBtYWludGFpbiBvbmx5IG9uZSBzZXQgb2YgcHJvZHVjdCBkZXRhaWxzIChhcHAgZGVzY3JpcHRpb24sIGljb25zLCBzY3JlZW5zaG90cywgZXRjLikuCiBUaGlzIGFsc28gbWVhbnMgeW91IDxlbT5jYW5ub3Q8L2VtPiBjaGFyZ2UgYSBkaWZmZXJlbnQgcHJpY2UgZm9yIGRpZmZlcmVudCBBUEtzLjwvbGk+Ci0gIDxsaT5BbGwgdXNlcnMgc2VlIG9ubHkgb25lIHZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldCwgc28gdGhleSBhcmUgbm90CisgIDxsaT5BbGwgdXNlcnMgc2VlIG9ubHkgb25lIHZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgc28gdGhleSBhcmUgbm90CiBjb25mdXNlZCBieSBkaWZmZXJlbnQgdmVyc2lvbnMgeW91IG1heSBoYXZlIHB1Ymxpc2hlZCB0aGF0IGFyZSAiZm9yIHRhYmxldHMiIG9yCiAiZm9yIHBob25lcy4iPC9saT4KICAgPGxpPkFsbCB1c2VyIHJldmlld3MgYXJlIGFwcGxpZWQgdG8gdGhlIHNhbWUgYXBwbGljYXRpb24gbGlzdGluZywgZXZlbiB0aG91Z2ggdXNlcnMgb24gZGlmZmVyZW50CiBkZXZpY2VzIG1heSBoYXZlIGRpZmZlcmVudCBBUEtzLjwvbGk+CiAgIDxsaT5JZiB5b3UgcHVibGlzaCBkaWZmZXJlbnQgQVBLcyBmb3IgZGlmZmVyZW50IHZlcnNpb25zIG9mIEFuZHJvaWQgKGZvciBkaWZmZXJlbnQgQVBJIGxldmVscyksCiB0aGVuIHdoZW4gYSB1c2VyJ3MgZGV2aWNlIHJlY2VpdmVzIGEgc3lzdGVtIHVwZGF0ZSB0aGF0IHF1YWxpZmllcyB0aGVtIGZvciBhIGRpZmZlcmVudCBBUEsgeW91J3ZlCi1wdWJsaXNoZWQsIEFuZHJvaWQgTWFya2V0IHVwZGF0ZXMgdGhlIHVzZXIncyBhcHBsaWNhdGlvbiB0byB0aGUgQVBLIGRlc2lnbmVkIGZvciB0aGUgaGlnaGVyIHZlcnNpb24KK3B1Ymxpc2hlZCwgR29vZ2xlIFBsYXkgdXBkYXRlcyB0aGUgdXNlcidzIGFwcGxpY2F0aW9uIHRvIHRoZSBBUEsgZGVzaWduZWQgZm9yIHRoZSBoaWdoZXIgdmVyc2lvbgogb2YgQW5kcm9pZC4gQW55IHN5c3RlbSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gaXMgcmV0YWluZWQgKHRoZSBzYW1lIGFzIHdpdGggbm9ybWFsCiBhcHBsaWNhdGlvbiB1cGRhdGVzIHdoZW4gdXNpbmcgYSBzaW5nbGUgQVBLKS48L2xpPgogPC91bD4KQEAgLTE5Miw4ICsxOTIsOCBAQAogPGgzIGlkPSJTdXBwb3J0ZWRGaWx0ZXJzIj5TdXBwb3J0ZWQgZmlsdGVyczwvaDM+CiAKIDxwPldoaWNoIGRldmljZXMgcmVjZWl2ZSBlYWNoIEFQSyBpcyBkZXRlcm1pbmVkIGJ5IDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+QW5kcm9pZCBNYXJrZXQgZmlsdGVyczwvYT4gdGhhdCBhcmUgc3BlY2lmaWVkIGJ5Ci1lbGVtZW50cyBpbiB0aGUgbWFuaWZlc3QgZmlsZSBvZiBlYWNoIEFQSy4gSG93ZXZlciwgQW5kcm9pZCBNYXJrZXQgYWxsb3dzIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlCitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+R29vZ2xlIFBsYXkgZmlsdGVyczwvYT4gdGhhdCBhcmUgc3BlY2lmaWVkIGJ5CitlbGVtZW50cyBpbiB0aGUgbWFuaWZlc3QgZmlsZSBvZiBlYWNoIEFQSy4gSG93ZXZlciwgR29vZ2xlIFBsYXkgYWxsb3dzIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlCiBBUEtzIG9ubHkgd2hlbiBlYWNoIEFQSyB1c2VzIGZpbHRlcnMgdG8gc3VwcG9ydCBhIHZhcmlhdGlvbiBvZiB0aGUgZm9sbG93aW5nCiBkZXZpY2UgY2hhcmFjdGVyaXN0aWNzOjwvcD4KIApAQCAtMjI5LDcgKzIyOSw3IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0O308L2E+IGVsZW1lbnQgYXJlICJ0cnVlIiBpZiB5b3UgZG8gbm90IGRlY2xhcmUgdGhlbSBvdGhlcndpc2UuIEhvd2V2ZXIsCiBiZWNhdXNlIHRoZSB7QGNvZGUgYW5kcm9pZDp4bGFyZ2VTY3JlZW5zfSBhdHRyaWJ1dGUgd2FzIGFkZGVkIGluIEFuZHJvaWQgMi4zIChBUEkgbGV2ZWwKLTkpLCBBbmRyb2lkIE1hcmtldCB3aWxsIGFzc3VtZSB0aGF0IGl0IGlzICJmYWxzZSIgaWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzZXQgZWl0aGVyIDxhCis5KSwgR29vZ2xlIFBsYXkgd2lsbCBhc3N1bWUgdGhhdCBpdCBpcyAiZmFsc2UiIGlmIHlvdXIgYXBwbGljYXRpb24gZG9lcyBub3Qgc2V0IGVpdGhlciA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50Lmh0bWwjbWluIj57QGNvZGUKIGFuZHJvaWQ6bWluU2RrVmVyc2lvbn08L2E+IG9yIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCN0YXJnZXQiPntAY29kZQpAQCAtMjY2LDcgKzI2Niw3IEBACiBhbmRyb2lkOm1pblNka1ZlcnNpb259PC9hPiB2YWx1ZSBtdXN0IGhhdmUgYSBoaWdoZXIgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sI3Zjb2RlIj57QGNvZGUgYW5kcm9pZDp2ZXJzaW9uQ29kZX08L2E+CiB2YWx1ZS4gVGhpcyBpcyBhbHNvIHRydWUgaWYgdHdvIEFQS3Mgb3ZlcmxhcCB0aGVpciBkZXZpY2Ugc3VwcG9ydCBiYXNlZCBvbiBhIGRpZmZlcmVudCBzdXBwb3J0ZWQKLWZpbHRlci4gVGhpcyBlbnN1cmVzIHRoYXQgd2hlbiBhIGRldmljZSByZWNlaXZlcyBhIHN5c3RlbSB1cGRhdGUsIEFuZHJvaWQgTWFya2V0IGNhbiBvZmZlciB0aGUgdXNlcgorZmlsdGVyLiBUaGlzIGVuc3VyZXMgdGhhdCB3aGVuIGEgZGV2aWNlIHJlY2VpdmVzIGEgc3lzdGVtIHVwZGF0ZSwgR29vZ2xlIFBsYXkgY2FuIG9mZmVyIHRoZSB1c2VyCiBhbiB1cGRhdGUgZm9yIHlvdXIgYXBwbGljYXRpb24gKGJlY2F1c2UgdXBkYXRlcyBhcmUgYmFzZWQgb24gYW4gaW5jcmVhc2UgaW4gdGhlIGFwcCB2ZXJzaW9uIGNvZGUpLgogVGhpcyByZXF1aXJlbWVudCBpcyBkZXNjcmliZWQgZnVydGhlciBpbiB0aGUgc2VjdGlvbiBiZWxvdyBhYm91dCA8YSBocmVmPSIjUnVsZXMiPlJ1bGVzIGZvcgogbXVsdGlwbGUgQVBLczwvYT4uPC9saT4KQEAgLTI4Niw4ICsyODYsOCBAQAogPC91bD4KIAogPHA+T3RoZXIgbWFuaWZlc3QgZWxlbWVudHMgdGhhdCBlbmFibGUgPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzPC9hPiZtZGFzaDtidXQgYXJlIG5vdAotbGlzdGVkIGFib3ZlJm1kYXNoO2FyZSBzdGlsbCBhcHBsaWVkIGZvciBlYWNoIEFQSyBhcyB1c3VhbC4gSG93ZXZlciwgQW5kcm9pZCBNYXJrZXQgZG9lcyBub3QgYWxsb3cKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5Hb29nbGUgUGxheSBmaWx0ZXJzPC9hPiZtZGFzaDtidXQgYXJlIG5vdAorbGlzdGVkIGFib3ZlJm1kYXNoO2FyZSBzdGlsbCBhcHBsaWVkIGZvciBlYWNoIEFQSyBhcyB1c3VhbC4gSG93ZXZlciwgR29vZ2xlIFBsYXkgZG9lcyBub3QgYWxsb3cKIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MgYmFzZWQgb24gdmFyaWF0aW9ucyBvZiB0aGVtLiBUaHVzLCB5b3UgY2Fubm90IHB1Ymxpc2gKIG11bHRpcGxlIEFQS3MgaWYgdGhlIGFib3ZlIGxpc3RlZCBmaWx0ZXJzIGFyZSB0aGUgc2FtZSBmb3IgZWFjaCBBUEsgKGJ1dCB0aGUgQVBLcyBkaWZmZXIgYmFzZWQgb24KIG90aGVyIGNoYXJhY3RlcmlzdGljcyBpbiB0aGUgbWFuaWZlc3QgZmlsZSkuIEZvcgpAQCAtMzEyLDcgKzMxMiw3IEBACiAKICAgPGxpPkVhY2ggQVBLIDxzdHJvbmc+bXVzdCBub3QgZXhhY3RseSBtYXRjaCB0aGUgY29uZmlndXJhdGlvbiBzdXBwb3J0IG9mIGFub3RoZXIgQVBLPC9zdHJvbmc+LgogICAgIDxwPlRoYXQgaXMsIGVhY2ggQVBLIG11c3QgZGVjbGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgc3VwcG9ydCBmb3IgYXQgbGVhc3Qgb25lIG9mCi10aGUgPGEgaHJlZj0iI01hcmtldEZpbHRlcnNTdXBwb3J0ZWQiPnN1cHBvcnRlZCBNYXJrZXQgZmlsdGVyczwvYT4gKGxpc3RlZCBhYm92ZSkuPC9wPgordGhlIDxhIGhyZWY9IiNTdXBwb3J0ZWRGaWx0ZXJzIj5zdXBwb3J0ZWQgR29vZ2xlIFBsYXkgZmlsdGVyczwvYT4gKGxpc3RlZCBhYm92ZSkuPC9wPgogICAgIDxwPlVzdWFsbHksIHlvdSB3aWxsIGRpZmZlcmVudGlhdGUgeW91ciBBUEtzIGJhc2VkIG9uIGEgc3BlY2lmaWMgY2hhcmFjdGVyaXN0aWMgKHN1Y2ggYXMgdGhlCiBzdXBwb3J0ZWQgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzKSwgYW5kIHRodXMsIGVhY2ggQVBLIHdpbGwgZGVjbGFyZSBzdXBwb3J0IGZvciBkaWZmZXJlbnQKIGRldmljZXMuIEhvd2V2ZXIsIGl0J3MgT0sgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIHRoYXQgb3ZlcmxhcCB0aGVpciBzdXBwb3J0IHNsaWdodGx5LiBXaGVuIHR3bwpAQCAtMzMwLDExICszMzAsMTEgQEAKICAgPGxpPkFuIEFQSyB0aGF0IHJlcXVpcmVzIGEgPHN0cm9uZz5oaWdoZXIgQVBJIGxldmVsPC9zdHJvbmc+IG11c3QgaGF2ZSBhIDxzdHJvbmc+aGlnaGVyCiB2ZXJzaW9uIGNvZGU8L3N0cm9uZz4uCiAgICAgPHA+VGhpcyBpcyB0cnVlIG9ubHkgd2hlbiBlaXRoZXI6IHRoZSBBUEtzIGRpZmZlciBiYXNlZCA8ZW0+b25seTwvZW0+IG9uIHRoZQotc3VwcG9ydGVkIEFQSSBsZXZlbHMgKG5vIG90aGVyIDxhIGhyZWY9IiNTdXBwb3J0ZWRNYXJrZXRGaWx0ZXJzIj5zdXBwb3J0ZWQgbWFya2V0IGZpbHRlcnM8L2E+CitzdXBwb3J0ZWQgQVBJIGxldmVscyAobm8gb3RoZXIgPGEgaHJlZj0iI1N1cHBvcnRlZEZpbHRlcnMiPnN1cHBvcnRlZCBmaWx0ZXJzPC9hPgogZGlzdGluZ3Vpc2ggdGhlIEFQS3MgZnJvbSBlYWNoIG90aGVyKSA8ZW0+b3I8L2VtPiB3aGVuIHRoZSBBUEtzIGRvIHVzZSBhbm90aGVyIHN1cHBvcnRlZCBmaWx0ZXIsIGJ1dAogdGhlcmUgaXMgYW4gb3ZlcmxhcCBiZXR3ZWVuIHRoZSBBUEtzIHdpdGhpbiB0aGF0IGZpbHRlci48L3A+CiAgICAgPHA+VGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBhIHVzZXIncyBkZXZpY2UgcmVjZWl2ZXMgYW4gYXBwbGljYXRpb24gdXBkYXRlIGZyb20KLUFuZHJvaWQgTWFya2V0IG9ubHkgaWYgdGhlIHZlcnNpb24gY29kZSBmb3IgdGhlIEFQSyBvbiBBbmRyb2lkIE1hcmtldCBpcyBoaWdoZXIgdGhhbiB0aGUgdmVyc2lvbgorR29vZ2xlIFBsYXkgb25seSBpZiB0aGUgdmVyc2lvbiBjb2RlIGZvciB0aGUgQVBLIG9uIEdvb2dsZSBQbGF5IGlzIGhpZ2hlciB0aGFuIHRoZSB2ZXJzaW9uCiBjb2RlIG9mIHRoZSBBUEsgY3VycmVudGx5IG9uIHRoZSBkZXZpY2UuIFRoaXMgZW5zdXJlcyB0aGF0IGlmIGEgZGV2aWNlIHJlY2VpdmVzIGEgc3lzdGVtIHVwZGF0ZSB0aGF0CiB0aGVuIHF1YWxpZmllcyBpdCB0byBpbnN0YWxsIHRoZSBBUEsgZm9yIGhpZ2hlciBBUEkgbGV2ZWxzLCB0aGUgZGV2aWNlIHJlY2VpdmVzIGFuIGFwcGxpY2F0aW9uCiB1cGRhdGUgYmVjYXVzZSB0aGUgdmVyc2lvbiBjb2RlIGluY3JlYXNlcy48L3A+CkBAIC0zNjUsNyArMzY1LDcgQEAKIAogPC91bD4KIAotPHA+RmFpbHVyZSB0byBhYmlkZSBieSB0aGUgYWJvdmUgcnVsZXMgcmVzdWx0cyBpbiBhbiBlcnJvciBvbiB0aGUgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGUKKzxwPkZhaWx1cmUgdG8gYWJpZGUgYnkgdGhlIGFib3ZlIHJ1bGVzIHJlc3VsdHMgaW4gYW4gZXJyb3Igb24gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlCiB3aGVuIHlvdSBhY3RpdmF0ZSB5b3VyIEFQS3MmbWRhc2g7eW91IHdpbGwgYmUgdW5hYmxlIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiB1bnRpbCB5b3UKIHJlc29sdmUgdGhlIGVycm9yLjwvcD4KIApAQCAtMzc3LDcgKzM3Nyw3IEBACiBBUEtzIHN1cHBvcnQgdGhlIGRldmljZXMgdGhhdCB0aGVuIGZhbGwgb3V0c2lkZSB0aGUgc3VwcG9ydGVkIHJhbmdlLiBGb3IgZXhhbXBsZSwgaWYgYW4gQVBLCiBjdXJyZW50bHkgc3VwcG9ydHMgc21hbGwgYW5kIG5vcm1hbCBzaXplIHNjcmVlbnMgYW5kIHlvdSBjaGFuZ2UgaXQgdG8gc3VwcG9ydCBvbmx5IHNtYWxsIHNjcmVlbnMsCiB0aGVuIHlvdSBoYXZlIHNocnVuayB0aGUgcG9vbCBvZiBzdXBwb3J0ZWQgZGV2aWNlcyBhbmQgc29tZSBkZXZpY2VzIHdpbGwgbm8gbG9uZ2VyIHNlZSB5b3VyCi1hcHBsaWNhdGlvbiBpbiBBbmRyb2lkIE1hcmtldC4gWW91IGNhbiByZXNvbHZlIHRoaXMgYnkgYWRkaW5nIGFub3RoZXIgQVBLIHRoYXQgc3VwcG9ydHMgbm9ybWFsIHNpemUKK2FwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiBZb3UgY2FuIHJlc29sdmUgdGhpcyBieSBhZGRpbmcgYW5vdGhlciBBUEsgdGhhdCBzdXBwb3J0cyBub3JtYWwgc2l6ZQogc2NyZWVucyBzbyB0aGF0IGFsbCBwcmV2aW91c2x5LXN1cHBvcnRlZCBkZXZpY2VzIGFyZSBzdGlsbCBzdXBwb3J0ZWQuPC9saT4KIAogICA8bGk+V2hlbiB0aGVyZSBhcmUgIm92ZXJsYXBzIiBiZXR3ZWVuIHR3byBvciBtb3JlIEFQS3MuIEZvciBleGFtcGxlLCBpZiBhbiBBUEsgc3VwcG9ydHMgc2NyZWVuCkBAIC00NjcsOCArNDY3LDggQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sI3ZuYW1lIj57QGNvZGUgYW5kcm9pZDp2ZXJzaW9uTmFtZX08L2E+KSwKIHNvIHRoYXQgaXQncyBlYXN5IGZvciB5b3UgdG8gYXNzb2NpYXRlIHRoZSB2ZXJzaW9uIGNvZGUgYW5kIHZlcnNpb24gbmFtZS48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFdoZW4geW91IGluY3JlYXNlIHRoZSB2ZXJzaW9uIGNvZGUgZm9yIGFuIEFQSywgQW5kcm9pZAotTWFya2V0IHdpbGwgcHJvbXB0IHVzZXJzIG9mIHRoZSBwcmV2aW91cyB2ZXJzaW9uIHRvIHVwZGF0ZSB0aGUgYXBwbGljYXRpb24uIFRodXMsIHRvIGF2b2lkCis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBXaGVuIHlvdSBpbmNyZWFzZSB0aGUgdmVyc2lvbiBjb2RlIGZvciBhbiBBUEssIEdvb2dsZQorUGxheSB3aWxsIHByb21wdCB1c2VycyBvZiB0aGUgcHJldmlvdXMgdmVyc2lvbiB0byB1cGRhdGUgdGhlIGFwcGxpY2F0aW9uLiBUaHVzLCB0byBhdm9pZAogdW5uZWNlc3NhcnkgdXBkYXRlcywgeW91IHNob3VsZCBub3QgaW5jcmVhc2UgdGhlIHZlcnNpb24gY29kZSBmb3IgQVBLcyB0aGF0IGRvIG5vdCBhY3R1YWxseQogaW5jbHVkZSBjaGFuZ2VzLjwvcD4KIApAQCAtNTA3LDcgKzUwNyw3IEBACiA8aDIgaWQ9IlNpbmdsZUFQSyI+VXNpbmcgYSBTaW5nbGUgQVBLIEluc3RlYWQ8L2gyPgogCiA8cD48c3Ryb25nPkNyZWF0aW5nIG11bHRpcGxlIEFQS3MgZm9yIHlvdXIgYXBwbGljYXRpb24gaXMgbm90IHRoZSBub3JtYWwgcHJvY2VkdXJlPC9zdHJvbmc+IGZvcgotcHVibGlzaGluZyBhbiBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldC4gSW4gbW9zdCBjYXNlcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHB1Ymxpc2ggeW91cgorcHVibGlzaGluZyBhbiBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheS4gSW4gbW9zdCBjYXNlcywgeW91IHNob3VsZCBiZSBhYmxlIHRvIHB1Ymxpc2ggeW91cgogYXBwbGljYXRpb24gdG8gbW9zdCB1c2VycyB3aXRoIGEgc2luZ2xlIEFQSyBhbmQgd2UgZW5jb3VyYWdlIHRoYXQgeW91IGRvIHNvLiBXaGVuIHlvdSBlbmNvdW50ZXIKIGEgc2l0dWF0aW9uIGluIHdoaWNoIHVzaW5nIGEgc2luZ2xlIEFQSyBiZWNvbWVzIGRpZmZpY3VsdCwgeW91IHNob3VsZCBjYXJlZnVsbHkgY29uc2lkZXIgYWxsIHlvdXIKIG9wdGlvbnMgYmVmb3JlIGRlY2lkaW5nIHRvIHB1Ymxpc2ggbXVsdGlwbGUgQVBLcy48L3A+CkBAIC01NDIsNyArNTQyLDcgQEAKIEZvciBleGFtcGxlLCBvbiBhIG5ldyB0YWJsZXQsIHRoZSB1c2VyIHJlY2VpdmVzIHlvdXIgYXBwbGljYXRpb24gYW5kIGl0IHJ1bnMgd2l0aCB5b3VyCiB0YWJsZXQtb3B0aW1pemVkIHJlc291cmNlcy4gVGhpcyByZXN0b3JlCiBwcm9jZXNzIGRvZXMgbm90IHdvcmsgYWNyb3NzIGRpZmZlcmVudCBBUEtzLCBiZWNhdXNlIGVhY2ggQVBLIGNhbiBwb3RlbnRpYWxseSBoYXZlIGRpZmZlcmVudAotcGVybWlzc2lvbnMgdGhhdCB0aGUgdXNlciBoYXMgbm90IGFncmVlZCB0bywgc28gQW5kcm9pZCBNYXJrZXQgbWF5IG5vdCByZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiBhdAorcGVybWlzc2lvbnMgdGhhdCB0aGUgdXNlciBoYXMgbm90IGFncmVlZCB0bywgc28gR29vZ2xlIFBsYXkgbWF5IG5vdCByZXN0b3JlIHRoZSBhcHBsaWNhdGlvbiBhdAogYWxsLiAoSWYgeW91IHVzZSBtdWx0aXBsZSBBUEtzLCB0aGUgdXNlciByZWNlaXZlcyBlaXRoZXIgdGhlIGV4YWN0IHNhbWUgQVBLIGlmIGl0J3MgY29tcGF0aWJsZSBvcgogbm90aGluZyBhdCBhbGwgYW5kIG11c3QgbWFudWFsbHkgZG93bmxvYWQgeW91ciBhcHBsaWNhdGlvbiB0byBnZXQgdGhlIEFQSyBkZXNpZ25lZCBmb3IgdGhlIG5ldwogZGV2aWNlLik8L3A+PC9saT4KQEAgLTU4Niw3ICs1ODYsNyBAQAogCiA8aDMgaWQ9IlNjcmVlbk9wdGlvbnMiPlN1cHBvcnRpbmcgbXVsdGlwbGUgc2NyZWVuczwvaDM+CiAKLTxwPlVubGVzcyB5b3VyIEFQSyBmaWxlIGV4Y2VlZHMgdGhlIEFuZHJvaWQgTWFya2V0IHNpemUgbGltaXQgb2YgNTBNQiwgc3VwcG9ydGluZyBtdWx0aXBsZSBzY3JlZW5zCis8cD5Vbmxlc3MgeW91ciBBUEsgZmlsZSBleGNlZWRzIHRoZSBHb29nbGUgUGxheSBzaXplIGxpbWl0IG9mIDUwTUIsIHN1cHBvcnRpbmcgbXVsdGlwbGUgc2NyZWVucwogc2hvdWxkIGFsd2F5cyBiZSBkb25lIHdpdGggYSBzaW5nbGUgQVBLLiBTaW5jZSBBbmRyb2lkIDEuNiwgdGhlIEFuZHJvaWQgc3lzdGVtIG1hbmFnZXMgbW9zdCBvZiB0aGUKIHdvcmsgcmVxdWlyZWQgZm9yIHlvdXIgYXBwbGljYXRpb24gdG8gcnVuIHN1Y2Nlc3NmdWxseSBvbiBhIHZhcmlldHkgb2Ygc2NyZWVuIHNpemVzIGFuZAogZGVuc2l0aWVzLjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvY29tcGF0aWJpbGl0eS5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvY29tcGF0aWJpbGl0eS5qZAppbmRleCBiYjdhNzJlLi41ZTUxNGM0IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL2NvbXBhdGliaWxpdHkuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9jb21wYXRpYmlsaXR5LmpkCkBAIC03LDcgKzcsNyBAQAogPGgyPlNlZSBhbHNvPC9oMj4KICA8b2w+CiA8bGk+PGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT48L2xpPgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcmluZyBvbiBHb29nbGUgUGxheTwvYT48L2xpPgogPGxpPjxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL3Jlc291cmNlcy9wcm92aWRpbmctcmVzb3VyY2VzLmh0bWwjQWx0ZXJuYXRpdmVSZXNvdXJjZXMiPlByb3ZpZGluZyBBbHRlcm5hdGl2ZSBSZXNvdXJjZXM8L2E+PC9saT4KIDxsaT48YQpAQCAtMzksNyArMzksNyBAQAogeW91ciBhcHBzIHRvIGRvIHRoYXQsIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgbGV0dGluZyB5b3UgbWFpbnRhaW4gY29udHJvbCBvZgogd2hhdCB0eXBlcyBvZiBkZXZpY2VzIHlvdXIgYXBwIGlzIGF2YWlsYWJsZSB0by4gV2l0aCBhIGJpdCBvZiBmb3JldGhvdWdodCBhbmQKIHNvbWUgbWlub3IgY2hhbmdlcyBpbiB5b3VyIGFwcCdzIG1hbmlmZXN0IGZpbGUsIHlvdSBjYW4gZW5zdXJlIHRoYXQgdXNlcnMKLXdob3NlIGRldmljZXMgY2Fu4oCZdCBydW4geW91ciBhcHAgd2lsbCBuZXZlciBzZWUgaXQgaW4gdGhlIEFuZHJvaWQgTWFya2V0LCBhbmQKK3dob3NlIGRldmljZXMgY2Fu4oCZdCBydW4geW91ciBhcHAgd2lsbCBuZXZlciBzZWUgaXQgb24gR29vZ2xlIFBsYXksIGFuZAogd2lsbCBub3QgZ2V0IGluIHRyb3VibGUgYnkgZG93bmxvYWRpbmcgaXQuIFRoaXMgcGFnZSBleHBsYWlucyBob3cgeW91IGNhbgogY29udHJvbCB3aGljaCBkZXZpY2VzIGhhdmUgYWNjZXNzIHRvIHlvdXIgYXBwcywgYW5kIGhvdyB0byBwcmVwYXJlIHlvdXIgYXBwcyB0bwogbWFrZSBzdXJlIHRoZXkgcmVhY2ggdGhlIHJpZ2h0IGF1ZGllbmNlLjwvcD4KQEAgLTY0LDcgKzY0LDcgQEAKIGNvcnJlc3BvbmRpbmcgaGFyZHdhcmUgb3IgZmVhdHVyZS4gQnV0IHRoYXTigJlzIG5vdCBhIHByb2JsZW06IHdlIGFsc28gZGVzaWduZWQKIEFuZHJvaWQgdG8gcHJldmVudCBhcHBzIGZyb20gYmVpbmcgdmlzaWJsZSB0byBkZXZpY2VzIHdoaWNoIGRvbuKAmXQgaGF2ZSBmZWF0dXJlcwogdGhlIGFwcHMgcmVxdWlyZS4gV2XigJl2ZSBidWlsdCBzdXBwb3J0IGZvciB0aGlzIHJpZ2h0IGludG8gdGhlIFNESyB0b29scywgYW5kCi1pdOKAmXMgcGFydCBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBpdHNlbGYsIGFzIHdlbGwgYXMgQW5kcm9pZCBNYXJrZXQuPC9wPgoraXTigJlzIHBhcnQgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gaXRzZWxmLCBhcyB3ZWxsIGFzIHBhcnQgb2YgR29vZ2xlIFBsYXkuPC9wPgogCiA8cD5BcyBhIGRldmVsb3BlciwgeW91IGhhdmUgY29tcGxldGUgY29udHJvbCBvZiBob3cgYW5kIHdoZXJlIHlvdXIgYXBwcyBhcmUKIGF2YWlsYWJsZS4gQW5kcm9pZCBwcm92aWRlcyB0b29scyBhcyBhIGZpcnN0LWNsYXNzIHBhcnQgb2YgdGhlIHBsYXRmb3JtIHRoYXQgbGV0CkBAIC03OSw5ICs3OSw5IEBACiA8bGk+WW91IHN0YXRlIHRoZSBmZWF0dXJlcyB5b3VyIGFwcCByZXF1aXJlcyBieSBkZWNsYXJpbmcgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+PC9hPgogZWxlbWVudHMgaXRzIG1hbmlmZXN0IGZpbGUuPC9saT4KLTxsaT5EZXZpY2VzIGFyZSByZXF1aXJlZCB0byBkZWNsYXJlIHRoZSBmZWF0dXJlcyB0aGV5IGluY2x1ZGUgdG8gQW5kcm9pZAotTWFya2V0LjwvbGk+Ci08bGk+QW5kcm9pZCBNYXJrZXQgdXNlcyB5b3VyIGFwcOKAmXMgc3RhdGVkIHJlcXVpcmVtZW50cyB0byBmaWx0ZXIgaXQgZnJvbSBkZXZpY2VzCis8bGk+RGV2aWNlcyBhcmUgcmVxdWlyZWQgdG8gZGVjbGFyZSB0aGUgZmVhdHVyZXMgdGhleSBpbmNsdWRlIHRvIEdvb2dsZQorUGxheS48L2xpPgorPGxpPkdvb2dsZSBQbGF5IHVzZXMgeW91ciBhcHDigJlzIHN0YXRlZCByZXF1aXJlbWVudHMgdG8gZmlsdGVyIGl0IGZyb20gZGV2aWNlcwogdGhhdCBkb27igJl0IG1lZXQgdGhvc2UgcmVxdWlyZW1lbnRzLjwvbGk+CiA8L29sPgogCkBAIC0xMDMsMjQgKzEwMywyNCBAQAogIDxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+IAogICA8aW1nIGlkPSJydWxlIiBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmciPiAKICAgPGRpdiBpZD0icXYtc3ViLXJ1bGUiPiAKLSAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjA7Ij4gCi0gICAgPHAgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij5GaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQ8L3A+CisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKKyAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPkZpbHRlcmluZyBvbiBHb29nbGUgUGxheTwvcD4KIAotICAgIDxwPkFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbworICAgIDxwPkdvb2dsZSBQbGF5IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbwogdGhhdCB1c2VycyBjYW4gc2VlIGFuZCBkb3dubG9hZCBvbmx5IHRob3NlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGgKIHRoZWlyIGRldmljZXMuPC9wPgogCi0gICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+T25lIG9mIHRoZSB3YXlzIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieQotZmVhdHVyZSBjb21wYXRpYmlsaXR5LiBUbyBkbyB0aGlzLCBNYXJrZXQgY2hlY2tzIHRoZQorICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiPk9uZSBvZiB0aGUgd2F5cyBHb29nbGUgUGxheSBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieQorZmVhdHVyZSBjb21wYXRpYmlsaXR5LiBUbyBkbyB0aGlzLCBHb29nbGUgUGxheSBjaGVja3MgdGhlCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMgaW4gZWFjaCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0LCB0bwotZXN0YWJsaXNoIHRoZSBhcHAncyBmZWF0dXJlIG5lZWRzLiBNYXJrZXQgdGhlbiBzaG93cyBvciBoaWRlcyB0aGUgYXBwbGljYXRpb24gdG8KK2VzdGFibGlzaCB0aGUgYXBwJ3MgZmVhdHVyZSBuZWVkcy4gR29vZ2xlIFBsYXkgdGhlbiBzaG93cyBvciBoaWRlcyB0aGUgYXBwbGljYXRpb24gdG8KIGVhY2ggdXNlciwgYmFzZWQgb24gYSBjb21wYXJpc29uIHdpdGggdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBvbiB0aGUgdXNlcidzCiBkZXZpY2UuIAogCiA8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgZmlsdGVycyB0aGF0IHlvdSBjYW4KIHVzZSB0byBjb250cm9sIHRoZSBhdmFpbGFiaWxpdHkgb2YgeW91ciBhcHBzLCBzZWUgdGhlIAotPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldAotRmlsdGVyczwvYT4gZG9jdW1lbnQuPC9wPgorPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+Citkb2N1bWVudC48L3A+CiAgIDwvZGl2PiAKIDwvZGl2PgogCkBAIC0xNDIsOCArMTQyLDggQEAKIAogPHA+V2hlbiB5b3Ugd3JpdGUgeW91ciBhcHBsaWNhdGlvbiwgeW91IHNwZWNpZnkgd2hpY2ggZmVhdHVyZXMgeW91ciBhcHAgcmVxdWlyZXMKIGJ5IGxpc3RpbmcgdGhlaXIgZmVhdHVyZSBJRHMgaW4gPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnRzIGluCi10aGUgPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4gZmlsZS4gIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgQW5kcm9pZAotTWFya2V0IHVzZXMgdG8gbWF0Y2ggeW91ciBhcHAgdG8gZGV2aWNlcyB0aGF0IGNhbiBydW4gaXQuIEZvciBpbnN0YW5jZSwgaWYgeW91Cit0aGUgPGNvZGU+QW5kcm9pZE1hbmlmZXN0LnhtbDwvY29kZT4gZmlsZS4gIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHRoYXQgR29vZ2xlCitQbGF5IHVzZXMgdG8gbWF0Y2ggeW91ciBhcHAgdG8gZGV2aWNlcyB0aGF0IGNhbiBydW4gaXQuIEZvciBpbnN0YW5jZSwgaWYgeW91CiBzdGF0ZSB0aGF0IHlvdXIgYXBwIHJlcXVpcmVzIGFuZHJvaWQuc29mdHdhcmUubGl2ZV93YWxscGFwZXJzLCBpdCB3b27igJl0IGJlIHNob3duCiB0byBkZXZpY2VzIHRoYXQgZG9u4oCZdCBzdXBwb3J0IExpdmUgV2FsbHBhcGVycy48L3A+CiAKQEAgLTE3MCwxMiArMTcwLDEyIEBACiBidXNpbmVzcyBvciBsZWdhbCByZWFzb25zLiBGb3IgaW5zdGFuY2UsIGFuIGFwcCB0aGF0IGRpc3BsYXlzIHRyYWluIHNjaGVkdWxlcwogZm9yIHRoZSBMb25kb24gVW5kZXJncm91bmQgaXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsIHRvIHVzZXJzIG91dHNpZGUgdGhlIFVuaXRlZAogS2luZ2RvbS4gT3RoZXIgYXBwcyBtaWdodCBub3QgYmUgcGVybWl0dGVkIGluIGNlcnRhaW4gY291bnRyaWVzIGZvciBidXNpbmVzcyBvcgotbGVnYWwgcmVhc29ucy4gRm9yIGNhc2VzIHN1Y2ggYXMgdGhlc2UsIEFuZHJvaWQgTWFya2V0IGl0c2VsZiBwcm92aWRlcworbGVnYWwgcmVhc29ucy4gRm9yIGNhc2VzIHN1Y2ggYXMgdGhlc2UsIEdvb2dsZSBQbGF5IGl0c2VsZiBwcm92aWRlcwogZGV2ZWxvcGVycyB3aXRoIGZpbHRlcmluZyBvcHRpb25zIHRoYXQgYWxsb3cgdGhlbSBjb250cm9sIHRoZWlyIGFwcOKAmXMKIGF2YWlsYWJpbGl0eSBmb3Igbm9uLXRlY2huaWNhbCByZWFzb25zLjwvcD4KIAotPHA+VGhlIGhlbHAgaW5mb3JtYXRpb24gZm9yIEFuZHJvaWQgTWFya2V0IHByb3ZpZGVzIGZ1bGwgZGV0YWlscywgYnV0IGluIGEKLW51dHNoZWxsLCBkZXZlbG9wZXJzIGNhbiB1c2UgdGhlIE1hcmtldCBwdWJsaXNoZXIgVUkgdG86PC9wPgorPHA+VGhlIGhlbHAgaW5mb3JtYXRpb24gZm9yIEdvb2dsZSBQbGF5IHByb3ZpZGVzIGZ1bGwgZGV0YWlscywgYnV0IGluIGEKK251dHNoZWxsLCBkZXZlbG9wZXJzIGNhbiB1c2UgdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBVSSB0bzo8L3A+CiAKIDx1bD4KIDxsaT5MaXN0IHRoZSBjb3VudHJpZXMgYW4gYXBwIGlzIGF2YWlsYWJsZSBpbi48L2xpPgpAQCAtMTg1LDcgKzE4NSw3IEBACiA8cD5GaWx0ZXJpbmcgZm9yIHRlY2huaWNhbCBjb21wYXRpYmlsaXR5IChzdWNoIGFzIHJlcXVpcmVkIGhhcmR3YXJlIGNvbXBvbmVudHMpCiBpcyBhbHdheXMgYmFzZWQgb24gaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiB5b3VyIDxjb2RlPi5hcGs8L2NvZGU+IGZpbGUuIEJ1dAogZmlsdGVyaW5nIGZvciBub24tdGVjaG5pY2FsIHJlYXNvbnMgKHN1Y2ggYXMgZ2VvZ3JhcGhpYyByZXN0cmljdGlvbnMpIGlzIGFsd2F5cwotaGFuZGxlZCBpbiB0aGUgTWFya2V0IHVzZXIgaW50ZXJmYWNlLjwvcD4KK2hhbmRsZWQgaW4gdGhlIEdvb2dsZSBQbGF5IHVzZXIgaW50ZXJmYWNlLjwvcD4KIAogPGgzIGlkPSJmdXR1cmVwcm9vZmluZyI+RnV0dXJlLXByb29maW5nPC9oMz4KIApAQCAtMjA2LDcgKzIwNiw3IEBACiBiYXJjb2RlIHNjYW5uZXJzIGRvIG5vdCBmdW5jdGlvbiBhcyB3ZWxsIHdpdGggY2FtZXJhcyB0aGF0IGRvIG5vdCBhdXRvLWZvY3VzLiBUbwogcHJldmVudCB1c2VycyBmcm9tIGhhdmluZyBhIGJhZCBleHBlcmllbmNlIHdpdGggdGhvc2UgYXBwcywgZXhpc3RpbmcgYXBwcyB0aGF0CiBvYnRhaW4gcGVybWlzc2lvbiB0byB1c2UgdGhlIENhbWVyYSB3ZXJlIGFzc3VtZWQgYnkgZGVmYXVsdCB0byByZXF1aXJlCi1hdXRvLWZvY3VzLiBUaGlzIGFsbG93ZWQgQW5kcm9pZCBNYXJrZXQgdG8gZmlsdGVyIHRob3NlIGFwcHMgZnJvbSBkZXZpY2VzIHRoYXQKK2F1dG8tZm9jdXMuIFRoaXMgYWxsb3dlZCBHb29nbGUgUGxheSB0byBmaWx0ZXIgdGhvc2UgYXBwcyBmcm9tIGRldmljZXMgdGhhdAogbGFjayBhdXRvLWZvY3VzLjwvbGk+CiAKIDxsaT5BbmRyb2lkIDIuMiwgbWVhbndoaWxlLCBhbGxvd2VkIHRoZSBtaWNyb3Bob25lIHRvIGJlIG9wdGlvbmFsIG9uIHNvbWUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvZGVzaWduL2FjY2Vzc2liaWxpdHkuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL2Rlc2lnbi9hY2Nlc3NpYmlsaXR5LmpkCmluZGV4IGE2NmE5NzQuLjcyZGEwNGUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvZGVzaWduL2FjY2Vzc2liaWxpdHkuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9kZXNpZ24vYWNjZXNzaWJpbGl0eS5qZApAQCAtMzMyLDExICszMzIsMTAgQEAKIAogPHA+WW91IGNhbiBzaW11bGF0ZSB0aGUgZXhwZXJpZW5jZSBmb3IgbWFueSB1c2VycyBieSBlbmFibGluZyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgdGhhdCBzcGVha3MKIGFzIHlvdSBtb3ZlIGFyb3VuZCB0aGUgc2NyZWVuLiAgT25lIHN1Y2ggc2VydmljZSBpcyA8YQotaHJlZj0iaHR0cHM6Ly9tYXJrZXQuYW5kcm9pZC5jb20vZGV0YWlscz9pZD1jb20uZ29vZ2xlLmFuZHJvaWQubWFydmluLnRhbGtiYWNrIj5UYWxrQmFjazwvYT4sIGJ5IHRoZQoraHJlZj0iaHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvZGV0YWlscz9pZD1jb20uZ29vZ2xlLmFuZHJvaWQubWFydmluLnRhbGtiYWNrIj5UYWxrQmFjazwvYT4sIGJ5IHRoZQogPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2V5ZXMtZnJlZS8iPkV5ZXMtRnJlZSBQcm9qZWN0PC9hPi4gIEl0IGNvbWVzIHByZWluc3RhbGxlZCBvbiBtYW55Ci1BbmRyb2lkLXBvd2VyZWQgZGV2aWNlcywgYnV0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBmcmVlIGZyb20gPGEKLWhyZWY9Imh0dHBzOi8vbWFya2V0LmFuZHJvaWQuY29tL2RldGFpbHM/aWQ9Y29tLmdvb2dsZS5hbmRyb2lkLm1hcnZpbi50YWxrYmFjayI+QW5kcm9pZAotTWFya2V0PC9hPi48L3A+CitBbmRyb2lkLXBvd2VyZWQgZGV2aWNlcywgYnV0IGlzIGFsc28gYXZhaWxhYmxlIGZvciBmcmVlIGZyb20gdGhlIDxhCitocmVmPSJodHRwczovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9kZXRhaWxzP2lkPWNvbS5nb29nbGUuYW5kcm9pZC5tYXJ2aW4udGFsa2JhY2siPkdvb2dsZSBQbGF5PC9hPiBzdG9yZS48L3A+CiAKIDxwPlRoaXMgc2VydmljZSByZXF1aXJlcyB0aGF0IHlvdSBoYXZlIGEgdGV4dC10by1zcGVlY2ggZW5naW5lIGluc3RhbGxlZCBvbiB5b3VyIHBob25lLiAgWW91IGNhbgogdmVyaWZ5IGlmIHlvdSBoYXZlIG9uZSBpbnN0YWxsZWQgaW4gdGhlIDxzdHJvbmc+VGV4dC10by1zcGVlY2g8L3N0cm9uZz4gc2V0dGluZ3MgbWVudSBieSBzZWxlY3RpbmcKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvb3B0aW1pemluZy1mb3ItMy4wLmpkIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9vcHRpbWl6aW5nLWZvci0zLjAuamQKaW5kZXggMzk2NjJmMS4uMTQwYzUwYyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9vcHRpbWl6aW5nLWZvci0zLjAuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9vcHRpbWl6aW5nLWZvci0zLjAuamQKQEAgLTQ4MSw3ICs0ODEsNyBAQAogY29uZmlndXJhdGlvbnMgb2Ygc2NyZWVuIHNpemUgYW5kIGRlbnNpdHksIHlvdSBjYW4gaW5zdGVhZCBjaG9vc2UgdG8gbGltaXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB5b3VyCiBhcHBsaWNhdGlvbiB0byBjZXJ0YWluIHR5cGVzIG9mIHNjcmVlbnMsIHN1Y2ggYXMgb25seSB0YWJsZXRzIG9yIG9ubHkgbW9iaWxlIGRldmljZXMuIFRvIGRvIHNvLCB5b3UKIGNhbiBhZGQgZWxlbWVudHMgdG8geW91ciBBbmRyb2lkIG1hbmlmZXN0IGZpbGUgdGhhdCBlbmFibGUgZmlsdGVyaW5nIGJhc2VkIG9uIHNjcmVlbiBjb25maWd1cmF0aW9uCi1ieSBleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LjwvcD4KK2J5IGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkuPC9wPgogCiA8cD5Ib3dldmVyLCBiZWZvcmUgeW91IGRlY2lkZSB0byByZXN0cmljdCB5b3VyIGFwcGxpY2F0aW9uIHRvIGNlcnRhaW4gc2NyZWVuIGNvbmZpZ3VyYXRpb25zLCB5b3UKIHNob3VsZCB1bmRlcnN0YW5kIHRoZSB0ZWNobmlxdWVzIGZvciA8YQpAQCAtNTE3LDE0ICs1MTcsMTQgQEAKICZsdDsvbWFuaWZlc3Q+CiA8L3ByZT4KIAotPHA+RXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCByZWFkIHRoaXMgbWFuaWZlc3QgZWxlbWVudCBhbmQgdXNlIGl0IHRvIGVuc3VyZSB0aGF0Cis8cD5FeHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5IHJlYWQgdGhpcyBtYW5pZmVzdCBlbGVtZW50IGFuZCB1c2UgaXQgdG8gZW5zdXJlIHRoYXQKIHlvdXIgYXBwbGljYXRpb24gaXMgYXZhaWxhYmxlIG9ubHkgdG8gZGV2aWNlcyB3aXRoIGFuIGV4dHJhIGxhcmdlIHNjcmVlbi48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSB1c2UgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDtzdXBwb3J0cy1zY3JlZW5zPn08L2E+IGVsZW1lbnQgZm9yIHRoZSByZXZlcnNlIHNjZW5hcmlvICh3aGVuIHlvdXIgYXBwbGljYXRpb24gaXMgbm90IGNvbXBhdGlibGUKIHdpdGggPGVtPmxhcmdlcjwvZW0+IHNjcmVlbnMpIGFuZCBzZXQgdGhlIGxhcmdlciBzY3JlZW4gc2l6ZSBhdHRyaWJ1dGVzIHRvIHtAY29kZSAiZmFsc2UifSwgdGhlbgotZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCA8c3Ryb25nPmRvIG5vdDwvc3Ryb25nPiBhcHBseSBmaWx0ZXJpbmcuIFlvdXIgYXBwbGljYXRpb24KK2V4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgPHN0cm9uZz5kbyBub3Q8L3N0cm9uZz4gYXBwbHkgZmlsdGVyaW5nLiBZb3VyIGFwcGxpY2F0aW9uCiB3aWxsIHN0aWxsIGJlIGF2YWlsYWJsZSB0byBsYXJnZXIgc2NyZWVucywgYnV0IHdoZW4gaXQgcnVucywgaXQgd2lsbCBub3QgZmlsbCB0aGUgc2NyZWVuJm1kYXNoO3RoZQogc3lzdGVtIHdpbGwgZHJhdyBpdCBpbiBhICJwb3N0YWdlIHN0YW1wIiB3aW5kb3cgdGhhdCdzIHRoZSBzYW1lIHJlbGF0aXZlIHNpemUgYXMgdGhlIHNjcmVlbiBzaXplCiB0aGF0IHlvdXIgYXBwbGljYXRpb24gZG9lcyBzdXBwb3J0LiBJZiB5b3Ugd2FudCB0byBwcmV2ZW50IHlvdXIgYXBwbGljYXRpb24gZnJvbSBiZWluZyBkb3dubG9hZGVkIG9uCkBAIC01NDEsNyArNTQxLDcgQEAKIHVzZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9jb21wYXRpYmxlLXNjcmVlbnMtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDtjb21wYXRpYmxlLXNjcmVlbnM+fTwvYT4gZWxlbWVudCB0byBtYW5hZ2UgdGhlIGRpc3RyaWJ1dGlvbiBvZiB5b3VyIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHRoZQogY29tYmluYXRpb24gb2Ygc2NyZWVuIHNpemUgYW5kIGRlbnNpdHkuIEV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMKLUFuZHJvaWQgTWFya2V0IHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBhcHBseSBmaWx0ZXJpbmcgdG8geW91ciBhcHBsaWNhdGlvbiwgc28gdGhhdCBvbmx5IGRldmljZXMKK0dvb2dsZSBQbGF5IHVzZXMgdGhpcyBpbmZvcm1hdGlvbiB0byBhcHBseSBmaWx0ZXJpbmcgdG8geW91ciBhcHBsaWNhdGlvbiwgc28gdGhhdCBvbmx5IGRldmljZXMKIHRoYXQgaGF2ZSBhIHNjcmVlbiBjb25maWd1cmF0aW9uIHdpdGggd2hpY2ggeW91IGRlY2xhcmUgY29tcGF0aWJpbGl0eSBjYW4gZG93bmxvYWQgeW91cgogYXBwbGljYXRpb24uPC9wPgogCkBAIC01NTEsNyArNTUxLDcgQEAKIHRoZSB7QGNvZGUgYW5kcm9pZDpzY3JlZW5TaXplfSBhbmQge0Bjb2RlIGFuZHJvaWQ6c2NyZWVuRGVuc2l0eX0gYXR0cmlidXRlcy4gRWFjaCB7QGNvZGUKICZsdDtzY3JlZW4mZ3Q7fSBlbGVtZW50IDxzdHJvbmc+bXVzdCBpbmNsdWRlIGJvdGggYXR0cmlidXRlczwvc3Ryb25nPiB0byBzcGVjaWZ5IGFuIGluZGl2aWR1YWwKIHNjcmVlbiBjb25maWd1cmF0aW9uJm1kYXNoO2lmIGVpdGhlciBhdHRyaWJ1dGUgaXMgbWlzc2luZywgdGhlbiB0aGUgZWxlbWVudCBpcyBpbnZhbGlkCi0oZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCB3aWxsIGlnbm9yZSBpdCkuPC9wPgorKGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgd2lsbCBpZ25vcmUgaXQpLjwvcD4KIAogPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBwbGljYXRpb24gaXMgY29tcGF0aWJsZSB3aXRoIG9ubHkgc21hbGwgYW5kIG5vcm1hbCBzY3JlZW5zLCByZWdhcmRsZXNzCiBvZiBzY3JlZW4gZGVuc2l0eSwgdGhlbiB5b3UgbXVzdCBzcGVjaWZ5IGVpZ2h0IGRpZmZlcmVudCB7QGNvZGUgJmx0O3NjcmVlbiZndDt9IGVsZW1lbnRzLApAQCAtNjEzLDcgKzYxMyw3IEBACiAgIDxsaT48YSBocmVmPSIjVGVsZXBob255Ij5Ob3QgYWxsIGRldmljZXMgaGF2ZSB0ZWxlcGhvbnkgb3Igb3RoZXIgZmVhdHVyZXM8L2E+CiAgIDxwPklmIHlvdXIgYXBwbGljYXRpb24gZGVjbGFyZXMgdGhlIHtAY29kZSAiYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkifSBmZWF0dXJlIGluIHRoZSBtYW5pZmVzdCwKIHRoZW4gaXQgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIGRldmljZXMgdGhhdCBkbyBub3Qgb2ZmZXIgdGVsZXBob255IChzdWNoIGFzIHRhYmxldHMpLCBiYXNlZCBvbgotQW5kcm9pZCBNYXJrZXQgZmlsdGVyaW5nLiBJZiB5b3VyIGFwcGxpY2F0aW9uIGNhbiBmdW5jdGlvbiBwcm9wZXJseSB3aXRob3V0IHRlbGVwaG9ueSwgeW91IHNob3VsZAorR29vZ2xlIFBsYXkgZmlsdGVyaW5nLiBJZiB5b3VyIGFwcGxpY2F0aW9uIGNhbiBmdW5jdGlvbiBwcm9wZXJseSB3aXRob3V0IHRlbGVwaG9ueSwgeW91IHNob3VsZAogdXBkYXRlIHlvdXIgYXBwbGljYXRpb24gdG8gZ3JhY2VmdWxseSBkaXNhYmxlIHRoZSB0ZWxlcGhvbnkgZmVhdHVyZXMgd2hlbiBub3QgYXZhaWxhYmxlIG9uIGEKIGRldmljZS48L3A+PC9saT4KIDwvdWw+CkBAIC02ODIsNyArNjgyLDcgQEAKIDxwcmU+Jmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IiAvPjwvcHJlPgogCiA8cD5CeSBkZWZhdWx0LCB0aGlzIGRlY2xhcmVzIHRoYXQgeW91ciBhcHBsaWNhdGlvbiA8ZW0+cmVxdWlyZXM8L2VtPiB0ZWxlcGhvbnkgZmVhdHVyZXMuIFNvLAotZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBmaWx0ZXIgeW91ciBhcHBsaWNhdGlvbiBmcm9tCitleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5IHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGZpbHRlciB5b3VyIGFwcGxpY2F0aW9uIGZyb20KIGRldmljZXMgdGhhdCBkbyBub3Qgb2ZmZXIgdGVsZXBob255LjwvcD4KIAogPHA+SWYsIGhvd2V2ZXIsIHlvdXIgYXBwbGljYXRpb24gdXNlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhlIGZlYXR1cmUsIHlvdSBzaG91bGQKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVucy1kaXN0cmlidXRpb24uamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3NjcmVlbnMtZGlzdHJpYnV0aW9uLmpkCmluZGV4IDYwYzljOTUuLmE3YzRhOGUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVucy1kaXN0cmlidXRpb24uamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zLWRpc3RyaWJ1dGlvbi5qZApAQCAtMzcsNyArMzcsNyBAQAogY29uZmlndXJhdGlvbnMgb2Ygc2NyZWVuIHNpemUgYW5kIGRlbnNpdHksIHlvdSBjYW4gaW5zdGVhZCBjaG9vc2UgdG8gbGltaXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB5b3VyCiBhcHBsaWNhdGlvbiB0byBjZXJ0YWluIHR5cGVzIG9mIHNjcmVlbnMsIHN1Y2ggYXMgb25seSB0YWJsZXRzIGFuZCBvdGhlciBsYXJnZSBkZXZpY2VzIG9yIG9ubHkKIGhhbmRzZXRzIGFuZCBzaW1pbGFyLXNpemVkIGRldmljZXMuIFRvIGRvIHNvLCB5b3UgY2FuIGVuYWJsZSBmaWx0ZXJpbmcgYnkgZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcwotQW5kcm9pZCBNYXJrZXQgYnkgYWRkaW5nIGVsZW1lbnRzIHRvIHlvdXIgbWFuaWZlc3QgZmlsZSB0aGF0IHNwZWNpZnkgdGhlIHNjcmVlbiBjb25maWd1cmF0aW9ucyB5b3VyCitHb29nbGUgUGxheSBieSBhZGRpbmcgZWxlbWVudHMgdG8geW91ciBtYW5pZmVzdCBmaWxlIHRoYXQgc3BlY2lmeSB0aGUgc2NyZWVuIGNvbmZpZ3VyYXRpb25zIHlvdXIKIGFwcGxpY2F0aW9uIHN1cHBvcnRzLjwvcD4KIAogPHA+SG93ZXZlciwgYmVmb3JlIHlvdSBkZWNpZGUgdG8gcmVzdHJpY3QgeW91ciBhcHBsaWNhdGlvbiB0byBjZXJ0YWluIHNjcmVlbiBjb25maWd1cmF0aW9ucywgeW91CkBAIC01OCw3ICs1OCw3IEBACiB2ZXJzaW9ucyBvZiB5b3VyIGFwcGxpY2F0aW9uIGZvciBkaWZmZXJlbnQgc2NyZWVuIGNvbmZpZ3VyYXRpb25zLiBJbiBzdWNoIGEgY2FzZSwgeW91IGNhbiB1c2UgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L2NvbXBhdGlibGUtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O2NvbXBhdGlibGUtc2NyZWVucz59PC9hPiBlbGVtZW50IHRvIG1hbmFnZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHlvdXIgYXBwbGljYXRpb24gYmFzZWQgb24KLWNvbWJpbmF0aW9ucyBvZiBzY3JlZW4gc2l6ZSBhbmQgZGVuc2l0eS4gRXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCB1c2UgdGhpcworY29tYmluYXRpb25zIG9mIHNjcmVlbiBzaXplIGFuZCBkZW5zaXR5LiBFeHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5IHVzZSB0aGlzCiBpbmZvcm1hdGlvbiB0byBhcHBseSBmaWx0ZXJpbmcgdG8geW91ciBhcHBsaWNhdGlvbiwgc28gdGhhdCBvbmx5IGRldmljZXMgdGhhdCBoYXZlIGEgc2NyZWVuCiBjb25maWd1cmF0aW9uIHdpdGggd2hpY2ggeW91IGRlY2xhcmUgY29tcGF0aWJpbGl0eSBjYW4gZG93bmxvYWQgeW91ciBhcHBsaWNhdGlvbi48L3A+CiAKQEAgLTY4LDcgKzY4LDcgQEAKIGNvbXBhdGlibGUsIHVzaW5nIGJvdGggdGhlIHtAY29kZSBhbmRyb2lkOnNjcmVlblNpemV9IGFuZCB7QGNvZGUgYW5kcm9pZDpzY3JlZW5EZW5zaXR5fSBhdHRyaWJ1dGVzLgogRWFjaCB7QGNvZGUgJmx0O3NjcmVlbiZndDt9IGVsZW1lbnQgPHN0cm9uZz5tdXN0IGluY2x1ZGUgYm90aCBhdHRyaWJ1dGVzPC9zdHJvbmc+IHRvIHNwZWNpZnkgYW4KIGluZGl2aWR1YWwgc2NyZWVuIGNvbmZpZ3VyYXRpb24mbWRhc2g7aWYgZWl0aGVyIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLCB0aGVuIHRoZSBlbGVtZW50IGlzIGludmFsaWQKLShleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IHdpbGwgaWdub3JlIGl0KS48L3A+CisoZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSB3aWxsIGlnbm9yZSBpdCkuPC9wPgogCiA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91ciBhcHBsaWNhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggb25seSBzbWFsbCBhbmQgbm9ybWFsIHNpemUgc2NyZWVucywKIHJlZ2FyZGxlc3Mgb2Ygc2NyZWVuIGRlbnNpdHksIHlvdSBtdXN0IHNwZWNpZnkgZWlnaHQgZGlmZmVyZW50IHtAY29kZSAmbHQ7c2NyZWVuJmd0O30gZWxlbWVudHMsCkBAIC0xNzMsNyArMTczLDcgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3N1cHBvcnRzLXNjcmVlbnM+fTwvYT4gZWxlbWVudCBmb3IgdGhlIHJldmVyc2Ugc2NlbmFyaW8gKHdoZW4geW91ciBhcHBsaWNhdGlvbiBpcyBub3QgY29tcGF0aWJsZQogd2l0aCA8ZW0+bGFyZ2VyPC9lbT4gc2NyZWVucykgYW5kIHNldCB0aGUgbGFyZ2VyIHNjcmVlbiBzaXplIGF0dHJpYnV0ZXMgdG8ge0Bjb2RlICJmYWxzZSJ9LCB0aGVuCi1leHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IDxzdHJvbmc+ZG8gbm90PC9zdHJvbmc+IGFwcGx5IGZpbHRlcmluZy4gWW91ciBhcHBsaWNhdGlvbgorZXh0ZXJuYWwgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSA8c3Ryb25nPmRvIG5vdDwvc3Ryb25nPiBhcHBseSBmaWx0ZXJpbmcuIFlvdXIgYXBwbGljYXRpb24KIHdpbGwgc3RpbGwgYmUgYXZhaWxhYmxlIHRvIGxhcmdlciBzY3JlZW5zLCBidXQgd2hlbiBpdCBydW5zLCBpdCB3aWxsIG5vdCByZXNpemUgdG8gZml0IHRoZSBzY3JlZW4uCiBJbnN0ZWFkLCB0aGUgc3lzdGVtIHdpbGwgZW11bGF0ZSBhIGhhbmRzZXQgc2NyZWVuIHNpemUgKGFib3V0IDMyMGRwIHggNDgwZHA7IHNlZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW4tY29tcGF0LW1vZGUuaHRtbCI+U2NyZWVuIENvbXBhdGliaWxpdHkgTW9kZTwvYT4gZm9yIG1vcmUKQEAgLTE5NywxMyArMTk3LDEzIEBACiAKIDxoMiBpZD0iTXVsdGlBcGtzIj5QdWJsaXNoaW5nIE11bHRpcGxlIEFQS3MgZm9yIERpZmZlcmVudCBTY3JlZW5zPC9oMj4KIAotPHA+QWx0aG91Z2ggd2UgcmVjb21tZW5kIHRoYXQgeW91IHB1Ymxpc2ggb25lIEFQSyBmb3IgeW91ciBhcHBsaWNhdGlvbiwgQW5kcm9pZCBNYXJrZXQgYWxsb3dzCis8cD5BbHRob3VnaCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgcHVibGlzaCBvbmUgQVBLIGZvciB5b3VyIGFwcGxpY2F0aW9uLCBHb29nbGUgUGxheSBhbGxvd3MKIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MgZm9yIHRoZSBzYW1lCiBhcHBsaWNhdGlvbiB3aGVuIGVhY2ggQVBLIHN1cHBvcnRzIGEgZGlmZmVyZW50IHNldCBvZiBzY3JlZW4gY29uZmlndXJhdGlvbnMgKGFzIGRlY2xhcmVkIGluCiB0aGUgbWFuaWZlc3QgZmlsZSkuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBwdWJsaXNoIGJvdGggYSBoYW5kc2V0IHZlcnNpb24gYW5kIGEgdGFibGV0CiB2ZXJzaW9uIG9mIHlvdXIgYXBwbGljYXRpb24sIGJ1dCB5b3UncmUgdW5hYmxlIHRvIG1ha2UgdGhlIHNhbWUgQVBLIHdvcmsgZm9yIGJvdGggc2NyZWVuIHNpemVzLAogeW91IGNhbiBhY3R1YWxseSBwdWJsaXNoIHR3byBBUEtzIGZvciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nLiBEZXBlbmRpbmcgb24gZWFjaCBkZXZpY2Uncwotc2NyZWVuIGNvbmZpZ3VyYXRpb24sIEFuZHJvaWQgTWFya2V0IHdpbGwgZGVsaXZlciBpdCB0aGUgQVBLIHRoYXQgeW91J3ZlIGRlY2xhcmVkIHRvIHN1cHBvcnQgdGhhdAorc2NyZWVuIGNvbmZpZ3VyYXRpb24sIEdvb2dsZSBQbGF5IHdpbGwgZGVsaXZlciBpdCB0aGUgQVBLIHRoYXQgeW91J3ZlIGRlY2xhcmVkIHRvIHN1cHBvcnQgdGhhdAogZGV2aWNlJ3Mgc2NyZWVuLjwvcD4KIAogPHA+QmV3YXJlLCBob3dldmVyLCB0aGF0IHB1Ymxpc2hpbmcgbXVsdGlwbGUgQVBLcyBmb3IgdGhlIHNhbWUgYXBwbGljYXRpb24gaXMKQEAgLTIxMiw1ICsyMTIsNSBAQAogc2l6ZXMsIGVzcGVjaWFsbHksIGlzIHdpdGhpbiByZWFzb24gdXNpbmcgYSBzaW5nbGUgQVBLLCBhcyBsb25nIGFzIHlvdSBmb2xsb3cgdGhlIGd1aWRlIHRvCiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sIj5TdXBwb3J0aW5nIE11bHRpcGxlIFNjcmVlbnM8L2E+LjwvcD4KIAotPHA+SWYgeW91IG5lZWQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIG9uIEFuZHJvaWQgTWFya2V0LCByZWFkIDxhCis8cD5JZiB5b3UgbmVlZCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3Mgb24gR29vZ2xlIFBsYXksIHJlYWQgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvcHVibGlzaGluZy9tdWx0aXBsZS1hcGtzLmh0bWwiPk11bHRpcGxlIEFQSyBTdXBwb3J0PC9hPi48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0LmpkCmluZGV4IGZiMTIxYmQuLjI5ZGZmMjYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0LmpkCkBAIC04ODIsOCArODgyLDggQEAKIAogICA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBUaGUgQW5kcm9pZCBzeXN0ZW0gZG9lcyBub3QgcGF5IGF0dGVudGlvbiB0byB0aGlzCiBhdHRyaWJ1dGUsIHNvIGl0IGRvZXMgbm90IGFmZmVjdCBob3cgeW91ciBhcHBsaWNhdGlvbiBiZWhhdmVzIGF0IHJ1bnRpbWUuIEluc3RlYWQsIGl0IGlzIHVzZWQKLXRvIGVuYWJsZSBmaWx0ZXJpbmcgZm9yIHlvdXIgYXBwbGljYXRpb24gb24gc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldC4gSG93ZXZlciwKLTxzdHJvbmc+QW5kcm9pZCBNYXJrZXQgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBhdHRyaWJ1dGUgZm9yIGZpbHRlcmluZzwvc3Ryb25nPiAob24gQW5kcm9pZAordG8gZW5hYmxlIGZpbHRlcmluZyBmb3IgeW91ciBhcHBsaWNhdGlvbiBvbiBzZXJ2aWNlcyBzdWNoIGFzIEdvb2dsZSBQbGF5LiBIb3dldmVyLAorPHN0cm9uZz5Hb29nbGUgUGxheSBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGF0dHJpYnV0ZSBmb3IgZmlsdGVyaW5nPC9zdHJvbmc+IChvbiBBbmRyb2lkCiAzLjIpLCBzbyB5b3Ugc2hvdWxkIGNvbnRpbnVlIHVzaW5nIHRoZSBvdGhlciBzaXplIGF0dHJpYnV0ZXMgaWYgeW91ciBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwb3J0CiBzbWFsbCBzY3JlZW5zLjwvcD4KIDwvZGQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvYWN0aXZpdHlfdGFza19kZXNpZ24uamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvYWN0aXZpdHlfdGFza19kZXNpZ24uamQKaW5kZXggOWJlNzJlZS4uZjhjYTNmOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2FjdGl2aXR5X3Rhc2tfZGVzaWduLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9hY3Rpdml0eV90YXNrX2Rlc2lnbi5qZApAQCAtODg2LDcgKzg4Niw3IEBACiAgIFlvdSBjYW4gcGVyZm9ybSB0aGlzIHRlc3Qgd2hlbiBpbml0aWFsaXppbmcgdGhlIHVzZXIgaW50ZXJmYWNlLgogICBGb3IgaW5zdGFuY2UsIHlvdSBjb3VsZCBkaXNhYmxlIHRoZSB1c2VyIGNvbnRyb2wgdGhhdCBpbml0aWF0ZXMKICAgdGhlIEludGVudCBvYmplY3QsIG9yIGRpc3BsYXkgYSBtZXNzYWdlIHRvIHRoZSB1c2VyIHRoYXQgbGV0cyB0aGVtIGdvCi0gIHRvIGEgbG9jYXRpb24sIHN1Y2ggYXMgdGhlIE1hcmtldCwgdG8gZG93bmxvYWQgaXRzIGFwcGxpY2F0aW9uLgorICB0byBhIGxvY2F0aW9uLCBzdWNoIGFzIEdvb2dsZSBQbGF5LCB0byBkb3dubG9hZCBpdHMgYXBwbGljYXRpb24uCiAgIEluIHRoaXMgd2F5LCB5b3VyIGNvZGUgY2FuIHN0YXJ0IHRoZSBhY3Rpdml0eSAodXNpbmcgZWl0aGVyIHN0YXJ0QWN0aXZpdHkoKSAKICAgb3Igc3RhcnRBY3Rpdml0eUZvclJlc3VsdCgpKSBvbmx5IGlmIHRoZSBpbnRlbnQgaGFzIHRlc3RlZCB0byByZXNvbHZlCiAgIHRvIGFuIGFjdGl2aXR5IHRoYXQgaXMgYWN0dWFsbHkgcHJlc2VudC4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbl9sYXVuY2hlci5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbl9sYXVuY2hlci5qZAppbmRleCA2YjY4NmIxLi40YjY3NjhmIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXIuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduX2xhdW5jaGVyLmpkCkBAIC00OSw5ICs0OSw5IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ24uaHRtbCNkZXNpZ24tdGlwcyI+VGlwcyBmb3IgRGVzaWduZXJzPC9hPgogZm9yIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byB3b3JrIHdpdGggbXVsdGlwbGUgc2V0cyBvZiBpY29ucy48L3A+CiAKLTxwPkEgaGlnaC1yZXNvbHV0aW9uIHZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbiBsYXVuY2hlciBpY29uIGlzIGFsc28gcmVxdWlyZWQgYnkgQW5kcm9pZCBNYXJrZXQKKzxwPkEgaGlnaC1yZXNvbHV0aW9uIHZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbiBsYXVuY2hlciBpY29uIGlzIGFsc28gcmVxdWlyZWQgYnkgR29vZ2xlIFBsYXkKIGZvciB1c2UgaW4gYXBwbGljYXRpb24gbGlzdGluZ3MuIEZvciBtb3JlIGRldGFpbHMgb24gdGhpcywgc2VlIDxhCi1ocmVmPSIjaWNvbnNfaW5fbWFya2V0Ij5BcHBsaWNhdGlvbiBJY29ucyBpbiBBbmRyb2lkIE1hcmtldDwvYT4gYmVsb3cuPC9wPgoraHJlZj0iI2ljb25zX2luX21hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgb24gR29vZ2xlIFBsYXk8L2E+IGJlbG93LjwvcD4KIAogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgpAQCAtODEsNyArODEsNyBAQAogCiA8b2w+CiAgIDxsaT5Qcm9tb3RlIHRoZSBicmFuZCBhbmQgdGVsbCB0aGUgc3Rvcnkgb2YgdGhlIGFwcC48L2xpPgotICA8bGk+SGVscCB1c2VycyBkaXNjb3ZlciB0aGUgYXBwIGluIEFuZHJvaWQgTWFya2V0LjwvbGk+CisgIDxsaT5IZWxwIHVzZXJzIGRpc2NvdmVyIHRoZSBhcHAgb24gR29vZ2xlIFBsYXkuPC9saT4KICAgPGxpPkZ1bmN0aW9uIHdlbGwgaW4gdGhlIExhdW5jaGVyLjwvbGk+CiA8L29sPgogCkBAIC0xMDAsMTkgKzEwMCwxOSBAQAogPC91bD4KIAogCi08aDMgaWQ9ImhlbHBfdXNlcnNfZGlzY292ZXIiPkhlbHAgdXNlcnMgZGlzY292ZXIgdGhlIGFwcCBpbiBBbmRyb2lkIE1hcmtldDwvaDM+Cis8aDMgaWQ9ImhlbHBfdXNlcnNfZGlzY292ZXIiPkhlbHAgdXNlcnMgZGlzY292ZXIgdGhlIGFwcCBvbiBHb29nbGUgUGxheTwvaDM+CiAKLTxwPkFwcCBsYXVuY2hlciBpY29ucyBhcmUgdGhlIGZpcnN0IGxvb2sgdGhhdCBwcm9zcGVjdGl2ZSB1c2VycyB3aWxsIGdldCBvZiB5b3VyIGFwcCBpbiBBbmRyb2lkCi1NYXJrZXQuIEEgaGlnaCBxdWFsaXR5IGFwcCBpY29uIGNhbiBpbmZsdWVuY2UgdXNlcnMgdG8gZmluZCBvdXQgbW9yZSBhcyB0aGV5IHNjcm9sbCB0aHJvdWdoIGxpc3RzIG9mCis8cD5BcHAgbGF1bmNoZXIgaWNvbnMgYXJlIHRoZSBmaXJzdCBsb29rIHRoYXQgcHJvc3BlY3RpdmUgdXNlcnMgd2lsbCBnZXQgb2YgeW91ciBhcHAgb24gR29vZ2xlIFBsYXkuCitBIGhpZ2ggcXVhbGl0eSBhcHAgaWNvbiBjYW4gaW5mbHVlbmNlIHVzZXJzIHRvIGZpbmQgb3V0IG1vcmUgYXMgdGhleSBzY3JvbGwgdGhyb3VnaCBsaXN0cyBvZgogYXBwbGljYXRpb25zLjwvcD4KIAogPHA+UXVhbGl0eSBtYXR0ZXJzIGhlcmUuIEEgd2VsbC1kZXNpZ25lZCBpY29uIGNhbiBiZSBhIHN0cm9uZyBzaWduYWwgdGhhdCB5b3VyIGFwcAogaXMgb2Ygc2ltaWxhcmx5IGhpZ2ggcXVhbGl0eS4gQ29uc2lkZXIgd29ya2luZyB3aXRoIGFuIGljb24gZGVzaWduZXIgdG8gZGV2ZWxvcCB0aGUgYXBw4oCZcyBsYXVuY2hlcgogaWNvbi48L3A+CiAKLTxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFuZHJvaWQgTWFya2V0IHJlcXVpcmVzIGEgaGlnaC1yZXNvbHV0aW9uIHZlcnNpb24gb2YgeW91cgotaWNvbjsgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzLCBzZWUgPGEgaHJlZj0iI2ljb25zX2luX21hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgaW4gQW5kcm9pZAotTWFya2V0PC9hPiBiZWxvdy48L3A+Cis8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBHb29nbGUgUGxheSByZXF1aXJlcyBhIGhpZ2gtcmVzb2x1dGlvbiB2ZXJzaW9uIG9mIHlvdXIKK2ljb247IGZvciBtb3JlIGRldGFpbHMgb24gdGhpcywgc2VlIDxhIGhyZWY9IiNpY29uc19pbl9tYXJrZXQiPkFwcGxpY2F0aW9uIEljb25zIGluIEdvb2dsZQorUGxheTwvYT4gYmVsb3cuPC9wPgogCiAKIDxoMyBpZD0iZnVuY3Rpb25fd2VsbF9pbl9sYXVuY2hlciI+RnVuY3Rpb24gd2VsbCBpbiB0aGUgTGF1bmNoZXI8L2gzPgpAQCAtMjM5LDIxICsyMzksMjEgQEAKIHRoYXQgbGF1bmNoZXIgaWNvbnMgYXJlIGxlZ2libGUgYWNyb3NzIG9uIGFueSBiYWNrZ3JvdW5kIGNvbG9yLjwvcD4KIAogCi08aDMgaWQ9Imljb25zX2luX21hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgaW4gQW5kcm9pZCBNYXJrZXQ8L2gzPgorPGgzIGlkPSJpY29uc19pbl9tYXJrZXQiPkFwcGxpY2F0aW9uIEljb25zIG9uIEdvb2dsZSBQbGF5PC9oMz4KIAogPHA+SWYgeW91IGFyZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPnB1Ymxpc2hpbmcgeW91ciBhcHBsaWNhdGlvbiBvbgotQW5kcm9pZCBNYXJrZXQ8L2E+LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIDUxMiB4IDUxMiBwaXhlbCwgaGlnaC1yZXNvbHV0aW9uIGFwcGxpY2F0aW9uIGljb24KLWluIHRoZSA8YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPmRldmVsb3BlciBjb25zb2xlPC9hPiBhdCB1cGxvYWQgdGltZS4gVGhpcyBpY29uCi13aWxsIGJlIHVzZWQgaW4gdmFyaW91cyBsb2NhdGlvbnMgaW4gQW5kcm9pZCBNYXJrZXQgYW5kIGRvZXMgbm90IHJlcGxhY2UgeW91ciBsYXVuY2hlciBpY29uLjwvcD4KK0dvb2dsZSBQbGF5PC9hPiwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHByb3ZpZGUgYSA1MTIgeCA1MTIgcGl4ZWwsIGhpZ2gtcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29uCitpbiB0aGUgPGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPmRldmVsb3BlciBjb25zb2xlPC9hPiBhdCB1cGxvYWQgdGltZS4gVGhpcyBpY29uCit3aWxsIGJlIHVzZWQgaW4gdmFyaW91cyBsb2NhdGlvbnMgb24gR29vZ2xlIFBsYXkgYW5kIGRvZXMgbm90IHJlcGxhY2UgeW91ciBsYXVuY2hlciBpY29uLjwvcD4KIAogPHA+Rm9yIHRpcHMgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiBjcmVhdGluZyBoaWdoLXJlc29sdXRpb24gbGF1bmNoZXIgaWNvbnMgdGhhdCBjYW4gZWFzaWx5IGJlIHNjYWxlZAogdXAgdG8gNTEyeDUxMiwgc2VlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvdWlfZ3VpZGVsaW5lcy9pY29uX2Rlc2lnbi5odG1sI2Rlc2lnbi10aXBzIj4KIFRpcHMgZm9yIERlc2lnbmVyczwvYT4uPC9wPgogCi08cD5Gb3IgaW5mb3JtYXRpb24gYW5kIHNwZWNpZmljYXRpb25zIGFib3V0IGhpZ2gtcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29ucyBpbiBBbmRyb2lkIE1hcmtldCwgc2VlCis8cD5Gb3IgaW5mb3JtYXRpb24gYW5kIHNwZWNpZmljYXRpb25zIGFib3V0IGhpZ2gtcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29ucyBvbiBHb29nbGUgUGxheSwgc2VlCiB0aGUgZm9sbG93aW5nIGFydGljbGU6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTA3ODg3MCI+Ci1HcmFwaGljIEFzc2V0cyBmb3IgeW91ciBBcHBsaWNhdGlvbiAoQW5kcm9pZCBNYXJrZXQgSGVscCkgJnJhcXVvOzwvYT4KK0dyYXBoaWMgQXNzZXRzIGZvciB5b3VyIEFwcGxpY2F0aW9uIChHb29nbGUgUGxheSBIZWxwKSAmcmFxdW87PC9hPgogCiA8YnI+PGJyPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduX2xhdW5jaGVyX2FyY2hpdmUuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXJfYXJjaGl2ZS5qZAppbmRleCBlYTAzNmNkLi44NWEzY2M4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXJfYXJjaGl2ZS5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHJhY3RpY2VzL3VpX2d1aWRlbGluZXMvaWNvbl9kZXNpZ25fbGF1bmNoZXJfYXJjaGl2ZS5qZApAQCAtNTYsMTMgKzU2LDEzIEBACiAKIAogCi08aDIgaWQ9Im1hcmtldCI+QXBwbGljYXRpb24gSWNvbnMgaW4gQW5kcm9pZCBNYXJrZXQ8L2gyPgorPGgyIGlkPSJtYXJrZXQiPkFwcGxpY2F0aW9uIEljb25zIG9uIEdvb2dsZSBQbGF5PC9oMj4KIAogPHA+SWYgeW91IGFyZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPnB1Ymxpc2hpbmcKLXlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQ8L2E+LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIDUxMng1MTIKK3lvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXk8L2E+LCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIDUxMng1MTIKIHBpeGVsLCBoaWdoLXJlc29sdXRpb24gYXBwbGljYXRpb24gaWNvbiBpbiB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+ZGV2ZWxvcGVyIGNvbnNvbGU8L2E+IGF0IHVwbG9hZC10aW1lLgotVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiB2YXJpb3VzIGxvY2F0aW9ucyBpbiBBbmRyb2lkIE1hcmtldCBhbmQgZG9lcworaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPmRldmVsb3BlciBjb25zb2xlPC9hPiBhdCB1cGxvYWQtdGltZS4KK1RoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gdmFyaW91cyBsb2NhdGlvbnMgb24gR29vZ2xlIFBsYXkgYW5kIGRvZXMKIG5vdCByZXBsYWNlIHlvdXIgbGF1bmNoZXIgaWNvbi48L3A+CiAKIDxwPkZvciB0aXBzIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gY3JlYXRpbmcgaGlnaC1yZXNvbHV0aW9uIGxhdW5jaGVyIGljb25zIHRoYXQKQEAgLTcxLDExICs3MSwxMSBAQAogVGlwcyBmb3IgRGVzaWduZXJzPC9hPi48L3A+CiAKIDxwPkZvciBpbmZvcm1hdGlvbiBhbmQgc3BlY2lmaWNhdGlvbnMgYWJvdXQgaGlnaC1yZXNvbHV0aW9uIGFwcGxpY2F0aW9uCi1pY29ucyBpbiBBbmRyb2lkIE1hcmtldCwgc2VlIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZTo8L3A+CitpY29ucyBvbiBHb29nbGUgUGxheSwgc2VlIHRoZSBmb2xsb3dpbmcgYXJ0aWNsZTo8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPjxhCiBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTA3ODg3MCI+Ci0gIEdyYXBoaWMgQXNzZXRzIGZvciB5b3VyIEFwcGxpY2F0aW9uIChBbmRyb2lkIE1hcmtldCBIZWxwKSAmcmFxdW87PC9hPgorICBHcmFwaGljIEFzc2V0cyBmb3IgeW91ciBBcHBsaWNhdGlvbiAoR29vZ2xlIFBsYXkgSGVscCkgJnJhcXVvOzwvYT4KIAogCiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL2FwcC1zaWduaW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvYXBwLXNpZ25pbmcuamQKaW5kZXggOWFiY2RmNy4uZTg2ZWMzMCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvYXBwLXNpZ25pbmcuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvYXBwLXNpZ25pbmcuamQKQEAgLTgyLDcgKzgyLDcgQEAKIHVzZSB0byBidWlsZCB5b3VyIGFwcGxpY2F0aW9uLiBUaGVyZSBhcmUgdHdvIGJ1aWxkIG1vZGVzOiA8ZW0+ZGVidWcgbW9kZTwvZW0+IGFuZCA8ZW0+cmVsZWFzZQogbW9kZTwvZW0+LiBZb3UgdXNlIGRlYnVnIG1vZGUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgYW5kIHRlc3RpbmcgeW91ciBhcHBsaWNhdGlvbi4gWW91IHVzZQogcmVsZWFzZSBtb2RlIHdoZW4geW91IHdhbnQgdG8gYnVpbGQgYSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHlvdSBjYW4KLWRpc3RyaWJ1dGUgZGlyZWN0bHkgdG8gdXNlcnMgb3IgcHVibGlzaCBvbiBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LjwvcD4KK2Rpc3RyaWJ1dGUgZGlyZWN0bHkgdG8gdXNlcnMgb3IgcHVibGlzaCBvbiBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBzdWNoIGFzIEdvb2dsZSBQbGF5LjwvcD4KIAogPHA+V2hlbiB5b3UgYnVpbGQgaW4gPGVtPmRlYnVnIG1vZGU8L2VtPiB0aGUgQW5kcm9pZCBTREsgYnVpbGQgdG9vbHMgdXNlIHRoZSBLZXl0b29sIHV0aWxpdHkKIChpbmNsdWRlZCBpbiB0aGUgSkRLKSB0byBjcmVhdGUgYSBkZWJ1ZyBrZXkuIEJlY2F1c2UgdGhlIFNESyBidWlsZCB0b29scyBjcmVhdGVkIHRoZSBkZWJ1ZyBrZXksCkBAIC0xNTgsMTAgKzE1OCwxMCBAQAogbGlmZXNwYW4gb2YgPGVtPmFsbCB2ZXJzaW9ucyBvZiBhbGwgb2YgdGhlIGFwcGxpY2F0aW9uczwvZW0+LCBpbmNsdWRpbmcKIGRlcGVuZGVudCBhcHBsaWNhdGlvbnMgdGhhdCBtYXkgYmUgYWRkZWQgdG8gdGhlIHN1aXRlIGluIHRoZSBmdXR1cmUuIDwvbGk+CiAKLTxsaT5JZiB5b3UgcGxhbiB0byBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24ocykgb24gQW5kcm9pZCBNYXJrZXQsIHRoZQorPGxpPklmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbihzKSBvbiBHb29nbGUgUGxheSwgdGhlCiBrZXkgeW91IHVzZSB0byBzaWduIHRoZSBhcHBsaWNhdGlvbihzKSBtdXN0IGhhdmUgYSB2YWxpZGl0eSBwZXJpb2QKLWVuZGluZyBhZnRlciAyMiBPY3RvYmVyIDIwMzMuIFRoZSBNYXJrZXQgc2VydmVyIGVuZm9yY2VzIHRoaXMgcmVxdWlyZW1lbnQKLXRvIGVuc3VyZSB0aGF0IHVzZXJzIGNhbiBzZWFtbGVzc2x5IHVwZ3JhZGUgTWFya2V0IGFwcGxpY2F0aW9ucyB3aGVuCitlbmRpbmcgYWZ0ZXIgMjIgT2N0b2JlciAyMDMzLiBHb29nbGUgUGxheSBlbmZvcmNlcyB0aGlzIHJlcXVpcmVtZW50Cit0byBlbnN1cmUgdGhhdCB1c2VycyBjYW4gc2VhbWxlc3NseSB1cGdyYWRlIGFwcGxpY2F0aW9ucyB3aGVuCiBuZXcgdmVyc2lvbnMgYXJlIGF2YWlsYWJsZS4gPC9saT4KIDwvdWw+CiAKQEAgLTI5Miw3ICsyOTIsNyBAQAogd2l0aCB0aGUgYXBwbGljYXRpb248L2xpPgogPGxpPkhhcyBhIHZhbGlkaXR5IHBlcmlvZCB0aGF0IGV4Y2VlZHMgdGhlIGV4cGVjdGVkIGxpZmVzcGFuIG9mIHRoZSBhcHBsaWNhdGlvbgogb3IgYXBwbGljYXRpb24gc3VpdGUuIEEgdmFsaWRpdHkgcGVyaW9kIG9mIG1vcmUgdGhhbiAyNSB5ZWFycyBpcyByZWNvbW1lbmRlZC4KLTxwPklmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbihzKSBvbiBBbmRyb2lkIE1hcmtldCwgbm90ZSB0aGF0IGEKKzxwPklmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbihzKSBvbiBHb29nbGUgUGxheSwgbm90ZSB0aGF0IGEKIHZhbGlkaXR5IHBlcmlvZCBlbmRpbmcgYWZ0ZXIgMjIgT2N0b2JlciAyMDMzIGlzIGEgcmVxdWlyZW1lbnQuIFlvdSBjYW4gbm90IHVwbG9hZCBhbgogYXBwbGljYXRpb24gaWYgaXQgaXMgc2lnbmVkIHdpdGggYSBrZXkgd2hvc2UgdmFsaWRpdHkgZXhwaXJlcyBiZWZvcmUgdGhhdCBkYXRlLgogPC9wPjwvbGk+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuamQKaW5kZXggYzM1NTQ3OS4uZmU1NjM1MiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHJlcGFyaW5nLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5qZApAQCAtMjIsNyArMjIsNyBAQAogICAgIDxvbD4KICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nX292ZXJ2aWV3Lmh0bWwiPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2E+PC9saT4KICAgICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9hcHAtc2lnbmluZy5odG1sIj5TaWduaW5nIFlvdXIgQXBwbGljYXRpb25zPC9hPjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0PC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiAgICAgPC9vbD4KICAgPC9kaXY+CiA8L2Rpdj4KQEAgLTM5LDEzICszOSwxMyBAQAogdGFza3Mgc2VydmUgYXMgYSBmaW5hbCBjaGVjaywgZW5zdXJpbmcgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHBlcmZvcm1zIGFzIGV4cGVjdGVkIHVuZGVyIHJlYWwtd29ybGQKIGNvbmRpdGlvbnMuIFdoZW4geW91IGFyZSBmaW5pc2hlZCBwcmVwYXJpbmcgeW91ciBhcHBsaWNhdGlvbiBmb3IgcmVsZWFzZSB5b3UgaGF2ZSBhIHNpZ25lZAogPGNvZGU+LmFwazwvY29kZT4gZmlsZSwgd2hpY2ggeW91IGNhbiBkaXN0cmlidXRlIGRpcmVjdGx5IHRvIHVzZXJzIG9yIGRpc3RyaWJ1dGUgdGhyb3VnaCBhbgotYXBwbGljYXRpb24gbWFya2V0cGxhY2Ugc3VjaCBhcyBBbmRyb2lkIE1hcmtldC48L3A+CithcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBzdWNoIGFzIEdvb2dsZSBQbGF5LjwvcD4KIAogPHA+VGhpcyBkb2N1bWVudCBzdW1tYXJpemVzIHRoZSBtYWluIHRhc2tzIHlvdSBuZWVkIHRvIHBlcmZvcm0gdG8gcHJlcGFyZSB5b3VyIGFwcGxpY2F0aW9uIGZvcgogcmVsZWFzZS4gVGhlIHRhc2tzIHRoYXQgYXJlIGRlc2NyaWJlZCBpbiB0aGlzIGRvY3VtZW50IGFwcGx5IHRvIGFsbCBBbmRyb2lkIGFwcGxpY2F0aW9ucyByZWdhcmRsZXNzCi1ob3cgdGhleSBhcmUgcmVsZWFzZWQgb3IgZGlzdHJpYnV0ZWQgdG8gdXNlcnMuIElmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gdGhyb3VnaCBBbmRyb2lkCi1NYXJrZXQsIHlvdSBzaG91bGQgYWxzbyByZWFkIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+UHVibGlzaGluZyBvbgotQW5kcm9pZCBNYXJrZXQ8L2E+IHRvIGJlIHN1cmUgeW91ciByZWxlYXNlLXJlYWR5IGFwcGxpY2F0aW9uIHNhdGlzZmllcyBhbGwgQW5kcm9pZCBNYXJrZXQKK2hvdyB0aGV5IGFyZSByZWxlYXNlZCBvciBkaXN0cmlidXRlZCB0byB1c2Vycy4gSWYgeW91IGFyZSByZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIEdvb2dsZQorUGxheSwgeW91IHNob3VsZCBhbHNvIHJlYWQgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uCitHb29nbGUgUGxheTwvYT4gdG8gYmUgc3VyZSB5b3VyIHJlbGVhc2UtcmVhZHkgYXBwbGljYXRpb24gc2F0aXNmaWVzIGFsbCBHb29nbGUgUGxheQogcmVxdWlyZW1lbnRzLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQXMgYSBiZXN0IHByYWN0aWNlLCB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBtZWV0IGFsbCBvZiB5b3VyCkBAIC04OSw5ICs4OSw5IEBACiAKIDxwPlRvIHByZXBhcmUgeW91ciBhcHBsaWNhdGlvbiBmb3IgcmVsZWFzZSB5b3UgdHlwaWNhbGx5IHBlcmZvcm0gZml2ZSBtYWluIHRhc2tzIChzZWUgZmlndXJlIDIpLgogRWFjaCBtYWluIHRhc2sgbWF5IGluY2x1ZGUgb25lIG9yIG1vcmUgc21hbGxlciB0YXNrcyBkZXBlbmRpbmcgb24gaG93IHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIKLWFwcGxpY2F0aW9uLiBGb3IgZXhhbXBsZSwgaWYgeW91IGFyZSByZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiB0aHJvdWdoIEFuZHJvaWQgTWFya2V0IHlvdSBtYXkgd2FudAorYXBwbGljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHJlbGVhc2luZyB5b3VyIGFwcGxpY2F0aW9uIHRocm91Z2ggR29vZ2xlIFBsYXkgeW91IG1heSB3YW50CiB0byBhZGQgc3BlY2lhbCBmaWx0ZXJpbmcgcnVsZXMgdG8geW91ciBtYW5pZmVzdCB3aGlsZSB5b3UgYXJlIGNvbmZpZ3VyaW5nIHlvdXIgYXBwbGljYXRpb24gZm9yCi1yZWxlYXNlLiBTaW1pbGFybHksIHRvIG1lZXQgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGluZyBndWlkZWxpbmVzIHlvdSBtYXkgaGF2ZSB0byBwcmVwYXJlIHNjcmVlbnNob3RzCityZWxlYXNlLiBTaW1pbGFybHksIHRvIG1lZXQgR29vZ2xlIFBsYXkgcHVibGlzaGluZyBndWlkZWxpbmVzIHlvdSBtYXkgaGF2ZSB0byBwcmVwYXJlIHNjcmVlbnNob3RzCiBhbmQgY3JlYXRlIHByb21vdGlvbmFsIHRleHQgd2hpbGUgeW91IGFyZSBnYXRoZXJpbmcgbWF0ZXJpYWxzIGZvciByZWxlYXNlLjwvcD4KIAogPHA+WW91IHVzdWFsbHkgcGVyZm9ybSB0aGUgdGFza3MgbGlzdGVkIGluIGZpZ3VyZSAyIGFmdGVyIHlvdSBoYXZlIHRocm9yb3VnaGx5IGRlYnVnZ2VkIGFuZCB0ZXN0ZWQKQEAgLTEzNyw5ICsxMzcsOSBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduX2xhdW5jaGVyLmh0bWwiPmljb24gZ3VpZGVsaW5lczwvYT4uIFlvdXIKIGFwcGxpY2F0aW9uJ3MgaWNvbiBoZWxwcyB1c2VycyBpZGVudGlmeSB5b3VyIGFwcGxpY2F0aW9uIG9uIGEgZGV2aWNlJ3MgSG9tZQogc2NyZWVuIGFuZCBpbiB0aGUgTGF1bmNoZXIgd2luZG93LiBJdCBhbHNvIGFwcGVhcnMgaW4gTWFuYWdlIEFwcGxpY2F0aW9ucywgTXkgRG93bmxvYWRzLCBhbmQKLWVsc2V3aGVyZS4gSW4gYWRkaXRpb24sIHB1Ymxpc2hpbmcgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCBkaXNwbGF5IHlvdXIgaWNvbiB0byB1c2Vycy48L3A+CitlbHNld2hlcmUuIEluIGFkZGl0aW9uLCBwdWJsaXNoaW5nIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgZGlzcGxheSB5b3VyIGljb24gdG8gdXNlcnMuPC9wPgogCi08cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgYXJlIHJlbGVhc2luZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LCB5b3UKKzxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXksIHlvdQogbmVlZCB0byBjcmVhdGUgYSBoaWdoIHJlc29sdXRpb24KICAgdmVyc2lvbiBvZiB5b3VyIGljb24uIFNlZSA8YQogaHJlZj0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2FuZHJvaWRtYXJrZXQvZGV2ZWxvcGVyL2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTEwNzg4NzAiPkdyYXBoaWMKQEAgLTE1NCw3ICsxNTQsNyBAQAogPGg0Pk1pc2NlbGxhbmVvdXMgTWF0ZXJpYWxzPC9oND4KIAogPHA+WW91IG1pZ2h0IGFsc28gaGF2ZSB0byBwcmVwYXJlIHByb21vdGlvbmFsIGFuZCBtYXJrZXRpbmcgbWF0ZXJpYWxzIHRvIHB1YmxpY2l6ZSB5b3VyIGFwcGxpY2F0aW9uLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQgeW91IHdpbGwgbmVlZCB0byBwcmVwYXJlIHNvbWUKK0ZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHJlbGVhc2luZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5IHlvdSB3aWxsIG5lZWQgdG8gcHJlcGFyZSBzb21lCiBwcm9tb3Rpb25hbCB0ZXh0IGFuZCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBzY3JlZW5zaG90cyBvZiB5b3VyIGFwcGxpY2F0aW9uLiBGb3IgbW9yZQogaW5mb3JtYXRpb24sIHNlZQogPGEgaHJlZj0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2FuZHJvaWRtYXJrZXQvZGV2ZWxvcGVyL2Jpbi9hbnN3ZXIucHk/YW5zd2VyPTEwNzg4NzAiPgpAQCAtMjQyLDExICsyNDIsMTEgQEAKIDwvdWw+CiAKIDxwPlRoZXJlIGFyZSBzZXZlcmFsIGFkZGl0aW9uYWwgbWFuaWZlc3QgZWxlbWVudHMgdGhhdCB5b3UgY2FuIHNldCBpZiB5b3UgYXJlIHJlbGVhc2luZyB5b3VyCi1hcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldC4gRm9yIGV4YW1wbGUsIHRoZSA8Y29kZT5hbmRyb2lkOm1pblNka1ZlcnNpb248L2NvZGU+IGFuZAorYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuIEZvciBleGFtcGxlLCB0aGUgPGNvZGU+YW5kcm9pZDptaW5TZGtWZXJzaW9uPC9jb2RlPiBhbmQKIDxjb2RlPmFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbjwvY29kZT4gYXR0cmlidXRlcywgd2hpY2ggYXJlIGxvY2F0ZWQgaW4gdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCI+ICZsdDt1c2VzLXNkayZndDs8L2E+IGVsZW1lbnQuIEZvciBtb3JlCi1pbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBhbmQgb3RoZXIgQW5kcm9pZCBNYXJrZXQgc2V0dGluZ3MsIHNlZSA8YQotaHJlZj0ie0Bkb2NSb290fS9ndWlkZS8vYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+TWFya2V0IEZpbHRlcnM8L2E+LjwvcD4KK2luZm9ybWF0aW9uIGFib3V0IHRoZXNlIGFuZCBvdGhlciBHb29nbGUgUGxheSBzZXR0aW5ncywgc2VlIDxhCitocmVmPSJ7QGRvY1Jvb3R9L2d1aWRlLy9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPi48L3A+CiAKIDxoND5BZGRyZXNzIGNvbXBhdGliaWxpdHkgaXNzdWVzPC9oND4KIApAQCAtMjgzLDE2ICsyODMsMTUgQEAKIDxwPklmIHlvdXIgYXBwbGljYXRpb24gYWNjZXNzZXMgcmVtb3RlIHNlcnZlcnMgb3Igc2VydmljZXMsIG1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIHRoZSBwcm9kdWN0aW9uCiBVUkwgb3IgcGF0aCBmb3IgdGhlIHNlcnZlciBvciBzZXJ2aWNlIGFuZCBub3QgYSB0ZXN0IFVSTCBvciBwYXRoLjwvcD4KIAotPGg0PkltcGxlbWVudCBMaWNlbnNpbmcgKGlmIHlvdSBhcmUgcmVsZWFzaW5nIG9uIEFuZHJvaWQgTWFya2V0KTwvaDQ+Cis8aDQ+SW1wbGVtZW50IExpY2Vuc2luZyAoaWYgeW91IGFyZSByZWxlYXNpbmcgb24gR29vZ2xlIFBsYXkpPC9oND4KIAotPHA+SWYgeW91IGFyZSByZWxlYXNpbmcgYSBwYWlkIGFwcGxpY2F0aW9uIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQsIGNvbnNpZGVyIGFkZGluZyBzdXBwb3J0IGZvcgotQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nLiBMaWNlbnNpbmcgbGV0cyB5b3UgY29udHJvbCBhY2Nlc3MgdG8geW91ciBhcHBsaWNhdGlvbiBiYXNlZCBvbiB3aGV0aGVyIHRoZQotY3VycmVudCB1c2VyIGhhcyBwdXJjaGFzZWQgaXQuIFVzaW5nIEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBpcyBvcHRpb25hbCBldmVuIGlmIHlvdSBhcmUKLXJlbGVhc2luZyB5b3VyIGFwcCB0aHJvdWdoIEFuZHJvaWQgTWFya2V0LjwvcD4KKzxwPklmIHlvdSBhcmUgcmVsZWFzaW5nIGEgcGFpZCBhcHBsaWNhdGlvbiB0aHJvdWdoIEdvb2dsZSBQbGF5LCBjb25zaWRlciBhZGRpbmcgc3VwcG9ydCBmb3IKK0dvb2dsZSBQbGF5IExpY2Vuc2luZy4gTGljZW5zaW5nIGxldHMgeW91IGNvbnRyb2wgYWNjZXNzIHRvIHlvdXIgYXBwbGljYXRpb24gYmFzZWQgb24gd2hldGhlciB0aGUKK2N1cnJlbnQgdXNlciBoYXMgcHVyY2hhc2VkIGl0LiBVc2luZyBHb29nbGUgUGxheSBMaWNlbnNpbmcgaXMgb3B0aW9uYWwgZXZlbiBpZiB5b3UgYXJlCityZWxlYXNpbmcgeW91ciBhcHAgdGhyb3VnaCBHb29nbGUgUGxheS48L3A+CiAKLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBTZXJ2aWNlIGFuZCBob3cgdG8gdXNlIGl0IGluIHlvdXIKLWFwcGxpY2F0aW9uLCBzZWUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+QXBwbGljYXRpb24KLUxpY2Vuc2luZzwvYT4uPC9wPgorPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgR29vZ2xlIFBsYXkgTGljZW5zaW5nIFNlcnZpY2UgYW5kIGhvdyB0byB1c2UgaXQgaW4geW91cgorYXBwbGljYXRpb24sIHNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+LjwvcD4KIAogPGgyIGlkPSJwdWJsaXNoaW5nLWJ1aWxkIj5CdWlsZGluZyBZb3VyIEFwcGxpY2F0aW9uIGZvciBSZWxlYXNlPC9oMj4KIApAQCAtMzUzLDcgKzM1Miw3IEBACiBkb25lIHRlc3RpbmcgYW5kIHlvdSBhcmUgc2F0aXNmaWVkIHRoYXQgdGhlIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uCiBiZWhhdmVzIGNvcnJlY3RseSwgeW91IGNhbiByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gdG8gdXNlcnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmdfb3ZlcnZpZXcuaHRtbCNwdWJsaXNoaW5nLXJlbGVhc2UiPlJlbGVhc2luZyBZb3VyCi1BcHBsaWNhdGlvbiB0byBVc2VyczwvYT4uIElmIHlvdSBhcmUgcHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LCBzZWUKLTxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+UHVibGlzaGluZyBvbiBBbmRyb2lkIE1hcmtldDwvYT4uPC9wPgorQXBwbGljYXRpb24gdG8gVXNlcnM8L2E+LiBJZiB5b3UgYXJlIHB1Ymxpc2hpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgc2VlCis8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwiPlB1Ymxpc2hpbmcgb24gR29vZ2xlIFBsYXk8L2E+LjwvcD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmpkIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5qZAppbmRleCAyN2E4N2Y5Li5iOTUxM2FiIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuamQKQEAgLTEsNCArMSw0IEBACi1wYWdlLnRpdGxlPVB1Ymxpc2hpbmcgb24gQW5kcm9pZCBNYXJrZXQKK3BhZ2UudGl0bGU9UHVibGlzaGluZyBvbiBHb29nbGUgUGxheQogQGpkOmJvZHkKIAogPGRpdiBpZD0icXYtd3JhcHBlciI+CkBAIC03LDI1ICs3LDI1IEBACiA8aDI+UXVpY2t2aWV3PC9oMj4KIAogPHVsPgotPGxpPkxlYXJuIGhvdyB0byBwdWJsaXNoIGFuZCB1cGRhdGUgYXBwcyBvbiBBbmRyb2lkIE1hcmtldC48L2xpPgotPGxpPkZpbmQgb3V0IGhvdyB0byBjcmVhdGUgbGlua3MgdG8gYXBwcyB0aGF0IGFyZSBwdWJsaXNoZWQgb24gQW5kcm9pZCBNYXJrZXQuPC9saT4KLTxsaT5MZWFybiBhYm91dCBBbmRyb2lkIE1hcmtldCBmZWF0dXJlcy48L2xpPgorPGxpPkxlYXJuIGhvdyB0byBwdWJsaXNoIGFuZCB1cGRhdGUgYXBwcyBvbiBHb29nbGUgUGxheS48L2xpPgorPGxpPkZpbmQgb3V0IGhvdyB0byBjcmVhdGUgbGlua3MgdG8gYXBwcyB0aGF0IGFyZSBwdWJsaXNoZWQgb24gR29vZ2xlIFBsYXkuPC9saT4KKzxsaT5MZWFybiBhYm91dCBHb29nbGUgUGxheSBmZWF0dXJlcy48L2xpPgogPC91bD4KIAogCiA8aDI+SW4gdGhpcyBkb2N1bWVudDwvaDI+CiAKIDxvbD4KLTxsaT48YSBocmVmPSIjb3ZlcnZpZXciPkFib3V0IEFuZHJvaWQgTWFya2V0PC9hPgotPGxpPjxBIGhyZWY9IiNtYXJrZXRwdWJsaXNoIj5QdWJsaXNoaW5nIEFwcHMgb24gQW5kcm9pZCBNYXJrZXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWFya2V0dXBncmFkZSI+UHVibGlzaGluZyBVcGRhdGVzIG9uIEFuZHJvaWQgTWFya2V0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iI21hcmtldExpY2Vuc2luZyI+VXNpbmcgQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIFNlcnZpY2U8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjbWFya2V0aW5hcHBiaWxsaW5nIj5Vc2luZyBBbmRyb2lkIE1hcmtldCBJbi1hcHAgQmlsbGluZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IiNtYXJrZXRpbnRlbnQiPkxpbmtpbmcgdG8gWW91ciBBcHBzIG9uIEFuZHJvaWQgTWFya2V0PC9hPgorPGxpPjxhIGhyZWY9IiNvdmVydmlldyI+QWJvdXQgR29vZ2xlIFBsYXk8L2E+Cis8bGk+PEEgaHJlZj0iI21hcmtldHB1Ymxpc2giPlB1Ymxpc2hpbmcgQXBwcyBvbiBHb29nbGUgUGxheTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNtYXJrZXR1cGdyYWRlIj5QdWJsaXNoaW5nIFVwZGF0ZXMgb24gR29vZ2xlIFBsYXk8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjbWFya2V0TGljZW5zaW5nIj5Vc2luZyBHb29nbGUgUGxheSBMaWNlbnNpbmcgU2VydmljZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNtYXJrZXRpbmFwcGJpbGxpbmciPlVzaW5nIEdvb2dsZSBQbGF5IEluLWFwcCBCaWxsaW5nPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI21hcmtldGludGVudCI+TGlua2luZyB0byBZb3VyIEFwcHMgb24gR29vZ2xlIFBsYXk8L2E+CiAgIDxvbD4KICAgICA8bGk+PGEgaHJlZj0iI09wZW5pbmdEZXRhaWxzIj5PcGVuaW5nIGFuIGFwcCdzIGRldGFpbHMgcGFnZTwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSIjUGVyZm9ybWluZ1NlYXJjaCI+UGVyZm9ybWluZyBhIHNlYXJjaDwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSIjQnVpbGRhQnV0dG9uIj5CdWlsZCBhbiBBbmRyb2lkIE1hcmtldCBidXR0b248L2E+PC9saT4KKyAgICA8bGk+PGEgaHJlZj0iI0J1aWxkYUJ1dHRvbiI+QnVpbGQgYSBHb29nbGUgUGxheSBidXR0b248L2E+PC9saT4KICAgICA8bGk+PGEgaHJlZj0iI1VyaVN1bW1hcnkiPlN1bW1hcnkgb2YgVVJJIGZvcm1hdHM8L2E+PC9saT4KICAgPC9vbD4KIDwvbGk+CkBAIC00MSw5ICs0MSw5IEBACiA8ZGl2IGlkPSJxdi1leHRyYSI+CiAgIDxpbWcgaWQ9InJ1bGUiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZyI+CiAgIDxkaXYgaWQ9InF2LXN1Yi1ydWxlIj4KLSAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjAgNXB4OyI+Ci0gICAgPGgyIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+QWxyZWFkeSBrbm93IGFib3V0IEFuZHJvaWQgTWFya2V0IGFuZCB3YW50IHRvIGdldCBzdGFydGVkPzwvaDI+Ci0gICAgPHA+R28gdG8gPGEgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj5BbmRyb2lkIE1hcmtldDwvYT4sIGNyZWF0ZSBhIGRldmVsb3BlcgorICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX3BsYXkucG5nIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjAgNXB4OyI+CisgICAgPGgyIHN0eWxlPSJjb2xvcjojNjY5OTk5OyI+QWxyZWFkeSBrbm93IGFib3V0IEdvb2dsZSBQbGF5IGFuZCB3YW50IHRvIGdldCBzdGFydGVkPzwvaDI+CisgICAgPHA+R28gdG8gPGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPkdvb2dsZSBQbGF5PC9hPiwgY3JlYXRlIGEgZGV2ZWxvcGVyCiBhY2NvdW50LCBhbmQgdXBsb2FkIHlvdXIgYXBwbGljYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHJlcXVpcmVkIGFzc2V0cywgbGlzdGluZyBkZXRhaWxzLAogYW5kIHB1Ymxpc2hpbmcgb3B0aW9ucywgc2VlIDxhCiBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3N1cHBvcnQvYmluL2Fuc3dlci5weT9hbnN3ZXI9MTEzNDY5Ij5VcGxvYWQKQEAgLTU1LDc4ICs1NSw3OCBAQAogPC9kaXY+CiAKIDxwPk9uZSBvZiB0aGUgbW9zdCBlZmZlY3RpdmUgd2F5cyB0byBnZXQgeW91ciBhcHBsaWNhdGlvbiBpbnRvIHVzZXJzJyBoYW5kcyBpcyB0bwotcHVibGlzaCBpdCBvbiBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSBsaWtlIEFuZHJvaWQgTWFya2V0LiBQdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0IGlzIGEKK3B1Ymxpc2ggaXQgb24gYW4gYXBwbGljYXRpb24gbWFya2V0cGxhY2UgbGlrZSBHb29nbGUgUGxheS4gUHVibGlzaGluZyBvbiBHb29nbGUgUGxheSBpcyBhCiBzdHJhaWdodGZvcndhcmQgcHJvY2VzcyB0aGF0IHlvdSBjYW4gZG8gaW4ganVzdCBhIGZldyBzaW1wbGUgc3RlcHMmbWRhc2g7cmVnaXN0ZXIsIGNvbmZpZ3VyZSwKIHVwbG9hZCwgYW5kIHB1Ymxpc2guIFJlZ2lzdHJhdGlvbiB0YWtlcyBvbmx5IGEgZmV3IG1pbnV0ZXMgYW5kIG5lZWRzIHRvIGJlIGRvbmUgb25seSBvbmNlLgotVGhlIGNvbmZpZ3VyYXRpb24gYW5kIHB1Ymxpc2hpbmcgc3RlcHMgY2FuIGFsbCBiZSBkb25lIHRocm91Z2ggdGhlIEFuZHJvaWQgTWFya2V0IERldmVsb3BlciBDb25zb2xlCi1hZnRlciB5b3UgcmVnaXN0ZXIgYXMgYW4gQW5kcm9pZCBNYXJrZXQgZGV2ZWxvcGVyLjwvcD4KK1RoZSBjb25maWd1cmF0aW9uIGFuZCBwdWJsaXNoaW5nIHN0ZXBzIGNhbiBhbGwgYmUgZG9uZSB0aHJvdWdoIHRoZSBHb29nbGUgUGxheSBBbmRyb2lkIERldmVsb3BlciBDb25zb2xlCithZnRlciB5b3UgcmVnaXN0ZXIgYXMgYSBHb29nbGUgUGxheSBkZXZlbG9wZXIuPC9wPgogCi08cD5UbyBzdGFydCBwdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0LCBmaXJzdCByZWFkIHRoaXMgdG9waWMgYW5kIHRoZW4gZ28gdG8gdGhlIDxhCi1ocmVmPSJodHRwczovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoL3NpZ251cCI+QW5kcm9pZCBNYXJrZXQgcHVibGlzaGVyIHNpdGU8L2E+IGFuZCByZWdpc3RlciBhcwotYW4gQW5kcm9pZCBNYXJrZXQgZGV2ZWxvcGVyLjwvcD4KKzxwPlRvIHN0YXJ0IHB1Ymxpc2hpbmcgb24gR29vZ2xlIFBsYXksIGZpcnN0IHJlYWQgdGhpcyB0b3BpYyBhbmQgdGhlbiBnbyB0byB0aGUgPGEKK2hyZWY9Imh0dHBzOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+R29vZ2xlIFBsYXkgQW5kcm9pZCBEZXZlbG9wZXIgQ29uc29sZTwvYT4gYW5kIHJlZ2lzdGVyIGFzCithIEdvb2dsZSBQbGF5IGRldmVsb3Blci48L3A+CiAKIAotPGgyIGlkPSJvdmVydmlldyI+QWJvdXQgQW5kcm9pZCBNYXJrZXQ8L2gyPgorPGgyIGlkPSJvdmVydmlldyI+QWJvdXQgR29vZ2xlIFBsYXk8L2gyPgogCi08cD5BbmRyb2lkIE1hcmtldCBpcyBhIHJvYnVzdCBwdWJsaXNoaW5nIHBsYXRmb3JtIHRoYXQgaGVscHMgeW91IHB1YmxpY2l6ZSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUKKzxwPkdvb2dsZSBQbGF5IGlzIGEgcm9idXN0IHB1Ymxpc2hpbmcgcGxhdGZvcm0gdGhhdCBoZWxwcyB5b3UgcHVibGljaXplLCBzZWxsLCBhbmQgZGlzdHJpYnV0ZQogeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9ucyB0byB1c2VycyBhcm91bmQgdGhlIHdvcmxkLiBXaGVuIHlvdSByZWxlYXNlIHlvdXIgYXBwbGljYXRpb25zIHRocm91Z2gKLUFuZHJvaWQgTWFya2V0IHlvdSBoYXZlIGFjY2VzcyB0byBhIHN1aXRlIG9mIGRldmVsb3BlciB0b29scyB0aGF0IGxldCB5b3UgYW5hbHl6ZSB5b3VyIHNhbGVzLAorR29vZ2xlIFBsYXkgeW91IGhhdmUgYWNjZXNzIHRvIGEgc3VpdGUgb2YgZGV2ZWxvcGVyIHRvb2xzIHRoYXQgbGV0IHlvdSBhbmFseXplIHlvdXIgc2FsZXMsCiBpZGVudGlmeSBtYXJrZXQgdHJlbmRzLCBhbmQgY29udHJvbCB3aG8geW91ciBhcHBsaWNhdGlvbnMgYXJlIGJlaW5nIGRpc3RyaWJ1dGVkIHRvLiBZb3UgYWxzbyBoYXZlCiBhY2Nlc3MgdG8gc2V2ZXJhbCByZXZlbnVlLWVuaGFuY2luZyBmZWF0dXJlcywgc3VjaCBhcyA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2luZGV4Lmh0bWwiPmluLWFwcCBiaWxsaW5nPC9hPiBhbmQKIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4Lmh0bWwiPmFwcGxpY2F0aW9uIGxpY2Vuc2luZzwvYT4uPC9wPgogCi08cD5CZWZvcmUgeW91IGNhbiBwdWJsaXNoIGFwcGxpY2F0aW9ucyBvbiBBbmRyb2lkIE1hcmtldCwgeW91IG5lZWQgdG8gPGEKLWhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+cmVnaXN0ZXI8L2E+IGFzIGFuIEFuZHJvaWQgTWFya2V0IGRldmVsb3Blci4gRHVyaW5nIHRoZQorPHA+QmVmb3JlIHlvdSBjYW4gcHVibGlzaCBhcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXksIHlvdSBuZWVkIHRvIDxhCitocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+cmVnaXN0ZXI8L2E+IGFzIGEgR29vZ2xlIFBsYXkgZGV2ZWxvcGVyLiBEdXJpbmcgdGhlCiByZWdpc3RyYXRpb24gcHJvY2VzcyB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIGRldmVsb3BlciBwcm9maWxlLCBwYXkgYSByZWdpc3RyYXRpb24gZmVlLCBhbmQgYWdyZWUKLXRvIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL3VzL2RldmVsb3Blci1kaXN0cmlidXRpb24tYWdyZWVtZW50Lmh0bWwiPkFuZHJvaWQgTWFya2V0Ci1EZXZlbG9wZXIgRGlzdHJpYnV0aW9uIEFncmVlbWVudDwvYT4uIEFmdGVyIHlvdSByZWdpc3RlciB5b3UgY2FuIGFjY2VzcyB0aGUgQW5kcm9pZCBNYXJrZXQgRGV2ZWxvcGVyCit0byB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS91cy9kZXZlbG9wZXItZGlzdHJpYnV0aW9uLWFncmVlbWVudC5odG1sIj5Hb29nbGUgUGxheQorRGV2ZWxvcGVyIERpc3RyaWJ1dGlvbiBBZ3JlZW1lbnQ8L2E+LiBBZnRlciB5b3UgcmVnaXN0ZXIgeW91IGNhbiBhY2Nlc3MgdGhlIERldmVsb3BlcgogQ29uc29sZSwgd2hlcmUgeW91IGNhbiB1cGxvYWQgYXBwbGljYXRpb25zLCBjb25maWd1cmUgcHVibGlzaGluZyBvcHRpb25zLCBhbmQgbW9uaXRvciBwdWJsaXNoaW5nCiBkYXRhLiBJZiB5b3Ugd2FudCB0byBzZWxsIHlvdXIgYXBwbGljYXRpb25zIG9yIHVzZSB0aGUgaW4tYXBwIGJpbGxpbmcgZmVhdHVyZSwgeW91IHdpbGwgYWxzbyBuZWVkCiB0byBzZXQgdXAgYSBHb29nbGUgQ2hlY2tvdXQgbWVyY2hhbnQgYWNjb3VudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLAogc2VlIDxhIGhyZWY9Imh0dHBzOi8vc3VwcG9ydC5nb29nbGUuY29tL2FuZHJvaWRtYXJrZXQvZGV2ZWxvcGVyL2Jpbi9hbnN3ZXIucHk/aGw9ZW4mYW5zd2VyPTExMzQ2OCI+CiBEZXZlbG9wZXIgUmVnaXN0cmF0aW9uPC9hPi48L3A+CiAKLTxoMiBpZD0ibWFya2V0cHVibGlzaCI+UHVibGlzaGluZyBBcHBzIG9uIEFuZHJvaWQgTWFya2V0PC9oMj4KKzxoMiBpZD0ibWFya2V0cHVibGlzaCI+UHVibGlzaGluZyBBcHBzIG9uIEdvb2dsZSBQbGF5PC9oMj4KIAotPHA+UHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0IGlzIGEgc2ltcGxlIHByb2Nlc3MgdGhhdCBpbnZvbHZlcyB0aHJlZSBiYXNpYworPHA+UHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5IGlzIGEgc2ltcGxlIHByb2Nlc3MgdGhhdCBpbnZvbHZlcyB0aHJlZSBiYXNpYwogdGFza3MgKHNlZSBmaWd1cmUgMSk6PC9wPgogCiA8dWw+CiAgIDxsaT5DcmVhdGluZyB2YXJpb3VzIGdyYXBoaWNhbCBhc3NldHMgdGhhdAotYWNjb21wYW55IHlvdXIgYXBwIG9uIEFuZHJvaWQgTWFya2V0LjwvbGk+Ci0gIDxsaT5Vc2luZyB0aGUgQW5kcm9pZCBNYXJrZXQgPGEKLWhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+RGV2ZWxvcGVyIENvbnNvbGU8L2E+IHRvIGNvbmZpZ3VyZSBwdWJsaXNoaW5nIG9wdGlvbnMsCi1zcGVjaWZ5IGxpc3RpbmcgZGV0YWlscywgYW5kIHVwbG9hZCB5b3VyIGFwcCBhbmQgZ3JhcGhpY2FsIGFzc2V0cyB0byBBbmRyb2lkIE1hcmtldC48L2xpPgorYWNjb21wYW55IHlvdXIgYXBwIG9uIEdvb2dsZSBQbGF5LjwvbGk+CisgIDxsaT5Vc2luZyB0aGUgR29vZ2xlIFBsYXkgPGEKK2hyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj5EZXZlbG9wZXIgQ29uc29sZTwvYT4gdG8gY29uZmlndXJlIHB1Ymxpc2hpbmcgb3B0aW9ucywKK3NwZWNpZnkgbGlzdGluZyBkZXRhaWxzLCBhbmQgdXBsb2FkIHlvdXIgYXBwIGFuZCBncmFwaGljYWwgYXNzZXRzIHRvIEdvb2dsZSBQbGF5LjwvbGk+CiAgIDxsaT5SZXZpZXdpbmcgeW91ciBwdWJsaXNoaW5nIHNldHRpbmdzIGFuZCBjaGFuZ2luZyB0aGUgcmVsZWFzZQogc3RhdHVzIG9mIHlvdXIgYXBwIGZyb20gVW5wdWJsaXNoZWQgdG8gUHVibGlzaGVkLjwvbGk+CiA8L3VsPgogCiA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9wdWJsaXNoaW5nL3B1Ymxpc2hpbmdfYW5kcm9pZF9tYXJrZXQucG5nIgotICAgICBhbHQ9IlNob3dzIHRoZSB0aHJlZSBzdGVwcyB0aGF0IGFyZSByZXF1aXJlZCB0byBwdWJsaXNoIG9uIEFuZHJvaWQgTWFya2V0IgorICAgICBhbHQ9IlNob3dzIHRoZSB0aHJlZSBzdGVwcyB0aGF0IGFyZSByZXF1aXJlZCB0byBwdWJsaXNoIG9uIEdvb2dsZSBQbGF5IgogICAgICBoZWlnaHQ9IjE2OCIKICAgICAgaWQ9ImZpZ3VyZTEiIC8+CiA8cCBjbGFzcz0iaW1nLWNhcHRpb24iPgotICA8c3Ryb25nPkZpZ3VyZSAxLjwvc3Ryb25nPiBUbyBwdWJsaXNoIGFwcHMgb24gQW5kcm9pZCBNYXJrZXQgeW91IG11c3QgZmlyc3QgPGEKKyAgPHN0cm9uZz5GaWd1cmUgMS48L3N0cm9uZz4gVG8gcHVibGlzaCBhcHBzIG9uIEdvb2dsZSBQbGF5IHlvdSBtdXN0IGZpcnN0IDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+cHJlcGFyZSB5b3VyIGFwcCBmb3IgcmVsZWFzZTwvYT4gYW5kIHRoZW4gcGVyZm9ybQogdGhyZWUgc2ltcGxlIHRhc2tzLgogPC9wPgogCiA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5JbXBvcnRhbnQ6PC9zdHJvbmc+IFlvdSBtdXN0IDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+cHJlcGFyZSB5b3VyIGFwcGxpY2F0aW9uIGZvciByZWxlYXNlPC9hPiBiZWZvcmUgeW91Ci1jYW4gcHVibGlzaCBpdCBvbiBBbmRyb2lkIE1hcmtldC4gV2hlbiB5b3UgcHJlcGFyZSB5b3VyIGFwcGxpY2F0aW9uIGZvciByZWxlYXNlIHlvdSBjb25maWd1cmUgaXQgZm9yCitjYW4gcHVibGlzaCBpdCBvbiBHb29nbGUgUGxheS4gV2hlbiB5b3UgcHJlcGFyZSB5b3VyIGFwcGxpY2F0aW9uIGZvciByZWxlYXNlIHlvdSBjb25maWd1cmUgaXQgZm9yCiByZWxlYXNlIGFuZCBidWlsZCBpdCBpbiByZWxlYXNlIG1vZGUuIEJ1aWxkaW5nIGluIHJlbGVhc2UgbW9kZSBzaWducyB5b3VyIGFwcGxpY2F0aW9uJ3Mge0Bjb2RlIC5hcGt9Ci1maWxlIHdpdGggeW91ciBwcml2YXRlIHJlbGVhc2Uga2V5LiBZb3UgY2Fubm90IHB1Ymxpc2ggYW4gYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQgdW5sZXNzIGl0IGlzCitmaWxlIHdpdGggeW91ciBwcml2YXRlIHJlbGVhc2Uga2V5LiBZb3UgY2Fubm90IHB1Ymxpc2ggYW4gYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkgdW5sZXNzIGl0IGlzCiBzaWduZWQgd2l0aCB5b3VyIG93biBwcml2YXRlIHJlbGVhc2Uga2V5LjwvcD4KIAogPGgzPlByZXBhcmluZyBwcm9tb3Rpb25hbCBtYXRlcmlhbHM8L2gzPgogCi08cD5UbyBmdWxseSBsZXZlcmFnZSB0aGUgbWFya2V0aW5nIGFuZCBwdWJsaWNpdHkgY2FwYWJpbGl0aWVzIG9mIEFuZHJvaWQgTWFya2V0LCB5b3UgbmVlZCB0byBjcmVhdGUKLXNldmVyYWwgZ3JhcGhpY2FsIGFzc2V0cyB0aGF0IGFjY29tcGFueSB5b3VyIGFwcCBvbiBBbmRyb2lkIE1hcmtldCwgc3VjaCBhcyBzY3JlZW5zaG90cywgdmlkZW9zLAorPHA+VG8gZnVsbHkgbGV2ZXJhZ2UgdGhlIG1hcmtldGluZyBhbmQgcHVibGljaXR5IGNhcGFiaWxpdGllcyBvZiBHb29nbGUgUGxheSwgeW91IG5lZWQgdG8gY3JlYXRlCitzZXZlcmFsIGdyYXBoaWNhbCBhc3NldHMgdGhhdCBhY2NvbXBhbnkgeW91ciBhcHAgb24gR29vZ2xlIFBsYXksIHN1Y2ggYXMgc2NyZWVuc2hvdHMsIHZpZGVvcywKIHByb21vdGlvbmFsIGdyYXBoaWNzLCBhbmQgcHJvbW90aW9uYWwgdGV4dC4gQXQgYSBtaW5pbXVtIHlvdSBtdXN0IHByb3ZpZGUgdHdvIHNjcmVlbnNob3RzIG9mIHlvdXIKIGFwcGxpY2F0aW9uIGFuZCBhIGhpZ2ggcmVzb2x1dGlvbiBhcHBsaWNhdGlvbiBpY29uLiBUaGUgc2NyZWVuc2hvdHMgYXJlIGRpc3BsYXllZCBvbiB0aGUgZGV0YWlscwotcGFnZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBpbiBBbmRyb2lkIE1hcmtldCwgYW5kIHRoZSBoaWdoIHJlc29sdXRpb24gYXBwbGljYXRpb24gaWNvbiBpcyBkaXNwbGF5ZWQKLWluIHZhcmlvdXMgbG9jYXRpb25zIHRocm91Z2hvdXQgQW5kcm9pZCBNYXJrZXQuIFRoZSBoaWdoIHJlc29sdXRpb24gaWNvbiBkb2VzIG5vdCByZXBsYWNlIHRoZQorcGFnZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgYW5kIHRoZSBoaWdoIHJlc29sdXRpb24gYXBwbGljYXRpb24gaWNvbiBpcyBkaXNwbGF5ZWQKK2luIHZhcmlvdXMgbG9jYXRpb25zIHRocm91Z2hvdXQgR29vZ2xlIFBsYXkuIFRoZSBoaWdoIHJlc29sdXRpb24gaWNvbiBkb2VzIG5vdCByZXBsYWNlIHRoZQogbGF1bmNoZXIgaWNvbiBmb3IgeW91ciBhcHBsaWNhdGlvbiwgcmF0aGVyLCBpdCBzZXJ2ZXMgYXMgYSBzdXBwbGVtZW50YWwgaWNvbiBhbmQgc2hvdWxkIGxvb2sKIHRoZSBzYW1lIGFzIHlvdXIgbGF1bmNoZXIgaWNvbi4gUHJvbW90aW9uYWwgdmlkZW8sCiBncmFwaGljcywgYW5kIHRleHQgYXJlIG9wdGlvbmFsLCBhbHRob3VnaCB3ZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBwcmVwYXJlIHRoZXNlIGZvciB5b3VyCkBAIC0xMzYsOCArMTM2LDggQEAKIAogPGgzPkNvbmZpZ3VyaW5nIG9wdGlvbnMgYW5kIHVwbG9hZGluZyBhc3NldHM8L2gzPgogCi08cD5BbmRyb2lkIE1hcmtldCBsZXRzIHlvdSB0YXJnZXQgeW91ciBhcHBsaWNhdGlvbiB0byBhIHdvcmxkd2lkZSBwb29sIG9mIHVzZXJzIGFuZCBkZXZpY2VzLiBUbwotcmVhY2ggdGhlc2UgdXNlcnMgeW91IGNhbiB1c2UgdGhlIEFuZHJvaWQgTWFya2V0IERldmVsb3BlciBDb25zb2xlIHRvIGNvbmZpZ3VyZSB2YXJpb3VzIHB1Ymxpc2hpbmcKKzxwPkdvb2dsZSBQbGF5IGxldHMgeW91IHRhcmdldCB5b3VyIGFwcGxpY2F0aW9uIHRvIGEgd29ybGR3aWRlIHBvb2wgb2YgdXNlcnMgYW5kIGRldmljZXMuIFRvCityZWFjaCB0aGVzZSB1c2VycyB5b3UgY2FuIHVzZSB0aGUgRGV2ZWxvcGVyIENvbnNvbGUgdG8gY29uZmlndXJlIHZhcmlvdXMgcHVibGlzaGluZwogb3B0aW9ucyBhbmQgbGlzdGluZyBkZXRhaWxzIGZvciB5b3VyIGFwcC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY2hvb3NlIHRoZSA8YQogaHJlZj0iaHR0cDovL3N1cHBvcnQuZ29vZ2xlLmNvbS9hbmRyb2lkbWFya2V0L2RldmVsb3Blci9iaW4vYW5zd2VyLnB5P2hsPWVuJmFuc3dlcj0xMzgyOTQmdG9waWM9CiAyMzY1NjI0JmN0eD10b3BpYyI+Y291bnRyaWVzPC9hPiB5b3Ugd2FudCB0byByZWFjaCwgdGhlIGxpc3RpbmcgbGFuZ3VhZ2VzIHlvdSB3YW50IHRvIHVzZSwgYW5kIHRoZQpAQCAtMTU1LDExICsxNTUsMTEgQEAKIGFwcC48L3A+CiAKIDxwPldoZW4geW91IGFyZSBmaW5pc2hlZCBzZXR0aW5nIHB1Ymxpc2hpbmcgb3B0aW9ucyBhbmQgbGlzdGluZyBkZXRhaWxzLCB5b3UgY2FuIHVwbG9hZCB5b3VyIGFzc2V0cwotYW5kIHlvdXIgYXBwbGljYXRpb24gdG8gQW5kcm9pZCBNYXJrZXQuIFlvdSBjYW4gYWxzbyB1cGxvYWQgeW91ciBhcHBsaWNhdGlvbiBhcyBhIGRyYWZ0CithbmQgeW91ciBhcHBsaWNhdGlvbiB0byBHb29nbGUgUGxheS4gWW91IGNhbiBhbHNvIHVwbG9hZCB5b3VyIGFwcGxpY2F0aW9uIGFzIGEgZHJhZnQKICh1bnB1Ymxpc2hlZCkgYXBwbGljYXRpb24sIHdoaWNoIGxldHMgeW91IGRvIGZpbmFsIHRlc3RpbmcgYmVmb3JlIHlvdSBwdWJsaXNoIGl0IGZvciBmaW5hbAogcmVsZWFzZS48L3A+CiAKLTxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgQW5kcm9pZCBNYXJrZXQgcHVibGlzaGluZyBzZXR0aW5ncywgc2VlIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzOjwvcD4KKzxwPlRvIGxlYXJuIG1vcmUgYWJvdXQgR29vZ2xlIFBsYXkgcHVibGlzaGluZyBzZXR0aW5ncywgc2VlIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2VzOjwvcD4KIAogPHVsPgogICA8bGk+PGEKQEAgLTE4MSwyMCArMTgxLDIwIEBACiA8cD5XaGVuIHlvdSBhcmUgc2F0aXNmaWVkIHRoYXQgeW91ciBwdWJsaXNoaW5nIHNldHRpbmdzIGFyZSBjb3JyZWN0bHkgY29uZmlndXJlZCBhbmQgeW91ciB1cGxvYWRlZAogYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gYmUgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYywgeW91IGNhbiBzaW1wbHkgY2xpY2sgPHN0cm9uZz5QdWJsaXNoPC9zdHJvbmc+IGluCiB0aGUgRGV2ZWxvcGVyIENvbnNvbGUgdG8gbWFrZSB5b3VyIGFwcCBhdmFpbGFibGUgZm9yIGRvd25sb2FkCi1hcm91bmQgdGhlIHdvcmxkLiBLZWVwIGluIG1pbmQsIGl0IGNhbiB0YWtlIHNldmVyYWwgaG91cnMgZm9yIHlvdXIgYXBwIHRvIGFwcGVhciBvbiBBbmRyb2lkCi1NYXJrZXQgYWZ0ZXIgeW91IGNsaWNrIDxzdHJvbmc+UHVibGlzaDwvc3Ryb25nPiBpbiB0aGUgRGV2ZWxvcGVyIENvbnNvbGUuPC9wPgorYXJvdW5kIHRoZSB3b3JsZC4gS2VlcCBpbiBtaW5kLCBpdCBjYW4gdGFrZSBzZXZlcmFsIGhvdXJzIGZvciB5b3VyIGFwcCB0byBhcHBlYXIgb24gR29vZ2xlCitQbGF5IGFmdGVyIHlvdSBjbGljayA8c3Ryb25nPlB1Ymxpc2g8L3N0cm9uZz4gaW4gdGhlIERldmVsb3BlciBDb25zb2xlLjwvcD4KIAogPGgzPkNvbnRyb2xsaW5nIERpc3RyaWJ1dGlvbiB0byBEZXZpY2VzPC9oMz4KIAogPHA+SWYgeW91ciBhcHBsaWNhdGlvbiB0YXJnZXRzIGRpZmZlcmVudCBkZXZpY2UgY29uZmlndXJhdGlvbnMsIHlvdSBjYW4gY29udHJvbCB3aGljaCBBbmRyb2lkLXBvd2VyZWQKLWRldmljZXMgaGF2ZSBhY2Nlc3MgdG8geW91ciBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldCBieQotdXNpbmcgQW5kcm9pZCBNYXJrZXQgZmlsdGVycy4gRmlsdGVyaW5nIGNvbXBhcmVzIGRldmljZSBjb25maWd1cmF0aW9ucyB0aGF0IHlvdSBkZWNsYXJlIGluIHlvdXIKK2RldmljZXMgaGF2ZSBhY2Nlc3MgdG8geW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSBieQordXNpbmcgR29vZ2xlIFBsYXkgZmlsdGVycy4gRmlsdGVyaW5nIGNvbXBhcmVzIGRldmljZSBjb25maWd1cmF0aW9ucyB0aGF0IHlvdSBkZWNsYXJlIGluIHlvdXIKIGFwcCdzIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBieSBhIGRldmljZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBkZWNsYXJlIHRoZSBjYW1lcmEKLWZpbHRlciBpbiB5b3VyIG1hbmlmZXN0LCBvbmx5IHRob3NlIGRldmljZXMgdGhhdCBoYXZlIGEgY2FtZXJhIHdpbGwgc2VlIHlvdXIgYXBwIG9uIEFuZHJvaWQKLU1hcmtldC4gRmlsdGVycyBtdXN0IGJlIGNvbmZpZ3VyZWQgaW4geW91ciBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUgd2hlbiB5b3UgYXJlIDxhCitmaWx0ZXIgaW4geW91ciBtYW5pZmVzdCwgb25seSB0aG9zZSBkZXZpY2VzIHRoYXQgaGF2ZSBhIGNhbWVyYSB3aWxsIHNlZSB5b3VyIGFwcCBvbiBHb29nbGUKK1BsYXkuIEZpbHRlcnMgbXVzdCBiZSBjb25maWd1cmVkIGluIHlvdXIgYXBwbGljYXRpb24ncyBtYW5pZmVzdCBmaWxlIHdoZW4geW91IGFyZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHJlcGFyaW5nLmh0bWwiPnByZXBhcmluZyB5b3VyIGFwcCBmb3IgcmVsZWFzZTwvYT4gKHRoYXQgaXMsIGJlZm9yZQoteW91IHVwbG9hZCB5b3VyIGFwcCB0byBBbmRyb2lkIE1hcmtldCkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT4uPC9wPgoreW91IHVwbG9hZCB5b3VyIGFwcCB0byBHb29nbGUgUGxheSkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPi48L3A+CiAKIDxwPllvdSBjYW4gYWxzbyB1c2UgdGhlIG11bHRpcGxlIEFQSyBmZWF0dXJlIHRvIGRpc3RyaWJ1dGUgZGlmZmVyZW50IHtAY29kZSAuYXBrfSBmaWxlcyB1bmRlciB0aGUgc2FtZQogYXBwbGljYXRpb24gbGlzdGluZyBhbmQgdGhlIHNhbWUgcGFja2FnZSBuYW1lOyBob3dldmVyLCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG9wdGlvbiBvbmx5IGFzIGEgbGFzdApAQCAtMjA1LDE3ICsyMDUsMTcgQEAKIHJlc291cmNlcyBtYWtlIHRoZSBBUEsgZmlsZSB0b28gYmlnIChncmVhdGVyIHRoYW4gNTBNQikgb3Igb3RoZXIgdGVjaG5pY2FsIGNoYWxsZW5nZXMgcHJldmVudCBhCiBzaW5nbGUgQVBLIGZyb20gd29ya2luZyBvbiBhbGwgZGV2aWNlcy4gQWx0aG91Z2ggd2UgZW5jb3VyYWdlIHlvdSB0byBkZXZlbG9wIGFuZCBwdWJsaXNoIGEgc2luZ2xlCiBBUEsgdGhhdCBzdXBwb3J0cyBhcyBtYW55IGRldmljZSBjb25maWd1cmF0aW9ucyBhcyBwb3NzaWJsZSwgZG9pbmcgc28gaXMgc29tZXRpbWVzCi1ub3QgcG9zc2libGUuIFRvIGhlbHAgeW91IHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiBmb3IgYXMgbWFueSBkZXZpY2VzIGFzIHBvc3NpYmxlLCBBbmRyb2lkIE1hcmtldAotYWxsb3dzIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MgdW5kZXIgdGhlIHNhbWUgYXBwbGljYXRpb24gbGlzdGluZy4gQW5kcm9pZCBNYXJrZXQgdGhlbiBzdXBwbGllcworbm90IHBvc3NpYmxlLiBUbyBoZWxwIHlvdSBwdWJsaXNoIHlvdXIgYXBwbGljYXRpb24gZm9yIGFzIG1hbnkgZGV2aWNlcyBhcyBwb3NzaWJsZSwgR29vZ2xlIFBsYXkKK2FsbG93cyB5b3UgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzIHVuZGVyIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGxpc3RpbmcuIEdvb2dsZSBQbGF5IHRoZW4gc3VwcGxpZXMKIGVhY2ggQVBLIHRvIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCB5b3UndmUgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0CiBmaWxlIG9mIGVhY2ggQVBLLiBUbyB1c2UgdGhpcyBmZWF0dXJlLCB5b3UgbmVlZCB0byBidWlsZCB5b3VyIHNlcGFyYXRlIHtAY29kZSAuYXBrfSBmaWxlcyB3aGVuIHlvdSBhcmUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3ByZXBhcmluZy5odG1sIj5wcmVwYXJpbmcgeW91ciBhcHAgZm9yIHJlbGVhc2U8L2E+ICh0aGF0IGlzLCBiZWZvcmUKLXlvdSB1cGxvYWQgeW91ciBhcHAgdG8gQW5kcm9pZCBNYXJrZXQpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhCit5b3UgdXBsb2FkIHlvdXIgYXBwIHRvIEdvb2dsZSBQbGF5KS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9wdWJsaXNoaW5nL211bHRpcGxlLWFwa3MuaHRtbCI+TXVsdGlwbGUgQVBLIFN1cHBvcnQ8L2E+LjwvcD4KIAotPGgyIGlkPSJtYXJrZXR1cGdyYWRlIj5QdWJsaXNoaW5nIFVwZGF0ZXMgb24gQW5kcm9pZCBNYXJrZXQ8L2gyPgorPGgyIGlkPSJtYXJrZXR1cGdyYWRlIj5QdWJsaXNoaW5nIFVwZGF0ZXMgb24gR29vZ2xlIFBsYXk8L2gyPgogCi08cD5BdCBhbnkgdGltZSBhZnRlciBwdWJsaXNoaW5nIGFuIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LCB5b3UgY2FuIHVwbG9hZAorPHA+QXQgYW55IHRpbWUgYWZ0ZXIgcHVibGlzaGluZyBhbiBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgeW91IGNhbiB1cGxvYWQKIGFuZCBwdWJsaXNoIGFuIHVwZGF0ZSB0byB0aGUgc2FtZSBhcHBsaWNhdGlvbiBwYWNrYWdlLiBXaGVuIHlvdSBwdWJsaXNoIGFuCiB1cGRhdGUgdG8gYW4gYXBwbGljYXRpb24sIHVzZXJzIHdobyBoYXZlIGFscmVhZHkgaW5zdGFsbGVkIHRoZQogYXBwbGljYXRpb24gbWF5IHJlY2VpdmUgYSBub3RpZmljYXRpb24gdGhhdCBhbiB1cGRhdGUgaXMKQEAgLTIyOCw0OSArMjI4LDQ5IEBACiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT48L2E+CiBlbGVtZW50IG9mIHRoZSBtYW5pZmVzdCBmaWxlLiBBbHNvLCB0aGUgcGFja2FnZSBuYW1lIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIHZlcnNpb24gYW5kCiB0aGUge0Bjb2RlIC5hcGt9IGZpbGUgbXVzdCBiZSBzaWduZWQgd2l0aCB0aGUgc2FtZSBwcml2YXRlIGtleS4gSWYgdGhlIHBhY2thZ2UgbmFtZSBhbmQgc2lnbmluZwotY2VydGlmaWNhdGUgZG8gPGVtPm5vdDwvZW0+IG1hdGNoIHRob3NlIG9mIHRoZSBleGlzdGluZyB2ZXJzaW9uLCBNYXJrZXQgd2lsbAorY2VydGlmaWNhdGUgZG8gPGVtPm5vdDwvZW0+IG1hdGNoIHRob3NlIG9mIHRoZSBleGlzdGluZyB2ZXJzaW9uLCBHb29nbGUgUGxheSB3aWxsCiBjb25zaWRlciBpdCBhIG5ldyBhcHBsaWNhdGlvbiwgcHVibGlzaCBpdCBhcyBzdWNoLCBhbmQgd2lsbCBub3Qgb2ZmZXIgaXQgdG8gZXhpc3RpbmcgdXNlcnMgYXMgYW4KIHVwZGF0ZS48L3A+CiAKLTxwPklmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiBvbiBBbmRyb2lkIE1hcmtldCwgeW91IG11c3QgbWFrZSBzdXJlCi0gIHRoYXQgaXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBsaXN0ZWQgYmVsb3csIHdoaWNoIGFyZSBlbmZvcmNlZCBieSB0aGUgTWFya2V0Ci0gIHNlcnZlciB3aGVuIHlvdSB1cGxvYWQgdGhlIGFwcGxpY2F0aW9uLjwvcD4KKzxwPklmIHlvdSBwbGFuIHRvIHB1Ymxpc2ggeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSwgeW91IG11c3QgbWFrZSBzdXJlCisgIHRoYXQgaXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cyBsaXN0ZWQgYmVsb3csIHdoaWNoIGFyZSBlbmZvcmNlZCBieSBHb29nbGUgUGxheQorICB3aGVuIHlvdSB1cGxvYWQgdGhlIGFwcGxpY2F0aW9uLjwvcD4KIAotPGgyIGlkPSJtYXJrZXRMaWNlbnNpbmciPlVzaW5nIEFuZHJvaWQgTWFya2V0IExpY2Vuc2luZyBTZXJ2aWNlPC9oMj4KKzxoMiBpZD0ibWFya2V0TGljZW5zaW5nIj5Vc2luZyBHb29nbGUgUGxheSBMaWNlbnNpbmcgU2VydmljZTwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0IG9mZmVycyBhIGxpY2Vuc2luZyBzZXJ2aWNlIHRoYXQgbGV0cyB5b3UgZW5mb3JjZSBsaWNlbnNpbmcKLXBvbGljaWVzIGZvciBwYWlkIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQuIFdpdGgKLUFuZHJvaWQgTWFya2V0IExpY2Vuc2luZywgeW91ciBhcHBsaWNhdGlvbnMgY2FuIHF1ZXJ5IEFuZHJvaWQgTWFya2V0IGF0IHJ1bnRpbWUKKzxwPkdvb2dsZSBQbGF5IG9mZmVycyBhIGxpY2Vuc2luZyBzZXJ2aWNlIHRoYXQgbGV0cyB5b3UgZW5mb3JjZSBsaWNlbnNpbmcKK3BvbGljaWVzIGZvciBwYWlkIGFwcGxpY2F0aW9ucyB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggR29vZ2xlIFBsYXkuIFdpdGgKK0dvb2dsZSBQbGF5IExpY2Vuc2luZywgeW91ciBhcHBsaWNhdGlvbnMgY2FuIHF1ZXJ5IEdvb2dsZSBQbGF5IGF0IHJ1bnRpbWUKIHRvIG9idGFpbiB0aGUgbGljZW5zaW5nIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlciwgdGhlbiBhbGxvdyBvciBkaXNhbGxvdwogZnVydGhlciB1c2Ugb2YgdGhlIGFwcGxpY2F0aW9uIGFzIGFwcHJvcHJpYXRlLiBVc2luZyB0aGUgc2VydmljZSwgeW91IGNhbiBhcHBseSBhIGZsZXhpYmxlCiBsaWNlbnNpbmcgcG9saWN5IG9uIGFuIGFwcGxpY2F0aW9uLWJ5LWFwcGxpY2F0aW9uIGJhc2lzJm1kYXNoO2VhY2gKIGFwcGxpY2F0aW9uIGNhbiBlbmZvcmNlIGl0cyBsaWNlbnNpbmcgc3RhdHVzIGluIHRoZSB3YXkgbW9zdCBhcHByb3ByaWF0ZQogZm9yIGl0LiA8L3A+CiAKLTxwPkFueSBhcHBsaWNhdGlvbiB0aGF0IHlvdSBwdWJsaXNoIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQgY2FuIHVzZSB0aGUgQW5kcm9pZAotTWFya2V0IExpY2Vuc2luZyBTZXJ2aWNlLiBUaGUgc2VydmljZSB1c2VzIG5vIGRlZGljYXRlZCBmcmFtZXdvcmsgQVBJcywgc28geW91IGNhbgorPHA+QW55IGFwcGxpY2F0aW9uIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBHb29nbGUgUGxheSBjYW4gdXNlIHRoZSBHb29nbGUKK1BsYXkgTGljZW5zaW5nIFNlcnZpY2UuIFRoZSBzZXJ2aWNlIHVzZXMgbm8gZGVkaWNhdGVkIGZyYW1ld29yayBBUElzLCBzbyB5b3UgY2FuCiBhZGQgbGljZW5zaW5nIHRvIGFueSBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgYSBtaW5pbXVtIEFQSSBMZXZlbCBvZiAzIG9yCiBoaWdoZXIuPC9wPgogCi08cD5Gb3IgY29tcGxldGUgaW5mb3JtYXRpb24gYWJvdXQgQW5kcm9pZCBNYXJrZXQgTGljZW5zaW5nIFNlcnZpY2UgYW5kIGhvdyB0bworPHA+Rm9yIGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0IEdvb2dsZSBQbGF5IExpY2Vuc2luZyBTZXJ2aWNlIGFuZCBob3cgdG8KIHVzZSBpdCBpbiB5b3VyIGFwcGxpY2F0aW9uLCByZWFkIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2xpY2Vuc2luZy9pbmRleC5odG1sIj5BcHBsaWNhdGlvbiBMaWNlbnNpbmc8L2E+LjwvcD4KIAotPGgyIGlkPSJtYXJrZXRpbmFwcGJpbGxpbmciPlVzaW5nIEFuZHJvaWQgTWFya2V0IEluLWFwcCBCaWxsaW5nPC9oMj4KKzxoMiBpZD0ibWFya2V0aW5hcHBiaWxsaW5nIj5Vc2luZyBHb29nbGUgUGxheSBJbi1hcHAgQmlsbGluZzwvaDI+CiAKLTxwPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9iaWxsaW5nX292ZXJ2aWV3Lmh0bWwiPkFuZHJvaWQgTWFya2V0IEluLWFwcCBCaWxsaW5nPC9hPgotaXMgYW4gQW5kcm9pZCBNYXJrZXQgc2VydmljZSB0aGF0IGxldHMgeW91IHNlbGwgZGlnaXRhbCBjb250ZW50IGluIHlvdXIgYXBwbGljYXRpb25zLiBZb3UgY2FuIHVzZQorPHA+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9iaWxsaW5nL2JpbGxpbmdfb3ZlcnZpZXcuaHRtbCI+R29vZ2xlIFBsYXkgSW4tYXBwIEJpbGxpbmc8L2E+CitpcyBhIEdvb2dsZSBQbGF5IHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBzZWxsIGRpZ2l0YWwgY29udGVudCBpbiB5b3VyIGFwcGxpY2F0aW9ucy4gWW91IGNhbiB1c2UKIHRoZSBzZXJ2aWNlIHRvIHNlbGwgYSB3aWRlIHJhbmdlIG9mIGNvbnRlbnQsIGluY2x1ZGluZyBkb3dubG9hZGFibGUgIGNvbnRlbnQgc3VjaCBhcyBtZWRpYSBmaWxlcyBvcgogcGhvdG9zLCBhbmQgdmlydHVhbCBjb250ZW50IHN1Y2ggYXMgZ2FtZSBsZXZlbHMgb3IgcG90aW9ucy48L3A+CiAKLTxwPldoZW4geW91IHVzZSBBbmRyb2lkIE1hcmtldCdzIGluLWFwcCBiaWxsaW5nIHNlcnZpY2UgdG8gc2VsbCBhbiBpdGVtLCBBbmRyb2lkIE1hcmtldCBoYW5kbGVzIGFsbAorPHA+V2hlbiB5b3UgdXNlIEdvb2dsZSBQbGF5J3MgaW4tYXBwIGJpbGxpbmcgc2VydmljZSB0byBzZWxsIGFuIGl0ZW0sIEdvb2dsZSBQbGF5IGhhbmRsZXMgYWxsCiBiaWxsaW5nIGRldGFpbHMgc28geW91ciBhcHBsaWNhdGlvbiBuZXZlciBoYXMgdG8gZGlyZWN0bHkgcHJvY2VzcyBhbnkgZmluYW5jaWFsIHRyYW5zYWN0aW9ucy4KLUFuZHJvaWQgTWFya2V0IHVzZXMgdGhlIHNhbWUgY2hlY2tvdXQgc2VydmljZSB0aGF0IGlzIHVzZWQgZm9yIGFwcGxpY2F0aW9uIHB1cmNoYXNlcywgc28geW91ciB1c2VycworR29vZ2xlIFBsYXkgdXNlcyB0aGUgc2FtZSBjaGVja291dCBzZXJ2aWNlIHRoYXQgaXMgdXNlZCBmb3IgYXBwbGljYXRpb24gcHVyY2hhc2VzLCBzbyB5b3VyIHVzZXJzCiBleHBlcmllbmNlIGEgY29uc2lzdGVudCBhbmQgZmFtaWxpYXIgcHVyY2hhc2UgZmxvdyAoc2VlIGZpZ3VyZSAxKS4gQWxzbywgdGhlIHRyYW5zYWN0aW9uIGZlZSBmb3IKIGluLWFwcCBwdXJjaGFzZXMgaXMgdGhlIHNhbWUgYXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBmb3IgYXBwbGljYXRpb24gcHVyY2hhc2VzICgzMCUpLjwvcD4KIAotPHA+QW55IGFwcGxpY2F0aW9uIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBBbmRyb2lkIE1hcmtldCBjYW4gaW1wbGVtZW50IGluLWFwcCBiaWxsaW5nLiBObyBzcGVjaWFsCi1hY2NvdW50IG9yIHJlZ2lzdHJhdGlvbiBpcyByZXF1aXJlZCBvdGhlciB0aGFuIGFuIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBhY2NvdW50IGFuZCBhIEdvb2dsZQorPHA+QW55IGFwcGxpY2F0aW9uIHRoYXQgeW91IHB1Ymxpc2ggdGhyb3VnaCBHb29nbGUgUGxheSBjYW4gaW1wbGVtZW50IGluLWFwcCBiaWxsaW5nLiBObyBzcGVjaWFsCithY2NvdW50IG9yIHJlZ2lzdHJhdGlvbiBpcyByZXF1aXJlZCBvdGhlciB0aGFuIGEgR29vZ2xlIFBsYXkgcHVibGlzaGVyIGFjY291bnQgYW5kIGEgR29vZ2xlCiBDaGVja291dCBNZXJjaGFudCBhY2NvdW50LiBBbHNvLCBiZWNhdXNlIHRoZSBzZXJ2aWNlIHVzZXMgbm8gZGVkaWNhdGVkIGZyYW1ld29yayBBUElzLCB5b3UgY2FuIGFkZAogaW4tYXBwIGJpbGxpbmcgdG8gYW55IGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBhIG1pbmltdW0gQVBJIGxldmVsIG9mIDQgb3IgaGlnaGVyLjwvcD4KIApAQCAtMjgyLDU4ICsyODIsNTkgQEAKIGltcGxlbWVudCBpbi1hcHAgYmlsbGluZy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluLWFwcCBiaWxsaW5nIGZlYXR1cmUsIHNlZSB0aGUKIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvYmlsbGluZy9pbmRleC5odG1sIj5Jbi1hcHAgQmlsbGluZyBkb2N1bWVudGF0aW9uPC9hPi48L3A+CiAKLTxoMiBpZD0ibWFya2V0aW50ZW50Ij5MaW5raW5nIHRvIFlvdXIgQXBwcyBvbiBBbmRyb2lkIE1hcmtldDwvaDI+Cis8aDIgaWQ9Im1hcmtldGludGVudCI+TGlua2luZyB0byBZb3VyIEFwcHMgb24gR29vZ2xlIFBsYXk8L2gyPgogCi08cD5UbyBoZWxwIHVzZXJzIGRpc2NvdmVyIHlvdXIgcHVibGlzaGVkIGFwcGxpY2F0aW9ucywgeW91IGNhbiB1c2UgdHdvIHNwZWNpYWwgQW5kcm9pZCBNYXJrZXQgVVJJcworPHA+VG8gaGVscCB1c2VycyBkaXNjb3ZlciB5b3VyIHB1Ymxpc2hlZCBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gdXNlIHR3byBzcGVjaWFsIEdvb2dsZSBQbGF5IFVSSXMKIHRoYXQgZGlyZWN0IHVzZXJzIHRvIHlvdXIgYXBwbGljYXRpb24ncyBkZXRhaWxzIHBhZ2Ugb3IgcGVyZm9ybSBhIHNlYXJjaCBmb3IgYWxsIG9mIHlvdXIgcHVibGlzaGVkCi1hcHBsaWNhdGlvbnMgaW4gQW5kcm9pZCBNYXJrZXQuIFlvdSBjYW4gdXNlIHRoZXNlIFVSSXMgdG8gY3JlYXRlIGEgYnV0dG9uIGluIHlvdXIgYXBwbGljYXRpb24gb3IgYQorYXBwbGljYXRpb25zIG9uIEdvb2dsZSBQbGF5LiBZb3UgY2FuIHVzZSB0aGVzZSBVUklzIHRvIGNyZWF0ZSBhIGJ1dHRvbiBpbiB5b3VyIGFwcGxpY2F0aW9uIG9yIGEKIGxpbmsgb24gYSB3ZWIgcGFnZSB0aGF0OjwvcD4KIAogPHVsPgotICA8bGk+T3BlbnMgeW91ciBhcHBsaWNhdGlvbidzIGRldGFpbHMgcGFnZSBpbiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gb3Igd2ViIHNpdGUuPC9saT4KLSAgPGxpPlNlYXJjaGVzIGZvciBhbGwgeW91ciBwdWJsaXNoZWQgYXBwbGljYXRpb25zIGluIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBvciB3ZWIKKyAgPGxpPk9wZW5zIHlvdXIgYXBwbGljYXRpb24ncyBkZXRhaWxzIHBhZ2UgaW4gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIG9yIHdlYiBzaXRlLjwvbGk+CisgIDxsaT5TZWFyY2hlcyBmb3IgYWxsIHlvdXIgcHVibGlzaGVkIGFwcGxpY2F0aW9ucyBpbiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb3Igd2ViCiBzaXRlLjwvbGk+CiA8L3VsPgogCi08cD5Zb3UgY2FuIGxhdW5jaCB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gb3Igd2ViIHNpdGUgaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KKzxwPllvdSBjYW4gbGF1bmNoIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBvciB3ZWIgc2l0ZSBpbiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPgogPHVsPgogICA8bGk+SW5pdGlhdGUgYW4ge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnR9IGZyb20geW91ciBhcHBsaWNhdGlvbiB0aGF0IGxhdW5jaGVzIHRoZQotQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gb24gdGhlIHVzZXIncyBkZXZpY2UuPC9saT4KLSAgPGxpPlByb3ZpZGUgYSBsaW5rIG9uIGEgd2ViIHBhZ2UgdGhhdCBvcGVucyB0aGUgQW5kcm9pZCBNYXJrZXQgd2ViIHNpdGUgKGJ1dCB3aWxsIGFsc28KLW9wZW4gdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIGlmIGNsaWNrZWQgZnJvbSBhIGRldmljZSkuPC9saT4KK0dvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIG9uIHRoZSB1c2VyJ3MgZGV2aWNlLjwvbGk+CisgIDxsaT5Qcm92aWRlIGEgbGluayBvbiBhIHdlYiBwYWdlIHRoYXQgb3BlbnMgdGhlIEdvb2dsZSBQbGF5IHdlYiBzaXRlIChidXQgd2lsbCBhbHNvCitvcGVuIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBpZiBjbGlja2VkIGZyb20gYSBkZXZpY2UpLjwvbGk+CiA8L3VsPgogCiA8cD5JbiBib3RoIGNhc2VzLCB3aGV0aGVyIHlvdSB3YW50IHRvIGluaXRpYXRlIHRoZSBhY3Rpb24gZnJvbSB5b3VyIGFwcGxpY2F0aW9uIG9yIGZyb20gYSB3ZWIKIHBhZ2UsIHRoZSBVUklzIGFyZSBxdWl0ZSBzaW1pbGFyLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSBVUkkgcHJlZml4LjwvcD4KIAotPHA+VG8gb3BlbiB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gZnJvbSB5b3VyIGFwcGxpY2F0aW9uLCB0aGUgcHJlZml4IGZvciB0aGUgaW50ZW50J3MgZGF0YQorPHA+VG8gb3BlbiB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gZnJvbSB5b3VyIGFwcGxpY2F0aW9uLCB0aGUgcHJlZml4IGZvciB0aGUgaW50ZW50J3MgZGF0YQogVVJJIGlzOjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+PGNvZGU+bWFya2V0Oi8vPC9jb2RlPjwvcD4KIAotPHA+VG8gb3BlbiBBbmRyb2lkIE1hcmtldCBmcm9tIHlvdXIgd2ViIHNpdGUsIHRoZSBwcmVmaXggZm9yIHRoZSBsaW5rIFVSSSBpczo8L3A+Cis8cD5UbyBvcGVuIEdvb2dsZSBQbGF5IHN0b3JlIGZyb20geW91ciB3ZWIgc2l0ZSwgdGhlIHByZWZpeCBmb3IgdGhlIGxpbmsgVVJJIGlzOjwvcD4KIAotPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+PGNvZGU+aHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS88L2NvZGU+PC9wPgorPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+PGNvZGU+aHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS88L2NvZGU+PC9wPgogCiA8cD5UaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIGhvdyB0byBjcmVhdGUgYSBjb21wbGV0ZSBVUkkgZm9yIGVhY2ggYWN0aW9uLjwvcD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IGNyZWF0ZSBhIGxpbmsgdG8gb3BlbiBBbmRyb2lkIE1hcmtldCBmcm9tIHlvdXIgd2ViCi1zaXRlIGFuZCB0aGUgdXNlciBzZWxlY3RzIGl0IGZyb20gYW4gQW5kcm9pZC1wb3dlcmVkIGRldmljZSwgdGhlIGRldmljZSdzIE1hcmtldCBhcHBsaWNhdGlvbiB3aWxsCi1yZXNvbHZlIHRoZSBsaW5rIHNvIHRoZSB1c2VyIGNhbiB1c2UgdGhlIE1hcmtldCBhcHBsaWNhdGlvbiBpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIHdlYgotc2l0ZS4gQXMgc3VjaCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHtAY29kZSBodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL30gVVJJcyB3aGVuIGNyZWF0aW5nIGEgbGluayBvbgorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgeW91IGNyZWF0ZSBhIGxpbmsgdG8gb3BlbiBHb29nbGUgUGxheSBmcm9tIHlvdXIgd2ViCitzaXRlIGFuZCB0aGUgdXNlciBzZWxlY3RzIGl0IGZyb20gYW4gQW5kcm9pZC1wb3dlcmVkIGRldmljZSwgdGhlIGRldmljZSdzIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIHdpbGwKK3Jlc29sdmUgdGhlIGxpbmsgc28gdGhlIHVzZXIgY2FuIHVzZSB0aGUgR29vZ2xlIFBsYXkgYXBwbGljYXRpb24gb24gdGhlIGRldmljZSBpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIHdlYgorc2l0ZS4gQXMgc3VjaCwgeW91IHNob3VsZCBhbHdheXMgdXNlIHtAY29kZSBodHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvLi4ufSBVUklzIHdoZW4KK2NyZWF0aW5nIGEgbGluayBvbgogYSB3ZWIgcGFnZS4gV2hlbiBwb2ludGluZyB0byB5b3VyIGFwcHMgZnJvbSB3aXRoaW4geW91ciBBbmRyb2lkIGFwcCwgdXNlIHRoZQote0Bjb2RlIG1hcmtldDovL30gVVJJcyBpbiBhbiBpbnRlbnQsIHNvIHRoYXQgdGhlIE1hcmtldCBhcHBsaWNhdGlvbiBhbHdheXMgb3BlbnMuPC9wPgore0Bjb2RlIG1hcmtldDovL30gVVJJcyBpbiBhbiBpbnRlbnQsIHNvIHRoYXQgdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIGFsd2F5cyBvcGVucy48L3A+CiAKIAogPGgzIGlkPSJPcGVuaW5nRGV0YWlscyI+T3BlbmluZyBhbiBhcHAncyBkZXRhaWxzIHBhZ2U8L2gzPgogCiA8cD5BcyBkZXNjcmliZWQgYWJvdmUsIHlvdSBjYW4gb3BlbiB0aGUgZGV0YWlscyBwYWdlIGZvciBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIGVpdGhlciBvbiB0aGUKLUFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIG9yIHRoZSBBbmRyb2lkIE1hcmtldCB3ZWIgc2l0ZS4gVGhlIGRldGFpbHMgcGFnZSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlCitHb29nbGUgUGxheSBhcHBsaWNhdGlvbiBvciB0aGUgR29vZ2xlIFBsYXkgd2ViIHNpdGUuIFRoZSBkZXRhaWxzIHBhZ2UgYWxsb3dzIHRoZSB1c2VyIHRvIHNlZQogdGhlIGFwcGxpY2F0aW9uIGRlc2NyaXB0aW9uLCBzY3JlZW5zaG90cywgcmV2aWV3cyBhbmQgbW9yZSwgYW5kIGNob29zZSB0byBpbnN0YWxsIGl0LjwvcD4KIAogPHA+VGhlIGZvcm1hdCBmb3IgdGhlIFVSSSB0aGF0IG9wZW5zIHRoZSBkZXRhaWxzIHBhZ2UgaXM6PC9wPgogCi08cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48Y29kZT4mbHQ7VVJJX3ByZWZpeCZndDs8Yj5kZXRhaWxzP2lkPTwvYj4mbHQ7cGFja2FnZV9uYW1lJmd0OzwvY29kZT48L3A+Cis8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj48Y29kZT4mbHQ7VVJJX3ByZWZpeCZndDs8Yj5hcHBzL2RldGFpbHM/aWQ9PC9iPiZsdDtwYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPjwvcD4KIAogPHA+VGhlIDxjb2RlPiZsdDtwYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPiBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgdGFyZ2V0IGFwcGxpY2F0aW9uJ3MKIGZ1bGx5LXF1YWxpZmllZCBwYWNrYWdlIG5hbWUsIGFzIGRlY2xhcmVkIGluIHRoZSA8YQpAQCAtMzQxLDI2ICszNDIsMjggQEAKIHBhY2thZ2V9PC9hPiBhdHRyaWJ1dGUgb2YgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDttYW5pZmVzdCZndDt9PC9hPiBlbGVtZW50LjwvcD4KIAorPHA+Rm9yIGV4YW1wbGU6IDxjb2RlPmh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPWNvbS5leGFtcGxlLm15YXBwPC9jb2RlPjwvcD4KKwogCiA8aDQ+T3BlbmluZyB0aGUgYXBwIGRldGFpbHMgcGFnZSBmcm9tIHlvdXIgQW5kcm9pZCBhcHA8L2g0PgogCi08cD5UbyBvcGVuIHRoZSBBbmRyb2lkIE1hcmtldCBkZXRhaWxzIHBhZ2UgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLAorPHA+VG8gb3BlbiB0aGUgR29vZ2xlIFBsYXkgZGV0YWlscyBwYWdlIGZyb20geW91ciBhcHBsaWNhdGlvbiwKIGNyZWF0ZSBhbiBpbnRlbnQgd2l0aCB0aGUge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjQUNUSU9OX1ZJRVd9IGFjdGlvbiBhbmQgaW5jbHVkZSBhIGRhdGEgVVJJCiBpbiB0aGlzIGZvcm1hdDo8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tbGVmdDoyZW0iPjxjb2RlPm1hcmtldDovL2RldGFpbHM/aWQ9Jmx0O3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+PC9wPgogCiA8cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGhvdyB5b3UgY2FuIGNyZWF0ZSBhbiBpbnRlbnQgYW5kIG9wZW4gYW4gYXBwbGljYXRpb24ncyBkZXRhaWxzIHBhZ2UgaW4KLUFuZHJvaWQgTWFya2V0OjwvcD4KK0dvb2dsZSBQbGF5OjwvcD4KIAogPHByZT4KIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVyk7Ci1pbnRlbnQuc2V0RGF0YShVcmkucGFyc2UoIm1hcmtldDovL2RldGFpbHM/aWQ9Y29tLmFuZHJvaWQuZXhhbXBsZSIpKTsKK2ludGVudC5zZXREYXRhKFVyaS5wYXJzZSgibWFya2V0Oi8vZGV0YWlscz9pZD1jb20uZXhhbXBsZS5hbmRyb2lkIikpOwogc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogPC9wcmU+CiAKLTxwPlRoaXMgd2lsbCBvcGVuIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlIHRvIHZpZXcgdGhlIHtAY29kZQotY29tLmFuZHJvaWQuZXhhbXBsZX0gYXBwbGljYXRpb24uPC9wPgorPHA+VGhpcyB3aWxsIG9wZW4gdGhlIEdvb2dsZSBQbGF5IGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2UgdG8gdmlldyB0aGUge0Bjb2RlCitjb20uZXhhbXBsZS5hbmRyb2lkfSBhcHBsaWNhdGlvbi48L3A+CiAKIAogPGg0Pk9wZW5pbmcgdGhlIGFwcCBkZXRhaWxzIHBhZ2UgZnJvbSBhIHdlYiBzaXRlPC9oND4KQEAgLTM2OSwzMiArMzcyLDMyIEBACiBmb3JtYXQ6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj4KLSAgPGNvZGU+aHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9kZXRhaWxzP2lkPSZsdDtwYWNrYWdlX25hbWUmZ3Q7PC9jb2RlPgorICA8Y29kZT5odHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL2FwcHMvZGV0YWlscz9pZD0mbHQ7cGFja2FnZV9uYW1lJmd0OzwvY29kZT4KIDwvcD4KIAotPHA+Rm9yIGV4YW1wbGUsIGhlcmUncyBhIGxpbmsgdGhhdCBvcGVucyBhbiBhcHBsaWNhdGlvbidzIGRldGFpbHMgcGFnZSBvbiBBbmRyb2lkIE1hcmtldDo8L3A+Cis8cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGEgbGluayB0aGF0IG9wZW5zIGFuIGFwcGxpY2F0aW9uJ3MgZGV0YWlscyBwYWdlIG9uIEdvb2dsZSBQbGF5OjwvcD4KIAogPHByZT4KLSZsdDthIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vZGV0YWlscz9pZD1jb20uYW5kcm9pZC5leGFtcGxlIj5BcHAgTGluayZsdDsvYT4KKyZsdDthIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPWNvbS5leGFtcGxlLmFuZHJvaWQiPkFwcCBMaW5rJmx0Oy9hPgogPC9wcmU+CiAKLTxwPldoZW4gY2xpY2tlZCBmcm9tIGEgZGVza3RvcCB3ZWIgYnJvd3NlciwgdGhpcyBvcGVucyB0aGUgQW5kcm9pZCBNYXJrZXQgd2ViIHNpdGUgdG8gdmlldyB0aGUKLXtAY29kZSBjb20uYW5kcm9pZC5leGFtcGxlfSBhcHBsaWNhdGlvbi4gV2hlbiBjbGlja2VkIGZyb20gYW4gQW5kcm9pZC1wb3dlcmVkIGRldmljZSwgdXNlcnMgYXJlCi1naXZlbiB0aGUgb3B0aW9uIHRvIHVzZSBlaXRoZXIgdGhlaXIgd2ViIGJyb3dzZXIgb3IgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHRvIHZpZXcgdGhlCis8cD5XaGVuIGNsaWNrZWQgZnJvbSBhIGRlc2t0b3Agd2ViIGJyb3dzZXIsIHRoaXMgb3BlbnMgdGhlIEdvb2dsZSBQbGF5IHdlYiBzaXRlIHRvIHZpZXcgdGhlCit7QGNvZGUgY29tLmV4YW1wbGUuYW5kcm9pZH0gYXBwbGljYXRpb24uIFdoZW4gY2xpY2tlZCBmcm9tIGFuIEFuZHJvaWQtcG93ZXJlZCBkZXZpY2UsIHVzZXJzIGFyZQorZ2l2ZW4gdGhlIG9wdGlvbiB0byB1c2UgZWl0aGVyIHRoZWlyIHdlYiBicm93c2VyIG9yIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiB0byB2aWV3IHRoZQogYXBwbGljYXRpb24uPC9wPgogCiAKIAogPGgzIGlkPSJQZXJmb3JtaW5nU2VhcmNoIj5QZXJmb3JtaW5nIGEgc2VhcmNoPC9oMz4KIAotPHA+VG8gaW5pdGlhdGUgYSBzZWFyY2ggaW4gQW5kcm9pZCBNYXJrZXQsIHRoZSBmb3JtYXQgZm9yIHRoZSBVUkkgaXM6PC9wPgorPHA+VG8gaW5pdGlhdGUgYSBzZWFyY2ggb24gR29vZ2xlIFBsYXksIHRoZSBmb3JtYXQgZm9yIHRoZSBVUkkgaXM6PC9wPgogCiA8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6MmVtIj4KICAgPGNvZGU+Jmx0O1VSSV9wcmVmaXgmZ3Q7PGI+c2VhcmNoP3E9PC9iPiZsdDtxdWVyeSZndDs8L2NvZGU+CiA8L3A+CiAKLTxwPlRoZSA8Y29kZT4mbHQ7cXVlcnkmZ3Q7PC9jb2RlPiBpcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgc2VhcmNoIHF1ZXJ5IHRvIGV4ZWN1dGUgaW4gQW5kcm9pZAotTWFya2V0LiBUaGUgcXVlcnkgY2FuIGJlIGEgcmF3IHRleHQgc3RyaW5nIG9yIHlvdSBjYW4gaW5jbHVkZSBhIHBhcmFtZXRlciB0aGF0IHBlcmZvcm1zIGEgc2VhcmNoCis8cD5UaGUgPGNvZGU+Jmx0O3F1ZXJ5Jmd0OzwvY29kZT4gaXMgYSBwbGFjZWhvbGRlciBmb3IgdGhlIHNlYXJjaCBxdWVyeSB0byBleGVjdXRlIGluIEdvb2dsZQorUGxheS4gVGhlIHF1ZXJ5IGNhbiBiZSBhIHJhdyB0ZXh0IHN0cmluZyBvciB5b3UgY2FuIGluY2x1ZGUgYSBwYXJhbWV0ZXIgdGhhdCBwZXJmb3JtcyBhIHNlYXJjaAogYmFzZWQgb24gdGhlIHB1Ymxpc2hlciBuYW1lOjwvcD4KIAogPHVsPgpAQCAtNDEwLDE0ICs0MTMsMTQgQEAKIAogPGg0PlNlYXJjaGluZyBmcm9tIHlvdXIgQW5kcm9pZCBhcHA8L2g0PgogCi08cD5UbyBpbml0aWF0ZSBhIHNlYXJjaCBvbiBBbmRyb2lkIE1hcmtldCBmcm9tIHlvdXIgYXBwbGljYXRpb24sIGNyZWF0ZSBhbiBpbnRlbnQgd2l0aCB0aGUKKzxwPlRvIGluaXRpYXRlIGEgc2VhcmNoIG9uIEdvb2dsZSBQbGF5IGZyb20geW91ciBhcHBsaWNhdGlvbiwgY3JlYXRlIGFuIGludGVudCB3aXRoIHRoZQoge0BsaW5rIGFuZHJvaWQuY29udGVudC5JbnRlbnQjQUNUSU9OX1ZJRVd9IGFjdGlvbiBhbmQgaW5jbHVkZSBhIGRhdGEgVVJJIGluIHRoaXMgZm9ybWF0OjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+PGNvZGU+bWFya2V0Oi8vc2VhcmNoP3E9Jmx0O3F1ZXJ5Jmd0OzwvY29kZT48L3A+CiAKIDxwPlRoZSBxdWVyeSBtYXkgaW5jbHVkZSB0aGUge0Bjb2RlIHB1Yjp9IHBhcmFtZXRlciBkZXNjcmliZWQgYWJvdmUuPC9wPgogCi08cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGhvdyB5b3UgY2FuIGluaXRpYXRlIGEgc2VhcmNoIGluIHRoZSBBbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbiwgYmFzZWQgb24gdGhlCis8cD5Gb3IgZXhhbXBsZSwgaGVyZSdzIGhvdyB5b3UgY2FuIGluaXRpYXRlIGEgc2VhcmNoIGluIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiwgYmFzZWQgb24gdGhlCiBwdWJsaXNoZXIgbmFtZTo8L3A+CiAKIDxwcmU+CkBAIC00MjYsNDYgKzQyOSw0NiBAQAogc3RhcnRBY3Rpdml0eShpbnRlbnQpOwogPC9wcmU+CiAKLTxwPlRoaXMgb3BlbnMgdGhlIEFuZHJvaWQgTWFya2V0IGFwcGxpY2F0aW9uIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC4gVGhlIHNlYXJjaCByZXN1bHQgc2hvd3MgYWxsCis8cD5UaGlzIG9wZW5zIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIHRoZSBzZWFyY2guIFRoZSBzZWFyY2ggcmVzdWx0IHNob3dzIGFsbAogYXBwbGljYXRpb25zIHB1Ymxpc2hlZCBieSB0aGUgcHVibGlzaGVyIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBkZXZpY2UuPC9wPgogCiAKIDxoND5TZWFyY2hpbmcgZnJvbSBhIHdlYiBzaXRlPC9oND4KIAotPHA+VG8gaW5pdGlhdGUgYSBzZWFyY2ggb24gQW5kcm9pZCBNYXJrZXQgZnJvbSB5b3VyIHdlYiBzaXRlLCBjcmVhdGUgYSBsaW5rIHdpdGggYSBVUkkgaW4gdGhpcworPHA+VG8gaW5pdGlhdGUgYSBzZWFyY2ggb24gR29vZ2xlIFBsYXkgZnJvbSB5b3VyIHdlYiBzaXRlLCBjcmVhdGUgYSBsaW5rIHdpdGggYSBVUkkgaW4gdGhpcwogZm9ybWF0OjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi1sZWZ0OjJlbSI+Ci0gIDxjb2RlPmh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc2VhcmNoP3E9Jmx0O3F1ZXJ5Jmd0OzwvY29kZT4KKyAgPGNvZGU+aHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9zZWFyY2g/cT0mbHQ7cXVlcnkmZ3Q7PC9jb2RlPgogPC9wPgogCiA8cD5UaGUgcXVlcnkgbWF5IGluY2x1ZGUgdGhlIHtAY29kZSBwdWI6fSBwYXJhbWV0ZXIgZGVzY3JpYmVkIGFib3ZlLjwvcD4KIAotPHA+Rm9yIGV4YW1wbGUsIGhlcmUncyBhIGxpbmsgdGhhdCBpbml0aWF0ZXMgYSBzZWFyY2ggb24gQW5kcm9pZCBNYXJrZXQsIGJhc2VkIG9uIHRoZQorPHA+Rm9yIGV4YW1wbGUsIGhlcmUncyBhIGxpbmsgdGhhdCBpbml0aWF0ZXMgYSBzZWFyY2ggb24gR29vZ2xlIFBsYXksIGJhc2VkIG9uIHRoZQogcHVibGlzaGVyIG5hbWU6PC9wPgogCiA8cHJlPgotJmx0O2EgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9zZWFyY2g/cT1wdWI6WW91ciBQdWJsaXNoZXIgTmFtZSI+U2VhcmNoIExpbmsmbHQ7L2E+CismbHQ7YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL3NlYXJjaD9xPXB1YjpZb3VyIFB1Ymxpc2hlciBOYW1lIj5TZWFyY2ggTGluayZsdDsvYT4KIDwvcHJlPgogCi08cD5XaGVuIGNsaWNrZWQgZnJvbSBhIGRlc2t0b3Agd2ViIGJyb3dzZXIsIHRoaXMgb3BlbnMgdGhlIEFuZHJvaWQgTWFya2V0IHdlYiBzaXRlIGFuZCBwZXJmb3JtcyB0aGUKKzxwPldoZW4gY2xpY2tlZCBmcm9tIGEgZGVza3RvcCB3ZWIgYnJvd3NlciwgdGhpcyBvcGVucyB0aGUgR29vZ2xlIFBsYXkgd2ViIHNpdGUgYW5kIHBlcmZvcm1zIHRoZQogc2VhcmNoLiBXaGVuIGNsaWNrZWQgZnJvbSBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB1c2VycyBhcmUgZ2l2ZW4gdGhlIG9wdGlvbiB0byB1c2UgZWl0aGVyIHRoZWlyCi13ZWIgYnJvd3NlciBvciB0aGUgQW5kcm9pZCBNYXJrZXQgYXBwbGljYXRpb24gdG8gcGVyZm9ybSB0aGUgc2VhcmNoLjwvcD4KK3dlYiBicm93c2VyIG9yIHRoZSBHb29nbGUgUGxheSBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIHRoZSBzZWFyY2guPC9wPgogCiAKIAotPGgzIGlkPSJCdWlsZGFCdXR0b24iPkJ1aWxkIGFuIEFuZHJvaWQgTWFya2V0IGJ1dHRvbjwvaDM+Cis8aDMgaWQ9IkJ1aWxkYUJ1dHRvbiI+QnVpbGQgYSBHb29nbGUgUGxheSBidXR0b248L2gzPgogCi08cD5Vc2UgdGhlIGZvbGxvd2luZyBmb3JtIHRvIGdlbmVyYXRlIGFuICJBdmFpbGFibGUgaW4gQW5kcm9pZCBNYXJrZXQiIGJ1dHRvbiB0aGF0IHlvdSBjYW4gdXNlIG9uCi15b3VyIHdlYiBzaXRlLiBJbnB1dCBlaXRoZXIgeW91ciBhcHBsaWNhdGlvbidzIHBhY2thZ2UgbmFtZSBvciBwdWJsaXNoZXIgbmFtZSBhbmQgdGhlIGJ1dHRvbiB3aWxsCi10YWtlIHVzZXJzIHRvIEFuZHJvaWQgTWFya2V0IHRvIGVpdGhlciB2aWV3IHlvdXIgYXBwbGljYXRpb24ncyBpbmZvcm1hdGlvbiBvciB2aWV3IGEgbGlzdCBvZgoteW91ciBwdWJsaXNoZWQgYXBwcy4gSWYgdXNlcnMgY2xpY2sgdGhlIGJ1dHRvbiB3aGlsZSBvbiBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB0aGUgQW5kcm9pZAotTWFya2V0IGFwcGxpY2F0aW9uIHdpbGwgcmVzcG9uZCB0byBzaG93IHVzZXJzIHlvdXIgYXBwbGljYXRpb24ocykuPC9wPgorPHA+VXNlIHRoZSBmb2xsb3dpbmcgZm9ybSB0byBjcmVhdGUgYSBidXR0b24gZm9yIHlvdXIgd2ViIHNpdGUgdGhhdCB0YWtlcyB1c2VycyB0byB5b3VyIGFwcGxpY2F0aW9uCitvbiBHb29nbGUgUGxheS4gSW5wdXQgZWl0aGVyIHlvdXIgYXBwbGljYXRpb24ncyBwYWNrYWdlIG5hbWUgb3IgeW91ciBwdWJsaXNoZXIgbmFtZSBhbmQgdGhlIGJ1dHRvbgord2lsbCB0YWtlIHVzZXJzIHRvIEdvb2dsZSBQbGF5IHRvIGVpdGhlciB2aWV3IHlvdXIgYXBwbGljYXRpb24ncyBpbmZvcm1hdGlvbiBvciB2aWV3IGEgbGlzdCBvZiB5b3VyCitwdWJsaXNoZWQgYXBwcy4gSWYgdXNlcnMgY2xpY2sgdGhlIGJ1dHRvbiB3aGlsZSBvbiBhbiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB0aGUgR29vZ2xlIFBsYXkKK2FwcGxpY2F0aW9uIHdpbGwgcmVzcG9uZCB0byBzaG93IHVzZXJzIHlvdXIgYXBwbGljYXRpb24ocykuPC9wPgogCi08cD5UaGlzIGZvcm0gb2ZmZXJzIGZvdXIgdmVyc2lvbnMgb2YgdGhlIG9mZmljaWFsICJBdmFpbGFibGUgaW4gQW5kcm9pZCBNYXJrZXQiIGJ1dHRvbiBhdAotcmVjb21tZW5kZWQgc2l6ZXMuIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGRpZmZlcmVudCBzaXplLCB5b3UgY2FuIGRvd25sb2FkIGFuIEVQUyBmaWxlIGZvcgotdGhlIGJ1dHRvbiBpbWFnZXMgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9icmFuZGluZy5odG1sIj5BbmRyb2lkIEJyYW5kCi1HdWlkZWxpbmVzPC9hPi48L3A+Cis8cD5UaGlzIGZvcm0gb2ZmZXJzIHR3byBzdHlsZXMgb2YgdGhlIG9mZmljaWFsIGJyYW5kIGJhZGdlIGVhY2ggYXQgcmVjb21tZW5kZWQgc2l6ZXMuIFlvdSBjYW4gcGljaworYmV0d2VlbiBlaXRoZXIgIkdldCBpdCBvbiBHb29nbGUgUGxheSIgb3IgIkFuZHJvaWQgYXBwIG9uIEdvb2dsZSBQbGF5LiIgWW91IHNob3VsZCBub3QgbW9kaWZ5IHRoZQorYmFkZ2UgaW1hZ2VzIGluIGFueSB3YXkuIEZvciBtb3JlIHVzYWdlIGd1aWRlbGluZXMsCitzZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vYnJhbmRpbmcuaHRtbCI+QW5kcm9pZCBCcmFuZCBHdWlkZWxpbmVzPC9hPi48L3A+CiAKIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAKQEAgLTUwNywzMyArNTEwLDQ0IEBACiAKIC8vIHZhcmlhYmxlcyBmb3IgY3JlYXRpbmcgJ3RyeSBpdCBvdXQnIGRlbW8gYnV0dG9uCiB2YXIgaW1hZ2VQYXRoID0gImh0dHA6Ly93d3cuYW5kcm9pZC5jb20vaW1hZ2VzL2JyYW5kLyIKLXZhciBsaW5rU3RhcnQgPSAiPGEgaHJlZj1cImh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vIjsKK3ZhciBsaW5rU3RhcnQgPSAiPGEgaHJlZj1cImh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvIjsKIHZhciBpbWFnZVN0YXJ0ID0gIlwiPlxuIgotICAgICAgICArICIgIDxpbWcgc3JjPVwiIiArIGltYWdlUGF0aDsKLXZhciBpbWFnZUVuZCA9ICIucG5nXCJcbiIKLSAgICAgICAgKyAiICAgICAgIGFsdD1cIkF2YWlsYWJsZSBpbiBBbmRyb2lkIE1hcmtldFwiIC8+XG48L2E+IjsKKyAgICAgICAgKyAiICA8aW1nIGFsdD1cIiI7CisgIC8vIGxlYXZlcyBvcGVuaW5nIGZvciB0aGUgYWx0IHRleHQgdmFsdWUKK3ZhciBpbWFnZVNyYyA9ICJcIlxuICAgICAgIHNyYz1cIiIgKyBpbWFnZVBhdGg7CisgIC8vIGxlYXZlcyBvcGVuaW5nIGZvciB0aGUgaW1hZ2UgZmlsZSBuYW1lCit2YXIgaW1hZ2VFbmQgPSAiLnBuZ1wiIC8+XG48L2E+IjsKIAogLy8gdmFyaWFibGVzIGZvciBjcmVhdGluZyBjb2RlIHNuaXBwZXQKLXZhciBsaW5rU3RhcnRDb2RlID0gIiZsdDthIGhyZWY9XCJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tLyI7Cit2YXIgbGlua1N0YXJ0Q29kZSA9ICImbHQ7YSBocmVmPVwiaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS8iOwogdmFyIGltYWdlU3RhcnRDb2RlID0gIlwiJmd0O1xuIgotICAgICAgICArICIgICZsdDtpbWcgc3JjPVwiIiArIGltYWdlUGF0aDsKLXZhciBpbWFnZUVuZENvZGUgPSAiLnBuZ1wiXG4iCi0gICAgICAgICsgIiAgICAgICBhbHQ9XCJBdmFpbGFibGUgaW4gQW5kcm9pZCBNYXJrZXRcIiAvPlxuJmx0Oy9hPiI7CisgICAgICAgICsgIiAgJmx0O2ltZyBhbHQ9XCIiOworICAvLyBsZWF2ZXMgb3BlbmluZyBmb3IgdGhlIGFsdCB0ZXh0IHZhbHVlCit2YXIgaW1hZ2VTcmNDb2RlID0gIlwiXG4gICAgICAgc3JjPVwiIiArIGltYWdlUGF0aDsKKyAgLy8gbGVhdmVzIG9wZW5pbmcgZm9yIHRoZSBpbWFnZSBmaWxlIG5hbWUKK3ZhciBpbWFnZUVuZENvZGUgPSAiLnBuZ1wiIC8+XG4mbHQ7L2E+IjsKIAogLyoqIEdlbmVyYXRlIHRoZSBIVE1MIHNuaXBwZXQgYW5kIGRlbW8gYmFzZWQgb24gZm9ybSB2YWx1ZXMgKi8KIGZ1bmN0aW9uIGJ1aWxkQnV0dG9uKGZvcm0pIHsKLSAgaWYgKGZvcm1bInBhY2thZ2UiXS52YWx1ZSAhPSAiY29tLmFuZHJvaWQuZXhhbXBsZSIpIHsKKyAgdmFyIHNlbGVjdGVkVmFsdWUgPSAkKCdmb3JtIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQnKS52YWwoKTsKKyAgdmFyIGFsdFRleHQgPSBzZWxlY3RlZFZhbHVlLmluZGV4T2YoImdldF9pdCIpICE9IC0xID8gIkdldCBpdCBvbiBHb29nbGUgUGxheSIgOiAiQW5kcm9pZCBhcHAgb24gR29vZ2xlIFBsYXkiOworCisgIGlmIChmb3JtWyJwYWNrYWdlIl0udmFsdWUgIT0gImNvbS5leGFtcGxlLmFuZHJvaWQiKSB7CiAgICAgJCgiI3ByZXZpZXciKS5zaG93KCk7Ci0gICAgJCgiI3NuaXBwZXQiKS5zaG93KCkuaHRtbChsaW5rU3RhcnRDb2RlICsgImRldGFpbHM/aWQ9IiArIGZvcm1bInBhY2thZ2UiXS52YWx1ZQotICAgICAgICAgICAgKyBpbWFnZVN0YXJ0Q29kZSArICQoJ2Zvcm0gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCcpLnZhbCgpICsgaW1hZ2VFbmRDb2RlKTsKLSAgICAkKCIjYnV0dG9uLXByZXZpZXciKS5odG1sKGxpbmtTdGFydCArICJkZXRhaWxzP2lkPSIgKyBmb3JtWyJwYWNrYWdlIl0udmFsdWUKLSAgICAgICAgICAgICsgaW1hZ2VTdGFydCArICQoJ2Zvcm0gaW5wdXRbdHlwZT1yYWRpb106Y2hlY2tlZCcpLnZhbCgpICsgaW1hZ2VFbmQpOworICAgICQoIiNzbmlwcGV0Iikuc2hvdygpLmh0bWwobGlua1N0YXJ0Q29kZSArICJhcHBzL2RldGFpbHM/aWQ9IiArIGZvcm1bInBhY2thZ2UiXS52YWx1ZQorICAgICAgICAgICAgKyBpbWFnZVN0YXJ0Q29kZSArIGFsdFRleHQgKyBpbWFnZVNyY0NvZGUKKyAgICAgICAgICAgICsgc2VsZWN0ZWRWYWx1ZSArIGltYWdlRW5kQ29kZSk7CisgICAgJCgiI2J1dHRvbi1wcmV2aWV3IikuaHRtbChsaW5rU3RhcnQgKyAiYXBwcy9kZXRhaWxzP2lkPSIgKyBmb3JtWyJwYWNrYWdlIl0udmFsdWUKKyAgICAgICAgICAgICsgaW1hZ2VTdGFydCArIGFsdFRleHQgKyBpbWFnZVNyYworICAgICAgICAgICAgKyBzZWxlY3RlZFZhbHVlICsgaW1hZ2VFbmQpOwogICB9IGVsc2UgaWYgKGZvcm1bInB1Ymxpc2hlciJdLnZhbHVlICE9ICJFeGFtcGxlLCBJbmMuIikgewogICAgICQoIiNwcmV2aWV3Iikuc2hvdygpOwogICAgICQoIiNzbmlwcGV0Iikuc2hvdygpLmh0bWwobGlua1N0YXJ0Q29kZSArICJzZWFyY2g/cT1wdWI6IiArIGZvcm1bInB1Ymxpc2hlciJdLnZhbHVlCi0gICAgICAgICAgICArIGltYWdlU3RhcnRDb2RlICsgJCgnZm9ybSBpbnB1dFt0eXBlPXJhZGlvXTpjaGVja2VkJykudmFsKCkgKyBpbWFnZUVuZENvZGUpOwotICAgICQoIiNidXR0b24tcHJldmlldyIpLmh0bWwobGlua1N0YXJ0ICsgInNlYXJjaD9xPXB1YjoiICsgZm9ybVsicHVibGlzaGVyIl0udmFsdWUgKyBpbWFnZVN0YXJ0ICsKLSAgICAkKCdmb3JtIGlucHV0W3R5cGU9cmFkaW9dOmNoZWNrZWQnKS52YWwoKSArIGltYWdlRW5kKTsKKyAgICAgICAgICAgICsgaW1hZ2VTdGFydENvZGUgKyBhbHRUZXh0ICsgaW1hZ2VTcmNDb2RlCisgICAgICAgICAgICArIHNlbGVjdGVkVmFsdWUgKyBpbWFnZUVuZENvZGUpOworICAgICQoIiNidXR0b24tcHJldmlldyIpLmh0bWwobGlua1N0YXJ0ICsgInNlYXJjaD9xPXB1YjoiICsgZm9ybVsicHVibGlzaGVyIl0udmFsdWUKKyAgICAgICAgICAgICsgaW1hZ2VTdGFydCArIGFsdFRleHQgKyBpbWFnZVNyYworICAgICAgICAgICAgKyBzZWxlY3RlZFZhbHVlICsgaW1hZ2VFbmQpOwogICB9IGVsc2UgewogICAgIGFsZXJ0KCJQbGVhc2UgZW50ZXIgeW91ciBwYWNrYWdlIG5hbWUgb3IgcHVibGlzaGVyIG5hbWUiKTsKICAgfQpAQCAtNTk3LDEzICs2MTEsMTMgQEAKIDxmb3JtIGNsYXNzPSJidXR0b24tZm9ybSI+CiAgIDxsYWJlbCBjbGFzcz0iYmxvY2siIGZvcj0icGFja2FnZSI+UGFja2FnZSBuYW1lOjwvbGFiZWw+CiAgIDxpbnB1dCBjbGFzcz0idGV4dCIgdHlwZT0idGV4dCIgaWQ9InBhY2thZ2UiIG5hbWU9InBhY2thZ2UiCi0gICAgICAgICB2YWx1ZT0iY29tLmFuZHJvaWQuZXhhbXBsZSIKLSAgICAgICAgIGRlZmF1bHQ9ImNvbS5hbmRyb2lkLmV4YW1wbGUiCi0gICAgICAgICBvbmZvY3VzPSJvbklucHV0Rm9jdXModGhpcywgJ2NvbS5hbmRyb2lkLmV4YW1wbGUnKSIKLSAgICAgICAgIG9uYmx1cj0ib25JbnB1dEJsdXIodGhpcywgJ2NvbS5hbmRyb2lkLmV4YW1wbGUnKSIKKyAgICAgICAgIHZhbHVlPSJjb20uZXhhbXBsZS5hbmRyb2lkIgorICAgICAgICAgZGVmYXVsdD0iY29tLmV4YW1wbGUuYW5kcm9pZCIKKyAgICAgICAgIG9uZm9jdXM9Im9uSW5wdXRGb2N1cyh0aGlzLCAnY29tLmV4YW1wbGUuYW5kcm9pZCcpIgorICAgICAgICAgb25ibHVyPSJvbklucHV0Qmx1cih0aGlzLCAnY29tLmV4YW1wbGUuYW5kcm9pZCcpIgogICAgICAgICAgb25rZXl1cD0icmV0dXJuIG9uVGV4dEVudGVyZWQoZXZlbnQsIHRoaXMucGFyZW50Tm9kZSwgdGhpcykiLz4mbmJzcDsKICAgICAgICAgIDxhIGlkPSJwYWNrYWdlLWNsZWFyIiBzdHlsZT0iZGlzcGxheTpub25lIiBocmVmPSIjIgotICAgICAgICAgICAgb25jbGljaz0icmV0dXJuIGNsZWFyTGFiZWwoJ3BhY2thZ2UnLCdjb20uYW5kcm9pZC5leGFtcGxlJyk7Ij5jbGVhcjwvYT4KKyAgICAgICAgICAgIG9uY2xpY2s9InJldHVybiBjbGVhckxhYmVsKCdwYWNrYWdlJywnY29tLmV4YW1wbGUuYW5kcm9pZCcpOyI+Y2xlYXI8L2E+CiAgIDxwIHN0eWxlPSJjbGVhcjpib3RoO21hcmdpbjowIj4mbmJzcDs8ZW0+b3I8L2VtPjwvcD4KICAgPGxhYmVsIGNsYXNzPSJibG9jayIgc3R5bGU9Im1hcmdpbi10b3A6NXB4IiBmb3I9InB1Ymxpc2hlciI+UHVibGlzaGVyIG5hbWU6PC9sYWJlbD4KICAgPGlucHV0IGNsYXNzPSJ0ZXh0IiB0eXBlPSJ0ZXh0IiBpZD0icHVibGlzaGVyIiBuYW1lPSJwdWJsaXNoZXIiCkBAIC02MTcsMjMgKzYzMSwyMyBAQAogICAgICAgICAgPGJyLz48YnIvPgogCiA8ZGl2IGNsYXNzPSJidXR0b24tcm93Ij4KLSAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9IjQ1X2F2YWlsX21hcmtldF9sb2dvMSIgaWQ9Im5zIiBjaGVja2VkPSJjaGVja2VkIiAvPgotICAgIDxsYWJlbCBmb3I9Im5zIj48aW1nIHNyYz0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9pbWFnZXMvYnJhbmQvNDVfYXZhaWxfbWFya2V0X2xvZ28xLnBuZyIKLWFsdD0ibmFycm93IGFuZCBzbWFsbCBsb2dvIiAvPjwvbGFiZWw+CisgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iYnV0dG9uU3R5bGUiIHZhbHVlPSJnZXRfaXRfb25fcGxheV9sb2dvX3NtYWxsIiBpZD0ibnMiIGNoZWNrZWQ9ImNoZWNrZWQiIC8+CisgICAgPGxhYmVsIGZvcj0ibnMiPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC9nZXRfaXRfb25fcGxheV9sb2dvX3NtYWxsLnBuZyIKK2FsdD0iR2V0IGl0IG9uIEdvb2dsZSBQbGF5IChzbWFsbCkiIC8+PC9sYWJlbD4KICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKLSAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9IjYwX2F2YWlsX21hcmtldF9sb2dvMSIgaWQ9Im5tIiAvPgotICAgIDxsYWJlbCBmb3I9Im5tIj48aW1nIHNyYz0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9pbWFnZXMvYnJhbmQvNjBfYXZhaWxfbWFya2V0X2xvZ28xLnBuZyIKLWFsdD0ibmFycm93IGFuZCBsYXJnZSBsb2dvIiAvPjwvbGFiZWw+CisgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iYnV0dG9uU3R5bGUiIHZhbHVlPSJnZXRfaXRfb25fcGxheV9sb2dvX2xhcmdlIiBpZD0ibm0iIC8+CisgICAgPGxhYmVsIGZvcj0ibm0iPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC9nZXRfaXRfb25fcGxheV9sb2dvX2xhcmdlLnBuZyIKK2FsdD0iR2V0IGl0IG9uIEdvb2dsZSBQbGF5IChsYXJnZSkiIC8+PC9sYWJlbD4KIDwvZGl2PgogCiA8ZGl2IGNsYXNzPSJidXR0b24tcm93Ij4KLSAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9IjQ1X2F2YWlsX21hcmtldF9sb2dvMiIgaWQ9IndzIiAvPgotICAgIDxsYWJlbCBmb3I9IndzIj48aW1nIHNyYz0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9pbWFnZXMvYnJhbmQvNDVfYXZhaWxfbWFya2V0X2xvZ28yLnBuZyIKLWFsdD0id2lkZSBhbmQgc21hbGwgbG9nbyIgLz48L2xhYmVsPgorICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9ImJ1dHRvblN0eWxlIiB2YWx1ZT0iYW5kcm9pZF9hcHBfb25fcGxheV9sb2dvX3NtYWxsIiBpZD0id3MiIC8+CisgICAgPGxhYmVsIGZvcj0id3MiPjxpbWcgc3JjPSJodHRwOi8vd3d3LmFuZHJvaWQuY29tL2ltYWdlcy9icmFuZC9hbmRyb2lkX2FwcF9vbl9wbGF5X2xvZ29fc21hbGwucG5nIgorYWx0PSJBbmRyb2lkIGFwcCBvbiBHb29nbGUgUGxheSAoc21hbGwpIiAvPjwvbGFiZWw+CiAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ci0gIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iYnV0dG9uU3R5bGUiIHZhbHVlPSI2MF9hdmFpbF9tYXJrZXRfbG9nbzIiIGlkPSJ3bSIgLz4KLSAgICA8bGFiZWwgZm9yPSJ3bSI+PGltZyBzcmM9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vaW1hZ2VzL2JyYW5kLzYwX2F2YWlsX21hcmtldF9sb2dvMi5wbmciCi1hbHQ9IndpZGUgYW5kIGxhcmdlIGxvZ28iIC8+PC9sYWJlbD4KKyAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJidXR0b25TdHlsZSIgdmFsdWU9ImFuZHJvaWRfYXBwX29uX3BsYXlfbG9nb19sYXJnZSIgaWQ9IndtIiAvPgorICAgIDxsYWJlbCBmb3I9IndtIj48aW1nIHNyYz0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbS9pbWFnZXMvYnJhbmQvYW5kcm9pZF9hcHBfb25fcGxheV9sb2dvX2xhcmdlLnBuZyIKK2FsdD0iQW5kcm9pZCBhcHAgb24gR29vZ2xlIFBsYXkgKGxhcmdlKSIgLz48L2xhYmVsPgogPC9kaXY+CiAKICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgb25jbGljaz0icmV0dXJuIGJ1aWxkQnV0dG9uKHRoaXMucGFyZW50Tm9kZSkiIHZhbHVlPSJCdWlsZCBteSBidXR0b24iCkBAIC02NDMsNyArNjU3LDcgQEAKIAogPGRpdiBpZD0icHJldmlldyIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+CiAgIDxwPkNvcHkgYW5kIHBhc3RlIHRoaXMgSFRNTCBpbnRvIHlvdXIgd2ViIHNpdGU6PC9wPgotICA8dGV4dGFyZWEgaWQ9InNuaXBwZXQiIGNvbHM9IjgwIiByb3dzPSI0IiBvbmNsaWNrPSJ0aGlzLnNlbGVjdCgpIgorICA8dGV4dGFyZWEgaWQ9InNuaXBwZXQiIGNvbHM9IjEwMCIgcm93cz0iNSIgb25jbGljaz0idGhpcy5zZWxlY3QoKSIKIHN0eWxlPSJmb250LWZhbWlseTptb25vc3BhY2U7YmFja2dyb3VuZC1jb2xvcjojZWZlZmVmO3BhZGRpbmc6NXB4O2Rpc3BsYXk6bm9uZTttYXJnaW4tYm90dG9tOjFlbSI+CiAgIDwvdGV4dGFyZWEgPgogCkBAIC02NTgsNyArNjcyLDcgQEAKIAogPGgzIGlkPSJVcmlTdW1tYXJ5Ij5TdW1tYXJ5IG9mIFVSSSBmb3JtYXRzPC9oMz4KIAotPHA+VGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUgVVJJcyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBBbmRyb2lkIE1hcmtldCAoYm90aCBvbgorPHA+VGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUgVVJJcyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IHRoZSBHb29nbGUgUGxheSAoYm90aCBvbgogdGhlIHdlYiBhbmQgaW4gdGhlIEFuZHJvaWQgYXBwbGljYXRpb24pLCBhcyBkaXNjdXNzZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb25zLjwvcD4KIAogPHRhYmxlPgpAQCAtNjcwLDE5ICs2ODQsMTkgQEAKIAogPHRyPgogPHRkPkRpc3BsYXkgdGhlIGRldGFpbHMgc2NyZWVuIGZvciBhIHNwZWNpZmljIGFwcGxpY2F0aW9uPC90ZD4KLTx0ZD48Y29kZT5odHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL2RldGFpbHM/aWQ9Jmx0O3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+Cis8dGQ+PGNvZGU+aHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9hcHBzL2RldGFpbHM/aWQ9Jmx0O3BhY2thZ2VfbmFtZSZndDs8L2NvZGU+CiA8dGQ+PGNvZGU+bWFya2V0Oi8vZGV0YWlscz9pZD0mbHQ7cGFja2FnZV9uYW1lJmd0OzwvY29kZT48L3RkPgogPC90cj4KIAogPHRyPgogPHRkPlNlYXJjaCBmb3IgYXBwbGljYXRpb25zIHVzaW5nIGEgZ2VuZXJhbCBzdHJpbmcgcXVlcnkuPC90ZD4KLTx0ZD48Y29kZT5odHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3NlYXJjaD9xPSZsdDtxdWVyeSZndDs8L2NvZGU+PC90ZD4KKzx0ZD48Y29kZT5odHRwOi8vcGxheS5nb29nbGUuY29tL3N0b3JlL3NlYXJjaD9xPSZsdDtxdWVyeSZndDs8L2NvZGU+PC90ZD4KIDx0ZD48Y29kZT5tYXJrZXQ6Ly9zZWFyY2g/cT0mbHQ7cXVlcnkmZ3Q7PC9jb2RlPjwvdGQ+CiA8L3RyPgogCiA8dHI+CiA8dGQ+U2VhcmNoIGZvciBhcHBsaWNhdGlvbnMgYnkgcHVibGlzaGVyIG5hbWU8L3RkPgotPHRkPjxub2JyPjxjb2RlPmh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vc2VhcmNoP3E9cHViOiZsdDtwdWJsaXNoZXJfbmFtZSZndDs8L2NvZGU+PC9ub2JyPjwvdGQ+Cis8dGQ+PG5vYnI+PGNvZGU+aHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9zdG9yZS9zZWFyY2g/cT1wdWI6Jmx0O3B1Ymxpc2hlcl9uYW1lJmd0OzwvY29kZT48L25vYnI+PC90ZD4KIDx0ZD48bm9icj48Y29kZT5tYXJrZXQ6Ly9zZWFyY2g/cT1wdWI6Jmx0O3B1Ymxpc2hlcl9uYW1lJmd0OzwvY29kZT48L25vYnI+PC90ZD4KIDwvdHI+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmdfb3ZlcnZpZXcuamQgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nX292ZXJ2aWV3LmpkCmluZGV4IGM5NGQyMDEuLjZmYjc3ZTEgMTAwNzU1Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmdfb3ZlcnZpZXcuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZ19vdmVydmlldy5qZApAQCAtMTQsNyArMTQsNyBAQAogICAgIDxsaT48YSBocmVmPSIjcHVibGlzaGluZy1wcmVwYXJlIj5QcmVwYXJpbmcgWW91ciBBcHBsaWNhdGlvbiBmb3IgUmVsZWFzZTwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSIjcHVibGlzaGluZy1yZWxlYXNlIj5SZWxlYXNpbmcgWW91ciBBcHBsaWNhdGlvbiB0byBVc2VyczwvYT4KICAgICA8b2w+Ci0gICAgICA8bGk+PGEgaHJlZj0iI3B1Ymxpc2hpbmctbWFya2V0Ij5SZWxlYXNpbmcgb24gQW5kcm9pZCBNYXJrZXQ8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjcHVibGlzaGluZy1tYXJrZXQiPlJlbGVhc2luZyBvbiBHb29nbGUgUGxheTwvYT48L2xpPgogICAgICAgPGxpPjxhIGhyZWY9IiNwdWJsaXNoaW5nLXdlYnNpdGUiPlJlbGVhc2luZyBvbiB5b3VyIG93biB3ZWJzaXRlPC9hPjwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iI3B1Ymxpc2hpbmctZW1haWwiPlJlbGVhc2luZyB0aHJvdWdoIGVtYWlsPC9hPjwvbGk+CiAgICAgPC9vbD4KQEAgLTIzLDcgKzIzLDcgQEAKICAgPG9sPgogICAgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+UHJlcGFyaW5nIGZvcgogICAgIFJlbGVhc2U8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0PC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCI+UHVibGlzaGluZyBvbiBHb29nbGUgUGxheTwvYT48L2xpPgogICA8L29sPgogPC9kaXY+CiA8L2Rpdj4KQEAgLTQyLDcgKzQyLDcgQEAKICAgPC9saT4KIDwvdWw+CiAKLTxwPlVzdWFsbHksIHlvdSByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gdGhyb3VnaCBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSwgc3VjaCBhcyBBbmRyb2lkIE1hcmtldC4KKzxwPlVzdWFsbHksIHlvdSByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gdGhyb3VnaCBhbiBhcHBsaWNhdGlvbiBtYXJrZXRwbGFjZSwgc3VjaCBhcyBHb29nbGUgUGxheS4KIEhvd2V2ZXIsIHlvdSBjYW4gYWxzbyByZWxlYXNlIGFwcGxpY2F0aW9ucyBieSBzZW5kaW5nIHRoZW0gZGlyZWN0bHkgdG8gdXNlcnMgb3IgYnkgbGV0dGluZyB1c2VycwogZG93bmxvYWQgdGhlbSBmcm9tIHlvdXIgb3duIHdlYnNpdGUuPC9wPgogCkBAIC03Myw3ICs3Myw3IEBACiAgICAgPGNvZGU+YW5kcm9pZDp2ZXJzaW9uQ29kZTwvY29kZT4gYW5kIDxjb2RlPmFuZHJvaWQ6dmVyc2lvbk5hbWU8L2NvZGU+IGF0dHJpYnV0ZXMsIHdoaWNoIGFyZQogICAgIGxvY2F0ZWQgaW4gdGhlCiAgICAgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50Lmh0bWwiPiZsdDttYW5pZmVzdCZndDs8L2E+Ci0gICAgZWxlbWVudC4gWW91IG1heSBhbHNvIGhhdmUgdG8gY29uZmlndXJlIHNldmVyYWwgb3RoZXIgc2V0dGluZ3MgdG8gbWVldCBBbmRyb2lkIE1hcmtldAorICAgIGVsZW1lbnQuIFlvdSBtYXkgYWxzbyBoYXZlIHRvIGNvbmZpZ3VyZSBzZXZlcmFsIG90aGVyIHNldHRpbmdzIHRvIG1lZXQgR29vZ2xlIFBsYXkKICAgICByZXF1aXJlbWVudHMgb3IgYWNjb21vZGF0ZSB3aGF0ZXZlciBtZXRob2QgeW91J3JlIHVzaW5nIHRvIHJlbGVhc2UgeW91ciBhcHBsaWNhdGlvbi48L3A+CiAgIDwvbGk+CiAgIDxsaT5CdWlsZGluZyBhbmQgc2lnbmluZyBhIHJlbGVhc2UgdmVyc2lvbiBvZiB5b3VyIGFwcGxpY2F0aW9uLgpAQCAtMTE0LDI4ICsxMTQsMjcgQEAKIDxoMiBpZD0icHVibGlzaGluZy1yZWxlYXNlIj5SZWxlYXNpbmcgWW91ciBBcHBsaWNhdGlvbiB0byBVc2VyczwvaDI+CiAKIDxwPllvdSBjYW4gcmVsZWFzZSB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb25zIHNldmVyYWwgd2F5cy4gVXN1YWxseSwgeW91IHJlbGVhc2UgYXBwbGljYXRpb25zCi10aHJvdWdoIGFuIGFwcGxpY2F0aW9uIG1hcmtldHBsYWNlLCBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LCBidXQgeW91IGNhbiBhbHNvIHJlbGVhc2UgYXBwbGljYXRpb25zCi1vbiB5b3VyIG93biB3ZWJzaXRlIG9yIGJ5IHNlbmRpbmcgYW4gYXBwbGljYXRpb24gZGlyZWN0bHkgdG8gYSB1c2VyLiBBbmRyb2lkIE1hcmtldCBpcyB0aGUKK3Rocm91Z2ggYW4gYXBwbGljYXRpb24gbWFya2V0cGxhY2UsIHN1Y2ggYXMgR29vZ2xlIFBsYXksIGJ1dCB5b3UgY2FuIGFsc28gcmVsZWFzZSBhcHBsaWNhdGlvbnMKK29uIHlvdXIgb3duIHdlYnNpdGUgb3IgYnkgc2VuZGluZyBhbiBhcHBsaWNhdGlvbiBkaXJlY3RseSB0byBhIHVzZXIuIEdvb2dsZSBQbGF5IGlzIHRoZQogcmVjb21tZW5kZWQgbWFya2V0cGxhY2UgZm9yIEFuZHJvaWQgYXBwbGljYXRpb25zIGFuZCBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvCiBkaXN0cmlidXRlIHlvdXIgYXBwbGljYXRpb25zIHRvIGEgbGFyZ2UgZ2xvYmFsIGF1ZGllbmNlLiBUaGUgb3RoZXIgdHdvIHJlbGVhc2UgbWV0aG9kcyZtZGFzaDtzZXJ2ZXIKIGRpc3RyaWJ1dGlvbiBhbmQgZW1haWwgZGlzdHJpYnV0aW9uJm1kYXNoO2FyZSB1c2VmdWwgaWYgeW91IGFyZSByZWxlYXNpbmcgYW4gYXBwbGljYXRpb24gdG8gYSBzbWFsbAogZ3JvdXAgb2YgdXNlcnMgKGZvciBleGFtcGxlLCBhIHdvcmsgZ3JvdXAgaW4gYW4gZW50ZXJwcmlzZSBlbnZpcm9ubWVudCksIG9yIGlmIHlvdSBkbyBub3Qgd2FudCB0bwogbWFrZSB5b3VyIGFwcGxpY2F0aW9uIGF2YWlsYWJsZSB0byB0aGUgZ2VuZXJhbCBwdWJsaWMuPC9wPgogCi08aDMgaWQ9InB1Ymxpc2hpbmctbWFya2V0Ij5SZWxlYXNpbmcgWW91ciBBcHBsaWNhdGlvbnMgb24gQW5kcm9pZCBNYXJrZXQ8L2gzPgorPGgzIGlkPSJwdWJsaXNoaW5nLW1hcmtldCI+UmVsZWFzaW5nIFlvdXIgQXBwbGljYXRpb25zIG9uIEdvb2dsZSBQbGF5PC9oMz4KIAotPHA+QW5kcm9pZCBNYXJrZXQgaXMgYSByb2J1c3QgcHVibGlzaGluZyBwbGF0Zm9ybSB0aGF0IGhlbHBzIHlvdSBwdWJsaWNpemUsIHNlbGwsIGFuZCBkaXN0cmlidXRlCis8cD5Hb29nbGUgUGxheSBpcyBhIHJvYnVzdCBwdWJsaXNoaW5nIHBsYXRmb3JtIHRoYXQgaGVscHMgeW91IHB1YmxpY2l6ZSwgc2VsbCwgYW5kIGRpc3RyaWJ1dGUKIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMgdG8gdXNlcnMgYXJvdW5kIHRoZSB3b3JsZC4gV2hlbiB5b3UgcmVsZWFzZSB5b3VyIGFwcGxpY2F0aW9ucyB0aHJvdWdoCi1BbmRyb2lkIE1hcmtldCB5b3UgaGF2ZSBhY2Nlc3MgdG8gYSBzdWl0ZSBvZiBkZXZlbG9wZXIgdG9vbHMgdGhhdCBsZXQgeW91IGFuYWx5emUgeW91ciBzYWxlcywKK0dvb2dsZSBQbGF5IHlvdSBoYXZlIGFjY2VzcyB0byBhIHN1aXRlIG9mIGRldmVsb3BlciB0b29scyB0aGF0IGxldCB5b3UgYW5hbHl6ZSB5b3VyIHNhbGVzLAogaWRlbnRpZnkgbWFya2V0IHRyZW5kcywgYW5kIGNvbnRyb2wgd2hvIHlvdXIgYXBwbGljYXRpb25zIGFyZSBiZWluZyBkaXN0cmlidXRlZCB0by4gWW91IGFsc28gaGF2ZQogYWNjZXNzIHRvIHNldmVyYWwgcmV2ZW51ZS1lbmhhbmNpbmcgZmVhdHVyZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBhbnl3aGVyZSBlbHNlLCBzdWNoIGFzIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvbWFya2V0L2JpbGxpbmcvaW5kZXguaHRtbCI+aW4tYXBwIGJpbGxpbmc8L2E+IGFuZCA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcvaW5kZXguaHRtbCI+YXBwbGljYXRpb24gbGljZW5zaW5nPC9hPi4gVGhpcyByaWNoIGFycmF5IG9mCi10b29scwotYW5kIGZlYXR1cmVzLCBjb3VwbGVkIHdpdGggbnVtZXJvdXMgZW5kLXVzZXIgY29tbXVuaXR5IGZlYXR1cmVzLCBtYWtlcyBBbmRyb2lkIE1hcmtldCB0aGUgcHJlbWllcgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL21hcmtldC9saWNlbnNpbmcuaHRtbCI+YXBwbGljYXRpb24gbGljZW5zaW5nPC9hPi4gVGhpcyByaWNoIGFycmF5IG9mIHRvb2xzCithbmQgZmVhdHVyZXMsIGNvdXBsZWQgd2l0aCBudW1lcm91cyBlbmQtdXNlciBjb21tdW5pdHkgZmVhdHVyZXMsIG1ha2VzIEdvb2dsZSBQbGF5IHRoZSBwcmVtaWVyCiBtYXJrZXRwbGFjZSBmb3Igc2VsbGluZyBhbmQgYnV5aW5nIEFuZHJvaWQgYXBwbGljYXRpb25zLjwvcD4KIAotPHA+UmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gb24gQW5kcm9pZCBNYXJrZXQgaXMgYSBzaW1wbGUgcHJvY2VzcyB0aGF0IGludm9sdmVzIHRocmVlIGJhc2ljCis8cD5SZWxlYXNpbmcgeW91ciBhcHBsaWNhdGlvbiBvbiBHb29nbGUgUGxheSBpcyBhIHNpbXBsZSBwcm9jZXNzIHRoYXQgaW52b2x2ZXMgdGhyZWUgYmFzaWMKICAgc3RlcHM6PC9wPgogCiA8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ3aWR0aDoyNzVweCI+CkBAIC0xNDQsMTkgKzE0MywxOSBAQAogICAgICAgIHRvIGJlIGluc3RhbGxlZCIgLz4KICAgPHAgY2xhc3M9ImltZy1jYXB0aW9uIj4KICAgICA8c3Ryb25nPkZpZ3VyZSAyLjwvc3Ryb25nPiBUaGUgPHN0cm9uZz5Vbmtub3duIHNvdXJjZXM8L3N0cm9uZz4gc2V0dGluZyBsZXRzIHlvdSBpbnN0YWxsCi0gICAgYXBwbGljYXRpb25zIHRoYXQgYXJlIG5vdCBwdWJsaXNoZWQgb24gQW5kcm9pZCBNYXJrZXQgLgorICAgIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBub3QgcHVibGlzaGVkIG9uIEdvb2dsZSBQbGF5IC4KICAgPC9wPgogPC9kaXY+CiAKIDx1bD4KICAgPGxpPlByZXBhcmluZyBwcm9tb3Rpb25hbCBtYXRlcmlhbHMuCi0gICAgPHA+VG8gZnVsbHkgbGV2ZXJhZ2UgdGhlIG1hcmtldGluZyBhbmQgcHVibGljaXR5IGNhcGFiaWxpdGllcyBvZiBBbmRyb2lkIE1hcmtldCwgeW91IG5lZWQgdG8KKyAgICA8cD5UbyBmdWxseSBsZXZlcmFnZSB0aGUgbWFya2V0aW5nIGFuZCBwdWJsaWNpdHkgY2FwYWJpbGl0aWVzIG9mIEdvb2dsZSBQbGF5LCB5b3UgbmVlZCB0bwogICAgIGNyZWF0ZSBwcm9tb3Rpb25hbCBtYXRlcmlhbHMgZm9yIHlvdXIgYXBwbGljYXRpb24sIHN1Y2ggYXMgc2NyZWVuc2hvdHMsIHZpZGVvcywgZ3JhcGhpY3MsIGFuZAogICAgIHByb21vdGlvbmFsIHRleHQuPC9wPgogICA8L2xpPgogICA8bGk+Q29uZmlndXJpbmcgb3B0aW9ucyBhbmQgdXBsb2FkaW5nIGFzc2V0cy4KLSAgICA8cD5BbmRyb2lkIE1hcmtldCBsZXRzIHlvdSB0YXJnZXQgeW91ciBhcHBsaWNhdGlvbiB0byBhIHdvcmxkd2lkZSBwb29sIG9mIHVzZXJzIGFuZCBkZXZpY2VzLgotICAgIEJ5IGNvbmZpZ3VyaW5nIHZhcmlvdXMgQW5kcm9pZCBNYXJrZXQgc2V0dGluZ3MsIHlvdSBjYW4gY2hvb3NlIHRoZSBjb3VudHJpZXMgeW91IHdhbnQgdG8KKyAgICA8cD5Hb29nbGUgUGxheSBsZXRzIHlvdSB0YXJnZXQgeW91ciBhcHBsaWNhdGlvbiB0byBhIHdvcmxkd2lkZSBwb29sIG9mIHVzZXJzIGFuZCBkZXZpY2VzLgorICAgIEJ5IGNvbmZpZ3VyaW5nIHZhcmlvdXMgR29vZ2xlIFBsYXkgc2V0dGluZ3MsIHlvdSBjYW4gY2hvb3NlIHRoZSBjb3VudHJpZXMgeW91IHdhbnQgdG8KICAgICByZWFjaCwgdGhlIGxpc3RpbmcgbGFuZ3VhZ2VzIHlvdSB3YW50IHRvIHVzZSwgYW5kIHRoZSBwcmljZSB5b3Ugd2FudCB0byBjaGFyZ2UgaW4gZWFjaAogICAgIGNvdW50cnkuIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgbGlzdGluZyBkZXRhaWxzIHN1Y2ggYXMgdGhlIGFwcGxpY2F0aW9uIHR5cGUsIGNhdGVnb3J5LCBhbmQKICAgICBjb250ZW50IHJhdGluZy4gV2hlbiB5b3UgYXJlIGRvbmUgY29uZmlndXJpbmcgb3B0aW9ucyB5b3UgY2FuIHVwbG9hZCB5b3VyIHByb21vdGlvbmFsIG1hdGVyaWFscwpAQCAtMTcwLDIxICsxNjksMjEgQEAKICAgPC9saT4KIDwvdWw+CiAKLTxwPkZvciBpbmZvcm1hdGlvbiBhYm91dCBBbmRyb2lkIE1hcmtldCwgc2VlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwjbWFya2V0Ij5QdWJsaXNoaW5nIG9uIEFuZHJvaWQgTWFya2V0PC9hPi4gVGhpcwotdG9waWMgcHJvdmlkZXMgYW4gaW50cm9kdWN0aW9uIHRvIEFuZHJvaWQgTWFya2V0IGZlYXR1cmVzIGFuZCBwcm92aWRlcyBhIHN0ZXAtYnktc3RlcCBndWlkZSBmb3IKLWRpc3RyaWJ1dGluZyB5b3VyIGFwcGxpY2F0aW9ucyBvbiBBbmRyb2lkIE1hcmtldC48L3A+Cis8cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgR29vZ2xlIFBsYXksIHNlZSA8YQoraHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sI21hcmtldCI+UHVibGlzaGluZyBvbiBHb29nbGUgUGxheTwvYT4uIFRoaXMKK3RvcGljIHByb3ZpZGVzIGFuIGludHJvZHVjdGlvbiB0byBHb29nbGUgUGxheSBmZWF0dXJlcyBhbmQgcHJvdmlkZXMgYSBzdGVwLWJ5LXN0ZXAgZ3VpZGUgZm9yCitkaXN0cmlidXRpbmcgeW91ciBhcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXkuPC9wPgogCiA8aDMgaWQ9InB1Ymxpc2hpbmctd2Vic2l0ZSI+UmVsZWFzaW5nIHlvdXIgYXBwbGljYXRpb24gb24geW91ciBvd24gd2Vic2l0ZTwvaDM+CiAKLTxwPklmIHlvdSBkbyBub3Qgd2FudCB0byByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gb24gYW4gYXBwbGljYXRpb24gbWFya2V0cGxhY2UgbGlrZSBBbmRyb2lkIE1hcmtldCwKKzxwPklmIHlvdSBkbyBub3Qgd2FudCB0byByZWxlYXNlIHlvdXIgYXBwbGljYXRpb24gb24gYW4gYXBwbGljYXRpb24gbWFya2V0cGxhY2UgbGlrZSBHb29nbGUgUGxheSwKIHlvdSBjYW4gcmVsZWFzZSB5b3VyIGFwcGxpY2F0aW9uIGJ5IG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGRvd25sb2FkIG9uIHlvdXIgb3duIHdlYnNpdGUgb3Igc2VydmVyLgogVG8gZG8gdGhpcywgeW91IG11c3QgZmlyc3QgcHJlcGFyZSB5b3VyIGFwcGxpY2F0aW9uIGZvciByZWxlYXNlICh0aGF0IGlzLCB5b3UgbXVzdCBidWlsZCBpdCBmb3IKIHJlbGVhc2UgYW5kIHNpZ24gaXQpLiBUaGVuIGFsbCB5b3UgbmVlZCB0byBkbyBpcyBob3N0IHRoZSByZWxlYXNlLXJlYWR5IGFwcGxpY2F0aW9uIG9uIHlvdXIgd2Vic2l0ZQogYW5kIHByb3ZpZGUgYSBkb3dubG9hZCBsaW5rIGZvciB0aGUgYXBwbGljYXRpb24uIFdoZW4gdXNlcnMgYnJvd3NlIHRvIHlvdXIgd2Vic2l0ZSB3aXRoIHRoZWlyCiBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlcyBhbmQgZG93bmxvYWQgeW91ciBhcHBsaWNhdGlvbiwgdGhlIEFuZHJvaWQgc3lzdGVtIHdpbGwgYXV0b21hdGljYWxseSBzdGFydAogaW5zdGFsbGluZyB0aGUgYXBwbGljYXRpb24gb24gdGhlIGRldmljZS4gSG93ZXZlciwgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseQotb25seSBpZiB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBkZXZpY2UgdG8gYWxsb3cgdGhlIGluc3RhbGxhdGlvbiBvZiBub24tQW5kcm9pZCBNYXJrZXQKK29ubHkgaWYgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgZGV2aWNlIHRvIGFsbG93IHRoZSBpbnN0YWxsYXRpb24gb2Ygbm9uLUdvb2dsZSBQbGF5CiBhcHBsaWNhdGlvbnMuPC9wPgogCiA8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ3aWR0aDoyNzVweCI+CkBAIC0xOTgsNyArMTk3LDcgQEAKIDwvZGl2PgogCiA8cD5CeSBkZWZhdWx0LCBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlcyBhbGxvdyB1c2VycyB0byBpbnN0YWxsIGFwcGxpY2F0aW9ucyBvbmx5IGlmIHRoZSBhcHBsaWNhdGlvbnMKLWhhdmUgYmVlbiBkb3dubG9hZGVkIGZyb20gQW5kcm9pZCBNYXJrZXQuIFRvIGFsbG93IHRoZSBpbnN0YWxsYXRpb24gb2YgYXBwbGljYXRpb25zIGZyb20gb3RoZXIKK2hhdmUgYmVlbiBkb3dubG9hZGVkIGZyb20gR29vZ2xlIFBsYXkuIFRvIGFsbG93IHRoZSBpbnN0YWxsYXRpb24gb2YgYXBwbGljYXRpb25zIGZyb20gb3RoZXIKIHNvdXJjZXMsIHVzZXJzIG5lZWQgdG8gZW5hYmxlIHRoZSA8c3Ryb25nPlVua25vd24gc291cmNlczwvc3Ryb25nPiBzZXR0aW5nIG9uIHRoZWlyIGRldmljZXMsIGFuZAogdGhleSBuZWVkIHRvIG1ha2UgdGhpcyBjb25maWd1cmF0aW9uIGNoYW5nZSBiZWZvcmUgdGhleSBkb3dubG9hZCB5b3VyIGFwcGxpY2F0aW9uIHRvIHRoZWlyCiBkZXZpY2UgKHNlZSBmaWd1cmUgMikuPC9wPgpAQCAtMjA5LDcgKzIwOCw3IEBACiA8cD5BbHRob3VnaCBpdCBpcyByZWxhdGl2ZWx5IGVhc3kgdG8gcmVsZWFzZSB5b3VyIGFwcGxpY2F0aW9uIG9uIHlvdXIgb3duIHdlYnNpdGUsIGl0IGNhbiBiZQogaW5lZmZpY2llbnQgYW5kIGN1bWJlcnNvbWUuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBtb25ldGl6ZSB5b3VyIGFwcGxpY2F0aW9uIHlvdSB3aWxsCiBoYXZlIHRvIHByb2Nlc3MgYW5kIHRyYWNrIGFsbCBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIHlvdXJzZWxmIGFuZCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byB1c2UKLUFuZHJvaWQgTWFya2V0J3MgaW4tYXBwIGJpbGxpbmcgZmVhdHVyZSB0byBzZWxsIGluLWFwcCBwcm9kdWN0cy4gSW4gYWRkaXRpb24sIHlvdSB3aWxsIG5vdCBiZQorR29vZ2xlIFBsYXkncyBpbi1hcHAgYmlsbGluZyBmZWF0dXJlIHRvIHNlbGwgaW4tYXBwIHByb2R1Y3RzLiBJbiBhZGRpdGlvbiwgeW91IHdpbGwgbm90IGJlCiBhYmxlIHRvIHVzZSB0aGUgbGljZW5zaW5nIGZlYXR1cmUgdG8gaGVscCBwcmV2ZW50IHVuYXV0aG9yaXplZCBpbnN0YWxsYXRpb24gYW5kIHVzZSBvZiB5b3VyCiBhcHBsaWNhdGlvbi48L3A+CiAKQEAgLTIyMyw3ICsyMjIsNyBAQAogYnV0dG9uLjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIDxzdHJvbmc+SW5zdGFsbCBOb3c8L3N0cm9uZz4gYnV0dG9uIGFwcGVhcnMgb25seSBpZiBhCi11c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIGRldmljZSB0byBhbGxvdyB0aGUgaW5zdGFsbGF0aW9uIG9mIG5vbi1BbmRyb2lkIE1hcmtldCBhcHBsaWNhdGlvbnMgYW5kCit1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIGRldmljZSB0byBhbGxvdyB0aGUgaW5zdGFsbGF0aW9uIG9mIG5vbi1Hb29nbGUgUGxheSBhcHBsaWNhdGlvbnMgYW5kCiB0aGV5IG9wZW4geW91ciBlbWFpbCB3aXRoIHRoZSBuYXRpdmUgR21haWwgYXBwbGljYXRpb24uPC9wPgogCiA8cD5SZWxlYXNpbmcgYXBwbGljYXRpb25zIHRocm91Z2ggZW1haWwgaXMgY29udmVuaWVudCBpZiB5b3UgYXJlIHNlbmRpbmcgeW91ciBhcHBsaWNhdGlvbiB0bwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvdmVyc2lvbmluZy5qZCBiL2RvY3MvaHRtbC9ndWlkZS9wdWJsaXNoaW5nL3ZlcnNpb25pbmcuamQKaW5kZXggNzllYmY5Ni4uZGE1N2UzZSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3B1Ymxpc2hpbmcvdmVyc2lvbmluZy5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvcHVibGlzaGluZy92ZXJzaW9uaW5nLmpkCkBAIC0yNSw3ICsyNSw3IEBACiAKIDxvbD4KIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wcmVwYXJpbmcuaHRtbCI+UHJlcGFyaW5nIHRvIFB1Ymxpc2ggWW91ciBBcHBsaWNhdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wdWJsaXNoaW5nL3B1Ymxpc2hpbmcuaHRtbCNtYXJrZXQiPlB1Ymxpc2hpbmcgT24gQW5kcm9pZCBNYXJrZXQ8L2E+PC9saT4KKzxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwjbWFya2V0Ij5QdWJsaXNoaW5nIE9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1pbnRyby5odG1sIj5UaGUgQW5kcm9pZE1hbmlmZXN0LnhtbCBGaWxlPC9hPjwvbGk+CiA8L29sPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2FkbWluL2RldmljZS1hZG1pbi5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvYWRtaW4vZGV2aWNlLWFkbWluLmpkCmluZGV4IDgyMGMzYzAuLjRhMzI1ZGIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvYWRtaW4vZGV2aWNlLWFkbWluLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvYWRtaW4vZGV2aWNlLWFkbWluLmpkCkBAIC03NSw4ICs3NSw4IEBACiBub3QgY3VycmVudGx5IGhhdmUgYW4gYXV0b21hdGVkIHByb3Zpc2lvbmluZyBzb2x1dGlvbi4gU29tZSBvZiB0aGUgd2F5cyBhIHN5c2FkbWluIG1pZ2h0CiBkaXN0cmlidXRlIHRoZSBhcHBsaWNhdGlvbiB0byB1c2VycyBhcmUgYXMgZm9sbG93czoKIDx1bD4KLTxsaT5BbmRyb2lkIE1hcmtldC48L2xpPgotPGxpPkVuYWJsaW5nIG5vbi1tYXJrZXQgaW5zdGFsbGF0aW9uLjwvbGk+Cis8bGk+R29vZ2xlIFBsYXkuPC9saT4KKzxsaT5FbmFibGluZyBpbnN0YWxsYXRpb24gZnJvbSBhbm90aGVyIHN0b3JlLjwvbGk+CiA8bGk+RGlzdHJpYnV0aW5nIHRoZSBhcHBsaWNhdGlvbiB0aHJvdWdoIG90aGVyIG1lYW5zLCBzdWNoIGFzIGVtYWlsIG9yIHdlYnNpdGVzLjwvbGk+CiAKIDwvdWw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9kYXRhL2JhY2t1cC5qZAppbmRleCA3OWRmZDg4Li5kOTFlNDIyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZGF0YS9iYWNrdXAuamQKQEAgLTg5Miw4ICs4OTIsOCBAQAogICA8bGk+SW5zdGFsbCB5b3VyIGFwcGxpY2F0aW9uIG9uIGEgc3VpdGFibGUgQW5kcm9pZCBzeXN0ZW0gaW1hZ2UKICAgICA8dWw+CiAgICAgICA8bGk+SWYgdXNpbmcgdGhlIGVtdWxhdG9yLCBjcmVhdGUgYW5kIHVzZSBhbiBBVkQgd2l0aCBBbmRyb2lkIDIuMiAoQVBJIExldmVsIDgpLjwvbGk+Ci0gICAgICA8bGk+SWYgdXNpbmcgYSBkZXZpY2UsIHRoZSBkZXZpY2UgbXVzdCBiZSBydW5uaW5nIEFuZHJvaWQgMi4yIG9yIGdyZWF0ZXIgYW5kIGhhdmUgQW5kcm9pZAotTWFya2V0IGJ1aWx0IGluLjwvbGk+CisgICAgICA8bGk+SWYgdXNpbmcgYSBkZXZpY2UsIHRoZSBkZXZpY2UgbXVzdCBiZSBydW5uaW5nIEFuZHJvaWQgMi4yIG9yIGdyZWF0ZXIgYW5kIGhhdmUgR29vZ2xlCitQbGF5IGJ1aWx0IGluLjwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KICAgPGxpPkVuc3VyZSB0aGF0IGJhY2t1cCBpcyBlbmFibGVkCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkCmluZGV4IGQxYTM3ODYuLmE4NmQ5MDUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmpkCkBAIC0zOTIsMTMgKzM5MiwxMyBAQAogdGhhdCBsYWNrIGZlYXR1cmVzIG5lZWRlZCBieSB5b3VyIGFwcGxpY2F0aW9uLCBpdCdzIGltcG9ydGFudCB0aGF0IHlvdSBjbGVhcmx5IGRlZmluZSBhIHByb2ZpbGUgZm9yCiB0aGUgdHlwZXMgb2YgZGV2aWNlcyB5b3VyIGFwcGxpY2F0aW9uIHN1cHBvcnRzIGJ5IGRlY2xhcmluZyBkZXZpY2UgYW5kIHNvZnR3YXJlIHJlcXVpcmVtZW50cyBpbiB5b3VyCiBtYW5pZmVzdCBmaWxlLiBNb3N0IG9mIHRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgaW5mb3JtYXRpb25hbCBvbmx5IGFuZCB0aGUgc3lzdGVtIGRvZXMgbm90IHJlYWQKLXRoZW0sIGJ1dCBleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0IGRvIHJlYWQgdGhlbSBpbiBvcmRlciB0byBwcm92aWRlIGZpbHRlcmluZwordGhlbSwgYnV0IGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXkgZG8gcmVhZCB0aGVtIGluIG9yZGVyIHRvIHByb3ZpZGUgZmlsdGVyaW5nCiBmb3IgdXNlcnMgd2hlbiB0aGV5IHNlYXJjaCBmb3IgYXBwbGljYXRpb25zIGZyb20gdGhlaXIgZGV2aWNlLjwvcD4KIAogPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgYSBjYW1lcmEgYW5kIHVzZXMgQVBJcyBpbnRyb2R1Y2VkIGluIEFuZHJvaWQgMi4xICg8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L2FwaS1sZXZlbHMuaHRtbCI+QVBJIExldmVsPC9hPiA3KSwgeW91IHNob3VsZCBkZWNsYXJlIHRoZXNlIGFzCiByZXF1aXJlbWVudHMgaW4geW91ciBtYW5pZmVzdCBmaWxlLiBUaGF0IHdheSwgZGV2aWNlcyB0aGF0IGRvIDxlbT5ub3Q8L2VtPiBoYXZlIGEgY2FtZXJhIGFuZCBoYXZlIGFuCi1BbmRyb2lkIHZlcnNpb24gPGVtPmxvd2VyPC9lbT4gdGhhbiAyLjEgY2Fubm90IGluc3RhbGwgeW91ciBhcHBsaWNhdGlvbiBmcm9tIEFuZHJvaWQgTWFya2V0LjwvcD4KK0FuZHJvaWQgdmVyc2lvbiA8ZW0+bG93ZXI8L2VtPiB0aGFuIDIuMSBjYW5ub3QgaW5zdGFsbCB5b3VyIGFwcGxpY2F0aW9uIGZyb20gR29vZ2xlIFBsYXkuPC9wPgogCiA8cD5Ib3dldmVyLCB5b3UgY2FuIGFsc28gZGVjbGFyZSB0aGF0IHlvdXIgYXBwbGljYXRpb24gdXNlcyB0aGUgY2FtZXJhLCBidXQgZG9lcyBub3QKIDxlbT5yZXF1aXJlPC9lbT4gaXQuIEluIHRoYXQgY2FzZSwgeW91ciBhcHBsaWNhdGlvbiBtdXN0IHBlcmZvcm0gYSBjaGVjayBhdCBydW50aW1lIHRvIGRldGVybWluZQpAQCAtNDU4LDEyICs0NTgsMTIgQEAKIDwvZGw+CiAKIDxwPkl0J3MgaW1wb3J0YW50IHRoYXQgeW91IGRlY2xhcmUgYWxsIHN1Y2ggcmVxdWlyZW1lbnRzIGZvciB5b3VyIGFwcGxpY2F0aW9uLCBiZWNhdXNlLCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0LCBNYXJrZXQgdXNlcyB0aGVzZSBkZWNsYXJhdGlvbnMgdG8gZmlsdGVyIHdoaWNoCitkaXN0cmlidXRlIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXksIHRoZSBzdG9yZSB1c2VzIHRoZXNlIGRlY2xhcmF0aW9ucyB0byBmaWx0ZXIgd2hpY2gKIGFwcGxpY2F0aW9ucyBhcmUgYXZhaWxhYmxlIG9uIGVhY2ggZGV2aWNlLiBBcyBzdWNoLCB5b3VyIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBhdmFpbGFibGUgb25seSB0bwogZGV2aWNlcyB0aGF0IG1lZXQgYWxsIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzLjwvcD4KIAotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZXNlIChhbmQgb3RoZXIpCi1yZXF1aXJlbWVudHMsIHNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzPC9hPgorPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IEdvb2dsZSBQbGF5IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZXNlIChhbmQgb3RoZXIpCityZXF1aXJlbWVudHMsIHNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+CiBkb2N1bWVudC48L3A+CiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9ncmFwaGljcy9vcGVuZ2wuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL29wZW5nbC5qZAppbmRleCA2YTJhMjBmLi5hNzg2ZDQyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL29wZW5nbC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL2dyYXBoaWNzL29wZW5nbC5qZApAQCAtMTg5LDcgKzE4OSw3IEBACiAgICAgJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOmdsRXNWZXJzaW9uPSIweDAwMDIwMDAwIiBhbmRyb2lkOnJlcXVpcmVkPSJ0cnVlIiAvJmd0OwogPC9wcmU+CiAKLSAgPHA+QWRkaW5nIHRoaXMgZGVjbGFyYXRpb24gY2F1c2VzIHRoZSBBbmRyb2lkIE1hcmtldCB0byByZXN0cmljdCB5b3VyIGFwcGxpY2F0aW9uIGZyb20gYmVpbmcKKyAgPHA+QWRkaW5nIHRoaXMgZGVjbGFyYXRpb24gY2F1c2VzIEdvb2dsZSBQbGF5IHRvIHJlc3RyaWN0IHlvdXIgYXBwbGljYXRpb24gZnJvbSBiZWluZwogICBpbnN0YWxsZWQgb24gZGV2aWNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IE9wZW5HTCBFUyAyLjAuPC9wPgogICA8L2xpPgogICA8bGk+PHN0cm9uZz5UZXh0dXJlIGNvbXByZXNzaW9uIHJlcXVpcmVtZW50czwvc3Ryb25nPiAtIElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyB0ZXh0dXJlCkBAIC0yMDAsOSArMjAwLDkgQEAKIAogPHA+RGVjbGFyaW5nIHRleHR1cmUgY29tcHJlc3Npb24gcmVxdWlyZW1lbnRzIGluIHlvdXIgbWFuaWZlc3QgaGlkZXMgeW91ciBhcHBsaWNhdGlvbiBmcm9tIHVzZXJzCiB3aXRoIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBhdCBsZWFzdCBvbmUgb2YgeW91ciBkZWNsYXJlZCBjb21wcmVzc2lvbiB0eXBlcy4gRm9yIG1vcmUKLWluZm9ybWF0aW9uIG9uIGhvdyBBbmRyb2lkIE1hcmtldCBmaWx0ZXJpbmcgd29ya3MgZm9yIHRleHR1cmUgY29tcHJlc3Npb25zLCBzZWUgdGhlIDxhCitpbmZvcm1hdGlvbiBvbiBob3cgR29vZ2xlIFBsYXkgZmlsdGVyaW5nIHdvcmtzIGZvciB0ZXh0dXJlIGNvbXByZXNzaW9ucywgc2VlIHRoZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC9zdXBwb3J0cy1nbC10ZXh0dXJlLWVsZW1lbnQuaHRtbCNtYXJrZXQtdGV4dHVyZS1maWx0ZXJpbmciPgotQW5kcm9pZCBNYXJrZXQgYW5kIHRleHR1cmUgY29tcHJlc3Npb24gZmlsdGVyaW5nPC9hPiBzZWN0aW9uIG9mIHRoZSB7QGNvZGUKK0dvb2dsZSBQbGF5IGFuZCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZpbHRlcmluZzwvYT4gc2VjdGlvbiBvZiB0aGUge0Bjb2RlCiAmbHQ7c3VwcG9ydHMtZ2wtdGV4dHVyZSZndDt9IGRvY3VtZW50YXRpb24uPC9wPgogICA8L2xpPgogPC91bD4KQEAgLTQ3MCw3ICs0NzAsNyBAQAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gT25jZSB5b3UgZGVjaWRlIHdoaWNoIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cyB5b3VyCiBhcHBsaWNhdGlvbiB3aWxsIHN1cHBvcnQsIG1ha2Ugc3VyZSB5b3UgZGVjbGFyZSB0aGVtIGluIHlvdXIgbWFuaWZlc3QgdXNpbmcgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtZ2wtdGV4dHVyZS1lbGVtZW50Lmh0bWwiPiZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0OwotPC9hPi4gVXNpbmcgdGhpcyBkZWNsYXJhdGlvbiBlbmFibGVzIGZpbHRlcmluZyBieSBleHRlcm5hbCBzZXJ2aWNlcyBzdWNoIGFzIEFuZHJvaWQgTWFya2V0LCBzbyB0aGF0Cis8L2E+LiBVc2luZyB0aGlzIGRlY2xhcmF0aW9uIGVuYWJsZXMgZmlsdGVyaW5nIGJ5IGV4dGVybmFsIHNlcnZpY2VzIHN1Y2ggYXMgR29vZ2xlIFBsYXksIHNvIHRoYXQKIHlvdXIgYXBwIGlzIGluc3RhbGxlZCBvbmx5IG9uIGRldmljZXMgdGhhdCBzdXBwb3J0IHRoZSBmb3JtYXRzIHlvdXIgYXBwIHJlcXVpcmVzLiBGb3IgZGV0YWlscywgc2VlCiA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9ncmFwaGljcy9vcGVuZ2wuaHRtbCNtYW5pZmVzdCI+T3BlbkdMIG1hbmlmZXN0IGRlY2xhcmF0aW9uczwvYT4uPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9hY3Rpdml0eS1lbGVtZW50LmpkCmluZGV4IDhiMTMxYzguLjlkYzEyNGIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvYWN0aXZpdHktZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L2FjdGl2aXR5LWVsZW1lbnQuamQKQEAgLTY3Miw3ICs2NzIsNyBAQAogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBXaGVuIHlvdSBkZWNsYXJlIG9uZSBvZiB0aGUgbGFuZHNjYXBlIG9yIHBvcnRyYWl0IHZhbHVlcywKIGl0IGlzIGNvbnNpZGVyZWQgYSBoYXJkIHJlcXVpcmVtZW50IGZvciB0aGUgb3JpZW50YXRpb24gaW4gd2hpY2ggdGhlIGFjdGl2aXR5IHJ1bnMuIEFzIHN1Y2gsCi10aGUgdmFsdWUgeW91IGRlY2xhcmUgZW5hYmxlcyBmaWx0ZXJpbmcgYnkgc2VydmljZXMgc3VjaCBhcyBBbmRyb2lkIE1hcmtldCBzbyB5b3VyIGFwcGxpY2F0aW9uIGlzCit0aGUgdmFsdWUgeW91IGRlY2xhcmUgZW5hYmxlcyBmaWx0ZXJpbmcgYnkgc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheSBzbyB5b3VyIGFwcGxpY2F0aW9uIGlzCiBhdmFpbGFibGUgb25seSB0byBkZXZpY2VzIHRoYXQgc3VwcG9ydCB0aGUgb3JpZW50YXRpb24gcmVxdWlyZWQgYnkgeW91ciBhY3Rpdml0aWVzLiBGb3IKIGV4YW1wbGUsIGlmIHlvdSBkZWNsYXJlIGVpdGhlciB7QGNvZGUgImxhbmRzY2FwZSJ9LCB7QGNvZGUgInJldmVyc2VMYW5kc2NhcGUifSwgb3IKIHtAY29kZSAic2Vuc29yTGFuZHNjYXBlIn0sIHRoZW4geW91ciBhcHBsaWNhdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBvbmx5IHRvIGRldmljZXMgdGhhdCBzdXBwb3J0CkBAIC02ODEsNyArNjgxLDcgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+e0Bjb2RlICZsdDt1c2VzLWZlYXR1cmUmZ3Q7fTwvYT4KIGVsZW1lbnQuIEZvciBleGFtcGxlLCA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlCiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuc2NyZWVuLnBvcnRyYWl0Ii8+PC9jb2RlPi4gVGhpcyBpcyBwdXJlbHkgYSBmaWx0ZXJpbmcgYmVoYXZpb3IKLXByb3ZpZGVkIGJ5IEFuZHJvaWQgTWFya2V0IChhbmQgb3RoZXIgc2VydmljZXMgdGhhdCBzdXBwb3J0IGl0KSBhbmQgdGhlIHBsYXRmb3JtIGl0c2VsZiBkb2VzIG5vdAorcHJvdmlkZWQgYnkgR29vZ2xlIFBsYXkgKGFuZCBvdGhlciBzZXJ2aWNlcyB0aGF0IHN1cHBvcnQgaXQpIGFuZCB0aGUgcGxhdGZvcm0gaXRzZWxmIGRvZXMgbm90CiBjb250cm9sIHdoZXRoZXIgeW91ciBhcHAgY2FuIGJlIGluc3RhbGxlZCB3aGVuIGEgZGV2aWNlIHN1cHBvcnRzIG9ubHkgY2VydGFpbiBvcmllbnRhdGlvbnMuPC9wPgogCiA8L2RkPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9jb21wYXRpYmxlLXNjcmVlbnMtZWxlbWVudC5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvY29tcGF0aWJsZS1zY3JlZW5zLWVsZW1lbnQuamQKaW5kZXggNWM4OTg2OS4uYTI3YzMxNiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9jb21wYXRpYmxlLXNjcmVlbnMtZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L2NvbXBhdGlibGUtc2NyZWVucy1lbGVtZW50LmpkCkBAIC0yNywxMCArMjcsMTAgQEAKIAogICA8cD5UaGUgQW5kcm9pZCBzeXN0ZW0gPGVtPmRvZXMgbm90PC9lbT4gcmVhZCB0aGUge0Bjb2RlICZsdDtjb21wYXRpYmxlLXNjcmVlbnMmZ3Q7fSBtYW5pZmVzdAogZWxlbWVudCAobmVpdGhlciBhdCBpbnN0YWxsLXRpbWUgbm9yIGF0IHJ1bnRpbWUpLiBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5IGFuZCBtYXkgYmUgdXNlZAotYnkgZXh0ZXJuYWwgc2VydmljZXMgKHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQpIHRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBhcHBsaWNhdGlvbidzIGNvbXBhdGliaWxpdHkKK2J5IGV4dGVybmFsIHNlcnZpY2VzIChzdWNoIGFzIEdvb2dsZSBQbGF5KSB0byBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgYXBwbGljYXRpb24ncyBjb21wYXRpYmlsaXR5CiB3aXRoIHNwZWNpZmljIHNjcmVlbiBjb25maWd1cmF0aW9ucyBhbmQgZW5hYmxlIGZpbHRlcmluZyBmb3IgdXNlcnMuIEFueSBzY3JlZW4gY29uZmlndXJhdGlvbiB0aGF0IGlzCiA8ZW0+bm90PC9lbT4gZGVjbGFyZWQgaW4gdGhpcyBlbGVtZW50IGlzIGEgc2NyZWVuIHdpdGggd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPgotY29tcGF0aWJsZS4gVGh1cywgZXh0ZXJuYWwgc2VydmljZXMgKHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQpIHNob3VsZCBub3QgcHJvdmlkZSB0aGUgYXBwbGljYXRpb24gdG8KK2NvbXBhdGlibGUuIFRodXMsIGV4dGVybmFsIHNlcnZpY2VzIChzdWNoIGFzIEdvb2dsZSBQbGF5KSBzaG91bGQgbm90IHByb3ZpZGUgdGhlIGFwcGxpY2F0aW9uIHRvCiBkZXZpY2VzIHdpdGggc3VjaCBzY3JlZW5zLjwvcD4KIAogICA8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBOb3JtYWxseSwgPHN0cm9uZz55b3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBtYW5pZmVzdApAQCAtNDgsMTQgKzQ4LDE0IEBACiBvbmx5IGZvciA8ZW0+bGFyZ2U8L2VtPiBhbmQgPGVtPnhsYXJnZTwvZW0+IHNjcmVlbiBkZXZpY2VzLCB0aGUgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3Qvc3VwcG9ydHMtc2NyZWVucy1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3N1cHBvcnRzLXNjcmVlbnMmZ3Q7fTwvYT4gZWxlbWVudCBhbGxvd3MgeW91IHRvIGRlY2xhcmUgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGRvZXMgbm90Ci1zdXBwb3J0IDxlbT5zbWFsbDwvZW0+IGFuZCA8ZW0+bm9ybWFsPC9lbT4gc2NyZWVuIHNpemVzLiBFeHRlcm5hbCBzZXJ2aWNlcyAoc3VjaCBhcyBBbmRyb2lkCi1NYXJrZXQpIHdpbGwgZmlsdGVyIHlvdXIgYXBwbGljYXRpb24gYWNjb3JkaW5nbHkuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIDxhCitzdXBwb3J0IDxlbT5zbWFsbDwvZW0+IGFuZCA8ZW0+bm9ybWFsPC9lbT4gc2NyZWVuIHNpemVzLiBFeHRlcm5hbCBzZXJ2aWNlcyAoc3VjaCBhcyBHb29nbGUKK1BsYXkpIHdpbGwgZmlsdGVyIHlvdXIgYXBwbGljYXRpb24gYWNjb3JkaW5nbHkuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDtzdXBwb3J0cy1zY3JlZW5zJmd0O308L2E+IGVsZW1lbnQgdG8gZGVjbGFyZSB3aGV0aGVyIHRoZSBzeXN0ZW0gc2hvdWxkIHJlc2l6ZSB5b3VyCiBhcHBsaWNhdGlvbiBmb3IgZGlmZmVyZW50IHNjcmVlbiBzaXplcy48L3A+CiAKLSAgPHA+QWxzbyBzZWUgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT4KLWRvY3VtZW50IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBbmRyb2lkIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGFuZAorICA8cD5BbHNvIHNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+Citkb2N1bWVudCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgR29vZ2xlIFBsYXkgZmlsdGVycyBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBhbmQKIG90aGVyIG1hbmlmZXN0IGVsZW1lbnRzLjwvcD4KIAogPC9kZD4KQEAgLTEzOCw1ICsxMzgsNSBAQAogPGR0PnNlZSBhbHNvOjwvZHQ+CiA8ZGQ+PGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwiPlN1cHBvcnRpbmcgTXVsdGlwbGUgU2NyZWVuczwvYT48L2RkPgotPGRkPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT48L2RkPgorPGRkPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPjwvZGQ+CiA8L2RsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9tYW5pZmVzdC1lbGVtZW50LmpkCmluZGV4IGM5NzBjNzIuLjk3ODg5NDUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L21hbmlmZXN0LWVsZW1lbnQuamQKQEAgLTE1MCw5ICsxNTAsOSBAQAogPC90cj4KIDwvdGFibGU+CiAKLTxwIGNsYXNzPSJjYXV0aW9uIj48c3Ryb25nPkNhdXRpb246PC9zdHJvbmc+IElmIHlvdXIgYXBwbGljYXRpb24gdXNlcyB0aGUgQW5kcm9pZCBNYXJrZXQncyBDb3B5IAotICBQcm90ZWN0aW9uIGZlYXR1cmUsIGl0IGNhbm5vdCBiZSBpbnN0YWxsZWQgdG8gYSBkZXZpY2UncyBTRCBjYXJkLiBIb3dldmVyLCBpZiB5b3UgdXNlIEFuZHJvaWQgCi0gIE1hcmtldCdzIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nL2luZGV4Lmh0bWwiPkFwcGxpY2F0aW9uIExpY2Vuc2luZzwvYT4gaW5zdGVhZCwgCis8cCBjbGFzcz0iY2F1dGlvbiI+PHN0cm9uZz5DYXV0aW9uOjwvc3Ryb25nPiBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgR29vZ2xlIFBsYXkncyBDb3B5IAorICBQcm90ZWN0aW9uIGZlYXR1cmUsIGl0IGNhbm5vdCBiZSBpbnN0YWxsZWQgdG8gYSBkZXZpY2UncyBTRCBjYXJkLiBIb3dldmVyLCBpZiB5b3UgdXNlIEdvb2dsZSAKKyAgUGxheSdzIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9tYXJrZXQvbGljZW5zaW5nLmh0bWwiPkFwcGxpY2F0aW9uIExpY2Vuc2luZzwvYT4gaW5zdGVhZCwgCiAgIHlvdXIgYXBwbGljYXRpb24gPGVtPmNhbjwvZW0+IGJlIGluc3RhbGxlZCB0byBpbnRlcm5hbCBvciBleHRlcm5hbCBzdG9yYWdlLCBpbmNsdWRpbmcgU0QgY2FyZHMuPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBCeSBkZWZhdWx0LCB5b3VyIGFwcGxpY2F0aW9uIHdpbGwgYmUgaW5zdGFsbGVkIG9uIHRoZQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9zdXBwb3J0cy1nbC10ZXh0dXJlLWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLWdsLXRleHR1cmUtZWxlbWVudC5qZAppbmRleCA2YzRhMDVhLi5lYmRkMGIxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLWdsLXRleHR1cmUtZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLWdsLXRleHR1cmUtZWxlbWVudC5qZApAQCAtMTgsMjAgKzE4LDIwIEBACiAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIj4KICAgPGltZyBpZD0icnVsZSIgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9ncmFkLXJ1bGUtcXYucG5nIj4KICAgPGRpdiBpZD0icXYtc3ViLXJ1bGUiPgotICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciCiAgICAgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjA7cGFkZGluZzowOyI+Ci0gICAgPHAgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij5BbmRyb2lkIE1hcmtldCBhbmQgPGNvZGUKKyAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTtwYWRkaW5nLXRvcDoxZW07Ij5Hb29nbGUgUGxheSBhbmQgPGNvZGUKICAgICBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPiZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0OzwvY29kZT4gZWxlbWVudHM8L3A+Ci0gICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgYWNjb3JkaW5nCisgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+R29vZ2xlIFBsYXkgZmlsdGVycyBhcHBsaWNhdGlvbnMgYWNjb3JkaW5nCiAgICAgdG8gdGhlIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cyB0aGF0IHRoZXkgc3VwcG9ydCwgdG8gZW5zdXJlIHRoYXQKICAgICB0aGV5IGNhbiBiZSBpbnN0YWxsZWQgb25seSBvbiBkZXZpY2VzIHRoYXQgY2FuIGhhbmRsZSB0aGVpciB0ZXh0dXJlcwogICAgIHByb3Blcmx5LiBEZXZlbG9wZXJzIGNhbiB1c2UgdGV4dHVyZSBjb21wcmVzc2lvbiBmaWx0ZXJpbmcKICAgICBhcyBhIHdheSBvZiB0YXJnZXRpbmcgc3BlY2lmaWMgZGV2aWNlIHR5cGVzLCBiYXNlZCBvbiBHUFUgcGxhdGZvcm0uPC9wPgogICAgIAogICAgIDxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiIGNsYXNzPSJjYXV0aW9uIj5Gb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uIGFib3V0IGhvdwotICAgIEFuZHJvaWQgTWFya2V0IHVzZXMgPGNvZGU+Jmx0O3N1cHBvcnRzLWdsLXRleHR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcwotICAgIHRoZSBiYXNpcyBmb3IgZmlsdGVyaW5nLCBwbGVhc2UgcmVhZCA8YSBocmVmPSIjbWFya2V0LXRleHR1cmUtZmlsdGVyaW5nIj5BbmRyb2lkCi0gICAgTWFya2V0IGFuZCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZpbHRlcmluZzwvYT4sIGJlbG93LjwvcD4KKyAgICBHb29nbGUgUGxheSB1c2VzIDxjb2RlPiZsdDtzdXBwb3J0cy1nbC10ZXh0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMgYXMKKyAgICB0aGUgYmFzaXMgZm9yIGZpbHRlcmluZywgcGxlYXNlIHJlYWQgPGEgaHJlZj0iI21hcmtldC10ZXh0dXJlLWZpbHRlcmluZyI+R29vZ2xlCisgICAgUGxheSBhbmQgdGV4dHVyZSBjb21wcmVzc2lvbiBmaWx0ZXJpbmc8L2E+LCBiZWxvdy48L3A+CiA8L2Rpdj4gCiA8L2Rpdj4KIApAQCAtNTcsNyArNTcsNyBAQAogPHA+RGVjbGFyZWQgPGNvZGU+Jmx0O3N1cHBvcnRzLWdsLXRleHR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgaW5mb3JtYXRpb25hbCwKIG1lYW5pbmcgdGhhdCB0aGUgQW5kcm9pZCBzeXN0ZW0gaXRzZWxmIGRvZXMgbm90IGV4YW1pbmUgdGhlIGVsZW1lbnRzIGF0IGluc3RhbGwKIHRpbWUgdG8gZW5zdXJlIG1hdGNoaW5nIHN1cHBvcnQgb24gdGhlIGRldmljZS4gSG93ZXZlciwgb3RoZXIgc2VydmljZXMKLShzdWNoIGFzIEFuZHJvaWQgTWFya2V0KSBvciBhcHBsaWNhdGlvbnMgY2FuIGNoZWNrIHlvdXIgYXBwbGljYXRpb24ncworKHN1Y2ggYXMgR29vZ2xlIFBsYXkpIG9yIGFwcGxpY2F0aW9ucyBjYW4gY2hlY2sgeW91ciBhcHBsaWNhdGlvbidzCiA8Y29kZT4mbHQ7c3VwcG9ydHMtZ2wtdGV4dHVyZSZndDs8L2NvZGU+IGRlY2xhcmF0aW9ucyBhcyBwYXJ0IG9mIGhhbmRsaW5nIG9yCiBpbnRlcmFjdGluZyB3aXRoIHlvdXIgYXBwbGljYXRpb24uIEZvciB0aGlzIHJlYXNvbiwgaXQncyB2ZXJ5IGltcG9ydGFudCB0aGF0CiB5b3UgZGVjbGFyZSBhbGwgb2YgdGhlIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cyAoZnJvbSB0aGUgbGlzdCBiZWxvdykgdGhhdApAQCAtMTQxLDIwICsxNDEsMjAgQEAKIDxkdD5zZWUgYWxzbzo8L2R0PgogPGRkPgogICA8dWw+Ci0gICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5BbmRyb2lkIE1hcmtldCBGaWx0ZXJzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiAgIDwvdWw+CiA8L2RkPgogCi08aDIgaWQ9Im1hcmtldC10ZXh0dXJlLWZpbHRlcmluZyI+QW5kcm9pZCBNYXJrZXQgYW5kIHRleHR1cmUgY29tcHJlc3Npb24gZmlsdGVyaW5nPC9oMj4KKzxoMiBpZD0ibWFya2V0LXRleHR1cmUtZmlsdGVyaW5nIj5Hb29nbGUgUGxheSBhbmQgdGV4dHVyZSBjb21wcmVzc2lvbiBmaWx0ZXJpbmc8L2gyPgogCi08cD5BbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZSB0byB1c2Vycywgc28gdGhhdAorPHA+R29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvIHRoYXQKIHVzZXJzIGNhbiBzZWUgYW5kIGRvd25sb2FkIG9ubHkgdGhvc2UgYXBwbGljYXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aAotdGhlaXIgZGV2aWNlcy4gT25lIG9mIHRoZSB3YXlzIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieSB0ZXh0dXJlCit0aGVpciBkZXZpY2VzLiBPbmUgb2YgdGhlIHdheXMgaXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgaXMgYnkgdGV4dHVyZQogY29tcHJlc3Npb24gY29tcGF0aWJpbGl0eSwgZ2l2aW5nIHlvdSBjb250cm9sIG92ZXIgdGhlIGF2YWlsYWJpbGl0eSBvZiB5b3VyCiBhcHBsaWNhdGlvbiB0byB2YXJpb3VzIGRldmljZXMsIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlaXIgR1BVcy48L3A+CiAKIDxwPlRvIGRldGVybWluZSBhbiBhcHBsaWNhdGlvbidzIHRleHR1cmUgY29tcHJlc3Npb24gY29tcGF0aWJpbGl0eSB3aXRoIGEgZ2l2ZW4KLXVzZXIncyBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IGNvbXBhcmVzOjwvcD4KK3VzZXIncyBkZXZpY2UsIEdvb2dsZSBQbGF5IGNvbXBhcmVzOjwvcD4KIAogPHVsPgogPGxpPlRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uICZtZGFzaDsKQEAgLTE2NCwyNiArMTY0LDI2IEBACiBhIGRldmljZSByZXBvcnRzIHRoZSBmb3JtYXRzIGl0IHN1cHBvcnRzIGFzIHJlYWQtb25seSBzeXN0ZW0gcHJvcGVydGllcy48L2xpPgogPC91bD4KIAotPHA+RWFjaCB0aW1lIHlvdSB1cGxvYWQgYW4gYXBwbGljYXRpb24gdG8gdGhlIEFuZHJvaWQgTWFya2V0IFB1Ymxpc2hlciBTaXRlLAotQW5kcm9pZCBNYXJrZXQgc2NhbnMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZSBhbmQgbG9va3MgZm9yIGFueQorPHA+RWFjaCB0aW1lIHlvdSB1cGxvYWQgYW4gYXBwbGljYXRpb24gdG8gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlLAorR29vZ2xlIFBsYXkgc2NhbnMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZSBhbmQgbG9va3MgZm9yIGFueQogPGNvZGU+Jmx0O3N1cHBvcnRzLWdsLXRleHR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSXQgZXh0cmFjdHMgdGhlCiBmb3JtYXQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgZWxlbWVudHMgYW5kIHN0b3JlcyB0aGVtIGludGVybmFsbHkgYXMKIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gPGNvZGU+LmFwazwvY29kZT4gYW5kIHRoZSBhcHBsaWNhdGlvbgogdmVyc2lvbi4gPC9wPgogCi08cD5XaGVuIGEgdXNlciBzZWFyY2hlcyBvciBicm93c2VzIGZvciBhcHBsaWNhdGlvbnMgb24gQW5kcm9pZCBNYXJrZXQsCis8cD5XaGVuIGEgdXNlciBzZWFyY2hlcyBvciBicm93c2VzIGZvciBhcHBsaWNhdGlvbnMgb24gR29vZ2xlIFBsYXksCiB0aGUgc2VydmljZSBjb21wYXJlcyB0aGUgdGV4dHVyZSBjb21wcmVzc2lvbiBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgYXBwbGljYXRpb24KIHdpdGggdGhvc2Ugc3VwcG9ydGVkIGJ5IHRoZSB1c2VyJ3MgZGV2aWNlLiBUaGUgY29tcGFyaXNvbiBpcyBiYXNlZCBvbiB0aGUgZm9ybWF0CiBkZXNjcmlwdG9yIHN0cmluZ3MgYW5kIGEgbWF0Y2ggbXVzdCBiZSBleGFjdC48L3A+CiAKIDxwPklmIDxlbT5hbnk8L2VtPiBvZiBhbiBhcHBsaWNhdGlvbidzIHN1cHBvcnRlZCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZvcm1hdHMgaXMKLWFsc28gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCithbHNvIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCBHb29nbGUgUGxheSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlIHRoZQogYXBwbGljYXRpb24gYW5kIHBvdGVudGlhbGx5IGRvd25sb2FkIGl0LiBPdGhlcndpc2UsIGlmIG5vbmUgb2YgdGhlIGFwcGxpY2F0aW9uJ3MKLWZvcm1hdHMgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9uIHNvCitmb3JtYXRzIGlzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCBHb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBzbwogdGhhdCBpdCBpcyBub3QgYXZhaWxhYmxlIGZvciBkb3dubG9hZC4gPC9wPgogCiA8cD5JZiBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBkZWNsYXJlIGFueSA8Y29kZT4mbHQ7c3VwcG9ydHMtZ2wtdGV4dHVyZSZndDs8L2NvZGU+IGVsZW1lbnRzLAotQW5kcm9pZCBNYXJrZXQgZG9lcyBub3QgYXBwbHkgYW55IGZpbHRlcmluZyBiYXNlZCBvbiBHTCB0ZXh0dXJlIGNvbXByZXNzaW9uIGZvcm1hdC48L3A+CitHb29nbGUgUGxheSBkb2VzIG5vdCBhcHBseSBhbnkgZmlsdGVyaW5nIGJhc2VkIG9uIEdMIHRleHR1cmUgY29tcHJlc3Npb24gZm9ybWF0LjwvcD4KIAogPC9kbD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC9zdXBwb3J0cy1zY3JlZW5zLWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5qZAppbmRleCA4MWQ2ZTI3Li5hZTE0MTIxIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3N1cHBvcnRzLXNjcmVlbnMtZWxlbWVudC5qZApAQCAtODAsNyArODAsNyBAQAogICAgICBBIHNtYWxsIHNjcmVlbiBpcyBkZWZpbmVkIGFzIG9uZSB3aXRoIGEgc21hbGxlciBhc3BlY3QgcmF0aW8gdGhhbgogICAgICB0aGUgIm5vcm1hbCIgKHRyYWRpdGlvbmFsIEhWR0EpIHNjcmVlbi4gIEFuIGFwcGxpY2F0aW9uIHRoYXQgZG9lcwogICAgICBub3Qgc3VwcG9ydCBzbWFsbCBzY3JlZW5zIDxlbT53aWxsIG5vdCBiZSBhdmFpbGFibGU8L2VtPiBmb3IKLSAgICAgc21hbGwgc2NyZWVuIGRldmljZXMgZnJvbSBleHRlcm5hbCBzZXJ2aWNlcyAoc3VjaCBhcyBBbmRyb2lkIE1hcmtldCksIGJlY2F1c2UgdGhlcmUgaXMgbGl0dGxlCisgICAgIHNtYWxsIHNjcmVlbiBkZXZpY2VzIGZyb20gZXh0ZXJuYWwgc2VydmljZXMgKHN1Y2ggYXMgR29vZ2xlIFBsYXkpLCBiZWNhdXNlIHRoZXJlIGlzIGxpdHRsZQogdGhlIHBsYXRmb3JtIGNhbiBkbyB0byBtYWtlIHN1Y2ggYW4gYXBwbGljYXRpb24gd29yayBvbiBhIHNtYWxsZXIgc2NyZWVuLiBUaGlzIGlzIHtAY29kZSAidHJ1ZSJ9IGJ5CiBkZWZhdWx0LgogICA8L2RkPgpAQCAtMTU2LDggKzE1Niw4IEBACiAKICAgPHAgY2xhc3M9ImNhdXRpb24iPjxzdHJvbmc+Q2F1dGlvbjo8L3N0cm9uZz4gVGhlIEFuZHJvaWQgc3lzdGVtIGRvZXMgbm90IHBheSBhdHRlbnRpb24gdG8gdGhpcwogYXR0cmlidXRlLCBzbyBpdCBkb2VzIG5vdCBhZmZlY3QgaG93IHlvdXIgYXBwbGljYXRpb24gYmVoYXZlcyBhdCBydW50aW1lLiBJbnN0ZWFkLCBpdCBpcyB1c2VkCi10byBlbmFibGUgZmlsdGVyaW5nIGZvciB5b3VyIGFwcGxpY2F0aW9uIG9uIHNlcnZpY2VzIHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQuIEhvd2V2ZXIsCi08c3Ryb25nPkFuZHJvaWQgTWFya2V0IGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYXR0cmlidXRlIGZvciBmaWx0ZXJpbmc8L3N0cm9uZz4gKG9uIEFuZHJvaWQKK3RvIGVuYWJsZSBmaWx0ZXJpbmcgZm9yIHlvdXIgYXBwbGljYXRpb24gb24gc2VydmljZXMgc3VjaCBhcyBHb29nbGUgUGxheS4gSG93ZXZlciwKKzxzdHJvbmc+R29vZ2xlIFBsYXkgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBhdHRyaWJ1dGUgZm9yIGZpbHRlcmluZzwvc3Ryb25nPiAob24gQW5kcm9pZAogMy4yKSwgc28geW91IHNob3VsZCBjb250aW51ZSB1c2luZyB0aGUgb3RoZXIgc2l6ZSBhdHRyaWJ1dGVzIGlmIHlvdXIgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcG9ydAogc21hbGwgc2NyZWVucy48L3A+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50LmpkCmluZGV4IDlmODA2MzguLjkxNzU1NjYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5qZApAQCAtOSw3ICs5LDcgQEAKIAogPGgyPkluIHRoaXMgZG9jdW1lbnQ8L2gyPgogPG9sPgotICA8bGk+PGEgaHJlZj0iI21hcmtldC1mZWF0dXJlLWZpbHRlcmluZyI+QW5kcm9pZCBNYXJrZXQgYW5kIEZlYXR1cmUtQmFzZWQgRmlsdGVyaW5nPC9hPgorICA8bGk+PGEgaHJlZj0iI21hcmtldC1mZWF0dXJlLWZpbHRlcmluZyI+R29vZ2xlIFBsYXkgYW5kIEZlYXR1cmUtQmFzZWQgRmlsdGVyaW5nPC9hPgogICAgIDxvbD4KICAgICAgIDxsaT48YSBocmVmPSIjZGVjbGFyZWQiPkZpbHRlcmluZyBiYXNlZCBvbiBleHBsaWNpdGx5IGRlY2xhcmVkIGZlYXR1cmVzPC9hPjwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iI2ltcGxpY2l0Ij5GaWx0ZXJpbmcgYmFzZWQgb24gaW1wbGljaXQgZmVhdHVyZXM8L2E+PC9saT4KQEAgLTQ1LDI2ICs0NSwyNiBAQAogIDxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+IAogICA8aW1nIGlkPSJydWxlIiBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmciPiAKICAgPGRpdiBpZD0icXYtc3ViLXJ1bGUiPiAKLSAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjA7Ij4gCi0gICAgPHAgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij5BbmRyb2lkIE1hcmtldCBhbmQgPGNvZGUgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHM8L3A+Ci0gICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvCisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKKyAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTtwYWRkaW5nLXRvcDoxZW07Ij5Hb29nbGUgUGxheSBhbmQgPGNvZGUgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHM8L3A+CisgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+R29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb25zIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMsIHNvCiB0aGF0IHVzZXJzIGNhbiBzZWUgYW5kIGRvd25sb2FkIG9ubHkgdGhvc2UgYXBwbGljYXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGVpcgotZGV2aWNlcy4gT25lIG9mIHRoZSB3YXlzIE1hcmtldCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieSBmZWF0dXJlIGNvbXBhdGliaWxpdHkuPC9wPgorZGV2aWNlcy4gT25lIG9mIHRoZSB3YXlzIGl0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5IGZlYXR1cmUgY29tcGF0aWJpbGl0eS48L3A+CiAKLTxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiPlRvIGRvIHRoaXMsIE1hcmtldCBjaGVja3MgdGhlCis8cCBzdHlsZT0ibWFyZ2luLXRvcDoxZW07Ij5UbyBkbyB0aGlzLCBHb29nbGUgUGxheSBjaGVja3MgdGhlCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMgaW4gZWFjaCBhcHBsaWNhdGlvbidzIG1hbmlmZXN0LCB0bwotZXN0YWJsaXNoIHRoZSBhcHAncyBmZWF0dXJlIG5lZWRzLiBNYXJrZXQgdGhlbiBzaG93cyBvciBoaWRlcyB0aGUgYXBwbGljYXRpb24gdG8KK2VzdGFibGlzaCB0aGUgYXBwJ3MgZmVhdHVyZSBuZWVkcy4gR29vZ2xlIFBsYXkgdGhlbiBzaG93cyBvciBoaWRlcyB0aGUgYXBwbGljYXRpb24gdG8KIGVhY2ggdXNlciwgYmFzZWQgb24gYSBjb21wYXJpc29uIHdpdGggdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBvbiB0aGUgdXNlcidzCiBkZXZpY2UuIDwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+Qnkgc3BlY2lmeWluZyB0aGUgZmVhdHVyZXMgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzLAoteW91IGVuYWJsZSBBbmRyb2lkIE1hcmtldCB0byBwcmVzZW50IHlvdXIgYXBwbGljYXRpb24gb25seSB0byB1c2VycyB3aG9zZQoreW91IGVuYWJsZSBHb29nbGUgUGxheSB0byBwcmVzZW50IHlvdXIgYXBwbGljYXRpb24gb25seSB0byB1c2VycyB3aG9zZQogZGV2aWNlcyBtZWV0IHRoZSBhcHBsaWNhdGlvbidzIGZlYXR1cmUgcmVxdWlyZW1lbnRzLCByYXRoZXIgdGhhbiBwcmVzZW50aW5nIGl0CiB0byBhbGwgdXNlcnMuIDwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyIgY2xhc3M9ImNhdXRpb24iPkZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb24gYWJvdXQgaG93Ci1BbmRyb2lkIE1hcmtldCB1c2VzIGZlYXR1cmVzIGFzIHRoZSBiYXNpcyBmb3IgZmlsdGVyaW5nLCBwbGVhc2UgcmVhZCA8YQotaHJlZj0iI21hcmtldC1mZWF0dXJlLWZpbHRlcmluZyI+QW5kcm9pZCBNYXJrZXQgYW5kIEZlYXR1cmUtQmFzZWQgRmlsdGVyaW5nPC9hPiwKK0dvb2dsZSBQbGF5IHVzZXMgZmVhdHVyZXMgYXMgdGhlIGJhc2lzIGZvciBmaWx0ZXJpbmcsIHBsZWFzZSByZWFkIDxhCitocmVmPSIjbWFya2V0LWZlYXR1cmUtZmlsdGVyaW5nIj5Hb29nbGUgUGxheSBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2E+LAogYmVsb3cuPC9wPgogPC9kaXY+CiA8L2Rpdj4KQEAgLTEwNiw3ICsxMDYsNyBAQAogPHA+RGVjbGFyZWQgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZT48L2NvZGU+IGVsZW1lbnRzIGFyZSBpbmZvcm1hdGlvbmFsIG9ubHksIG1lYW5pbmcKIHRoYXQgdGhlIEFuZHJvaWQgc3lzdGVtIGl0c2VsZiBkb2VzIG5vdCBjaGVjayBmb3IgbWF0Y2hpbmcgZmVhdHVyZSBzdXBwb3J0IG9uCiB0aGUgZGV2aWNlIGJlZm9yZSBpbnN0YWxsaW5nIGFuIGFwcGxpY2F0aW9uLiBIb3dldmVyLCBvdGhlciBzZXJ2aWNlcwotKHN1Y2ggYXMgQW5kcm9pZCBNYXJrZXQpIG9yIGFwcGxpY2F0aW9ucyBtYXkgY2hlY2sgeW91ciBhcHBsaWNhdGlvbidzIAorKHN1Y2ggYXMgR29vZ2xlIFBsYXkpIG9yIGFwcGxpY2F0aW9ucyBtYXkgY2hlY2sgeW91ciBhcHBsaWNhdGlvbidzIAogPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZT48L2NvZGU+IGRlY2xhcmF0aW9ucyBhcyBwYXJ0IG9mIGhhbmRsaW5nIG9yIGludGVyYWN0aW5nCiB3aXRoIHlvdXIgYXBwbGljYXRpb24uIEZvciB0aGlzIHJlYXNvbiwgaXQncyB2ZXJ5IGltcG9ydGFudCB0aGF0IHlvdSBkZWNsYXJlIGFsbCBvZgogdGhlIGZlYXR1cmVzIChmcm9tIHRoZSBsaXN0IGJlbG93KSB0aGF0IHlvdXIgYXBwbGljYXRpb24gdXNlcy4gPC9wPgpAQCAtMjA3LDIyICsyMDcsMjIgQEAKICAgICA8bGk+e0BsaW5rIGFuZHJvaWQuY29udGVudC5wbS5GZWF0dXJlSW5mb308L2xpPgogICAgIDxsaT57QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLkNvbmZpZ3VyYXRpb25JbmZvfTwvbGk+CiAgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1wZXJtaXNzaW9uLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+PC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5BbmRyb2lkIE1hcmtldCBGaWx0ZXJzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPjwvbGk+CiAgIDwvdWw+CiA8L2RkPgogCiA8L2RsPgogCiAKLTxoMiBpZD0ibWFya2V0LWZlYXR1cmUtZmlsdGVyaW5nIj5BbmRyb2lkIE1hcmtldCBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2gyPgorPGgyIGlkPSJtYXJrZXQtZmVhdHVyZS1maWx0ZXJpbmciPkdvb2dsZSBQbGF5IGFuZCBGZWF0dXJlLUJhc2VkIEZpbHRlcmluZzwvaDI+CiAKLTxwPkFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbyB0aGF0Cis8cD5Hb29nbGUgUGxheSBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgdmlzaWJsZSB0byB1c2Vycywgc28gdGhhdAogdXNlcnMgY2FuIHNlZSBhbmQgZG93bmxvYWQgb25seSB0aG9zZSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoCi10aGVpciBkZXZpY2VzLiBPbmUgb2YgdGhlIHdheXMgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5IGZlYXR1cmUKK3RoZWlyIGRldmljZXMuIE9uZSBvZiB0aGUgd2F5cyBpdCBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBpcyBieSBmZWF0dXJlCiBjb21wYXRpYmlsaXR5LjwvcD4KIAogPHA+VG8gZGV0ZXJtaW5lIGFuIGFwcGxpY2F0aW9uJ3MgZmVhdHVyZSBjb21wYXRpYmlsaXR5IHdpdGggYSBnaXZlbiB1c2VyJ3MKLWRldmljZSwgdGhlIEFuZHJvaWQgTWFya2V0IHNlcnZpY2UgY29tcGFyZXM6PC9wPgorZGV2aWNlLCBHb29nbGUgUGxheSBjb21wYXJlczo8L3A+CiAKIDx1bD4KIDxsaT5GZWF0dXJlcyByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gJm1kYXNoOyBhbiBhcHBsaWNhdGlvbiBkZWNsYXJlcyBmZWF0dXJlcyBpbgpAQCAtMjM4LDE0ICsyMzgsMTQgQEAKIHRoZSBib3R0b20gb2YgdGhpcyBkb2N1bWVudCwgYW5kIGluIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciB7QGxpbmsKIGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcn0uPC9wPgogCi08cD5XaGVuIHRoZSB1c2VyIGxhdW5jaGVzIHRoZSBNYXJrZXQgYXBwbGljYXRpb24sIHRoZSBhcHBsaWNhdGlvbiBxdWVyaWVzIHRoZQorPHA+V2hlbiB0aGUgdXNlciBsYXVuY2hlcyBHb29nbGUgUGxheSwgdGhlIGFwcGxpY2F0aW9uIHF1ZXJpZXMgdGhlCiBQYWNrYWdlIE1hbmFnZXIgZm9yIHRoZSBsaXN0IG9mIGZlYXR1cmVzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIGJ5IGNhbGxpbmcKIHtAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIjZ2V0U3lzdGVtQXZhaWxhYmxlRmVhdHVyZXMoKX0uIFRoZQotTWFya2V0IGFwcGxpY2F0aW9uIHRoZW4gcGFzc2VzIHRoZSBmZWF0dXJlcyBsaXN0IHVwIHRvIHRoZSBBbmRyb2lkIE1hcmtldAotc2VydmljZSB3aGVuIGVzdGFibGlzaGluZyB0aGUgc2Vzc2lvbiBmb3IgdGhlIHVzZXIuPC9wPgorU3RvcmUgYXBwbGljYXRpb24gdGhlbiBwYXNzZXMgdGhlIGZlYXR1cmVzIGxpc3QgdXAgdG8gR29vZ2xlIFBsYXkKK3doZW4gZXN0YWJsaXNoaW5nIHRoZSBzZXNzaW9uIGZvciB0aGUgdXNlci48L3A+CiAKLTxwPkVhY2ggdGltZSB5b3UgdXBsb2FkIGFuIGFwcGxpY2F0aW9uIHRvIHRoZSBBbmRyb2lkIE1hcmtldCBQdWJsaXNoZXIgU2l0ZSwKLUFuZHJvaWQgTWFya2V0IHNjYW5zIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0IGZpbGUuIEl0IGxvb2tzIGZvcgorPHA+RWFjaCB0aW1lIHlvdSB1cGxvYWQgYW4gYXBwbGljYXRpb24gdG8gdGhlIEdvb2dsZSBQbGF5IHB1Ymxpc2hlciBzaXRlLAorR29vZ2xlIFBsYXkgc2NhbnMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgZmlsZS4gSXQgbG9va3MgZm9yCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMgYW5kIGV2YWx1YXRlcyB0aGVtIGluIGNvbWJpbmF0aW9uCiB3aXRoIG90aGVyIGVsZW1lbnRzLCBpbiBzb21lIGNhc2VzLCBzdWNoIGFzIDxjb2RlPiZsdDt1c2VzLXNkayZndDs8L2NvZGU+IGFuZAogPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnRzLiBBZnRlciBlc3RhYmxpc2hpbmcgdGhlCkBAIC0yNTMsMTcgKzI1MywxNyBAQAogbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbiA8Y29kZT4uYXBrPC9jb2RlPiBhbmQgdGhlIGFwcGxpY2F0aW9uCiB2ZXJzaW9uLiA8L3A+CiAKLTxwPldoZW4gYSB1c2VyIHNlYXJjaGVzIG9yIGJyb3dzZXMgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgQW5kcm9pZCBNYXJrZXQKKzxwPldoZW4gYSB1c2VyIHNlYXJjaGVzIG9yIGJyb3dzZXMgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgR29vZ2xlIFBsYXkKIGFwcGxpY2F0aW9uLCB0aGUgc2VydmljZSBjb21wYXJlcyB0aGUgZmVhdHVyZXMgbmVlZGVkIGJ5IGVhY2ggYXBwbGljYXRpb24gd2l0aAogdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBvbiB0aGUgdXNlcidzIGRldmljZS4gSWYgYWxsIG9mIGFuIGFwcGxpY2F0aW9uJ3MgcmVxdWlyZWQKLWZlYXR1cmVzIGFyZSBwcmVzZW50IG9uIHRoZSBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IGFsbG93cyB0aGUgdXNlciB0byBzZWUgdGhlCitmZWF0dXJlcyBhcmUgcHJlc2VudCBvbiB0aGUgZGV2aWNlLCBHb29nbGUgUGxheSBhbGxvd3MgdGhlIHVzZXIgdG8gc2VlIHRoZQogYXBwbGljYXRpb24gYW5kIHBvdGVudGlhbGx5IGRvd25sb2FkIGl0LiBJZiBhbnkgcmVxdWlyZWQgZmVhdHVyZSBpcyBub3QKLXN1cHBvcnRlZCBieSB0aGUgZGV2aWNlLCBBbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHRoZSBhcHBsaWNhdGlvbiBzbyB0aGF0IGl0IGlzCitzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSwgR29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gc28gdGhhdCBpdCBpcwogbm90IHZpc2libGUgdG8gdGhlIHVzZXIgYW5kIG5vdCBhdmFpbGFibGUgZm9yIGRvd25sb2FkLiA8L3A+CiAKIDxwPkJlY2F1c2UgdGhlIGZlYXR1cmVzIHlvdSBkZWNsYXJlIGluIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPgotZWxlbWVudHMgZGlyZWN0bHkgYWZmZWN0IGhvdyBBbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHlvdXIgYXBwbGljYXRpb24sIGl0J3MKLWltcG9ydGFudCB0byB1bmRlcnN0YW5kIGhvdyBBbmRyb2lkIE1hcmtldCBldmFsdWF0ZXMgdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QKK2VsZW1lbnRzIGRpcmVjdGx5IGFmZmVjdCBob3cgR29vZ2xlIFBsYXkgZmlsdGVycyB5b3VyIGFwcGxpY2F0aW9uLCBpdCdzCitpbXBvcnRhbnQgdG8gdW5kZXJzdGFuZCBob3cgR29vZ2xlIFBsYXkgZXZhbHVhdGVzIHRoZSBhcHBsaWNhdGlvbidzIG1hbmlmZXN0CiBhbmQgZXN0YWJsaXNoZXMgdGhlIHNldCBvZiByZXF1aXJlZCBmZWF0dXJlcy4gVGhlIHNlY3Rpb25zIGJlbG93IHByb3ZpZGUgbW9yZQogaW5mb3JtYXRpb24uIDwvcD4KIApAQCAtMjc3LDM1ICsyNzcsMzUgQEAKIGl0ICg8Y29kZT4idHJ1ZSI8L2NvZGU+KSwgb3Igd2hldGhlciB0aGUgYXBwbGljYXRpb24gcHJlZmVycyB0byB1c2UgdGhlIGZlYXR1cmUKIGlmIGF2YWlsYWJsZSwgYnV0IGlzIGRlc2lnbmVkIHRvIHJ1biB3aXRob3V0IGl0ICg8Y29kZT4iZmFsc2UiPC9jb2RlPikuPC9wPgogCi08cD5BbmRyb2lkIE1hcmtldCBoYW5kbGVzIGV4cGxpY2l0bHkgZGVjbGFyZWQgZmVhdHVyZXMgaW4gdGhpcyB3YXk6IDwvcD4KKzxwPkdvb2dsZSBQbGF5IGhhbmRsZXMgZXhwbGljaXRseSBkZWNsYXJlZCBmZWF0dXJlcyBpbiB0aGlzIHdheTogPC9wPgogCiA8dWw+Ci08bGk+SWYgYSBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYXMgYmVpbmcgcmVxdWlyZWQsIEFuZHJvaWQgTWFya2V0IGFkZHMKKzxsaT5JZiBhIGZlYXR1cmUgaXMgZXhwbGljaXRseSBkZWNsYXJlZCBhcyBiZWluZyByZXF1aXJlZCwgR29vZ2xlIFBsYXkgYWRkcwogdGhlIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgZmVhdHVyZXMgZm9yIHRoZSBhcHBsaWNhdGlvbi4gSXQgdGhlbgogZmlsdGVycyB0aGUgYXBwbGljYXRpb24gZnJvbSB1c2VycyBvbiBkZXZpY2VzIHRoYXQgZG8gbm90IHByb3ZpZGUgdGhhdCBmZWF0dXJlLgogRm9yIGV4YW1wbGU6CiA8cHJlPiZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYSIgYW5kcm9pZDpyZXF1aXJlZD0idHJ1ZSIgLyZndDs8L3ByZT48L2xpPgotPGxpPklmIGEgZmVhdHVyZSBpcyBleHBsaWNpdGx5IGRlY2xhcmVkIGFzIDxlbT5ub3Q8L2VtPiBiZWluZyByZXF1aXJlZCwgQW5kcm9pZAotTWFya2V0IDxlbT5kb2VzIG5vdDwvZW0+IGFkZCB0aGUgZmVhdHVyZSB0byB0aGUgbGlzdCBvZiByZXF1aXJlZCBmZWF0dXJlcy4gRm9yCis8bGk+SWYgYSBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQgYXMgPGVtPm5vdDwvZW0+IGJlaW5nIHJlcXVpcmVkLCBHb29nbGUKK1BsYXkgPGVtPmRvZXMgbm90PC9lbT4gYWRkIHRoZSBmZWF0dXJlIHRvIHRoZSBsaXN0IG9mIHJlcXVpcmVkIGZlYXR1cmVzLiBGb3IKIHRoYXQgcmVhc29uLCBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIG5vbi1yZXF1aXJlZCBmZWF0dXJlIGlzIG5ldmVyIGNvbnNpZGVyZWQgd2hlbgogZmlsdGVyaW5nIHRoZSBhcHBsaWNhdGlvbi4gRXZlbiBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IHByb3ZpZGUgdGhlIGRlY2xhcmVkCi1mZWF0dXJlLCBBbmRyb2lkIE1hcmtldCB3aWxsIHN0aWxsIGNvbnNpZGVyIHRoZSBhcHBsaWNhdGlvbiBjb21wYXRpYmxlIHdpdGggdGhlCitmZWF0dXJlLCBHb29nbGUgUGxheSB3aWxsIHN0aWxsIGNvbnNpZGVyIHRoZSBhcHBsaWNhdGlvbiBjb21wYXRpYmxlIHdpdGggdGhlCiBkZXZpY2UgYW5kIHdpbGwgc2hvdyBpdCB0byB0aGUgdXNlciwgdW5sZXNzIG90aGVyIGZpbHRlcmluZyBydWxlcyBhcHBseS4gRm9yCiBleGFtcGxlOgogPHByZT4mbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OzwvcHJlPjwvbGk+CiA8bGk+SWYgYSBmZWF0dXJlIGlzIGV4cGxpY2l0bHkgZGVjbGFyZWQsIGJ1dCB3aXRob3V0IGFuCi08Y29kZT5hbmRyb2lkOnJlcXVpcmVkPC9jb2RlPiBhdHRyaWJ1dGUsIEFuZHJvaWQgTWFya2V0IGFzc3VtZXMgdGhhdCB0aGUgZmVhdHVyZQorPGNvZGU+YW5kcm9pZDpyZXF1aXJlZDwvY29kZT4gYXR0cmlidXRlLCBHb29nbGUgUGxheSBhc3N1bWVzIHRoYXQgdGhlIGZlYXR1cmUKIGlzIHJlcXVpcmVkIGFuZCBzZXRzIHVwIGZpbHRlcmluZyBvbiBpdC4gPC9saT4KIDwvdWw+CiAKIDxwPkluIGdlbmVyYWwsIGlmIHlvdXIgYXBwbGljYXRpb24gaXMgZGVzaWduZWQgdG8gcnVuIG9uIEFuZHJvaWQgMS42IGFuZCBlYXJsaWVyCiB2ZXJzaW9ucywgdGhlIDxjb2RlPmFuZHJvaWQ6cmVxdWlyZWQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZQotQVBJIGFuZCBBbmRyb2lkIE1hcmtldCBhc3N1bWVzIHRoYXQgYW55IGFuZCBhbGwKK0FQSSBhbmQgR29vZ2xlIFBsYXkgYXNzdW1lcyB0aGF0IGFueSBhbmQgYWxsCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZGVjbGFyYXRpb25zIGFyZSByZXF1aXJlZC4gPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBCeSBkZWNsYXJpbmcgYSBmZWF0dXJlIGV4cGxpY2l0bHkgYW5kCiBpbmNsdWRpbmcgYW4gPGNvZGU+YW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiPC9jb2RlPiBhdHRyaWJ1dGUsIHlvdSBjYW4KLWVmZmVjdGl2ZWx5IGRpc2FibGUgYWxsIGZpbHRlcmluZyBvbiBBbmRyb2lkIE1hcmtldCBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlLgorZWZmZWN0aXZlbHkgZGlzYWJsZSBhbGwgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5IGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUuCiA8L3A+CiAKIApAQCAtMzE3LDcgKzMxNyw3IEBACiBzcGVha2luZywgZXZlcnkgYXBwbGljYXRpb24gc2hvdWxkIDxlbT5hbHdheXM8L2VtPiBkZWNsYXJlIGFsbCBmZWF0dXJlcyB0aGF0IGl0CiB1c2VzIG9yIHJlcXVpcmVzLCBzbyB0aGUgYWJzZW5jZSBvZiBhIGRlY2xhcmF0aW9uIGZvciBhIGZlYXR1cmUgdXNlZCBieSBhbgogYXBwbGljYXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYW4gZXJyb3IuIEhvd2V2ZXIsIGFzIGEgc2FmZWd1YXJkIGZvciB1c2VycyBhbmQKLWRldmVsb3BlcnMsIEFuZHJvaWQgTWFya2V0IGxvb2tzIGZvciBpbXBsaWNpdCBmZWF0dXJlcyBpbiBlYWNoIGFwcGxpY2F0aW9uIGFuZAorZGV2ZWxvcGVycywgR29vZ2xlIFBsYXkgbG9va3MgZm9yIGltcGxpY2l0IGZlYXR1cmVzIGluIGVhY2ggYXBwbGljYXRpb24gYW5kCiBzZXRzIHVwIGZpbHRlcnMgZm9yIHRob3NlIGZlYXR1cmVzLCBqdXN0IGFzIGl0IHdvdWxkIGRvIGZvciBhbiBleHBsaWNpdGx5CiBkZWNsYXJlZCBmZWF0dXJlLiA8L3A+CiAKQEAgLTMzNywyNSArMzM3LDI1IEBACiA8L2xpPgogPC91bD4KIAotPHA+VG8gYWNjb3VudCBmb3IgdGhlIGNhc2VzIGFib3ZlLCBBbmRyb2lkIE1hcmtldCBhdHRlbXB0cyB0byBkaXNjb3ZlciBhbgorPHA+VG8gYWNjb3VudCBmb3IgdGhlIGNhc2VzIGFib3ZlLCBHb29nbGUgUGxheSBhdHRlbXB0cyB0byBkaXNjb3ZlciBhbgogYXBwbGljYXRpb24ncyBpbXBsaWVkIGZlYXR1cmUgcmVxdWlyZW1lbnRzIGJ5IGV4YW1pbmluZyA8ZW0+b3RoZXIgZWxlbWVudHM8L2VtPgogZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0IGZpbGUsIHNwZWNpZmljYWxseSwKIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiAKLTxwPklmIGFuIGFwcGxpY2F0aW9uIHJlcXVlc3RzIGhhcmR3YXJlLXJlbGF0ZWQgcGVybWlzc2lvbnMsIEFuZHJvaWQgTWFya2V0Cis8cD5JZiBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0cyBoYXJkd2FyZS1yZWxhdGVkIHBlcm1pc3Npb25zLCBHb29nbGUgUGxheQogPGVtPmFzc3VtZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gdXNlcyB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBmZWF0dXJlcyBhbmQKIHRoZXJlZm9yZSByZXF1aXJlcyB0aG9zZSBmZWF0dXJlczwvZW0+LCBldmVuIHRob3VnaCB0aGVyZSBtaWdodCBiZSBubwogY29ycmVzcG9uZGluZyB0byA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZGVjbGFyYXRpb25zLiBGb3Igc3VjaAotcGVybWlzc2lvbnMsIEFuZHJvaWQgTWFya2V0IGFkZHMgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgZmVhdHVyZXMgdG8gdGhlCitwZXJtaXNzaW9ucywgR29vZ2xlIFBsYXkgYWRkcyB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBmZWF0dXJlcyB0byB0aGUKIG1ldGFkYXRhIHRoYXQgaXQgc3RvcmVzIGZvciB0aGUgYXBwbGljYXRpb24gYW5kIHNldHMgdXAgZmlsdGVycyBmb3IgdGhlbS48L3A+CiAKIDxwPkZvciBleGFtcGxlLCBpZiBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0cyB0aGUgPGNvZGU+Q0FNRVJBPC9jb2RlPiBwZXJtaXNzaW9uCiBidXQgZG9lcyBub3QgZGVjbGFyZSBhIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50IGZvcgotPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS5jYW1lcmE8L2NvZGU+LCBBbmRyb2lkIE1hcmtldCBjb25zaWRlcnMgdGhhdCB0aGUKKzxjb2RlPmFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhPC9jb2RlPiwgR29vZ2xlIFBsYXkgY29uc2lkZXJzIHRoYXQgdGhlCiBhcHBsaWNhdGlvbiByZXF1aXJlcyBhIGNhbWVyYSBhbmQgc2hvdWxkIG5vdCBiZSBzaG93biB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGRvCiBub3Qgb2ZmZXIgYSBjYW1lcmEuPC9wPgogCi08cD5JZiB5b3UgZG9uJ3Qgd2FudCBBbmRyb2lkIE1hcmtldCB0byBmaWx0ZXIgYmFzZWQgb24gYSBzcGVjaWZpYyBpbXBsaWVkCis8cD5JZiB5b3UgZG9uJ3Qgd2FudCBHb29nbGUgUGxheSB0byBmaWx0ZXIgYmFzZWQgb24gYSBzcGVjaWZpYyBpbXBsaWVkCiBmZWF0dXJlLCB5b3UgY2FuIGRpc2FibGUgdGhhdCBiZWhhdmlvci4gVG8gZG8gc28sIGRlY2xhcmUgdGhlIGZlYXR1cmUgZXhwbGljaXRseQogaW4gYSA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudCBhbmQgaW5jbHVkZSBhbiAKIDxjb2RlPmFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIjwvY29kZT4gYXR0cmlidXRlLiBGb3IgZXhhbXBsZSwgdG8gZGlzYWJsZQpAQCAtMzY2LDMwICszNjYsMzAgQEAKIAogPHAgY2xhc3M9ImNhdXRpb24iPkl0J3MgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgdGhhdCB0aGUgcGVybWlzc2lvbnMgdGhhdCB5b3UKIHJlcXVlc3QgaW4gPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnRzIGNhbiBkaXJlY3RseSBhZmZlY3QgaG93Ci1BbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHlvdXIgYXBwbGljYXRpb24uIFRoZSByZWZlcmVuY2Ugc2VjdGlvbiA8YQorR29vZ2xlIFBsYXkgZmlsdGVycyB5b3VyIGFwcGxpY2F0aW9uLiBUaGUgcmVmZXJlbmNlIHNlY3Rpb24gPGEKIGhyZWY9IiNwZXJtaXNzaW9ucyI+UGVybWlzc2lvbnMgdGhhdCBJbXBseSBGZWF0dXJlIFJlcXVpcmVtZW50czwvYT4sCiBiZWxvdywgbGlzdHMgdGhlIGZ1bGwgc2V0IG9mIHBlcm1pc3Npb25zIHRoYXQgaW1wbHkgZmVhdHVyZSByZXF1aXJlbWVudHMgYW5kCiB0aGVyZWZvcmUgdHJpZ2dlciBmaWx0ZXJpbmcuPC9wPgogCiA8aDMgaWQ9ImJ0LXBlcm1pc3Npb24taGFuZGxpbmciPlNwZWNpYWwgaGFuZGxpbmcgZm9yIEJsdWV0b290aCBmZWF0dXJlPC9oMz4KIAotPHA+QW5kcm9pZCBNYXJrZXQgYXBwbGllcyBzbGlnaHRseSBkaWZmZXJlbnQgcnVsZXMgdGhhbiBkZXNjcmliZWQgYWJvdmUsIHdoZW4KKzxwPkdvb2dsZSBQbGF5IGFwcGxpZXMgc2xpZ2h0bHkgZGlmZmVyZW50IHJ1bGVzIHRoYW4gZGVzY3JpYmVkIGFib3ZlLCB3aGVuCiBkZXRlcm1pbmluZyBmaWx0ZXJpbmcgZm9yIEJsdWV0b290aC48L3A+CiAKIDxwPklmIGFuIGFwcGxpY2F0aW9uIGRlY2xhcmVzIGEgQmx1ZXRvb3RoIHBlcm1pc3Npb24gaW4gYQogPGNvZGU+Jmx0O3VzZXMtcGVybWlzc2lvbiZndDs8L2NvZGU+IGVsZW1lbnQsIGJ1dCBkb2VzIG5vdCBleHBsaWNpdGx5IGRlY2xhcmUKLXRoZSBCbHVldG9vdGggZmVhdHVyZSBpbiBhIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBlbGVtZW50LCBBbmRyb2lkCi1NYXJrZXQgY2hlY2tzIHRoZSB2ZXJzaW9uKHMpIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBpcwordGhlIEJsdWV0b290aCBmZWF0dXJlIGluIGEgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQsIEdvb2dsZQorUGxheSBjaGVja3MgdGhlIHZlcnNpb24ocykgb2YgdGhlIEFuZHJvaWQgcGxhdGZvcm0gb24gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGlzCiBkZXNpZ25lZCB0byBydW4sIGFzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+Jmx0O3VzZXMtc2RrJmd0OzwvY29kZT4gZWxlbWVudC4gPC9wPgogCi08cD5BcyBzaG93biBpbiB0aGUgdGFibGUgYmVsb3csIEFuZHJvaWQgTWFya2V0IGVuYWJsZXMgZmlsdGVyaW5nIGZvciB0aGUKKzxwPkFzIHNob3duIGluIHRoZSB0YWJsZSBiZWxvdywgR29vZ2xlIFBsYXkgZW5hYmxlcyBmaWx0ZXJpbmcgZm9yIHRoZQogQmx1ZXRvb3RoIGZlYXR1cmUgb25seSBpZiB0aGUgYXBwbGljYXRpb24gZGVjbGFyZXMgaXRzIGxvd2VzdCBvciB0YXJnZXRlZAotcGxhdGZvcm0gYXMgQW5kcm9pZCAyLjAgKEFQSSBsZXZlbCA1KSBvciBoaWdoZXIuIEhvd2V2ZXIsIG5vdGUgdGhhdCBBbmRyb2lkCi1tYXJrZXQgYXBwbGllcyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBmaWx0ZXJpbmcgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhwbGljaXRseQorcGxhdGZvcm0gYXMgQW5kcm9pZCAyLjAgKEFQSSBsZXZlbCA1KSBvciBoaWdoZXIuIEhvd2V2ZXIsIG5vdGUgdGhhdCBHb29nbGUKK1BsYXkgYXBwbGllcyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBmaWx0ZXJpbmcgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhwbGljaXRseQogZGVjbGFyZXMgdGhlIEJsdWV0b290aCBmZWF0dXJlIGluIGEgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQuCiA8L3A+CiAKLTxwIGNsYXNzPSJjYXB0aW9uIj48c3Ryb25nPlRhYmxlIDEuPC9zdHJvbmc+IEhvdyBBbmRyb2lkIE1hcmtldCBkZXRlcm1pbmVzIHRoZQorPHAgY2xhc3M9ImNhcHRpb24iPjxzdHJvbmc+VGFibGUgMS48L3N0cm9uZz4gSG93IEdvb2dsZSBQbGF5IGRldGVybWluZXMgdGhlCiBCbHVldG9vdGggZmVhdHVyZSByZXF1aXJlbWVudCBmb3IgYW4gYXBwbGljYXRpb24gdGhhdCByZXF1ZXN0cyBhIEJsdWV0b290aAogcGVybWlzc2lvbiBidXQgZG9lcyBub3QgZGVjbGFyZSB0aGUgQmx1ZXRvb3RoIGZlYXR1cmUgaW4gYQogPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgpAQCAtNDAzLDE0ICs0MDMsMTQgQEAKIDx0cj4KIDx0ZD48bm9icj4mbHQ7PTQgKG9yIHVzZXMtc2RrIGlzIG5vdCBkZWNsYXJlZCk8L25vYnI+PC90ZD4KIDx0ZD4mbHQ7PTQ8L3RkPgotPHRkPkFuZHJvaWQgTWFya2V0IDxlbT53aWxsIG5vdDwvZW0+IGZpbHRlciB0aGUgYXBwbGljYXRpb24gZnJvbSBhbnkgZGV2aWNlcworPHRkPkdvb2dsZSBQbGF5IDxlbT53aWxsIG5vdDwvZW0+IGZpbHRlciB0aGUgYXBwbGljYXRpb24gZnJvbSBhbnkgZGV2aWNlcwogYmFzZWQgb24gdGhlaXIgcmVwb3J0ZWQgc3VwcG9ydCBmb3IgdGhlIDxjb2RlPmFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoPC9jb2RlPgogZmVhdHVyZS48L3RkPgogPC90cj4KIDx0cj4KIDx0ZD4mbHQ7PTQ8L3RkPgogPHRkPiZndDs9NTwvdGQ+Ci08dGQgcm93c3Bhbj0iMiI+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gZnJvbSBhbnkgZGV2aWNlcyB0aGF0Cis8dGQgcm93c3Bhbj0iMiI+R29vZ2xlIFBsYXkgZmlsdGVycyB0aGUgYXBwbGljYXRpb24gZnJvbSBhbnkgZGV2aWNlcyB0aGF0CiBkbyBub3Qgc3VwcG9ydCB0aGUgPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS5ibHVldG9vdGg8L2NvZGU+IGZlYXR1cmUgKGluY2x1ZGluZwogb2xkZXIgcmVsZWFzZXMpLjwvdGQ+CiA8L3RyPgpAQCAtNDIxLDEzICs0MjEsMTMgQEAKIDwvdGFibGU+CiAKIDxwPlRoZSBleGFtcGxlcyBiZWxvdyBpbGx1c3RyYXRlIHRoZSBkaWZmZXJlbnQgZmlsdGVyaW5nIGVmZmVjdHMsIGJhc2VkIG9uIGhvdwotQW5kcm9pZCBNYXJrZXQgaGFuZGxlcyB0aGUgQmx1ZXRvb3RoIGZlYXR1cmUuIDwvcD4KK0dvb2dsZSBQbGF5IGhhbmRsZXMgdGhlIEJsdWV0b290aCBmZWF0dXJlLiA8L3A+CiAKIDxkbD4KIDxkdD5JbiBmaXJzdCBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiB0aGF0IGlzIGRlc2lnbmVkIHRvIHJ1biBvbiBvbGRlciBBUEkgbGV2ZWxzCiBkZWNsYXJlcyBhIEJsdWV0b290aCBwZXJtaXNzaW9uLCBidXQgZG9lcyBub3QgZGVjbGFyZSB0aGUgQmx1ZXRvb3RoIGZlYXR1cmUgaW4gYQogPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQuPC9kdD4KLTxkZD48ZW0+UmVzdWx0OjwvZW0+IEFuZHJvaWQgTWFya2V0IGRvZXMgbm90IGZpbHRlciB0aGUgYXBwbGljYXRpb24gZnJvbSBhbnkgZGV2aWNlLjwvZGQ+Cis8ZGQ+PGVtPlJlc3VsdDo8L2VtPiBHb29nbGUgUGxheSBkb2VzIG5vdCBmaWx0ZXIgdGhlIGFwcGxpY2F0aW9uIGZyb20gYW55IGRldmljZS48L2RkPgogPC9kbD4KIAogPHByZT4mbHQ7bWFuaWZlc3QgLi4uPgpAQCAtNDM5LDcgKzQzOSw3IEBACiA8ZGw+CiA8ZHQ+SW4gdGhlIHNlY29uZCBleGFtcGxlLCBiZWxvdywgdGhlIHNhbWUgYXBwbGljYXRpb24gYWxzbyBkZWNsYXJlcyBhIHRhcmdldAogQVBJIGxldmVsIG9mICI1Ii4gPC9kdD4KLTxkZD48ZW0+UmVzdWx0OjwvZW0+IEFuZHJvaWQgTWFya2V0IG5vdyBhc3N1bWVzIHRoYXQgdGhlIGZlYXR1cmUgaXMgcmVxdWlyZWQgYW5kCis8ZGQ+PGVtPlJlc3VsdDo8L2VtPiBHb29nbGUgUGxheSBub3cgYXNzdW1lcyB0aGF0IHRoZSBmZWF0dXJlIGlzIHJlcXVpcmVkIGFuZAogd2lsbCBmaWx0ZXIgdGhlIGFwcGxpY2F0aW9uIGZyb20gYWxsIGRldmljZXMgdGhhdCBkbyBub3QgcmVwb3J0IEJsdWV0b290aCBzdXBwb3J0LAogaW5jbHVkaW5nIGRldmljZXMgcnVubmluZyBvbGRlciB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uIDwvZGQ+CiA8L2RsPgpAQCAtNDY1LDcgKzQ2NSw3IEBACiA8ZGw+CiA8ZHQ+RmluYWxseSwgaW4gdGhlIGNhc2UgYmVsb3csIHRoZSBzYW1lIGFwcGxpY2F0aW9uIGFkZHMgYW4KIDxjb2RlPmFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIjwvY29kZT4gYXR0cmlidXRlLjwvZHQ+Ci08ZGQ+PGVtPlJlc3VsdDo8L2VtPiBBbmRyb2lkIE1hcmtldCBkaXNhYmxlcyBmaWx0ZXJpbmcgYmFzZWQgb24gQmx1ZXRvb3RoCis8ZGQ+PGVtPlJlc3VsdDo8L2VtPiBHb29nbGUgUGxheSBkaXNhYmxlcyBmaWx0ZXJpbmcgYmFzZWQgb24gQmx1ZXRvb3RoCiBmZWF0dXJlIHN1cHBvcnQsIGZvciBhbGwgZGV2aWNlcy48L2RkPgogPC9kbD4KIApAQCAtNDgxLDEwICs0ODEsMTAgQEAKIDxoMyBpZD0idGVzdGluZyI+VGVzdGluZyB0aGUgZmVhdHVyZXMgcmVxdWlyZWQgYnkgeW91ciBhcHBsaWNhdGlvbjwvaDM+CiAKIDxwPllvdSBjYW4gdXNlIHRoZSA8Y29kZT5hYXB0PC9jb2RlPiB0b29sLCBpbmNsdWRlZCBpbiB0aGUgQW5kcm9pZCBTREssIHRvCi1kZXRlcm1pbmUgaG93IEFuZHJvaWQgTWFya2V0IHdpbGwgZmlsdGVyIHlvdXIgYXBwbGljYXRpb24sIGJhc2VkIG9uIGl0cyBkZWNsYXJlZAorZGV0ZXJtaW5lIGhvdyBHb29nbGUgUGxheSB3aWxsIGZpbHRlciB5b3VyIGFwcGxpY2F0aW9uLCBiYXNlZCBvbiBpdHMgZGVjbGFyZWQKIGZlYXR1cmVzIGFuZCBwZXJtaXNzaW9ucy4gVG8gZG8gc28sIHJ1biAgPGNvZGU+YWFwdDwvY29kZT4gd2l0aCB0aGUgPGNvZGU+ZHVtcAogYmFkZ2luZzwvY29kZT4gY29tbWFuZC4gVGhpcyBjYXVzZXMgPGNvZGU+YWFwdDwvY29kZT4gdG8gcGFyc2UgeW91cgotYXBwbGljYXRpb24ncyBtYW5pZmVzdCBhbmQgYXBwbHkgdGhlIHNhbWUgcnVsZXMgYXMgdXNlZCBieSBBbmRyb2lkIE1hcmtldCB0bworYXBwbGljYXRpb24ncyBtYW5pZmVzdCBhbmQgYXBwbHkgdGhlIHNhbWUgcnVsZXMgYXMgdXNlZCBieSBHb29nbGUgUGxheSB0bwogZGV0ZXJtaW5lIHRoZSBmZWF0dXJlcyB0aGF0IHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMuIDwvcD4KIAogPHA+VG8gdXNlIHRoZSB0b29sLCBmb2xsb3cgdGhlc2Ugc3RlcHM6IDwvcD4KQEAgLTUyOSw3ICs1MjksNyBAQAogPGgyIGlkPWZlYXR1cmVzLXJlZmVyZW5jZT5GZWF0dXJlcyBSZWZlcmVuY2U8L2gyPgogCiA8cD5UaGUgdGFibGVzIGJlbG93IHByb3ZpZGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIGFib3V0IGhhcmR3YXJlIGFuZCBzb2Z0d2FyZQotZmVhdHVyZXMgYW5kIHRoZSBwZXJtaXNzaW9ucyB0aGF0IGNhbiBpbXBseSB0aGVtIG9uIEFuZHJvaWQgTWFya2V0LiA8L3A+CitmZWF0dXJlcyBhbmQgdGhlIHBlcm1pc3Npb25zIHRoYXQgY2FuIGltcGx5IHRoZW0gb24gR29vZ2xlIFBsYXkuIDwvcD4KIAogPGgzIGlkPSJody1mZWF0dXJlcyI+SGFyZHdhcmUgZmVhdHVyZXM8L2gzPgogCkBAIC04NzMsMTIgKzg3MywxMiBAQAogdGhlIGFiaWxpdHkgdG8gZGVjbGFyZSB0aGF0IHRoZXkgcmVxdWlyZSB0aGUgQVBJIHZpYSB0aGUKIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBzeXN0ZW0uIDwvcD4KIAotPHA+VG8gcHJldmVudCB0aG9zZSBhcHBzIGZyb20gYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5pbnRlbnRpb25hbGx5LCAgQW5kcm9pZAotTWFya2V0IGFzc3VtZXMgdGhhdCBjZXJ0YWluIGhhcmR3YXJlLXJlbGF0ZWQgcGVybWlzc2lvbnMgaW5kaWNhdGUgdGhhdCB0aGUKKzxwPlRvIHByZXZlbnQgdGhvc2UgYXBwcyBmcm9tIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuaW50ZW50aW9uYWxseSwgIEdvb2dsZQorUGxheSBhc3N1bWVzIHRoYXQgY2VydGFpbiBoYXJkd2FyZS1yZWxhdGVkIHBlcm1pc3Npb25zIGluZGljYXRlIHRoYXQgdGhlCiB1bmRlcmx5aW5nIGhhcmR3YXJlIGZlYXR1cmVzIGFyZSByZXF1aXJlZCBieSBkZWZhdWx0LiBGb3IgaW5zdGFuY2UsIGFwcGxpY2F0aW9ucwogdGhhdCB1c2UgQmx1ZXRvb3RoIG11c3QgcmVxdWVzdCB0aGUgPGNvZGU+QkxVRVRPT1RIPC9jb2RlPiBwZXJtaXNzaW9uIGluIGEKLTxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBlbGVtZW50ICZtZGFzaDsgZm9yIGxlZ2FjeSBhcHBzLCBBbmRyb2lkCi1NYXJrZXQgYXNzdW1lcyB0aGF0IHRoZSBwZXJtaXNzaW9uIGRlY2xhcmF0aW9uIG1lYW5zIHRoYXQgdGhlIHVuZGVybHlpbmcKKzxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBlbGVtZW50ICZtZGFzaDsgZm9yIGxlZ2FjeSBhcHBzLCBHb29nbGUKK1BsYXkgYXNzdW1lcyB0aGF0IHRoZSBwZXJtaXNzaW9uIGRlY2xhcmF0aW9uIG1lYW5zIHRoYXQgdGhlIHVuZGVybHlpbmcKIDxjb2RlPmFuZHJvaWQuaGFyZHdhcmUuYmx1ZXRvb3RoPC9jb2RlPiBmZWF0dXJlIGlzIHJlcXVpcmVkIGJ5IHRoZSBhcHBsaWNhdGlvbgogYW5kIHNldHMgdXAgZmlsdGVyaW5nIGJhc2VkIG9uIHRoYXQgZmVhdHVyZS4gPC9wPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtbGlicmFyeS1lbGVtZW50LmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWxpYnJhcnktZWxlbWVudC5qZAppbmRleCBkOTRhZDlmLi4yZjhlYjUwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtbGlicmFyeS1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1saWJyYXJ5LWVsZW1lbnQuamQKQEAgLTMzLDcgKzMzLDcgQEAKICAgICA8L3A+CiAgICAgPHA+CiAgICAgICAgIFRoaXMgZWxlbWVudCBhbHNvIGFmZmVjdHMgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gb24gYSBwYXJ0aWN1bGFyIGRldmljZSBhbmQKLSAgICAgICAgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24gaW4gQW5kcm9pZCBNYXJrZXQ6CisgICAgICAgIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5OgogICAgIDwvcD4KICAgICA8ZGw+CiAgICAgICAgIDxkdD48ZW0+SW5zdGFsbGF0aW9uPC9lbT48L2R0PgpAQCAtNDIsMTEgKzQyLDExIEBACiAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0sIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyfSBmcmFtZXdvcmsgd29uJ3QgbGV0IHRoZSB1c2VyCiAgICAgICAgICAgICBpbnN0YWxsIHRoZSBhcHBsaWNhdGlvbiB1bmxlc3MgdGhlIGxpYnJhcnkgaXMgcHJlc2VudCBvbiB0aGUgdXNlcidzIGRldmljZS4KICAgICAgICAgPC9kZD4KLSAgICAgICAgPGR0PjxlbT5NYXJrZXQ8L2VtPjwvZHQ+CisgICAgICAgIDxkdD48ZW0+R29vZ2xlIFBsYXk8L2VtPjwvZHQ+CiAgICAgICAgIDxkZD4KLSAgICAgICAgICAgIEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSBsaWJyYXJpZXMgaW5zdGFsbGVkIG9uIHRoZQorICAgICAgICAgICAgR29vZ2xlIFBsYXkgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlIGxpYnJhcmllcyBpbnN0YWxsZWQgb24gdGhlCiAgICAgICAgICAgICB1c2VyJ3MgZGV2aWNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcsIHNlZSB0aGUgdG9waWMKLSAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT4uCisgICAgICAgICAgICA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4uCiAgICAgICAgIDwvZGQ+CiAgICAgPC9kbD4KICAgICA8cD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1wZXJtaXNzaW9uLWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtcGVybWlzc2lvbi1lbGVtZW50LmpkCmluZGV4IDk2N2ZjNWEuLjZjNzFmYjQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1wZXJtaXNzaW9uLWVsZW1lbnQuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXBlcm1pc3Npb24tZWxlbWVudC5qZApAQCAtOCwyMSArOCwyMSBAQAogIDxkaXYgY2xhc3M9InNpZGVib3gtd3JhcHBlciI+IAogICA8aW1nIGlkPSJydWxlIiBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2dyYWQtcnVsZS1xdi5wbmciPiAKICAgPGRpdiBpZD0icXYtc3ViLXJ1bGUiPiAKLSAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjA7Ij4gCi0gICAgPHAgc3R5bGU9ImNvbG9yOiM2Njk5OTk7Ij48Y29kZSBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBhbmQgZmlsdGVyaW5nIG9uIEFuZHJvaWQgTWFya2V0LiA8L3A+CisgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKKyAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTtwYWRkaW5nLXRvcDoxZW07Ij48Y29kZSBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBhbmQgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5LiA8L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiPkluIHNvbWUgY2FzZXMsIHRoZSBwZXJtaXNzaW9ucyB0aGF0IHlvdSByZXF1ZXN0CiB0aHJvdWdoIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBjYW4gYWZmZWN0IGhvdwoteW91ciBhcHBsaWNhdGlvbiBpcyBmaWx0ZXJlZCBieSBBbmRyb2lkIE1hcmtldC48L3A+Cit5b3VyIGFwcGxpY2F0aW9uIGlzIGZpbHRlcmVkIGJ5IEdvb2dsZSBQbGF5LjwvcD4KIAogPHAgc3R5bGU9Im1hcmdpbi10b3A6MWVtOyI+SWYgeW91IHJlcXVlc3QgYSBoYXJkd2FyZS1yZWxhdGVkIHBlcm1pc3Npb24gJm1kYXNoOwotPGNvZGU+Q0FNRVJBPC9jb2RlPiwgZm9yIGV4YW1wbGUgJm1kYXNoOyBBbmRyb2lkIE1hcmtldCBhc3N1bWVzIHRoYXQgeW91cgorPGNvZGU+Q0FNRVJBPC9jb2RlPiwgZm9yIGV4YW1wbGUgJm1kYXNoOyBHb29nbGUgUGxheSBhc3N1bWVzIHRoYXQgeW91cgogYXBwbGljYXRpb24gcmVxdWlyZXMgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgZmVhdHVyZSBhbmQgZmlsdGVycyB0aGUgYXBwbGljYXRpb24KIGZyb20gZGV2aWNlcyB0aGF0IGRvIG5vdCBvZmZlciBpdC48L3A+CiAKIDxwIHN0eWxlPSJtYXJnaW4tdG9wOjFlbTsiPlRvIGNvbnRyb2wgZmlsdGVyaW5nLCBhbHdheXMgZXhwbGljaXRseSBkZWNsYXJlCiBoYXJkd2FyZSBmZWF0dXJlcyBpbiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gZWxlbWVudHMsIHJhdGhlciB0aGFuCi1yZWx5aW5nIG9uIEFuZHJvaWQgTWFya2V0IHRvICJkaXNjb3ZlciIgdGhlIHJlcXVpcmVtZW50cyBpbgorcmVseWluZyBvbiBHb29nbGUgUGxheSB0byAiZGlzY292ZXIiIHRoZSByZXF1aXJlbWVudHMgaW4KIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24mZ3Q7PC9jb2RlPiBlbGVtZW50cy4gVGhlbiwgaWYgeW91IHdhbnQgdG8gZGlzYWJsZQogZmlsdGVyaW5nIGZvciBhIHBhcnRpY3VsYXIgZmVhdHVyZSwgeW91IGNhbiBhZGQgYQogPGNvZGU+YW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiPC9jb2RlPiBhdHRyaWJ1dGUgdG8gdGhlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuamQKaW5kZXggOTljOTFmNi4uOGZhMzlkMSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLXNkay1lbGVtZW50LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1zZGstZWxlbWVudC5qZApAQCAtMzMsMTYgKzMzLDE2IEBACiAgPGRpdiBjbGFzcz0ic2lkZWJveC13cmFwcGVyIiB4c3R5bGU9Im1hcmdpbi1ib3R0b206MmVtO21hcmdpbi10b3A6LjVlbTt3aWR0aDo5MCU7Ij4gCiAgIDxpbWcgaWQ9InJ1bGUiIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvZ3JhZC1ydWxlLXF2LnBuZyI+IAogICA8ZGl2IGlkPSJxdi1zdWItcnVsZSI+IAotICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjowO3BhZGRpbmc6MDsiPiAKLSAgICA8cCBzdHlsZT0iY29sb3I6IzY2OTk5OTsiPkFuZHJvaWQgTWFya2V0IGFuZCAmbHQ7dXNlcy1zZGsmZ3Q7IGF0dHJpYnV0ZXM8L3A+IAotICAgIDxwPkFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbworICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX3BsYXkucG5nIiBzdHlsZT0iZmxvYXQ6bGVmdDttYXJnaW46MDtwYWRkaW5nOjA7Ij4gCisgICAgPHAgc3R5bGU9ImNvbG9yOiM2Njk5OTk7cGFkZGluZy10b3A6MWVtOyI+R29vZ2xlIFBsYXkgYW5kICZsdDt1c2VzLXNkayZndDsgYXR0cmlidXRlczwvcD4gCisgICAgPHAgc3R5bGU9InBhZGRpbmctdG9wOjFlbTsiPkdvb2dsZSBQbGF5IGZpbHRlcnMgdGhlIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSB2aXNpYmxlIHRvIHVzZXJzLCBzbwogdGhhdCB1c2VycyBjYW4gb25seSBzZWUgYW5kIGRvd25sb2FkIGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggdGhlaXIKLWRldmljZXMuIE9uZSBvZiB0aGUgd2F5cyBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgaXMgYnkgQW5kcm9pZAotdmVyc2lvbi1jb21wYXRpYmlsaXR5LiBUbyBkbyB0aGlzLCBNYXJrZXQgY2hlY2tzIHRoZSA8Y29kZT4mbHQ7dXNlcy1zZGsmZ3Q7PC9jb2RlPgorZGV2aWNlcy4gT25lIG9mIHRoZSB3YXlzIGl0IGZpbHRlcnMgYXBwbGljYXRpb25zIGlzIGJ5IEFuZHJvaWQKK3ZlcnNpb24tY29tcGF0aWJpbGl0eS4gVG8gZG8gdGhpcywgR29vZ2xlIFBsYXkgY2hlY2tzIHRoZSA8Y29kZT4mbHQ7dXNlcy1zZGsmZ3Q7PC9jb2RlPgogYXR0cmlidXRlcyBpbiBlYWNoIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QgdG8gZXN0YWJsaXNoIGl0cyB2ZXJzaW9uLWNvbXBhdGliaWxpdHkKIHJhbmdlLCB0aGVuIHNob3dzIG9yIGhpZGVzIHRoZSBhcHBsaWNhdGlvbiBiYXNlZCBvbiBhIGNvbXBhcmlzb24gd2l0aCB0aGUgQVBJCiBMZXZlbCBvZiB0aGUgdXNlcidzIEFuZHJvaWQgc3lzdGVtIHZlcnNpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEKLWhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5NYXJrZXQgRmlsdGVyczwvYT4uPC9wPgoraHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+LjwvcD4KICAgPC9kaXY+CiA8L2Rpdj4KIApAQCAtMTE0LDcgKzExNCw3IEBACiAgIHVwZGF0ZXMsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogPC9wPgogCiAgIDxwPkFuIGFwcGxpY2F0aW9uIGRlY2xhcmluZyA8Y29kZT5tYXhTZGtWZXJzaW9uPSI1IjwvY29kZT4gaW4gaXRzCi0gIG1hbmlmZXN0IGlzIHB1Ymxpc2hlZCBvbiBBbmRyb2lkIE1hcmtldC4gQSB1c2VyIHdob3NlIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQKKyAgbWFuaWZlc3QgaXMgcHVibGlzaGVkIG9uIEdvb2dsZSBQbGF5LiBBIHVzZXIgd2hvc2UgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZAogICAxLjYgKEFQSSBMZXZlbCA0KSBkb3dubG9hZHMgYW5kIGluc3RhbGxzIHRoZSBhcHAuIEFmdGVyIGEgZmV3IHdlZWtzLCB0aGUgdXNlcgogICByZWNlaXZlcyBhbiBvdmVyLXRoZS1haXIgc3lzdGVtIHVwZGF0ZSB0byBBbmRyb2lkIDIuMCAoQVBJIExldmVsIDUpLiBBZnRlciB0aGUKICAgdXBkYXRlIGlzIGluc3RhbGxlZCwgdGhlIHN5c3RlbSBjaGVja3MgdGhlIGFwcGxpY2F0aW9uJ3MKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAgIDxkaXYgY2xhc3M9InNwZWNpYWwiPkZ1dHVyZSB2ZXJzaW9ucyBvZiBBbmRyb2lkIChiZXlvbmQgQW5kcm9pZCAyLjAuMSkgd2lsbCBubwogbG9uZ2VyIGNoZWNrIG9yIGVuZm9yY2UgdGhlIDxjb2RlPm1heFNka1ZlcnNpb248L2NvZGU+IGF0dHJpYnV0ZSBkdXJpbmcKLWluc3RhbGxhdGlvbiBvciByZS12YWxpZGF0aW9uLiBBbmRyb2lkIE1hcmtldCB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgYXR0cmlidXRlCitpbnN0YWxsYXRpb24gb3IgcmUtdmFsaWRhdGlvbi4gR29vZ2xlIFBsYXkgd2lsbCBjb250aW51ZSB0byB1c2UgdGhlIGF0dHJpYnV0ZQogYXMgYSBmaWx0ZXIsIGhvd2V2ZXIsIHdoZW4gcHJlc2VudGluZyB1c2VycyB3aXRoIGFwcGxpY2F0aW9ucyBhdmFpbGFibGUgZm9yCiBkb3dubG9hZC4gPC9kaXY+CiAgIDwvZGQ+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL21lZGlhL2NhbWVyYS5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWVkaWEvY2FtZXJhLmpkCmluZGV4IDRlOTI4YjMuLjdkNzI0OTEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWVkaWEvY2FtZXJhLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbWVkaWEvY2FtZXJhLmpkCkBAIC0xMzEsMTEgKzEzMSwxMSBAQAogICA8cD5Gb3IgYSBsaXN0IG9mIGNhbWVyYSBmZWF0dXJlcywgc2VlIHRoZSBtYW5pZmVzdAogPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sI2h3LWZlYXR1cmVzIj5GZWF0dXJlcwogUmVmZXJlbmNlPC9hPi48L3A+Ci0gIDxwPkFkZGluZyBjYW1lcmEgZmVhdHVyZXMgdG8geW91ciBtYW5pZmVzdCBjYXVzZXMgQW5kcm9pZCBNYXJrZXQgdG8gcHJldmVudCB5b3VyIGFwcGxpY2F0aW9uIGZyb20KKyAgPHA+QWRkaW5nIGNhbWVyYSBmZWF0dXJlcyB0byB5b3VyIG1hbmlmZXN0IGNhdXNlcyBHb29nbGUgUGxheSB0byBwcmV2ZW50IHlvdXIgYXBwbGljYXRpb24gZnJvbQogYmVpbmcgaW5zdGFsbGVkIHRvIGRldmljZXMgdGhhdCBkbyBub3QgaW5jbHVkZSBhIGNhbWVyYSBvciBkbyBub3Qgc3VwcG9ydCB0aGUgY2FtZXJhIGZlYXR1cmVzIHlvdQotc3BlY2lmeS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgZmVhdHVyZS1iYXNlZCBmaWx0ZXJpbmcgd2l0aCBBbmRyb2lkIE1hcmtldCwgc2VlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwjbWFya2V0LWZlYXR1cmUtZmlsdGVyaW5nIj5BbmRyb2lkCi1NYXJrZXQgYW5kIEZlYXR1cmUtQmFzZWQgRmlsdGVyaW5nPC9hPi48L3A+CitzcGVjaWZ5LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB1c2luZyBmZWF0dXJlLWJhc2VkIGZpbHRlcmluZyB3aXRoIEdvb2dsZSBQbGF5LCBzZWUgPGEKK2hyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCNtYXJrZXQtZmVhdHVyZS1maWx0ZXJpbmciPkdvb2dsZQorUGxheSBhbmQgRmVhdHVyZS1CYXNlZCBGaWx0ZXJpbmc8L2E+LjwvcD4KICAgPHA+SWYgeW91ciBhcHBsaWNhdGlvbiA8ZW0+Y2FuIHVzZTwvZW0+IGEgY2FtZXJhIG9yIGNhbWVyYSBmZWF0dXJlIGZvciBwcm9wZXIgb3BlcmF0aW9uLCBidXQgZG9lcwogbm90IDxlbT5yZXF1aXJlPC9lbT4gaXQsIHlvdSBzaG91bGQgc3BlY2lmeSB0aGlzIGluIHRoZSBtYW5pZmVzdCBieSBpbmNsdWRpbmcgdGhlIHtAY29kZQogYW5kcm9pZDpyZXF1aXJlZH0gYXR0cmlidXRlLCBhbmQgc2V0dGluZyBpdCB0byB7QGNvZGUgZmFsc2V9OjwvcD4KQEAgLTQ0Miw3ICs0NDIsNyBAQAogdGhlIGZpcnN0LCBiYWNrLWZhY2luZyBjYW1lcmEgb24gYSBkZXZpY2Ugd2l0aCBtb3JlIHRoYW4gb25lIGNhbWVyYS48L3A+CiAKIDxoMyBpZD0iY2hlY2stY2FtZXJhLWZlYXR1cmVzIj5DaGVja2luZyBjYW1lcmEgZmVhdHVyZXM8L2gzPgotPHA+T25jZSB5b3Ugb2J0YWluIGFjY2VzcyB0byBhIGNhbWVyYSwgeW91IGNhbiBnZXQgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBpdHMgY2FwYWJpbHRpZXMgdXNpbmcKKzxwPk9uY2UgeW91IG9idGFpbiBhY2Nlc3MgdG8gYSBjYW1lcmEsIHlvdSBjYW4gZ2V0IGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgaXRzIGNhcGFiaWxpdGllcyB1c2luZwogdGhlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSNnZXRQYXJhbWV0ZXJzKCkgQ2FtZXJhLmdldFBhcmFtZXRlcnMoKX0gbWV0aG9kIGFuZCBjaGVja2luZyB0aGUKIHJldHVybmVkIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzfSBvYmplY3QgZm9yIHN1cHBvcnRlZCBjYXBhYmlsaXRpZXMuIFdoZW4gdXNpbmcKIEFQSSBMZXZlbCA5IG9yIGhpZ2hlciwgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEjZ2V0Q2FtZXJhSW5mbyhpbnQsCkBAIC02NzcsOCArNjc3LDggQEAKIDxwcmU+CiAvLyBBZGQgYSBsaXN0ZW5lciB0byB0aGUgQ2FwdHVyZSBidXR0b24KIEJ1dHRvbiBjYXB0dXJlQnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKGlkLmJ1dHRvbl9jYXB0dXJlKTsKLSAgICBjYXB0dXJlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigKLSAgICAgICAgbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworY2FwdHVyZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoCisgICAgbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewogICAgICAgICAmIzY0O092ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CiAgICAgICAgICAgICAvLyBnZXQgYW4gaW1hZ2UgZnJvbSB0aGUgY2FtZXJhCkBAIC0xMjYwLDcgKzEyNjAsNyBAQAogCiA8cD5JZiB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVzIGNlcnRhaW4gY2FtZXJhIGZlYXR1cmVzIGluIG9yZGVyIHRvIGZ1bmN0aW9uIHByb3Blcmx5LCB5b3UgY2FuCiByZXF1aXJlIHRoZW0gdGhyb3VnaCBhZGRpdGlvbnMgdG8geW91ciBhcHBsaWNhdGlvbiBtYW5pZmVzdC4gV2hlbiB5b3UgZGVjbGFyZSB0aGUgdXNlIG9mIHNwZWNpZmljCi1jYW1lcmEgZmVhdHVyZXMsIHN1Y2ggYXMgZmxhc2ggYW5kIGF1dG8tZm9jdXMsIHRoZSBBbmRyb2lkIE1hcmtldCByZXN0cmljdHMgeW91ciBhcHBsaWNhdGlvbiBmcm9tCitjYW1lcmEgZmVhdHVyZXMsIHN1Y2ggYXMgZmxhc2ggYW5kIGF1dG8tZm9jdXMsIEdvb2dsZSBQbGF5IHJlc3RyaWN0cyB5b3VyIGFwcGxpY2F0aW9uIGZyb20KIGJlaW5nIGluc3RhbGxlZCBvbiBkZXZpY2VzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZXNlIGZlYXR1cmVzLiBGb3IgYSBsaXN0IG9mIGNhbWVyYSBmZWF0dXJlcyB0aGF0CiBjYW4gYmUgZGVjbGFyZWQgaW4geW91ciBhcHAgbWFuaWZlc3QsIHNlZSB0aGUgbWFuaWZlc3QKIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCNody1mZWF0dXJlcyI+IEZlYXR1cmVzCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL25ldHdvcmsvc2lwLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9uZXR3b3JrL3NpcC5qZAppbmRleCAyNzZhZGI2Li42MDBkYTc4IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL25ldHdvcmsvc2lwLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbmV0d29yay9zaXAuamQKQEAgLTE0Nyw3ICsxNDcsNyBAQAogPC91bD4KIAogPHA+VG8gY29udHJvbCBob3cgeW91ciBhcHBsaWNhdGlvbiBpcyBmaWx0ZXJlZCBmcm9tIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAotU0lQIChmb3IgZXhhbXBsZSwgaW4gQW5kcm9pZCBNYXJrZXQpLCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIGFwcGxpY2F0aW9uJ3MKK1NJUCAoZm9yIGV4YW1wbGUsIG9uIEdvb2dsZSBQbGF5KSwgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBhcHBsaWNhdGlvbidzCiBtYW5pZmVzdDo8L3A+CiAKIDx1bD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbmZjL25mYy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvbmZjL25mYy5qZAppbmRleCA4Mzg3M2MzLi44MzQ2NTZhIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL25mYy9uZmMuamQKKysrIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9uZmMvbmZjLmpkCkBAIC0zMTgsOCArMzE4LDggQEAKIDwvcHJlPgogICAgIDwvbGk+CiAKLSAgICA8bGk+VGhlIDxjb2RlPnVzZXMtZmVhdHVyZTwvY29kZT4gZWxlbWVudCBzbyB0aGF0IHlvdXIgYXBwbGljYXRpb24gc2hvd3MgdXAgaW4gdGhlIEFuZHJvaWQKLU1hcmtldCBvbmx5IGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBORkMgaGFyZHdhcmU6CisgICAgPGxpPlRoZSA8Y29kZT51c2VzLWZlYXR1cmU8L2NvZGU+IGVsZW1lbnQgc28gdGhhdCB5b3VyIGFwcGxpY2F0aW9uIHNob3dzIHVwIGluIEdvb2dsZQorUGxheSBvbmx5IGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBORkMgaGFyZHdhcmU6CiAgICAgICA8cHJlPgogJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubmZjIiBhbmRyb2lkOnJlcXVpcmVkPSJ0cnVlIiAvJmd0OwogPC9wcmU+CkBAIC02NjAsNyArNjYwLDcgQEAKIG9mIGFuIGFwcGxpY2F0aW9uIGVtYmVkZGVkIGluc2lkZSBhbiBOREVGIHJlY29yZC4gWW91IGNhbiBhZGQgYW4gQUFSIHRvIGFueSBOREVGIHJlY29yZCBvZiB5b3VyIE5ERUYgbWVzc2FnZSwKIGJlY2F1c2UgQW5kcm9pZCBzZWFyY2hlcyB0aGUgZW50aXJlIE5ERUYgbWVzc2FnZSBmb3IgQUFScy4gSWYgaXQgZmluZHMgYW4gQUFSLCBpdCBzdGFydHMgdGhlIGFwcGxpY2F0aW9uIGJhc2VkCiBvbiB0aGUgcGFja2FnZSBuYW1lIGluc2lkZSB0aGUgQUFSLiBJZiB0aGUgYXBwbGljYXRpb24gaXMgbm90IHByZXNlbnQgb24gdGhlIGRldmljZSwKLUFuZHJvaWQgTWFya2V0IGlzIGxhdW5jaGVkIHRvIGRvd25sb2FkIHRoZSBhcHBsaWNhdGlvbi48L3A+CitHb29nbGUgUGxheSBpcyBsYXVuY2hlZCB0byBkb3dubG9hZCB0aGUgYXBwbGljYXRpb24uPC9wPgogCiA8cD5BQVJzIGFyZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcHJldmVudCBvdGhlciBhcHBsaWNhdGlvbnMgZnJvbSBmaWx0ZXJpbmcgZm9yIHRoZSBzYW1lIGludGVudCBhbmQKIHBvdGVudGlhbGx5IGhhbmRsaW5nIHNwZWNpZmljIHRhZ3MgdGhhdCB5b3UgaGF2ZSBkZXBsb3llZC4gQUFScyBhcmUgb25seSBzdXBwb3J0ZWQgYXQgdGhlCkBAIC02NzgsNyArNjc4LDcgQEAKICAgPGxpPklmIHRoZSBBY3Rpdml0eSB0aGF0IGZpbHRlcnMgZm9yIHRoZSBpbnRlbnQgZG9lcyBub3QgbWF0Y2ggdGhlCiBBQVIsIGlmIG11bHRpcGxlIEFjdGl2aXRpZXMgY2FuIGhhbmRsZSB0aGUgaW50ZW50LCBvciBpZiBubyBBY3Rpdml0eSBoYW5kbGVzIHRoZSBpbnRlbnQsIHN0YXJ0IHRoZQogYXBwbGljYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBBQVIuPC9saT4KLSAgPGxpPklmIG5vIGFwcGxpY2F0aW9uIGNhbiBzdGFydCB3aXRoIHRoZSBBQVIsIGdvIHRvIHRoZSBBbmRyb2lkIE1hcmtldCB0byBkb3dubG9hZCB0aGUKKyAgPGxpPklmIG5vIGFwcGxpY2F0aW9uIGNhbiBzdGFydCB3aXRoIHRoZSBBQVIsIGdvIHRvIEdvb2dsZSBQbGF5IHRvIGRvd25sb2FkIHRoZQogYXBwbGljYXRpb24gYmFzZWQgb24gdGhlIEFBUi48L2xpPgogPC9vbD4KIApAQCAtODk3LDcgKzg5Nyw3IEBACiAKIDxwPk5vdGUgdGhhdCB0aGlzIGNvZGUgY29tbWVudHMgb3V0IGFuIEFBUiwgd2hpY2ggeW91IGNhbiByZW1vdmUuIElmIHlvdSBlbmFibGUgdGhlIEFBUiwgdGhlCiBhcHBsaWNhdGlvbiBzcGVjaWZpZWQgaW4gdGhlIEFBUiBhbHdheXMgcmVjZWl2ZXMgdGhlIEFuZHJvaWQgQmVhbSBtZXNzYWdlLiBJZiB0aGUgYXBwbGljYXRpb24gaXMgbm90Ci1wcmVzZW50LCB0aGUgQW5kcm9pZCBNYXJrZXQgaXMgc3RhcnRlZCB0byBkb3dubG9hZCB0aGUgYXBwbGljYXRpb24uIFRoZXJlZm9yZSwgdGhlIGZvbGxvd2luZyBpbnRlbnQKK3ByZXNlbnQsIEdvb2dsZSBQbGF5IGxhdW5jaGVzIHRvIGRvd25sb2FkIHRoZSBhcHBsaWNhdGlvbi4gVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIGludGVudAogZmlsdGVyIGlzIG5vdCB0ZWNobmljYWxseSBuZWNlc3NhcnkgZm9yIEFuZHJvaWQgNC4wIGRldmljZXMgb3IgbGF0ZXIgaWYgdGhlIEFBUiBpcyB1c2VkOgogPC9wPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9sb2NhbGl6YXRpb24uamQgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3Jlc291cmNlcy9sb2NhbGl6YXRpb24uamQKaW5kZXggOWFmZmIxNS4uYzJiNjY4ZCAxMDA3NTUKLS0tIGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy9yZXNvdXJjZXMvbG9jYWxpemF0aW9uLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvcmVzb3VyY2VzL2xvY2FsaXphdGlvbi5qZApAQCAtMTg2LDcgKzE4Niw3IEBACiAJYW5kIGNhbiBpbmNsdWRlIG90aGVyIHR5cGVzIG9mIHJlc291cmNlcyBzdWNoIGFzIGFuaW1hdGlvbnMuIA0KIDxicj4NCiAgIDxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Jlcy9kcmF3YWJsZS88L2NvZGU+KHJlcXVpcmVkIGRpcmVjdG9yeSBob2xkaW5nIGF0IGxlYXN0DQotICBvbmUgZ3JhcGhpYyBmaWxlLCBmb3IgdGhlIGFwcGxpY2F0aW9uJ3MgaWNvbiBpbiB0aGUgTWFya2V0KTxicj4NCisgIG9uZSBncmFwaGljIGZpbGUsIGZvciB0aGUgYXBwbGljYXRpb24ncyBpY29uIG9uIEdvb2dsZSBQbGF5KTxicj4NCiAgIDxjb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Jlcy9sYXlvdXQvPC9jb2RlPiAocmVxdWlyZWQgZGlyZWN0b3J5IGhvbGRpbmcgYW4gWE1MDQogICBmaWxlIHRoYXQgZGVmaW5lcyB0aGUgZGVmYXVsdCBsYXlvdXQpPGJyPg0KICAgPGNvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzL2FuaW0vPC9jb2RlPiAocmVxdWlyZWQgaWYgeW91IGhhdmUgYW55IA0KQEAgLTUwNyw3ICs1MDcsNyBAQAogDQogPGgyIGlkPSJwdWJsaXNoaW5nIj5QdWJsaXNoaW5nIExvY2FsaXplZCBBcHBsaWNhdGlvbnM8L2gyPg0KIA0KLTxwPlRoZSBBbmRyb2lkIE1hcmtldCBpcw0KKzxwPlRoZSBHb29nbGUgUGxheSBpcw0KICAgdGhlIG1haW4gYXBwbGljYXRpb24gZGlzdHJpYnV0aW9uIHN5c3RlbSBmb3IgQW5kcm9pZCBkZXZpY2VzLiBUbyBwdWJsaXNoIGEgDQogICBsb2NhbGl6ZWQgYXBwbGljYXRpb24sIHlvdSBuZWVkIHRvIHNpZ24geW91ciBhcHBsaWNhdGlvbiwgdmVyc2lvbiBpdCwgYW5kIGdvDQogdGhyb3VnaCBhbGwgdGhlIG90aGVyIHN0ZXBzIGRlc2NyaWJlZCBpbiA8YQ0KQEAgLTUyMSw3ICs1MjEsNyBAQAogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvYXBwLXNpZ25pbmcuaHRtbCNzdHJhdGVnaWVzIj5TaWduaW5nDQogU3RyYXRlZ2llczwvYT4uIDwvbGk+DQogICA8bGk+R2l2ZSBlYWNoIC5hcGsgZmlsZSBhIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBuYW1lLiBDdXJyZW50bHkgaXQgaXMNCi1pbXBvc3NpYmxlIHRvIHB1dCB0d28gYXBwbGljYXRpb25zIGludG8gdGhlIEFuZHJvaWQgTWFya2V0IHRoYXQgaGF2ZSBleGFjdGx5IHRoZQ0KK2ltcG9zc2libGUgdG8gcHVibGlzaCB0d28gYXBwbGljYXRpb25zIG9uIEdvb2dsZSBQbGF5IHRoYXQgaGF2ZSBleGFjdGx5IHRoZQ0KIHNhbWUgbmFtZS48L2xpPg0KIDxsaT5JbmNsdWRlIGEgY29tcGxldGUgc2V0IG9mIGRlZmF1bHQgcmVzb3VyY2VzIGluIGVhY2ggLmFwayBmaWxlLjwvbGk+DQogPC91bD4NCkBAIC02MzgsNyArNjM4LDcgQEAKICAgPHRyPg0KICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjxpbWcgc3JjPSIuLi8uLi8uLi9pbWFnZXMvcmVzb3VyY2VzL2Fycm93LnBuZyIgYWx0PSJhcnJvdyIgd2lkdGg9IjI2Ig0KIGJvcmRlcj0iMCI+PC90ZD4NCi0gICAgPHRkPlVwbG9hZCB5b3VyIC5hcGsgZmlsZSBvciBmaWxlcyB0byBNYXJrZXQsIHNlbGVjdGluZyB0aGUgYXBwcm9wcmlhdGUNCisgICAgPHRkPlVwbG9hZCB5b3VyIC5hcGsgZmlsZSBvciBmaWxlcyB0byBHb29nbGUgUGxheSwgc2VsZWN0aW5nIHRoZSBhcHByb3ByaWF0ZQ0KIGxhbmd1YWdlcyBhcw0KICAgICB5b3UgdXBsb2FkLiAoRm9yIG1vcmUgZGV0YWlscywgc2VlIDxhDQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3B1Ymxpc2hpbmcvcHVibGlzaGluZy5odG1sIj5QdWJsaXNoaW5nIFlvdXINCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3NlbnNvcnMvc2Vuc29yc19vdmVydmlldy5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3Mvc2Vuc29ycy9zZW5zb3JzX292ZXJ2aWV3LmpkCmluZGV4IDNjNWU5NGMuLjU0Mzg3MmMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3Mvc2Vuc29ycy9zZW5zb3JzX292ZXJ2aWV3LmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3Mvc2Vuc29ycy9zZW5zb3JzX292ZXJ2aWV3LmpkCkBAIC02MDYsNyArNjA2LDcgQEAKIHRoYXQgYSBnaXZlbiBzZW5zb3IgaXMgcHJlc2VudCBvbiBhIGRldmljZTo8L3A+CiA8dWw+CiAgIDxsaT5EZXRlY3Qgc2Vuc29ycyBhdCBydW50aW1lIGFuZCBlbmFibGUgb3IgZGlzYWJsZSBhcHBsaWNhdGlvbiBmZWF0dXJlcyBhcyBhcHByb3ByaWF0ZS48L2xpPgotICA8bGk+VXNlIEFuZHJvaWQgTWFya2V0IGZpbHRlcnMgdG8gdGFyZ2V0IGRldmljZXMgd2l0aCBzcGVjaWZpYyBzZW5zb3IgY29uZmlndXJhdGlvbnMuPC9saT4KKyAgPGxpPlVzZSBHb29nbGUgUGxheSBmaWx0ZXJzIHRvIHRhcmdldCBkZXZpY2VzIHdpdGggc3BlY2lmaWMgc2Vuc29yIGNvbmZpZ3VyYXRpb25zLjwvbGk+CiA8L3VsPgogCiA8cD5FYWNoIG9wdGlvbiBpcyBkaXNjdXNzZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy48L3A+CkBAIC02MzMsOSArNjMzLDkgQEAKICAgfQogPC9wcmU+CiAKLTxoND5Vc2luZyBBbmRyb2lkIE1hcmtldCBmaWx0ZXJzIHRvIHRhcmdldCBzcGVjaWZpYyBzZW5zb3IgY29uZmlndXJhdGlvbnM8L2g0PgorPGg0PlVzaW5nIEdvb2dsZSBQbGF5IGZpbHRlcnMgdG8gdGFyZ2V0IHNwZWNpZmljIHNlbnNvciBjb25maWd1cmF0aW9uczwvaDQ+CiAKLTxwPklmIHlvdSBhcmUgcHVibGlzaGluZyB5b3VyIGFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0IHlvdSBjYW4gdXNlIHRoZQorPHA+SWYgeW91IGFyZSBwdWJsaXNoaW5nIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkgeW91IGNhbiB1c2UgdGhlCiAgIDxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS8vdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwiPjxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7CiAgICAgPC9jb2RlPjwvYT4gZWxlbWVudCBpbiB5b3VyIG1hbmlmZXN0IGZpbGUgdG8gZmlsdGVyIHlvdXIgYXBwbGljYXRpb24gZnJvbSBkZXZpY2VzIHRoYXQgZG8gbm90CiBoYXZlIHRoZSBhcHByb3ByaWF0ZSBzZW5zb3IgY29uZmlndXJhdGlvbiBmb3IgeW91ciBhcHBsaWNhdGlvbi4gVGhlCkBAIC02NTAsNyArNjUwLDcgQEAKIDwvcHJlPgogCiA8cD5JZiB5b3UgYWRkIHRoaXMgZWxlbWVudCBhbmQgZGVzY3JpcHRvciB0byB5b3VyIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QsIHVzZXJzIHdpbGwgc2VlIHlvdXIKLWFwcGxpY2F0aW9uIG9uIEFuZHJvaWQgTWFya2V0IG9ubHkgaWYgdGhlaXIgZGV2aWNlIGhhcyBhbiBhY2NlbGVyb21ldGVyLjwvcD4KK2FwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5IG9ubHkgaWYgdGhlaXIgZGV2aWNlIGhhcyBhbiBhY2NlbGVyb21ldGVyLjwvcD4KIAogPHA+WW91IHNob3VsZCBzZXQgdGhlIGRlc2NyaXB0b3IgdG8gPGNvZGU+YW5kcm9pZDpyZXF1aXJlZD0idHJ1ZSI8L2NvZGU+IG9ubHkgaWYgeW91ciBhcHBsaWNhdGlvbgogcmVsaWVzIGVudGlyZWx5IG9uIGEgc3BlY2lmaWMgc2Vuc29yLiBJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgYSBzZW5zb3IgZm9yIHNvbWUgZnVuY3Rpb25hbGl0eSwgYnV0CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VpL2FjdGlvbmJhci5qZCBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmpkCmluZGV4IGU1OWZhMGYuLmJmNzM2OWEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmpkCisrKyBiL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdWkvYWN0aW9uYmFyLmpkCkBAIC0zNDksNyArMzQ5LDcgQEAKICAgPGxpPjxzdHJvbmc+RnJlcXVlbnRseSB1c2VkPC9zdHJvbmc+OiBJdCdzIGFuIGFjdGlvbiB0aGF0IHlvdXIgdXNlcnMgbmVlZCBzZXZlbiBvdXQgb2YgdGVuIHZpc2l0cwogb3IgdGhleSB1c2UgaXQgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdy4KICAgICA8cD5FeGFtcGxlIGZyZXF1ZW50IGFjdGlvbnM6ICJOZXcgbWVzc2FnZSIgaW4gdGhlIE1lc3NhZ2luZyBhcHAgYW5kCi0iU2VhcmNoIiBpbiBBbmRyb2lkIE1hcmtldC48L3A+CisiU2VhcmNoIiBvbiBHb29nbGUgUGxheS48L3A+CiAgIDwvbGk+CiAKICAgPGxpPjxzdHJvbmc+SW1wb3J0YW50PC9zdHJvbmc+OiBJdCdzIGFuIGFjdGlvbiB0aGF0IHlvdSBuZWVkIHVzZXJzIHRvIGVhc2lseSBkaXNjb3ZlciBvciwgaWYgaXQncwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91c2IvYWRrLmpkIGIvZG9jcy9odG1sL2d1aWRlL3RvcGljcy91c2IvYWRrLmpkCmluZGV4IDRkNWZiZmEuLmM4OTQ5YTMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9ndWlkZS90b3BpY3MvdXNiL2Fkay5qZAorKysgYi9kb2NzL2h0bWwvZ3VpZGUvdG9waWNzL3VzYi9hZGsuamQKQEAgLTk3LDYgKzk3LDkgQEAKICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnNwYXJrZnVuLmNvbS9wcm9kdWN0cy8xMDc0OCI+CiAgICAgICAgIFNwYXJrRnVuPC9hPjwvbGk+CiAKKyAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdHJvaWRvLmRlL2RlL3Nob3Bsc21hbGxnYnV5LWFuZHJvaWQtc3R1ZmZsc21hbGxnIj4KKyAgICAgICAgVHJvaWRvPC9hPjwvbGk+CisKICAgICAgIDwvb2w+CiAgICAgPC9kaXY+CiAgIDwvZGl2PgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2ltYWdlcy9ob21lL3BsYXlfbG9nby5wbmcgYi9kb2NzL2h0bWwvaW1hZ2VzL2hvbWUvcGxheV9sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGUzZWJmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9odG1sL2ltYWdlcy9ob21lL3BsYXlfbG9nby5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2luZGV4LmpkIGIvZG9jcy9odG1sL2luZGV4LmpkCmluZGV4IDQzMWE3ZDIuLmNmZDlmZjEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvaW5kZXguamQKQEAgLTEzLDE0ICsxMywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImFubm91bmNlbWVudC1ibG9jayI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0b3RhbCBtYXggd2lkdGggaXMgNTIwcHggLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IntAZG9jUm9vdH1kZXNpZ24vaW5kZXguaHRtbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1pbWFnZXMvaG9tZS9hbmRyb2lkLWRlc2lnbi5wbmciCi1hbHQ9IkFuZHJvaWQgRGVzaWduIiB3aWR0aD0iMTYwcHgiIHN0eWxlPSJwYWRkaW5nOjEwcHggMzNweCA1cHgiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWltYWdlcy9ob21lL3BsYXlfbG9nby5wbmciCithbHQ9Ikdvb2dsZSBQbGF5IiB3aWR0aD0iMTIwcHgiIHN0eWxlPSJwYWRkaW5nOjEwcHggNTJweCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iYW5ub3VuY2VtZW50IiBzdHlsZT0id2lkdGg6Mjc1cHgiPgotICAgIDxwPkludHJvZHVjaW5nIDxiPkFuZHJvaWQgRGVzaWduPC9iPjogVGhlIHBsYWNlIHRvIGxlYXJuIGFib3V0IHByaW5jaXBsZXMsIGJ1aWxkaW5nIGJsb2NrcywgYW5kIHBhdHRlcm5zCi0gICAgICBmb3IgY3JlYXRpbmcgd29ybGQtY2xhc3MgQW5kcm9pZCB1c2VyIGludGVyZmFjZXMuIFdoZXRoZXIgeW91J3JlIGEgVUkgcHJvZmVzc2lvbmFsIG9yIGEgZGV2ZWxvcGVyCi0gICAgICBwbGF5aW5nIHRoYXQgcm9sZSwgdGhlc2UgZG9jcyBzaG93IHlvdSBob3cgdG8gbWFrZSBnb29kIGRlc2lnbiBkZWNpc2lvbnMsIGJpZyBhbmQgc21hbGwuPC9wPgotICAgIDxwPjxhIGhyZWY9IntAZG9jUm9vdH1kZXNpZ24vaW5kZXguaHRtbCI+QW5kcm9pZCBEZXNpZ24gJnJhcXVvOzwvYT48L3A+CisgICAgPHA+SW50cm9kdWNpbmcgPHN0cm9uZz5Hb29nbGUgUGxheTwvc3Ryb25nPjogQW4gaW50ZWdyYXRlZCBkaWdpdGFsIGNvbnRlbnQgZGVzdGluYXRpb24gd2hlcmUKK3VzZXJzIGJ1eSBhbmQgZW5qb3kgYWxsIG9mIHRoZWlyIGZhdm9yaXRlIGNvbnRlbnQgaW4gb25lIHBsYWNlLiBJdCdzIHRoZSBuZXcgZGVzdGluYXRpb24gZm9yCitBbmRyb2lkIGFwcHMhPC9wPgorICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9hbmRyb2lkLWRldmVsb3BlcnMuYmxvZ3Nwb3QuY29tLzIwMTIvMDMvaW50cm9kdWNpbmctZ29vZ2xlLXBsYXkuaHRtbCI+UmVhZCBtb3JlICZyYXF1bzs8L2E+PC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gPCEtLSBlbmQgYW5ub3VjZW1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IDwhLS0gZW5kIGFubm91Y2VtZW50LWJsb2NrIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PCEtLSBlbmQgdG9wQW5ub3VuY2VtZW50IC0tPgpAQCAtNTksMTEgKzU5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIj48ZGl2IGNsYXNzPSJzZXBlcmF0b3IiPiZuYnNwOzwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImltYWdlQ2VsbCI+PGEgaHJlZj0iaHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoIj48aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvaWNvbl9tYXJrZXQuanBnIiBzdHlsZT0icGFkZGluZzowIiAvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImltYWdlQ2VsbCI+PGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPjxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX3BsYXkucG5nIiBzdHlsZT0icGFkZGluZzowIiAvPjwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPSJncmVlbiI+UHVibGlzaDwvaDI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+QW5kcm9pZCBNYXJrZXQgaXMgYW4gb3BlbiBzZXJ2aWNlIHRoYXQgbGV0cyB5b3UgZGlzdHJpYnV0ZSB5b3VyIGFwcHMgdG8gaGFuZHNldHMuPC9wPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9tYXJrZXQuYW5kcm9pZC5jb20vcHVibGlzaCI+TGVhcm4gbW9yZSAmcmFxdW87PC9hPjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Hb29nbGUgUGxheSBpcyBhbiBvcGVuIHNlcnZpY2UgdGhhdCBsZXRzIHlvdSBkaXN0cmlidXRlIHlvdXIgYXBwcyB0byBkZXZpY2VzLjwvcD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+TGVhcm4gbW9yZSAmcmFxdW87PC9hPjwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CkBAIC0xODIsOCArMTgyLDggQEAKICAgICAgICdkZXNjJzogIjxwPlJ1biBhbmQgZGVidWcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9ucyBkaXJlY3RseSBvbiBvbmUgb2YgdGhlc2UgIgogICsgImRldmljZXMuIE1vZGlmeSBhbmQgcmVidWlsZCB0aGUgQW5kcm9pZCBvcGVyYXRpbmcgc3lzdGVtLCBhbmQgZmxhc2ggaXQgb250byAiCiAgKyAidGhlIHBob25lLiBUaGUgQW5kcm9pZCBEZXYgUGhvbmVzIGFyZSBjYXJyaWVyLWluZGVwZW5kZW50LCBhbmQgYXZhaWxhYmxlIGZvciAiCi0gKyAicHVyY2hhc2UgYnkgZGV2ZWxvcGVycyB0aHJvdWdoIHRoZWlyIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBhY2NvdW50cy48L3A+PHA+ICIKLSArICI8YSBocmVmPSdodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2gnPlZpc2l0IEFuZHJvaWQgTWFya2V0ICIKKyArICJwdXJjaGFzZSBieSBkZXZlbG9wZXJzIHRocm91Z2ggdGhlaXIgR29vZ2xlIFBsYXkgcHVibGlzaGVyIGFjY291bnRzLjwvcD48cD4gIgorICsgIjxhIGhyZWY9J2h0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoJz5WaXNpdCBHb29nbGUgUGxheSAiCiAgKyAidG8gbGVhcm4gbW9yZSAmcmFxdW87PC9hPjwvcD4iCiAgICAgfSwKICAgICAqLwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkIGIvZG9jcy9odG1sL2ludGwvamEvY29tbXVuaXR5L2luZGV4LmpkCmluZGV4IDQ5MGIyM2YuLjk3MzlmMGQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9pbnRsL2phL2NvbW11bml0eS9pbmRleC5qZAorKysgYi9kb2NzL2h0bWwvaW50bC9qYS9jb21tdW5pdHkvaW5kZXguamQKQEAgLTg1LDcgKzg1LDcgQEAKIAogPGxpPjxiPkFuZHJvaWQg44Oe44O844Kx44OD44OIIOODmOODq+ODl+ODleOCqeODvOODqeODoDwvYj4gLSBBbmRyb2lkIOODnuODvOOCseODg+ODiOOBq+mWouOBmeOCi+izquWVj+OChOWVj+mhjOOBruWgseWRiuOCkuOBmeOCi+OBn+OCgeOBruOAgeOCpuOCp+ODluODmeODvOOCueOBruODh+OCo+OCueOCq+ODg+OCt+ODp+ODsyDjg5Xjgqnjg7zjg6njg6DjgafjgZnjgIIKIDx1bD4KLTxsaT5VUkw6Jm5ic3A7PGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldD9obD1qYSI+aHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldD9obD1qYTwvYT48L2xpPgorPGxpPlVSTDombmJzcDs8YSBocmVmPSJodHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2dvb2dsZXBsYXk/aGw9amEiPmh0dHA6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vZ29vZ2xlcGxheT9obD1qYTwvYT48L2xpPgogPC91bD4KIDwvbGk+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9pbnRsL2phL2luZGV4LmpkIGIvZG9jcy9odG1sL2ludGwvamEvaW5kZXguamQKaW5kZXggODA5NjI0Ny4uZmJiZDg4ZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL2ludGwvamEvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL2ludGwvamEvaW5kZXguamQKQEAgLTUyLDExICs1MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+PGRpdiBjbGFzcz0ic2VwZXJhdG9yIj4mbmJzcDs8L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJpbWFnZUNlbGwiPjxhIGhyZWY9Imh0dHA6Ly93d3cuYW5kcm9pZC5jb20vbWFya2V0Lmh0bWwiPjxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy9pY29uX21hcmtldC5qcGciIHN0eWxlPSJwYWRkaW5nOjAiIC8+PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iaW1hZ2VDZWxsIj48YSBocmVmPSJodHRwOi8vcGxheS5nb29nbGUuY29tL2FwcHMvcHVibGlzaCI+PGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL2ljb25fcGxheS5wbmciIHN0eWxlPSJwYWRkaW5nOjAiIC8+PC9hPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9ImdyZWVuIj7lhazplos8L2gyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkFuZHJvaWQg44Oe44O844Kx44OD44OI44Gv44CB44Ki44OX44Oq44Kx44O844K344On44Oz44KS5pC65biv56uv5pyr44Gr6YWN5L+h44GZ44KL44Gf44KB44Gu44Kq44O844OX44OzIOOCteODvOODk+OCueOBp+OBmeOAgjwvcD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD48YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2gvSG9tZSI+6Kmz57SwICZyYXF1bzs8L2E+PC9wPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoIj7oqbPntLAgJnJhcXVvOzwvYT48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgICAnbmFtZSc6IkRldiBQaG9uZSAxIiwKICAgICAgICdpbWcnOiJkZXZwaG9uZS1sYXJnZS5wbmciLAogICAgICAgJ3RpdGxlJzoiQW5kcm9pZCBEZXYgUGhvbmUgMSIsCi0gICAgICAnZGVzYyc6ICI8cD7jgZPjga7mkLrluK/pm7voqbHjgpLkvb/nlKjjgZnjgovjgZPjgajjgafjgIHplovnmbrjgZfjgZ8gQW5kcm9pZCDjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7Pjga7lrp/ooYzjgajjg4fjg5Djg4PjgrDjgpLooYzjgYbjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJBbmRyb2lkIOOCquODmuODrOODvOODhuOCo+ODs+OCsOOCt+OCueODhuODoOOCkuWkieabtOOBl+OBpuOBi+OCieODquODk+ODq+ODieOBl+OAgeaQuuW4r+mbu+ipseOBq+abuOOBjei+vOOCgOOBk+OBqOOBjOOBp+OBjeOBvuOBmeOAgkFuZHJvaWQgRGV2IFBob25lIDEg44Gv5pC65biv6YCa5L+h5Lya56S+44Gr5L6d5a2Y44GX44Gm44GK44KJ44Ga44CBPGEgaHJlZj0naHR0cDovL21hcmtldC5hbmRyb2lkLmNvbS9wdWJsaXNoJz5BbmRyb2lkIOODnuODvOOCseODg+ODiDwvYT7jgavnmbvpjLLmuIjjgb/jga7jg4fjg5njg63jg4Pjg5Hjg7zjgarjgonoqrDjgafjgoLos7zlhaXlj6/og73jgafjgZnjgII8L3A+PHA+PGEgaHJlZj0nL2d1aWRlL2RldmVsb3BpbmcvZGV2aWNlLmh0bWwjZGV2LXBob25lLTEnPkFuZHJvaWQgRGV2IFBob25lIDEg44Gu6Kmz57SwJnJhcXVvOzwvYT48L3A+IgorICAgICAgJ2Rlc2MnOiAiPHA+44GT44Gu5pC65biv6Zu76Kmx44KS5L2/55So44GZ44KL44GT44Go44Gn44CB6ZaL55m644GX44GfIEFuZHJvaWQg44Ki44OX44Oq44Kx44O844K344On44Oz44Gu5a6f6KGM44Go44OH44OQ44OD44Kw44KS6KGM44GG44GT44Go44GM44Gn44GN44G+44GZ44CCQW5kcm9pZCDjgqrjg5rjg6zjg7zjg4bjgqPjg7PjgrDjgrfjgrnjg4bjg6DjgpLlpInmm7TjgZfjgabjgYvjgonjg6rjg5Pjg6vjg4njgZfjgIHmkLrluK/pm7voqbHjgavmm7jjgY3ovrzjgoDjgZPjgajjgYzjgafjgY3jgb7jgZnjgIJBbmRyb2lkIERldiBQaG9uZSAxIOOBr+aQuuW4r+mAmuS/oeS8muekvuOBq+S+neWtmOOBl+OBpuOBiuOCieOBmuOAgTxhIGhyZWY9J2h0dHA6Ly9wbGF5Lmdvb2dsZS5jb20vYXBwcy9wdWJsaXNoJz5BbmRyb2lkIOODnuODvOOCseODg+ODiDwvYT7jgavnmbvpjLLmuIjjgb/jga7jg4fjg5njg63jg4Pjg5Hjg7zjgarjgonoqrDjgafjgoLos7zlhaXlj6/og73jgafjgZnjgII8L3A+PHA+PGEgaHJlZj0nL2d1aWRlL2RldmVsb3BpbmcvZGV2aWNlLmh0bWwjZGV2LXBob25lLTEnPkFuZHJvaWQgRGV2IFBob25lIDEg44Gu6Kmz57SwJnJhcXVvOzwvYT48L3A+IgogICAgIH0KIAogICB9CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvaW50bC9qYS9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZCBiL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCmluZGV4IGVjZWRkZTEuLjNmZDY2MDEgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCisrKyBiL2RvY3MvaHRtbC9pbnRsL2phL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCkBAIC04NSw3ICs4NSw3IEBACiAKIDxsaT48Yj5BbmRyb2lkIOODnuODvOOCseODg+ODiCDjg5jjg6vjg5fjg5Xjgqnjg7zjg6njg6A8L2I+IC0gQW5kcm9pZCDjg57jg7zjgrHjg4Pjg4jjgavplqLjgZnjgovos6rllY/jgoTllY/poYzjga7loLHlkYrjgpLjgZnjgovjgZ/jgoHjga7jgIHjgqbjgqfjg5bjg5njg7zjgrnjga7jg4fjgqPjgrnjgqvjg4Pjgrfjg6fjg7Mg44OV44Kp44O844Op44Og44Gn44GZ44CCCiA8dWw+Ci08bGk+VVJMOiZuYnNwOzxhIGhyZWY9Imh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2ZvcnVtL3AvQW5kcm9pZCtNYXJrZXQ/aGw9amEiPmh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L2ZvcnVtL3AvQW5kcm9pZCtNYXJrZXQ/aGw9amE8L2E+PC9saT4KKzxsaT5VUkw6Jm5ic3A7PGEgaHJlZj0iaHR0cDovL3N1cHBvcnQuZ29vZ2xlLmNvbS9nb29nbGVwbGF5P2hsPWphIj5odHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2dvb2dsZXBsYXk/aGw9amE8L2E+PC9saT4KIDwvdWw+CiA8L2xpPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY2FuLWktdXNlLXRoaXMtaW50ZW50LmpkCmluZGV4IGM1MjczMzEuLjc3ODdkMzFlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2Nhbi1pLXVzZS10aGlzLWludGVudC5qZApAQCAtNjgsNCArNjgsNCBAQAogVUkgYWNjb3JkaW5nbHkgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGRvaW5nIHNvbWV0aGluZyB0aGF0IHdvbid0IHdvcmsuIFRoZQogdGVjaG5pcXVlIGRlc2NyaWJlZCBoZXJlIGNhbiBhbHNvIGJlIHVzZWQgYXQgc3RhcnR1cCB0aW1lIHRvIGFzayB0aGUgdXNlcgogd2hldGhlciBoZSdkIGxpa2UgdG8gaW5zdGFsbCB0aGUgbWlzc2luZyBwYWNrYWdlLCB5b3UgY2FuIHRoZW4gc2ltcGx5IHJlZGlyZWN0Ci1oaW0gdG8gdGhlIEFuZHJvaWQgTWFya2V0IGJ5IHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBVUkkuPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2hpbSB0byBHb29nbGUgUGxheSBieSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgVVJJLjwvcD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2NvbnRhY3RzLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9jb250YWN0cy5qZAppbmRleCA4MzY1ZDI5Li4zNzQ1ODdiIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2NvbnRhY3RzLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvY29udGFjdHMuamQKQEAgLTI5OCwxMCArMjk4LDEwIEBACiAgICAgICA8bGk+QXQgbGF1bmNoIHRpbWUsIGNoZWNrIHRoZSB2ZXJzaW9uIG9mIHRoZSBTREsuIFRoZSB2ZXJzaW9uIG9mIHRoZSBTREsgCiBpcyBhdmFpbGFibGUgYXMge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTiNTREsgYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES30uPC9saT4KICAgICAgIDxsaT5JZiB0aGUgU0RLIHZlcnNpb24gaXMgZ3JlYXRlciBvciBlcXVhbCB0byA1IChBbmRyb2lkIDIuMCksIHNob3cgYSBkaWFsb2cgCi1zdWdnZXN0aW5nIHRvIHRoZSB1c2VyIHRoYXQgaXQncyB0aW1lIHRvIGdvIHRvIE1hcmtldCBhbmQgZmluZCBhIG5ldyB2ZXJzaW9uIG9mIAotdGhlIGFwcC4gWW91IGNhbiBldmVuIHByb3ZpZGUgYSBsaW5rIHRvIHRoZSBuZXcgYXBwIG9uIE1hcmtldCAoc2VlIDxhIAorc3VnZ2VzdGluZyB0byB0aGUgdXNlciB0aGF0IGl0J3MgdGltZSB0byBnbyB0byBHb29nbGUgUGxheSBhbmQgZmluZCBhIG5ldyB2ZXJzaW9uIG9mIAordGhlIGFwcC4gWW91IGNhbiBldmVuIHByb3ZpZGUgYSBsaW5rIHRvIHRoZSBuZXcgYXBwIG9uIEdvb2dsZSBQbGF5IChzZWUgPGEgCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvcHVibGlzaGluZy9wdWJsaXNoaW5nLmh0bWwjbWFya2V0aW50ZW50Ij5Vc2luZyBJbnRlbnRzIAotdG8gTGF1bmNoIE1hcmtldDwvYT4pLiA8L2xpPgordG8gTGF1bmNoIEdvb2dsZSBQbGF5PC9hPikuIDwvbGk+CiAgICAgPC91bD4KICAgPGxpPkNoYW5nZSB0aGUgbmV3IGFwcGxpY2F0aW9uOjwvbGk+CiAgICAgPHVsPgpAQCAtMzExLDE0ICszMTEsMTQgQEAKICAgICAgIDxsaT5Nb2RpZnkgdGhhdCBhcHBsaWNhdGlvbidzIEFuZHJvaWRNYW5pZmVzdC54bWwgZmlsZTogPC9saT4KICAgICAgICAgPHVsPgogICAgICAgICAgIDxsaT5HaXZlIHRoZSBhcHBsaWNhdGlvbiBhIG5ldyBuYW1lIGFuZCBhIG5ldyBwYWNrYWdlIG5hbWUuIEN1cnJlbnRseSAKLUFuZHJvaWQgTWFya2V0IGRvZXMgbm90IGFsbG93IHlvdSB0byBoYXZlIHR3byBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgc2FtZSAKK0dvb2dsZSBQbGF5IGRvZXMgbm90IGFsbG93IHlvdSB0byBoYXZlIHR3byBhcHBsaWNhdGlvbnMgd2l0aCB0aGUgc2FtZSAKIG5hbWUvcGFja2FnZS48L2xpPgogICAgICAgICAgIDxsaT5VcGRhdGUgKG9yIGFkZCkgdGhlIDxjb2RlPmFuZHJvaWQ6bWluU2RrVmVyc2lvbjwvY29kZT4gYXR0cmlidXRlIAogdG8gdGhlIDxjb2RlPiZsdDt1c2VzLXNkayZndDs8L2NvZGU+IGVsZW1lbnQuIFRvIHVzZSB0aGUgbmV3IENvbnRhY3RzIEFQSSwgCiB5b3Ugc2hvdWxkIHNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB0byAiNSIgKG9yIGhpZ2hlciwgYXMgYXBwcm9wcmlhdGUpLjwvbGk+CiAgICAgICAgIDwvdWw+CiAgICAgICA8L3VsPgotICAgIDxsaT5QdWJsaXNoIGJvdGggYXBwcyBvbiBNYXJrZXQsIHRoZSBvbGQgYXBwIG9uZSBhcyBhbiB1cGdyYWRlIGFuZCB0aGUgCisgICAgPGxpPlB1Ymxpc2ggYm90aCBhcHBzIG9uIEdvb2dsZSBQbGF5LCB0aGUgb2xkIGFwcCBvbmUgYXMgYW4gdXBncmFkZSBhbmQgdGhlIAogb3RoZXIgYXMgbmV3LiBNYWtlIHN1cmUgdG8gZXhwbGFpbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhcHBzIGluIHRoZWlyIAogZGVzY3JpcHRpb25zLjwvbGk+CiA8L3VsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5qZAppbmRleCBiZmJiYjM0Li4wNjkyYTYyIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL2xpdmUtd2FsbHBhcGVycy5qZApAQCAtNzYsMTkgKzc2LDE5IEBACiBzdXBwb3J0ZWQgb25seSBvbiBBbmRyb2lkIDIuMSAoQVBJIGxldmVsIDcpIGFuZCBoaWdoZXIgdmVyc2lvbnMgb2YgdGhlIHBsYXRmb3JtLgogVG8gZW5zdXJlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBjYW4gb25seSBiZSBpbnN0YWxsZWQgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQKIGxpdmUgd2FsbHBhcGVycywgcmVtZW1iZXIgdG8gYWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgbWFuaWZlc3QKLWJlZm9yZSBwdWJsaXNoaW5nIHRvIEFuZHJvaWQgTWFya2V0OjwvcD4KK2JlZm9yZSBwdWJsaXNoaW5nIHRvIEdvb2dsZSBQbGF5OjwvcD4KIAogPHVsPgogPGxpPjxjb2RlPiZsdDt1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjciIC8mZ3Q7PC9jb2RlPiwgd2hpY2ggaW5kaWNhdGVzCi10byBBbmRyb2lkIE1hcmtldCBhbmQgdGhlIHBsYXRmb3JtIHRoYXQgeW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBBbmRyb2lkIDIuMSBvcgordG8gR29vZ2xlIFBsYXkgYW5kIHRoZSBwbGF0Zm9ybSB0aGF0IHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZXMgQW5kcm9pZCAyLjEgb3IKIGhpZ2hlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L2FwaS1sZXZlbHMuaHRtbCI+QVBJCiBMZXZlbHM8L2E+IGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtc2RrLWVsZW1lbnQuaHRtbCI+PGNvZGU+Jmx0O3VzZXMtc2RrJmd0OzwvY29kZT48L2E+CiBlbGVtZW50LjwvbGk+CiA8bGk+PGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuc29mdHdhcmUubGl2ZV93YWxscGFwZXIiIC8mZ3Q7PC9jb2RlPiwKLXdoaWNoIHRlbGxzIEFuZHJvaWQgTWFya2V0IHRoYXQgeW91ciBhcHBsaWNhdGlvbiBpbmNsdWRlcyBhIGxpdmUgd2FsbHBhcGVyCi1BbmRyb2lkIE1hcmtldCB1c2VzIHRoaXMgZmVhdHVyZSBhcyBhIGZpbHRlciwgd2hlbiBwcmVzZW50aW5nIHVzZXJzIGxpc3RzIG9mCi1hdmFpbGFibGUgYXBwbGljYXRpb25zLiBXaGVuIHlvdSBkZWNsYXJpbmcgdGhpcyBmZWF0dXJlLCBBbmRyb2lkIE1hcmtldAord2hpY2ggdGVsbHMgR29vZ2xlIFBsYXkgdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGluY2x1ZGVzIGEgbGl2ZSB3YWxscGFwZXIKK0dvb2dsZSBQbGF5IHVzZXMgdGhpcyBmZWF0dXJlIGFzIGEgZmlsdGVyLCB3aGVuIHByZXNlbnRpbmcgdXNlcnMgbGlzdHMgb2YKK2F2YWlsYWJsZSBhcHBsaWNhdGlvbnMuIFdoZW4geW91IGRlY2xhcmluZyB0aGlzIGZlYXR1cmUsIEdvb2dsZSBQbGF5CiBkaXNwbGF5cyB5b3VyIGFwcGxpY2F0aW9uIG9ubHkgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBzdXBwb3J0IGxpdmUgd2FsbHBhcGVycywKIHdoaWxlIGhpZGluZyBpdCBmcm9tIG90aGVyIGRldmljZXMgb24gd2hpY2ggaXQgd291bGQgbm90IGJlIGFibGUgdG8gcnVuLiBGb3IKIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCkBAIC05OCw1ICs5OCw1IEBACiBlbGVtZW50LjwvbGk+CiA8L3VsPgogCi08cD5NYW55IGdyZWF0IGxpdmUgd2FsbHBhcGVycyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgb24gQW5kcm9pZCBNYXJrZXQgYW5kCis8cD5NYW55IGdyZWF0IGxpdmUgd2FsbHBhcGVycyBhcmUgYWxyZWFkeSBhdmFpbGFibGUgb24gR29vZ2xlIFBsYXkgYW5kCiB3ZSBjYW4ndCB3YWl0IHRvIHNlZSBtb3JlITwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvYXJ0aWNsZXMvc3BlZWNoLWlucHV0LmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuamQKaW5kZXggMDg2N2ZmMi4uMmY5Y2Q2OSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuamQKKysrIGIvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy9zcGVlY2gtaW5wdXQuamQKQEAgLTksNyArOSw3IEBACiAKIDxwPlNwZWVjaCBpbnB1dCBhZGRzIGFub3RoZXIgZGltZW5zaW9uIHRvIHN0YXlpbmcgaW4gdG91Y2guCiBHb29nbGUncyBWb2ljZSBTZWFyY2ggYXBwbGljYXRpb24sIHdoaWNoIGlzIHByZS1pbnN0YWxsZWQgb24gbWFueSBBbmRyb2lkIGRldmljZXMKLWFuZCBhdmFpbGFibGUgaW4gQW5kcm9pZCBNYXJrZXQsIHByb3ZpZGVzIHBvd2VyZnVsIGZlYXR1cmVzIGxpa2UgInNlYXJjaCBieSB2b2ljZSIKK2FuZCBhdmFpbGFibGUgb24gR29vZ2xlIFBsYXksIHByb3ZpZGVzIHBvd2VyZnVsIGZlYXR1cmVzIGxpa2UgInNlYXJjaCBieSB2b2ljZSIKIGFuZCBWb2ljZSBBY3Rpb25zIGxpa2UgIk5hdmlnYXRlIHRvLiIgRnVydGhlcgogZW5oYW5jaW5nIHRoZSB2b2ljZSBleHBlcmllbmNlLCBBbmRyb2lkIDIuMSBpbnRyb2R1Y2VzIGEgPGEKIGhyZWY9Imh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1sYU9sa0Q4TG1adyI+CkBAIC0yMSw3ICsyMSw3IEBACiA8cD4gV2UgYmVsaWV2ZSBzcGVlY2ggY2FuCiBmdW5kYW1lbnRhbGx5IGNoYW5nZSB0aGUgbW9iaWxlIGV4cGVyaWVuY2UuIFdlIHdvdWxkIGxpa2UgdG8gaW52aXRlIGV2ZXJ5CiBBbmRyb2lkIGFwcGxpY2F0aW9uIGRldmVsb3BlciB0byBjb25zaWRlciBpbnRlZ3JhdGluZyBzcGVlY2ggaW5wdXQgY2FwYWJpbGl0aWVzCi12aWEgdGhlIEFuZHJvaWQgU0RLLiAgT25lIG9mIG91ciBmYXZvcml0ZSBhcHBzIGluIHRoZSBNYXJrZXQgdGhhdCBpbnRlZ3JhdGVzCit2aWEgdGhlIEFuZHJvaWQgU0RLLiAgT25lIG9mIG91ciBmYXZvcml0ZSBhcHBzIG9uIEdvb2dsZSBQbGF5IHRoYXQgaW50ZWdyYXRlcwogc3BlZWNoIGlucHV0IGlzIDxhIGhyZWY9Imh0dHA6Ly93d3cuaGFuZGNlbnQuY29tLyI+SGFuZGNlbnQgU01TPC9hPiwgCiBiZWNhdXNlIHlvdSBjYW4gZGljdGF0ZSBhIHJlcGx5IHRvIGFueSBTTVMgd2l0aCBhCiBxdWljayB0YXAgb24gdGhlIFNNUyBwb3B1cCB3aW5kb3cuIEhlcmUgaXMgU3BlZWNoIGlucHV0IGludGVncmF0ZWQgaW50bwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy90dHMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3R0cy5qZAppbmRleCA3ZDA3YTg5Li45MjlkMDg0IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3R0cy5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3R0cy5qZApAQCAtNDMsNyArNDMsNyBAQAoga25vdyB0byBpbnN0YWxsIHRoZSBkYXRhIHRoYXQncyByZXF1aXJlZCBmb3IgdGhlIGRldmljZSB0byBiZWNvbWUgYQogbXVsdGktbGluZ3VhbCB0YWxraW5nIG1hY2hpbmUhIERvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBkYXRhIGlzCiBhY2NvbXBsaXNoZWQgYnkgZmlyaW5nIG9mZiB0aGUgQUNUSU9OX0lOU1RBTExfVFRTX0RBVEEgaW50ZW50LCB3aGljaCB3aWxsIHRha2UKLXRoZSB1c2VyIHRvIEFuZHJvaWQgTWFya2V0LCBhbmQgd2lsbCBsZXQgaGVyL2hpbSBpbml0aWF0ZSB0aGUgZG93bmxvYWQuCit0aGUgdXNlciB0byBHb29nbGUgUGxheSwgYW5kIHdpbGwgbGV0IGhlci9oaW0gaW5pdGlhdGUgdGhlIGRvd25sb2FkLgogSW5zdGFsbGF0aW9uIG9mIHRoZSBkYXRhIHdpbGwgaGFwcGVuIGF1dG9tYXRpY2FsbHkgb25jZSB0aGUgZG93bmxvYWQgY29tcGxldGVzLgogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHdoYXQgeW91ciBpbXBsZW1lbnRhdGlvbiBvZgogPGNvZGU+b25BY3Rpdml0eVJlc3VsdCgpPC9jb2RlPiB3b3VsZCBsb29rIGxpa2U6PC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9hcnRpY2xlcy91aS0xLjYuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5qZAppbmRleCAwOTEwOGRkLi5iMzIzOGUzIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2FydGljbGVzL3VpLTEuNi5qZApAQCAtMTI5LDQgKzEyOSw0IEBACiAKIDxwPlRoZSBBbmRyb2lkIHRlYW0gaXMgY29tbWl0dGVkIHRvIGhlbHBpbmcgeW91IHdyaXRlIGFwcGxpY2F0aW9ucyBpbiB0aGUKIGVhc2llc3QgYW5kIG1vc3QgZWZmaWNpZW50IHdheSBwb3NzaWJsZS4gV2UgaG9wZSB5b3UgZmluZCB0aGVzZSBpbXByb3ZlbWVudHMKLXVzZWZ1bCBhbmQgd2UncmUgZXhjaXRlZCB0byBzZWUgeW91ciBhcHBsaWNhdGlvbnMgb24gQW5kcm9pZCBNYXJrZXQuPC9wPgordXNlZnVsIGFuZCB3ZSdyZSBleGNpdGVkIHRvIHNlZSB5b3VyIGFwcGxpY2F0aW9ucyBvbiBHb29nbGUgUGxheS48L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2NvbW11bml0eS1ncm91cHMuamQKaW5kZXggNTk5YzRhZS4uNmJkMzQ3YyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Jlc291cmNlcy9jb21tdW5pdHktZ3JvdXBzLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvY29tbXVuaXR5LWdyb3Vwcy5qZApAQCAtMTQsNyArMTQsNyBAQAogICAgIDxsaT48YSBocmVmPSIjVXNpbmdFbWFpbCI+VXNpbmcgZW1haWwgd2l0aCB0aGUgbWFpbGluZyBsaXN0czwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSIjQXBwbGljYXRpb25EZXZlbG9wZXJMaXN0cyI+QXBwbGljYXRpb24gZGV2ZWxvcGVyIG1haWxpbmcgbGlzdHM8L2E+PC9saT4KICAgPC9vbD48L2xpPgotICA8bGk+PGEgaHJlZj0iI01hcmtldEhlbHAiPkFuZHJvaWQgTWFya2V0IEhlbHAgRm9ydW08L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNQbGF5SGVscCI+R29vZ2xlIFBsYXkgSGVscCBGb3J1bTwvYT48L2xpPgogICA8L29sPgogCiA8L2Rpdj4KQEAgLTExMyw4ICsxMTMsOCBAQAogPC91bD4KIAogCi08aDIgaWQ9Ik1hcmtldEhlbHAiPkFuZHJvaWQgTWFya2V0IEhlbHAgRm9ydW08L2gyPgorPGgyIGlkPSJQbGF5SGVscCI+R29vZ2xlIFBsYXkgSGVscCBGb3J1bTwvaDI+CiAKLTxwPlRoZSA8YSBocmVmPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC9mb3J1bS9wL0FuZHJvaWQrTWFya2V0Ij5BbmRyb2lkIE1hcmtldCBIZWxwIEZvcnVtPC9hPiBpcyBhIHdlYi1iYXNlZCBkaXNjdXNzaW9uIGZvcnVtIHdoZXJlIHlvdSBjYW4gYXNrIHF1ZXN0aW9ucyBvciByZXBvcnQgaXNzdWVzIHJlbGF0aW5nIHRvIEFuZHJvaWQgTWFya2V0LjwvcD4KKzxwPlRoZSA8YSBocmVmPSJodHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2dvb2dsZXBsYXkiPkdvb2dsZSBQbGF5IEhlbHAgRm9ydW08L2E+IGlzIGEgd2ViLWJhc2VkIGRpc2N1c3Npb24gZm9ydW0gd2hlcmUgeW91IGNhbiBhc2sgcXVlc3Rpb25zIG9yIHJlcG9ydCBpc3N1ZXMgcmVsYXRpbmcgdG8gR29vZ2xlIFBsYXkuPC9wPgogCi08cCBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+PGEgaHJlZj0iaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldCI+aHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvZm9ydW0vcC9BbmRyb2lkK01hcmtldDwvYT48L3A+Cis8cCBzdHlsZT0ibWFyZ2luLWxlZnQ6IDJlbSI+PGEgaHJlZj0iaHR0cDovL3N1cHBvcnQuZ29vZ2xlLmNvbS9nb29nbGVwbGF5Ij5odHRwOi8vc3VwcG9ydC5nb29nbGUuY29tL2dvb2dsZXBsYXk8L2E+PC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvb3BlbmdsLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvb3BlbmdsLmpkCmluZGV4IDY5NzhkNjIuLmIxYzMyMzQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL29wZW5nbC5qZAorKysgYi9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9vcGVuZ2wuamQKQEAgLTUwLDcgKzUwLDcgQEAKIHVzZXMuPC9wPgogCiA8cCBjbGFzcz0ibm90ZSI+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIGRhdGEgaXMgYmFzZWQgb24gdGhlIG51bWJlcgotb2YgQW5kcm9pZCBkZXZpY2VzIHRoYXQgaGF2ZSBhY2Nlc3NlZCBBbmRyb2lkIE1hcmtldCB3aXRoaW4gYSA3LWRheSBwZXJpb2QKK29mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGhhdmUgYWNjZXNzZWQgR29vZ2xlIFBsYXkgd2l0aGluIGEgNy1kYXkgcGVyaW9kCiBlbmRpbmcgb24gdGhlIGRhdGEgY29sbGVjdGlvbiBkYXRlIG5vdGVkIGJlbG93LjwvcD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9wbGF0Zm9ybS12ZXJzaW9ucy5qZCBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3BsYXRmb3JtLXZlcnNpb25zLmpkCmluZGV4IDk2MzEwNTkuLjY1YTU1NzUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3BsYXRmb3JtLXZlcnNpb25zLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3BsYXRmb3JtLXZlcnNpb25zLmpkCkBAIC00NywxMiArNDcsMTIgQEAKIDxoMyBpZD0iQ3VycmVudCI+Q3VycmVudCBEaXN0cmlidXRpb248L2gzPgogCiA8cD5UaGUgZm9sbG93aW5nIHBpZSBjaGFydCBhbmQgdGFibGUgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBBbmRyb2lkIGRldmljZXMgdGhhdCBoYXZlIGFjY2Vzc2VkCi1BbmRyb2lkIE1hcmtldCB3aXRoaW4gYSAxNC1kYXkgcGVyaW9kIGVuZGluZyBvbiB0aGUgZGF0YSBjb2xsZWN0aW9uIGRhdGUgbm90ZWQgYmVsb3cuPC9wPgorR29vZ2xlIFBsYXkgd2l0aGluIGEgMTQtZGF5IHBlcmlvZCBlbmRpbmcgb24gdGhlIGRhdGEgY29sbGVjdGlvbiBkYXRlIG5vdGVkIGJlbG93LjwvcD4KIAogPGRpdiBjbGFzcz0iZGFzaGJvYXJkLXBhbmVsIj4KIAogPGltZyBhbHQ9IiIgaGVpZ2h0PSIyNTAiIHdpZHRoPSI0NzAiCi1zcmM9Imh0dHA6Ly9jaGFydC5hcGlzLmdvb2dsZS5jb20vY2hhcnQ/JmNodD1wJmNocz00NjB4MjUwJmNoZD10OjAuMSwwLjQsMC44LDYuNiwyNS4yLDAuNSw2MS40LDEuMSwyLjEsMC40LDEuMiZjaGw9QW5kcm9pZCUyMDEuNXxBbmRyb2lkJTIwMS42fEFuZHJvaWQlMjAyLjF8QW5kcm9pZCUyMDIuMnxBbmRyb2lkJTIwMi4zfEFuZHJvaWQlMjAyLjMuM3xBbmRyb2lkJTIwMy4xfEFuZHJvaWQlMjAzLjJ8QW5kcm9pZCUyMDQuMHxBbmRyb2lkJTIwNC4wLjMmY2hjbz1jNGRmOWIsNmZhZDBjIiAvPgorc3JjPSJodHRwOi8vY2hhcnQuYXBpcy5nb29nbGUuY29tL2NoYXJ0PyZjaHQ9cCZjaHM9NDYweDI1MCZjaGQ9dDowLjQsMC44LDYuNiwyNS4yLDAuNSw2MS40LDAuMSwxLjEsMi4xLDAuNCwxLjImY2hsPUFuZHJvaWQlMjAxLjV8QW5kcm9pZCUyMDEuNnxBbmRyb2lkJTIwMi4xfEFuZHJvaWQlMjAyLjJ8QW5kcm9pZCUyMDIuM3xBbmRyb2lkJTIwMi4zLjN8QW5kcm9pZCUyMDMuMHxBbmRyb2lkJTIwMy4xfEFuZHJvaWQlMjAzLjJ8QW5kcm9pZCUyMDQuMHxBbmRyb2lkJTIwNC4wLjMmY2hjbz1jNGRmOWIsNmZhZDBjIiAvPgogCiA8dGFibGU+CiA8dHI+CkBAIC0xMDMsNyArMTAzLDcgQEAKIGxpbmUgZm9yIHRoYXQgdmVyc2lvbiBtZWV0cyB0aGUgeS1heGlzIG9uIHRoZSByaWdodC48L3A+CiAKIDxwPkVhY2ggZGF0YXNldCBpbiB0aGUgdGltZWxpbmUgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBBbmRyb2lkIGRldmljZXMgdGhhdCBhY2Nlc3NlZAotQW5kcm9pZCBNYXJrZXQgd2l0aGluIGEgMTQtZGF5IHBlcmlvZCBlbmRpbmcgb24gdGhlIGRhdGUgaW5kaWNhdGVkIG9uIHRoZSB4LWF4aXMuPC9wPgorR29vZ2xlIFBsYXkgd2l0aGluIGEgMTQtZGF5IHBlcmlvZCBlbmRpbmcgb24gdGhlIGRhdGUgaW5kaWNhdGVkIG9uIHRoZSB4LWF4aXMuPC9wPgogCiA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtcGFuZWwiPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9zY3JlZW5zLmpkIGIvZG9jcy9odG1sL3Jlc291cmNlcy9kYXNoYm9hcmQvc2NyZWVucy5qZAppbmRleCA2YzA0ZjdlLi5lOWM3MzhlIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvcmVzb3VyY2VzL2Rhc2hib2FyZC9zY3JlZW5zLmpkCisrKyBiL2RvY3MvaHRtbC9yZXNvdXJjZXMvZGFzaGJvYXJkL3NjcmVlbnMuamQKQEAgLTUzLDcgKzUzLDcgQEAKIFNjcmVlbnM8L2E+LjwvcD4KIAogPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhpcyBkYXRhIGlzIGJhc2VkIG9uIHRoZSBudW1iZXIKLW9mIEFuZHJvaWQgZGV2aWNlcyB0aGF0IGhhdmUgYWNjZXNzZWQgQW5kcm9pZCBNYXJrZXQgd2l0aGluIGEgNy1kYXkgcGVyaW9kCitvZiBBbmRyb2lkIGRldmljZXMgdGhhdCBoYXZlIGFjY2Vzc2VkIEdvb2dsZSBQbGF5IHdpdGhpbiBhIDctZGF5IHBlcmlvZAogZW5kaW5nIG9uIHRoZSBkYXRhIGNvbGxlY3Rpb24gZGF0ZSBub3RlZCBiZWxvdy48L3A+CiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi1oaWdobGlnaHRzLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi1oaWdobGlnaHRzLmpkCmluZGV4IDg0NzY2ZDYuLmYwYTUwZmIgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjYtaGlnaGxpZ2h0cy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS42LWhpZ2hsaWdodHMuamQKQEAgLTM4LDcgKzM4LDcgQEAKIAogPHVsPgogICA8bGk+PGEgaHJlZj0iI1VzZXJGZWF0dXJlcyI+TmV3IFVzZXIgRmVhdHVyZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IiNBbmRyb2lkTWFya2V0VXBkYXRlcyI+QW5kcm9pZCBNYXJrZXQgVXBkYXRlczwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI0dvb2dsZVBsYXlVcGRhdGVzIj5Hb29nbGUgUGxheSBVcGRhdGVzPC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSIjUGxhdGZvcm1UZWNobm9sb2dpZXMiPk5ldyBQbGF0Zm9ybSBUZWNobm9sb2dpZXM8L2E+PC9saT4KIDwvdWw+CiAKQEAgLTExOCwxNCArMTE4LDE0IEBACiAKIAogCi08aDIgaWQ9IkFuZHJvaWRNYXJrZXRVcGRhdGVzIiBzdHlsZT0iY2xlYXI6cmlnaHQiPkFuZHJvaWQgTWFya2V0IFVwZGF0ZXM8L2gyPgorPGgyIGlkPSJHb29nbGVQbGF5VXBkYXRlcyIgc3R5bGU9ImNsZWFyOnJpZ2h0Ij5Hb29nbGUgUGxheSBVcGRhdGVzPC9oMj4KIAogPGRpdiBjbGFzcz0ic2NyZWVuc2hvdCIgc3R5bGU9Im1hcmdpbi10b3A6LTM1cHgiPgogPGltZyBzcmM9ImltYWdlcy9tYXJrZXQucG5nIiBjbGFzcz0ic2NyZWVuc2hvdCIgYWx0PSIiIC8+PGJyLz4KLU5ldyBBbmRyb2lkIE1hcmtldCBVSQorTmV3IEdvb2dsZSBQbGF5IFVJCiA8L2Rpdj4KIAotPHA+Rm9yIGRldmljZXMgd2l0aCBBbmRyb2lkIE1hcmtldCwgdGhlIGxhdGVzdCB2ZXJzaW9uIGltcHJvdmVzIHRoZSBvdmVyYWxsIHVzZXIgZXhwZXJpZW5jZSBhbmQgbWFrZXMKKzxwPkZvciBkZXZpY2VzIHdpdGggR29vZ2xlIFBsYXksIHRoZSBsYXRlc3QgdmVyc2lvbiBpbXByb3ZlcyB0aGUgb3ZlcmFsbCB1c2VyIGV4cGVyaWVuY2UgYW5kIG1ha2VzCiBpdCBlYXNpZXIgZm9yIHVzZXJzIHRvIGRpc2NvdmVyIGdyZWF0IGFwcHMgYW5kIGdhbWVzIGZyb20gZGV2ZWxvcGVycy48L3A+CiAKIDx1bD4KQEAgLTE1Nyw3ICsxNTcsNyBAQAogSXQgYWxsb3dzIGFueSBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvICJzcGVhayIgYSBzdHJpbmcgb2YgdGV4dCB3aXRoIGFuIGFjY2VudCB0aGF0IG1hdGNoZXMgdGhlIGxhbmd1YWdlLiAKIFRoZSBlbmdpbmUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6IEVuZ2xpc2ggKEFtZXJpY2FuIGFuZCBCcml0aXNoIGFjY2VudHMpLCBGcmVuY2gsIAogSXRhbGlhbiwgR2VybWFuIGFuZCBTcGFuaXNoLiBJZiB5b3UncmUgdXNpbmcgYSBULU1vYmlsZSBHMSBvciBEcmVhbSBkZXZpY2UsIHlvdSdsbCBuZWVkIHRvIGRvd25sb2FkIHRoZSAKLVNwZWVjaFN5bnRoZXNpcyBEYXRhIEluc3RhbGxlciBmcm9tIEFuZHJvaWQgTWFya2V0LCB3aGljaCBpbmNsdWRlcyB0aGUgInZvaWNlcyIgbmVlZGVkIGJ5IHRoZSAKK1NwZWVjaFN5bnRoZXNpcyBEYXRhIEluc3RhbGxlciBmcm9tIEdvb2dsZSBQbGF5LCB3aGljaCBpbmNsdWRlcyB0aGUgInZvaWNlcyIgbmVlZGVkIGJ5IHRoZSAKIHRleHQtdG8tc3BlZWNoIGVuZ2luZS48L3A+CiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjEuamQKaW5kZXggM2YyODU1MS4uMWVlODMzYyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4xLmpkCkBAIC0xOTEsNyArMTkxLDcgQEAKICZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNvZnR3YXJlLmxpdmVfd2FsbHBhcGVyIiAvPgogPC9wcmU+CiAKLTxwPldoZW4geW91J3ZlIHB1Ymxpc2hlZCB5b3VyIGFwcGxpY2F0aW9uLCBBbmRyb2lkIE1hcmtldCBjaGVja3MgZm9yIHRoZQorPHA+V2hlbiB5b3UndmUgcHVibGlzaGVkIHlvdXIgYXBwbGljYXRpb24sIEdvb2dsZSBQbGF5IGNoZWNrcyBmb3IgdGhlCiBwcmVzZW5jZSBvZiB0aGlzIGVsZW1lbnQgYW5kIHVzZXMgaXQgYXMgYSBmaWx0ZXIsIGVuc3VyaW5nIHRoYXQgeW91ciBhcHBsaWNhdGlvbgogaXMgbm90IG1hZGUgYXZhaWxhYmxlIHRvIHVzZXJzIHdob3NlIGRldmljZXMgZG8gbm90IHN1cHBvcnQgTGl2ZSBXYWxscGFwZXJzLgogPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMi1oaWdobGlnaHRzLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMi1oaWdobGlnaHRzLmpkCmluZGV4IDhiZWQ2NzUuLjM3YTIwZDUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjItaGlnaGxpZ2h0cy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLWhpZ2hsaWdodHMuamQKQEAgLTIzMSw3ICsyMzEsNyBAQAogCiA8aDM+QW5kcm9pZCBBcHBsaWNhdGlvbiBFcnJvciBSZXBvcnRzPC9oMz4KIAotPHA+TmV3IGJ1ZyByZXBvcnRpbmcgZmVhdHVyZSBmb3IgQW5kcm9pZCBNYXJrZXQgYXBwcyBlbmFibGVzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBjcmFzaCBhbmQgZnJlZXplCis8cD5OZXcgYnVnIHJlcG9ydGluZyBmZWF0dXJlIGZvciBHb29nbGUgUGxheSBhcHBzIGVuYWJsZXMgZGV2ZWxvcGVycyB0byByZWNlaXZlIGNyYXNoIGFuZCBmcmVlemUKIHJlcG9ydHMgZnJvbSB0aGVpciB1c2Vycy4gVGhlIHJlcG9ydHMgd2lsbCBiZSBhdmFpbGFibGUgd2hlbiB0aGV5IGxvZyBpbnRvIHRoZWlyIHB1Ymxpc2hlcgogYWNjb3VudC48L3A+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuMy5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuMy5qZAppbmRleCAwMjNlMmU0Li40MDVjMDYzIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjMuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy4zLmpkCkBAIC0xOTIsNyArMTkyLDcgQEAKIGRlY2xhcmluZyA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uCiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5ORkMiJmd0OzwvY29kZT4gaW4gdGhlaXIgbWFuaWZlc3QgZmlsZXMuPC9wPgogCi08cD5BZGRpdGlvbmFsbHksIGRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEFuZHJvaWQgTWFya2V0LCBzdWNoIHRoYXQKKzxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXksIHN1Y2ggdGhhdAogdGhlaXIgYXBwbGljYXRpb25zIGFyZSBub3QgZGlzY292ZXJhYmxlIHRvIHVzZXJzIHdob3NlIGRldmljZXMgZG8gbm90IHN1cHBvcnQKIE5GQy4gVG8gcmVxdWVzdCBmaWx0ZXJpbmcsIGFkZAogPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUubmZjIgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy40LmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy40LmpkCmluZGV4IGVlYWE2OWEuLjRiZmRhYmQgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuNC5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLjQuamQKQEAgLTE5Nyw3ICsxOTcsNyBAQAogYWNjZXNzb3JpZXMsIHBsZWFzZSBzZWUgdGhlIHJlbGF0ZWQgPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvdXNiL2luZGV4Lmh0bWwiPmRldmVsb3BlciBkb2N1bWVudGF0aW9uPC9hPi48L3A+CiAKLTxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQsIHN1Y2ggdGhhdAorPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBHb29nbGUgUGxheSwgc3VjaCB0aGF0CiB0aGVpciBhcHBsaWNhdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbyBub3QgcHJvdmlkZSB0aGUKIGFwcHJvcHJpYXRlIGFjY2Vzc29yeSBzdXBwb3J0LiBUbyByZXF1ZXN0IGZpbHRlcmluZywgYWRkIHRoZSBlbGVtZW50IGJlbG93CiB0byB0aGUgYXBwbGljYXRpb24gbWFuaWZlc3Q6PC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjMuamQKaW5kZXggZmM0ZjVhYS4uYjQ2NjkxMyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMy5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4zLmpkCkBAIC0xNTAsNyArMTUwLDcgQEAKIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLklOVEVSTkVUIiZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7dXNlcy1wZXJtaXNzaW9uCiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5VU0VfU0lQIiZndDs8L2NvZGU+IGluIHRoZWlyIG1hbmlmZXN0IGZpbGVzLjwvcD4KIAotPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBBbmRyb2lkIE1hcmtldCwgc3VjaCB0aGF0Cis8cD5BZGRpdGlvbmFsbHksIGRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEdvb2dsZSBQbGF5LCBzdWNoIHRoYXQKIHRoZWlyIGFwcGxpY2F0aW9ucyBhcmUgbm90IGRpc2NvdmVyYWJsZSB0byB1c2VycyB3aG9zZSBkZXZpY2VzIGRvIG5vdCBpbmNsdWRlCiB0aGUgcGxhdGZvcm3igJlzIFNJUCBzdGFjayBhbmQgc2VydmljZXMuIFRvIHJlcXVlc3QgZmlsdGVyaW5nLCBhZGQgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZQogYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnNvZnR3YXJlLnNpcCIKQEAgLTE5Nyw3ICsxOTcsNyBAQAogZGVjbGFyaW5nIDxjb2RlPiZsdDt1c2VzLXBlcm1pc3Npb24KIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLk5GQyImZ3Q7PC9jb2RlPiBpbiB0aGVpciBtYW5pZmVzdCBmaWxlcy48L3A+CiAKLTxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gQW5kcm9pZCBNYXJrZXQsIHN1Y2ggdGhhdAorPHA+QWRkaXRpb25hbGx5LCBkZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBHb29nbGUgUGxheSwgc3VjaCB0aGF0CiB0aGVpciBhcHBsaWNhdGlvbnMgYXJlIG5vdCBkaXNjb3ZlcmFibGUgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbyBub3Qgc3VwcG9ydAogTkZDLiBUbyByZXF1ZXN0IGZpbHRlcmluZywgYWRkCiA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5uZmMiCkBAIC0yMTksNyArMjE5LDcgQEAKIDxwPk5vdGUgdGhhdCB0aGUgc3BlY2lmaWMgc2V0IG9mIGhhcmR3YXJlIHNlbnNvcnMgYXZhaWxhYmxlIG9uIGFueSBnaXZlbiBkZXZpY2UKIHZhcmllcyBhdCB0aGUgZGlzY3JldGlvbiBvZiB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlci4gPC9wPgogCi08cD5EZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBpbiBBbmRyb2lkIE1hcmtldCwgc3VjaCB0aGF0IHRoZWlyCis8cD5EZXZlbG9wZXJzIGNhbiByZXF1ZXN0IGZpbHRlcmluZyBvbiBHb29nbGUgUGxheSwgc3VjaCB0aGF0IHRoZWlyCiBhcHBsaWNhdGlvbnMgYXJlIG5vdCBkaXNjb3ZlcmFibGUgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbyBub3Qgb2ZmZXIgYQogZ3lyb3Njb3BlIHNlbnNvci4gVG8gZG8gc28sIGFkZCA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlCiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuc2Vuc29yLmd5cm9zY29wZSIKQEAgLTcyNiw3ICs3MjYsNyBAQAogPHA+VGhlIHBsYXRmb3JtIGFkZHMgc2V2ZXJhbCBuZXcgaGFyZHdhcmUgZmVhdHVyZXMgdGhhdCBkZXZlbG9wZXJzIGNhbiBkZWNsYXJlCiBpbiB0aGVpciBhcHBsaWNhdGlvbiBtYW5pZmVzdHMgYXMgYmVpbmcgcmVxdWlyZWQgYnkgdGhlaXIgYXBwbGljYXRpb25zLiBUaGlzCiBsZXRzIGRldmVsb3BlcnMgY29udHJvbCBob3cgdGhlaXIgYXBwbGljYXRpb24gaXMgZmlsdGVyZWQsIHdoZW4gcHVibGlzaGVkIG9uCi1BbmRyb2lkIE1hcmtldC4gPC9wPgorR29vZ2xlIFBsYXkuIDwvcD4KIAogPHVsPgogPGxpPntAbGluayBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIjRkVBVFVSRV9BVURJT19MT1dfTEFURU5DWQpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMC5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjAuamQKaW5kZXggNDlmZWZlZS4uMzlhMjM0ZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMC5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4wLmpkCkBAIC05MjIsNyArOTIyLDcgQEAKIAogPHA+VGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwiPntAY29kZSAmbHQ7dXNlcy1mZWF0dXJlJmd0O308L2E+IAotbWFuZmVzdCBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvIGluZm9ybSBleHRlcm5hbCBlbnRpdGllcyAoc3VjaCBhcyBBbmRyb2lkIE1hcmtldCkgb2YgdGhlIHNldCBvZgorbWFuZmVzdCBlbGVtZW50IHNob3VsZCBiZSB1c2VkIHRvIGluZm9ybSBleHRlcm5hbCBlbnRpdGllcyAoc3VjaCBhcyBHb29nbGUgUGxheSkgb2YgdGhlIHNldCBvZgogaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGZlYXR1cmVzIG9uIHdoaWNoIHlvdXIgYXBwbGljYXRpb24gZGVwZW5kcy4gSW4gdGhpcyByZWxlYXNlLCBBbmRyb2lkIGFkZHMgdGhlCiBmb2xsb3dpbmcgbmV3IGNvbnN0YW50cyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gZGVjbGFyZSB3aXRoIHRoaXMgZWxlbWVudDo8L3A+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjEuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4xLmpkCmluZGV4IGI5Y2Y5NjkuLjdlYzdlMzMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjEuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMS5qZApAQCAtMjE0LDcgKzIxNCw3IEBACiB0aGVpciBtYW51ZmFjdHVyZXJzLiBJbiBwYXJ0aWN1bGFyLCBob3N0IG1vZGUgcmVsaWVzIG9uIGFwcHJvcHJpYXRlIFVTQgogY29udHJvbGxlciBoYXJkd2FyZSBpbiB0aGUgQW5kcm9pZC1wb3dlcmVkIGRldmljZS4gPC9wPgogCi08cD5BZGRpdGlvbmFsbHksIGRldmVsb3BlcnMgY2FuIHJlcXVlc3QgZmlsdGVyaW5nIG9uIEFuZHJvaWQgTWFya2V0LCBzdWNoIHRoYXQKKzxwPkFkZGl0aW9uYWxseSwgZGV2ZWxvcGVycyBjYW4gcmVxdWVzdCBmaWx0ZXJpbmcgb24gR29vZ2xlIFBsYXksIHN1Y2ggdGhhdAogdGhlaXIgYXBwbGljYXRpb25zIGFyZSBub3QgYXZhaWxhYmUgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBkbyBub3QgcHJvdmlkZSB0aGUKIGFwcHJvcHJpYXRlIFVTQiBzdXBwb3J0LiBUbyByZXF1ZXN0IGZpbHRlcmluZywgYWRkIG9uZSBvciBib3RoIG9mIHRoZSBlbGVtZW50cwogYmVsb3cgdG8gdGhlIGFwcGxpY2F0aW9uIG1hbmlmZXN0LCBhcyBhcHByb3ByaWF0ZTogPC9wPgpAQCAtOTA4LDggKzkwOCw4IEBACiA8aDMgaWQ9ImZlYXR1cmVzIj5OZXcgZmVhdHVyZSBjb25zdGFudHM8L2gzPgogCiA8cD5UaGUgcGxhdGZvcm0gYWRkcyBuZXcgaGFyZHdhcmUgZmVhdHVyZSBjb25zdGFudHMgdGhhdCBkZXZlbG9wZXJzIGNhbiBkZWNsYXJlCi1pbiB0aGVpciBhcHBsaWNhdGlvbiBtYW5pZmVzdHMsIHRvIGluZm9ybSBleHRlcm5hbCBlbnRpdGllcyBzdWNoIGFzIEFuZHJvaWQKLU1hcmtldCBvZiB0aGUgYXBwbGljYXRpb24ncyByZXF1aXJlbWVudCBmb3IgbmV3IGhhcmR3YXJlIGNhcGFiaWxpdGllcyBzdXBwb3J0ZWQKK2luIHRoZWlyIGFwcGxpY2F0aW9uIG1hbmlmZXN0cywgdG8gaW5mb3JtIGV4dGVybmFsIGVudGl0aWVzIHN1Y2ggYXMgR29vZ2xlCitQbGF5IG9mIHRoZSBhcHBsaWNhdGlvbidzIHJlcXVpcmVtZW50IGZvciBuZXcgaGFyZHdhcmUgY2FwYWJpbGl0aWVzIHN1cHBvcnRlZAogaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBwbGF0Zm9ybS4gRGV2ZWxvcGVycyBkZWNsYXJlIHRoZXNlIGFuZCBvdGhlciBmZWF0dXJlCiBjb25zdGFudHMgaW4gPGEKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS90b3BpY3MvbWFuaWZlc3QvdXNlcy1mZWF0dXJlLWVsZW1lbnQuaHRtbCI+e0Bjb2RlCkBAIC05MjYsMTEgKzkyNiwxMSBAQAogZGV2aWNlcy48L2xpPgogPC91bD4KIAotPHA+QW5kcm9pZCBNYXJrZXQgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gZmVhdHVyZXMgZGVjbGFyZWQgaW4gPGEKKzxwPkdvb2dsZSBQbGF5IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIGZlYXR1cmVzIGRlY2xhcmVkIGluIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL21hbmlmZXN0L3VzZXMtZmVhdHVyZS1lbGVtZW50Lmh0bWwiPntAY29kZQogJmx0O3VzZXMtZmVhdHVyZSZndDt9PC9hPiBtYW5pZmVzdCBlbGVtZW50cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKIGRlY2xhcmluZyBmZWF0dXJlcyBpbiBhbiBhcHBsaWNhdGlvbiBtYW5pZmVzdCwgcmVhZCA8YQotaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkFuZHJvaWQgTWFya2V0CitocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+R29vZ2xlIFBsYXkKIEZpbHRlcnM8L2E+LjwvcD4KIAogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4yLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTMuMi5qZAppbmRleCBhZWFmOWM4Li4yN2RmMjJjIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMy4yLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0zLjIuamQKQEAgLTMyMCw3ICszMjAsNyBAQAogZnJvbSBiZWluZyBpbnN0YWxsZWQgYW5kIHJ1bi48L2xpPgogPC91bD4KIAotPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gQW5kcm9pZCBNYXJrZXQgZG9lcyBub3QgY3VycmVudGx5IGZpbHRlcgorPHAgY2xhc3M9Im5vdGUiPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gR29vZ2xlIFBsYXkgZG9lcyBub3QgY3VycmVudGx5IGZpbHRlcgogYXBwcyBiYXNlZCBvbiBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMgYWJvdmUuIFN1cHBvcnQgZm9yIGZpbHRlcmluZyB3aWxsIGJlCiBhZGRlZCBpbiBhIGxhdGVyIHBsYXRmb3JtIHJlbGVhc2UuIEFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUKIGZpbHRlcmluZyBiYXNlZCBvbiBzY3JlZW4gc2l6ZSBjYW4gdXNlIHRoZSBleGlzdGluZyA8Y29kZT4mbHQ7c3VwcG9ydHMtc2NyZWVucyZndDs8L2NvZGU+CkBAIC01MjYsMTMgKzUyNiwxMyBAQAogPGgzIGlkPSJmZWF0dXJlcyI+TmV3IGZlYXR1cmUgY29uc3RhbnRzPC9oMz4KIAogPHA+VGhlIHBsYXRmb3JtIGFkZHMgbmV3IGhhcmR3YXJlIGZlYXR1cmUgY29uc3RhbnRzIHRoYXQgeW91IGNhbiBkZWNsYXJlCi1pbiB0aGVpciBhcHBsaWNhdGlvbiBtYW5pZmVzdHMsIHRvIGluZm9ybSBleHRlcm5hbCBlbnRpdGllcyBzdWNoIGFzIEFuZHJvaWQKLU1hcmtldCBvZiByZXF1aXJlZCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgY2FwYWJpbGl0aWVzLiBZb3UgZGVjbGFyZSB0aGVzZQoraW4gdGhlaXIgYXBwbGljYXRpb24gbWFuaWZlc3RzLCB0byBpbmZvcm0gZXh0ZXJuYWwgZW50aXRpZXMgc3VjaCBhcyBHb29nbGUKK1BsYXkgb2YgcmVxdWlyZWQgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIGNhcGFiaWxpdGllcy4gWW91IGRlY2xhcmUgdGhlc2UKIGFuZCBvdGhlciBmZWF0dXJlIGNvbnN0YW50cyBpbiA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sIj57QGNvZGUKICZsdDt1c2VzLWZlYXR1cmUmZ3Q7fTwvYT4gbWFuaWZlc3QgZWxlbWVudHMuCiAKLTxwPkFuZHJvaWQgTWFya2V0IGZpbHRlcnMgYXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZWlyIDxjb2RlPiZsdDt1c2VzLWZlYXR1cmUmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGVzLCB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZSBhdmFpbGFibGUgb25seSB0byBkZXZpY2VzIG9uIHdoaWNoIHRoZWlyIHJlcXVpcmVtZW50cyBhcmUgbWV0LiA8L3A+Cis8cD5Hb29nbGUgUGxheSBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGVpciA8Y29kZT4mbHQ7dXNlcy1mZWF0dXJlJmd0OzwvY29kZT4gYXR0cmlidXRlcywgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgYXZhaWxhYmxlIG9ubHkgdG8gZGV2aWNlcyBvbiB3aGljaCB0aGVpciByZXF1aXJlbWVudHMgYXJlIG1ldC4gPC9wPgogCiA8dWw+CiA8bGk+RmVhdHVyZSBjb25zdGFudHMgZm9yIGxhbmRzY2FwZSBvciBwb3J0cmFpdCByZXF1aXJlbWVudHMKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC00LjAtaGlnaGxpZ2h0cy5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC00LjAtaGlnaGxpZ2h0cy5qZAppbmRleCA5MjJiYjA4Li41MGU5YTE0IDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtNC4wLWhpZ2hsaWdodHMuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTQuMC1oaWdobGlnaHRzLmpkCkBAIC01MjksNyArNTI5LDcgQEAKIEp1c3QgdG91Y2ggb25lIEFuZHJvaWQtcG93ZXJlZCBwaG9uZSB0byBhbm90aGVyLCB0aGVuIHRhcCB0byBzZW5kLjwvcD4KIAogPHA+Rm9yIHNoYXJpbmcgYXBwcywgQW5kcm9pZCBCZWFtIHB1c2hlcyBhIGxpbmsgdG8gdGhlIGFwcCdzIGRldGFpbHMgcGFnZSBpbgotQW5kcm9pZCBNYXJrZXQuIE9uIHRoZSBvdGhlciBkZXZpY2UsIHRoZSBNYXJrZXQgYXBwIGxhdW5jaGVzIGFuZCBsb2FkcyB0aGUKK0dvb2dsZSBQbGF5LiBPbiB0aGUgb3RoZXIgZGV2aWNlLCB0aGUgR29vZ2xlIFBsYXkgY2xpZW50IGFwcCBsYXVuY2hlcyBhbmQgbG9hZHMgdGhlCiBkZXRhaWxzIHBhZ2UsIGZvciBlYXN5IGRvd25sb2FkaW5nIG9mIHRoZSBhcHAuIEluZGl2aWR1YWwgYXBwcyBjYW4gYnVpbGQgb24KIEFuZHJvaWQgQmVhbSB0byBhZGQgb3RoZXIgdHlwZXMgb2YgaW50ZXJhY3Rpb25zLCBzdWNoIGFzIHBhc3NpbmcgZ2FtZSBzY29yZXMsCiBpbml0aWF0aW5nIGEgbXVsdGlwbGF5ZXIgZ2FtZSBvciBjaGF0LCBhbmQgbW9yZS48L3A+CkBAIC03MTUsNyArNzE1LDcgQEAKIAogPHA+RXZlbiBpZiBkZXZlbG9wZXJzIGRvIG5vdCBhZGQgY3VzdG9tIGludGVyYWN0aW9ucyBiYXNlZCBvbiBBbmRyb2lkIEJlYW0gdGhleQogY2FuIHN0aWxsIGJlbmVmaXQgZnJvbSBpdCBiZWluZyBkZWVwbHkgaW50ZWdyYXRlZCBpbnRvIEFuZHJvaWQuIEJ5IGRlZmF1bHQgdGhlCi1zeXN0ZW0gc2hhcmVzIHRoZSBhcHDigJlzIEFuZHJvaWQgTWFya2V0IFVSTCwgc28gaXTigJlzIGVhc3kgZm9yIHRoZSB1c2VyIHRvCitzeXN0ZW0gc2hhcmVzIHRoZSBhcHDigJlzIEdvb2dsZSBQbGF5IFVSTCwgc28gaXTigJlzIGVhc3kgZm9yIHRoZSB1c2VyIHRvCiBkb3dubG9hZCBvciBwdXJjaGFzZSB0aGUgYXBwIHJpZ2h0IGF3YXkuPC9wPgogCiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC00LjAuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtNC4wLmpkCmluZGV4IDJjYWQ4NmIuLmUzYjEzYzggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC00LjAuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTQuMC5qZApAQCAtNjYwLDE0ICs2NjAsMTQgQEAKIGFwcGxpY2F0aW9uIHJlY29yZCBhbmQgbXVsdGlwbGUgYXBwbGljYXRpb25zIGNvbnRhaW4gYWN0aXZpdGllcyB0aGF0IGhhbmRsZSB0aGUgc3BlY2lmaWVkIGludGVudCwKIHRoZSBzeXN0ZW0gYWx3YXlzIGRlbGl2ZXJzIHRoZSBtZXNzYWdlIHRvIHRoZSBhY3Rpdml0eSBpbiB5b3VyIGFwcGxpY2F0aW9uIChiYXNlZCBvbiB0aGUgbWF0Y2hpbmcKIGFwcGxpY2F0aW9uIHJlY29yZCkuIElmIHRoZSB0YXJnZXQgZGV2aWNlIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIHlvdXIgYXBwbGljYXRpb24gaW5zdGFsbGVkLCB0aGUKLXN5c3RlbSB1c2VzIHRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIHJlY29yZCB0byBsYXVuY2ggQW5kcm9pZCBNYXJrZXQgYW5kIHRha2UgdGhlIHVzZXIgdG8gdGhlCitzeXN0ZW0gdXNlcyB0aGUgQW5kcm9pZCBhcHBsaWNhdGlvbiByZWNvcmQgdG8gbGF1bmNoIEdvb2dsZSBQbGF5IGFuZCB0YWtlIHRoZSB1c2VyIHRvIHRoZQogYXBwbGljYXRpb24gaW4gb3JkZXIgdG8gaW5zdGFsbCBpdC48L3A+CiAKIDxwPklmIHlvdXIgYXBwbGljYXRpb24gZG9lc27igJl0IHVzZSBORkMgQVBJcyB0byBwZXJmb3JtIE5ERUYgUHVzaCBtZXNzYWdpbmcsIHRoZW4gQW5kcm9pZCBwcm92aWRlcyBhCiBkZWZhdWx0IGJlaGF2aW9yOiBXaGVuIHlvdXIgYXBwbGljYXRpb24gaXMgaW4gdGhlIGZvcmVncm91bmQgb24gb25lIGRldmljZSBhbmQgQW5kcm9pZCBCZWFtIGlzCiBpbnZva2VkIHdpdGggYW5vdGhlciBBbmRyb2lkLXBvd2VyZWQgZGV2aWNlLCB0aGVuIHRoZSBvdGhlciBkZXZpY2UgcmVjZWl2ZXMgYW4gTkRFRiBtZXNzYWdlIHdpdGggYW4KIEFuZHJvaWQgYXBwbGljYXRpb24gcmVjb3JkIHRoYXQgaWRlbnRpZmllcyB5b3VyIGFwcGxpY2F0aW9uLiBJZiB0aGUgcmVjZWl2aW5nIGRldmljZSBoYXMgdGhlCi1hcHBsaWNhdGlvbiBpbnN0YWxsZWQsIHRoZSBzeXN0ZW0gbGF1bmNoZXMgaXQ7IGlmIGl04oCZcyBub3QgaW5zdGFsbGVkLCBBbmRyb2lkIE1hcmtldCBvcGVucyBhbmQgdGFrZXMKK2FwcGxpY2F0aW9uIGluc3RhbGxlZCwgdGhlIHN5c3RlbSBsYXVuY2hlcyBpdDsgaWYgaXTigJlzIG5vdCBpbnN0YWxsZWQsIEdvb2dsZSBQbGF5IG9wZW5zIGFuZCB0YWtlcwogdGhlIHVzZXIgdG8geW91ciBhcHBsaWNhdGlvbiBpbiBvcmRlciB0byBpbnN0YWxsIGl0LjwvcD4KIAogPHA+WW91IGNhbiByZWFkIG1vcmUgYWJvdXQgQW5kcm9pZCBCZWFtIGFuZCBvdGhlciBORkMgZmVhdHVyZXMgaW4gdGhlIDxhCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL25kay9pbmRleC5qZCBiL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCmluZGV4IDI5ZjA3NDkuLmExYzU5ZTMgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkCkBAIC03NTYsNyArNzU2LDcgQEAKICAgICAgICAgICAgIDxsaT5JbmNsdWRlcyBpbXByb3ZlbWVudHMgdG8gdGhlIDxjb2RlPmNwdWZlYXR1cmVzPC9jb2RlPiBoZWxwZXIgbGlicmFyeSB0aGF0IGltcHJvdmVzIHJlcG9ydGluZwogICAgICAgICAgICAgb2YgdGhlIENQVSB0eXBlIChzb21lIGRldmljZXMgcHJldmlvdXNseSByZXBvcnRlZCBBUk12NyBDUFUgd2hlbiB0aGUgZGV2aWNlIHJlYWxseSB3YXMgYW4gQVJNdjYpLiBXZQogICAgICAgICAgICAgcmVjb21tZW5kIGRldmVsb3BlcnMgdGhhdCB1c2UgdGhpcyBsaWJyYXJ5IHRvIHJlYnVpbGQgdGhlaXIgYXBwbGljYXRpb25zIHRoZW4KLSAgICAgICAgICAgIHVwbG9hZCB0byBNYXJrZXQgdG8gYmVuZWZpdCBmcm9tIHRoZSBpbXByb3ZlbWVudHMuPC9saT4KKyAgICAgICAgICAgIHVwbG9hZCB0byBHb29nbGUgUGxheSB0byBiZW5lZml0IGZyb20gdGhlIGltcHJvdmVtZW50cy48L2xpPgogCiAgICAgICAgICAgICA8bGk+QWRkcyBhbiBFR0wgbGlicmFyeSB0aGF0IGxldHMgeW91IGNyZWF0ZSBhbmQgbWFuYWdlIE9wZW5HTCBFUyB0ZXh0dXJlcyBhbmQKICAgICAgICAgICAgICAgc2VydmljZXMuPC9saT4KQEAgLTgzMiw3ICs4MzIsNyBAQAogICAgICAgICAgICAgPGNvZGU+LmFwazwvY29kZT4uPC9saT4KIAogICAgICAgICAgICAgPGxpPlRvIGVuc3VyZSB0aGF0IHlvdXIgYXBwbGljYXRpb25zIGFyZSBhdmFpbGFibGUgdG8gdXNlcnMgb25seSBpZiB0aGVpciBkZXZpY2VzIGFyZQotICAgICAgICAgICAgY2FwYWJsZSBvZiBydW5uaW5nIHRoZW0sIEFuZHJvaWQgTWFya2V0IG5vdyBmaWx0ZXJzIGFwcGxpY2F0aW9ucyBiYXNlZCBvbiB0aGUKKyAgICAgICAgICAgIGNhcGFibGUgb2YgcnVubmluZyB0aGVtLCBHb29nbGUgUGxheSBub3cgZmlsdGVycyBhcHBsaWNhdGlvbnMgYmFzZWQgb24gdGhlCiAgICAgICAgICAgICBpbnN0cnVjdGlvbiBzZXQgaW5mb3JtYXRpb24gaW5jbHVkZWQgaW4geW91ciBhcHBsaWNhdGlvbiAmbWRhc2g7IG5vIGFjdGlvbiBpcyBuZWVkZWQgb24KICAgICAgICAgICAgIHlvdXIgcGFydCB0byBlbmFibGUgdGhlIGZpbHRlcmluZy4gQWRkaXRpb25hbGx5LCB0aGUgQW5kcm9pZCBzeXN0ZW0gaXRzZWxmIGFsc28gY2hlY2tzCiAgICAgICAgICAgICB5b3VyIGFwcGxpY2F0aW9uIGF0IGluc3RhbGwgdGltZSBhbmQgYWxsb3dzIHRoZSBpbnN0YWxsYXRpb24gdG8gY29udGludWUgb25seSBpZiB0aGUKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvbmRrL292ZXJ2aWV3LmpkIGIvZG9jcy9odG1sL3Nkay9uZGsvb3ZlcnZpZXcuamQKaW5kZXggZTk2OWY1ZC4uYzk4ZTYwMCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9uZGsvb3ZlcnZpZXcuamQKKysrIGIvZG9jcy9odG1sL3Nkay9uZGsvb3ZlcnZpZXcuamQKQEAgLTUzNSw3ICs1MzUsNyBAQAogICAgIDxsaT5BZGRpdGlvbmFsbHksIGFuIGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBPcGVuR0wgRVMgQVBJcyBzaG91bGQgZGVjbGFyZSBhCiAgICAgPGNvZGU+Jmx0O3VzZXMtZmVhdHVyZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gaXRzIG1hbmlmZXN0LCB3aXRoIGFuCiAgICAgPGNvZGU+YW5kcm9pZDpnbEVzVmVyc2lvbjwvY29kZT4gYXR0cmlidXRlIHRoYXQgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIE9wZW5HbCBFUyB2ZXJzaW9uCi0gICAgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdCBBbmRyb2lkIE1hcmtldCB3aWxsIHNob3cgeW91ciBhcHBsaWNhdGlvbiBvbmx5CisgICAgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBUaGlzIGVuc3VyZXMgdGhhdCBHb29nbGUgUGxheSB3aWxsIHNob3cgeW91ciBhcHBsaWNhdGlvbiBvbmx5CiAgICAgdG8gdXNlcnMgd2hvc2UgZGV2aWNlcyBhcmUgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIHlvdXIgYXBwbGljYXRpb24uIEZvciBleGFtcGxlOgogICAgICAgPHByZSBzdHlsZT0ibWFyZ2luOjFlbTsiPgogJmx0O21hbmlmZXN0Jmd0OwpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9vZW0tdXNiLmpkIGIvZG9jcy9odG1sL3Nkay9vZW0tdXNiLmpkCmluZGV4IGY5ODI1N2QuLjgxOGEwYWYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvb2VtLXVzYi5qZAorKysgYi9kb2NzL2h0bWwvc2RrL29lbS11c2IuamQKQEAgLTM0LDcgKzM0LDcgQEAKIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9kZXZlbG9waW5nL2RldmljZS5odG1sIj5Vc2luZyBIYXJkd2FyZSBEZXZpY2VzPC9hPi48L3A+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdXIgZGV2aWNlIGlzIG9uZSBvZiB0aGUgQW5kcm9pZCBEZXZlbG9wZXIgUGhvbmVzCi0ocHVyY2hhc2VkIGZyb20gdGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlKSwgYSBOZXh1cyBPbmUsIG9yIGEgTmV4dXMgUywgdGhlbiB5b3UgbmVlZAorKEFEUCksIGEgTmV4dXMgT25lLCBvciBhIE5leHVzIFMsIHRoZW4geW91IG5lZWQKIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9c2RrL3dpbi11c2IuaHRtbCI+R29vZ2xlIFVTQiBEcml2ZXI8L2E+LCBpbnN0ZWFkIG9mIGFuIE9FTSBkcml2ZXIuIFRoZSBHYWxheHkKIE5leHVzIGRyaXZlciwgaG93ZXZlciwgaXMgZGlzdHJpYnV0ZWQgYnkgPGEKIGhyZWY9Imh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vdXMvc3VwcG9ydC9kb3dubG9hZHMvdmVyaXpvbi13aXJlbGVzcy9TQ0gtSTUxNU1TQVZaVyI+U2Ftc3VuZzwvYT4KQEAgLTIxMSw3ICsyMTEsNyBAQAogPGgyIGlkPSJEcml2ZXJzIj5PRU0gRHJpdmVyczwvaDI+CiAKIDxwIGNsYXNzPSJub3RlIj48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdXIgZGV2aWNlIGlzIG9uZSBvZiB0aGUgQW5kcm9pZCBEZXZlbG9wZXIgUGhvbmVzCi0ocHVyY2hhc2VkIGZyb20gdGhlIEFuZHJvaWQgTWFya2V0IHB1Ymxpc2hlciBzaXRlKSwgYSBOZXh1cyBPbmUsIG9yIGEgTmV4dXMgUywgdGhlbiB5b3UgbmVlZAorKHB1cmNoYXNlZCBmcm9tIHRoZSBHb29nbGUgUGxheSBwdWJsaXNoZXIgc2l0ZSksIGEgTmV4dXMgT25lLCBvciBhIE5leHVzIFMsIHRoZW4geW91IG5lZWQKIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9c2RrL3dpbi11c2IuaHRtbCI+R29vZ2xlIFVTQiBEcml2ZXI8L2E+LCBpbnN0ZWFkIG9mIGFuIE9FTSBkcml2ZXIuIFRoZSBHYWxheHkKIE5leHVzIGRyaXZlciwgaG93ZXZlciwgaXMgZGlzdHJpYnV0ZWQgYnkgPGEKIGhyZWY9Imh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vdXMvc3VwcG9ydC9kb3dubG9hZHMvdmVyaXpvbi13aXJlbGVzcy9TQ0gtSTUxNU1TQVZaVyI+U2Ftc3VuZzwvYT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvY2FtZXJhZGlyZWN0LmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9jYW1lcmFkaXJlY3QuamQKaW5kZXggMDNhZDExOS4uNGI2ZjBkMiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9jYW1lcmFkaXJlY3QuamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9jYW1lcmFkaXJlY3QuamQKQEAgLTM1LDcgKzM1LDcgQEAKIHRoZSBmcmFtZXdvcmsgQVBJcy48L3A+CiAKIDxwPkRpcmVjdGx5IGNvbnRyb2xsaW5nIGEgZGV2aWNlIGNhbWVyYSByZXF1aXJlcyBhIGxvdCBtb3JlIGNvZGUgdGhhbiByZXF1ZXN0aW5nIHBpY3R1cmVzIG9yIHZpZGVvcwotZnJvbSBleGlzdGluZyBjYW1lcmEgYXBwbGljYXRpb25zLiBIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBidWlsZCBhIHNwZWNpYWxpemVkIGNhbWVyYSBhcHBsaWNhdGlvbiBvcgorZnJvbSBleGlzdGluZyBjYW1lcmEgYXBwbGljYXRpb25zLiBIb3dldmVyLCBpZiB5b3Ugd2FudCB0byBidWlsZCBhIHNwZWNpYWxpemVkIGNhbWVyYSBhcHBsaWNhdGlvbgogb3Igc29tZXRoaW5nIGZ1bGx5IGludGVncmF0ZWQgaW4geW91ciBhcHAgVUksIHRoaXMgbGVzc29uIHNob3dzIHlvdSBob3cuPC9wPgogCiAKQEAgLTk1LDcgKzk1LDcgQEAKIDxwPlRvIGdldCBzdGFydGVkIHdpdGggZGlzcGxheWluZyBhIHByZXZpZXcsIHlvdSBuZWVkIHByZXZpZXcgY2xhc3MuIFRoZQogcHJldmlldyByZXF1aXJlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0Bjb2RlCiBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFja30gaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIHRvIHBhc3MgaW1hZ2UKLWRhdGEgZnJvbSB0aGUgY2FtZXJhIGhhcmR3YXJlIHRoZSBhcHBsaWNhdGlvbi48L3A+CitkYXRhIGZyb20gdGhlIGNhbWVyYSBoYXJkd2FyZSB0byB0aGUgYXBwbGljYXRpb24uPC9wPgogCiA8cHJlPgogY2xhc3MgUHJldmlldyBleHRlbmRzIFZpZXdHcm91cCBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgewpAQCAtMjE0LDcgKzIxNCw3IEBACiAKIDxoMiBpZD0iVGFza1Jlc3RhcnRQcmV2aWV3Ij5SZXN0YXJ0IHRoZSBQcmV2aWV3PC9oMj4KIAotPHA+QWZ0ZXIgYSBwaWN0dXJlIGlzIHRha2VuLCB5b3UgbXVzdCB0byByZXN0YXJ0IHRoZSBwcmV2aWV3IGJlZm9yZSB0aGUgdXNlcgorPHA+QWZ0ZXIgYSBwaWN0dXJlIGlzIHRha2VuLCB5b3UgbXVzdCByZXN0YXJ0IHRoZSBwcmV2aWV3IGJlZm9yZSB0aGUgdXNlcgogY2FuIHRha2UgYW5vdGhlciBwaWN0dXJlLiBJbiB0aGlzIGV4YW1wbGUsIHRoZSByZXN0YXJ0IGlzIGRvbmUgYnkgb3ZlcmxvYWRpbmcKIHRoZSBzaHV0dGVyIGJ1dHRvbi48L3A+CiAKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvcGhvdG9iYXNpY3MuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL3Bob3RvYmFzaWNzLmpkCmluZGV4IGU2YWI0M2UuLjM0MjA5MTggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvcGhvdG9iYXNpY3MuamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS9waG90b2Jhc2ljcy5qZApAQCAtNTUsNyArNTUsNyBAQAogPGgyIGlkPSJUYXNrTWFuaWZlc3QiPlJlcXVlc3QgQ2FtZXJhIFBlcm1pc3Npb248L2gyPgogCiA8cD5JZiBhbiBlc3NlbnRpYWwgZnVuY3Rpb24gb2YgeW91ciBhcHBsaWNhdGlvbiBpcyB0YWtpbmcgcGljdHVyZXMsIHRoZW4gcmVzdHJpY3QKLWl0cyB2aXNpYmlsaXR5IGluIEFuZHJvaWQgTWFya2V0IHRvIGRldmljZXMgdGhhdCBoYXZlIGEgY2FtZXJhLiAgVG8gYWR2ZXJ0aXNlCitpdHMgdmlzaWJpbGl0eSBvbiBHb29nbGUgUGxheSB0byBkZXZpY2VzIHRoYXQgaGF2ZSBhIGNhbWVyYS4gIFRvIGFkdmVydGlzZQogdGhhdCB5b3VyIGFwcGxpY2F0aW9uIGRlcGVuZHMgb24gaGF2aW5nIGEgY2FtZXJhLCBwdXQgYSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy9tYW5pZmVzdC91c2VzLWZlYXR1cmUtZWxlbWVudC5odG1sIj4ge0Bjb2RlCiAmbHQ7dXNlcy1mZWF0dXJlJmd0O308L2E+IHRhZyBpbiB5b3VyIG1hbmlmZXN0IGZpbGU6PC9wPgpAQCAtNjgsNyArNjgsNyBAQAogPC9wcmU+CiAKIDxwPklmIHlvdXIgYXBwbGljYXRpb24gdXNlcywgYnV0IGRvZXMgbm90IHJlcXVpcmUgYSBjYW1lcmEgaW4gb3JkZXIgdG8gZnVuY3Rpb24sIGFkZCB7QGNvZGUKLWFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIn0gdG8gdGhlIHRhZy4gSW4gZG9pbmcgc28sIEFuZHJvaWQgTWFya2V0IHdpbGwgYWxsb3cgZGV2aWNlcyB3aXRob3V0IGEKK2FuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIn0gdG8gdGhlIHRhZy4gSW4gZG9pbmcgc28sIEdvb2dsZSBQbGF5IHdpbGwgYWxsb3cgZGV2aWNlcyB3aXRob3V0IGEKIGNhbWVyYSB0byBkb3dubG9hZCB5b3VyIGFwcGxpY2F0aW9uLiBJdCdzIHRoZW4geW91ciByZXNwb25zaWJpbGl0eSB0byBjaGVjayBmb3IgdGhlIGF2YWlsYWJpbGl0eQogb2YgdGhlIGNhbWVyYSBhdCBydW50aW1lIGJ5IGNhbGxpbmcge0BsaW5rCiBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIjaGFzU3lzdGVtRmVhdHVyZSBoYXNTeXN0ZW1GZWF0dXJlKFBhY2thZ2VNYW5hZ2VyLkZFQVRVUkVfQ0FNRVJBKX0uCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL3ZpZGVvYmFzaWNzLmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL2NhbWVyYS92aWRlb2Jhc2ljcy5qZAppbmRleCBhMzUxMmIwLi41ZmUxYTNhIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvY2FtZXJhL3ZpZGVvYmFzaWNzLmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9jYW1lcmEvdmlkZW9iYXNpY3MuamQKQEAgLTYyLDcgKzYyLDcgQEAKIDwvcHJlPgogCiA8cD5JZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGEgY2FtZXJhIGluIG9yZGVyIHRvIGZ1bmN0aW9uLCBhZGQge0Bjb2RlCi1hbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSJ9IHRvIHRoZSB0YWcuIEluIGRvaW5nIHNvLCBBbmRyb2lkIE1hcmtldCB3aWxsIGFsbG93IGRldmljZXMgd2l0aG91dCBhCithbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSJ9IHRvIHRoZSB0YWcuIEluIGRvaW5nIHNvLCBHb29nbGUgUGxheSB3aWxsIGFsbG93IGRldmljZXMgd2l0aG91dCBhCiBjYW1lcmEgdG8gZG93bmxvYWQgeW91ciBhcHBsaWNhdGlvbi4gSXQncyB0aGVuIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgZm9yIHRoZSBhdmFpbGFiaWxpdHkKIG9mIHRoZSBjYW1lcmEgYXQgcnVudGltZSBieSBjYWxsaW5nIHtAbGluawogYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyI2hhc1N5c3RlbUZlYXR1cmUgaGFzU3lzdGVtRmVhdHVyZShQYWNrYWdlTWFuYWdlci5GRUFUVVJFX0NBTUVSQSl9LgpAQCAtMTA3LDcgKzEwNyw3IEBACiA8cD5UaGUgQW5kcm9pZCBDYW1lcmEgYXBwbGljYXRpb24gcmV0dXJucyB0aGUgdmlkZW8gaW4gdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuSW50ZW50fSBkZWxpdmVyZWQKIHRvIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvbkFjdGl2aXR5UmVzdWx0IG9uQWN0aXZpdHlSZXN1bHQoKX0gYXMgYSB7QGxpbmsKIGFuZHJvaWQubmV0LlVyaX0gcG9pbnRpbmcgdG8gdGhlIHZpZGVvIGxvY2F0aW9uIGluIHN0b3JhZ2UuIFRoZSBmb2xsb3dpbmcgY29kZQotcmV0cmlldmVzIHRoaXMgaW1hZ2UgYW5kIGRpc3BsYXlzIGl0IGluIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlld30uPC9wPgorcmV0cmlldmVzIHRoaXMgdmlkZW8gYW5kIGRpc3BsYXlzIGl0IGluIGEge0BsaW5rIGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlld30uPC9wPgogCiA8cHJlPgogcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbWVyYVZpZGVvKEludGVudCBpbnRlbnQpIHsKZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9pZC1hdXRoL2N1c3RvbV9hdXRoLmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL2lkLWF1dGgvY3VzdG9tX2F1dGguamQKaW5kZXggZTJiZDc3OC4uMDUwOWM2ZSAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL2lkLWF1dGgvY3VzdG9tX2F1dGguamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL2lkLWF1dGgvY3VzdG9tX2F1dGguamQKQEAgLTE4MSw2ICsxODEsNiBAQAogPHA+T25lIHNvbHV0aW9uIGlzIHRvIHBsYWNlIHRoZSBzZXJ2aWNlIGluIG9uZSBzbWFsbCwgc3BlY2lhbC1wdXJwb3NlIEFQSy4gV2hlbgogYW4gYXBwIHdpc2hlcyB0byB1c2UgeW91ciBjdXN0b20gYWNjb3VudCB0eXBlLCBpdCBjYW4gY2hlY2sgdGhlIGRldmljZSB0byBzZWUgaWYKIHlvdXIgY3VzdG9tIGFjY291bnQgc2VydmljZSBpcyBhdmFpbGFibGUuIElmIG5vdCwgaXQgY2FuIGRpcmVjdCB0aGUgdXNlciB0bwotQW5kcm9pZCBNYXJrZXQgdG8gZG93bmxvYWQgdGhlIHNlcnZpY2UuIFRoaXMgbWF5IHNlZW0gbGlrZSBhIGdyZWF0IGRlYWwgb2YKK0dvb2dsZSBQbGF5IHRvIGRvd25sb2FkIHRoZSBzZXJ2aWNlLiBUaGlzIG1heSBzZWVtIGxpa2UgYSBncmVhdCBkZWFsIG9mCiB0cm91YmxlIGF0IGZpcnN0LCBidXQgY29tcGFyZWQgd2l0aCB0aGUgYWx0ZXJuYXRpdmUgb2YgcmUtZW50ZXJpbmcgY3JlZGVudGlhbHMKIGZvciBldmVyeSBhcHAgdGhhdCB1c2VzIHlvdXIgY3VzdG9tIGFjY291bnQsIGl0J3MgcmVmcmVzaGluZ2x5IGVhc3kuPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvYXBpLmpkIGIvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvYXBpLmpkCmluZGV4IGQ4NTg4ZDQuLjM0OTIyNDUgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL2FwaS5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9hcGkuamQKQEAgLTQ0LDcgKzQ0LDcgQEAKIDwvZGl2PgogCiAKLTxwPldoZW4gZGV2ZWxvcGluZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbXVsdGlwbGUgQVBLcyBvbiBBbmRyb2lkIE1hcmtldCwKKzxwPldoZW4gZGV2ZWxvcGluZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgbXVsdGlwbGUgQVBLcyBvbiBHb29nbGUgUGxheSwKIGl04oCZcyBpbXBvcnRhbnQgdG8gYWRvcHQgc29tZSBnb29kIHByYWN0aWNlcyBmcm9tIHRoZSBnZXQtZ28sIGFuZCBwcmV2ZW50IHVubmVjZXNzYXJ5IGhlYWRhY2hlcwogZnVydGhlciBpbnRvIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiAgVGhpcyBsZXNzb24gc2hvd3MgeW91IGhvdyB0byBjcmVhdGUgbXVsdGlwbGUgQVBLcyBvZiB5b3VyCiBhcHAsIGVhY2ggY292ZXJpbmcgYSBzbGlnaHRseSBkaWZmZXJlbnQgcmFuZ2Ugb2YgQVBJIGxldmVscy4gIFlvdSB3aWxsIGFsc28gZ2FpbiBzb21lIHRvb2xzCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogCiA8aDIgaWQ9IkFkanVzdE1hbmlmZXN0cyI+QWRqdXN0IHRoZSBNYW5pZmVzdHM8L2gyPgotPHA+V2hlbiBhIHVzZXIgZG93bmxvYWRzIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbXVsdGlwbGUgQVBLcyB0aHJvdWdoIEFuZHJvaWQgTWFya2V0LCB0aGUgY29ycmVjdAorPHA+V2hlbiBhIHVzZXIgZG93bmxvYWRzIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbXVsdGlwbGUgQVBLcyB0aHJvdWdoIEdvb2dsZSBQbGF5LCB0aGUgY29ycmVjdAogQVBLIHRvIHVzZSBpcyBjaG9zZW4gdXNpbmcgdHdvIHNpbXBsZSBydWxlczo8L3A+CiA8dWw+CiA8bGk+VGhlIG1hbmlmZXN0IGhhcyB0byBzaG93IHRoYXQgcGFydGljdWxhciBBUEsgaXMgZWxpZ2libGU8L2xpPgpAQCAtMjc4LDE5ICsyNzgsMjAgQEAKIDwvdGFibGU+CiAKIDxwPgotTm93LCBsZXTigJlzIGZ1cnRoZXIgYXNzdW1lIHRoYXQgdGhlIFJlZCBBUEsgaGFzIHNvbWUgcmVxdWlyZW1lbnQgb24gaXQgdGhhdCB0aGUgb3RoZXIgdHdvIGRvbuKAmXQuICBUaGUKLU1hcmtldCBGaWx0ZXJzIHBhZ2Ugb2YgdGhlIEFuZHJvaWQgRGV2ZWxvcGVyIGd1aWRlIGhhcyBhIHdob2xlIGxpc3Qgb2YgcG9zc2libGUgY3VscHJpdHMuICBGb3IgdGhlCitOb3csIGxldOKAmXMgZnVydGhlciBhc3N1bWUgdGhhdCB0aGUgUmVkIEFQSyBoYXMgc29tZSByZXF1aXJlbWVudCBvbiBpdCB0aGF0IHRoZSBvdGhlciB0d28gZG9u4oCZdC4gIAorPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPkZpbHRlcnMgb24gR29vZ2xlIFBsYXk8L2E+IHBhZ2Ugb2YKK3RoZSBBbmRyb2lkIERldmVsb3BlciBndWlkZSBoYXMgYSB3aG9sZSBsaXN0IG9mIHBvc3NpYmxlIGN1bHByaXRzLiAgRm9yIHRoZQogc2FrZSBvZiBleGFtcGxlLCBsZXTigJlzIGFzc3VtZSB0aGF0IHJlZCByZXF1aXJlcyBhIGZyb250LWZhY2luZyBjYW1lcmEuICBJbiBmYWN0LCB0aGUgZW50aXJlIHBvaW50IG9mCiB0aGUgcmVkIEFQSyBpcyB0byBjb21iaW5lIHRoZSBmcm9udC1mYWNpbmcgY2FtZXJhIHdpdGggc3dlZXQgbmV3IGZ1bmN0aW9uYWxpdHkgdGhhdCB3YXMgYWRkZWQgaW4gQVBJCiAxMS4gIEJ1dCwgaXQgdHVybnMgb3V0LCBub3QgYWxsIGRldmljZXMgdGhhdCBzdXBwb3J0IEFQSSAxMSBldmVuIEhBVkUgZnJvbnQtZmFjaW5nIGNhbWVyYXMhICBUaGUKIGhvcnJvciE8L3A+CiAKLTxwPkZvcnR1bmF0ZWx5LCBpZiBhIHVzZXIgaXMgYnJvd3NpbmcgTWFya2V0IGZyb20gb25lIHN1Y2ggZGV2aWNlLCBBbmRyb2lkIE1hcmtldCB3aWxsIGxvb2sgYXQgdGhlCis8cD5Gb3J0dW5hdGVseSwgaWYgYSB1c2VyIGlzIGJyb3dzaW5nIEdvb2dsZSBQbGF5IGZyb20gb25lIHN1Y2ggZGV2aWNlLCBHb29nbGUgUGxheSB3aWxsIGxvb2sgYXQgdGhlCiBtYW5pZmVzdCwgc2VlIHRoYXQgUmVkIGxpc3RzIHRoZSBmcm9udC1mYWNpbmcgY2FtZXJhIGFzIGEgcmVxdWlyZW1lbnQsIGFuZCBxdWlldGx5IGlnbm9yZSBpdCwgaGF2aW5nCiBkZXRlcm1pbmVkIHRoYXQgUmVkIGFuZCB0aGF0IGRldmljZSBhcmUgbm90IGEgbWF0Y2ggbWFkZSBpbiBkaWdpdGFsIGhlYXZlbi4gIEl0IHdpbGwgdGhlbiBzZWUgdGhhdAogR3JlZW4gaXMgbm90IG9ubHkgZm9yd2FyZC1jb21wYXRpYmxlIHdpdGggZGV2aWNlcyB3aXRoIEFQSSAxMSAoc2luY2Ugbm8gbWF4U2RrVmVyc2lvbiB3YXMgZGVmaW5lZCksCiBidXQgYWxzbyBkb2VzbuKAmXQgY2FyZSB3aGV0aGVyIG9yIG5vdCB0aGVyZeKAmXMgYSBmcm9udC1mYWNpbmcgY2FtZXJhISAgVGhlIGFwcCBjYW4gc3RpbGwgYmUgZG93bmxvYWRlZAotZnJvbSBBbmRyb2lkIE1hcmtldCBieSB0aGUgdXNlciwgYmVjYXVzZSBkZXNwaXRlIHRoZSB3aG9sZSBmcm9udC1jYW1lcmEgbWlzaGFwLCB0aGVyZSB3YXMgc3RpbGwgYW4KK2Zyb20gR29vZ2xlIFBsYXkgYnkgdGhlIHVzZXIsIGJlY2F1c2UgZGVzcGl0ZSB0aGUgd2hvbGUgZnJvbnQtY2FtZXJhIG1pc2hhcCwgdGhlcmUgd2FzIHN0aWxsIGFuCiBBUEsgdGhhdCBzdXBwb3J0ZWQgdGhhdCBwYXJ0aWN1bGFyIEFQSSBsZXZlbC48L3A+CiAKIDxwPiAgSW4gb3JkZXIgdG8ga2VlcCBhbGwgeW91ciBBUEtzIG9uIHNlcGFyYXRlICJ0cmFja3MiLCBpdOKAmXMgaW1wb3J0YW50IHRvIGhhdmUgYSBnb29kIHZlcnNpb24gY29kZQpAQCAtMzMwLDcgKzMzMSw3IEBACiA8L3ByZT4KIAogPGgyIGlkPSJQcmVMYXVuY2giPkdvIE92ZXIgUHJlLWxhdW5jaCBDaGVja2xpc3Q8L2gyPgotPHA+ICBCZWZvcmUgdXBsb2FkaW5nIHRvIEFuZHJvaWQgTWFya2V0LCBkb3VibGUtY2hlY2sgdGhlIGZvbGxvd2luZyBpdGVtcy4gIFJlbWVtYmVyIHRoYXQgdGhlc2UgYXJlIHNwZWNpZmljYWxseSByZWxldmFudCB0byBtdWx0aXBsZSBBUEtzLCBhbmQgaW4gbm8gd2F5IHJlcHJlc2VudCBhIGNvbXBsZXRlIGNoZWNrbGlzdCBmb3IgYWxsIGFwcGxpY2F0aW9ucyBiZWluZyB1cGxvYWRlZCB0byBBbmRyb2lkIE1hcmtldC48L3A+Cis8cD4gIEJlZm9yZSB1cGxvYWRpbmcgdG8gR29vZ2xlIFBsYXksIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUgc3BlY2lmaWNhbGx5IHJlbGV2YW50IHRvIG11bHRpcGxlIEFQS3MsIGFuZCBpbiBubyB3YXkgcmVwcmVzZW50IGEgY29tcGxldGUgY2hlY2tsaXN0IGZvciBhbGwgYXBwbGljYXRpb25zIGJlaW5nIHVwbG9hZGVkIHRvIEdvb2dsZSBQbGF5LjwvcD4KIAogPHVsPgogPGxpPkFsbCBBUEtzIG11c3QgaGF2ZSB0aGUgc2FtZSBwYWNrYWdlIG5hbWU8L2xpPgpAQCAtMzQyLDcgKzM0Myw3IEBACiA8L3VsPgogCiA8cD5JdOKAmXMgYWxzbyB3b3J0aCBpbnNwZWN0aW5nIHRoZSBjb21waWxlZCBBUEsgYmVmb3JlIHB1c2hpbmcgdG8gbWFya2V0LCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbuKAmXQKLWFueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gaW4gTWFya2V0LiAgVGhpcyBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUgdXNpbmcgdGhlCithbnkgc3VycHJpc2VzIHRoYXQgY291bGQgaGlkZSB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiAgVGhpcyBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUgdXNpbmcgdGhlCiAiYWFwdCIgdG9vbC4gIEFhcHQgKHRoZSBBbmRyb2lkIEFzc2V0IFBhY2thZ2luZyBUb29sKSBpcyBwYXJ0IG9mIHRoZSBidWlsZCBwcm9jZXNzIGZvciBjcmVhdGluZyBhbmQKIHBhY2thZ2luZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb25zLCBhbmQgaXMgYWxzbyBhIHZlcnkgaGFuZHkgdG9vbCBmb3IgaW5zcGVjdGluZyB0aGVtLiA8L3A+CiAKQEAgLTM3MCwxMCArMzcxLDE0IEBACiBzdXBwb3J0cy1zY3JlZW5zIGFuZCBjb21wYXRpYmxlLXNjcmVlbnMsIGFuZCB0aGF0IHlvdSBkb27igJl0IGhhdmUgdW5pbnRlbmRlZCAidXNlcy1mZWF0dXJlIiB2YWx1ZXMKIHRoYXQgd2VyZSBhZGRlZCBhcyBhIHJlc3VsdCBvZiBwZXJtaXNzaW9ucyB5b3Ugc2V0IGluIHRoZSBtYW5pZmVzdC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBBUEsKIHdvbuKAmXQgYmUgdmlzaWJsZSB0byB2ZXJ5IG1hbnkgZGV2aWNlcy48L3A+Ci08cD5XaHk/ICBCeSBhZGRpbmcgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gU0VORF9TTVMsIHRoZSBmZWF0dXJlIHJlcXVpcmVtZW50IG9mIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IHdhcyBpbXBsaWNpdGx5IGFkZGVkLiAgU2luY2UgQVBJIDExIGlzIEhvbmV5Y29tYiAodGhlIHZlcnNpb24gb2YgQW5kcm9pZCBvcHRpbWl6ZWQgc3BlY2lmaWNhbGx5IGZvciB0YWJsZXRzKSwgYW5kIG5vIEhvbmV5Y29tYiBkZXZpY2VzIGhhdmUgdGVsZXBob255IGhhcmR3YXJlIGluIHRoZW0sIE1hcmtldCB3aWxsIGZpbHRlciBvdXQgdGhpcyBBUEsgaW4gYWxsIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBoaWdoZXIgaW4gQVBJIGxldmVsIEFORCBwb3NzZXNzIHRlbGVwaG9ueSBoYXJkd2FyZS4KKzxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBBUEkgMTEgaXMgSG9uZXljb21iICh0aGUgdmVyc2lvbiBvZiBBbmRyb2lkIG9wdGltaXplZCBzcGVjaWZpY2FsbHkgZm9yIHRhYmxldHMpLCBhbmQgbm8gSG9uZXljb21iIGRldmljZXMgaGF2ZSB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgR29vZ2xlIFBsYXkgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIGFsbCBjYXNlcywgdW50aWwgZnV0dXJlIGRldmljZXMgY29tZSBhbG9uZyB3aGljaCBhcmUgaGlnaGVyIGluIEFQSSBsZXZlbCBBTkQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuCiA8L3A+CiA8cD5Gb3J0dW5hdGVseSB0aGlzIGlzIGVhc2lseSBmaXhlZCBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB5b3VyIG1hbmlmZXN0OjwvcD4KIDxwcmU+CiAmbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OwogPC9wcmU+Ci08cD5PbmNlIHlvdeKAmXZlIGNvbXBsZXRlZCB0aGUgcHJlLWxhdW5jaCBjaGVja2xpc3QsIHVwbG9hZCB5b3VyIEFQS3MgdG8gQW5kcm9pZCBNYXJrZXQuICBJdCBtYXkgdGFrZSBhIGJpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cgdXAgd2hlbiBicm93c2luZyBBbmRyb2lkIE1hcmtldCwgYnV0IHdoZW4gaXQgZG9lcywgcGVyZm9ybSBvbmUgbGFzdCBjaGVjay4gIERvd25sb2FkIHRoZSBhcHBsaWNhdGlvbiBvbnRvIGFueSB0ZXN0IGRldmljZXMgeW91IG1heSBoYXZlLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiAgQ29uZ3JhdHVsYXRpb25zLCB5b3XigJlyZSBkb25lITwvcD4KKzxwPlRoZSA8Y29kZT5hbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuPC9jb2RlPiByZXF1aXJlbWVudCBpcyBhbHNvIGltcGxpY2l0bHkgYWRkZWQuIElmIHlvdSB3YW50IHlvdXIgQVBLIHRvIGJlIHZpc2libGUgb24gVFZzIHdoaWNoIGFyZSBub24tdG91Y2hzY3JlZW4gZGV2aWNlcyB5b3Ugc2hvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbWFuaWZlc3Q6PC9wPgorPHByZT4KKyZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuIiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLyZndDsKKzwvcHJlPgorPHA+T25jZSB5b3XigJl2ZSBjb21wbGV0ZWQgdGhlIHByZS1sYXVuY2ggY2hlY2tsaXN0LCB1cGxvYWQgeW91ciBBUEtzIHRvIEdvb2dsZSBQbGF5LiAgSXQgbWF5IHRha2UgYSBiaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBzaG93IHVwIHdoZW4gYnJvd3NpbmcgR29vZ2xlIFBsYXksIGJ1dCB3aGVuIGl0IGRvZXMsIHBlcmZvcm0gb25lIGxhc3QgY2hlY2suICBEb3dubG9hZCB0aGUgYXBwbGljYXRpb24gb250byBhbnkgdGVzdCBkZXZpY2VzIHlvdSBtYXkgaGF2ZSwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEFQS3MgYXJlIHRhcmdldGluZyB0aGUgaW50ZW5kZWQgZGV2aWNlcy4gIENvbmdyYXR1bGF0aW9ucywgeW914oCZcmUgZG9uZSE8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9pbmRleC5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL2luZGV4LmpkCmluZGV4IGY5YjJiNDMuLmQ5MmMxMDYgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL2luZGV4LmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL2luZGV4LmpkCkBAIC0xNiw3ICsxNiw3IEBACiAKIDx1bD4KICAgPGxpPkFuZHJvaWQgMS4wIGFuZCBoaWdoZXI8L2xpPgotICA8bGk+WW91IG11c3QgaGF2ZSBhbiA8YSBocmVmPSJodHRwOi8vbWFya2V0LmFuZHJvaWQuY29tL3B1Ymxpc2giPkFuZHJvaWQgTWFya2V0PC9hPiBwdWJsaXNoZXIKKyAgPGxpPllvdSBtdXN0IGhhdmUgYW4gPGEgaHJlZj0iaHR0cDovL3BsYXkuZ29vZ2xlLmNvbS9hcHBzL3B1Ymxpc2giPkdvb2dsZSBQbGF5PC9hPiBwdWJsaXNoZXIKIGFjY291bnQ8L2xpPgogPC91bD4KIApAQCAtMzAsNyArMzAsNyBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPHA+TXVsdGlwbGUgQVBLIHN1cHBvcnQgaXMgYSBmZWF0dXJlIGluIEFuZHJvaWQgTWFya2V0IHRoYXQgYWxsb3dzIHlvdSB0byBwdWJsaXNoIG11bHRpcGxlIEFQS3MKKzxwPk11bHRpcGxlIEFQSyBzdXBwb3J0IGlzIGEgZmVhdHVyZSBvZiBHb29nbGUgUGxheSB0aGF0IGFsbG93cyB5b3UgdG8gcHVibGlzaCBtdWx0aXBsZSBBUEtzCiB1bmRlciB0aGUgc2FtZSBhcHBsaWNhdGlvbiBsaXN0aW5nLiAgRWFjaCBBUEsgaXMgYSBjb21wbGV0ZSBpbnN0YW5jZSBvZiB5b3VyIGFwcGxpY2F0aW9uLCBvcHRpbWl6ZWQKIHRvIHRhcmdldCBzcGVjaWZpYyBkZXZpY2UgY29uZmlndXJhdGlvbnMuICBFYWNoIEFQSyBjYW4gdGFyZ2V0IGEgc3BlY2lmaWMgc2V0IG9mIEdMCiB0ZXh0dXJlcywgQVBJIGxldmVscywgc2NyZWVuIHNpemVzLCBvciBzb21lIGNvbWJpbmF0aW9uIHRoZXJlb2YuPC9wPgpAQCAtMzksNyArMzksNyBAQAogY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuICBFYWNoIGxlc3NvbiBjb3ZlcnMgYmFzaWNzIGFib3V0IGhvdyB0byBvcmdhbml6ZSB5b3VyIGNvZGViYXNlIGFuZCB0YXJnZXQKIHRoZSByaWdodCBkZXZpY2VzLCBhcyB3ZWxsIGFzIHRoZSBzbWFydCB3YXkgdG8gYXZvaWQgcGl0ZmFsbHMgc3VjaCBhcyB1bm5lY2Vzc2FyeSByZWR1bmRhbmN5IGFjcm9zcwogeW91ciBjb2RlYmFzZSwgYW5kIG1ha2luZyBtaXN0YWtlcyBpbiB5b3VyIG1hbmlmZXN0IHRoYXQgY291bGQgcmVuZGVyIGFuIEFQSyBpbnZpc2libGUgdG8gYWxsCi1kZXZpY2VzIGluIEFuZHJvaWQgTWFya2V0LiAgQnkgZ29pbmcgdGhyb3VnaCBhbnkgb2YgdGhlc2UgbGVzc29ucywgeW91J2xsIGtub3cgaG93IHRvIGRldmVsb3AKK2RldmljZXMgb24gR29vZ2xlIFBsYXkuICBCeSBnb2luZyB0aHJvdWdoIGFueSBvZiB0aGVzZSBsZXNzb25zLCB5b3UnbGwga25vdyBob3cgdG8gZGV2ZWxvcAogbXVsdGlwbGUgQVBLcyB0aGUgc21hcnQgd2F5LCBtYWtlIHN1cmUgdGhleSdyZSB0YXJnZXRpbmcgdGhlIGRldmljZXMgeW91IHdhbnQgdGhlbSB0bywKIGFuZCBrbm93IGhvdyB0byBjYXRjaCBtaXN0YWtlcyA8ZW0+YmVmb3JlPC9lbT4geW91ciBhcHAgZ29lcyBsaXZlLjwvcD4KIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvbXVsdGlwbGUuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9tdWx0aXBsZS5qZAppbmRleCAyNmEzYTkzLi5iMzAwNjhmIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9tdWx0aXBsZS5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9tdWx0aXBsZS5qZApAQCAtNDAsNyArNDAsNyBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPHA+V2hlbiBkZXZlbG9waW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aXBsZSBBUEtzIG9uIEFuZHJvaWQgTWFya2V0LAorPHA+V2hlbiBkZXZlbG9waW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aXBsZSBBUEtzIG9uIEdvb2dsZSBQbGF5LAogaXTigJlzIGltcG9ydGFudCB0byBhZG9wdCBzb21lIGdvb2QgcHJhY3RpY2VzIGZyb20gdGhlIGdldC1nbywgYW5kIHByZXZlbnQgdW5uZWNlc3NhcnkgaGVhZGFjaGVzCiBmdXJ0aGVyIGludG8gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBUaGlzIGxlc3NvbiBzaG93cyB5b3UgaG93IHRvIGNyZWF0ZSBtdWx0aXBsZSBBUEtzIG9mIHlvdXIKIGFwcCwgZWFjaCBjb3ZlcmluZyBhIGRpZmZlcmVudCBjbGFzcyBvZiBzY3JlZW4gc2l6ZS4gIFlvdSB3aWxsIGFsc28gZ2FpbiBzb21lIHRvb2xzIG5lY2Vzc2FyeSB0bwpAQCAtMjI3LDcgKzIyNyw3IEBACiAKIAogPGgyIGlkPSJBZGp1c3RNYW5pZmVzdHMiPkFkanVzdCB0aGUgTWFuaWZlc3RzPC9oMj4KLTxwPldoZW4gYSB1c2VyIGRvd25sb2FkcyBhbiBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIG11bHRpcGxlIEFQS3MgdGhyb3VnaCBBbmRyb2lkIE1hcmtldCwgdGhlIGNvcnJlY3QKKzxwPldoZW4gYSB1c2VyIGRvd25sb2FkcyBhbiBhcHBsaWNhdGlvbiB3aGljaCB1c2VzIG11bHRpcGxlIEFQS3MgdGhyb3VnaCBHb29nbGUgUGxheSwgdGhlIGNvcnJlY3QKIEFQSyB0byB1c2UgaXMgY2hvc2VuIHVzaW5nIHR3byBzaW1wbGUgcnVsZXM6CiAKIDx1bD4KQEAgLTMyOSwxNyArMzI5LDE3IEBACiBQdXJwbGUgJiM4ODA1OyBSZWQgJiM4ODA1OyBHcmVlbiAmIzg4MDU7IEJsdWUKIDwvcD48cD4KIFdoeSBhbGxvdyBhbGwgdGhlIG92ZXJsYXA/ICBMZXTigJlzIHByZXRlbmQgdGhhdCB0aGUgUHVycGxlIEFQSyBoYXMgc29tZSByZXF1aXJlbWVudCBvbiBpdCB0aGF0IHRoZQotb3RoZXIgdHdvIGRvbuKAmXQuICBUaGUgPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL2FwcGVuZGl4L21hcmtldC1maWx0ZXJzLmh0bWwiPk1hcmtldCBGaWx0ZXJzIHBhZ2U8L2E+CitvdGhlciB0d28gZG9u4oCZdC4gIFRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+RmlsdGVycyBvbiBHb29nbGUgUGxheTwvYT4gcGFnZQogb2YgdGhlIEFuZHJvaWQgRGV2ZWxvcGVyIGd1aWRlIGhhcyBhIHdob2xlIGxpc3Qgb2YgcG9zc2libGUgY3VscHJpdHMuICBGb3IgdGhlIHNha2Ugb2YgZXhhbXBsZSwKIGxldOKAmXMgYXNzdW1lIHRoYXQgUHVycGxlIHJlcXVpcmVzIGEgZnJvbnQtZmFjaW5nIGNhbWVyYS4gIEluIGZhY3QsIHRoZSBlbnRpcmUgcG9pbnQgb2YgUHVycGxlIGlzIHRvCiB1c2UgZW50ZXJ0YWluaW5nIHRoaW5ncyB3aXRoIHRoZSBmcm9udC1mYWNpbmcgY2FtZXJhISAgQnV0LCBpdCB0dXJucyBvdXQsIG5vdCBhbGwgQVBJIDExKyBkZXZpY2VzCiBldmVuIEhBVkUgZnJvbnQtZmFjaW5nIGNhbWVyYXMhICBUaGUgaG9ycm9yITwvcD4KIAotPHA+Rm9ydHVuYXRlbHksIGlmIGEgdXNlciBpcyBicm93c2luZyBNYXJrZXQgZnJvbSBvbmUgc3VjaCBkZXZpY2UsIEFuZHJvaWQgTWFya2V0IHdpbGwgbG9vayBhdCB0aGUKKzxwPkZvcnR1bmF0ZWx5LCBpZiBhIHVzZXIgaXMgYnJvd3NpbmcgR29vZ2xlIFBsYXkgZnJvbSBvbmUgc3VjaCBkZXZpY2UsIEdvb2dsZSBQbGF5IHdpbGwgbG9vayBhdCB0aGUKIG1hbmlmZXN0LCBzZWUgdGhhdCBQdXJwbGUgbGlzdHMgdGhlIGZyb250LWZhY2luZyBjYW1lcmEgYXMgYSByZXF1aXJlbWVudCwgYW5kIHF1aWV0bHkgaWdub3JlIGl0LAogaGF2aW5nIGRldGVybWluZWQgdGhhdCBQdXJwbGUgYW5kIHRoYXQgZGV2aWNlIGFyZSBub3QgYSBtYXRjaCBtYWRlIGluIGRpZ2l0YWwgaGVhdmVuLiAgSXQgd2lsbCB0aGVuCiBzZWUgdGhhdCBSZWQgaXMgbm90IG9ubHkgY29tcGF0aWJsZSB3aXRoIHhsYXJnZSBkZXZpY2VzLCBidXQgYWxzbyBkb2VzbuKAmXQgY2FyZSB3aGV0aGVyIG9yIG5vdAotdGhlcmXigJlzIGEgZnJvbnQtZmFjaW5nIGNhbWVyYSEgIFRoZSBhcHAgY2FuIHN0aWxsIGJlIGRvd25sb2FkZWQgZnJvbSBBbmRyb2lkIE1hcmtldCBieSB0aGUgdXNlciwKK3RoZXJl4oCZcyBhIGZyb250LWZhY2luZyBjYW1lcmEhICBUaGUgYXBwIGNhbiBzdGlsbCBiZSBkb3dubG9hZGVkIGZyb20gR29vZ2xlIFBsYXkgYnkgdGhlIHVzZXIsCiBiZWNhdXNlIGRlc3BpdGUgdGhlIHdob2xlIGZyb250LWNhbWVyYSBtaXNoYXAsIHRoZXJlIHdhcyBzdGlsbCBhbiBBUEsgdGhhdCBzdXBwb3J0ZWQgdGhhdCBwYXJ0aWN1bGFyCiBBUEkgbGV2ZWwuPC9wPgogCkBAIC00MjAsOSArNDIwLDkgQEAKIDwvcD4KIAogPGgyIGlkPSJQcmVMYXVuY2giPkdvIE92ZXIgUHJlLWxhdW5jaCBDaGVja2xpc3Q8L2gyPgotPHA+ICBCZWZvcmUgdXBsb2FkaW5nIHRvIEFuZHJvaWQgTWFya2V0LCBkb3VibGUtY2hlY2sgdGhlIGZvbGxvd2luZyBpdGVtcy4gIFJlbWVtYmVyIHRoYXQgdGhlc2UgYXJlCis8cD4gIEJlZm9yZSB1cGxvYWRpbmcgdG8gR29vZ2xlIFBsYXksIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUKIHNwZWNpZmljYWxseSByZWxldmFudCB0byBtdWx0aXBsZSBBUEtzLCBhbmQgaW4gbm8gd2F5IHJlcHJlc2VudCBhIGNvbXBsZXRlIGNoZWNrbGlzdCBmb3IgYWxsCi1hcHBsaWNhdGlvbnMgYmVpbmcgdXBsb2FkZWQgdG8gQW5kcm9pZCBNYXJrZXQuPC9wPgorYXBwbGljYXRpb25zIGJlaW5nIHVwbG9hZGVkIHRvIEdvb2dsZSBQbGF5LjwvcD4KIDx1bD4KIDxsaT5BbGwgQVBLcyBtdXN0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSBuYW1lLjwvbGk+CiA8bGk+QWxsIEFQS3MgbXVzdCBiZSBzaWduZWQgd2l0aCB0aGUgc2FtZSBjZXJ0aWZpY2F0ZS48L2xpPgpAQCAtNDM5LDcgKzQzOSw3IEBACiA8L3VsPgogCiA8cD5JdOKAmXMgYWxzbyB3b3J0aCBpbnNwZWN0aW5nIHRoZSBjb21waWxlZCBBUEsgYmVmb3JlIHB1c2hpbmcgdG8gbWFya2V0LCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbuKAmXQKLWFueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gaW4gTWFya2V0LiAgVGhpcyBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUgdXNpbmcgdGhlCithbnkgc3VycHJpc2VzIHRoYXQgY291bGQgaGlkZSB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiAgVGhpcyBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUgdXNpbmcgdGhlCiAiYWFwdCIgdG9vbC4gIEFhcHQgKHRoZSBBbmRyb2lkIEFzc2V0IFBhY2thZ2luZyBUb29sKSBpcyBwYXJ0IG9mIHRoZSBidWlsZCBwcm9jZXNzIGZvciBjcmVhdGluZyBhbmQKIHBhY2thZ2luZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb25zLCBhbmQgaXMgYWxzbyBhIHZlcnkgaGFuZHkgdG9vbCBmb3IgaW5zcGVjdGluZyB0aGVtLiA8L3A+CiAKQEAgLTQ2NywxMSArNDY3LDE1IEBACiBzdXBwb3J0cy1zY3JlZW5zIGFuZCBjb21wYXRpYmxlLXNjcmVlbnMsIGFuZCB0aGF0IHlvdSBkb27igJl0IGhhdmUgdW5pbnRlbmRlZCAidXNlcy1mZWF0dXJlIiB2YWx1ZXMKIHRoYXQgd2VyZSBhZGRlZCBhcyBhIHJlc3VsdCBvZiBwZXJtaXNzaW9ucyB5b3Ugc2V0IGluIHRoZSBtYW5pZmVzdC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBBUEsKIHdpbGwgYmUgaW52aXNpYmxlIHRvIG1vc3QsIGlmIG5vdCBhbGwgZGV2aWNlcy48L3A+Ci08cD5XaHk/ICBCeSBhZGRpbmcgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gU0VORF9TTVMsIHRoZSBmZWF0dXJlIHJlcXVpcmVtZW50IG9mIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IHdhcyBpbXBsaWNpdGx5IGFkZGVkLiAgU2luY2UgbW9zdCAoaWYgbm90IGFsbCkgeGxhcmdlIGRldmljZXMgYXJlIHRhYmxldHMgd2l0aG91dCB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgTWFya2V0IHdpbGwgZmlsdGVyIG91dCB0aGlzIEFQSyBpbiB0aGVzZSBjYXNlcywgdW50aWwgZnV0dXJlIGRldmljZXMgY29tZSBhbG9uZyB3aGljaCBhcmUgYm90aCBsYXJnZSBlbm91Z2ggdG8gcmVwb3J0IGFzIHhsYXJnZSBzY3JlZW4gc2l6ZSwgYW5kIHBvc3Nlc3MgdGVsZXBob255IGhhcmR3YXJlLgorPHA+V2h5PyAgQnkgYWRkaW5nIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9uIFNFTkRfU01TLCB0aGUgZmVhdHVyZSByZXF1aXJlbWVudCBvZiBhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSB3YXMgaW1wbGljaXRseSBhZGRlZC4gIFNpbmNlIG1vc3QgKGlmIG5vdCBhbGwpIHhsYXJnZSBkZXZpY2VzIGFyZSB0YWJsZXRzIHdpdGhvdXQgdGVsZXBob255IGhhcmR3YXJlIGluIHRoZW0sIEdvb2dsZSBQbGF5IHdpbGwgZmlsdGVyIG91dCB0aGlzIEFQSyBpbiB0aGVzZSBjYXNlcywgdW50aWwgZnV0dXJlIGRldmljZXMgY29tZSBhbG9uZyB3aGljaCBhcmUgYm90aCBsYXJnZSBlbm91Z2ggdG8gcmVwb3J0IGFzIHhsYXJnZSBzY3JlZW4gc2l6ZSwgYW5kIHBvc3Nlc3MgdGVsZXBob255IGhhcmR3YXJlLgogPC9wPgogPHA+Rm9ydHVuYXRlbHkgdGhpcyBpcyBlYXNpbHkgZml4ZWQgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgdG8geW91ciBtYW5pZmVzdDo8cD4KIDxwcmU+CiAmbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkiIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OwogPC9wcmU+Cis8cD5UaGUgPGNvZGU+YW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbjwvY29kZT4gcmVxdWlyZW1lbnQgaXMgYWxzbyBpbXBsaWNpdGx5IGFkZGVkLiBJZiB5b3Ugd2FudCB5b3VyIEFQSyB0byBiZSB2aXNpYmxlIG9uIFRWcyB3aGljaCBhcmUgbm9uLXRvdWNoc2NyZWVuIGRldmljZXMgeW91IHNob3VsZCBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIG1hbmlmZXN0OjwvcD4KKzxwcmU+CismbHQ7dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS50b3VjaHNjcmVlbiIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8mZ3Q7Cis8L3ByZT4KIAotPHA+T25jZSB5b3XigJl2ZSBjb21wbGV0ZWQgdGhlIHByZS1sYXVuY2ggY2hlY2tsaXN0LCB1cGxvYWQgeW91ciBBUEtzIHRvIEFuZHJvaWQgTWFya2V0LiAgSXQgbWF5IHRha2UgYSBiaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBzaG93IHVwIHdoZW4gYnJvd3NpbmcgQW5kcm9pZCBNYXJrZXQsIGJ1dCB3aGVuIGl0IGRvZXMsIHBlcmZvcm0gb25lIGxhc3QgY2hlY2suICBEb3dubG9hZCB0aGUgYXBwbGljYXRpb24gb250byBhbnkgdGVzdCBkZXZpY2VzIHlvdSBtYXkgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiBDb25ncmF0dWxhdGlvbnMsIHlvdeKAmXJlIGRvbmUhPC9wPgorPHA+T25jZSB5b3XigJl2ZSBjb21wbGV0ZWQgdGhlIHByZS1sYXVuY2ggY2hlY2tsaXN0LCB1cGxvYWQgeW91ciBBUEtzIHRvIEdvb2dsZSBQbGF5LiAgSXQgbWF5IHRha2UgYSBiaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBzaG93IHVwIHdoZW4gYnJvd3NpbmcgR29vZ2xlIFBsYXksIGJ1dCB3aGVuIGl0IGRvZXMsIHBlcmZvcm0gb25lIGxhc3QgY2hlY2suICBEb3dubG9hZCB0aGUgYXBwbGljYXRpb24gb250byBhbnkgdGVzdCBkZXZpY2VzIHlvdSBtYXkgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiBDb25ncmF0dWxhdGlvbnMsIHlvdeKAmXJlIGRvbmUhPC9wPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3Mvc2NyZWVuc2l6ZS5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL3NjcmVlbnNpemUuamQKaW5kZXggMGVkOTcyYS4uYWM2NzlhNyAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3Mvc2NyZWVuc2l6ZS5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy9zY3JlZW5zaXplLmpkCkBAIC00Myw3ICs0Myw3IEBACiA8L2Rpdj4KIAogCi08cD5XaGVuIGRldmVsb3BpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIEFQS3Mgb24gQW5kcm9pZCBNYXJrZXQsCis8cD5XaGVuIGRldmVsb3BpbmcgeW91ciBBbmRyb2lkIGFwcGxpY2F0aW9uIHRvIHRha2UgYWR2YW50YWdlIG9mIG11bHRpcGxlIEFQS3Mgb24gR29vZ2xlIFBsYXksCiBpdOKAmXMgaW1wb3J0YW50IHRvIGFkb3B0IHNvbWUgZ29vZCBwcmFjdGljZXMgZnJvbSB0aGUgZ2V0LWdvLCBhbmQgcHJldmVudCB1bm5lY2Vzc2FyeSBoZWFkYWNoZXMKIGZ1cnRoZXIgaW50byB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gIFRoaXMgbGVzc29uIHNob3dzIHlvdSBob3cgdG8gY3JlYXRlIG11bHRpcGxlIEFQS3Mgb2YgeW91cgogYXBwLCBlYWNoIGNvdmVyaW5nIGEgZGlmZmVyZW50IGNsYXNzIG9mIHNjcmVlbiBzaXplLiAgWW91IHdpbGwgYWxzbyBnYWluIHNvbWUgdG9vbHMgbmVjZXNzYXJ5IHRvCkBAIC0xNzgsNyArMTc4LDcgQEAKIAogCiA8aDIgaWQ9IkFkanVzdE1hbmlmZXN0cyI+QWRqdXN0IHRoZSBNYW5pZmVzdHM8L2gyPgotPHA+V2hlbiBhIHVzZXIgZG93bmxvYWRzIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbXVsdGlwbGUgQVBLcyB0aHJvdWdoIEFuZHJvaWQgTWFya2V0LCB0aGUgY29ycmVjdAorPHA+V2hlbiBhIHVzZXIgZG93bmxvYWRzIGFuIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbXVsdGlwbGUgQVBLcyB0aHJvdWdoIEdvb2dsZSBQbGF5LCB0aGUgY29ycmVjdAogQVBLIHRvIHVzZSBpcyBjaG9zZW4gdXNpbmcgdHdvIHNpbXBsZSBydWxlczo8L3A+CiA8dWw+CiA8bGk+VGhlIG1hbmlmZXN0IGhhcyB0byBzaG93IHRoYXQgcGFydGljdWxhciBBUEsgaXMgZWxpZ2libGU8L2xpPgpAQCAtMjI3LDE3ICsyMjcsMTcgQEAKIDwvdGFibGU+CiA8cD4KIE5vdywgbGV04oCZcyBmdXJ0aGVyIGFzc3VtZSB0aGF0IHRoZSBSZWQgQVBLIGhhcyBzb21lIHJlcXVpcmVtZW50IG9uIGl0IHRoYXQgdGhlIG90aGVyIHR3byBkb27igJl0LiAgVGhlCi08YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvYXBwZW5kaXgvbWFya2V0LWZpbHRlcnMuaHRtbCI+TWFya2V0IEZpbHRlcnMgcGFnZTwvYT4gb2YgdGhlIEFuZHJvaWQKKzxhIGhyZWY9IntAZG9jUm9vdH1ndWlkZS9hcHBlbmRpeC9tYXJrZXQtZmlsdGVycy5odG1sIj5GaWx0ZXJzIG9uIEdvb2dsZSBQbGF5PC9hPiBwYWdlIG9mIHRoZSBBbmRyb2lkCiBEZXZlbG9wZXIgZ3VpZGUgaGFzIGEgd2hvbGUgbGlzdCBvZiBwb3NzaWJsZSBjdWxwcml0cy4gIEZvciB0aGUgc2FrZSBvZiBleGFtcGxlLCBsZXTigJlzIGFzc3VtZSB0aGF0CiByZWQgcmVxdWlyZXMgYSBmcm9udC1mYWNpbmcgY2FtZXJhLiAgSW4gZmFjdCwgdGhlIGVudGlyZSBwb2ludCBvZiB0aGUgcmVkIEFQSyBpcyB0byB1c2UgdGhlIGV4dHJhCiBhdmFpbGFibGUgc2NyZWVuIHNwYWNlIHRvIGRvIGVudGVydGFpbmluZyB0aGluZ3Mgd2l0aCB0aGF0IGZyb250LWZhY2luZyBjYW1lcmEuICBCdXQsIGl0IHR1cm5zIG91dCwKIG5vdCBhbGwgeGxhcmdlIGRldmljZXMgZXZlbiBIQVZFIGZyb250LWZhY2luZyBjYW1lcmFzISAgVGhlIGhvcnJvciE8L3A+CiAKLTxwPkZvcnR1bmF0ZWx5LCBpZiBhIHVzZXIgaXMgYnJvd3NpbmcgTWFya2V0IGZyb20gb25lIHN1Y2ggZGV2aWNlLCBBbmRyb2lkIE1hcmtldCB3aWxsIGxvb2sgYXQgdGhlCis8cD5Gb3J0dW5hdGVseSwgaWYgYSB1c2VyIGlzIGJyb3dzaW5nIEdvb2dsZSBQbGF5IGZyb20gb25lIHN1Y2ggZGV2aWNlLCBHb29nbGUgUGxheSB3aWxsIGxvb2sgYXQgdGhlCiBtYW5pZmVzdCwgc2VlIHRoYXQgUmVkIGxpc3RzIHRoZSBmcm9udC1mYWNpbmcgY2FtZXJhIGFzIGEgcmVxdWlyZW1lbnQsIGFuZCBxdWlldGx5IGlnbm9yZSBpdCwgaGF2aW5nCiBkZXRlcm1pbmVkIHRoYXQgUmVkIGFuZCB0aGF0IGRldmljZSBhcmUgbm90IGEgbWF0Y2ggbWFkZSBpbiBkaWdpdGFsIGhlYXZlbi4gIEl0IHdpbGwgdGhlbiBzZWUgdGhhdAogR3JlZW4gaXMgbm90IG9ubHkgY29tcGF0aWJsZSB3aXRoIHhsYXJnZSBkZXZpY2VzLCBidXQgYWxzbyBkb2VzbuKAmXQgY2FyZSB3aGV0aGVyIG9yIG5vdCB0aGVyZeKAmXMgYQotZnJvbnQtZmFjaW5nIGNhbWVyYSEgIFRoZSBhcHAgY2FuIHN0aWxsIGJlIGRvd25sb2FkZWQgZnJvbSBBbmRyb2lkIE1hcmtldCBieSB0aGUgdXNlciwgYmVjYXVzZQorZnJvbnQtZmFjaW5nIGNhbWVyYSEgIFRoZSBhcHAgY2FuIHN0aWxsIGJlIGRvd25sb2FkZWQgZnJvbSBHb29nbGUgUGxheSBieSB0aGUgdXNlciwgYmVjYXVzZQogZGVzcGl0ZSB0aGUgd2hvbGUgZnJvbnQtY2FtZXJhIG1pc2hhcCwgdGhlcmUgd2FzIHN0aWxsIGFuIEFQSyB0aGF0IHN1cHBvcnRlZCB0aGF0IHBhcnRpY3VsYXIgc2NyZWVuCiBzaXplLjwvcD4KIApAQCAtMzAwLDkgKzMwMCw5IEBACiA8L3A+CiAKIDxoMiBpZD0iUHJlTGF1bmNoIj5HbyBPdmVyIFByZS1sYXVuY2ggQ2hlY2tsaXN0PC9oMj4KLTxwPiAgQmVmb3JlIHVwbG9hZGluZyB0byBBbmRyb2lkIE1hcmtldCwgZG91YmxlLWNoZWNrIHRoZSBmb2xsb3dpbmcgaXRlbXMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGFyZQorPHA+ICBCZWZvcmUgdXBsb2FkaW5nIHRvIEdvb2dsZSBQbGF5LCBkb3VibGUtY2hlY2sgdGhlIGZvbGxvd2luZyBpdGVtcy4gIFJlbWVtYmVyIHRoYXQgdGhlc2UgYXJlCiBzcGVjaWZpY2FsbHkgcmVsZXZhbnQgdG8gbXVsdGlwbGUgQVBLcywgYW5kIGluIG5vIHdheSByZXByZXNlbnQgYSBjb21wbGV0ZSBjaGVja2xpc3QgZm9yIGFsbAotYXBwbGljYXRpb25zIGJlaW5nIHVwbG9hZGVkIHRvIEFuZHJvaWQgTWFya2V0LjwvcD4KK2FwcGxpY2F0aW9ucyBiZWluZyB1cGxvYWRlZCB0byBHb29nbGUgUGxheS48L3A+CiA8dWw+CiA8bGk+QWxsIEFQS3MgbXVzdCBoYXZlIHRoZSBzYW1lIHBhY2thZ2UgbmFtZTwvbGk+CiA8bGk+QWxsIEFQS3MgbXVzdCBiZSBzaWduZWQgd2l0aCB0aGUgc2FtZSBjZXJ0aWZpY2F0ZTwvbGk+CkBAIC0zMTcsNyArMzE3LDcgQEAKIDwvdWw+CiAKIDxwPkl04oCZcyBhbHNvIHdvcnRoIGluc3BlY3RpbmcgdGhlIGNvbXBpbGVkIEFQSyBiZWZvcmUgcHVzaGluZyB0byBtYXJrZXQsIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVu4oCZdAotYW55IHN1cnByaXNlcyB0aGF0IGNvdWxkIGhpZGUgeW91ciBhcHBsaWNhdGlvbiBpbiBNYXJrZXQuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKK2FueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gb24gR29vZ2xlIFBsYXkuICBUaGlzIGlzIGFjdHVhbGx5IHF1aXRlIHNpbXBsZSB1c2luZyB0aGUKICJhYXB0IiB0b29sLiAgQWFwdCAodGhlIEFuZHJvaWQgQXNzZXQgUGFja2FnaW5nIFRvb2wpIGlzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGNyZWF0aW5nIGFuZAogcGFja2FnaW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbnMsIGFuZCBpcyBhbHNvIGEgdmVyeSBoYW5keSB0b29sIGZvciBpbnNwZWN0aW5nIHRoZW0uIDwvcD4KIApAQCAtMzQ1LDExICszNDUsMTYgQEAKIHN1cHBvcnRzLXNjcmVlbnMgYW5kIGNvbXBhdGlibGUtc2NyZWVucywgYW5kIHRoYXQgeW91IGRvbuKAmXQgaGF2ZSB1bmludGVuZGVkICJ1c2VzLWZlYXR1cmUiIHZhbHVlcwogdGhhdCB3ZXJlIGFkZGVkIGFzIGEgcmVzdWx0IG9mIHBlcm1pc3Npb25zIHlvdSBzZXQgaW4gdGhlIG1hbmlmZXN0LiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIEFQSwogd2lsbCBiZSBpbnZpc2libGUgdG8gbW9zdCwgaWYgbm90IGFsbCBkZXZpY2VzLjwvcD4KLTxwPldoeT8gIEJ5IGFkZGluZyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbiBTRU5EX1NNUywgdGhlIGZlYXR1cmUgcmVxdWlyZW1lbnQgb2YgYW5kcm9pZC5oYXJkd2FyZS50ZWxlcGhvbnkgd2FzIGltcGxpY2l0bHkgYWRkZWQuICBTaW5jZSBtb3N0IChpZiBub3QgYWxsKSB4bGFyZ2UgZGV2aWNlcyBhcmUgdGFibGV0cyB3aXRob3V0IHRlbGVwaG9ueSBoYXJkd2FyZSBpbiB0aGVtLCBNYXJrZXQgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIHRoZXNlIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBib3RoIGxhcmdlIGVub3VnaCB0byByZXBvcnQgYXMgeGxhcmdlIHNjcmVlbiBzaXplLCBhbmQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuCis8cD5XaHk/ICBCeSBhZGRpbmcgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gU0VORF9TTVMsIHRoZSBmZWF0dXJlIHJlcXVpcmVtZW50IG9mIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IHdhcyBpbXBsaWNpdGx5IGFkZGVkLiAgU2luY2UgbW9zdCAoaWYgbm90IGFsbCkgeGxhcmdlIGRldmljZXMgYXJlIHRhYmxldHMgd2l0aG91dCB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgR29vZ2xlIFBsYXkgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIHRoZXNlIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBib3RoIGxhcmdlIGVub3VnaCB0byByZXBvcnQgYXMgeGxhcmdlIHNjcmVlbiBzaXplLCBhbmQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuCiA8L3A+CiA8cD5Gb3J0dW5hdGVseSB0aGlzIGlzIGVhc2lseSBmaXhlZCBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byB5b3VyCiBtYW5pZmVzdDo8L3A+CiA8cHJlPgogJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLyZndDsKIDwvcHJlPgotPHA+T25jZSB5b3XigJl2ZSBjb21wbGV0ZWQgdGhlIHByZS1sYXVuY2ggY2hlY2tsaXN0LCB1cGxvYWQgeW91ciBBUEtzIHRvIEFuZHJvaWQgTWFya2V0LiAgSXQgbWF5IHRha2UgYSBiaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBzaG93IHVwIHdoZW4gYnJvd3NpbmcgQW5kcm9pZCBNYXJrZXQsIGJ1dCB3aGVuIGl0IGRvZXMsIHBlcmZvcm0gb25lIGxhc3QgY2hlY2suICBEb3dubG9hZCB0aGUgYXBwbGljYXRpb24gb250byBhbnkgdGVzdCBkZXZpY2VzIHlvdSBtYXkgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQVBLcyBhcmUgdGFyZ2V0aW5nIHRoZSBpbnRlbmRlZCBkZXZpY2VzLiBDb25ncmF0dWxhdGlvbnMsIHlvdeKAmXJlIGRvbmUhPC9wPgorPHA+VGhlIDxjb2RlPmFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW48L2NvZGU+IHJlcXVpcmVtZW50IGlzIGFsc28gaW1wbGljaXRseSBhZGRlZC4gSWYgeW91IHdhbnQgeW91ciBBUEsgdG8gYmUgdmlzaWJsZSBvbiBUVnMgd2hpY2ggYXJlIG5vbi10b3VjaHNjcmVlbiBkZXZpY2VzIHlvdSBzaG91bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBtYW5pZmVzdDo8L3A+Cis8cHJlPgorJmx0O3VzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUudG91Y2hzY3JlZW4iIGFuZHJvaWQ6cmVxdWlyZWQ9ImZhbHNlIiAvJmd0OworPC9wcmU+CisKKzxwPk9uY2UgeW914oCZdmUgY29tcGxldGVkIHRoZSBwcmUtbGF1bmNoIGNoZWNrbGlzdCwgdXBsb2FkIHlvdXIgQVBLcyB0byBHb29nbGUgUGxheS4gIEl0IG1heSB0YWtlIGEgYml0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gc2hvdyB1cCB3aGVuIGJyb3dzaW5nIEdvb2dsZSBQbGF5LCBidXQgd2hlbiBpdCBkb2VzLCBwZXJmb3JtIG9uZSBsYXN0IGNoZWNrLiAgRG93bmxvYWQgdGhlIGFwcGxpY2F0aW9uIG9udG8gYW55IHRlc3QgZGV2aWNlcyB5b3UgbWF5IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEFQS3MgYXJlIHRhcmdldGluZyB0aGUgaW50ZW5kZWQgZGV2aWNlcy4gQ29uZ3JhdHVsYXRpb25zLCB5b3XigJlyZSBkb25lITwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL3RleHR1cmUuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlwbGUtYXBrcy90ZXh0dXJlLmpkCmluZGV4IDJiYmU1MTEuLjQ5N2Q2YjggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXBsZS1hcGtzL3RleHR1cmUuamQKKysrIGIvZG9jcy9odG1sL3RyYWluaW5nL211bHRpcGxlLWFwa3MvdGV4dHVyZS5qZApAQCAtNDAsNyArNDAsNyBAQAogPC9kaXY+CiA8L2Rpdj4KIAotPHA+V2hlbiBkZXZlbG9waW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aXBsZSBBUEtzIG9uIEFuZHJvaWQgTWFya2V0LCBpdOKAmXMgaW1wb3J0YW50IHRvIGFkb3B0IHNvbWUgZ29vZCBwcmFjdGljZXMgZnJvbSB0aGUgZ2V0LWdvLCBhbmQgcHJldmVudCB1bm5lY2Vzc2FyeSBoZWFkYWNoZXMgZnVydGhlciBpbnRvIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiAgVGhpcyBsZXNzb24gc2hvd3MgeW91IGhvdyB0byBjcmVhdGUgbXVsdGlwbGUgQVBLcyBvZiB5b3VyIGFwcCwgZWFjaCBzdXBwb3J0aW5nIGEgZGlmZmVyZW50IHN1YnNldCBvZiBPcGVuR0wgdGV4dHVyZSBmb3JtYXRzLiAgWW91IHdpbGwgYWxzbyBnYWluIHNvbWUgdG9vbHMgbmVjZXNzYXJ5IHRvIG1ha2UgbWFpbnRhaW5pbmcgYSBtdWx0aXBsZSBBUEsgY29kZWJhc2UgYXMgcGFpbmxlc3MgYXMgcG9zc2libGUuPC9wPgorPHA+V2hlbiBkZXZlbG9waW5nIHlvdXIgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byB0YWtlIGFkdmFudGFnZSBvZiBtdWx0aXBsZSBBUEtzIG9uIEdvb2dsZSBQbGF5LCBpdOKAmXMgaW1wb3J0YW50IHRvIGFkb3B0IHNvbWUgZ29vZCBwcmFjdGljZXMgZnJvbSB0aGUgZ2V0LWdvLCBhbmQgcHJldmVudCB1bm5lY2Vzc2FyeSBoZWFkYWNoZXMgZnVydGhlciBpbnRvIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiAgVGhpcyBsZXNzb24gc2hvd3MgeW91IGhvdyB0byBjcmVhdGUgbXVsdGlwbGUgQVBLcyBvZiB5b3VyIGFwcCwgZWFjaCBzdXBwb3J0aW5nIGEgZGlmZmVyZW50IHN1YnNldCBvZiBPcGVuR0wgdGV4dHVyZSBmb3JtYXRzLiAgWW91IHdpbGwgYWxzbyBnYWluIHNvbWUgdG9vbHMgbmVjZXNzYXJ5IHRvIG1ha2UgbWFpbnRhaW5pbmcgYSBtdWx0aXBsZSBBUEsgY29kZWJhc2UgYXMgcGFpbmxlc3MgYXMgcG9zc2libGUuPC9wPgogCiAKIDxoMiBpZD0iQ29uZmlybSI+Q29uZmlybSBZb3UgTmVlZCBNdWx0aXBsZSBBUEtzPC9oMj4KQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAKIDxoMiBpZD0iQWRqdXN0TWFuaWZlc3RzIj5BZGp1c3QgdGhlIE1hbmlmZXN0czwvaDI+Ci08cD5XaGVuIGEgdXNlciBkb3dubG9hZHMgYW4gYXBwbGljYXRpb24gd2hpY2ggdXNlcyBtdWx0aXBsZSBBUEtzIHRocm91Z2ggQW5kcm9pZCBNYXJrZXQsIHRoZSBjb3JyZWN0Cis8cD5XaGVuIGEgdXNlciBkb3dubG9hZHMgYW4gYXBwbGljYXRpb24gd2hpY2ggdXNlcyBtdWx0aXBsZSBBUEtzIHRocm91Z2ggR29vZ2xlIFBsYXksIHRoZSBjb3JyZWN0CiBBUEsgdG8gdXNlIGlzIGNob3NlbiB1c2luZyBzb21lIHNpbXBsZSBydWxlczo8L3A+CiAKIDx1bD4KQEAgLTI0Niw5ICsyNDYsOSBAQAogPC9wcmU+CiAKIDxoMiBpZD0iUHJlTGF1bmNoIj5HbyBPdmVyIFByZS1sYXVuY2ggQ2hlY2tsaXN0PC9oMj4KLTxwPkJlZm9yZSB1cGxvYWRpbmcgdG8gQW5kcm9pZCBNYXJrZXQsIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUKKzxwPkJlZm9yZSB1cGxvYWRpbmcgdG8gR29vZ2xlIFBsYXksIGRvdWJsZS1jaGVjayB0aGUgZm9sbG93aW5nIGl0ZW1zLiAgUmVtZW1iZXIgdGhhdCB0aGVzZSBhcmUKIHNwZWNpZmljYWxseSByZWxldmFudCB0byBtdWx0aXBsZSBBUEtzLCBhbmQgaW4gbm8gd2F5IHJlcHJlc2VudCBhIGNvbXBsZXRlIGNoZWNrbGlzdCBmb3IgYWxsCi1hcHBsaWNhdGlvbnMgYmVpbmcgdXBsb2FkZWQgdG8gQW5kcm9pZCBNYXJrZXQuPC9wPgorYXBwbGljYXRpb25zIGJlaW5nIHVwbG9hZGVkIHRvIEdvb2dsZSBQbGF5LjwvcD4KIAogPHVsPgogPGxpPkFsbCBBUEtzIG11c3QgaGF2ZSB0aGUgc2FtZSBwYWNrYWdlIG5hbWU8L2xpPgpAQCAtMjYyLDcgKzI2Miw3IEBACiA8L3VsPgogCiA8cD5JdOKAmXMgYWxzbyB3b3J0aCBpbnNwZWN0aW5nIHRoZSBjb21waWxlZCBBUEsgYmVmb3JlIHB1c2hpbmcgdG8gbWFya2V0LCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbuKAmXQKLWFueSBzdXJwcmlzZXMgdGhhdCBjb3VsZCBoaWRlIHlvdXIgYXBwbGljYXRpb24gaW4gTWFya2V0LiAgVGhpcyBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUgdXNpbmcgdGhlCithbnkgc3VycHJpc2VzIHRoYXQgY291bGQgaGlkZSB5b3VyIGFwcGxpY2F0aW9uIG9uIEdvb2dsZSBQbGF5LiAgVGhpcyBpcyBhY3R1YWxseSBxdWl0ZSBzaW1wbGUgdXNpbmcgdGhlCiAiYWFwdCIgdG9vbC4gIEFhcHQgKHRoZSBBbmRyb2lkIEFzc2V0IFBhY2thZ2luZyBUb29sKSBpcyBwYXJ0IG9mIHRoZSBidWlsZCBwcm9jZXNzIGZvciBjcmVhdGluZyBhbmQKIHBhY2thZ2luZyB5b3VyIEFuZHJvaWQgYXBwbGljYXRpb25zLCBhbmQgaXMgYWxzbyBhIHZlcnkgaGFuZHkgdG9vbCBmb3IgaW5zcGVjdGluZyB0aGVtLiA8L3A+CiAKQEAgLTI5MCwxMCArMjkwLDE1IEBACiBzdXBwb3J0cy1zY3JlZW5zIGFuZCBjb21wYXRpYmxlLXNjcmVlbnMsIGFuZCB0aGF0IHlvdSBkb27igJl0IGhhdmUgdW5pbnRlbmRlZCAidXNlcy1mZWF0dXJlIiB2YWx1ZXMKIHRoYXQgd2VyZSBhZGRlZCBhcyBhIHJlc3VsdCBvZiBwZXJtaXNzaW9ucyB5b3Ugc2V0IGluIHRoZSBtYW5pZmVzdC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBBUEsKIHdpbGwgYmUgaW52aXNpYmxlIHRvIG1vc3QsIGlmIG5vdCBhbGwgZGV2aWNlcy48L3A+Ci08cD5XaHk/ICBCeSBhZGRpbmcgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gU0VORF9TTVMsIHRoZSBmZWF0dXJlIHJlcXVpcmVtZW50IG9mIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IHdhcyBpbXBsaWNpdGx5IGFkZGVkLiAgU2luY2UgbW9zdCAoaWYgbm90IGFsbCkgeGxhcmdlIGRldmljZXMgYXJlIHRhYmxldHMgd2l0aG91dCB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgTWFya2V0IHdpbGwgZmlsdGVyIG91dCB0aGlzIEFQSyBpbiB0aGVzZSBjYXNlcywgdW50aWwgZnV0dXJlIGRldmljZXMgY29tZSBhbG9uZyB3aGljaCBhcmUgYm90aCBsYXJnZSBlbm91Z2ggdG8gcmVwb3J0IGFzIHhsYXJnZSBzY3JlZW4gc2l6ZSwgYW5kIHBvc3Nlc3MgdGVsZXBob255IGhhcmR3YXJlLiAgCis8cD5XaHk/ICBCeSBhZGRpbmcgdGhlIHJlcXVpcmVkIHBlcm1pc3Npb24gU0VORF9TTVMsIHRoZSBmZWF0dXJlIHJlcXVpcmVtZW50IG9mIGFuZHJvaWQuaGFyZHdhcmUudGVsZXBob255IHdhcyBpbXBsaWNpdGx5IGFkZGVkLiAgU2luY2UgbW9zdCAoaWYgbm90IGFsbCkgeGxhcmdlIGRldmljZXMgYXJlIHRhYmxldHMgd2l0aG91dCB0ZWxlcGhvbnkgaGFyZHdhcmUgaW4gdGhlbSwgR29vZ2xlIFBsYXkgd2lsbCBmaWx0ZXIgb3V0IHRoaXMgQVBLIGluIHRoZXNlIGNhc2VzLCB1bnRpbCBmdXR1cmUgZGV2aWNlcyBjb21lIGFsb25nIHdoaWNoIGFyZSBib3RoIGxhcmdlIGVub3VnaCB0byByZXBvcnQgYXMgeGxhcmdlIHNjcmVlbiBzaXplLCBhbmQgcG9zc2VzcyB0ZWxlcGhvbnkgaGFyZHdhcmUuICAKIDwvcD4KIDxwPkZvcnR1bmF0ZWx5IHRoaXMgaXMgZWFzaWx5IGZpeGVkIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbWFuaWZlc3Q6PC9wPgogPHByZT4KICZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRlbGVwaG9ueSIgYW5kcm9pZDpyZXF1aXJlZD0iZmFsc2UiIC8mZ3Q7CiA8L3ByZT4KLTxwPk9uY2UgeW914oCZdmUgY29tcGxldGVkIHRoZSBwcmUtbGF1bmNoIGNoZWNrbGlzdCwgdXBsb2FkIHlvdXIgQVBLcyB0byBBbmRyb2lkIE1hcmtldC4gIEl0IG1heSB0YWtlIGEgYml0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gc2hvdyB1cCB3aGVuIGJyb3dzaW5nIEFuZHJvaWQgTWFya2V0LCBidXQgd2hlbiBpdCBkb2VzLCBwZXJmb3JtIG9uZSBsYXN0IGNoZWNrLiAgRG93bmxvYWQgdGhlIGFwcGxpY2F0aW9uIG9udG8gYW55IHRlc3QgZGV2aWNlcyB5b3UgbWF5IGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIEFQS3MgYXJlIHRhcmdldGluZyB0aGUgaW50ZW5kZWQgZGV2aWNlcy4gQ29uZ3JhdHVsYXRpb25zLCB5b3XigJlyZSBkb25lITwvcD4KKzxwPlRoZSA8Y29kZT5hbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuPC9jb2RlPiByZXF1aXJlbWVudCBpcyBhbHNvIGltcGxpY2l0bHkgYWRkZWQuIElmIHlvdSB3YW50IHlvdXIgQVBLIHRvIGJlIHZpc2libGUgb24gVFZzIHdoaWNoIGFyZSBub24tdG91Y2hzY3JlZW4gZGV2aWNlcyB5b3Ugc2hvdWxkIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgbWFuaWZlc3Q6PC9wPgorPHByZT4KKyZsdDt1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLnRvdWNoc2NyZWVuIiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLyZndDsKKzwvcHJlPgorCis8cD5PbmNlIHlvdeKAmXZlIGNvbXBsZXRlZCB0aGUgcHJlLWxhdW5jaCBjaGVja2xpc3QsIHVwbG9hZCB5b3VyIEFQS3MgdG8gR29vZ2xlIFBsYXkuICBJdCBtYXkgdGFrZSBhIGJpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIHNob3cgdXAgd2hlbiBicm93c2luZyBHb29nbGUgUGxheSwgYnV0IHdoZW4gaXQgZG9lcywgcGVyZm9ybSBvbmUgbGFzdCBjaGVjay4gIERvd25sb2FkIHRoZSBhcHBsaWNhdGlvbiBvbnRvIGFueSB0ZXN0IGRldmljZXMgeW91IG1heSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBBUEtzIGFyZSB0YXJnZXRpbmcgdGhlIGludGVuZGVkIGRldmljZXMuIENvbmdyYXR1bGF0aW9ucywgeW914oCZcmUgZG9uZSE8L3A+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlzY3JlZW4vc2NyZWVuc2l6ZXMuamQgYi9kb2NzL2h0bWwvdHJhaW5pbmcvbXVsdGlzY3JlZW4vc2NyZWVuc2l6ZXMuamQKaW5kZXggMmRiMGI2Ny4uYmYxOWIwOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL211bHRpc2NyZWVuL3NjcmVlbnNpemVzLmpkCisrKyBiL2RvY3MvaHRtbC90cmFpbmluZy9tdWx0aXNjcmVlbi9zY3JlZW5zaXplcy5qZApAQCAtMTY0LDE0ICsxNjQsMTQgQEAKIAoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy90cmFpbmluZy9tdWx0aXNjcmVlbi9uZXdzcmVhZGVyL3Jlcy9sYXlvdXQvb25lcGFuZS54bWwgYWxsfQogPC9saT4KLSAgPGxpPjxjb2RlPnJlcy9sYXlvdXQteGxhcmdlL21haW4ueG1sPC9jb2RlPiwgdHdvLXBhbmUgbGF5b3V0OgorICA8bGk+PGNvZGU+cmVzL2xheW91dC1sYXJnZS9tYWluLnhtbDwvY29kZT4sIHR3by1wYW5lIGxheW91dDoKIAoge0BzYW1wbGUgZGV2ZWxvcG1lbnQvc2FtcGxlcy90cmFpbmluZy9tdWx0aXNjcmVlbi9uZXdzcmVhZGVyL3Jlcy9sYXlvdXQvdHdvcGFuZXMueG1sIGFsbH0KIDwvbGk+CiA8L3VsPgogCi08cD5Ob3RpY2UgdGhlIDxjb2RlPnhsYXJnZTwvY29kZT4gcXVhbGlmaWVyIGluIHRoZSBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgc2Vjb25kIGxheW91dC4gVGhpcyBsYXlvdXQKLXdpbGwgYmUgc2VsZWN0ZWQgb24gZGV2aWNlcyB3aXRoIHNjcmVlbnMgY2xhc3NpZmllZCBhcyBleHRyYS1sYXJnZSAoZm9yIGV4YW1wbGUsIDEwIiB0YWJsZXRzKS4gVGhlCis8cD5Ob3RpY2UgdGhlIDxjb2RlPmxhcmdlPC9jb2RlPiBxdWFsaWZpZXIgaW4gdGhlIGRpcmVjdG9yeSBuYW1lIG9mIHRoZSBzZWNvbmQgbGF5b3V0LiBUaGlzIGxheW91dAord2lsbCBiZSBzZWxlY3RlZCBvbiBkZXZpY2VzIHdpdGggc2NyZWVucyBjbGFzc2lmaWVkIGFzIGxhcmdlIChmb3IgZXhhbXBsZSwgNyIgdGFibGV0cyBhbmQgYWJvdmUpLiBUaGUKIG90aGVyIGxheW91dCAod2l0aG91dCBxdWFsaWZpZXJzKSB3aWxsIGJlIHNlbGVjdGVkIGZvciBzbWFsbGVyIGRldmljZXMuPC9wPgogCiAKQEAgLTE4OCw3ICsxODgsNyBAQAogd2lkdGggZ2l2ZW4gaW4gZHAuIEZvciBleGFtcGxlLCB0aGUgdHlwaWNhbCA3IiB0YWJsZXQgaGFzIGEgbWluaW11bSB3aWR0aCBvZgogNjAwIGRwLCBzbyBpZiB5b3Ugd2FudCB5b3VyIFVJIHRvIGhhdmUgdHdvIHBhbmVzIG9uIHRob3NlIHNjcmVlbnMgKGJ1dCBhIHNpbmdsZQogbGlzdCBvbiBzbWFsbGVyIHNjcmVlbnMpLCB5b3UgY2FuIHVzZSB0aGUgc2FtZSB0d28gbGF5b3V0cyBmcm9tIHRoZSBwcmV2aW91cyBzZWN0aW9uIGZvciBzaW5nbGUKLWFuZCB0d28tcGFuZSBsYXlvdXRzLCBidXQgaW5zdGVhZCBvZiB0aGUgPGNvZGU+eGxhcmdlPC9jb2RlPiBzaXplIHF1YWxpZmllciwgdXNlCithbmQgdHdvLXBhbmUgbGF5b3V0cywgYnV0IGluc3RlYWQgb2YgdGhlIDxjb2RlPmxhcmdlPC9jb2RlPiBzaXplIHF1YWxpZmllciwgdXNlCiA8Y29kZT5zdzYwMGRwPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGUgdHdvLXBhbmUgbGF5b3V0IGlzIGZvciBzY3JlZW5zIG9uIHdoaWNoIHRoZSBzbWFsbGVzdC13aWR0aAogaXMgNjAwIGRwOjwvcD4KIApAQCAtMjA5LDkgKzIwOSw5IEBACiBsYXlvdXQuPC9wPgogCiA8cD5Ib3dldmVyLCB0aGlzIHdvbid0IHdvcmsgd2VsbCBvbiBwcmUtMy4yIGRldmljZXMsIGJlY2F1c2UgdGhleSBkb24ndAotcmVjb2duaXplIDxjb2RlPnN3NjAwZHA8L2NvZGU+IGFzIGEgc2l6ZSBxdWFsaWZpZXIsIHNvIHlvdSBzdGlsbCBoYXZlIHRvIHVzZSB0aGUgPGNvZGU+eGxhcmdlPC9jb2RlPgorcmVjb2duaXplIDxjb2RlPnN3NjAwZHA8L2NvZGU+IGFzIGEgc2l6ZSBxdWFsaWZpZXIsIHNvIHlvdSBzdGlsbCBoYXZlIHRvIHVzZSB0aGUgPGNvZGU+bGFyZ2U8L2NvZGU+CiBxdWFsaWZpZXIgYXMgd2VsbC4gU28sIHlvdSBzaG91bGQgaGF2ZSBhIGZpbGUgbmFtZWQgCi08Y29kZT5yZXMvbGF5b3V0LXhsYXJnZS9tYWluLnhtbDwvY29kZT4KKzxjb2RlPnJlcy9sYXlvdXQtbGFyZ2UvbWFpbi54bWw8L2NvZGU+CiB3aGljaCBpcyBpZGVudGljYWwgdG8gPGNvZGU+cmVzL2xheW91dC1zdzYwMGRwL21haW4ueG1sPC9jb2RlPi4gSW4gdGhlIG5leHQgc2VjdGlvbgogeW91J2xsIHNlZSBhIHRlY2huaXF1ZSB0aGF0IGFsbG93cyB5b3UgdG8gYXZvaWQgZHVwbGljYXRpbmcgdGhlIGxheW91dCBmaWxlcyB0aGlzIHdheS48L3A+CiAKQEAgLTIyMiwyMCArMjIyLDIwIEBACiBUaGVyZWZvcmUsIHlvdSBzaG91bGQgYWxzbyBzdGlsbCB1c2UgdGhlIGFic3RyYWN0IHNpemUgYmlucyAoc21hbGwsIG5vcm1hbCwKIGxhcmdlIGFuZCB4bGFyZ2UpIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIHZlcnNpb25zLiBGb3IgZXhhbXBsZSwgaWYgeW91CiB3YW50IHRvIGRlc2lnbiB5b3VyIFVJIHNvIHRoYXQgaXQgc2hvd3MgYSBzaW5nbGUtcGFuZSBVSSBvbiBwaG9uZXMgYnV0IGEKLW11bHRpLXBhbmUgVUkgb24gNyIgdGFibGV0cyBhbmQgbGFyZ2VyIGRldmljZXMsIHlvdSdkIGhhdmUgdG8gc3VwcGx5IHRoZXNlCittdWx0aS1wYW5lIFVJIG9uIDciIHRhYmxldHMsIFRWcyBhbmQgb3RoZXIgbGFyZ2UgZGV2aWNlcywgeW91J2QgaGF2ZSB0byBzdXBwbHkgdGhlc2UKIGZpbGVzOjwvcD4KIAogPHA+PHVsPgogPGxpPjxjb2RlPnJlcy9sYXlvdXQvbWFpbi54bWw6PC9jb2RlPiBzaW5nbGUtcGFuZSBsYXlvdXQ8L2xpPgotPGxpPjxjb2RlPnJlcy9sYXlvdXQteGxhcmdlOjwvY29kZT4gbXVsdGktcGFuZSBsYXlvdXQ8L2xpPgorPGxpPjxjb2RlPnJlcy9sYXlvdXQtbGFyZ2U6PC9jb2RlPiBtdWx0aS1wYW5lIGxheW91dDwvbGk+CiA8bGk+PGNvZGU+cmVzL2xheW91dC1zdzYwMGRwOjwvY29kZT4gbXVsdGktcGFuZSBsYXlvdXQ8L2xpPgogPC91bD48L3A+CiAKIDxwPlRoZSBsYXN0IHR3byBmaWxlcyBhcmUgaWRlbnRpY2FsLCBiZWNhdXNlIG9uZSBvZiB0aGVtIHdpbGwgYmUgbWF0Y2hlZCBieQotQW5kcm9pZCAzLjIgZGV2aWNlcywgYW5kIHRoZSBvdGhlciBvbmUgaXMgZm9yIHRoZSBiZW5lZml0IG9mIHRhYmxldHMgd2l0aAorQW5kcm9pZCAzLjIgZGV2aWNlcywgYW5kIHRoZSBvdGhlciBvbmUgaXMgZm9yIHRoZSBiZW5lZml0IG9mIHRhYmxldHMgYW5kIFRWcyB3aXRoCiBlYXJsaWVyIHZlcnNpb25zIG9mIEFuZHJvaWQuPC9wPgogCi08cD5UbyBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uIG9mIHRoZSBzYW1lIGZpbGUgZm9yIHRhYmxldHMgKGFuZCB0aGUgbWFpbnRlbmFuY2UKKzxwPlRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24gb2YgdGhlIHNhbWUgZmlsZSBmb3IgdGFibGV0cyBhbmQgVFZzIChhbmQgdGhlIG1haW50ZW5hbmNlCiBoZWFkYWNoZSByZXN1bHRpbmcgZnJvbSBpdCksIHlvdSBjYW4gdXNlIGFsaWFzIGZpbGVzLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkZWZpbmUgdGhlIGZvbGxvd2luZwogbGF5b3V0czo8L3A+CiAKQEAgLTI0Nyw3ICsyNDcsNyBAQAogPHA+QW5kIGFkZCB0aGVzZSB0d28gZmlsZXM6PC9wPgogCiA8cD48dWw+Ci08bGk+PGNvZGU+cmVzL3ZhbHVlcy14bGFyZ2UvbGF5b3V0LnhtbDwvY29kZT46Cis8bGk+PGNvZGU+cmVzL3ZhbHVlcy1sYXJnZS9sYXlvdXQueG1sPC9jb2RlPjoKIDxwcmU+CiAmbHQ7cmVzb3VyY2VzPgogICAgICZsdDtpdGVtIG5hbWU9Im1haW4iIHR5cGU9ImxheW91dCI+JiM2NDtsYXlvdXQvbWFpbl90d29wYW5lcyZsdDsvaXRlbT4KQEAgLTI2Nyw5ICsyNjcsOSBAQAogCiA8cD5UaGVzZSBsYXR0ZXIgdHdvIGZpbGVzIGhhdmUgaWRlbnRpY2FsIGNvbnRlbnQsIGJ1dCB0aGV5IGRvbuKAmXQgYWN0dWFsbHkgZGVmaW5lCiB0aGUgbGF5b3V0LiBUaGV5IG1lcmVseSBzZXQgdXAge0Bjb2RlIG1haW59IHRvIGJlIGFuIGFsaWFzIHRvIHtAY29kZSBtYWluX3R3b3BhbmVzfS4gU2luY2UKLXRoZXNlIGZpbGVzIGhhdmUgPGNvZGU+eGxhcmdlPC9jb2RlPiBhbmQgPGNvZGU+c3c2MDBkcDwvY29kZT4gc2VsZWN0b3JzLCB0aGV5IGFyZQotYXBwbGllZCB0byB0YWJsZXRzIHJlZ2FyZGxlc3Mgb2YgQW5kcm9pZCB2ZXJzaW9uIChwcmUtMy4yIHRhYmxldHMgbWF0Y2gKLXtAY29kZSB4bGFyZ2V9LCBhbmQgcG9zdC0zLjIgd2lsbCBtYXRjaCA8Y29kZT5zdzYwMGRwPC9jb2RlPikuPC9wPgordGhlc2UgZmlsZXMgaGF2ZSA8Y29kZT5sYXJnZTwvY29kZT4gYW5kIDxjb2RlPnN3NjAwZHA8L2NvZGU+IHNlbGVjdG9ycywgdGhleSBhcmUKK2FwcGxpZWQgdG8gdGFibGV0cyBhbmQgVFZzIHJlZ2FyZGxlc3Mgb2YgQW5kcm9pZCB2ZXJzaW9uIChwcmUtMy4yIHRhYmxldHMgYW5kIFRWcyBtYXRjaAore0Bjb2RlIGxhcmdlfSwgYW5kIHBvc3QtMy4yIHdpbGwgbWF0Y2ggPGNvZGU+c3c2MDBkcDwvY29kZT4pLjwvcD4KIAogCiA8aDIgaWQ9IlRhc2tVc2VPcmlRdWFsaSI+VXNlIE9yaWVudGF0aW9uIFF1YWxpZmllcnM8L2gyPiAKQEAgLTI4NSw2ICsyODUsNyBAQAogPGxpPjxiPjciIHRhYmxldCwgbGFuZHNjYXBlOjwvYj4gZHVhbCBwYW5lLCB3aWRlLCB3aXRoIGFjdGlvbiBiYXI8L2xpPgogPGxpPjxiPjEwIiB0YWJsZXQsIHBvcnRyYWl0OjwvYj4gZHVhbCBwYW5lLCBuYXJyb3csIHdpdGggYWN0aW9uIGJhcjwvbGk+CiA8bGk+PGI+MTAiIHRhYmxldCwgbGFuZHNjYXBlOjwvYj4gZHVhbCBwYW5lLCB3aWRlLCB3aXRoIGFjdGlvbiBiYXI8L2xpPgorPGxpPjxiPlRWLCBsYW5kc2NhcGU6PC9iPiBkdWFsIHBhbmUsIHdpZGUsIHdpdGggYWN0aW9uIGJhcjwvbGk+CiA8L3VsPjwvcD4KIAogPHA+U28gZWFjaCBvZiB0aGVzZSBsYXlvdXRzIGlzIGRlZmluZWQgaW4gYW4gWE1MIGZpbGUgaW4gdGhlIApAQCAtMzE5LDExICszMjAsMTEgQEAKIHtAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvdHJhaW5pbmcvbXVsdGlzY3JlZW4vbmV3c3JlYWRlci9yZXMvdmFsdWVzLXN3NjAwZHAtcG9ydC9sYXlvdXRzLnhtbAogYWxsfQogCi08cD48Y29kZT5yZXMvdmFsdWVzLXhsYXJnZS1sYW5kL2xheW91dHMueG1sPC9jb2RlPjo8L3A+Ci17QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL3RyYWluaW5nL211bHRpc2NyZWVuL25ld3NyZWFkZXIvcmVzL3ZhbHVlcy14bGFyZ2UtbGFuZC9sYXlvdXRzLnhtbCBhbGx9Cis8cD48Y29kZT5yZXMvdmFsdWVzLWxhcmdlLWxhbmQvbGF5b3V0cy54bWw8L2NvZGU+OjwvcD4KK3tAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvdHJhaW5pbmcvbXVsdGlzY3JlZW4vbmV3c3JlYWRlci9yZXMvdmFsdWVzLWxhcmdlLWxhbmQvbGF5b3V0cy54bWwgYWxsfQogCi08cD48Y29kZT5yZXMvdmFsdWVzLXhsYXJnZS1wb3J0L2xheW91dHMueG1sPC9jb2RlPjo8L3A+Ci17QHNhbXBsZSBkZXZlbG9wbWVudC9zYW1wbGVzL3RyYWluaW5nL211bHRpc2NyZWVuL25ld3NyZWFkZXIvcmVzL3ZhbHVlcy14bGFyZ2UtcG9ydC9sYXlvdXRzLnhtbCBhbGx9Cis8cD48Y29kZT5yZXMvdmFsdWVzLWxhcmdlLXBvcnQvbGF5b3V0cy54bWw8L2NvZGU+OjwvcD4KK3tAc2FtcGxlIGRldmVsb3BtZW50L3NhbXBsZXMvdHJhaW5pbmcvbXVsdGlzY3JlZW4vbmV3c3JlYWRlci9yZXMvdmFsdWVzLWxhcmdlLXBvcnQvbGF5b3V0cy54bWwgYWxsfQogCiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3RyYWluaW5nL3NoYXJpbmcvcmVjZWl2ZS5qZCBiL2RvY3MvaHRtbC90cmFpbmluZy9zaGFyaW5nL3JlY2VpdmUuamQKaW5kZXggY2M1NTk2Ny4uYTBhNWJjOCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3RyYWluaW5nL3NoYXJpbmcvcmVjZWl2ZS5qZAorKysgYi9kb2NzL2h0bWwvdHJhaW5pbmcvc2hhcmluZy9yZWNlaXZlLmpkCkBAIC0zNCw3ICszNCw3IEBACiBmcm9tIGFwcGxpY2F0aW9ucy4gVGhpbmsgYWJvdXQgaG93IHVzZXJzIGludGVyYWN0IHdpdGggeW91ciBhcHBsaWNhdGlvbiwgYW5kIHdoYXQgZGF0YSB0eXBlcyB5b3UgCiB3YW50IHRvIHJlY2VpdmUgZnJvbSBvdGhlciBhcHBsaWNhdGlvbnMuIEZvciBleGFtcGxlLCBhIHNvY2lhbCBuZXR3b3JraW5nIGFwcGxpY2F0aW9uIHdvdWxkIGxpa2VseSAKIGJlIGludGVyZXN0ZWQgaW4gcmVjZWl2aW5nIHRleHQgY29udGVudCwgbGlrZSBhbiBpbnRlcmVzdGluZyB3ZWIgVVJMLCBmcm9tIGFub3RoZXIgYXBwLiBUaGUgCi08YSBocmVmPSJodHRwczovL21hcmtldC5hbmRyb2lkLmNvbS9kZXRhaWxzP2lkPWNvbS5nb29nbGUuYW5kcm9pZC5hcHBzLnBsdXMiPkdvb2dsZSsgQW5kcm9pZAorPGEgaHJlZj0iaHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvZGV0YWlscz9pZD1jb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5wbHVzIj5Hb29nbGUrIEFuZHJvaWQKIGFwcGxpY2F0aW9uPC9hPiAKIGFjY2VwdHMgYm90aCB0ZXh0IDxlbT5hbmQ8L2VtPiBzaW5nbGUgb3IgbXVsdGlwbGUgaW1hZ2VzLiBXaXRoIHRoaXMgYXBwLCBhIHVzZXIgY2FuIGVhc2lseSBzdGFydCBhIAogbmV3IEdvb2dsZSsgcG9zdCB3aXRoIHBob3RvcyBmcm9tIHRoZSBBbmRyb2lkIEdhbGxlcnkgYXBwLjwvcD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL0JpbmRlci5oIGIvaW5jbHVkZS9iaW5kZXIvQmluZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2FjNGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvQmluZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9CSU5ERVJfSAotI2RlZmluZSBBTkRST0lEX0JJTkRFUl9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQkJpbmRlciA6IHB1YmxpYyBJQmluZGVyCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBCQmluZGVyKCk7Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzE2JiBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sICAgICAgICBpc0JpbmRlckFsaXZlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwaW5nQmluZGVyKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHRyYW5zYWN0KCAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgbGlua1RvRGVhdGgoY29uc3Qgc3A8RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgdW5saW5rVG9EZWF0aCggIGNvbnN0IHdwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwPERlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50ID0gTlVMTCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGF0dGFjaE9iamVjdCggICBjb25zdCB2b2lkKiBvYmplY3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2xlYW51cENvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmMpOwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgZmluZE9iamVjdChjb25zdCB2b2lkKiBvYmplY3RJRCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBkZXRhY2hPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpOwotCi0gICAgdmlydHVhbCBCQmluZGVyKiAgICBsb2NhbEJpbmRlcigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+QkJpbmRlcigpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBCQmluZGVyKGNvbnN0IEJCaW5kZXImIG8pOwotICAgICAgICAgICAgQkJpbmRlciYgICAgb3BlcmF0b3I9KGNvbnN0IEJCaW5kZXImIG8pOwotCi0gICAgY2xhc3MgRXh0cmFzOwotCi0gICAgICAgICAgICBFeHRyYXMqICAgICBtRXh0cmFzOwotICAgICAgICAgICAgdm9pZCogICAgICAgbVJlc2VydmVkMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCcFJlZkJhc2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnBSZWZCYXNlKGNvbnN0IHNwPElCaW5kZXI+JiBvKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+QnBSZWZCYXNlKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25GaXJzdFJlZigpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uTGFzdFN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCk7Ci0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgb25JbmNTdHJvbmdBdHRlbXB0ZWQodWludDMyX3QgZmxhZ3MsIGNvbnN0IHZvaWQqIGlkKTsKLQotICAgIGlubGluZSAgSUJpbmRlciogICAgICAgIHJlbW90ZSgpICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1SZW1vdGU7IH0KLSAgICBpbmxpbmUgIElCaW5kZXIqICAgICAgICByZW1vdGUoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtUmVtb3RlOyB9Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnBSZWZCYXNlKGNvbnN0IEJwUmVmQmFzZSYgbyk7Ci0gICAgQnBSZWZCYXNlJiAgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IEJwUmVmQmFzZSYgbyk7Ci0KLSAgICBJQmluZGVyKiBjb25zdCAgICAgICAgICBtUmVtb3RlOwotICAgIFJlZkJhc2U6OndlYWtyZWZfdHlwZSogIG1SZWZzOwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgICAgIG1TdGF0ZTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9CSU5ERVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvQmluZGVyU2VydmljZS5oIGIvaW5jbHVkZS9iaW5kZXIvQmluZGVyU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTU5NGQzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL0JpbmRlclNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQklOREVSX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX0JJTkRFUl9TRVJWSUNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgU0VSVklDRT4KLWNsYXNzIEJpbmRlclNlcnZpY2UKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgcHVibGlzaChib29sIGFsbG93SXNvbGF0ZWQgPSBmYWxzZSkgewotICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKLSAgICAgICAgcmV0dXJuIHNtLT5hZGRTZXJ2aWNlKFN0cmluZzE2KFNFUlZJQ0U6OmdldFNlcnZpY2VOYW1lKCkpLCBuZXcgU0VSVklDRSgpLCBhbGxvd0lzb2xhdGVkKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBwdWJsaXNoQW5kSm9pblRocmVhZFBvb2woYm9vbCBhbGxvd0lzb2xhdGVkID0gZmFsc2UpIHsKLSAgICAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKLSAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbShkZWZhdWx0U2VydmljZU1hbmFnZXIoKSk7Ci0gICAgICAgIHNtLT5hZGRTZXJ2aWNlKFN0cmluZzE2KFNFUlZJQ0U6OmdldFNlcnZpY2VOYW1lKCkpLCBuZXcgU0VSVklDRSgpLCBhbGxvd0lzb2xhdGVkKTsKLSAgICAgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOwotICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGluc3RhbnRpYXRlKCkgeyBwdWJsaXNoKCk7IH0KLQotICAgIHN0YXRpYyBzdGF0dXNfdCBzaHV0ZG93bigpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLX07Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2VuZGlmIC8vIEFORFJPSURfQklOREVSX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvQnBCaW5kZXIuaCBiL2luY2x1ZGUvYmluZGVyL0JwQmluZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjkzYWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvQnBCaW5kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JQQklOREVSX0gKLSNkZWZpbmUgQU5EUk9JRF9CUEJJTkRFUl9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQnBCaW5kZXIgOiBwdWJsaWMgSUJpbmRlcgotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgQnBCaW5kZXIoaW50MzJfdCBoYW5kbGUpOwotCi0gICAgaW5saW5lICBpbnQzMl90ICAgICBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzE2JiAgICBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sICAgICAgICBpc0JpbmRlckFsaXZlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBwaW5nQmluZGVyKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHRyYW5zYWN0KCAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgbGlua1RvRGVhdGgoY29uc3Qgc3A8RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHVubGlua1RvRGVhdGgoICBjb25zdCB3cDxEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCA9IE5VTEwpOwotCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBhdHRhY2hPYmplY3QoICAgY29uc3Qgdm9pZCogb2JqZWN0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNsZWFudXBDb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2NsZWFudXBfZnVuYyBmdW5jKTsKLSAgICB2aXJ0dWFsIHZvaWQqICAgICAgIGZpbmRPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZGV0YWNoT2JqZWN0KGNvbnN0IHZvaWQqIG9iamVjdElEKTsKLQotICAgIHZpcnR1YWwgQnBCaW5kZXIqICAgcmVtb3RlQmluZGVyKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgIHNldENvbnN0YW50RGF0YShjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZW5kT2JpdHVhcnkoKTsKLQotICAgIGNsYXNzIE9iamVjdE1hbmFnZXIKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICBPYmplY3RNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH5PYmplY3RNYW5hZ2VyKCk7Ci0KLSAgICAgICAgdm9pZCAgICAgICAgYXR0YWNoKCBjb25zdCB2b2lkKiBvYmplY3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2xlYW51cENvb2tpZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmluZGVyOjpvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmMpOwotICAgICAgICB2b2lkKiAgICAgICBmaW5kKGNvbnN0IHZvaWQqIG9iamVjdElEKSBjb25zdDsKLSAgICAgICAgdm9pZCAgICAgICAgZGV0YWNoKGNvbnN0IHZvaWQqIG9iamVjdElEKTsKLQotICAgICAgICB2b2lkICAgICAgICBraWxsKCk7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAgICAgICAgICAgICBPYmplY3RNYW5hZ2VyKGNvbnN0IE9iamVjdE1hbmFnZXImKTsKLSAgICAgICAgT2JqZWN0TWFuYWdlciYgb3BlcmF0b3I9KGNvbnN0IE9iamVjdE1hbmFnZXImKTsKLQotICAgICAgICBzdHJ1Y3QgZW50cnlfdAotICAgICAgICB7Ci0gICAgICAgICAgICB2b2lkKiBvYmplY3Q7Ci0gICAgICAgICAgICB2b2lkKiBjbGVhbnVwQ29va2llOwotICAgICAgICAgICAgSUJpbmRlcjo6b2JqZWN0X2NsZWFudXBfZnVuYyBmdW5jOwotICAgICAgICB9OwotCi0gICAgICAgIEtleWVkVmVjdG9yPGNvbnN0IHZvaWQqLCBlbnRyeV90PiBtT2JqZWN0czsKLSAgICB9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+QnBCaW5kZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uTGFzdFN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCk7Ci0gICAgdmlydHVhbCBib29sICAgICAgICBvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogaWQpOwotCi1wcml2YXRlOgotICAgIGNvbnN0ICAgaW50MzJfdCAgICAgICAgICAgICBtSGFuZGxlOwotCi0gICAgc3RydWN0IE9iaXR1YXJ5IHsKLSAgICAgICAgd3A8RGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudDsKLSAgICAgICAgdm9pZCogY29va2llOwotICAgICAgICB1aW50MzJfdCBmbGFnczsKLSAgICB9OwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlcG9ydE9uZURlYXRoKGNvbnN0IE9iaXR1YXJ5JiBvYml0KTsKLSAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgaXNEZXNjcmlwdG9yQ2FjaGVkKCkgY29uc3Q7Ci0KLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7Ci0gICAgICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1BbGl2ZTsKLSAgICAgICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgbU9iaXRzU2VudDsKLSAgICAgICAgICAgIFZlY3RvcjxPYml0dWFyeT4qICAgbU9iaXR1YXJpZXM7Ci0gICAgICAgICAgICBPYmplY3RNYW5hZ2VyICAgICAgIG1PYmplY3RzOwotICAgICAgICAgICAgUGFyY2VsKiAgICAgICAgICAgICBtQ29uc3RhbnREYXRhOwotICAgIG11dGFibGUgU3RyaW5nMTYgICAgICAgICAgICBtRGVzY3JpcHRvckNhY2hlOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0JQQklOREVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL0lCaW5kZXIuaCBiL2luY2x1ZGUvYmluZGVyL0lCaW5kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiNTZjMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9JQmluZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQklOREVSX0gKLSNkZWZpbmUgQU5EUk9JRF9JQklOREVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi0KLSNkZWZpbmUgQl9QQUNLX0NIQVJTKGMxLCBjMiwgYzMsIGM0KSBcCi0gICAgKCgoKGMxKTw8MjQpKSB8ICgoKGMyKTw8MTYpKSB8ICgoKGMzKTw8OCkpIHwgKGM0KSkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEJCaW5kZXI7Ci1jbGFzcyBCcEJpbmRlcjsKLWNsYXNzIElJbnRlcmZhY2U7Ci1jbGFzcyBQYXJjZWw7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBhbmQgbG93LWxldmVsIHByb3RvY29sIGZvciBhIHJlbW90YWJsZSBvYmplY3QuCi0gKiBZb3UgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3MgdG8gY3JlYXRlIGFuIG9iamVjdCBmb3Igd2hpY2ggb3RoZXIKLSAqIHByb2Nlc3NlcyBjYW4gaG9sZCByZWZlcmVuY2VzIHRvIGl0LiAgQ29tbXVuaWNhdGlvbiBiZXR3ZWVuIHByb2Nlc3NlcwotICogKG1ldGhvZCBjYWxscywgcHJvcGVydHkgZ2V0IGFuZCBzZXQpIGlzIGRvd24gdGhyb3VnaCBhIGxvdy1sZXZlbAotICogcHJvdG9jb2wgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHRoZSB0cmFuc2FjdCgpIEFQSS4KLSAqLwotY2xhc3MgSUJpbmRlciA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgRklSU1RfQ0FMTF9UUkFOU0FDVElPTiAgPSAweDAwMDAwMDAxLAotICAgICAgICBMQVNUX0NBTExfVFJBTlNBQ1RJT04gICA9IDB4MDBmZmZmZmYsCi0KLSAgICAgICAgUElOR19UUkFOU0FDVElPTiAgICAgICAgPSBCX1BBQ0tfQ0hBUlMoJ18nLCdQJywnTicsJ0cnKSwKLSAgICAgICAgRFVNUF9UUkFOU0FDVElPTiAgICAgICAgPSBCX1BBQ0tfQ0hBUlMoJ18nLCdEJywnTScsJ1AnKSwKLSAgICAgICAgSU5URVJGQUNFX1RSQU5TQUNUSU9OICAgPSBCX1BBQ0tfQ0hBUlMoJ18nLCAnTicsICdUJywgJ0YnKSwKLQotICAgICAgICAvLyBDb3JyZXNwb25kcyB0byBURl9PTkVfV0FZIC0tIGFuIGFzeW5jaHJvbm91cyBjYWxsLgotICAgICAgICBGTEFHX09ORVdBWSAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKLSAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElCaW5kZXIoKTsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoaXMgSUJpbmRlciBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgbmFtZWQgYnkKLSAgICAgKiBAYSBkZXNjcmlwdG9yLiAgSWYgaXQgZG9lcywgdGhlIGJhc2UgcG9pbnRlciB0byBpdCBpcyByZXR1cm5lZCwKLSAgICAgKiB3aGljaCB5b3UgY2FuIHNhZmVseSBzdGF0aWNfY2FzdDw+IHRvIHRoZSBjb25jcmV0ZSBDKysgaW50ZXJmYWNlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3A8SUludGVyZmFjZT4gIHF1ZXJ5TG9jYWxJbnRlcmZhY2UoY29uc3QgU3RyaW5nMTYmIGRlc2NyaXB0b3IpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoaXMgSUJpbmRlcgotICAgICAqIG9iamVjdC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzE2JiBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgaXNCaW5kZXJBbGl2ZSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBwaW5nQmluZGVyKCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICB0cmFuc2FjdCggICB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHlvdSB0byBhZGQgZGF0YSB0aGF0IGlzIHRyYW5zcG9ydGVkIHRocm91Z2gKLSAgICAgKiBJUEMgYWxvbmcgd2l0aCB5b3VyIElCaW5kZXIgcG9pbnRlci4gIFdoZW4gaW1wbGVtZW50aW5nIGEgQmluZGVyCi0gICAgICogb2JqZWN0LCBvdmVycmlkZSBpdCB0byB3cml0ZSB5b3VyIGRlc2lyZWQgZGF0YSBpbiB0byBAYSBvdXREYXRhLgotICAgICAqIFlvdSBjYW4gdGhlbiBjYWxsIGdldENvbnN0YW50RGF0YSgpIG9uIHlvdXIgSUJpbmRlciB0byByZXRyaWV2ZQotICAgICAqIHRoYXQgZGF0YSwgZnJvbSBhbnkgcHJvY2Vzcy4gIFlvdSBNVVNUIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgICogd3JpdHRlbiBpbiB0byB0aGUgcGFyY2VsIChpbmNsdWRpbmcgcGFkZGluZykuCi0gICAgICovCi0gICAgY2xhc3MgRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi0gICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgPSAwOwotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlciB0aGUgQGEgcmVjaXBpZW50IGZvciBhIG5vdGlmaWNhdGlvbiBpZiB0aGlzIGJpbmRlcgotICAgICAqIGdvZXMgYXdheS4gIElmIHRoaXMgYmluZGVyIG9iamVjdCB1bmV4cGVjdGVkbHkgZ29lcyBhd2F5Ci0gICAgICogKHR5cGljYWxseSBiZWNhdXNlIGl0cyBob3N0aW5nIHByb2Nlc3MgaGFzIGJlZW4ga2lsbGVkKSwKLSAgICAgKiB0aGVuIERlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKCkgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHJlZmVyZW5jZQotICAgICAqIHRvIHRoaXMuCi0gICAgICoKLSAgICAgKiBUaGUgQGEgY29va2llIGlzIG9wdGlvbmFsIC0tIGlmIG5vbi1OVUxMLCBpdCBzaG91bGQgYmUgYQotICAgICAqIG1lbW9yeSBhZGRyZXNzIHRoYXQgeW91IG93biAodGhhdCBpcywgeW91IGtub3cgaXQgaXMgdW5pcXVlKS4KLSAgICAgKgotICAgICAqIEBub3RlIFlvdSB3aWxsIG9ubHkgcmVjZWl2ZSBkZWF0aCBub3RpZmljYXRpb25zIGZvciByZW1vdGUgYmluZGVycywKLSAgICAgKiBhcyBsb2NhbCBiaW5kZXJzIGJ5IGRlZmluaXRpb24gY2FuJ3QgZGllIHdpdGhvdXQgeW91IGR5aW5nIGFzIHdlbGwuCi0gICAgICogVHJ5aW5nIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIG9uIGEgbG9jYWwgYmluZGVyIHdpbGwgcmVzdWx0IGluIGFuCi0gICAgICogSU5WQUxJRF9PUEVSQVRJT04gY29kZSBiZWluZyByZXR1cm5lZCBhbmQgbm90aGluZyBoYXBwZW5pbmcuCi0gICAgICoKLSAgICAgKiBAbm90ZSBUaGlzIGxpbmsgYWx3YXlzIGhvbGRzIGEgd2VhayByZWZlcmVuY2UgdG8gaXRzIHJlY2lwaWVudC4KLSAgICAgKgotICAgICAqIEBub3RlIFlvdSB3aWxsIG9ubHkgcmVjZWl2ZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBkZWFkCi0gICAgICogYmluZGVyLiAgWW91IHNob3VsZCBub3QgdHJ5IHRvIHByb21vdGUgdGhpcyB0byBhIHN0cm9uZyByZWZlcmVuY2UuCi0gICAgICogKE5vciBzaG91bGQgeW91IG5lZWQgdG8sIGFzIHRoZXJlIGlzIG5vdGhpbmcgdXNlZnVsIHlvdSBjYW4KLSAgICAgKiBkaXJlY3RseSBkbyB3aXRoIGl0IG5vdyB0aGF0IGl0IGhhcyBwYXNzZWQgb24uKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGxpbmtUb0RlYXRoKGNvbnN0IHNwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgZGVhdGggbm90aWZpY2F0aW9uLgotICAgICAqIFRoZSBAYSByZWNpcGllbnQgd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkIGlmIHRoaXMgb2JqZWN0Ci0gICAgICogZGllcy4gIFRoZSBAYSBjb29raWUgaXMgb3B0aW9uYWwuICBJZiBub24tTlVMTCwgeW91IGNhbgotICAgICAqIHN1cHBseSBhIE5VTEwgQGEgcmVjaXBpZW50LCBhbmQgdGhlIHJlY2lwaWVudCBwcmV2aW91c2x5Ci0gICAgICogYWRkZWQgd2l0aCB0aGF0IGNvb2tpZSB3aWxsIGJlIHVubGlua2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHVubGlua1RvRGVhdGgoICBjb25zdCB3cDxEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cDxEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCA9IE5VTEwpID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgICAgIGNoZWNrU3ViY2xhc3MoY29uc3Qgdm9pZCogc3ViY2xhc3NJRCkgY29uc3Q7Ci0KLSAgICB0eXBlZGVmIHZvaWQgKCpvYmplY3RfY2xlYW51cF9mdW5jKShjb25zdCB2b2lkKiBpZCwgdm9pZCogb2JqLCB2b2lkKiBjbGVhbnVwQ29va2llKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGF0dGFjaE9iamVjdCggICBjb25zdCB2b2lkKiBvYmplY3RJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjbGVhbnVwQ29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmMpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqICAgICAgICAgICBmaW5kT2JqZWN0KGNvbnN0IHZvaWQqIG9iamVjdElEKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZGV0YWNoT2JqZWN0KGNvbnN0IHZvaWQqIG9iamVjdElEKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIEJCaW5kZXIqICAgICAgICBsb2NhbEJpbmRlcigpOwotICAgIHZpcnR1YWwgQnBCaW5kZXIqICAgICAgIHJlbW90ZUJpbmRlcigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCAgICAgICAgICB+SUJpbmRlcigpOwotCi1wcml2YXRlOgotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lCSU5ERVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvSUludGVyZmFjZS5oIGIvaW5jbHVkZS9iaW5kZXIvSUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjlmNjljLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL0lJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLSNpZm5kZWYgQU5EUk9JRF9JSU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9JSU5URVJGQUNFX0gKLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIElJbnRlcmZhY2UgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICBJSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgIGFzQmluZGVyKCk7Ci0gICAgICAgICAgICBzcDxjb25zdCBJQmluZGVyPiAgIGFzQmluZGVyKCkgY29uc3Q7Ci0gICAgICAgICAgICAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICAgICAgfklJbnRlcmZhY2UoKTsKLSAgICB2aXJ0dWFsIElCaW5kZXIqICAgICAgICAgICAgb25Bc0JpbmRlcigpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJGQUNFPgotaW5saW5lIHNwPElOVEVSRkFDRT4gaW50ZXJmYWNlX2Nhc3QoY29uc3Qgc3A8SUJpbmRlcj4mIG9iaikKLXsKLSAgICByZXR1cm4gSU5URVJGQUNFOjphc0ludGVyZmFjZShvYmopOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIElOVEVSRkFDRT4KLWNsYXNzIEJuSW50ZXJmYWNlIDogcHVibGljIElOVEVSRkFDRSwgcHVibGljIEJCaW5kZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHNwPElJbnRlcmZhY2U+ICAgICAgcXVlcnlMb2NhbEludGVyZmFjZShjb25zdCBTdHJpbmcxNiYgX2Rlc2NyaXB0b3IpOwotICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nMTYmICAgICBnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIElCaW5kZXIqICAgICAgICAgICAgb25Bc0JpbmRlcigpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUkZBQ0U+Ci1jbGFzcyBCcEludGVyZmFjZSA6IHB1YmxpYyBJTlRFUkZBQ0UsIHB1YmxpYyBCcFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnBJbnRlcmZhY2UoY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIElCaW5kZXIqICAgICAgICAgICAgb25Bc0JpbmRlcigpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoSU5URVJGQUNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RhdGljIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2IGRlc2NyaXB0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc3RhdGljIGFuZHJvaWQ6OnNwPEkjI0lOVEVSRkFDRT4gYXNJbnRlcmZhY2UoICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpJQmluZGVyPiYgb2JqKTsgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCBjb25zdCBhbmRyb2lkOjpTdHJpbmcxNiYgZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpIGNvbnN0OyAgICBcCi0gICAgSSMjSU5URVJGQUNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdmlydHVhbCB+SSMjSU5URVJGQUNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLQotI2RlZmluZSBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoSU5URVJGQUNFLCBOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2IEkjI0lOVEVSRkFDRTo6ZGVzY3JpcHRvcihOQU1FKTsgICAgICAgICAgICAgXAotICAgIGNvbnN0IGFuZHJvaWQ6OlN0cmluZzE2JiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgSSMjSU5URVJGQUNFOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3QgeyAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gSSMjSU5URVJGQUNFOjpkZXNjcmlwdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFuZHJvaWQ6OnNwPEkjI0lOVEVSRkFDRT4gSSMjSU5URVJGQUNFOjphc0ludGVyZmFjZSggICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6SUJpbmRlcj4mIG9iaikgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhbmRyb2lkOjpzcDxJIyNJTlRFUkZBQ0U+IGludHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaW50ciA9IHN0YXRpY19jYXN0PEkjI0lOVEVSRkFDRSo+KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIG9iai0+cXVlcnlMb2NhbEludGVyZmFjZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgSSMjSU5URVJGQUNFOjpkZXNjcmlwdG9yKS5nZXQoKSk7ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKGludHIgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGludHIgPSBuZXcgQnAjI0lOVEVSRkFDRShvYmopOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gaW50cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEkjI0lOVEVSRkFDRTo6SSMjSU5URVJGQUNFKCkgeyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEkjI0lOVEVSRkFDRTo6fkkjI0lOVEVSRkFDRSgpIHsgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0KLSNkZWZpbmUgQ0hFQ0tfSU5URVJGQUNFKGludGVyZmFjZSwgZGF0YSwgcmVwbHkpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWRhdGEuY2hlY2tJbnRlcmZhY2UodGhpcykpIHsgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOyB9ICAgICAgIFwKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBObyB1c2VyLXNlcnZpY2VhYmxlIHBhcnRzIGFmdGVyIHRoaXMuLi4KLQotdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJGQUNFPgotaW5saW5lIHNwPElJbnRlcmZhY2U+IEJuSW50ZXJmYWNlPElOVEVSRkFDRT46OnF1ZXJ5TG9jYWxJbnRlcmZhY2UoCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBfZGVzY3JpcHRvcikKLXsKLSAgICBpZiAoX2Rlc2NyaXB0b3IgPT0gSU5URVJGQUNFOjpkZXNjcmlwdG9yKSByZXR1cm4gdGhpczsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJGQUNFPgotaW5saW5lIGNvbnN0IFN0cmluZzE2JiBCbkludGVyZmFjZTxJTlRFUkZBQ0U+OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gSU5URVJGQUNFOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIElOVEVSRkFDRT4KLUlCaW5kZXIqIEJuSW50ZXJmYWNlPElOVEVSRkFDRT46Om9uQXNCaW5kZXIoKQotewotICAgIHJldHVybiB0aGlzOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUkZBQ0U+Ci1pbmxpbmUgQnBJbnRlcmZhY2U8SU5URVJGQUNFPjo6QnBJbnRlcmZhY2UoY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZSkKLSAgICA6IEJwUmVmQmFzZShyZW1vdGUpCi17Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIElOVEVSRkFDRT4KLWlubGluZSBJQmluZGVyKiBCcEludGVyZmFjZTxJTlRFUkZBQ0U+OjpvbkFzQmluZGVyKCkKLXsKLSAgICByZXR1cm4gcmVtb3RlKCk7Ci19Ci0gICAgCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lJTlRFUkZBQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvSU1lbW9yeS5oIGIvaW5jbHVkZS9iaW5kZXIvSU1lbW9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDBkYjAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL0lNZW1vcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lNRU1PUllfSAotI2RlZmluZSBBTkRST0lEX0lNRU1PUllfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSU1lbW9yeUhlYXAgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoTWVtb3J5SGVhcCk7Ci0KLSAgICAvLyBmbGFncyByZXR1cm5lZCBieSBnZXRGbGFncygpCi0gICAgZW51bSB7Ci0gICAgICAgIFJFQURfT05MWSAgID0gMHgwMDAwMDAwMQotICAgIH07Ci0KLSAgICB2aXJ0dWFsIGludCAgICAgICAgIGdldEhlYXBJRCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQqICAgICAgIGdldEJhc2UoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3QgICAgICBnZXRTaXplKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0RmxhZ3MoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB1aW50MzJfdCAgICBnZXRPZmZzZXQoKSBjb25zdCA9IDA7Ci0KLSAgICAvLyB0aGVzZSBhcmUgdGhlcmUganVzdCBmb3IgYmFja3dhcmQgc291cmNlIGNvbXBhdGliaWxpdHkKLSAgICBpbnQzMl90IGhlYXBJRCgpIGNvbnN0IHsgcmV0dXJuIGdldEhlYXBJRCgpOyB9Ci0gICAgdm9pZCogICBiYXNlKCkgY29uc3QgIHsgcmV0dXJuIGdldEJhc2UoKTsgfQotICAgIHNpemVfdCAgdmlydHVhbFNpemUoKSBjb25zdCB7IHJldHVybiBnZXRTaXplKCk7IH0KLX07Ci0KLWNsYXNzIEJuTWVtb3J5SGVhcCA6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVtb3J5SGVhcD4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoIAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotICAgIAotICAgIEJuTWVtb3J5SGVhcCgpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkJuTWVtb3J5SGVhcCgpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJTWVtb3J5IDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE1lbW9yeSk7Ci0KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRNZW1vcnkoc3NpemVfdCogb2Zmc2V0PTAsIHNpemVfdCogc2l6ZT0wKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBoZWxwZXJzCi0gICAgdm9pZCogZmFzdFBvaW50ZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGhlYXAsIHNzaXplX3Qgb2Zmc2V0KSBjb25zdDsKLSAgICB2b2lkKiBwb2ludGVyKCkgY29uc3Q7Ci0gICAgc2l6ZV90IHNpemUoKSBjb25zdDsKLSAgICBzc2l6ZV90IG9mZnNldCgpIGNvbnN0OwotfTsKLQotY2xhc3MgQm5NZW1vcnkgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lbW9yeT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0KLSAgICBCbk1lbW9yeSgpOwotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkJuTWVtb3J5KCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lNRU1PUllfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvSVBDVGhyZWFkU3RhdGUuaCBiL2luY2x1ZGUvYmluZGVyL0lQQ1RocmVhZFN0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWJhMmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvSVBDVGhyZWFkU3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0lQQ19USFJFQURfU1RBVEVfSAotI2RlZmluZSBBTkRST0lEX0lQQ19USFJFQURfU1RBVEVfSAotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotI2lmZGVmIEhBVkVfV0lOMzJfUFJPQwotdHlwZWRlZiAgaW50ICB1aWRfdDsKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVBDVGhyZWFkU3RhdGUKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgIElQQ1RocmVhZFN0YXRlKiAgICAgc2VsZigpOwotICAgIHN0YXRpYyAgSVBDVGhyZWFkU3RhdGUqICAgICBzZWxmT3JOdWxsKCk7ICAvLyBzZWxmKCksIGJ1dCB3b24ndCBpbnN0YW50aWF0ZQotICAgIAotICAgICAgICAgICAgc3A8UHJvY2Vzc1N0YXRlPiAgICBwcm9jZXNzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgY2xlYXJMYXN0RXJyb3IoKTsKLQotICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCk7Ci0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgZ2V0T3JpZ0NhbGxpbmdVaWQoKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRTdHJpY3RNb2RlUG9saWN5KGludDMyX3QgcG9saWN5KTsKLSAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgZ2V0U3RyaWN0TW9kZVBvbGljeSgpIGNvbnN0OwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldExhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzKGludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRMYXN0VHJhbnNhY3Rpb25CaW5kZXJGbGFncygpIGNvbnN0OwotCi0gICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgIGNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgZmx1c2hDb21tYW5kcygpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGpvaW5UaHJlYWRQb29sKGJvb2wgaXNNYWluID0gdHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFN0b3AgdGhlIGxvY2FsIHByb2Nlc3MuCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHN0b3BQcm9jZXNzKGJvb2wgaW1tZWRpYXRlID0gdHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgdHJhbnNhY3QoaW50MzJfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGluY1N0cm9uZ0hhbmRsZShpbnQzMl90IGhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGRlY1N0cm9uZ0hhbmRsZShpbnQzMl90IGhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIGluY1dlYWtIYW5kbGUoaW50MzJfdCBoYW5kbGUpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBkZWNXZWFrSGFuZGxlKGludDMyX3QgaGFuZGxlKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgYXR0ZW1wdEluY1N0cm9uZ0hhbmRsZShpbnQzMl90IGhhbmRsZSk7Ci0gICAgc3RhdGljICB2b2lkICAgICAgICAgICAgICAgIGV4cHVuZ2VIYW5kbGUoaW50MzJfdCBoYW5kbGUsIElCaW5kZXIqIGJpbmRlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlcXVlc3REZWF0aE5vdGlmaWNhdGlvbiggICBpbnQzMl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJwQmluZGVyKiBwcm94eSk7IAotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBjbGVhckRlYXRoTm90aWZpY2F0aW9uKCBpbnQzMl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnBCaW5kZXIqIHByb3h5KTsgCi0KLSAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgc2h1dGRvd24oKTsKLSAgICAKLSAgICAvLyBDYWxsIHRoaXMgdG8gZGlzYWJsZSBzd2l0Y2hpbmcgdGhyZWFkcyB0byBiYWNrZ3JvdW5kIHNjaGVkdWxpbmcgd2hlbgotICAgIC8vIHJlY2VpdmluZyBpbmNvbWluZyBJUEMgY2FsbHMuICBUaGlzIGlzIHNwZWNpZmljYWxseSBoZXJlIGZvciB0aGUKLSAgICAvLyBBbmRyb2lkIHN5c3RlbSBwcm9jZXNzLCBzaW5jZSBpdCBleHBlY3RzIHRvIGhhdmUgYmFja2dyb3VuZCBhcHBzIGNhbGxpbmcKLSAgICAvLyBpbiB0byBpdCBidXQgZG9lc24ndCB3YW50IHRvIGFjcXVpcmUgbG9ja3MgaW4gaXRzIHNlcnZpY2VzIHdoaWxlIGluCi0gICAgLy8gdGhlIGJhY2tncm91bmQuCi0gICAgc3RhdGljICB2b2lkICAgICAgICAgICAgICAgIGRpc2FibGVCYWNrZ3JvdW5kU2NoZWR1bGluZyhib29sIGRpc2FibGUpOwotICAgIAotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfklQQ1RocmVhZFN0YXRlKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2VuZFJlcGx5KGNvbnN0IFBhcmNlbCYgcmVwbHksIHVpbnQzMl90IGZsYWdzKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgd2FpdEZvclJlc3BvbnNlKFBhcmNlbCAqcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqYWNxdWlyZVJlc3VsdD1OVUxMKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgdGFsa1dpdGhEcml2ZXIoYm9vbCBkb1JlY2VpdmU9dHJ1ZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlVHJhbnNhY3Rpb25EYXRhKGludDMyX3QgY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiaW5kZXJGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QqIHN0YXR1c0J1ZmZlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIGV4ZWN1dGVDb21tYW5kKGludDMyX3QgY29tbWFuZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXJDYWxsZXIoKTsKLSAgICAgICAgICAgIAotICAgIHN0YXRpYyAgdm9pZCAgICAgICAgICAgICAgICB0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KTsKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgZnJlZUJ1ZmZlcihQYXJjZWwqIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90KiBvYmplY3RzLCBzaXplX3Qgb2JqZWN0c1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llKTsKLSAgICAKLSAgICBjb25zdCAgIHNwPFByb2Nlc3NTdGF0ZT4gICAgbVByb2Nlc3M7Ci0gICAgY29uc3QgICBwaWRfdCAgICAgICAgICAgICAgIG1NeVRocmVhZElkOwotICAgICAgICAgICAgVmVjdG9yPEJCaW5kZXIqPiAgICBtUGVuZGluZ1N0cm9uZ0RlcmVmczsKLSAgICAgICAgICAgIFZlY3RvcjxSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqPiBtUGVuZGluZ1dlYWtEZXJlZnM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBhcmNlbCAgICAgICAgICAgICAgbUluOwotICAgICAgICAgICAgUGFyY2VsICAgICAgICAgICAgICBtT3V0OwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBtTGFzdEVycm9yOwotICAgICAgICAgICAgcGlkX3QgICAgICAgICAgICAgICBtQ2FsbGluZ1BpZDsKLSAgICAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgbUNhbGxpbmdVaWQ7Ci0gICAgICAgICAgICB1aWRfdCAgICAgICAgICAgICAgIG1PcmlnQ2FsbGluZ1VpZDsKLSAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgbVN0cmljdE1vZGVQb2xpY3k7Ci0gICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIG1MYXN0VHJhbnNhY3Rpb25CaW5kZXJGbGFnczsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9JUENfVEhSRUFEX1NUQVRFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5oIGIvaW5jbHVkZS9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZDM3MWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLSNpZm5kZWYgQU5EUk9JRF9JUEVSTUlTU0lPTl9DT05UUk9MTEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9JUEVSTUlTU0lPTl9DT05UUk9MTEVSX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJUGVybWlzc2lvbkNvbnRyb2xsZXIgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUGVybWlzc2lvbkNvbnRyb2xsZXIpOwotCi0gICAgdmlydHVhbCBib29sICAgICAgICAgICAgICAgIGNoZWNrUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGlkLCBpbnQzMl90IHVpZCkgPSAwOwotICAgIAotICAgIGVudW0gewotICAgICAgICBDSEVDS19QRVJNSVNTSU9OX1RSQU5TQUNUSU9OID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTgotICAgIH07Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuUGVybWlzc2lvbkNvbnRyb2xsZXIgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVBlcm1pc3Npb25Db250cm9sbGVyPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9JUEVSTUlTU0lPTl9DT05UUk9MTEVSX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmggYi9pbmNsdWRlL2JpbmRlci9JU2VydmljZU1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyOTdkNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9JU2VydmljZU1hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLSNpZm5kZWYgQU5EUk9JRF9JU0VSVklDRV9NQU5BR0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9JU0VSVklDRV9NQU5BR0VSX0gKLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJU2VydmljZU1hbmFnZXIgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU2VydmljZU1hbmFnZXIpOwotCi0gICAgLyoqCi0gICAgICogUmV0cmlldmUgYW4gZXhpc3Rpbmcgc2VydmljZSwgYmxvY2tpbmcgZm9yIGEgZmV3IHNlY29uZHMKLSAgICAgKiBpZiBpdCBkb2Vzbid0IHlldCBleGlzdC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElCaW5kZXI+ICAgICAgICAgZ2V0U2VydmljZSggY29uc3QgU3RyaW5nMTYmIG5hbWUpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFJldHJpZXZlIGFuIGV4aXN0aW5nIHNlcnZpY2UsIG5vbi1ibG9ja2luZy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElCaW5kZXI+ICAgICAgICAgY2hlY2tTZXJ2aWNlKCBjb25zdCBTdHJpbmcxNiYgbmFtZSkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlLgotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgICAgICBhZGRTZXJ2aWNlKCBjb25zdCBTdHJpbmcxNiYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dJc29sYXRlZCA9IGZhbHNlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gbGlzdCBvZiBhbGwgZXhpc3Rpbmcgc2VydmljZXMuCi0gICAgICovCi0gICAgdmlydHVhbCBWZWN0b3I8U3RyaW5nMTY+ICAgIGxpc3RTZXJ2aWNlcygpID0gMDsKLQotICAgIGVudW0gewotICAgICAgICBHRVRfU0VSVklDRV9UUkFOU0FDVElPTiA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgICAgIENIRUNLX1NFUlZJQ0VfVFJBTlNBQ1RJT04sCi0gICAgICAgIEFERF9TRVJWSUNFX1RSQU5TQUNUSU9OLAotICAgICAgICBMSVNUX1NFUlZJQ0VTX1RSQU5TQUNUSU9OLAotICAgIH07Ci19OwotCi1zcDxJU2VydmljZU1hbmFnZXI+IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJTlRFUkZBQ0U+Ci1zdGF0dXNfdCBnZXRTZXJ2aWNlKGNvbnN0IFN0cmluZzE2JiBuYW1lLCBzcDxJTlRFUkZBQ0U+KiBvdXRTZXJ2aWNlKQotewotICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKLSAgICBpZiAoc20gIT0gTlVMTCkgewotICAgICAgICAqb3V0U2VydmljZSA9IGludGVyZmFjZV9jYXN0PElOVEVSRkFDRT4oc20tPmdldFNlcnZpY2UobmFtZSkpOwotICAgICAgICBpZiAoKCpvdXRTZXJ2aWNlKSAhPSBOVUxMKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLX0KLQotYm9vbCBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uKTsKLWJvb2wgY2hlY2tDYWxsaW5nUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBvdXRQaWQsIGludDMyX3QqIG91dFVpZCk7Ci1ib29sIGNoZWNrUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5TZXJ2aWNlTWFuYWdlciA6IHB1YmxpYyBCbkludGVyZmFjZTxJU2VydmljZU1hbmFnZXI+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0lTRVJWSUNFX01BTkFHRVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9NZW1vcnlCYXNlLmggYi9pbmNsdWRlL2JpbmRlci9NZW1vcnlCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2M2UyNmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvTWVtb3J5QmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRU1PUllfQkFTRV9ICi0jZGVmaW5lIEFORFJPSURfTUVNT1JZX0JBU0VfSAotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIE1lbW9yeUJhc2UgOiBwdWJsaWMgQm5NZW1vcnkgCi17Ci1wdWJsaWM6Ci0gICAgTWVtb3J5QmFzZShjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsIHNzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB+TWVtb3J5QmFzZSgpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldE1lbW9yeShzc2l6ZV90KiBvZmZzZXQsIHNpemVfdCogc2l6ZSkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9Ci0gICAgc3NpemVfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0OyB9Ci0gICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBnZXRIZWFwKCkgY29uc3QgeyByZXR1cm4gbUhlYXA7IH0KLQotcHJpdmF0ZToKLSAgICBzaXplX3QgICAgICAgICAgbVNpemU7Ci0gICAgc3NpemVfdCAgICAgICAgIG1PZmZzZXQ7Ci0gICAgc3A8SU1lbW9yeUhlYXA+IG1IZWFwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9NRU1PUllfQkFTRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9NZW1vcnlEZWFsZXIuaCBiL2luY2x1ZGUvYmluZGVyL01lbW9yeURlYWxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzBmMjBkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL01lbW9yeURlYWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRU1PUllfREVBTEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9NRU1PUllfREVBTEVSX0gKLQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTWVtb3J5RGVhbGVyIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBNZW1vcnlEZWFsZXIoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIG5hbWUgPSAwKTsKLQotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gYWxsb2NhdGUoc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZGVhbGxvY2F0ZShzaXplX3Qgb2Zmc2V0KTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGR1bXAoY29uc3QgY2hhciogd2hhdCkgY29uc3Q7Ci0KLSAgICBzcDxJTWVtb3J5SGVhcD4gZ2V0TWVtb3J5SGVhcCgpIGNvbnN0IHsgcmV0dXJuIGhlYXAoKTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TWVtb3J5RGVhbGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiAgICAgIGhlYXAoKSBjb25zdDsKLSAgICBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yKiAgICAgYWxsb2NhdG9yKCkgY29uc3Q7Ci0KLSAgICBzcDxJTWVtb3J5SGVhcD4gICAgICAgICAgICAgbUhlYXA7Ci0gICAgU2ltcGxlQmVzdEZpdEFsbG9jYXRvciogICAgIG1BbGxvY2F0b3I7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01FTU9SWV9ERUFMRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvTWVtb3J5SGVhcEJhc2UuaCBiL2luY2x1ZGUvYmluZGVyL01lbW9yeUhlYXBCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmRhOWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvTWVtb3J5SGVhcEJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FTU9SWV9IRUFQX0JBU0VfSAotI2RlZmluZSBBTkRST0lEX01FTU9SWV9IRUFQX0JBU0VfSAotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIE1lbW9yeUhlYXBCYXNlIDogcHVibGljIHZpcnR1YWwgQm5NZW1vcnlIZWFwCi17Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFJFQURfT05MWSA9IElNZW1vcnlIZWFwOjpSRUFEX09OTFksCi0gICAgICAgIC8vIG1lbW9yeSB3b24ndCBiZSBtYXBwZWQgbG9jYWxseSwgYnV0IHdpbGwgYmUgbWFwcGVkIGluIHRoZSByZW1vdGUKLSAgICAgICAgLy8gcHJvY2Vzcy4KLSAgICAgICAgRE9OVF9NQVBfTE9DQUxMWSA9IDB4MDAwMDAxMDAsCi0gICAgICAgIE5PX0NBQ0hJTkcgPSAweDAwMDAwMjAwCi0gICAgfTsKLQotICAgIC8qCi0gICAgICogbWFwcyB0aGUgbWVtb3J5IHJlZmVyZW5jZWQgYnkgZmQuIGJ1dCBET0VTTidUIHRha2Ugb3duZXJzaGlwCi0gICAgICogb2YgdGhlIGZpbGVkZXNjcmlwdG9yIChpdCBtYWtlcyBhIGNvcHkgd2l0aCBkdXAoKQotICAgICAqLwotICAgIE1lbW9yeUhlYXBCYXNlKGludCBmZCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzID0gMCwgdWludDMyX3Qgb2Zmc2V0ID0gMCk7Ci0KLSAgICAvKgotICAgICAqIG1hcHMgbWVtb3J5IGZyb20gdGhlIGdpdmVuIGRldmljZQotICAgICAqLwotICAgIE1lbW9yeUhlYXBCYXNlKGNvbnN0IGNoYXIqIGRldmljZSwgc2l6ZV90IHNpemUgPSAwLCB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgLyoKLSAgICAgKiBtYXBzIG1lbW9yeSBmcm9tIGFzaG1lbSwgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBmb3IgZGVidWdnaW5nCi0gICAgICovCi0gICAgTWVtb3J5SGVhcEJhc2Uoc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzID0gMCwgY2hhciBjb25zdCogbmFtZSA9IE5VTEwpOwotCi0gICAgdmlydHVhbCB+TWVtb3J5SGVhcEJhc2UoKTsKLQotICAgIC8qIGltcGxlbWVudCBJTWVtb3J5SGVhcCBpbnRlcmZhY2UgKi8KLSAgICB2aXJ0dWFsIGludCAgICAgICAgIGdldEhlYXBJRCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCogICAgICAgZ2V0QmFzZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90ICAgICAgZ2V0U2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0RmxhZ3MoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90ICAgICAgZ2V0T2Zmc2V0KCkgY29uc3Q7Ci0KLSAgICBjb25zdCBjaGFyKiAgICAgICAgIGdldERldmljZSgpIGNvbnN0OwotCi0gICAgLyogdGhpcyBjbG9zZXMgdGhpcyBoZWFwIC0tIHVzZSBjYXJlZnVsbHkgKi8KLSAgICB2b2lkIGRpc3Bvc2UoKTsKLQotICAgIC8qIHRoaXMgaXMgb25seSBuZWVkZWQgYXMgYSB3b3JrYXJvdW5kLCB1c2Ugb25seSBpZiB5b3Uga25vdwotICAgICAqIHdoYXQgeW91IGFyZSBkb2luZyAqLwotICAgIHN0YXR1c190IHNldERldmljZShjb25zdCBjaGFyKiBkZXZpY2UpIHsKLSAgICAgICAgaWYgKG1EZXZpY2UgPT0gMCkKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlID8gTk9fRVJST1IgOiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAgICAgICAgIE1lbW9yeUhlYXBCYXNlKCk7Ci0gICAgLy8gaW5pdCgpIHRha2VzIG93bmVyc2hpcCBvZiBmZAotICAgIHN0YXR1c190IGluaXQoaW50IGZkLCB2b2lkICpiYXNlLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgIGludCBmbGFncyA9IDAsIGNvbnN0IGNoYXIqIGRldmljZSA9IE5VTEwpOwotCi1wcml2YXRlOgotICAgIHN0YXR1c190IG1hcGZkKGludCBmZCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IG9mZnNldCA9IDApOwotCi0gICAgaW50ICAgICAgICAgbUZEOwotICAgIHNpemVfdCAgICAgIG1TaXplOwotICAgIHZvaWQqICAgICAgIG1CYXNlOwotICAgIHVpbnQzMl90ICAgIG1GbGFnczsKLSAgICBjb25zdCBjaGFyKiBtRGV2aWNlOwotICAgIGJvb2wgICAgICAgIG1OZWVkVW5tYXA7Ci0gICAgdWludDMyX3QgICAgbU9mZnNldDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVNT1JZX0hFQVBfQkFTRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpbmRlci9QYXJjZWwuaCBiL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2IyZjAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUEFSQ0VMX0gKLSNkZWZpbmUgQU5EUk9JRF9QQVJDRUxfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEZsYXR0ZW5hYmxlOwotY2xhc3MgSUJpbmRlcjsKLWNsYXNzIElQQ1RocmVhZFN0YXRlOwotY2xhc3MgUHJvY2Vzc1N0YXRlOwotY2xhc3MgU3RyaW5nODsKLWNsYXNzIFRleHRPdXRwdXQ7Ci0KLXN0cnVjdCBmbGF0X2JpbmRlcl9vYmplY3Q7ICAvLyBkZWZpbmVkIGluIHN1cHBvcnRfcC9iaW5kZXJfbW9kdWxlLmgKLQotY2xhc3MgUGFyY2VsCi17Ci1wdWJsaWM6Ci0gICAgY2xhc3MgUmVhZGFibGVCbG9iOwotICAgIGNsYXNzIFdyaXRhYmxlQmxvYjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB+UGFyY2VsKCk7Ci0gICAgCi0gICAgY29uc3QgdWludDhfdCogICAgICBkYXRhKCkgY29uc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBkYXRhU2l6ZSgpIGNvbnN0OwotICAgIHNpemVfdCAgICAgICAgICAgICAgZGF0YUF2YWlsKCkgY29uc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBkYXRhUG9zaXRpb24oKSBjb25zdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgIGRhdGFDYXBhY2l0eSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBzZXREYXRhU2l6ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBzZXREYXRhUG9zaXRpb24oc2l6ZV90IHBvcykgY29uc3Q7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICBzZXREYXRhQ2FwYWNpdHkoc2l6ZV90IHNpemUpOwotICAgIAotICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0RGF0YShjb25zdCB1aW50OF90KiBidWZmZXIsIHNpemVfdCBsZW4pOwotCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmRGcm9tKGNvbnN0IFBhcmNlbCAqcGFyY2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW4pOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBwdXNoQWxsb3dGZHMoYm9vbCBhbGxvd0Zkcyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICByZXN0b3JlQWxsb3dGZHMoYm9vbCBsYXN0VmFsdWUpOwotCi0gICAgYm9vbCAgICAgICAgICAgICAgICBoYXNGaWxlRGVzY3JpcHRvcnMoKSBjb25zdDsKLQotICAgIC8vIFdyaXRlcyB0aGUgUlBDIGhlYWRlci4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlSW50ZXJmYWNlVG9rZW4oY29uc3QgU3RyaW5nMTYmIGludGVyZmFjZSk7Ci0KLSAgICAvLyBQYXJzZXMgdGhlIFJQQyBoZWFkZXIsIHJldHVybmluZyB0cnVlIGlmIHRoZSBpbnRlcmZhY2UgbmFtZQotICAgIC8vIGluIHRoZSBoZWFkZXIgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgaW50ZXJmYWNlIGZyb20gdGhlIGNhbGxlci4KLSAgICAvLwotICAgIC8vIEFkZGl0aW9uYWxseSwgZW5mb3JjZUludGVyZmFjZSBkb2VzIHBhcnQgb2YgdGhlIHdvcmsgb2YKLSAgICAvLyBwcm9wYWdhdGluZyB0aGUgU3RyaWN0TW9kZSBwb2xpY3kgbWFzaywgcG9wdWxhdGluZyB0aGUgY3VycmVudAotICAgIC8vIElQQ1RocmVhZFN0YXRlLCB3aGljaCBhcyBhbiBvcHRpbWl6YXRpb24gbWF5IG9wdGlvbmFsbHkgYmUKLSAgICAvLyBwYXNzZWQgaW4uCi0gICAgYm9vbCAgICAgICAgICAgICAgICBlbmZvcmNlSW50ZXJmYWNlKGNvbnN0IFN0cmluZzE2JiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiB0aHJlYWRTdGF0ZSA9IE5VTEwpIGNvbnN0OwotICAgIGJvb2wgICAgICAgICAgICAgICAgY2hlY2tJbnRlcmZhY2UoSUJpbmRlciopIGNvbnN0OwotCi0gICAgdm9pZCAgICAgICAgICAgICAgICBmcmVlRGF0YSgpOwotCi0gICAgY29uc3Qgc2l6ZV90KiAgICAgICBvYmplY3RzKCkgY29uc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBvYmplY3RzQ291bnQoKSBjb25zdDsKLSAgICAKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIGVycm9yQ2hlY2soKSBjb25zdDsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHNldEVycm9yKHN0YXR1c190IGVycik7Ci0gICAgCi0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKTsKLSAgICB2b2lkKiAgICAgICAgICAgICAgIHdyaXRlSW5wbGFjZShzaXplX3QgbGVuKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlVW5wYWRkZWQoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGxlbik7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUludDMyKGludDMyX3QgdmFsKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlSW50NjQoaW50NjRfdCB2YWwpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVGbG9hdChmbG9hdCB2YWwpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVEb3VibGUoZG91YmxlIHZhbCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUludFB0cihpbnRwdHJfdCB2YWwpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVDU3RyaW5nKGNvbnN0IGNoYXIqIHN0cik7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZVN0cmluZzgoY29uc3QgU3RyaW5nOCYgc3RyKTsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlU3RyaW5nMTYoY29uc3QgU3RyaW5nMTYmIHN0cik7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZVN0cmluZzE2KGNvbnN0IGNoYXIxNl90KiBzdHIsIHNpemVfdCBsZW4pOwotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVTdHJvbmdCaW5kZXIoY29uc3Qgc3A8SUJpbmRlcj4mIHZhbCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZVdlYWtCaW5kZXIoY29uc3Qgd3A8SUJpbmRlcj4mIHZhbCk7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZShjb25zdCBGbGF0dGVuYWJsZSYgdmFsKTsKLQotICAgIC8vIFBsYWNlIGEgbmF0aXZlX2hhbmRsZSBpbnRvIHRoZSBwYXJjZWwgKHRoZSBuYXRpdmVfaGFuZGxlJ3MgZmlsZS0KLSAgICAvLyBkZXNjcmlwdG9ycyBhcmUgZHVwJ2VkLCBzbyBpdCBpcyBzYWZlIHRvIGRlbGV0ZSB0aGUgbmF0aXZlX2hhbmRsZQotICAgIC8vIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zKS4gCi0gICAgLy8gRG9lc24ndCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgbmF0aXZlX2hhbmRsZS4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlTmF0aXZlSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGUqIGhhbmRsZSk7Ci0gICAgCi0gICAgLy8gUGxhY2UgYSBmaWxlIGRlc2NyaXB0b3IgaW50byB0aGUgcGFyY2VsLiAgVGhlIGdpdmVuIGZkIG11c3QgcmVtYWluCi0gICAgLy8gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcGFyY2VsLgotICAgIC8vIFRoZSBQYXJjZWwgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIGZkIHVubGVzcyB5b3UgYXNrIGl0IHRvLgotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVGaWxlRGVzY3JpcHRvcihpbnQgZmQsIGJvb2wgdGFrZU93bmVyc2hpcCA9IGZhbHNlKTsKLSAgICAKLSAgICAvLyBQbGFjZSBhIGZpbGUgZGVzY3JpcHRvciBpbnRvIHRoZSBwYXJjZWwuICBBIGR1cCBvZiB0aGUgZmQgaXMgbWFkZSwgd2hpY2gKLSAgICAvLyB3aWxsIGJlIGNsb3NlZCBvbmNlIHRoZSBwYXJjZWwgaXMgZGVzdHJveWVkLgotICAgIHN0YXR1c190ICAgICAgICAgICAgd3JpdGVEdXBGaWxlRGVzY3JpcHRvcihpbnQgZmQpOwotCi0gICAgLy8gV3JpdGVzIGEgYmxvYiB0byB0aGUgcGFyY2VsLgotICAgIC8vIElmIHRoZSBibG9iIGlzIHNtYWxsLCB0aGVuIGl0IGlzIHN0b3JlZCBpbi1wbGFjZSwgb3RoZXJ3aXNlIGl0IGlzCi0gICAgLy8gdHJhbnNmZXJyZWQgYnkgd2F5IG9mIGFuIGFub255bW91cyBzaGFyZWQgbWVtb3J5IHJlZ2lvbi4KLSAgICAvLyBUaGUgY2FsbGVyIHNob3VsZCBjYWxsIHJlbGVhc2UoKSBvbiB0aGUgYmxvYiBhZnRlciB3cml0aW5nIGl0cyBjb250ZW50cy4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlQmxvYihzaXplX3QgbGVuLCBXcml0YWJsZUJsb2IqIG91dEJsb2IpOwotCi0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZU9iamVjdChjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIHZhbCwgYm9vbCBudWxsTWV0YURhdGEpOwotCi0gICAgLy8gTGlrZSBQYXJjZWwuamF2YSdzIHdyaXRlTm9FeGNlcHRpb24oKS4gIEp1c3Qgd3JpdGVzIGEgemVybyBpbnQzMi4KLSAgICAvLyBDdXJyZW50bHkgdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGFueSBvZiB0aGUgU3RyaWN0TW9kZQotICAgIC8vIHN0YWNrIGdhdGhlcmluZyBhbmQgc2VyaWFsaXphdGlvbiB0aGF0IHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGRvZXMuCi0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZU5vRXhjZXB0aW9uKCk7Ci0KLSAgICB2b2lkICAgICAgICAgICAgICAgIHJlbW92ZShzaXplX3Qgc3RhcnQsIHNpemVfdCBhbXQpOwotICAgIAotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZCh2b2lkKiBvdXREYXRhLCBzaXplX3QgbGVuKSBjb25zdDsKLSAgICBjb25zdCB2b2lkKiAgICAgICAgIHJlYWRJbnBsYWNlKHNpemVfdCBsZW4pIGNvbnN0OwotICAgIGludDMyX3QgICAgICAgICAgICAgcmVhZEludDMyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkSW50MzIoaW50MzJfdCAqcEFyZykgY29uc3Q7Ci0gICAgaW50NjRfdCAgICAgICAgICAgICByZWFkSW50NjQoKSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWRJbnQ2NChpbnQ2NF90ICpwQXJnKSBjb25zdDsKLSAgICBmbG9hdCAgICAgICAgICAgICAgIHJlYWRGbG9hdCgpIGNvbnN0OwotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZEZsb2F0KGZsb2F0ICpwQXJnKSBjb25zdDsKLSAgICBkb3VibGUgICAgICAgICAgICAgIHJlYWREb3VibGUoKSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWREb3VibGUoZG91YmxlICpwQXJnKSBjb25zdDsKLSAgICBpbnRwdHJfdCAgICAgICAgICAgIHJlYWRJbnRQdHIoKSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWRJbnRQdHIoaW50cHRyX3QgKnBBcmcpIGNvbnN0OwotCi0gICAgY29uc3QgY2hhciogICAgICAgICByZWFkQ1N0cmluZygpIGNvbnN0OwotICAgIFN0cmluZzggICAgICAgICAgICAgcmVhZFN0cmluZzgoKSBjb25zdDsKLSAgICBTdHJpbmcxNiAgICAgICAgICAgIHJlYWRTdHJpbmcxNigpIGNvbnN0OwotICAgIGNvbnN0IGNoYXIxNl90KiAgICAgcmVhZFN0cmluZzE2SW5wbGFjZShzaXplX3QqIG91dExlbikgY29uc3Q7Ci0gICAgc3A8SUJpbmRlcj4gICAgICAgICByZWFkU3Ryb25nQmluZGVyKCkgY29uc3Q7Ci0gICAgd3A8SUJpbmRlcj4gICAgICAgICByZWFkV2Vha0JpbmRlcigpIGNvbnN0OwotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZChGbGF0dGVuYWJsZSYgdmFsKSBjb25zdDsKLQotICAgIC8vIExpa2UgUGFyY2VsLmphdmEncyByZWFkRXhjZXB0aW9uQ29kZSgpLiAgUmVhZHMgdGhlIGZpcnN0IGludDMyCi0gICAgLy8gb2ZmIG9mIGEgUGFyY2VsJ3MgaGVhZGVyLCByZXR1cm5pbmcgMCBvciB0aGUgbmVnYXRpdmUgZXJyb3IKLSAgICAvLyBjb2RlIG9uIGV4Y2VwdGlvbnMsIGJ1dCBhbHNvIGRlYWxzIHdpdGggc2tpcHBpbmcgb3ZlciByaWNoCi0gICAgLy8gcmVzcG9uc2UgaGVhZGVycy4gIENhbGxlcnMgc2hvdWxkIHVzZSB0aGlzIHRvIHJlYWQgJiBwYXJzZSB0aGUKLSAgICAvLyByZXNwb25zZSBoZWFkZXJzIHJhdGhlciB0aGFuIGRvaW5nIGl0IGJ5IGhhbmQuCi0gICAgaW50MzJfdCAgICAgICAgICAgICByZWFkRXhjZXB0aW9uQ29kZSgpIGNvbnN0OwotCi0gICAgLy8gUmV0cmlldmUgbmF0aXZlX2hhbmRsZSBmcm9tIHRoZSBwYXJjZWwuIFRoaXMgcmV0dXJucyBhIGNvcHkgb2YgdGhlCi0gICAgLy8gcGFyY2VsJ3MgbmF0aXZlX2hhbmRsZSAodGhlIGNhbGxlciB0YWtlcyBvd25lcnNoaXApLiBUaGUgY2FsbGVyCi0gICAgLy8gbXVzdCBmcmVlIHRoZSBuYXRpdmVfaGFuZGxlIHdpdGggbmF0aXZlX2hhbmRsZV9jbG9zZSgpIGFuZCAKLSAgICAvLyBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpLgotICAgIG5hdGl2ZV9oYW5kbGUqICAgICByZWFkTmF0aXZlSGFuZGxlKCkgY29uc3Q7Ci0KLSAgICAKLSAgICAvLyBSZXRyaWV2ZSBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIHRoZSBwYXJjZWwuICBUaGlzIHJldHVybnMgdGhlIHJhdyBmZAotICAgIC8vIGluIHRoZSBwYXJjZWwsIHdoaWNoIHlvdSBkbyBub3Qgb3duIC0tIHVzZSBkdXAoKSB0byBnZXQgeW91ciBvd24gY29weS4KLSAgICBpbnQgICAgICAgICAgICAgICAgIHJlYWRGaWxlRGVzY3JpcHRvcigpIGNvbnN0OwotCi0gICAgLy8gUmVhZHMgYSBibG9iIGZyb20gdGhlIHBhcmNlbC4KLSAgICAvLyBUaGUgY2FsbGVyIHNob3VsZCBjYWxsIHJlbGVhc2UoKSBvbiB0aGUgYmxvYiBhZnRlciByZWFkaW5nIGl0cyBjb250ZW50cy4KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWRCbG9iKHNpemVfdCBsZW4sIFJlYWRhYmxlQmxvYiogb3V0QmxvYikgY29uc3Q7Ci0KLSAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIHJlYWRPYmplY3QoYm9vbCBudWxsTWV0YURhdGEpIGNvbnN0OwotCi0gICAgLy8gRXhwbGljaXRseSBjbG9zZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBpbiB0aGUgcGFyY2VsLgotICAgIHZvaWQgICAgICAgICAgICAgICAgY2xvc2VGaWxlRGVzY3JpcHRvcnMoKTsKLSAgICAKLSAgICB0eXBlZGVmIHZvaWQgICAgICAgICgqcmVsZWFzZV9mdW5jKShQYXJjZWwqIHBhcmNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90KiBvYmplY3RzLCBzaXplX3Qgb2JqZWN0c1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29va2llKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNvbnN0IHVpbnQ4X3QqICAgICAgaXBjRGF0YSgpIGNvbnN0OwotICAgIHNpemVfdCAgICAgICAgICAgICAgaXBjRGF0YVNpemUoKSBjb25zdDsKLSAgICBjb25zdCBzaXplX3QqICAgICAgIGlwY09iamVjdHMoKSBjb25zdDsKLSAgICBzaXplX3QgICAgICAgICAgICAgIGlwY09iamVjdHNDb3VudCgpIGNvbnN0OwotICAgIHZvaWQgICAgICAgICAgICAgICAgaXBjU2V0RGF0YVJlZmVyZW5jZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCogb2JqZWN0cywgc2l6ZV90IG9iamVjdHNDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9mdW5jIHJlbEZ1bmMsIHZvaWQqIHJlbENvb2tpZSk7Ci0gICAgCi0gICAgdm9pZCAgICAgICAgICAgICAgICBwcmludChUZXh0T3V0cHV0JiB0bywgdWludDMyX3QgZmxhZ3MgPSAwKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbChjb25zdCBQYXJjZWwmIG8pOwotICAgIFBhcmNlbCYgICAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFBhcmNlbCYgbyk7Ci0gICAgCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBmaW5pc2hXcml0ZShzaXplX3QgbGVuKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHJlbGVhc2VPYmplY3RzKCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBhY3F1aXJlT2JqZWN0cygpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgZ3Jvd0RhdGEoc2l6ZV90IGxlbik7Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICByZXN0YXJ0V3JpdGUoc2l6ZV90IGRlc2lyZWQpOwotICAgIHN0YXR1c190ICAgICAgICAgICAgY29udGludWVXcml0ZShzaXplX3QgZGVzaXJlZCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBmcmVlRGF0YU5vSW5pdCgpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICBzY2FuRm9yRmRzKCkgY29uc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0ZW1wbGF0ZTxjbGFzcyBUPgotICAgIHN0YXR1c190ICAgICAgICAgICAgcmVhZEFsaWduZWQoVCAqcEFyZykgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZTxjbGFzcyBUPiAgIFQgcmVhZEFsaWduZWQoKSBjb25zdDsKLQotICAgIHRlbXBsYXRlPGNsYXNzIFQ+Ci0gICAgc3RhdHVzX3QgICAgICAgICAgICB3cml0ZUFsaWduZWQoVCB2YWwpOwotCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBtRXJyb3I7Ci0gICAgdWludDhfdCogICAgICAgICAgICBtRGF0YTsKLSAgICBzaXplX3QgICAgICAgICAgICAgIG1EYXRhU2l6ZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgIG1EYXRhQ2FwYWNpdHk7Ci0gICAgbXV0YWJsZSBzaXplX3QgICAgICBtRGF0YVBvczsKLSAgICBzaXplX3QqICAgICAgICAgICAgIG1PYmplY3RzOwotICAgIHNpemVfdCAgICAgICAgICAgICAgbU9iamVjdHNTaXplOwotICAgIHNpemVfdCAgICAgICAgICAgICAgbU9iamVjdHNDYXBhY2l0eTsKLSAgICBtdXRhYmxlIHNpemVfdCAgICAgIG1OZXh0T2JqZWN0SGludDsKLQotICAgIG11dGFibGUgYm9vbCAgICAgICAgbUZkc0tub3duOwotICAgIG11dGFibGUgYm9vbCAgICAgICAgbUhhc0ZkczsKLSAgICBib29sICAgICAgICAgICAgICAgIG1BbGxvd0ZkczsKLSAgICAKLSAgICByZWxlYXNlX2Z1bmMgICAgICAgIG1Pd25lcjsKLSAgICB2b2lkKiAgICAgICAgICAgICAgIG1Pd25lckNvb2tpZTsKLQotICAgIGNsYXNzIEJsb2IgewotICAgIHB1YmxpYzoKLSAgICAgICAgQmxvYigpOwotICAgICAgICB+QmxvYigpOwotCi0gICAgICAgIHZvaWQgcmVsZWFzZSgpOwotICAgICAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2b2lkIGluaXQoYm9vbCBtYXBwZWQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKTsKLSAgICAgICAgdm9pZCBjbGVhcigpOwotCi0gICAgICAgIGJvb2wgbU1hcHBlZDsKLSAgICAgICAgdm9pZCogbURhdGE7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgY2xhc3MgUmVhZGFibGVCbG9iIDogcHVibGljIEJsb2IgewotICAgICAgICBmcmllbmQgY2xhc3MgUGFyY2VsOwotICAgIHB1YmxpYzoKLSAgICAgICAgaW5saW5lIGNvbnN0IHZvaWQqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQotICAgIH07Ci0KLSAgICBjbGFzcyBXcml0YWJsZUJsb2IgOiBwdWJsaWMgQmxvYiB7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBQYXJjZWw7Ci0gICAgcHVibGljOgotICAgICAgICBpbmxpbmUgdm9pZCogZGF0YSgpIHsgcmV0dXJuIG1EYXRhOyB9Ci0gICAgfTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmxpbmUgVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3QgUGFyY2VsJiBwYXJjZWwpCi17Ci0gICAgcGFyY2VsLnByaW50KHRvKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHZW5lcmljIGFjcXVpcmUgYW5kIHJlbGVhc2Ugb2Ygb2JqZWN0cy4KLXZvaWQgYWNxdWlyZV9vYmplY3QoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0JiBvYmosIGNvbnN0IHZvaWQqIHdobyk7Ci12b2lkIHJlbGVhc2Vfb2JqZWN0KGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgb2JqLCBjb25zdCB2b2lkKiB3aG8pOwotCi12b2lkIGZsYXR0ZW5fYmluZGVyKGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsIGZsYXRfYmluZGVyX29iamVjdCogb3V0KTsKLXZvaWQgZmxhdHRlbl9iaW5kZXIoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIGJpbmRlciwgZmxhdF9iaW5kZXJfb2JqZWN0KiBvdXQpOwotc3RhdHVzX3QgdW5mbGF0dGVuX2JpbmRlcihjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIGZsYXQsIHNwPElCaW5kZXI+KiBvdXQpOwotc3RhdHVzX3QgdW5mbGF0dGVuX2JpbmRlcihjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIGZsYXQsIHdwPElCaW5kZXI+KiBvdXQpOwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfUEFSQ0VMX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL1Blcm1pc3Npb25DYWNoZS5oIGIvaW5jbHVkZS9iaW5kZXIvUGVybWlzc2lvbkNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzFkNDguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9iaW5kZXIvUGVybWlzc2lvbkNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBCSU5ERVJfUEVSTUlTU0lPTl9ICi0jZGVmaW5lIEJJTkRFUl9QRVJNSVNTSU9OX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9TaW5nbGV0b24uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBQZXJtaXNzaW9uQ2FjaGUgY2FjaGVzIHBlcm1pc3Npb24gY2hlY2tzIGZvciBhIGdpdmVuIHVpZC4KLSAqCi0gKiBDdXJyZW50bHkgdGhlIGNhY2hlIGlzIG5vdCB1cGRhdGVkIHdoZW4gdGhlcmUgaXMgYSBwZXJtaXNzaW9uIGNoYW5nZSwKLSAqIGZvciBpbnN0YW5jZSB3aGVuIGFuIGFwcGxpY2F0aW9uIGlzIHVuaW5zdGFsbGVkLgotICoKLSAqIElNUE9SVEFOVDogZm9yIHRoZSByZWFzb24gc3RhdGVkIGFib3ZlLCBvbmx5IHN5c3RlbSBwZXJtaXNzaW9ucyBhcmUgc2FmZQotICogdG8gY2FjaGUuIFRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBhdCBhIGxhdGVyIHRpbWUuCi0gKgotICovCi0KLWNsYXNzIFBlcm1pc3Npb25DYWNoZSA6IFNpbmdsZXRvbjxQZXJtaXNzaW9uQ2FjaGU+IHsKLSAgICBzdHJ1Y3QgRW50cnkgewotICAgICAgICBTdHJpbmcxNiAgICBuYW1lOwotICAgICAgICB1aWRfdCAgICAgICB1aWQ7Ci0gICAgICAgIGJvb2wgICAgICAgIGdyYW50ZWQ7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEVudHJ5JiBlKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKHVpZCA9PSBlLnVpZCkgPyAobmFtZSA8IGUubmFtZSkgOiAodWlkIDwgZS51aWQpOwotICAgICAgICB9Ci0gICAgfTsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIC8vIHdlIHBvb2wgYWxsIHRoZSBwZXJtaXNzaW9uIG5hbWVzIHdlIHNlZSwgYXMgbWFueSBwZXJtaXNzaW9ucyBjaGVja3MKLSAgICAvLyB3aWxsIGhhdmUgaWRlbnRpY2FsIG5hbWVzCi0gICAgU29ydGVkVmVjdG9yPCBTdHJpbmcxNiA+IG1QZXJtaXNzaW9uTmFtZXNQb29sOwotICAgIC8vIHRoaXMgaXMgb3VyIGNhY2hlIHBlciBzYXkuIGl0IHN0b3JlcyBwb29sZWQgbmFtZXMuCi0gICAgU29ydGVkVmVjdG9yPCBFbnRyeSA+IG1DYWNoZTsKLQotICAgIC8vIGZyZWUgdGhlIHdob2xlIGNhY2hlLCBidXQga2VlcCB0aGUgcGVybWlzc2lvbiBuYW1lIHBvb2wKLSAgICB2b2lkIHB1cmdlKCk7Ci0KLSAgICBzdGF0dXNfdCBjaGVjayhib29sKiBncmFudGVkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIHVpZF90IHVpZCkgY29uc3Q7Ci0KLSAgICB2b2lkIGNhY2hlKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLCB1aWRfdCB1aWQsIGJvb2wgZ3JhbnRlZCk7Ci0KLXB1YmxpYzoKLSAgICBQZXJtaXNzaW9uQ2FjaGUoKTsKLQotICAgIHN0YXRpYyBib29sIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24pOwotCi0gICAgc3RhdGljIGJvb2wgY2hlY2tDYWxsaW5nUGVybWlzc2lvbihjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0UGlkLCBpbnQzMl90KiBvdXRVaWQpOwotCi0gICAgc3RhdGljIGJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLAotICAgICAgICAgICAgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLyogQklOREVSX1BFUk1JU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaW5kZXIvUHJvY2Vzc1N0YXRlLmggYi9pbmNsdWRlL2JpbmRlci9Qcm9jZXNzU3RhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNTgyMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JpbmRlci9Qcm9jZXNzU3RhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1BST0NFU1NfU1RBVEVfSAotI2RlZmluZSBBTkRST0lEX1BST0NFU1NfU1RBVEVfSAotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gR2xvYmFsIHZhcmlhYmxlcwotZXh0ZXJuIGludCAgICAgICAgICAgICAgICAgbUFyZ0M7Ci1leHRlcm4gY29uc3QgY2hhciogY29uc3QqICBtQXJnVjsKLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgIG1BcmdMZW47Ci0KLWNsYXNzIElQQ1RocmVhZFN0YXRlOwotCi1jbGFzcyBQcm9jZXNzU3RhdGUgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljICBzcDxQcm9jZXNzU3RhdGU+ICAgIHNlbGYoKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRDb250ZXh0T2JqZWN0KGNvbnN0IHNwPElCaW5kZXI+JiBvYmplY3QpOwotICAgICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICBnZXRDb250ZXh0T2JqZWN0KGNvbnN0IHNwPElCaW5kZXI+JiBjYWxsZXIpOwotICAgICAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgc2V0Q29udGV4dE9iamVjdChjb25zdCBzcDxJQmluZGVyPiYgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBuYW1lKTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+ICAgICAgICAgZ2V0Q29udGV4dE9iamVjdChjb25zdCBTdHJpbmcxNiYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2FsbGVyKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzdGFydFRocmVhZFBvb2woKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHR5cGVkZWYgYm9vbCAoKmNvbnRleHRfY2hlY2tfZnVuYykoY29uc3QgU3RyaW5nMTYmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgY2FsbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlckRhdGEpOwotICAgICAgICAKLSAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgaXNDb250ZXh0TWFuYWdlcih2b2lkKSBjb25zdDsKLSAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgYmVjb21lQ29udGV4dE1hbmFnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0X2NoZWNrX2Z1bmMgY2hlY2tGdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlckRhdGEpOwotCi0gICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgIGdldFN0cm9uZ1Byb3h5Rm9ySGFuZGxlKGludDMyX3QgaGFuZGxlKTsKLSAgICAgICAgICAgIHdwPElCaW5kZXI+ICAgICAgICAgZ2V0V2Vha1Byb3h5Rm9ySGFuZGxlKGludDMyX3QgaGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgZXhwdW5nZUhhbmRsZShpbnQzMl90IGhhbmRsZSwgSUJpbmRlciogYmluZGVyKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRBcmdzKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pOwotICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBnZXRBcmdDKCkgY29uc3Q7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogIGdldEFyZ1YoKSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRBcmdWMChjb25zdCBjaGFyKiB0eHQpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNwYXduUG9vbGVkVGhyZWFkKGJvb2wgaXNNYWluKTsKLSAgICAgICAgICAgIAotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgSVBDVGhyZWFkU3RhdGU7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UHJvY2Vzc1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc1N0YXRlKGNvbnN0IFByb2Nlc3NTdGF0ZSYgbyk7Ci0gICAgICAgICAgICBQcm9jZXNzU3RhdGUmICAgICAgIG9wZXJhdG9yPShjb25zdCBQcm9jZXNzU3RhdGUmIG8pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdHJ1Y3QgaGFuZGxlX2VudHJ5IHsKLSAgICAgICAgICAgICAgICBJQmluZGVyKiBiaW5kZXI7Ci0gICAgICAgICAgICAgICAgUmVmQmFzZTo6d2Vha3JlZl90eXBlKiByZWZzOwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaGFuZGxlX2VudHJ5KiAgICAgICBsb29rdXBIYW5kbGVMb2NrZWQoaW50MzJfdCBoYW5kbGUpOwotCi0gICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1Ecml2ZXJGRDsKLSAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgbVZNU3RhcnQ7Ci0gICAgICAgICAgICAKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAvLyBwcm90ZWN0cyBldmVyeXRoaW5nIGJlbG93LgotICAgICAgICAgICAgCi0gICAgICAgICAgICBWZWN0b3I8aGFuZGxlX2VudHJ5Pm1IYW5kbGVUb09iamVjdDsKLQotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBtTWFuYWdlc0NvbnRleHRzOwotICAgICAgICAgICAgY29udGV4dF9jaGVja19mdW5jICBtQmluZGVyQ29udGV4dENoZWNrRnVuYzsKLSAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgbUJpbmRlckNvbnRleHRVc2VyRGF0YTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nMTYsIHNwPElCaW5kZXI+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHRzOwotCi0KLSAgICAgICAgICAgIFN0cmluZzggICAgICAgICAgICAgbVJvb3REaXI7Ci0gICAgICAgICAgICBib29sICAgICAgICAgICAgICAgIG1UaHJlYWRQb29sU3RhcnRlZDsKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgbVRocmVhZFBvb2xTZXE7Ci19OwotICAgIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX1BST0NFU1NfU1RBVEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvQml0VHViZS5oIGIvaW5jbHVkZS9ndWkvQml0VHViZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM4OWEwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0JpdFR1YmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX1NFTlNPUl9DSEFOTkVMX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfU0VOU09SX0NIQU5ORUxfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotY2xhc3MgUGFyY2VsOwotCi1jbGFzcyBCaXRUdWJlIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLQotICAgICAgICAgICAgQml0VHViZSgpOwotICAgICAgICAgICAgQml0VHViZShjb25zdCBQYXJjZWwmIGRhdGEpOwotICAgIHZpcnR1YWwgfkJpdFR1YmUoKTsKLQotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIGludCBnZXRGZCgpIGNvbnN0OwotICAgIHNzaXplX3Qgd3JpdGUodm9pZCBjb25zdCogdmFkZHIsIHNpemVfdCBzaXplKTsKLSAgICBzc2l6ZV90IHJlYWQodm9pZCogdmFkZHIsIHNpemVfdCBzaXplKTsKLQotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiByZXBseSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgaW50IG1TZW5kRmQ7Ci0gICAgbXV0YWJsZSBpbnQgbVJlY2VpdmVGZDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9TRU5TT1JfQ0hBTk5FTF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZS5oIGIvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyMWEyOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX0JVRkZFUlFVRVVFX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfQlVGRkVSUVVFVUVfSAotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJ1ZmZlclF1ZXVlIDogcHVibGljIEJuU3VyZmFjZVRleHR1cmUgewotcHVibGljOgotICAgIGVudW0geyBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTID0gMiB9OwotICAgIGVudW0gewotICAgICAgICBNSU5fQVNZTkNfQlVGRkVSX1NMT1RTID0gTUlOX1VOREVRVUVVRURfQlVGRkVSUyArIDEsCi0gICAgICAgIE1JTl9TWU5DX0JVRkZFUl9TTE9UUyAgPSBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTCi0gICAgfTsKLSAgICBlbnVtIHsgTlVNX0JVRkZFUl9TTE9UUyA9IDMyIH07Ci0gICAgZW51bSB7IE5PX0NPTk5FQ1RFRF9BUEkgPSAwIH07Ci0gICAgZW51bSB7IElOVkFMSURfQlVGRkVSX1NMT1QgPSAtMSB9OwotCi0gICAgc3RydWN0IEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLSAgICAgICAgLy8gb25GcmFtZUF2YWlsYWJsZSgpIGlzIGNhbGxlZCBmcm9tIHF1ZXVlQnVmZmVyKCkgZWFjaCB0aW1lIGFuCi0gICAgICAgIC8vIGFkZGl0aW9uYWwgZnJhbWUgYmVjb21lcyBhdmFpbGFibGUgZm9yIGNvbnN1bXB0aW9uLiBUaGlzIG1lYW5zIHRoYXQKLSAgICAgICAgLy8gZnJhbWVzIHRoYXQgYXJlIHF1ZXVlZCB3aGlsZSBpbiBhc3luY2hyb25vdXMgbW9kZSBvbmx5IHRyaWdnZXIgdGhlCi0gICAgICAgIC8vIGNhbGxiYWNrIGlmIG5vIHByZXZpb3VzIGZyYW1lcyBhcmUgcGVuZGluZy4gRnJhbWVzIHF1ZXVlZCB3aGlsZSBpbgotICAgICAgICAvLyBzeW5jaHJvbm91cyBtb2RlIGFsd2F5cyB0cmlnZ2VyIHRoZSBjYWxsYmFjay4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBhbnkgbG9jayBoZWxkIGFuZCBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseQotICAgICAgICAvLyBieSBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpID0gMDsKLSAgICB9OwotCi0gICAgLy8gQnVmZmVyUXVldWUgbWFuYWdlcyBhIHBvb2wgb2YgZ3JhbGxvYyBtZW1vcnkgc2xvdHMgdG8gYmUgdXNlZAotICAgIC8vIGJ5IHByb2R1Y2VycyBhbmQgY29uc3VtZXJzLgotICAgIC8vIGFsbG93U3luY2hyb25vdXNNb2RlIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBzeW5jaHJvbm91cyBtb2RlIGNhbiBiZQotICAgIC8vIGVuYWJsZWQuCi0gICAgQnVmZmVyUXVldWUoYm9vbCBhbGxvd1N5bmNocm9ub3VzTW9kZSA9IHRydWUpOwotICAgIHZpcnR1YWwgfkJ1ZmZlclF1ZXVlKCk7Ci0KLSAgICB2aXJ0dWFsIGludCBxdWVyeShpbnQgd2hhdCwgaW50KiB2YWx1ZSk7Ci0KLSAgICAvLyBzZXRCdWZmZXJDb3VudCB1cGRhdGVzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJ1ZmZlciBzbG90cy4gIEFmdGVyCi0gICAgLy8gY2FsbGluZyB0aGlzIGFsbCBidWZmZXIgc2xvdHMgYXJlIGJvdGggdW5hbGxvY2F0ZWQgYW5kIG93bmVkIGJ5IHRoZQotICAgIC8vIEJ1ZmZlclF1ZXVlIG9iamVjdCAoaS5lLiB0aGV5IGFyZSBub3Qgb3duZWQgYnkgdGhlIGNsaWVudCkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0QnVmZmVyKGludCBzbG90LCBzcDxHcmFwaGljQnVmZmVyPiogYnVmKTsKLQotICAgIC8vIGRlcXVldWVCdWZmZXIgZ2V0cyB0aGUgbmV4dCBidWZmZXIgc2xvdCBpbmRleCBmb3IgdGhlIGNsaWVudCB0byB1c2UuIElmIGEKLSAgICAvLyBidWZmZXIgc2xvdCBpcyBhdmFpbGFibGUgdGhlbiB0aGF0IHNsb3QgaW5kZXggaXMgd3JpdHRlbiB0byB0aGUgbG9jYXRpb24KLSAgICAvLyBwb2ludGVkIHRvIGJ5IHRoZSBidWYgYXJndW1lbnQgYW5kIGEgc3RhdHVzIG9mIE9LIGlzIHJldHVybmVkLiAgSWYgbm8KLSAgICAvLyBzbG90IGlzIGF2YWlsYWJsZSB0aGVuIGEgc3RhdHVzIG9mIC1FQlVTWSBpcyByZXR1cm5lZCBhbmQgYnVmIGlzCi0gICAgLy8gdW5tb2RpZmllZC4KLSAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBwYXJhbWV0ZXJzIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIG9mCi0gICAgLy8gR0xfTUFYX1ZJRVdQT1JUX0RJTVMgYW5kIEdMX01BWF9URVhUVVJFX1NJWkUgKHNlZTogZ2xHZXRJbnRlZ2VydikuCi0gICAgLy8gQW4gZXJyb3IgZHVlIHRvIGludmFsaWQgZGltZW5zaW9ucyBtaWdodCBub3QgYmUgcmVwb3J0ZWQgdW50aWwKLSAgICAvLyB1cGRhdGVUZXhJbWFnZSgpIGlzIGNhbGxlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpidWYsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKLQotICAgIC8vIHF1ZXVlQnVmZmVyIHJldHVybnMgYSBmaWxsZWQgYnVmZmVyIHRvIHRoZSBCdWZmZXJRdWV1ZS4gSW4gYWRkaXRpb24sIGEKLSAgICAvLyB0aW1lc3RhbXAgbXVzdCBiZSBwcm92aWRlZCBmb3IgdGhlIGJ1ZmZlci4gVGhlIHRpbWVzdGFtcCBpcyBpbgotICAgIC8vIG5hbm9zZWNvbmRzLCBhbmQgbXVzdCBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuIEl0cyBvdGhlciBzZW1hbnRpY3MKLSAgICAvLyAoemVybyBwb2ludCwgZXRjKSBhcmUgY2xpZW50LWRlcGVuZGVudCBhbmQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYnkgdGhlCi0gICAgLy8gY2xpZW50LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXIoaW50IGJ1ZiwgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgdm9pZCBjYW5jZWxCdWZmZXIoaW50IGJ1Zik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDcm9wKGNvbnN0IFJlY3QmIHJlZyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUcmFuc2Zvcm0odWludDMyX3QgdHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFNjYWxpbmdNb2RlKGludCBtb2RlKTsKLQotICAgIC8vIHNldFN5bmNocm9ub3VzTW9kZSBzZXQgd2hldGhlciBkZXF1ZXVlQnVmZmVyIGlzIHN5bmNocm9ub3VzIG9yCi0gICAgLy8gYXN5bmNocm9ub3VzLiBJbiBzeW5jaHJvbm91cyBtb2RlLCBkZXF1ZXVlQnVmZmVyIGJsb2NrcyB1bnRpbAotICAgIC8vIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSwgdGhlIGN1cnJlbnRseSBib3VuZCBidWZmZXIgY2FuIGJlIGRlcXVldWVkIGFuZAotICAgIC8vIHF1ZXVlZCBidWZmZXJzIHdpbGwgYmUgcmV0aXJlZCBpbiBvcmRlci4KLSAgICAvLyBUaGUgZGVmYXVsdCBtb2RlIGlzIGFzeW5jaHJvbm91cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN5bmNocm9ub3VzTW9kZShib29sIGVuYWJsZWQpOwotCi0gICAgLy8gY29ubmVjdCBhdHRlbXB0cyB0byBjb25uZWN0IGEgcHJvZHVjZXIgY2xpZW50IEFQSSB0byB0aGUgQnVmZmVyUXVldWUuCi0gICAgLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIElTdXJmYWNlVGV4dHVyZSBtZXRob2RzIGFyZSBjYWxsZWQKLSAgICAvLyBleGNlcHQgZm9yIGdldEFsbG9jYXRvci4KLSAgICAvLwotICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgZmFpbCBpZiB0aGUgY29ubmVjdCB3YXMgcHJldmlvdXNseSBjYWxsZWQgb24gdGhlCi0gICAgLy8gQnVmZmVyUXVldWUgYW5kIG5vIGNvcnJlc3BvbmRpbmcgZGlzY29ubmVjdCBjYWxsIHdhcyBtYWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdChpbnQgYXBpLAotICAgICAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKTsKLQotICAgIC8vIGRpc2Nvbm5lY3QgYXR0ZW1wdHMgdG8gZGlzY29ubmVjdCBhIHByb2R1Y2VyIGNsaWVudCBBUEkgZnJvbSB0aGUKLSAgICAvLyBCdWZmZXJRdWV1ZS4gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIG90aGVyCi0gICAgLy8gSVN1cmZhY2VUZXh0dXJlIG1ldGhvZHMgdG8gZmFpbCBleGNlcHQgZm9yIGdldEFsbG9jYXRvciBhbmQgY29ubmVjdC4KLSAgICAvLyBTdWNjZXNzZnVsbHkgY2FsbGluZyBjb25uZWN0IGFmdGVyIHRoaXMgd2lsbCBhbGxvdyB0aGUgb3RoZXIgbWV0aG9kcyB0bwotICAgIC8vIHN1Y2NlZWQgYWdhaW4uCi0gICAgLy8KLSAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGZhaWwgaWYgdGhlIHRoZSBCdWZmZXJRdWV1ZSBpcyBub3QgY3VycmVudGx5Ci0gICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgY2xpZW50IEFQSS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoaW50IGFwaSk7Ci0KLSAgICAvLyBkdW1wIG91ciBzdGF0ZSBpbiBhIFN0cmluZwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjb25zdCBjaGFyKiBwcmVmaXgsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0OwotCi0gICAgLy8gcHVibGljIGZhY2luZyBzdHJ1Y3R1cmUgZm9yIEJ1ZmZlclNsb3QKLSAgICBzdHJ1Y3QgQnVmZmVySXRlbSB7Ci0KLSAgICAgICAgQnVmZmVySXRlbSgpCi0gICAgICAgICA6Ci0gICAgICAgICAgIG1UcmFuc2Zvcm0oMCksCi0gICAgICAgICAgIG1TY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkUpLAotICAgICAgICAgICBtVGltZXN0YW1wKDApLAotICAgICAgICAgICBtRnJhbWVOdW1iZXIoMCksCi0gICAgICAgICAgIG1CdWYoSU5WQUxJRF9CVUZGRVJfU0xPVCkgewotICAgICAgICAgICAgIG1Dcm9wLm1ha2VJbnZhbGlkKCk7Ci0gICAgICAgICB9Ci0gICAgICAgIC8vIG1HcmFwaGljQnVmZmVyIHBvaW50cyB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBmb3IgdGhpcyBzbG90IG9yIGlzIE5VTEwKLSAgICAgICAgLy8gaWYgbm8gYnVmZmVyIGhhcyBiZWVuIGFsbG9jYXRlZC4KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUdyYXBoaWNCdWZmZXI7Ci0KLSAgICAgICAgLy8gbUNyb3AgaXMgdGhlIGN1cnJlbnQgY3JvcCByZWN0YW5nbGUgZm9yIHRoaXMgYnVmZmVyIHNsb3QuIFRoaXMgZ2V0cwotICAgICAgICAvLyBzZXQgdG8gbU5leHRDcm9wIGVhY2ggdGltZSBxdWV1ZUJ1ZmZlciBnZXRzIGNhbGxlZCBmb3IgdGhpcyBidWZmZXIuCi0gICAgICAgIFJlY3QgbUNyb3A7Ci0KLSAgICAgICAgLy8gbVRyYW5zZm9ybSBpcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gZmxhZ3MgZm9yIHRoaXMgYnVmZmVyIHNsb3QuIFRoaXMKLSAgICAgICAgLy8gZ2V0cyBzZXQgdG8gbU5leHRUcmFuc2Zvcm0gZWFjaCB0aW1lIHF1ZXVlQnVmZmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0gICAgICAgIC8vIHNsb3QuCi0gICAgICAgIHVpbnQzMl90IG1UcmFuc2Zvcm07Ci0KLSAgICAgICAgLy8gbVNjYWxpbmdNb2RlIGlzIHRoZSBjdXJyZW50IHNjYWxpbmcgbW9kZSBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcwotICAgICAgICAvLyBnZXRzIHNldCB0byBtTmV4dFNjYWxpbmdNb2RlIGVhY2ggdGltZSBxdWV1ZUJ1ZmZlciBnZXRzIGNhbGxlZCBmb3IKLSAgICAgICAgLy8gdGhpcyBzbG90LgotICAgICAgICB1aW50MzJfdCBtU2NhbGluZ01vZGU7Ci0KLSAgICAgICAgLy8gbVRpbWVzdGFtcCBpcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgZm9yIHRoaXMgYnVmZmVyIHNsb3QuIFRoaXMgZ2V0cwotICAgICAgICAvLyB0byBzZXQgYnkgcXVldWVCdWZmZXIgZWFjaCB0aW1lIHRoaXMgc2xvdCBpcyBxdWV1ZWQuCi0gICAgICAgIGludDY0X3QgbVRpbWVzdGFtcDsKLQotICAgICAgICAvLyBtRnJhbWVOdW1iZXIgaXMgdGhlIG51bWJlciBvZiB0aGUgcXVldWVkIGZyYW1lIGZvciB0aGlzIHNsb3QuCi0gICAgICAgIHVpbnQ2NF90IG1GcmFtZU51bWJlcjsKLQotICAgICAgICAvLyBidWYgaXMgdGhlIHNsb3QgaW5kZXggb2YgdGhpcyBidWZmZXIKLSAgICAgICAgaW50IG1CdWY7Ci0KLSAgICB9OwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBwdWJsaWMgZnVuY3Rpb25zIGlzIHRoZSBjb25zdW1lciBmYWNpbmcgaW50ZXJmYWNlCi0KLSAgICAvLyBhY3F1aXJlIGNvbnN1bWVzIGEgYnVmZmVyIGJ5IHRyYW5zZmVycmluZyBpdHMgb3duZXJzaGlwIHRvIGEgY29uc3VtZXIuCi0gICAgLy8gYnVmZmVyIGNvbnRhaW5zIHRoZSBHcmFwaGljQnVmZmVyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbi4KLSAgICAvLyBidWZmZXIubUdyYXBoaWNzQnVmZmVyIHdpbGwgYmUgTlVMTCB3aGVuIHRoZSBidWZmZXIgaGFzIGJlZW4gYWxyZWFkeQotICAgIC8vIGFjcXVpcmVkIGJ5IHRoZSBjb25zdW1lci4KLQotICAgIHN0YXR1c190IGFjcXVpcmUoQnVmZmVySXRlbSAqYnVmZmVyKTsKLQotICAgIC8vIHJlbGVhc2VCdWZmZXIgcmVsZWFzZXMgYSBidWZmZXIgc2xvdCBmcm9tIHRoZSBjb25zdW1lciBiYWNrIHRvIHRoZQotICAgIC8vIEJ1ZmZlclF1ZXVlIHBlbmRpbmcgYSBmZW5jZSBzeW5jLgotICAgIHN0YXR1c190IHJlbGVhc2VCdWZmZXIoaW50IGJ1ZiwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xTeW5jS0hSIGZlbmNlKTsKLQotICAgIC8vIGNvbnN1bWVyRGlzY29ubmVjdCBkaXNjb25uZWN0cyBhIGNvbnN1bWVyIGZyb20gdGhlIEJ1ZmZlclF1ZXVlLiBBbGwKLSAgICAvLyBidWZmZXJzIHdpbGwgYmUgZnJlZWQuCi0gICAgc3RhdHVzX3QgY29uc3VtZXJEaXNjb25uZWN0KCk7Ci0KLSAgICAvLyBzZXREZWZhdWx0QnVmZmVyU2l6ZSBpcyB1c2VkIHRvIHNldCB0aGUgc2l6ZSBvZiBidWZmZXJzIHJldHVybmVkIGJ5Ci0gICAgLy8gcmVxdWVzdEJ1ZmZlcnMgd2hlbiBhIHdpdGggYW5kIGhlaWdodCBvZiB6ZXJvIGlzIHJlcXVlc3RlZC4KLSAgICBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyU2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKLQotICAgIC8vIHNldEJ1ZmZlckNvdW50U2VydmVyIHNldCB0aGUgYnVmZmVyIGNvdW50LiBJZiB0aGUgY2xpZW50IGhhcyByZXF1ZXN0ZWQKLSAgICAvLyBhIGJ1ZmZlciBjb3VudCB1c2luZyBzZXRCdWZmZXJDb3VudCwgdGhlIHNlcnZlci1idWZmZXIgY291bnQgd2lsbAotICAgIC8vIHRha2UgZWZmZWN0IG9uY2UgdGhlIGNsaWVudCBzZXRzIHRoZSBjb3VudCBiYWNrIHRvIHplcm8uCi0gICAgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnRTZXJ2ZXIoaW50IGJ1ZmZlckNvdW50KTsKLQotICAgIC8vIGlzU3luY2hyb25vdXNNb2RlIHJldHVybnMgd2hldGhlciB0aGUgU3VyZmFjZVRleHR1cmUgaXMgY3VycmVudGx5IGluCi0gICAgLy8gc3luY2hyb25vdXMgbW9kZS4KLSAgICBib29sIGlzU3luY2hyb25vdXNNb2RlKCkgY29uc3Q7Ci0KLSAgICAvLyBzZXRDb25zdW1lck5hbWUgc2V0cyB0aGUgbmFtZSB1c2VkIGluIGxvZ2dpbmcKLSAgICB2b2lkIHNldENvbnN1bWVyTmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKTsKLQotICAgIC8vIHNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgc2V0cyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBub3RpZmllZAotICAgIC8vIHdoZW4gYSBuZXcgZnJhbWUgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgdm9pZCBzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcik7Ci0KLQotcHJpdmF0ZToKLSAgICAvLyBmcmVlQnVmZmVyTG9ja2VkIGZyZWVzIHRoZSByZXNvdXJjZXMgKGJvdGggR3JhcGhpY0J1ZmZlciBhbmQgRUdMSW1hZ2UpCi0gICAgLy8gZm9yIHRoZSBnaXZlbiBzbG90LgotICAgIHZvaWQgZnJlZUJ1ZmZlckxvY2tlZChpbnQgaW5kZXgpOwotCi0gICAgLy8gZnJlZUFsbEJ1ZmZlcnNMb2NrZWQgZnJlZXMgdGhlIHJlc291cmNlcyAoYm90aCBHcmFwaGljQnVmZmVyIGFuZAotICAgIC8vIEVHTEltYWdlKSBmb3IgYWxsIHNsb3RzLgotICAgIHZvaWQgZnJlZUFsbEJ1ZmZlcnNMb2NrZWQoKTsKLQotICAgIC8vIGZyZWVBbGxCdWZmZXJzRXhjZXB0SGVhZExvY2tlZCBmcmVlcyB0aGUgcmVzb3VyY2VzIChib3RoIEdyYXBoaWNCdWZmZXIKLSAgICAvLyBhbmQgRUdMSW1hZ2UpIGZvciBhbGwgc2xvdHMgZXhjZXB0IHRoZSBoZWFkIG9mIG1RdWV1ZQotICAgIHZvaWQgZnJlZUFsbEJ1ZmZlcnNFeGNlcHRIZWFkTG9ja2VkKCk7Ci0KLSAgICAvLyBkcmFpblF1ZXVlTG9ja2VkIGRyYWlucyB0aGUgYnVmZmVyIHF1ZXVlIGlmIHdlJ3JlIGluIHN5bmNocm9ub3VzIG1vZGUKLSAgICAvLyByZXR1cm5zIGltbWVkaWF0ZWx5IG90aGVyd2lzZS4gSXQgcmV0dXJucyBOT19JTklUIGlmIHRoZSBCdWZmZXJRdWV1ZQotICAgIC8vIGJlY2FtZSBhYmFuZG9uZWQgb3IgZGlzY29ubmVjdGVkIGR1cmluZyB0aGlzIGNhbGwuCi0gICAgc3RhdHVzX3QgZHJhaW5RdWV1ZUxvY2tlZCgpOwotCi0gICAgLy8gZHJhaW5RdWV1ZUFuZEZyZWVCdWZmZXJzTG9ja2VkIGRyYWlucyB0aGUgYnVmZmVyIHF1ZXVlIGlmIHdlJ3JlIGluCi0gICAgLy8gc3luY2hyb25vdXMgbW9kZSBhbmQgZnJlZSBhbGwgYnVmZmVycy4gSW4gYXN5bmNocm9ub3VzIG1vZGUsIGFsbCBidWZmZXJzCi0gICAgLy8gYXJlIGZyZWVkIGV4Y2VwdCB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgc3RhdHVzX3QgZHJhaW5RdWV1ZUFuZEZyZWVCdWZmZXJzTG9ja2VkKCk7Ci0KLSAgICBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudFNlcnZlckxvY2tlZChpbnQgYnVmZmVyQ291bnQpOwotCi0gICAgc3RydWN0IEJ1ZmZlclNsb3QgewotCi0gICAgICAgIEJ1ZmZlclNsb3QoKQotICAgICAgICA6IG1FZ2xEaXNwbGF5KEVHTF9OT19ESVNQTEFZKSwKLSAgICAgICAgICBtQnVmZmVyU3RhdGUoQnVmZmVyU2xvdDo6RlJFRSksCi0gICAgICAgICAgbVJlcXVlc3RCdWZmZXJDYWxsZWQoZmFsc2UpLAotICAgICAgICAgIG1UcmFuc2Zvcm0oMCksCi0gICAgICAgICAgbVNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRSksCi0gICAgICAgICAgbVRpbWVzdGFtcCgwKSwKLSAgICAgICAgICBtRnJhbWVOdW1iZXIoMCksCi0gICAgICAgICAgbUZlbmNlKEVHTF9OT19TWU5DX0tIUiksCi0gICAgICAgICAgbUFjcXVpcmVDYWxsZWQoZmFsc2UpIHsKLSAgICAgICAgICAgIG1Dcm9wLm1ha2VJbnZhbGlkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBtR3JhcGhpY0J1ZmZlciBwb2ludHMgdG8gdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIHRoaXMgc2xvdCBvciBpcyBOVUxMCi0gICAgICAgIC8vIGlmIG5vIGJ1ZmZlciBoYXMgYmVlbiBhbGxvY2F0ZWQuCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwotCi0gICAgICAgIC8vIG1FZ2xEaXNwbGF5IGlzIHRoZSBFR0xEaXNwbGF5IHVzZWQgdG8gY3JlYXRlIG1FZ2xJbWFnZS4KLSAgICAgICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLQotICAgICAgICAvLyBCdWZmZXJTdGF0ZSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGluIHdoaWNoIGEgYnVmZmVyIHNsb3QKLSAgICAgICAgLy8gY2FuIGJlLgotICAgICAgICBlbnVtIEJ1ZmZlclN0YXRlIHsKLSAgICAgICAgICAgIC8vIEZSRUUgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBpcyBub3QgY3VycmVudGx5IGJlaW5nIHVzZWQgYW5kCi0gICAgICAgICAgICAvLyB3aWxsIG5vdCBiZSB1c2VkIGluIHRoZSBmdXR1cmUgdW50aWwgaXQgZ2V0cyBkZXF1ZXVlZCBhbmQKLSAgICAgICAgICAgIC8vIHN1YnNlcXVlbnRseSBxdWV1ZWQgYnkgdGhlIGNsaWVudC4KLSAgICAgICAgICAgIC8vIGFrYSAib3duZWQgYnkgQnVmZmVyUXVldWUsIHJlYWR5IHRvIGJlIGRlcXVldWVkIgotICAgICAgICAgICAgRlJFRSA9IDAsCi0KLSAgICAgICAgICAgIC8vIERFUVVFVUVEIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gZGVxdWV1ZWQgYnkgdGhlCi0gICAgICAgICAgICAvLyBjbGllbnQsIGJ1dCBoYXMgbm90IHlldCBiZWVuIHF1ZXVlZCBvciBjYW5jZWxlZC4gVGhlIGJ1ZmZlciBpcwotICAgICAgICAgICAgLy8gY29uc2lkZXJlZCAnb3duZWQnIGJ5IHRoZSBjbGllbnQsIGFuZCB0aGUgc2VydmVyIHNob3VsZCBub3QgdXNlCi0gICAgICAgICAgICAvLyBpdCBmb3IgYW55dGhpbmcuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdoZW4gaW4gc3luY2hyb25vdXMtbW9kZSAobVN5bmNocm9ub3VzTW9kZSA9PSB0cnVlKSwKLSAgICAgICAgICAgIC8vIHRoZSBidWZmZXIgdGhhdCdzIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgdGV4dHVyZSBtYXkgYmUKLSAgICAgICAgICAgIC8vIGRlcXVldWVkIGJ5IHRoZSBjbGllbnQuICBUaGF0IG1lYW5zIHRoYXQgdGhlIGN1cnJlbnQgYnVmZmVyIGNhbgotICAgICAgICAgICAgLy8gYmUgaW4gZWl0aGVyIHRoZSBERVFVRVVFRCBvciBRVUVVRUQgc3RhdGUuICBJbiBhc3luY2hyb25vdXMgbW9kZSwKLSAgICAgICAgICAgIC8vIGhvd2V2ZXIsIHRoZSBjdXJyZW50IGJ1ZmZlciBpcyBhbHdheXMgaW4gdGhlIFFVRVVFRCBzdGF0ZS4KLSAgICAgICAgICAgIC8vIGFrYSAib3duZWQgYnkgcHJvZHVjZXIsIHJlYWR5IHRvIGJlIHF1ZXVlZCIKLSAgICAgICAgICAgIERFUVVFVUVEID0gMSwKLQotICAgICAgICAgICAgLy8gUVVFVUVEIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgaGFzIGJlZW4gcXVldWVkIGJ5IHRoZSBjbGllbnQsCi0gICAgICAgICAgICAvLyBhbmQgaGFzIG5vdCBzaW5jZSBiZWVuIG1hZGUgYXZhaWxhYmxlIGZvciB0aGUgY2xpZW50IHRvIGRlcXVldWUuCi0gICAgICAgICAgICAvLyBBdHRhY2hpbmcgdGhlIGJ1ZmZlciB0byB0aGUgdGV4dHVyZSBkb2VzIE5PVCB0cmFuc2l0aW9uIHRoZQotICAgICAgICAgICAgLy8gYnVmZmVyIGF3YXkgZnJvbSB0aGUgUVVFVUVEIHN0YXRlLiBIb3dldmVyLCBpbiBTeW5jaHJvbm91cyBtb2RlCi0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCBidWZmZXIgbWF5IGJlIGRlcXVldWVkIGJ5IHRoZSBjbGllbnQgdW5kZXIgc29tZQotICAgICAgICAgICAgLy8gY2lyY3Vtc3RhbmNlcy4gU2VlIHRoZSBub3RlIGFib3V0IHRoZSBjdXJyZW50IGJ1ZmZlciBpbiB0aGUKLSAgICAgICAgICAgIC8vIGRvY3VtZW50YXRpb24gZm9yIERFUVVFVUVELgotICAgICAgICAgICAgLy8gYWthICJvd25lZCBieSBCdWZmZXJRdWV1ZSwgcmVhZHkgdG8gYmUgYWNxdWlyZWQiCi0gICAgICAgICAgICBRVUVVRUQgPSAyLAotCi0gICAgICAgICAgICAvLyBha2EgIm93bmVkIGJ5IGNvbnN1bWVyLCByZWFkeSB0byBiZSByZWxlYXNlZCIKLSAgICAgICAgICAgIEFDUVVJUkVEID0gMwotICAgICAgICB9OwotCi0gICAgICAgIC8vIG1CdWZmZXJTdGF0ZSBpcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIGJ1ZmZlciBzbG90LgotICAgICAgICBCdWZmZXJTdGF0ZSBtQnVmZmVyU3RhdGU7Ci0KLSAgICAgICAgLy8gbVJlcXVlc3RCdWZmZXJDYWxsZWQgaXMgdXNlZCBmb3IgdmFsaWRhdGluZyB0aGF0IHRoZSBjbGllbnQgZGlkCi0gICAgICAgIC8vIGNhbGwgcmVxdWVzdEJ1ZmZlcigpIHdoZW4gdG9sZCB0byBkbyBzby4gVGVjaG5pY2FsbHkgdGhpcyBpcyBub3QKLSAgICAgICAgLy8gbmVlZGVkIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgY2F0Y2hpbmcgY2xpZW50IGJ1Z3MuCi0gICAgICAgIGJvb2wgbVJlcXVlc3RCdWZmZXJDYWxsZWQ7Ci0KLSAgICAgICAgLy8gbUNyb3AgaXMgdGhlIGN1cnJlbnQgY3JvcCByZWN0YW5nbGUgZm9yIHRoaXMgYnVmZmVyIHNsb3QuIFRoaXMgZ2V0cwotICAgICAgICAvLyBzZXQgdG8gbU5leHRDcm9wIGVhY2ggdGltZSBxdWV1ZUJ1ZmZlciBnZXRzIGNhbGxlZCBmb3IgdGhpcyBidWZmZXIuCi0gICAgICAgIFJlY3QgbUNyb3A7Ci0KLSAgICAgICAgLy8gbVRyYW5zZm9ybSBpcyB0aGUgY3VycmVudCB0cmFuc2Zvcm0gZmxhZ3MgZm9yIHRoaXMgYnVmZmVyIHNsb3QuIFRoaXMKLSAgICAgICAgLy8gZ2V0cyBzZXQgdG8gbU5leHRUcmFuc2Zvcm0gZWFjaCB0aW1lIHF1ZXVlQnVmZmVyIGdldHMgY2FsbGVkIGZvciB0aGlzCi0gICAgICAgIC8vIHNsb3QuCi0gICAgICAgIHVpbnQzMl90IG1UcmFuc2Zvcm07Ci0KLSAgICAgICAgLy8gbVNjYWxpbmdNb2RlIGlzIHRoZSBjdXJyZW50IHNjYWxpbmcgbW9kZSBmb3IgdGhpcyBidWZmZXIgc2xvdC4gVGhpcwotICAgICAgICAvLyBnZXRzIHNldCB0byBtTmV4dFNjYWxpbmdNb2RlIGVhY2ggdGltZSBxdWV1ZUJ1ZmZlciBnZXRzIGNhbGxlZCBmb3IKLSAgICAgICAgLy8gdGhpcyBzbG90LgotICAgICAgICB1aW50MzJfdCBtU2NhbGluZ01vZGU7Ci0KLSAgICAgICAgLy8gbVRpbWVzdGFtcCBpcyB0aGUgY3VycmVudCB0aW1lc3RhbXAgZm9yIHRoaXMgYnVmZmVyIHNsb3QuIFRoaXMgZ2V0cwotICAgICAgICAvLyB0byBzZXQgYnkgcXVldWVCdWZmZXIgZWFjaCB0aW1lIHRoaXMgc2xvdCBpcyBxdWV1ZWQuCi0gICAgICAgIGludDY0X3QgbVRpbWVzdGFtcDsKLQotICAgICAgICAvLyBtRnJhbWVOdW1iZXIgaXMgdGhlIG51bWJlciBvZiB0aGUgcXVldWVkIGZyYW1lIGZvciB0aGlzIHNsb3QuCi0gICAgICAgIHVpbnQ2NF90IG1GcmFtZU51bWJlcjsKLQotICAgICAgICAvLyBtRmVuY2UgaXMgdGhlIEVHTCBzeW5jIG9iamVjdCB0aGF0IG11c3Qgc2lnbmFsIGJlZm9yZSB0aGUgYnVmZmVyCi0gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlciBzbG90IG1heSBiZSBkZXF1ZXVlZC4gSXQgaXMgaW5pdGlhbGl6ZWQKLSAgICAgICAgLy8gdG8gRUdMX05PX1NZTkNfS0hSIHdoZW4gdGhlIGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCAob3B0aW9uYWxseSwgYmFzZWQKLSAgICAgICAgLy8gb24gYSBjb21waWxlLXRpbWUgb3B0aW9uKSBzZXQgdG8gYSBuZXcgc3luYyBvYmplY3QgaW4gdXBkYXRlVGV4SW1hZ2UuCi0gICAgICAgIEVHTFN5bmNLSFIgbUZlbmNlOwotCi0gICAgICAgIC8vIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgYnVmZmVyIGhhcyBiZWVuIHNlZW4gYnkgYSBjb25zdW1lciB5ZXQKLSAgICAgICAgYm9vbCBtQWNxdWlyZUNhbGxlZDsKLSAgICB9OwotCi0gICAgLy8gbVNsb3RzIGlzIHRoZSBhcnJheSBvZiBidWZmZXIgc2xvdHMgdGhhdCBtdXN0IGJlIG1pcnJvcmVkIG9uIHRoZSBjbGllbnQKLSAgICAvLyBzaWRlLiBUaGlzIGFsbG93cyBidWZmZXIgb3duZXJzaGlwIHRvIGJlIHRyYW5zZmVycmVkIGJldHdlZW4gdGhlIGNsaWVudAotICAgIC8vIGFuZCBzZXJ2ZXIgd2l0aG91dCBzZW5kaW5nIGEgR3JhcGhpY0J1ZmZlciBvdmVyIGJpbmRlci4gVGhlIGVudGlyZSBhcnJheQotICAgIC8vIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgYXQgY29uc3RydWN0aW9uIHRpbWUsIGFuZCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQKLSAgICAvLyBmb3IgYSBzbG90IHdoZW4gcmVxdWVzdEJ1ZmZlciBpcyBjYWxsZWQgd2l0aCB0aGF0IHNsb3QncyBpbmRleC4KLSAgICBCdWZmZXJTbG90IG1TbG90c1tOVU1fQlVGRkVSX1NMT1RTXTsKLQotICAgIC8vIG1EZWZhdWx0V2lkdGggaG9sZHMgdGhlIGRlZmF1bHQgd2lkdGggb2YgYWxsb2NhdGVkIGJ1ZmZlcnMuIEl0IGlzIHVzZWQKLSAgICAvLyBpbiByZXF1ZXN0QnVmZmVycygpIGlmIGEgd2lkdGggYW5kIGhlaWdodCBvZiB6ZXJvIGlzIHNwZWNpZmllZC4KLSAgICB1aW50MzJfdCBtRGVmYXVsdFdpZHRoOwotCi0gICAgLy8gbURlZmF1bHRIZWlnaHQgaG9sZHMgdGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGFsbG9jYXRlZCBidWZmZXJzLiBJdCBpcyB1c2VkCi0gICAgLy8gaW4gcmVxdWVzdEJ1ZmZlcnMoKSBpZiBhIHdpZHRoIGFuZCBoZWlnaHQgb2YgemVybyBpcyBzcGVjaWZpZWQuCi0gICAgdWludDMyX3QgbURlZmF1bHRIZWlnaHQ7Ci0KLSAgICAvLyBtUGl4ZWxGb3JtYXQgaG9sZHMgdGhlIHBpeGVsIGZvcm1hdCBvZiBhbGxvY2F0ZWQgYnVmZmVycy4gSXQgaXMgdXNlZAotICAgIC8vIGluIHJlcXVlc3RCdWZmZXJzKCkgaWYgYSBmb3JtYXQgb2YgemVybyBpcyBzcGVjaWZpZWQuCi0gICAgdWludDMyX3QgbVBpeGVsRm9ybWF0OwotCi0gICAgLy8gbUJ1ZmZlckNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVyIHNsb3RzIHRoYXQgdGhlIGNsaWVudCBhbmQgc2VydmVyCi0gICAgLy8gbXVzdCBtYWludGFpbi4gSXQgZGVmYXVsdHMgdG8gTUlOX0FTWU5DX0JVRkZFUl9TTE9UUyBhbmQgY2FuIGJlIGNoYW5nZWQKLSAgICAvLyBieSBjYWxsaW5nIHNldEJ1ZmZlckNvdW50IG9yIHNldEJ1ZmZlckNvdW50U2VydmVyCi0gICAgaW50IG1CdWZmZXJDb3VudDsKLQotICAgIC8vIG1DbGllbnRCdWZmZXJDb3VudCBpcyB0aGUgbnVtYmVyIG9mIGJ1ZmZlciBzbG90cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4KLSAgICAvLyBUaGUgZGVmYXVsdCBpcyB6ZXJvLCB3aGljaCBtZWFucyB0aGUgY2xpZW50IGRvZXNuJ3QgY2FyZSBob3cgbWFueSBidWZmZXJzCi0gICAgLy8gdGhlcmUgaXMuCi0gICAgaW50IG1DbGllbnRCdWZmZXJDb3VudDsKLQotICAgIC8vIG1TZXJ2ZXJCdWZmZXJDb3VudCBidWZmZXIgY291bnQgcmVxdWVzdGVkIGJ5IHRoZSBzZXJ2ZXItc2lkZQotICAgIGludCBtU2VydmVyQnVmZmVyQ291bnQ7Ci0KLSAgICAvLyBtTmV4dENyb3AgaXMgdGhlIGNyb3AgcmVjdGFuZ2xlIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbmV4dCBidWZmZXIKLSAgICAvLyB0aGF0IGdldHMgcXVldWVkLiBJdCBpcyBzZXQgYnkgY2FsbGluZyBzZXRDcm9wLgotICAgIFJlY3QgbU5leHRDcm9wOwotCi0gICAgLy8gbU5leHRUcmFuc2Zvcm0gaXMgdGhlIHRyYW5zZm9ybSBpZGVudGlmaWVyIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgbmV4dAotICAgIC8vIGJ1ZmZlciB0aGF0IGdldHMgcXVldWVkLiBJdCBpcyBzZXQgYnkgY2FsbGluZyBzZXRUcmFuc2Zvcm0uCi0gICAgdWludDMyX3QgbU5leHRUcmFuc2Zvcm07Ci0KLSAgICAvLyBtTmV4dFNjYWxpbmdNb2RlIGlzIHRoZSBzY2FsaW5nIG1vZGUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBuZXh0Ci0gICAgLy8gYnVmZmVycyB0aGF0IGdldCBxdWV1ZWQuIEl0IGlzIHNldCBieSBjYWxsaW5nIHNldFNjYWxpbmdNb2RlLgotICAgIGludCBtTmV4dFNjYWxpbmdNb2RlOwotCi0gICAgLy8gbUdyYXBoaWNCdWZmZXJBbGxvYyBpcyB0aGUgY29ubmVjdGlvbiB0byBTdXJmYWNlRmxpbmdlciB0aGF0IGlzIHVzZWQgdG8KLSAgICAvLyBhbGxvY2F0ZSBuZXcgR3JhcGhpY0J1ZmZlciBvYmplY3RzLgotICAgIHNwPElHcmFwaGljQnVmZmVyQWxsb2M+IG1HcmFwaGljQnVmZmVyQWxsb2M7Ci0KLSAgICAvLyBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lciBpcyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhCi0gICAgLy8gbmV3IGZyYW1lIGJlY29tZXMgYXZhaWxhYmxlLiBJZiBpdCBpcyBub3QgTlVMTCBpdCB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gICAgLy8gcXVldWVCdWZmZXIuCi0gICAgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7Ci0KLSAgICAvLyBtU3luY2hyb25vdXNNb2RlIHdoZXRoZXIgd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZSBvciBub3QKLSAgICBib29sIG1TeW5jaHJvbm91c01vZGU7Ci0KLSAgICAvLyBtQWxsb3dTeW5jaHJvbm91c01vZGUgd2hldGhlciB3ZSBhbGxvdyBzeW5jaHJvbm91cyBtb2RlIG9yIG5vdAotICAgIGNvbnN0IGJvb2wgbUFsbG93U3luY2hyb25vdXNNb2RlOwotCi0gICAgLy8gbUNvbm5lY3RlZEFwaSBpbmRpY2F0ZXMgdGhlIEFQSSB0aGF0IGlzIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhpcwotICAgIC8vIEJ1ZmZlclF1ZXVlLiAgSXQgZGVmYXVsdHMgdG8gTk9fQ09OTkVDVEVEX0FQSSAoPSAwKSwgYW5kIGdldHMgdXBkYXRlZAotICAgIC8vIGJ5IHRoZSBjb25uZWN0IGFuZCBkaXNjb25uZWN0IG1ldGhvZHMuCi0gICAgaW50IG1Db25uZWN0ZWRBcGk7Ci0KLSAgICAvLyBtRGVxdWV1ZUNvbmRpdGlvbiBjb25kaXRpb24gdXNlZCBmb3IgZGVxdWV1ZUJ1ZmZlciBpbiBzeW5jaHJvbm91cyBtb2RlCi0gICAgbXV0YWJsZSBDb25kaXRpb24gbURlcXVldWVDb25kaXRpb247Ci0KLSAgICAvLyBtUXVldWUgaXMgYSBGSUZPIG9mIHF1ZXVlZCBidWZmZXJzIHVzZWQgaW4gc3luY2hyb25vdXMgbW9kZQotICAgIHR5cGVkZWYgVmVjdG9yPGludD4gRmlmbzsKLSAgICBGaWZvIG1RdWV1ZTsKLQotICAgIC8vIG1BYmFuZG9uZWQgaW5kaWNhdGVzIHRoYXQgdGhlIEJ1ZmZlclF1ZXVlIHdpbGwgbm8gbG9uZ2VyIGJlIHVzZWQgdG8KLSAgICAvLyBjb25zdW1lIGltYWdlcyBidWZmZXJzIHB1c2hlZCB0byBpdCB1c2luZyB0aGUgSVN1cmZhY2VUZXh0dXJlIGludGVyZmFjZS4KLSAgICAvLyBJdCBpcyBpbml0aWFsaXplZCB0byBmYWxzZSwgYW5kIHNldCB0byB0cnVlIGluIHRoZSBhYmFuZG9uIG1ldGhvZC4gIEEKLSAgICAvLyBCdWZmZXJRdWV1ZSB0aGF0IGhhcyBiZWVuIGFiYW5kb25lZCB3aWxsIHJldHVybiB0aGUgTk9fSU5JVCBlcnJvciBmcm9tCi0gICAgLy8gYWxsIElTdXJmYWNlVGV4dHVyZSBtZXRob2RzIGNhcGFibGUgb2YgcmV0dXJuaW5nIGFuIGVycm9yLgotICAgIGJvb2wgbUFiYW5kb25lZDsKLQotICAgIC8vIG1OYW1lIGlzIGEgc3RyaW5nIHVzZWQgdG8gaWRlbnRpZnkgdGhlIEJ1ZmZlclF1ZXVlIGluIGxvZyBtZXNzYWdlcy4KLSAgICAvLyBJdCBpcyBzZXQgYnkgdGhlIHNldE5hbWUgbWV0aG9kLgotICAgIFN0cmluZzggbUNvbnN1bWVyTmFtZTsKLQotICAgIC8vIG1NdXRleCBpcyB0aGUgbXV0ZXggdXNlZCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBtZW1iZXIKLSAgICAvLyB2YXJpYWJsZXMgb2YgQnVmZmVyUXVldWUgb2JqZWN0cy4gSXQgbXVzdCBiZSBsb2NrZWQgd2hlbmV2ZXIgdGhlCi0gICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQuCi0gICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7Ci0KLSAgICAvLyBtRnJhbWVDb3VudGVyIGlzIHRoZSBmcmVlIHJ1bm5pbmcgY291bnRlciwgaW5jcmVtZW50ZWQgZm9yIGV2ZXJ5IGJ1ZmZlciBxdWV1ZWQKLSAgICAvLyB3aXRoIHRoZSBzdXJmYWNlIFRleHR1cmUuCi0gICAgdWludDY0X3QgbUZyYW1lQ291bnRlcjsKLQotICAgIGJvb2wgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HVUlfQlVGRkVSUVVFVUVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaCBiL2luY2x1ZGUvZ3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiY2E4ZDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9ESVNQTEFZX0VWRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfRElTUExBWV9FVkVOVF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJpdFR1YmU7Ci1jbGFzcyBJRGlzcGxheUV2ZW50Q29ubmVjdGlvbjsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBEaXNwbGF5RXZlbnRSZWNlaXZlciB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIERJU1BMQVlfRVZFTlRfVlNZTkMgPSAndnN5bicKLSAgICB9OwotCi0gICAgc3RydWN0IEV2ZW50IHsKLQotICAgICAgICBzdHJ1Y3QgSGVhZGVyIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcDsKLSAgICAgICAgfTsKLQotICAgICAgICBzdHJ1Y3QgVlN5bmMgewotICAgICAgICAgICAgdWludDMyX3QgY291bnQ7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgSGVhZGVyIGhlYWRlcjsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgVlN5bmMgdnN5bmM7Ci0gICAgICAgIH07Ci0gICAgfTsKLQotcHVibGljOgotICAgIC8qCi0gICAgICogRGlzcGxheUV2ZW50UmVjZWl2ZXIgY3JlYXRlcyBhbmQgcmVnaXN0ZXJzIGFuIGV2ZW50IGNvbm5lY3Rpb24gd2l0aAotICAgICAqIFN1cmZhY2VGbGluZ2VyLiBWU3luYyBldmVudHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuIENhbGwgc2V0VlN5bmNSYXRlCi0gICAgICogb3IgcmVxdWVzdE5leHRWc3luYyB0byByZWNlaXZlIHRoZW0uCi0gICAgICogT3RoZXIgZXZlbnRzIHN0YXJ0IGJlaW5nIGRlbGl2ZXJlZCBpbW1lZGlhdGVseS4KLSAgICAgKi8KLSAgICBEaXNwbGF5RXZlbnRSZWNlaXZlcigpOwotCi0gICAgLyoKLSAgICAgKiB+RGlzcGxheUV2ZW50UmVjZWl2ZXIgc2V2ZXJzIHRoZSBjb25uZWN0aW9uIHdpdGggU3VyZmFjZUZsaW5nZXIsIG5ldyBldmVudHMKLSAgICAgKiBzdG9wIGJlaW5nIGRlbGl2ZXJlZCBpbW1lZGlhdGVseS4gTm90ZSB0aGF0IHRoZSBxdWV1ZSBjb3VsZCBoYXZlCi0gICAgICogc29tZSBldmVudHMgcGVuZGluZy4gVGhlc2Ugd2lsbCBiZSBkZWxpdmVyZWQuCi0gICAgICovCi0gICAgfkRpc3BsYXlFdmVudFJlY2VpdmVyKCk7Ci0KLSAgICAvKgotICAgICAqIGluaXRDaGVjayByZXR1cm5zIHRoZSBzdGF0ZSBvZiBEaXNwbGF5RXZlbnRSZWNlaXZlciBhZnRlciBjb25zdHJ1Y3Rpb24uCi0gICAgICovCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIGdldEZkIHJldHVybnMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB1c2UgdG8gcmVjZWl2ZSBldmVudHMuCi0gICAgICogT1dORVJTSElQIElTIFJFVEFJTkVEIGJ5IERpc3BsYXlFdmVudFJlY2VpdmVyLiBETyBOT1QgQ0xPU0UgdGhpcwotICAgICAqIGZpbGUtZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RmQoKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogZ2V0RXZlbnRzIHJlYWRzIGV2ZW50IGZyb20gdGhlIHF1ZXVlIGFuZCByZXR1cm5zIGhvdyBtYW55IGV2ZW50cyB3ZXJlCi0gICAgICogcmVhZC4gUmV0dXJucyAwIGlmIHRoZXJlIGFyZSBubyBtb3JlIGV2ZW50cyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gICAgICogSWYgTk9UX0VOT1VHSF9EQVRBIGlzIHJldHVybmVkLCB0aGUgb2JqZWN0IGhhcyBiZWNvbWUgaW52YWxpZCBmb3JldmVyLCBpdAotICAgICAqIHNob3VsZCBiZSBkZXN0cm95ZWQgYW5kIGdldEV2ZW50cygpIHNob3VsZG4ndCBiZSBjYWxsZWQgYWdhaW4uCi0gICAgICovCi0gICAgc3NpemVfdCBnZXRFdmVudHMoRXZlbnQqIGV2ZW50cywgc2l6ZV90IGNvdW50KTsKLSAgICBzdGF0aWMgc3NpemVfdCBnZXRFdmVudHMoY29uc3Qgc3A8Qml0VHViZT4mIGRhdGFDaGFubmVsLAotICAgICAgICAgICAgRXZlbnQqIGV2ZW50cywgc2l6ZV90IGNvdW50KTsKLQotICAgIC8qCi0gICAgICogc2V0VnN5bmNSYXRlKCkgc2V0cyB0aGUgRXZlbnQ6OlZTeW5jIGRlbGl2ZXJ5IHJhdGUuIEEgdmFsdWUgb2YKLSAgICAgKiAxIHJldHVybnMgZXZlcnkgRXZlbnQ6OlZTeW5jLiBBIHZhbHVlIG9mIDIgcmV0dXJucyBldmVyeSBvdGhlciBldmVudCwKLSAgICAgKiBldGMuLi4gYSB2YWx1ZSBvZiAwIHJldHVybnMgbm8gZXZlbnQgdW5sZXNzICByZXF1ZXN0TmV4dFZzeW5jKCkgaGFzCi0gICAgICogYmVlbiBjYWxsZWQuCi0gICAgICovCi0gICAgc3RhdHVzX3Qgc2V0VnN5bmNSYXRlKHVpbnQzMl90IGNvdW50KTsKLQotICAgIC8qCi0gICAgICogcmVxdWVzdE5leHRWc3luYygpIHNjaGVkdWxlcyB0aGUgbmV4dCBFdmVudDo6VlN5bmMuIEl0IGhhcyBubyBlZmZlY3QKLSAgICAgKiBpZiB0aGUgdnN5bmMgcmF0ZSBpcyA+IDAuCi0gICAgICovCi0gICAgc3RhdHVzX3QgcmVxdWVzdE5leHRWc3luYygpOwotCi1wcml2YXRlOgotICAgIHNwPElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiBtRXZlbnRDb25uZWN0aW9uOwotICAgIHNwPEJpdFR1YmU+IG1EYXRhQ2hhbm5lbDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9ESVNQTEFZX0VWRU5UX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmggYi9pbmNsdWRlL2d1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjI0N2RlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JRElTUExBWV9FVkVOVF9DT05ORUNUSU9OX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfSURJU1BMQVlfRVZFTlRfQ09OTkVDVElPTl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQml0VHViZTsKLQotY2xhc3MgSURpc3BsYXlFdmVudENvbm5lY3Rpb24gOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShEaXNwbGF5RXZlbnRDb25uZWN0aW9uKTsKLQotICAgIC8qCi0gICAgICogZ2V0RGF0YUNoYW5uZWwoKSByZXR1cm5zIGEgQml0VHViZSB3aGVyZSB0byByZWNlaXZlIHRoZSBldmVudHMgZnJvbQotICAgICAqLwotICAgIHZpcnR1YWwgc3A8Qml0VHViZT4gZ2V0RGF0YUNoYW5uZWwoKSBjb25zdCA9IDA7Ci0KLSAgICAvKgotICAgICAqIHNldFZzeW5jUmF0ZSgpIHNldHMgdGhlIHZzeW5jIGV2ZW50IGRlbGl2ZXJ5IHJhdGUuIEEgdmFsdWUgb2YKLSAgICAgKiAxIHJldHVybnMgZXZlcnkgdnN5bmMgZXZlbnRzLiBBIHZhbHVlIG9mIDIgcmV0dXJucyBldmVyeSBvdGhlciBldmVudHMsCi0gICAgICogZXRjLi4uIGEgdmFsdWUgb2YgMCByZXR1cm5zIG5vIGV2ZW50IHVubGVzcyAgcmVxdWVzdE5leHRWc3luYygpIGhhcwotICAgICAqIGJlZW4gY2FsbGVkLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBzZXRWc3luY1JhdGUodWludDMyX3QgY291bnQpID0gMDsKLQotICAgIC8qCi0gICAgICogcmVxdWVzdE5leHRWc3luYygpIHNjaGVkdWxlcyB0aGUgbmV4dCB2c3luYyBldmVudC4gSXQgaGFzIG5vIGVmZmVjdAotICAgICAqIGlmIHRoZSB2c3luYyByYXRlIGlzID4gMC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgcmVxdWVzdE5leHRWc3luYygpID0gMDsgICAgLy8gYXN5bmNocm9ub3VzCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuRGlzcGxheUV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBCbkludGVyZmFjZTxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JRElTUExBWV9FVkVOVF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaCBiL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlNDFkOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JR1JBUEhJQ19CVUZGRVJfQUxMT0NfSAotI2RlZmluZSBBTkRST0lEX0dVSV9JR1JBUEhJQ19CVUZGRVJfQUxMT0NfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEdyYXBoaWNCdWZmZXI7Ci0KLWNsYXNzIElHcmFwaGljQnVmZmVyQWxsb2MgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoR3JhcGhpY0J1ZmZlckFsbG9jKTsKLQotICAgIC8qIENyZWF0ZSBhIG5ldyBHcmFwaGljQnVmZmVyIGZvciB0aGUgY2xpZW50IHRvIHVzZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIHN0YXR1c190KiBlcnJvcikgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCbkdyYXBoaWNCdWZmZXJBbGxvYyA6IHB1YmxpYyBCbkludGVyZmFjZTxJR3JhcGhpY0J1ZmZlckFsbG9jPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HVUlfSUdSQVBISUNfQlVGRkVSX0FMTE9DX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uaCBiL2luY2x1ZGUvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5MDY1ZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JU0VOU09SX0VWRU5UX0NPTk5FQ1RJT05fSAotI2RlZmluZSBBTkRST0lEX0dVSV9JU0VOU09SX0VWRU5UX0NPTk5FQ1RJT05fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJpdFR1YmU7Ci0KLWNsYXNzIElTZW5zb3JFdmVudENvbm5lY3Rpb24gOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU2Vuc29yRXZlbnRDb25uZWN0aW9uKTsKLQotICAgIHZpcnR1YWwgc3A8Qml0VHViZT4gZ2V0U2Vuc29yQ2hhbm5lbCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZURpc2FibGUoaW50IGhhbmRsZSwgYm9vbCBlbmFibGVkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFdmVudFJhdGUoaW50IGhhbmRsZSwgbnNlY3NfdCBucykgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblNlbnNvckV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBCbkludGVyZmFjZTxJU2Vuc29yRXZlbnRDb25uZWN0aW9uPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfR1VJX0lTRU5TT1JfRVZFTlRfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9JU2Vuc29yU2VydmVyLmggYi9pbmNsdWRlL2d1aS9JU2Vuc29yU2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOGFmYzUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvSVNlbnNvclNlcnZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfSVNFTlNPUlNFUlZFUl9ICi0jZGVmaW5lIEFORFJPSURfR1VJX0lTRU5TT1JTRVJWRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNlbnNvcjsKLWNsYXNzIElTZW5zb3JFdmVudENvbm5lY3Rpb247Ci0KLWNsYXNzIElTZW5zb3JTZXJ2ZXIgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU2Vuc29yU2VydmVyKTsKLQotICAgIHZpcnR1YWwgVmVjdG9yPFNlbnNvcj4gZ2V0U2Vuc29yTGlzdCgpID0gMDsKLSAgICB2aXJ0dWFsIHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+IGNyZWF0ZVNlbnNvckV2ZW50Q29ubmVjdGlvbigpID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5TZW5zb3JTZXJ2ZXIgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SVNlbnNvclNlcnZlcj4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JU0VOU09SU0VSVkVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lTdXJmYWNlLmggYi9pbmNsdWRlL2d1aS9JU3VyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZmOWZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0lTdXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JU1VSRkFDRV9ICi0jZGVmaW5lIEFORFJPSURfR1VJX0lTVVJGQUNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdHlwZWRlZiBpbnQzMl90ICAgIFN1cmZhY2VJRDsKLQotY2xhc3MgSVN1cmZhY2VUZXh0dXJlOwotCi1jbGFzcyBJU3VyZmFjZSA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wcm90ZWN0ZWQ6Ci0gICAgZW51bSB7Ci0gICAgICAgIEdFVF9TVVJGQUNFX1RFWFRVUkUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIH07Ci0KLXB1YmxpYzogCi0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTdXJmYWNlKTsKLQotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VUZXh0dXJlPiBnZXRTdXJmYWNlVGV4dHVyZSgpIGNvbnN0ID0gMDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQm5TdXJmYWNlIDogcHVibGljIEJuSW50ZXJmYWNlPElTdXJmYWNlPgotewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HVUlfSVNVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSVN1cmZhY2VDb21wb3Nlci5oIGIvaW5jbHVkZS9ndWkvSVN1cmZhY2VDb21wb3Nlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2MwZWNiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JU1VSRkFDRV9DT01QT1NFUl9ICi0jZGVmaW5lIEFORFJPSURfR1VJX0lTVVJGQUNFX0NPTVBPU0VSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ29tcG9zZXJTdGF0ZTsKLWNsYXNzIElEaXNwbGF5RXZlbnRDb25uZWN0aW9uOwotY2xhc3MgSU1lbW9yeUhlYXA7Ci0KLWNsYXNzIElTdXJmYWNlQ29tcG9zZXIgOiBwdWJsaWMgSUludGVyZmFjZQotewotcHVibGljOgotICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoU3VyZmFjZUNvbXBvc2VyKTsKLQotICAgIGVudW0geyAvLyAoa2VlcCBpbiBzeW5jIHdpdGggU3VyZmFjZS5qYXZhKQotICAgICAgICBlSGlkZGVuICAgICAgICAgICAgID0gMHgwMDAwMDAwNCwKLSAgICAgICAgZURlc3Ryb3lCYWNrYnVmZmVyICA9IDB4MDAwMDAwMjAsCi0gICAgICAgIGVTZWN1cmUgICAgICAgICAgICAgPSAweDAwMDAwMDgwLAotICAgICAgICBlTm9uUHJlbXVsdGlwbGllZCAgID0gMHgwMDAwMDEwMCwKLSAgICAgICAgZU9wYXF1ZSAgICAgICAgICAgICA9IDB4MDAwMDA0MDAsCi0gICAgICAgIGVQcm90ZWN0ZWRCeUFwcCAgICAgPSAweDAwMDAwODAwLAotICAgICAgICBlUHJvdGVjdGVkQnlEUk0gICAgID0gMHgwMDAwMTAwMCwKLQotICAgICAgICBlRlhTdXJmYWNlTm9ybWFsICAgID0gMHgwMDAwMDAwMCwKLSAgICAgICAgZUZYU3VyZmFjZUJsdXIgICAgICA9IDB4MDAwMTAwMDAsCi0gICAgICAgIGVGWFN1cmZhY2VEaW0gICAgICAgPSAweDAwMDIwMDAwLAotICAgICAgICBlRlhTdXJmYWNlU2NyZWVuc2hvdD0gMHgwMDAzMDAwMCwKLSAgICAgICAgZUZYU3VyZmFjZU1hc2sgICAgICA9IDB4MDAwRjAwMDAsCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAgICBlUG9zaXRpb25DaGFuZ2VkICAgICAgICAgICAgPSAweDAwMDAwMDAxLAotICAgICAgICBlTGF5ZXJDaGFuZ2VkICAgICAgICAgICAgICAgPSAweDAwMDAwMDAyLAotICAgICAgICBlU2l6ZUNoYW5nZWQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0LAotICAgICAgICBlQWxwaGFDaGFuZ2VkICAgICAgICAgICAgICAgPSAweDAwMDAwMDA4LAotICAgICAgICBlTWF0cml4Q2hhbmdlZCAgICAgICAgICAgICAgPSAweDAwMDAwMDEwLAotICAgICAgICBlVHJhbnNwYXJlbnRSZWdpb25DaGFuZ2VkICAgPSAweDAwMDAwMDIwLAotICAgICAgICBlVmlzaWJpbGl0eUNoYW5nZWQgICAgICAgICAgPSAweDAwMDAwMDQwLAotICAgICAgICBlRnJlZXplVGludENoYW5nZWQgICAgICAgICAgPSAweDAwMDAwMDgwLAotICAgIH07Ci0KLSAgICBlbnVtIHsKLSAgICAgICAgZUxheWVySGlkZGVuICAgICAgICA9IDB4MDEsCi0gICAgICAgIGVMYXllckZyb3plbiAgICAgICAgPSAweDAyLAotICAgICAgICBlTGF5ZXJEaXRoZXIgICAgICAgID0gMHgwNCwKLSAgICAgICAgZUxheWVyRmlsdGVyICAgICAgICA9IDB4MDgsCi0gICAgICAgIGVMYXllckJsdXJGcmVlemUgICAgPSAweDEwCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAgICBlT3JpZW50YXRpb25EZWZhdWx0ICAgICA9IDAsCi0gICAgICAgIGVPcmllbnRhdGlvbjkwICAgICAgICAgID0gMSwKLSAgICAgICAgZU9yaWVudGF0aW9uMTgwICAgICAgICAgPSAyLAotICAgICAgICBlT3JpZW50YXRpb24yNzAgICAgICAgICA9IDMsCi0gICAgICAgIGVPcmllbnRhdGlvblVuY2hhbmdlZCAgID0gNCwKLSAgICAgICAgZU9yaWVudGF0aW9uU3dhcE1hc2sgICAgPSAweDAxCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAgICBlU3luY2hyb25vdXMgICAgICAgICAgICA9IDB4MDEsCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAgICBlRWxlY3Ryb25CZWFtQW5pbWF0aW9uT24gID0gMHgwMSwKLSAgICAgICAgZUVsZWN0cm9uQmVhbUFuaW1hdGlvbk9mZiA9IDB4MTAKLSAgICB9OwotCi0gICAgLyogY3JlYXRlIGNvbm5lY3Rpb24gd2l0aCBzdXJmYWNlIGZsaW5nZXIsIHJlcXVpcmVzCi0gICAgICogQUNDRVNTX1NVUkZBQ0VfRkxJTkdFUiBwZXJtaXNzaW9uCi0gICAgICovCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjcmVhdGVDb25uZWN0aW9uKCkgPSAwOwotCi0gICAgLyogY3JlYXRlIGEgZ3JhcGhpYyBidWZmZXIgYWxsb2NhdG9yCi0gICAgICovCi0gICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlckFsbG9jPiBjcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKSA9IDA7Ci0KLSAgICAvKiByZXRyaWV2ZSB0aGUgY29udHJvbCBibG9jayAqLwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+IGdldENibGsoKSBjb25zdCA9IDA7Ci0KLSAgICAvKiBvcGVuL2Nsb3NlIHRyYW5zYWN0aW9ucy4gcmVxdWlyZXMgQUNDRVNTX1NVUkZBQ0VfRkxJTkdFUiBwZXJtaXNzaW9uICovCi0gICAgdmlydHVhbCB2b2lkIHNldFRyYW5zYWN0aW9uU3RhdGUoY29uc3QgVmVjdG9yPENvbXBvc2VyU3RhdGU+JiBzdGF0ZSwKLSAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpID0gMDsKLQotICAgIC8qIHNpZ25hbCB0aGF0IHdlJ3JlIGRvbmUgYm9vdGluZy4KLSAgICAgKiBSZXF1aXJlcyBBQ0NFU1NfU1VSRkFDRV9GTElOR0VSIHBlcm1pc3Npb24KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgYm9vdEZpbmlzaGVkKCkgPSAwOwotCi0gICAgLyogQ2FwdHVyZSB0aGUgc3BlY2lmaWVkIHNjcmVlbi4gcmVxdWlyZXMgUkVBRF9GUkFNRV9CVUZGRVIgcGVybWlzc2lvbgotICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsIGlmIHRoZXJlIGlzIGEgc2VjdXJlIHdpbmRvdyBvbiBzY3JlZW4uCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlU2NyZWVuKERpc3BsYXlJRCBkcHksCi0gICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4qIGhlYXAsCi0gICAgICAgICAgICB1aW50MzJfdCogd2lkdGgsIHVpbnQzMl90KiBoZWlnaHQsIFBpeGVsRm9ybWF0KiBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCByZXFXaWR0aCwgdWludDMyX3QgcmVxSGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaLCB1aW50MzJfdCBtYXhMYXllclopID0gMDsKLQotICAgIC8qIHRyaWdnZXJzIHNjcmVlbiBvZmYgYW5pbWF0aW9uICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuRWxlY3Ryb25CZWFtT2ZmKGludDMyX3QgbW9kZSkgPSAwOwotCi0gICAgLyogdHJpZ2dlcnMgc2NyZWVuIG9uIGFuaW1hdGlvbiAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdHVybkVsZWN0cm9uQmVhbU9uKGludDMyX3QgbW9kZSkgPSAwOwotCi0gICAgLyogdmVyaWZ5IHRoYXQgYW4gSVN1cmZhY2VUZXh0dXJlIHdhcyBjcmVhdGVkIGJ5IFN1cmZhY2VGbGluZ2VyLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBhdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2UpIGNvbnN0ID0gMDsKLQotICAgIC8qIHJldHVybiBhbiBJRGlzcGxheUV2ZW50Q29ubmVjdGlvbiAqLwotICAgIHZpcnR1YWwgc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IGNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuU3VyZmFjZUNvbXBvc2VyIDogcHVibGljIEJuSW50ZXJmYWNlPElTdXJmYWNlQ29tcG9zZXI+Ci17Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIC8vIE5vdGU6IEJPT1RfRklOSVNIRUQgbXVzdCByZW1haW4gdGhpcyB2YWx1ZSwgaXQgaXMgY2FsbGVkIGZyb20KLSAgICAgICAgLy8gSmF2YSBieSBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLgotICAgICAgICBCT09UX0ZJTklTSEVEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICAgICAgQ1JFQVRFX0NPTk5FQ1RJT04sCi0gICAgICAgIENSRUFURV9HUkFQSElDX0JVRkZFUl9BTExPQywKLSAgICAgICAgR0VUX0NCTEssCi0gICAgICAgIFNFVF9UUkFOU0FDVElPTl9TVEFURSwKLSAgICAgICAgU0VUX09SSUVOVEFUSU9OLAotICAgICAgICBDQVBUVVJFX1NDUkVFTiwKLSAgICAgICAgVFVSTl9FTEVDVFJPTl9CRUFNX09GRiwKLSAgICAgICAgVFVSTl9FTEVDVFJPTl9CRUFNX09OLAotICAgICAgICBBVVRIRU5USUNBVEVfU1VSRkFDRSwKLSAgICAgICAgQ1JFQVRFX0RJU1BMQVlfRVZFTlRfQ09OTkVDVElPTiwKLSAgICB9OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JU1VSRkFDRV9DT01QT1NFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmggYi9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTM5MzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfSVNVUkZBQ0VfQ09NUE9TRVJfQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfSVNVUkZBQ0VfQ09NUE9TRVJfQ0xJRU5UX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgaW50MzJfdCAgICBEaXNwbGF5SUQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSVN1cmZhY2VDb21wb3NlckNsaWVudCA6IHB1YmxpYyBJSW50ZXJmYWNlCi17Ci1wdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTdXJmYWNlQ29tcG9zZXJDbGllbnQpOwotCi0gICAgc3RydWN0IHN1cmZhY2VfZGF0YV90IHsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgICB0b2tlbjsKLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBpZGVudGl0eTsKLSAgICAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBwYXJjZWwpOwotICAgICAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdDsKLSAgICB9OwotCi0gICAgLyoKLSAgICAgKiBSZXF1aXJlcyBBQ0NFU1NfU1VSRkFDRV9GTElOR0VSIHBlcm1pc3Npb24KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHNwPElTdXJmYWNlPiBjcmVhdGVTdXJmYWNlKCBzdXJmYWNlX2RhdGFfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpID0gMDsKLQotICAgIC8qCi0gICAgICogUmVxdWlyZXMgQUNDRVNTX1NVUkZBQ0VfRkxJTkdFUiBwZXJtaXNzaW9uCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBkZXN0cm95U3VyZmFjZShTdXJmYWNlSUQgc2lkKSA9IDA7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJuU3VyZmFjZUNvbXBvc2VyQ2xpZW50IDogcHVibGljIEJuSW50ZXJmYWNlPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KCB1aW50MzJfdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JU1VSRkFDRV9DT01QT1NFUl9DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSVN1cmZhY2VUZXh0dXJlLmggYi9pbmNsdWRlL2d1aS9JU3VyZmFjZVRleHR1cmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2MjZhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9JU3VyZmFjZVRleHR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9JU1VSRkFDRVRFWFRVUkVfSAotI2RlZmluZSBBTkRST0lEX0dVSV9JU1VSRkFDRVRFWFRVUkVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTdXJmYWNlVGV4dHVyZUNsaWVudDsKLQotY2xhc3MgSVN1cmZhY2VUZXh0dXJlIDogcHVibGljIElJbnRlcmZhY2UKLXsKLXB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFN1cmZhY2VUZXh0dXJlKTsKLQotcHJvdGVjdGVkOgotICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlVGV4dHVyZUNsaWVudDsKLQotICAgIGVudW0gewotICAgICAgICBCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OID0gMHgxLAotICAgICAgICBSRUxFQVNFX0FMTF9CVUZGRVJTICAgICAgID0gMHgyLAotICAgIH07Ci0KLSAgICAvLyByZXF1ZXN0QnVmZmVyIHJlcXVlc3RzIGEgbmV3IGJ1ZmZlciBmb3IgdGhlIGdpdmVuIGluZGV4LiBUaGUgc2VydmVyIChpLmUuCi0gICAgLy8gdGhlIElTdXJmYWNlVGV4dHVyZSBpbXBsZW1lbnRhdGlvbikgYXNzaWducyB0aGUgbmV3bHkgY3JlYXRlZCBidWZmZXIgdG8KLSAgICAvLyB0aGUgZ2l2ZW4gc2xvdCBpbmRleCwgYW5kIHRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gbWlycm9yIHRoZQotICAgIC8vIHNsb3QtPmJ1ZmZlciBtYXBwaW5nIHNvIHRoYXQgaXQncyBub3QgbmVjZXNzYXJ5IHRvIHRyYW5zZmVyIGEKLSAgICAvLyBHcmFwaGljQnVmZmVyIGZvciBldmVyeSBkZXF1ZXVlIG9wZXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlcXVlc3RCdWZmZXIoaW50IHNsb3QsIHNwPEdyYXBoaWNCdWZmZXI+KiBidWYpID0gMDsKLQotICAgIC8vIHNldEJ1ZmZlckNvdW50IHNldHMgdGhlIG51bWJlciBvZiBidWZmZXIgc2xvdHMgYXZhaWxhYmxlLiBDYWxsaW5nIHRoaXMKLSAgICAvLyB3aWxsIGFsc28gY2F1c2UgYWxsIGJ1ZmZlciBzbG90cyB0byBiZSBlbXB0aWVkLiBUaGUgY2FsbGVyIHNob3VsZCBlbXB0eQotICAgIC8vIGl0cyBtaXJyb3JlZCBjb3B5IG9mIHRoZSBidWZmZXIgc2xvdHMgd2hlbiBjYWxsaW5nIHRoaXMgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KSA9IDA7Ci0KLSAgICAvLyBkZXF1ZXVlQnVmZmVyIHJlcXVlc3RzIGEgbmV3IGJ1ZmZlciBzbG90IGZvciB0aGUgY2xpZW50IHRvIHVzZS4gT3duZXJzaGlwCi0gICAgLy8gb2YgdGhlIHNsb3QgaXMgdHJhbnNmZXJlZCB0byB0aGUgY2xpZW50LCBtZWFuaW5nIHRoYXQgdGhlIHNlcnZlciB3aWxsIG5vdAotICAgIC8vIHVzZSB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBzbG90LiBUaGUgc2xvdCBpbmRleAotICAgIC8vIHJldHVybmVkIG1heSBvciBtYXkgbm90IGNvbnRhaW4gYSBidWZmZXIuIElmIHRoZSBzbG90IGlzIGVtcHR5IHRoZSBjbGllbnQKLSAgICAvLyBzaG91bGQgY2FsbCByZXF1ZXN0QnVmZmVyIHRvIGFzc2lnbiBhIG5ldyBidWZmZXIgdG8gdGhhdCBzbG90LiBUaGUgY2xpZW50Ci0gICAgLy8gaXMgZXhwZWN0ZWQgdG8gZWl0aGVyIGNhbGwgY2FuY2VsQnVmZmVyIG9uIHRoZSBkZXF1ZXVlZCBzbG90IG9yIHRvIGZpbGwKLSAgICAvLyBpbiB0aGUgY29udGVudHMgb2YgaXRzIGFzc29jaWF0ZWQgYnVmZmVyIGNvbnRlbnRzIGFuZCBjYWxsIHF1ZXVlQnVmZmVyLgotICAgIC8vIElmIGRlcXVldWVCdWZmZXIgcmV0dXJuIEJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04sIHRoZSBjbGllbnQgaXMKLSAgICAvLyBleHBlY3RlZCB0byBjYWxsIHJlcXVlc3RCdWZmZXIgaW1tZWRpYXRlbHkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQnVmZmVyKGludCAqc2xvdCwgdWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpID0gMDsKLQotICAgIC8vIHF1ZXVlQnVmZmVyIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgaGFzIGZpbmlzaGVkIGZpbGxpbmcgaW4gdGhlCi0gICAgLy8gY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggc2xvdCBhbmQgdHJhbnNmZXJzIG93bmVyc2hpcCBvZgotICAgIC8vIHRoYXQgc2xvdCBiYWNrIHRvIHRoZSBzZXJ2ZXIuIEl0IGlzIG5vdCB2YWxpZCB0byBjYWxsIHF1ZXVlQnVmZmVyIG9uIGEKLSAgICAvLyBzbG90IHRoYXQgaXMgbm90IG93bmVkIGJ5IHRoZSBjbGllbnQgb3Igb25lIGZvciB3aGljaCBhIGJ1ZmZlciBhc3NvY2lhdGVkCi0gICAgLy8gdmlhIHJlcXVlc3RCdWZmZXIuIEluIGFkZGl0aW9uLCBhIHRpbWVzdGFtcCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZQotICAgIC8vIGNsaWVudCBmb3IgdGhpcyBidWZmZXIuIFRoZSB0aW1lc3RhbXAgaXMgbWVhc3VyZWQgaW4gbmFub3NlY29uZHMsIGFuZAotICAgIC8vIG11c3QgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLiBJdHMgb3RoZXIgcHJvcGVydGllcyAoemVybyBwb2ludCwgZXRjKQotICAgIC8vIGFyZSBjbGllbnQtZGVwZW5kZW50LCBhbmQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYnkgdGhlIGNsaWVudC4KLSAgICAvLwotICAgIC8vIG91dFdpZHRoLCBvdXRIZWlnaHQgYW5kIG91dFRyYW5zZm9ybSBhcmUgZmlsbGVkIHdpdGggdGhlIGRlZmF1bHQgd2lkdGgKLSAgICAvLyBhbmQgaGVpZ2h0IG9mIHRoZSB3aW5kb3cgYW5kIGN1cnJlbnQgdHJhbnNmb3JtIGFwcGxpZWQgdG8gYnVmZmVycywKLSAgICAvLyByZXNwZWN0aXZlbHkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlcihpbnQgc2xvdCwgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pID0gMDsKLQotICAgIC8vIGNhbmNlbEJ1ZmZlciBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IGRvZXMgbm90IHdpc2ggdG8gZmlsbCBpbiB0aGUKLSAgICAvLyBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHNsb3QgYW5kIHRyYW5zZmVycyBvd25lcnNoaXAgb2YgdGhlIHNsb3QgYmFjayB0bwotICAgIC8vIHRoZSBzZXJ2ZXIuCi0gICAgdmlydHVhbCB2b2lkIGNhbmNlbEJ1ZmZlcihpbnQgc2xvdCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDcm9wKGNvbnN0IFJlY3QmIHJlZykgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKHVpbnQzMl90IHRyYW5zZm9ybSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U2NhbGluZ01vZGUoaW50IG1vZGUpID0gMDsKLQotICAgIC8vIHF1ZXJ5IHJldHJpZXZlcyBzb21lIGluZm9ybWF0aW9uIGZvciB0aGlzIHN1cmZhY2UKLSAgICAvLyAnd2hhdCcgdG9rZW5zIGFsbG93ZWQgYXJlIHRoYXQgb2YgYW5kcm9pZF9uYXRpdmVzLmgKLSAgICB2aXJ0dWFsIGludCBxdWVyeShpbnQgd2hhdCwgaW50KiB2YWx1ZSkgPSAwOwotCi0gICAgLy8gc2V0U3luY2hyb25vdXNNb2RlIHNldCB3aGV0aGVyIGRlcXVldWVCdWZmZXIgaXMgc3luY2hyb25vdXMgb3IKLSAgICAvLyBhc3luY2hyb25vdXMuIEluIHN5bmNocm9ub3VzIG1vZGUsIGRlcXVldWVCdWZmZXIgYmxvY2tzIHVudGlsCi0gICAgLy8gYSBidWZmZXIgaXMgYXZhaWxhYmxlLCB0aGUgY3VycmVudGx5IGJvdW5kIGJ1ZmZlciBjYW4gYmUgZGVxdWV1ZWQgYW5kCi0gICAgLy8gcXVldWVkIGJ1ZmZlcnMgd2lsbCBiZSByZXRpcmVkIGluIG9yZGVyLgotICAgIC8vIFRoZSBkZWZhdWx0IG1vZGUgaXMgYXN5bmNocm9ub3VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY2hyb25vdXNNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOwotCi0gICAgLy8gY29ubmVjdCBhdHRlbXB0cyB0byBjb25uZWN0IGEgY2xpZW50IEFQSSB0byB0aGUgU3VyZmFjZVRleHR1cmUuICBUaGlzCi0gICAgLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBJU3VyZmFjZVRleHR1cmUgbWV0aG9kcyBhcmUgY2FsbGVkIGV4Y2VwdAotICAgIC8vIGZvciBnZXRBbGxvY2F0b3IuCi0gICAgLy8KLSAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGZhaWwgaWYgdGhlIGNvbm5lY3Qgd2FzIHByZXZpb3VzbHkgY2FsbGVkIG9uIHRoZQotICAgIC8vIFN1cmZhY2VUZXh0dXJlIGFuZCBubyBjb3JyZXNwb25kaW5nIGRpc2Nvbm5lY3QgY2FsbCB3YXMgbWFkZS4KLSAgICAvLwotICAgIC8vIG91dFdpZHRoLCBvdXRIZWlnaHQgYW5kIG91dFRyYW5zZm9ybSBhcmUgZmlsbGVkIHdpdGggdGhlIGRlZmF1bHQgd2lkdGgKLSAgICAvLyBhbmQgaGVpZ2h0IG9mIHRoZSB3aW5kb3cgYW5kIGN1cnJlbnQgdHJhbnNmb3JtIGFwcGxpZWQgdG8gYnVmZmVycywKLSAgICAvLyByZXNwZWN0aXZlbHkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25uZWN0KGludCBhcGksCi0gICAgICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pID0gMDsKLQotICAgIC8vIGRpc2Nvbm5lY3QgYXR0ZW1wdHMgdG8gZGlzY29ubmVjdCBhIGNsaWVudCBBUEkgZnJvbSB0aGUgU3VyZmFjZVRleHR1cmUuCi0gICAgLy8gQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIGFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIG90aGVyCi0gICAgLy8gSVN1cmZhY2VUZXh0dXJlIG1ldGhvZHMgdG8gZmFpbCBleGNlcHQgZm9yIGdldEFsbG9jYXRvciBhbmQgY29ubmVjdC4KLSAgICAvLyBTdWNjZXNzZnVsbHkgY2FsbGluZyBjb25uZWN0IGFmdGVyIHRoaXMgd2lsbCBhbGxvdyB0aGUgb3RoZXIgbWV0aG9kcyB0bwotICAgIC8vIHN1Y2NlZWQgYWdhaW4uCi0gICAgLy8KLSAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGZhaWwgaWYgdGhlIHRoZSBTdXJmYWNlVGV4dHVyZSBpcyBub3QgY3VycmVudGx5Ci0gICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgY2xpZW50IEFQSS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoaW50IGFwaSkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCblN1cmZhY2VUZXh0dXJlIDogcHVibGljIEJuSW50ZXJmYWNlPElTdXJmYWNlVGV4dHVyZT4KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9JU1VSRkFDRVRFWFRVUkVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU2Vuc29yLmggYi9pbmNsdWRlL2d1aS9TZW5zb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NzU3YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9TZW5zb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX1NFTlNPUl9ICi0jZGVmaW5lIEFORFJPSURfR1VJX1NFTlNPUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0ZsYXR0ZW5hYmxlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvc2Vuc29ycy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9zZW5zb3IuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29uY3JldGUgdHlwZXMgZm9yIHRoZSBOREsKLXN0cnVjdCBBU2Vuc29yIHsgfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBQYXJjZWw7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2Vuc29yIDogcHVibGljIEFTZW5zb3IsIHB1YmxpYyBGbGF0dGVuYWJsZQotewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBUWVBFX0FDQ0VMRVJPTUVURVIgID0gQVNFTlNPUl9UWVBFX0FDQ0VMRVJPTUVURVIsCi0gICAgICAgIFRZUEVfTUFHTkVUSUNfRklFTEQgPSBBU0VOU09SX1RZUEVfTUFHTkVUSUNfRklFTEQsCi0gICAgICAgIFRZUEVfR1lST1NDT1BFICAgICAgPSBBU0VOU09SX1RZUEVfR1lST1NDT1BFLAotICAgICAgICBUWVBFX0xJR0hUICAgICAgICAgID0gQVNFTlNPUl9UWVBFX0xJR0hULAotICAgICAgICBUWVBFX1BST1hJTUlUWSAgICAgID0gQVNFTlNPUl9UWVBFX1BST1hJTUlUWQotICAgIH07Ci0KLSAgICAgICAgICAgIFNlbnNvcigpOwotICAgICAgICAgICAgU2Vuc29yKHN0cnVjdCBzZW5zb3JfdCBjb25zdCogaHdTZW5zb3IpOwotICAgIHZpcnR1YWwgflNlbnNvcigpOwotCi0gICAgY29uc3QgU3RyaW5nOCYgZ2V0TmFtZSgpIGNvbnN0OwotICAgIGNvbnN0IFN0cmluZzgmIGdldFZlbmRvcigpIGNvbnN0OwotICAgIGludDMyX3QgZ2V0SGFuZGxlKCkgY29uc3Q7Ci0gICAgaW50MzJfdCBnZXRUeXBlKCkgY29uc3Q7Ci0gICAgZmxvYXQgZ2V0TWluVmFsdWUoKSBjb25zdDsKLSAgICBmbG9hdCBnZXRNYXhWYWx1ZSgpIGNvbnN0OwotICAgIGZsb2F0IGdldFJlc29sdXRpb24oKSBjb25zdDsKLSAgICBmbG9hdCBnZXRQb3dlclVzYWdlKCkgY29uc3Q7Ci0gICAgaW50MzJfdCBnZXRNaW5EZWxheSgpIGNvbnN0OwotICAgIG5zZWNzX3QgZ2V0TWluRGVsYXlOcygpIGNvbnN0OwotICAgIGludDMyX3QgZ2V0VmVyc2lvbigpIGNvbnN0OwotCi0gICAgLy8gRmxhdHRlbmFibGUgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90IGdldEZkQ291bnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsYXR0ZW4odm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgIGludCBmZHNbXSwgc2l6ZV90IGNvdW50KSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHVuZmxhdHRlbih2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50IGZkc1tdLCBzaXplX3QgY291bnQpOwotCi1wcml2YXRlOgotICAgIFN0cmluZzggbU5hbWU7Ci0gICAgU3RyaW5nOCBtVmVuZG9yOwotICAgIGludDMyX3QgbUhhbmRsZTsKLSAgICBpbnQzMl90IG1UeXBlOwotICAgIGZsb2F0ICAgbU1pblZhbHVlOwotICAgIGZsb2F0ICAgbU1heFZhbHVlOwotICAgIGZsb2F0ICAgbVJlc29sdXRpb247Ci0gICAgZmxvYXQgICBtUG93ZXI7Ci0gICAgaW50MzJfdCBtTWluRGVsYXk7Ci0gICAgaW50MzJfdCBtVmVyc2lvbjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9TRU5TT1JfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5oIGIvaW5jbHVkZS9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdjNmUzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ3VpL1NlbnNvckV2ZW50UXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0VOU09SX0VWRU5UX1FVRVVFX0gKLSNkZWZpbmUgQU5EUk9JRF9TRU5TT1JfRVZFTlRfUVVFVUVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxndWkvQml0VHViZS5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBBTG9vcGVyOwotc3RydWN0IEFTZW5zb3JFdmVudDsKLQotLy8gQ29uY3JldGUgdHlwZXMgZm9yIHRoZSBOREsKLXN0cnVjdCBBU2Vuc29yRXZlbnRRdWV1ZSB7Ci0gICAgQUxvb3BlciogbG9vcGVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJU2Vuc29yRXZlbnRDb25uZWN0aW9uOwotY2xhc3MgU2Vuc29yOwotY2xhc3MgTG9vcGVyOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFNlbnNvckV2ZW50UXVldWUgOiBwdWJsaWMgQVNlbnNvckV2ZW50UXVldWUsIHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICBTZW5zb3JFdmVudFF1ZXVlKGNvbnN0IHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKLSAgICB2aXJ0dWFsIH5TZW5zb3JFdmVudFF1ZXVlKCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKLQotICAgIGludCBnZXRGZCgpIGNvbnN0OwotICAgIHNzaXplX3Qgd3JpdGUoQVNlbnNvckV2ZW50IGNvbnN0KiBldmVudHMsIHNpemVfdCBudW1FdmVudHMpOwotICAgIHNzaXplX3QgcmVhZChBU2Vuc29yRXZlbnQqIGV2ZW50cywgc2l6ZV90IG51bUV2ZW50cyk7Ci0KLSAgICBzdGF0dXNfdCB3YWl0Rm9yRXZlbnQoKSBjb25zdDsKLSAgICBzdGF0dXNfdCB3YWtlKCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBlbmFibGVTZW5zb3IoU2Vuc29yIGNvbnN0KiBzZW5zb3IpIGNvbnN0OwotICAgIHN0YXR1c190IGRpc2FibGVTZW5zb3IoU2Vuc29yIGNvbnN0KiBzZW5zb3IpIGNvbnN0OwotICAgIHN0YXR1c190IHNldEV2ZW50UmF0ZShTZW5zb3IgY29uc3QqIHNlbnNvciwgbnNlY3NfdCBucykgY29uc3Q7Ci0KLSAgICAvLyB0aGVzZSBhcmUgaGVyZSBvbmx5IHRvIHN1cHBvcnQgU2Vuc29yTWFuYWdlci5qYXZhCi0gICAgc3RhdHVzX3QgZW5hYmxlU2Vuc29yKGludDMyX3QgaGFuZGxlLCBpbnQzMl90IHVzKSBjb25zdDsKLSAgICBzdGF0dXNfdCBkaXNhYmxlU2Vuc29yKGludDMyX3QgaGFuZGxlKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBzcDxMb29wZXI+IGdldExvb3BlcigpIGNvbnN0OwotICAgIHNwPElTZW5zb3JFdmVudENvbm5lY3Rpb24+IG1TZW5zb3JFdmVudENvbm5lY3Rpb247Ci0gICAgc3A8Qml0VHViZT4gbVNlbnNvckNoYW5uZWw7Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBtdXRhYmxlIHNwPExvb3Blcj4gbUxvb3BlcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NFTlNPUl9FVkVOVF9RVUVVRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TZW5zb3JNYW5hZ2VyLmggYi9pbmNsdWRlL2d1aS9TZW5zb3JNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzY0NjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvU2Vuc29yTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfU0VOU09SX01BTkFHRVJfSAotI2RlZmluZSBBTkRST0lEX0dVSV9TRU5TT1JfTUFOQUdFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLSNpbmNsdWRlIDxndWkvU2Vuc29yRXZlbnRRdWV1ZS5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb25jcmV0ZSB0eXBlcyBmb3IgdGhlIE5ESwotc3RydWN0IEFTZW5zb3JNYW5hZ2VyIHsgfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJU2Vuc29yU2VydmVyOwotY2xhc3MgU2Vuc29yOwotY2xhc3MgU2Vuc29yRXZlbnRRdWV1ZTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTZW5zb3JNYW5hZ2VyIDoKLSAgICBwdWJsaWMgQVNlbnNvck1hbmFnZXIsCi0gICAgcHVibGljIFNpbmdsZXRvbjxTZW5zb3JNYW5hZ2VyPgotewotcHVibGljOgotICAgIFNlbnNvck1hbmFnZXIoKTsKLSAgICB+U2Vuc29yTWFuYWdlcigpOwotCi0gICAgc3NpemVfdCBnZXRTZW5zb3JMaXN0KFNlbnNvciBjb25zdCogY29uc3QqKiBsaXN0KSBjb25zdDsKLSAgICBTZW5zb3IgY29uc3QqIGdldERlZmF1bHRTZW5zb3IoaW50IHR5cGUpOwotICAgIHNwPFNlbnNvckV2ZW50UXVldWU+IGNyZWF0ZUV2ZW50UXVldWUoKTsKLQotcHJpdmF0ZToKLSAgICAvLyBEZWF0aFJlY2lwaWVudCBpbnRlcmZhY2UKLSAgICB2b2lkIHNlbnNvck1hbmFnZXJEaWVkKCk7Ci0KLSAgICBzdGF0dXNfdCBhc3NlcnRTdGF0ZUxvY2tlZCgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgbXV0YWJsZSBzcDxJU2Vuc29yU2VydmVyPiBtU2Vuc29yU2VydmVyOwotICAgIG11dGFibGUgU2Vuc29yIGNvbnN0KiogbVNlbnNvckxpc3Q7Ci0gICAgbXV0YWJsZSBWZWN0b3I8U2Vuc29yPiBtU2Vuc29yczsKLSAgICBtdXRhYmxlIHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiBtRGVhdGhPYnNlcnZlcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9TRU5TT1JfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TdXJmYWNlLmggYi9pbmNsdWRlL2d1aS9TdXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOTBjNTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvU3VyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX1NVUkZBQ0VfSAotI2RlZmluZSBBTkRST0lEX0dVSV9TVVJGQUNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDx1aS9SZWdpb24uaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0KLSNkZWZpbmUgQU5EUk9JRF9WSUVXX1NVUkZBQ0VfSk5JX0lEICAgICJtTmF0aXZlU3VyZmFjZSIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgSVN1cmZhY2VUZXh0dXJlOwotY2xhc3MgU3VyZmFjZTsKLWNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN1cmZhY2VDb250cm9sIDogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgc3VyZmFjZSkgewotICAgICAgICByZXR1cm4gKHN1cmZhY2UgIT0gMCkgJiYgc3VyZmFjZS0+aXNWYWxpZCgpOwotICAgIH0KLSAgICBib29sIGlzVmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW4+PTAgJiYgbUNsaWVudCE9MDsKLSAgICB9Ci0gICAgc3RhdGljIGJvb2wgaXNTYW1lU3VyZmFjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgbGhzLCBjb25zdCBzcDxTdXJmYWNlQ29udHJvbD4mIHJocyk7Ci0gICAgICAgIAotICAgIHVpbnQzMl90ICAgIGdldElkZW50aXR5KCkgY29uc3QgeyByZXR1cm4gbUlkZW50aXR5OyB9Ci0KLSAgICAvLyByZWxlYXNlIHN1cmZhY2UgZGF0YSBmcm9tIGphdmEKLSAgICB2b2lkICAgICAgICBjbGVhcigpOwotICAgIAotICAgIHN0YXR1c190ICAgIHNldExheWVyKGludDMyX3QgbGF5ZXIpOwotICAgIHN0YXR1c190ICAgIHNldFBvc2l0aW9uKGludDMyX3QgeCwgaW50MzJfdCB5KTsKLSAgICBzdGF0dXNfdCAgICBzZXRTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwotICAgIHN0YXR1c190ICAgIGhpZGUoKTsKLSAgICBzdGF0dXNfdCAgICBzaG93KGludDMyX3QgbGF5ZXIgPSAtMSk7Ci0gICAgc3RhdHVzX3QgICAgZnJlZXplKCk7Ci0gICAgc3RhdHVzX3QgICAgdW5mcmVlemUoKTsKLSAgICBzdGF0dXNfdCAgICBzZXRGbGFncyh1aW50MzJfdCBmbGFncywgdWludDMyX3QgbWFzayk7Ci0gICAgc3RhdHVzX3QgICAgc2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KGNvbnN0IFJlZ2lvbiYgdHJhbnNwYXJlbnQpOwotICAgIHN0YXR1c190ICAgIHNldEFscGhhKGZsb2F0IGFscGhhPTEuMGYpOwotICAgIHN0YXR1c190ICAgIHNldE1hdHJpeChmbG9hdCBkc2R4LCBmbG9hdCBkdGR4LCBmbG9hdCBkc2R5LCBmbG9hdCBkdGR5KTsKLSAgICBzdGF0dXNfdCAgICBzZXRGcmVlemVUaW50KHVpbnQzMl90IHRpbnQpOwotCi0gICAgc3RhdGljIHN0YXR1c190IHdyaXRlU3VyZmFjZVRvUGFyY2VsKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBjb250cm9sLCBQYXJjZWwqIHBhcmNlbCk7Ci0KLSAgICBzcDxTdXJmYWNlPiBnZXRTdXJmYWNlKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgLy8gY2FuJ3QgYmUgY29waWVkCi0gICAgU3VyZmFjZUNvbnRyb2wmIG9wZXJhdG9yID0gKFN1cmZhY2VDb250cm9sJiByaHMpOwotICAgIFN1cmZhY2VDb250cm9sKGNvbnN0IFN1cmZhY2VDb250cm9sJiByaHMpOwotCi0gICAgZnJpZW5kIGNsYXNzIFN1cmZhY2VDb21wb3NlckNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgU3VyZmFjZTsKLQotICAgIFN1cmZhY2VDb250cm9sKAotICAgICAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgY29uc3Qgc3A8SVN1cmZhY2U+JiBzdXJmYWNlLAotICAgICAgICAgICAgY29uc3QgSVN1cmZhY2VDb21wb3NlckNsaWVudDo6c3VyZmFjZV9kYXRhX3QmIGRhdGEpOwotCi0gICAgflN1cmZhY2VDb250cm9sKCk7Ci0KLSAgICBzdGF0dXNfdCB2YWxpZGF0ZSgpIGNvbnN0OwotICAgIHZvaWQgZGVzdHJveSgpOwotICAgIAotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gICBtQ2xpZW50OwotICAgIHNwPElTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKLSAgICBTdXJmYWNlSUQgICAgICAgICAgICAgICAgICAgbVRva2VuOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtSWRlbnRpdHk7Ci0gICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIAotICAgIG11dGFibGUgc3A8U3VyZmFjZT4gICAgICAgICBtU3VyZmFjZURhdGE7Ci19OwotICAgIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN1cmZhY2UgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmVDbGllbnQKLXsKLXB1YmxpYzoKLSAgICBzdHJ1Y3QgU3VyZmFjZUluZm8gewotICAgICAgICB1aW50MzJfdCAgICB3OwotICAgICAgICB1aW50MzJfdCAgICBoOwotICAgICAgICB1aW50MzJfdCAgICBzOwotICAgICAgICB1aW50MzJfdCAgICB1c2FnZTsKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0OwotICAgICAgICB2b2lkKiAgICAgICBiaXRzOwotICAgICAgICB1aW50MzJfdCAgICByZXNlcnZlZFsyXTsKLSAgICB9OwotCi0gICAgZXhwbGljaXQgU3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChjb25zdCBzcDxTdXJmYWNlPiYgY29udHJvbCwgUGFyY2VsKiBwYXJjZWwpOwotCi0gICAgc3RhdGljIHNwPFN1cmZhY2U+IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSk7Ci0gICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgewotICAgICAgICByZXR1cm4gKHN1cmZhY2UgIT0gMCkgJiYgc3VyZmFjZS0+aXNWYWxpZCgpOwotICAgIH0KLQotICAgIGJvb2wgICAgICAgIGlzVmFsaWQoKTsKLSAgICB1aW50MzJfdCAgICBnZXRJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGl0eTsgfQotICAgIHNwPElTdXJmYWNlVGV4dHVyZT4gZ2V0U3VyZmFjZVRleHR1cmUoKTsKLQotICAgIC8vIHRoZSBsb2NrL3VubG9jayBBUElzIG11c3QgYmUgdXNlZCBmcm9tIHRoZSBzYW1lIHRocmVhZAotICAgIHN0YXR1c190ICAgIGxvY2soU3VyZmFjZUluZm8qIGluZm8sIFJlZ2lvbiogZGlydHkgPSBOVUxMKTsKLSAgICBzdGF0dXNfdCAgICB1bmxvY2tBbmRQb3N0KCk7Ci0KLSAgICBzcDxJQmluZGVyPiBhc0JpbmRlcigpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIC8vIHRoaXMgaXMganVzdCB0byBiZSBhYmxlIHRvIHdyaXRlIHNvbWUgdW5pdCB0ZXN0cwotICAgIGZyaWVuZCBjbGFzcyBUZXN0OwotICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlQ29udHJvbDsKLQotICAgIC8vIGNhbid0IGJlIGNvcGllZAotICAgIFN1cmZhY2UmIG9wZXJhdG9yID0gKFN1cmZhY2UmIHJocyk7Ci0gICAgU3VyZmFjZShjb25zdCBTdXJmYWNlJiByaHMpOwotCi0gICAgZXhwbGljaXQgU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlQ29udHJvbD4mIGNvbnRyb2wpOwotICAgIFN1cmZhY2UoY29uc3QgUGFyY2VsJiBkYXRhLCBjb25zdCBzcDxJQmluZGVyPiYgcmVmKTsKLSAgICB+U3VyZmFjZSgpOwotCi0gICAgLyoKLSAgICAgKiAgcHJpdmF0ZSBzdHVmZi4uLgotICAgICAqLwotICAgIHZvaWQgaW5pdChjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlVGV4dHVyZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBjbGVhbkNhY2hlZFN1cmZhY2VzTG9ja2VkKCk7Ci0KLSAgICB2aXJ0dWFsIGludCBxdWVyeShpbnQgd2hhdCwgaW50KiB2YWx1ZSkgY29uc3Q7Ci0KLSAgICAvLyBjb25zdGFudHMKLSAgICBzcDxJU3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIG1JZGVudGl0eTsKLQotICAgIC8vIEEgY2FjaGUgb2YgU3VyZmFjZSBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGRlc2VyaWFsaXplZCBpbnRvIHRoaXMgcHJvY2Vzcy4KLSAgICBzdGF0aWMgTXV0ZXggc0NhY2hlZFN1cmZhY2VzTG9jazsKLSAgICBzdGF0aWMgRGVmYXVsdEtleWVkVmVjdG9yPHdwPElCaW5kZXI+LCB3cDxTdXJmYWNlPiA+IHNDYWNoZWRTdXJmYWNlczsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oIGIvaW5jbHVkZS9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzEwMzEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HVUlfU1VSRkFDRV9DT01QT1NFUl9DTElFTlRfSAotI2RlZmluZSBBTkRST0lEX0dVSV9TVVJGQUNFX0NPTVBPU0VSX0NMSUVOVF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIERpc3BsYXlJbmZvOwotY2xhc3MgQ29tcG9zZXI7Ci1jbGFzcyBJTWVtb3J5SGVhcDsKLWNsYXNzIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ7Ci1jbGFzcyBSZWdpb247Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTdXJmYWNlQ29tcG9zZXJDbGllbnQgOiBwdWJsaWMgUmVmQmFzZQotewotICAgIGZyaWVuZCBjbGFzcyBDb21wb3NlcjsKLXB1YmxpYzogICAgCi0gICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KCk7Ci0gICAgdmlydHVhbCAgICAgflN1cmZhY2VDb21wb3NlckNsaWVudCgpOwotCi0gICAgLy8gQWx3YXlzIG1ha2Ugc3VyZSB3ZSBjb3VsZCBpbml0aWFsaXplCi0gICAgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gb2YgdGhpcyBjbGllbnQKLSAgICBzcDxJQmluZGVyPiBjb25uZWN0aW9uKCkgY29uc3Q7Ci0gICAgCi0gICAgLy8gRm9yY2libHkgcmVtb3ZlIGNvbm5lY3Rpb24gYmVmb3JlIGFsbCByZWZlcmVuY2VzIGhhdmUgZ29uZSBhd2F5LgotICAgIHZvaWQgICAgICAgIGRpc3Bvc2UoKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHN1cmZhY2UgY3JlYXRpb24gLyBkZXN0cnVjdGlvbgotCi0gICAgLy8hIENyZWF0ZSBhIHN1cmZhY2UKLSAgICBzcDxTdXJmYWNlQ29udHJvbD4gY3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsLy8gbmFtZSBvZiB0aGUgc3VyZmFjZQotICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksICAvLyBEaXNwbGF5IHRvIGNyZWF0ZSB0aGlzIHN1cmZhY2Ugb24KLSAgICAgICAgICAgIHVpbnQzMl90IHcsICAgICAgICAgLy8gd2lkdGggaW4gcGl4ZWwKLSAgICAgICAgICAgIHVpbnQzMl90IGgsICAgICAgICAgLy8gaGVpZ2h0IGluIHBpeGVsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIC8vIHBpeGVsLWZvcm1hdCBkZXNpcmVkCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAgIC8vIHVzYWdlIGZsYWdzCi0gICAgKTsKLQotICAgIHNwPFN1cmZhY2VDb250cm9sPiBjcmVhdGVTdXJmYWNlKAotICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksICAvLyBEaXNwbGF5IHRvIGNyZWF0ZSB0aGlzIHN1cmZhY2Ugb24KLSAgICAgICAgICAgIHVpbnQzMl90IHcsICAgICAgICAgLy8gd2lkdGggaW4gcGl4ZWwKLSAgICAgICAgICAgIHVpbnQzMl90IGgsICAgICAgICAgLy8gaGVpZ2h0IGluIHBpeGVsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIC8vIHBpeGVsLWZvcm1hdCBkZXNpcmVkCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAgIC8vIHVzYWdlIGZsYWdzCi0gICAgKTsKLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ29tcG9zZXIgcGFyYW1ldGVycwotICAgIC8vIEFsbCBjb21wb3NlciBwYXJhbWV0ZXJzIG11c3QgYmUgY2hhbmdlZCB3aXRoaW4gYSB0cmFuc2FjdGlvbgotICAgIC8vIHNldmVyYWwgc3VyZmFjZXMgY2FuIGJlIHVwZGF0ZWQgaW4gb25lIHRyYW5zYWN0aW9uLCBhbGwgY2hhbmdlcyBhcmUKLSAgICAvLyBjb21taXR0ZWQgYXQgb25jZSB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBjbG9zZWQuCi0gICAgLy8gY2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpIHVzdWFsbHkgcmVxdWlyZXMgYW4gSVBDIHdpdGggdGhlIHNlcnZlci4KLQotICAgIC8vISBPcGVuIGEgY29tcG9zZXIgdHJhbnNhY3Rpb24gb24gYWxsIGFjdGl2ZSBTdXJmYWNlQ29tcG9zZXJDbGllbnRzLgotICAgIHN0YXRpYyB2b2lkIG9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOwotICAgICAgICAKLSAgICAvLyEgQ2xvc2UgYSBjb21wb3NlciB0cmFuc2FjdGlvbiBvbiBhbGwgYWN0aXZlIFN1cmZhY2VDb21wb3NlckNsaWVudHMuCi0gICAgc3RhdGljIHZvaWQgY2xvc2VHbG9iYWxUcmFuc2FjdGlvbihib29sIHN5bmNocm9ub3VzID0gZmFsc2UpOwotICAgIAotICAgIC8vISBGcmVlemUgdGhlIHNwZWNpZmllZCBkaXNwbGF5IGJ1dCBub3QgdHJhbnNhY3Rpb25zLgotICAgIHN0YXRpYyBzdGF0dXNfdCBmcmVlemVEaXNwbGF5KERpc3BsYXlJRCBkcHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gICAgICAgIAotICAgIC8vISBSZXN1bWUgdXBkYXRlcyBvbiB0aGUgc3BlY2lmaWVkIGRpc3BsYXkuCi0gICAgc3RhdGljIHN0YXR1c190IHVuZnJlZXplRGlzcGxheShEaXNwbGF5SUQgZHB5LCB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgLy8hIFNldCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGdpdmVuIGRpc3BsYXkKLSAgICBzdGF0aWMgaW50IHNldE9yaWVudGF0aW9uKERpc3BsYXlJRCBkcHksIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gUXVlcnkgdGhlIG51bWJlciBvZiBkaXNwbGF5cwotICAgIHN0YXRpYyBzc2l6ZV90IGdldE51bWJlck9mRGlzcGxheXMoKTsKLQotICAgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGRpc3BsYXkKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGlzcGxheUluZm8oRGlzcGxheUlEIGRweSwgRGlzcGxheUluZm8qIGluZm8pOwotICAgIHN0YXRpYyBzc2l6ZV90IGdldERpc3BsYXlXaWR0aChEaXNwbGF5SUQgZHB5KTsKLSAgICBzdGF0aWMgc3NpemVfdCBnZXREaXNwbGF5SGVpZ2h0KERpc3BsYXlJRCBkcHkpOwotICAgIHN0YXRpYyBzc2l6ZV90IGdldERpc3BsYXlPcmllbnRhdGlvbihEaXNwbGF5SUQgZHB5KTsKLQotICAgIHN0YXR1c190IGxpbmtUb0NvbXBvc2VyRGVhdGgoY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCi0gICAgICAgICAgICB2b2lkKiBjb29raWUgPSBOVUxMLCB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgc3RhdHVzX3QgICAgaGlkZShTdXJmYWNlSUQgaWQpOwotICAgIHN0YXR1c190ICAgIHNob3coU3VyZmFjZUlEIGlkLCBpbnQzMl90IGxheWVyID0gLTEpOwotICAgIHN0YXR1c190ICAgIGZyZWV6ZShTdXJmYWNlSUQgaWQpOwotICAgIHN0YXR1c190ICAgIHVuZnJlZXplKFN1cmZhY2VJRCBpZCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0RmxhZ3MoU3VyZmFjZUlEIGlkLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgbWFzayk7Ci0gICAgc3RhdHVzX3QgICAgc2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KFN1cmZhY2VJRCBpZCwgY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0TGF5ZXIoU3VyZmFjZUlEIGlkLCBpbnQzMl90IGxheWVyKTsKLSAgICBzdGF0dXNfdCAgICBzZXRBbHBoYShTdXJmYWNlSUQgaWQsIGZsb2F0IGFscGhhPTEuMGYpOwotICAgIHN0YXR1c190ICAgIHNldEZyZWV6ZVRpbnQoU3VyZmFjZUlEIGlkLCB1aW50MzJfdCB0aW50KTsKLSAgICBzdGF0dXNfdCAgICBzZXRNYXRyaXgoU3VyZmFjZUlEIGlkLCBmbG9hdCBkc2R4LCBmbG9hdCBkdGR4LCBmbG9hdCBkc2R5LCBmbG9hdCBkdGR5KTsKLSAgICBzdGF0dXNfdCAgICBzZXRQb3NpdGlvbihTdXJmYWNlSUQgaWQsIGZsb2F0IHgsIGZsb2F0IHkpOwotICAgIHN0YXR1c190ICAgIHNldFNpemUoU3VyZmFjZUlEIGlkLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoKTsKLSAgICBzdGF0dXNfdCAgICBkZXN0cm95U3VyZmFjZShTdXJmYWNlSUQgc2lkKTsKLQotcHJpdmF0ZToKLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotICAgIENvbXBvc2VyJiBnZXRDb21wb3NlcigpOwotCi0gICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICBtU3RhdHVzOwotICAgICAgICAgICAgICAgIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+ICBtQ2xpZW50OwotICAgICAgICAgICAgICAgIENvbXBvc2VyJiAgICAgICAgICAgICAgICAgICBtQ29tcG9zZXI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU2NyZWVuc2hvdENsaWVudAotewotICAgIHNwPElNZW1vcnlIZWFwPiBtSGVhcDsKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKLSAgICBQaXhlbEZvcm1hdCBtRm9ybWF0OwotcHVibGljOgotICAgIFNjcmVlbnNob3RDbGllbnQoKTsKLQotICAgIC8vIGZyZWVzIHRoZSBwcmV2aW91cyBzY3JlZW5zaG90IGFuZCBjYXB0dXJlIGEgbmV3IG9uZQotICAgIHN0YXR1c190IHVwZGF0ZSgpOwotICAgIHN0YXR1c190IHVwZGF0ZSh1aW50MzJfdCByZXFXaWR0aCwgdWludDMyX3QgcmVxSGVpZ2h0KTsKLSAgICBzdGF0dXNfdCB1cGRhdGUodWludDMyX3QgcmVxV2lkdGgsIHVpbnQzMl90IHJlcUhlaWdodCwKLSAgICAgICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKTsKLQotICAgIC8vIHJlbGVhc2UgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSBzY3JlZW5zaG90Ci0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICAvLyBwaXhlbHMgYXJlIHZhbGlkIHVudGlsIHRoaXMgb2JqZWN0IGlzIGZyZWVkIG9yCi0gICAgLy8gcmVsZWFzZSgpIG9yIHVwZGF0ZSgpIGlzIGNhbGxlZAotICAgIHZvaWQgY29uc3QqIGdldFBpeGVscygpIGNvbnN0OwotCi0gICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdDsKLSAgICBQaXhlbEZvcm1hdCBnZXRGb3JtYXQoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRTdHJpZGUoKSBjb25zdDsKLSAgICAvLyBzaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkgaW4gYnl0ZXMKLSAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HVUlfU1VSRkFDRV9DT01QT1NFUl9DTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmUuaCBiL2luY2x1ZGUvZ3VpL1N1cmZhY2VUZXh0dXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MzFlNTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0dVSV9TVVJGQUNFVEVYVFVSRV9ICi0jZGVmaW5lIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFX0gKLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VUZXh0dXJlLmg+Ci0jaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jZGVmaW5lIEFORFJPSURfR1JBUEhJQ1NfU1VSRkFDRVRFWFRVUkVfSk5JX0lEICJtU3VyZmFjZVRleHR1cmUiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBTdXJmYWNlVGV4dHVyZSA6IHB1YmxpYyBCdWZmZXJRdWV1ZSB7Ci1wdWJsaWM6Ci0KLSAgICAvLyBTdXJmYWNlVGV4dHVyZSBjb25zdHJ1Y3RzIGEgbmV3IFN1cmZhY2VUZXh0dXJlIG9iamVjdC4gdGV4IGluZGljYXRlcyB0aGUKLSAgICAvLyBuYW1lIG9mIHRoZSBPcGVuR0wgRVMgdGV4dHVyZSB0byB3aGljaCBpbWFnZXMgYXJlIHRvIGJlIHN0cmVhbWVkLiBUaGlzCi0gICAgLy8gdGV4dHVyZSBuYW1lIGNhbm5vdCBiZSBjaGFuZ2VkIG9uY2UgdGhlIFN1cmZhY2VUZXh0dXJlIGlzIGNyZWF0ZWQuCi0gICAgLy8gYWxsb3dTeW5jaHJvbm91c01vZGUgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHN5bmNocm9ub3VzIG1vZGUgY2FuIGJlCi0gICAgLy8gZW5hYmxlZC4gdGV4VGFyZ2V0IHNwZWNpZmllcyB0aGUgT3BlbkdMIEVTIHRleHR1cmUgdGFyZ2V0IHRvIHdoaWNoIHRoZQotICAgIC8vIHRleHR1cmUgd2lsbCBiZSBib3VuZCBpbiB1cGRhdGVUZXhJbWFnZS4gdXNlRmVuY2VTeW5jIHNwZWNpZmllcyB3aGV0aGVyCi0gICAgLy8gZmVuY2VzIHNob3VsZCBiZSB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBidWZmZXJzIGlmIHRoYXQgYmVoYXZpb3IKLSAgICAvLyBpcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZS4KLSAgICBTdXJmYWNlVGV4dHVyZShHTHVpbnQgdGV4LCBib29sIGFsbG93U3luY2hyb25vdXNNb2RlID0gdHJ1ZSwKLSAgICAgICAgICAgIEdMZW51bSB0ZXhUYXJnZXQgPSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgYm9vbCB1c2VGZW5jZVN5bmMgPSB0cnVlKTsKLQotICAgIHZpcnR1YWwgflN1cmZhY2VUZXh0dXJlKCk7Ci0KLQotCi0gICAgLy8gdXBkYXRlVGV4SW1hZ2Ugc2V0cyB0aGUgaW1hZ2UgY29udGVudHMgb2YgdGhlIHRhcmdldCB0ZXh0dXJlIHRvIHRoYXQgb2YKLSAgICAvLyB0aGUgbW9zdCByZWNlbnRseSBxdWV1ZWQgYnVmZmVyLgotICAgIC8vCi0gICAgLy8gVGhpcyBjYWxsIG1heSBvbmx5IGJlIG1hZGUgd2hpbGUgdGhlIE9wZW5HTCBFUyBjb250ZXh0IHRvIHdoaWNoIHRoZQotICAgIC8vIHRhcmdldCB0ZXh0dXJlIGJlbG9uZ3MgaXMgYm91bmQgdG8gdGhlIGNhbGxpbmcgdGhyZWFkLgotICAgIHN0YXR1c190IHVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICAvLyBzZXRCdWZmZXJDb3VudFNlcnZlciBzZXQgdGhlIGJ1ZmZlciBjb3VudC4gSWYgdGhlIGNsaWVudCBoYXMgcmVxdWVzdGVkCi0gICAgLy8gYSBidWZmZXIgY291bnQgdXNpbmcgc2V0QnVmZmVyQ291bnQsIHRoZSBzZXJ2ZXItYnVmZmVyIGNvdW50IHdpbGwKLSAgICAvLyB0YWtlIGVmZmVjdCBvbmNlIHRoZSBjbGllbnQgc2V0cyB0aGUgY291bnQgYmFjayB0byB6ZXJvLgotICAgIHN0YXR1c190IHNldEJ1ZmZlckNvdW50U2VydmVyKGludCBidWZmZXJDb3VudCk7Ci0KLSAgICAvLyBnZXRUcmFuc2Zvcm1NYXRyaXggcmV0cmlldmVzIHRoZSA0eDQgdGV4dHVyZSBjb29yZGluYXRlIHRyYW5zZm9ybSBtYXRyaXgKLSAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIHRleHR1cmUgaW1hZ2Ugc2V0IGJ5IHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvCi0gICAgLy8gdXBkYXRlVGV4SW1hZ2UuCi0gICAgLy8KLSAgICAvLyBUaGlzIHRyYW5zZm9ybSBtYXRyaXggbWFwcyAyRCBob21vZ2VuZW91cyB0ZXh0dXJlIGNvb3JkaW5hdGVzIG9mIHRoZSBmb3JtCi0gICAgLy8gKHMsIHQsIDAsIDEpIHdpdGggcyBhbmQgdCBpbiB0aGUgaW5jbHVzaXZlIHJhbmdlIFswLCAxXSB0byB0aGUgdGV4dHVyZQotICAgIC8vIGNvb3JkaW5hdGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzYW1wbGUgdGhhdCBsb2NhdGlvbiBmcm9tIHRoZSB0ZXh0dXJlLgotICAgIC8vIFNhbXBsaW5nIHRoZSB0ZXh0dXJlIG91dHNpZGUgb2YgdGhlIHJhbmdlIG9mIHRoaXMgdHJhbnNmb3JtIGlzIHVuZGVmaW5lZC4KLSAgICAvLwotICAgIC8vIFRoaXMgdHJhbnNmb3JtIGlzIG5lY2Vzc2FyeSB0byBjb21wZW5zYXRlIGZvciB0cmFuc2Zvcm1zIHRoYXQgdGhlIHN0cmVhbQotICAgIC8vIGNvbnRlbnQgcHJvZHVjZXIgbWF5IGltcGxpY2l0bHkgYXBwbHkgdG8gdGhlIGNvbnRlbnQuIEJ5IGZvcmNpbmcgdXNlcnMgb2YKLSAgICAvLyBhIFN1cmZhY2VUZXh0dXJlIHRvIGFwcGx5IHRoaXMgdHJhbnNmb3JtIHdlIGF2b2lkIHBlcmZvcm1pbmcgYW4gZXh0cmEKLSAgICAvLyBjb3B5IG9mIHRoZSBkYXRhIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGhpZGUgdGhlIHRyYW5zZm9ybSBmcm9tIHRoZQotICAgIC8vIHVzZXIuCi0gICAgLy8KLSAgICAvLyBUaGUgbWF0cml4IGlzIHN0b3JlZCBpbiBjb2x1bW4tbWFqb3Igb3JkZXIgc28gdGhhdCBpdCBtYXkgYmUgcGFzc2VkCi0gICAgLy8gZGlyZWN0bHkgdG8gT3BlbkdMIEVTIHZpYSB0aGUgZ2xMb2FkTWF0cml4ZiBvciBnbFVuaWZvcm1NYXRyaXg0ZnYKLSAgICAvLyBmdW5jdGlvbnMuCi0gICAgdm9pZCBnZXRUcmFuc2Zvcm1NYXRyaXgoZmxvYXQgbXR4WzE2XSk7Ci0KLSAgICAvLyBnZXRUaW1lc3RhbXAgcmV0cmlldmVzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXh0dXJlIGltYWdlCi0gICAgLy8gc2V0IGJ5IHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIHVwZGF0ZVRleEltYWdlLgotICAgIC8vCi0gICAgLy8gVGhlIHRpbWVzdGFtcCBpcyBpbiBuYW5vc2Vjb25kcywgYW5kIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4gSXRzCi0gICAgLy8gb3RoZXIgc2VtYW50aWNzICh6ZXJvIHBvaW50LCBldGMpIGFyZSBzb3VyY2UtZGVwZW5kZW50IGFuZCBzaG91bGQgYmUKLSAgICAvLyBkb2N1bWVudGVkIGJ5IHRoZSBzb3VyY2UuCi0gICAgaW50NjRfdCBnZXRUaW1lc3RhbXAoKTsKLQotICAgIC8vIHNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgc2V0cyB0aGUgbGlzdGVuZXIgb2JqZWN0IHRoYXQgd2lsbCBiZSBub3RpZmllZAotICAgIC8vIHdoZW4gYSBuZXcgZnJhbWUgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgdm9pZCBzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcik7Ci0KLSAgICAvLyBnZXRBbGxvY2F0b3IgcmV0cmlldmVzIHRoZSBiaW5kZXIgb2JqZWN0IHRoYXQgbXVzdCBiZSByZWZlcmVuY2VkIGFzIGxvbmcKLSAgICAvLyBhcyB0aGUgR3JhcGhpY0J1ZmZlcnMgZGVxdWV1ZWQgZnJvbSB0aGlzIFN1cmZhY2VUZXh0dXJlIGFyZSByZWZlcmVuY2VkLgotICAgIC8vIEhvbGRpbmcgdGhpcyBiaW5kZXIgcmVmZXJlbmNlIHByZXZlbnRzIFN1cmZhY2VGbGluZ2VyIGZyb20gZnJlZWluZyB0aGUKLSAgICAvLyBidWZmZXJzIGJlZm9yZSB0aGUgY2xpZW50IGlzIGRvbmUgd2l0aCB0aGVtLgotICAgIHNwPElCaW5kZXI+IGdldEFsbG9jYXRvcigpOwotCi0gICAgLy8gc2V0RGVmYXVsdEJ1ZmZlclNpemUgaXMgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgYnVmZmVycyByZXR1cm5lZCBieQotICAgIC8vIHJlcXVlc3RCdWZmZXJzIHdoZW4gYSB3aXRoIGFuZCBoZWlnaHQgb2YgemVybyBpcyByZXF1ZXN0ZWQuCi0gICAgLy8gQSBjYWxsIHRvIHNldERlZmF1bHRCdWZmZXJTaXplKCkgbWF5IHRyaWdnZXIgcmVxdWVzdEJ1ZmZlcnMoKSB0bwotICAgIC8vIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGllbnQuCi0gICAgLy8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgcGFyYW1ldGVycyBtdXN0IGJlIG5vIGdyZWF0ZXIgdGhhbiB0aGUgbWluaW11bSBvZgotICAgIC8vIEdMX01BWF9WSUVXUE9SVF9ESU1TIGFuZCBHTF9NQVhfVEVYVFVSRV9TSVpFIChzZWU6IGdsR2V0SW50ZWdlcnYpLgotICAgIC8vIEFuIGVycm9yIGR1ZSB0byBpbnZhbGlkIGRpbWVuc2lvbnMgbWlnaHQgbm90IGJlIHJlcG9ydGVkIHVudGlsCi0gICAgLy8gdXBkYXRlVGV4SW1hZ2UoKSBpcyBjYWxsZWQuCi0gICAgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0KLSAgICAvLyBnZXRDdXJyZW50QnVmZmVyIHJldHVybnMgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgaW1hZ2UuCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2V0Q3VycmVudEJ1ZmZlcigpIGNvbnN0OwotCi0gICAgLy8gZ2V0Q3VycmVudFRleHR1cmVUYXJnZXQgcmV0dXJucyB0aGUgdGV4dHVyZSB0YXJnZXQgb2YgdGhlIGN1cnJlbnQKLSAgICAvLyB0ZXh0dXJlIGFzIHJldHVybmVkIGJ5IHVwZGF0ZVRleEltYWdlKCkuCi0gICAgR0xlbnVtIGdldEN1cnJlbnRUZXh0dXJlVGFyZ2V0KCkgY29uc3Q7Ci0KLSAgICAvLyBnZXRDdXJyZW50Q3JvcCByZXR1cm5zIHRoZSBjcm9wcGluZyByZWN0YW5nbGUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyCi0gICAgUmVjdCBnZXRDdXJyZW50Q3JvcCgpIGNvbnN0OwotCi0gICAgLy8gZ2V0Q3VycmVudFRyYW5zZm9ybSByZXR1cm5zIHRoZSB0cmFuc2Zvcm0gb2YgdGhlIGN1cnJlbnQgYnVmZmVyCi0gICAgdWludDMyX3QgZ2V0Q3VycmVudFRyYW5zZm9ybSgpIGNvbnN0OwotCi0gICAgLy8gZ2V0Q3VycmVudFNjYWxpbmdNb2RlIHJldHVybnMgdGhlIHNjYWxpbmcgbW9kZSBvZiB0aGUgY3VycmVudCBidWZmZXIKLSAgICB1aW50MzJfdCBnZXRDdXJyZW50U2NhbGluZ01vZGUoKSBjb25zdDsKLQotICAgIC8vIGlzU3luY2hyb25vdXNNb2RlIHJldHVybnMgd2hldGhlciB0aGUgU3VyZmFjZVRleHR1cmUgaXMgY3VycmVudGx5IGluCi0gICAgLy8gc3luY2hyb25vdXMgbW9kZS4KLSAgICBib29sIGlzU3luY2hyb25vdXNNb2RlKCkgY29uc3Q7Ci0KLSAgICAvLyBhYmFuZG9uIGZyZWVzIGFsbCB0aGUgYnVmZmVycyBhbmQgcHV0cyB0aGUgU3VyZmFjZVRleHR1cmUgaW50byB0aGUKLSAgICAvLyAnYWJhbmRvbmVkJyBzdGF0ZS4gIE9uY2UgcHV0IGluIHRoaXMgc3RhdGUgdGhlIFN1cmZhY2VUZXh0dXJlIGNhbiBuZXZlcgotICAgIC8vIGxlYXZlIGl0LiAgV2hlbiBpbiB0aGUgJ2FiYW5kb25lZCcgc3RhdGUsIGFsbCBtZXRob2RzIG9mIHRoZQotICAgIC8vIElTdXJmYWNlVGV4dHVyZSBpbnRlcmZhY2Ugd2lsbCBmYWlsIHdpdGggdGhlIE5PX0lOSVQgZXJyb3IuCi0gICAgLy8KLSAgICAvLyBOb3RlIHRoYXQgd2hpbGUgY2FsbGluZyB0aGlzIG1ldGhvZCBjYXVzZXMgYWxsIHRoZSBidWZmZXJzIHRvIGJlIGZyZWVkCi0gICAgLy8gZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHRoZSBTdXJmYWNlVGV4dHVyZSwgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwKLSAgICAvLyByZWZlcmVuY2VzIG9uIHRoZSBidWZmZXJzIChlLmcuIGlmIGEgYnVmZmVyIGlzIHJlZmVyZW5jZWQgYnkgYSBjbGllbnQgb3IKLSAgICAvLyBieSBPcGVuR0wgRVMgYXMgYSB0ZXh0dXJlKSB0aGVuIHRob3NlIGJ1ZmZlciB3aWxsIHJlbWFpbiBhbGxvY2F0ZWQuCi0gICAgdm9pZCBhYmFuZG9uKCk7Ci0KLSAgICAvLyBzZXQgdGhlIG5hbWUgb2YgdGhlIFN1cmZhY2VUZXh0dXJlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IGl0IGluCi0gICAgLy8gbG9nIG1lc3NhZ2VzLgotICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKTsKLQotICAgIC8vIGR1bXAgb3VyIHN0YXRlIGluIGEgU3RyaW5nCi0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLQotICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKLQotcHJpdmF0ZToKLQotICAgIC8vIGNyZWF0ZUltYWdlIGNyZWF0ZXMgYSBuZXcgRUdMSW1hZ2UgZnJvbSBhIEdyYXBoaWNCdWZmZXIuCi0gICAgRUdMSW1hZ2VLSFIgY3JlYXRlSW1hZ2UoRUdMRGlzcGxheSBkcHksCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlcik7Ci0KLSAgICAvLyBjb21wdXRlQ3VycmVudFRyYW5zZm9ybU1hdHJpeCBjb21wdXRlcyB0aGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlCi0gICAgLy8gY3VycmVudCB0ZXh0dXJlLiAgSXQgdXNlcyBtQ3VycmVudFRyYW5zZm9ybSBhbmQgdGhlIGN1cnJlbnQgR3JhcGhpY0J1ZmZlcgotICAgIC8vIHRvIGNvbXB1dGUgdGhpcyBtYXRyaXggYW5kIHN0b3JlcyBpdCBpbiBtQ3VycmVudFRyYW5zZm9ybU1hdHJpeC4KLSAgICB2b2lkIGNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4KCk7Ci0KLSAgICAvLyBtQ3VycmVudFRleHR1cmVCdWYgaXMgdGhlIGdyYXBoaWMgYnVmZmVyIG9mIHRoZSBjdXJyZW50IHRleHR1cmUuIEl0J3MKLSAgICAvLyBwb3NzaWJsZSB0aGF0IHRoaXMgYnVmZmVyIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IGJ1ZmZlciBzbG90LCBzbyB3ZQotICAgIC8vIG11c3QgdHJhY2sgaXQgc2VwYXJhdGVseSBpbiBvcmRlciB0byBzdXBwb3J0IHRoZSBnZXRDdXJyZW50QnVmZmVyIG1ldGhvZC4KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBtQ3VycmVudFRleHR1cmVCdWY7Ci0KLSAgICAvLyBtQ3VycmVudENyb3AgaXMgdGhlIGNyb3AgcmVjdGFuZ2xlIHRoYXQgYXBwbGllcyB0byB0aGUgY3VycmVudCB0ZXh0dXJlLgotICAgIC8vIEl0IGdldHMgc2V0IGVhY2ggdGltZSB1cGRhdGVUZXhJbWFnZSBpcyBjYWxsZWQuCi0gICAgUmVjdCBtQ3VycmVudENyb3A7Ci0KLSAgICAvLyBtQ3VycmVudFRyYW5zZm9ybSBpcyB0aGUgdHJhbnNmb3JtIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHRleHR1cmUuIEl0Ci0gICAgLy8gZ2V0cyBzZXQgZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4KLSAgICB1aW50MzJfdCBtQ3VycmVudFRyYW5zZm9ybTsKLQotICAgIC8vIG1DdXJyZW50U2NhbGluZ01vZGUgaXMgdGhlIHNjYWxpbmcgbW9kZSBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZS4gSXQgZ2V0cwotICAgIC8vIHNldCB0byBlYWNoIHRpbWUgdXBkYXRlVGV4SW1hZ2UgaXMgY2FsbGVkLgotICAgIHVpbnQzMl90IG1DdXJyZW50U2NhbGluZ01vZGU7Ci0KLSAgICAvLyBtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCBpcyB0aGUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgdGhlIGN1cnJlbnQgdGV4dHVyZS4KLSAgICAvLyBJdCBnZXRzIGNvbXB1dGVkIGJ5IGNvbXB1dGVUcmFuc2Zvcm1NYXRyaXggZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzCi0gICAgLy8gY2FsbGVkLgotICAgIGZsb2F0IG1DdXJyZW50VHJhbnNmb3JtTWF0cml4WzE2XTsKLQotICAgIC8vIG1DdXJyZW50VGltZXN0YW1wIGlzIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBjdXJyZW50IHRleHR1cmUuIEl0Ci0gICAgLy8gZ2V0cyBzZXQgZWFjaCB0aW1lIHVwZGF0ZVRleEltYWdlIGlzIGNhbGxlZC4KLSAgICBpbnQ2NF90IG1DdXJyZW50VGltZXN0YW1wOwotCi0gICAgLy8gbVRleE5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIE9wZW5HTCB0ZXh0dXJlIHRvIHdoaWNoIHN0cmVhbWVkIGltYWdlcyB3aWxsCi0gICAgLy8gYmUgYm91bmQgd2hlbiB1cGRhdGVUZXhJbWFnZSBpcyBjYWxsZWQuIEl0IGlzIHNldCBhdCBjb25zdHJ1Y3Rpb24gdGltZQotICAgIC8vIGNoYW5nZWQgd2l0aCBhIGNhbGwgdG8gc2V0VGV4TmFtZS4KLSAgICBjb25zdCBHTHVpbnQgbVRleE5hbWU7Ci0KLSAgICAvLyBtVXNlRmVuY2VTeW5jIGluZGljYXRlcyB3aGV0aGVyIGNyZWF0aW9uIG9mIHRoZSBFR0xfS0hSX2ZlbmNlX3N5bmMKLSAgICAvLyBleHRlbnNpb24gc2hvdWxkIGJlIHVzZWQgdG8gcHJldmVudCBidWZmZXJzIGZyb20gYmVpbmcgZGVxdWV1ZWQgYmVmb3JlCi0gICAgLy8gaXQncyBzYWZlIGZvciB0aGVtIHRvIGJlIHdyaXR0ZW4uIEl0IGdldHMgc2V0IGF0IGNvbnN0cnVjdGlvbiB0aW1lIGFuZAotICAgIC8vIG5ldmVyIGNoYW5nZXMuCi0gICAgY29uc3QgYm9vbCBtVXNlRmVuY2VTeW5jOwotCi0gICAgLy8gbVRleFRhcmdldCBpcyB0aGUgR0wgdGV4dHVyZSB0YXJnZXQgd2l0aCB3aGljaCB0aGUgR0wgdGV4dHVyZSBvYmplY3QgaXMKLSAgICAvLyBhc3NvY2lhdGVkLiAgSXQgaXMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgbmV2ZXIgY2hhbmdlZC4gIEl0IGlzCi0gICAgLy8gYWxtb3N0IGFsd2F5cyBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyBleGNlcHQgZm9yIG9uZSB1c2UgY2FzZSBpbiBBbmRyb2lkCi0gICAgLy8gQnJvd3Nlci4gIEluIHRoYXQgY2FzZSBpdCBpcyBzZXQgdG8gR0xfVEVYVFVSRV8yRCB0byBhbGxvdwotICAgIC8vIGdsQ29weVRleFN1YkltYWdlIHRvIHJlYWQgZnJvbSB0aGUgdGV4dHVyZS4gIFRoaXMgaXMgYSBoYWNrIHRvIHdvcmsKLSAgICAvLyBhcm91bmQgYSBHTCBkcml2ZXIgbGltaXRhdGlvbiBvbiB0aGUgbnVtYmVyIG9mIEZCTyBhdHRhY2htZW50cywgd2hpY2ggdGhlCi0gICAgLy8gYnJvd3NlcidzIHRpbGUgY2FjaGUgZXhjZWVkcy4KLSAgICBjb25zdCBHTGVudW0gbVRleFRhcmdldDsKLQotICAgIC8vIFN1cmZhY2VUZXh0dXJlIG1haW50YWlucyBFR0wgaW5mb3JtYXRpb24gYWJvdXQgR3JhcGhpY0J1ZmZlcnMgdGhhdCBjb3JyZXNwb25kcwotICAgIC8vIGRpcmVjdGx5IHdpdGggQnVmZmVyUXVldWUncyBidWZmZXJzCi0gICAgc3RydWN0IEVHTFNsb3QgewotICAgICAgICBFR0xTbG90KCkKLSAgICAgICAgOiBtRWdsSW1hZ2UoRUdMX05PX0lNQUdFX0tIUiksCi0gICAgICAgICAgbUVnbERpc3BsYXkoRUdMX05PX0RJU1BMQVkpLAotICAgICAgICAgIG1GZW5jZShFR0xfTk9fU1lOQ19LSFIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1HcmFwaGljQnVmZmVyOwotCi0gICAgICAgIC8vIG1FZ2xJbWFnZSBpcyB0aGUgRUdMSW1hZ2UgY3JlYXRlZCBmcm9tIG1HcmFwaGljQnVmZmVyLgotICAgICAgICBFR0xJbWFnZUtIUiBtRWdsSW1hZ2U7Ci0KLSAgICAgICAgLy8gbUVnbERpc3BsYXkgaXMgdGhlIEVHTERpc3BsYXkgdXNlZCB0byBjcmVhdGUgbUVnbEltYWdlLgotICAgICAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotCi0gICAgICAgIC8vIG1GZW5jZSBpcyB0aGUgRUdMIHN5bmMgb2JqZWN0IHRoYXQgbXVzdCBzaWduYWwgYmVmb3JlIHRoZSBidWZmZXIKLSAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyIHNsb3QgbWF5IGJlIGRlcXVldWVkLiBJdCBpcyBpbml0aWFsaXplZAotICAgICAgICAvLyB0byBFR0xfTk9fU1lOQ19LSFIgd2hlbiB0aGUgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIChvcHRpb25hbGx5LCBiYXNlZAotICAgICAgICAvLyBvbiBhIGNvbXBpbGUtdGltZSBvcHRpb24pIHNldCB0byBhIG5ldyBzeW5jIG9iamVjdCBpbiB1cGRhdGVUZXhJbWFnZS4KLSAgICAgICAgRUdMU3luY0tIUiBtRmVuY2U7Ci0gICAgfTsKLQotICAgIEVHTFNsb3QgbUVHTFNsb3RzW05VTV9CVUZGRVJfU0xPVFNdOwotCi0gICAgLy8gbUFiYW5kb25lZCBpbmRpY2F0ZXMgdGhhdCB0aGUgQnVmZmVyUXVldWUgd2lsbCBubyBsb25nZXIgYmUgdXNlZCB0bwotICAgIC8vIGNvbnN1bWUgaW1hZ2VzIGJ1ZmZlcnMgcHVzaGVkIHRvIGl0IHVzaW5nIHRoZSBJU3VyZmFjZVRleHR1cmUgaW50ZXJmYWNlLgotICAgIC8vIEl0IGlzIGluaXRpYWxpemVkIHRvIGZhbHNlLCBhbmQgc2V0IHRvIHRydWUgaW4gdGhlIGFiYW5kb24gbWV0aG9kLiAgQQotICAgIC8vIEJ1ZmZlclF1ZXVlIHRoYXQgaGFzIGJlZW4gYWJhbmRvbmVkIHdpbGwgcmV0dXJuIHRoZSBOT19JTklUIGVycm9yIGZyb20KLSAgICAvLyBhbGwgSVN1cmZhY2VUZXh0dXJlIG1ldGhvZHMgY2FwYWJsZSBvZiByZXR1cm5pbmcgYW4gZXJyb3IuCi0gICAgYm9vbCBtQWJhbmRvbmVkOwotCi0gICAgLy8gbU5hbWUgaXMgYSBzdHJpbmcgdXNlZCB0byBpZGVudGlmeSB0aGUgU3VyZmFjZVRleHR1cmUgaW4gbG9nIG1lc3NhZ2VzLgotICAgIC8vIEl0IGNhbiBiZSBzZXQgYnkgdGhlIHNldE5hbWUgbWV0aG9kLgotICAgIFN0cmluZzggbU5hbWU7Ci0KLSAgICAvLyBtTXV0ZXggaXMgdGhlIG11dGV4IHVzZWQgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgbWVtYmVyCi0gICAgLy8gdmFyaWFibGVzIG9mIFN1cmZhY2VUZXh0dXJlIG9iamVjdHMuIEl0IG11c3QgYmUgbG9ja2VkIHdoZW5ldmVyIHRoZQotICAgIC8vIG1lbWJlciB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkLgotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwotCi0gICAgLy8gbUN1cnJlbnRUZXh0dXJlIGlzIHRoZSBidWZmZXIgc2xvdCBpbmRleCBvZiB0aGUgYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5Ci0gICAgLy8gYm91bmQgdG8gdGhlIE9wZW5HTCB0ZXh0dXJlLiBJdCBpcyBpbml0aWFsaXplZCB0byBJTlZBTElEX0JVRkZFUl9TTE9ULAotICAgIC8vIGluZGljYXRpbmcgdGhhdCBubyBidWZmZXIgc2xvdCBpcyBjdXJyZW50bHkgYm91bmQgdG8gdGhlIHRleHR1cmUuIE5vdGUsCi0gICAgLy8gaG93ZXZlciwgdGhhdCBhIHZhbHVlIG9mIElOVkFMSURfQlVGRkVSX1NMT1QgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbgotICAgIC8vIHRoYXQgbm8gYnVmZmVyIGlzIGJvdW5kIHRvIHRoZSB0ZXh0dXJlLiBBIGNhbGwgdG8gc2V0QnVmZmVyQ291bnQgd2lsbAotICAgIC8vIHJlc2V0IG1DdXJyZW50VGV4dHVyZSB0byBJTlZBTElEX0JVRkZFUl9TTE9ULgotICAgIGludCBtQ3VycmVudFRleHR1cmU7Ci0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0dVSV9TVVJGQUNFVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oIGIvaW5jbHVkZS9ndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3ZmU0OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR1VJX1NVUkZBQ0VURVhUVVJFQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVDTElFTlRfSAotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlVGV4dHVyZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZS5oPgotCi0jaW5jbHVkZSA8dWkvQU5hdGl2ZU9iamVjdEJhc2UuaD4KLSNpbmNsdWRlIDx1aS9SZWdpb24uaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZTsKLQotY2xhc3MgU3VyZmFjZVRleHR1cmVDbGllbnQKLSAgICA6IHB1YmxpYyBBTmF0aXZlT2JqZWN0QmFzZTxBTmF0aXZlV2luZG93LCBTdXJmYWNlVGV4dHVyZUNsaWVudCwgUmVmQmFzZT4KLXsKLXB1YmxpYzoKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudChjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlVGV4dHVyZSk7Ci0KLSAgICBzcDxJU3VyZmFjZVRleHR1cmU+IGdldElTdXJmYWNlVGV4dHVyZSgpIGNvbnN0OwotCi1wcm90ZWN0ZWQ6Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQoKTsKLSAgICB2aXJ0dWFsIH5TdXJmYWNlVGV4dHVyZUNsaWVudCgpOwotICAgIHZvaWQgc2V0SVN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2VUZXh0dXJlKTsKLQotcHJpdmF0ZToKLSAgICAvLyBjYW4ndCBiZSBjb3BpZWQKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudCYgb3BlcmF0b3IgPSAoY29uc3QgU3VyZmFjZVRleHR1cmVDbGllbnQmIHJocyk7Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQoY29uc3QgU3VyZmFjZVRleHR1cmVDbGllbnQmIHJocyk7Ci0gICAgdm9pZCBpbml0KCk7Ci0KLSAgICAvLyBBTmF0aXZlV2luZG93IGhvb2tzCi0gICAgc3RhdGljIGludCBob29rX2NhbmNlbEJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgc3RhdGljIGludCBob29rX2RlcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBTmF0aXZlV2luZG93QnVmZmVyKiogYnVmZmVyKTsKLSAgICBzdGF0aWMgaW50IGhvb2tfbG9ja0J1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgc3RhdGljIGludCBob29rX3BlcmZvcm0oQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgb3BlcmF0aW9uLCAuLi4pOwotICAgIHN0YXRpYyBpbnQgaG9va19xdWVyeShjb25zdCBBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCB3aGF0LCBpbnQqIHZhbHVlKTsKLSAgICBzdGF0aWMgaW50IGhvb2tfcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpOwotICAgIHN0YXRpYyBpbnQgaG9va19zZXRTd2FwSW50ZXJ2YWwoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgaW50ZXJ2YWwpOwotCi0gICAgaW50IGRpc3BhdGNoQ29ubmVjdCh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaERpc2Nvbm5lY3QodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hTZXRCdWZmZXJDb3VudCh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaFNldEJ1ZmZlcnNHZW9tZXRyeSh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaFNldEJ1ZmZlcnNEaW1lbnNpb25zKHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0QnVmZmVyc0Zvcm1hdCh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaFNldFNjYWxpbmdNb2RlKHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0QnVmZmVyc1RyYW5zZm9ybSh2YV9saXN0IGFyZ3MpOwotICAgIGludCBkaXNwYXRjaFNldEJ1ZmZlcnNUaW1lc3RhbXAodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hTZXRDcm9wKHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoU2V0VXNhZ2UodmFfbGlzdCBhcmdzKTsKLSAgICBpbnQgZGlzcGF0Y2hMb2NrKHZhX2xpc3QgYXJncyk7Ci0gICAgaW50IGRpc3BhdGNoVW5sb2NrQW5kUG9zdCh2YV9saXN0IGFyZ3MpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBpbnQgY2FuY2VsQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgdmlydHVhbCBpbnQgZGVxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiogYnVmZmVyKTsKLSAgICB2aXJ0dWFsIGludCBsb2NrQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgdmlydHVhbCBpbnQgcGVyZm9ybShpbnQgb3BlcmF0aW9uLCB2YV9saXN0IGFyZ3MpOwotICAgIHZpcnR1YWwgaW50IHF1ZXJ5KGludCB3aGF0LCBpbnQqIHZhbHVlKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpOwotICAgIHZpcnR1YWwgaW50IHNldFN3YXBJbnRlcnZhbChpbnQgaW50ZXJ2YWwpOwotCi0gICAgdmlydHVhbCBpbnQgY29ubmVjdChpbnQgYXBpKTsKLSAgICB2aXJ0dWFsIGludCBkaXNjb25uZWN0KGludCBhcGkpOwotICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0gICAgdmlydHVhbCBpbnQgc2V0QnVmZmVyc0RpbWVuc2lvbnMoaW50IHcsIGludCBoKTsKLSAgICB2aXJ0dWFsIGludCBzZXRCdWZmZXJzRm9ybWF0KGludCBmb3JtYXQpOwotICAgIHZpcnR1YWwgaW50IHNldFNjYWxpbmdNb2RlKGludCBtb2RlKTsKLSAgICB2aXJ0dWFsIGludCBzZXRCdWZmZXJzVHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXApOwotICAgIHZpcnR1YWwgaW50IHNldENyb3AoUmVjdCBjb25zdCogcmVjdCk7Ci0gICAgdmlydHVhbCBpbnQgc2V0VXNhZ2UodWludDMyX3QgcmVxVXNhZ2UpOwotICAgIHZpcnR1YWwgaW50IGxvY2soQU5hdGl2ZVdpbmRvd19CdWZmZXIqIG91dEJ1ZmZlciwgQVJlY3QqIGluT3V0RGlydHlCb3VuZHMpOwotICAgIHZpcnR1YWwgaW50IHVubG9ja0FuZFBvc3QoKTsKLQotICAgIGVudW0geyBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTID0gU3VyZmFjZVRleHR1cmU6Ok1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgfTsKLSAgICBlbnVtIHsgTlVNX0JVRkZFUl9TTE9UUyA9IFN1cmZhY2VUZXh0dXJlOjpOVU1fQlVGRkVSX1NMT1RTIH07Ci0gICAgZW51bSB7IERFRkFVTFRfRk9STUFUID0gUElYRUxfRk9STUFUX1JHQkFfODg4OCB9OwotCi1wcml2YXRlOgotICAgIHZvaWQgZnJlZUFsbEJ1ZmZlcnMoKTsKLSAgICBpbnQgZ2V0U2xvdEZyb21CdWZmZXJMb2NrZWQoYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZmZlcikgY29uc3Q7Ci0KLSAgICAvLyBtU3VyZmFjZVRleHR1cmUgaXMgdGhlIGludGVyZmFjZSB0byB0aGUgc3VyZmFjZSB0ZXh0dXJlIHNlcnZlci4gQWxsCi0gICAgLy8gb3BlcmF0aW9ucyBvbiB0aGUgc3VyZmFjZSB0ZXh0dXJlIGNsaWVudCB1bHRpbWF0ZWx5IHRyYW5zbGF0ZSBpbnRvCi0gICAgLy8gaW50ZXJhY3Rpb25zIHdpdGggdGhlIHNlcnZlciB1c2luZyB0aGlzIGludGVyZmFjZS4KLSAgICBzcDxJU3VyZmFjZVRleHR1cmU+IG1TdXJmYWNlVGV4dHVyZTsKLQotICAgIC8vIG1TbG90cyBzdG9yZXMgdGhlIGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGZvciBlYWNoIGJ1ZmZlciBzbG90LgotICAgIC8vIEl0IGlzIGluaXRpYWxpemVkIHRvIG51bGwgcG9pbnRlcnMsIGFuZCBnZXRzIGZpbGxlZCBpbiB3aXRoIHRoZSByZXN1bHQgb2YKLSAgICAvLyBJU3VyZmFjZVRleHR1cmU6OnJlcXVlc3RCdWZmZXIgd2hlbiB0aGUgY2xpZW50IGRlcXVldWVzIGEgYnVmZmVyIGZyb20gYQotICAgIC8vIHNsb3QgdGhhdCBoYXMgbm90IHlldCBiZWVuIHVzZWQuIFRoZSBidWZmZXIgYWxsb2NhdGVkIHRvIGEgc2xvdCB3aWxsIGFsc28KLSAgICAvLyBiZSByZXBsYWNlZCBpZiB0aGUgcmVxdWVzdGVkIGJ1ZmZlciB1c2FnZSBvciBnZW9tZXRyeSBkaWZmZXJzIGZyb20gdGhhdAotICAgIC8vIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkIHRvIGEgc2xvdC4KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBtU2xvdHNbTlVNX0JVRkZFUl9TTE9UU107Ci0KLSAgICAvLyBtUmVxV2lkdGggaXMgdGhlIGJ1ZmZlciB3aWR0aCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIGF0IHRoZSBuZXh0IGRlcXVldWUKLSAgICAvLyBvcGVyYXRpb24uIEl0IGlzIGluaXRpYWxpemVkIHRvIDEuCi0gICAgdWludDMyX3QgbVJlcVdpZHRoOwotCi0gICAgLy8gbVJlcUhlaWdodCBpcyB0aGUgYnVmZmVyIGhlaWdodCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIGF0IHRoZSBuZXh0IGRldXF1ZQotICAgIC8vIG9wZXJhdGlvbi4gSXQgaXMgaW5pdGlhbGl6ZWQgdG8gMS4KLSAgICB1aW50MzJfdCBtUmVxSGVpZ2h0OwotCi0gICAgLy8gbVJlcUZvcm1hdCBpcyB0aGUgYnVmZmVyIHBpeGVsIGZvcm1hdCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIGF0IHRoZSBuZXh0Ci0gICAgLy8gZGV1cXVlIG9wZXJhdGlvbi4gSXQgaXMgaW5pdGlhbGl6ZWQgdG8gUElYRUxfRk9STUFUX1JHQkFfODg4OC4KLSAgICB1aW50MzJfdCBtUmVxRm9ybWF0OwotCi0gICAgLy8gbVJlcVVzYWdlIGlzIHRoZSBzZXQgb2YgYnVmZmVyIHVzYWdlIGZsYWdzIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQKLSAgICAvLyBhdCB0aGUgbmV4dCBkZXVxdWUgb3BlcmF0aW9uLiBJdCBpcyBpbml0aWFsaXplZCB0byAwLgotICAgIHVpbnQzMl90IG1SZXFVc2FnZTsKLQotICAgIC8vIG1UaW1lc3RhbXAgaXMgdGhlIHRpbWVzdGFtcCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5leHQgYnVmZmVyIHF1ZXVlCi0gICAgLy8gb3BlcmF0aW9uLiBJdCBkZWZhdWx0cyB0byBOQVRJVkVfV0lORE9XX1RJTUVTVEFNUF9BVVRPLCB3aGljaCBtZWFucyB0aGF0Ci0gICAgLy8gYSB0aW1lc3RhbXAgaXMgYXV0by1nZW5lcmF0ZWQgd2hlbiBxdWV1ZUJ1ZmZlciBpcyBjYWxsZWQuCi0gICAgaW50NjRfdCBtVGltZXN0YW1wOwotCi0gICAgLy8gbURlZmF1bHRXaWR0aCBpcyBkZWZhdWx0IHdpZHRoIG9mIHRoZSB3aW5kb3csIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gICAgLy8gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zIGNhbGwKLSAgICB1aW50MzJfdCBtRGVmYXVsdFdpZHRoOwotCi0gICAgLy8gbURlZmF1bHRIZWlnaHQgaXMgZGVmYXVsdCB3aWR0aCBvZiB0aGUgd2luZG93LCByZWdhcmRsZXNzIG9mIHRoZQotICAgIC8vIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyBjYWxsCi0gICAgdWludDMyX3QgbURlZmF1bHRIZWlnaHQ7Ci0KLSAgICAvLyBtVHJhbnNmb3JtSGludCBpcyB0aGUgdHJhbnNmb3JtIHByb2JhYmx5IGFwcGxpZWQgdG8gYnVmZmVycyBvZiB0aGlzCi0gICAgLy8gd2luZG93LiB0aGlzIGlzIG9ubHkgYSBoaW50LCBhY3R1YWwgdHJhbnNmb3JtIG1heSBkaWZmZXIuCi0gICAgdWludDMyX3QgbVRyYW5zZm9ybUhpbnQ7Ci0KLSAgICAvLyBtTXV0ZXggaXMgdGhlIG11dGV4IHVzZWQgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgbWVtYmVyCi0gICAgLy8gdmFyaWFibGVzIG9mIFN1cmZhY2VUZXh0dXJlIG9iamVjdHMuIEl0IG11c3QgYmUgbG9ja2VkIHdoZW5ldmVyIHRoZQotICAgIC8vIG1lbWJlciB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkLgotICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwotCi0gICAgLy8gbXVzdCBiZSB1c2VkIGZyb20gdGhlIGxvY2svdW5sb2NrIHRocmVhZAotICAgIHNwPEdyYXBoaWNCdWZmZXI+ICAgICAgICAgICBtTG9ja2VkQnVmZmVyOwotICAgIHNwPEdyYXBoaWNCdWZmZXI+ICAgICAgICAgICBtUG9zdGVkQnVmZmVyOwotICAgIG11dGFibGUgUmVnaW9uICAgICAgICAgICAgICBtT2xkRGlydHlSZWdpb247Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRUb0NwdTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9HVUlfU1VSRkFDRVRFWFRVUkVDTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCmluZGV4IGUyMGYxZmQuLmNjMGE1OTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAorKysgYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKQEAgLTIxOCw4ICsyMTgsOCBAQAogICAgICAgICAvLyBJQXVkaW9GbGluZ2VyQ2xpZW50CiAKICAgICAgICAgLy8gaW5kaWNhdGUgYSBjaGFuZ2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYW4gb3V0cHV0IG9yIGlucHV0OiBrZWVwcyB0aGUgY2FjaGVkCi0gICAgICAgIC8vIHZhbHVlcyBmb3Igb3V0cHV0L2lucHV0IHBhcmFtZXRlcnMgdXB0byBkYXRlIGluIGNsaWVudCBwcm9jZXNzCi0gICAgICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKTsKKyAgICAgICAgLy8gdmFsdWVzIGZvciBvdXRwdXQvaW5wdXQgcGFyYW1ldGVycyB1cC10by1kYXRlIGluIGNsaWVudCBwcm9jZXNzCisgICAgICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKICAgICB9OwogCiAgICAgY2xhc3MgQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmgKaW5kZXggZjNiNGRmMS4uNzVhOTk3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlckNsaWVudCk7CiAKICAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiBhdWRpbyBpbnB1dC9vdXRwdXQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHZvaWQgaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIHZvaWQgKnBhcmFtMikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKSA9IDA7CiAKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9iaW5kZXIvU3RhdGljLmggYi9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL1N0YXRpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjBmOWZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9iaW5kZXIvU3RhdGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWxsIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSwgdG8gY29udHJvbCBpbml0aWFsaXphdGlvbiBhbmQKLS8vIGRlc3RydWN0aW9uIG9yZGVyIGluIHRoZSBsaWJyYXJ5LgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEZvciBQcm9jZXNzU3RhdGUuY3BwCi1leHRlcm4gTXV0ZXggZ1Byb2Nlc3NNdXRleDsKLWV4dGVybiBzcDxQcm9jZXNzU3RhdGU+IGdQcm9jZXNzOwotCi0vLyBGb3IgU2VydmljZU1hbmFnZXIuY3BwCi1leHRlcm4gTXV0ZXggZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2s7Ci1leHRlcm4gc3A8SVNlcnZpY2VNYW5hZ2VyPiBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyOwotZXh0ZXJuIHNwPElQZXJtaXNzaW9uQ29udHJvbGxlcj4gZ1Blcm1pc3Npb25Db250cm9sbGVyOwotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS9iaW5kZXIvYmluZGVyX21vZHVsZS5oIGIvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9iaW5kZXJfbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZGQ2NGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9iaW5kZXJfbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfQklOREVSX01PRFVMRV9IXwotI2RlZmluZSBfQklOREVSX01PRFVMRV9IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSBhbmRyb2lkIHsKLSNlbmRpZgotCi0vKiBvYnRhaW4gc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzIGZyb20gdGhlIGtlcm5lbCBoZWFkZXIgKi8KLQotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L2JpbmRlci5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotI2VuZGlmCi0KLSNlbmRpZiAvLyBfQklOREVSX01PRFVMRV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaCBiL2luY2x1ZGUvcHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQ5MWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfUFJJVkFURV9HVUlfQ09NUE9TRVJfU0VSVklDRV9ICi0jZGVmaW5lIEFORFJPSURfUFJJVkFURV9HVUlfQ09NUE9TRVJfU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBJTWVtb3J5SGVhcDsKLWNsYXNzIElTdXJmYWNlQ29tcG9zZXI7Ci1jbGFzcyBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ29tcG9zZXJTZXJ2aWNlIDogcHVibGljIFNpbmdsZXRvbjxDb21wb3NlclNlcnZpY2U+Ci17Ci0gICAgLy8gdGhlc2UgYXJlIGNvbnN0YW50cwotICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IG1Db21wb3NlclNlcnZpY2U7Ci0gICAgc3A8SU1lbW9yeUhlYXA+IG1TZXJ2ZXJDYmxrTWVtb3J5OwotICAgIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3Qgdm9sYXRpbGUqIG1TZXJ2ZXJDYmxrOwotICAgIENvbXBvc2VyU2VydmljZSgpOwotICAgIGZyaWVuZCBjbGFzcyBTaW5nbGV0b248Q29tcG9zZXJTZXJ2aWNlPjsKLXB1YmxpYzoKLSAgICBzdGF0aWMgc3A8SVN1cmZhY2VDb21wb3Nlcj4gZ2V0Q29tcG9zZXJTZXJ2aWNlKCk7Ci0gICAgc3RhdGljIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3Qgdm9sYXRpbGUgKiBnZXRDb250cm9sQmxvY2soKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfUFJJVkFURV9HVUlfQ09NUE9TRVJfU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvZ3VpL0xheWVyU3RhdGUuaCBiL2luY2x1ZGUvcHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTI3N2UwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRl9MQVlFUl9TVEFURV9ICi0jZGVmaW5lIEFORFJPSURfU0ZfTEFZRVJfU1RBVEVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFBhcmNlbDsKLWNsYXNzIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ7Ci0KLXN0cnVjdCBsYXllcl9zdGF0ZV90IHsKLQotICAgIGxheWVyX3N0YXRlX3QoKQotICAgICAgICA6ICAgc3VyZmFjZSgwKSwgd2hhdCgwKSwKLSAgICAgICAgICAgIHgoMCksIHkoMCksIHooMCksIHcoMCksIGgoMCksCi0gICAgICAgICAgICBhbHBoYSgwKSwgdGludCgwKSwgZmxhZ3MoMCksIG1hc2soMCksCi0gICAgICAgICAgICByZXNlcnZlZCgwKQotICAgIHsKLSAgICAgICAgbWF0cml4LmRzZHggPSBtYXRyaXguZHRkeSA9IDEuMGY7Ci0gICAgICAgIG1hdHJpeC5kc2R5ID0gbWF0cml4LmR0ZHggPSAwLjBmOwotICAgIH0KLQotICAgIHN0YXR1c190ICAgIHdyaXRlKFBhcmNlbCYgb3V0cHV0KSBjb25zdDsKLSAgICBzdGF0dXNfdCAgICByZWFkKGNvbnN0IFBhcmNlbCYgaW5wdXQpOwotCi0gICAgICAgICAgICBzdHJ1Y3QgbWF0cml4MjJfdCB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgICBkc2R4OwotICAgICAgICAgICAgICAgIGZsb2F0ICAgZHRkeDsKLSAgICAgICAgICAgICAgICBmbG9hdCAgIGRzZHk7Ci0gICAgICAgICAgICAgICAgZmxvYXQgICBkdGR5OwotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIFN1cmZhY2VJRCAgICAgICBzdXJmYWNlOwotICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHdoYXQ7Ci0gICAgICAgICAgICBmbG9hdCAgICAgICAgICAgeDsKLSAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICB5OwotICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHo7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdzsKLSAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBoOwotICAgICAgICAgICAgZmxvYXQgICAgICAgICAgIGFscGhhOwotICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHRpbnQ7Ci0gICAgICAgICAgICB1aW50OF90ICAgICAgICAgZmxhZ3M7Ci0gICAgICAgICAgICB1aW50OF90ICAgICAgICAgbWFzazsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICByZXNlcnZlZDsKLSAgICAgICAgICAgIG1hdHJpeDIyX3QgICAgICBtYXRyaXg7Ci0gICAgICAgICAgICAvLyBub24gUE9EIG11c3QgYmUgbGFzdC4gc2VlIHdyaXRlL3JlYWQKLSAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICB0cmFuc3BhcmVudFJlZ2lvbjsKLX07Ci0KLXN0cnVjdCBDb21wb3NlclN0YXRlIHsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjbGllbnQ7Ci0gICAgbGF5ZXJfc3RhdGVfdCBzdGF0ZTsKLSAgICBzdGF0dXNfdCAgICB3cml0ZShQYXJjZWwmIG91dHB1dCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgICAgcmVhZChjb25zdCBQYXJjZWwmIGlucHV0KTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NGX0xBWUVSX1NUQVRFX0gKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5oIGIvaW5jbHVkZS9wcml2YXRlL2d1aS9TaGFyZWRCdWZmZXJTdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGEwM2QxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJpdmF0ZS9ndWkvU2hhcmVkQnVmZmVyU3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0ZfU0hBUkVEX0JVRkZFUl9TVEFDS19ICi0jZGVmaW5lIEFORFJPSURfU0ZfU0hBUkVEX0JVRkZFUl9TVEFDS19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIE5VTV9ESVNQTEFZX01BWCA0Ci0KLXN0cnVjdCBkaXNwbGF5X2NibGtfdAotewotICAgIHVpbnQxNl90ICAgIHc7Ci0gICAgdWludDE2X3QgICAgaDsKLSAgICB1aW50OF90ICAgICBmb3JtYXQ7Ci0gICAgdWludDhfdCAgICAgb3JpZW50YXRpb247Ci0gICAgdWludDhfdCAgICAgcmVzZXJ2ZWRbMl07Ci0gICAgZmxvYXQgICAgICAgZnBzOwotICAgIGZsb2F0ICAgICAgIGRlbnNpdHk7Ci0gICAgZmxvYXQgICAgICAgeGRwaTsKLSAgICBmbG9hdCAgICAgICB5ZHBpOwotICAgIHVpbnQzMl90ICAgIHBhZFsyXTsKLX07Ci0KLXN0cnVjdCBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190ICAgLy8gNEtCIG1heAotewotICAgIHVpbnQ4X3QgICAgICAgICBjb25uZWN0ZWQ7Ci0gICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkWzNdOwotICAgIHVpbnQzMl90ICAgICAgICBwYWRbN107Ci0gICAgZGlzcGxheV9jYmxrX3QgIGRpc3BsYXlzW05VTV9ESVNQTEFZX01BWF07Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ09NUElMRV9USU1FX0FTU0VSVChzaXplb2Yoc3VyZmFjZV9mbGluZ2VyX2NibGtfdCkgPD0gNDA5NikKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLyogQU5EUk9JRF9TRl9TSEFSRURfQlVGRkVSX1NUQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJpdmF0ZS91aS9SZWdpb25IZWxwZXIuaCBiL2luY2x1ZGUvcHJpdmF0ZS91aS9SZWdpb25IZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3NjUzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvdWkvUmVnaW9uSGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VSV9QUklWQVRFX1JFR0lPTl9IRUxQRVJfSAotI2RlZmluZSBBTkRST0lEX1VJX1BSSVZBVEVfUkVHSU9OX0hFTFBFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBSRUNUPgotY2xhc3MgcmVnaW9uX29wZXJhdG9yCi17Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBSRUNUOjp2YWx1ZV90eXBlIFRZUEU7ICAgIAotICAgIHN0YXRpYyBjb25zdCBUWVBFIG1heF92YWx1ZSA9IDB4N0ZGRkZGRjsKLQotcHVibGljOgotICAgIC8qIAotICAgICAqIENvbW1vbiBib29sZWFuIG9wZXJhdGlvbnM6Ci0gICAgICogdmFsdWUgaXMgY29tcHV0ZWQgYXMgMGIxMDEgb3AgMGIxMTAKLSAgICAgKiAgICBvdGhlciBib29sZWFuIG9wZXJhdGlvbiBhcmUgcG9zc2libGUsIHNpbXBseSBjb21wdXRlCi0gICAgICogICAgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZSB3aXRoIHRoZSBhYm92ZSBmb3JtdWxhZSBhbmQgdXNlCi0gICAgICogICAgaXQgd2hlbiBpbnN0YW50aWF0aW5nIGEgcmVnaW9uX29wZXJhdG9yLgotICAgICAqLwotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBMSFMgPSAweDU7ICAvLyAwYjEwMQotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBSSFMgPSAweDY7ICAvLyAwYjExMAotICAgIGVudW0gewotICAgICAgICBvcF9uYW5kID0gTEhTICYgflJIUywKLSAgICAgICAgb3BfYW5kICA9IExIUyAmICBSSFMsCi0gICAgICAgIG9wX29yICAgPSBMSFMgfCAgUkhTLAotICAgICAgICBvcF94b3IgID0gTEhTIF4gIFJIUwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgcmVnaW9uIHsKLSAgICAgICAgUkVDVCBjb25zdCogcmVjdHM7Ci0gICAgICAgIHNpemVfdCBjb3VudDsKLSAgICAgICAgVFlQRSBkeDsKLSAgICAgICAgVFlQRSBkeTsKLSAgICAgICAgaW5saW5lIHJlZ2lvbihjb25zdCByZWdpb24mIHJocykgCi0gICAgICAgICAgICA6IHJlY3RzKHJocy5yZWN0cyksIGNvdW50KHJocy5jb3VudCksIGR4KHJocy5keCksIGR5KHJocy5keSkgeyB9Ci0gICAgICAgIGlubGluZSByZWdpb24oUkVDVCBjb25zdCogciwgc2l6ZV90IGMpIAotICAgICAgICAgICAgOiByZWN0cyhyKSwgY291bnQoYyksIGR4KCksIGR5KCkgeyB9Ci0gICAgICAgIGlubGluZSByZWdpb24oUkVDVCBjb25zdCogciwgc2l6ZV90IGMsIFRZUEUgZHgsIFRZUEUgZHkpIAotICAgICAgICAgICAgOiByZWN0cyhyKSwgY291bnQoYyksIGR4KGR4KSwgZHkoZHkpIHsgfQotICAgIH07Ci0KLSAgICBjbGFzcyByZWdpb25fcmFzdGVyaXplciB7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyByZWdpb25fb3BlcmF0b3I7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRvcigpKGNvbnN0IFJFQ1QmIHJlY3QpID0gMDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgfnJlZ2lvbl9yYXN0ZXJpemVyKCkgeyB9OwotICAgIH07Ci0gICAgCi0gICAgaW5saW5lIHJlZ2lvbl9vcGVyYXRvcihpbnQgb3AsIGNvbnN0IHJlZ2lvbiYgbGhzLCBjb25zdCByZWdpb24mIHJocykgCi0gICAgICAgIDogb3BfbWFzayhvcCksIHNwYW5uZXIobGhzLCByaHMpIAotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIG9wZXJhdG9yKCkocmVnaW9uX3Jhc3Rlcml6ZXImIHJhc3Rlcml6ZXIpIHsKLSAgICAgICAgUkVDVCBjdXJyZW50OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBTcGFubmVySW5uZXIgc3Bhbm5lcklubmVyKHNwYW5uZXIubGhzLCBzcGFubmVyLnJocyk7Ci0gICAgICAgICAgICBpbnQgaW5zaWRlID0gc3Bhbm5lci5uZXh0KGN1cnJlbnQudG9wLCBjdXJyZW50LmJvdHRvbSk7Ci0gICAgICAgICAgICBzcGFubmVySW5uZXIucHJlcGFyZShpbnNpZGUpOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIFRZUEUgbGVmdCwgcmlnaHQ7Ci0gICAgICAgICAgICAgICAgaW50IGluc2lkZSA9IHNwYW5uZXJJbm5lci5uZXh0KGN1cnJlbnQubGVmdCwgY3VycmVudC5yaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKChvcF9tYXNrID4+IGluc2lkZSkgJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LmxlZnQgPCBjdXJyZW50LnJpZ2h0ICYmIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudG9wIDwgY3VycmVudC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlcml6ZXIoY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlKCFzcGFubmVySW5uZXIuaXNEb25lKCkpOwotICAgICAgICB9IHdoaWxlKCFzcGFubmVyLmlzRG9uZSgpKTsKLSAgICB9Ci0KLXByaXZhdGU6ICAgIAotICAgIHVpbnQzMl90IG9wX21hc2s7Ci0KLSAgICBjbGFzcyBTcGFubmVyQmFzZQotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgbGhzX2JlZm9yZV9yaHMgICA9IDAsCi0gICAgICAgICAgICBsaHNfYWZ0ZXJfcmhzICAgID0gMSwKLSAgICAgICAgICAgIGxoc19jb2luY2lkZV9yaHMgPSAyCi0gICAgICAgIH07Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIFRZUEUgbGhzX2hlYWQ7Ci0gICAgICAgIFRZUEUgbGhzX3RhaWw7Ci0gICAgICAgIFRZUEUgcmhzX2hlYWQ7Ci0gICAgICAgIFRZUEUgcmhzX3RhaWw7Ci0KLSAgICAgICAgaW5saW5lIGludCBuZXh0KFRZUEUmIGhlYWQsIFRZUEUmIHRhaWwsCi0gICAgICAgICAgICAgICAgYm9vbCYgbW9yZV9saHMsIGJvb2wmIG1vcmVfcmhzKSAKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGluc2lkZTsKLSAgICAgICAgICAgIG1vcmVfbGhzID0gZmFsc2U7Ci0gICAgICAgICAgICBtb3JlX3JocyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGxoc19oZWFkIDwgcmhzX2hlYWQpIHsKLSAgICAgICAgICAgICAgICBpbnNpZGUgPSBsaHNfYmVmb3JlX3JoczsKLSAgICAgICAgICAgICAgICBoZWFkID0gbGhzX2hlYWQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxoc190YWlsIDw9IHJoc19oZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhaWwgPSBsaHNfdGFpbDsKLSAgICAgICAgICAgICAgICAgICAgbW9yZV9saHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxoc19oZWFkID0gcmhzX2hlYWQ7Ci0gICAgICAgICAgICAgICAgICAgIHRhaWwgPSByaHNfaGVhZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJoc19oZWFkIDwgbGhzX2hlYWQpIHsKLSAgICAgICAgICAgICAgICBpbnNpZGUgPSBsaHNfYWZ0ZXJfcmhzOwotICAgICAgICAgICAgICAgIGhlYWQgPSByaHNfaGVhZDsKLSAgICAgICAgICAgICAgICBpZiAocmhzX3RhaWwgPD0gbGhzX2hlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFpbCA9IHJoc190YWlsOwotICAgICAgICAgICAgICAgICAgICBtb3JlX3JocyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmhzX2hlYWQgPSBsaHNfaGVhZDsKLSAgICAgICAgICAgICAgICAgICAgdGFpbCA9IGxoc19oZWFkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5zaWRlID0gbGhzX2NvaW5jaWRlX3JoczsKLSAgICAgICAgICAgICAgICBoZWFkID0gbGhzX2hlYWQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxoc190YWlsIDw9IHJoc190YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhaWwgPSByaHNfaGVhZCA9IGxoc190YWlsOwotICAgICAgICAgICAgICAgICAgICBtb3JlX2xocyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyaHNfdGFpbCA8PSBsaHNfdGFpbCkgewotICAgICAgICAgICAgICAgICAgICB0YWlsID0gbGhzX2hlYWQgPSByaHNfdGFpbDsKLSAgICAgICAgICAgICAgICAgICAgbW9yZV9yaHMgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbnNpZGU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgY2xhc3MgU3Bhbm5lciA6IHByb3RlY3RlZCBTcGFubmVyQmFzZSAKLSAgICB7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyByZWdpb25fb3BlcmF0b3I7Ci0gICAgICAgIHJlZ2lvbiBsaHM7Ci0gICAgICAgIHJlZ2lvbiByaHM7Ci0KLSAgICBwdWJsaWM6Ci0gICAgICAgIGlubGluZSBTcGFubmVyKGNvbnN0IHJlZ2lvbiYgbGhzLCBjb25zdCByZWdpb24mIHJocykKLSAgICAgICAgICAgIDogbGhzKGxocyksIHJocyhyaHMpIAotICAgICAgICB7Ci0gICAgICAgICAgICBTcGFubmVyQmFzZTo6bGhzX2hlYWQgPSBsaHMucmVjdHMtPnRvcCAgICAgICsgbGhzLmR5OwotICAgICAgICAgICAgU3Bhbm5lckJhc2U6Omxoc190YWlsID0gbGhzLnJlY3RzLT5ib3R0b20gICArIGxocy5keTsKLSAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfaGVhZCA9IHJocy5yZWN0cy0+dG9wICAgICAgKyByaHMuZHk7Ci0gICAgICAgICAgICBTcGFubmVyQmFzZTo6cmhzX3RhaWwgPSByaHMucmVjdHMtPmJvdHRvbSAgICsgcmhzLmR5OwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNEb25lKCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuICFyaHMuY291bnQgJiYgIWxocy5jb3VudDsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBpbnQgbmV4dChUWVBFJiB0b3AsIFRZUEUmIGJvdHRvbSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgbW9yZV9saHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgbW9yZV9yaHMgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBpbnNpZGUgPSBTcGFubmVyQmFzZTo6bmV4dCh0b3AsIGJvdHRvbSwgbW9yZV9saHMsIG1vcmVfcmhzKTsKLSAgICAgICAgICAgIGlmIChtb3JlX2xocykgewotICAgICAgICAgICAgICAgIGFkdmFuY2UobGhzLCBTcGFubmVyQmFzZTo6bGhzX2hlYWQsIFNwYW5uZXJCYXNlOjpsaHNfdGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobW9yZV9yaHMpIHsKLSAgICAgICAgICAgICAgICBhZHZhbmNlKHJocywgU3Bhbm5lckJhc2U6OnJoc19oZWFkLCBTcGFubmVyQmFzZTo6cmhzX3RhaWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluc2lkZTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGlubGluZSAKLSAgICAgICAgdm9pZCBhZHZhbmNlKHJlZ2lvbiYgcmVnLCBUWVBFJiBhVG9wLCBUWVBFJiBhQm90dG9tKSB7Ci0gICAgICAgICAgICAvLyBnb3QgdG8gbmV4dCBzcGFuCi0gICAgICAgICAgICBzaXplX3QgY291bnQgPSByZWcuY291bnQ7Ci0gICAgICAgICAgICBSRUNUIGNvbnN0ICogcmVjdHMgPSByZWcucmVjdHM7Ci0gICAgICAgICAgICBSRUNUIGNvbnN0ICogY29uc3QgZW5kID0gcmVjdHMgKyBjb3VudDsKLSAgICAgICAgICAgIGNvbnN0IGludCB0b3AgPSByZWN0cy0+dG9wOwotICAgICAgICAgICAgd2hpbGUgKHJlY3RzICE9IGVuZCAmJiByZWN0cy0+dG9wID09IHRvcCkgewotICAgICAgICAgICAgICAgIHJlY3RzKys7Ci0gICAgICAgICAgICAgICAgY291bnQtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWN0cyAhPSBlbmQpIHsKLSAgICAgICAgICAgICAgICBhVG9wICAgID0gcmVjdHMtPnRvcCAgICArIHJlZy5keTsKLSAgICAgICAgICAgICAgICBhQm90dG9tID0gcmVjdHMtPmJvdHRvbSArIHJlZy5keTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYVRvcCAgICA9IG1heF92YWx1ZTsKLSAgICAgICAgICAgICAgICBhQm90dG9tID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVnLnJlY3RzID0gcmVjdHM7Ci0gICAgICAgICAgICByZWcuY291bnQgPSBjb3VudDsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyBTcGFubmVySW5uZXIgOiBwcm90ZWN0ZWQgU3Bhbm5lckJhc2UgCi0gICAgewotICAgICAgICByZWdpb24gbGhzOwotICAgICAgICByZWdpb24gcmhzOwotICAgICAgICAKLSAgICBwdWJsaWM6Ci0gICAgICAgIGlubGluZSBTcGFubmVySW5uZXIoY29uc3QgcmVnaW9uJiBsaHMsIGNvbnN0IHJlZ2lvbiYgcmhzKQotICAgICAgICAgICAgOiBsaHMobGhzKSwgcmhzKHJocykgCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHByZXBhcmUoaW50IGluc2lkZSkgewotICAgICAgICAgICAgaWYgKGluc2lkZSA9PSBTcGFubmVyQmFzZTo6bGhzX2JlZm9yZV9yaHMpIHsKLSAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6bGhzX2hlYWQgPSBsaHMucmVjdHMtPmxlZnQgICsgbGhzLmR4OwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpsaHNfdGFpbCA9IGxocy5yZWN0cy0+cmlnaHQgKyBsaHMuZHg7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6OnJoc19oZWFkID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfdGFpbCA9IG1heF92YWx1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zaWRlID09IFNwYW5uZXJCYXNlOjpsaHNfYWZ0ZXJfcmhzKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6Omxoc19oZWFkID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpsaHNfdGFpbCA9IG1heF92YWx1ZTsKLSAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6cmhzX2hlYWQgPSByaHMucmVjdHMtPmxlZnQgICsgcmhzLmR4OwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfdGFpbCA9IHJocy5yZWN0cy0+cmlnaHQgKyByaHMuZHg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpsaHNfaGVhZCA9IGxocy5yZWN0cy0+bGVmdCAgKyBsaHMuZHg7Ci0gICAgICAgICAgICAgICAgU3Bhbm5lckJhc2U6Omxoc190YWlsID0gbGhzLnJlY3RzLT5yaWdodCArIGxocy5keDsKLSAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6cmhzX2hlYWQgPSByaHMucmVjdHMtPmxlZnQgICsgcmhzLmR4OwotICAgICAgICAgICAgICAgIFNwYW5uZXJCYXNlOjpyaHNfdGFpbCA9IHJocy5yZWN0cy0+cmlnaHQgKyByaHMuZHg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgYm9vbCBpc0RvbmUoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gU3Bhbm5lckJhc2U6Omxoc19oZWFkID09IG1heF92YWx1ZSAmJiAKLSAgICAgICAgICAgICAgICAgICBTcGFubmVyQmFzZTo6cmhzX2hlYWQgPT0gbWF4X3ZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGludCBuZXh0KFRZUEUmIGxlZnQsIFRZUEUmIHJpZ2h0KSAKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCBtb3JlX2xocyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBtb3JlX3JocyA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGluc2lkZSA9IFNwYW5uZXJCYXNlOjpuZXh0KGxlZnQsIHJpZ2h0LCBtb3JlX2xocywgbW9yZV9yaHMpOwotICAgICAgICAgICAgaWYgKG1vcmVfbGhzKSB7Ci0gICAgICAgICAgICAgICAgYWR2YW5jZShsaHMsIFNwYW5uZXJCYXNlOjpsaHNfaGVhZCwgU3Bhbm5lckJhc2U6Omxoc190YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtb3JlX3JocykgewotICAgICAgICAgICAgICAgIGFkdmFuY2UocmhzLCBTcGFubmVyQmFzZTo6cmhzX2hlYWQsIFNwYW5uZXJCYXNlOjpyaHNfdGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5zaWRlOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgaW5saW5lIAotICAgICAgICB2b2lkIGFkdmFuY2UocmVnaW9uJiByZWcsIFRZUEUmIGxlZnQsIFRZUEUmIHJpZ2h0KSB7Ci0gICAgICAgICAgICBpZiAocmVnLnJlY3RzICYmIHJlZy5jb3VudCkgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjdXJfc3Bhbl90b3AgPSByZWcucmVjdHMtPnRvcDsKLSAgICAgICAgICAgICAgICByZWcucmVjdHMrKzsKLSAgICAgICAgICAgICAgICByZWcuY291bnQtLTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlZy5jb3VudCB8fCByZWcucmVjdHMtPnRvcCAhPSBjdXJfc3Bhbl90b3ApIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCAgPSBtYXhfdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gbWF4X3ZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgID0gcmVnLnJlY3RzLT5sZWZ0ICArIHJlZy5keDsKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSByZWcucmVjdHMtPnJpZ2h0ICsgcmVnLmR4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBTcGFubmVyIHNwYW5uZXI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OwotCi0jZW5kaWYgLyogQU5EUk9JRF9VSV9QUklWQVRFX1JFR0lPTl9IRUxQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL3V0aWxzL1N0YXRpYy5oIGIvaW5jbHVkZS9wcml2YXRlL3V0aWxzL1N0YXRpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTVhZTBkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcHJpdmF0ZS91dGlscy9TdGF0aWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBnbyBoZXJlLCB0byBjb250cm9sIGluaXRpYWxpemF0aW9uIGFuZAotLy8gZGVzdHJ1Y3Rpb24gb3JkZXIgaW4gdGhlIGxpYnJhcnkuCi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gRm9yIFRleHRTdHJlYW0uY3BwCi1leHRlcm4gVmVjdG9yPGludDMyX3Q+IGdUZXh0QnVmZmVyczsKLQotLy8gRm9yIFN0cmluZzguY3BwCi1leHRlcm4gdm9pZCBpbml0aWFsaXplX3N0cmluZzgoKTsKLWV4dGVybiB2b2lkIHRlcm1pbmF0ZV9zdHJpbmc4KCk7Ci0KLS8vIEZvciBTdHJpbmcxNi5jcHAKLWV4dGVybiB2b2lkIGluaXRpYWxpemVfc3RyaW5nMTYoKTsKLWV4dGVybiB2b2lkIHRlcm1pbmF0ZV9zdHJpbmcxNigpOwotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvQU5hdGl2ZU9iamVjdEJhc2UuaCBiL2luY2x1ZGUvdWkvQU5hdGl2ZU9iamVjdEJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODUwZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VpL0FOYXRpdmVPYmplY3RCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9BTkRST0lEX05BVElWRVNfSAotI2RlZmluZSBBTkRST0lEX0FORFJPSURfTkFUSVZFU19ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKiBGSVhNRTogdGhpcyBpcyBsZWdhY3kgZm9yIHBpeG1hcHMgKi8KLXR5cGVkZWYgc3RydWN0IGVnbF9uYXRpdmVfcGl4bWFwX3QKLXsKLSAgICBpbnQzMl90ICAgICB2ZXJzaW9uOyAgICAvKiBtdXN0IGJlIDMyICovCi0gICAgaW50MzJfdCAgICAgd2lkdGg7Ci0gICAgaW50MzJfdCAgICAgaGVpZ2h0OwotICAgIGludDMyX3QgICAgIHN0cmlkZTsKLSAgICB1aW50OF90KiAgICBkYXRhOwotICAgIHVpbnQ4X3QgICAgIGZvcm1hdDsKLSAgICB1aW50OF90ICAgICByZnVbM107Ci0gICAgdW5pb24gewotICAgICAgICB1aW50MzJfdCAgICBjb21wcmVzc2VkRm9ybWF0OwotICAgICAgICBpbnQzMl90ICAgICB2c3RyaWRlOwotICAgIH07Ci0gICAgaW50MzJfdCAgICAgcmVzZXJ2ZWQ7Ci19IGVnbF9uYXRpdmVfcGl4bWFwX3Q7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqIFRoaXMgaGVscGVyIGNsYXNzIHR1cm5zIGEgQU5hdGl2ZVhYWCBvYmplY3QgdHlwZSBpbnRvIGEgQysrCi0gKiByZWZlcmVuY2UtY291bnRlZCBvYmplY3Q7IHdpdGggcHJvcGVyIHR5cGUgY29udmVyc2lvbnMuCi0gKi8KLXRlbXBsYXRlIDx0eXBlbmFtZSBOQVRJVkVfVFlQRSwgdHlwZW5hbWUgVFlQRSwgdHlwZW5hbWUgUkVGPgotY2xhc3MgQU5hdGl2ZU9iamVjdEJhc2UgOiBwdWJsaWMgTkFUSVZFX1RZUEUsIHB1YmxpYyBSRUYKLXsKLXB1YmxpYzoKLSAgICAvLyBEaXNhbWJpZ3VhdGUgYmV0d2VlbiB0aGUgaW5jU3Ryb25nIGluIFJFRiBhbmQgTkFUSVZFX1RZUEUKLSAgICB2b2lkIGluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgewotICAgICAgICBSRUY6OmluY1N0cm9uZyhpZCk7Ci0gICAgfQotICAgIHZvaWQgZGVjU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdCB7Ci0gICAgICAgIFJFRjo6ZGVjU3Ryb25nKGlkKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB0eXBlZGVmIEFOYXRpdmVPYmplY3RCYXNlPE5BVElWRV9UWVBFLCBUWVBFLCBSRUY+IEJBU0U7Ci0gICAgQU5hdGl2ZU9iamVjdEJhc2UoKSA6IE5BVElWRV9UWVBFKCksIFJFRigpIHsKLSAgICAgICAgTkFUSVZFX1RZUEU6OmNvbW1vbi5pbmNSZWYgPSBpbmNSZWY7Ci0gICAgICAgIE5BVElWRV9UWVBFOjpjb21tb24uZGVjUmVmID0gZGVjUmVmOwotICAgIH0KLSAgICBzdGF0aWMgaW5saW5lIFRZUEUqIGdldFNlbGYoTkFUSVZFX1RZUEUqIHNlbGYpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRZUEUqPihzZWxmKTsKLSAgICB9Ci0gICAgc3RhdGljIGlubGluZSBUWVBFIGNvbnN0KiBnZXRTZWxmKE5BVElWRV9UWVBFIGNvbnN0KiBzZWxmKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUWVBFIGNvbnN0ICo+KHNlbGYpOwotICAgIH0KLSAgICBzdGF0aWMgaW5saW5lIFRZUEUqIGdldFNlbGYoYW5kcm9pZF9uYXRpdmVfYmFzZV90KiBiYXNlKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZWxmKHJlaW50ZXJwcmV0X2Nhc3Q8TkFUSVZFX1RZUEUqPihiYXNlKSk7Ci0gICAgfQotICAgIHN0YXRpYyBpbmxpbmUgVFlQRSBjb25zdCAqIGdldFNlbGYoYW5kcm9pZF9uYXRpdmVfYmFzZV90IGNvbnN0KiBiYXNlKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZWxmKHJlaW50ZXJwcmV0X2Nhc3Q8TkFUSVZFX1RZUEUgY29uc3QqPihiYXNlKSk7Ci0gICAgfQotICAgIHN0YXRpYyB2b2lkIGluY1JlZihhbmRyb2lkX25hdGl2ZV9iYXNlX3QqIGJhc2UpIHsKLSAgICAgICAgQU5hdGl2ZU9iamVjdEJhc2UqIHNlbGYgPSBnZXRTZWxmKGJhc2UpOwotICAgICAgICBzZWxmLT5pbmNTdHJvbmcoc2VsZik7Ci0gICAgfQotICAgIHN0YXRpYyB2b2lkIGRlY1JlZihhbmRyb2lkX25hdGl2ZV9iYXNlX3QqIGJhc2UpIHsKLSAgICAgICAgQU5hdGl2ZU9iamVjdEJhc2UqIHNlbGYgPSBnZXRTZWxmKGJhc2UpOwotICAgICAgICBzZWxmLT5kZWNTdHJvbmcoc2VsZik7Ci0gICAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotI2VuZGlmIC8vIF9fY3BsdXNwbHVzCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2VuZGlmIC8qIEFORFJPSURfQU5EUk9JRF9OQVRJVkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvRGlzcGxheUluZm8uaCBiL2luY2x1ZGUvdWkvRGlzcGxheUluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkMjhhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VpL0Rpc3BsYXlJbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfVUlfRElTUExBWV9JTkZPX0gKLSNkZWZpbmUgQU5EUk9JRF9VSV9ESVNQTEFZX0lORk9fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBEaXNwbGF5SW5mbyB7Ci0gICAgdWludDMyX3QgICAgICAgICAgICB3OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgaDsKLSAgICBQaXhlbEZvcm1hdEluZm8gICAgIHBpeGVsRm9ybWF0SW5mbzsKLSAgICB1aW50OF90ICAgICAgICAgICAgIG9yaWVudGF0aW9uOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgcmVzZXJ2ZWRbM107Ci0gICAgZmxvYXQgICAgICAgICAgICAgICBmcHM7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICBkZW5zaXR5OwotICAgIGZsb2F0ICAgICAgICAgICAgICAgeGRwaTsKLSAgICBmbG9hdCAgICAgICAgICAgICAgIHlkcGk7Ci19OwotCi0vKiBEaXNwbGF5IG9yaWVudGF0aW9ucyBhcyBkZWZpbmVkIGluIFN1cmZhY2UuamF2YSBhbmQgSVN1cmZhY2VDb21wb3Nlci5oLiAqLwotZW51bSB7Ci0gICAgRElTUExBWV9PUklFTlRBVElPTl8wID0gMCwKLSAgICBESVNQTEFZX09SSUVOVEFUSU9OXzkwID0gMSwKLSAgICBESVNQTEFZX09SSUVOVEFUSU9OXzE4MCA9IDIsCi0gICAgRElTUExBWV9PUklFTlRBVElPTl8yNzAgPSAzCi19OwotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0NPTVBPU0VSX0RJU1BMQVlfSU5GT19ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaCBiL2luY2x1ZGUvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMmI5NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0ZSQU1FQlVGRkVSX05BVElWRV9XSU5ET1dfSAotI2RlZmluZSBBTkRST0lEX0ZSQU1FQlVGRkVSX05BVElWRV9XSU5ET1dfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8dWkvQU5hdGl2ZU9iamVjdEJhc2UuaD4KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0KLSNkZWZpbmUgTlVNX0ZSQU1FX0JVRkZFUlMgIDIKLQotZXh0ZXJuICJDIiBFR0xOYXRpdmVXaW5kb3dUeXBlIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2Uodm9pZCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN1cmZhY2U7Ci1jbGFzcyBOYXRpdmVCdWZmZXI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyAKLSAgICA6IHB1YmxpYyBBTmF0aXZlT2JqZWN0QmFzZTwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdywgCi0gICAgICAgIEZyYW1lYnVmZmVyTmF0aXZlV2luZG93LCAKLSAgICAgICAgTGlnaHRSZWZCYXNlPEZyYW1lYnVmZmVyTmF0aXZlV2luZG93PiA+Ci17Ci1wdWJsaWM6Ci0gICAgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3coKTsgCi0KLSAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCBjb25zdCAqIGdldERldmljZSgpIGNvbnN0IHsgcmV0dXJuIGZiRGV2OyB9IAotCi0gICAgYm9vbCBpc1VwZGF0ZU9uRGVtYW5kKCkgY29uc3QgeyByZXR1cm4gbVVwZGF0ZU9uRGVtYW5kOyB9Ci0gICAgc3RhdHVzX3Qgc2V0VXBkYXRlUmVjdGFuZ2xlKGNvbnN0IFJlY3QmIHVwZGF0ZVJlY3QpOwotICAgIHN0YXR1c190IGNvbXBvc2l0aW9uQ29tcGxldGUoKTsKLQotICAgIHZvaWQgZHVtcChTdHJpbmc4JiByZXN1bHQpOwotCi0gICAgLy8gZm9yIGRlYnVnZ2luZyBvbmx5Ci0gICAgaW50IGdldEN1cnJlbnRCdWZmZXJJbmRleCgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBMaWdodFJlZkJhc2U8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+OyAgICAKLSAgICB+RnJhbWVidWZmZXJOYXRpdmVXaW5kb3coKTsgLy8gdGhpcyBjbGFzcyBjYW5ub3QgYmUgb3ZlcmxvYWRlZAotICAgIHN0YXRpYyBpbnQgc2V0U3dhcEludGVydmFsKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IGludGVydmFsKTsKLSAgICBzdGF0aWMgaW50IGRlcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBTmF0aXZlV2luZG93QnVmZmVyKiogYnVmZmVyKTsKLSAgICBzdGF0aWMgaW50IGxvY2tCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpOwotICAgIHN0YXRpYyBpbnQgcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpOwotICAgIHN0YXRpYyBpbnQgcXVlcnkoY29uc3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQgd2hhdCwgaW50KiB2YWx1ZSk7Ci0gICAgc3RhdGljIGludCBwZXJmb3JtKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IG9wZXJhdGlvbiwgLi4uKTsKLSAgICAKLSAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZmJEZXY7Ci0gICAgYWxsb2NfZGV2aWNlX3QqIGdyRGV2OwotCi0gICAgc3A8TmF0aXZlQnVmZmVyPiBidWZmZXJzW05VTV9GUkFNRV9CVUZGRVJTXTsKLSAgICBzcDxOYXRpdmVCdWZmZXI+IGZyb250OwotICAgIAotICAgIG11dGFibGUgTXV0ZXggbXV0ZXg7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgaW50MzJfdCBtTnVtQnVmZmVyczsKLSAgICBpbnQzMl90IG1OdW1GcmVlQnVmZmVyczsKLSAgICBpbnQzMl90IG1CdWZmZXJIZWFkOwotICAgIGludDMyX3QgbUN1cnJlbnRCdWZmZXJJbmRleDsKLSAgICBib29sIG1VcGRhdGVPbkRlbWFuZDsKLX07Ci0gICAgCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfRlJBTUVCVUZGRVJfTkFUSVZFX1dJTkRPV19ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlci5oIGIvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMThjZDguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9HcmFwaGljQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9HUkFQSElDX0JVRkZFUl9ICi0jZGVmaW5lIEFORFJPSURfR1JBUEhJQ19CVUZGRVJfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1aS9BTmF0aXZlT2JqZWN0QmFzZS5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotI2luY2x1ZGUgPHV0aWxzL0ZsYXR0ZW5hYmxlLmg+Ci0KLQotc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXI7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgR3JhcGhpY0J1ZmZlck1hcHBlcjsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBHcmFwaGljQnVmZmVyCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgR3JhcGhpY0J1ZmZlcgotICAgIDogcHVibGljIEFOYXRpdmVPYmplY3RCYXNlPAotICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyLAotICAgICAgICBHcmFwaGljQnVmZmVyLCAKLSAgICAgICAgTGlnaHRSZWZCYXNlPEdyYXBoaWNCdWZmZXI+ID4sIHB1YmxpYyBGbGF0dGVuYWJsZQotewotcHVibGljOgotCi0gICAgZW51bSB7Ci0gICAgICAgIFVTQUdFX1NXX1JFQURfTkVWRVIgICAgID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX05FVkVSLAotICAgICAgICBVU0FHRV9TV19SRUFEX1JBUkVMWSAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9SQVJFTFksCi0gICAgICAgIFVTQUdFX1NXX1JFQURfT0ZURU4gICAgID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOLAotICAgICAgICBVU0FHRV9TV19SRUFEX01BU0sgICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9NQVNLLAotICAgICAgICAKLSAgICAgICAgVVNBR0VfU1dfV1JJVEVfTkVWRVIgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX05FVkVSLAotICAgICAgICBVU0FHRV9TV19XUklURV9SQVJFTFkgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfUkFSRUxZLAotICAgICAgICBVU0FHRV9TV19XUklURV9PRlRFTiAgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgIFVTQUdFX1NXX1dSSVRFX01BU0sgICAgID0gR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLLAotCi0gICAgICAgIFVTQUdFX1NPRlRXQVJFX01BU0sgICAgID0gVVNBR0VfU1dfUkVBRF9NQVNLfFVTQUdFX1NXX1dSSVRFX01BU0ssCi0KLSAgICAgICAgVVNBR0VfUFJPVEVDVEVEICAgICAgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKLQotICAgICAgICBVU0FHRV9IV19URVhUVVJFICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKLSAgICAgICAgVVNBR0VfSFdfUkVOREVSICAgICAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKLSAgICAgICAgVVNBR0VfSFdfMkQgICAgICAgICAgICAgPSBHUkFMTE9DX1VTQUdFX0hXXzJELAotICAgICAgICBVU0FHRV9IV19DT01QT1NFUiAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIsCi0gICAgICAgIFVTQUdFX0hXX1ZJREVPX0VOQ09ERVIgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAotICAgICAgICBVU0FHRV9IV19NQVNLICAgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfTUFTSwotICAgIH07Ci0KLSAgICBHcmFwaGljQnVmZmVyKCk7Ci0KLSAgICAvLyBjcmVhdGVzIHcgKiBoIGJ1ZmZlcgotICAgIEdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7Ci0KLSAgICAvLyBjcmVhdGUgYSBidWZmZXIgZnJvbSBhbiBleGlzdGluZyBoYW5kbGUKLSAgICBHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsCi0gICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlLCBib29sIGtlZXBPd25lcnNoaXApOwotCi0gICAgLy8gY3JlYXRlIGEgYnVmZmVyIGZyb20gYW4gZXhpc3RpbmcgQU5hdGl2ZVdpbmRvd0J1ZmZlcgotICAgIEdyYXBoaWNCdWZmZXIoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBib29sIGtlZXBPd25lcnNoaXApOwotCi0gICAgLy8gcmV0dXJuIHN0YXR1cwotICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdWludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gd2lkdGg7IH0KLSAgICB1aW50MzJfdCBnZXRIZWlnaHQoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBoZWlnaHQ7IH0KLSAgICB1aW50MzJfdCBnZXRTdHJpZGUoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBzdHJpZGU7IH0KLSAgICB1aW50MzJfdCBnZXRVc2FnZSgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiB1c2FnZTsgfQotICAgIFBpeGVsRm9ybWF0IGdldFBpeGVsRm9ybWF0KCkgY29uc3QgIHsgcmV0dXJuIGZvcm1hdDsgfQotICAgIFJlY3QgZ2V0Qm91bmRzKCkgY29uc3QgICAgICAgICAgICAgIHsgcmV0dXJuIFJlY3Qod2lkdGgsIGhlaWdodCk7IH0KLSAgICAKLSAgICBzdGF0dXNfdCByZWFsbG9jYXRlKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGYsIHVpbnQzMl90IHVzYWdlKTsKLQotICAgIHN0YXR1c190IGxvY2sodWludDMyX3QgdXNhZ2UsIHZvaWQqKiB2YWRkcik7Ci0gICAgc3RhdHVzX3QgbG9jayh1aW50MzJfdCB1c2FnZSwgY29uc3QgUmVjdCYgcmVjdCwgdm9pZCoqIHZhZGRyKTsKLSAgICBzdGF0dXNfdCB1bmxvY2soKTsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGdldE5hdGl2ZUJ1ZmZlcigpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc2V0SW5kZXgoaW50IGluZGV4KTsKLSAgICBpbnQgZ2V0SW5kZXgoKSBjb25zdDsKLQotICAgIC8vIGZvciBkZWJ1Z2dpbmcKLSAgICBzdGF0aWMgdm9pZCBkdW1wQWxsb2NhdGlvbnNUb1N5c3RlbUxvZygpOwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgfkdyYXBoaWNCdWZmZXIoKTsKLQotICAgIGVudW0gewotICAgICAgICBvd25Ob25lICAgPSAwLAotICAgICAgICBvd25IYW5kbGUgPSAxLAotICAgICAgICBvd25EYXRhICAgPSAyLAotICAgIH07Ci0KLSAgICBpbmxpbmUgY29uc3QgR3JhcGhpY0J1ZmZlck1hcHBlciYgZ2V0QnVmZmVyTWFwcGVyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1ZmZlck1hcHBlcjsKLSAgICB9Ci0gICAgaW5saW5lIEdyYXBoaWNCdWZmZXJNYXBwZXImIGdldEJ1ZmZlck1hcHBlcigpIHsKLSAgICAgICAgcmV0dXJuIG1CdWZmZXJNYXBwZXI7Ci0gICAgfQotICAgIHVpbnQ4X3QgbU93bmVyOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlOwotICAgIGZyaWVuZCBjbGFzcyBCcFN1cmZhY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJuU3VyZmFjZTsKLSAgICBmcmllbmQgY2xhc3MgU3VyZmFjZVRleHR1cmVDbGllbnQ7Ci0gICAgZnJpZW5kIGNsYXNzIExpZ2h0UmVmQmFzZTxHcmFwaGljQnVmZmVyPjsKLSAgICBHcmFwaGljQnVmZmVyKGNvbnN0IEdyYXBoaWNCdWZmZXImIHJocyk7Ci0gICAgR3JhcGhpY0J1ZmZlciYgb3BlcmF0b3IgPSAoY29uc3QgR3JhcGhpY0J1ZmZlciYgcmhzKTsKLSAgICBjb25zdCBHcmFwaGljQnVmZmVyJiBvcGVyYXRvciA9IChjb25zdCBHcmFwaGljQnVmZmVyJiByaHMpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgaW5pdFNpemUodWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCAKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKTsKLQotICAgIHZvaWQgZnJlZV9oYW5kbGUoKTsKLQotICAgIC8vIEZsYXR0ZW5hYmxlIGludGVyZmFjZQotICAgIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldEZkQ291bnQoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBmbGF0dGVuKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgdW5mbGF0dGVuKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCk7Ci0KLQotICAgIEdyYXBoaWNCdWZmZXJNYXBwZXImIG1CdWZmZXJNYXBwZXI7Ci0gICAgc3NpemVfdCBtSW5pdENoZWNrOwotICAgIGludCBtSW5kZXg7Ci0KLSAgICAvLyBJZiB3ZSdyZSB3cmFwcGluZyBhbm90aGVyIGJ1ZmZlciB0aGVuIHRoaXMgcmVmZXJlbmNlIHdpbGwgbWFrZSBzdXJlIGl0Ci0gICAgLy8gZG9lc24ndCBnZXQgZnJlZWQuCi0gICAgc3A8QU5hdGl2ZVdpbmRvd0J1ZmZlcj4gbVdyYXBwZWRCdWZmZXI7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9HUkFQSElDX0JVRkZFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0dyYXBoaWNCdWZmZXJBbGxvY2F0b3IuaCBiL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmZhNzg4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogCi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX0JVRkZFUl9BTExPQ0FUT1JfSAotI2RlZmluZSBBTkRST0lEX0JVRkZFUl9BTExPQ0FUT1JfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBHcmFwaGljQnVmZmVyQWxsb2NhdG9yIDogcHVibGljIFNpbmdsZXRvbjxHcmFwaGljQnVmZmVyQWxsb2NhdG9yPgotewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBVU0FHRV9TV19SRUFEX05FVkVSICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiwKLSAgICAgICAgVVNBR0VfU1dfUkVBRF9SQVJFTFkgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfUkFSRUxZLAotICAgICAgICBVU0FHRV9TV19SRUFEX09GVEVOICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiwKLSAgICAgICAgVVNBR0VfU1dfUkVBRF9NQVNLICAgICAgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSywKLSAgICAgICAgCi0gICAgICAgIFVTQUdFX1NXX1dSSVRFX05FVkVSICAgID0gR1JBTExPQ19VU0FHRV9TV19XUklURV9ORVZFUiwKLSAgICAgICAgVVNBR0VfU1dfV1JJVEVfUkFSRUxZICAgPSBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSwKLSAgICAgICAgVVNBR0VfU1dfV1JJVEVfT0ZURU4gICAgPSBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICBVU0FHRV9TV19XUklURV9NQVNLICAgICA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSywKLSAgICAgICAgCi0gICAgICAgIFVTQUdFX1NPRlRXQVJFX01BU0sgICAgID0gVVNBR0VfU1dfUkVBRF9NQVNLfFVTQUdFX1NXX1dSSVRFX01BU0ssCi0gICAgICAgIAotICAgICAgICBVU0FHRV9IV19URVhUVVJFICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKLSAgICAgICAgVVNBR0VfSFdfUkVOREVSICAgICAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKLSAgICAgICAgVVNBR0VfSFdfMkQgICAgICAgICAgICAgPSBHUkFMTE9DX1VTQUdFX0hXXzJELAotICAgICAgICBVU0FHRV9IV19NQVNLICAgICAgICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfTUFTSwotICAgIH07Ci0KLSAgICBzdGF0aWMgaW5saW5lIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3ImIGdldCgpIHsgcmV0dXJuIGdldEluc3RhbmNlKCk7IH0KLSAgICAKLQotICAgIHN0YXR1c190IGFsbG9jKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwgaW50IHVzYWdlLAotICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBoYW5kbGUsIGludDMyX3QqIHN0cmlkZSk7Ci0KLSAgICBzdGF0dXNfdCBmcmVlKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpOwotCi0gICAgdm9pZCBkdW1wKFN0cmluZzgmIHJlcykgY29uc3Q7Ci0gICAgc3RhdGljIHZvaWQgZHVtcFRvU3lzdGVtTG9nKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IGFsbG9jX3JlY190IHsKLSAgICAgICAgdWludDMyX3QgdzsKLSAgICAgICAgdWludDMyX3QgaDsKLSAgICAgICAgdWludDMyX3QgczsKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0OwotICAgICAgICB1aW50MzJfdCB1c2FnZTsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgfTsKLSAgICAKLSAgICBzdGF0aWMgTXV0ZXggc0xvY2s7Ci0gICAgc3RhdGljIEtleWVkVmVjdG9yPGJ1ZmZlcl9oYW5kbGVfdCwgYWxsb2NfcmVjX3Q+IHNBbGxvY0xpc3Q7Ci0gICAgCi0gICAgZnJpZW5kIGNsYXNzIFNpbmdsZXRvbjxHcmFwaGljQnVmZmVyQWxsb2NhdG9yPjsKLSAgICBHcmFwaGljQnVmZmVyQWxsb2NhdG9yKCk7Ci0gICAgfkdyYXBoaWNCdWZmZXJBbGxvY2F0b3IoKTsKLSAgICAKLSAgICBhbGxvY19kZXZpY2VfdCAgKm1BbGxvY0RldjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQlVGRkVSX0FMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaCBiL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdhMDJhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VSV9CVUZGRVJfTUFQUEVSX0gKLSNkZWZpbmUgQU5EUk9JRF9VSV9CVUZGRVJfTUFQUEVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KLQotc3RydWN0IGdyYWxsb2NfbW9kdWxlX3Q7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlY3Q7Ci0KLWNsYXNzIEdyYXBoaWNCdWZmZXJNYXBwZXIgOiBwdWJsaWMgU2luZ2xldG9uPEdyYXBoaWNCdWZmZXJNYXBwZXI+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGlubGluZSBHcmFwaGljQnVmZmVyTWFwcGVyJiBnZXQoKSB7IHJldHVybiBnZXRJbnN0YW5jZSgpOyB9Ci0KLSAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgIHN0YXR1c190IHVucmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgCi0gICAgc3RhdHVzX3QgbG9jayhidWZmZXJfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgaW50IHVzYWdlLCBjb25zdCBSZWN0JiBib3VuZHMsIHZvaWQqKiB2YWRkcik7Ci0KLSAgICBzdGF0dXNfdCB1bmxvY2soYnVmZmVyX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgCi0gICAgLy8gZHVtcHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1hcHBpbmcgb2YgdGhpcyBoYW5kbGUKLSAgICB2b2lkIGR1bXAoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFNpbmdsZXRvbjxHcmFwaGljQnVmZmVyTWFwcGVyPjsKLSAgICBHcmFwaGljQnVmZmVyTWFwcGVyKCk7Ci0gICAgZ3JhbGxvY19tb2R1bGVfdCBjb25zdCAqbUFsbG9jTW9kOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1VJX0JVRkZFUl9NQVBQRVJfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL1BpeGVsRm9ybWF0LmggYi9pbmNsdWRlL3VpL1BpeGVsRm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmM2UyNjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91aS9QaXhlbEZvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotCi0vLyBQaXhlbCBmb3JtYXRzIHVzZWQgYWNyb3NzIHRoZSBzeXN0ZW0uCi0vLyBUaGVzZSBmb3JtYXRzIG1pZ2h0IG5vdCBhbGwgYmUgc3VwcG9ydGVkIGJ5IGFsbCByZW5kZXJlcnMsIGZvciBpbnN0YW5jZQotLy8gc2tpYSBvciBTdXJmYWNlRmxpbmdlciBhcmUgbm90IHJlcXVpcmVkIHRvIHN1cHBvcnQgYWxsIG9mIHRoZXNlIGZvcm1hdHMKLS8vIChlaXRoZXIgYXMgc291cmNlIG9yIGRlc3RpbmF0aW9uKQotCi0KLSNpZm5kZWYgVUlfUElYRUxGT1JNQVRfSAotI2RlZmluZSBVSV9QSVhFTEZPUk1BVF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIC8vCi0gICAgLy8gdGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gbWF0Y2ggdGhvc2UKLSAgICAvLyBpbiBncmFwaGljcy9QaXhlbEZvcm1hdC5qYXZhICYgcGl4ZWxmbGluZ2VyL2Zvcm1hdC5oCi0gICAgLy8KLSAgICBQSVhFTF9GT1JNQVRfVU5LTk9XTiAgICA9ICAgMCwKLSAgICBQSVhFTF9GT1JNQVRfTk9ORSAgICAgICA9ICAgMCwKLQotICAgIC8vIGxvZ2ljYWwgcGl4ZWwgZm9ybWF0cyB1c2VkIGJ5IHRoZSBTdXJmYWNlRmxpbmdlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFBJWEVMX0ZPUk1BVF9DVVNUT00gICAgICAgICA9IC00LAotICAgICAgICAvLyBDdXN0b20gcGl4ZWwtZm9ybWF0IGRlc2NyaWJlZCBieSBhIFBpeGVsRm9ybWF0SW5mbyBzdHJ1Y3R1cmUKLQotICAgIFBJWEVMX0ZPUk1BVF9UUkFOU0xVQ0VOVCAgICA9IC0zLAotICAgICAgICAvLyBTeXN0ZW0gY2hvb3NlcyBhIGZvcm1hdCB0aGF0IHN1cHBvcnRzIHRyYW5zbHVjZW5jeSAobWFueSBhbHBoYSBiaXRzKQotCi0gICAgUElYRUxfRk9STUFUX1RSQU5TUEFSRU5UICAgID0gLTIsCi0gICAgICAgIC8vIFN5c3RlbSBjaG9vc2VzIGEgZm9ybWF0IHRoYXQgc3VwcG9ydHMgdHJhbnNwYXJlbmN5Ci0gICAgICAgIC8vIChhdCBsZWFzdCAxIGFscGhhIGJpdCkKLQotICAgIFBJWEVMX0ZPUk1BVF9PUEFRVUUgICAgICAgICA9IC0xLAotICAgICAgICAvLyBTeXN0ZW0gY2hvb3NlcyBhbiBvcGFxdWUgZm9ybWF0IChubyBhbHBoYSBiaXRzIHJlcXVpcmVkKQotCi0gICAgLy8gcmVhbCBwaXhlbCBmb3JtYXRzIHN1cHBvcnRlZCBmb3IgcmVuZGVyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBQSVhFTF9GT1JNQVRfUkdCQV84ODg4ICAgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgIC8vIDR4OC1iaXQgUkdCQQotICAgIFBJWEVMX0ZPUk1BVF9SR0JYXzg4ODggICA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4LCAgLy8gNHg4LWJpdCBSR0IwCi0gICAgUElYRUxfRk9STUFUX1JHQl84ODggICAgID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4LCAgICAvLyAzeDgtYml0IFJHQgotICAgIFBJWEVMX0ZPUk1BVF9SR0JfNTY1ICAgICA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgICAgLy8gMTYtYml0IFJHQgotICAgIFBJWEVMX0ZPUk1BVF9CR1JBXzg4ODggICA9IEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4LCAgLy8gNHg4LWJpdCBCR1JBCi0gICAgUElYRUxfRk9STUFUX1JHQkFfNTU1MSAgID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEsICAvLyAxNi1iaXQgQVJHQgotICAgIFBJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQgICA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LCAgLy8gMTYtYml0IEFSR0IKLSAgICBQSVhFTF9GT1JNQVRfQV84ICAgICAgICAgPSA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDgtYml0IEEKLX07Ci0KLXR5cGVkZWYgaW50MzJfdCBQaXhlbEZvcm1hdDsKLQotc3RydWN0IFBpeGVsRm9ybWF0SW5mbyB7Ci0gICAgZW51bSB7Ci0gICAgICAgIElOREVYX0FMUEhBICAgPSAwLAotICAgICAgICBJTkRFWF9SRUQgICAgID0gMSwKLSAgICAgICAgSU5ERVhfR1JFRU4gICA9IDIsCi0gICAgICAgIElOREVYX0JMVUUgICAgPSAzCi0gICAgfTsKLQotICAgIGVudW0geyAvLyBjb21wb25lbnRzCi0gICAgICAgIEFMUEhBICAgPSAxLAotICAgICAgICBSR0IgICAgID0gMiwKLSAgICAgICAgUkdCQSAgICA9IDMsCi0gICAgICAgIEwgICAgICAgPSA0LAotICAgICAgICBMQSAgICAgID0gNSwKLSAgICAgICAgT1RIRVIgICA9IDB4RkYKLSAgICB9OwotCi0gICAgc3RydWN0IHN6aW5mbyB7Ci0gICAgICAgIHVpbnQ4X3QgaDsKLSAgICAgICAgdWludDhfdCBsOwotICAgIH07Ci0KLSAgICBpbmxpbmUgUGl4ZWxGb3JtYXRJbmZvKCkgOiB2ZXJzaW9uKHNpemVvZihQaXhlbEZvcm1hdEluZm8pKSB7IH0KLSAgICBzaXplX3QgZ2V0U2NhbmxpbmVTaXplKHVuc2lnbmVkIGludCB3aWR0aCkgY29uc3Q7Ci0gICAgc2l6ZV90IGdldFNpemUoc2l6ZV90IGNpKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoY2kgPD0gMykgPyAoY2luZm9bY2ldLmggLSBjaW5mb1tjaV0ubCkgOiAwOwotICAgIH0KLSAgICBzaXplX3QgICAgICB2ZXJzaW9uOwotICAgIFBpeGVsRm9ybWF0IGZvcm1hdDsKLSAgICBzaXplX3QgICAgICBieXRlc1BlclBpeGVsOwotICAgIHNpemVfdCAgICAgIGJpdHNQZXJQaXhlbDsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHN6aW5mbyAgICAgIGNpbmZvWzRdOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWludDhfdCAgICAgaF9hbHBoYTsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgIGxfYWxwaGE7Ci0gICAgICAgICAgICB1aW50OF90ICAgICBoX3JlZDsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgIGxfcmVkOwotICAgICAgICAgICAgdWludDhfdCAgICAgaF9ncmVlbjsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgIGxfZ3JlZW47Ci0gICAgICAgICAgICB1aW50OF90ICAgICBoX2JsdWU7Ci0gICAgICAgICAgICB1aW50OF90ICAgICBsX2JsdWU7Ci0gICAgICAgIH07Ci0gICAgfTsKLSAgICB1aW50OF90ICAgICBjb21wb25lbnRzOwotICAgIHVpbnQ4X3QgICAgIHJlc2VydmVkMFszXTsKLSAgICB1aW50MzJfdCAgICByZXNlcnZlZDE7Ci19OwotCi0vLyBDb25zaWRlciBjYWNoaW5nIHRoZSByZXN1bHRzIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhleSdyZSBub3QKLS8vIGd1YXJhbnRlZWQgdG8gYmUgZmFzdC4KLXNzaXplX3QgICAgIGJ5dGVzUGVyUGl4ZWwoUGl4ZWxGb3JtYXQgZm9ybWF0KTsKLXNzaXplX3QgICAgIGJpdHNQZXJQaXhlbChQaXhlbEZvcm1hdCBmb3JtYXQpOwotc3RhdHVzX3QgICAgZ2V0UGl4ZWxGb3JtYXRJbmZvKFBpeGVsRm9ybWF0IGZvcm1hdCwgUGl4ZWxGb3JtYXRJbmZvKiBpbmZvKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFVJX1BJWEVMRk9STUFUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvUG9pbnQuaCBiL2luY2x1ZGUvdWkvUG9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1MzEyMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3VpL1BvaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VJX1BPSU5UCi0jZGVmaW5lIEFORFJPSURfVUlfUE9JTlQKLQotI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUG9pbnQKLXsKLXB1YmxpYzoKLSAgICBpbnQgeDsKLSAgICBpbnQgeTsKLQotICAgIC8vIHdlIGRvbid0IHByb3ZpZGUgY29weS1jdG9yIGFuZCBvcGVyYXRvcj0gb24gcHVycG9zZQotICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHZlcnNpb25zCi0KLSAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGRvZXNuJ3QgaW5pdGlhbGl6ZSB0aGUgUG9pbnQKLSAgICBpbmxpbmUgUG9pbnQoKSB7Ci0gICAgfQotICAgIGlubGluZSBQb2ludChpbnQgeCwgaW50IHkpIDogeCh4KSwgeSh5KSB7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICh4ID09IHJocy54KSAmJiAoeSA9PSByaHMueSk7Ci0gICAgfQotICAgIGlubGluZSBib29sIG9wZXJhdG9yICE9IChjb25zdCBQb2ludCYgcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhb3BlcmF0b3IgPT0gKHJocyk7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgaXNPcmlnaW4oKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhKHh8eSk7Ci0gICAgfQotCi0gICAgLy8gb3BlcmF0b3IgPCBkZWZpbmVzIGFuIG9yZGVyIHdoaWNoIGFsbG93cyB0byB1c2UgcG9pbnRzIGluIHNvcnRlZAotICAgIC8vIHZlY3RvcnMuCi0gICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBQb2ludCYgcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiB5PHJocy55IHx8ICh5PT1yaHMueSAmJiB4PHJocy54KTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgUG9pbnQmIG9wZXJhdG9yIC0gKCkgewotICAgICAgICB4ID0gLXg7Ci0gICAgICAgIHkgPSAteTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICAKLSAgICBpbmxpbmUgUG9pbnQmIG9wZXJhdG9yICs9IChjb25zdCBQb2ludCYgcmhzKSB7Ci0gICAgICAgIHggKz0gcmhzLng7Ci0gICAgICAgIHkgKz0gcmhzLnk7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0gICAgaW5saW5lIFBvaW50JiBvcGVyYXRvciAtPSAoY29uc3QgUG9pbnQmIHJocykgewotICAgICAgICB4IC09IHJocy54OwotICAgICAgICB5IC09IHJocy55OwotICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIAotICAgIGNvbnN0IFBvaW50IG9wZXJhdG9yICsgKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0IHsKLSAgICAgICAgY29uc3QgUG9pbnQgcmVzdWx0KHgrcmhzLngsIHkrcmhzLnkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBjb25zdCBQb2ludCBvcGVyYXRvciAtIChjb25zdCBQb2ludCYgcmhzKSBjb25zdCB7Ci0gICAgICAgIGNvbnN0IFBvaW50IHJlc3VsdCh4LXJocy54LCB5LXJocy55KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgIAotfTsKLQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoUG9pbnQpCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1VJX1BPSU5UCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL1JlY3QuaCBiL2luY2x1ZGUvdWkvUmVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk4YmM1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvUmVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVUlfUkVDVAotI2RlZmluZSBBTkRST0lEX1VJX1JFQ1QKLQotI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+Ci0jaW5jbHVkZSA8dWkvUG9pbnQuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvcmVjdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFJlY3QgOiBwdWJsaWMgQVJlY3QKLXsKLXB1YmxpYzoKLSAgICB0eXBlZGVmIEFSZWN0Ojp2YWx1ZV90eXBlIHZhbHVlX3R5cGU7Ci0KLSAgICAvLyB3ZSBkb24ndCBwcm92aWRlIGNvcHktY3RvciBhbmQgb3BlcmF0b3I9IG9uIHB1cnBvc2UKLSAgICAvLyBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIGdlbmVyYXRlZCB2ZXJzaW9ucwotCi0gICAgaW5saW5lIFJlY3QoKSB7Ci0gICAgfQotICAgIGlubGluZSBSZWN0KGludDMyX3QgdywgaW50MzJfdCBoKSB7Ci0gICAgICAgIGxlZnQgPSB0b3AgPSAwOyByaWdodCA9IHc7IGJvdHRvbSA9IGg7Ci0gICAgfQotICAgIGlubGluZSBSZWN0KGludDMyX3QgbCwgaW50MzJfdCB0LCBpbnQzMl90IHIsIGludDMyX3QgYikgewotICAgICAgICBsZWZ0ID0gbDsgdG9wID0gdDsgcmlnaHQgPSByOyBib3R0b20gPSBiOwotICAgIH0KLSAgICBpbmxpbmUgUmVjdChjb25zdCBQb2ludCYgbHQsIGNvbnN0IFBvaW50JiByYikgewotICAgICAgICBsZWZ0ID0gbHQueDsgdG9wID0gbHQueTsgcmlnaHQgPSByYi54OyBib3R0b20gPSByYi55OwotICAgIH0KLQotICAgIHZvaWQgbWFrZUludmFsaWQoKTsKLQotICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICBsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwOwotICAgIH0KLQotICAgIC8vIGEgdmFsaWQgcmVjdGFuZ2xlIGhhcyBhIG5vbiBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICh3aWR0aCgpPj0wKSAmJiAoaGVpZ2h0KCk+PTApOwotICAgIH0KLQotICAgIC8vIGFuIGVtcHR5IHJlY3QgaGFzIGEgemVybyB3aWR0aCBvciBoZWlnaHQsIG9yIGlzIGludmFsaWQKLSAgICBpbmxpbmUgYm9vbCBpc0VtcHR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gKHdpZHRoKCk8PTApIHx8IChoZWlnaHQoKTw9MCk7Ci0gICAgfQotCi0gICAgaW5saW5lIHZvaWQgc2V0KGNvbnN0IFJlY3QmIHJocykgewotICAgICAgICBvcGVyYXRvciA9IChyaHMpOwotICAgIH0KLQotICAgIC8vIHJlY3RhbmdsZSdzIHdpZHRoCi0gICAgaW5saW5lIGludDMyX3Qgd2lkdGgoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiByaWdodC1sZWZ0OwotICAgIH0KLSAgICAKLSAgICAvLyByZWN0YW5nbGUncyBoZWlnaHQKLSAgICBpbmxpbmUgaW50MzJfdCBoZWlnaHQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBib3R0b20tdG9wOwotICAgIH0KLQotICAgIHZvaWQgc2V0TGVmdFRvcChjb25zdCBQb2ludCYgbHQpIHsKLSAgICAgICAgbGVmdCA9IGx0Lng7Ci0gICAgICAgIHRvcCAgPSBsdC55OwotICAgIH0KLQotICAgIHZvaWQgc2V0UmlnaHRCb3R0b20oY29uc3QgUG9pbnQmIHJiKSB7Ci0gICAgICAgIHJpZ2h0ID0gcmIueDsKLSAgICAgICAgYm90dG9tICA9IHJiLnk7Ci0gICAgfQotICAgIAotICAgIC8vIHRoZSBmb2xsb3dpbmcgNCBmdW5jdGlvbnMgcmV0dXJuIHRoZSA0IGNvcm5lcnMgb2YgdGhlIHJlY3QgYXMgUG9pbnQKLSAgICBQb2ludCBsZWZ0VG9wKCkgY29uc3QgewotICAgICAgICByZXR1cm4gUG9pbnQobGVmdCwgdG9wKTsKLSAgICB9Ci0gICAgUG9pbnQgcmlnaHRCb3R0b20oKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBQb2ludChyaWdodCwgYm90dG9tKTsKLSAgICB9Ci0gICAgUG9pbnQgcmlnaHRUb3AoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBQb2ludChyaWdodCwgdG9wKTsKLSAgICB9Ci0gICAgUG9pbnQgbGVmdEJvdHRvbSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFBvaW50KGxlZnQsIGJvdHRvbSk7Ci0gICAgfQotCi0gICAgLy8gY29tcGFyaXNvbnMKLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgUmVjdCYgcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAobGVmdCA9PSByaHMubGVmdCkgJiYgKHRvcCA9PSByaHMudG9wKSAmJgotICAgICAgICAgICAgICAgKHJpZ2h0ID09IHJocy5yaWdodCkgJiYgKGJvdHRvbSA9PSByaHMuYm90dG9tKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgUmVjdCYgcmhzKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAhb3BlcmF0b3IgPT0gKHJocyk7Ci0gICAgfQotCi0gICAgLy8gb3BlcmF0b3IgPCBkZWZpbmVzIGFuIG9yZGVyIHdoaWNoIGFsbG93cyB0byB1c2UgcmVjdGFuZ2xlcyBpbiBzb3J0ZWQKLSAgICAvLyB2ZWN0b3JzLgotICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgUmVjdCYgcmhzKSBjb25zdDsKLQotICAgIFJlY3QmIG9mZnNldFRvT3JpZ2luKCkgewotICAgICAgICByaWdodCAtPSBsZWZ0OwotICAgICAgICBib3R0b20gLT0gdG9wOwotICAgICAgICBsZWZ0ID0gdG9wID0gMDsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLSAgICBSZWN0JiBvZmZzZXRUbyhjb25zdCBQb2ludCYgcCkgewotICAgICAgICByZXR1cm4gb2Zmc2V0VG8ocC54LCBwLnkpOwotICAgIH0KLSAgICBSZWN0JiBvZmZzZXRCeShjb25zdCBQb2ludCYgZHApIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldEJ5KGRwLngsIGRwLnkpOwotICAgIH0KLSAgICBSZWN0JiBvcGVyYXRvciArPSAoY29uc3QgUG9pbnQmIHJocykgewotICAgICAgICByZXR1cm4gb2Zmc2V0QnkocmhzLngsIHJocy55KTsKLSAgICB9Ci0gICAgUmVjdCYgb3BlcmF0b3IgLT0gKGNvbnN0IFBvaW50JiByaHMpIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldEJ5KC1yaHMueCwgLXJocy55KTsKLSAgICB9Ci0gICAgY29uc3QgUmVjdCBvcGVyYXRvciArIChjb25zdCBQb2ludCYgcmhzKSBjb25zdDsKLSAgICBjb25zdCBSZWN0IG9wZXJhdG9yIC0gKGNvbnN0IFBvaW50JiByaHMpIGNvbnN0OwotCi0gICAgdm9pZCB0cmFuc2xhdGUoaW50MzJfdCBkeCwgaW50MzJfdCBkeSkgeyAvLyBsZWdhY3ksIGRvbid0IHVzZS4KLSAgICAgICAgb2Zmc2V0QnkoZHgsIGR5KTsKLSAgICB9Ci0gCi0gICAgUmVjdCYgICBvZmZzZXRUbyhpbnQzMl90IHgsIGludDMyX3QgeSk7Ci0gICAgUmVjdCYgICBvZmZzZXRCeShpbnQzMl90IHgsIGludDMyX3QgeSk7Ci0gICAgYm9vbCAgICBpbnRlcnNlY3QoY29uc3QgUmVjdCYgd2l0aCwgUmVjdCogcmVzdWx0KSBjb25zdDsKLX07Ci0KLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKFJlY3QpCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1VJX1JFQ1QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvUmVnaW9uLmggYi9pbmNsdWRlL3VpL1JlZ2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQyZjE4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdWkvUmVnaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VSV9SRUdJT05fSAotI2RlZmluZSBBTkRST0lEX1VJX1JFR0lPTl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi0jaW5jbHVkZSA8dWkvUmVjdC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgU3RyaW5nODsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1jbGFzcyBSZWdpb24KLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgIFJlZ2lvbihjb25zdCBSZWN0JiByaHMpOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgUmVnaW9uKGNvbnN0IHZvaWQqIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB+UmVnaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgUmVnaW9uJiBvcGVyYXRvciA9IChjb25zdCBSZWdpb24mIHJocyk7Ci0KLSAgICBpbmxpbmUgIGJvb2wgICAgICAgIGlzRW1wdHkoKSBjb25zdCAgICAgeyByZXR1cm4gbUJvdW5kcy5pc0VtcHR5KCk7ICB9Ci0gICAgaW5saW5lICBib29sICAgICAgICBpc1JlY3QoKSBjb25zdCAgICAgIHsgcmV0dXJuIG1TdG9yYWdlLmlzRW1wdHkoKTsgfQotCi0gICAgaW5saW5lICBSZWN0ICAgICAgICBnZXRCb3VuZHMoKSBjb25zdCAgIHsgcmV0dXJuIG1Cb3VuZHM7IH0KLSAgICBpbmxpbmUgIFJlY3QgICAgICAgIGJvdW5kcygpIGNvbnN0ICAgICAgeyByZXR1cm4gZ2V0Qm91bmRzKCk7IH0KLQotICAgICAgICAgICAgLy8gdGhlIHJlZ2lvbiBiZWNvbWVzIGl0cyBib3VuZHMKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIG1ha2VCb3VuZHNTZWxmKCk7Ci0gICAgCi0gICAgICAgICAgICB2b2lkICAgICAgICBjbGVhcigpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0KGNvbnN0IFJlY3QmIHIpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0KHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwotICAgICAgICAKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIG9yU2VsZihjb25zdCBSZWN0JiByaHMpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgeG9yU2VsZihjb25zdCBSZWN0JiByaHMpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgYW5kU2VsZihjb25zdCBSZWN0JiByaHMpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgc3VidHJhY3RTZWxmKGNvbnN0IFJlY3QmIHJocyk7Ci0KLSAgICAgICAgICAgIC8vIGJvb2xlYW4gb3BlcmF0b3JzLCBhcHBsaWVkIG9uIHRoaXMKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIG9yU2VsZihjb25zdCBSZWdpb24mIHJocyk7Ci0gICAgICAgICAgICBSZWdpb24mICAgICB4b3JTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIGFuZFNlbGYoY29uc3QgUmVnaW9uJiByaHMpOwotICAgICAgICAgICAgUmVnaW9uJiAgICAgc3VidHJhY3RTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLQotICAgICAgICAgICAgLy8gYm9vbGVhbiBvcGVyYXRvcnMKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIG1lcmdlKGNvbnN0IFJlY3QmIHJocykgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBtZXJnZUV4Y2x1c2l2ZShjb25zdCBSZWN0JiByaHMpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgaW50ZXJzZWN0KGNvbnN0IFJlY3QmIHJocykgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBzdWJ0cmFjdChjb25zdCBSZWN0JiByaHMpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBib29sZWFuIG9wZXJhdG9ycwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgbWVyZ2UoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgbWVyZ2VFeGNsdXNpdmUoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgaW50ZXJzZWN0KGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdDsKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIHN1YnRyYWN0KGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdDsKLQotICAgICAgICAgICAgLy8gdGhlc2UgdHJhbnNsYXRlIHJocyBmaXJzdAotICAgICAgICAgICAgUmVnaW9uJiAgICAgdHJhbnNsYXRlU2VsZihpbnQgZHgsIGludCBkeSk7Ci0gICAgICAgICAgICBSZWdpb24mICAgICBvclNlbGYoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KTsKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIHhvclNlbGYoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KTsKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIGFuZFNlbGYoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KTsKLSAgICAgICAgICAgIFJlZ2lvbiYgICAgIHN1YnRyYWN0U2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpOwotCi0gICAgICAgICAgICAvLyB0aGVzZSB0cmFuc2xhdGUgcmhzIGZpcnN0Ci0gICAgY29uc3QgICBSZWdpb24gICAgICB0cmFuc2xhdGUoaW50IGR4LCBpbnQgZHkpIGNvbnN0OwotICAgIGNvbnN0ICAgUmVnaW9uICAgICAgbWVyZ2UoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSBjb25zdDsKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIG1lcmdlRXhjbHVzaXZlKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgY29uc3Q7Ci0gICAgY29uc3QgICBSZWdpb24gICAgICBpbnRlcnNlY3QoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSBjb25zdDsKLSAgICBjb25zdCAgIFJlZ2lvbiAgICAgIHN1YnRyYWN0KGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgY29uc3Q7Ci0KLSAgICAvLyBjb252ZW5pZW5jZSBvcGVyYXRvcnMgb3ZlcmxvYWRzCi0gICAgaW5saW5lICBjb25zdCBSZWdpb24gICAgICBvcGVyYXRvciB8IChjb25zdCBSZWdpb24mIHJocykgY29uc3Q7Ci0gICAgaW5saW5lICBjb25zdCBSZWdpb24gICAgICBvcGVyYXRvciBeIChjb25zdCBSZWdpb24mIHJocykgY29uc3Q7Ci0gICAgaW5saW5lICBjb25zdCBSZWdpb24gICAgICBvcGVyYXRvciAmIChjb25zdCBSZWdpb24mIHJocykgY29uc3Q7Ci0gICAgaW5saW5lICBjb25zdCBSZWdpb24gICAgICBvcGVyYXRvciAtIChjb25zdCBSZWdpb24mIHJocykgY29uc3Q7Ci0gICAgaW5saW5lICBjb25zdCBSZWdpb24gICAgICBvcGVyYXRvciArIChjb25zdCBQb2ludCYgcHQpIGNvbnN0OwotCi0gICAgaW5saW5lICBSZWdpb24mICAgICBvcGVyYXRvciB8PSAoY29uc3QgUmVnaW9uJiByaHMpOwotICAgIGlubGluZSAgUmVnaW9uJiAgICAgb3BlcmF0b3IgXj0gKGNvbnN0IFJlZ2lvbiYgcmhzKTsKLSAgICBpbmxpbmUgIFJlZ2lvbiYgICAgIG9wZXJhdG9yICY9IChjb25zdCBSZWdpb24mIHJocyk7Ci0gICAgaW5saW5lICBSZWdpb24mICAgICBvcGVyYXRvciAtPSAoY29uc3QgUmVnaW9uJiByaHMpOwotICAgIGlubGluZSAgUmVnaW9uJiAgICAgb3BlcmF0b3IgKz0gKGNvbnN0IFBvaW50JiBwdCk7Ci0KLSAgICAKLSAgICAvKiB2YXJpb3VzIHdheXMgdG8gYWNjZXNzIHRoZSByZWN0YW5nbGUgbGlzdCAqLwotICAgIAotICAgIHR5cGVkZWYgUmVjdCBjb25zdCogY29uc3RfaXRlcmF0b3I7Ci0gICAgCi0gICAgICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OwotICAgICAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7Ci0KLSAgICAvKiBubyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGhlcmUuLi4gKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgc2l6ZV90ICAgICAgZ2V0UmVjdHMoVmVjdG9yPFJlY3Q+JiByZWN0TGlzdCkgY29uc3Q7Ci0gICAgICAgICAgICBSZWN0IGNvbnN0KiBnZXRBcnJheShzaXplX3QqIGNvdW50KSBjb25zdDsKLQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBhZGQgYSByZWN0YW5nbGUgdG8gdGhlIGludGVybmFsIGxpc3QuIFRoaXMgcmVjdGFuZ2xlIG11c3QKLSAgICAgICAgICAgIC8vIGJlIHNvcnRlZCBpbiBZIGFuZCBYIGFuZCBtdXN0IG5vdCBtYWtlIHRoZSByZWdpb24gaW52YWxpZC4KLSAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFJlY3RVbmNoZWNrZWQoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpOwotCi0gICAgICAgICAgICAvLyBmbGF0dGVuL3VuZmxhdHRlbiBhIHJlZ2lvbiB0by9mcm9tIGEgcmF3IGJ1ZmZlcgotICAgICAgICAgICAgc3NpemVfdCAgICAgd3JpdGUodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0gICAgc3RhdGljICBzc2l6ZV90ICAgICB3cml0ZUVtcHR5KHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgICAgICBzc2l6ZV90ICAgICByZWFkKGNvbnN0IHZvaWQqIGJ1ZmZlcik7Ci0gICAgc3RhdGljICBib29sICAgICAgICBpc0VtcHR5KHZvaWQqIGJ1ZmZlcik7Ci0KLSAgICB2b2lkICAgICAgICBkdW1wKFN0cmluZzgmIG91dCwgY29uc3QgY2hhciogd2hhdCwgdWludDMyX3QgZmxhZ3M9MCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgICAgZHVtcChjb25zdCBjaGFyKiB3aGF0LCB1aW50MzJfdCBmbGFncz0wKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBjbGFzcyByYXN0ZXJpemVyOwotICAgIGZyaWVuZCBjbGFzcyByYXN0ZXJpemVyOwotICAgIAotICAgIFJlZ2lvbiYgb3BlcmF0aW9uU2VsZihjb25zdCBSZWN0JiByLCBpbnQgb3ApOwotICAgIFJlZ2lvbiYgb3BlcmF0aW9uU2VsZihjb25zdCBSZWdpb24mIHIsIGludCBvcCk7Ci0gICAgUmVnaW9uJiBvcGVyYXRpb25TZWxmKGNvbnN0IFJlZ2lvbiYgciwgaW50IGR4LCBpbnQgZHksIGludCBvcCk7Ci0gICAgY29uc3QgUmVnaW9uIG9wZXJhdGlvbihjb25zdCBSZWN0JiByaHMsIGludCBvcCkgY29uc3Q7Ci0gICAgY29uc3QgUmVnaW9uIG9wZXJhdGlvbihjb25zdCBSZWdpb24mIHJocywgaW50IG9wKSBjb25zdDsKLSAgICBjb25zdCBSZWdpb24gb3BlcmF0aW9uKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSwgaW50IG9wKSBjb25zdDsKLQotICAgIHN0YXRpYyB2b2lkIGJvb2xlYW5fb3BlcmF0aW9uKGludCBvcCwgUmVnaW9uJiBkc3QsCi0gICAgICAgICAgICBjb25zdCBSZWdpb24mIGxocywgY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KTsKLSAgICBzdGF0aWMgdm9pZCBib29sZWFuX29wZXJhdGlvbihpbnQgb3AsIFJlZ2lvbiYgZHN0LAotICAgICAgICAgICAgY29uc3QgUmVnaW9uJiBsaHMsIGNvbnN0IFJlY3QmIHJocywgaW50IGR4LCBpbnQgZHkpOwotCi0gICAgc3RhdGljIHZvaWQgYm9vbGVhbl9vcGVyYXRpb24oaW50IG9wLCBSZWdpb24mIGRzdCwKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiYgbGhzLCBjb25zdCBSZWdpb24mIHJocyk7Ci0gICAgc3RhdGljIHZvaWQgYm9vbGVhbl9vcGVyYXRpb24oaW50IG9wLCBSZWdpb24mIGRzdCwKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiYgbGhzLCBjb25zdCBSZWN0JiByaHMpOwotCi0gICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFJlZ2lvbiYgcmVnLCBpbnQgZHgsIGludCBkeSk7Ci0gICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFJlZ2lvbiYgZHN0LCBjb25zdCBSZWdpb24mIHJlZywgaW50IGR4LCBpbnQgZHkpOwotCi0gICAgc3RhdGljIGJvb2wgdmFsaWRhdGUoY29uc3QgUmVnaW9uJiByZWcsIGNvbnN0IGNoYXIqIG5hbWUpOwotICAgIAotICAgIFJlY3QgICAgICAgICAgICBtQm91bmRzOwotICAgIFZlY3RvcjxSZWN0PiAgICBtU3RvcmFnZTsKLX07Ci0KLQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6b3BlcmF0b3IgfCAoY29uc3QgUmVnaW9uJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gbWVyZ2UocmhzKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdG9yIF4gKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1lcmdlRXhjbHVzaXZlKHJocyk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpvcGVyYXRvciAmIChjb25zdCBSZWdpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBpbnRlcnNlY3QocmhzKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdG9yIC0gKGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN1YnRyYWN0KHJocyk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpvcGVyYXRvciArIChjb25zdCBQb2ludCYgcHQpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJhbnNsYXRlKHB0LngsIHB0LnkpOwotfQotCi0KLVJlZ2lvbiYgUmVnaW9uOjpvcGVyYXRvciB8PSAoY29uc3QgUmVnaW9uJiByaHMpIHsKLSAgICByZXR1cm4gb3JTZWxmKHJocyk7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6b3BlcmF0b3IgXj0gKGNvbnN0IFJlZ2lvbiYgcmhzKSB7Ci0gICAgcmV0dXJuIHhvclNlbGYocmhzKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjpvcGVyYXRvciAmPSAoY29uc3QgUmVnaW9uJiByaHMpIHsKLSAgICByZXR1cm4gYW5kU2VsZihyaHMpOwotfQotUmVnaW9uJiBSZWdpb246Om9wZXJhdG9yIC09IChjb25zdCBSZWdpb24mIHJocykgewotICAgIHJldHVybiBzdWJ0cmFjdFNlbGYocmhzKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjpvcGVyYXRvciArPSAoY29uc3QgUG9pbnQmIHB0KSB7Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZVNlbGYocHQueCwgcHQueSk7Ci19Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1VJX1JFR0lPTl9ICi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQW5kcm9pZFRocmVhZHMuaCBiL2luY2x1ZGUvdXRpbHMvQW5kcm9pZFRocmVhZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlmN2FhNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0FuZHJvaWRUaHJlYWRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0xJQlNfVVRJTFNfQU5EUk9JRF9USFJFQURTX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfQU5EUk9JRF9USFJFQURTX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotIyBpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHV0aWxzL1RocmVhZERlZnMuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDIEFQSQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIENyZWF0ZSBhbmQgcnVuIGEgbmV3IHRocmVhZC4KLWV4dGVybiBpbnQgYW5kcm9pZENyZWF0ZVRocmVhZChhbmRyb2lkX3RocmVhZF9mdW5jX3QsIHZvaWQgKik7Ci0KLS8vIENyZWF0ZSB0aHJlYWQgd2l0aCBsb3RzIG9mIHBhcmFtZXRlcnMKLWV4dGVybiBpbnQgYW5kcm9pZENyZWF0ZVRocmVhZEV0YyhhbmRyb2lkX3RocmVhZF9mdW5jX3QgZW50cnlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGhyZWFkUHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90ICp0aHJlYWRJZCk7Ci0KLS8vIEdldCBzb21lIHNvcnQgb2YgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLWV4dGVybiBhbmRyb2lkX3RocmVhZF9pZF90IGFuZHJvaWRHZXRUaHJlYWRJZCgpOwotCi0vLyBMb3ctbGV2ZWwgdGhyZWFkIGNyZWF0aW9uIC0tIG5ldmVyIGNyZWF0ZXMgdGhyZWFkcyB0aGF0IGNhbgotLy8gaW50ZXJhY3Qgd2l0aCB0aGUgSmF2YSBWTS4KLWV4dGVybiBpbnQgYW5kcm9pZENyZWF0ZVJhd1RocmVhZEV0YyhhbmRyb2lkX3RocmVhZF9mdW5jX3QgZW50cnlGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGhyZWFkUHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90ICp0aHJlYWRJZCk7Ci0KLS8vIFVzZWQgYnkgdGhlIEphdmEgUnVudGltZSB0byBjb250cm9sIGhvdyB0aHJlYWRzIGFyZSBjcmVhdGVkLCBzbyB0aGF0Ci0vLyB0aGV5IGNhbiBiZSBwcm9wZXIgYW5kIGxvdmVseSBKYXZhIHRocmVhZHMuCi10eXBlZGVmIGludCAoKmFuZHJvaWRfY3JlYXRlX3RocmVhZF9mbikoYW5kcm9pZF90aHJlYWRfZnVuY190IGVudHJ5RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRocmVhZFByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aHJlYWRTdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF90aHJlYWRfaWRfdCAqdGhyZWFkSWQpOwotCi1leHRlcm4gdm9pZCBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYyhhbmRyb2lkX2NyZWF0ZV90aHJlYWRfZm4gZnVuYyk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRXh0cmEgZnVuY3Rpb25zIHdvcmtpbmcgd2l0aCByYXcgcGlkcy4KLQotLy8gR2V0IHBpZCBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgotZXh0ZXJuIHBpZF90IGFuZHJvaWRHZXRUaWQoKTsKLQotLy8gQ2hhbmdlIHRoZSBzY2hlZHVsaW5nIGdyb3VwIG9mIGEgcGFydGljdWxhciB0aHJlYWQuICBUaGUgZ3JvdXAKLS8vIHNob3VsZCBiZSBvbmUgb2YgdGhlIEFORFJPSURfVEdST1VQIGNvbnN0YW50cy4gIFJldHVybnMgQkFEX1ZBTFVFIGlmCi0vLyBncnAgaXMgb3V0IG9mIHJhbmdlLCBlbHNlIGFub3RoZXIgbm9uLXplcm8gdmFsdWUgd2l0aCBlcnJubyBzZXQgaWYKLS8vIHRoZSBvcGVyYXRpb24gZmFpbGVkLiAgVGhyZWFkIElEIHplcm8gbWVhbnMgY3VycmVudCB0aHJlYWQuCi1leHRlcm4gaW50IGFuZHJvaWRTZXRUaHJlYWRTY2hlZHVsaW5nR3JvdXAocGlkX3QgdGlkLCBpbnQgZ3JwKTsKLQotLy8gQ2hhbmdlIHRoZSBwcmlvcml0eSBBTkQgc2NoZWR1bGluZyBncm91cCBvZiBhIHBhcnRpY3VsYXIgdGhyZWFkLiAgVGhlIHByaW9yaXR5Ci0vLyBzaG91bGQgYmUgb25lIG9mIHRoZSBBTkRST0lEX1BSSU9SSVRZIGNvbnN0YW50cy4gIFJldHVybnMgSU5WQUxJRF9PUEVSQVRJT04KLS8vIGlmIHRoZSBwcmlvcml0eSBzZXQgZmFpbGVkLCBlbHNlIGFub3RoZXIgdmFsdWUgaWYganVzdCB0aGUgZ3JvdXAgc2V0IGZhaWxlZDsKLS8vIGluIGVpdGhlciBjYXNlIGVycm5vIGlzIHNldC4gIFRocmVhZCBJRCB6ZXJvIG1lYW5zIGN1cnJlbnQgdGhyZWFkLgotZXh0ZXJuIGludCBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkocGlkX3QgdGlkLCBpbnQgcHJpbyk7Ci0KLS8vIEdldCB0aGUgY3VycmVudCBwcmlvcml0eSBvZiBhIHBhcnRpY3VsYXIgdGhyZWFkLiBSZXR1cm5zIG9uZSBvZiB0aGUKLS8vIEFORFJPSURfUFJJT1JJVFkgY29uc3RhbnRzIG9yIGEgbmVnYXRpdmUgcmVzdWx0IGluIGNhc2Ugb2YgZXJyb3IuCi1leHRlcm4gaW50IGFuZHJvaWRHZXRUaHJlYWRQcmlvcml0eShwaWRfdCB0aWQpOwotCi0vLyBHZXQgdGhlIGN1cnJlbnQgc2NoZWR1bGluZyBncm91cCBvZiBhIHBhcnRpY3VsYXIgdGhyZWFkLiBOb3JtYWxseSByZXR1cm5zCi0vLyBvbmUgb2YgdGhlIEFORFJPSURfVEdST1VQIGNvbnN0YW50cyBvdGhlciB0aGFuIEFORFJPSURfVEdST1VQX0RFRkFVTFQuCi0vLyBSZXR1cm5zIEFORFJPSURfVEdST1VQX0RFRkFVTFQgaWYgbm8gcHRocmVhZCBzdXBwb3J0IChlLmcuIG9uIGhvc3QpIG9yIGlmCi0vLyBzY2hlZHVsaW5nIGdyb3VwcyBhcmUgZGlzYWJsZWQuICBSZXR1cm5zIElOVkFMSURfT1BFUkFUSU9OIGlmIHVuZXhwZWN0ZWQgZXJyb3IuCi0vLyBUaHJlYWQgSUQgemVybyBtZWFucyBjdXJyZW50IHRocmVhZC4KLWV4dGVybiBpbnQgYW5kcm9pZEdldFRocmVhZFNjaGVkdWxpbmdHcm91cChwaWRfdCB0aWQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEMrKyBBUEkKLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDcmVhdGUgYW5kIHJ1biBhIG5ldyB0aHJlYWQuCi1pbmxpbmUgYm9vbCBjcmVhdGVUaHJlYWQodGhyZWFkX2Z1bmNfdCBmLCB2b2lkICphKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWRDcmVhdGVUaHJlYWQoZiwgYSkgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLS8vIENyZWF0ZSB0aHJlYWQgd2l0aCBsb3RzIG9mIHBhcmFtZXRlcnMKLWlubGluZSBib29sIGNyZWF0ZVRocmVhZEV0Yyh0aHJlYWRfZnVuY190IGVudHJ5RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSA9ICJhbmRyb2lkOnVubmFtZWRfdGhyZWFkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRocmVhZFByaW9yaXR5ID0gUFJJT1JJVFlfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfaWRfdCAqdGhyZWFkSWQgPSAwKQotewotICAgIHJldHVybiBhbmRyb2lkQ3JlYXRlVGhyZWFkRXRjKGVudHJ5RnVuY3Rpb24sIHVzZXJEYXRhLCB0aHJlYWROYW1lLAotICAgICAgICB0aHJlYWRQcmlvcml0eSwgdGhyZWFkU3RhY2tTaXplLCB0aHJlYWRJZCkgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLS8vIEdldCBzb21lIHNvcnQgb2YgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IHRocmVhZC4KLWlubGluZSB0aHJlYWRfaWRfdCBnZXRUaHJlYWRJZCgpIHsKLSAgICByZXR1cm4gYW5kcm9pZEdldFRocmVhZElkKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYgIC8vIF9fY3BsdXNwbHVzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19BTkRST0lEX1RIUkVBRFNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9BdG9taWMuaCBiL2luY2x1ZGUvdXRpbHMvQXRvbWljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjQ3NmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9BdG9taWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVVRJTFNfQVRPTUlDX0gKLSNkZWZpbmUgQU5EUk9JRF9VVElMU19BVE9NSUNfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotCi0jZW5kaWYgLy8gQU5EUk9JRF9VVElMU19BVE9NSUNfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9CYXNpY0hhc2h0YWJsZS5oIGIvaW5jbHVkZS91dGlscy9CYXNpY0hhc2h0YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGY5NzM4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQmFzaWNIYXNodGFibGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JBU0lDX0hBU0hUQUJMRV9ICi0jZGVmaW5lIEFORFJPSURfQkFTSUNfSEFTSFRBQkxFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL1NoYXJlZEJ1ZmZlci5oPgotI2luY2x1ZGUgPHV0aWxzL1R5cGVIZWxwZXJzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyogSW1wbGVtZW50YXRpb24gdHlwZS4gIE5vdGhpbmcgdG8gc2VlIGhlcmUuICovCi1jbGFzcyBCYXNpY0hhc2h0YWJsZUltcGwgewotcHJvdGVjdGVkOgotICAgIHN0cnVjdCBCdWNrZXQgewotICAgICAgICAvLyBUaGUgY29sbGlzaW9uIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1Y2tldCBpcyBwYXJ0IG9mIGEgY29sbGlzaW9uIGNoYWluCi0gICAgICAgIC8vIHN1Y2ggdGhhdCBhdCBsZWFzdCB0d28gZW50cmllcyBib3RoIGhhc2ggdG8gdGhpcyBidWNrZXQuICBXaGVuIHRydWUsIHdlCi0gICAgICAgIC8vIG1heSBuZWVkIHRvIHNlZWsgZnVydGhlciBhbG9uZyB0aGUgY2hhaW4gdG8gZmluZCB0aGUgZW50cnkuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBDT0xMSVNJT04gPSAweDgwMDAwMDAwVUw7Ci0KLSAgICAgICAgLy8gVGhlIHByZXNlbnQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVja2V0IGNvbnRhaW5zIGFuIGluaXRpYWxpemVkIGVudHJ5IHZhbHVlLgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgUFJFU0VOVCAgID0gMHg0MDAwMDAwMFVMOwotCi0gICAgICAgIC8vIE1hc2sgZm9yIDMwIGJpdHMgd29ydGggb2YgdGhlIGhhc2ggY29kZSB0aGF0IGFyZSBzdG9yZWQgd2l0aGluIHRoZSBidWNrZXQgdG8KLSAgICAgICAgLy8gc3BlZWQgdXAgbG9va3VwcyBhbmQgcmVoYXNoaW5nIGJ5IGVsaW1pbmF0aW5nIHRoZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZQotICAgICAgICAvLyBoYXNoIGNvZGUgb2YgdGhlIGVudHJ5J3Mga2V5LgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgSEFTSF9NQVNLID0gMHgzZmZmZmZmZlVMOwotCi0gICAgICAgIC8vIENvbWJpbmVkIHZhbHVlIHRoYXQgc3RvcmVzIHRoZSBjb2xsaXNpb24gYW5kIHByZXNlbnQgZmxhZ3MgYXMgd2VsbCBhcwotICAgICAgICAvLyBhIDMwIGJpdCBoYXNoIGNvZGUuCi0gICAgICAgIHVpbnQzMl90IGNvb2tpZTsKLQotICAgICAgICAvLyBTdG9yYWdlIGZvciB0aGUgZW50cnkgYmVnaW5zIGhlcmUuCi0gICAgICAgIGNoYXIgZW50cnlbMF07Ci0gICAgfTsKLQotICAgIEJhc2ljSGFzaHRhYmxlSW1wbChzaXplX3QgZW50cnlTaXplLCBib29sIGhhc1RyaXZpYWxEZXN0cnVjdG9yLAotICAgICAgICAgICAgc2l6ZV90IG1pbmltdW1Jbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpOwotICAgIEJhc2ljSGFzaHRhYmxlSW1wbChjb25zdCBCYXNpY0hhc2h0YWJsZUltcGwmIG90aGVyKTsKLQotICAgIHZvaWQgZGlzcG9zZSgpOwotCi0gICAgaW5saW5lIHZvaWQgZWRpdCgpIHsKLSAgICAgICAgaWYgKG1CdWNrZXRzICYmICFTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1CdWNrZXRzKS0+b25seU93bmVyKCkpIHsKLSAgICAgICAgICAgIGNsb25lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldFRvKGNvbnN0IEJhc2ljSGFzaHRhYmxlSW1wbCYgb3RoZXIpOwotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIHNzaXplX3QgbmV4dChzc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICBzc2l6ZV90IGZpbmQoc3NpemVfdCBpbmRleCwgaGFzaF90IGhhc2gsIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBrZXkpIGNvbnN0OwotICAgIHNpemVfdCBhZGQoaGFzaF90IGhhc2gsIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBlbnRyeSk7Ci0gICAgdm9pZCByZW1vdmVBdChzaXplX3QgaW5kZXgpOwotICAgIHZvaWQgcmVoYXNoKHNpemVfdCBtaW5pbXVtQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWNrZXRTaXplOyAvLyBudW1iZXIgb2YgYnl0ZXMgcGVyIGJ1Y2tldCBpbmNsdWRpbmcgdGhlIGVudHJ5Ci0gICAgY29uc3QgYm9vbCBtSGFzVHJpdmlhbERlc3RydWN0b3I7IC8vIHRydWUgaWYgdGhlIGVudHJ5IHR5cGUgZG9lcyBub3QgcmVxdWlyZSBkZXN0cnVjdGlvbgotICAgIHNpemVfdCBtQ2FwYWNpdHk7ICAgICAgICAgLy8gbnVtYmVyIG9mIGJ1Y2tldHMgdGhhdCBjYW4gYmUgZmlsbGVkIGJlZm9yZSBleGNlZWRpbmcgbG9hZCBmYWN0b3IKLSAgICBmbG9hdCBtTG9hZEZhY3RvcjsgICAgICAgIC8vIGxvYWQgZmFjdG9yCi0gICAgc2l6ZV90IG1TaXplOyAgICAgICAgICAgICAvLyBudW1iZXIgb2YgZWxlbWVudHMgYWN0dWFsbHkgaW4gdGhlIHRhYmxlCi0gICAgc2l6ZV90IG1GaWxsZWRCdWNrZXRzOyAgICAvLyBudW1iZXIgb2YgYnVja2V0cyBmb3Igd2hpY2ggY29sbGlzaW9uIG9yIHByZXNlbnQgaXMgdHJ1ZQotICAgIHNpemVfdCBtQnVja2V0Q291bnQ7ICAgICAgLy8gbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBtQnVja2V0cyBhcnJheQotICAgIHZvaWQqIG1CdWNrZXRzOyAgICAgICAgICAgLy8gYXJyYXkgb2YgYnVja2V0cywgYXMgYSBTaGFyZWRCdWZmZXIKLQotICAgIGlubGluZSBjb25zdCBCdWNrZXQmIGJ1Y2tldEF0KGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBidWNrZXRzLCBzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IEJ1Y2tldCo+KAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWNrZXRzKSArIGluZGV4ICogbUJ1Y2tldFNpemUpOwotICAgIH0KLQotICAgIGlubGluZSBCdWNrZXQmIGJ1Y2tldEF0KHZvaWQqIF9fcmVzdHJpY3RfXyBidWNrZXRzLCBzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEJ1Y2tldCo+KHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWNrZXRzKSArIGluZGV4ICogbUJ1Y2tldFNpemUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBjb21wYXJlQnVja2V0S2V5KGNvbnN0IEJ1Y2tldCYgYnVja2V0LCBjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18ga2V5KSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVCdWNrZXRFbnRyeShCdWNrZXQmIGJ1Y2tldCwgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGVudHJ5KSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lCdWNrZXRFbnRyeShCdWNrZXQmIGJ1Y2tldCkgY29uc3QgPSAwOwotCi1wcml2YXRlOgotICAgIHZvaWQgY2xvbmUoKTsKLQotICAgIC8vIEFsbG9jYXRlcyBhIGJ1Y2tldCBhcnJheSBhcyBhIFNoYXJlZEJ1ZmZlci4KLSAgICB2b2lkKiBhbGxvY2F0ZUJ1Y2tldHMoc2l6ZV90IGNvdW50KSBjb25zdDsKLQotICAgIC8vIFJlbGVhc2VzIGEgYnVja2V0IGFycmF5J3MgYXNzb2NpYXRlZCBTaGFyZWRCdWZmZXIuCi0gICAgdm9pZCByZWxlYXNlQnVja2V0cyh2b2lkKiBfX3Jlc3RyaWN0X18gYnVja2V0cywgc2l6ZV90IGNvdW50KSBjb25zdDsKLQotICAgIC8vIERlc3Ryb3lzIHRoZSBjb250ZW50cyBvZiBidWNrZXRzIChpbnZva2VzIGRlc3Ryb3lCdWNrZXRFbnRyeSBmb3IgZWFjaAotICAgIC8vIHBvcHVsYXRlZCBidWNrZXQgaWYgbmVlZGVkKS4KLSAgICB2b2lkIGRlc3Ryb3lCdWNrZXRzKHZvaWQqIF9fcmVzdHJpY3RfXyBidWNrZXRzLCBzaXplX3QgY291bnQpIGNvbnN0OwotCi0gICAgLy8gQ29waWVzIHRoZSBjb250ZW50IG9mIGJ1Y2tldHMgKGNvcGllcyB0aGUgY29va2llIGFuZCBpbnZva2VzIGNvcHlCdWNrZXRFbnRyeQotICAgIC8vIGZvciBlYWNoIHBvcHVsYXRlZCBidWNrZXQgaWYgbmVlZGVkKS4KLSAgICB2b2lkIGNvcHlCdWNrZXRzKGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBmcm9tQnVja2V0cywKLSAgICAgICAgICAgIHZvaWQqIF9fcmVzdHJpY3RfXyB0b0J1Y2tldHMsIHNpemVfdCBjb3VudCkgY29uc3Q7Ci0KLSAgICAvLyBEZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBzaXplIG9mIGEgYnVja2V0IGFycmF5IHRvIHN0b3JlIGEgY2VydGFpbiBtaW5pbXVtCi0gICAgLy8gbnVtYmVyIG9mIGVudHJpZXMgYW5kIHJldHVybnMgaXRzIGVmZmVjdGl2ZSBjYXBhY2l0eS4KLSAgICBzdGF0aWMgdm9pZCBkZXRlcm1pbmVDYXBhY2l0eShzaXplX3QgbWluaW11bUNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLAotICAgICAgICAgICAgc2l6ZV90KiBfX3Jlc3RyaWN0X18gb3V0QnVja2V0Q291bnQsIHNpemVfdCogX19yZXN0cmljdF9fIG91dENhcGFjaXR5KTsKLQotICAgIC8vIFRyaW0gYSBoYXNoIGNvZGUgdG8gMzAgYml0cyB0byBtYXRjaCB3aGF0IHdlIHN0b3JlIGluIHRoZSBidWNrZXQncyBjb29raWUuCi0gICAgaW5saW5lIHN0YXRpYyBoYXNoX3QgdHJpbUhhc2goaGFzaF90IGhhc2gpIHsKLSAgICAgICAgcmV0dXJuIChoYXNoICYgQnVja2V0OjpIQVNIX01BU0spIF4gKGhhc2ggPj4gMzApOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBidWNrZXQgdGhhdCBpcyBpbiB0aGUgY29sbGlzaW9uIGNoYWluCi0gICAgLy8gZm9yIHRoZSBzcGVjaWZpZWQgaGFzaCBjb2RlLCBnaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ1Y2tldHMuCi0gICAgLy8gKFByaW1hcnkgaGFzaCkKLSAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBjaGFpblN0YXJ0KGhhc2hfdCBoYXNoLCBzaXplX3QgY291bnQpIHsKLSAgICAgICAgcmV0dXJuIGhhc2ggJSBjb3VudDsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBpbmNyZW1lbnQgdG8gYWRkIHRvIGEgYnVja2V0IGluZGV4IHRvIHNlZWsgdG8gdGhlIG5leHQgYnVja2V0Ci0gICAgLy8gaW4gdGhlIGNvbGxpc2lvbiBjaGFpbiBmb3IgdGhlIHNwZWNpZmllZCBoYXNoIGNvZGUsIGdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnVja2V0cy4KLSAgICAvLyAoU2Vjb25kYXJ5IGhhc2gpCi0gICAgaW5saW5lIHN0YXRpYyBzaXplX3QgY2hhaW5JbmNyZW1lbnQoaGFzaF90IGhhc2gsIHNpemVfdCBjb3VudCkgewotICAgICAgICByZXR1cm4gKChoYXNoID4+IDcpIHwgKGhhc2ggPDwgMjUpKSAlIChjb3VudCAtIDEpICsgMTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBidWNrZXQgdGhhdCBpcyBpbiB0aGUgY29sbGlzaW9uIGNoYWluCi0gICAgLy8gdGhhdCBpcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgaW5jcmVtZW50LCBnaXZlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ1Y2tldHMuCi0gICAgaW5saW5lIHN0YXRpYyBzaXplX3QgY2hhaW5TZWVrKHNpemVfdCBpbmRleCwgc2l6ZV90IGluY3JlbWVudCwgc2l6ZV90IGNvdW50KSB7Ci0gICAgICAgIHJldHVybiAoaW5kZXggKyBpbmNyZW1lbnQpICUgY291bnQ7Ci0gICAgfQotfTsKLQotLyoKLSAqIEEgQmFzaWNIYXNodGFibGUgc3RvcmVzIGVudHJpZXMgdGhhdCBhcmUgaW5kZXhlZCBieSBoYXNoIGNvZGUgaW4gcGxhY2UKLSAqIHdpdGhpbiBhbiBhcnJheS4gIFRoZSBiYXNpYyBvcGVyYXRpb25zIGFyZSBmaW5kaW5nIGVudHJpZXMgYnkga2V5LAotICogYWRkaW5nIG5ldyBlbnRyaWVzIGFuZCByZW1vdmluZyBleGlzdGluZyBlbnRyaWVzLgotICoKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB2ZXJ5IGxpbWl0ZWQgc2V0IG9mIG9wZXJhdGlvbnMgd2l0aCBzaW1wbGUgc2VtYW50aWNzLgotICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIGJ1aWxkaW5nIGJsb2NrIHRvIGNvbnN0cnVjdCBtb3JlIGNvbXBsZXgKLSAqIGFuZCBpbnRlcmVzdGluZyBkYXRhIHN0cnVjdHVyZXMgc3VjaCBhcyBIYXNoTWFwLiAgVGhpbmsgdmVyeSBoYXJkIGJlZm9yZQotICogYWRkaW5nIGFueXRoaW5nIGV4dHJhIHRvIEJhc2ljSGFzaHRhYmxlLCBpdCBwcm9iYWJseSBiZWxvbmdzIGF0IGEKLSAqIGhpZ2hlciBsZXZlbCBvZiBhYnN0cmFjdGlvbi4KLSAqCi0gKiBUS2V5OiBUaGUga2V5IHR5cGUuCi0gKiBURW50cnk6IFRoZSBlbnRyeSB0eXBlIHdoaWNoIGlzIHdoYXQgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSBhcnJheS4KLSAqCi0gKiBUS2V5IG11c3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGNvbnRyYWN0OgotICogICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUS2V5JiBvdGhlcikgY29uc3Q7ICAvLyByZXR1cm4gdHJ1ZSBpZiBlcXVhbAotICogICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUS2V5JiBvdGhlcikgY29uc3Q7ICAvLyByZXR1cm4gdHJ1ZSBpZiB1bmVxdWFsCi0gKgotICogVEVudHJ5IG11c3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGNvbnRyYWN0OgotICogICAgIGNvbnN0IFRLZXkmIGdldEtleSgpIGNvbnN0OyAgLy8gZ2V0IHRoZSBrZXkgZnJvbSB0aGUgZW50cnkKLSAqCi0gKiBUaGlzIGNsYXNzIHN1cHBvcnRzIHN0b3JpbmcgZW50cmllcyB3aXRoIGR1cGxpY2F0ZSBrZXlzLiAgT2YgY291cnNlLCBpdCBjYW4ndAotICogdGVsbCB0aGVtIGFwYXJ0IGR1cmluZyByZW1vdmFsIHNvIG9ubHkgdGhlIGZpcnN0IGVudHJ5IHdpbGwgYmUgcmVtb3ZlZC4KLSAqIFdlIGRvIHRoaXMgYmVjYXVzZSBpdCBtZWFucyB0aGF0IG9wZXJhdGlvbnMgbGlrZSBhZGQoKSBjYW4ndCBmYWlsLgotICovCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVEVudHJ5PgotY2xhc3MgQmFzaWNIYXNodGFibGUgOiBwcml2YXRlIEJhc2ljSGFzaHRhYmxlSW1wbCB7Ci1wdWJsaWM6Ci0gICAgLyogQ3JlYXRlcyBhIGhhc2h0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbWluaW11bSBpbml0aWFsIGNhcGFjaXR5LgotICAgICAqIFRoZSB1bmRlcmx5aW5nIGFycmF5IHdpbGwgYmUgY3JlYXRlZCB3aGVuIHRoZSBmaXJzdCBlbnRyeSBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIG1pbmltdW1Jbml0aWFsQ2FwYWNpdHk6IFRoZSBtaW5pbXVtIGluaXRpYWwgY2FwYWNpdHkgZm9yIHRoZSBoYXNodGFibGUuCi0gICAgICogICAgIERlZmF1bHQgaXMgMC4KLSAgICAgKiBsb2FkRmFjdG9yOiBUaGUgZGVzaXJlZCBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2h0YWJsZSwgYmV0d2VlbiAwIGFuZCAxLgotICAgICAqICAgICBEZWZhdWx0IGlzIDAuNzUuCi0gICAgICovCi0gICAgQmFzaWNIYXNodGFibGUoc2l6ZV90IG1pbmltdW1Jbml0aWFsQ2FwYWNpdHkgPSAwLCBmbG9hdCBsb2FkRmFjdG9yID0gMC43NWYpOwotCi0gICAgLyogQ29waWVzIGEgaGFzaHRhYmxlLgotICAgICAqIFRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgaXMgc2hhcmVkIGNvcHktb24td3JpdGUuCi0gICAgICovCi0gICAgQmFzaWNIYXNodGFibGUoY29uc3QgQmFzaWNIYXNodGFibGUmIG90aGVyKTsKLQotICAgIC8qIENsZWFycyBhbmQgZGVzdHJveXMgdGhlIGhhc2h0YWJsZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIH5CYXNpY0hhc2h0YWJsZSgpOwotCi0gICAgLyogTWFraW5nIHRoaXMgaGFzaHRhYmxlIGEgY29weSBvZiB0aGUgb3RoZXIgaGFzaHRhYmxlLgotICAgICAqIFRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgaXMgc2hhcmVkIGNvcHktb24td3JpdGUuCi0gICAgICoKLSAgICAgKiBvdGhlcjogVGhlIGhhc2h0YWJsZSB0byBjb3B5LgotICAgICAqLwotICAgIGlubGluZSBCYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+JiBvcGVyYXRvciA9KGNvbnN0IEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT4gJiBvdGhlcikgewotICAgICAgICBzZXRUbyhvdGhlcik7Ci0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaHRhYmxlLgotICAgICAqLwotICAgIGlubGluZSBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TaXplOwotICAgIH0KLQotICAgIC8qIFJldHVybnMgdGhlIGNhcGFjaXR5IG9mIHRoZSBoYXNodGFibGUsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCBjYW4KLSAgICAgKiBhZGRlZCB0byB0aGUgaGFzaHRhYmxlIHdpdGhvdXQgcmVxdWlyaW5nIGl0IHRvIGJlIGdyb3duLgotICAgICAqLwotICAgIGlubGluZSBzaXplX3QgY2FwYWNpdHkoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtQ2FwYWNpdHk7Ci0gICAgfQotCi0gICAgLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgdGhhdCB0aGUgaGFzaHRhYmxlIGhhcywgd2hpY2ggaXMgdGhlIHNpemUgb2YgaXRzCi0gICAgICogdW5kZXJseWluZyBhcnJheS4KLSAgICAgKi8KLSAgICBpbmxpbmUgc2l6ZV90IGJ1Y2tldENvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUJ1Y2tldENvdW50OwotICAgIH0KLQotICAgIC8qIFJldHVybnMgdGhlIGxvYWQgZmFjdG9yIG9mIHRoZSBoYXNodGFibGUuICovCi0gICAgaW5saW5lIGZsb2F0IGxvYWRGYWN0b3IoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtTG9hZEZhY3RvcjsKLSAgICB9OwotCi0gICAgLyogUmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZW50cnkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKgotICAgICAqIGluZGV4OiAgIFRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gcmV0cmlldmUuICBNdXN0IGJlIGEgdmFsaWQgaW5kZXggd2l0aGluCi0gICAgICogICAgICAgICAgdGhlIGJvdW5kcyBvZiB0aGUgaGFzaHRhYmxlLgotICAgICAqLwotICAgIGlubGluZSBjb25zdCBURW50cnkmIGVudHJ5QXQoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBlbnRyeUZvcihidWNrZXRBdChtQnVja2V0cywgaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm5zIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSB0byB0aGUgZW50cnkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgKgotICAgICAqIGluZGV4OiBUaGUgaW5kZXggb2YgdGhlIGVudHJ5IHRvIGVkaXQuICBNdXN0IGJlIGEgdmFsaWQgaW5kZXggd2l0aGluCi0gICAgICogICAgICAgIHRoZSBib3VuZHMgb2YgdGhlIGhhc2h0YWJsZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgVEVudHJ5JiBlZGl0RW50cnlBdChzaXplX3QgaW5kZXgpIHsKLSAgICAgICAgZWRpdCgpOwotICAgICAgICByZXR1cm4gZW50cnlGb3IoYnVja2V0QXQobUJ1Y2tldHMsIGluZGV4KSk7Ci0gICAgfQotCi0gICAgLyogQ2xlYXJzIHRoZSBoYXNodGFibGUuCi0gICAgICogQWxsIGVudHJpZXMgaW4gdGhlIGhhc2h0YWJsZSBhcmUgZGVzdHJveWVkIGltbWVkaWF0ZWx5LgotICAgICAqIElmIHlvdSBuZWVkIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHdpdGggdGhlIGVudHJpZXMgaW4gdGhlIGhhc2h0YWJsZSB0aGVuIGl0ZXJhdGUKLSAgICAgKiBvdmVyIHRoZW0gYW5kIGRvIHdoYXQgeW91IG5lZWQgYmVmb3JlIGNsZWFyaW5nIHRoZSBoYXNodGFibGUuCi0gICAgICovCi0gICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIEJhc2ljSGFzaHRhYmxlSW1wbDo6Y2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgaGFzaHRhYmxlIGdpdmVuIHRoZSBpbmRleCBvZiBhIHByZXZpb3VzIGVudHJ5LgotICAgICAqIElmIHRoZSBnaXZlbiBpbmRleCBpcyAtMSwgdGhlbiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGhhc2h0YWJsZSwKLSAgICAgKiBpZiB0aGVyZSBpcyBvbmUsIG9yIC0xIG90aGVyd2lzZS4KLSAgICAgKiBJZiB0aGUgZ2l2ZW4gaW5kZXggaXMgbm90IC0xLCB0aGVuIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBoYXNodGFibGUsCi0gICAgICogaW4gc3RyaWN0bHkgaW5jcmVhc2luZyBvcmRlciwgb3IgLTEgaWYgdGhlcmUgYXJlIG5vbmUgbGVmdC4KLSAgICAgKgotICAgICAqIGluZGV4OiAgIFRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgZW50cnkgdGhhdCB3YXMgaXRlcmF0ZWQsIG9yIC0xIHRvIGJlZ2luCi0gICAgICogICAgICAgICAgaXRlcmF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhhc2h0YWJsZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgc3NpemVfdCBuZXh0KHNzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIEJhc2ljSGFzaHRhYmxlSW1wbDo6bmV4dChpbmRleCk7Ci0gICAgfQotCi0gICAgLyogRmluZHMgdGhlIGluZGV4IG9mIGFuIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCi0gICAgICogSWYgdGhlIGdpdmVuIGluZGV4IGlzIC0xLCB0aGVuIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBlbnRyeSwKLSAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgbWF0Y2hpbmcgZW50cnkuCi0gICAgICogSWYgdGhlIGhhc2h0YWJsZSBjb250YWlucyBtdWx0aXBsZSBlbnRyaWVzIHdpdGgga2V5cyB0aGF0IG1hdGNoIHRoZSByZXF1ZXN0ZWQKLSAgICAgKiBrZXksIHRoZW4gdGhlIHNlcXVlbmNlIG9mIGVudHJpZXMgcmV0dXJuZWQgaXMgYXJiaXRyYXJ5LgotICAgICAqIFJldHVybnMgLTEgaWYgbm8gZW50cnkgd2FzIGZvdW5kLgotICAgICAqCi0gICAgICogaW5kZXg6ICAgVGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LCBvciAtMSB0bwotICAgICAqICAgICAgICAgIGZpbmQgdGhlIGZpcnN0IG1hdGNoaW5nIGVudHJ5LgotICAgICAqIGhhc2g6ICAgIFRoZSBoYXNoY29kZSBvZiB0aGUga2V5LgotICAgICAqIGtleTogICAgIFRoZSBrZXkuCi0gICAgICovCi0gICAgaW5saW5lIHNzaXplX3QgZmluZChzc2l6ZV90IGluZGV4LCBoYXNoX3QgaGFzaCwgY29uc3QgVEtleSYga2V5KSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBCYXNpY0hhc2h0YWJsZUltcGw6OmZpbmQoaW5kZXgsIGhhc2gsICZrZXkpOwotICAgIH0KLQotICAgIC8qIEFkZHMgdGhlIGVudHJ5IHRvIHRoZSBoYXNodGFibGUuCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5ld2x5IGFkZGVkIGVudHJ5LgotICAgICAqIElmIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUga2V5IGFscmVhZHkgZXhpc3RzLCB0aGVuIGEgZHVwbGljYXRlIGVudHJ5IGlzIGFkZGVkLgotICAgICAqIElmIHRoZSBlbnRyeSB3aWxsIG5vdCBmaXQsIHRoZW4gdGhlIGhhc2h0YWJsZSdzIGNhcGFjaXR5IGlzIGluY3JlYXNlZCBhbmQKLSAgICAgKiBpdHMgY29udGVudHMgYXJlIHJlaGFzaGVkLiAgU2VlIHJlaGFzaCgpLgotICAgICAqCi0gICAgICogaGFzaDogICAgVGhlIGhhc2hjb2RlIG9mIHRoZSBrZXkuCi0gICAgICogZW50cnk6ICAgVGhlIGVudHJ5IHRvIGFkZC4KLSAgICAgKi8KLSAgICBpbmxpbmUgc2l6ZV90IGFkZChoYXNoX3QgaGFzaCwgY29uc3QgVEVudHJ5JiBlbnRyeSkgewotICAgICAgICByZXR1cm4gQmFzaWNIYXNodGFibGVJbXBsOjphZGQoaGFzaCwgJmVudHJ5KTsKLSAgICB9Ci0KLSAgICAvKiBSZW1vdmVzIHRoZSBlbnRyeSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgaGFzaHRhYmxlLgotICAgICAqIFRoZSBlbnRyeSBpcyBkZXN0cm95ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogVGhlIGluZGV4IG11c3QgYmUgdmFsaWQuCi0gICAgICoKLSAgICAgKiBUaGUgaGFzaHRhYmxlIGlzIG5vdCBjb21wYWN0ZWQgYWZ0ZXIgYW4gaXRlbSBpcyByZW1vdmVkLCBzbyBpdCBpcyBsZWdhbAotICAgICAqIHRvIGNvbnRpbnVlIGl0ZXJhdGluZyBvdmVyIHRoZSBoYXNodGFibGUgdXNpbmcgbmV4dCgpIG9yIGZpbmQoKS4KLSAgICAgKgotICAgICAqIGluZGV4OiAgIFRoZSBpbmRleCBvZiB0aGUgZW50cnkgdG8gcmVtb3ZlLiAgTXVzdCBiZSBhIHZhbGlkIGluZGV4IHdpdGhpbiB0aGUKLSAgICAgKiAgICAgICAgICBib3VuZHMgb2YgdGhlIGhhc2h0YWJsZSwgYW5kIGl0IG11c3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgZW50cnkuCi0gICAgICovCi0gICAgaW5saW5lIHZvaWQgcmVtb3ZlQXQoc2l6ZV90IGluZGV4KSB7Ci0gICAgICAgIEJhc2ljSGFzaHRhYmxlSW1wbDo6cmVtb3ZlQXQoaW5kZXgpOwotICAgIH0KLQotICAgIC8qIFJlaGFzaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgaGFzaHRhYmxlLgotICAgICAqIEdyb3dzIHRoZSBoYXNodGFibGUgdG8gYXQgbGVhc3QgdGhlIHNwZWNpZmllZCBtaW5pbXVtIGNhcGFjaXR5IG9yIHRoZQotICAgICAqIGN1cnJlbnQgbnVtYmVyIG9mIGVsZW1lbnRzLCB3aGljaGV2ZXIgaXMgbGFyZ2VyLgotICAgICAqCi0gICAgICogUmVoYXNoaW5nIGNhdXNlcyBhbGwgZW50cmllcyB0byBiZSBjb3BpZWQgYW5kIHRoZSBlbnRyeSBpbmRpY2VzIG1heSBjaGFuZ2UuCi0gICAgICogQWx0aG91Z2ggdGhlIGhhc2ggY29kZXMgYXJlIGNhY2hlZCBieSB0aGUgaGFzaHRhYmxlLCByZWhhc2hpbmcgY2FuIGJlIGFuCi0gICAgICogZXhwZW5zaXZlIG9wZXJhdGlvbiBhbmQgc2hvdWxkIGJlIGF2b2lkZWQgdW5sZXNzIHRoZSBoYXNodGFibGUncyBzaXplCi0gICAgICogbmVlZHMgdG8gYmUgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIFJlaGFzaGluZyBpcyB0aGUgb25seSB3YXkgdG8gY2hhbmdlIHRoZSBjYXBhY2l0eSBvciBsb2FkIGZhY3RvciBvZiB0aGUKLSAgICAgKiBoYXNodGFibGUgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkLiAgSXQgY2FuIGJlIHVzZWQgdG8gY29tcGFjdCB0aGUKLSAgICAgKiBoYXNodGFibGUgYnkgY2hvb3NpbmcgYSBtaW5pbXVtIGNhcGFjaXR5IHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50Ci0gICAgICogY2FwYWNpdHkgKHN1Y2ggYXMgMCkuCi0gICAgICoKLSAgICAgKiBtaW5pbXVtQ2FwYWNpdHk6IFRoZSBkZXNpcmVkIG1pbmltdW0gY2FwYWNpdHkgYWZ0ZXIgcmVoYXNoaW5nLgotICAgICAqIGxvYWRGYWN0b3I6IFRoZSBkZXNpcmVkIGxvYWQgZmFjdG9yIGFmdGVyIHJlaGFzaGluZy4KLSAgICAgKi8KLSAgICBpbmxpbmUgdm9pZCByZWhhc2goc2l6ZV90IG1pbmltdW1DYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotICAgICAgICBCYXNpY0hhc2h0YWJsZUltcGw6OnJlaGFzaChtaW5pbXVtQ2FwYWNpdHksIGxvYWRGYWN0b3IpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHN0YXRpYyBpbmxpbmUgY29uc3QgVEVudHJ5JiBlbnRyeUZvcihjb25zdCBCdWNrZXQmIGJ1Y2tldCkgewotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBURW50cnkmPihidWNrZXQuZW50cnkpOwotICAgIH0KLQotICAgIHN0YXRpYyBpbmxpbmUgVEVudHJ5JiBlbnRyeUZvcihCdWNrZXQmIGJ1Y2tldCkgewotICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxURW50cnkmPihidWNrZXQuZW50cnkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBjb21wYXJlQnVja2V0S2V5KGNvbnN0IEJ1Y2tldCYgYnVja2V0LCBjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18ga2V5KSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZUJ1Y2tldEVudHJ5KEJ1Y2tldCYgYnVja2V0LCBjb25zdCB2b2lkKiBfX3Jlc3RyaWN0X18gZW50cnkpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95QnVja2V0RW50cnkoQnVja2V0JiBidWNrZXQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIC8vIEZvciBkdW1waW5nIHRoZSByYXcgY29udGVudHMgb2YgYSBoYXNodGFibGUgZHVyaW5nIHRlc3RpbmcuCi0gICAgZnJpZW5kIGNsYXNzIEJhc2ljSGFzaHRhYmxlVGVzdDsKLSAgICBpbmxpbmUgdWludDMyX3QgY29va2llQXQoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBidWNrZXRBdChtQnVja2V0cywgaW5kZXgpLmNvb2tpZTsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVEVudHJ5PgotQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5Pjo6QmFzaWNIYXNodGFibGUoc2l6ZV90IG1pbmltdW1Jbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIDoKLSAgICAgICAgQmFzaWNIYXNodGFibGVJbXBsKHNpemVvZihURW50cnkpLCB0cmFpdHM8VEVudHJ5Pjo6aGFzX3RyaXZpYWxfZHRvciwKLSAgICAgICAgICAgICAgICBtaW5pbXVtSW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKSB7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci1CYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+OjpCYXNpY0hhc2h0YWJsZShjb25zdCBCYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+JiBvdGhlcikgOgotICAgICAgICBCYXNpY0hhc2h0YWJsZUltcGwob3RoZXIpIHsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRFbnRyeT4KLUJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46On5CYXNpY0hhc2h0YWJsZSgpIHsKLSAgICBkaXNwb3NlKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci1ib29sIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OmNvbXBhcmVCdWNrZXRLZXkoY29uc3QgQnVja2V0JiBidWNrZXQsCi0gICAgICAgIGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gZW50cnlGb3IoYnVja2V0KS5nZXRLZXkoKSA9PSAqc3RhdGljX2Nhc3Q8Y29uc3QgVEtleSo+KGtleSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci12b2lkIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OmluaXRpYWxpemVCdWNrZXRFbnRyeShCdWNrZXQmIGJ1Y2tldCwKLSAgICAgICAgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGVudHJ5KSBjb25zdCB7Ci0gICAgaWYgKCF0cmFpdHM8VEVudHJ5Pjo6aGFzX3RyaXZpYWxfY29weSkgewotICAgICAgICBuZXcgKCZlbnRyeUZvcihidWNrZXQpKSBURW50cnkoKihzdGF0aWNfY2FzdDxjb25zdCBURW50cnkqPihlbnRyeSkpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtZW1jcHkoJmVudHJ5Rm9yKGJ1Y2tldCksIGVudHJ5LCBzaXplb2YoVEVudHJ5KSk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVEVudHJ5Pgotdm9pZCBCYXNpY0hhc2h0YWJsZTxUS2V5LCBURW50cnk+OjpkZXN0cm95QnVja2V0RW50cnkoQnVja2V0JiBidWNrZXQpIGNvbnN0IHsKLSAgICBpZiAoIXRyYWl0czxURW50cnk+OjpoYXNfdHJpdmlhbF9kdG9yKSB7Ci0gICAgICAgIGVudHJ5Rm9yKGJ1Y2tldCkuflRFbnRyeSgpOwotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQkFTSUNfSEFTSFRBQkxFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQml0U2V0LmggYi9pbmNsdWRlL3V0aWxzL0JpdFNldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUyZTg2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQml0U2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVVRJTFNfQklUU0VUX0gKLSNkZWZpbmUgVVRJTFNfQklUU0VUX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKgotICogQ29udGFpbnMgc29tZSBiaXQgbWFuaXB1bGF0aW9uIGhlbHBlcnMuCi0gKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBBIHNpbXBsZSBzZXQgb2YgMzIgYml0cyB0aGF0IGNhbiBiZSBpbmRpdmlkdWFsbHkgbWFya2VkIG9yIGNsZWFyZWQuCi1zdHJ1Y3QgQml0U2V0MzIgewotICAgIHVpbnQzMl90IHZhbHVlOwotCi0gICAgaW5saW5lIEJpdFNldDMyKCkgOiB2YWx1ZSgwKSB7IH0KLSAgICBleHBsaWNpdCBpbmxpbmUgQml0U2V0MzIodWludDMyX3QgdmFsdWUpIDogdmFsdWUodmFsdWUpIHsgfQotCi0gICAgLy8gR2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBiaXQgaW5kZXguCi0gICAgc3RhdGljIGlubGluZSB1aW50MzJfdCB2YWx1ZUZvckJpdCh1aW50MzJfdCBuKSB7IHJldHVybiAweDgwMDAwMDAwID4+IG47IH0KLQotICAgIC8vIENsZWFycyB0aGUgYml0IHNldC4KLSAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsgdmFsdWUgPSAwOyB9Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWFya2VkIGJpdHMgaW4gdGhlIHNldC4KLSAgICBpbmxpbmUgdWludDMyX3QgY291bnQoKSBjb25zdCB7IHJldHVybiBfX2J1aWx0aW5fcG9wY291bnQodmFsdWUpOyB9Ci0KLSAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGJpdCBzZXQgZG9lcyBub3QgY29udGFpbiBhbnkgbWFya2VkIGJpdHMuCi0gICAgaW5saW5lIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICEgdmFsdWU7IH0KLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYml0IHNldCBkb2VzIG5vdCBjb250YWluIGFueSB1bm1hcmtlZCBiaXRzLgotICAgIGlubGluZSBib29sIGlzRnVsbCgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IDB4ZmZmZmZmZmY7IH0KLQotICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJpdCBpcyBtYXJrZWQuCi0gICAgaW5saW5lIGJvb2wgaGFzQml0KHVpbnQzMl90IG4pIGNvbnN0IHsgcmV0dXJuIHZhbHVlICYgdmFsdWVGb3JCaXQobik7IH0KLQotICAgIC8vIE1hcmtzIHRoZSBzcGVjaWZpZWQgYml0LgotICAgIGlubGluZSB2b2lkIG1hcmtCaXQodWludDMyX3QgbikgeyB2YWx1ZSB8PSB2YWx1ZUZvckJpdChuKTsgfQotCi0gICAgLy8gQ2xlYXJzIHRoZSBzcGVjaWZpZWQgYml0LgotICAgIGlubGluZSB2b2lkIGNsZWFyQml0KHVpbnQzMl90IG4pIHsgdmFsdWUgJj0gfiB2YWx1ZUZvckJpdChuKTsgfQotCi0gICAgLy8gRmluZHMgdGhlIGZpcnN0IG1hcmtlZCBiaXQgaW4gdGhlIHNldC4KLSAgICAvLyBSZXN1bHQgaXMgdW5kZWZpbmVkIGlmIGFsbCBiaXRzIGFyZSB1bm1hcmtlZC4KLSAgICBpbmxpbmUgdWludDMyX3QgZmlyc3RNYXJrZWRCaXQoKSBjb25zdCB7IHJldHVybiBfX2J1aWx0aW5fY2x6KHZhbHVlKTsgfQotCi0gICAgLy8gRmluZHMgdGhlIGZpcnN0IHVubWFya2VkIGJpdCBpbiB0aGUgc2V0LgotICAgIC8vIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYWxsIGJpdHMgYXJlIG1hcmtlZC4KLSAgICBpbmxpbmUgdWludDMyX3QgZmlyc3RVbm1hcmtlZEJpdCgpIGNvbnN0IHsgcmV0dXJuIF9fYnVpbHRpbl9jbHoofiB2YWx1ZSk7IH0KLQotICAgIC8vIEZpbmRzIHRoZSBsYXN0IG1hcmtlZCBiaXQgaW4gdGhlIHNldC4KLSAgICAvLyBSZXN1bHQgaXMgdW5kZWZpbmVkIGlmIGFsbCBiaXRzIGFyZSB1bm1hcmtlZC4KLSAgICBpbmxpbmUgdWludDMyX3QgbGFzdE1hcmtlZEJpdCgpIGNvbnN0IHsgcmV0dXJuIDMxIC0gX19idWlsdGluX2N0eih2YWx1ZSk7IH0KLQotICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBtYXJrZWQgYml0IGluIHRoZSBzZXQgYW5kIGNsZWFycyBpdC4gIFJldHVybnMgdGhlIGJpdCBpbmRleC4KLSAgICAvLyBSZXN1bHQgaXMgdW5kZWZpbmVkIGlmIGFsbCBiaXRzIGFyZSB1bm1hcmtlZC4KLSAgICBpbmxpbmUgdWludDMyX3QgY2xlYXJGaXJzdE1hcmtlZEJpdCgpIHsKLSAgICAgICAgdWludDMyX3QgbiA9IGZpcnN0TWFya2VkQml0KCk7Ci0gICAgICAgIGNsZWFyQml0KG4pOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICAvLyBGaW5kcyB0aGUgZmlyc3QgdW5tYXJrZWQgYml0IGluIHRoZSBzZXQgYW5kIG1hcmtzIGl0LiAgUmV0dXJucyB0aGUgYml0IGluZGV4LgotICAgIC8vIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYWxsIGJpdHMgYXJlIG1hcmtlZC4KLSAgICBpbmxpbmUgdWludDMyX3QgbWFya0ZpcnN0VW5tYXJrZWRCaXQoKSB7Ci0gICAgICAgIHVpbnQzMl90IG4gPSBmaXJzdFVubWFya2VkQml0KCk7Ci0gICAgICAgIG1hcmtCaXQobik7Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIC8vIEZpbmRzIHRoZSBsYXN0IG1hcmtlZCBiaXQgaW4gdGhlIHNldCBhbmQgY2xlYXJzIGl0LiAgUmV0dXJucyB0aGUgYml0IGluZGV4LgotICAgIC8vIFJlc3VsdCBpcyB1bmRlZmluZWQgaWYgYWxsIGJpdHMgYXJlIHVubWFya2VkLgotICAgIGlubGluZSB1aW50MzJfdCBjbGVhckxhc3RNYXJrZWRCaXQoKSB7Ci0gICAgICAgIHVpbnQzMl90IG4gPSBsYXN0TWFya2VkQml0KCk7Ci0gICAgICAgIGNsZWFyQml0KG4pOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9Ci0KLSAgICAvLyBHZXRzIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGJpdCBpbiB0aGUgc2V0LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gICAgLy8gbWFya2VkIGJpdHMgdGhhdCBhcHBlYXIgYmVmb3JlIHRoZSBzcGVjaWZpZWQgYml0LgotICAgIGlubGluZSB1aW50MzJfdCBnZXRJbmRleE9mQml0KHVpbnQzMl90IG4pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudCh2YWx1ZSAmIH4oMHhmZmZmZmZmZlVMID4+IG4pKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09IChjb25zdCBCaXRTZXQzMiYgb3RoZXIpIGNvbnN0IHsgcmV0dXJuIHZhbHVlID09IG90aGVyLnZhbHVlOyB9Ci0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPSAoY29uc3QgQml0U2V0MzImIG90aGVyKSBjb25zdCB7IHJldHVybiB2YWx1ZSAhPSBvdGhlci52YWx1ZTsgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gVVRJTFNfQklUU0VUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQmxvYkNhY2hlLmggYi9pbmNsdWRlL3V0aWxzL0Jsb2JDYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjM0MmEyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQmxvYkNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9CTE9CX0NBQ0hFX0gKLSNkZWZpbmUgQU5EUk9JRF9CTE9CX0NBQ0hFX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRmxhdHRlbmFibGUuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEEgQmxvYkNhY2hlIGlzIGFuIGluLW1lbW9yeSBjYWNoZSBmb3IgYmluYXJ5IGtleS92YWx1ZSBwYWlycy4gIEEgQmxvYkNhY2hlCi0vLyBkb2VzIE5PVCBwcm92aWRlIGFueSB0aHJlYWQtc2FmZXR5IGd1YXJhbnRlZXMuCi0vLwotLy8gVGhlIGNhY2hlIGNvbnRlbnRzIGNhbiBiZSBzZXJpYWxpemVkIHRvIGFuIGluLW1lbW9yeSBidWZmZXIgb3IgbW1hcCdkIGZpbGUKLS8vIGFuZCB0aGVuIHJlbG9hZGVkIGluIGEgc3Vic2VxdWVudCBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0uICBUaGlzCi0vLyBzZXJpYWxpemF0aW9uIGlzIG5vbi1wb3J0YWJsZSBhbmQgdGhlIGRhdGEgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgZGV2aWNlCi0vLyB0aGF0IGdlbmVyYXRlZCBpdC4KLWNsYXNzIEJsb2JDYWNoZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgRmxhdHRlbmFibGUgewotcHVibGljOgotCi0gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGJsb2IgY2FjaGUuIFRoZSBibG9iIGNhY2hlIHdpbGwgY2FjaGUga2V5L3ZhbHVlIHBhaXJzCi0gICAgLy8gd2l0aCBrZXkgYW5kIHZhbHVlIHNpemVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXhLZXlTaXplIGFuZAotICAgIC8vIG1heFZhbHVlU2l6ZSwgcmVzcGVjdGl2ZWx5LiBUaGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiBBTEwgY2FjaGUgZW50cmllcwotICAgIC8vIChrZXkgc2l6ZXMgcGx1cyB2YWx1ZSBzaXplcykgd2lsbCBub3QgZXhjZWVkIG1heFRvdGFsU2l6ZS4KLSAgICBCbG9iQ2FjaGUoc2l6ZV90IG1heEtleVNpemUsIHNpemVfdCBtYXhWYWx1ZVNpemUsIHNpemVfdCBtYXhUb3RhbFNpemUpOwotCi0gICAgLy8gc2V0IGluc2VydHMgYSBuZXcgYmluYXJ5IHZhbHVlIGludG8gdGhlIGNhY2hlIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggdGhlCi0gICAgLy8gZ2l2ZW4gYmluYXJ5IGtleS4gIElmIHRoZSBrZXkgb3IgdmFsdWUgYXJlIHRvbyBsYXJnZSBmb3IgdGhlIGNhY2hlIHRoZW4KLSAgICAvLyB0aGUgY2FjaGUgcmVtYWlucyB1bmNoYW5nZWQuICBUaGlzIGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIGEgZGlmZmVyZW50Ci0gICAgLy8gdmFsdWUgd2FzIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkgLSB0aGUgb2xkIHZhbHVlIHdpbGwKLSAgICAvLyByZW1haW4gaW4gdGhlIGNhY2hlLiAgSWYgdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUgYXJlIHNtYWxsIGVub3VnaCB0byBiZQotICAgIC8vIHB1dCBpbiB0aGUgY2FjaGUgKGJhc2VkIG9uIHRoZSBtYXhLZXlTaXplLCBtYXhWYWx1ZVNpemUsIGFuZCBtYXhUb3RhbFNpemUKLSAgICAvLyB2YWx1ZXMgc3BlY2lmaWVkIHRvIHRoZSBCbG9iQ2FjaGUgY29uc3RydWN0b3IpLCB0aGVuIHRoZSBrZXkvdmFsdWUgcGFpcgotICAgIC8vIHdpbGwgYmUgaW4gdGhlIGNhY2hlIGFmdGVyIHNldCByZXR1cm5zLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBhIHN1YnNlcXVlbnQKLSAgICAvLyBjYWxsIHRvIHNldCBtYXkgZXZpY3Qgb2xkIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBjYWNoZS4KLSAgICAvLwotICAgIC8vIFByZWNvbmRpdGlvbnM6Ci0gICAgLy8gICBrZXkgIT0gTlVMTAotICAgIC8vICAgMCA8IGtleVNpemUKLSAgICAvLyAgIHZhbHVlICE9IE5VTEwKLSAgICAvLyAgIDAgPCB2YWx1ZVNpemUKLSAgICB2b2lkIHNldChjb25zdCB2b2lkKiBrZXksIHNpemVfdCBrZXlTaXplLCBjb25zdCB2b2lkKiB2YWx1ZSwKLSAgICAgICAgICAgIHNpemVfdCB2YWx1ZVNpemUpOwotCi0gICAgLy8gZ2V0IHJldHJpZXZlcyBmcm9tIHRoZSBjYWNoZSB0aGUgYmluYXJ5IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuCi0gICAgLy8gYmluYXJ5IGtleS4gIElmIHRoZSBrZXkgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUgdGhlbiB0aGUgbGVuZ3RoIG9mIHRoZQotICAgIC8vIGJpbmFyeSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBrZXkgaXMgcmV0dXJuZWQuICBJZiB0aGUgdmFsdWUgYXJndW1lbnQKLSAgICAvLyBpcyBub24tTlVMTCBhbmQgdGhlIHNpemUgb2YgdGhlIGNhY2hlZCB2YWx1ZSBpcyBsZXNzIHRoYW4gdmFsdWVTaXplIGJ5dGVzCi0gICAgLy8gdGhlbiB0aGUgY2FjaGVkIHZhbHVlIGlzIGNvcGllZCBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgdmFsdWUKLSAgICAvLyBhcmd1bWVudC4gIElmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQgaW4gdGhlIGNhY2hlIHRoZW4gMCBpcyByZXR1cm5lZCBhbmQKLSAgICAvLyB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhlIHZhbHVlIGFyZ3VtZW50IGlzIG5vdCBtb2RpZmllZC4KLSAgICAvLwotICAgIC8vIE5vdGUgdGhhdCB3aGVuIGNhbGxpbmcgZ2V0IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUga2V5LCB0aGUgbGF0ZXIKLSAgICAvLyBjYWxscyBtYXkgZmFpbCwgcmV0dXJuaW5nIDAsIGV2ZW4gaWYgZWFybGllciBjYWxscyBzdWNjZWVkZWQuICBUaGUgcmV0dXJuCi0gICAgLy8gdmFsdWUgbXVzdCBiZSBjaGVja2VkIGZvciBlYWNoIGNhbGwuCi0gICAgLy8KLSAgICAvLyBQcmVjb25kaXRpb25zOgotICAgIC8vICAga2V5ICE9IE5VTEwKLSAgICAvLyAgIDAgPCBrZXlTaXplCi0gICAgLy8gICAwIDw9IHZhbHVlU2l6ZQotICAgIHNpemVfdCBnZXQoY29uc3Qgdm9pZCoga2V5LCBzaXplX3Qga2V5U2l6ZSwgdm9pZCogdmFsdWUsIHNpemVfdCB2YWx1ZVNpemUpOwotCi0gICAgLy8gZ2V0RmxhdHRlbmVkU2l6ZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIHRoZSBlbnRpcmUKLSAgICAvLyBzZXJpYWxpemVkIGNhY2hlLgotICAgIHZpcnR1YWwgc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoKSBjb25zdDsKLQotICAgIC8vIGdldEZkQ291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdGhhdCB3aWxsIHJlc3VsdCBmcm9tCi0gICAgLy8gZmxhdHRlbmluZyB0aGUgY2FjaGUuICBUaGlzIHdpbGwgYWx3YXlzIHJldHVybiAwIHNvIGFzIHRvIGFsbG93IHRoZQotICAgIC8vIGZsYXR0ZW5lZCBjYWNoZSB0byBiZSBzYXZlZCB0byBkaXNrIGFuZCB0aGVuIGxhdGVyIHJlc3RvcmVkLgotICAgIHZpcnR1YWwgc2l6ZV90IGdldEZkQ291bnQoKSBjb25zdDsKLQotICAgIC8vIGZsYXR0ZW4gc2VyaWFsaXplcyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgY2FjaGUgaW50byB0aGUgbWVtb3J5Ci0gICAgLy8gcG9pbnRlZCB0byBieSAnYnVmZmVyJy4gIFRoZSBzZXJpYWxpemVkIGNhY2hlIGNvbnRlbnRzIGNhbiBsYXRlciBiZQotICAgIC8vIGxvYWRlZCBpbnRvIGEgQmxvYkNhY2hlIG9iamVjdCB1c2luZyB0aGUgdW5mbGF0dGVuIG1ldGhvZC4gIFRoZSBjb250ZW50cwotICAgIC8vIG9mIHRoZSBCbG9iQ2FjaGUgb2JqZWN0IHdpbGwgbm90IGJlIG1vZGlmaWVkLgotICAgIC8vCi0gICAgLy8gUHJlY29uZGl0aW9uczoKLSAgICAvLyAgIHNpemUgPj0gdGhpcy5nZXRGbGF0dGVuZWRTaXplKCkKLSAgICAvLyAgIGNvdW50ID09IDAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsYXR0ZW4odm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZkc1tdLAotICAgICAgICAgICAgc2l6ZV90IGNvdW50KSBjb25zdDsKLQotICAgIC8vIHVuZmxhdHRlbiByZXBsYWNlcyB0aGUgY29udGVudHMgb2YgdGhlIGNhY2hlIHdpdGggdGhlIHNlcmlhbGl6ZWQgY2FjaGUKLSAgICAvLyBjb250ZW50cyBpbiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgJ2J1ZmZlcicuICBUaGUgcHJldmlvdXMgY29udGVudHMgb2YKLSAgICAvLyB0aGUgQmxvYkNhY2hlIHdpbGwgYmUgZXZpY3RlZCBmcm9tIHRoZSBjYWNoZS4gIElmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotICAgIC8vIHVuZmxhdHRlbmluZyB0aGUgc2VyaWFsaXplZCBjYWNoZSBjb250ZW50cyB0aGVuIHRoZSBCbG9iQ2FjaGUgd2lsbCBiZQotICAgIC8vIGxlZnQgaW4gYW4gZW1wdHkgc3RhdGUuCi0gICAgLy8KLSAgICAvLyBQcmVjb25kaXRpb25zOgotICAgIC8vICAgY291bnQgPT0gMAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5mbGF0dGVuKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGludCBmZHNbXSwKLSAgICAgICAgICAgIHNpemVfdCBjb3VudCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gQ29weWluZyBpcyBkaXNhbGxvd2VkLgotICAgIEJsb2JDYWNoZShjb25zdCBCbG9iQ2FjaGUmKTsKLSAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBCbG9iQ2FjaGUmKTsKLQotICAgIC8vIEEgcmFuZG9tIGZ1bmN0aW9uIGhlbHBlciB0byBnZXQgYXJvdW5kIE1pbkdXIG5vdCBoYXZpbmcgbnJhbmQ0OCgpCi0gICAgbG9uZyBpbnQgYmxvYl9yYW5kb20oKTsKLQotICAgIC8vIGNsZWFuIGV2aWN0cyBhIHJhbmRvbWx5IGNob3NlbiBzZXQgb2YgZW50cmllcyBmcm9tIHRoZSBjYWNoZSBzdWNoIHRoYXQKLSAgICAvLyB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgcmVtYWluaW5nIGVudHJpZXMgaXMgbGVzcyB0aGFuIG1NYXhUb3RhbFNpemUvMi4KLSAgICB2b2lkIGNsZWFuKCk7Ci0KLSAgICAvLyBpc0NsZWFuYWJsZSByZXR1cm5zIHRydWUgaWYgdGhlIGNhY2hlIGlzIGZ1bGwgZW5vdWdoIGZvciB0aGUgY2xlYW4gbWV0aG9kCi0gICAgLy8gdG8gaGF2ZSBzb21lIGVmZmVjdCwgYW5kIGZhbHNlIG90aGVyd2lzZS4KLSAgICBib29sIGlzQ2xlYW5hYmxlKCkgY29uc3Q7Ci0KLSAgICAvLyBBIEJsb2IgaXMgYW4gaW1tdXRhYmxlIHNpemVkIHVuc3RydWN0dXJlZCBkYXRhIGJsb2IuCi0gICAgY2xhc3MgQmxvYiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEJsb2IoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgY29weURhdGEpOwotICAgICAgICB+QmxvYigpOwotCi0gICAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEJsb2ImIHJocykgY29uc3Q7Ci0KLSAgICAgICAgY29uc3Qgdm9pZCogZ2V0RGF0YSgpIGNvbnN0OwotICAgICAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0OwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gQ29weWluZyBpcyBub3QgYWxsb3dlZC4KLSAgICAgICAgQmxvYihjb25zdCBCbG9iJik7Ci0gICAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEJsb2ImKTsKLQotICAgICAgICAvLyBtRGF0YSBwb2ludHMgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBibG9iIGRhdGEuCi0gICAgICAgIGNvbnN0IHZvaWQqIG1EYXRhOwotCi0gICAgICAgIC8vIG1TaXplIGlzIHRoZSBzaXplIG9mIHRoZSBibG9iIGRhdGEgaW4gYnl0ZXMuCi0gICAgICAgIHNpemVfdCBtU2l6ZTsKLQotICAgICAgICAvLyBtT3duc0RhdGEgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoaXMgQmxvYiBvYmplY3Qgc2hvdWxkIGZyZWUgdGhlCi0gICAgICAgIC8vIG1lbW9yeSBwb2ludGVkIHRvIGJ5IG1EYXRhIHdoZW4gdGhlIEJsb2IgZ2V0cyBkZXN0cnVjdGVkLgotICAgICAgICBib29sIG1Pd25zRGF0YTsKLSAgICB9OwotCi0gICAgLy8gQSBDYWNoZUVudHJ5IGlzIGEgc2luZ2xlIGtleS92YWx1ZSBwYWlyIGluIHRoZSBjYWNoZS4KLSAgICBjbGFzcyBDYWNoZUVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhY2hlRW50cnkoKTsKLSAgICAgICAgQ2FjaGVFbnRyeShjb25zdCBzcDxCbG9iPiYga2V5LCBjb25zdCBzcDxCbG9iPiYgdmFsdWUpOwotICAgICAgICBDYWNoZUVudHJ5KGNvbnN0IENhY2hlRW50cnkmIGNlKTsKLQotICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBDYWNoZUVudHJ5JiByaHMpIGNvbnN0OwotICAgICAgICBjb25zdCBDYWNoZUVudHJ5JiBvcGVyYXRvcj0oY29uc3QgQ2FjaGVFbnRyeSYpOwotCi0gICAgICAgIHNwPEJsb2I+IGdldEtleSgpIGNvbnN0OwotICAgICAgICBzcDxCbG9iPiBnZXRWYWx1ZSgpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0VmFsdWUoY29uc3Qgc3A8QmxvYj4mIHZhbHVlKTsKLQotICAgIHByaXZhdGU6Ci0KLSAgICAgICAgLy8gbUtleSBpcyB0aGUga2V5IHRoYXQgaWRlbnRpZmllcyB0aGUgY2FjaGUgZW50cnkuCi0gICAgICAgIHNwPEJsb2I+IG1LZXk7Ci0KLSAgICAgICAgLy8gbVZhbHVlIGlzIHRoZSBjYWNoZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4KLSAgICAgICAgc3A8QmxvYj4gbVZhbHVlOwotICAgIH07Ci0KLSAgICAvLyBBIEhlYWRlciBpcyB0aGUgaGVhZGVyIGZvciB0aGUgZW50aXJlIEJsb2JDYWNoZSBzZXJpYWxpemF0aW9uIGZvcm1hdC4gTm8KLSAgICAvLyBuZWVkIHRvIG1ha2UgdGhpcyBwb3J0YWJsZSwgc28gd2Ugc2ltcGx5IHdyaXRlIHRoZSBzdHJ1Y3Qgb3V0LgotICAgIHN0cnVjdCBIZWFkZXIgewotICAgICAgICAvLyBtTWFnaWNOdW1iZXIgaXMgdGhlIG1hZ2ljIG51bWJlciB0aGF0IGlkZW50aWZpZXMgdGhlIGRhdGEgYXMKLSAgICAgICAgLy8gc2VyaWFsaXplZCBCbG9iQ2FjaGUgY29udGVudHMuICBJdCBtdXN0IGFsd2F5cyBjb250YWluICdCbGIkJy4KLSAgICAgICAgdWludDMyX3QgbU1hZ2ljTnVtYmVyOwotCi0gICAgICAgIC8vIG1CbG9iQ2FjaGVWZXJzaW9uIGlzIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCB2ZXJzaW9uLgotICAgICAgICB1aW50MzJfdCBtQmxvYkNhY2hlVmVyc2lvbjsKLQotICAgICAgICAvLyBtRGV2aWNlVmVyc2lvbiBpcyB0aGUgZGV2aWNlLXNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGNhY2hlLiAgVGhpcyBjYW4KLSAgICAgICAgLy8gYmUgdXNlZCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZS4KLSAgICAgICAgdWludDMyX3QgbURldmljZVZlcnNpb247Ci0KLSAgICAgICAgLy8gbU51bUVudHJpZXMgaXMgbnVtYmVyIG9mIGNhY2hlIGVudHJpZXMgZm9sbG93aW5nIHRoZSBoZWFkZXIgaW4gdGhlCi0gICAgICAgIC8vIGRhdGEuCi0gICAgICAgIHNpemVfdCBtTnVtRW50cmllczsKLSAgICB9OwotCi0gICAgLy8gQW4gRW50cnlIZWFkZXIgaXMgdGhlIGhlYWRlciBmb3IgYSBzZXJpYWxpemVkIGNhY2hlIGVudHJ5LiAgTm8gbmVlZCB0bwotICAgIC8vIG1ha2UgdGhpcyBwb3J0YWJsZSwgc28gd2Ugc2ltcGx5IHdyaXRlIHRoZSBzdHJ1Y3Qgb3V0LiAgRWFjaCBFbnRyeUhlYWRlcgotICAgIC8vIGlzIGZvbGxvd2VkIGltZWRpYXRlbHkgYnkgdGhlIGtleSBkYXRhIGFuZCB0aGVuIHRoZSB2YWx1ZSBkYXRhLgotICAgIC8vCi0gICAgLy8gVGhlIGJlZ2lubmluZyBvZiBlYWNoIHNlcmlhbGl6ZWQgRW50cnlIZWFkZXIgaXMgNC1ieXRlIGFsaWduZWQsIHNvIHRoZQotICAgIC8vIG51bWJlciBvZiBieXRlcyB0aGF0IGEgc2VyaWFsaXplZCBjYWNoZSBlbnRyeSB3aWxsIG9jY3VweSBpczoKLSAgICAvLwotICAgIC8vICAgKChzaXplb2YoRW50cnlIZWFkZXIpICsga2V5U2l6ZSArIHZhbHVlU2l6ZSkgKyAzKSAmIH4zCi0gICAgLy8KLSAgICBzdHJ1Y3QgRW50cnlIZWFkZXIgewotICAgICAgICAvLyBtS2V5U2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgZW50cnkga2V5IGluIGJ5dGVzLgotICAgICAgICBzaXplX3QgbUtleVNpemU7Ci0KLSAgICAgICAgLy8gbVZhbHVlU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgZW50cnkgdmFsdWUgaW4gYnl0ZXMuCi0gICAgICAgIHNpemVfdCBtVmFsdWVTaXplOwotCi0gICAgICAgIC8vIG1EYXRhIGNvbnRhaW5zIGJvdGggdGhlIGtleSBhbmQgdmFsdWUgZGF0YSBmb3IgdGhlIGNhY2hlIGVudHJ5LiAgVGhlCi0gICAgICAgIC8vIGtleSBjb21lcyBmaXJzdCBmb2xsb3dlZCBpbW1lZGlhdGVseSBieSB0aGUgdmFsdWUuCi0gICAgICAgIHVpbnQ4X3QgbURhdGFbXTsKLSAgICB9OwotCi0gICAgLy8gbU1heEtleVNpemUgaXMgdGhlIG1heGltdW0ga2V5IHNpemUgdGhhdCB3aWxsIGJlIGNhY2hlZC4gQ2FsbHMgdG8KLSAgICAvLyBCbG9iQ2FjaGU6OnNldCB3aXRoIGEga2V5U2l6ZSBwYXJhbWV0ZXIgbGFyZ2VyIHRoYW4gbU1heEtleVNpemUgd2lsbAotICAgIC8vIHNpbXBseSBub3QgYWRkIHRoZSBrZXkvdmFsdWUgcGFpciB0byB0aGUgY2FjaGUuCi0gICAgY29uc3Qgc2l6ZV90IG1NYXhLZXlTaXplOwotCi0gICAgLy8gbU1heFZhbHVlU2l6ZSBpcyB0aGUgbWF4aW11bSB2YWx1ZSBzaXplIHRoYXQgd2lsbCBiZSBjYWNoZWQuIENhbGxzIHRvCi0gICAgLy8gQmxvYkNhY2hlOjpzZXQgd2l0aCBhIHZhbHVlU2l6ZSBwYXJhbWV0ZXIgbGFyZ2VyIHRoYW4gbU1heFZhbHVlU2l6ZSB3aWxsCi0gICAgLy8gc2ltcGx5IG5vdCBhZGQgdGhlIGtleS92YWx1ZSBwYWlyIHRvIHRoZSBjYWNoZS4KLSAgICBjb25zdCBzaXplX3QgbU1heFZhbHVlU2l6ZTsKLQotICAgIC8vIG1NYXhUb3RhbFNpemUgaXMgdGhlIG1heGltdW0gc2l6ZSB0aGF0IGFsbCBjYWNoZSBlbnRyaWVzIGNhbiBvY2N1cHkuIFRoaXMKLSAgICAvLyBpbmNsdWRlcyBzcGFjZSBmb3IgYm90aCBrZXlzIGFuZCB2YWx1ZXMuIFdoZW4gYSBjYWxsIHRvIEJsb2JDYWNoZTo6c2V0Ci0gICAgLy8gd291bGQgb3RoZXJ3aXNlIGNhdXNlIHRoaXMgbGltaXQgdG8gYmUgZXhjZWVkZWQsIGVpdGhlciB0aGUga2V5L3ZhbHVlCi0gICAgLy8gcGFpciBwYXNzZWQgdG8gQmxvYkNhY2hlOjpzZXQgd2lsbCBub3QgYmUgY2FjaGVkIG9yIG90aGVyIGNhY2hlIGVudHJpZXMKLSAgICAvLyB3aWxsIGJlIGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IGVudHJ5LgotICAgIGNvbnN0IHNpemVfdCBtTWF4VG90YWxTaXplOwotCi0gICAgLy8gbVRvdGFsU2l6ZSBpcyB0aGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiBhbGwga2V5cyBhbmQgdmFsdWVzIGN1cnJlbnRseSBpbgotICAgIC8vIHRoZSBjYWNoZS4KLSAgICBzaXplX3QgbVRvdGFsU2l6ZTsKLQotICAgIC8vIG1SYW5kU3RhdGUgaXMgdGhlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciBzdGF0ZS4gSXQgaXMgcGFzc2VkIHRvCi0gICAgLy8gbnJhbmQ0OCB0byBnZW5lcmF0ZSByYW5kb20gbnVtYmVycyB3aGVuIG5lZWRlZC4KLSAgICB1bnNpZ25lZCBzaG9ydCBtUmFuZFN0YXRlWzNdOwotCi0gICAgLy8gbUNhY2hlRW50cmllcyBzdG9yZXMgYWxsIHRoZSBjYWNoZSBlbnRyaWVzIHRoYXQgYXJlIHJlc2lkZW50IGluIG1lbW9yeS4KLSAgICAvLyBDYWNoZSBlbnRyaWVzIGFyZSBhZGRlZCB0byBpdCBieSB0aGUgJ3NldCcgbWV0aG9kLgotICAgIFNvcnRlZFZlY3RvcjxDYWNoZUVudHJ5PiBtQ2FjaGVFbnRyaWVzOwotfTsKLQotfQotCi0jZW5kaWYgLy8gQU5EUk9JRF9CTE9CX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0LmggYi9pbmNsdWRlL3V0aWxzL0J1ZmZlcmVkVGV4dE91dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM2MjQwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0JVRkZFUkVEVEVYVE9VVFBVVF9ICi0jZGVmaW5lIEFORFJPSURfQlVGRkVSRURURVhUT1VUUFVUX0gKLQotI2luY2x1ZGUgPHV0aWxzL1RleHRPdXRwdXQuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Vpby5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQnVmZmVyZWRUZXh0T3V0cHV0IDogcHVibGljIFRleHRPdXRwdXQKLXsKLXB1YmxpYzoKLSAgICAvLyoqIEZsYWdzIGZvciBjb25zdHJ1Y3RvciAqLwotICAgIGVudW0gewotICAgICAgICBNVUxUSVRIUkVBREVEID0gMHgwMDAxCi0gICAgfTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkVGV4dE91dHB1dCh1aW50MzJfdCBmbGFncyA9IDApOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgfkJ1ZmZlcmVkVGV4dE91dHB1dCgpOwotICAgIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcHJpbnQoY29uc3QgY2hhciogdHh0LCBzaXplX3QgbGVuKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG1vdmVJbmRlbnQoaW50IGRlbHRhKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHB1c2hCdW5kbGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHBvcEJ1bmRsZSgpOwotICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgd3JpdGVMaW5lcyhjb25zdCBzdHJ1Y3QgaW92ZWMmIHZlYywgc2l6ZV90IE4pID0gMDsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgQnVmZmVyU3RhdGU7Ci0gICAgc3RydWN0IFRocmVhZFN0YXRlOwotICAgIAotICAgIHN0YXRpYyAgVGhyZWFkU3RhdGUqZ2V0VGhyZWFkU3RhdGUoKTsKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIHRocmVhZERlc3RydWN0b3Iodm9pZCAqc3QpOwotICAgIAotICAgICAgICAgICAgQnVmZmVyU3RhdGUqZ2V0QnVmZmVyKCkgY29uc3Q7Ci0gICAgICAgICAgICAKLSAgICB1aW50MzJfdCAgICAgICAgICAgIG1GbGFnczsKLSAgICBjb25zdCBpbnQzMl90ICAgICAgIG1TZXE7Ci0gICAgY29uc3QgaW50MzJfdCAgICAgICBtSW5kZXg7Ci0gICAgCi0gICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICBCdWZmZXJTdGF0ZSogICAgICAgIG1HbG9iYWxTdGF0ZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfQlVGRkVSRURURVhUT1VUUFVUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQnl0ZU9yZGVyLmggYi9pbmNsdWRlL3V0aWxzL0J5dGVPcmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWEzYTgzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQnl0ZU9yZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLQotI2lmbmRlZiBfTElCU19VVElMU19CWVRFX09SREVSX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfQllURV9PUkRFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1dJTlNPQ0sKLSNpbmNsdWRlIDx3aW5zb2NrMi5oPgotI2Vsc2UKLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jZW5kaWYKLQotLyoKLSAqIFRoZXNlIG1hY3JvcyBhcmUgbGlrZSB0aGUgaHRvbi9udG9oIGJ5dGUgc3dhcHBpbmcgbWFjcm9zLAotICogZXhjZXB0IHRoZXkgYWxsb3cgeW91IHRvIHN3YXAgdG8gYW5kIGZyb20gdGhlICJkZXZpY2UiIGJ5dGUKLSAqIG9yZGVyLiAgVGhlIGRldmljZSBieXRlIG9yZGVyIGlzIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSB0YXJnZXQKLSAqIGRldmljZSAtLSBmb3IgdGhlIEFSTSBDUFVzIHdlIHVzZSB0b2RheSwgdGhpcyBpcyBsaXR0bGUgZW5kaWFuLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgYnl0ZSBzd2FwcGluZyBmdW5jdGlvbnMgaGF2ZSBub3QgYmVlbiBvcHRpbWl6ZWQKLSAqIG11Y2g7IHBlcmZvcm1hbmNlIGlzIGN1cnJlbnRseSBub3QgYW4gaXNzdWUgZm9yIHRoZW0gc2luY2UgdGhlCi0gKiBpbnRlbnQgaXMgdG8gYWxsb3cgdXMgdG8gYXZvaWQgYnl0ZSBzd2FwcGluZyBvbiB0aGUgZGV2aWNlLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgYW5kcm9pZF9zd2FwX2xvbmcodWludDMyX3QgdikKLXsKLSAgICByZXR1cm4gKHY8PDI0KSB8ICgodjw8OCkmMHgwMEZGMDAwMCkgfCAoKHY+PjgpJjB4MDAwMEZGMDApIHwgKHY+PjI0KTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50MTZfdCBhbmRyb2lkX3N3YXBfc2hvcnQodWludDE2X3QgdikKLXsKLSAgICByZXR1cm4gKHY8PDgpIHwgKHY+PjgpOwotfQotCi0jZGVmaW5lIERFVklDRV9CWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLQotI2lmIEJZVEVfT1JERVIgPT0gREVWSUNFX0JZVEVfT1JERVIKLQotI2RlZmluZQlkdG9obCh4KQkoeCkKLSNkZWZpbmUJZHRvaHMoeCkJKHgpCi0jZGVmaW5lCWh0b2RsKHgpCSh4KQotI2RlZmluZQlodG9kcyh4KQkoeCkKLQotI2Vsc2UKLQotI2RlZmluZQlkdG9obCh4KQkoYW5kcm9pZF9zd2FwX2xvbmcoeCkpCi0jZGVmaW5lCWR0b2hzKHgpCShhbmRyb2lkX3N3YXBfc2hvcnQoeCkpCi0jZGVmaW5lCWh0b2RsKHgpCShhbmRyb2lkX3N3YXBfbG9uZyh4KSkKLSNkZWZpbmUJaHRvZHMoeCkJKGFuZHJvaWRfc3dhcF9zaG9ydCh4KSkKLQotI2VuZGlmCi0KLSNpZiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KLSNkZWZpbmUgZnJvbWxlbCh4KSAoeCkKLSNkZWZpbmUgZnJvbWxlcyh4KSAoeCkKLSNkZWZpbmUgdG9sZWwoeCkgKHgpCi0jZGVmaW5lIHRvbGVzKHgpICh4KQotI2Vsc2UKLSNkZWZpbmUgZnJvbWxlbCh4KSAoYW5kcm9pZF9zd2FwX2xvbmcoeCkpCi0jZGVmaW5lIGZyb21sZXMoeCkgKGFuZHJvaWRfc3dhcF9zaG9ydCh4KSkKLSNkZWZpbmUgdG9sZWwoeCkgKGFuZHJvaWRfc3dhcF9sb25nKHgpKQotI2RlZmluZSB0b2xlcyh4KSAoYW5kcm9pZF9zd2FwX3Nob3J0KHgpKQotI2VuZGlmCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19CWVRFX09SREVSX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmggYi9pbmNsdWRlL3V0aWxzL0NhbGxTdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzllMjBjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQ2FsbFN0YWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0NBTExTVEFDS19ICi0jZGVmaW5lIEFORFJPSURfQ0FMTFNUQUNLX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPGNvcmtzY3Jldy9iYWNrdHJhY2UuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQ2FsbFN0YWNrCi17Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIE1BWF9ERVBUSCA9IDMxCi0gICAgfTsKLQotICAgIENhbGxTdGFjaygpOwotICAgIENhbGxTdGFjayhjb25zdCBDYWxsU3RhY2smIHJocyk7Ci0gICAgfkNhbGxTdGFjaygpOwotCi0gICAgQ2FsbFN0YWNrJiBvcGVyYXRvciA9IChjb25zdCBDYWxsU3RhY2smIHJocyk7Ci0gICAgCi0gICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yID49IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciA8PSAoY29uc3QgQ2FsbFN0YWNrJiByaHMpIGNvbnN0OwotICAgIAotICAgIGNvbnN0IHZvaWQqIG9wZXJhdG9yIFtdIChpbnQgaW5kZXgpIGNvbnN0OwotICAgIAotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIHZvaWQgdXBkYXRlKGludDMyX3QgaWdub3JlRGVwdGg9MSwgaW50MzJfdCBtYXhEZXB0aD1NQVhfREVQVEgpOwotCi0gICAgLy8gRHVtcCBhIHN0YWNrIHRyYWNlIHRvIHRoZSBsb2cKLSAgICB2b2lkIGR1bXAoY29uc3QgY2hhciogcHJlZml4ID0gMCkgY29uc3Q7Ci0KLSAgICAvLyBSZXR1cm4gYSBzdHJpbmcgKHBvc3NpYmx5IHZlcnkgbG9uZykgY29udGFpbmluZyB0aGUgY29tcGxldGUgc3RhY2sgdHJhY2UKLSAgICBTdHJpbmc4IHRvU3RyaW5nKGNvbnN0IGNoYXIqIHByZWZpeCA9IDApIGNvbnN0OwotICAgIAotICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gbUNvdW50OyB9Ci0KLXByaXZhdGU6Ci0gICAgc2l6ZV90IG1Db3VudDsKLSAgICBiYWNrdHJhY2VfZnJhbWVfdCBtU3RhY2tbTUFYX0RFUFRIXTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0NBTExTVEFDS19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0NvbXBhdC5oIGIvaW5jbHVkZS91dGlscy9Db21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxOTI2Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19MSUJfVVRJTFNfQ09NUEFUX0gKLSNkZWZpbmUgX19MSUJfVVRJTFNfQ09NUEFUX0gKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0vKiBDb21wYXRpYmlsaXR5IGRlZmluaXRpb25zIGZvciBub24tTGludXggKGkuZS4sIEJTRC1iYXNlZCkgaG9zdHMuICovCi0jaWZuZGVmIEhBVkVfT0ZGNjRfVAotI2lmIF9GSUxFX09GRlNFVF9CSVRTIDwgNjQKLSNlcnJvciAiX0ZJTEVfT0ZGU0VUX0JJVFMgPCA2NDsgbGFyZ2UgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIKLSNlbmRpZiAvKiBfRklMRV9PRkZTRVRfQklUUyA8IDY0ICovCi0KLXR5cGVkZWYgb2ZmX3Qgb2ZmNjRfdDsKLQotc3RhdGljIGlubGluZSBvZmY2NF90IGxzZWVrNjQoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50IHdoZW5jZSkgewotICAgIHJldHVybiBsc2VlayhmZCwgb2Zmc2V0LCB3aGVuY2UpOwotfQotCi0jaWZkZWYgSEFWRV9QUkVBRAotc3RhdGljIGlubGluZSBzc2l6ZV90IHByZWFkNjQoaW50IGZkLCB2b2lkKiBidWYsIHNpemVfdCBuYnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIHByZWFkKGZkLCBidWYsIG5ieXRlcywgb2Zmc2V0KTsKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogIUhBVkVfT0ZGNjRfVCAqLwotCi0jZW5kaWYgLyogX19MSUJfVVRJTFNfQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvQ29uZGl0aW9uLmggYi9pbmNsdWRlL3V0aWxzL0NvbmRpdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODUyZDUzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvQ29uZGl0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0xJQlNfVVRJTFNfQ09ORElUSU9OX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfQ09ORElUSU9OX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSMgaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKgotICogQ29uZGl0aW9uIHZhcmlhYmxlIGNsYXNzLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHN5c3RlbS1kZXBlbmRlbnQuCi0gKgotICogQ29uZGl0aW9uIHZhcmlhYmxlcyBhcmUgcGFpcmVkIHVwIHdpdGggbXV0ZXhlcy4gIExvY2sgdGhlIG11dGV4LAotICogY2FsbCB3YWl0KCksIHRoZW4gZWl0aGVyIHJlLXdhaXQoKSBpZiB0aGluZ3MgYXJlbid0IHF1aXRlIHdoYXQgeW91IHdhbnQsCi0gKiBvciB1bmxvY2sgdGhlIG11dGV4IGFuZCBjb250aW51ZS4gIEFsbCB0aHJlYWRzIGNhbGxpbmcgd2FpdCgpIG11c3QKLSAqIHVzZSB0aGUgc2FtZSBtdXRleCBmb3IgYSBnaXZlbiBDb25kaXRpb24uCi0gKi8KLWNsYXNzIENvbmRpdGlvbiB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFBSSVZBVEUgPSAwLAotICAgICAgICBTSEFSRUQgPSAxCi0gICAgfTsKLQotICAgIENvbmRpdGlvbigpOwotICAgIENvbmRpdGlvbihpbnQgdHlwZSk7Ci0gICAgfkNvbmRpdGlvbigpOwotICAgIC8vIFdhaXQgb24gdGhlIGNvbmRpdGlvbiB2YXJpYWJsZS4gIExvY2sgdGhlIG11dGV4IGJlZm9yZSBjYWxsaW5nLgotICAgIHN0YXR1c190IHdhaXQoTXV0ZXgmIG11dGV4KTsKLSAgICAvLyBzYW1lIHdpdGggcmVsYXRpdmUgdGltZW91dAotICAgIHN0YXR1c190IHdhaXRSZWxhdGl2ZShNdXRleCYgbXV0ZXgsIG5zZWNzX3QgcmVsdGltZSk7Ci0gICAgLy8gU2lnbmFsIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIGFsbG93aW5nIG9uZSB0aHJlYWQgdG8gY29udGludWUuCi0gICAgdm9pZCBzaWduYWwoKTsKLSAgICAvLyBTaWduYWwgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgYWxsb3dpbmcgYWxsIHRocmVhZHMgdG8gY29udGludWUuCi0gICAgdm9pZCBicm9hZGNhc3QoKTsKLQotcHJpdmF0ZToKLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0gICAgcHRocmVhZF9jb25kX3QgbUNvbmQ7Ci0jZWxzZQotICAgIHZvaWQqICAgbVN0YXRlOwotI2VuZGlmCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLQotaW5saW5lIENvbmRpdGlvbjo6Q29uZGl0aW9uKCkgewotICAgIHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZCwgTlVMTCk7Ci19Ci1pbmxpbmUgQ29uZGl0aW9uOjpDb25kaXRpb24oaW50IHR5cGUpIHsKLSAgICBpZiAodHlwZSA9PSBTSEFSRUQpIHsKLSAgICAgICAgcHRocmVhZF9jb25kYXR0cl90IGF0dHI7Ci0gICAgICAgIHB0aHJlYWRfY29uZGF0dHJfaW5pdCgmYXR0cik7Ci0gICAgICAgIHB0aHJlYWRfY29uZGF0dHJfc2V0cHNoYXJlZCgmYXR0ciwgUFRIUkVBRF9QUk9DRVNTX1NIQVJFRCk7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZCwgJmF0dHIpOwotICAgICAgICBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ryb3koJmF0dHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZtQ29uZCwgTlVMTCk7Ci0gICAgfQotfQotaW5saW5lIENvbmRpdGlvbjo6fkNvbmRpdGlvbigpIHsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUNvbmQpOwotfQotaW5saW5lIHN0YXR1c190IENvbmRpdGlvbjo6d2FpdChNdXRleCYgbXV0ZXgpIHsKLSAgICByZXR1cm4gLXB0aHJlYWRfY29uZF93YWl0KCZtQ29uZCwgJm11dGV4Lm1NdXRleCk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgQ29uZGl0aW9uOjp3YWl0UmVsYXRpdmUoTXV0ZXgmIG11dGV4LCBuc2Vjc190IHJlbHRpbWUpIHsKLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRF9DT05EX1RJTUVEV0FJVF9SRUxBVElWRSkKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgdHMudHZfc2VjICA9IHJlbHRpbWUvMTAwMDAwMDAwMDsKLSAgICB0cy50dl9uc2VjID0gcmVsdGltZSUxMDAwMDAwMDAwOwotICAgIHJldHVybiAtcHRocmVhZF9jb25kX3RpbWVkd2FpdF9yZWxhdGl2ZV9ucCgmbUNvbmQsICZtdXRleC5tTXV0ZXgsICZ0cyk7Ci0jZWxzZSAvLyBIQVZFX1BUSFJFQURfQ09ORF9USU1FRFdBSVRfUkVMQVRJVkUKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0jaWYgZGVmaW5lZChIQVZFX1BPU0lYX0NMT0NLUykKLSAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHMpOwotI2Vsc2UgLy8gSEFWRV9QT1NJWF9DTE9DS1MKLSAgICAvLyB3ZSBkb24ndCBzdXBwb3J0IHRoZSBjbG9ja3MgaGVyZS4KLSAgICBzdHJ1Y3QgdGltZXZhbCB0OwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gICAgdHMudHZfc2VjID0gdC50dl9zZWM7Ci0gICAgdHMudHZfbnNlYz0gdC50dl91c2VjKjEwMDA7Ci0jZW5kaWYgLy8gSEFWRV9QT1NJWF9DTE9DS1MKLSAgICB0cy50dl9zZWMgKz0gcmVsdGltZS8xMDAwMDAwMDAwOwotICAgIHRzLnR2X25zZWMrPSByZWx0aW1lJTEwMDAwMDAwMDA7Ci0gICAgaWYgKHRzLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgewotICAgICAgICB0cy50dl9uc2VjIC09IDEwMDAwMDAwMDA7Ci0gICAgICAgIHRzLnR2X3NlYyAgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIC1wdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZtQ29uZCwgJm11dGV4Lm1NdXRleCwgJnRzKTsKLSNlbmRpZiAvLyBIQVZFX1BUSFJFQURfQ09ORF9USU1FRFdBSVRfUkVMQVRJVkUKLX0KLWlubGluZSB2b2lkIENvbmRpdGlvbjo6c2lnbmFsKCkgewotICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1Db25kKTsKLX0KLWlubGluZSB2b2lkIENvbmRpdGlvbjo6YnJvYWRjYXN0KCkgewotICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJm1Db25kKTsKLX0KLQotI2VuZGlmIC8vIEhBVkVfUFRIUkVBRFMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19DT05ESVRPTl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0RlYnVnLmggYi9pbmNsdWRlL3V0aWxzL0RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZWQzMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9EZWJ1Zy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9ERUJVR19ICi0jZGVmaW5lIEFORFJPSURfREVCVUdfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLXRlbXBsYXRlPGJvb2w+IHN0cnVjdCBDb21waWxlVGltZUFzc2VydDsKLXRlbXBsYXRlPD4gc3RydWN0IENvbXBpbGVUaW1lQXNzZXJ0PHRydWU+IHt9OwotI2RlZmluZSBDT01QSUxFX1RJTUVfQVNTRVJUKF9leHApIFwKLSAgICB0ZW1wbGF0ZSBjbGFzcyBDb21waWxlVGltZUFzc2VydDwgKF9leHApID47Ci0jZW5kaWYKLSNkZWZpbmUgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShfZXhwKSBcCi0gICAgQ29tcGlsZVRpbWVBc3NlcnQ8KCBfZXhwICk+KCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLXRlbXBsYXRlPGJvb2wgQywgdHlwZW5hbWUgTFNILCB0eXBlbmFtZSBSSFM+IHN0cnVjdCBDb21waWxlVGltZUlmRWxzZTsKLXRlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPiAKLXN0cnVjdCBDb21waWxlVGltZUlmRWxzZTx0cnVlLCAgTEhTLCBSSFM+IHsgdHlwZWRlZiBMSFMgVFlQRTsgfTsKLXRlbXBsYXRlPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPiAKLXN0cnVjdCBDb21waWxlVGltZUlmRWxzZTxmYWxzZSwgTEhTLCBSSFM+IHsgdHlwZWRlZiBSSFMgVFlQRTsgfTsKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1jb25zdCBjaGFyKiBzdHJpbmdGb3JJbmRlbnQoaW50MzJfdCBpbmRlbnRMZXZlbCk7Ci0KLXR5cGVkZWYgdm9pZCAoKmRlYnVnUHJpbnRGdW5jKSh2b2lkKiBjb29raWUsIGNvbnN0IGNoYXIqIHR4dCk7Ci0KLXZvaWQgcHJpbnRUeXBlQ29kZSh1aW50MzJfdCB0eXBlQ29kZSwKLSAgICBkZWJ1Z1ByaW50RnVuYyBmdW5jID0gMCwgdm9pZCogY29va2llID0gMCk7Ci0KLXZvaWQgcHJpbnRIZXhEYXRhKGludDMyX3QgaW5kZW50LCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW5ndGgsCi0gICAgc2l6ZV90IGJ5dGVzUGVyTGluZT0xNiwgaW50MzJfdCBzaW5nbGVMaW5lQnl0ZXNDdXRvZmY9MTYsCi0gICAgc2l6ZV90IGFsaWdubWVudD0wLCBib29sIGNBcnJheVN0eWxlPWZhbHNlLAotICAgIGRlYnVnUHJpbnRGdW5jIGZ1bmMgPSAwLCB2b2lkKiBjb29raWUgPSAwKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9ERUJVR19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0VuZGlhbi5oIGIvaW5jbHVkZS91dGlscy9FbmRpYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmMjUwNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0VuZGlhbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBBbmRyb2lkIGVuZGlhbi1uZXNzIGRlZmluZXMuCi0vLwotI2lmbmRlZiBfTElCU19VVElMU19FTkRJQU5fSAotI2RlZmluZSBfTElCU19VVElMU19FTkRJQU5fSAotCi0jaWYgZGVmaW5lZChIQVZFX0VORElBTl9IKQotCi0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0KLSNlbHNlIC8qbm90IEhBVkVfRU5ESUFOX0gqLwotCi0jZGVmaW5lIF9fQklHX0VORElBTiAweDEwMDAKLSNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDB4MDAwMQotCi0jaWYgZGVmaW5lZChIQVZFX0xJVFRMRV9FTkRJQU4pCi0jIGRlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCi0jZWxzZQotIyBkZWZpbmUgX19CWVRFX09SREVSIF9fQklHX0VORElBTgotI2VuZGlmCi0KLSNlbmRpZiAvKm5vdCBIQVZFX0VORElBTl9IKi8KLQotI2VuZGlmIC8qX0xJQlNfVVRJTFNfRU5ESUFOX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9FcnJvcnMuaCBiL2luY2x1ZGUvdXRpbHMvRXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzViMTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9FcnJvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRVJST1JTX0gKLSNkZWZpbmUgQU5EUk9JRF9FUlJPUlNfSAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyB1c2UgdGhpcyB0eXBlIHRvIHJldHVybiBlcnJvciBjb2RlcwotI2lmZGVmIEhBVkVfTVNfQ19SVU5USU1FCi10eXBlZGVmIGludCAgICAgICAgIHN0YXR1c190OwotI2Vsc2UKLXR5cGVkZWYgaW50MzJfdCAgICAgc3RhdHVzX3Q7Ci0jZW5kaWYKLQotLyogdGhlIE1TIEMgcnVudGltZSBsYWNrcyBhIGZldyBlcnJvciBjb2RlcyAqLwotCi0vKgotICogRXJyb3IgY29kZXMuIAotICogQWxsIGVycm9yIGNvZGVzIGFyZSBuZWdhdGl2ZSB2YWx1ZXMuCi0gKi8KLQotLy8gV2luMzIgI2RlZmluZXMgTk9fRVJST1IgYXMgd2VsbC4gIEl0IGhhcyB0aGUgc2FtZSB2YWx1ZSwgc28gdGhlcmUncyBubwotLy8gcmVhbCBjb25mbGljdCwgdGhvdWdoIGl0J3MgYSBiaXQgYXdrd2FyZC4KLSNpZmRlZiBfV0lOMzIKLSMgdW5kZWYgTk9fRVJST1IKLSNlbmRpZgotIAotZW51bSB7Ci0gICAgT0sgICAgICAgICAgICAgICAgPSAwLCAgICAvLyBFdmVyeXRoaW5nJ3Mgc3dlbGwuCi0gICAgTk9fRVJST1IgICAgICAgICAgPSAwLCAgICAvLyBObyBlcnJvcnMuCi0gICAgCi0gICAgVU5LTk9XTl9FUlJPUiAgICAgICA9IDB4ODAwMDAwMDAsCi0KLSAgICBOT19NRU1PUlkgICAgICAgICAgID0gLUVOT01FTSwKLSAgICBJTlZBTElEX09QRVJBVElPTiAgID0gLUVOT1NZUywKLSAgICBCQURfVkFMVUUgICAgICAgICAgID0gLUVJTlZBTCwKLSAgICBCQURfVFlQRSAgICAgICAgICAgID0gMHg4MDAwMDAwMSwKLSAgICBOQU1FX05PVF9GT1VORCAgICAgID0gLUVOT0VOVCwKLSAgICBQRVJNSVNTSU9OX0RFTklFRCAgID0gLUVQRVJNLAotICAgIE5PX0lOSVQgICAgICAgICAgICAgPSAtRU5PREVWLAotICAgIEFMUkVBRFlfRVhJU1RTICAgICAgPSAtRUVYSVNULAotICAgIERFQURfT0JKRUNUICAgICAgICAgPSAtRVBJUEUsCi0gICAgRkFJTEVEX1RSQU5TQUNUSU9OICA9IDB4ODAwMDAwMDIsCi0gICAgSlBBUktTX0JST0tFX0lUICAgICA9IC1FUElQRSwKLSNpZiAhZGVmaW5lZChIQVZFX01TX0NfUlVOVElNRSkKLSAgICBCQURfSU5ERVggICAgICAgICAgID0gLUVPVkVSRkxPVywKLSAgICBOT1RfRU5PVUdIX0RBVEEgICAgID0gLUVOT0RBVEEsCi0gICAgV09VTERfQkxPQ0sgICAgICAgICA9IC1FV09VTERCTE9DSywgCi0gICAgVElNRURfT1VUICAgICAgICAgICA9IC1FVElNRURPVVQsCi0gICAgVU5LTk9XTl9UUkFOU0FDVElPTiA9IC1FQkFETVNHLAotI2Vsc2UgICAgCi0gICAgQkFEX0lOREVYICAgICAgICAgICA9IC1FMkJJRywKLSAgICBOT1RfRU5PVUdIX0RBVEEgICAgID0gMHg4MDAwMDAwMywKLSAgICBXT1VMRF9CTE9DSyAgICAgICAgID0gMHg4MDAwMDAwNCwKLSAgICBUSU1FRF9PVVQgICAgICAgICAgID0gMHg4MDAwMDAwNSwKLSAgICBVTktOT1dOX1RSQU5TQUNUSU9OID0gMHg4MDAwMDAwNiwKLSNlbmRpZiAgICAKLSAgICBGRFNfTk9UX0FMTE9XRUQgICAgID0gMHg4MDAwMDAwNywKLX07Ci0KLS8vIFJlc3RvcmUgZGVmaW5lOyBlbnVtZXJhdGlvbiBpcyBpbiAiYW5kcm9pZCIgbmFtZXNwYWNlLCBzbyB0aGUgdmFsdWUgZGVmaW5lZAotLy8gdGhlcmUgd29uJ3Qgd29yayBmb3IgV2luMzIgY29kZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UuCi0jaWZkZWYgX1dJTjMyCi0jIGRlZmluZSBOT19FUlJPUiAwTAotI2VuZGlmCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0gICAgCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAKLSNlbmRpZiAvLyBBTkRST0lEX0VSUk9SU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0ZpbGVNYXAuaCBiL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU2ZDUxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvRmlsZU1hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gRW5jYXBzdWxhdGUgYSBzaGFyZWQgZmlsZSBtYXBwaW5nLgotLy8KLSNpZm5kZWYgX19MSUJTX0ZJTEVfTUFQX0gKLSNkZWZpbmUgX19MSUJTX0ZJTEVfTUFQX0gKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX1dJTjMyX0ZJTEVNQVAKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKgotICogVGhpcyByZXByZXNlbnRzIGEgbWVtb3J5LW1hcHBlZCBmaWxlLiAgSXQgbWlnaHQgYmUgdGhlIGVudGlyZSBmaWxlIG9yCi0gKiBvbmx5IHBhcnQgb2YgaXQuICBUaGlzIHJlcXVpcmVzIGEgbGl0dGxlIGJvb2trZWVwaW5nIGJlY2F1c2UgdGhlIG1hcHBpbmcKLSAqIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gcGFnZSBib3VuZGFyaWVzLCBhbmQgaW4gc29tZSBjYXNlcyB3ZSdkIGxpa2UgdG8KLSAqIGhhdmUgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byB0aGUgbWFwcGVkIGFyZWEgd2l0aG91dCBjcmVhdGluZyBhZGRpdGlvbmFsCi0gKiBtYXBzLgotICoKLSAqIFRoaXMgYWx3YXlzIHVzZXMgTUFQX1NIQVJFRC4KLSAqCi0gKiBUT0RPOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgYSBuZXcgRmlsZU1hcCB0aGF0IGlzIGEgc3Vic2V0IG9mCi0gKiBhbiBleGlzdGluZyBGaWxlTWFwIGFuZCBzaGFyZXMgdGhlIHVuZGVybHlpbmcgbWFwcGVkIHBhZ2VzLiAgUmVxdWlyZXMKLSAqIGNvbXBsZXRpbmcgdGhlIHJlZmNvdW50aW5nIHN0dWZmIGFuZCBwb3NzaWJseSBpbnRyb2R1Y2luZyB0aGUgbm90aW9uCi0gKiBvZiBhIEZpbGVNYXAgaGllcmFyY2h5LgotICovCi1jbGFzcyBGaWxlTWFwIHsKLXB1YmxpYzoKLSAgICBGaWxlTWFwKHZvaWQpOwotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgYSBuZXcgbWFwcGluZyBvbiBhbiBvcGVuIGZpbGUuCi0gICAgICoKLSAgICAgKiBDbG9zaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IgZG9lcyBub3QgdW5tYXAgdGhlIHBhZ2VzLCBzbyB3ZSBkb24ndAotICAgICAqIGNsYWltIG93bmVyc2hpcCBvZiB0aGUgZmQuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zICJmYWxzZSIgb24gZmFpbHVyZS4KLSAgICAgKi8KLSAgICBib29sIGNyZWF0ZShjb25zdCBjaGFyKiBvcmlnRmlsZU5hbWUsIGludCBmZCwKLSAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCwgYm9vbCByZWFkT25seSk7Ci0KLSAgICAvKgotICAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGlzIG1hcCBjYW1lIGZyb20sIGlmIGtub3duLgotICAgICAqLwotICAgIGNvbnN0IGNoYXIqIGdldEZpbGVOYW1lKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1GaWxlTmFtZTsgfQotICAgIAotICAgIC8qCi0gICAgICogR2V0IGEgcG9pbnRlciB0byB0aGUgcGllY2Ugb2YgdGhlIGZpbGUgd2UgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHZvaWQqIGdldERhdGFQdHIodm9pZCkgY29uc3QgeyByZXR1cm4gbURhdGFQdHI7IH0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBsZW5ndGggd2UgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHNpemVfdCBnZXREYXRhTGVuZ3RoKHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1EYXRhTGVuZ3RoOyB9Ci0KLSAgICAvKgotICAgICAqIEdldCB0aGUgZGF0YSBvZmZzZXQgdXNlZCB0byBjcmVhdGUgdGhpcyBtYXAuCi0gICAgICovCi0gICAgb2ZmNjRfdCBnZXREYXRhT2Zmc2V0KHZvaWQpIGNvbnN0IHsgcmV0dXJuIG1EYXRhT2Zmc2V0OyB9Ci0KLSAgICAvKgotICAgICAqIEdldCBhICJjb3B5IiBvZiB0aGUgb2JqZWN0LgotICAgICAqLwotICAgIEZpbGVNYXAqIGFjcXVpcmUodm9pZCkgeyBtUmVmQ291bnQrKzsgcmV0dXJuIHRoaXM7IH0KLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGlzIHdoZW4gbWFwcGluZyBpcyBubyBsb25nZXIgbmVlZGVkLgotICAgICAqLwotICAgIHZvaWQgcmVsZWFzZSh2b2lkKSB7Ci0gICAgICAgIGlmICgtLW1SZWZDb3VudCA8PSAwKQotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGlzIG1hcHMgZGlyZWN0bHkgdG8gbWFkdmlzZSgpIHZhbHVlcywgYnV0IGFsbG93cyB1cyB0byBhdm9pZAotICAgICAqIGluY2x1ZGluZyA8c3lzL21tYW4uaD4gZXZlcnl3aGVyZS4KLSAgICAgKi8KLSAgICBlbnVtIE1hcEFkdmljZSB7Ci0gICAgICAgIE5PUk1BTCwgUkFORE9NLCBTRVFVRU5USUFMLCBXSUxMTkVFRCwgRE9OVE5FRUQKLSAgICB9OwotCi0gICAgLyoKLSAgICAgKiBBcHBseSBhbiBtYWR2aXNlKCkgY2FsbCB0byB0aGUgZW50aXJlIGZpbGUuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSAgICAgKi8KLSAgICBpbnQgYWR2aXNlKE1hcEFkdmljZSBhZHZpY2UpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gZG9uJ3QgZGVsZXRlIG9iamVjdHM7IGNhbGwgcmVsZWFzZSgpCi0gICAgfkZpbGVNYXAodm9pZCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gdGhlc2UgYXJlIG5vdCBpbXBsZW1lbnRlZAotICAgIEZpbGVNYXAoY29uc3QgRmlsZU1hcCYgc3JjKTsKLSAgICBjb25zdCBGaWxlTWFwJiBvcGVyYXRvcj0oY29uc3QgRmlsZU1hcCYgc3JjKTsKLQotICAgIGludCAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyByZWZlcmVuY2UgY291bnQKLSAgICBjaGFyKiAgICAgICBtRmlsZU5hbWU7ICAgICAgLy8gb3JpZ2luYWwgZmlsZSBuYW1lLCBpZiBrbm93bgotICAgIHZvaWQqICAgICAgIG1CYXNlUHRyOyAgICAgICAvLyBiYXNlIG9mIG1tYXAgYXJlYTsgcGFnZSBhbGlnbmVkCi0gICAgc2l6ZV90ICAgICAgbUJhc2VMZW5ndGg7ICAgIC8vIGxlbmd0aCwgbWVhc3VyZWQgZnJvbSAibUJhc2VQdHIiCi0gICAgb2ZmNjRfdCAgICAgbURhdGFPZmZzZXQ7ICAgIC8vIG9mZnNldCB1c2VkIHdoZW4gbWFwIHdhcyBjcmVhdGVkCi0gICAgdm9pZCogICAgICAgbURhdGFQdHI7ICAgICAgIC8vIHN0YXJ0IG9mIHJlcXVlc3RlZCBkYXRhLCBvZmZzZXQgZnJvbSBiYXNlCi0gICAgc2l6ZV90ICAgICAgbURhdGFMZW5ndGg7ICAgIC8vIGxlbmd0aCwgbWVhc3VyZWQgZnJvbSAibURhdGFQdHIiCi0jaWZkZWYgSEFWRV9XSU4zMl9GSUxFTUFQCi0gICAgSEFORExFICAgICAgbUZpbGVIYW5kbGU7ICAgIC8vIFdpbjMyIGZpbGUgaGFuZGxlCi0gICAgSEFORExFICAgICAgbUZpbGVNYXBwaW5nOyAgIC8vIFdpbjMyIGZpbGUgbWFwcGluZyBoYW5kbGUKLSNlbmRpZgotCi0gICAgc3RhdGljIGxvbmcgbVBhZ2VTaXplOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIF9fTElCU19GSUxFX01BUF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0ZsYXR0ZW5hYmxlLmggYi9pbmNsdWRlL3V0aWxzL0ZsYXR0ZW5hYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MmJlM2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9GbGF0dGVuYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VVElMU19GTEFUVEVOQUJMRV9ICi0jZGVmaW5lIEFORFJPSURfVVRJTFNfRkxBVFRFTkFCTEVfSAotCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBGbGF0dGVuYWJsZQotewotcHVibGljOgotICAgIC8vIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZsYXR0ZW5lZCBvYmplY3QKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QgPSAwOwotCi0gICAgLy8gbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdG8gZmxhdHRlbgotICAgIHZpcnR1YWwgc2l6ZV90IGdldEZkQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgICAvLyBmbGF0dGVucyB0aGUgb2JqZWN0IGludG8gYnVmZmVyLgotICAgIC8vIHNpemUgc2hvdWxkIGJlIGF0IGxlYXN0IG9mIGdldEZsYXR0ZW5lZFNpemUoKQotICAgIC8vIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHdyaXR0ZW4gaW4gdGhlIGZkc1tdIGFycmF5IGJ1dCBvd25lcnNoaXAgaXMKLSAgICAvLyBub3QgdHJhbnNmZXJlZCAoaWU6IHRoZXkgbXVzdCBiZSBkdXBwZWQgYnkgdGhlIGNhbGxlciBvZgotICAgIC8vIGZsYXR0ZW4oKSBpZiBuZWVkZWQpLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmxhdHRlbih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50IGZkc1tdLCBzaXplX3QgY291bnQpIGNvbnN0ID0gMDsKLQotICAgIC8vIHVuZmxhdHRlbnMgdGhlIG9iamVjdCBmcm9tIGJ1ZmZlci4KLSAgICAvLyBzaXplIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgZ2V0RmxhdHRlbmVkU2l6ZSgpIHdoZW4gdGhlCi0gICAgLy8gb2JqZWN0IHdhcyBmbGF0dGVuZWQuCi0gICAgLy8gdW5mbGF0dGVuZWQgZmlsZSBkZXNjcmlwdG9ycyBhcmUgZm91bmQgaW4gdGhlIGZkc1tdIGFycmF5IGFuZAotICAgIC8vIGRvbid0IG5lZWQgdG8gYmUgZHVwcGVkKCkuIGllOiB0aGUgY2FsbGVyIG9mIHVuZmxhdHRlbiBkb2Vzbid0Ci0gICAgLy8ga2VlcCBvd25lcnNoaXAuIElmIGEgZmQgaXMgbm90IHJldGFpbmVkIGJ5IHVuZmxhdHRlbigpIGl0IG11c3QgYmUKLSAgICAvLyBleHBsaWNpdGx5IGNsb3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHVuZmxhdHRlbih2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgaW50IGZkc1tdLCBzaXplX3QgY291bnQpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkZsYXR0ZW5hYmxlKCkgPSAwOwotCi19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLSNlbmRpZiAvKiBBTkRST0lEX1VUSUxTX0ZMQVRURU5BQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvRnVuY3Rvci5oIGIvaW5jbHVkZS91dGlscy9GdW5jdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGRlZDQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9GdW5jdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0ZVTkNUT1JfSAotI2RlZmluZSBBTkRST0lEX0ZVTkNUT1JfSAotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSAgYW5kcm9pZCB7Ci0KLWNsYXNzIEZ1bmN0b3IgewotcHVibGljOgotICAgIEZ1bmN0b3IoKSB7fQotICAgIHZpcnR1YWwgfkZ1bmN0b3IoKSB7fQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlcmF0b3IgKCkoaW50IHdoYXQsIHZvaWQqIGRhdGEpIHsgcmV0dXJuIE5PX0VSUk9SOyB9Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9GVU5DVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvR2VuZXJhdGlvbkNhY2hlLmggYi9pbmNsdWRlL3V0aWxzL0dlbmVyYXRpb25DYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDcyMmQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvR2VuZXJhdGlvbkNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9VVElMU19HRU5FUkFUSU9OX0NBQ0hFX0gKLSNkZWZpbmUgQU5EUk9JRF9VVElMU19HRU5FUkFUSU9OX0NBQ0hFX0gKLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogR2VuZXJhdGlvbkNhY2hlIGNhbGxiYWNrIHVzZWQgd2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQKLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgRW50cnlLZXksIHR5cGVuYW1lIEVudHJ5VmFsdWU+Ci1jbGFzcyBPbkVudHJ5UmVtb3ZlZCB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+T25FbnRyeVJlbW92ZWQoKSB7IH07Ci0gICAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoRW50cnlLZXkmIGtleSwgRW50cnlWYWx1ZSYgdmFsdWUpID0gMDsKLX07IC8vIGNsYXNzIE9uRW50cnlSZW1vdmVkCi0KLXRlbXBsYXRlPHR5cGVuYW1lIEVudHJ5S2V5LCB0eXBlbmFtZSBFbnRyeVZhbHVlPgotc3RydWN0IEVudHJ5OiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHsKLSAgICBFbnRyeShjb25zdCBFbnRyeTxFbnRyeUtleSwgRW50cnlWYWx1ZT4mIGUpIDoKLSAgICAgICAgICAgIGtleShlLmtleSksIHZhbHVlKGUudmFsdWUpLAotICAgICAgICAgICAgcGFyZW50KGUucGFyZW50KSwgY2hpbGQoZS5jaGlsZCkgeyB9Ci0gICAgRW50cnkoY29uc3QgRW50cnlLZXkmIGtleSwgY29uc3QgRW50cnlWYWx1ZSYgdmFsdWUpIDoKLSAgICAgICAgICAgIGtleShrZXkpLCB2YWx1ZSh2YWx1ZSkgeyB9Ci0KLSAgICBFbnRyeUtleSBrZXk7Ci0gICAgRW50cnlWYWx1ZSB2YWx1ZTsKLQotICAgIHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IHBhcmVudDsgLy8gbmV4dCBvbGRlciBlbnRyeQotICAgIHNwPEVudHJ5PEVudHJ5S2V5LCBFbnRyeVZhbHVlPiA+IGNoaWxkOyAgLy8gbmV4dCB5b3VuZ2VyIGVudHJ5Ci19OyAvLyBzdHJ1Y3QgRW50cnkKLQotLyoqCi0gKiBBIExSVSB0eXBlIGNhY2hlCi0gKi8KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1jbGFzcyBHZW5lcmF0aW9uQ2FjaGUgewotcHVibGljOgotICAgIEdlbmVyYXRpb25DYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk7Ci0gICAgdmlydHVhbCB+R2VuZXJhdGlvbkNhY2hlKCk7Ci0KLSAgICBlbnVtIENhcGFjaXR5IHsKLSAgICAgICAga1VubGltaXRlZENhcGFjaXR5LAotICAgIH07Ci0KLSAgICB2b2lkIHNldE9uRW50cnlSZW1vdmVkTGlzdGVuZXIoT25FbnRyeVJlbW92ZWQ8SywgVj4qIGxpc3RlbmVyKTsKLQotICAgIHNpemVfdCBzaXplKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICBib29sIGNvbnRhaW5zKGNvbnN0IEsmIGtleSkgY29uc3Q7Ci0gICAgY29uc3QgSyYgZ2V0S2V5QXQoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICBjb25zdCBWJiBnZXRWYWx1ZUF0KHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSAgICBjb25zdCBWJiBnZXQoY29uc3QgSyYga2V5KTsKLSAgICBib29sIHB1dChjb25zdCBLJiBrZXksIGNvbnN0IFYmIHZhbHVlKTsKLQotICAgIHZvaWQgcmVtb3ZlQXQoc3NpemVfdCBpbmRleCk7Ci0gICAgYm9vbCByZW1vdmUoY29uc3QgSyYga2V5KTsKLSAgICBib29sIHJlbW92ZU9sZGVzdCgpOwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPEssIHNwPEVudHJ5PEssIFY+ID4gPiBtQ2FjaGU7Ci0gICAgdWludDMyX3QgbU1heENhcGFjaXR5OwotCi0gICAgT25FbnRyeVJlbW92ZWQ8SywgVj4qIG1MaXN0ZW5lcjsKLQotICAgIHNwPEVudHJ5PEssIFY+ID4gbU9sZGVzdDsKLSAgICBzcDxFbnRyeTxLLCBWPiA+IG1Zb3VuZ2VzdDsKLQotICAgIHZvaWQgYXR0YWNoVG9DYWNoZShjb25zdCBzcDxFbnRyeTxLLCBWPiA+JiBlbnRyeSk7Ci0gICAgdm9pZCBkZXRhY2hGcm9tQ2FjaGUoY29uc3Qgc3A8RW50cnk8SywgVj4gPiYgZW50cnkpOwotCi0gICAgY29uc3QgViBtTnVsbFZhbHVlOwotfTsgLy8gY2xhc3MgR2VuZXJhdGlvbkNhY2hlCi0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1HZW5lcmF0aW9uQ2FjaGU8SywgVj46OkdlbmVyYXRpb25DYWNoZSh1aW50MzJfdCBtYXhDYXBhY2l0eSk6IG1NYXhDYXBhY2l0eShtYXhDYXBhY2l0eSksCi0gICAgbUxpc3RlbmVyKE5VTEwpLCBtTnVsbFZhbHVlKE5VTEwpIHsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1HZW5lcmF0aW9uQ2FjaGU8SywgVj46On5HZW5lcmF0aW9uQ2FjaGUoKSB7Ci0gICAgY2xlYXIoKTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci11aW50MzJfdCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OnNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1DYWNoZS5zaXplKCk7Ci19Ci0KLS8qKgotICogU2hvdWxkIGJlIHNldCBieSB0aGUgdXNlciBvZiB0aGUgQ2FjaGUgc28gdGhhdCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGl0ZW0gaXMKLSAqIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpzZXRPbkVudHJ5UmVtb3ZlZExpc3RlbmVyKE9uRW50cnlSZW1vdmVkPEssIFY+KiBsaXN0ZW5lcikgewotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotdm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmNsZWFyKCkgewotICAgIGlmIChtTGlzdGVuZXIpIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYWNoZS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG1DYWNoZS52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgewotICAgICAgICAgICAgICAgICgqbUxpc3RlbmVyKShlbnRyeS0+a2V5LCBlbnRyeS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1DYWNoZS5jbGVhcigpOwotICAgIG1Zb3VuZ2VzdC5jbGVhcigpOwotICAgIG1PbGRlc3QuY2xlYXIoKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWJvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+Ojpjb250YWlucyhjb25zdCBLJiBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNhY2hlLmluZGV4T2ZLZXkoa2V5KSA+PSAwOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotY29uc3QgSyYgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpnZXRLZXlBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNhY2hlLmtleUF0KGluZGV4KTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWNvbnN0IFYmIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0VmFsdWVBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNhY2hlLnZhbHVlQXQoaW5kZXgpLT52YWx1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWNvbnN0IFYmIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6Z2V0KGNvbnN0IEsmIGtleSkgewotICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIGNvbnN0IHNwPEVudHJ5PEssIFY+ID4mIGVudHJ5ID0gbUNhY2hlLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBkZXRhY2hGcm9tQ2FjaGUoZW50cnkpOwotICAgICAgICBhdHRhY2hUb0NhY2hlKGVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGVudHJ5LT52YWx1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbU51bGxWYWx1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWJvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpwdXQoY29uc3QgSyYga2V5LCBjb25zdCBWJiB2YWx1ZSkgewotICAgIGlmIChtTWF4Q2FwYWNpdHkgIT0ga1VubGltaXRlZENhcGFjaXR5ICYmIG1DYWNoZS5zaXplKCkgPj0gbU1heENhcGFjaXR5KSB7Ci0gICAgICAgIHJlbW92ZU9sZGVzdCgpOwotICAgIH0KLQotICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShrZXkpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgc3A8RW50cnk8SywgVj4gPiBlbnRyeSA9IG5ldyBFbnRyeTxLLCBWPihrZXksIHZhbHVlKTsKLSAgICAgICAgbUNhY2hlLmFkZChrZXksIGVudHJ5KTsKLSAgICAgICAgYXR0YWNoVG9DYWNoZShlbnRyeSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLWJvb2wgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjpyZW1vdmUoY29uc3QgSyYga2V5KSB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mS2V5KGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgcmVtb3ZlQXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci12b2lkIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlQXQoc3NpemVfdCBpbmRleCkgewotICAgIHNwPEVudHJ5PEssIFY+ID4gZW50cnkgPSBtQ2FjaGUudmFsdWVBdChpbmRleCk7Ci0gICAgaWYgKG1MaXN0ZW5lcikgewotICAgICAgICAoKm1MaXN0ZW5lcikoZW50cnktPmtleSwgZW50cnktPnZhbHVlKTsKLSAgICB9Ci0gICAgbUNhY2hlLnJlbW92ZUl0ZW1zQXQoaW5kZXgsIDEpOwotICAgIGRldGFjaEZyb21DYWNoZShlbnRyeSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1ib29sIEdlbmVyYXRpb25DYWNoZTxLLCBWPjo6cmVtb3ZlT2xkZXN0KCkgewotICAgIGlmIChtT2xkZXN0LmdldCgpKSB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZktleShtT2xkZXN0LT5rZXkpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgcmVtb3ZlQXQoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoIkdlbmVyYXRpb25DYWNoZTogcmVtb3ZlT2xkZXN0IGZhaWxlZCB0byBmaW5kIHRoZSBpdGVtIGluIHRoZSBjYWNoZSAiCi0gICAgICAgICAgICAgICAgIndpdGggdGhlIGdpdmVuIGtleSwgYnV0IHdlIGtub3cgaXQgbXVzdCBiZSBpbiB0aGVyZS4gICIKLSAgICAgICAgICAgICAgICAiSXMgdGhlIGtleSBjb21wYXJhdG9yIGthcHV0PyIpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXZvaWQgR2VuZXJhdGlvbkNhY2hlPEssIFY+OjphdHRhY2hUb0NhY2hlKGNvbnN0IHNwPEVudHJ5PEssIFY+ID4mIGVudHJ5KSB7Ci0gICAgaWYgKCFtWW91bmdlc3QuZ2V0KCkpIHsKLSAgICAgICAgbVlvdW5nZXN0ID0gbU9sZGVzdCA9IGVudHJ5OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudHJ5LT5wYXJlbnQgPSBtWW91bmdlc3Q7Ci0gICAgICAgIG1Zb3VuZ2VzdC0+Y2hpbGQgPSBlbnRyeTsKLSAgICAgICAgbVlvdW5nZXN0ID0gZW50cnk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotdm9pZCBHZW5lcmF0aW9uQ2FjaGU8SywgVj46OmRldGFjaEZyb21DYWNoZShjb25zdCBzcDxFbnRyeTxLLCBWPiA+JiBlbnRyeSkgewotICAgIGlmIChlbnRyeS0+cGFyZW50LmdldCgpKSB7Ci0gICAgICAgIGVudHJ5LT5wYXJlbnQtPmNoaWxkID0gZW50cnktPmNoaWxkOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1PbGRlc3QgPSBlbnRyeS0+Y2hpbGQ7Ci0gICAgfQotCi0gICAgaWYgKGVudHJ5LT5jaGlsZC5nZXQoKSkgewotICAgICAgICBlbnRyeS0+Y2hpbGQtPnBhcmVudCA9IGVudHJ5LT5wYXJlbnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVlvdW5nZXN0ID0gZW50cnktPnBhcmVudDsKLSAgICB9Ci0KLSAgICBlbnRyeS0+cGFyZW50LmNsZWFyKCk7Ci0gICAgZW50cnktPmNoaWxkLmNsZWFyKCk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1VUSUxTX0dFTkVSQVRJT05fQ0FDSEVfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9LZXllZFZlY3Rvci5oIGIvaW5jbHVkZS91dGlscy9LZXllZFZlY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTUzNWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvS2V5ZWRWZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0tFWUVEX1ZFQ1RPUl9ICi0jZGVmaW5lIEFORFJPSURfS0VZRURfVkVDVE9SX0gKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+Ci1jbGFzcyBLZXllZFZlY3RvcgotewotcHVibGljOgotICAgIHR5cGVkZWYgS0VZICAgIGtleV90eXBlOwotICAgIHR5cGVkZWYgVkFMVUUgIHZhbHVlX3R5cGU7Ci0KLSAgICBpbmxpbmUgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcigpOwotCi0gICAgLyoKLSAgICAgKiBlbXB0eSB0aGUgdmVjdG9yCi0gICAgICovCi0KLSAgICBpbmxpbmUgIHZvaWQgICAgICAgICAgICBjbGVhcigpICAgICAgICAgICAgICAgICAgICAgeyBtVmVjdG9yLmNsZWFyKCk7IH0KLQotICAgIC8qISAKLSAgICAgKiB2ZWN0b3Igc3RhdHMKLSAgICAgKi8KLQotICAgIC8vISByZXR1cm5zIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdmVjdG9yCi0gICAgaW5saW5lICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0ICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1WZWN0b3Iuc2l6ZSgpOyB9Ci0gICAgLy8hIHJldHVybnMgd2V0aGVyIG9yIG5vdCB0aGUgdmVjdG9yIGlzIGVtcHR5Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0ICAgICAgICAgICAgIHsgcmV0dXJuIG1WZWN0b3IuaXNFbXB0eSgpOyB9Ci0gICAgLy8hIHJldHVybnMgaG93IG1hbnkgaXRlbXMgY2FuIGJlIHN0b3JlZCB3aXRob3V0IHJlYWxsb2NhdGluZyB0aGUgYmFja2luZyBzdG9yZQotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgIGNhcGFjaXR5KCkgY29uc3QgICAgICAgICAgICB7IHJldHVybiBtVmVjdG9yLmNhcGFjaXR5KCk7IH0KLSAgICAvLyEgc2V0c3QgdGhlIGNhcGFjaXR5LiBjYXBhY2l0eSBjYW4gbmV2ZXIgYmUgcmVkdWNlZCBsZXNzIHRoYW4gc2l6ZSgpCi0gICAgaW5saW5lIHNzaXplX3QgICAgICAgICAgc2V0Q2FwYWNpdHkoc2l6ZV90IHNpemUpICAgIHsgcmV0dXJuIG1WZWN0b3Iuc2V0Q2FwYWNpdHkoc2l6ZSk7IH0KLSAgICAKLSAgICAvKiEgCi0gICAgICogYWNjZXNzb3JzCi0gICAgICovCi0gICAgICAgICAgICBjb25zdCBWQUxVRSYgICAgdmFsdWVGb3IoY29uc3QgS0VZJiBrZXkpIGNvbnN0OwotICAgICAgICAgICAgY29uc3QgVkFMVUUmICAgIHZhbHVlQXQoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICAgICAgICAgIGNvbnN0IEtFWSYgICAgICBrZXlBdChzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2ZLZXkoY29uc3QgS0VZJiBrZXkpIGNvbnN0OwotCi0gICAgLyohCi0gICAgICogbW9kaWZ5aW5nIHRoZSBhcnJheQotICAgICAqLwotCi0gICAgICAgICAgICBWQUxVRSYgICAgICAgICAgZWRpdFZhbHVlRm9yKGNvbnN0IEtFWSYga2V5KTsKLSAgICAgICAgICAgIFZBTFVFJiAgICAgICAgICBlZGl0VmFsdWVBdChzaXplX3QgaW5kZXgpOwotCi0gICAgICAgICAgICAvKiEgCi0gICAgICAgICAgICAgKiBhZGQvaW5zZXJ0L3JlcGxhY2UgaXRlbXMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIAotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIGl0ZW0pOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VWYWx1ZUZvcihjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIGl0ZW0pOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VWYWx1ZUF0KHNpemVfdCBpbmRleCwgY29uc3QgVkFMVUUmIGl0ZW0pOwotCi0gICAgLyohCi0gICAgICogcmVtb3ZlIGl0ZW1zCi0gICAgICovCi0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmVJdGVtKGNvbnN0IEtFWSYga2V5KTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50ID0gMSk7Ci0gICAgICAgICAgICAKLXByaXZhdGU6Ci0gICAgICAgICAgICBTb3J0ZWRWZWN0b3I8IGtleV92YWx1ZV9wYWlyX3Q8S0VZLCBWQUxVRT4gPiAgICBtVmVjdG9yOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qKgotICogVmFyaWF0aW9uIG9mIEtleWVkVmVjdG9yIHRoYXQgaG9sZHMgYSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiB3aGVuCi0gKiB2YWx1ZUZvcigpIGlzIGNhbGxlZCB3aXRoIGEga2V5IHRoYXQgZG9lc24ndCBleGlzdC4KLSAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+Ci1jbGFzcyBEZWZhdWx0S2V5ZWRWZWN0b3IgOiBwdWJsaWMgS2V5ZWRWZWN0b3I8S0VZLCBWQUxVRT4KLXsKLXB1YmxpYzoKLSAgICBpbmxpbmUgICAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3IoY29uc3QgVkFMVUUmIGRlZlZhbHVlID0gVkFMVUUoKSk7Ci0gICAgICAgICAgICBjb25zdCBWQUxVRSYgICAgdmFsdWVGb3IoY29uc3QgS0VZJiBrZXkpIGNvbnN0OwotCi1wcml2YXRlOgotICAgICAgICAgICAgVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHQ7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1LZXllZFZlY3RvcjxLRVksVkFMVUU+OjpLZXllZFZlY3RvcigpCi17Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotc3NpemVfdCBLZXllZFZlY3RvcjxLRVksVkFMVUU+OjppbmRleE9mS2V5KGNvbnN0IEtFWSYga2V5KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1WZWN0b3IuaW5kZXhPZigga2V5X3ZhbHVlX3BhaXJfdDxLRVksVkFMVUU+KGtleSkgKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1jb25zdCBWQUxVRSYgS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6dmFsdWVGb3IoY29uc3QgS0VZJiBrZXkpIGNvbnN0IHsKLSAgICBzc2l6ZV90IGkgPSB0aGlzLT5pbmRleE9mS2V5KGtleSk7Ci0gICAgYXNzZXJ0KGk+PTApOwotICAgIHJldHVybiBtVmVjdG9yLml0ZW1BdChpKS52YWx1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1jb25zdCBWQUxVRSYgS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6dmFsdWVBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVZlY3Rvci5pdGVtQXQoaW5kZXgpLnZhbHVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLWNvbnN0IEtFWSYgS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6a2V5QXQoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1WZWN0b3IuaXRlbUF0KGluZGV4KS5rZXk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotVkFMVUUmIEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OmVkaXRWYWx1ZUZvcihjb25zdCBLRVkmIGtleSkgewotICAgIHNzaXplX3QgaSA9IHRoaXMtPmluZGV4T2ZLZXkoa2V5KTsKLSAgICBhc3NlcnQoaT49MCk7Ci0gICAgcmV0dXJuIG1WZWN0b3IuZWRpdEl0ZW1BdChpKS52YWx1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1WQUxVRSYgS2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6ZWRpdFZhbHVlQXQoc2l6ZV90IGluZGV4KSB7Ci0gICAgcmV0dXJuIG1WZWN0b3IuZWRpdEl0ZW1BdChpbmRleCkudmFsdWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotc3NpemVfdCBLZXllZFZlY3RvcjxLRVksVkFMVUU+OjphZGQoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSkgewotICAgIHJldHVybiBtVmVjdG9yLmFkZCgga2V5X3ZhbHVlX3BhaXJfdDxLRVksVkFMVUU+KGtleSwgdmFsdWUpICk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotc3NpemVfdCBLZXllZFZlY3RvcjxLRVksVkFMVUU+OjpyZXBsYWNlVmFsdWVGb3IoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSkgewotICAgIGtleV92YWx1ZV9wYWlyX3Q8S0VZLFZBTFVFPiBwYWlyKGtleSwgdmFsdWUpOwotICAgIG1WZWN0b3IucmVtb3ZlKHBhaXIpOwotICAgIHJldHVybiBtVmVjdG9yLmFkZChwYWlyKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1zc2l6ZV90IEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OnJlcGxhY2VWYWx1ZUF0KHNpemVfdCBpbmRleCwgY29uc3QgVkFMVUUmIGl0ZW0pIHsKLSAgICBpZiAoaW5kZXg8c2l6ZSgpKSB7Ci0gICAgICAgIG1WZWN0b3IuZWRpdEl0ZW1BdChpbmRleCkudmFsdWUgPSBpdGVtOwotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIHJldHVybiBCQURfSU5ERVg7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+IGlubGluZQotc3NpemVfdCBLZXllZFZlY3RvcjxLRVksVkFMVUU+OjpyZW1vdmVJdGVtKGNvbnN0IEtFWSYga2V5KSB7Ci0gICAgcmV0dXJuIG1WZWN0b3IucmVtb3ZlKGtleV92YWx1ZV9wYWlyX3Q8S0VZLFZBTFVFPihrZXkpKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1zc2l6ZV90IEtleWVkVmVjdG9yPEtFWSwgVkFMVUU+OjpyZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50KSB7Ci0gICAgcmV0dXJuIG1WZWN0b3IucmVtb3ZlSXRlbXNBdChpbmRleCwgY291bnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8dHlwZW5hbWUgS0VZLCB0eXBlbmFtZSBWQUxVRT4gaW5saW5lCi1EZWZhdWx0S2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6RGVmYXVsdEtleWVkVmVjdG9yKGNvbnN0IFZBTFVFJiBkZWZWYWx1ZSkKLSAgICA6IG1EZWZhdWx0KGRlZlZhbHVlKQotewotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBLRVksIHR5cGVuYW1lIFZBTFVFPiBpbmxpbmUKLWNvbnN0IFZBTFVFJiBEZWZhdWx0S2V5ZWRWZWN0b3I8S0VZLFZBTFVFPjo6dmFsdWVGb3IoY29uc3QgS0VZJiBrZXkpIGNvbnN0IHsKLSAgICBzc2l6ZV90IGkgPSB0aGlzLT5pbmRleE9mS2V5KGtleSk7Ci0gICAgcmV0dXJuIGkgPj0gMCA/IEtleWVkVmVjdG9yPEtFWSxWQUxVRT46OnZhbHVlQXQoaSkgOiBtRGVmYXVsdDsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX0tFWUVEX1ZFQ1RPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0xpbmVhclRyYW5zZm9ybS5oIGIvaW5jbHVkZS91dGlscy9MaW5lYXJUcmFuc2Zvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRjYjM1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0xpbmVhclRyYW5zZm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0xJQlNfVVRJTFNfTElORUFSX1RSQU5TRk9STV9ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX0xJTkVBUl9UUkFOU0ZPUk1fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gTGluZWFyVHJhbnNmb3JtIGRlZmluZXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaG9sZCB0aGUgZGVmaW5pdGlvbiBvZiBhCi0vLyB0cmFuc2Zvcm1hdGlvbiBmcm9tIHNpbmdsZSBkaW1lbnNpb25hbCBjb29yZGluYXRlIHN5c3RlbSBBIGludG8gY29vcmRpbmF0ZQotLy8gc3lzdGVtIEIgKGFuZCBiYWNrIGFnYWluKS4gIFZhbHVlcyBpbiBBIGFuZCBpbiBCIGFyZSA2NCBiaXQsIHRoZSBsaW5lYXIKLS8vIHNjYWxlIGZhY3RvciBpcyBleHByZXNzZWQgYXMgYSByYXRpb25hbCBudW1iZXIgdXNpbmcgdHdvIDMyIGJpdCB2YWx1ZXMuCi0vLwotLy8gU3BlY2lmaWNhbGx5LCBsZXQKLS8vIGYoYSkgPSBiCi0vLyBGKGIpID0gZl4tMShiKSA9IGEKLS8vIHRoZW4KLS8vCi0vLyBmKGEpID0gKCgoYSAtIGFfemVybykgKiBhX3RvX2JfbnVtZXIpIC8gYV90b19iX2Rlbm9tKSArIGJfemVybzsKLS8vCi0vLyBhbmQKLS8vCi0vLyBGKGIpID0gKCgoYiAtIGJfemVybykgKiBhX3RvX2JfZGVub20pIC8gYV90b19iX251bWVyKSArIGFfemVybzsKLS8vCi1zdHJ1Y3QgTGluZWFyVHJhbnNmb3JtIHsKLSAgaW50NjRfdCAgYV96ZXJvOwotICBpbnQ2NF90ICBiX3plcm87Ci0gIGludDMyX3QgIGFfdG9fYl9udW1lcjsKLSAgdWludDMyX3QgYV90b19iX2Rlbm9tOwotCi0gIC8vIFRyYW5zZm9ybSBmcm9tIEEtPkIKLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGluIHRoZSBjYXNlIG9mIGEgc2luZ3VsYXJpdHkgb3IgYW4KLSAgLy8gb3ZlcmZsb3cuCi0gIGJvb2wgZG9Gb3J3YXJkVHJhbnNmb3JtKGludDY0X3QgYV9pbiwgaW50NjRfdCogYl9vdXQpIGNvbnN0OwotCi0gIC8vIFRyYW5zZm9ybSBmcm9tIEItPkEKLSAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIG9yIGZhbHNlIGluIHRoZSBjYXNlIG9mIGEgc2luZ3VsYXJpdHkgb3IgYW4KLSAgLy8gb3ZlcmZsb3cuCi0gIGJvb2wgZG9SZXZlcnNlVHJhbnNmb3JtKGludDY0X3QgYl9pbiwgaW50NjRfdCogYV9vdXQpIGNvbnN0OwotCi0gIC8vIEhlbHBlcnMgd2hpY2ggd2lsbCByZWR1Y2UgdGhlIGZyYWN0aW9uIE4vRCB1c2luZyBFdWNsaWQncyBtZXRob2QuCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCByZWR1Y2UoVCogTiwgVCogRCk7Ci0gIHN0YXRpYyB2b2lkIHJlZHVjZShpbnQzMl90KiBOLCB1aW50MzJfdCogRCk7Ci19OwotCi0KLX0KLQotI2VuZGlmICAvLyBfTElCU19VVElMU19MSU5FQVJfVFJBTlNGT1JNX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvTGlzdC5oIGIvaW5jbHVkZS91dGlscy9MaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwM2NkN2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9MaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUZW1wbGF0ZWQgbGlzdCBjbGFzcy4gIE5vcm1hbGx5IHdlJ2QgdXNlIFNUTCwgYnV0IHdlIGRvbid0IGhhdmUgdGhhdC4KLS8vIFRoaXMgY2xhc3MgbWltaWNzIFNUTCdzIGludGVyZmFjZXMuCi0vLwotLy8gT2JqZWN0cyBhcmUgY29waWVkIGludG8gdGhlIGxpc3Qgd2l0aCB0aGUgJz0nIG9wZXJhdG9yIG9yIHdpdGggY29weS0KLS8vIGNvbnN0cnVjdGlvbiwgc28gaWYgdGhlIGNvbXBpbGVyJ3MgYXV0by1nZW5lcmF0ZWQgdmVyc2lvbnMgd29uJ3Qgd29yayBmb3IKLS8vIHlvdSwgZGVmaW5lIHlvdXIgb3duLgotLy8KLS8vIFRoZSBvbmx5IGNsYXNzIHlvdSB3YW50IHRvIHVzZSBmcm9tIGhlcmUgaXMgIkxpc3QiLgotLy8KLSNpZm5kZWYgX0xJQlNfVVRJTFNfTElTVF9ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX0xJU1RfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqIERvdWJseS1saW5rZWQgbGlzdC4gIEluc3RhbnRpYXRlIHdpdGggIkxpc3Q8TXlDbGFzcz4gbXlMaXN0Ii4KLSAqCi0gKiBPYmplY3RzIGFkZGVkIHRvIHRoZSBsaXN0IGFyZSBjb3BpZWQgdXNpbmcgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsCi0gKiBzbyB0aGlzIG11c3QgYmUgZGVmaW5lZC4KLSAqLwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gCi1jbGFzcyBMaXN0IAotewotcHJvdGVjdGVkOgotICAgIC8qCi0gICAgICogT25lIGVsZW1lbnQgaW4gdGhlIGxpc3QuCi0gICAgICovCi0gICAgY2xhc3MgX05vZGUgewotICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgX05vZGUoY29uc3QgVCYgdmFsKSA6IG1WYWwodmFsKSB7fQotICAgICAgICB+X05vZGUoKSB7fQotICAgICAgICBpbmxpbmUgVCYgZ2V0UmVmKCkgeyByZXR1cm4gbVZhbDsgfQotICAgICAgICBpbmxpbmUgY29uc3QgVCYgZ2V0UmVmKCkgY29uc3QgeyByZXR1cm4gbVZhbDsgfQotICAgICAgICBpbmxpbmUgX05vZGUqIGdldFByZXYoKSBjb25zdCB7IHJldHVybiBtcFByZXY7IH0KLSAgICAgICAgaW5saW5lIF9Ob2RlKiBnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gbXBOZXh0OyB9Ci0gICAgICAgIGlubGluZSB2b2lkIHNldFZhbChjb25zdCBUJiB2YWwpIHsgbVZhbCA9IHZhbDsgfQotICAgICAgICBpbmxpbmUgdm9pZCBzZXRQcmV2KF9Ob2RlKiBwdHIpIHsgbXBQcmV2ID0gcHRyOyB9Ci0gICAgICAgIGlubGluZSB2b2lkIHNldE5leHQoX05vZGUqIHB0cikgeyBtcE5leHQgPSBwdHI7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgTGlzdDsKLSAgICAgICAgZnJpZW5kIGNsYXNzIF9MaXN0SXRlcmF0b3I7Ci0gICAgICAgIFQgICAgICAgICAgIG1WYWw7Ci0gICAgICAgIF9Ob2RlKiAgICAgIG1wUHJldjsKLSAgICAgICAgX05vZGUqICAgICAgbXBOZXh0OwotICAgIH07Ci0KLSAgICAvKgotICAgICAqIEl0ZXJhdG9yIGZvciB3YWxraW5nIHRocm91Z2ggdGhlIGxpc3QuCi0gICAgICovCi0gICAgCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Ci0gICAgc3RydWN0IENPTlNUX0lURVJBVE9SIHsKLSAgICAgICAgdHlwZWRlZiBfTm9kZSBjb25zdCAqIE5vZGVQdHI7Ci0gICAgICAgIHR5cGVkZWYgY29uc3QgVFlQRSBUeXBlOwotICAgIH07Ci0gICAgCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Ci0gICAgc3RydWN0IE5PTl9DT05TVF9JVEVSQVRPUiB7Ci0gICAgICAgIHR5cGVkZWYgX05vZGUqIE5vZGVQdHI7Ci0gICAgICAgIHR5cGVkZWYgVFlQRSBUeXBlOwotICAgIH07Ci0gICAgCi0gICAgdGVtcGxhdGU8Ci0gICAgICAgIHR5cGVuYW1lIFUsCi0gICAgICAgIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgQ29uc3RuZXNzCi0gICAgPiAKLSAgICBjbGFzcyBfTGlzdEl0ZXJhdG9yIHsKLSAgICAgICAgdHlwZWRlZiBfTGlzdEl0ZXJhdG9yPFUsIENvbnN0bmVzcz4gICAgIF9JdGVyOwotICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIENvbnN0bmVzczxVPjo6Tm9kZVB0ciAgX05vZGVQdHI7Ci0gICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgQ29uc3RuZXNzPFU+OjpUeXBlICAgICBfVHlwZTsKLQotICAgICAgICBleHBsaWNpdCBfTGlzdEl0ZXJhdG9yKF9Ob2RlUHRyIHB0cikgOiBtcE5vZGUocHRyKSB7fQotCi0gICAgcHVibGljOgotICAgICAgICBfTGlzdEl0ZXJhdG9yKCkge30KLSAgICAgICAgX0xpc3RJdGVyYXRvcihjb25zdCBfSXRlciYgcmhzKSA6IG1wTm9kZShyaHMubXBOb2RlKSB7fQotICAgICAgICB+X0xpc3RJdGVyYXRvcigpIHt9Ci0gICAgICAgIAotICAgICAgICAvLyB0aGlzIHdpbGwgaGFuZGxlIGNvbnZlcnNpb25zIGZyb20gaXRlcmF0b3IgdG8gY29uc3RfaXRlcmF0b3IKLSAgICAgICAgLy8gKGFuZCBhbHNvIGFsbCBjb252ZXJ0aWJsZSBpdGVyYXRvcnMpCi0gICAgICAgIC8vIEhlcmUsIGluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoZSBpdGVyYXRvcnMgY2FuIGJlIGNvbnZlcnRlZAotICAgICAgICAvLyBpZiB0aGUgbm9kZXMgY2FuIGJlIGNvbnZlcnRlZAotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWPiBleHBsaWNpdCAKLSAgICAgICAgX0xpc3RJdGVyYXRvcihjb25zdCBWJiByaHMpIDogbXBOb2RlKHJocy5tcE5vZGUpIHt9Ci0gICAgICAgIAotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERlcmVmZXJlbmNlIG9wZXJhdG9yLiAgVXNlZCB0byBnZXQgYXQgdGhlIGp1aWN5IGluc2lkZXMuCi0gICAgICAgICAqLwotICAgICAgICBfVHlwZSYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gbXBOb2RlLT5nZXRSZWYoKTsgfQotICAgICAgICBfVHlwZSogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYobXBOb2RlLT5nZXRSZWYoKSk7IH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBJdGVyYXRvciBjb21wYXJpc29uLgotICAgICAgICAgKi8KLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfSXRlciYgcmlnaHQpIGNvbnN0IHsgCi0gICAgICAgICAgICByZXR1cm4gbXBOb2RlID09IHJpZ2h0Lm1wTm9kZTsgfQotICAgICAgICAKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfSXRlciYgcmlnaHQpIGNvbnN0IHsgCi0gICAgICAgICAgICByZXR1cm4gbXBOb2RlICE9IHJpZ2h0Lm1wTm9kZTsgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIGhhbmRsZSBjb21wYXJpc29ucyBiZXR3ZWVuIGl0ZXJhdG9yIGFuZCBjb25zdF9pdGVyYXRvcgotICAgICAgICAgKi8KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT1RIRVI+Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgT1RIRVImIHJpZ2h0KSBjb25zdCB7IAotICAgICAgICAgICAgcmV0dXJuIG1wTm9kZSA9PSByaWdodC5tcE5vZGU7IH0KLSAgICAgICAgCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9USEVSPgotICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE9USEVSJiByaWdodCkgY29uc3QgeyAKLSAgICAgICAgICAgIHJldHVybiBtcE5vZGUgIT0gcmlnaHQubXBOb2RlOyB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSW5jci9kZWNyLCB1c2VkIHRvIG1vdmUgdGhyb3VnaCB0aGUgbGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIGlubGluZSBfSXRlciYgb3BlcmF0b3IrKygpIHsgICAgIC8vIHByZS1pbmNyZW1lbnQKLSAgICAgICAgICAgIG1wTm9kZSA9IG1wTm9kZS0+Z2V0TmV4dCgpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IF9JdGVyIG9wZXJhdG9yKysoaW50KSB7ICAgIC8vIHBvc3QtaW5jcmVtZW50Ci0gICAgICAgICAgICBfSXRlciB0bXAoKnRoaXMpOwotICAgICAgICAgICAgbXBOb2RlID0gbXBOb2RlLT5nZXROZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gdG1wOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSBfSXRlciYgb3BlcmF0b3ItLSgpIHsgICAgIC8vIHByZS1pbmNyZW1lbnQKLSAgICAgICAgICAgIG1wTm9kZSA9IG1wTm9kZS0+Z2V0UHJldigpOwotICAgICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IF9JdGVyIG9wZXJhdG9yLS0oaW50KSB7ICAgLy8gcG9zdC1pbmNyZW1lbnQKLSAgICAgICAgICAgIF9JdGVyIHRtcCgqdGhpcyk7Ci0gICAgICAgICAgICBtcE5vZGUgPSBtcE5vZGUtPmdldFByZXYoKTsKLSAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgX05vZGVQdHIgZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1wTm9kZTsgfQotCi0gICAgICAgIF9Ob2RlUHRyIG1wTm9kZTsgICAgLyogc2hvdWxkIGJlIHByaXZhdGUsIGJ1dCBvbGRlciBnY2MgZmFpbHMgKi8KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgTGlzdDsKLSAgICB9OwotCi1wdWJsaWM6Ci0gICAgTGlzdCgpIHsKLSAgICAgICAgcHJlcCgpOwotICAgIH0KLSAgICBMaXN0KGNvbnN0IExpc3Q8VD4mIHNyYykgeyAgICAgIC8vIGNvcHktY29uc3RydWN0b3IKLSAgICAgICAgcHJlcCgpOwotICAgICAgICBpbnNlcnQoYmVnaW4oKSwgc3JjLmJlZ2luKCksIHNyYy5lbmQoKSk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkxpc3QoKSB7Ci0gICAgICAgIGNsZWFyKCk7Ci0gICAgICAgIGRlbGV0ZVtdICh1bnNpZ25lZCBjaGFyKikgbXBNaWRkbGU7Ci0gICAgfQotCi0gICAgdHlwZWRlZiBfTGlzdEl0ZXJhdG9yPFQsIE5PTl9DT05TVF9JVEVSQVRPUj4gaXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBfTGlzdEl0ZXJhdG9yPFQsIENPTlNUX0lURVJBVE9SPiBjb25zdF9pdGVyYXRvcjsKLQotICAgIExpc3Q8VD4mIG9wZXJhdG9yPShjb25zdCBMaXN0PFQ+JiByaWdodCk7Ci0KLSAgICAvKiByZXR1cm5zIHRydWUgaWYgdGhlIGxpc3QgaXMgZW1wdHkgKi8KLSAgICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1wTWlkZGxlLT5nZXROZXh0KCkgPT0gbXBNaWRkbGU7IH0KLQotICAgIC8qIHJldHVybiAjb2YgZWxlbWVudHMgaW4gbGlzdCAqLwotICAgIHNpemVfdCBzaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gc2l6ZV90KGRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gdGhlIGZpcnN0IGVsZW1lbnQgb3Igb25lIHBhc3QgdGhlIGxhc3QgZWxlbWVudC4gIFRoZQotICAgICAqIF9Ob2RlKiB3ZSdyZSByZXR1cm5pbmcgaXMgY29udmVydGVkIHRvIGFuICJpdGVyYXRvciIgYnkgYQotICAgICAqIGNvbnN0cnVjdG9yIGluIF9MaXN0SXRlcmF0b3IuCi0gICAgICovCi0gICAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyAKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKG1wTWlkZGxlLT5nZXROZXh0KCkpOyAKLSAgICB9Ci0gICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyAKLSAgICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKGNvbnN0X2Nhc3Q8X05vZGUgY29uc3QqPihtcE1pZGRsZS0+Z2V0TmV4dCgpKSk7IAotICAgIH0KLSAgICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgeyAKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKG1wTWlkZGxlKTsgCi0gICAgfQotICAgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IAotICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoY29uc3RfY2FzdDxfTm9kZSBjb25zdCo+KG1wTWlkZGxlKSk7IAotICAgIH0KLQotICAgIC8qIGFkZCB0aGUgb2JqZWN0IHRvIHRoZSBoZWFkIG9yIHRhaWwgb2YgdGhlIGxpc3QgKi8KLSAgICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgVCYgdmFsKSB7IGluc2VydChiZWdpbigpLCB2YWwpOyB9Ci0gICAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCYgdmFsKSB7IGluc2VydChlbmQoKSwgdmFsKTsgfQotCi0gICAgLyogaW5zZXJ0IGJlZm9yZSB0aGUgY3VycmVudCBub2RlOyByZXR1cm5zIGl0ZXJhdG9yIGF0IG5ldyBub2RlICovCi0gICAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHBvc24sIGNvbnN0IFQmIHZhbCkgCi0gICAgewotICAgICAgICBfTm9kZSogbmV3Tm9kZSA9IG5ldyBfTm9kZSh2YWwpOyAgICAgICAgLy8gYWxsb2MgJiBjb3B5LWNvbnN0cnVjdAotICAgICAgICBuZXdOb2RlLT5zZXROZXh0KHBvc24uZ2V0Tm9kZSgpKTsKLSAgICAgICAgbmV3Tm9kZS0+c2V0UHJldihwb3NuLmdldE5vZGUoKS0+Z2V0UHJldigpKTsKLSAgICAgICAgcG9zbi5nZXROb2RlKCktPmdldFByZXYoKS0+c2V0TmV4dChuZXdOb2RlKTsKLSAgICAgICAgcG9zbi5nZXROb2RlKCktPnNldFByZXYobmV3Tm9kZSk7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvcihuZXdOb2RlKTsKLSAgICB9Ci0KLSAgICAvKiBpbnNlcnQgYSByYW5nZSBvZiBlbGVtZW50cyBiZWZvcmUgdGhlIGN1cnJlbnQgbm9kZSAqLwotICAgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIHBvc24sIGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KSB7Ci0gICAgICAgIGZvciAoIDsgZmlyc3QgIT0gbGFzdDsgKytmaXJzdCkKLSAgICAgICAgICAgIGluc2VydChwb3NuLCAqZmlyc3QpOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSBvbmUgZW50cnk7IHJldHVybnMgaXRlcmF0b3IgYXQgbmV4dCBub2RlICovCi0gICAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgcG9zbikgewotICAgICAgICBfTm9kZSogcE5leHQgPSBwb3NuLmdldE5vZGUoKS0+Z2V0TmV4dCgpOwotICAgICAgICBfTm9kZSogcFByZXYgPSBwb3NuLmdldE5vZGUoKS0+Z2V0UHJldigpOwotICAgICAgICBwUHJldi0+c2V0TmV4dChwTmV4dCk7Ci0gICAgICAgIHBOZXh0LT5zZXRQcmV2KHBQcmV2KTsKLSAgICAgICAgZGVsZXRlIHBvc24uZ2V0Tm9kZSgpOwotICAgICAgICByZXR1cm4gaXRlcmF0b3IocE5leHQpOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSBhIHJhbmdlIG9mIGVsZW1lbnRzICovCi0gICAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgZmlyc3QsIGl0ZXJhdG9yIGxhc3QpIHsKLSAgICAgICAgd2hpbGUgKGZpcnN0ICE9IGxhc3QpCi0gICAgICAgICAgICBlcmFzZShmaXJzdCsrKTsgICAgIC8vIGRvbid0IGVyYXNlIHRoYW4gaW5jciBsYXRlciEKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKGxhc3QpOwotICAgIH0KLQotICAgIC8qIHJlbW92ZSBhbGwgY29udGVudHMgb2YgdGhlIGxpc3QgKi8KLSAgICB2b2lkIGNsZWFyKCkgewotICAgICAgICBfTm9kZSogcEN1cnJlbnQgPSBtcE1pZGRsZS0+Z2V0TmV4dCgpOwotICAgICAgICBfTm9kZSogcE5leHQ7Ci0KLSAgICAgICAgd2hpbGUgKHBDdXJyZW50ICE9IG1wTWlkZGxlKSB7Ci0gICAgICAgICAgICBwTmV4dCA9IHBDdXJyZW50LT5nZXROZXh0KCk7Ci0gICAgICAgICAgICBkZWxldGUgcEN1cnJlbnQ7Ci0gICAgICAgICAgICBwQ3VycmVudCA9IHBOZXh0OwotICAgICAgICB9Ci0gICAgICAgIG1wTWlkZGxlLT5zZXRQcmV2KG1wTWlkZGxlKTsKLSAgICAgICAgbXBNaWRkbGUtPnNldE5leHQobXBNaWRkbGUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogTWVhc3VyZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gaXRlcmF0b3JzLiAgT24gZXhpc3QsICJmaXJzdCIKLSAgICAgKiB3aWxsIGJlIGVxdWFsIHRvICJsYXN0Ii4gIFRoZSBpdGVyYXRvcnMgbXVzdCByZWZlciB0byB0aGUgc2FtZQotICAgICAqIGxpc3QuCi0gICAgICoKLSAgICAgKiBGSVhNRTogVGhpcyBpcyBhY3R1YWxseSBhIGdlbmVyaWMgaXRlcmF0b3IgZnVuY3Rpb24uIEl0IHNob3VsZCBiZSBhIAotICAgICAqIHRlbXBsYXRlIGZ1bmN0aW9uIGF0IHRoZSB0b3AtbGV2ZWwgd2l0aCBzcGVjaWFsaXphdGlvbnMgZm9yIHRoaW5ncyBsaWtlCi0gICAgICogdmVjdG9yPD4sIHdoaWNoIGNhbiBqdXN0IGRvIHBvaW50ZXIgbWF0aCkuIEhlcmUgd2UgbGltaXQgaXQgdG8KLSAgICAgKiBfTGlzdEl0ZXJhdG9yIG9mIHRoZSBzYW1lIHR5cGUgYnV0IGRpZmZlcmVudCBjb25zdG5lc3MuCi0gICAgICovCi0gICAgdGVtcGxhdGU8Ci0gICAgICAgIHR5cGVuYW1lIFUsCi0gICAgICAgIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgQ0wsCi0gICAgICAgIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgQ1IKLSAgICA+IAotICAgIHB0cmRpZmZfdCBkaXN0YW5jZSgKLSAgICAgICAgICAgIF9MaXN0SXRlcmF0b3I8VSwgQ0w+IGZpcnN0LCBfTGlzdEl0ZXJhdG9yPFUsIENSPiBsYXN0KSBjb25zdCAKLSAgICB7Ci0gICAgICAgIHB0cmRpZmZfdCBjb3VudCA9IDA7Ci0gICAgICAgIHdoaWxlIChmaXJzdCAhPSBsYXN0KSB7Ci0gICAgICAgICAgICArK2ZpcnN0OwotICAgICAgICAgICAgKytjb3VudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIC8qCi0gICAgICogSSB3YW50IGEgX05vZGUgYnV0IGRvbid0IG5lZWQgaXQgdG8gaG9sZCB2YWxpZCBkYXRhLiAgTW9yZQotICAgICAqIHRvIHRoZSBwb2ludCwgSSBkb24ndCB3YW50IFQncyBjb25zdHJ1Y3RvciB0byBmaXJlLCBzaW5jZSBpdAotICAgICAqIG1pZ2h0IGhhdmUgc2lkZS1lZmZlY3RzIG9yIHJlcXVpcmUgYXJndW1lbnRzLiAgU28sIHdlIGRvIHRoaXMKLSAgICAgKiBzbGlnaHRseSB1bmNvdXRoIHN0b3JhZ2UgYWxsb2MuCi0gICAgICovCi0gICAgdm9pZCBwcmVwKCkgewotICAgICAgICBtcE1pZGRsZSA9IChfTm9kZSopIG5ldyB1bnNpZ25lZCBjaGFyW3NpemVvZihfTm9kZSldOwotICAgICAgICBtcE1pZGRsZS0+c2V0UHJldihtcE1pZGRsZSk7Ci0gICAgICAgIG1wTWlkZGxlLT5zZXROZXh0KG1wTWlkZGxlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoaXMgbm9kZSBwbGF5cyB0aGUgcm9sZSBvZiAicG9pbnRlciB0byBoZWFkIiBhbmQgInBvaW50ZXIgdG8gdGFpbCIuCi0gICAgICogSXQgc2l0cyBpbiB0aGUgbWlkZGxlIG9mIGEgY2lyY3VsYXIgbGlzdCBvZiBub2Rlcy4gIFRoZSBpdGVyYXRvcgotICAgICAqIHJ1bnMgYXJvdW5kIHRoZSBjaXJjbGUgdW50aWwgaXQgZW5jb3VudGVycyB0aGlzIG9uZS4KLSAgICAgKi8KLSAgICBfTm9kZSogICAgICBtcE1pZGRsZTsKLX07Ci0KLS8qCi0gKiBBc3NpZ25tZW50IG9wZXJhdG9yLgotICoKLSAqIFRoZSBzaW1wbGVzdCB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBjbGVhciBvdXQgdGhlIHRhcmdldCBsaXN0IGFuZAotICogZmlsbCBpdCB3aXRoIHRoZSBzb3VyY2UuICBIb3dldmVyLCB3ZSBjYW4gc3BlZWQgdGhpbmdzIGFsb25nIGJ5Ci0gKiByZS11c2luZyBleGlzdGluZyBlbGVtZW50cy4KLSAqLwotdGVtcGxhdGU8Y2xhc3MgVD4KLUxpc3Q8VD4mIExpc3Q8VD46Om9wZXJhdG9yPShjb25zdCBMaXN0PFQ+JiByaWdodCkKLXsKLSAgICBpZiAodGhpcyA9PSAmcmlnaHQpCi0gICAgICAgIHJldHVybiAqdGhpczsgICAgICAgLy8gc2VsZi1hc3NpZ25tZW50Ci0gICAgaXRlcmF0b3IgZmlyc3REc3QgPSBiZWdpbigpOwotICAgIGl0ZXJhdG9yIGxhc3REc3QgPSBlbmQoKTsKLSAgICBjb25zdF9pdGVyYXRvciBmaXJzdFNyYyA9IHJpZ2h0LmJlZ2luKCk7Ci0gICAgY29uc3RfaXRlcmF0b3IgbGFzdFNyYyA9IHJpZ2h0LmVuZCgpOwotICAgIHdoaWxlIChmaXJzdFNyYyAhPSBsYXN0U3JjICYmIGZpcnN0RHN0ICE9IGxhc3REc3QpCi0gICAgICAgICpmaXJzdERzdCsrID0gKmZpcnN0U3JjKys7Ci0gICAgaWYgKGZpcnN0U3JjID09IGxhc3RTcmMpICAgICAgICAvLyByYW4gb3V0IG9mIGVsZW1lbnRzIGluIHNvdXJjZT8KLSAgICAgICAgZXJhc2UoZmlyc3REc3QsIGxhc3REc3QpOyAgIC8vIHllcywgZXJhc2UgYW55IGV4dHJhcwotICAgIGVsc2UKLSAgICAgICAgaW5zZXJ0KGxhc3REc3QsIGZpcnN0U3JjLCBsYXN0U3JjKTsgICAgIC8vIGNvcHkgcmVtYWluaW5nIG92ZXIKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19MSVNUX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvTG9nLmggYi9pbmNsdWRlL3V0aWxzL0xvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZjYzhiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEMvQysrIGxvZ2dpbmcgZnVuY3Rpb25zLiAgU2VlIHRoZSBsb2dnaW5nIGRvY3VtZW50YXRpb24gZm9yIEFQSSBkZXRhaWxzLgotLy8KLS8vIFdlJ2QgbGlrZSB0aGVzZSB0byBiZSBhdmFpbGFibGUgZnJvbSBDIGNvZGUgKGluIGNhc2Ugd2UgaW1wb3J0IHNvbWUgZnJvbQotLy8gc29tZXdoZXJlKSwgc28gdGhpcyBoYXMgYSBDIGludGVyZmFjZS4KLS8vCi0vLyBUaGUgb3V0cHV0IHdpbGwgYmUgY29ycmVjdCB3aGVuIHRoZSBsb2cgZmlsZSBpcyBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZQotLy8gdGhyZWFkcyBhbmQvb3IgbXVsdGlwbGUgcHJvY2Vzc2VzIHNvIGxvbmcgYXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0KLS8vIHN1cHBvcnRzIE9fQVBQRU5ELiAgVGhlc2UgY2FsbHMgaGF2ZSBtdXRleC1wcm90ZWN0ZWQgZGF0YSBzdHJ1Y3R1cmVzCi0vLyBhbmQgc28gYXJlIE5PVCByZWVudHJhbnQuICBEbyBub3QgdXNlIExPRyBpbiBhIHNpZ25hbCBoYW5kbGVyLgotLy8KLSNpZm5kZWYgX0xJQlNfVVRJTFNfTE9HX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfTE9HX0gKLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX0xPR19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL0xvb3Blci5oIGIvaW5jbHVkZS91dGlscy9Mb29wZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyOTA1ZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL0xvb3Blci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFVUSUxTX0xPT1BFUl9ICi0jZGVmaW5lIFVUSUxTX0xPT1BFUl9ICi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2xvb3Blci5oPgotCi0vLyBXaGVuIGRlZmluZWQsIHVzZXMgZXBvbGxfd2FpdCgpIGZvciBwb2xsaW5nLCBvdGhlcndpc2UgdXNlcyBwb2xsKCkuCi0jZGVmaW5lIExPT1BFUl9VU0VTX0VQT0xMCi0KLS8vIFdoZW4gZGVmaW5lZCwgbG9ncyBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIGZvciB0dW5pbmcgYW5kIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLS8vI2RlZmluZSBMT09QRVJfU1RBVElTVElDUwotCi0jaWZkZWYgTE9PUEVSX1VTRVNfRVBPTEwKLSNpbmNsdWRlIDxzeXMvZXBvbGwuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3BvbGwuaD4KLSNlbmRpZgotCi0vKgotICogRGVjbGFyZSBhIGNvbmNyZXRlIHR5cGUgZm9yIHRoZSBOREsncyBsb29wZXIgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLSAqLwotc3RydWN0IEFMb29wZXIgewotfTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIEEgbWVzc2FnZSB0aGF0IGNhbiBiZSBwb3N0ZWQgdG8gYSBMb29wZXIuCi0gKi8KLXN0cnVjdCBNZXNzYWdlIHsKLSAgICBNZXNzYWdlKCkgOiB3aGF0KDApIHsgfQotICAgIE1lc3NhZ2UoaW50IHdoYXQpIDogd2hhdCh3aGF0KSB7IH0KLQotICAgIC8qIFRoZSBtZXNzYWdlIHR5cGUuIChpbnRlcnByZXRhdGlvbiBpcyBsZWZ0IHVwIHRvIHRoZSBoYW5kbGVyKSAqLwotICAgIGludCB3aGF0OwotfTsKLQotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBMb29wZXIgbWVzc2FnZSBoYW5kbGVyLgotICoKLSAqIFRoZSBMb29wZXIgaG9sZHMgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGhhbmRsZXIgd2hlbmV2ZXIgaXQgaGFzCi0gKiBhIG1lc3NhZ2UgdG8gZGVsaXZlciB0byBpdC4gIE1ha2Ugc3VyZSB0byBjYWxsIExvb3Blcjo6cmVtb3ZlTWVzc2FnZXMKLSAqIHRvIHJlbW92ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyBkZXN0aW5lZCBmb3IgdGhlIGhhbmRsZXIgc28gdGhhdCB0aGUgaGFuZGxlcgotICogY2FuIGJlIGRlc3Ryb3llZC4KLSAqLwotY2xhc3MgTWVzc2FnZUhhbmRsZXIgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NZXNzYWdlSGFuZGxlcigpIHsgfQotCi1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIG1lc3NhZ2UuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgPSAwOwotfTsKLQotCi0vKioKLSAqIEEgc2ltcGxlIHByb3h5IHRoYXQgaG9sZHMgYSB3ZWFrIHJlZmVyZW5jZSB0byBhIG1lc3NhZ2UgaGFuZGxlci4KLSAqLwotY2xhc3MgV2Vha01lc3NhZ2VIYW5kbGVyIDogcHVibGljIE1lc3NhZ2VIYW5kbGVyIHsKLXB1YmxpYzoKLSAgICBXZWFrTWVzc2FnZUhhbmRsZXIoY29uc3Qgd3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyKTsKLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotcHJpdmF0ZToKLSAgICB3cDxNZXNzYWdlSGFuZGxlcj4gbUhhbmRsZXI7Ci19OwotCi0KLS8qKgotICogQSBwb2xsaW5nIGxvb3AgdGhhdCBzdXBwb3J0cyBtb25pdG9yaW5nIGZpbGUgZGVzY3JpcHRvciBldmVudHMsIG9wdGlvbmFsbHkKLSAqIHVzaW5nIGNhbGxiYWNrcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGVwb2xsKCkgaW50ZXJuYWxseS4KLSAqCi0gKiBBIGxvb3BlciBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgdGhyZWFkIGFsdGhvdWdoIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgaXQgbXVzdCBiZS4KLSAqLwotY2xhc3MgTG9vcGVyIDogcHVibGljIEFMb29wZXIsIHB1YmxpYyBSZWZCYXNlIHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Mb29wZXIoKTsKLQotcHVibGljOgotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBsb29wZXIuCi0gICAgICoKLSAgICAgKiBJZiBhbGxvd05vbkNhbGxiYWtzIGlzIHRydWUsIHRoZSBsb29wZXIgd2lsbCBhbGxvdyBmaWxlIGRlc2NyaXB0b3JzIHRvIGJlCi0gICAgICogcmVnaXN0ZXJlZCB3aXRob3V0IGFzc29jaWF0ZWQgY2FsbGJhY2tzLiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlciBvZgotICAgICAqIHBvbGxPbmNlKCkgaXMgcHJlcGFyZWQgdG8gaGFuZGxlIGNhbGxiYWNrLWxlc3MgZXZlbnRzIGl0c2VsZi4KLSAgICAgKi8KLSAgICBMb29wZXIoYm9vbCBhbGxvd05vbkNhbGxiYWNrcyk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBsb29wZXIgaW5zdGFuY2UgYWxsb3dzIHRoZSByZWdpc3RyYXRpb24gb2YgZmlsZSBkZXNjcmlwdG9ycwotICAgICAqIHVzaW5nIGlkZW50aWZpZXJzIGluc3RlYWQgb2YgY2FsbGJhY2tzLgotICAgICAqLwotICAgIGJvb2wgZ2V0QWxsb3dOb25DYWxsYmFja3MoKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIFdhaXRzIGZvciBldmVudHMgdG8gYmUgYXZhaWxhYmxlLCB3aXRoIG9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgICAqIEludm9rZXMgY2FsbGJhY2tzIGZvciBhbGwgZmlsZSBkZXNjcmlwdG9ycyBvbiB3aGljaCBhbiBldmVudCBvY2N1cnJlZC4KLSAgICAgKgotICAgICAqIElmIHRoZSB0aW1lb3V0IGlzIHplcm8sIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBibG9ja2luZy4KLSAgICAgKiBJZiB0aGUgdGltZW91dCBpcyBuZWdhdGl2ZSwgd2FpdHMgaW5kZWZpbml0ZWx5IHVudGlsIGFuIGV2ZW50IGFwcGVhcnMuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIEFMT09QRVJfUE9MTF9XQUtFIGlmIHRoZSBwb2xsIHdhcyBhd29rZW4gdXNpbmcgd2FrZSgpIGJlZm9yZQotICAgICAqIHRoZSB0aW1lb3V0IGV4cGlyZWQgYW5kIG5vIGNhbGxiYWNrcyB3ZXJlIGludm9rZWQgYW5kIG5vIG90aGVyIGZpbGUKLSAgICAgKiBkZXNjcmlwdG9ycyB3ZXJlIHJlYWR5LgotICAgICAqCi0gICAgICogUmV0dXJucyBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgaWYgb25lIG9yIG1vcmUgY2FsbGJhY2tzIHdlcmUgaW52b2tlZC4KLSAgICAgKgotICAgICAqIFJldHVybnMgQUxPT1BFUl9QT0xMX1RJTUVPVVQgaWYgdGhlcmUgd2FzIG5vIGRhdGEgYmVmb3JlIHRoZSBnaXZlbgotICAgICAqIHRpbWVvdXQgZXhwaXJlZC4KLSAgICAgKgotICAgICAqIFJldHVybnMgQUxPT1BFUl9QT0xMX0VSUk9SIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICAgICAqCi0gICAgICogUmV0dXJucyBhIHZhbHVlID49IDAgY29udGFpbmluZyBhbiBpZGVudGlmaWVyIGlmIGl0cyBmaWxlIGRlc2NyaXB0b3IgaGFzIGRhdGEKLSAgICAgKiBhbmQgaXQgaGFzIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIChyZXF1aXJpbmcgdGhlIGNhbGxlciBoZXJlIHRvIGhhbmRsZSBpdCkuCi0gICAgICogSW4gdGhpcyAoYW5kIG9ubHkgdGhpcykgY2FzZSBvdXRGZCwgb3V0RXZlbnRzIGFuZCBvdXREYXRhIHdpbGwgY29udGFpbiB0aGUgcG9sbAotICAgICAqIGV2ZW50cyBhbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGZkLCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIHNldCB0byBOVUxMLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0IGhhcyBmaW5pc2hlZCBpbnZva2luZyB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzCi0gICAgICogZm9yIGFsbCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgd2VyZSBzaWduYWxsZWQuCi0gICAgICovCi0gICAgaW50IHBvbGxPbmNlKGludCB0aW1lb3V0TWlsbGlzLCBpbnQqIG91dEZkLCBpbnQqIG91dEV2ZW50cywgdm9pZCoqIG91dERhdGEpOwotICAgIGlubGluZSBpbnQgcG9sbE9uY2UoaW50IHRpbWVvdXRNaWxsaXMpIHsKLSAgICAgICAgcmV0dXJuIHBvbGxPbmNlKHRpbWVvdXRNaWxsaXMsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpa2UgcG9sbE9uY2UoKSwgYnV0IHBlcmZvcm1zIGFsbCBwZW5kaW5nIGNhbGxiYWNrcyB1bnRpbCBhbGwKLSAgICAgKiBkYXRhIGhhcyBiZWVuIGNvbnN1bWVkIG9yIGEgZmlsZSBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSB3aXRoIG5vIGNhbGxiYWNrLgotICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gQUxPT1BFUl9QT0xMX0NBTExCQUNLLgotICAgICAqLwotICAgIGludCBwb2xsQWxsKGludCB0aW1lb3V0TWlsbGlzLCBpbnQqIG91dEZkLCBpbnQqIG91dEV2ZW50cywgdm9pZCoqIG91dERhdGEpOwotICAgIGlubGluZSBpbnQgcG9sbEFsbChpbnQgdGltZW91dE1pbGxpcykgewotICAgICAgICByZXR1cm4gcG9sbEFsbCh0aW1lb3V0TWlsbGlzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXYWtlcyB0aGUgcG9sbCBhc3luY2hyb25vdXNseS4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb24gYW55IHRocmVhZC4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGltbWVkaWF0ZWx5LgotICAgICAqLwotICAgIHZvaWQgd2FrZSgpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgcG9sbGVkIGJ5IHRoZSBsb29wZXIuCi0gICAgICogSWYgdGhlIHNhbWUgZmlsZSBkZXNjcmlwdG9yIHdhcyBwcmV2aW91c2x5IGFkZGVkLCBpdCBpcyByZXBsYWNlZC4KLSAgICAgKgotICAgICAqICJmZCIgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0byBiZSBhZGRlZC4KLSAgICAgKiAiaWRlbnQiIGlzIGFuIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQsIHdoaWNoIGlzIHJldHVybmVkIGZyb20gQUxvb3Blcl9wb2xsT25jZSgpLgotICAgICAqIFRoZSBpZGVudGlmaWVyIG11c3QgYmUgPj0gMCwgb3IgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGlmIHByb3ZpZGluZyBhIG5vbi1OVUxMIGNhbGxiYWNrLgotICAgICAqICJldmVudHMiIGFyZSB0aGUgcG9sbCBldmVudHMgdG8gd2FrZSB1cCBvbi4gIFR5cGljYWxseSB0aGlzIGlzIEFMT09QRVJfRVZFTlRfSU5QVVQuCi0gICAgICogImNhbGxiYWNrIiBpcyB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZXJlIGlzIGFuIGV2ZW50IG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gICAgICogImRhdGEiIGlzIGEgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgdG8gc3VwcGx5IHRvIHRoZSBjYWxsYmFjay4KLSAgICAgKgotICAgICAqIFRoZXJlIGFyZSB0d28gbWFpbiB1c2VzIG9mIHRoaXMgZnVuY3Rpb246Ci0gICAgICoKLSAgICAgKiAoMSkgSWYgImNhbGxiYWNrIiBpcyBub24tTlVMTCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMKLSAgICAgKiBkYXRhIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBJdCBzaG91bGQgZXhlY3V0ZSBhbnkgZXZlbnRzIGl0IGhhcyBwZW5kaW5nLAotICAgICAqIGFwcHJvcHJpYXRlbHkgcmVhZGluZyBmcm9tIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBUaGUgJ2lkZW50JyBpcyBpZ25vcmVkIGluIHRoaXMgY2FzZS4KLSAgICAgKgotICAgICAqICgyKSBJZiAiY2FsbGJhY2siIGlzIE5VTEwsIHRoZSAnaWRlbnQnIHdpbGwgYmUgcmV0dXJuZWQgYnkgQUxvb3Blcl9wb2xsT25jZQotICAgICAqIHdoZW4gaXRzIGZpbGUgZGVzY3JpcHRvciBoYXMgZGF0YSBhdmFpbGFibGUsIHJlcXVpcmluZyB0aGUgY2FsbGVyIHRvIHRha2UKLSAgICAgKiBjYXJlIG9mIHByb2Nlc3NpbmcgaXQuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIDEgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciB3YXMgYWRkZWQsIDAgaWYgdGhlIGFyZ3VtZW50cyB3ZXJlIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICogVGhpcyBtZXRob2QgbWF5IGJsb2NrIGJyaWVmbHkgaWYgaXQgbmVlZHMgdG8gd2FrZSB0aGUgcG9sbC4KLSAgICAgKi8KLSAgICBpbnQgYWRkRmQoaW50IGZkLCBpbnQgaWRlbnQsIGludCBldmVudHMsIEFMb29wZXJfY2FsbGJhY2tGdW5jIGNhbGxiYWNrLCB2b2lkKiBkYXRhKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIGZpbGUgZGVzY3JpcHRvciBmcm9tIHRoZSBsb29wZXIuCi0gICAgICoKLSAgICAgKiBXaGVuIHRoaXMgbWV0aG9kIHJldHVybnMsIGl0IGlzIHNhZmUgdG8gY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvciBzaW5jZSB0aGUgbG9vcGVyCi0gICAgICogd2lsbCBubyBsb25nZXIgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgY2FsbGJhY2sgdG8KLSAgICAgKiBhbHJlYWR5IGJlIHJ1bm5pbmcgb3IgZm9yIGl0IHRvIHJ1biBvbmUgbGFzdCB0aW1lIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2FzIGFscmVhZHkKLSAgICAgKiBzaWduYWxsZWQuICBDYWxsaW5nIGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhpcyBjYXNlIGlzIHNhZmVseSBoYW5kbGVkLgotICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgY2FsbGJhY2sgdGFrZXMgY2FyZSBvZiByZW1vdmluZyBpdHNlbGYgZHVyaW5nIGl0cyBvd24gZXhlY3V0aW9uIGVpdGhlcgotICAgICAqIGJ5IHJldHVybmluZyAwIG9yIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZW4gaXQgY2FuIGJlIGd1YXJhbnRlZWQgdG8gbm90IGJlIGludm9rZWQKLSAgICAgKiBhZ2FpbiBhdCBhbnkgbGF0ZXIgdGltZSB1bmxlc3MgcmVnaXN0ZXJlZCBhbmV3LgotICAgICAqCi0gICAgICogUmV0dXJucyAxIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2FzIHJlbW92ZWQsIDAgaWYgbm9uZSB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkLgotICAgICAqCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkLgotICAgICAqIFRoaXMgbWV0aG9kIG1heSBibG9jayBicmllZmx5IGlmIGl0IG5lZWRzIHRvIHdha2UgdGhlIHBvbGwuCi0gICAgICovCi0gICAgaW50IHJlbW92ZUZkKGludCBmZCk7Ci0KLSAgICAvKioKLSAgICAgKiBFbnF1ZXVlcyBhIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBzcGVjaWZpZWQgaGFuZGxlci4KLSAgICAgKgotICAgICAqIFRoZSBoYW5kbGVyIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkLgotICAgICAqLwotICAgIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAgIC8qKgotICAgICAqIEVucXVldWVzIGEgbWVzc2FnZSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGFmdGVyIGFsbCBwZW5kaW5nIG1lc3NhZ2VzCi0gICAgICogYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheS4KLSAgICAgKgotICAgICAqIFRoZSB0aW1lIGRlbGF5IGlzIHNwZWNpZmllZCBpbiB1cHRpbWUgbmFub3NlY29uZHMuCi0gICAgICogVGhlIGhhbmRsZXIgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICovCi0gICAgdm9pZCBzZW5kTWVzc2FnZURlbGF5ZWQobnNlY3NfdCB1cHRpbWVEZWxheSwgY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLAotICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBFbnF1ZXVlcyBhIG1lc3NhZ2UgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBzcGVjaWZpZWQgaGFuZGxlciBhZnRlciBhbGwgcGVuZGluZyBtZXNzYWdlcwotICAgICAqIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4KLSAgICAgKgotICAgICAqIFRoZSB0aW1lIGlzIHNwZWNpZmllZCBpbiB1cHRpbWUgbmFub3NlY29uZHMuCi0gICAgICogVGhlIGhhbmRsZXIgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICovCi0gICAgdm9pZCBzZW5kTWVzc2FnZUF0VGltZShuc2Vjc190IHVwdGltZSwgY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLAotICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGFsbCBtZXNzYWdlcyBmb3IgdGhlIHNwZWNpZmllZCBoYW5kbGVyIGZyb20gdGhlIHF1ZXVlLgotICAgICAqCi0gICAgICogVGhlIGhhbmRsZXIgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9uIGFueSB0aHJlYWQuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmVNZXNzYWdlcyhjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgbWVzc2FnZXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgaGFuZGxlciBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgKgotICAgICAqIFRoZSBoYW5kbGVyIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkLgotICAgICAqLwotICAgIHZvaWQgcmVtb3ZlTWVzc2FnZXMoY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLCBpbnQgd2hhdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQcmVwYXJlcyBhIGxvb3BlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhbGxpbmcgdGhyZWFkLCBhbmQgcmV0dXJucyBpdC4KLSAgICAgKiBJZiB0aGUgdGhyZWFkIGFscmVhZHkgaGFzIGEgbG9vcGVyLCBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSwgYSBuZXcKLSAgICAgKiBvbmUgaXMgY3JlYXRlZCwgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aHJlYWQsIGFuZCByZXR1cm5lZC4KLSAgICAgKgotICAgICAqIFRoZSBvcHRzIG1heSBiZSBBTE9PUEVSX1BSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLUyBvciAwLgotICAgICAqLwotICAgIHN0YXRpYyBzcDxMb29wZXI+IHByZXBhcmUoaW50IG9wdHMpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZ2l2ZW4gbG9vcGVyIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGluZyB0aHJlYWQuCi0gICAgICogSWYgYW5vdGhlciBsb29wZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRocmVhZCwgaXQgaXMgcmVwbGFjZWQuCi0gICAgICoKLSAgICAgKiBJZiAibG9vcGVyIiBpcyBOVUxMLCByZW1vdmVzIHRoZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBsb29wZXIuCi0gICAgICovCi0gICAgc3RhdGljIHZvaWQgc2V0Rm9yVGhyZWFkKGNvbnN0IHNwPExvb3Blcj4mIGxvb3Blcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsb29wZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZCwgb3IgTlVMTCBpZgotICAgICAqIHRoZXJlIGlzIG5vdCBvbmUuCi0gICAgICovCi0gICAgc3RhdGljIHNwPExvb3Blcj4gZ2V0Rm9yVGhyZWFkKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IFJlcXVlc3QgewotICAgICAgICBpbnQgZmQ7Ci0gICAgICAgIGludCBpZGVudDsKLSAgICAgICAgQUxvb3Blcl9jYWxsYmFja0Z1bmMgY2FsbGJhY2s7Ci0gICAgICAgIHZvaWQqIGRhdGE7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBSZXNwb25zZSB7Ci0gICAgICAgIGludCBldmVudHM7Ci0gICAgICAgIFJlcXVlc3QgcmVxdWVzdDsKLSAgICB9OwotCi0gICAgc3RydWN0IE1lc3NhZ2VFbnZlbG9wZSB7Ci0gICAgICAgIE1lc3NhZ2VFbnZlbG9wZSgpIDogdXB0aW1lKDApIHsgfQotCi0gICAgICAgIE1lc3NhZ2VFbnZlbG9wZShuc2Vjc190IHVwdGltZSwgY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgOiB1cHRpbWUodXB0aW1lKSwgaGFuZGxlcihoYW5kbGVyKSwgbWVzc2FnZShtZXNzYWdlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IHVwdGltZTsKLSAgICAgICAgc3A8TWVzc2FnZUhhbmRsZXI+IGhhbmRsZXI7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZTsKLSAgICB9OwotCi0gICAgY29uc3QgYm9vbCBtQWxsb3dOb25DYWxsYmFja3M7IC8vIGltbXV0YWJsZQotCi0gICAgaW50IG1XYWtlUmVhZFBpcGVGZDsgIC8vIGltbXV0YWJsZQotICAgIGludCBtV2FrZVdyaXRlUGlwZUZkOyAvLyBpbW11dGFibGUKLSAgICBNdXRleCBtTG9jazsKLQotICAgIFZlY3RvcjxNZXNzYWdlRW52ZWxvcGU+IG1NZXNzYWdlRW52ZWxvcGVzOyAvLyBndWFyZGVkIGJ5IG1Mb2NrCi0gICAgYm9vbCBtU2VuZGluZ01lc3NhZ2U7IC8vIGd1YXJkZWQgYnkgbUxvY2sKLQotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0gICAgaW50IG1FcG9sbEZkOyAvLyBpbW11dGFibGUKLQotICAgIC8vIExvY2tlZCBsaXN0IG9mIGZpbGUgZGVzY3JpcHRvciBtb25pdG9yaW5nIHJlcXVlc3RzLgotICAgIEtleWVkVmVjdG9yPGludCwgUmVxdWVzdD4gbVJlcXVlc3RzOyAgLy8gZ3VhcmRlZCBieSBtTG9jawotI2Vsc2UKLSAgICAvLyBUaGUgbG9jayBndWFyZHMgc3RhdGUgdXNlZCB0byB0cmFjayB3aGV0aGVyIHRoZXJlIGlzIGEgcG9sbCgpIGluIHByb2dyZXNzIGFuZCB3aGV0aGVyCi0gICAgLy8gdGhlcmUgYXJlIGFueSBvdGhlciB0aHJlYWRzIHdhaXRpbmcgaW4gd2FrZUFuZExvY2soKS4gIFRoZSBjb25kaXRpb24gdmFyaWFibGVzCi0gICAgLy8gYXJlIHVzZWQgdG8gdHJhbnNmZXIgY29udHJvbCBhbW9uZyB0aGVzZSB0aHJlYWRzIHN1Y2ggdGhhdCBhbGwgd2FpdGVycyBhcmUKLSAgICAvLyBzZXJ2aWNlZCBiZWZvcmUgYSBuZXcgcG9sbCBjYW4gYmVnaW4uCi0gICAgLy8gVGhlIHdha2VBbmRMb2NrKCkgbWV0aG9kIGluY3JlbWVudHMgbVdhaXRlcnMsIHdha2VzIHRoZSBwb2xsLCBibG9ja3Mgb24gbUF3YWtlCi0gICAgLy8gdW50aWwgbVBvbGxpbmcgYmVjb21lcyBmYWxzZSwgdGhlbiBkZWNyZW1lbnRzIG1XYWl0ZXJzIGFnYWluLgotICAgIC8vIFRoZSBwb2xsKCkgbWV0aG9kIGJsb2NrcyBvbiBtUmVzdW1lIHVudGlsIG1XYWl0ZXJzIGJlY29tZXMgMCwgdGhlbiBzZXRzCi0gICAgLy8gbVBvbGxpbmcgdG8gdHJ1ZSwgYmxvY2tzIHVudGlsIHRoZSBwb2xsIGNvbXBsZXRlcywgdGhlbiByZXNldHMgbVBvbGxpbmcgdG8gZmFsc2UKLSAgICAvLyBhbmQgc2lnbmFscyBtUmVzdW1lIGlmIHRoZXJlIGFyZSB3YWl0ZXJzLgotICAgIGJvb2wgbVBvbGxpbmc7ICAgICAgLy8gZ3VhcmRlZCBieSBtTG9jawotICAgIHVpbnQzMl90IG1XYWl0ZXJzOyAgLy8gZ3VhcmRlZCBieSBtTG9jawotICAgIENvbmRpdGlvbiBtQXdha2U7ICAgLy8gZ3VhcmRlZCBieSBtTG9jawotICAgIENvbmRpdGlvbiBtUmVzdW1lOyAgLy8gZ3VhcmRlZCBieSBtTG9jawotCi0gICAgVmVjdG9yPHN0cnVjdCBwb2xsZmQ+IG1SZXF1ZXN0ZWRGZHM7ICAvLyBtdXN0IGhvbGQgbUxvY2sgYW5kIG1Qb2xsaW5nIG11c3QgYmUgZmFsc2UgdG8gbW9kaWZ5Ci0gICAgVmVjdG9yPFJlcXVlc3Q+IG1SZXF1ZXN0czsgICAgICAgICAgICAvLyBtdXN0IGhvbGQgbUxvY2sgYW5kIG1Qb2xsaW5nIG11c3QgYmUgZmFsc2UgdG8gbW9kaWZ5Ci0KLSAgICBzc2l6ZV90IGdldFJlcXVlc3RJbmRleExvY2tlZChpbnQgZmQpOwotICAgIHZvaWQgd2FrZUFuZExvY2soKTsKLSNlbmRpZgotCi0jaWZkZWYgTE9PUEVSX1NUQVRJU1RJQ1MKLSAgICBzdGF0aWMgY29uc3QgaW50IFNBTVBMRURfV0FLRV9DWUNMRVNfVE9fQUdHUkVHQVRFID0gMTAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQgU0FNUExFRF9QT0xMU19UT19BR0dSRUdBVEUgPSAxMDAwOwotCi0gICAgbnNlY3NfdCBtUGVuZGluZ1dha2VUaW1lOwotICAgIGludCBtUGVuZGluZ1dha2VDb3VudDsKLQotICAgIGludCBtU2FtcGxlZFdha2VDeWNsZXM7Ci0gICAgaW50IG1TYW1wbGVkV2FrZUNvdW50U3VtOwotICAgIG5zZWNzX3QgbVNhbXBsZWRXYWtlTGF0ZW5jeVN1bTsKLQotICAgIGludCBtU2FtcGxlZFBvbGxzOwotICAgIGludCBtU2FtcGxlZFplcm9Qb2xsQ291bnQ7Ci0gICAgaW50IG1TYW1wbGVkWmVyb1BvbGxMYXRlbmN5U3VtOwotICAgIGludCBtU2FtcGxlZFRpbWVvdXRQb2xsQ291bnQ7Ci0gICAgaW50IG1TYW1wbGVkVGltZW91dFBvbGxMYXRlbmN5U3VtOwotI2VuZGlmCi0KLSAgICAvLyBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBwcml2YXRlbHkgYnkgcG9sbE9uY2UgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSBsb2NrIHNpbmNlCi0gICAgLy8gaXQgcnVucyBvbiBhIHNpbmdsZSB0aHJlYWQuCi0gICAgVmVjdG9yPFJlc3BvbnNlPiBtUmVzcG9uc2VzOwotICAgIHNpemVfdCBtUmVzcG9uc2VJbmRleDsKLSAgICBuc2Vjc190IG1OZXh0TWVzc2FnZVVwdGltZTsgLy8gc2V0IHRvIExMT05HX01BWCB3aGVuIG5vbmUKLQotICAgIGludCBwb2xsSW5uZXIoaW50IHRpbWVvdXRNaWxsaXMpOwotICAgIHZvaWQgYXdva2VuKCk7Ci0gICAgdm9pZCBwdXNoUmVzcG9uc2UoaW50IGV2ZW50cywgY29uc3QgUmVxdWVzdCYgcmVxdWVzdCk7Ci0KLSAgICBzdGF0aWMgdm9pZCBpbml0VExTS2V5KCk7Ci0gICAgc3RhdGljIHZvaWQgdGhyZWFkRGVzdHJ1Y3Rvcih2b2lkICpzdCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBVVElMU19MT09QRVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9NdXRleC5oIGIvaW5jbHVkZS91dGlscy9NdXRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTZmYjM5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvTXV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU19VVElMU19NVVRFWF9ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX01VVEVYX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSMgaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ29uZGl0aW9uOwotCi0vKgotICogU2ltcGxlIG11dGV4IGNsYXNzLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHN5c3RlbS1kZXBlbmRlbnQuCi0gKgotICogVGhlIG11dGV4IG11c3QgYmUgdW5sb2NrZWQgYnkgdGhlIHRocmVhZCB0aGF0IGxvY2tlZCBpdC4gIFRoZXkgYXJlIG5vdAotICogcmVjdXJzaXZlLCBpLmUuIHRoZSBzYW1lIHRocmVhZCBjYW4ndCBsb2NrIGl0IG11bHRpcGxlIHRpbWVzLgotICovCi1jbGFzcyBNdXRleCB7Ci1wdWJsaWM6Ci0gICAgZW51bSB7Ci0gICAgICAgIFBSSVZBVEUgPSAwLAotICAgICAgICBTSEFSRUQgPSAxCi0gICAgfTsKLSAgICAKLSAgICAgICAgICAgICAgICBNdXRleCgpOwotICAgICAgICAgICAgICAgIE11dGV4KGNvbnN0IGNoYXIqIG5hbWUpOwotICAgICAgICAgICAgICAgIE11dGV4KGludCB0eXBlLCBjb25zdCBjaGFyKiBuYW1lID0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgfk11dGV4KCk7Ci0KLSAgICAvLyBsb2NrIG9yIHVubG9jayB0aGUgbXV0ZXgKLSAgICBzdGF0dXNfdCAgICBsb2NrKCk7Ci0gICAgdm9pZCAgICAgICAgdW5sb2NrKCk7Ci0KLSAgICAvLyBsb2NrIGlmIHBvc3NpYmxlOyByZXR1cm5zIDAgb24gc3VjY2VzcywgZXJyb3Igb3RoZXJ3aXNlCi0gICAgc3RhdHVzX3QgICAgdHJ5TG9jaygpOwotCi0gICAgLy8gTWFuYWdlcyB0aGUgbXV0ZXggYXV0b21hdGljYWxseS4gSXQnbGwgYmUgbG9ja2VkIHdoZW4gQXV0b2xvY2sgaXMKLSAgICAvLyBjb25zdHJ1Y3RlZCBhbmQgcmVsZWFzZWQgd2hlbiBBdXRvbG9jayBnb2VzIG91dCBvZiBzY29wZS4KLSAgICBjbGFzcyBBdXRvbG9jayB7Ci0gICAgcHVibGljOgotICAgICAgICBpbmxpbmUgQXV0b2xvY2soTXV0ZXgmIG11dGV4KSA6IG1Mb2NrKG11dGV4KSAgeyBtTG9jay5sb2NrKCk7IH0KLSAgICAgICAgaW5saW5lIEF1dG9sb2NrKE11dGV4KiBtdXRleCkgOiBtTG9jaygqbXV0ZXgpIHsgbUxvY2subG9jaygpOyB9Ci0gICAgICAgIGlubGluZSB+QXV0b2xvY2soKSB7IG1Mb2NrLnVubG9jaygpOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgTXV0ZXgmIG1Mb2NrOwotICAgIH07Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENvbmRpdGlvbjsKLSAgICAKLSAgICAvLyBBIG11dGV4IGNhbm5vdCBiZSBjb3BpZWQKLSAgICAgICAgICAgICAgICBNdXRleChjb25zdCBNdXRleCYpOwotICAgIE11dGV4JiAgICAgIG9wZXJhdG9yID0gKGNvbnN0IE11dGV4Jik7Ci0gICAgCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotICAgIHB0aHJlYWRfbXV0ZXhfdCBtTXV0ZXg7Ci0jZWxzZQotICAgIHZvaWQgICAgX2luaXQoKTsKLSAgICB2b2lkKiAgIG1TdGF0ZTsKLSNlbmRpZgotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0KLWlubGluZSBNdXRleDo6TXV0ZXgoKSB7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOwotfQotaW5saW5lIE11dGV4OjpNdXRleChjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOwotfQotaW5saW5lIE11dGV4OjpNdXRleChpbnQgdHlwZSwgY29uc3QgY2hhciogbmFtZSkgewotICAgIGlmICh0eXBlID09IFNIQVJFRCkgewotICAgICAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJmF0dHIpOwotICAgICAgICBwdGhyZWFkX211dGV4YXR0cl9zZXRwc2hhcmVkKCZhdHRyLCBQVEhSRUFEX1BST0NFU1NfU0hBUkVEKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsICZhdHRyKTsKLSAgICAgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmYXR0cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOwotICAgIH0KLX0KLWlubGluZSBNdXRleDo6fk11dGV4KCkgewotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKLX0KLWlubGluZSBzdGF0dXNfdCBNdXRleDo6bG9jaygpIHsKLSAgICByZXR1cm4gLXB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKLX0KLWlubGluZSB2b2lkIE11dGV4Ojp1bmxvY2soKSB7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgTXV0ZXg6OnRyeUxvY2soKSB7Ci0gICAgcmV0dXJuIC1wdGhyZWFkX211dGV4X3RyeWxvY2soJm1NdXRleCk7Ci19Ci0KLSNlbmRpZiAvLyBIQVZFX1BUSFJFQURTCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKgotICogQXV0b21hdGljIG11dGV4LiAgRGVjbGFyZSBvbmUgb2YgdGhlc2UgYXQgdGhlIHRvcCBvZiBhIGZ1bmN0aW9uLgotICogV2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucywgaXQgd2lsbCBnbyBvdXQgb2Ygc2NvcGUsIGFuZCByZWxlYXNlIHRoZQotICogbXV0ZXguCi0gKi8KLSAKLXR5cGVkZWYgTXV0ZXg6OkF1dG9sb2NrIEF1dG9NdXRleDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19NVVRFWF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1Byb3BlcnR5TWFwLmggYi9pbmNsdWRlL3V0aWxzL1Byb3BlcnR5TWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTY3NGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9Qcm9wZXJ0eU1hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9VVElMU19QUk9QRVJUWV9NQVBfSAotI2RlZmluZSBfVVRJTFNfUFJPUEVSVFlfTUFQX0gKLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1Rva2VuaXplci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qCi0gKiBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgcGFzc2luZyBhcm91bmQgc3RyaW5nLWJhc2VkIHByb3BlcnR5IGtleSAvIHZhbHVlIHBhaXJzCi0gKiBhbmQgbG9hZGluZyB0aGVtIGZyb20gcHJvcGVydHkgZmlsZXMuCi0gKgotICogVGhlIHByb3BlcnR5IGZpbGVzIGhhdmUgdGhlIGZvbGxvd2luZyBzaW1wbGUgc3RydWN0dXJlOgotICoKLSAqICMgQ29tbWVudAotICoga2V5ID0gdmFsdWUKLSAqCi0gKiBLZXlzIGFuZCB2YWx1ZXMgYXJlIGFueSBzZXF1ZW5jZSBvZiBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycy4KLSAqIFRoZSAnPScgc2VwYXJhdGVzIHRoZSBrZXkgZnJvbSB0aGUgdmFsdWUuCi0gKiBUaGUga2V5IGFuZCB2YWx1ZSBtYXkgbm90IGNvbnRhaW4gd2hpdGVzcGFjZS4KLSAqCi0gKiBUaGUgJ1wnIGNoYXJhY3RlciBpcyByZXNlcnZlZCBmb3IgZXNjYXBlIHNlcXVlbmNlcyBhbmQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0gKiBUaGUgJyIiIGNoYXJhY3RlciBpcyByZXNlcnZlZCBmb3IgcXVvdGluZyBhbmQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCi0gKiBGaWxlcyB0aGF0IGNvbnRhaW4gdGhlICdcJyBvciAnIicgY2hhcmFjdGVyIHdpbGwgZmFpbCB0byBwYXJzZS4KLSAqCi0gKiBUaGUgZmlsZSBtdXN0IG5vdCBjb250YWluIGR1cGxpY2F0ZSBrZXlzLgotICoKLSAqIFRPRE8gU3VwcG9ydCBlc2NhcGUgc2VxdWVuY2VzIGFuZCBxdW90ZWQgdmFsdWVzIHdoZW4gbmVlZGVkLgotICovCi1jbGFzcyBQcm9wZXJ0eU1hcCB7Ci1wdWJsaWM6Ci0gICAgLyogQ3JlYXRlcyBhbiBlbXB0eSBwcm9wZXJ0eSBtYXAuICovCi0gICAgUHJvcGVydHlNYXAoKTsKLSAgICB+UHJvcGVydHlNYXAoKTsKLQotICAgIC8qIENsZWFycyB0aGUgcHJvcGVydHkgbWFwLiAqLwotICAgIHZvaWQgY2xlYXIoKTsKLQotICAgIC8qIEFkZHMgYSBwcm9wZXJ0eS4KLSAgICAgKiBSZXBsYWNlcyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXkgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgotICAgICAqLwotICAgIHZvaWQgYWRkUHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSk7Ci0KLSAgICAvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4gKi8KLSAgICBib29sIGhhc1Byb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSkgY29uc3Q7Ci0KLSAgICAvKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IGFuZCBwYXJzZXMgaXQuCi0gICAgICogUmV0dXJucyB0cnVlIGFuZCBzZXRzIG91dFZhbHVlIGlmIHRoZSBrZXkgd2FzIGZvdW5kIGFuZCBpdHMgdmFsdWUgd2FzIHBhcnNlZCBzdWNjZXNzZnVsbHkuCi0gICAgICogT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgYW5kIGRvZXMgbm90IG1vZGlmeSBvdXRWYWx1ZS4gIChBbHNvIGxvZ3MgYSB3YXJuaW5nLikKLSAgICAgKi8KLSAgICBib29sIHRyeUdldFByb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSwgU3RyaW5nOCYgb3V0VmFsdWUpIGNvbnN0OwotICAgIGJvb2wgdHJ5R2V0UHJvcGVydHkoY29uc3QgU3RyaW5nOCYga2V5LCBib29sJiBvdXRWYWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCB0cnlHZXRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGludDMyX3QmIG91dFZhbHVlKSBjb25zdDsKLSAgICBib29sIHRyeUdldFByb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSwgZmxvYXQmIG91dFZhbHVlKSBjb25zdDsKLQotICAgIC8qIEFkZHMgYWxsIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgbWFwLiAqLwotICAgIHZvaWQgYWRkQWxsKGNvbnN0IFByb3BlcnR5TWFwKiBtYXApOwotCi0gICAgLyogR2V0cyB0aGUgdW5kZXJseWluZyBwcm9wZXJ0eSBtYXAuICovCi0gICAgaW5saW5lIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JiBnZXRQcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbVByb3BlcnRpZXM7IH0KLQotICAgIC8qIExvYWRzIGEgcHJvcGVydHkgbWFwIGZyb20gYSBmaWxlLiAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkKGNvbnN0IFN0cmluZzgmIGZpbGVuYW1lLCBQcm9wZXJ0eU1hcCoqIG91dE1hcCk7Ci0KLXByaXZhdGU6Ci0gICAgY2xhc3MgUGFyc2VyIHsKLSAgICAgICAgUHJvcGVydHlNYXAqIG1NYXA7Ci0gICAgICAgIFRva2VuaXplciogbVRva2VuaXplcjsKLQotICAgIHB1YmxpYzoKLSAgICAgICAgUGFyc2VyKFByb3BlcnR5TWFwKiBtYXAsIFRva2VuaXplciogdG9rZW5pemVyKTsKLSAgICAgICAgflBhcnNlcigpOwotICAgICAgICBzdGF0dXNfdCBwYXJzZSgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdHVzX3QgcGFyc2VUeXBlKCk7Ci0gICAgICAgIHN0YXR1c190IHBhcnNlS2V5KCk7Ci0gICAgICAgIHN0YXR1c190IHBhcnNlS2V5UHJvcGVydHkoKTsKLSAgICAgICAgc3RhdHVzX3QgcGFyc2VNb2RpZmllcihjb25zdCBTdHJpbmc4JiB0b2tlbiwgaW50MzJfdCogb3V0TWV0YVN0YXRlKTsKLSAgICAgICAgc3RhdHVzX3QgcGFyc2VDaGFyYWN0ZXJMaXRlcmFsKGNoYXIxNl90KiBvdXRDaGFyYWN0ZXIpOwotICAgIH07Ci0KLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtUHJvcGVydGllczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIF9VVElMU19QUk9QRVJUWV9NQVBfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9SV0xvY2suaCBiL2luY2x1ZGUvdXRpbHMvUldMb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWJlYTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9SV0xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfTElCU19VVElMU19SV0xPQ0tfSAotI2RlZmluZSBfTElCU19VVElMU19SV0xPQ0tfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0jIGluY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkRGVmcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotCi0vKgotICogU2ltcGxlIG11dGV4IGNsYXNzLiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHN5c3RlbS1kZXBlbmRlbnQuCi0gKgotICogVGhlIG11dGV4IG11c3QgYmUgdW5sb2NrZWQgYnkgdGhlIHRocmVhZCB0aGF0IGxvY2tlZCBpdC4gIFRoZXkgYXJlIG5vdAotICogcmVjdXJzaXZlLCBpLmUuIHRoZSBzYW1lIHRocmVhZCBjYW4ndCBsb2NrIGl0IG11bHRpcGxlIHRpbWVzLgotICovCi1jbGFzcyBSV0xvY2sgewotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBQUklWQVRFID0gMCwKLSAgICAgICAgU0hBUkVEID0gMQotICAgIH07Ci0KLSAgICAgICAgICAgICAgICBSV0xvY2soKTsKLSAgICAgICAgICAgICAgICBSV0xvY2soY29uc3QgY2hhciogbmFtZSk7Ci0gICAgICAgICAgICAgICAgUldMb2NrKGludCB0eXBlLCBjb25zdCBjaGFyKiBuYW1lID0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgflJXTG9jaygpOwotCi0gICAgc3RhdHVzX3QgICAgcmVhZExvY2soKTsKLSAgICBzdGF0dXNfdCAgICB0cnlSZWFkTG9jaygpOwotICAgIHN0YXR1c190ICAgIHdyaXRlTG9jaygpOwotICAgIHN0YXR1c190ICAgIHRyeVdyaXRlTG9jaygpOwotICAgIHZvaWQgICAgICAgIHVubG9jaygpOwotCi0gICAgY2xhc3MgQXV0b1JMb2NrIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGlubGluZSBBdXRvUkxvY2soUldMb2NrJiByd2xvY2spIDogbUxvY2socndsb2NrKSAgeyBtTG9jay5yZWFkTG9jaygpOyB9Ci0gICAgICAgIGlubGluZSB+QXV0b1JMb2NrKCkgeyBtTG9jay51bmxvY2soKTsgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFJXTG9jayYgbUxvY2s7Ci0gICAgfTsKLQotICAgIGNsYXNzIEF1dG9XTG9jayB7Ci0gICAgcHVibGljOgotICAgICAgICBpbmxpbmUgQXV0b1dMb2NrKFJXTG9jayYgcndsb2NrKSA6IG1Mb2NrKHJ3bG9jaykgIHsgbUxvY2sud3JpdGVMb2NrKCk7IH0KLSAgICAgICAgaW5saW5lIH5BdXRvV0xvY2soKSB7IG1Mb2NrLnVubG9jaygpOyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgUldMb2NrJiBtTG9jazsKLSAgICB9OwotCi1wcml2YXRlOgotICAgIC8vIEEgUldMb2NrIGNhbm5vdCBiZSBjb3BpZWQKLSAgICAgICAgICAgICAgICBSV0xvY2soY29uc3QgUldMb2NrJik7Ci0gICBSV0xvY2smICAgICAgb3BlcmF0b3IgPSAoY29uc3QgUldMb2NrJik7Ci0KLSAgIHB0aHJlYWRfcndsb2NrX3QgbVJXTG9jazsKLX07Ci0KLWlubGluZSBSV0xvY2s6OlJXTG9jaygpIHsKLSAgICBwdGhyZWFkX3J3bG9ja19pbml0KCZtUldMb2NrLCBOVUxMKTsKLX0KLWlubGluZSBSV0xvY2s6OlJXTG9jayhjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgcHRocmVhZF9yd2xvY2tfaW5pdCgmbVJXTG9jaywgTlVMTCk7Ci19Ci1pbmxpbmUgUldMb2NrOjpSV0xvY2soaW50IHR5cGUsIGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBpZiAodHlwZSA9PSBTSEFSRUQpIHsKLSAgICAgICAgcHRocmVhZF9yd2xvY2thdHRyX3QgYXR0cjsKLSAgICAgICAgcHRocmVhZF9yd2xvY2thdHRyX2luaXQoJmF0dHIpOwotICAgICAgICBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0cHNoYXJlZCgmYXR0ciwgUFRIUkVBRF9QUk9DRVNTX1NIQVJFRCk7Ci0gICAgICAgIHB0aHJlYWRfcndsb2NrX2luaXQoJm1SV0xvY2ssICZhdHRyKTsKLSAgICAgICAgcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3koJmF0dHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHB0aHJlYWRfcndsb2NrX2luaXQoJm1SV0xvY2ssIE5VTEwpOwotICAgIH0KLX0KLWlubGluZSBSV0xvY2s6On5SV0xvY2soKSB7Ci0gICAgcHRocmVhZF9yd2xvY2tfZGVzdHJveSgmbVJXTG9jayk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgUldMb2NrOjpyZWFkTG9jaygpIHsKLSAgICByZXR1cm4gLXB0aHJlYWRfcndsb2NrX3JkbG9jaygmbVJXTG9jayk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgUldMb2NrOjp0cnlSZWFkTG9jaygpIHsKLSAgICByZXR1cm4gLXB0aHJlYWRfcndsb2NrX3RyeXJkbG9jaygmbVJXTG9jayk7Ci19Ci1pbmxpbmUgc3RhdHVzX3QgUldMb2NrOjp3cml0ZUxvY2soKSB7Ci0gICAgcmV0dXJuIC1wdGhyZWFkX3J3bG9ja193cmxvY2soJm1SV0xvY2spOwotfQotaW5saW5lIHN0YXR1c190IFJXTG9jazo6dHJ5V3JpdGVMb2NrKCkgewotICAgIHJldHVybiAtcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZtUldMb2NrKTsKLX0KLWlubGluZSB2b2lkIFJXTG9jazo6dW5sb2NrKCkgewotICAgIHB0aHJlYWRfcndsb2NrX3VubG9jaygmbVJXTG9jayk7Ci19Ci0KLSNlbmRpZiAvLyBIQVZFX1BUSFJFQURTCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gX0xJQlNfVVRJTFNfUldMT0NLX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvUmVmQmFzZS5oIGIvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTliNzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9SZWZCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9SRUZfQkFTRV9ICi0jZGVmaW5lIEFORFJPSURfUkVGX0JBU0VfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUZXh0T3V0cHV0OwotVGV4dE91dHB1dCYgcHJpbnRXZWFrUG9pbnRlcihUZXh0T3V0cHV0JiB0bywgY29uc3Qgdm9pZCogdmFsKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgQ09NUEFSRV9XRUFLKF9vcF8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBzcDxUPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBUKiBvKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi10ZW1wbGF0ZTx0eXBlbmFtZSBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotaW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3Qgc3A8VT4mIG8pIGNvbnN0IHsgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gbV9wdHIgX29wXyBvLm1fcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8dHlwZW5hbWUgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IFUqIG8pIGNvbnN0IHsgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWNsYXNzIFJlZmVyZW5jZU1vdmVyOwotY2xhc3MgUmVmZXJlbmNlQ29udmVydGVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBzaXplX3QgZ2V0UmVmZXJlbmNlVHlwZVNpemUoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkKiBnZXRSZWZlcmVuY2VCYXNlKHZvaWQgY29uc3QqKSBjb25zdCA9IDA7Ci0gICAgaW5saW5lIHZpcnR1YWwgflJlZmVyZW5jZUNvbnZlcnRlckJhc2UoKSB7IH0KLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgaW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0OwotICAgIAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGZvcmNlSW5jU3Ryb25nKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKLQotICAgICAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBHZXQgY3VycmVudCBzdHJvbmcgcmVmIGNvdW50LgotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIGdldFN0cm9uZ0NvdW50KCkgY29uc3Q7Ci0KLSAgICBjbGFzcyB3ZWFrcmVmX3R5cGUKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBSZWZCYXNlKiAgICAgICAgICAgIHJlZkJhc2UoKSBjb25zdDsKLSAgICAgICAgCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgaW5jV2Vhayhjb25zdCB2b2lkKiBpZCk7Ci0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgZGVjV2Vhayhjb25zdCB2b2lkKiBpZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBhY3F1aXJlcyBhIHN0cm9uZyByZWZlcmVuY2UgaWYgdGhlcmUgaXMgYWxyZWFkeSBvbmUuCi0gICAgICAgIGJvb2wgICAgICAgICAgICAgICAgYXR0ZW1wdEluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCk7Ci0gICAgICAgIAotICAgICAgICAvLyBhY3F1aXJlcyBhIHdlYWsgcmVmZXJlbmNlIGlmIHRoZXJlIGlzIGFscmVhZHkgb25lLgotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbHdheXMgc2FmZS4gc2VlIFByb2Nlc3NTdGF0ZS5jcHAgYW5kIEJwQmluZGVyLmNwcAotICAgICAgICAvLyBmb3IgcHJvcGVyIHVzZS4KLSAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBhdHRlbXB0SW5jV2Vhayhjb25zdCB2b2lkKiBpZCk7Ci0KLSAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBHZXQgY3VycmVudCB3ZWFrIHJlZiBjb3VudC4KLSAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRXZWFrQ291bnQoKSBjb25zdDsKLQotICAgICAgICAvLyEgREVCVUdHSU5HIE9OTFk6IFByaW50IHJlZmVyZW5jZXMgaGVsZCBvbiBvYmplY3QuCi0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgcHJpbnRSZWZzKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8hIERFQlVHR0lORyBPTkxZOiBFbmFibGUgdHJhY2tpbmcgZm9yIHRoaXMgb2JqZWN0LgotICAgICAgICAvLyBlbmFibGUgLS0gZW5hYmxlL2Rpc2FibGUgdHJhY2tpbmcKLSAgICAgICAgLy8gcmV0YWluIC0tIHdoZW4gdHJhY2tpbmcgaXMgZW5hYmxlLCBpZiB0cnVlLCB0aGVuIHdlIHNhdmUgYSBzdGFjayB0cmFjZQotICAgICAgICAvLyAgICAgICAgICAgZm9yIGVhY2ggcmVmZXJlbmNlIGFuZCBkZXJlZmVyZW5jZTsgd2hlbiByZXRhaW4gPT0gZmFsc2UsIHdlCi0gICAgICAgIC8vICAgICAgICAgICBtYXRjaCB1cCByZWZlcmVuY2VzIGFuZCBkZXJlZmVyZW5jZXMgYW5kIGtlZXAgb25seSB0aGUgCi0gICAgICAgIC8vICAgICAgICAgICBvdXRzdGFuZGluZyBvbmVzLgotICAgICAgICAKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICB0cmFja01lKGJvb2wgZW5hYmxlLCBib29sIHJldGFpbik7Ci0gICAgfTsKLSAgICAKLSAgICAgICAgICAgIHdlYWtyZWZfdHlwZSogICBjcmVhdGVXZWFrKGNvbnN0IHZvaWQqIGlkKSBjb25zdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgd2Vha3JlZl90eXBlKiAgIGdldFdlYWtSZWZzKCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vISBERUJVR0dJTkcgT05MWTogUHJpbnQgcmVmZXJlbmNlcyBoZWxkIG9uIG9iamVjdC4KLSAgICBpbmxpbmUgIHZvaWQgICAgICAgICAgICBwcmludFJlZnMoKSBjb25zdCB7IGdldFdlYWtSZWZzKCktPnByaW50UmVmcygpOyB9Ci0KLSAgICAgICAgICAgIC8vISBERUJVR0dJTkcgT05MWTogRW5hYmxlIHRyYWNraW5nIG9mIG9iamVjdC4KLSAgICBpbmxpbmUgIHZvaWQgICAgICAgICAgICB0cmFja01lKGJvb2wgZW5hYmxlLCBib29sIHJldGFpbikKLSAgICB7IAotICAgICAgICBnZXRXZWFrUmVmcygpLT50cmFja01lKGVuYWJsZSwgcmV0YWluKTsgCi0gICAgfQotCi0gICAgdHlwZWRlZiBSZWZCYXNlIGJhc2V0eXBlOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmQmFzZSgpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5SZWZCYXNlKCk7Ci0KLSAgICAvLyEgRmxhZ3MgZm9yIGV4dGVuZE9iamVjdExpZmV0aW1lKCkKLSAgICBlbnVtIHsKLSAgICAgICAgT0JKRUNUX0xJRkVUSU1FX1NUUk9ORyAgPSAweDAwMDAsCi0gICAgICAgIE9CSkVDVF9MSUZFVElNRV9XRUFLICAgID0gMHgwMDAxLAotICAgICAgICBPQkpFQ1RfTElGRVRJTUVfTUFTSyAgICA9IDB4MDAwMQotICAgIH07Ci0gICAgCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgZXh0ZW5kT2JqZWN0TGlmZXRpbWUoaW50MzJfdCBtb2RlKTsKLSAgICAgICAgICAgIAotICAgIC8vISBGbGFncyBmb3Igb25JbmNTdHJvbmdBdHRlbXB0ZWQoKQotICAgIGVudW0gewotICAgICAgICBGSVJTVF9JTkNfU1RST05HID0gMHgwMDAxCi0gICAgfTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBvbkZpcnN0UmVmKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgb25MYXN0U3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICBvbkluY1N0cm9uZ0F0dGVtcHRlZCh1aW50MzJfdCBmbGFncywgY29uc3Qgdm9pZCogaWQpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG9uTGFzdFdlYWtSZWYoY29uc3Qgdm9pZCogaWQpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBSZWZlcmVuY2VNb3ZlcjsKLSAgICBzdGF0aWMgdm9pZCBtb3ZlUmVmZXJlbmNlcyh2b2lkKiBkLCB2b2lkIGNvbnN0KiBzLCBzaXplX3QgbiwKLSAgICAgICAgICAgIGNvbnN0IFJlZmVyZW5jZUNvbnZlcnRlckJhc2UmIGNhc3Rlcik7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIHdlYWtyZWZfdHlwZTsKLSAgICBjbGFzcyB3ZWFrcmVmX2ltcGw7Ci0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmQmFzZShjb25zdCBSZWZCYXNlJiBvKTsKLSAgICAgICAgICAgIFJlZkJhc2UmICAgICAgICBvcGVyYXRvcj0oY29uc3QgUmVmQmFzZSYgbyk7Ci0KLSAgICAgICAgd2Vha3JlZl9pbXBsKiBjb25zdCBtUmVmczsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIExpZ2h0UmVmQmFzZQotewotcHVibGljOgotICAgIGlubGluZSBMaWdodFJlZkJhc2UoKSA6IG1Db3VudCgwKSB7IH0KLSAgICBpbmxpbmUgdm9pZCBpbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKLSAgICAgICAgYW5kcm9pZF9hdG9taWNfaW5jKCZtQ291bnQpOwotICAgIH0KLSAgICBpbmxpbmUgdm9pZCBkZWNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKLSAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmbUNvdW50KSA9PSAxKSB7Ci0gICAgICAgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vISBERUJVR0dJTkcgT05MWTogR2V0IGN1cnJlbnQgc3Ryb25nIHJlZiBjb3VudC4KLSAgICBpbmxpbmUgaW50MzJfdCBnZXRTdHJvbmdDb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Db3VudDsKLSAgICB9Ci0KLSAgICB0eXBlZGVmIExpZ2h0UmVmQmFzZTxUPiBiYXNldHlwZTsKLQotcHJvdGVjdGVkOgotICAgIGlubGluZSB+TGlnaHRSZWZCYXNlKCkgeyB9Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIFJlZmVyZW5jZU1vdmVyOwotICAgIGlubGluZSBzdGF0aWMgdm9pZCBtb3ZlUmVmZXJlbmNlcyh2b2lkKiBkLCB2b2lkIGNvbnN0KiBzLCBzaXplX3QgbiwKLSAgICAgICAgICAgIGNvbnN0IFJlZmVyZW5jZUNvbnZlcnRlckJhc2UmIGNhc3RlcikgeyB9Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSB2b2xhdGlsZSBpbnQzMl90IG1Db3VudDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIHdwCi17Ci1wdWJsaWM6Ci0gICAgdHlwZWRlZiB0eXBlbmFtZSBSZWZCYXNlOjp3ZWFrcmVmX3R5cGUgd2Vha3JlZl90eXBlOwotICAgIAotICAgIGlubGluZSB3cCgpIDogbV9wdHIoMCkgeyB9Ci0KLSAgICB3cChUKiBvdGhlcik7Ci0gICAgd3AoY29uc3Qgd3A8VD4mIG90aGVyKTsKLSAgICB3cChjb25zdCBzcDxUPiYgb3RoZXIpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHdwKFUqIG90aGVyKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiB3cChjb25zdCBzcDxVPiYgb3RoZXIpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHdwKGNvbnN0IHdwPFU+JiBvdGhlcik7Ci0KLSAgICB+d3AoKTsKLSAgICAKLSAgICAvLyBBc3NpZ25tZW50Ci0KLSAgICB3cCYgb3BlcmF0b3IgPSAoVCogb3RoZXIpOwotICAgIHdwJiBvcGVyYXRvciA9IChjb25zdCB3cDxUPiYgb3RoZXIpOwotICAgIHdwJiBvcGVyYXRvciA9IChjb25zdCBzcDxUPiYgb3RoZXIpOwotICAgIAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHdwJiBvcGVyYXRvciA9IChVKiBvdGhlcik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AmIG9wZXJhdG9yID0gKGNvbnN0IHdwPFU+JiBvdGhlcik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gd3AmIG9wZXJhdG9yID0gKGNvbnN0IHNwPFU+JiBvdGhlcik7Ci0gICAgCi0gICAgdm9pZCBzZXRfb2JqZWN0X2FuZF9yZWZzKFQqIG90aGVyLCB3ZWFrcmVmX3R5cGUqIHJlZnMpOwotCi0gICAgLy8gcHJvbW90aW9uIHRvIHNwCi0gICAgCi0gICAgc3A8VD4gcHJvbW90ZSgpIGNvbnN0OwotCi0gICAgLy8gUmVzZXQKLSAgICAKLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAvLyBBY2Nlc3NvcnMKLSAgICAKLSAgICBpbmxpbmUgIHdlYWtyZWZfdHlwZSogZ2V0X3JlZnMoKSBjb25zdCB7IHJldHVybiBtX3JlZnM7IH0KLSAgICAKLSAgICBpbmxpbmUgIFQqIHVuc2FmZV9nZXQoKSBjb25zdCB7IHJldHVybiBtX3B0cjsgfQotCi0gICAgLy8gT3BlcmF0b3JzCi0KLSAgICBDT01QQVJFX1dFQUsoPT0pCi0gICAgQ09NUEFSRV9XRUFLKCE9KQotICAgIENPTVBBUkVfV0VBSyg+KQotICAgIENPTVBBUkVfV0VBSyg8KQotICAgIENPTVBBUkVfV0VBSyg8PSkKLSAgICBDT01QQVJFX1dFQUsoPj0pCi0KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSAmJiAobV9yZWZzID09IG8ubV9yZWZzKTsKLSAgICB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1fcHRyID09IG8ubV9wdHI7Ci0gICAgfQotCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPiAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSA/IChtX3JlZnMgPiBvLm1fcmVmcykgOiAobV9wdHIgPiBvLm1fcHRyKTsKLSAgICB9Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KLSAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA+IChjb25zdCB3cDxVPiYgbykgY29uc3QgewotICAgICAgICByZXR1cm4gKG1fcHRyID09IG8ubV9wdHIpID8gKG1fcmVmcyA+IG8ubV9yZWZzKSA6IChtX3B0ciA+IG8ubV9wdHIpOwotICAgIH0KLQotICAgIGlubGluZSBib29sIG9wZXJhdG9yIDwgKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAobV9wdHIgPT0gby5tX3B0cikgPyAobV9yZWZzIDwgby5tX3JlZnMpIDogKG1fcHRyIDwgby5tX3B0cik7Ci0gICAgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChtX3B0ciA9PSBvLm1fcHRyKSA/IChtX3JlZnMgPCBvLm1fcmVmcykgOiAobV9wdHIgPCBvLm1fcHRyKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7IHJldHVybiBtX3JlZnMgIT0gby5tX3JlZnM7IH0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBpbmxpbmUgYm9vbCBvcGVyYXRvciAhPSAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA9PSAobyk7IH0KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciA8PSAoY29uc3Qgd3A8VD4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA+IChvKTsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IGlubGluZSBib29sIG9wZXJhdG9yIDw9IChjb25zdCB3cDxVPiYgbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yID4gKG8pOyB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPj0gKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3IgPCAobyk7IH0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBpbmxpbmUgYm9vbCBvcGVyYXRvciA+PSAoY29uc3Qgd3A8VT4mIG8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciA8IChvKTsgfQotCi1wcml2YXRlOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFk+IGZyaWVuZCBjbGFzcyBzcDsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBZPiBmcmllbmQgY2xhc3Mgd3A7Ci0KLSAgICBUKiAgICAgICAgICAgICAgbV9wdHI7Ci0gICAgd2Vha3JlZl90eXBlKiAgIG1fcmVmczsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgd3A8VD4mIHZhbCk7Ci0KLSN1bmRlZiBDT01QQVJFX1dFQUsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBObyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGJlbG93IGhlcmUuCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci13cDxUPjo6d3AoVCogb3RoZXIpCi0gICAgOiBtX3B0cihvdGhlcikKLXsKLSAgICBpZiAob3RoZXIpIG1fcmVmcyA9IG90aGVyLT5jcmVhdGVXZWFrKHRoaXMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotd3A8VD46OndwKGNvbnN0IHdwPFQ+JiBvdGhlcikKLSAgICA6IG1fcHRyKG90aGVyLm1fcHRyKSwgbV9yZWZzKG90aGVyLm1fcmVmcykKLXsKLSAgICBpZiAobV9wdHIpIG1fcmVmcy0+aW5jV2Vhayh0aGlzKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXdwPFQ+Ojp3cChjb25zdCBzcDxUPiYgb3RoZXIpCi0gICAgOiBtX3B0cihvdGhlci5tX3B0cikKLXsKLSAgICBpZiAobV9wdHIpIHsKLSAgICAgICAgbV9yZWZzID0gbV9wdHItPmNyZWF0ZVdlYWsodGhpcyk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotd3A8VD46OndwKFUqIG90aGVyKQotICAgIDogbV9wdHIob3RoZXIpCi17Ci0gICAgaWYgKG90aGVyKSBtX3JlZnMgPSBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXdwPFQ+Ojp3cChjb25zdCB3cDxVPiYgb3RoZXIpCi0gICAgOiBtX3B0cihvdGhlci5tX3B0cikKLXsKLSAgICBpZiAobV9wdHIpIHsKLSAgICAgICAgbV9yZWZzID0gb3RoZXIubV9yZWZzOwotICAgICAgICBtX3JlZnMtPmluY1dlYWsodGhpcyk7Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotd3A8VD46OndwKGNvbnN0IHNwPFU+JiBvdGhlcikKLSAgICA6IG1fcHRyKG90aGVyLm1fcHRyKQotewotICAgIGlmIChtX3B0cikgewotICAgICAgICBtX3JlZnMgPSBtX3B0ci0+Y3JlYXRlV2Vhayh0aGlzKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci13cDxUPjo6fndwKCkKLXsKLSAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoVCogb3RoZXIpCi17Ci0gICAgd2Vha3JlZl90eXBlKiBuZXdSZWZzID0KLSAgICAgICAgb3RoZXIgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7Ci0gICAgaWYgKG1fcHRyKSBtX3JlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlcjsKLSAgICBtX3JlZnMgPSBuZXdSZWZzOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgd3A8VD4mIG90aGVyKQotewotICAgIHdlYWtyZWZfdHlwZSogb3RoZXJSZWZzKG90aGVyLm1fcmVmcyk7Ci0gICAgVCogb3RoZXJQdHIob3RoZXIubV9wdHIpOwotICAgIGlmIChvdGhlclB0cikgb3RoZXJSZWZzLT5pbmNXZWFrKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXJQdHI7Ci0gICAgbV9yZWZzID0gb3RoZXJSZWZzOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXdwPFQ+JiB3cDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgc3A8VD4mIG90aGVyKQotewotICAgIHdlYWtyZWZfdHlwZSogbmV3UmVmcyA9Ci0gICAgICAgIG90aGVyICE9IE5VTEwgPyBvdGhlci0+Y3JlYXRlV2Vhayh0aGlzKSA6IDA7Ci0gICAgVCogb3RoZXJQdHIob3RoZXIubV9wdHIpOwotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXJQdHI7Ci0gICAgbV9yZWZzID0gbmV3UmVmczsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci13cDxUPiYgd3A8VD46Om9wZXJhdG9yID0gKFUqIG90aGVyKQotewotICAgIHdlYWtyZWZfdHlwZSogbmV3UmVmcyA9Ci0gICAgICAgIG90aGVyID8gb3RoZXItPmNyZWF0ZVdlYWsodGhpcykgOiAwOwotICAgIGlmIChtX3B0cikgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXI7Ci0gICAgbV9yZWZzID0gbmV3UmVmczsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci13cDxUPiYgd3A8VD46Om9wZXJhdG9yID0gKGNvbnN0IHdwPFU+JiBvdGhlcikKLXsKLSAgICB3ZWFrcmVmX3R5cGUqIG90aGVyUmVmcyhvdGhlci5tX3JlZnMpOwotICAgIFUqIG90aGVyUHRyKG90aGVyLm1fcHRyKTsKLSAgICBpZiAob3RoZXJQdHIpIG90aGVyUmVmcy0+aW5jV2Vhayh0aGlzKTsKLSAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyUHRyOwotICAgIG1fcmVmcyA9IG90aGVyUmVmczsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci13cDxUPiYgd3A8VD46Om9wZXJhdG9yID0gKGNvbnN0IHNwPFU+JiBvdGhlcikKLXsKLSAgICB3ZWFrcmVmX3R5cGUqIG5ld1JlZnMgPQotICAgICAgICBvdGhlciAhPSBOVUxMID8gb3RoZXItPmNyZWF0ZVdlYWsodGhpcykgOiAwOwotICAgIFUqIG90aGVyUHRyKG90aGVyLm1fcHRyKTsKLSAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyUHRyOwotICAgIG1fcmVmcyA9IG5ld1JlZnM7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotdm9pZCB3cDxUPjo6c2V0X29iamVjdF9hbmRfcmVmcyhUKiBvdGhlciwgd2Vha3JlZl90eXBlKiByZWZzKQotewotICAgIGlmIChvdGhlcikgcmVmcy0+aW5jV2Vhayh0aGlzKTsKLSAgICBpZiAobV9wdHIpIG1fcmVmcy0+ZGVjV2Vhayh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyOwotICAgIG1fcmVmcyA9IHJlZnM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zcDxUPiB3cDxUPjo6cHJvbW90ZSgpIGNvbnN0Ci17Ci0gICAgc3A8VD4gcmVzdWx0OwotICAgIGlmIChtX3B0ciAmJiBtX3JlZnMtPmF0dGVtcHRJbmNTdHJvbmcoJnJlc3VsdCkpIHsKLSAgICAgICAgcmVzdWx0LnNldF9wb2ludGVyKG1fcHRyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgd3A8VD46OmNsZWFyKCkKLXsKLSAgICBpZiAobV9wdHIpIHsKLSAgICAgICAgbV9yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgICAgICBtX3B0ciA9IDA7Ci0gICAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBUZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCB3cDxUPiYgdmFsKQotewotICAgIHJldHVybiBwcmludFdlYWtQb2ludGVyKHRvLCB2YWwudW5zYWZlX2dldCgpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIHRoaXMgY2xhc3MganVzdCBzZXJ2ZXMgYXMgYSBuYW1lc3BhY2Ugc28gVFlQRTo6bW92ZVJlZmVyZW5jZXMgY2FuIHN0YXkKLS8vIHByaXZhdGUuCi0KLWNsYXNzIFJlZmVyZW5jZU1vdmVyIHsKLSAgICAvLyBTdHJvbmdSZWZlcmVuY2VDYXN0IGFuZCBXZWFrUmVmZXJlbmNlQ2FzdCBkbyB0aGUgaW1wZWRhbmNlIG1hdGNoaW5nCi0gICAgLy8gYmV0d2VlbiB0aGUgZ2VuZXJpYyAodm9pZCopIGltcGxlbWVudGF0aW9uIGluIFJlZmJhc2UgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAotICAgIC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBiZWxvdy4KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgotICAgIHN0cnVjdCBTdHJvbmdSZWZlcmVuY2VDYXN0IDogcHVibGljIFJlZmVyZW5jZUNvbnZlcnRlckJhc2UgewotICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRSZWZlcmVuY2VUeXBlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVvZiggc3A8VFlQRT4gKTsgfQotICAgICAgICB2aXJ0dWFsIHZvaWQqIGdldFJlZmVyZW5jZUJhc2Uodm9pZCBjb25zdCogcCkgY29uc3QgewotICAgICAgICAgICAgc3A8VFlQRT4gY29uc3QqIHNwdHIocmVpbnRlcnByZXRfY2FzdDxzcDxUWVBFPiBjb25zdCo+KHApKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBUWVBFOjpiYXNldHlwZSAqPihzcHRyLT5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRZUEU+Ci0gICAgc3RydWN0IFdlYWtSZWZlcmVuY2VDYXN0IDogcHVibGljIFJlZmVyZW5jZUNvbnZlcnRlckJhc2UgewotICAgICAgICB2aXJ0dWFsIHNpemVfdCBnZXRSZWZlcmVuY2VUeXBlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVvZiggd3A8VFlQRT4gKTsgfQotICAgICAgICB2aXJ0dWFsIHZvaWQqIGdldFJlZmVyZW5jZUJhc2Uodm9pZCBjb25zdCogcCkgY29uc3QgewotICAgICAgICAgICAgd3A8VFlQRT4gY29uc3QqIHNwdHIocmVpbnRlcnByZXRfY2FzdDx3cDxUWVBFPiBjb25zdCo+KHApKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBUWVBFOjpiYXNldHlwZSAqPihzcHRyLT51bnNhZmVfZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfTsKLQotcHVibGljOgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IHN0YXRpYyBpbmxpbmUKLSAgICB2b2lkIG1vdmVfcmVmZXJlbmNlcyhzcDxUWVBFPiogZCwgc3A8VFlQRT4gY29uc3QqIHMsIHNpemVfdCBuKSB7Ci0gICAgICAgIG1lbW1vdmUoZCwgcywgbipzaXplb2Yoc3A8VFlQRT4pKTsKLSAgICAgICAgU3Ryb25nUmVmZXJlbmNlQ2FzdDxUWVBFPiBjYXN0ZXI7Ci0gICAgICAgIFRZUEU6Om1vdmVSZWZlcmVuY2VzKGQsIHMsIG4sIGNhc3Rlcik7Ci0gICAgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IHN0YXRpYyBpbmxpbmUKLSAgICB2b2lkIG1vdmVfcmVmZXJlbmNlcyh3cDxUWVBFPiogZCwgd3A8VFlQRT4gY29uc3QqIHMsIHNpemVfdCBuKSB7Ci0gICAgICAgIG1lbW1vdmUoZCwgcywgbipzaXplb2Yod3A8VFlQRT4pKTsKLSAgICAgICAgV2Vha1JlZmVyZW5jZUNhc3Q8VFlQRT4gY2FzdGVyOwotICAgICAgICBUWVBFOjptb3ZlUmVmZXJlbmNlcyhkLCBzLCBuLCBjYXN0ZXIpOwotICAgIH0KLX07Ci0KLS8vIHNwZWNpYWxpemF0aW9uIGZvciBtb3Zpbmcgc3A8PiBhbmQgd3A8PiB0eXBlcy4KLS8vIHRoZXNlIGFyZSB1c2VkIGJ5IHRoZSBbU29ydGVkfEtleWVkXVZlY3Rvcjw+IGltcGxlbWVudGF0aW9ucwotLy8gc3A8PiBhbmQgd3A8PiBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZXkgZG8gbm90Ci0vLyBoYXZlIHRyaXZpYWwgY29weSBvcGVyYXRpb24gaW4gdGhlIGdlbmVyYWwgY2FzZSAoc2VlIFJlZkJhc2UuY3BwCi0vLyB3aGVuIERFQlVHIG9wcyBhcmUgZW5hYmxlZCksIGJ1dCBjYW4gYmUgaW1wbGVtZW50ZWQgdmVyeQotLy8gZWZmaWNpZW50bHkgaW4gbW9zdCBjYXNlcy4KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIG1vdmVfZm9yd2FyZF90eXBlKHNwPFRZUEU+KiBkLCBzcDxUWVBFPiBjb25zdCogcywgc2l6ZV90IG4pIHsKLSAgICBSZWZlcmVuY2VNb3Zlcjo6bW92ZV9yZWZlcmVuY2VzKGQsIHMsIG4pOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgbW92ZV9iYWNrd2FyZF90eXBlKHNwPFRZUEU+KiBkLCBzcDxUWVBFPiBjb25zdCogcywgc2l6ZV90IG4pIHsKLSAgICBSZWZlcmVuY2VNb3Zlcjo6bW92ZV9yZWZlcmVuY2VzKGQsIHMsIG4pOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgbW92ZV9mb3J3YXJkX3R5cGUod3A8VFlQRT4qIGQsIHdwPFRZUEU+IGNvbnN0KiBzLCBzaXplX3QgbikgewotICAgIFJlZmVyZW5jZU1vdmVyOjptb3ZlX3JlZmVyZW5jZXMoZCwgcywgbik7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotdm9pZCBtb3ZlX2JhY2t3YXJkX3R5cGUod3A8VFlQRT4qIGQsIHdwPFRZUEU+IGNvbnN0KiBzLCBzaXplX3QgbikgewotICAgIFJlZmVyZW5jZU1vdmVyOjptb3ZlX3JlZmVyZW5jZXMoZCwgcywgbik7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX1JFRl9CQVNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU2hhcmVkQnVmZmVyLmggYi9pbmNsdWRlL3V0aWxzL1NoYXJlZEJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDUwOGIwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU2hhcmVkQnVmZmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TSEFSRURfQlVGRkVSX0gKLSNkZWZpbmUgQU5EUk9JRF9TSEFSRURfQlVGRkVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTaGFyZWRCdWZmZXIKLXsKLXB1YmxpYzoKLQotICAgIC8qIGZsYWdzIHRvIHVzZSB3aXRoIHJlbGVhc2UoKSAqLwotICAgIGVudW0gewotICAgICAgICBlS2VlcFN0b3JhZ2UgPSAweDAwMDAwMDAxCi0gICAgfTsKLQotICAgIC8qISBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBzaXplICdzaXplJyBhbmQgYWNxdWlyZSgpIGl0LgotICAgICAqICBjYWxsIHJlbGVhc2UoKSB0byBmcmVlIGl0LgotICAgICAqLwotICAgIHN0YXRpYyAgICAgICAgICBTaGFyZWRCdWZmZXIqICAgICAgICAgICBhbGxvYyhzaXplX3Qgc2l6ZSk7Ci0gICAgCi0gICAgLyohIGZyZWUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIFNoYXJlZEJ1ZmZlci4KLSAgICAgKiBGYWlscyBpZiB0aGVyZSBhcmUgYW55IHVzZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFNoYXJlZEJ1ZmZlci4KLSAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIGJ1ZmZlciBtdXN0IGhhdmUgYmVlbiByZWxlYXNlIGJ5IGFsbCBpdHMKLSAgICAgKiB1c2Vycy4KLSAgICAgKi8KLSAgICBzdGF0aWMgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgZGVhbGxvYyhjb25zdCBTaGFyZWRCdWZmZXIqIHJlbGVhc2VkKTsKLSAgICAKLSAgICAvLyEgZ2V0IHRoZSBTaGFyZWRCdWZmZXIgZnJvbSB0aGUgZGF0YSBwb2ludGVyCi0gICAgc3RhdGljICBpbmxpbmUgIGNvbnN0IFNoYXJlZEJ1ZmZlciogICAgIHNoYXJlZEJ1ZmZlcihjb25zdCB2b2lkKiBkYXRhKTsKLQotICAgIC8vISBhY2Nlc3MgdGhlIGRhdGEgZm9yIHJlYWQKLSAgICBpbmxpbmUgICAgICAgICAgY29uc3Qgdm9pZCogICAgICAgICAgICAgZGF0YSgpIGNvbnN0OwotICAgIAotICAgIC8vISBhY2Nlc3MgdGhlIGRhdGEgZm9yIHJlYWQvd3JpdGUKLSAgICBpbmxpbmUgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZGF0YSgpOwotCi0gICAgLy8hIGdldCBzaXplIG9mIHRoZSBidWZmZXIKLSAgICBpbmxpbmUgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0OwotIAotICAgIC8vISBnZXQgYmFjayBhIFNoYXJlZEJ1ZmZlciBvYmplY3QgZnJvbSBpdHMgZGF0YQotICAgIHN0YXRpYyAgaW5saW5lICBTaGFyZWRCdWZmZXIqICAgICAgICAgICBidWZmZXJGcm9tRGF0YSh2b2lkKiBkYXRhKTsKLSAgICAKLSAgICAvLyEgZ2V0IGJhY2sgYSBTaGFyZWRCdWZmZXIgb2JqZWN0IGZyb20gaXRzIGRhdGEKLSAgICBzdGF0aWMgIGlubGluZSAgY29uc3QgU2hhcmVkQnVmZmVyKiAgICAgYnVmZmVyRnJvbURhdGEoY29uc3Qgdm9pZCogZGF0YSk7Ci0KLSAgICAvLyEgZ2V0IHRoZSBzaXplIG9mIGEgU2hhcmVkQnVmZmVyIG9iamVjdCBmcm9tIGl0cyBkYXRhCi0gICAgc3RhdGljICBpbmxpbmUgIHNpemVfdCAgICAgICAgICAgICAgICAgIHNpemVGcm9tRGF0YShjb25zdCB2b2lkKiBkYXRhKTsKLSAgICAKLSAgICAvLyEgZWRpdCB0aGUgYnVmZmVyIChnZXQgYSB3cml0dGFibGUsIG9yIG5vbi1jb25zdCwgdmVyc2lvbiBvZiBpdCkKLSAgICAgICAgICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiAgICAgICAgICAgZWRpdCgpIGNvbnN0OwotCi0gICAgLy8hIGVkaXQgdGhlIGJ1ZmZlciwgcmVzaXppbmcgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgIFNoYXJlZEJ1ZmZlciogICAgICAgICAgIGVkaXRSZXNpemUoc2l6ZV90IHNpemUpIGNvbnN0OwotCi0gICAgLy8hIGxpa2UgZWRpdCgpIGJ1dCBmYWlscyBpZiBhIGNvcHkgaXMgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiAgICAgICAgICAgYXR0ZW1wdEVkaXQoKSBjb25zdDsKLSAgICAKLSAgICAvLyEgcmVzaXplIGFuZCBlZGl0IHRoZSBidWZmZXIsIGxvb3NlIGl0J3MgY29udGVudC4KLSAgICAgICAgICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiAgICAgICAgICAgcmVzZXQoc2l6ZV90IHNpemUpIGNvbnN0OwotCi0gICAgLy8hIGFjcXVpcmUvcmVsZWFzZSBhIHJlZmVyZW5jZSBvbiB0aGlzIGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBhY3F1aXJlKCkgY29uc3Q7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIC8qISByZWxlYXNlIGEgcmVmZXJlbmNlIG9uIHRoaXMgYnVmZmVyLCB3aXRoIHRoZSBvcHRpb24gb2Ygbm90Ci0gICAgICogZnJlZWluZyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBpdCBpZiBpdCB3YXMgdGhlIGxhc3QgcmVmZXJlbmNlCi0gICAgICogcmV0dXJucyB0aGUgcHJldmlvdXMgcmVmZXJlbmNlIGNvdW50Ci0gICAgICovICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgcmVsZWFzZSh1aW50MzJfdCBmbGFncyA9IDApIGNvbnN0OwotICAgIAotICAgIC8vISByZXR1cm5zIHdldGhlciBvciBub3Qgd2UncmUgdGhlIG9ubHkgb3duZXIKLSAgICBpbmxpbmUgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgb25seU93bmVyKCkgY29uc3Q7Ci0gICAgCi0KLXByaXZhdGU6Ci0gICAgICAgIGlubGluZSBTaGFyZWRCdWZmZXIoKSB7IH0KLSAgICAgICAgaW5saW5lIH5TaGFyZWRCdWZmZXIoKSB7IH0KLSAgICAgICAgaW5saW5lIFNoYXJlZEJ1ZmZlcihjb25zdCBTaGFyZWRCdWZmZXImKTsKLSAKLSAgICAgICAgLy8gMTYgYnl0ZXMuIG11c3QgYmUgc2l6ZWQgdG8gcHJlc2VydmUgY29ycmVjdCBhbGluZ21lbnQuCi0gICAgICAgIG11dGFibGUgaW50MzJfdCAgICAgICAgbVJlZnM7Ci0gICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgbVNpemU7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgbVJlc2VydmVkWzJdOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IFNoYXJlZEJ1ZmZlciogU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIoY29uc3Qgdm9pZCogZGF0YSkgewotICAgIHJldHVybiBkYXRhID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTaGFyZWRCdWZmZXIgKj4oZGF0YSktMSA6IDA7Ci19Ci0KLWNvbnN0IHZvaWQqIFNoYXJlZEJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGhpcyArIDE7Ci19Ci0KLXZvaWQqIFNoYXJlZEJ1ZmZlcjo6ZGF0YSgpIHsKLSAgICByZXR1cm4gdGhpcyArIDE7Ci19Ci0KLXNpemVfdCBTaGFyZWRCdWZmZXI6OnNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TaXplOwotfQotCi1TaGFyZWRCdWZmZXIqIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEodm9pZCogZGF0YSkKLXsKLSAgICByZXR1cm4gKChTaGFyZWRCdWZmZXIqKWRhdGEpLTE7Ci19Ci0gICAgCi1jb25zdCBTaGFyZWRCdWZmZXIqIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEoY29uc3Qgdm9pZCogZGF0YSkKLXsKLSAgICByZXR1cm4gKChjb25zdCBTaGFyZWRCdWZmZXIqKWRhdGEpLTE7Ci19Ci0KLXNpemVfdCBTaGFyZWRCdWZmZXI6OnNpemVGcm9tRGF0YShjb25zdCB2b2lkKiBkYXRhKQotewotICAgIHJldHVybiAoKChjb25zdCBTaGFyZWRCdWZmZXIqKWRhdGEpLTEpLT5tU2l6ZTsKLX0KLQotYm9vbCBTaGFyZWRCdWZmZXI6Om9ubHlPd25lcigpIGNvbnN0IHsKLSAgICByZXR1cm4gKG1SZWZzID09IDEpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmggYi9pbmNsdWRlL3V0aWxzL1NpbmdsZXRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDJjZTIxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU2luZ2xldG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1VUSUxTX1NJTkdMRVRPTl9ICi0jZGVmaW5lIEFORFJPSURfVVRJTFNfU0lOR0xFVE9OX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgotY2xhc3MgQU5EUk9JRF9BUEkgU2luZ2xldG9uCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFRZUEUmIGdldEluc3RhbmNlKCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOwotICAgICAgICBUWVBFKiBpbnN0YW5jZSA9IHNJbnN0YW5jZTsKLSAgICAgICAgaWYgKGluc3RhbmNlID09IDApIHsKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IFRZUEUoKTsKLSAgICAgICAgICAgIHNJbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAqaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgaGFzSW5zdGFuY2UoKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7Ci0gICAgICAgIHJldHVybiBzSW5zdGFuY2UgIT0gMDsKLSAgICB9Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgflNpbmdsZXRvbigpIHsgfTsKLSAgICBTaW5nbGV0b24oKSB7IH07Ci0KLXByaXZhdGU6Ci0gICAgU2luZ2xldG9uKGNvbnN0IFNpbmdsZXRvbiYpOwotICAgIFNpbmdsZXRvbiYgb3BlcmF0b3IgPSAoY29uc3QgU2luZ2xldG9uJik7Ci0gICAgc3RhdGljIE11dGV4IHNMb2NrOwotICAgIHN0YXRpYyBUWVBFKiBzSW5zdGFuY2U7Ci19OwotCi0vKgotICogdXNlIEFORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShUWVBFKSBpbiB5b3VyIGltcGxlbWVudGF0aW9uIGZpbGUKLSAqIChlZzogPFRZUEU+LmNwcCkgdG8gY3JlYXRlIHRoZSBzdGF0aWMgaW5zdGFuY2Ugb2YgU2luZ2xldG9uPD4ncyBhdHRyaWJ1dGVzLAotICogYW5kIGF2b2lkIHRvIGhhdmUgYSBjb3B5IG9mIHRoZW0gaW4gZWFjaCBjb21waWxhdGlvbiB1bml0cyBTaW5nbGV0b248VFlQRT4KLSAqIGlzIHVzZWQuCi0gKiBOT1RFOiB3ZSB1c2UgYSB2ZXJzaW9uIG9mIE11dGV4IGN0b3IgdGhhdCB0YWtlcyBhIHBhcmFtZXRlciwgYmVjYXVzZQotICogZm9yIHNvbWUgdW5rbm93biByZWFzb24gdXNpbmcgdGhlIGRlZmF1bHQgY3RvciBkb2Vzbid0IGVtaXQgdGhlIHZhcmlhYmxlIQotICovCi0KLSNkZWZpbmUgQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKFRZUEUpICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGUgY2xhc3MgU2luZ2xldG9uPCBUWVBFID47ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRlbXBsYXRlPD4gTXV0ZXggU2luZ2xldG9uPCBUWVBFID46OnNMb2NrKE11dGV4OjpQUklWQVRFKTsgIFwKLSAgICB0ZW1wbGF0ZTw+IFRZUEUqIFNpbmdsZXRvbjwgVFlQRSA+OjpzSW5zdGFuY2UoMCk7Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9VVElMU19TSU5HTEVUT05fSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1NvcnRlZFZlY3Rvci5oIGIvaW5jbHVkZS91dGlscy9Tb3J0ZWRWZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU5OGFlYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1NvcnRlZFZlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU09SVEVEX1ZFQ1RPUl9ICi0jZGVmaW5lIEFORFJPSURfU09SVEVEX1ZFQ1RPUl9ICi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3RvckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KLWNsYXNzIFNvcnRlZFZlY3RvciA6IHByaXZhdGUgU29ydGVkVmVjdG9ySW1wbAotewotICAgIGZyaWVuZCBjbGFzcyBWZWN0b3I8VFlQRT47Ci0KLXB1YmxpYzoKLSAgICAgICAgICAgIHR5cGVkZWYgVFlQRSAgICB2YWx1ZV90eXBlOwotICAgIAotICAgIC8qISAKLSAgICAgKiBDb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzCi0gICAgICovCi0gICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+U29ydGVkVmVjdG9yKCk7Ci0KLSAgICAvKiEgY29weSBvcGVyYXRvciAqLwotICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgICBvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgY29uc3Q7ICAgIAotICAgIFNvcnRlZFZlY3RvcjxUWVBFPiYgICAgICAgICBvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocyk7ICAgIAotCi0gICAgLyoKLSAgICAgKiBlbXB0eSB0aGUgdmVjdG9yCi0gICAgICovCi0KLSAgICBpbmxpbmUgIHZvaWQgICAgICAgICAgICBjbGVhcigpICAgICAgICAgICAgIHsgVmVjdG9ySW1wbDo6Y2xlYXIoKTsgfQotCi0gICAgLyohIAotICAgICAqIHZlY3RvciBzdGF0cwotICAgICAqLwotCi0gICAgLy8hIHJldHVybnMgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB2ZWN0b3IKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6c2l6ZSgpOyB9Ci0gICAgLy8hIHJldHVybnMgd2V0aGVyIG9yIG5vdCB0aGUgdmVjdG9yIGlzIGVtcHR5Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0ICAgICAgICAgICAgIHsgcmV0dXJuIFZlY3RvckltcGw6OmlzRW1wdHkoKTsgfQotICAgIC8vISByZXR1cm5zIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzdG9yZWQgd2l0aG91dCByZWFsbG9jYXRpbmcgdGhlIGJhY2tpbmcgc3RvcmUKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICBjYXBhY2l0eSgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6Y2FwYWNpdHkoKTsgfQotICAgIC8vISBzZXRzdCB0aGUgY2FwYWNpdHkuIGNhcGFjaXR5IGNhbiBuZXZlciBiZSByZWR1Y2VkIGxlc3MgdGhhbiBzaXplKCkKLSAgICBpbmxpbmUgIHNzaXplX3QgICAgICAgICBzZXRDYXBhY2l0eShzaXplX3Qgc2l6ZSkgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6c2V0Q2FwYWNpdHkoc2l6ZSk7IH0KLQotICAgIC8qISAKLSAgICAgKiBDLXN0eWxlIGFycmF5IGFjY2VzcwotICAgICAqLwotICAgICAKLSAgICAvLyEgcmVhZC1vbmx5IEMtc3R5bGUgYWNjZXNzIAotICAgIGlubGluZSAgY29uc3QgVFlQRSogICAgIGFycmF5KCkgY29uc3Q7Ci0KLSAgICAvLyEgcmVhZC13cml0ZSBDLXN0eWxlIGFjY2Vzcy4gQkUgVkVSWSBDQVJFRlVMIHdoZW4gbW9kaWZ5aW5nIHRoZSBhcnJheQotICAgIC8vISB5b3UgdXN0IGtlZXAgaXQgc29ydGVkISBZb3UgdXN1YWxseSBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbi4KLSAgICAgICAgICAgIFRZUEUqICAgICAgICAgICBlZGl0QXJyYXkoKTsKLQotICAgICAgICAgICAgLy8hIGZpbmRzIHRoZSBpbmRleCBvZiBhbiBpdGVtCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBUWVBFJiBpdGVtKSBjb25zdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8hIGZpbmRzIHdoZXJlIHRoaXMgaXRlbSBzaG91bGQgYmUgaW5zZXJ0ZWQKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBvcmRlck9mKGNvbnN0IFRZUEUmIGl0ZW0pIGNvbnN0OwotICAgICAgICAgICAgCi0gICAgCi0gICAgLyohIAotICAgICAqIGFjY2Vzc29ycwotICAgICAqLwotCi0gICAgLy8hIHJlYWQtb25seSBhY2Nlc3MgdG8gYW4gaXRlbSBhdCBhIGdpdmVuIGluZGV4Ci0gICAgaW5saW5lICBjb25zdCBUWVBFJiAgICAgb3BlcmF0b3IgW10gKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgLy8hIGFsdGVybmF0ZSBuYW1lIGZvciBvcGVyYXRvciBbXQotICAgIGlubGluZSAgY29uc3QgVFlQRSYgICAgIGl0ZW1BdChzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIC8vISBzdGFjay11c2FnZSBvZiB0aGUgdmVjdG9yLiByZXR1cm5zIHRoZSB0b3Agb2YgdGhlIHN0YWNrIChsYXN0IGVsZW1lbnQpCi0gICAgICAgICAgICBjb25zdCBUWVBFJiAgICAgdG9wKCkgY29uc3Q7Ci0gICAgLy8hIHNhbWUgYXMgb3BlcmF0b3IgW10sIGJ1dCBhbGxvd3MgdG8gYWNjZXNzIHRoZSB2ZWN0b3IgYmFja3dhcmQgKGZyb20gdGhlIGVuZCkgd2l0aCBhIG5lZ2F0aXZlIGluZGV4Ci0gICAgICAgICAgICBjb25zdCBUWVBFJiAgICAgbWlycm9ySXRlbUF0KHNzaXplX3QgaW5kZXgpIGNvbnN0OwotCi0gICAgLyohCi0gICAgICogbW9kaWZpbmcgdGhlIGFycmF5Ci0gICAgICovCi0KLSAgICAgICAgICAgIC8vISBhZGQgYW4gaXRlbSBpbiB0aGUgcmlnaHQgcGxhY2UgKGFuZCByZXBsYWNlIHRoZSBvbmUgdGhhdCBpcyB0aGVyZSkKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3QgVFlQRSYgaXRlbSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vISBlZGl0SXRlbUF0KCkgTVVTVCBOT1QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGlzIGl0ZW0KLSAgICAgICAgICAgIFRZUEUmICAgICAgICAgICBlZGl0SXRlbUF0KHNpemVfdCBpbmRleCkgewotICAgICAgICAgICAgICAgIHJldHVybiAqKCBzdGF0aWNfY2FzdDxUWVBFICo+KFZlY3RvckltcGw6OmVkaXRJdGVtTG9jYXRpb24oaW5kZXgpKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyEgbWVyZ2VzIGEgdmVjdG9yIGludG8gdGhpcyBvbmUKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBtZXJnZShjb25zdCBWZWN0b3I8VFlQRT4mIHZlY3Rvcik7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgbWVyZ2UoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiB2ZWN0b3IpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyEgcmVtb3ZlcyBhbiBpdGVtCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlKGNvbnN0IFRZUEUmKTsKLQotICAgIC8vISByZW1vdmUgc2V2ZXJhbCBpdGVtcwotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIHJlbW92ZUl0ZW1zQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQgPSAxKTsKLSAgICAvLyEgcmVtb3ZlIG9uZSBpdGVtCi0gICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlQXQoc2l6ZV90IGluZGV4KSAgeyByZXR1cm4gcmVtb3ZlSXRlbXNBdChpbmRleCk7IH0KLSAgICAgICAgICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCAgICBkb19jb25zdHJ1Y3Qodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX2Rlc3Ryb3kodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX3NwbGF0KHZvaWQqIGRlc3QsIGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCBudW0pIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCAgICBkb19tb3ZlX2ZvcndhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgICAgIGRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0OwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgZnJvbSBoZXJlLi4uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1Tb3J0ZWRWZWN0b3I8VFlQRT46OlNvcnRlZFZlY3RvcigpCi0gICAgOiBTb3J0ZWRWZWN0b3JJbXBsKHNpemVvZihUWVBFKSwKLSAgICAgICAgICAgICAgICAoKHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY3RvciAgID8gSEFTX1RSSVZJQUxfQ1RPUiAgIDogMCkKLSAgICAgICAgICAgICAgICB8KHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvciAgID8gSEFTX1RSSVZJQUxfRFRPUiAgIDogMCkKLSAgICAgICAgICAgICAgICB8KHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSAgID8gSEFTX1RSSVZJQUxfQ09QWSAgIDogMCkpCi0gICAgICAgICAgICAgICAgKQotewotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVNvcnRlZFZlY3RvcjxUWVBFPjo6U29ydGVkVmVjdG9yKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKQotICAgIDogU29ydGVkVmVjdG9ySW1wbChyaHMpIHsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1Tb3J0ZWRWZWN0b3I8VFlQRT46On5Tb3J0ZWRWZWN0b3IoKSB7Ci0gICAgZmluaXNoX3ZlY3RvcigpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLVNvcnRlZFZlY3RvcjxUWVBFPiYgU29ydGVkVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgewotICAgIFNvcnRlZFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHJocyk7Ci0gICAgcmV0dXJuICp0aGlzOyAKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIFNvcnRlZFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpIGNvbnN0IHsKLSAgICBTb3J0ZWRWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChyaHMpOwotICAgIHJldHVybiAqdGhpczsgCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSogU29ydGVkVmVjdG9yPFRZUEU+OjphcnJheSgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVFlQRSAqPihhcnJheUltcGwoKSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotVFlQRSogU29ydGVkVmVjdG9yPFRZUEU+OjplZGl0QXJyYXkoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFRZUEUgKj4oZWRpdEFycmF5SW1wbCgpKTsKLX0KLQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFRZUEUmIFNvcnRlZFZlY3RvcjxUWVBFPjo6b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBhc3NlcnQoIGluZGV4PHNpemUoKSApOwotICAgIHJldHVybiAqKGFycmF5KCkgKyBpbmRleCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgU29ydGVkVmVjdG9yPFRZUEU+OjppdGVtQXQoc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG9wZXJhdG9yW10oaW5kZXgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFRZUEUmIFNvcnRlZFZlY3RvcjxUWVBFPjo6bWlycm9ySXRlbUF0KHNzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBhc3NlcnQoIChpbmRleD4wID8gaW5kZXggOiAtaW5kZXgpPHNpemUoKSApOwotICAgIHJldHVybiAqKGFycmF5KCkgKyAoKGluZGV4PDApID8gKHNpemUoKS1pbmRleCkgOiBpbmRleCkpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFRZUEUmIFNvcnRlZFZlY3RvcjxUWVBFPjo6dG9wKCkgY29uc3QgewotICAgIHJldHVybiAqKGFycmF5KCkgKyBzaXplKCkgLSAxKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFNvcnRlZFZlY3RvcjxUWVBFPjo6YWRkKGNvbnN0IFRZUEUmIGl0ZW0pIHsKLSAgICByZXR1cm4gU29ydGVkVmVjdG9ySW1wbDo6YWRkKCZpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFNvcnRlZFZlY3RvcjxUWVBFPjo6aW5kZXhPZihjb25zdCBUWVBFJiBpdGVtKSBjb25zdCB7Ci0gICAgcmV0dXJuIFNvcnRlZFZlY3RvckltcGw6OmluZGV4T2YoJml0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNpemVfdCBTb3J0ZWRWZWN0b3I8VFlQRT46Om9yZGVyT2YoY29uc3QgVFlQRSYgaXRlbSkgY29uc3QgewotICAgIHJldHVybiBTb3J0ZWRWZWN0b3JJbXBsOjpvcmRlck9mKCZpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFNvcnRlZFZlY3RvcjxUWVBFPjo6bWVyZ2UoY29uc3QgVmVjdG9yPFRZUEU+JiB2ZWN0b3IpIHsKLSAgICByZXR1cm4gU29ydGVkVmVjdG9ySW1wbDo6bWVyZ2UocmVpbnRlcnByZXRfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4odmVjdG9yKSk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotc3NpemVfdCBTb3J0ZWRWZWN0b3I8VFlQRT46Om1lcmdlKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgdmVjdG9yKSB7Ci0gICAgcmV0dXJuIFNvcnRlZFZlY3RvckltcGw6Om1lcmdlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU29ydGVkVmVjdG9ySW1wbCY+KHZlY3RvcikpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgU29ydGVkVmVjdG9yPFRZUEU+OjpyZW1vdmUoY29uc3QgVFlQRSYgaXRlbSkgewotICAgIHJldHVybiBTb3J0ZWRWZWN0b3JJbXBsOjpyZW1vdmUoJml0ZW0pOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgU29ydGVkVmVjdG9yPFRZUEU+OjpyZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50KSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQoaW5kZXgsIGNvdW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFNvcnRlZFZlY3RvcjxUWVBFPjo6ZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0IHsKLSAgICBjb25zdHJ1Y3RfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oc3RvcmFnZSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBTb3J0ZWRWZWN0b3I8VFlQRT46OmRvX2Rlc3Ryb3kodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGRlc3Ryb3lfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oc3RvcmFnZSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBTb3J0ZWRWZWN0b3I8VFlQRT46OmRvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGNvcHlfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KGZyb20pLCBudW0gKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLXZvaWQgU29ydGVkVmVjdG9yPFRZUEU+Ojpkb19zcGxhdCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgc3BsYXRfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KGl0ZW0pLCBudW0gKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLXZvaWQgU29ydGVkVmVjdG9yPFRZUEU+Ojpkb19tb3ZlX2ZvcndhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIG1vdmVfZm9yd2FyZF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oZnJvbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBTb3J0ZWRWZWN0b3I8VFlQRT46OmRvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIG1vdmVfYmFja3dhcmRfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KGZyb20pLCBudW0gKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLWludCBTb3J0ZWRWZWN0b3I8VFlQRT46OmRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gY29tcGFyZV90eXBlKCAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4obGhzKSwgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KHJocykgKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfU09SVEVEX1ZFQ1RPUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1N0b3BXYXRjaC5oIGIvaW5jbHVkZS91dGlscy9TdG9wV2F0Y2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzZGQzYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1N0b3BXYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVE9QV0FUQ0hfSAotI2RlZmluZSBBTkRST0lEX1NUT1BXQVRDSF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdG9wV2F0Y2gKLXsKLXB1YmxpYzoKLSAgICAgICAgU3RvcFdhdGNoKCAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGNsb2NrID0gU1lTVEVNX1RJTUVfTU9OT1RPTklDLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotICAgICAgICB+U3RvcFdhdGNoKCk7Ci0gICAgICAgIAotICAgICAgICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gICAgICAgIG5zZWNzX3QgICAgIGxhcCgpOwotICAgICAgICBuc2Vjc190ICAgICBlbGFwc2VkVGltZSgpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgIAotcHJpdmF0ZToKLSAgICBjb25zdCBjaGFyKiAgICAgbU5hbWU7Ci0gICAgaW50ICAgICAgICAgICAgIG1DbG9jazsKLSAgICB1aW50MzJfdCAgICAgICAgbUZsYWdzOwotICAgIAotICAgIHN0cnVjdCBsYXBfdCB7Ci0gICAgICAgIG5zZWNzX3QgICAgIHNvRmFyOwotICAgICAgICBuc2Vjc190ICAgICB0aGlzTGFwOwotICAgIH07Ci0gICAgCi0gICAgbnNlY3NfdCAgICAgICAgIG1TdGFydFRpbWU7Ci0gICAgbGFwX3QgICAgICAgICAgIG1MYXBzWzhdOwotICAgIGludCAgICAgICAgICAgICBtTnVtTGFwczsKLX07Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfU1RPUFdBVENIX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaCBiL2luY2x1ZGUvdXRpbHMvU3RyaW5nMTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwZjQwNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1N0cmluZzE2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVFJJTkcxNl9ICi0jZGVmaW5lIEFORFJPSURfU1RSSU5HMTZfSAotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2hhcmVkQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVW5pY29kZS5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZXh0ZXJuICJDIiB7Ci0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN0cmluZzg7Ci1jbGFzcyBUZXh0T3V0cHV0OwotCi0vLyEgVGhpcyBpcyBhIHN0cmluZyBob2xkaW5nIFVURi0xNiBjaGFyYWN0ZXJzLgotY2xhc3MgU3RyaW5nMTYKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY29uc3QgU3RyaW5nMTYmIG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihjb25zdCBTdHJpbmcxNiYgbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJlZ2luPTApOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihjb25zdCBjaGFyMTZfdCogbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KGNvbnN0IGNoYXIxNl90KiBvLCBzaXplX3QgbGVuKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY29uc3QgU3RyaW5nOCYgbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KGNvbnN0IGNoYXIqIG8pOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNihjb25zdCBjaGFyKiBvLCBzaXplX3QgbGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+U3RyaW5nMTYoKTsKLSAgICAKLSAgICBpbmxpbmUgIGNvbnN0IGNoYXIxNl90KiAgICAgc3RyaW5nKCkgY29uc3Q7Ci0gICAgaW5saW5lICBzaXplX3QgICAgICAgICAgICAgIHNpemUoKSBjb25zdDsKLSAgICAKLSAgICBpbmxpbmUgIGNvbnN0IFNoYXJlZEJ1ZmZlciogc2hhcmVkQnVmZmVyKCkgY29uc3Q7Ci0gICAgCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNldFRvKGNvbnN0IFN0cmluZzE2JiBvdGhlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlciwgc2l6ZV90IGxlbik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IFN0cmluZzE2JiBvdGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJlZ2luPTApOwotICAgIAotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmQoY29uc3QgU3RyaW5nMTYmIG90aGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgYXBwZW5kKGNvbnN0IGNoYXIxNl90KiBvdGhlciwgc2l6ZV90IGxlbik7Ci0gICAgICAgICAgICAKLSAgICBpbmxpbmUgIFN0cmluZzE2JiAgICAgICAgICAgb3BlcmF0b3I9KGNvbnN0IFN0cmluZzE2JiBvdGhlcik7Ci0gICAgCi0gICAgaW5saW5lICBTdHJpbmcxNiYgICAgICAgICAgIG9wZXJhdG9yKz0oY29uc3QgU3RyaW5nMTYmIG90aGVyKTsKLSAgICBpbmxpbmUgIFN0cmluZzE2ICAgICAgICAgICAgb3BlcmF0b3IrKGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgaW5zZXJ0KHNpemVfdCBwb3MsIGNvbnN0IGNoYXIxNl90KiBjaHJzKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgaW5zZXJ0KHNpemVfdCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyMTZfdCogY2hycywgc2l6ZV90IGxlbik7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICAgICAgZmluZEZpcnN0KGNoYXIxNl90IGMpIGNvbnN0OwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICBmaW5kTGFzdChjaGFyMTZfdCBjKSBjb25zdDsKLQotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBzdGFydHNXaXRoKGNvbnN0IFN0cmluZzE2JiBwcmVmaXgpIGNvbnN0OwotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBzdGFydHNXaXRoKGNvbnN0IGNoYXIxNl90KiBwcmVmaXgpIGNvbnN0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIG1ha2VMb3dlcigpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlcGxhY2VBbGwoY2hhcjE2X3QgcmVwbGFjZVRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcjE2X3Qgd2l0aFRoaXMpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlbW92ZShzaXplX3QgbGVuLCBzaXplX3QgYmVnaW49MCk7Ci0KLSAgICBpbmxpbmUgIGludCAgICAgICAgICAgICAgICAgY29tcGFyZShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwotCi0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPChjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcjw9KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj49KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPihjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0OwotICAgIAotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcjwoY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8PShjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yIT0oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+PShjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj4oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdDsKLSAgICAKLSAgICBpbmxpbmUgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhcjE2X3QqKCkgY29uc3Q7Ci0gICAgCi1wcml2YXRlOgotICAgICAgICAgICAgY29uc3QgY2hhcjE2X3QqICAgICBtU3RyaW5nOwotfTsKLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3QgU3RyaW5nMTYmIHZhbCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm8gdXNlciBzZXJ2aWNhYmxlIHBhcnRzIGJlbG93LgotCi1pbmxpbmUgaW50IGNvbXBhcmVfdHlwZShjb25zdCBTdHJpbmcxNiYgbGhzLCBjb25zdCBTdHJpbmcxNiYgcmhzKQotewotICAgIHJldHVybiBsaHMuY29tcGFyZShyaHMpOwotfQotCi1pbmxpbmUgaW50IHN0cmljdGx5X29yZGVyX3R5cGUoY29uc3QgU3RyaW5nMTYmIGxocywgY29uc3QgU3RyaW5nMTYmIHJocykKLXsKLSAgICByZXR1cm4gY29tcGFyZV90eXBlKGxocywgcmhzKSA8IDA7Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyMTZfdCogU3RyaW5nMTY6OnN0cmluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TdHJpbmc7Ci19Ci0KLWlubGluZSBzaXplX3QgU3RyaW5nMTY6OnNpemUoKSBjb25zdAotewotICAgIHJldHVybiBTaGFyZWRCdWZmZXI6OnNpemVGcm9tRGF0YShtU3RyaW5nKS9zaXplb2YoY2hhcjE2X3QpLTE7Ci19Ci0KLWlubGluZSBjb25zdCBTaGFyZWRCdWZmZXIqIFN0cmluZzE2OjpzaGFyZWRCdWZmZXIoKSBjb25zdAotewotICAgIHJldHVybiBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpOwotfQotCi1pbmxpbmUgU3RyaW5nMTYmIFN0cmluZzE2OjpvcGVyYXRvcj0oY29uc3QgU3RyaW5nMTYmIG90aGVyKQotewotICAgIHNldFRvKG90aGVyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBTdHJpbmcxNiYgU3RyaW5nMTY6Om9wZXJhdG9yKz0oY29uc3QgU3RyaW5nMTYmIG90aGVyKQotewotICAgIGFwcGVuZChvdGhlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1pbmxpbmUgU3RyaW5nMTYgU3RyaW5nMTY6Om9wZXJhdG9yKyhjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgU3RyaW5nMTYgdG1wKCp0aGlzKTsKLSAgICB0bXAgKz0gb3RoZXI7Ci0gICAgcmV0dXJuIHRtcDsKLX0KLQotaW5saW5lIGludCBTdHJpbmcxNjo6Y29tcGFyZShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSk7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcjwoY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgc2l6ZSgpLCBvdGhlci5tU3RyaW5nLCBvdGhlci5zaXplKCkpIDwgMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPD0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgc2l6ZSgpLCBvdGhlci5tU3RyaW5nLCBvdGhlci5zaXplKCkpIDw9IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcj09KGNvbnN0IFN0cmluZzE2JiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyemNtcDE2KG1TdHJpbmcsIHNpemUoKSwgb3RoZXIubVN0cmluZywgb3RoZXIuc2l6ZSgpKSA9PSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmcxNjo6b3BlcmF0b3IhPShjb25zdCBTdHJpbmcxNiYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cnpjbXAxNihtU3RyaW5nLCBzaXplKCksIG90aGVyLm1TdHJpbmcsIG90aGVyLnNpemUoKSkgIT0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPj0oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgc2l6ZSgpLCBvdGhlci5tU3RyaW5nLCBvdGhlci5zaXplKCkpID49IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcj4oY29uc3QgU3RyaW5nMTYmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgc2l6ZSgpLCBvdGhlci5tU3RyaW5nLCBvdGhlci5zaXplKCkpID4gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nMTY6Om9wZXJhdG9yPChjb25zdCBjaGFyMTZfdCogb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcDE2KG1TdHJpbmcsIG90aGVyKSA8IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcjw9KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wMTYobVN0cmluZywgb3RoZXIpIDw9IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcj09KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wMTYobVN0cmluZywgb3RoZXIpID09IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvciE9KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wMTYobVN0cmluZywgb3RoZXIpICE9IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcj49KGNvbnN0IGNoYXIxNl90KiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wMTYobVN0cmluZywgb3RoZXIpID49IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzE2OjpvcGVyYXRvcj4oY29uc3QgY2hhcjE2X3QqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAxNihtU3RyaW5nLCBvdGhlcikgPiAwOwotfQotCi1pbmxpbmUgU3RyaW5nMTY6Om9wZXJhdG9yIGNvbnN0IGNoYXIxNl90KigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TdHJpbmc7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9TVFJJTkcxNl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1N0cmluZzguaCBiL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYzNjk3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU3RyaW5nOC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU1RSSU5HOF9ICi0jZGVmaW5lIEFORFJPSURfU1RSSU5HOF9ICi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TaGFyZWRCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Vbmljb2RlLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gZm9yIHN0cmNtcAotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmcxNjsKLWNsYXNzIFRleHRPdXRwdXQ7Ci0KLS8vISBUaGlzIGlzIGEgc3RyaW5nIGhvbGRpbmcgVVRGLTggY2hhcmFjdGVycy4gRG9lcyBub3QgYWxsb3cgdGhlIHZhbHVlIG1vcmUKLS8vIHRoYW4gMHgxMEZGRkYsIHdoaWNoIGlzIG5vdCB2YWxpZCB1bmljb2RlIGNvZGVwb2ludC4KLWNsYXNzIFN0cmluZzgKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNvbnN0IFN0cmluZzgmIG8pOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNvbnN0IGNoYXIqIG8pOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNvbnN0IGNoYXIqIG8sIHNpemVfdCBudW1DaGFycyk7Ci0gICAgCi0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgU3RyaW5nMTYmIG8pOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNvbnN0IGNoYXIxNl90KiBvKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjb25zdCBjaGFyMTZfdCogbywgc2l6ZV90IG51bUNoYXJzKTsKLSAgICBleHBsaWNpdCAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChjb25zdCBjaGFyMzJfdCogbyk7Ci0gICAgZXhwbGljaXQgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY29uc3QgY2hhcjMyX3QqIG8sIHNpemVfdCBudW1DaGFycyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5TdHJpbmc4KCk7Ci0KLSAgICBzdGF0aWMgaW5saW5lIGNvbnN0IFN0cmluZzggZW1wdHkoKTsKLQotICAgIHN0YXRpYyBTdHJpbmc4ICAgICAgICAgICAgICBmb3JtYXQoY29uc3QgY2hhciogZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwotICAgIHN0YXRpYyBTdHJpbmc4ICAgICAgICAgICAgICBmb3JtYXRWKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKTsKLQotICAgIGlubGluZSAgY29uc3QgY2hhciogICAgICAgICBzdHJpbmcoKSBjb25zdDsKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0OwotICAgIGlubGluZSAgc2l6ZV90ICAgICAgICAgICAgICBsZW5ndGgoKSBjb25zdDsKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICAgICAgYnl0ZXMoKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0OwotICAgIAotICAgIGlubGluZSAgY29uc3QgU2hhcmVkQnVmZmVyKiBzaGFyZWRCdWZmZXIoKSBjb25zdDsKLSAgICAKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgY2xlYXIoKTsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBzZXRUbyhjb25zdCBTdHJpbmc4JiBvdGhlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IGNoYXIqIG90aGVyKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBudW1DaGFycyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlciwgc2l6ZV90IG51bUNoYXJzKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgc2V0VG8oY29uc3QgY2hhcjMyX3QqIG90aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmQoY29uc3QgU3RyaW5nOCYgb3RoZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmQoY29uc3QgY2hhciogb3RoZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICBhcHBlbmQoY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBudW1DaGFycyk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgYXBwZW5kRm9ybWF0KGNvbnN0IGNoYXIqIGZtdCwgLi4uKQotICAgICAgICAgICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgYXBwZW5kRm9ybWF0Vihjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXJncyk7Ci0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIE8oTikgdGltZSB0byBjYWxjdWxhdGUgdGhlIHZhbHVlLgotICAgICAgICAgICAgLy8gTm8gY2FjaGUgdmFsdWUgaXMgc3RvcmVkLgotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBnZXRVdGYzMkxlbmd0aCgpIGNvbnN0OwotICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBnZXRVdGYzMkF0KHNpemVfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5leHRfaW5kZXgpIGNvbnN0OwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBnZXRVdGYzMihjaGFyMzJfdCogZHN0KSBjb25zdDsKLQotICAgIGlubGluZSAgU3RyaW5nOCYgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgU3RyaW5nOCYgb3RoZXIpOwotICAgIGlubGluZSAgU3RyaW5nOCYgICAgICAgICAgICBvcGVyYXRvcj0oY29uc3QgY2hhciogb3RoZXIpOwotICAgIAotICAgIGlubGluZSAgU3RyaW5nOCYgICAgICAgICAgICBvcGVyYXRvcis9KGNvbnN0IFN0cmluZzgmIG90aGVyKTsKLSAgICBpbmxpbmUgIFN0cmluZzggICAgICAgICAgICAgb3BlcmF0b3IrKGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLSAgICAKLSAgICBpbmxpbmUgIFN0cmluZzgmICAgICAgICAgICAgb3BlcmF0b3IrPShjb25zdCBjaGFyKiBvdGhlcik7Ci0gICAgaW5saW5lICBTdHJpbmc4ICAgICAgICAgICAgIG9wZXJhdG9yKyhjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7Ci0KLSAgICBpbmxpbmUgIGludCAgICAgICAgICAgICAgICAgY29tcGFyZShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3Q7Ci0KLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I8PShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3I+PShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPihjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3Q7Ci0gICAgCi0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPChjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPD0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdDsKLSAgICBpbmxpbmUgIGJvb2wgICAgICAgICAgICAgICAgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBvdGhlcikgY29uc3Q7Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgICAgIG9wZXJhdG9yPj0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0OwotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgICAgICBvcGVyYXRvcj4oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0OwotICAgIAotICAgIGlubGluZSAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0OwotICAgIAotICAgICAgICAgICAgY2hhciogICAgICAgICAgICAgICBsb2NrQnVmZmVyKHNpemVfdCBzaXplKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgdW5sb2NrQnVmZmVyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgIHVubG9ja0J1ZmZlcihzaXplX3Qgc2l6ZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgb2Ygb3RoZXIgaW4gdGhpcyBhdCBvciBhZnRlcgotICAgICAgICAgICAgLy8gc3RhcnQsIG9yIC0xIGlmIG5vdCBmb3VuZAotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICBmaW5kKGNvbnN0IGNoYXIqIG90aGVyLCBzaXplX3Qgc3RhcnQgPSAwKSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICB0b0xvd2VyKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHRvTG93ZXIoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbnVtQ2hhcnMpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICB0b1VwcGVyKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHRvVXBwZXIoc2l6ZV90IHN0YXJ0LCBzaXplX3QgbnVtQ2hhcnMpOwotCi0gICAgLyoKLSAgICAgKiBUaGVzZSBtZXRob2RzIG9wZXJhdGUgb24gdGhlIHN0cmluZyBhcyBpZiBpdCB3ZXJlIGEgcGF0aCBuYW1lLgotICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGZpbGVuYW1lIGZpZWxkIHRvIGEgc3BlY2lmaWMgdmFsdWUuCi0gICAgICoKLSAgICAgKiBOb3JtYWxpemVzIHRoZSBmaWxlbmFtZSwgcmVtb3ZpbmcgYSB0cmFpbGluZyAnLycgaWYgcHJlc2VudC4KLSAgICAgKi8KLSAgICB2b2lkIHNldFBhdGhOYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwotICAgIHZvaWQgc2V0UGF0aE5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IG51bUNoYXJzKTsKLQotICAgIC8qCi0gICAgICogR2V0IGp1c3QgdGhlIGZpbGVuYW1lIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICJiYXIuYyIKLSAgICAgKi8KLSAgICBTdHJpbmc4IGdldFBhdGhMZWFmKHZvaWQpIGNvbnN0OwotCi0gICAgLyoKLSAgICAgKiBSZW1vdmUgdGhlIGxhc3QgKGZpbGUgbmFtZSkgY29tcG9uZW50LCBsZWF2aW5nIGp1c3QgdGhlIGRpcmVjdG9yeQotICAgICAqIG5hbWUuCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAiL3RtcC9mb28iCi0gICAgICogIi90bXAiIC0tPiAiIiAvLyA/Pz8/PyBzaG91bGRuJ3QgdGhpcyBiZSAiLyIgPz8/PyBYWFgKLSAgICAgKiAiYmFyLmMiIC0tPiAiIgotICAgICAqLwotICAgIFN0cmluZzggZ2V0UGF0aERpcih2b2lkKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogUmV0cmlldmUgdGhlIGZyb250IChyb290IGRpcikgY29tcG9uZW50LiAgT3B0aW9uYWxseSBhbHNvIHJldHVybiB0aGUKLSAgICAgKiByZW1haW5pbmcgY29tcG9uZW50cy4KLSAgICAgKgotICAgICAqICIvdG1wL2Zvby9iYXIuYyIgLS0+ICJ0bXAiIChyZW1haW4gPSAiZm9vL2Jhci5jIikKLSAgICAgKiAiL3RtcCIgLS0+ICJ0bXAiIChyZW1haW4gPSAiIikKLSAgICAgKiAiYmFyLmMiIC0tPiAiYmFyLmMiIChyZW1haW4gPSAiIikKLSAgICAgKi8KLSAgICBTdHJpbmc4IHdhbGtQYXRoKFN0cmluZzgqIG91dFJlbWFpbnMgPSBOVUxMKSBjb25zdDsKLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICBUaGlzIGlzIHRoZSBsYXN0ICcuJyBhbmQgYW55IG51bWJlcgotICAgICAqIG9mIGNoYXJhY3RlcnMgdGhhdCBmb2xsb3cgaXQuICBUaGUgJy4nIGlzIGluY2x1ZGVkIGluIGNhc2Ugd2UKLSAgICAgKiBkZWNpZGUgdG8gZXhwYW5kIG91ciBkZWZpbml0aW9uIG9mIHdoYXQgY29uc3RpdHV0ZXMgYW4gZXh0ZW5zaW9uLgotICAgICAqCi0gICAgICogIi90bXAvZm9vL2Jhci5jIiAtLT4gIi5jIgotICAgICAqICIvdG1wIiAtLT4gIiIKLSAgICAgKiAiL3RtcC9mb28uYmFyL2JheiIgLS0+ICIiCi0gICAgICogImZvby5qcGVnIiAtLT4gIi5qcGVnIgotICAgICAqICJmb28uIiAtLT4gIiIKLSAgICAgKi8KLSAgICBTdHJpbmc4IGdldFBhdGhFeHRlbnNpb24odm9pZCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIFJldHVybiB0aGUgcGF0aCB3aXRob3V0IHRoZSBleHRlbnNpb24uICBSdWxlcyBmb3Igd2hhdCBjb25zdGl0dXRlcwotICAgICAqIGFuIGV4dGVuc2lvbiBhcmUgZGVzY3JpYmVkIGluIHRoZSBjb21tZW50IGZvciBnZXRQYXRoRXh0ZW5zaW9uKCkuCi0gICAgICoKLSAgICAgKiAiL3RtcC9mb28vYmFyLmMiIC0tPiAiL3RtcC9mb28vYmFyIgotICAgICAqLwotICAgIFN0cmluZzggZ2V0QmFzZVBhdGgodm9pZCkgY29uc3Q7Ci0KLSAgICAvKgotICAgICAqIEFkZCBhIGNvbXBvbmVudCB0byB0aGUgcGF0aG5hbWUuICBXZSBndWFyYW50ZWUgdGhhdCB0aGVyZSBpcwotICAgICAqIGV4YWN0bHkgb25lIHBhdGggc2VwYXJhdG9yIGJldHdlZW4gdGhlIG9sZCBwYXRoIGFuZCB0aGUgbmV3LgotICAgICAqIElmIHRoZXJlIGlzIG5vIGV4aXN0aW5nIG5hbWUsIHdlIGp1c3QgY29weSB0aGUgbmV3IG5hbWUgaW4uCi0gICAgICoKLSAgICAgKiBJZiBsZWFmIGlzIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGggKGkuZS4gc3RhcnRzIHdpdGggJy8nLCBpdAotICAgICAqIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZSBiZWZvcmUuCi0gICAgICovCi0gICAgU3RyaW5nOCYgYXBwZW5kUGF0aChjb25zdCBjaGFyKiBsZWFmKTsKLSAgICBTdHJpbmc4JiBhcHBlbmRQYXRoKGNvbnN0IFN0cmluZzgmIGxlYWYpICB7IHJldHVybiBhcHBlbmRQYXRoKGxlYWYuc3RyaW5nKCkpOyB9Ci0KLSAgICAvKgotICAgICAqIExpa2UgYXBwZW5kUGF0aCgpLCBidXQgZG9lcyBub3QgYWZmZWN0IHRoaXMgc3RyaW5nLiAgUmV0dXJucyBhIG5ldyBvbmUgaW5zdGVhZC4KLSAgICAgKi8KLSAgICBTdHJpbmc4IGFwcGVuZFBhdGhDb3B5KGNvbnN0IGNoYXIqIGxlYWYpIGNvbnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFN0cmluZzggcCgqdGhpcyk7IHAuYXBwZW5kUGF0aChsZWFmKTsgcmV0dXJuIHA7IH0KLSAgICBTdHJpbmc4IGFwcGVuZFBhdGhDb3B5KGNvbnN0IFN0cmluZzgmIGxlYWYpIGNvbnN0IHsgcmV0dXJuIGFwcGVuZFBhdGhDb3B5KGxlYWYuc3RyaW5nKCkpOyB9Ci0KLSAgICAvKgotICAgICAqIENvbnZlcnRzIGFsbCBzZXBhcmF0b3JzIGluIHRoaXMgc3RyaW5nIHRvIC8sIHRoZSBkZWZhdWx0IHBhdGggc2VwYXJhdG9yLgotICAgICAqCi0gICAgICogSWYgdGhlIGRlZmF1bHQgT1Mgc2VwYXJhdG9yIGlzIGJhY2tzbGFzaCwgdGhpcyBjb252ZXJ0cyBhbGwKLSAgICAgKiBiYWNrc2xhc2hlcyB0byBzbGFzaGVzLCBpbi1wbGFjZS4gT3RoZXJ3aXNlIGl0IGRvZXMgbm90aGluZy4KLSAgICAgKiBSZXR1cm5zIHNlbGYuCi0gICAgICovCi0gICAgU3RyaW5nOCYgY29udmVydFRvUmVzUGF0aCgpOwotCi1wcml2YXRlOgotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICByZWFsX2FwcGVuZChjb25zdCBjaGFyKiBvdGhlciwgc2l6ZV90IG51bUNoYXJzKTsKLSAgICAgICAgICAgIGNoYXIqICAgICAgICAgICAgICAgZmluZF9leHRlbnNpb24odm9pZCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1TdHJpbmc7Ci19OwotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBTdHJpbmcxNiYgdmFsKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBObyB1c2VyIHNlcnZpY2FibGUgcGFydHMgYmVsb3cuCi0KLWlubGluZSBpbnQgY29tcGFyZV90eXBlKGNvbnN0IFN0cmluZzgmIGxocywgY29uc3QgU3RyaW5nOCYgcmhzKQotewotICAgIHJldHVybiBsaHMuY29tcGFyZShyaHMpOwotfQotCi1pbmxpbmUgaW50IHN0cmljdGx5X29yZGVyX3R5cGUoY29uc3QgU3RyaW5nOCYgbGhzLCBjb25zdCBTdHJpbmc4JiByaHMpCi17Ci0gICAgcmV0dXJuIGNvbXBhcmVfdHlwZShsaHMsIHJocykgPCAwOwotfQotCi1pbmxpbmUgY29uc3QgU3RyaW5nOCBTdHJpbmc4OjplbXB0eSgpIHsKLSAgICByZXR1cm4gU3RyaW5nOCgpOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogU3RyaW5nODo6c3RyaW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmluZzsKLX0KLQotaW5saW5lIHNpemVfdCBTdHJpbmc4OjpsZW5ndGgoKSBjb25zdAotewotICAgIHJldHVybiBTaGFyZWRCdWZmZXI6OnNpemVGcm9tRGF0YShtU3RyaW5nKS0xOwotfQotCi1pbmxpbmUgc2l6ZV90IFN0cmluZzg6OnNpemUoKSBjb25zdAotewotICAgIHJldHVybiBsZW5ndGgoKTsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6aXNFbXB0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGxlbmd0aCgpID09IDA7Ci19Ci0KLWlubGluZSBzaXplX3QgU3RyaW5nODo6Ynl0ZXMoKSBjb25zdAotewotICAgIHJldHVybiBTaGFyZWRCdWZmZXI6OnNpemVGcm9tRGF0YShtU3RyaW5nKS0xOwotfQotCi1pbmxpbmUgY29uc3QgU2hhcmVkQnVmZmVyKiBTdHJpbmc4OjpzaGFyZWRCdWZmZXIoKSBjb25zdAotewotICAgIHJldHVybiBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpOwotfQotCi1pbmxpbmUgU3RyaW5nOCYgU3RyaW5nODo6b3BlcmF0b3I9KGNvbnN0IFN0cmluZzgmIG90aGVyKQotewotICAgIHNldFRvKG90aGVyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBTdHJpbmc4JiBTdHJpbmc4OjpvcGVyYXRvcj0oY29uc3QgY2hhciogb3RoZXIpCi17Ci0gICAgc2V0VG8ob3RoZXIpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotaW5saW5lIFN0cmluZzgmIFN0cmluZzg6Om9wZXJhdG9yKz0oY29uc3QgU3RyaW5nOCYgb3RoZXIpCi17Ci0gICAgYXBwZW5kKG90aGVyKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWlubGluZSBTdHJpbmc4IFN0cmluZzg6Om9wZXJhdG9yKyhjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3QKLXsKLSAgICBTdHJpbmc4IHRtcCgqdGhpcyk7Ci0gICAgdG1wICs9IG90aGVyOwotICAgIHJldHVybiB0bXA7Ci19Ci0KLWlubGluZSBTdHJpbmc4JiBTdHJpbmc4OjpvcGVyYXRvcis9KGNvbnN0IGNoYXIqIG90aGVyKQotewotICAgIGFwcGVuZChvdGhlcik7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1pbmxpbmUgU3RyaW5nOCBTdHJpbmc4OjpvcGVyYXRvcisoY29uc3QgY2hhciogb3RoZXIpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCB0bXAoKnRoaXMpOwotICAgIHRtcCArPSBvdGhlcjsKLSAgICByZXR1cm4gdG1wOwotfQotCi1pbmxpbmUgaW50IFN0cmluZzg6OmNvbXBhcmUoY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKTsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3I8KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIubVN0cmluZykgPCAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcjw9KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIubVN0cmluZykgPD0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3I9PShjb25zdCBTdHJpbmc4JiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyLm1TdHJpbmcpID09IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yIT0oY29uc3QgU3RyaW5nOCYgb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlci5tU3RyaW5nKSAhPSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcj49KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIubVN0cmluZykgPj0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3I+KGNvbnN0IFN0cmluZzgmIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIubVN0cmluZykgPiAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcjwoY29uc3QgY2hhciogb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlcikgPCAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcjw9KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIpIDw9IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPT0oY29uc3QgY2hhciogb3RoZXIpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0cmNtcChtU3RyaW5nLCBvdGhlcikgPT0gMDsKLX0KLQotaW5saW5lIGJvb2wgU3RyaW5nODo6b3BlcmF0b3IhPShjb25zdCBjaGFyKiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyKSAhPSAwOwotfQotCi1pbmxpbmUgYm9vbCBTdHJpbmc4OjpvcGVyYXRvcj49KGNvbnN0IGNoYXIqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiBzdHJjbXAobVN0cmluZywgb3RoZXIpID49IDA7Ci19Ci0KLWlubGluZSBib29sIFN0cmluZzg6Om9wZXJhdG9yPihjb25zdCBjaGFyKiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gc3RyY21wKG1TdHJpbmcsIG90aGVyKSA+IDA7Ci19Ci0KLWlubGluZSBTdHJpbmc4OjpvcGVyYXRvciBjb25zdCBjaGFyKigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TdHJpbmc7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9TVFJJTkc4X0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU3RyaW5nQXJyYXkuaCBiL2luY2x1ZGUvdXRpbHMvU3RyaW5nQXJyYXkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0NDU4Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1N0cmluZ0FycmF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIFNvcnRhYmxlIGFycmF5IG9mIHN0cmluZ3MuICBTVEwtaXNoLCBidXQgU1RMLWZyZWUuCi0vLyAgCi0jaWZuZGVmIF9MSUJTX1VUSUxTX1NUUklOR19BUlJBWV9ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX1NUUklOR19BUlJBWV9ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLwotLy8gQW4gZXhwYW5kaW5nIGFycmF5IG9mIHN0cmluZ3MuICBBZGQsIGdldCwgc29ydCwgZGVsZXRlLgotLy8KLWNsYXNzIFN0cmluZ0FycmF5IHsKLXB1YmxpYzoKLSAgICBTdHJpbmdBcnJheSgpOwotICAgIHZpcnR1YWwgflN0cmluZ0FycmF5KCk7Ci0KLSAgICAvLwotICAgIC8vIEFkZCBhIHN0cmluZy4gIEEgY29weSBvZiB0aGUgc3RyaW5nIGlzIG1hZGUuCi0gICAgLy8KLSAgICBib29sIHB1c2hfYmFjayhjb25zdCBjaGFyKiBzdHIpOwotCi0gICAgLy8KLSAgICAvLyBEZWxldGUgYW4gZW50cnkuCi0gICAgLy8KLSAgICB2b2lkIGVyYXNlKGludCBpZHgpOwotCi0gICAgLy8KLSAgICAvLyBTb3J0IHRoZSBhcnJheS4KLSAgICAvLwotICAgIHZvaWQgc29ydChpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopKTsKLSAgICAKLSAgICAvLwotICAgIC8vIFBhc3MgdGhpcyB0byB0aGUgc29ydCByb3V0aW5lIHRvIGRvIGFuIGFzY2VuZGluZyBhbHBoYWJldGljYWwgc29ydC4KLSAgICAvLwotICAgIHN0YXRpYyBpbnQgY21wQXNjZW5kaW5nQWxwaGEoY29uc3Qgdm9pZCogcHN0cjEsIGNvbnN0IHZvaWQqIHBzdHIyKTsKLSAgICAKLSAgICAvLwotICAgIC8vIEdldCB0aGUgI29mIGl0ZW1zIGluIHRoZSBhcnJheS4KLSAgICAvLwotICAgIGlubGluZSBpbnQgc2l6ZSh2b2lkKSBjb25zdCB7IHJldHVybiBtQ3VycmVudDsgfQotCi0gICAgLy8KLSAgICAvLyBSZXR1cm4gZW50cnkgTi4KLSAgICAvLyBbc2hvdWxkIHVzZSBvcGVyYXRvcltdIGhlcmVdCi0gICAgLy8KLSAgICBjb25zdCBjaGFyKiBnZXRFbnRyeShpbnQgaWR4KSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAodW5zaWduZWQoaWR4KSA+PSB1bnNpZ25lZChtQ3VycmVudCkpID8gTlVMTCA6IG1BcnJheVtpZHhdOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gU2V0IGVudHJ5IE4gdG8gc3BlY2lmaWVkIHN0cmluZy4KLSAgICAvLyBbc2hvdWxkIHVzZSBvcGVyYXRvcltdIGhlcmVdCi0gICAgLy8KLSAgICB2b2lkIHNldEVudHJ5KGludCBpZHgsIGNvbnN0IGNoYXIqIHN0cik7Ci0KLXByaXZhdGU6Ci0gICAgaW50ICAgICBtTWF4OwotICAgIGludCAgICAgbUN1cnJlbnQ7Ci0gICAgY2hhcioqICBtQXJyYXk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX0xJQlNfVVRJTFNfU1RSSU5HX0FSUkFZX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvU3Ryb25nUG9pbnRlci5oIGIvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZmEzYTguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9TdHJvbmdQb2ludGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVFJPTkdfUE9JTlRFUl9ICi0jZGVmaW5lIEFORFJPSURfU1RST05HX1BPSU5URVJfSAotCi0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBUZXh0T3V0cHV0OwotVGV4dE91dHB1dCYgcHJpbnRTdHJvbmdQb2ludGVyKFRleHRPdXRwdXQmIHRvLCBjb25zdCB2b2lkKiB2YWwpOwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyB3cDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgQ09NUEFSRShfb3BfKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBzcDxUPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCBUKiBvKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi10ZW1wbGF0ZTx0eXBlbmFtZSBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotaW5saW5lIGJvb2wgb3BlcmF0b3IgX29wXyAoY29uc3Qgc3A8VT4mIG8pIGNvbnN0IHsgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gbV9wdHIgX29wXyBvLm1fcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8dHlwZW5hbWUgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IFUqIG8pIGNvbnN0IHsgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gbzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWlubGluZSBib29sIG9wZXJhdG9yIF9vcF8gKGNvbnN0IHdwPFQ+JiBvKSBjb25zdCB7ICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIG1fcHRyIF9vcF8gby5tX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPHR5cGVuYW1lIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBvcGVyYXRvciBfb3BfIChjb25zdCB3cDxVPiYgbykgY29uc3QgeyAgICAgICAgICAgICAgXAotICAgIHJldHVybiBtX3B0ciBfb3BfIG8ubV9wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3Mgc3AKLXsKLXB1YmxpYzoKLSAgICBpbmxpbmUgc3AoKSA6IG1fcHRyKDApIHsgfQotCi0gICAgc3AoVCogb3RoZXIpOwotICAgIHNwKGNvbnN0IHNwPFQ+JiBvdGhlcik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3AoVSogb3RoZXIpOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHNwKGNvbnN0IHNwPFU+JiBvdGhlcik7Ci0KLSAgICB+c3AoKTsKLQotICAgIC8vIEFzc2lnbm1lbnQKLQotICAgIHNwJiBvcGVyYXRvciA9IChUKiBvdGhlcik7Ci0gICAgc3AmIG9wZXJhdG9yID0gKGNvbnN0IHNwPFQ+JiBvdGhlcik7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzcCYgb3BlcmF0b3IgPSAoY29uc3Qgc3A8VT4mIG90aGVyKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzcCYgb3BlcmF0b3IgPSAoVSogb3RoZXIpOwotCi0gICAgLy8hIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciB1c2UgYnkgUHJvY2Vzc1N0YXRlIChhbmQgbm9ib2R5IGVsc2UpLgotICAgIHZvaWQgZm9yY2Vfc2V0KFQqIG90aGVyKTsKLQotICAgIC8vIFJlc2V0Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAvLyBBY2Nlc3NvcnMKLQotICAgIGlubGluZSAgVCYgICAgICBvcGVyYXRvciogKCkgY29uc3QgIHsgcmV0dXJuICptX3B0cjsgfQotICAgIGlubGluZSAgVCogICAgICBvcGVyYXRvci0+ICgpIGNvbnN0IHsgcmV0dXJuIG1fcHRyOyAgfQotICAgIGlubGluZSAgVCogICAgICBnZXQoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIG1fcHRyOyB9Ci0KLSAgICAvLyBPcGVyYXRvcnMKLQotICAgIENPTVBBUkUoPT0pCi0gICAgQ09NUEFSRSghPSkKLSAgICBDT01QQVJFKD4pCi0gICAgQ09NUEFSRSg8KQotICAgIENPTVBBUkUoPD0pCi0gICAgQ09NUEFSRSg+PSkKLQotcHJpdmF0ZTogICAgCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgWT4gZnJpZW5kIGNsYXNzIHNwOwotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFk+IGZyaWVuZCBjbGFzcyB3cDsKLSAgICB2b2lkIHNldF9wb2ludGVyKFQqIHB0cik7Ci0gICAgVCogbV9wdHI7Ci19OwotCi0jdW5kZWYgQ09NUEFSRQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IHNwPFQ+JiB2YWwpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXIgc2VydmljZWFibGUgcGFydHMgYmVsb3cgaGVyZS4KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNwPFQ+OjpzcChUKiBvdGhlcikKLTogbV9wdHIob3RoZXIpCi0gIHsKLSAgICBpZiAob3RoZXIpIG90aGVyLT5pbmNTdHJvbmcodGhpcyk7Ci0gIH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNwPFQ+OjpzcChjb25zdCBzcDxUPiYgb3RoZXIpCi06IG1fcHRyKG90aGVyLm1fcHRyKQotICB7Ci0gICAgaWYgKG1fcHRyKSBtX3B0ci0+aW5jU3Ryb25nKHRoaXMpOwotICB9Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci1zcDxUPjo6c3AoVSogb3RoZXIpIDogbV9wdHIob3RoZXIpCi17Ci0gICAgaWYgKG90aGVyKSAoKFQqKW90aGVyKS0+aW5jU3Ryb25nKHRoaXMpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotc3A8VD46OnNwKGNvbnN0IHNwPFU+JiBvdGhlcikKLTogbV9wdHIob3RoZXIubV9wdHIpCi0gIHsKLSAgICBpZiAobV9wdHIpIG1fcHRyLT5pbmNTdHJvbmcodGhpcyk7Ci0gIH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNwPFQ+Ojp+c3AoKQotewotICAgIGlmIChtX3B0cikgbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNwPFQ+JiBzcDxUPjo6b3BlcmF0b3IgPSAoY29uc3Qgc3A8VD4mIG90aGVyKSB7Ci0gICAgVCogb3RoZXJQdHIob3RoZXIubV9wdHIpOwotICAgIGlmIChvdGhlclB0cikgb3RoZXJQdHItPmluY1N0cm9uZyh0aGlzKTsKLSAgICBpZiAobV9wdHIpIG1fcHRyLT5kZWNTdHJvbmcodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlclB0cjsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zcDxUPiYgc3A8VD46Om9wZXJhdG9yID0gKFQqIG90aGVyKQotewotICAgIGlmIChvdGhlcikgb3RoZXItPmluY1N0cm9uZyh0aGlzKTsKLSAgICBpZiAobV9wdHIpIG1fcHRyLT5kZWNTdHJvbmcodGhpcyk7Ci0gICAgbV9wdHIgPSBvdGhlcjsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci1zcDxUPiYgc3A8VD46Om9wZXJhdG9yID0gKGNvbnN0IHNwPFU+JiBvdGhlcikKLXsKLSAgICBUKiBvdGhlclB0cihvdGhlci5tX3B0cik7Ci0gICAgaWYgKG90aGVyUHRyKSBvdGhlclB0ci0+aW5jU3Ryb25nKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyUHRyOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdGVtcGxhdGU8dHlwZW5hbWUgVT4KLXNwPFQ+JiBzcDxUPjo6b3BlcmF0b3IgPSAoVSogb3RoZXIpCi17Ci0gICAgaWYgKG90aGVyKSAoKFQqKW90aGVyKS0+aW5jU3Ryb25nKHRoaXMpOwotICAgIGlmIChtX3B0cikgbV9wdHItPmRlY1N0cm9uZyh0aGlzKTsKLSAgICBtX3B0ciA9IG90aGVyOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gICAgCi12b2lkIHNwPFQ+Ojpmb3JjZV9zZXQoVCogb3RoZXIpCi17Ci0gICAgb3RoZXItPmZvcmNlSW5jU3Ryb25nKHRoaXMpOwotICAgIG1fcHRyID0gb3RoZXI7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIHNwPFQ+OjpjbGVhcigpCi17Ci0gICAgaWYgKG1fcHRyKSB7Ci0gICAgICAgIG1fcHRyLT5kZWNTdHJvbmcodGhpcyk7Ci0gICAgICAgIG1fcHRyID0gMDsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci12b2lkIHNwPFQ+OjpzZXRfcG9pbnRlcihUKiBwdHIpIHsKLSAgICBtX3B0ciA9IHB0cjsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgc3A8VD4mIHZhbCkKLXsKLSAgICByZXR1cm4gcHJpbnRTdHJvbmdQb2ludGVyKHRvLCB2YWwuZ2V0KCkpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfU1RST05HX1BPSU5URVJfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9TeXN0ZW1DbG9jay5oIGIvaW5jbHVkZS91dGlscy9TeXN0ZW1DbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzMxOWJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvU3lzdGVtQ2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVVRJTFNfU1lTVEVNQ0xPQ0tfSAotI2RlZmluZSBBTkRST0lEX1VUSUxTX1NZU1RFTUNMT0NLX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWludCBzZXRDdXJyZW50VGltZU1pbGxpcyhpbnQ2NF90IG1pbGxpcyk7Ci1pbnQ2NF90IHVwdGltZU1pbGxpcygpOwotaW50NjRfdCBlbGFwc2VkUmVhbHRpbWUoKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVVRJTFNfU1lTVEVNQ0xPQ0tfSAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1RleHRPdXRwdXQuaCBiL2luY2x1ZGUvdXRpbHMvVGV4dE91dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTJmYmJlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvVGV4dE91dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVEVYVE9VVFBVVF9ICi0jZGVmaW5lIEFORFJPSURfVEVYVE9VVFBVVF9ICi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVGV4dE91dHB1dAotewotcHVibGljOgotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dE91dHB1dCgpOwotICAgIHZpcnR1YWwgICAgICAgICAgICAgflRleHRPdXRwdXQoKTsKLSAgICAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHByaW50KGNvbnN0IGNoYXIqIHR4dCwgc2l6ZV90IGxlbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgbW92ZUluZGVudChpbnQgZGVsdGEpID0gMDsKLSAgICAKLSAgICBjbGFzcyBCdW5kbGUgewotICAgIHB1YmxpYzoKLSAgICAgICAgaW5saW5lIEJ1bmRsZShUZXh0T3V0cHV0JiB0bykgOiBtVE8odG8pIHsgdG8ucHVzaEJ1bmRsZSgpOyB9Ci0gICAgICAgIGlubGluZSB+QnVuZGxlKCkgeyBtVE8ucG9wQnVuZGxlKCk7IH0KLSAgICBwcml2YXRlOgotICAgICAgICBUZXh0T3V0cHV0JiAgICAgbVRPOwotICAgIH07Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBwdXNoQnVuZGxlKCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcG9wQnVuZGxlKCkgPSAwOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRleHQgb3V0cHV0IHN0cmVhbSBmb3IgcHJpbnRpbmcgdG8gdGhlIGxvZyAodmlhIHV0aWxzL0xvZy5oKS4KLWV4dGVybiBUZXh0T3V0cHV0JiBhbG9nOwotCi0vLyBUZXh0IG91dHB1dCBzdHJlYW0gZm9yIHByaW50aW5nIHRvIHN0ZG91dC4KLWV4dGVybiBUZXh0T3V0cHV0JiBhb3V0OwotCi0vLyBUZXh0IG91dHB1dCBzdHJlYW0gZm9yIHByaW50aW5nIHRvIHN0ZGVyci4KLWV4dGVybiBUZXh0T3V0cHV0JiBhZXJyOwotCi10eXBlZGVmIFRleHRPdXRwdXQmICgqVGV4dE91dHB1dE1hbmlwRnVuYykoVGV4dE91dHB1dCYpOwotCi1UZXh0T3V0cHV0JiBlbmRsKFRleHRPdXRwdXQmIHRvKTsKLVRleHRPdXRwdXQmIGluZGVudChUZXh0T3V0cHV0JiB0byk7Ci1UZXh0T3V0cHV0JiBkZWRlbnQoVGV4dE91dHB1dCYgdG8pOwotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBjaGFyKiBzdHIpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY2hhcik7ICAgICAvLyB3cml0ZXMgcmF3IGNoYXJhY3RlcgotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgYm9vbCk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBpbnQpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgbG9uZyk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCB1bnNpZ25lZCBpbnQpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgdW5zaWduZWQgbG9uZyk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBsb25nIGxvbmcpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgdW5zaWduZWQgbG9uZyBsb25nKTsKLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGZsb2F0KTsKLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGRvdWJsZSk7Ci1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBUZXh0T3V0cHV0TWFuaXBGdW5jIGZ1bmMpOwotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgdm9pZCopOwotCi1jbGFzcyBUeXBlQ29kZSAKLXsKLXB1YmxpYzoKLSAgICBpbmxpbmUgVHlwZUNvZGUodWludDMyX3QgY29kZSk7Ci0gICAgaW5saW5lIH5UeXBlQ29kZSgpOwotCi0gICAgaW5saW5lIHVpbnQzMl90IHR5cGVDb2RlKCkgY29uc3Q7Ci0gICAgCi1wcml2YXRlOgotICAgIHVpbnQzMl90IG1Db2RlOwotfTsKLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3QgVHlwZUNvZGUmIHZhbCk7Ci0KLWNsYXNzIEhleER1bXAKLXsKLXB1YmxpYzoKLSAgICBIZXhEdW1wKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUsIHNpemVfdCBieXRlc1BlckxpbmU9MTYpOwotICAgIGlubGluZSB+SGV4RHVtcCgpOwotICAgIAotICAgIGlubGluZSBIZXhEdW1wJiBzZXRCeXRlc1BlckxpbmUoc2l6ZV90IGJ5dGVzUGVyTGluZSk7Ci0gICAgaW5saW5lIEhleER1bXAmIHNldFNpbmdsZUxpbmVDdXRvZmYoaW50MzJfdCBieXRlcyk7Ci0gICAgaW5saW5lIEhleER1bXAmIHNldEFsaWdubWVudChzaXplX3QgYWxpZ25tZW50KTsKLSAgICBpbmxpbmUgSGV4RHVtcCYgc2V0Q0FycmF5U3R5bGUoYm9vbCBlbmFibGVkKTsKLSAgICAKLSAgICBpbmxpbmUgY29uc3Qgdm9pZCogYnVmZmVyKCkgY29uc3Q7Ci0gICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3Q7Ci0gICAgaW5saW5lIHNpemVfdCBieXRlc1BlckxpbmUoKSBjb25zdDsKLSAgICBpbmxpbmUgaW50MzJfdCBzaW5nbGVMaW5lQ3V0b2ZmKCkgY29uc3Q7Ci0gICAgaW5saW5lIHNpemVfdCBhbGlnbm1lbnQoKSBjb25zdDsKLSAgICBpbmxpbmUgYm9vbCBjYXJyYXlTdHlsZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIGNvbnN0IHZvaWQqIG1CdWZmZXI7Ci0gICAgc2l6ZV90IG1TaXplOwotICAgIHNpemVfdCBtQnl0ZXNQZXJMaW5lOwotICAgIGludDMyX3QgbVNpbmdsZUxpbmVDdXRvZmY7Ci0gICAgc2l6ZV90IG1BbGlnbm1lbnQ7Ci0gICAgYm9vbCBtQ0FycmF5U3R5bGU7Ci19OwotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBIZXhEdW1wJiB2YWwpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vIHVzZXIgc2VydmljYWJsZSBwYXJ0cyBiZWxvdy4KLQotaW5saW5lIFRleHRPdXRwdXQmIGVuZGwoVGV4dE91dHB1dCYgdG8pCi17Ci0gICAgdG8ucHJpbnQoIlxuIiwgMSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1pbmxpbmUgVGV4dE91dHB1dCYgaW5kZW50KFRleHRPdXRwdXQmIHRvKQotewotICAgIHRvLm1vdmVJbmRlbnQoMSk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi1pbmxpbmUgVGV4dE91dHB1dCYgZGVkZW50KFRleHRPdXRwdXQmIHRvKQotewotICAgIHRvLm1vdmVJbmRlbnQoLTEpOwotICAgIHJldHVybiB0bzsKLX0KLQotaW5saW5lIFRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IGNoYXIqIHN0cikKLXsKLSAgICB0by5wcmludChzdHIsIHN0cmxlbihzdHIpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLWlubGluZSBUZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjaGFyIGMpCi17Ci0gICAgdG8ucHJpbnQoJmMsIDEpOwotICAgIHJldHVybiB0bzsKLX0KLQotaW5saW5lIFRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIFRleHRPdXRwdXRNYW5pcEZ1bmMgZnVuYykKLXsKLSAgICByZXR1cm4gKCpmdW5jKSh0byk7Ci19Ci0KLWlubGluZSBUeXBlQ29kZTo6VHlwZUNvZGUodWludDMyX3QgY29kZSkgOiBtQ29kZShjb2RlKSB7IH0KLWlubGluZSBUeXBlQ29kZTo6flR5cGVDb2RlKCkgeyB9Ci1pbmxpbmUgdWludDMyX3QgVHlwZUNvZGU6OnR5cGVDb2RlKCkgY29uc3QgeyByZXR1cm4gbUNvZGU7IH0KLQotaW5saW5lIEhleER1bXA6On5IZXhEdW1wKCkgeyB9Ci0KLWlubGluZSBIZXhEdW1wJiBIZXhEdW1wOjpzZXRCeXRlc1BlckxpbmUoc2l6ZV90IGJ5dGVzUGVyTGluZSkgewotICAgIG1CeXRlc1BlckxpbmUgPSBieXRlc1BlckxpbmU7IHJldHVybiAqdGhpczsKLX0KLWlubGluZSBIZXhEdW1wJiBIZXhEdW1wOjpzZXRTaW5nbGVMaW5lQ3V0b2ZmKGludDMyX3QgYnl0ZXMpIHsKLSAgICBtU2luZ2xlTGluZUN1dG9mZiA9IGJ5dGVzOyByZXR1cm4gKnRoaXM7Ci19Ci1pbmxpbmUgSGV4RHVtcCYgSGV4RHVtcDo6c2V0QWxpZ25tZW50KHNpemVfdCBhbGlnbm1lbnQpIHsKLSAgICBtQWxpZ25tZW50ID0gYWxpZ25tZW50OyByZXR1cm4gKnRoaXM7Ci19Ci1pbmxpbmUgSGV4RHVtcCYgSGV4RHVtcDo6c2V0Q0FycmF5U3R5bGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgbUNBcnJheVN0eWxlID0gZW5hYmxlZDsgcmV0dXJuICp0aGlzOwotfQotCi1pbmxpbmUgY29uc3Qgdm9pZCogSGV4RHVtcDo6YnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQotaW5saW5lIHNpemVfdCBIZXhEdW1wOjpzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KLWlubGluZSBzaXplX3QgSGV4RHVtcDo6Ynl0ZXNQZXJMaW5lKCkgY29uc3QgeyByZXR1cm4gbUJ5dGVzUGVyTGluZTsgfQotaW5saW5lIGludDMyX3QgSGV4RHVtcDo6c2luZ2xlTGluZUN1dG9mZigpIGNvbnN0IHsgcmV0dXJuIG1TaW5nbGVMaW5lQ3V0b2ZmOyB9Ci1pbmxpbmUgc2l6ZV90IEhleER1bXA6OmFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIG1BbGlnbm1lbnQ7IH0KLWlubGluZSBib29sIEhleER1bXA6OmNhcnJheVN0eWxlKCkgY29uc3QgeyByZXR1cm4gbUNBcnJheVN0eWxlOyB9Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfVEVYVE9VVFBVVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1RocmVhZC5oIGIvaW5jbHVkZS91dGlscy9UaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzNGFiZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1RocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9MSUJTX1VUSUxTX1RIUkVBRF9ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX1RIUkVBRF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0jIGluY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkRGVmcy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUaHJlYWQgOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgLy8gQ3JlYXRlIGEgVGhyZWFkIG9iamVjdCwgYnV0IGRvZXNuJ3QgY3JlYXRlIG9yIHN0YXJ0IHRoZSBhc3NvY2lhdGVkCi0gICAgLy8gdGhyZWFkLiBTZWUgdGhlIHJ1bigpIG1ldGhvZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZChib29sIGNhbkNhbGxKYXZhID0gdHJ1ZSk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkKCk7Ci0KLSAgICAvLyBTdGFydCB0aGUgdGhyZWFkIGluIHRocmVhZExvb3AoKSB3aGljaCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJ1biggICAgY29uc3QgY2hhciogbmFtZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBQUklPUklUWV9ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhY2sgPSAwKTsKLSAgICAKLSAgICAvLyBBc2sgdGhpcyBvYmplY3QncyB0aHJlYWQgdG8gZXhpdC4gVGhpcyBmdW5jdGlvbiBpcyBhc3luY2hyb25vdXMsIHdoZW4gdGhlCi0gICAgLy8gZnVuY3Rpb24gcmV0dXJucyB0aGUgdGhyZWFkIG1pZ2h0IHN0aWxsIGJlIHJ1bm5pbmcuIE9mIGNvdXJzZSwgdGhpcwotICAgIC8vIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQuCi0gICAgdmlydHVhbCB2b2lkICAgICAgICByZXF1ZXN0RXhpdCgpOwotCi0gICAgLy8gR29vZCBwbGFjZSB0byBkbyBvbmUtdGltZSBpbml0aWFsaXphdGlvbnMKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKLSAgICAKLSAgICAvLyBDYWxsIHJlcXVlc3RFeGl0KCkgYW5kIHdhaXQgdW50aWwgdGhpcyBvYmplY3QncyB0aHJlYWQgZXhpdHMuCi0gICAgLy8gQkUgVkVSWSBDQVJFRlVMIG9mIGRlYWRsb2Nrcy4gSW4gcGFydGljdWxhciwgaXQgd291bGQgYmUgc2lsbHkgdG8gY2FsbAotICAgIC8vIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGlzIG9iamVjdCdzIHRocmVhZC4gV2lsbCByZXR1cm4gV09VTERfQkxPQ0sgaW4KLSAgICAvLyB0aGF0IGNhc2UuCi0gICAgICAgICAgICBzdGF0dXNfdCAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLQotICAgIC8vIFdhaXQgdW50aWwgdGhpcyBvYmplY3QncyB0aHJlYWQgZXhpdHMuIFJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm90IHlldCBydW5uaW5nLgotICAgIC8vIERvIG5vdCBjYWxsIGZyb20gdGhpcyBvYmplY3QncyB0aHJlYWQ7IHdpbGwgcmV0dXJuIFdPVUxEX0JMT0NLIGluIHRoYXQgY2FzZS4KLSAgICAgICAgICAgIHN0YXR1c190ICAgIGpvaW4oKTsKLQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIC8vIFJldHVybiB0aGUgdGhyZWFkJ3Mga2VybmVsIElELCBzYW1lIGFzIHRoZSB0aHJlYWQgaXRzZWxmIGNhbGxpbmcgZ2V0dGlkKCkgb3IKLSAgICAvLyBhbmRyb2lkR2V0VGlkKCksIG9yIC0xIGlmIHRoZSB0aHJlYWQgaXMgbm90IHJ1bm5pbmcuCi0gICAgICAgICAgICBwaWRfdCAgICAgICBnZXRUaWQoKSBjb25zdDsKLSNlbmRpZgotCi1wcm90ZWN0ZWQ6Ci0gICAgLy8gZXhpdFBlbmRpbmcoKSByZXR1cm5zIHRydWUgaWYgcmVxdWVzdEV4aXQoKSBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICAgICBib29sICAgICAgICBleGl0UGVuZGluZygpIGNvbnN0OwotICAgIAotcHJpdmF0ZToKLSAgICAvLyBEZXJpdmVkIGNsYXNzIG11c3QgaW1wbGVtZW50IHRocmVhZExvb3AoKS4gVGhlIHRocmVhZCBzdGFydHMgaXRzIGxpZmUKLSAgICAvLyBoZXJlLiBUaGVyZSBhcmUgdHdvIHdheXMgb2YgdXNpbmcgdGhlIFRocmVhZCBvYmplY3Q6Ci0gICAgLy8gMSkgbG9vcDogaWYgdGhyZWFkTG9vcCgpIHJldHVybnMgdHJ1ZSwgaXQgd2lsbCBiZSBjYWxsZWQgYWdhaW4gaWYKLSAgICAvLyAgICAgICAgICByZXF1ZXN0RXhpdCgpIHdhc24ndCBjYWxsZWQuCi0gICAgLy8gMikgb25jZTogaWYgdGhyZWFkTG9vcCgpIHJldHVybnMgZmFsc2UsIHRoZSB0aHJlYWQgd2lsbCBleGl0IHVwb24gcmV0dXJuLgotICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpID0gMDsKLQotcHJpdmF0ZToKLSAgICBUaHJlYWQmIG9wZXJhdG9yPShjb25zdCBUaHJlYWQmKTsKLSAgICBzdGF0aWMgIGludCAgICAgICAgICAgICBfdGhyZWFkTG9vcCh2b2lkKiB1c2VyKTsKLSAgICBjb25zdCAgIGJvb2wgICAgICAgICAgICBtQ2FuQ2FsbEphdmE7Ci0gICAgLy8gYWx3YXlzIGhvbGQgbUxvY2sgd2hlbiByZWFkaW5nIG9yIHdyaXRpbmcKLSAgICAgICAgICAgIHRocmVhZF9pZF90ICAgICBtVGhyZWFkOwotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOwotICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgIG1UaHJlYWRFeGl0ZWRDb25kaXRpb247Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgbVN0YXR1czsKLSAgICAvLyBub3RlIHRoYXQgYWxsIGFjY2Vzc2VzIG9mIG1FeGl0UGVuZGluZyBhbmQgbVJ1bm5pbmcgbmVlZCB0byBob2xkIG1Mb2NrCi0gICAgdm9sYXRpbGUgYm9vbCAgICAgICAgICAgbUV4aXRQZW5kaW5nOwotICAgIHZvbGF0aWxlIGJvb2wgICAgICAgICAgIG1SdW5uaW5nOwotICAgICAgICAgICAgc3A8VGhyZWFkPiAgICAgIG1Ib2xkU2VsZjsKLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICAvLyBsZWdhY3kgZm9yIGRlYnVnZ2luZywgbm90IHVzZWQgYnkgZ2V0VGlkKCkgYXMgaXQgaXMgc2V0IGJ5IHRoZSBjaGlsZCB0aHJlYWQKLSAgICAvLyBhbmQgc28gaXMgbm90IGluaXRpYWxpemVkIHVudGlsIHRoZSBjaGlsZCByZWFjaGVzIHRoYXQgcG9pbnQKLSAgICAgICAgICAgIHBpZF90ICAgICAgICAgICBtVGlkOwotI2VuZGlmCi19OwotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX1RIUkVBRF9ICi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVGhyZWFkRGVmcy5oIGIvaW5jbHVkZS91dGlscy9UaHJlYWREZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTYzNzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9UaHJlYWREZWZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX0xJQlNfVVRJTFNfVEhSRUFEX0RFRlNfSAotI2RlZmluZSBfTElCU19VVElMU19USFJFQURfREVGU19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDIEFQSQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLXR5cGVkZWYgdm9pZCogYW5kcm9pZF90aHJlYWRfaWRfdDsKLQotdHlwZWRlZiBpbnQgKCphbmRyb2lkX3RocmVhZF9mdW5jX3QpKHZvaWQqKTsKLQotZW51bSB7Ci0gICAgLyoKLSAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqICoqIEtlZXAgaW4gc3luYyB3aXRoIGFuZHJvaWQub3MuUHJvY2Vzcy5qYXZhICoqCi0gICAgICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiAKLSAgICAgKiBUaGlzIG1hcHMgZGlyZWN0bHkgdG8gdGhlICJuaWNlIiBwcmlvcml0aWVzIHdlIHVzZSBpbiBBbmRyb2lkLgotICAgICAqIEEgdGhyZWFkIHByaW9yaXR5IHNob3VsZCBiZSBjaG9zZW4gaW52ZXJzZS1wcm9wb3J0aW9uYWxseSB0bwotICAgICAqIHRoZSBhbW91bnQgb2Ygd29yayB0aGUgdGhyZWFkIGlzIGV4cGVjdGVkIHRvIGRvLiBUaGUgbW9yZSB3b3JrCi0gICAgICogYSB0aHJlYWQgd2lsbCBkbywgdGhlIGxlc3MgZmF2b3JhYmxlIHByaW9yaXR5IGl0IHNob3VsZCBnZXQgc28gdGhhdCAKLSAgICAgKiBpdCBkb2Vzbid0IHN0YXJ2ZSB0aGUgc3lzdGVtLiBUaHJlYWRzIG5vdCBiZWhhdmluZyBwcm9wZXJseSBtaWdodAotICAgICAqIGJlICJwdW5pc2hlZCIgYnkgdGhlIGtlcm5lbC4KLSAgICAgKiBVc2UgdGhlIGxldmVscyBiZWxvdyB3aGVuIGFwcHJvcHJpYXRlLiBJbnRlcm1lZGlhdGUgdmFsdWVzIGFyZQotICAgICAqIGFjY2VwdGFibGUsIHByZWZlcmFibHkgdXNlIHRoZSB7TU9SRXxMRVNTfV9GQVZPUkFCTEUgY29uc3RhbnRzIGJlbG93LgotICAgICAqLwotICAgIEFORFJPSURfUFJJT1JJVFlfTE9XRVNUICAgICAgICAgPSAgMTksCi0KLSAgICAvKiB1c2UgZm9yIGJhY2tncm91bmQgdGFza3MgKi8KLSAgICBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQgICAgID0gIDEwLAotICAgIAotICAgIC8qIG1vc3QgdGhyZWFkcyBydW4gYXQgbm9ybWFsIHByaW9yaXR5ICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9OT1JNQUwgICAgICAgICA9ICAgMCwKLSAgICAKLSAgICAvKiB0aHJlYWRzIGN1cnJlbnRseSBydW5uaW5nIGEgVUkgdGhhdCB0aGUgdXNlciBpcyBpbnRlcmFjdGluZyB3aXRoICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EICAgICA9ICAtMiwKLQotICAgIC8qIHRoZSBtYWluIFVJIHRocmVhZCBoYXMgYSBzbGlnaHRseSBtb3JlIGZhdm9yYWJsZSBwcmlvcml0eSAqLwotICAgIEFORFJPSURfUFJJT1JJVFlfRElTUExBWSAgICAgICAgPSAgLTQsCi0gICAgCi0gICAgLyogdWkgc2VydmljZSB0cmVhZHMgbWlnaHQgd2FudCB0byBydW4gYXQgYSB1cmdlbnQgZGlzcGxheSAodW5jb21tb24pICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfRElTUExBWSA9ICBIQUxfUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVksCi0gICAgCi0gICAgLyogYWxsIG5vcm1hbCBhdWRpbyB0aHJlYWRzICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9BVURJTyAgICAgICAgICA9IC0xNiwKLSAgICAKLSAgICAvKiBzZXJ2aWNlIGF1ZGlvIHRocmVhZHMgKHVuY29tbW9uKSAqLwotICAgIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPICAgPSAtMTksCi0KLSAgICAvKiBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpbiBwcmFjdGljZS4gcmVndWxhciBwcm9jZXNzIG1pZ2h0IG5vdCAKLSAgICAgKiBiZSBhbGxvd2VkIHRvIHVzZSB0aGlzIGxldmVsICovCi0gICAgQU5EUk9JRF9QUklPUklUWV9ISUdIRVNUICAgICAgICA9IC0yMCwKLQotICAgIEFORFJPSURfUFJJT1JJVFlfREVGQVVMVCAgICAgICAgPSBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCwKLSAgICBBTkRST0lEX1BSSU9SSVRZX01PUkVfRkFWT1JBQkxFID0gLTEsCi0gICAgQU5EUk9JRF9QUklPUklUWV9MRVNTX0ZBVk9SQUJMRSA9ICsxLAotfTsKLQotZW51bSB7Ci0gICAgQU5EUk9JRF9UR1JPVVBfREVGQVVMVCAgICAgICAgICA9IDAsCi0gICAgQU5EUk9JRF9UR1JPVVBfQkdfTk9OSU5URVJBQ1QgICA9IDEsCi0gICAgQU5EUk9JRF9UR1JPVVBfRkdfQk9PU1QgICAgICAgICA9IDIsCi0gICAgQU5EUk9JRF9UR1JPVVBfTUFYICAgICAgICAgICAgICA9IEFORFJPSURfVEdST1VQX0ZHX0JPT1NULAotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEMrKyBBUEkKLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgYW5kcm9pZF90aHJlYWRfaWRfdCB0aHJlYWRfaWRfdDsKLXR5cGVkZWYgYW5kcm9pZF90aHJlYWRfZnVuY190IHRocmVhZF9mdW5jX3Q7Ci0KLWVudW0gewotICAgIFBSSU9SSVRZX0xPV0VTVCAgICAgICAgID0gQU5EUk9JRF9QUklPUklUWV9MT1dFU1QsCi0gICAgUFJJT1JJVFlfQkFDS0dST1VORCAgICAgPSBBTkRST0lEX1BSSU9SSVRZX0JBQ0tHUk9VTkQsCi0gICAgUFJJT1JJVFlfTk9STUFMICAgICAgICAgPSBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCwKLSAgICBQUklPUklUWV9GT1JFR1JPVU5EICAgICA9IEFORFJPSURfUFJJT1JJVFlfRk9SRUdST1VORCwKLSAgICBQUklPUklUWV9ESVNQTEFZICAgICAgICA9IEFORFJPSURfUFJJT1JJVFlfRElTUExBWSwKLSAgICBQUklPUklUWV9VUkdFTlRfRElTUExBWSA9IEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVksCi0gICAgUFJJT1JJVFlfQVVESU8gICAgICAgICAgPSBBTkRST0lEX1BSSU9SSVRZX0FVRElPLAotICAgIFBSSU9SSVRZX1VSR0VOVF9BVURJTyAgID0gQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8sCi0gICAgUFJJT1JJVFlfSElHSEVTVCAgICAgICAgPSBBTkRST0lEX1BSSU9SSVRZX0hJR0hFU1QsCi0gICAgUFJJT1JJVFlfREVGQVVMVCAgICAgICAgPSBBTkRST0lEX1BSSU9SSVRZX0RFRkFVTFQsCi0gICAgUFJJT1JJVFlfTU9SRV9GQVZPUkFCTEUgPSBBTkRST0lEX1BSSU9SSVRZX01PUkVfRkFWT1JBQkxFLAotICAgIFBSSU9SSVRZX0xFU1NfRkFWT1JBQkxFID0gQU5EUk9JRF9QUklPUklUWV9MRVNTX0ZBVk9SQUJMRSwKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLSNlbmRpZiAgLy8gX19jcGx1c3BsdXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19USFJFQURfREVGU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1RpbWVycy5oIGIvaW5jbHVkZS91dGlscy9UaW1lcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0ZDMyMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1RpbWVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gVGltZXIgZnVuY3Rpb25zLgotLy8KLSNpZm5kZWYgX0xJQlNfVVRJTFNfVElNRVJTX0gKLSNkZWZpbmUgX0xJQlNfVVRJTFNfVElNRVJTX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQyBBUEkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIGludDY0X3QgbnNlY3NfdDsgICAgICAgLy8gbmFuby1zZWNvbmRzCi0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBzZWNvbmRzX3RvX25hbm9zZWNvbmRzKG5zZWNzX3Qgc2VjcykKLXsKLSAgICByZXR1cm4gc2VjcyoxMDAwMDAwMDAwOwotfQotCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKG5zZWNzX3Qgc2VjcykKLXsKLSAgICByZXR1cm4gc2VjcyoxMDAwMDAwOwotfQotCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbWljcm9zZWNvbmRzX3RvX25hbm9zZWNvbmRzKG5zZWNzX3Qgc2VjcykKLXsKLSAgICByZXR1cm4gc2VjcyoxMDAwOwotfQotCi1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbmFub3NlY29uZHNfdG9fc2Vjb25kcyhuc2Vjc190IHNlY3MpCi17Ci0gICAgcmV0dXJuIHNlY3MvMTAwMDAwMDAwMDsKLX0KLQotc3RhdGljIGlubGluZSBuc2Vjc190IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhuc2Vjc190IHNlY3MpCi17Ci0gICAgcmV0dXJuIHNlY3MvMTAwMDAwMDsKLX0KLQotc3RhdGljIGlubGluZSBuc2Vjc190IG5hbm9zZWNvbmRzX3RvX21pY3Jvc2Vjb25kcyhuc2Vjc190IHNlY3MpCi17Ci0gICAgcmV0dXJuIHNlY3MvMTAwMDsKLX0KLQotc3RhdGljIGlubGluZSBuc2Vjc190IHMybnMobnNlY3NfdCB2KSAge3JldHVybiBzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHYpO30KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBtczJucyhuc2Vjc190IHYpIHtyZXR1cm4gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHYpO30KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCB1czJucyhuc2Vjc190IHYpIHtyZXR1cm4gbWljcm9zZWNvbmRzX3RvX25hbm9zZWNvbmRzKHYpO30KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBuczJzKG5zZWNzX3QgdikgIHtyZXR1cm4gbmFub3NlY29uZHNfdG9fc2Vjb25kcyh2KTt9Ci1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbnMybXMobnNlY3NfdCB2KSB7cmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh2KTt9Ci1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbnMydXMobnNlY3NfdCB2KSB7cmV0dXJuIG5hbm9zZWNvbmRzX3RvX21pY3Jvc2Vjb25kcyh2KTt9Ci0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBzZWNvbmRzKG5zZWNzX3QgdikgICAgICB7IHJldHVybiBzMm5zKHYpOyB9Ci1zdGF0aWMgaW5saW5lIG5zZWNzX3QgbWlsbGlzZWNvbmRzKG5zZWNzX3QgdikgeyByZXR1cm4gbXMybnModik7IH0KLXN0YXRpYyBpbmxpbmUgbnNlY3NfdCBtaWNyb3NlY29uZHMobnNlY3NfdCB2KSB7IHJldHVybiB1czJucyh2KTsgfQotCi1lbnVtIHsKLSAgICBTWVNURU1fVElNRV9SRUFMVElNRSA9IDAsICAvLyBzeXN0ZW0td2lkZSByZWFsdGltZSBjbG9jawotICAgIFNZU1RFTV9USU1FX01PTk9UT05JQyA9IDEsIC8vIG1vbm90b25pYyB0aW1lIHNpbmNlIHVuc3BlY2lmaWVkIHN0YXJ0aW5nIHBvaW50Ci0gICAgU1lTVEVNX1RJTUVfUFJPQ0VTUyA9IDIsICAgLy8gaGlnaC1yZXNvbHV0aW9uIHBlci1wcm9jZXNzIGNsb2NrCi0gICAgU1lTVEVNX1RJTUVfVEhSRUFEID0gMyAgICAgLy8gaGlnaC1yZXNvbHV0aW9uIHBlci10aHJlYWQgY2xvY2sKLX07Ci0gICAgCi0vLyByZXR1cm4gdGhlIHN5c3RlbS10aW1lIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsb2NrCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5zZWNzX3Qgc3lzdGVtVGltZShpbnQgY2xvY2sgPSBTWVNURU1fVElNRV9NT05PVE9OSUMpOwotI2Vsc2UKLW5zZWNzX3Qgc3lzdGVtVGltZShpbnQgY2xvY2spOwotI2VuZGlmIC8vIGRlZiBfX2NwbHVzcGx1cwotCi0vKioKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgdGltZSBhbmQgdGhlIHRpbWVvdXQgdGltZS4KLSAqIElmIHRoZSB0aW1lb3V0IGlzIGluIHRoZSBwYXN0IHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgdGltZSwgcmV0dXJucyAwLgotICogSWYgdGhlIHRpbWVvdXQgaXMgbW9yZSB0aGFuIElOVF9NQVggbWlsbGlzZWNvbmRzIGluIHRoZSBmdXR1cmUgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSB0aW1lLAotICogc3VjaCBhcyB3aGVuIHRpbWVvdXRUaW1lID09IExMT05HX01BWCwgcmV0dXJucyAtMSB0byBpbmRpY2F0ZSBhbiBpbmZpbml0ZSB0aW1lb3V0IGRlbGF5LgotICogT3RoZXJ3aXNlLCByZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlZmVyZW5jZSB0aW1lIGFuZCB0aW1lb3V0IHRpbWUKLSAqIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbWlsbGlzZWNvbmQuCi0gKi8KLWludCB0b01pbGxpc2Vjb25kVGltZW91dERlbGF5KG5zZWNzX3QgcmVmZXJlbmNlVGltZSwgbnNlY3NfdCB0aW1lb3V0VGltZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDKysgQVBJCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vKgotICogVGltZSB0aGUgZHVyYXRpb24gb2Ygc29tZXRoaW5nLgotICoKLSAqIEluY2x1ZGVzIHNvbWUgdGltZXZhbCBtYW5pcHVsYXRpb24gZnVuY3Rpb25zLgotICovCi1jbGFzcyBEdXJhdGlvblRpbWVyIHsKLXB1YmxpYzoKLSAgICBEdXJhdGlvblRpbWVyKCkge30KLSAgICB+RHVyYXRpb25UaW1lcigpIHt9Ci0KLSAgICAvLyBTdGFydCB0aGUgdGltZXIuCi0gICAgdm9pZCBzdGFydCgpOwotICAgIC8vIFN0b3AgdGhlIHRpbWVyLgotICAgIHZvaWQgc3RvcCgpOwotICAgIC8vIEdldCB0aGUgZHVyYXRpb24gaW4gbWljcm9zZWNvbmRzLgotICAgIGxvbmcgbG9uZyBkdXJhdGlvblVzZWNzKCkgY29uc3Q7Ci0KLSAgICAvLyBTdWJ0cmFjdCB0d28gdGltZXZhbHMuICBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIChwdHYxLXB0djIpIGluCi0gICAgLy8gbWljcm9zZWNvbmRzLgotICAgIHN0YXRpYyBsb25nIGxvbmcgc3VidHJhY3RUaW1ldmFscyhjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHR2MSwKLSAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwqIHB0djIpOwotCi0gICAgLy8gQWRkIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgdG8gdGhlIHRpbWV2YWwuCi0gICAgc3RhdGljIHZvaWQgYWRkVG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsKiBwdHYsIGxvbmcgdXNlYyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IHRpbWV2YWwgIG1TdGFydFdoZW47Ci0gICAgc3RydWN0IHRpbWV2YWwgIG1TdG9wV2hlbjsKLX07Ci0KLX07IC8vIGFuZHJvaWQKLSNlbmRpZiAvLyBkZWYgX19jcGx1c3BsdXMKLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX1RJTUVSU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1Rva2VuaXplci5oIGIvaW5jbHVkZS91dGlscy9Ub2tlbml6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkYjVmYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1Rva2VuaXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9VVElMU19UT0tFTklaRVJfSAotI2RlZmluZSBfVVRJTFNfVE9LRU5JWkVSX0gKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0ZpbGVNYXAuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoqCi0gKiBBIHNpbXBsZSB0b2tlbml6ZXIgZm9yIGxvYWRpbmcgYW5kIHBhcnNpbmcgQVNDSUkgdGV4dCBmaWxlcyBsaW5lIGJ5IGxpbmUuCi0gKi8KLWNsYXNzIFRva2VuaXplciB7Ci0gICAgVG9rZW5pemVyKGNvbnN0IFN0cmluZzgmIGZpbGVuYW1lLCBGaWxlTWFwKiBmaWxlTWFwLCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOwotCi1wdWJsaWM6Ci0gICAgflRva2VuaXplcigpOwotCi0gICAgLyoqCi0gICAgICogT3BlbnMgYSBmaWxlIGFuZCBtYXBzIGl0IGludG8gbWVtb3J5LgotICAgICAqCi0gICAgICogUmV0dXJucyBOT19FUlJPUiBhbmQgYSB0b2tlbml6ZXIgZm9yIHRoZSBmaWxlLCBpZiBzdWNjZXNzZnVsLgotICAgICAqIE90aGVyd2lzZSByZXR1cm5zIGFuIGVycm9yIGFuZCBzZXRzIG91dFRva2VuaXplciB0byBOVUxMLgotICAgICAqLwotICAgIHN0YXRpYyBzdGF0dXNfdCBvcGVuKGNvbnN0IFN0cmluZzgmIGZpbGVuYW1lLCBUb2tlbml6ZXIqKiBvdXRUb2tlbml6ZXIpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAgICovCi0gICAgaW5saW5lIGJvb2wgaXNFb2YoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudCA9PSBnZXRFbmQoKTsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgZW5kIG9mIHRoZSBmaWxlLgotICAgICAqLwotICAgIGlubGluZSBib29sIGlzRW9sKCkgY29uc3QgeyByZXR1cm4gaXNFb2YoKSB8fCAqbUN1cnJlbnQgPT0gJ1xuJzsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KLSAgICAgKi8KLSAgICBpbmxpbmUgU3RyaW5nOCBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1GaWxlbmFtZTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIDEtYmFzZWQgbGluZSBudW1iZXIgaW5kZXggZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotICAgICAqLwotICAgIGlubGluZSBpbnQzMl90IGdldExpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtTGluZU51bWJlcjsgfQotCi0gICAgLyoqCi0gICAgICogRm9ybWF0cyBhIGxvY2F0aW9uIHN0cmluZyBjb25zaXN0aW5nIG9mIHRoZSBmaWxlbmFtZSBhbmQgY3VycmVudCBsaW5lIG51bWJlci4KLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGxpa2UgIk15RmlsZS50eHQ6MzMiLgotICAgICAqLwotICAgIFN0cmluZzggZ2V0TG9jYXRpb24oKSBjb25zdDsKLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgKiBSZXR1cm5zIG51bGwgYXQgZW5kIG9mIGZpbGUuCi0gICAgICovCi0gICAgaW5saW5lIGNoYXIgcGVla0NoYXIoKSBjb25zdCB7IHJldHVybiBpc0VvZigpID8gJ1wwJyA6ICptQ3VycmVudDsgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcmVtYWluZGVyIG9mIHRoZSBjdXJyZW50IGxpbmUgYXMgYSBzdHJpbmcsIGV4Y2x1ZGluZyB0aGUgbmV3bGluZSBjaGFyYWN0ZXIuCi0gICAgICovCi0gICAgU3RyaW5nOCBwZWVrUmVtYWluZGVyT2ZMaW5lKCkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGFkdmFuY2VzIHBhc3QgaXQuCi0gICAgICogUmV0dXJucyBudWxsIGF0IGVuZCBvZiBmaWxlLgotICAgICAqLwotICAgIGlubGluZSBjaGFyIG5leHRDaGFyKCkgeyByZXR1cm4gaXNFb2YoKSA/ICdcMCcgOiAqKG1DdXJyZW50KyspOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBuZXh0IHRva2VuIG9uIHRoaXMgbGluZSBzdG9wcGluZyBhdCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMKLSAgICAgKiBvciB0aGUgZW5kIG9mIHRoZSBsaW5lIHdoaWNoZXZlciBjb21lcyBmaXJzdCBhbmQgYWR2YW5jZXMgcGFzdCBpdC4KLSAgICAgKiBBbHNvIHN0b3BzIGF0IGVtYmVkZGVkIG51bGxzLgotICAgICAqIFJldHVybnMgdGhlIHRva2VuIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBkZWxpbWl0ZXIKLSAgICAgKiBvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgotICAgICAqLwotICAgIFN0cmluZzggbmV4dFRva2VuKGNvbnN0IGNoYXIqIGRlbGltaXRlcnMpOwotCi0gICAgLyoqCi0gICAgICogQWR2YW5jZXMgdG8gdGhlIG5leHQgbGluZS4KLSAgICAgKiBEb2VzIG5vdGhpbmcgaWYgYWxyZWFkeSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbmV4dExpbmUoKTsKLQotICAgIC8qKgotICAgICAqIFNraXBzIG92ZXIgdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXJzIGluIHRoZSBsaW5lLgotICAgICAqIEFsc28gc2tpcHMgZW1iZWRkZWQgbnVsbHMuCi0gICAgICovCi0gICAgdm9pZCBza2lwRGVsaW1pdGVycyhjb25zdCBjaGFyKiBkZWxpbWl0ZXJzKTsKLQotcHJpdmF0ZToKLSAgICBUb2tlbml6ZXIoY29uc3QgVG9rZW5pemVyJiBvdGhlcik7IC8vIG5vdCBjb3B5YWJsZQotCi0gICAgU3RyaW5nOCBtRmlsZW5hbWU7Ci0gICAgRmlsZU1hcCogbUZpbGVNYXA7Ci0gICAgY2hhciogbUJ1ZmZlcjsKLSAgICBzaXplX3QgbUxlbmd0aDsKLQotICAgIGNvbnN0IGNoYXIqIG1DdXJyZW50OwotICAgIGludDMyX3QgbUxpbmVOdW1iZXI7Ci0KLSAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0RW5kKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlciArIG1MZW5ndGg7IH0KLQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gX1VUSUxTX1RPS0VOSVpFUl9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1RyYWNlLmggYi9pbmNsdWRlL3V0aWxzL1RyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzM2RkZjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9UcmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVFJBQ0VfSAotI2RlZmluZSBBTkRST0lEX1RSQUNFX0gKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0vLyBUaGUgQVRSQUNFX1RBRyBtYWNybyBjYW4gYmUgZGVmaW5lZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIHRvIHRyYWNlCi0vLyB1c2luZyBvbmUgb2YgdGhlIHRhZ3MgZGVmaW5lZCBiZWxvdy4gIEl0IG11c3QgYmUgZGVmaW5lZCB0byBvbmUgb2YgdGhlCi0vLyBmb2xsb3dpbmcgQVRSQUNFX1RBR18qIG1hY3Jvcy4gIFRoZSB0cmFjZSB0YWcgaXMgdXNlZCB0byBmaWx0ZXIgdHJhY2luZyBpbgotLy8gdXNlcmxhbmQgdG8gYXZvaWQgc29tZSBvZiB0aGUgcnVudGltZSBjb3N0IG9mIHRyYWNpbmcgd2hlbiBpdCBpcyBub3QgZGVzaXJlZC4KLS8vCi0vLyBEZWZpbmluZyBBVFJBQ0VfVEFHIHRvIGJlIEFUUkFDRV9UQUdfQUxXQVlTIHdpbGwgcmVzdWx0IGluIHRoZSB0cmFjaW5nIGFsd2F5cwotLy8gYmVpbmcgZW5hYmxlZCAtIHRoaXMgc2hvdWxkIE9OTFkgYmUgZG9uZSBmb3IgZGVidWcgY29kZSwgYXMgdXNlcmxhbmQgdHJhY2luZwotLy8gaGFzIGEgcGVyZm9ybWFuY2UgY29zdCBldmVuIHdoZW4gdGhlIHRyYWNlIGlzIG5vdCBiZWluZyByZWNvcmRlZC4gIERlZmluaW5nCi0vLyBBVFJBQ0VfVEFHIHRvIGJlIEFUUkFDRV9UQUdfTkVWRVIgb3IgbGVhdmluZyBBVFJBQ0VfVEFHIHVuZGVmaW5lZCB3aWxsIHJlc3VsdAotLy8gaW4gdGhlIHRyYWNpbmcgYWx3YXlzIGJlaW5nIGRpc2FibGVkLgotI2RlZmluZSBBVFJBQ0VfVEFHX05FVkVSICAgIDAgICAgICAgICAgIC8vIFRoZSAibmV2ZXIiIHRhZyBpcyBuZXZlciBlbmFibGVkLgotI2RlZmluZSBBVFJBQ0VfVEFHX0FMV0FZUyAgICgxPDwwKSAgICAgIC8vIFRoZSAiYWx3YXlzIiB0YWcgaXMgYWx3YXlzIGVuYWJsZWQuCi0jZGVmaW5lIEFUUkFDRV9UQUdfR1JBUEhJQ1MgKDE8PDEpCi0jZGVmaW5lIEFUUkFDRV9UQUdfTEFTVCAgICAgKDE8PDEpCi0KLSNkZWZpbmUgQVRSQUNFX1RBR19JTlZBTElEICh+KChBVFJBQ0VfVEFHX0xBU1QgLSAxKSB8IEFUUkFDRV9UQUdfTEFTVCkpCi0KLSNpZm5kZWYgQVRSQUNFX1RBRwotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfTkVWRVIKLSNlbGlmIEFUUkFDRV9UQUcgPiBBVFJBQ0VfVEFHX0xBU1QKLSNlcnJvciBBVFJBQ0VfVEFHIG11c3QgYmUgZGVmaW5lZCB0byBiZSBvbmUgb2YgdGhlIHRhZ3MgZGVmaW5lZCBpbiB1dGlscy9UcmFjZS5oCi0jZW5kaWYKLQotLy8gQVRSQUNFX0NBTEwgdHJhY2VzIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRvIHRyYWNlCi0vLyB0aGUgY29ycmVjdCBzdGFydCBhbmQgZW5kIHRpbWVzIHRoaXMgbWFjcm8gc2hvdWxkIGJlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZQotLy8gZnVuY3Rpb24gYm9keS4KLSNkZWZpbmUgQVRSQUNFX0NBTEwoKSBhbmRyb2lkOjpTY29wZWRUcmFjZSBfX190cmFjZXIoQVRSQUNFX1RBRywgX19GVU5DVElPTl9fKQotCi0vLyBBVFJBQ0VfSU5UIHRyYWNlcyBhIG5hbWVkIGludGVnZXIgdmFsdWUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHRyYWNrIGhvdyB0aGUKLS8vIHZhbHVlIGNoYW5nZXMgb3ZlciB0aW1lIGluIGEgdHJhY2UuCi0jZGVmaW5lIEFUUkFDRV9JTlQobmFtZSwgdmFsdWUpIGFuZHJvaWQ6OlRyYWNlcjo6dHJhY2VDb3VudGVyKEFUUkFDRV9UQUcsIG5hbWUsIHZhbHVlKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFRyYWNlciB7Ci0KLXB1YmxpYzoKLQotICAgIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZUNvdW50ZXIodWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgewotICAgICAgICBpZiAoIWFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmc0lzUmVhZHkpKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHRyYWNlRkQgPSBzVHJhY2VGRDsKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHRhZ0VuYWJsZWQodGFnKSAmJiB0cmFjZUZEICE9IC0xKSkgewotICAgICAgICAgICAgY2hhciBidWZbMTAyNF07Ci0gICAgICAgICAgICBzbnByaW50ZihidWYsIDEwMjQsICJDfCVkfCVzfCVkIiwgZ2V0cGlkKCksIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIHdyaXRlKHRyYWNlRkQsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGlubGluZSB2b2lkIHRyYWNlQmVnaW4odWludDY0X3QgdGFnLCBjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICAgICAgIGlmIChDQ19VTkxJS0VMWSghYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZzSXNSZWFkeSkpKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHRyYWNlRkQgPSBzVHJhY2VGRDsKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHRhZ0VuYWJsZWQodGFnKSAmJiAodHJhY2VGRCAhPSAtMSkpKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlsxMDI0XTsKLSAgICAgICAgICAgIHNpemVfdCBsZW4gPSBzbnByaW50ZihidWYsIDEwMjQsICJCfCVkfCVzIiwgZ2V0cGlkKCksIG5hbWUpOwotICAgICAgICAgICAgd3JpdGUodHJhY2VGRCwgYnVmLCBsZW4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICBzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VFbmQodWludDY0X3QgdGFnKSB7Ci0gICAgICAgIGlmIChDQ19VTkxJS0VMWSghYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZzSXNSZWFkeSkpKSB7Ci0gICAgICAgICAgICBpbml0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHRyYWNlRkQgPSBzVHJhY2VGRDsKLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHRhZ0VuYWJsZWQodGFnKSAmJiAodHJhY2VGRCAhPSAtMSkpKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZiA9ICdFJzsKLSAgICAgICAgICAgIHdyaXRlKHRyYWNlRkQsICZidWYsIDEpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgc3RhdGljIGlubGluZSBib29sIHRhZ0VuYWJsZWQodWludDY0X3QgdGFnKSB7Ci0gICAgICAgIHJldHVybiAhKHRhZyAmIEFUUkFDRV9UQUdfSU5WQUxJRCkgJiYgKHRhZyAmIHNFbmFibGVkVGFncyk7Ci0gICAgfQotCi0gICAgLy8gaW5pdCBvcGVucyB0aGUgdHJhY2UgbWFya2VyIGZpbGUgZm9yIHdyaXRpbmcgYW5kIHJlYWRzIHRoZQotICAgIC8vIGF0cmFjZS50YWdzLmVuYWJsZWZsYWdzIHN5c3RlbSBwcm9wZXJ0eS4gIEl0IGRvZXMgdGhpcyBvbmx5IHRoZSBmaXJzdAotICAgIC8vIHRpbWUgaXQgaXMgcnVuLCB1c2luZyBzTXV0ZXggZm9yIHN5bmNocm9uaXphdGlvbi4KLSAgICBzdGF0aWMgdm9pZCBpbml0KCk7Ci0KLSAgICAvLyBzSXNSZWFkeSBpcyBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIGEgY2FsbCB0byBpbml0KCkgaGFzCi0gICAgLy8gY29tcGxldGVkIGluIHRoaXMgcHJvY2Vzcy4gIEl0IGlzIGluaXRpYWxpemVkIHRvIDAgYW5kIHNldCB0byAxIHdoZW4gdGhlCi0gICAgLy8gZmlyc3QgaW5pdCgpIGNhbGwgY29tcGxldGVzLiAgSXQgaXMgc2V0IHRvIDEgZXZlbiBpZiBhIGZhaWx1cmUgb2NjdXJyZWQKLSAgICAvLyBpbiBpbml0IChlLmcuIHRoZSB0cmFjZSBtYXJrZXIgZmlsZSBjb3VsZG4ndCBiZSBvcGVuZWQpLgotICAgIC8vCi0gICAgLy8gVGhpcyBzaG91bGQgYmUgY2hlY2tlZCBieSBhbGwgdHJhY2luZyBmdW5jdGlvbnMgdXNpbmcgYW4gYXRvbWljIGFjcXVpcmUKLSAgICAvLyBsb2FkIG9wZXJhdGlvbiBiZWZvcmUgY2FsbGluZyBpbml0KCkuICBUaGlzIGNoZWNrIGF2b2lkcyB0aGUgbmVlZCB0byBsb2NrCi0gICAgLy8gYSBtdXRleCBlYWNoIHRpbWUgYSB0cmFjZSBmdW5jdGlvbiBnZXRzIGNhbGxlZC4KLSAgICBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBzSXNSZWFkeTsKLQotICAgIC8vIHNUcmFjZUZEIGlzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdXNlZCB0byB3cml0ZSB0byB0aGUga2VybmVsJ3MgdHJhY2UKLSAgICAvLyBidWZmZXIuICBJdCBpcyBpbml0aWFsaXplZCB0byAtMSBhbmQgc2V0IHRvIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGluCi0gICAgLy8gaW5pdCgpIHdoaWxlIGEgbG9jayBvbiBzTXV0ZXggaXMgaGVsZC4KLSAgICAvLwotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBhIHRyYWNlIGZ1bmN0aW9uIGFmdGVyIGluaXQoKSBoYXMKLSAgICAvLyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLgotICAgIHN0YXRpYyBpbnQgc1RyYWNlRkQ7Ci0KLSAgICAvLyBzRW5hYmxlZFRhZ3MgaXMgdGhlIHNldCBvZiB0YWcgYml0cyBmb3Igd2hpY2ggdHJhY2luZyBpcyBjdXJyZW50bHkKLSAgICAvLyBlbmFibGVkLiAgSXQgaXMgaW5pdGlhbGl6ZWQgdG8gMCBhbmQgc2V0IGJhc2VkIG9uIHRoZQotICAgIC8vIGF0cmFjZS50YWdzLmVuYWJsZWZsYWdzIHN5c3RlbSBwcm9wZXJ0eSBpbiBpbml0KCkgd2hpbGUgYSBsb2NrIG9uIHNNdXRleAotICAgIC8vIGlzIGhlbGQuCi0gICAgLy8KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgYSB0cmFjZSBmdW5jdGlvbiBhZnRlciBpbml0KCkgaGFzCi0gICAgLy8gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4KLSAgICBzdGF0aWMgdWludDY0X3Qgc0VuYWJsZWRUYWdzOwotCi0gICAgLy8gc011dGV4IGlzIHVzZWQgdG8gcHJvdGVjdCB0aGUgZXhlY3V0aW9uIG9mIGluaXQoKS4KLSAgICBzdGF0aWMgTXV0ZXggc011dGV4OwotfTsKLQotY2xhc3MgU2NvcGVkVHJhY2UgewotCi1wdWJsaWM6Ci0gICAgaW5saW5lIFNjb3BlZFRyYWNlKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciogbmFtZSkgOgotICAgICAgICAgICAgbVRhZyh0YWcpIHsKLSAgICAgICAgVHJhY2VyOjp0cmFjZUJlZ2luKG1UYWcsIG5hbWUpOwotICAgIH0KLQotICAgIGlubGluZSB+U2NvcGVkVHJhY2UoKSB7Ci0gICAgICAgIFRyYWNlcjo6dHJhY2VFbmQobVRhZyk7Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgdWludDY0X3QgbVRhZzsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1RSQUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaCBiL2luY2x1ZGUvdXRpbHMvVHlwZUhlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYzJkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL1R5cGVIZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9UWVBFX0hFTFBFUlNfSAotI2RlZmluZSBBTkRST0lEX1RZUEVfSEVMUEVSU19ICi0KLSNpbmNsdWRlIDxuZXc+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qCi0gKiBUeXBlcyB0cmFpdHMKLSAqLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfY3RvciB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfZHRvciB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfY29weSB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfbW92ZSB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHRyYWl0X3BvaW50ZXIgICAgICB7IGVudW0geyB2YWx1ZSA9IGZhbHNlIH07IH07ICAgIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCB0cmFpdF9wb2ludGVyPFQqPiAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUWVBFPgotc3RydWN0IHRyYWl0cyB7Ci0gICAgZW51bSB7Ci0gICAgICAgIC8vIHdoZXRoZXIgdGhpcyB0eXBlIGlzIGEgcG9pbnRlcgotICAgICAgICBpc19wb2ludGVyICAgICAgICAgID0gdHJhaXRfcG9pbnRlcjxUWVBFPjo6dmFsdWUsCi0gICAgICAgIC8vIHdoZXRoZXIgdGhpcyB0eXBlJ3MgY29uc3RydWN0b3IgaXMgYSBuby1vcAotICAgICAgICBoYXNfdHJpdmlhbF9jdG9yICAgID0gaXNfcG9pbnRlciB8fCB0cmFpdF90cml2aWFsX2N0b3I8VFlQRT46OnZhbHVlLAotICAgICAgICAvLyB3aGV0aGVyIHRoaXMgdHlwZSdzIGRlc3RydWN0b3IgaXMgYSBuby1vcAotICAgICAgICBoYXNfdHJpdmlhbF9kdG9yICAgID0gaXNfcG9pbnRlciB8fCB0cmFpdF90cml2aWFsX2R0b3I8VFlQRT46OnZhbHVlLAotICAgICAgICAvLyB3aGV0aGVyIHRoaXMgdHlwZSB0eXBlIGNhbiBiZSBjb3B5LWNvbnN0cnVjdGVkIHdpdGggbWVtY3B5Ci0gICAgICAgIGhhc190cml2aWFsX2NvcHkgICAgPSBpc19wb2ludGVyIHx8IHRyYWl0X3RyaXZpYWxfY29weTxUWVBFPjo6dmFsdWUsCi0gICAgICAgIC8vIHdoZXRoZXIgdGhpcyB0eXBlIGNhbiBiZSBtb3ZlZCB3aXRoIG1lbW1vdmUKLSAgICAgICAgaGFzX3RyaXZpYWxfbW92ZSAgICA9IGlzX3BvaW50ZXIgfHwgdHJhaXRfdHJpdmlhbF9tb3ZlPFRZUEU+Ojp2YWx1ZQotICAgIH07Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXN0cnVjdCBhZ2dyZWdhdGVfdHJhaXRzIHsKLSAgICBlbnVtIHsKLSAgICAgICAgaXNfcG9pbnRlciAgICAgICAgICA9IGZhbHNlLAotICAgICAgICBoYXNfdHJpdmlhbF9jdG9yICAgID0gCi0gICAgICAgICAgICB0cmFpdHM8VD46Omhhc190cml2aWFsX2N0b3IgJiYgdHJhaXRzPFU+OjpoYXNfdHJpdmlhbF9jdG9yLAotICAgICAgICBoYXNfdHJpdmlhbF9kdG9yICAgID0gCi0gICAgICAgICAgICB0cmFpdHM8VD46Omhhc190cml2aWFsX2R0b3IgJiYgdHJhaXRzPFU+OjpoYXNfdHJpdmlhbF9kdG9yLAotICAgICAgICBoYXNfdHJpdmlhbF9jb3B5ICAgID0gCi0gICAgICAgICAgICB0cmFpdHM8VD46Omhhc190cml2aWFsX2NvcHkgJiYgdHJhaXRzPFU+OjpoYXNfdHJpdmlhbF9jb3B5LAotICAgICAgICBoYXNfdHJpdmlhbF9tb3ZlICAgID0gCi0gICAgICAgICAgICB0cmFpdHM8VD46Omhhc190cml2aWFsX21vdmUgJiYgdHJhaXRzPFU+OjpoYXNfdHJpdmlhbF9tb3ZlCi0gICAgfTsKLX07Ci0KLSNkZWZpbmUgQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIFQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGU8PiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jdG9yPCBUID4gICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsgXAotICAgIHRlbXBsYXRlPD4gc3RydWN0IHRyYWl0X3RyaXZpYWxfZHRvcjwgVCA+ICAgeyBlbnVtIHsgdmFsdWUgPSB0cnVlIH07IH07IFwKLSAgICB0ZW1wbGF0ZTw+IHN0cnVjdCB0cmFpdF90cml2aWFsX2NvcHk8IFQgPiAgIHsgZW51bSB7IHZhbHVlID0gdHJ1ZSB9OyB9OyBcCi0gICAgdGVtcGxhdGU8PiBzdHJ1Y3QgdHJhaXRfdHJpdmlhbF9tb3ZlPCBUID4gICB7IGVudW0geyB2YWx1ZSA9IHRydWUgfTsgfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBiYXNpYyB0eXBlcyB0cmFpdHMKLSAqLwotCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdm9pZCApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggYm9vbCApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggY2hhciApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdW5zaWduZWQgY2hhciApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggc2hvcnQgKQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIHVuc2lnbmVkIHNob3J0ICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBpbnQgKQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIHVuc2lnbmVkIGludCApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggbG9uZyApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggdW5zaWduZWQgbG9uZyApCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyggbG9uZyBsb25nICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCB1bnNpZ25lZCBsb25nIGxvbmcgKQotQU5EUk9JRF9CQVNJQ19UWVBFU19UUkFJVFMoIGZsb2F0ICkKLUFORFJPSURfQkFTSUNfVFlQRVNfVFJBSVRTKCBkb3VibGUgKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vKgotICogY29tcGFyZSBhbmQgb3JkZXIgdHlwZXMKLSAqLwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLWludCBzdHJpY3RseV9vcmRlcl90eXBlKGNvbnN0IFRZUEUmIGxocywgY29uc3QgVFlQRSYgcmhzKSB7Ci0gICAgcmV0dXJuIChsaHMgPCByaHMpID8gMSA6IDA7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotaW50IGNvbXBhcmVfdHlwZShjb25zdCBUWVBFJiBsaHMsIGNvbnN0IFRZUEUmIHJocykgewotICAgIHJldHVybiBzdHJpY3RseV9vcmRlcl90eXBlKHJocywgbGhzKSAtIHN0cmljdGx5X29yZGVyX3R5cGUobGhzLCByaHMpOwotfQotCi0vKgotICogY3JlYXRlLCBkZXN0cm95LCBjb3B5IGFuZCBtb3ZlIHR5cGVzLi4uCi0gKi8KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIGNvbnN0cnVjdF90eXBlKFRZUEUqIHAsIHNpemVfdCBuKSB7Ci0gICAgaWYgKCF0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2N0b3IpIHsKLSAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgbmV3KHArKykgVFlQRTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIGRlc3Ryb3lfdHlwZShUWVBFKiBwLCBzaXplX3QgbikgewotICAgIGlmICghdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9kdG9yKSB7Ci0gICAgICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgICAgIHAtPn5UWVBFKCk7Ci0gICAgICAgICAgICBwKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotdm9pZCBjb3B5X3R5cGUoVFlQRSogZCwgY29uc3QgVFlQRSogcywgc2l6ZV90IG4pIHsKLSAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfY29weSkgewotICAgICAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgICAgICBuZXcoZCkgVFlQRSgqcyk7Ci0gICAgICAgICAgICBkKyssIHMrKzsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1lbWNweShkLHMsbipzaXplb2YoVFlQRSkpOwotICAgIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVFlQRT4gaW5saW5lCi12b2lkIHNwbGF0X3R5cGUoVFlQRSogd2hlcmUsIGNvbnN0IFRZUEUqIHdoYXQsIHNpemVfdCBuKSB7Ci0gICAgaWYgKCF0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIHsKLSAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgbmV3KHdoZXJlKSBUWVBFKCp3aGF0KTsKLSAgICAgICAgICAgIHdoZXJlKys7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgICAgICAqd2hlcmUrKyA9ICp3aGF0OwotICAgICAgICB9Ci0gICAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUWVBFPiBpbmxpbmUKLXZvaWQgbW92ZV9mb3J3YXJkX3R5cGUoVFlQRSogZCwgY29uc3QgVFlQRSogcywgc2l6ZV90IG4gPSAxKSB7Ci0gICAgaWYgKCh0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2R0b3IgJiYgdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jb3B5KSAKLSAgICAgICAgICAgIHx8IHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfbW92ZSkgCi0gICAgewotICAgICAgICBtZW1tb3ZlKGQscyxuKnNpemVvZihUWVBFKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZCArPSBuOwotICAgICAgICBzICs9IG47Ci0gICAgICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgICAgIC0tZCwgLS1zOwotICAgICAgICAgICAgaWYgKCF0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIHsKLSAgICAgICAgICAgICAgICBuZXcoZCkgVFlQRSgqcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpkID0gKnM7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvcikgewotICAgICAgICAgICAgICAgIHMtPn5UWVBFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+IGlubGluZQotdm9pZCBtb3ZlX2JhY2t3YXJkX3R5cGUoVFlQRSogZCwgY29uc3QgVFlQRSogcywgc2l6ZV90IG4gPSAxKSB7Ci0gICAgaWYgKCh0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2R0b3IgJiYgdHJhaXRzPFRZUEU+OjpoYXNfdHJpdmlhbF9jb3B5KSAKLSAgICAgICAgICAgIHx8IHRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfbW92ZSkgCi0gICAgewotICAgICAgICBtZW1tb3ZlKGQscyxuKnNpemVvZihUWVBFKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKG4tLSkgewotICAgICAgICAgICAgaWYgKCF0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkpIHsKLSAgICAgICAgICAgICAgICBuZXcoZCkgVFlQRSgqcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpkID0gKnM7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXRyYWl0czxUWVBFPjo6aGFzX3RyaXZpYWxfZHRvcikgewotICAgICAgICAgICAgICAgIHMtPn5UWVBFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkKyssIHMrKzsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBhIGtleS92YWx1ZSBwYWlyCi0gKi8KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtFWSwgdHlwZW5hbWUgVkFMVUU+Ci1zdHJ1Y3Qga2V5X3ZhbHVlX3BhaXJfdCB7Ci0gICAgdHlwZWRlZiBLRVkga2V5X3Q7Ci0gICAgdHlwZWRlZiBWQUxVRSB2YWx1ZV90OwotCi0gICAgS0VZICAgICBrZXk7Ci0gICAgVkFMVUUgICB2YWx1ZTsKLSAgICBrZXlfdmFsdWVfcGFpcl90KCkgeyB9Ci0gICAga2V5X3ZhbHVlX3BhaXJfdChjb25zdCBrZXlfdmFsdWVfcGFpcl90JiBvKSA6IGtleShvLmtleSksIHZhbHVlKG8udmFsdWUpIHsgfQotICAgIGtleV92YWx1ZV9wYWlyX3QoY29uc3QgS0VZJiBrLCBjb25zdCBWQUxVRSYgdikgOiBrZXkoayksIHZhbHVlKHYpICB7IH0KLSAgICBrZXlfdmFsdWVfcGFpcl90KGNvbnN0IEtFWSYgaykgOiBrZXkoaykgeyB9Ci0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoY29uc3Qga2V5X3ZhbHVlX3BhaXJfdCYgbykgY29uc3QgewotICAgICAgICByZXR1cm4gc3RyaWN0bHlfb3JkZXJfdHlwZShrZXksIG8ua2V5KTsKLSAgICB9Ci0gICAgaW5saW5lIGNvbnN0IEtFWSYgZ2V0S2V5KCkgY29uc3QgewotICAgICAgICByZXR1cm4ga2V5OwotICAgIH0KLSAgICBpbmxpbmUgY29uc3QgVkFMVUUmIGdldFZhbHVlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1zdHJ1Y3QgdHJhaXRfdHJpdmlhbF9jdG9yPCBrZXlfdmFsdWVfcGFpcl90PEssIFY+ID4KLXsgZW51bSB7IHZhbHVlID0gYWdncmVnYXRlX3RyYWl0czxLLFY+OjpoYXNfdHJpdmlhbF9jdG9yIH07IH07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KLXN0cnVjdCB0cmFpdF90cml2aWFsX2R0b3I8IGtleV92YWx1ZV9wYWlyX3Q8SywgVj4gPgoteyBlbnVtIHsgdmFsdWUgPSBhZ2dyZWdhdGVfdHJhaXRzPEssVj46Omhhc190cml2aWFsX2R0b3IgfTsgfTsKLXRlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgotc3RydWN0IHRyYWl0X3RyaXZpYWxfY29weTwga2V5X3ZhbHVlX3BhaXJfdDxLLCBWPiA+Ci17IGVudW0geyB2YWx1ZSA9IGFnZ3JlZ2F0ZV90cmFpdHM8SyxWPjo6aGFzX3RyaXZpYWxfY29weSB9OyB9OwotdGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFY+Ci1zdHJ1Y3QgdHJhaXRfdHJpdmlhbF9tb3ZlPCBrZXlfdmFsdWVfcGFpcl90PEssIFY+ID4KLXsgZW51bSB7IHZhbHVlID0gYWdncmVnYXRlX3RyYWl0czxLLFY+OjpoYXNfdHJpdmlhbF9tb3ZlIH07IH07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKgotICogSGFzaCBjb2Rlcy4KLSAqLwotdHlwZWRlZiB1aW50MzJfdCBoYXNoX3Q7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5PgotaGFzaF90IGhhc2hfdHlwZShjb25zdCBUS2V5JiBrZXkpOwotCi0vKiBCdWlsdC1pbiBoYXNoIGNvZGUgc3BlY2lhbGl6YXRpb25zLgotICogQXNzdW1lcyBwb2ludGVycyBhcmUgMzJiaXQuICovCi0jZGVmaW5lIEFORFJPSURfSU5UMzJfSEFTSChUKSBcCi0gICAgICAgIHRlbXBsYXRlIDw+IGlubGluZSBoYXNoX3QgaGFzaF90eXBlKGNvbnN0IFQmIHZhbHVlKSB7IHJldHVybiBoYXNoX3QodmFsdWUpOyB9Ci0jZGVmaW5lIEFORFJPSURfSU5UNjRfSEFTSChUKSBcCi0gICAgICAgIHRlbXBsYXRlIDw+IGlubGluZSBoYXNoX3QgaGFzaF90eXBlKGNvbnN0IFQmIHZhbHVlKSB7IFwKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzaF90KCh2YWx1ZSA+PiAzMikgXiB2YWx1ZSk7IH0KLSNkZWZpbmUgQU5EUk9JRF9SRUlOVEVSUFJFVF9IQVNIKFQsIFIpIFwKLSAgICAgICAgdGVtcGxhdGUgPD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgVCYgdmFsdWUpIHsgXAotICAgICAgICAgICAgICAgIHJldHVybiBoYXNoX3R5cGUoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUio+KCZ2YWx1ZSkpOyB9Ci0KLUFORFJPSURfSU5UMzJfSEFTSChib29sKQotQU5EUk9JRF9JTlQzMl9IQVNIKGludDhfdCkKLUFORFJPSURfSU5UMzJfSEFTSCh1aW50OF90KQotQU5EUk9JRF9JTlQzMl9IQVNIKGludDE2X3QpCi1BTkRST0lEX0lOVDMyX0hBU0godWludDE2X3QpCi1BTkRST0lEX0lOVDMyX0hBU0goaW50MzJfdCkKLUFORFJPSURfSU5UMzJfSEFTSCh1aW50MzJfdCkKLUFORFJPSURfSU5UNjRfSEFTSChpbnQ2NF90KQotQU5EUk9JRF9JTlQ2NF9IQVNIKHVpbnQ2NF90KQotQU5EUk9JRF9SRUlOVEVSUFJFVF9IQVNIKGZsb2F0LCB1aW50MzJfdCkKLUFORFJPSURfUkVJTlRFUlBSRVRfSEFTSChkb3VibGUsIHVpbnQ2NF90KQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgVComIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGhhc2hfdHlwZSh1aW50cHRyX3QodmFsdWUpKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX1RZUEVfSEVMUEVSU19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3V0aWxzL1VuaWNvZGUuaCBiL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjczNTMzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvVW5pY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVU5JQ09ERV9ICi0jZGVmaW5lIEFORFJPSURfVU5JQ09ERV9ICi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotZXh0ZXJuICJDIiB7Ci0KLXR5cGVkZWYgdWludDMyX3QgY2hhcjMyX3Q7Ci10eXBlZGVmIHVpbnQxNl90IGNoYXIxNl90OwotCi0vLyBTdGFuZGFyZCBzdHJpbmcgZnVuY3Rpb25zIG9uIGNoYXIxNl90IHN0cmluZ3MuCi1pbnQgc3RyY21wMTYoY29uc3QgY2hhcjE2X3QgKiwgY29uc3QgY2hhcjE2X3QgKik7Ci1pbnQgc3RybmNtcDE2KGNvbnN0IGNoYXIxNl90ICpzMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3Qgbik7Ci1zaXplX3Qgc3RybGVuMTYoY29uc3QgY2hhcjE2X3QgKik7Ci1zaXplX3Qgc3RybmxlbjE2KGNvbnN0IGNoYXIxNl90ICosIHNpemVfdCk7Ci1jaGFyMTZfdCAqc3RyY3B5MTYoY2hhcjE2X3QgKiwgY29uc3QgY2hhcjE2X3QgKik7Ci1jaGFyMTZfdCAqc3RybmNweTE2KGNoYXIxNl90ICosIGNvbnN0IGNoYXIxNl90ICosIHNpemVfdCk7Ci0KLS8vIFZlcnNpb24gb2YgY29tcGFyaXNvbiB0aGF0IHN1cHBvcnRzIGVtYmVkZGVkIG51bGxzLgotLy8gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBzdHJuY21wKCkgYmVjYXVzZSB3ZSBkb24ndCBzdG9wCi0vLyBhdCBhIG51bCBjaGFyYWN0ZXIgYW5kIGNvbnNpZGVyIHRoZSBzdHJpbmdzIHRvIGJlIGRpZmZlcmVudAotLy8gaWYgdGhlIGxlbmd0aHMgYXJlIGRpZmZlcmVudCAodGh1cyB3ZSBuZWVkIHRvIHN1cHBseSB0aGUKLS8vIGxlbmd0aHMgb2YgYm90aCBzdHJpbmdzKS4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZCB3aGVuCi0vLyB5b3VyIHN0cmluZyBpcyBub3QgbnVsLXRlcm1pbmF0ZWQgYXMgaXQgd2lsbCBoYXZlIHRoZQotLy8gZXF1aXZhbGVudCByZXN1bHQgYXMgc3RyY21wMTYgKHVubGlrZSBzdHJuY21wMTYpLgotaW50IHN0cnpjbXAxNihjb25zdCBjaGFyMTZfdCAqczEsIHNpemVfdCBuMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3QgbjIpOwotCi0vLyBWZXJzaW9uIG9mIHN0cnpjbXAxNiBmb3IgY29tcGFyaW5nIHN0cmluZ3MgaW4gZGlmZmVyZW50IGVuZGlhbm5lc3MuCi1pbnQgc3RyemNtcDE2X2hfbihjb25zdCBjaGFyMTZfdCAqczFILCBzaXplX3QgbjEsIGNvbnN0IGNoYXIxNl90ICpzMk4sIHNpemVfdCBuMik7Ci0KLS8vIFN0YW5kYXJkIHN0cmluZyBmdW5jdGlvbnMgb24gY2hhcjMyX3Qgc3RyaW5ncy4KLXNpemVfdCBzdHJsZW4zMihjb25zdCBjaGFyMzJfdCAqKTsKLXNpemVfdCBzdHJubGVuMzIoY29uc3QgY2hhcjMyX3QgKiwgc2l6ZV90KTsKLQotLyoqCi0gKiBNZWFzdXJlIHRoZSBsZW5ndGggb2YgYSBVVEYtMzIgc3RyaW5nIGluIFVURi04LiBJZiB0aGUgc3RyaW5nIGlzIGludmFsaWQKLSAqIHN1Y2ggYXMgY29udGFpbmluZyBhIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIsIC0xIHdpbGwgYmUgcmV0dXJuZWQuCi0gKi8KLXNzaXplX3QgdXRmMzJfdG9fdXRmOF9sZW5ndGgoY29uc3QgY2hhcjMyX3QgKnNyYywgc2l6ZV90IHNyY19sZW4pOwotCi0vKioKLSAqIFN0b3JlcyBhIFVURi04IHN0cmluZyBjb252ZXJ0ZWQgZnJvbSAic3JjIiBpbiAiZHN0IiwgaWYgImRzdF9sZW5ndGgiIGlzIG5vdAotICogbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHRoZSBzdHJpbmcsIHRoZSBwYXJ0IG9mIHRoZSAic3JjIiBzdHJpbmcgaXMgc3RvcmVkCi0gKiBpbnRvICJkc3QiIGFzIG11Y2ggYXMgcG9zc2libGUuIFNlZSB0aGUgZXhhbXBsZXMgZm9yIG1vcmUgZGV0YWlsLgotICogUmV0dXJucyB0aGUgc2l6ZSBhY3R1YWxseSB1c2VkIGZvciBzdG9yaW5nIHRoZSBzdHJpbmcuCi0gKiBkc3QiIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQgd2hlbiBkc3RfbGVuIGlzIGZ1bGx5IHVzZWQgKGxpa2Ugc3RybmNweSkuCi0gKgotICogRXhhbXBsZSAxCi0gKiAic3JjIiA9PSBcdTMwNDJcdTMwNDQgKFx4RTNceDgxXHg4Mlx4RTNceDgxXHg4NCkKLSAqICJzcmNfbGVuIiA9PSAyCi0gKiAiZHN0X2xlbiIgPj0gNwotICogLT4KLSAqIFJldHVybmVkIHZhbHVlID09IDYKLSAqICJkc3QiIGJlY29tZXMgXHhFM1x4ODFceDgyXHhFM1x4ODFceDg0XDAKLSAqIChub3RlIHRoYXQgImRzdCIgaXMgbnVsbC10ZXJtaW5hdGVkKQotICoKLSAqIEV4YW1wbGUgMgotICogInNyYyIgPT0gXHUzMDQyXHUzMDQ0IChceEUzXHg4MVx4ODJceEUzXHg4MVx4ODQpCi0gKiAic3JjX2xlbiIgPT0gMgotICogImRzdF9sZW4iID09IDUKLSAqIC0+Ci0gKiBSZXR1cm5lZCB2YWx1ZSA9PSAzCi0gKiAiZHN0IiBiZWNvbWVzIFx4RTNceDgxXHg4MlwwCi0gKiAobm90ZSB0aGF0ICJkc3QiIGlzIG51bGwtdGVybWluYXRlZCwgYnV0IFx1MzA0NCBpcyBub3Qgc3RvcmVkIGluICJkc3QiCi0gKiBzaW5jZSAiZHN0IiBkb2VzIG5vdCBoYXZlIGVub3VnaCBzaXplIHRvIHN0b3JlIHRoZSBjaGFyYWN0ZXIpCi0gKgotICogRXhhbXBsZSAzCi0gKiAic3JjIiA9PSBcdTMwNDJcdTMwNDQgKFx4RTNceDgxXHg4Mlx4RTNceDgxXHg4NCkKLSAqICJzcmNfbGVuIiA9PSAyCi0gKiAiZHN0X2xlbiIgPT0gNgotICogLT4KLSAqIFJldHVybmVkIHZhbHVlID09IDYKLSAqICJkc3QiIGJlY29tZXMgXHhFM1x4ODFceDgyXHhFM1x4ODFceDg0Ci0gKiAobm90ZSB0aGF0ICJkc3QiIGlzIE5PVCBudWxsLXRlcm1pbmF0ZWQsIGxpa2Ugc3RybmNweSkKLSAqLwotdm9pZCB1dGYzMl90b191dGY4KGNvbnN0IGNoYXIzMl90KiBzcmMsIHNpemVfdCBzcmNfbGVuLCBjaGFyKiBkc3QpOwotCi0vKioKLSAqIFJldHVybnMgdGhlIHVuaWNvZGUgdmFsdWUgYXQgImluZGV4Ii4KLSAqIFJldHVybnMgLTEgd2hlbiB0aGUgaW5kZXggaXMgaW52YWxpZCAoZXF1YWxzIHRvIG9yIG1vcmUgdGhhbiAic3JjX2xlbiIpLgotICogSWYgcmV0dXJuZWQgdmFsdWUgaXMgcG9zaXRpdmUsIGl0IGlzIGFibGUgdG8gYmUgY29udmVydGVkIHRvIGNoYXIzMl90LCB3aGljaAotICogaXMgdW5zaWduZWQuIFRoZW4sIGlmICJuZXh0X2luZGV4IiBpcyBub3QgTlVMTCwgdGhlIG5leHQgaW5kZXggdG8gYmUgdXNlZCBpcwotICogc3RvcmVkIGluICJuZXh0X2luZGV4Ii4gIm5leHRfaW5kZXgiIGNhbiBiZSBOVUxMLgotICovCi1pbnQzMl90IHV0ZjMyX2Zyb21fdXRmOF9hdChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNfbGVuLCBzaXplX3QgaW5kZXgsIHNpemVfdCAqbmV4dF9pbmRleCk7Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBVVEYtOCBsZW5ndGggb2YgVVRGLTE2IHN0cmluZyAic3JjIi4KLSAqLwotc3NpemVfdCB1dGYxNl90b191dGY4X2xlbmd0aChjb25zdCBjaGFyMTZfdCAqc3JjLCBzaXplX3Qgc3JjX2xlbik7Ci0KLS8qKgotICogQ29udmVydHMgYSBVVEYtMTYgc3RyaW5nIHRvIFVURi04LiBUaGUgZGVzdGluYXRpb24gYnVmZmVyIG11c3QgYmUgbGFyZ2UKLSAqIGVub3VnaCB0byBmaXQgdGhlIFVURi0xNiBhcyBtZWFzdXJlZCBieSB1dGYxNl90b191dGY4X2xlbmd0aCB3aXRoIGFuIGFkZGVkCi0gKiBOVUxMIHRlcm1pbmF0b3IuCi0gKi8KLXZvaWQgdXRmMTZfdG9fdXRmOChjb25zdCBjaGFyMTZfdCogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhciogZHN0KTsKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgInNyYyIgd2hlbiAic3JjIiBpcyB2YWxpZCBVVEYtOCBzdHJpbmcuCi0gKiBSZXR1cm5zIDAgaWYgc3JjIGlzIE5VTEwgb3IgMC1sZW5ndGggc3RyaW5nLiBSZXR1cm5zIC0xIHdoZW4gdGhlIHNvdXJjZQotICogaXMgYW4gaW52YWxpZCBzdHJpbmcuCi0gKgotICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciAic3JjIiBpcyB2YWxpZCBVVEYtOAotICogY2hhcmFjdGVycyB3aXRoIHZhbGlkIHVuaWNvZGUgY29kZXBvaW50cy4gInNyYyIgbXVzdCBiZSBudWxsLXRlcm1pbmF0ZWQuCi0gKgotICogSWYgeW91IGFyZSBnb2luZyB0byB1c2Ugb3RoZXIgdXRmOF90b18uLi4gZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhpcyBoZWFkZXIKLSAqIHdpdGggc3RyaW5nIHdoaWNoIG1heSBub3QgYmUgdmFsaWQgVVRGLTggd2l0aCB2YWxpZCBjb2RlcG9pbnQgKGZvcm0gMCB0bwotICogMHgxMEZGRkYpLCB5b3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBjYWxsaW5nIG90aGVycywgc2luY2UgdGhlCi0gKiBvdGhlciBmdW5jdGlvbnMgZG8gbm90IGNoZWNrIHdoZXRoZXIgdGhlIHN0cmluZyBpcyB2YWxpZCBVVEYtOCBvciBub3QuCi0gKgotICogSWYgeW91IGRvIG5vdCBjYXJlIHdoZXRoZXIgInNyYyIgaXMgdmFsaWQgVVRGLTggb3Igbm90LCB5b3Ugc2hvdWxkIHVzZQotICogc3RybGVuKCkgYXMgdXN1YWwsIHdoaWNoIHNob3VsZCBiZSBtdWNoIGZhc3Rlci4KLSAqLwotc3NpemVfdCB1dGY4X2xlbmd0aChjb25zdCBjaGFyICpzcmMpOwotCi0vKioKLSAqIE1lYXN1cmUgdGhlIGxlbmd0aCBvZiBhIFVURi0zMiBzdHJpbmcuCi0gKi8KLXNpemVfdCB1dGY4X3RvX3V0ZjMyX2xlbmd0aChjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNfbGVuKTsKLQotLyoqCi0gKiBTdG9yZXMgYSBVVEYtMzIgc3RyaW5nIGNvbnZlcnRlZCBmcm9tICJzcmMiIGluICJkc3QiLiAiZHN0IiBtdXN0IGJlIGxhcmdlCi0gKiBlbm91Z2ggdG8gc3RvcmUgdGhlIGVudGlyZSBjb252ZXJ0ZWQgc3RyaW5nIGFzIG1lYXN1cmVkIGJ5Ci0gKiB1dGY4X3RvX3V0ZjMyX2xlbmd0aCBwbHVzIHNwYWNlIGZvciBhIE5VTEwgdGVybWluYXRvci4KLSAqLwotdm9pZCB1dGY4X3RvX3V0ZjMyKGNvbnN0IGNoYXIqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIzMl90KiBkc3QpOwotCi0vKioKLSAqIFJldHVybnMgdGhlIFVURi0xNiBsZW5ndGggb2YgVVRGLTggc3RyaW5nICJzcmMiLgotICovCi1zc2l6ZV90IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY0xlbik7Ci0KLS8qKgotICogQ29udmVydCBVVEYtOCB0byBVVEYtMTYgaW5jbHVkaW5nIHN1cnJvZ2F0ZSBwYWlycy4KLSAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAod2hlcmUgYSBudWxsIHRlcm1pbmF0b3IgbWlnaHQgZ28KLSAqIGlmIHlvdSB3YW50ZWQgdG8gYWRkIG9uZSkuCi0gKi8KLWNoYXIxNl90KiB1dGY4X3RvX3V0ZjE2X25vX251bGxfdGVybWluYXRvcihjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzcmNMZW4sIGNoYXIxNl90KiBkc3QpOwotCi0vKioKLSAqIENvbnZlcnQgVVRGLTggdG8gVVRGLTE2IGluY2x1ZGluZyBzdXJyb2dhdGUgcGFpcnMuIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlc3VsdCBhcyBtZWFzdXJlZCBieSB1dGY4X3RvX3V0ZjE2X2xlbmd0aAotICogcGx1cyBhbiBhZGRlZCBOVUxMIHRlcm1pbmF0b3IuCi0gKi8KLXZvaWQgdXRmOF90b191dGYxNihjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzcmNMZW4sIGNoYXIxNl90KiBkc3QpOwotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy9WZWN0b3IuaCBiL2luY2x1ZGUvdXRpbHMvVmVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTI5NmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9WZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1ZFQ1RPUl9ICi0jZGVmaW5lIEFORFJPSURfVkVDVE9SX0gKLQotI2luY2x1ZGUgPG5ldz4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3RvckltcGwuaD4KLSNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVFlQRT4KLWNsYXNzIFNvcnRlZFZlY3RvcjsKLQotLyohCi0gKiBUaGUgbWFpbiB0ZW1wbGF0ZWQgdmVjdG9yIGNsYXNzIGVuc3VyaW5nIHR5cGUgc2FmZXR5Ci0gKiB3aGlsZSBtYWtpbmcgdXNlIG9mIFZlY3RvckltcGwuCi0gKiBUaGlzIGlzIHRoZSBjbGFzcyB1c2VycyB3YW50IHRvIHVzZS4KLSAqLwotCi10ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KLWNsYXNzIFZlY3RvciA6IHByaXZhdGUgVmVjdG9ySW1wbAotewotcHVibGljOgotICAgICAgICAgICAgdHlwZWRlZiBUWVBFICAgIHZhbHVlX3R5cGU7Ci0gICAgCi0gICAgLyohIAotICAgICAqIENvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMKLSAgICAgKi8KLSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3IoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpOwotICAgIGV4cGxpY2l0ICAgICAgICAgICAgICAgIFZlY3Rvcihjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocyk7Ci0gICAgdmlydHVhbCAgICAgICAgICAgICAgICAgflZlY3RvcigpOwotCi0gICAgLyohIGNvcHkgb3BlcmF0b3IgKi8KLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxUWVBFPiYgICAgIG9wZXJhdG9yID0gKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdDsKLSAgICAgICAgICAgIFZlY3RvcjxUWVBFPiYgICAgICAgICAgIG9wZXJhdG9yID0gKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKTsgICAgCi0KLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxUWVBFPiYgICAgIG9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdDsKLSAgICAgICAgICAgIFZlY3RvcjxUWVBFPiYgICAgICAgICAgIG9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUWVBFPiYgcmhzKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgKiBlbXB0eSB0aGUgdmVjdG9yCi0gICAgICovCi0KLSAgICBpbmxpbmUgIHZvaWQgICAgICAgICAgICBjbGVhcigpICAgICAgICAgICAgIHsgVmVjdG9ySW1wbDo6Y2xlYXIoKTsgfQotCi0gICAgLyohIAotICAgICAqIHZlY3RvciBzdGF0cwotICAgICAqLwotCi0gICAgLy8hIHJldHVybnMgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB2ZWN0b3IKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgICAgICAgICAgICAgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6c2l6ZSgpOyB9Ci0gICAgLy8hIHJldHVybnMgd2V0aGVyIG9yIG5vdCB0aGUgdmVjdG9yIGlzIGVtcHR5Ci0gICAgaW5saW5lICBib29sICAgICAgICAgICAgaXNFbXB0eSgpIGNvbnN0ICAgICAgICAgICAgIHsgcmV0dXJuIFZlY3RvckltcGw6OmlzRW1wdHkoKTsgfQotICAgIC8vISByZXR1cm5zIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzdG9yZWQgd2l0aG91dCByZWFsbG9jYXRpbmcgdGhlIGJhY2tpbmcgc3RvcmUKLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICBjYXBhY2l0eSgpIGNvbnN0ICAgICAgICAgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6Y2FwYWNpdHkoKTsgfQotICAgIC8vISBzZXRzdCB0aGUgY2FwYWNpdHkuIGNhcGFjaXR5IGNhbiBuZXZlciBiZSByZWR1Y2VkIGxlc3MgdGhhbiBzaXplKCkKLSAgICBpbmxpbmUgIHNzaXplX3QgICAgICAgICBzZXRDYXBhY2l0eShzaXplX3Qgc2l6ZSkgICAgeyByZXR1cm4gVmVjdG9ySW1wbDo6c2V0Q2FwYWNpdHkoc2l6ZSk7IH0KLQotICAgIC8qISAKLSAgICAgKiBDLXN0eWxlIGFycmF5IGFjY2VzcwotICAgICAqLwotICAgICAKLSAgICAvLyEgcmVhZC1vbmx5IEMtc3R5bGUgYWNjZXNzIAotICAgIGlubGluZSAgY29uc3QgVFlQRSogICAgIGFycmF5KCkgY29uc3Q7Ci0gICAgLy8hIHJlYWQtd3JpdGUgQy1zdHlsZSBhY2Nlc3MKLSAgICAgICAgICAgIFRZUEUqICAgICAgICAgICBlZGl0QXJyYXkoKTsKLSAgICAKLSAgICAvKiEgCi0gICAgICogYWNjZXNzb3JzCi0gICAgICovCi0KLSAgICAvLyEgcmVhZC1vbmx5IGFjY2VzcyB0byBhbiBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXgKLSAgICBpbmxpbmUgIGNvbnN0IFRZUEUmICAgICBvcGVyYXRvciBbXSAoc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICAvLyEgYWx0ZXJuYXRlIG5hbWUgZm9yIG9wZXJhdG9yIFtdCi0gICAgaW5saW5lICBjb25zdCBUWVBFJiAgICAgaXRlbUF0KHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gICAgLy8hIHN0YWNrLXVzYWdlIG9mIHRoZSB2ZWN0b3IuIHJldHVybnMgdGhlIHRvcCBvZiB0aGUgc3RhY2sgKGxhc3QgZWxlbWVudCkKLSAgICAgICAgICAgIGNvbnN0IFRZUEUmICAgICB0b3AoKSBjb25zdDsKLSAgICAvLyEgc2FtZSBhcyBvcGVyYXRvciBbXSwgYnV0IGFsbG93cyB0byBhY2Nlc3MgdGhlIHZlY3RvciBiYWNrd2FyZCAoZnJvbSB0aGUgZW5kKSB3aXRoIGEgbmVnYXRpdmUgaW5kZXgKLSAgICAgICAgICAgIGNvbnN0IFRZUEUmICAgICBtaXJyb3JJdGVtQXQoc3NpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSAgICAvKiEKLSAgICAgKiBtb2RpZmluZyB0aGUgYXJyYXkKLSAgICAgKi8KLQotICAgIC8vISBjb3B5LW9uIHdyaXRlIHN1cHBvcnQsIGdyYW50cyB3cml0ZSBhY2Nlc3MgdG8gYW4gaXRlbQotICAgICAgICAgICAgVFlQRSYgICAgICAgICAgIGVkaXRJdGVtQXQoc2l6ZV90IGluZGV4KTsKLSAgICAvLyEgZ3JhbnRzIHJpZ2h0IGFjY2VzIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrIChsYXN0IGVsZW1lbnQpCi0gICAgICAgICAgICBUWVBFJiAgICAgICAgICAgZWRpdFRvcCgpOwotCi0gICAgICAgICAgICAvKiEgCi0gICAgICAgICAgICAgKiBhcHBlbmQvaW5zZXJ0IGFub3RoZXIgdmVjdG9yCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotICAgIC8vISBpbnNlcnQgYW5vdGhlciB2ZWN0b3IgYXQgYSBnaXZlbiBpbmRleAotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydFZlY3RvckF0KGNvbnN0IFZlY3RvcjxUWVBFPiYgdmVjdG9yLCBzaXplX3QgaW5kZXgpOwotCi0gICAgLy8hIGFwcGVuZCBhbm90aGVyIHZlY3RvciBhdCB0aGUgZW5kIG9mIHRoaXMgb25lCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYXBwZW5kVmVjdG9yKGNvbnN0IFZlY3RvcjxUWVBFPiYgdmVjdG9yKTsKLQotCi0gICAgLy8hIGluc2VydCBhbiBhcnJheSBhdCBhIGdpdmVuIGluZGV4Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXJyYXlBdChjb25zdCBUWVBFKiBhcnJheSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbGVuZ3RoKTsKLQotICAgIC8vISBhcHBlbmQgYW4gYXJyYXkgYXQgdGhlIGVuZCBvZiB0aGlzIHZlY3RvcgotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFwcGVuZEFycmF5KGNvbnN0IFRZUEUqIGFycmF5LCBzaXplX3QgbGVuZ3RoKTsKLQotICAgICAgICAgICAgLyohIAotICAgICAgICAgICAgICogYWRkL2luc2VydC9yZXBsYWNlIGl0ZW1zCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAKLSAgICAvLyEgaW5zZXJ0IG9uZSBvciBzZXZlcmFsIGl0ZW1zIGluaXRpYWxpemVkIHdpdGggdGhlaXIgZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIGluc2VydEF0KHNpemVfdCBpbmRleCwgc2l6ZV90IG51bUl0ZW1zID0gMSk7Ci0gICAgLy8hIGluc2VydCBvbmUgb3Igc2V2ZXJhbCBpdGVtcyBpbml0aWFsaXplZCBmcm9tIGEgcHJvdG90eXBlIGl0ZW0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRBdChjb25zdCBUWVBFJiBwcm90b3R5cGVfaXRlbSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbnVtSXRlbXMgPSAxKTsKLSAgICAvLyEgcG9wIHRoZSB0b3Agb2YgdGhlIHN0YWNrIChyZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQpLiBOby1vcCBpZiB0aGUgc3RhY2sncyBlbXB0eQotICAgIGlubGluZSAgdm9pZCAgICAgICAgICAgIHBvcCgpOwotICAgIC8vISBwdXNoZXMgYW4gaXRlbSBpbml0aWFsaXplZCB3aXRoIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgaW5saW5lICB2b2lkICAgICAgICAgICAgcHVzaCgpOwotICAgIC8vISBwdXNoZXMgYW4gaXRlbSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjawotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHB1c2goY29uc3QgVFlQRSYgaXRlbSk7Ci0gICAgLy8hIHNhbWUgYXMgcHVzaCgpIGJ1dCByZXR1cm5zIHRoZSBpbmRleCB0aGUgaXRlbSB3YXMgYWRkZWQgYXQgKG9yIGFuIGVycm9yKQotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIGFkZCgpOwotICAgIC8vISBzYW1lIGFzIHB1c2goKSBidXQgcmV0dXJucyB0aGUgaW5kZXggdGhlIGl0ZW0gd2FzIGFkZGVkIGF0IChvciBhbiBlcnJvcikKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3QgVFlQRSYgaXRlbSk7ICAgICAgICAgICAgCi0gICAgLy8hIHJlcGxhY2UgYW4gaXRlbSB3aXRoIGEgbmV3IG9uZSBpbml0aWFsaXplZCB3aXRoIGl0cyBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgaW5saW5lICBzc2l6ZV90ICAgICAgICAgcmVwbGFjZUF0KHNpemVfdCBpbmRleCk7Ci0gICAgLy8hIHJlcGxhY2UgYW4gaXRlbSB3aXRoIGEgbmV3IG9uZQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VBdChjb25zdCBUWVBFJiBpdGVtLCBzaXplX3QgaW5kZXgpOwotCi0gICAgLyohCi0gICAgICogcmVtb3ZlIGl0ZW1zCi0gICAgICovCi0KLSAgICAvLyEgcmVtb3ZlIHNldmVyYWwgaXRlbXMKLSAgICBpbmxpbmUgIHNzaXplX3QgICAgICAgICByZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50ID0gMSk7Ci0gICAgLy8hIHJlbW92ZSBvbmUgaXRlbQotICAgIGlubGluZSAgc3NpemVfdCAgICAgICAgIHJlbW92ZUF0KHNpemVfdCBpbmRleCkgIHsgcmV0dXJuIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOyB9Ci0KLSAgICAvKiEKLSAgICAgKiBzb3J0IChzdGFibGUpIHRoZSBhcnJheQotICAgICAqLwotICAgICAKLSAgICAgdHlwZWRlZiBpbnQgKCpjb21wYXJfdCkoY29uc3QgVFlQRSogbGhzLCBjb25zdCBUWVBFKiByaHMpOwotICAgICB0eXBlZGVmIGludCAoKmNvbXBhcl9yX3QpKGNvbnN0IFRZUEUqIGxocywgY29uc3QgVFlQRSogcmhzLCB2b2lkKiBzdGF0ZSk7Ci0gICAgIAotICAgICBpbmxpbmUgc3RhdHVzX3QgICAgICAgIHNvcnQoY29tcGFyX3QgY21wKTsKLSAgICAgaW5saW5lIHN0YXR1c190ICAgICAgICBzb3J0KGNvbXBhcl9yX3QgY21wLCB2b2lkKiBzdGF0ZSk7Ci0KLSAgICAgLy8gZm9yIGRlYnVnZ2luZyBvbmx5Ci0gICAgIGlubGluZSBzaXplX3QgZ2V0SXRlbVNpemUoKSBjb25zdCB7IHJldHVybiBpdGVtU2l6ZSgpOyB9Ci0KLQotICAgICAvKgotICAgICAgKiB0aGVzZSBpbmxpbmVzIGFkZCBzb21lIGxldmVsIG9mIGNvbXBhdGliaWxpdHkgd2l0aCBTVEwuIGV2ZW50dWFsbHkKLSAgICAgICogd2Ugc2hvdWxkIHByb2JhYmx5IHR1cm4gdGhpbmdzIGFyb3VuZC4KLSAgICAgICovCi0gICAgIHR5cGVkZWYgVFlQRSogaXRlcmF0b3I7Ci0gICAgIHR5cGVkZWYgVFlQRSBjb25zdCogY29uc3RfaXRlcmF0b3I7Ci0KLSAgICAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gZWRpdEFycmF5KCk7IH0KLSAgICAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gZWRpdEFycmF5KCkgKyBzaXplKCk7IH0KLSAgICAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gYXJyYXkoKTsgfQotICAgICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBhcnJheSgpICsgc2l6ZSgpOyB9Ci0gICAgIGlubGluZSB2b2lkIHJlc2VydmUoc2l6ZV90IG4pIHsgc2V0Q2FwYWNpdHkobik7IH0KLSAgICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdHsgcmV0dXJuIGlzRW1wdHkoKTsgfQotICAgICBpbmxpbmUgdm9pZCBwdXNoX2JhY2soY29uc3QgVFlQRSYgaXRlbSkgIHsgaW5zZXJ0QXQoaXRlbSwgc2l6ZSgpLCAxKTsgfQotICAgICBpbmxpbmUgdm9pZCBwdXNoX2Zyb250KGNvbnN0IFRZUEUmIGl0ZW0pIHsgaW5zZXJ0QXQoaXRlbSwgMCwgMSk7IH0KLSAgICAgaW5saW5lIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHBvcykgewotICAgICAgICAgcmV0dXJuIGJlZ2luKCkgKyByZW1vdmVJdGVtc0F0KHBvcy1hcnJheSgpKTsKLSAgICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX2NvbnN0cnVjdCh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fc3BsYXQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkICAgIGRvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgZG9fbW92ZV9iYWNrd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBObyB1c2VyIHNlcnZpY2VhYmxlIHBhcnRzIGZyb20gaGVyZS4uLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotVmVjdG9yPFRZUEU+OjpWZWN0b3IoKQotICAgIDogVmVjdG9ySW1wbChzaXplb2YoVFlQRSksCi0gICAgICAgICAgICAgICAgKCh0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2N0b3IgICA/IEhBU19UUklWSUFMX0NUT1IgICA6IDApCi0gICAgICAgICAgICAgICAgfCh0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2R0b3IgICA/IEhBU19UUklWSUFMX0RUT1IgICA6IDApCi0gICAgICAgICAgICAgICAgfCh0cmFpdHM8VFlQRT46Omhhc190cml2aWFsX2NvcHkgICA/IEhBU19UUklWSUFMX0NPUFkgICA6IDApKQotICAgICAgICAgICAgICAgICkKLXsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT46OlZlY3Rvcihjb25zdCBWZWN0b3I8VFlQRT4mIHJocykKLSAgICA6IFZlY3RvckltcGwocmhzKSB7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotVmVjdG9yPFRZUEU+OjpWZWN0b3IoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpCi0gICAgOiBWZWN0b3JJbXBsKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPihyaHMpKSB7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotVmVjdG9yPFRZUEU+Ojp+VmVjdG9yKCkgewotICAgIGZpbmlzaF92ZWN0b3IoKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgVmVjdG9yPFRZUEU+JiByaHMpIHsKLSAgICBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChyaHMpOwotICAgIHJldHVybiAqdGhpczsgCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVmVjdG9yPFRZUEU+JiBWZWN0b3I8VFlQRT46Om9wZXJhdG9yID0gKGNvbnN0IFZlY3RvcjxUWVBFPiYgcmhzKSBjb25zdCB7Ci0gICAgVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAoc3RhdGljX2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHJocykpOwotICAgIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1WZWN0b3I8VFlQRT4mIFZlY3RvcjxUWVBFPjo6b3BlcmF0b3IgPSAoY29uc3QgU29ydGVkVmVjdG9yPFRZUEU+JiByaHMpIHsKLSAgICBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4ocmhzKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFZlY3RvcjxUWVBFPiYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3I8VFlQRT4mIHJocykgY29uc3QgewotICAgIFZlY3RvckltcGw6Om9wZXJhdG9yID0gKHJocyk7Ci0gICAgcmV0dXJuICp0aGlzOyAKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBUWVBFKiBWZWN0b3I8VFlQRT46OmFycmF5KCkgY29uc3QgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUWVBFICo+KGFycmF5SW1wbCgpKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1UWVBFKiBWZWN0b3I8VFlQRT46OmVkaXRBcnJheSgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VFlQRSAqPihlZGl0QXJyYXlJbXBsKCkpOwotfQotCi0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgVmVjdG9yPFRZUEU+OjpvcGVyYXRvcltdKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIExPR19GQVRBTF9JRiggaW5kZXg+PXNpemUoKSwKLSAgICAgICAgICAgICAgICAgICJpdGVtQXQ6IGluZGV4ICVkIGlzIHBhc3Qgc2l6ZSAlZCIsIChpbnQpaW5kZXgsIChpbnQpc2l6ZSgpICk7Ci0gICAgcmV0dXJuICooYXJyYXkoKSArIGluZGV4KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1jb25zdCBUWVBFJiBWZWN0b3I8VFlQRT46Oml0ZW1BdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0b3JbXShpbmRleCk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotY29uc3QgVFlQRSYgVmVjdG9yPFRZUEU+OjptaXJyb3JJdGVtQXQoc3NpemVfdCBpbmRleCkgY29uc3QgewotICAgIExPR19GQVRBTF9JRiggKGluZGV4PjAgPyBpbmRleCA6IC1pbmRleCk+PXNpemUoKSwKLSAgICAgICAgICAgICAgICAgICJtaXJyb3JJdGVtQXQ6IGluZGV4ICVkIGlzIHBhc3Qgc2l6ZSAlZCIsCi0gICAgICAgICAgICAgICAgICAoaW50KWluZGV4LCAoaW50KXNpemUoKSApOwotICAgIHJldHVybiAqKGFycmF5KCkgKyAoKGluZGV4PDApID8gKHNpemUoKS1pbmRleCkgOiBpbmRleCkpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLWNvbnN0IFRZUEUmIFZlY3RvcjxUWVBFPjo6dG9wKCkgY29uc3QgewotICAgIHJldHVybiAqKGFycmF5KCkgKyBzaXplKCkgLSAxKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1UWVBFJiBWZWN0b3I8VFlQRT46OmVkaXRJdGVtQXQoc2l6ZV90IGluZGV4KSB7Ci0gICAgcmV0dXJuICooIHN0YXRpY19jYXN0PFRZUEUgKj4oZWRpdEl0ZW1Mb2NhdGlvbihpbmRleCkpICk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotVFlQRSYgVmVjdG9yPFRZUEU+OjplZGl0VG9wKCkgewotICAgIHJldHVybiAqKCBzdGF0aWNfY2FzdDxUWVBFICo+KGVkaXRJdGVtTG9jYXRpb24oc2l6ZSgpLTEpKSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjppbnNlcnRWZWN0b3JBdChjb25zdCBWZWN0b3I8VFlQRT4mIHZlY3Rvciwgc2l6ZV90IGluZGV4KSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6Omluc2VydFZlY3RvckF0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVmVjdG9ySW1wbCY+KHZlY3RvciksIGluZGV4KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6YXBwZW5kVmVjdG9yKGNvbnN0IFZlY3RvcjxUWVBFPiYgdmVjdG9yKSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OmFwcGVuZFZlY3RvcihyZWludGVycHJldF9jYXN0PGNvbnN0IFZlY3RvckltcGwmPih2ZWN0b3IpKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6aW5zZXJ0QXJyYXlBdChjb25zdCBUWVBFKiBhcnJheSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6Omluc2VydEFycmF5QXQoYXJyYXksIGluZGV4LCBsZW5ndGgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjphcHBlbmRBcnJheShjb25zdCBUWVBFKiBhcnJheSwgc2l6ZV90IGxlbmd0aCkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjphcHBlbmRBcnJheShhcnJheSwgbGVuZ3RoKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6aW5zZXJ0QXQoY29uc3QgVFlQRSYgaXRlbSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbnVtSXRlbXMpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6aW5zZXJ0QXQoJml0ZW0sIGluZGV4LCBudW1JdGVtcyk7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+IGlubGluZQotdm9pZCBWZWN0b3I8VFlQRT46OnB1c2goY29uc3QgVFlQRSYgaXRlbSkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjpwdXNoKCZpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6YWRkKGNvbnN0IFRZUEUmIGl0ZW0pIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6YWRkKCZpdGVtKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6cmVwbGFjZUF0KGNvbnN0IFRZUEUmIGl0ZW0sIHNpemVfdCBpbmRleCkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjpyZXBsYWNlQXQoJml0ZW0sIGluZGV4KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6aW5zZXJ0QXQoc2l6ZV90IGluZGV4LCBzaXplX3QgbnVtSXRlbXMpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6aW5zZXJ0QXQoaW5kZXgsIG51bUl0ZW1zKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi12b2lkIFZlY3RvcjxUWVBFPjo6cG9wKCkgewotICAgIFZlY3RvckltcGw6OnBvcCgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXZvaWQgVmVjdG9yPFRZUEU+OjpwdXNoKCkgewotICAgIFZlY3RvckltcGw6OnB1c2goKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6YWRkKCkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjphZGQoKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zc2l6ZV90IFZlY3RvcjxUWVBFPjo6cmVwbGFjZUF0KHNpemVfdCBpbmRleCkgewotICAgIHJldHVybiBWZWN0b3JJbXBsOjpyZXBsYWNlQXQoaW5kZXgpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPiBpbmxpbmUKLXNzaXplX3QgVmVjdG9yPFRZUEU+OjpyZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50KSB7Ci0gICAgcmV0dXJuIFZlY3RvckltcGw6OnJlbW92ZUl0ZW1zQXQoaW5kZXgsIGNvdW50KTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zdGF0dXNfdCBWZWN0b3I8VFlQRT46OnNvcnQoVmVjdG9yPFRZUEU+Ojpjb21wYXJfdCBjbXApIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6c29ydCgoVmVjdG9ySW1wbDo6Y29tcGFyX3QpY21wKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4gaW5saW5lCi1zdGF0dXNfdCBWZWN0b3I8VFlQRT46OnNvcnQoVmVjdG9yPFRZUEU+Ojpjb21wYXJfcl90IGNtcCwgdm9pZCogc3RhdGUpIHsKLSAgICByZXR1cm4gVmVjdG9ySW1wbDo6c29ydCgoVmVjdG9ySW1wbDo6Y29tcGFyX3JfdCljbXAsIHN0YXRlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPGNsYXNzIFRZUEU+Ci12b2lkIFZlY3RvcjxUWVBFPjo6ZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0IHsKLSAgICBjb25zdHJ1Y3RfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oc3RvcmFnZSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBWZWN0b3I8VFlQRT46OmRvX2Rlc3Ryb3kodm9pZCogc3RvcmFnZSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGRlc3Ryb3lfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oc3RvcmFnZSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBWZWN0b3I8VFlQRT46OmRvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGNvcHlfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KGZyb20pLCBudW0gKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLXZvaWQgVmVjdG9yPFRZUEU+Ojpkb19zcGxhdCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgc3BsYXRfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KGl0ZW0pLCBudW0gKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVFlQRT4KLXZvaWQgVmVjdG9yPFRZUEU+Ojpkb19tb3ZlX2ZvcndhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIG1vdmVfZm9yd2FyZF90eXBlKCByZWludGVycHJldF9jYXN0PFRZUEUqPihkZXN0KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUWVBFKj4oZnJvbSksIG51bSApOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUWVBFPgotdm9pZCBWZWN0b3I8VFlQRT46OmRvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIG1vdmVfYmFja3dhcmRfdHlwZSggcmVpbnRlcnByZXRfY2FzdDxUWVBFKj4oZGVzdCksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KGZyb20pLCBudW0gKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvVmVjdG9ySW1wbC5oIGIvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWMyZmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9WZWN0b3JJbXBsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9WRUNUT1JfSU1QTF9ICi0jZGVmaW5lIEFORFJPSURfVkVDVE9SX0lNUExfSAotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm8gdXNlciBzZXJ2aWNlYWJsZSBwYXJ0cyBpbiBoZXJlLi4uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiEKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBndXRzIG9mIHRoZSB2ZWN0b3I8PiBjbGFzcwotICogdGhpcyBlbnN1cmVzIGJhY2t3YXJkIGJpbmFyeSBjb21wYXRpYmlsaXR5IGFuZAotICogcmVkdWNlcyBjb2RlIHNpemUuCi0gKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgd2UgZXhwb3NlIG1TdG9yYWdlIGFuZCBtQ291bnQKLSAqIHNvIHRoZXNlIGZpZWxkcyBhcmUgc2V0IGluIHN0b25lLgotICoKLSAqLwotCi1jbGFzcyBWZWN0b3JJbXBsCi17Ci1wdWJsaWM6Ci0gICAgZW51bSB7IC8vIGZsYWdzIHBhc3NlZCB0byB0aGUgY3RvcgotICAgICAgICBIQVNfVFJJVklBTF9DVE9SICAgID0gMHgwMDAwMDAwMSwKLSAgICAgICAgSEFTX1RSSVZJQUxfRFRPUiAgICA9IDB4MDAwMDAwMDIsCi0gICAgICAgIEhBU19UUklWSUFMX0NPUFkgICAgPSAweDAwMDAwMDA0LAotICAgIH07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JJbXBsKHNpemVfdCBpdGVtU2l6ZSwgdWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvckltcGwoY29uc3QgVmVjdG9ySW1wbCYgcmhzKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+VmVjdG9ySW1wbCgpOwotCi0gICAgLyohIG11c3QgYmUgY2FsbGVkIGZyb20gc3ViY2xhc3NlcyBkZXN0cnVjdG9yICovCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgZmluaXNoX3ZlY3RvcigpOwotCi0gICAgICAgICAgICBWZWN0b3JJbXBsJiAgICAgb3BlcmF0b3IgPSAoY29uc3QgVmVjdG9ySW1wbCYgcmhzKTsgICAgCi0gICAgICAgICAgICAKLSAgICAvKiEgQy1zdHlsZSBhcnJheSBhY2Nlc3MgKi8KLSAgICBpbmxpbmUgIGNvbnN0IHZvaWQqICAgICBhcnJheUltcGwoKSBjb25zdCAgICAgICB7IHJldHVybiBtU3RvcmFnZTsgfQotICAgICAgICAgICAgdm9pZCogICAgICAgICAgIGVkaXRBcnJheUltcGwoKTsKLSAgICAgICAgICAgIAotICAgIC8qISB2ZWN0b3Igc3RhdHMgKi8KLSAgICBpbmxpbmUgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgICAgICAgIHsgcmV0dXJuIG1Db3VudDsgfQotICAgIGlubGluZSAgYm9vbCAgICAgICAgICAgIGlzRW1wdHkoKSBjb25zdCAgICAgeyByZXR1cm4gbUNvdW50ID09IDA7IH0KLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBjYXBhY2l0eSgpIGNvbnN0OwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHNldENhcGFjaXR5KHNpemVfdCBzaXplKTsKLQotICAgICAgICAgICAgLyohIGFwcGVuZC9pbnNlcnQgYW5vdGhlciB2ZWN0b3Igb3IgYXJyYXkgKi8KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRWZWN0b3JBdChjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IsIHNpemVfdCBpbmRleCk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYXBwZW5kVmVjdG9yKGNvbnN0IFZlY3RvckltcGwmIHZlY3Rvcik7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXJyYXlBdChjb25zdCB2b2lkKiBhcnJheSwgc2l6ZV90IGluZGV4LCBzaXplX3QgbGVuZ3RoKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhcHBlbmRBcnJheShjb25zdCB2b2lkKiBhcnJheSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qISBhZGQvaW5zZXJ0L3JlcGxhY2UgaXRlbXMgKi8KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbnNlcnRBdChzaXplX3Qgd2hlcmUsIHNpemVfdCBudW1JdGVtcyA9IDEpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydEF0KGNvbnN0IHZvaWQqIGl0ZW0sIHNpemVfdCB3aGVyZSwgc2l6ZV90IG51bUl0ZW1zID0gMSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcHVzaCgpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHB1c2goY29uc3Qgdm9pZCogaXRlbSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKCk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHZvaWQqIGl0ZW0pOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VBdChzaXplX3QgaW5kZXgpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlcGxhY2VBdChjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgaW5kZXgpOwotCi0gICAgICAgICAgICAvKiEgcmVtb3ZlIGl0ZW1zICovCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgcmVtb3ZlSXRlbXNBdChzaXplX3QgaW5kZXgsIHNpemVfdCBjb3VudCA9IDEpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgICBpdGVtTG9jYXRpb24oc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQqICAgICAgICAgICBlZGl0SXRlbUxvY2F0aW9uKHNpemVfdCBpbmRleCk7Ci0KLSAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqY29tcGFyX3QpKGNvbnN0IHZvaWQqIGxocywgY29uc3Qgdm9pZCogcmhzKTsKLSAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqY29tcGFyX3JfdCkoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMsIHZvaWQqIHN0YXRlKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzb3J0KGNvbXBhcl90IGNtcCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc29ydChjb21wYXJfcl90IGNtcCwgdm9pZCogc3RhdGUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgICAgICAgICBzaXplX3QgICAgICAgICAgaXRlbVNpemUoKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICByZWxlYXNlX3N0b3JhZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRvX2NvbnN0cnVjdCh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZG9fc3BsYXQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IG51bSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGRvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgZG9fbW92ZV9iYWNrd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCA9IDA7Ci0KLSAgICAvLyB0YWtlIGNhcmUgb2YgRkJDLi4uCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRWZWN0b3JJbXBsMSgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkVmVjdG9ySW1wbDIoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFZlY3RvckltcGwzKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRWZWN0b3JJbXBsNCgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkVmVjdG9ySW1wbDUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFZlY3RvckltcGw2KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRWZWN0b3JJbXBsNygpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkVmVjdG9ySW1wbDgoKTsKLSAgICAKLXByaXZhdGU6Ci0gICAgICAgIHZvaWQqIF9ncm93KHNpemVfdCB3aGVyZSwgc2l6ZV90IGFtb3VudCk7Ci0gICAgICAgIHZvaWQgIF9zaHJpbmsoc2l6ZV90IHdoZXJlLCBzaXplX3QgYW1vdW50KTsKLQotICAgICAgICBpbmxpbmUgdm9pZCBfZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0OwotICAgICAgICBpbmxpbmUgdm9pZCBfZG9fZGVzdHJveSh2b2lkKiBzdG9yYWdlLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICAgICAgaW5saW5lIHZvaWQgX2RvX2NvcHkodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0gICAgICAgIGlubGluZSB2b2lkIF9kb19zcGxhdCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICAgICAgaW5saW5lIHZvaWQgX2RvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdDsKLSAgICAgICAgaW5saW5lIHZvaWQgX2RvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIFRoZXNlIDIgZmllbGRzIGFyZSBleHBvc2VkIGluIHRoZSBpbmxpbmVzIGJlbG93LAotICAgICAgICAgICAgLy8gc28gdGhleSdyZSBzZXQgaW4gc3RvbmUuCi0gICAgICAgICAgICB2b2lkICogICAgICBtU3RvcmFnZTsgICAvLyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHZlY3RvcgotICAgICAgICAgICAgc2l6ZV90ICAgICAgbUNvdW50OyAgICAgLy8gbnVtYmVyIG9mIGl0ZW1zCi0KLSAgICBjb25zdCAgIHVpbnQzMl90ICAgIG1GbGFnczsKLSAgICBjb25zdCAgIHNpemVfdCAgICAgIG1JdGVtU2l6ZTsKLX07Ci0KLQotCi1jbGFzcyBTb3J0ZWRWZWN0b3JJbXBsIDogcHVibGljIFZlY3RvckltcGwKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3JJbXBsKHNpemVfdCBpdGVtU2l6ZSwgdWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvckltcGwoY29uc3QgVmVjdG9ySW1wbCYgcmhzKTsKLSAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+U29ydGVkVmVjdG9ySW1wbCgpOwotICAgIAotICAgIFNvcnRlZFZlY3RvckltcGwmICAgICBvcGVyYXRvciA9IChjb25zdCBTb3J0ZWRWZWN0b3JJbXBsJiByaHMpOyAgICAKLQotICAgIC8vISBmaW5kcyB0aGUgaW5kZXggb2YgYW4gaXRlbQotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluZGV4T2YoY29uc3Qgdm9pZCogaXRlbSkgY29uc3Q7Ci0KLSAgICAvLyEgZmluZHMgd2hlcmUgdGhpcyBpdGVtIHNob3VsZCBiZSBpbnNlcnRlZAotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG9yZGVyT2YoY29uc3Qgdm9pZCogaXRlbSkgY29uc3Q7Ci0KLSAgICAvLyEgYWRkIGFuIGl0ZW0gaW4gdGhlIHJpZ2h0IHBsYWNlIChvciByZXBsYWNlcyBpdCBpZiB0aGVyZSBpcyBvbmUpCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHZvaWQqIGl0ZW0pOwotCi0gICAgLy8hIG1lcmdlcyBhIHZlY3RvciBpbnRvIHRoaXMgb25lCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgbWVyZ2UoY29uc3QgVmVjdG9ySW1wbCYgdmVjdG9yKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBtZXJnZShjb25zdCBTb3J0ZWRWZWN0b3JJbXBsJiB2ZWN0b3IpOwotICAgICAgICAgICAgIAotICAgIC8vISByZW1vdmVzIGFuIGl0ZW0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgdm9pZCogaXRlbSk7Ci0gICAgICAgIAotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgaW50ICAgICAgICAgICAgIGRvX2NvbXBhcmUoY29uc3Qgdm9pZCogbGhzLCBjb25zdCB2b2lkKiByaHMpIGNvbnN0ID0gMDsKLQotICAgIC8vIHRha2UgY2FyZSBvZiBGQkMuLi4KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFNvcnRlZFZlY3RvckltcGwxKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsMigpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDMoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFNvcnRlZFZlY3RvckltcGw0KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsNSgpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlc2VydmVkU29ydGVkVmVjdG9ySW1wbDYoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICByZXNlcnZlZFNvcnRlZFZlY3RvckltcGw3KCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgcmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsOCgpOwotCi1wcml2YXRlOgotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIF9pbmRleE9yZGVyT2YoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90KiBvcmRlciA9IDApIGNvbnN0OwotCi0gICAgICAgICAgICAvLyB0aGVzZSBhcmUgbWFkZSBwcml2YXRlLCBiZWNhdXNlIHRoZXkgY2FuJ3QgYmUgdXNlZCBvbiBhIFNvcnRlZFZlY3RvcgotICAgICAgICAgICAgLy8gKHRoZXkgZG9uJ3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBlaXRoZXIpCi0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgcHVzaCgpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHB1c2goY29uc3Qgdm9pZCogaXRlbSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0VmVjdG9yQXQoY29uc3QgVmVjdG9ySW1wbCYgdmVjdG9yLCBzaXplX3QgaW5kZXgpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGFwcGVuZFZlY3Rvcihjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydEFycmF5QXQoY29uc3Qgdm9pZCogYXJyYXksIHNpemVfdCBpbmRleCwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgYXBwZW5kQXJyYXkoY29uc3Qgdm9pZCogYXJyYXksIHNpemVfdCBsZW5ndGgpOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIGluc2VydEF0KHNpemVfdCB3aGVyZSwgc2l6ZV90IG51bUl0ZW1zID0gMSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5zZXJ0QXQoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IHdoZXJlLCBzaXplX3QgbnVtSXRlbXMgPSAxKTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZXBsYWNlQXQoc2l6ZV90IGluZGV4KTsKLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICByZXBsYWNlQXQoY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IGluZGV4KTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX1ZFQ1RPUl9JTVBMX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvYXNobWVtLmggYi9pbmNsdWRlL3V0aWxzL2FzaG1lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODU0Nzc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdXRpbHMvYXNobWVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiB1dGlscy9hc2htZW0uaAotICoqCi0gKiogQ29weXJpZ2h0IDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQuICBJdCBtYXkgYmUgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQKLSAqKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSAyLjAgTGljZW5zZSBPUiB2ZXJzaW9uIDIgb2YgdGhlIEdOVQotICoqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVVRJTFNfQVNITUVNX0gKLSNkZWZpbmUgX1VUSUxTX0FTSE1FTV9ICi0KLSNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotCi0jZGVmaW5lIEFTSE1FTV9OQU1FX0xFTgkJMjU2Ci0KLSNkZWZpbmUgQVNITUVNX05BTUVfREVGCQkiZGV2L2FzaG1lbSIKLQotLyogUmV0dXJuIHZhbHVlcyBmcm9tIEFTSE1FTV9QSU46IFdhcyB0aGUgbWFwcGluZyBwdXJnZWQgd2hpbGUgdW5waW5uZWQ/ICovCi0jZGVmaW5lIEFTSE1FTV9OT1RfUkVBUEVECTAKLSNkZWZpbmUgQVNITUVNX1dBU19SRUFQRUQJMQotCi0vKiBSZXR1cm4gdmFsdWVzIGZyb20gQVNITUVNX1VOUElOOiBJcyB0aGUgbWFwcGluZyBub3cgcGlubmVkIG9yIHVucGlubmVkPyAqLwotI2RlZmluZSBBU0hNRU1fTk9XX1VOUElOTkVECTAKLSNkZWZpbmUgQVNITUVNX05PV19QSU5ORUQJMQotCi0jZGVmaW5lIF9fQVNITUVNSU9DCQkweDc3Ci0KLSNkZWZpbmUgQVNITUVNX1NFVF9OQU1FCQlfSU9XKF9fQVNITUVNSU9DLCAxLCBjaGFyW0FTSE1FTV9OQU1FX0xFTl0pCi0jZGVmaW5lIEFTSE1FTV9HRVRfTkFNRQkJX0lPUihfX0FTSE1FTUlPQywgMiwgY2hhcltBU0hNRU1fTkFNRV9MRU5dKQotI2RlZmluZSBBU0hNRU1fU0VUX1NJWkUJCV9JT1coX19BU0hNRU1JT0MsIDMsIHNpemVfdCkKLSNkZWZpbmUgQVNITUVNX0dFVF9TSVpFCQlfSU8oX19BU0hNRU1JT0MsIDQpCi0jZGVmaW5lIEFTSE1FTV9TRVRfUFJPVF9NQVNLCV9JT1coX19BU0hNRU1JT0MsIDUsIHVuc2lnbmVkIGxvbmcpCi0jZGVmaW5lIEFTSE1FTV9HRVRfUFJPVF9NQVNLCV9JTyhfX0FTSE1FTUlPQywgNikKLSNkZWZpbmUgQVNITUVNX1BJTgkJX0lPKF9fQVNITUVNSU9DLCA3KQotI2RlZmluZSBBU0hNRU1fVU5QSU4JCV9JTyhfX0FTSE1FTUlPQywgOCkKLSNkZWZpbmUgQVNITUVNX0lTUElOTkVECQlfSU8oX19BU0hNRU1JT0MsIDkpCi0jZGVmaW5lIEFTSE1FTV9QVVJHRV9BTExfQ0FDSEVTCV9JTyhfX0FTSE1FTUlPQywgMTApCi0KLSNlbmRpZgkvKiBfVVRJTFNfQVNITUVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdXRpbHMvbWlzYy5oIGIvaW5jbHVkZS91dGlscy9taXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjJhNGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS91dGlscy9taXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8KLS8vIEhhbmR5IHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBwb3J0YWJpbGl0eSBjb2RlLgotLy8KLSNpZm5kZWYgX0xJQlNfVVRJTFNfTUlTQ19ICi0jZGVmaW5lIF9MSUJTX1VUSUxTX01JU0NfSAotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9FbmRpYW4uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBnZXQgI29mIGVsZW1lbnRzIGluIGEgc3RhdGljIGFycmF5ICovCi0jaWZuZGVmIE5FTEVNCi0jIGRlZmluZSBORUxFTSh4KSAoKGludCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKSkKLSNlbmRpZgotCi0vKgotICogTWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZywgdXNpbmcgIm5ld1tdIiBpbnN0ZWFkIG9mICJtYWxsb2MiLiAgRnJlZSB0aGUKLSAqIHN0cmluZyB3aXRoIGRlbGV0ZVtdLgotICoKLSAqIFJldHVybnMgTlVMTCBpZiAic3RyIiBpcyBOVUxMLgotICovCi1jaGFyKiBzdHJkdXBOZXcoY29uc3QgY2hhciogc3RyKTsKLQotLyoKLSAqIENvbmNhdGVuYXRlIGFuIGFyZ3VtZW50IHZlY3RvciBpbnRvIGEgc2luZ2xlIHN0cmluZy4gIElmIGFyZ2MgaXMgPj0gMAotICogaXQgd2lsbCBiZSB1c2VkOyBpZiBpdCdzIDwgMCB0aGVuIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFyZyB2ZWN0b3IKLSAqIG11c3QgYmUgTlVMTC4KLSAqCi0gKiBUaGlzIGluc2VydHMgYSBzcGFjZSBiZXR3ZWVuIGVhY2ggYXJndW1lbnQuCi0gKgotICogVGhpcyBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGFkZCBkb3VibGUgcXVvdGVzIGFyb3VuZCBhcmd1bWVudHMgd2l0aAotICogc3BhY2VzIGluIHRoZW0uICBUaGlzIHByYWN0aWNlIGlzIG5lY2Vzc2FyeSBmb3IgV2luMzIsIGJlY2F1c2UgV2luMzIncwotICogQ3JlYXRlUHJvY2VzcyBjYWxsIGlzIHN0dXBpZC4KLSAqCi0gKiBUaGUgY2FsbGVyIHNob3VsZCBkZWxldGVbXSB0aGUgcmV0dXJuZWQgc3RyaW5nLgotICovCi1jaGFyKiBjb25jYXRBcmd2KGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pOwotCi0vKgotICogQ291bnQgdXAgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgaW4gImFyZ3YiLiAgVGhlIGNvdW50IGRvZXMgbm90IGluY2x1ZGUKLSAqIHRoZSBmaW5hbCBOVUxMIGVudHJ5LgotICovCi1pbnQgY291bnRBcmd2KGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSk7Ci0KLS8qCi0gKiBTb21lIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggZmlsZXMuICBUaGVzZSBjb3VsZCBiZSBtYWRlCi0gKiBwYXJ0IG9mIGEgIkZpbGUiIGNsYXNzLgotICovCi10eXBlZGVmIGVudW0gRmlsZVR5cGUgewotICAgIGtGaWxlVHlwZVVua25vd24gPSAwLAotICAgIGtGaWxlVHlwZU5vbmV4aXN0ZW50LCAgICAgICAvLyBpLmUuIEVOT0VOVAotICAgIGtGaWxlVHlwZVJlZ3VsYXIsCi0gICAga0ZpbGVUeXBlRGlyZWN0b3J5LAotICAgIGtGaWxlVHlwZUNoYXJEZXYsCi0gICAga0ZpbGVUeXBlQmxvY2tEZXYsCi0gICAga0ZpbGVUeXBlRmlmbywKLSAgICBrRmlsZVR5cGVTeW1saW5rLAotICAgIGtGaWxlVHlwZVNvY2tldCwKLX0gRmlsZVR5cGU7Ci0vKiBnZXQgdGhlIGZpbGUncyB0eXBlOyBmb2xsb3dzIHN5bWxpbmtzICovCi1GaWxlVHlwZSBnZXRGaWxlVHlwZShjb25zdCBjaGFyKiBmaWxlTmFtZSk7Ci0vKiBnZXQgdGhlIGZpbGUncyBtb2RpZmljYXRpb24gZGF0ZTsgcmV0dXJucyAtMSB3L2Vycm5vIHNldCBvbiBmYWlsdXJlICovCi10aW1lX3QgZ2V0RmlsZU1vZERhdGUoY29uc3QgY2hhciogZmlsZU5hbWUpOwotCi0vKgotICogUm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMi4gIEhhbmR5IGZvciBoYXNoIHRhYmxlcy4KLSAqLwotdW5zaWduZWQgaW50IHJvdW5kVXBQb3dlcjIodW5zaWduZWQgaW50IHZhbCk7Ci0KLXZvaWQgc3RycmV2ZXJzZShjaGFyKiBiZWdpbiwgY2hhciogZW5kKTsKLXZvaWQga19pdG9hKGludCB2YWx1ZSwgY2hhciogc3RyLCBpbnQgYmFzZSk7Ci1jaGFyKiBpdG9hKGludCB2YWwsIGludCBiYXNlKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIF9MSUJTX1VUSUxTX01JU0NfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91dGlscy90aHJlYWRzLmggYi9pbmNsdWRlL3V0aWxzL3RocmVhZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlMzM4Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3V0aWxzL3RocmVhZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9MSUJTX1VUSUxTX1RIUkVBRFNfSAotI2RlZmluZSBfTElCU19VVElMU19USFJFQURTX0gKLQotLyoKLSAqIFBsZWFzZSwgRE8gTk9UIFVTRSEKLSAqCi0gKiBUaGlzIGZpbGUgaXMgaGVyZSBvbmx5IGZvciBsZWdhY3kgcmVhc29ucy4gSW5zdGVhZCwgaW5jbHVkZSBkaXJlY3RseQotICogdGhlIGhlYWRlcnMgeW91IG5lZWQgYmVsb3cuCi0gKgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9BbmRyb2lkVGhyZWFkcy5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL1JXTG9jay5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgotI2VuZGlmCi0KLSNlbmRpZiAvLyBfTElCU19VVElMU19USFJFQURTX0gKZGlmZiAtLWdpdCBhL2xpYnMvYW5kcm9pZGZ3L3Rlc3RzL0lucHV0Q2hhbm5lbF90ZXN0LmNwcCBiL2xpYnMvYW5kcm9pZGZ3L3Rlc3RzL0lucHV0Q2hhbm5lbF90ZXN0LmNwcAppbmRleCAwZTVkMTlkLi43ZmZmOGFmIDEwMDY0NAotLS0gYS9saWJzL2FuZHJvaWRmdy90ZXN0cy9JbnB1dENoYW5uZWxfdGVzdC5jcHAKKysrIGIvbGlicy9hbmRyb2lkZncvdGVzdHMvSW5wdXRDaGFubmVsX3Rlc3QuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAKLSNpbmNsdWRlICIuLi8uLi91dGlscy90ZXN0cy9UZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIlRlc3RIZWxwZXJzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbGlicy9hbmRyb2lkZncvdGVzdHMvSW5wdXRQdWJsaXNoZXJBbmRDb25zdW1lcl90ZXN0LmNwcCBiL2xpYnMvYW5kcm9pZGZ3L3Rlc3RzL0lucHV0UHVibGlzaGVyQW5kQ29uc3VtZXJfdGVzdC5jcHAKaW5kZXggYmI0NTI0Ny4uNDQyYjYyZiAxMDA2NDQKLS0tIGEvbGlicy9hbmRyb2lkZncvdGVzdHMvSW5wdXRQdWJsaXNoZXJBbmRDb25zdW1lcl90ZXN0LmNwcAorKysgYi9saWJzL2FuZHJvaWRmdy90ZXN0cy9JbnB1dFB1Ymxpc2hlckFuZENvbnN1bWVyX3Rlc3QuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CiAKLSNpbmNsdWRlICIuLi8uLi91dGlscy90ZXN0cy9UZXN0SGVscGVycy5oIgorI2luY2x1ZGUgIlRlc3RIZWxwZXJzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy90ZXN0cy9UZXN0SGVscGVycy5oIGIvbGlicy9hbmRyb2lkZncvdGVzdHMvVGVzdEhlbHBlcnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGlicy91dGlscy90ZXN0cy9UZXN0SGVscGVycy5oCnJlbmFtZSB0byBsaWJzL2FuZHJvaWRmdy90ZXN0cy9UZXN0SGVscGVycy5oCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rIGIvbGlicy9iaW5kZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0OTI5OC4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyB3ZSBoYXZlIHRoZSBjb21tb24gc291cmNlcywgcGx1cyBzb21lIGRldmljZS1zcGVjaWZpYyBzdHVmZgotc291cmNlcyA6PSBcCi0gICAgQmluZGVyLmNwcCBcCi0gICAgQnBCaW5kZXIuY3BwIFwKLSAgICBJSW50ZXJmYWNlLmNwcCBcCi0gICAgSU1lbW9yeS5jcHAgXAotICAgIElQQ1RocmVhZFN0YXRlLmNwcCBcCi0gICAgSVBlcm1pc3Npb25Db250cm9sbGVyLmNwcCBcCi0gICAgSVNlcnZpY2VNYW5hZ2VyLmNwcCBcCi0gICAgTWVtb3J5RGVhbGVyLmNwcCBcCi0gICAgTWVtb3J5QmFzZS5jcHAgXAotICAgIE1lbW9yeUhlYXBCYXNlLmNwcCBcCi0gICAgUGFyY2VsLmNwcCBcCi0gICAgUGVybWlzc2lvbkNhY2hlLmNwcCBcCi0gICAgUHJvY2Vzc1N0YXRlLmNwcCBcCi0gICAgU3RhdGljLmNwcAotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9MRExJQlMgKz0gLWxwdGhyZWFkCi1MT0NBTF9NT0RVTEUgOj0gbGliYmluZGVyCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKHNvdXJjZXMpCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTERMSUJTICs9IC1scHRocmVhZAotTE9DQUxfTU9EVUxFIDo9IGxpYmJpbmRlcgotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoc291cmNlcykKLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0JpbmRlci5jcHAgYi9saWJzL2JpbmRlci9CaW5kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjBkOGEzLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0JpbmRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQnBCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlCaW5kZXI6OklCaW5kZXIoKQotICAgIDogUmVmQmFzZSgpCi17Ci19Ci0KLUlCaW5kZXI6On5JQmluZGVyKCkKLXsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNwPElJbnRlcmZhY2U+ICBJQmluZGVyOjpxdWVyeUxvY2FsSW50ZXJmYWNlKGNvbnN0IFN0cmluZzE2JiBkZXNjcmlwdG9yKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi1CQmluZGVyKiBJQmluZGVyOjpsb2NhbEJpbmRlcigpCi17Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLUJwQmluZGVyKiBJQmluZGVyOjpyZW1vdGVCaW5kZXIoKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi1ib29sIElCaW5kZXI6OmNoZWNrU3ViY2xhc3MoY29uc3Qgdm9pZCogLypzdWJjbGFzc0lEKi8pIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQkJpbmRlcjo6RXh0cmFzCi17Ci1wdWJsaWM6Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgQnBCaW5kZXI6Ok9iamVjdE1hbmFnZXIgbU9iamVjdHM7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQkJpbmRlcjo6QkJpbmRlcigpCi0gICAgOiBtRXh0cmFzKE5VTEwpCi17Ci19Ci0KLWJvb2wgQkJpbmRlcjo6aXNCaW5kZXJBbGl2ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXR1c190IEJCaW5kZXI6OnBpbmdCaW5kZXIoKQotewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotY29uc3QgU3RyaW5nMTYmIEJCaW5kZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSBjb25zdAotewotICAgIC8vIFRoaXMgaXMgYSBsb2NhbCBzdGF0aWMgcmF0aGVyIHRoYW4gYSBnbG9iYWwgc3RhdGljLAotICAgIC8vIHRvIGF2b2lkIHN0YXRpYyBpbml0aWFsaXplciBvcmRlcmluZyBpc3N1ZXMuCi0gICAgc3RhdGljIFN0cmluZzE2IHNFbXB0eURlc2NyaXB0b3I7Ci0gICAgQUxPR1coInJlYWNoZWQgQkJpbmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvciAodGhpcz0lcCkiLCB0aGlzKTsKLSAgICByZXR1cm4gc0VtcHR5RGVzY3JpcHRvcjsKLX0KLQotc3RhdHVzX3QgQkJpbmRlcjo6dHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKLQotICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIFBJTkdfVFJBTlNBQ1RJT046Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwaW5nQmluZGVyKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSBvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAocmVwbHkgIT0gTlVMTCkgewotICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKDApOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEJCaW5kZXI6OmxpbmtUb0RlYXRoKAotICAgIGNvbnN0IHNwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LCB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzKQotewotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgQkJpbmRlcjo6dW5saW5rVG9EZWF0aCgKLSAgICBjb25zdCB3cDxEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncywKLSAgICB3cDxEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCkKLXsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IEJCaW5kZXI6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBCQmluZGVyOjphdHRhY2hPYmplY3QoCi0gICAgY29uc3Qgdm9pZCogb2JqZWN0SUQsIHZvaWQqIG9iamVjdCwgdm9pZCogY2xlYW51cENvb2tpZSwKLSAgICBvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmMpCi17Ci0gICAgRXh0cmFzKiBlID0gbUV4dHJhczsKLQotICAgIGlmICghZSkgewotICAgICAgICBlID0gbmV3IEV4dHJhczsKLSAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2NtcHhjaGcoMCwgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90PihlKSwKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGludDMyX3QqPigmbUV4dHJhcykpICE9IDApIHsKLSAgICAgICAgICAgIGRlbGV0ZSBlOwotICAgICAgICAgICAgZSA9IG1FeHRyYXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGUgPT0gMCkgcmV0dXJuOyAvLyBvdXQgb2YgbWVtb3J5Ci0gICAgfQotCi0gICAgQXV0b011dGV4IF9sKGUtPm1Mb2NrKTsKLSAgICBlLT5tT2JqZWN0cy5hdHRhY2gob2JqZWN0SUQsIG9iamVjdCwgY2xlYW51cENvb2tpZSwgZnVuYyk7Ci19Ci0KLXZvaWQqIEJCaW5kZXI6OmZpbmRPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpIGNvbnN0Ci17Ci0gICAgRXh0cmFzKiBlID0gbUV4dHJhczsKLSAgICBpZiAoIWUpIHJldHVybiBOVUxMOwotCi0gICAgQXV0b011dGV4IF9sKGUtPm1Mb2NrKTsKLSAgICByZXR1cm4gZS0+bU9iamVjdHMuZmluZChvYmplY3RJRCk7Ci19Ci0KLXZvaWQgQkJpbmRlcjo6ZGV0YWNoT2JqZWN0KGNvbnN0IHZvaWQqIG9iamVjdElEKQotewotICAgIEV4dHJhcyogZSA9IG1FeHRyYXM7Ci0gICAgaWYgKCFlKSByZXR1cm47Ci0KLSAgICBBdXRvTXV0ZXggX2woZS0+bUxvY2spOwotICAgIGUtPm1PYmplY3RzLmRldGFjaChvYmplY3RJRCk7Ci19Ci0KLUJCaW5kZXIqIEJCaW5kZXI6OmxvY2FsQmluZGVyKCkKLXsKLSAgICByZXR1cm4gdGhpczsKLX0KLQotQkJpbmRlcjo6fkJCaW5kZXIoKQotewotICAgIGlmIChtRXh0cmFzKSBkZWxldGUgbUV4dHJhczsKLX0KLQotCi1zdGF0dXNfdCBCQmluZGVyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoIChjb2RlKSB7Ci0gICAgICAgIGNhc2UgSU5URVJGQUNFX1RSQU5TQUNUSU9OOgotICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoZ2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLQotICAgICAgICBjYXNlIERVTVBfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgIGludCBmZCA9IGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBpbnQgYXJnYyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ2MgJiYgZGF0YS5kYXRhQXZhaWwoKSA+IDA7IGkrKykgewotICAgICAgICAgICAgICAgYXJncy5hZGQoZGF0YS5yZWFkU3RyaW5nMTYoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZHVtcChmZCwgYXJncyk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX1RSQU5TQUNUSU9OOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVudW0gewotICAgIC8vIFRoaXMgaXMgdXNlZCB0byB0cmFuc2ZlciBvd25lcnNoaXAgb2YgdGhlIHJlbW90ZSBiaW5kZXIgZnJvbQotICAgIC8vIHRoZSBCcFJlZkJhc2Ugb2JqZWN0IGhvbGRpbmcgaXQgKHdoZW4gaXQgaXMgY29uc3RydWN0ZWQpLCB0byB0aGUKLSAgICAvLyBvd25lciBvZiB0aGUgQnBSZWZCYXNlIG9iamVjdCB3aGVuIGl0IGZpcnN0IGFjcXVpcmVzIHRoYXQgQnBSZWZCYXNlLgotICAgIGtSZW1vdGVBY3F1aXJlZCA9IDB4MDAwMDAwMDEKLX07Ci0KLUJwUmVmQmFzZTo6QnBSZWZCYXNlKGNvbnN0IHNwPElCaW5kZXI+JiBvKQotICAgIDogbVJlbW90ZShvLmdldCgpKSwgbVJlZnMoTlVMTCksIG1TdGF0ZSgwKQotewotICAgIGV4dGVuZE9iamVjdExpZmV0aW1lKE9CSkVDVF9MSUZFVElNRV9XRUFLKTsKLQotICAgIGlmIChtUmVtb3RlKSB7Ci0gICAgICAgIG1SZW1vdGUtPmluY1N0cm9uZyh0aGlzKTsgICAgICAgICAgIC8vIFJlbW92ZWQgb24gZmlyc3QgSW5jU3Ryb25nKCkuCi0gICAgICAgIG1SZWZzID0gbVJlbW90ZS0+Y3JlYXRlV2Vhayh0aGlzKTsgIC8vIEhlbGQgZm9yIG91ciBlbnRpcmUgbGlmZXRpbWUuCi0gICAgfQotfQotCi1CcFJlZkJhc2U6On5CcFJlZkJhc2UoKQotewotICAgIGlmIChtUmVtb3RlKSB7Ci0gICAgICAgIGlmICghKG1TdGF0ZSZrUmVtb3RlQWNxdWlyZWQpKSB7Ci0gICAgICAgICAgICBtUmVtb3RlLT5kZWNTdHJvbmcodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgfQotfQotCi12b2lkIEJwUmVmQmFzZTo6b25GaXJzdFJlZigpCi17Ci0gICAgYW5kcm9pZF9hdG9taWNfb3Ioa1JlbW90ZUFjcXVpcmVkLCAmbVN0YXRlKTsKLX0KLQotdm9pZCBCcFJlZkJhc2U6Om9uTGFzdFN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCkKLXsKLSAgICBpZiAobVJlbW90ZSkgewotICAgICAgICBtUmVtb3RlLT5kZWNTdHJvbmcodGhpcyk7Ci0gICAgfQotfQotCi1ib29sIEJwUmVmQmFzZTo6b25JbmNTdHJvbmdBdHRlbXB0ZWQodWludDMyX3QgZmxhZ3MsIGNvbnN0IHZvaWQqIGlkKQotewotICAgIHJldHVybiBtUmVtb3RlID8gbVJlZnMtPmF0dGVtcHRJbmNTdHJvbmcodGhpcykgOiBmYWxzZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9CcEJpbmRlci5jcHAgYi9saWJzL2JpbmRlci9CcEJpbmRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTYyZGIuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvQnBCaW5kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJwQmluZGVyIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YmluZGVyL0JwQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8vI3VuZGVmIEFMT0dWCi0vLyNkZWZpbmUgQUxPR1YoLi4uKSBmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18pCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJwQmluZGVyOjpPYmplY3RNYW5hZ2VyOjpPYmplY3RNYW5hZ2VyKCkKLXsKLX0KLQotQnBCaW5kZXI6Ok9iamVjdE1hbmFnZXI6On5PYmplY3RNYW5hZ2VyKCkKLXsKLSAgICBraWxsKCk7Ci19Ci0KLXZvaWQgQnBCaW5kZXI6Ok9iamVjdE1hbmFnZXI6OmF0dGFjaCgKLSAgICBjb25zdCB2b2lkKiBvYmplY3RJRCwgdm9pZCogb2JqZWN0LCB2b2lkKiBjbGVhbnVwQ29va2llLAotICAgIElCaW5kZXI6Om9iamVjdF9jbGVhbnVwX2Z1bmMgZnVuYykKLXsKLSAgICBlbnRyeV90IGU7Ci0gICAgZS5vYmplY3QgPSBvYmplY3Q7Ci0gICAgZS5jbGVhbnVwQ29va2llID0gY2xlYW51cENvb2tpZTsKLSAgICBlLmZ1bmMgPSBmdW5jOwotCi0gICAgaWYgKG1PYmplY3RzLmluZGV4T2ZLZXkob2JqZWN0SUQpID49IDApIHsKLSAgICAgICAgQUxPR0UoIlRyeWluZyB0byBhdHRhY2ggb2JqZWN0IElEICVwIHRvIGJpbmRlciBPYmplY3RNYW5hZ2VyICVwIHdpdGggb2JqZWN0ICVwLCBidXQgb2JqZWN0IElEIGFscmVhZHkgaW4gdXNlIiwKLSAgICAgICAgICAgICAgICBvYmplY3RJRCwgdGhpcywgIG9iamVjdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtT2JqZWN0cy5hZGQob2JqZWN0SUQsIGUpOwotfQotCi12b2lkKiBCcEJpbmRlcjo6T2JqZWN0TWFuYWdlcjo6ZmluZChjb25zdCB2b2lkKiBvYmplY3RJRCkgY29uc3QKLXsKLSAgICBjb25zdCBzc2l6ZV90IGkgPSBtT2JqZWN0cy5pbmRleE9mS2V5KG9iamVjdElEKTsKLSAgICBpZiAoaSA8IDApIHJldHVybiBOVUxMOwotICAgIHJldHVybiBtT2JqZWN0cy52YWx1ZUF0KGkpLm9iamVjdDsKLX0KLQotdm9pZCBCcEJpbmRlcjo6T2JqZWN0TWFuYWdlcjo6ZGV0YWNoKGNvbnN0IHZvaWQqIG9iamVjdElEKQotewotICAgIG1PYmplY3RzLnJlbW92ZUl0ZW0ob2JqZWN0SUQpOwotfQotCi12b2lkIEJwQmluZGVyOjpPYmplY3RNYW5hZ2VyOjpraWxsKCkKLXsKLSAgICBjb25zdCBzaXplX3QgTiA9IG1PYmplY3RzLnNpemUoKTsKLSAgICBBTE9HVigiS2lsbGluZyAlZCBvYmplY3RzIGluIG1hbmFnZXIgJXAiLCBOLCB0aGlzKTsKLSAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGVudHJ5X3QmIGUgPSBtT2JqZWN0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZS5mdW5jICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGUuZnVuYyhtT2JqZWN0cy5rZXlBdChpKSwgZS5vYmplY3QsIGUuY2xlYW51cENvb2tpZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtT2JqZWN0cy5jbGVhcigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQnBCaW5kZXI6OkJwQmluZGVyKGludDMyX3QgaGFuZGxlKQotICAgIDogbUhhbmRsZShoYW5kbGUpCi0gICAgLCBtQWxpdmUoMSkKLSAgICAsIG1PYml0c1NlbnQoMCkKLSAgICAsIG1PYml0dWFyaWVzKE5VTEwpCi17Ci0gICAgQUxPR1YoIkNyZWF0aW5nIEJwQmluZGVyICVwIGhhbmRsZSAlZFxuIiwgdGhpcywgbUhhbmRsZSk7Ci0KLSAgICBleHRlbmRPYmplY3RMaWZldGltZShPQkpFQ1RfTElGRVRJTUVfV0VBSyk7Ci0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aW5jV2Vha0hhbmRsZShoYW5kbGUpOwotfQotCi1ib29sIEJwQmluZGVyOjppc0Rlc2NyaXB0b3JDYWNoZWQoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbURlc2NyaXB0b3JDYWNoZS5zaXplKCkgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLWNvbnN0IFN0cmluZzE2JiBCcEJpbmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRGVzY3JpcHRvckNhY2hlZCgpID09IGZhbHNlKSB7Ci0gICAgICAgIFBhcmNlbCBzZW5kLCByZXBseTsKLSAgICAgICAgLy8gZG8gdGhlIElQQyB3aXRob3V0IGEgbG9jayBoZWxkLgotICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25zdF9jYXN0PEJwQmluZGVyKj4odGhpcyktPnRyYW5zYWN0KAotICAgICAgICAgICAgICAgIElOVEVSRkFDRV9UUkFOU0FDVElPTiwgc2VuZCwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgU3RyaW5nMTYgcmVzKHJlcGx5LnJlYWRTdHJpbmcxNigpKTsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgICAgICAvLyBtRGVzY3JpcHRvckNhY2hlIGNvdWxkIGhhdmUgYmVlbiBhc3NpZ25lZCB3aGlsZSB0aGUgbG9jayB3YXMKLSAgICAgICAgICAgIC8vIHJlbGVhc2VkLgotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yQ2FjaGUuc2l6ZSgpID09IDApCi0gICAgICAgICAgICAgICAgbURlc2NyaXB0b3JDYWNoZSA9IHJlczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyB3ZSdyZSByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBub24tc3RhdGljIG9iamVjdCBoZXJlLiBVc3VhbGx5IHRoaXMKLSAgICAvLyBpcyBub3Qgc29tZXRoaW5nIHNtYXJ0IHRvIGRvLCBob3dldmVyLCB3aXRoIGJpbmRlciBvYmplY3RzIGl0IGlzIAotICAgIC8vICh1c3VhbGx5KSBzYWZlIGJlY2F1c2UgdGhleSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQuCi0gICAgCi0gICAgcmV0dXJuIG1EZXNjcmlwdG9yQ2FjaGU7Ci19Ci0KLWJvb2wgQnBCaW5kZXI6OmlzQmluZGVyQWxpdmUoKSBjb25zdAotewotICAgIHJldHVybiBtQWxpdmUgIT0gMDsKLX0KLQotc3RhdHVzX3QgQnBCaW5kZXI6OnBpbmdCaW5kZXIoKQotewotICAgIFBhcmNlbCBzZW5kOwotICAgIFBhcmNlbCByZXBseTsKLSAgICBzdGF0dXNfdCBlcnIgPSB0cmFuc2FjdChQSU5HX1RSQU5TQUNUSU9OLCBzZW5kLCAmcmVwbHkpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0gICAgaWYgKHJlcGx5LmRhdGFTaXplKCkgPCBzaXplb2Yoc3RhdHVzX3QpKSByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgIHJldHVybiAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7Ci19Ci0KLXN0YXR1c190IEJwQmluZGVyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBQYXJjZWwgc2VuZDsKLSAgICBQYXJjZWwgcmVwbHk7Ci0gICAgc2VuZC53cml0ZUZpbGVEZXNjcmlwdG9yKGZkKTsKLSAgICBjb25zdCBzaXplX3QgbnVtQXJncyA9IGFyZ3Muc2l6ZSgpOwotICAgIHNlbmQud3JpdGVJbnQzMihudW1BcmdzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICBzZW5kLndyaXRlU3RyaW5nMTYoYXJnc1tpXSk7Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IHRyYW5zYWN0KERVTVBfVFJBTlNBQ1RJT04sIHNlbmQsICZyZXBseSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQnBCaW5kZXI6OnRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgLy8gT25jZSBhIGJpbmRlciBoYXMgZGllZCwgaXQgd2lsbCBuZXZlciBjb21lIGJhY2sgdG8gbGlmZS4KLSAgICBpZiAobUFsaXZlKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnRyYW5zYWN0KAotICAgICAgICAgICAgbUhhbmRsZSwgY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgbUFsaXZlID0gMDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IEJwQmluZGVyOjpsaW5rVG9EZWF0aCgKLSAgICBjb25zdCBzcDxEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBPYml0dWFyeSBvYjsKLSAgICBvYi5yZWNpcGllbnQgPSByZWNpcGllbnQ7Ci0gICAgb2IuY29va2llID0gY29va2llOwotICAgIG9iLmZsYWdzID0gZmxhZ3M7Ci0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlY2lwaWVudCA9PSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtUb0RlYXRoKCk6IHJlY2lwaWVudCBtdXN0IGJlIG5vbi1OVUxMIik7Ci0KLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICAgICAgaWYgKCFtT2JpdHNTZW50KSB7Ci0gICAgICAgICAgICBpZiAoIW1PYml0dWFyaWVzKSB7Ci0gICAgICAgICAgICAgICAgbU9iaXR1YXJpZXMgPSBuZXcgVmVjdG9yPE9iaXR1YXJ5PjsKLSAgICAgICAgICAgICAgICBpZiAoIW1PYml0dWFyaWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJSZXF1ZXN0aW5nIGRlYXRoIG5vdGlmaWNhdGlvbjogJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBnZXRXZWFrUmVmcygpLT5pbmNXZWFrKHRoaXMpOwotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiBzZWxmID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5yZXF1ZXN0RGVhdGhOb3RpZmljYXRpb24obUhhbmRsZSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgc2VsZi0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NpemVfdCByZXMgPSBtT2JpdHVhcmllcy0+YWRkKG9iKTsKLSAgICAgICAgICAgIHJldHVybiByZXMgPj0gKHNzaXplX3QpTk9fRVJST1IgPyAoc3RhdHVzX3QpTk9fRVJST1IgOiByZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci19Ci0KLXN0YXR1c190IEJwQmluZGVyOjp1bmxpbmtUb0RlYXRoKAotICAgIGNvbnN0IHdwPERlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LCB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzLAotICAgIHdwPERlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50KQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICBpZiAobU9iaXRzU2VudCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgY29uc3Qgc2l6ZV90IE4gPSBtT2JpdHVhcmllcyA/IG1PYml0dWFyaWVzLT5zaXplKCkgOiAwOwotICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgY29uc3QgT2JpdHVhcnkmIG9iaXQgPSBtT2JpdHVhcmllcy0+aXRlbUF0KGkpOwotICAgICAgICBpZiAoKG9iaXQucmVjaXBpZW50ID09IHJlY2lwaWVudAotICAgICAgICAgICAgICAgICAgICB8fCAocmVjaXBpZW50ID09IE5VTEwgJiYgb2JpdC5jb29raWUgPT0gY29va2llKSkKLSAgICAgICAgICAgICAgICAmJiBvYml0LmZsYWdzID09IGZsYWdzKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBhbGxGbGFncyA9IG9iaXQuZmxhZ3N8ZmxhZ3M7Ci0gICAgICAgICAgICBpZiAob3V0UmVjaXBpZW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqb3V0UmVjaXBpZW50ID0gbU9iaXR1YXJpZXMtPml0ZW1BdChpKS5yZWNpcGllbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtT2JpdHVhcmllcy0+cmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBpZiAobU9iaXR1YXJpZXMtPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIkNsZWFyaW5nIGRlYXRoIG5vdGlmaWNhdGlvbjogJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZSogc2VsZiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgICAgICAgICAgICAgc2VsZi0+Y2xlYXJEZWF0aE5vdGlmaWNhdGlvbihtSGFuZGxlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIG1PYml0dWFyaWVzOwotICAgICAgICAgICAgICAgIG1PYml0dWFyaWVzID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLX0KLQotdm9pZCBCcEJpbmRlcjo6c2VuZE9iaXR1YXJ5KCkKLXsKLSAgICBBTE9HVigiU2VuZGluZyBvYml0dWFyeSBmb3IgcHJveHkgJXAgaGFuZGxlICVkLCBtT2JpdHNTZW50PSVzXG4iLAotICAgICAgICB0aGlzLCBtSGFuZGxlLCBtT2JpdHNTZW50ID8gInRydWUiIDogImZhbHNlIik7Ci0KLSAgICBtQWxpdmUgPSAwOwotICAgIGlmIChtT2JpdHNTZW50KSByZXR1cm47Ci0KLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgVmVjdG9yPE9iaXR1YXJ5Piogb2JpdHMgPSBtT2JpdHVhcmllczsKLSAgICBpZihvYml0cyAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJDbGVhcmluZyBzZW50IGRlYXRoIG5vdGlmaWNhdGlvbjogJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGUqIHNlbGYgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICBzZWxmLT5jbGVhckRlYXRoTm90aWZpY2F0aW9uKG1IYW5kbGUsIHRoaXMpOwotICAgICAgICBzZWxmLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIG1PYml0dWFyaWVzID0gTlVMTDsKLSAgICB9Ci0gICAgbU9iaXRzU2VudCA9IDE7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0KLSAgICBBTE9HVigiUmVwb3J0aW5nIGRlYXRoIG9mIHByb3h5ICVwIGZvciAlZCByZWNpcGllbnRzXG4iLAotICAgICAgICB0aGlzLCBvYml0cyA/IG9iaXRzLT5zaXplKCkgOiAwKTsKLQotICAgIGlmIChvYml0cyAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBOID0gb2JpdHMtPnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpPE47IGkrKykgewotICAgICAgICAgICAgcmVwb3J0T25lRGVhdGgob2JpdHMtPml0ZW1BdChpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWxldGUgb2JpdHM7Ci0gICAgfQotfQotCi12b2lkIEJwQmluZGVyOjpyZXBvcnRPbmVEZWF0aChjb25zdCBPYml0dWFyeSYgb2JpdCkKLXsKLSAgICBzcDxEZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50ID0gb2JpdC5yZWNpcGllbnQucHJvbW90ZSgpOwotICAgIEFMT0dWKCJSZXBvcnRpbmcgZGVhdGggdG8gcmVjaXBpZW50OiAlcFxuIiwgcmVjaXBpZW50LmdldCgpKTsKLSAgICBpZiAocmVjaXBpZW50ID09IE5VTEwpIHJldHVybjsKLQotICAgIHJlY2lwaWVudC0+YmluZGVyRGllZCh0aGlzKTsKLX0KLQotCi12b2lkIEJwQmluZGVyOjphdHRhY2hPYmplY3QoCi0gICAgY29uc3Qgdm9pZCogb2JqZWN0SUQsIHZvaWQqIG9iamVjdCwgdm9pZCogY2xlYW51cENvb2tpZSwKLSAgICBvYmplY3RfY2xlYW51cF9mdW5jIGZ1bmMpCi17Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICBBTE9HVigiQXR0YWNoaW5nIG9iamVjdCAlcCB0byBiaW5kZXIgJXAgKG1hbmFnZXI9JXApIiwgb2JqZWN0LCB0aGlzLCAmbU9iamVjdHMpOwotICAgIG1PYmplY3RzLmF0dGFjaChvYmplY3RJRCwgb2JqZWN0LCBjbGVhbnVwQ29va2llLCBmdW5jKTsKLX0KLQotdm9pZCogQnBCaW5kZXI6OmZpbmRPYmplY3QoY29uc3Qgdm9pZCogb2JqZWN0SUQpIGNvbnN0Ci17Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbU9iamVjdHMuZmluZChvYmplY3RJRCk7Ci19Ci0KLXZvaWQgQnBCaW5kZXI6OmRldGFjaE9iamVjdChjb25zdCB2b2lkKiBvYmplY3RJRCkKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIG1PYmplY3RzLmRldGFjaChvYmplY3RJRCk7Ci19Ci0KLUJwQmluZGVyKiBCcEJpbmRlcjo6cmVtb3RlQmluZGVyKCkKLXsKLSAgICByZXR1cm4gdGhpczsKLX0KLQotQnBCaW5kZXI6On5CcEJpbmRlcigpCi17Ci0gICAgQUxPR1YoIkRlc3Ryb3lpbmcgQnBCaW5kZXIgJXAgaGFuZGxlICVkXG4iLCB0aGlzLCBtSGFuZGxlKTsKLQotICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotCi0gICAgbUxvY2subG9jaygpOwotICAgIFZlY3RvcjxPYml0dWFyeT4qIG9iaXRzID0gbU9iaXR1YXJpZXM7Ci0gICAgaWYob2JpdHMgIT0gTlVMTCkgewotICAgICAgICBpZiAoaXBjKSBpcGMtPmNsZWFyRGVhdGhOb3RpZmljYXRpb24obUhhbmRsZSwgdGhpcyk7Ci0gICAgICAgIG1PYml0dWFyaWVzID0gTlVMTDsKLSAgICB9Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0KLSAgICBpZiAob2JpdHMgIT0gTlVMTCkgewotICAgICAgICAvLyBYWFggU2hvdWxkIHdlIHRlbGwgYW55IHJlbWFpbmluZyBEZWF0aFJlY2lwaWVudAotICAgICAgICAvLyBvYmplY3RzIHRoYXQgdGhlIGxhc3Qgc3Ryb25nIHJlZiBoYXMgZ29uZSBhd2F5LCBzbyB0aGV5Ci0gICAgICAgIC8vIGFyZSBubyBsb25nZXIgbGlua2VkPwotICAgICAgICBkZWxldGUgb2JpdHM7Ci0gICAgfQotCi0gICAgaWYgKGlwYykgewotICAgICAgICBpcGMtPmV4cHVuZ2VIYW5kbGUobUhhbmRsZSwgdGhpcyk7Ci0gICAgICAgIGlwYy0+ZGVjV2Vha0hhbmRsZShtSGFuZGxlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQnBCaW5kZXI6Om9uRmlyc3RSZWYoKQotewotICAgIEFMT0dWKCJvbkZpcnN0UmVmIEJwQmluZGVyICVwIGhhbmRsZSAlZFxuIiwgdGhpcywgbUhhbmRsZSk7Ci0gICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgaWYgKGlwYykgaXBjLT5pbmNTdHJvbmdIYW5kbGUobUhhbmRsZSk7Ci19Ci0KLXZvaWQgQnBCaW5kZXI6Om9uTGFzdFN0cm9uZ1JlZihjb25zdCB2b2lkKiBpZCkKLXsKLSAgICBBTE9HVigib25MYXN0U3Ryb25nUmVmIEJwQmluZGVyICVwIGhhbmRsZSAlZFxuIiwgdGhpcywgbUhhbmRsZSk7Ci0gICAgSUZfQUxPR1YoKSB7Ci0gICAgICAgIHByaW50UmVmcygpOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZSogaXBjID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICBpZiAoaXBjKSBpcGMtPmRlY1N0cm9uZ0hhbmRsZShtSGFuZGxlKTsKLX0KLQotYm9vbCBCcEJpbmRlcjo6b25JbmNTdHJvbmdBdHRlbXB0ZWQodWludDMyX3QgZmxhZ3MsIGNvbnN0IHZvaWQqIGlkKQotewotICAgIEFMT0dWKCJvbkluY1N0cm9uZ0F0dGVtcHRlZCBCcEJpbmRlciAlcCBoYW5kbGUgJWRcbiIsIHRoaXMsIG1IYW5kbGUpOwotICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgIHJldHVybiBpcGMgPyBpcGMtPmF0dGVtcHRJbmNTdHJvbmdIYW5kbGUobUhhbmRsZSkgPT0gTk9fRVJST1IgOiBmYWxzZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9JSW50ZXJmYWNlLmNwcCBiL2xpYnMvYmluZGVyL0lJbnRlcmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFjZjVkLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0lJbnRlcmZhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JSW50ZXJmYWNlOjpJSW50ZXJmYWNlKCkgCi0gICAgOiBSZWZCYXNlKCkgewotfQotCi1JSW50ZXJmYWNlOjp+SUludGVyZmFjZSgpIHsKLX0KLQotc3A8SUJpbmRlcj4gSUludGVyZmFjZTo6YXNCaW5kZXIoKQotewotICAgIHJldHVybiB0aGlzID8gb25Bc0JpbmRlcigpIDogTlVMTDsKLX0KLQotc3A8Y29uc3QgSUJpbmRlcj4gSUludGVyZmFjZTo6YXNCaW5kZXIoKSBjb25zdAotewotICAgIHJldHVybiB0aGlzID8gY29uc3RfY2FzdDxJSW50ZXJmYWNlKj4odGhpcyktPm9uQXNCaW5kZXIoKSA6IE5VTEw7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvSU1lbW9yeS5jcHAgYi9saWJzL2JpbmRlci9JTWVtb3J5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyNDUxYS4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9JTWVtb3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJJTWVtb3J5IgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotCi0jZGVmaW5lIFZFUkJPU0UgICAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBIZWFwQ2FjaGUgOiBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKLXsKLXB1YmxpYzoKLSAgICBIZWFwQ2FjaGUoKTsKLSAgICB2aXJ0dWFsIH5IZWFwQ2FjaGUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotCi0gICAgc3A8SU1lbW9yeUhlYXA+IGZpbmRfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKTsKLSAgICB2b2lkIGZyZWVfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKTsKLSAgICBzcDxJTWVtb3J5SGVhcD4gZ2V0X2hlYXAoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcik7Ci0gICAgdm9pZCBkdW1wX2hlYXBzKCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gRm9yIElNZW1vcnkuY3BwCi0gICAgc3RydWN0IGhlYXBfaW5mb190IHsKLSAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXA7Ci0gICAgICAgIGludDMyX3QgICAgICAgICBjb3VudDsKLSAgICB9OwotCi0gICAgdm9pZCBmcmVlX2hlYXAoY29uc3Qgd3A8SUJpbmRlcj4mIGJpbmRlcik7Ci0KLSAgICBNdXRleCBtSGVhcENhY2hlTG9jazsKLSAgICBLZXllZFZlY3Rvcjwgd3A8SUJpbmRlcj4sIGhlYXBfaW5mb190ID4gbUhlYXBDYWNoZTsKLX07Ci0KLXN0YXRpYyBzcDxIZWFwQ2FjaGU+IGdIZWFwQ2FjaGUgPSBuZXcgSGVhcENhY2hlKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWVudW0gewotICAgIEhFQVBfSUQgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OCi19OwotCi1jbGFzcyBCcE1lbW9yeUhlYXAgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lbW9yeUhlYXA+Ci17Ci1wdWJsaWM6Ci0gICAgQnBNZW1vcnlIZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKTsKLSAgICB2aXJ0dWFsIH5CcE1lbW9yeUhlYXAoKTsKLQotICAgIHZpcnR1YWwgaW50IGdldEhlYXBJRCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCogZ2V0QmFzZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgSU1lbW9yeTsKLSAgICBmcmllbmQgY2xhc3MgSGVhcENhY2hlOwotCi0gICAgLy8gZm9yIGRlYnVnZ2luZyBpbiB0aGlzIG1vZHVsZQotICAgIHN0YXRpYyBpbmxpbmUgc3A8SU1lbW9yeUhlYXA+IGZpbmRfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSB7Ci0gICAgICAgIHJldHVybiBnSGVhcENhY2hlLT5maW5kX2hlYXAoYmluZGVyKTsKLSAgICB9Ci0gICAgc3RhdGljIGlubGluZSB2b2lkIGZyZWVfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSB7Ci0gICAgICAgIGdIZWFwQ2FjaGUtPmZyZWVfaGVhcChiaW5kZXIpOwotICAgIH0KLSAgICBzdGF0aWMgaW5saW5lIHNwPElNZW1vcnlIZWFwPiBnZXRfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSB7Ci0gICAgICAgIHJldHVybiBnSGVhcENhY2hlLT5nZXRfaGVhcChiaW5kZXIpOwotICAgIH0KLSAgICBzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9oZWFwcygpIHsKLSAgICAgICAgZ0hlYXBDYWNoZS0+ZHVtcF9oZWFwcygpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0TWFwcGVkKCkgY29uc3Q7Ci0gICAgdm9pZCBhc3NlcnRSZWFsbHlNYXBwZWQoKSBjb25zdDsKLQotICAgIG11dGFibGUgdm9sYXRpbGUgaW50MzJfdCBtSGVhcElkOwotICAgIG11dGFibGUgdm9pZCogICAgICAgbUJhc2U7Ci0gICAgbXV0YWJsZSBzaXplX3QgICAgICBtU2l6ZTsKLSAgICBtdXRhYmxlIHVpbnQzMl90ICAgIG1GbGFnczsKLSAgICBtdXRhYmxlIHVpbnQzMl90ICAgIG1PZmZzZXQ7Ci0gICAgbXV0YWJsZSBib29sICAgICAgICBtUmVhbEhlYXA7Ci0gICAgbXV0YWJsZSBNdXRleCAgICAgICBtTG9jazsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZW51bSB7Ci0gICAgR0VUX01FTU9SWSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04KLX07Ci0KLWNsYXNzIEJwTWVtb3J5IDogcHVibGljIEJwSW50ZXJmYWNlPElNZW1vcnk+Ci17Ci1wdWJsaWM6Ci0gICAgQnBNZW1vcnkoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpOwotICAgIHZpcnR1YWwgfkJwTWVtb3J5KCk7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5SGVhcD4gZ2V0TWVtb3J5KHNzaXplX3QqIG9mZnNldD0wLCBzaXplX3QqIHNpemU9MCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBzcDxJTWVtb3J5SGVhcD4gbUhlYXA7Ci0gICAgbXV0YWJsZSBzc2l6ZV90IG1PZmZzZXQ7Ci0gICAgbXV0YWJsZSBzaXplX3QgbVNpemU7Ci19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkKiBJTWVtb3J5OjpmYXN0UG9pbnRlcihjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLCBzc2l6ZV90IG9mZnNldCkgY29uc3QKLXsKLSAgICBzcDxJTWVtb3J5SGVhcD4gcmVhbEhlYXAgPSBCcE1lbW9yeUhlYXA6OmdldF9oZWFwKGJpbmRlcik7Ci0gICAgdm9pZCogY29uc3QgYmFzZSA9IHJlYWxIZWFwLT5iYXNlKCk7Ci0gICAgaWYgKGJhc2UgPT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXIqPihiYXNlKSArIG9mZnNldDsKLX0KLQotdm9pZCogSU1lbW9yeTo6cG9pbnRlcigpIGNvbnN0IHsKLSAgICBzc2l6ZV90IG9mZnNldDsKLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGdldE1lbW9yeSgmb2Zmc2V0KTsKLSAgICB2b2lkKiBjb25zdCBiYXNlID0gaGVhcCE9MCA/IGhlYXAtPmJhc2UoKSA6IE1BUF9GQUlMRUQ7Ci0gICAgaWYgKGJhc2UgPT0gTUFQX0ZBSUxFRCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXIqPihiYXNlKSArIG9mZnNldDsKLX0KLQotc2l6ZV90IElNZW1vcnk6OnNpemUoKSBjb25zdCB7Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgZ2V0TWVtb3J5KE5VTEwsICZzaXplKTsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3NpemVfdCBJTWVtb3J5OjpvZmZzZXQoKSBjb25zdCB7Ci0gICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgZ2V0TWVtb3J5KCZvZmZzZXQpOwotICAgIHJldHVybiBvZmZzZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUJwTWVtb3J5OjpCcE1lbW9yeShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICA6IEJwSW50ZXJmYWNlPElNZW1vcnk+KGltcGwpLCBtT2Zmc2V0KDApLCBtU2l6ZSgwKQotewotfQotCi1CcE1lbW9yeTo6fkJwTWVtb3J5KCkKLXsKLX0KLQotc3A8SU1lbW9yeUhlYXA+IEJwTWVtb3J5OjpnZXRNZW1vcnkoc3NpemVfdCogb2Zmc2V0LCBzaXplX3QqIHNpemUpIGNvbnN0Ci17Ci0gICAgaWYgKG1IZWFwID09IDApIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lbW9yeTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUVNT1JZLCBkYXRhLCAmcmVwbHkpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBoZWFwID0gcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpOwotICAgICAgICAgICAgc3NpemVfdCBvID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzaXplX3QgcyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGhlYXAgIT0gMCkgewotICAgICAgICAgICAgICAgIG1IZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KGhlYXApOwotICAgICAgICAgICAgICAgIGlmIChtSGVhcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1PZmZzZXQgPSBvOwotICAgICAgICAgICAgICAgICAgICBtU2l6ZSA9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChvZmZzZXQpICpvZmZzZXQgPSBtT2Zmc2V0OwotICAgIGlmIChzaXplKSAqc2l6ZSA9IG1TaXplOwotICAgIHJldHVybiBtSGVhcDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZW1vcnksICJhbmRyb2lkLnV0aWxzLklNZW1vcnkiKTsKLQotQm5NZW1vcnk6OkJuTWVtb3J5KCkgewotfQotCi1Cbk1lbW9yeTo6fkJuTWVtb3J5KCkgewotfQotCi1zdGF0dXNfdCBCbk1lbW9yeTo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX01FTU9SWTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZW1vcnksIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoIGdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSktPmFzQmluZGVyKCkgKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG9mZnNldCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUJwTWVtb3J5SGVhcDo6QnBNZW1vcnlIZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgIDogQnBJbnRlcmZhY2U8SU1lbW9yeUhlYXA+KGltcGwpLAotICAgICAgICBtSGVhcElkKC0xKSwgbUJhc2UoTUFQX0ZBSUxFRCksIG1TaXplKDApLCBtRmxhZ3MoMCksIG1PZmZzZXQoMCksIG1SZWFsSGVhcChmYWxzZSkKLXsKLX0KLQotQnBNZW1vcnlIZWFwOjp+QnBNZW1vcnlIZWFwKCkgewotICAgIGlmIChtSGVhcElkICE9IC0xKSB7Ci0gICAgICAgIGNsb3NlKG1IZWFwSWQpOwotICAgICAgICBpZiAobVJlYWxIZWFwKSB7Ci0gICAgICAgICAgICAvLyBieSBjb25zdHJ1Y3Rpb24gd2UncmUgdGhlIGxhc3Qgb25lCi0gICAgICAgICAgICBpZiAobUJhc2UgIT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGNvbnN0X2Nhc3Q8QnBNZW1vcnlIZWFwKj4odGhpcyktPmFzQmluZGVyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoVkVSQk9TRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVU5NQVBQSU5HIGJpbmRlcj0lcCwgaGVhcD0lcCwgc2l6ZT0lZCwgZmQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRlci5nZXQoKSwgdGhpcywgbVNpemUsIG1IZWFwSWQpOwotICAgICAgICAgICAgICAgICAgICBDYWxsU3RhY2sgc3RhY2s7Ci0gICAgICAgICAgICAgICAgICAgIHN0YWNrLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBzdGFjay5kdW1wKCJjYWxsc3RhY2siKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtdW5tYXAobUJhc2UsIG1TaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGxpc3Qgb25seSBpZiBpdCB3YXMgbWFwcGVkIGJlZm9yZQotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gY29uc3RfY2FzdDxCcE1lbW9yeUhlYXAqPih0aGlzKS0+YXNCaW5kZXIoKTsKLSAgICAgICAgICAgIGZyZWVfaGVhcChiaW5kZXIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEJwTWVtb3J5SGVhcDo6YXNzZXJ0TWFwcGVkKCkgY29uc3QKLXsKLSAgICBpZiAobUhlYXBJZCA9PSAtMSkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIoY29uc3RfY2FzdDxCcE1lbW9yeUhlYXAqPih0aGlzKS0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIHNwPEJwTWVtb3J5SGVhcD4gaGVhcChzdGF0aWNfY2FzdDxCcE1lbW9yeUhlYXAqPihmaW5kX2hlYXAoYmluZGVyKS5nZXQoKSkpOwotICAgICAgICBoZWFwLT5hc3NlcnRSZWFsbHlNYXBwZWQoKTsKLSAgICAgICAgaWYgKGhlYXAtPm1CYXNlICE9IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgICAgICBpZiAobUhlYXBJZCA9PSAtMSkgewotICAgICAgICAgICAgICAgIG1CYXNlICAgPSBoZWFwLT5tQmFzZTsKLSAgICAgICAgICAgICAgICBtU2l6ZSAgID0gaGVhcC0+bVNpemU7Ci0gICAgICAgICAgICAgICAgbU9mZnNldCA9IGhlYXAtPm1PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfd3JpdGUoIGR1cCggaGVhcC0+bUhlYXBJZCApLCAmbUhlYXBJZCApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICAgICAgICAgIGZyZWVfaGVhcChiaW5kZXIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEJwTWVtb3J5SGVhcDo6YXNzZXJ0UmVhbGx5TWFwcGVkKCkgY29uc3QKLXsKLSAgICBpZiAobUhlYXBJZCA9PSAtMSkgewotCi0gICAgICAgIC8vIHJlbW90ZSBjYWxsIHdpdGhvdXQgbUxvY2sgaGVsZCwgd29yc2UgY2FzZSBzY2VuYXJpbywgd2UgZW5kIHVwCi0gICAgICAgIC8vIGNhbGxpbmcgdHJhbnNhY3QoKSBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGJ1dCB0aGF0J3Mgbm90IGEgcHJvYmxlbSwKLSAgICAgICAgLy8gb25seSBtbWFwIGJlbG93IG11c3QgYmUgaW4gdGhlIGNyaXRpY2FsIHNlY3Rpb24uCi0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lbW9yeUhlYXA6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChIRUFQX0lELCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpbnQgcGFyY2VsX2ZkID0gcmVwbHkucmVhZEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIHNzaXplX3Qgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB1aW50MzJfdCBmbGFncyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB1aW50MzJfdCBvZmZzZXQgPSByZXBseS5yZWFkSW50MzIoKTsKLQotICAgICAgICBBTE9HRV9JRihlcnIsICJiaW5kZXI9JXAgdHJhbnNhY3Rpb24gZmFpbGVkIGZkPSVkLCBzaXplPSVsZCwgZXJyPSVkICglcykiLAotICAgICAgICAgICAgICAgIGFzQmluZGVyKCkuZ2V0KCksIHBhcmNlbF9mZCwgc2l6ZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0KLSAgICAgICAgaW50IGZkID0gZHVwKCBwYXJjZWxfZmQgKTsKLSAgICAgICAgQUxPR0VfSUYoZmQ9PS0xLCAiY2Fubm90IGR1cCBmZD0lZCwgc2l6ZT0lbGQsIGVycj0lZCAoJXMpIiwKLSAgICAgICAgICAgICAgICBwYXJjZWxfZmQsIHNpemUsIGVyciwgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgICAgICBpbnQgYWNjZXNzID0gUFJPVF9SRUFEOwotICAgICAgICBpZiAoIShmbGFncyAmIFJFQURfT05MWSkpIHsKLSAgICAgICAgICAgIGFjY2VzcyB8PSBQUk9UX1dSSVRFOwotICAgICAgICB9Ci0KLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1IZWFwSWQgPT0gLTEpIHsKLSAgICAgICAgICAgIG1SZWFsSGVhcCA9IHRydWU7Ci0gICAgICAgICAgICBtQmFzZSA9IG1tYXAoMCwgc2l6ZSwgYWNjZXNzLCBNQVBfU0hBUkVELCBmZCwgb2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChtQmFzZSA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNhbm5vdCBtYXAgQnBNZW1vcnlIZWFwIChiaW5kZXI9JXApLCBzaXplPSVsZCwgZmQ9JWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhc0JpbmRlcigpLmdldCgpLCBzaXplLCBmZCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3dyaXRlKGZkLCAmbUhlYXBJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBCcE1lbW9yeUhlYXA6OmdldEhlYXBJRCgpIGNvbnN0IHsKLSAgICBhc3NlcnRNYXBwZWQoKTsKLSAgICByZXR1cm4gbUhlYXBJZDsKLX0KLQotdm9pZCogQnBNZW1vcnlIZWFwOjpnZXRCYXNlKCkgY29uc3QgewotICAgIGFzc2VydE1hcHBlZCgpOwotICAgIHJldHVybiBtQmFzZTsKLX0KLQotc2l6ZV90IEJwTWVtb3J5SGVhcDo6Z2V0U2l6ZSgpIGNvbnN0IHsKLSAgICBhc3NlcnRNYXBwZWQoKTsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLXVpbnQzMl90IEJwTWVtb3J5SGVhcDo6Z2V0RmxhZ3MoKSBjb25zdCB7Ci0gICAgYXNzZXJ0TWFwcGVkKCk7Ci0gICAgcmV0dXJuIG1GbGFnczsKLX0KLQotdWludDMyX3QgQnBNZW1vcnlIZWFwOjpnZXRPZmZzZXQoKSBjb25zdCB7Ci0gICAgYXNzZXJ0TWFwcGVkKCk7Ci0gICAgcmV0dXJuIG1PZmZzZXQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVtb3J5SGVhcCwgImFuZHJvaWQudXRpbHMuSU1lbW9yeUhlYXAiKTsKLQotQm5NZW1vcnlIZWFwOjpCbk1lbW9yeUhlYXAoKSB7Ci19Ci0KLUJuTWVtb3J5SGVhcDo6fkJuTWVtb3J5SGVhcCgpIHsKLX0KLQotc3RhdHVzX3QgQm5NZW1vcnlIZWFwOjpvblRyYW5zYWN0KAotICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgY2FzZSBIRUFQX0lEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lbW9yeUhlYXAsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUZpbGVEZXNjcmlwdG9yKGdldEhlYXBJRCgpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldFNpemUoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRGbGFncygpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGdldE9mZnNldCgpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUhlYXBDYWNoZTo6SGVhcENhY2hlKCkKLSAgICA6IERlYXRoUmVjaXBpZW50KCkKLXsKLX0KLQotSGVhcENhY2hlOjp+SGVhcENhY2hlKCkKLXsKLX0KLQotdm9pZCBIZWFwQ2FjaGU6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIGJpbmRlcikKLXsKLSAgICAvL0FMT0dEKCJiaW5kZXJEaWVkIGJpbmRlcj0lcCIsIGJpbmRlci51bnNhZmVfZ2V0KCkpOwotICAgIGZyZWVfaGVhcChiaW5kZXIpOwotfQotCi1zcDxJTWVtb3J5SGVhcD4gSGVhcENhY2hlOjpmaW5kX2hlYXAoY29uc3Qgc3A8SUJpbmRlcj4mIGJpbmRlcikKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUhlYXBDYWNoZUxvY2spOwotICAgIHNzaXplX3QgaSA9IG1IZWFwQ2FjaGUuaW5kZXhPZktleShiaW5kZXIpOwotICAgIGlmIChpPj0wKSB7Ci0gICAgICAgIGhlYXBfaW5mb190JiBpbmZvID0gbUhlYXBDYWNoZS5lZGl0VmFsdWVBdChpKTsKLSAgICAgICAgQUxPR0RfSUYoVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAiZm91bmQgYmluZGVyPSVwLCBoZWFwPSVwLCBzaXplPSVkLCBmZD0lZCwgY291bnQ9JWQiLAotICAgICAgICAgICAgICAgIGJpbmRlci5nZXQoKSwgaW5mby5oZWFwLmdldCgpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJwTWVtb3J5SGVhcCo+KGluZm8uaGVhcC5nZXQoKSktPm1TaXplLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJwTWVtb3J5SGVhcCo+KGluZm8uaGVhcC5nZXQoKSktPm1IZWFwSWQsCi0gICAgICAgICAgICAgICAgaW5mby5jb3VudCk7Ci0gICAgICAgIGFuZHJvaWRfYXRvbWljX2luYygmaW5mby5jb3VudCk7Ci0gICAgICAgIHJldHVybiBpbmZvLmhlYXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaGVhcF9pbmZvX3QgaW5mbzsKLSAgICAgICAgaW5mby5oZWFwID0gaW50ZXJmYWNlX2Nhc3Q8SU1lbW9yeUhlYXA+KGJpbmRlcik7Ci0gICAgICAgIGluZm8uY291bnQgPSAxOwotICAgICAgICAvL0FMT0dEKCJhZGRpbmcgYmluZGVyPSVwLCBoZWFwPSVwLCBjb3VudD0lZCIsCi0gICAgICAgIC8vICAgICAgYmluZGVyLmdldCgpLCBpbmZvLmhlYXAuZ2V0KCksIGluZm8uY291bnQpOwotICAgICAgICBtSGVhcENhY2hlLmFkZChiaW5kZXIsIGluZm8pOwotICAgICAgICByZXR1cm4gaW5mby5oZWFwOwotICAgIH0KLX0KLQotdm9pZCBIZWFwQ2FjaGU6OmZyZWVfaGVhcChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKSAgewotICAgIGZyZWVfaGVhcCggd3A8SUJpbmRlcj4oYmluZGVyKSApOwotfQotCi12b2lkIEhlYXBDYWNoZTo6ZnJlZV9oZWFwKGNvbnN0IHdwPElCaW5kZXI+JiBiaW5kZXIpCi17Ci0gICAgc3A8SU1lbW9yeUhlYXA+IHJlbDsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtSGVhcENhY2hlTG9jayk7Ci0gICAgICAgIHNzaXplX3QgaSA9IG1IZWFwQ2FjaGUuaW5kZXhPZktleShiaW5kZXIpOwotICAgICAgICBpZiAoaT49MCkgewotICAgICAgICAgICAgaGVhcF9pbmZvX3QmIGluZm8obUhlYXBDYWNoZS5lZGl0VmFsdWVBdChpKSk7Ci0gICAgICAgICAgICBpbnQzMl90IGMgPSBhbmRyb2lkX2F0b21pY19kZWMoJmluZm8uY291bnQpOwotICAgICAgICAgICAgaWYgKGMgPT0gMSkgewotICAgICAgICAgICAgICAgIEFMT0dEX0lGKFZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZpbmcgYmluZGVyPSVwLCBoZWFwPSVwLCBzaXplPSVkLCBmZD0lZCwgY291bnQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgYmluZGVyLnVuc2FmZV9nZXQoKSwgaW5mby5oZWFwLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnBNZW1vcnlIZWFwKj4oaW5mby5oZWFwLmdldCgpKS0+bVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxCcE1lbW9yeUhlYXAqPihpbmZvLmhlYXAuZ2V0KCkpLT5tSGVhcElkLAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5jb3VudCk7Ci0gICAgICAgICAgICAgICAgcmVsID0gbUhlYXBDYWNoZS52YWx1ZUF0KGkpLmhlYXA7Ci0gICAgICAgICAgICAgICAgbUhlYXBDYWNoZS5yZW1vdmVJdGVtc0F0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImZyZWVfaGVhcCBiaW5kZXI9JXAgbm90IGZvdW5kISEhIiwgYmluZGVyLnVuc2FmZV9nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNwPElNZW1vcnlIZWFwPiBIZWFwQ2FjaGU6OmdldF9oZWFwKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIpCi17Ci0gICAgc3A8SU1lbW9yeUhlYXA+IHJlYWxIZWFwOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtSGVhcENhY2hlTG9jayk7Ci0gICAgc3NpemVfdCBpID0gbUhlYXBDYWNoZS5pbmRleE9mS2V5KGJpbmRlcik7Ci0gICAgaWYgKGk+PTApICAgcmVhbEhlYXAgPSBtSGVhcENhY2hlLnZhbHVlQXQoaSkuaGVhcDsKLSAgICBlbHNlICAgICAgICByZWFsSGVhcCA9IGludGVyZmFjZV9jYXN0PElNZW1vcnlIZWFwPihiaW5kZXIpOwotICAgIHJldHVybiByZWFsSGVhcDsKLX0KLQotdm9pZCBIZWFwQ2FjaGU6OmR1bXBfaGVhcHMoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtSGVhcENhY2hlTG9jayk7Ci0gICAgaW50IGMgPSBtSGVhcENhY2hlLnNpemUoKTsKLSAgICBmb3IgKGludCBpPTAgOyBpPGMgOyBpKyspIHsKLSAgICAgICAgY29uc3QgaGVhcF9pbmZvX3QmIGluZm8gPSBtSGVhcENhY2hlLnZhbHVlQXQoaSk7Ci0gICAgICAgIEJwTWVtb3J5SGVhcCBjb25zdCogaChzdGF0aWNfY2FzdDxCcE1lbW9yeUhlYXAgY29uc3QgKj4oaW5mby5oZWFwLmdldCgpKSk7Ci0gICAgICAgIEFMT0dEKCJoZXk9JXAsIGhlYXA9JXAsIGNvdW50PSVkLCAoZmQ9JWQsIGJhc2U9JXAsIHNpemU9JWQpIiwKLSAgICAgICAgICAgICAgICBtSGVhcENhY2hlLmtleUF0KGkpLnVuc2FmZV9nZXQoKSwKLSAgICAgICAgICAgICAgICBpbmZvLmhlYXAuZ2V0KCksIGluZm8uY291bnQsCi0gICAgICAgICAgICAgICAgaC0+bUhlYXBJZCwgaC0+bUJhc2UsIGgtPm1TaXplKTsKLSAgICB9Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvSVBDVGhyZWFkU3RhdGUuY3BwIGIvbGlicy9iaW5kZXIvSVBDVGhyZWFkU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmNlZjJjLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0lQQ1RocmVhZFN0YXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiSVBDVGhyZWFkU3RhdGUiCi0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQnBCaW5kZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1RleHRPdXRwdXQuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2JpbmRlci9iaW5kZXJfbW9kdWxlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvU3RhdGljLmg+Ci0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpZmRlZiBIQVZFX1BUSFJFQURTCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1dJTjMyX1RIUkVBRFMKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotCi0jaWYgTE9HX05ERUJVRwotCi0jZGVmaW5lIElGX0xPR19UUkFOU0FDVElPTlMoKSBpZiAoZmFsc2UpCi0jZGVmaW5lIElGX0xPR19DT01NQU5EUygpIGlmIChmYWxzZSkKLSNkZWZpbmUgTE9HX1JFTU9URVJFRlMoLi4uKSAKLSNkZWZpbmUgSUZfTE9HX1JFTU9URVJFRlMoKSBpZiAoZmFsc2UpCi0jZGVmaW5lIExPR19USFJFQURQT09MKC4uLikgCi0jZGVmaW5lIExPR19PTkVXQVkoLi4uKSAKLQotI2Vsc2UKLQotI2RlZmluZSBJRl9MT0dfVFJBTlNBQ1RJT05TKCkgSUZfQUxPRyhMT0dfVkVSQk9TRSwgInRyYW5zYWN0IikKLSNkZWZpbmUgSUZfTE9HX0NPTU1BTkRTKCkgSUZfQUxPRyhMT0dfVkVSQk9TRSwgImlwYyIpCi0jZGVmaW5lIExPR19SRU1PVEVSRUZTKC4uLikgQUxPRyhMT0dfREVCVUcsICJyZW1vdGVyZWZzIiwgX19WQV9BUkdTX18pCi0jZGVmaW5lIElGX0xPR19SRU1PVEVSRUZTKCkgSUZfQUxPRyhMT0dfREVCVUcsICJyZW1vdGVyZWZzIikKLSNkZWZpbmUgTE9HX1RIUkVBRFBPT0woLi4uKSBBTE9HKExPR19ERUJVRywgInRocmVhZHBvb2wiLCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTE9HX09ORVdBWSguLi4pIEFMT0coTE9HX0RFQlVHLCAiaXBjIiwgX19WQV9BUkdTX18pCi0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgY2hhciogZ2V0UmV0dXJuU3RyaW5nKHNpemVfdCBpZHgpOwotc3RhdGljIGNvbnN0IGNoYXIqIGdldENvbW1hbmRTdHJpbmcoc2l6ZV90IGlkeCk7Ci1zdGF0aWMgY29uc3Qgdm9pZCogcHJpbnRSZXR1cm5Db21tYW5kKFRleHRPdXRwdXQmIG91dCwgY29uc3Qgdm9pZCogX2NtZCk7Ci1zdGF0aWMgY29uc3Qgdm9pZCogcHJpbnRDb21tYW5kKFRleHRPdXRwdXQmIG91dCwgY29uc3Qgdm9pZCogX2NtZCk7Ci0KLS8vIFRoaXMgd2lsbCByZXN1bHQgaW4gYSBtaXNzaW5nIHN5bWJvbCBmYWlsdXJlIGlmIHRoZSBJRl9MT0dfQ09NTUFORFMoKQotLy8gY29uZGl0aW9uYWxzIGRvbid0IGdldCBzdHJpcHBlZC4uLiAgYnV0IHRoYXQgaXMgcHJvYmFibHkgd2hhdCB3ZSB3YW50LgotI2lmICFMT0dfTkRFQlVHCi1zdGF0aWMgY29uc3QgY2hhciAqa1JldHVyblN0cmluZ3NbXSA9IHsKLSAgICAiQlJfRVJST1IiLAotICAgICJCUl9PSyIsCi0gICAgIkJSX1RSQU5TQUNUSU9OIiwKLSAgICAiQlJfUkVQTFkiLAotICAgICJCUl9BQ1FVSVJFX1JFU1VMVCIsCi0gICAgIkJSX0RFQURfUkVQTFkiLAotICAgICJCUl9UUkFOU0FDVElPTl9DT01QTEVURSIsCi0gICAgIkJSX0lOQ1JFRlMiLAotICAgICJCUl9BQ1FVSVJFIiwKLSAgICAiQlJfUkVMRUFTRSIsCi0gICAgIkJSX0RFQ1JFRlMiLAotICAgICJCUl9BVFRFTVBUX0FDUVVJUkUiLAotICAgICJCUl9OT09QIiwKLSAgICAiQlJfU1BBV05fTE9PUEVSIiwKLSAgICAiQlJfRklOSVNIRUQiLAotICAgICJCUl9ERUFEX0JJTkRFUiIsCi0gICAgIkJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FIiwKLSAgICAiQlJfRkFJTEVEX1JFUExZIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmtDb21tYW5kU3RyaW5nc1tdID0gewotICAgICJCQ19UUkFOU0FDVElPTiIsCi0gICAgIkJDX1JFUExZIiwKLSAgICAiQkNfQUNRVUlSRV9SRVNVTFQiLAotICAgICJCQ19GUkVFX0JVRkZFUiIsCi0gICAgIkJDX0lOQ1JFRlMiLAotICAgICJCQ19BQ1FVSVJFIiwKLSAgICAiQkNfUkVMRUFTRSIsCi0gICAgIkJDX0RFQ1JFRlMiLAotICAgICJCQ19JTkNSRUZTX0RPTkUiLAotICAgICJCQ19BQ1FVSVJFX0RPTkUiLAotICAgICJCQ19BVFRFTVBUX0FDUVVJUkUiLAotICAgICJCQ19SRUdJU1RFUl9MT09QRVIiLAotICAgICJCQ19FTlRFUl9MT09QRVIiLAotICAgICJCQ19FWElUX0xPT1BFUiIsCi0gICAgIkJDX1JFUVVFU1RfREVBVEhfTk9USUZJQ0FUSU9OIiwKLSAgICAiQkNfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OIiwKLSAgICAiQkNfREVBRF9CSU5ERVJfRE9ORSIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBnZXRSZXR1cm5TdHJpbmcoc2l6ZV90IGlkeCkKLXsKLSAgICBpZiAoaWR4IDwgc2l6ZW9mKGtSZXR1cm5TdHJpbmdzKSAvIHNpemVvZihrUmV0dXJuU3RyaW5nc1swXSkpCi0gICAgICAgIHJldHVybiBrUmV0dXJuU3RyaW5nc1tpZHhdOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGdldENvbW1hbmRTdHJpbmcoc2l6ZV90IGlkeCkKLXsKLSAgICBpZiAoaWR4IDwgc2l6ZW9mKGtDb21tYW5kU3RyaW5ncykgLyBzaXplb2Yoa0NvbW1hbmRTdHJpbmdzWzBdKSkKLSAgICAgICAgcmV0dXJuIGtDb21tYW5kU3RyaW5nc1tpZHhdOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKLX0KLQotc3RhdGljIGNvbnN0IHZvaWQqIHByaW50QmluZGVyVHJhbnNhY3Rpb25EYXRhKFRleHRPdXRwdXQmIG91dCwgY29uc3Qgdm9pZCogZGF0YSkKLXsKLSAgICBjb25zdCBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSogYnRkID0KLSAgICAgICAgKGNvbnN0IGJpbmRlcl90cmFuc2FjdGlvbl9kYXRhKilkYXRhOwotICAgIGlmIChidGQtPnRhcmdldC5oYW5kbGUgPCAxMDI0KSB7Ci0gICAgICAgIC8qIHdhbnQgdG8gcHJpbnQgZGVzY3JpcHRvcnMgaW4gZGVjaW1hbDsgZ3Vlc3MgYmFzZWQgb24gdmFsdWUgKi8KLSAgICAgICAgb3V0IDw8ICJ0YXJnZXQuZGVzYz0iIDw8IGJ0ZC0+dGFyZ2V0LmhhbmRsZTsKLSAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgInRhcmdldC5wdHI9IiA8PCBidGQtPnRhcmdldC5wdHI7Ci0gICAgfQotICAgIG91dCA8PCAiIChjb29raWUgIiA8PCBidGQtPmNvb2tpZSA8PCAiKSIgPDwgZW5kbAotICAgICAgICA8PCAiY29kZT0iIDw8IFR5cGVDb2RlKGJ0ZC0+Y29kZSkgPDwgIiwgZmxhZ3M9IiA8PCAodm9pZCopYnRkLT5mbGFncyA8PCBlbmRsCi0gICAgICAgIDw8ICJkYXRhPSIgPDwgYnRkLT5kYXRhLnB0ci5idWZmZXIgPDwgIiAoIiA8PCAodm9pZCopYnRkLT5kYXRhX3NpemUKLSAgICAgICAgPDwgIiBieXRlcykiIDw8IGVuZGwKLSAgICAgICAgPDwgIm9mZnNldHM9IiA8PCBidGQtPmRhdGEucHRyLm9mZnNldHMgPDwgIiAoIiA8PCAodm9pZCopYnRkLT5vZmZzZXRzX3NpemUKLSAgICAgICAgPDwgIiBieXRlcykiOwotICAgIHJldHVybiBidGQrMTsKLX0KLQotc3RhdGljIGNvbnN0IHZvaWQqIHByaW50UmV0dXJuQ29tbWFuZChUZXh0T3V0cHV0JiBvdXQsIGNvbnN0IHZvaWQqIF9jbWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBOID0gc2l6ZW9mKGtSZXR1cm5TdHJpbmdzKS9zaXplb2Yoa1JldHVyblN0cmluZ3NbMF0pOwotICAgIGNvbnN0IGludDMyX3QqIGNtZCA9IChjb25zdCBpbnQzMl90KilfY21kOwotICAgIGludDMyX3QgY29kZSA9ICpjbWQrKzsKLSAgICBzaXplX3QgY21kSW5kZXggPSBjb2RlICYgMHhmZjsKLSAgICBpZiAoY29kZSA9PSAoaW50MzJfdCkgQlJfRVJST1IpIHsKLSAgICAgICAgb3V0IDw8ICJCUl9FUlJPUjogIiA8PCAodm9pZCopKCpjbWQrKykgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuIGNtZDsKLSAgICB9IGVsc2UgaWYgKGNtZEluZGV4ID49IE4pIHsKLSAgICAgICAgb3V0IDw8ICJVbmtub3duIHJlcGx5OiAiIDw8IGNvZGUgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuIGNtZDsKLSAgICB9Ci0gICAgb3V0IDw8IGtSZXR1cm5TdHJpbmdzW2NtZEluZGV4XTsKLSAgICAKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBCUl9UUkFOU0FDVElPTjoKLSAgICAgICAgY2FzZSBCUl9SRVBMWTogewotICAgICAgICAgICAgb3V0IDw8ICI6ICIgPDwgaW5kZW50OwotICAgICAgICAgICAgY21kID0gKGNvbnN0IGludDMyX3QgKilwcmludEJpbmRlclRyYW5zYWN0aW9uRGF0YShvdXQsIGNtZCk7Ci0gICAgICAgICAgICBvdXQgPDwgZGVkZW50OwotICAgICAgICB9IGJyZWFrOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCUl9BQ1FVSVJFX1JFU1VMVDogewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCByZXMgPSAqY21kKys7Ci0gICAgICAgICAgICBvdXQgPDwgIjogIiA8PCByZXMgPDwgKHJlcyA/ICIgKFNVQ0NFU1MpIiA6ICIgKEZBSUxVUkUpIik7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJSX0lOQ1JFRlM6Ci0gICAgICAgIGNhc2UgQlJfQUNRVUlSRToKLSAgICAgICAgY2FzZSBCUl9SRUxFQVNFOgotICAgICAgICBjYXNlIEJSX0RFQ1JFRlM6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYiA9ICpjbWQrKzsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiB0YXJnZXQ9IiA8PCAodm9pZCopYiA8PCAiIChjb29raWUgIiA8PCAodm9pZCopYyA8PCAiKSI7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgCi0gICAgICAgIGNhc2UgQlJfQVRURU1QVF9BQ1FVSVJFOiB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHAgPSAqY21kKys7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGIgPSAqY21kKys7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGMgPSAqY21kKys7Ci0gICAgICAgICAgICBvdXQgPDwgIjogdGFyZ2V0PSIgPDwgKHZvaWQqKWIgPDwgIiAoY29va2llICIgPDwgKHZvaWQqKWMKLSAgICAgICAgICAgICAgICA8PCAiKSwgcHJpPSIgPDwgcDsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEJSX0RFQURfQklOREVSOgotICAgICAgICBjYXNlIEJSX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTl9ET05FOiB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGMgPSAqY21kKys7Ci0gICAgICAgICAgICBvdXQgPDwgIjogZGVhdGggY29va2llICIgPDwgKHZvaWQqKWM7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIG5vIGRldGFpbHMgdG8gc2hvdyBmb3I6IEJSX09LLCBCUl9ERUFEX1JFUExZLAotICAgICAgICAgICAgLy8gQlJfVFJBTlNBQ1RJT05fQ09NUExFVEUsIEJSX0ZJTklTSEVECi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0gICAgb3V0IDw8IGVuZGw7Ci0gICAgcmV0dXJuIGNtZDsKLX0KLQotc3RhdGljIGNvbnN0IHZvaWQqIHByaW50Q29tbWFuZChUZXh0T3V0cHV0JiBvdXQsIGNvbnN0IHZvaWQqIF9jbWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBOID0gc2l6ZW9mKGtDb21tYW5kU3RyaW5ncykvc2l6ZW9mKGtDb21tYW5kU3RyaW5nc1swXSk7Ci0gICAgY29uc3QgaW50MzJfdCogY21kID0gKGNvbnN0IGludDMyX3QqKV9jbWQ7Ci0gICAgaW50MzJfdCBjb2RlID0gKmNtZCsrOwotICAgIHNpemVfdCBjbWRJbmRleCA9IGNvZGUgJiAweGZmOwotCi0gICAgaWYgKGNtZEluZGV4ID49IE4pIHsKLSAgICAgICAgb3V0IDw8ICJVbmtub3duIGNvbW1hbmQ6ICIgPDwgY29kZSA8PCBlbmRsOwotICAgICAgICByZXR1cm4gY21kOwotICAgIH0KLSAgICBvdXQgPDwga0NvbW1hbmRTdHJpbmdzW2NtZEluZGV4XTsKLQotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIEJDX1RSQU5TQUNUSU9OOgotICAgICAgICBjYXNlIEJDX1JFUExZOiB7Ci0gICAgICAgICAgICBvdXQgPDwgIjogIiA8PCBpbmRlbnQ7Ci0gICAgICAgICAgICBjbWQgPSAoY29uc3QgaW50MzJfdCAqKXByaW50QmluZGVyVHJhbnNhY3Rpb25EYXRhKG91dCwgY21kKTsKLSAgICAgICAgICAgIG91dCA8PCBkZWRlbnQ7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJDX0FDUVVJUkVfUkVTVUxUOiB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHJlcyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiAiIDw8IHJlcyA8PCAocmVzID8gIiAoU1VDQ0VTUykiIDogIiAoRkFJTFVSRSkiKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgQkNfRlJFRV9CVUZGRVI6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYnVmID0gKmNtZCsrOwotICAgICAgICAgICAgb3V0IDw8ICI6IGJ1ZmZlcj0iIDw8ICh2b2lkKilidWY7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBjYXNlIEJDX0lOQ1JFRlM6Ci0gICAgICAgIGNhc2UgQkNfQUNRVUlSRToKLSAgICAgICAgY2FzZSBCQ19SRUxFQVNFOgotICAgICAgICBjYXNlIEJDX0RFQ1JFRlM6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZCA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiBkZXNjPSIgPDwgZDsKLSAgICAgICAgfSBicmVhazsKLSAgICAKLSAgICAgICAgY2FzZSBCQ19JTkNSRUZTX0RPTkU6Ci0gICAgICAgIGNhc2UgQkNfQUNRVUlSRV9ET05FOiB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGIgPSAqY21kKys7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGMgPSAqY21kKys7Ci0gICAgICAgICAgICBvdXQgPDwgIjogdGFyZ2V0PSIgPDwgKHZvaWQqKWIgPDwgIiAoY29va2llICIgPDwgKHZvaWQqKWMgPDwgIikiOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCQ19BVFRFTVBUX0FDUVVJUkU6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcCA9ICpjbWQrKzsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZCA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiBkZXNjPSIgPDwgZCA8PCAiLCBwcmk9IiA8PCBwOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTjoKLSAgICAgICAgY2FzZSBCQ19DTEVBUl9ERUFUSF9OT1RJRklDQVRJT046IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaCA9ICpjbWQrKzsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiBoYW5kbGU9IiA8PCBoIDw8ICIgKGRlYXRoIGNvb2tpZSAiIDw8ICh2b2lkKiljIDw8ICIpIjsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEJDX0RFQURfQklOREVSX0RPTkU6IHsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYyA9ICpjbWQrKzsKLSAgICAgICAgICAgIG91dCA8PCAiOiBkZWF0aCBjb29raWUgIiA8PCAodm9pZCopYzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gbm8gZGV0YWlscyB0byBzaG93IGZvcjogQkNfUkVHSVNURVJfTE9PUEVSLCBCQ19FTlRFUl9MT09QRVIsCi0gICAgICAgICAgICAvLyBCQ19FWElUX0xPT1BFUgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIAotICAgIG91dCA8PCBlbmRsOwotICAgIHJldHVybiBjbWQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnVExTTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotc3RhdGljIGJvb2wgZ0hhdmVUTFMgPSBmYWxzZTsKLXN0YXRpYyBwdGhyZWFkX2tleV90IGdUTFMgPSAwOwotc3RhdGljIGJvb2wgZ1NodXRkb3duID0gZmFsc2U7Ci1zdGF0aWMgYm9vbCBnRGlzYWJsZUJhY2tncm91bmRTY2hlZHVsaW5nID0gZmFsc2U7Ci0KLUlQQ1RocmVhZFN0YXRlKiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpCi17Ci0gICAgaWYgKGdIYXZlVExTKSB7Ci1yZXN0YXJ0OgotICAgICAgICBjb25zdCBwdGhyZWFkX2tleV90IGsgPSBnVExTOwotICAgICAgICBJUENUaHJlYWRTdGF0ZSogc3QgPSAoSVBDVGhyZWFkU3RhdGUqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoayk7Ci0gICAgICAgIGlmIChzdCkgcmV0dXJuIHN0OwotICAgICAgICByZXR1cm4gbmV3IElQQ1RocmVhZFN0YXRlOwotICAgIH0KLSAgICAKLSAgICBpZiAoZ1NodXRkb3duKSByZXR1cm4gTlVMTDsKLSAgICAKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmdUTFNNdXRleCk7Ci0gICAgaWYgKCFnSGF2ZVRMUykgewotICAgICAgICBpZiAocHRocmVhZF9rZXlfY3JlYXRlKCZnVExTLCB0aHJlYWREZXN0cnVjdG9yKSAhPSAwKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1RMU011dGV4KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGdIYXZlVExTID0gdHJ1ZTsKLSAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdUTFNNdXRleCk7Ci0gICAgZ290byByZXN0YXJ0OwotfQotCi1JUENUaHJlYWRTdGF0ZSogSVBDVGhyZWFkU3RhdGU6OnNlbGZPck51bGwoKQotewotICAgIGlmIChnSGF2ZVRMUykgewotICAgICAgICBjb25zdCBwdGhyZWFkX2tleV90IGsgPSBnVExTOwotICAgICAgICBJUENUaHJlYWRTdGF0ZSogc3QgPSAoSVBDVGhyZWFkU3RhdGUqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoayk7Ci0gICAgICAgIHJldHVybiBzdDsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OnNodXRkb3duKCkKLXsKLSAgICBnU2h1dGRvd24gPSB0cnVlOwotICAgIAotICAgIGlmIChnSGF2ZVRMUykgewotICAgICAgICAvLyBYWFggTmVlZCB0byB3YWl0IGZvciBhbGwgdGhyZWFkIHBvb2wgdGhyZWFkcyB0byBleGl0IQotICAgICAgICBJUENUaHJlYWRTdGF0ZSogc3QgPSAoSVBDVGhyZWFkU3RhdGUqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoZ1RMUyk7Ci0gICAgICAgIGlmIChzdCkgewotICAgICAgICAgICAgZGVsZXRlIHN0OwotICAgICAgICAgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnVExTLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBnSGF2ZVRMUyA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6ZGlzYWJsZUJhY2tncm91bmRTY2hlZHVsaW5nKGJvb2wgZGlzYWJsZSkKLXsKLSAgICBnRGlzYWJsZUJhY2tncm91bmRTY2hlZHVsaW5nID0gZGlzYWJsZTsKLX0KLQotc3A8UHJvY2Vzc1N0YXRlPiBJUENUaHJlYWRTdGF0ZTo6cHJvY2VzcygpCi17Ci0gICAgcmV0dXJuIG1Qcm9jZXNzOwotfQotCi1zdGF0dXNfdCBJUENUaHJlYWRTdGF0ZTo6Y2xlYXJMYXN0RXJyb3IoKQotewotICAgIGNvbnN0IHN0YXR1c190IGVyciA9IG1MYXN0RXJyb3I7Ci0gICAgbUxhc3RFcnJvciA9IE5PX0VSUk9SOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBJUENUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpCi17Ci0gICAgcmV0dXJuIG1DYWxsaW5nUGlkOwotfQotCi1pbnQgSVBDVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKQotewotICAgIHJldHVybiBtQ2FsbGluZ1VpZDsKLX0KLQotaW50IElQQ1RocmVhZFN0YXRlOjpnZXRPcmlnQ2FsbGluZ1VpZCgpCi17Ci0gICAgcmV0dXJuIG1PcmlnQ2FsbGluZ1VpZDsKLX0KLQotaW50NjRfdCBJUENUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKQotewotICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpbUNhbGxpbmdVaWQ8PDMyKSB8IG1DYWxsaW5nUGlkOwotICAgIGNsZWFyQ2FsbGVyKCk7Ci0gICAgcmV0dXJuIHRva2VuOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpzZXRTdHJpY3RNb2RlUG9saWN5KGludDMyX3QgcG9saWN5KQotewotICAgIG1TdHJpY3RNb2RlUG9saWN5ID0gcG9saWN5OwotfQotCi1pbnQzMl90IElQQ1RocmVhZFN0YXRlOjpnZXRTdHJpY3RNb2RlUG9saWN5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmljdE1vZGVQb2xpY3k7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OnNldExhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzKGludDMyX3QgZmxhZ3MpCi17Ci0gICAgbUxhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzID0gZmxhZ3M7Ci19Ci0KLWludDMyX3QgSVBDVGhyZWFkU3RhdGU6OmdldExhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUxhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGludDY0X3QgdG9rZW4pCi17Ci0gICAgbUNhbGxpbmdVaWQgPSAoaW50KSh0b2tlbj4+MzIpOwotICAgIG1DYWxsaW5nUGlkID0gKGludCl0b2tlbjsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsZXIoKQotewotICAgIG1DYWxsaW5nUGlkID0gZ2V0cGlkKCk7Ci0gICAgbUNhbGxpbmdVaWQgPSBnZXR1aWQoKTsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6Zmx1c2hDb21tYW5kcygpCi17Ci0gICAgaWYgKG1Qcm9jZXNzLT5tRHJpdmVyRkQgPD0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIHRhbGtXaXRoRHJpdmVyKGZhbHNlKTsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6am9pblRocmVhZFBvb2woYm9vbCBpc01haW4pCi17Ci0gICAgTE9HX1RIUkVBRFBPT0woIioqKiogVEhSRUFEICVwIChQSUQgJWQpIElTIEpPSU5JTkcgVEhFIFRIUkVBRCBQT09MXG4iLCAodm9pZCopcHRocmVhZF9zZWxmKCksIGdldHBpZCgpKTsKLQotICAgIG1PdXQud3JpdGVJbnQzMihpc01haW4gPyBCQ19FTlRFUl9MT09QRVIgOiBCQ19SRUdJU1RFUl9MT09QRVIpOwotICAgIAotICAgIC8vIFRoaXMgdGhyZWFkIG1heSBoYXZlIGJlZW4gc3Bhd25lZCBieSBhIHRocmVhZCB0aGF0IHdhcyBpbiB0aGUgYmFja2dyb3VuZAotICAgIC8vIHNjaGVkdWxpbmcgZ3JvdXAsIHNvIGZpcnN0IHdlIHdpbGwgbWFrZSBzdXJlIGl0IGlzIGluIHRoZSBkZWZhdWx0L2ZvcmVncm91bmQKLSAgICAvLyBvbmUgdG8gYXZvaWQgcGVyZm9ybWluZyBhbiBpbml0aWFsIHRyYW5zYWN0aW9uIGluIHRoZSBiYWNrZ3JvdW5kLgotICAgIGFuZHJvaWRTZXRUaHJlYWRTY2hlZHVsaW5nR3JvdXAobU15VGhyZWFkSWQsIEFORFJPSURfVEdST1VQX0RFRkFVTFQpOwotICAgICAgICAKLSAgICBzdGF0dXNfdCByZXN1bHQ7Ci0gICAgZG8gewotICAgICAgICBpbnQzMl90IGNtZDsKLSAgICAgICAgCi0gICAgICAgIC8vIFdoZW4gd2UndmUgY2xlYXJlZCB0aGUgaW5jb21pbmcgY29tbWFuZCBxdWV1ZSwgcHJvY2VzcyBhbnkgcGVuZGluZyBkZXJlZnMKLSAgICAgICAgaWYgKG1Jbi5kYXRhUG9zaXRpb24oKSA+PSBtSW4uZGF0YVNpemUoKSkgewotICAgICAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBtUGVuZGluZ1dlYWtEZXJlZnMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKG51bVBlbmRpbmcgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgUmVmQmFzZTo6d2Vha3JlZl90eXBlKiByZWZzID0gbVBlbmRpbmdXZWFrRGVyZWZzW2ldOwotICAgICAgICAgICAgICAgICAgICByZWZzLT5kZWNXZWFrKG1Qcm9jZXNzLmdldCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdXZWFrRGVyZWZzLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG51bVBlbmRpbmcgPSBtUGVuZGluZ1N0cm9uZ0RlcmVmcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAobnVtUGVuZGluZyA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBCQmluZGVyKiBvYmogPSBtUGVuZGluZ1N0cm9uZ0RlcmVmc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgb2JqLT5kZWNTdHJvbmcobVByb2Nlc3MuZ2V0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGVuZGluZ1N0cm9uZ0RlcmVmcy5jbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IGdldCB0aGUgbmV4dCBjb21tYW5kIHRvIGJlIHByb2Nlc3NlZCwgd2FpdGluZyBpZiBuZWNlc3NhcnkKLSAgICAgICAgcmVzdWx0ID0gdGFsa1dpdGhEcml2ZXIoKTsKLSAgICAgICAgaWYgKHJlc3VsdCA+PSBOT19FUlJPUikgewotICAgICAgICAgICAgc2l6ZV90IElOID0gbUluLmRhdGFBdmFpbCgpOwotICAgICAgICAgICAgaWYgKElOIDwgc2l6ZW9mKGludDMyX3QpKSBjb250aW51ZTsKLSAgICAgICAgICAgIGNtZCA9IG1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIElGX0xPR19DT01NQU5EUygpIHsKLSAgICAgICAgICAgICAgICBhbG9nIDw8ICJQcm9jZXNzaW5nIHRvcC1sZXZlbCBDb21tYW5kOiAiCi0gICAgICAgICAgICAgICAgICAgIDw8IGdldFJldHVyblN0cmluZyhjbWQpIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZUNvbW1hbmQoY21kKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQWZ0ZXIgZXhlY3V0aW5nIHRoZSBjb21tYW5kLCBlbnN1cmUgdGhhdCB0aGUgdGhyZWFkIGlzIHJldHVybmVkIHRvIHRoZQotICAgICAgICAvLyBkZWZhdWx0IGNncm91cCBiZWZvcmUgcmVqb2luaW5nIHRoZSBwb29sLiAgVGhlIGRyaXZlciB0YWtlcyBjYXJlIG9mCi0gICAgICAgIC8vIHJlc3RvcmluZyB0aGUgcHJpb3JpdHksIGJ1dCBkb2Vzbid0IGRvIGFueXRoaW5nIHdpdGggY2dyb3VwcyBzbyB3ZQotICAgICAgICAvLyBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGF0IGhlcmUgaW4gdXNlcnNwYWNlLiAgTm90ZSB0aGF0IHdlIGRvIG1ha2UKLSAgICAgICAgLy8gc3VyZSB0byBnbyBpbiB0aGUgZm9yZWdyb3VuZCBhZnRlciBleGVjdXRpbmcgYSB0cmFuc2FjdGlvbiwgYnV0Ci0gICAgICAgIC8vIHRoZXJlIGFyZSBvdGhlciBjYWxsYmFja3MgaW50byB1c2VyIGNvZGUgdGhhdCBjb3VsZCBoYXZlIGNoYW5nZWQKLSAgICAgICAgLy8gb3VyIGdyb3VwIHNvIHdlIHdhbnQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgaXQgaXMgcHV0IGJhY2suCi0gICAgICAgIGFuZHJvaWRTZXRUaHJlYWRTY2hlZHVsaW5nR3JvdXAobU15VGhyZWFkSWQsIEFORFJPSURfVEdST1VQX0RFRkFVTFQpOwotCi0gICAgICAgIC8vIExldCB0aGlzIHRocmVhZCBleGl0IHRoZSB0aHJlYWQgcG9vbCBpZiBpdCBpcyBubyBsb25nZXIKLSAgICAgICAgLy8gbmVlZGVkIGFuZCBpdCBpcyBub3QgdGhlIG1haW4gcHJvY2VzcyB0aHJlYWQuCi0gICAgICAgIGlmKHJlc3VsdCA9PSBUSU1FRF9PVVQgJiYgIWlzTWFpbikgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXN1bHQgIT0gLUVDT05OUkVGVVNFRCAmJiByZXN1bHQgIT0gLUVCQURGKTsKLQotICAgIExPR19USFJFQURQT09MKCIqKioqIFRIUkVBRCAlcCAoUElEICVkKSBJUyBMRUFWSU5HIFRIRSBUSFJFQUQgUE9PTCBlcnI9JXBcbiIsCi0gICAgICAgICh2b2lkKilwdGhyZWFkX3NlbGYoKSwgZ2V0cGlkKCksICh2b2lkKilyZXN1bHQpOwotICAgIAotICAgIG1PdXQud3JpdGVJbnQzMihCQ19FWElUX0xPT1BFUik7Ci0gICAgdGFsa1dpdGhEcml2ZXIoZmFsc2UpOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpzdG9wUHJvY2Vzcyhib29sIGltbWVkaWF0ZSkKLXsKLSAgICAvL0FMT0dJKCIqKioqIFNUT1BQSU5HIFBST0NFU1MiKTsKLSAgICBmbHVzaENvbW1hbmRzKCk7Ci0gICAgaW50IGZkID0gbVByb2Nlc3MtPm1Ecml2ZXJGRDsKLSAgICBtUHJvY2Vzcy0+bURyaXZlckZEID0gLTE7Ci0gICAgY2xvc2UoZmQpOwotICAgIC8va2lsbChnZXRwaWQoKSwgU0lHS0lMTCk7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjp0cmFuc2FjdChpbnQzMl90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3RhdHVzX3QgZXJyID0gZGF0YS5lcnJvckNoZWNrKCk7Ci0KLSAgICBmbGFncyB8PSBURl9BQ0NFUFRfRkRTOwotCi0gICAgSUZfTE9HX1RSQU5TQUNUSU9OUygpIHsKLSAgICAgICAgVGV4dE91dHB1dDo6QnVuZGxlIF9iKGFsb2cpOwotICAgICAgICBhbG9nIDw8ICJCQ19UUkFOU0FDVElPTiB0aHIgIiA8PCAodm9pZCopcHRocmVhZF9zZWxmKCkgPDwgIiAvIGhhbmQgIgotICAgICAgICAgICAgPDwgaGFuZGxlIDw8ICIgLyBjb2RlICIgPDwgVHlwZUNvZGUoY29kZSkgPDwgIjogIgotICAgICAgICAgICAgPDwgaW5kZW50IDw8IGRhdGEgPDwgZGVkZW50IDw8IGVuZGw7Ci0gICAgfQotICAgIAotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HX09ORVdBWSgiPj4+PiBTRU5EIGZyb20gcGlkICVkIHVpZCAlZCAlcyIsIGdldHBpZCgpLCBnZXR1aWQoKSwKLSAgICAgICAgICAgIChmbGFncyAmIFRGX09ORV9XQVkpID09IDAgPyAiUkVBRCBSRVBMWSIgOiAiT05FIFdBWSIpOwotICAgICAgICBlcnIgPSB3cml0ZVRyYW5zYWN0aW9uRGF0YShCQ19UUkFOU0FDVElPTiwgZmxhZ3MsIGhhbmRsZSwgY29kZSwgZGF0YSwgTlVMTCk7Ci0gICAgfQotICAgIAotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKHJlcGx5KSByZXBseS0+c2V0RXJyb3IoZXJyKTsKLSAgICAgICAgcmV0dXJuIChtTGFzdEVycm9yID0gZXJyKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKChmbGFncyAmIFRGX09ORV9XQVkpID09IDApIHsKLSAgICAgICAgI2lmIDAKLSAgICAgICAgaWYgKGNvZGUgPT0gNCkgeyAvLyByZWxheW91dAotICAgICAgICAgICAgQUxPR0koIj4+Pj4+PiBDQUxMSU5HIHRyYW5zYWN0aW9uIDQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dJKCI+Pj4+Pj4gQ0FMTElORyB0cmFuc2FjdGlvbiAlZCIsIGNvZGUpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRpZgotICAgICAgICBpZiAocmVwbHkpIHsKLSAgICAgICAgICAgIGVyciA9IHdhaXRGb3JSZXNwb25zZShyZXBseSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQYXJjZWwgZmFrZVJlcGx5OwotICAgICAgICAgICAgZXJyID0gd2FpdEZvclJlc3BvbnNlKCZmYWtlUmVwbHkpOwotICAgICAgICB9Ci0gICAgICAgICNpZiAwCi0gICAgICAgIGlmIChjb2RlID09IDQpIHsgLy8gcmVsYXlvdXQKLSAgICAgICAgICAgIEFMT0dJKCI8PDw8PDwgUkVUVVJOSU5HIHRyYW5zYWN0aW9uIDQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dJKCI8PDw8PDwgUkVUVVJOSU5HIHRyYW5zYWN0aW9uICVkIiwgY29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZGlmCi0gICAgICAgIAotICAgICAgICBJRl9MT0dfVFJBTlNBQ1RJT05TKCkgewotICAgICAgICAgICAgVGV4dE91dHB1dDo6QnVuZGxlIF9iKGFsb2cpOwotICAgICAgICAgICAgYWxvZyA8PCAiQlJfUkVQTFkgdGhyICIgPDwgKHZvaWQqKXB0aHJlYWRfc2VsZigpIDw8ICIgLyBoYW5kICIKLSAgICAgICAgICAgICAgICA8PCBoYW5kbGUgPDwgIjogIjsKLSAgICAgICAgICAgIGlmIChyZXBseSkgYWxvZyA8PCBpbmRlbnQgPDwgKnJlcGx5IDw8IGRlZGVudCA8PCBlbmRsOwotICAgICAgICAgICAgZWxzZSBhbG9nIDw8ICIobm9uZSByZXF1ZXN0ZWQpIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gd2FpdEZvclJlc3BvbnNlKE5VTEwsIE5VTEwpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjppbmNTdHJvbmdIYW5kbGUoaW50MzJfdCBoYW5kbGUpCi17Ci0gICAgTE9HX1JFTU9URVJFRlMoIklQQ1RocmVhZFN0YXRlOjppbmNTdHJvbmdIYW5kbGUoJWQpXG4iLCBoYW5kbGUpOwotICAgIG1PdXQud3JpdGVJbnQzMihCQ19BQ1FVSVJFKTsKLSAgICBtT3V0LndyaXRlSW50MzIoaGFuZGxlKTsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6ZGVjU3Ryb25nSGFuZGxlKGludDMyX3QgaGFuZGxlKQotewotICAgIExPR19SRU1PVEVSRUZTKCJJUENUaHJlYWRTdGF0ZTo6ZGVjU3Ryb25nSGFuZGxlKCVkKVxuIiwgaGFuZGxlKTsKLSAgICBtT3V0LndyaXRlSW50MzIoQkNfUkVMRUFTRSk7Ci0gICAgbU91dC53cml0ZUludDMyKGhhbmRsZSk7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OmluY1dlYWtIYW5kbGUoaW50MzJfdCBoYW5kbGUpCi17Ci0gICAgTE9HX1JFTU9URVJFRlMoIklQQ1RocmVhZFN0YXRlOjppbmNXZWFrSGFuZGxlKCVkKVxuIiwgaGFuZGxlKTsKLSAgICBtT3V0LndyaXRlSW50MzIoQkNfSU5DUkVGUyk7Ci0gICAgbU91dC53cml0ZUludDMyKGhhbmRsZSk7Ci19Ci0KLXZvaWQgSVBDVGhyZWFkU3RhdGU6OmRlY1dlYWtIYW5kbGUoaW50MzJfdCBoYW5kbGUpCi17Ci0gICAgTE9HX1JFTU9URVJFRlMoIklQQ1RocmVhZFN0YXRlOjpkZWNXZWFrSGFuZGxlKCVkKVxuIiwgaGFuZGxlKTsKLSAgICBtT3V0LndyaXRlSW50MzIoQkNfREVDUkVGUyk7Ci0gICAgbU91dC53cml0ZUludDMyKGhhbmRsZSk7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjphdHRlbXB0SW5jU3Ryb25nSGFuZGxlKGludDMyX3QgaGFuZGxlKQotewotICAgIExPR19SRU1PVEVSRUZTKCJJUENUaHJlYWRTdGF0ZTo6YXR0ZW1wdEluY1N0cm9uZ0hhbmRsZSglZClcbiIsIGhhbmRsZSk7Ci0gICAgbU91dC53cml0ZUludDMyKEJDX0FUVEVNUFRfQUNRVUlSRSk7Ci0gICAgbU91dC53cml0ZUludDMyKDApOyAvLyB4eHggd2FzIHRocmVhZCBwcmlvcml0eQotICAgIG1PdXQud3JpdGVJbnQzMihoYW5kbGUpOwotICAgIHN0YXR1c190IHJlc3VsdCA9IFVOS05PV05fRVJST1I7Ci0gICAgCi0gICAgd2FpdEZvclJlc3BvbnNlKE5VTEwsICZyZXN1bHQpOwotICAgIAotI2lmIExPR19SRUZDT1VOVFMKLSAgICBwcmludGYoIklQQ1RocmVhZFN0YXRlOjphdHRlbXB0SW5jU3Ryb25nSGFuZGxlKCVsZCkgPSAlc1xuIiwKLSAgICAgICAgaGFuZGxlLCByZXN1bHQgPT0gTk9fRVJST1IgPyAiU1VDQ0VTUyIgOiAiRkFJTFVSRSIpOwotI2VuZGlmCi0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBJUENUaHJlYWRTdGF0ZTo6ZXhwdW5nZUhhbmRsZShpbnQzMl90IGhhbmRsZSwgSUJpbmRlciogYmluZGVyKQotewotI2lmIExPR19SRUZDT1VOVFMKLSAgICBwcmludGYoIklQQ1RocmVhZFN0YXRlOjpleHB1bmdlSGFuZGxlKCVsZClcbiIsIGhhbmRsZSk7Ci0jZW5kaWYKLSAgICBzZWxmKCktPm1Qcm9jZXNzLT5leHB1bmdlSGFuZGxlKGhhbmRsZSwgYmluZGVyKTsKLX0KLQotc3RhdHVzX3QgSVBDVGhyZWFkU3RhdGU6OnJlcXVlc3REZWF0aE5vdGlmaWNhdGlvbihpbnQzMl90IGhhbmRsZSwgQnBCaW5kZXIqIHByb3h5KQotewotICAgIG1PdXQud3JpdGVJbnQzMihCQ19SRVFVRVNUX0RFQVRIX05PVElGSUNBVElPTik7Ci0gICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KWhhbmRsZSk7Ci0gICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KXByb3h5KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjpjbGVhckRlYXRoTm90aWZpY2F0aW9uKGludDMyX3QgaGFuZGxlLCBCcEJpbmRlciogcHJveHkpCi17Ci0gICAgbU91dC53cml0ZUludDMyKEJDX0NMRUFSX0RFQVRIX05PVElGSUNBVElPTik7Ci0gICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KWhhbmRsZSk7Ci0gICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KXByb3h5KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLUlQQ1RocmVhZFN0YXRlOjpJUENUaHJlYWRTdGF0ZSgpCi0gICAgOiBtUHJvY2VzcyhQcm9jZXNzU3RhdGU6OnNlbGYoKSksCi0gICAgICBtTXlUaHJlYWRJZChhbmRyb2lkR2V0VGlkKCkpLAotICAgICAgbVN0cmljdE1vZGVQb2xpY3koMCksCi0gICAgICBtTGFzdFRyYW5zYWN0aW9uQmluZGVyRmxhZ3MoMCkKLXsKLSAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdUTFMsIHRoaXMpOwotICAgIGNsZWFyQ2FsbGVyKCk7Ci0gICAgbU9yaWdDYWxsaW5nVWlkID0gbUNhbGxpbmdVaWQ7Ci0gICAgbUluLnNldERhdGFDYXBhY2l0eSgyNTYpOwotICAgIG1PdXQuc2V0RGF0YUNhcGFjaXR5KDI1Nik7Ci19Ci0KLUlQQ1RocmVhZFN0YXRlOjp+SVBDVGhyZWFkU3RhdGUoKQotewotfQotCi1zdGF0dXNfdCBJUENUaHJlYWRTdGF0ZTo6c2VuZFJlcGx5KGNvbnN0IFBhcmNlbCYgcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN0YXR1c190IGVycjsKLSAgICBzdGF0dXNfdCBzdGF0dXNCdWZmZXI7Ci0gICAgZXJyID0gd3JpdGVUcmFuc2FjdGlvbkRhdGEoQkNfUkVQTFksIGZsYWdzLCAtMSwgMCwgcmVwbHksICZzdGF0dXNCdWZmZXIpOwotICAgIGlmIChlcnIgPCBOT19FUlJPUikgcmV0dXJuIGVycjsKLSAgICAKLSAgICByZXR1cm4gd2FpdEZvclJlc3BvbnNlKE5VTEwsIE5VTEwpOwotfQotCi1zdGF0dXNfdCBJUENUaHJlYWRTdGF0ZTo6d2FpdEZvclJlc3BvbnNlKFBhcmNlbCAqcmVwbHksIHN0YXR1c190ICphY3F1aXJlUmVzdWx0KQotewotICAgIGludDMyX3QgY21kOwotICAgIGludDMyX3QgZXJyOwotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKChlcnI9dGFsa1dpdGhEcml2ZXIoKSkgPCBOT19FUlJPUikgYnJlYWs7Ci0gICAgICAgIGVyciA9IG1Jbi5lcnJvckNoZWNrKCk7Ci0gICAgICAgIGlmIChlcnIgPCBOT19FUlJPUikgYnJlYWs7Ci0gICAgICAgIGlmIChtSW4uZGF0YUF2YWlsKCkgPT0gMCkgY29udGludWU7Ci0gICAgICAgIAotICAgICAgICBjbWQgPSBtSW4ucmVhZEludDMyKCk7Ci0gICAgICAgIAotICAgICAgICBJRl9MT0dfQ09NTUFORFMoKSB7Ci0gICAgICAgICAgICBhbG9nIDw8ICJQcm9jZXNzaW5nIHdhaXRGb3JSZXNwb25zZSBDb21tYW5kOiAiCi0gICAgICAgICAgICAgICAgPDwgZ2V0UmV0dXJuU3RyaW5nKGNtZCkgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoY21kKSB7Ci0gICAgICAgIGNhc2UgQlJfVFJBTlNBQ1RJT05fQ09NUExFVEU6Ci0gICAgICAgICAgICBpZiAoIXJlcGx5ICYmICFhY3F1aXJlUmVzdWx0KSBnb3RvIGZpbmlzaDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCUl9ERUFEX1JFUExZOgotICAgICAgICAgICAgZXJyID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgICAgICBnb3RvIGZpbmlzaDsKLQotICAgICAgICBjYXNlIEJSX0ZBSUxFRF9SRVBMWToKLSAgICAgICAgICAgIGVyciA9IEZBSUxFRF9UUkFOU0FDVElPTjsKLSAgICAgICAgICAgIGdvdG8gZmluaXNoOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCUl9BQ1FVSVJFX1JFU1VMVDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhY3F1aXJlUmVzdWx0ICE9IE5VTEwsICJVbmV4cGVjdGVkIGJyQUNRVUlSRV9SRVNVTFQiKTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHJlc3VsdCA9IG1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFjcXVpcmVSZXN1bHQpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICphY3F1aXJlUmVzdWx0ID0gcmVzdWx0ID8gTk9fRVJST1IgOiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gZmluaXNoOwotICAgICAgICAKLSAgICAgICAgY2FzZSBCUl9SRVBMWToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKLSAgICAgICAgICAgICAgICBlcnIgPSBtSW4ucmVhZCgmdHIsIHNpemVvZih0cikpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGVyciA9PSBOT19FUlJPUiwgIk5vdCBlbm91Z2ggY29tbWFuZCBkYXRhIGZvciBiclJFUExZIik7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgZ290byBmaW5pc2g7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVwbHkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh0ci5mbGFncyAmIFRGX1NUQVRVU19DT0RFKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBseS0+aXBjU2V0RGF0YVJlZmVyZW5jZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0ci5kYXRhLnB0ci5idWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLmRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHNpemVfdCo+KHRyLmRhdGEucHRyLm9mZnNldHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLm9mZnNldHNfc2l6ZS9zaXplb2Yoc2l6ZV90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlQnVmZmVyLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9ICpzdGF0aWNfY2FzdDxjb25zdCBzdGF0dXNfdCo+KHRyLmRhdGEucHRyLmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlQnVmZmVyKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odHIuZGF0YS5wdHIuYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ci5kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzaXplX3QqPih0ci5kYXRhLnB0ci5vZmZzZXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ci5vZmZzZXRzX3NpemUvc2l6ZW9mKHNpemVfdCksIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZUJ1ZmZlcihOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4odHIuZGF0YS5wdHIuYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyLmRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2l6ZV90Kj4odHIuZGF0YS5wdHIub2Zmc2V0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICB0ci5vZmZzZXRzX3NpemUvc2l6ZW9mKHNpemVfdCksIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIGZpbmlzaDsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gZXhlY3V0ZUNvbW1hbmQoY21kKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIGdvdG8gZmluaXNoOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLWZpbmlzaDoKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChhY3F1aXJlUmVzdWx0KSAqYWNxdWlyZVJlc3VsdCA9IGVycjsKLSAgICAgICAgaWYgKHJlcGx5KSByZXBseS0+c2V0RXJyb3IoZXJyKTsKLSAgICAgICAgbUxhc3RFcnJvciA9IGVycjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgSVBDVGhyZWFkU3RhdGU6OnRhbGtXaXRoRHJpdmVyKGJvb2wgZG9SZWNlaXZlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qcm9jZXNzLT5tRHJpdmVyRkQgPj0gMCwgIkJpbmRlciBkcml2ZXIgaXMgbm90IG9wZW5lZCIpOwotICAgIAotICAgIGJpbmRlcl93cml0ZV9yZWFkIGJ3cjsKLSAgICAKLSAgICAvLyBJcyB0aGUgcmVhZCBidWZmZXIgZW1wdHk/Ci0gICAgY29uc3QgYm9vbCBuZWVkUmVhZCA9IG1Jbi5kYXRhUG9zaXRpb24oKSA+PSBtSW4uZGF0YVNpemUoKTsKLSAgICAKLSAgICAvLyBXZSBkb24ndCB3YW50IHRvIHdyaXRlIGFueXRoaW5nIGlmIHdlIGFyZSBzdGlsbCByZWFkaW5nCi0gICAgLy8gZnJvbSBkYXRhIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQgdGhlIGNhbGxlcgotICAgIC8vIGhhcyByZXF1ZXN0ZWQgdG8gcmVhZCB0aGUgbmV4dCBkYXRhLgotICAgIGNvbnN0IHNpemVfdCBvdXRBdmFpbCA9ICghZG9SZWNlaXZlIHx8IG5lZWRSZWFkKSA/IG1PdXQuZGF0YVNpemUoKSA6IDA7Ci0gICAgCi0gICAgYndyLndyaXRlX3NpemUgPSBvdXRBdmFpbDsKLSAgICBid3Iud3JpdGVfYnVmZmVyID0gKGxvbmcgdW5zaWduZWQgaW50KW1PdXQuZGF0YSgpOwotCi0gICAgLy8gVGhpcyBpcyB3aGF0IHdlJ2xsIHJlYWQuCi0gICAgaWYgKGRvUmVjZWl2ZSAmJiBuZWVkUmVhZCkgewotICAgICAgICBid3IucmVhZF9zaXplID0gbUluLmRhdGFDYXBhY2l0eSgpOwotICAgICAgICBid3IucmVhZF9idWZmZXIgPSAobG9uZyB1bnNpZ25lZCBpbnQpbUluLmRhdGEoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBid3IucmVhZF9zaXplID0gMDsKLSAgICAgICAgYndyLnJlYWRfYnVmZmVyID0gMDsKLSAgICB9Ci0KLSAgICBJRl9MT0dfQ09NTUFORFMoKSB7Ci0gICAgICAgIFRleHRPdXRwdXQ6OkJ1bmRsZSBfYihhbG9nKTsKLSAgICAgICAgaWYgKG91dEF2YWlsICE9IDApIHsKLSAgICAgICAgICAgIGFsb2cgPDwgIlNlbmRpbmcgY29tbWFuZHMgdG8gZHJpdmVyOiAiIDw8IGluZGVudDsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNtZHMgPSAoY29uc3Qgdm9pZCopYndyLndyaXRlX2J1ZmZlcjsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQqIGVuZCA9ICgoY29uc3QgdWludDhfdCopY21kcykrYndyLndyaXRlX3NpemU7Ci0gICAgICAgICAgICBhbG9nIDw8IEhleER1bXAoY21kcywgYndyLndyaXRlX3NpemUpIDw8IGVuZGw7Ci0gICAgICAgICAgICB3aGlsZSAoY21kcyA8IGVuZCkgY21kcyA9IHByaW50Q29tbWFuZChhbG9nLCBjbWRzKTsKLSAgICAgICAgICAgIGFsb2cgPDwgZGVkZW50OwotICAgICAgICB9Ci0gICAgICAgIGFsb2cgPDwgIlNpemUgb2YgcmVjZWl2ZSBidWZmZXI6ICIgPDwgYndyLnJlYWRfc2l6ZQotICAgICAgICAgICAgPDwgIiwgbmVlZFJlYWQ6ICIgPDwgbmVlZFJlYWQgPDwgIiwgZG9SZWNlaXZlOiAiIDw8IGRvUmVjZWl2ZSA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICAvLyBSZXR1cm4gaW1tZWRpYXRlbHkgaWYgdGhlcmUgaXMgbm90aGluZyB0byBkby4KLSAgICBpZiAoKGJ3ci53cml0ZV9zaXplID09IDApICYmIChid3IucmVhZF9zaXplID09IDApKSByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICBid3Iud3JpdGVfY29uc3VtZWQgPSAwOwotICAgIGJ3ci5yZWFkX2NvbnN1bWVkID0gMDsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgZG8gewotICAgICAgICBJRl9MT0dfQ09NTUFORFMoKSB7Ci0gICAgICAgICAgICBhbG9nIDw8ICJBYm91dCB0byByZWFkL3dyaXRlLCB3cml0ZSBzaXplID0gIiA8PCBtT3V0LmRhdGFTaXplKCkgPDwgZW5kbDsKLSAgICAgICAgfQotI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotICAgICAgICBpZiAoaW9jdGwobVByb2Nlc3MtPm1Ecml2ZXJGRCwgQklOREVSX1dSSVRFX1JFQUQsICZid3IpID49IDApCi0gICAgICAgICAgICBlcnIgPSBOT19FUlJPUjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotI2Vsc2UKLSAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0jZW5kaWYKLSAgICAgICAgSUZfTE9HX0NPTU1BTkRTKCkgewotICAgICAgICAgICAgYWxvZyA8PCAiRmluaXNoZWQgcmVhZC93cml0ZSwgd3JpdGUgc2l6ZSA9ICIgPDwgbU91dC5kYXRhU2l6ZSgpIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChlcnIgPT0gLUVJTlRSKTsKLQotICAgIElGX0xPR19DT01NQU5EUygpIHsKLSAgICAgICAgYWxvZyA8PCAiT3VyIGVycjogIiA8PCAodm9pZCopZXJyIDw8ICIsIHdyaXRlIGNvbnN1bWVkOiAiCi0gICAgICAgICAgICA8PCBid3Iud3JpdGVfY29uc3VtZWQgPDwgIiAob2YgIiA8PCBtT3V0LmRhdGFTaXplKCkKLQkJCTw8ICIpLCByZWFkIGNvbnN1bWVkOiAiIDw8IGJ3ci5yZWFkX2NvbnN1bWVkIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGVyciA+PSBOT19FUlJPUikgewotICAgICAgICBpZiAoYndyLndyaXRlX2NvbnN1bWVkID4gMCkgewotICAgICAgICAgICAgaWYgKGJ3ci53cml0ZV9jb25zdW1lZCA8IChzc2l6ZV90KW1PdXQuZGF0YVNpemUoKSkKLSAgICAgICAgICAgICAgICBtT3V0LnJlbW92ZSgwLCBid3Iud3JpdGVfY29uc3VtZWQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1PdXQuc2V0RGF0YVNpemUoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ3ci5yZWFkX2NvbnN1bWVkID4gMCkgewotICAgICAgICAgICAgbUluLnNldERhdGFTaXplKGJ3ci5yZWFkX2NvbnN1bWVkKTsKLSAgICAgICAgICAgIG1Jbi5zZXREYXRhUG9zaXRpb24oMCk7Ci0gICAgICAgIH0KLSAgICAgICAgSUZfTE9HX0NPTU1BTkRTKCkgewotICAgICAgICAgICAgVGV4dE91dHB1dDo6QnVuZGxlIF9iKGFsb2cpOwotICAgICAgICAgICAgYWxvZyA8PCAiUmVtYWluaW5nIGRhdGEgc2l6ZTogIiA8PCBtT3V0LmRhdGFTaXplKCkgPDwgZW5kbDsKLSAgICAgICAgICAgIGFsb2cgPDwgIlJlY2VpdmVkIGNvbW1hbmRzIGZyb20gZHJpdmVyOiAiIDw8IGluZGVudDsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNtZHMgPSBtSW4uZGF0YSgpOwotICAgICAgICAgICAgY29uc3Qgdm9pZCogZW5kID0gbUluLmRhdGEoKSArIG1Jbi5kYXRhU2l6ZSgpOwotICAgICAgICAgICAgYWxvZyA8PCBIZXhEdW1wKGNtZHMsIG1Jbi5kYXRhU2l6ZSgpKSA8PCBlbmRsOwotICAgICAgICAgICAgd2hpbGUgKGNtZHMgPCBlbmQpIGNtZHMgPSBwcmludFJldHVybkNvbW1hbmQoYWxvZywgY21kcyk7Ci0gICAgICAgICAgICBhbG9nIDw8IGRlZGVudDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IElQQ1RocmVhZFN0YXRlOjp3cml0ZVRyYW5zYWN0aW9uRGF0YShpbnQzMl90IGNtZCwgdWludDMyX3QgYmluZGVyRmxhZ3MsCi0gICAgaW50MzJfdCBoYW5kbGUsIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgc3RhdHVzX3QqIHN0YXR1c0J1ZmZlcikKLXsKLSAgICBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKLQotICAgIHRyLnRhcmdldC5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgdHIuY29kZSA9IGNvZGU7Ci0gICAgdHIuZmxhZ3MgPSBiaW5kZXJGbGFnczsKLSAgICB0ci5jb29raWUgPSAwOwotICAgIHRyLnNlbmRlcl9waWQgPSAwOwotICAgIHRyLnNlbmRlcl9ldWlkID0gMDsKLSAgICAKLSAgICBjb25zdCBzdGF0dXNfdCBlcnIgPSBkYXRhLmVycm9yQ2hlY2soKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRyLmRhdGFfc2l6ZSA9IGRhdGEuaXBjRGF0YVNpemUoKTsKLSAgICAgICAgdHIuZGF0YS5wdHIuYnVmZmVyID0gZGF0YS5pcGNEYXRhKCk7Ci0gICAgICAgIHRyLm9mZnNldHNfc2l6ZSA9IGRhdGEuaXBjT2JqZWN0c0NvdW50KCkqc2l6ZW9mKHNpemVfdCk7Ci0gICAgICAgIHRyLmRhdGEucHRyLm9mZnNldHMgPSBkYXRhLmlwY09iamVjdHMoKTsKLSAgICB9IGVsc2UgaWYgKHN0YXR1c0J1ZmZlcikgewotICAgICAgICB0ci5mbGFncyB8PSBURl9TVEFUVVNfQ09ERTsKLSAgICAgICAgKnN0YXR1c0J1ZmZlciA9IGVycjsKLSAgICAgICAgdHIuZGF0YV9zaXplID0gc2l6ZW9mKHN0YXR1c190KTsKLSAgICAgICAgdHIuZGF0YS5wdHIuYnVmZmVyID0gc3RhdHVzQnVmZmVyOwotICAgICAgICB0ci5vZmZzZXRzX3NpemUgPSAwOwotICAgICAgICB0ci5kYXRhLnB0ci5vZmZzZXRzID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKG1MYXN0RXJyb3IgPSBlcnIpOwotICAgIH0KLSAgICAKLSAgICBtT3V0LndyaXRlSW50MzIoY21kKTsKLSAgICBtT3V0LndyaXRlKCZ0ciwgc2l6ZW9mKHRyKSk7Ci0gICAgCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zcDxCQmluZGVyPiB0aGVfY29udGV4dF9vYmplY3Q7Ci0KLXZvaWQgc2V0VGhlQ29udGV4dE9iamVjdChzcDxCQmluZGVyPiBvYmopCi17Ci0gICAgdGhlX2NvbnRleHRfb2JqZWN0ID0gb2JqOwotfQotCi1zdGF0dXNfdCBJUENUaHJlYWRTdGF0ZTo6ZXhlY3V0ZUNvbW1hbmQoaW50MzJfdCBjbWQpCi17Ci0gICAgQkJpbmRlciogb2JqOwotICAgIFJlZkJhc2U6OndlYWtyZWZfdHlwZSogcmVmczsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKLSAgICAKLSAgICBzd2l0Y2ggKGNtZCkgewotICAgIGNhc2UgQlJfRVJST1I6Ci0gICAgICAgIHJlc3VsdCA9IG1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfT0s6Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEJSX0FDUVVJUkU6Ci0gICAgICAgIHJlZnMgPSAoUmVmQmFzZTo6d2Vha3JlZl90eXBlKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgIG9iaiA9IChCQmluZGVyKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHJlZnMtPnJlZkJhc2UoKSA9PSBvYmosCi0gICAgICAgICAgICAgICAgICAgIkJSX0FDUVVJUkU6IG9iamVjdCAlcCBkb2VzIG5vdCBtYXRjaCBjb29raWUgJXAgKGV4cGVjdGVkICVwKSIsCi0gICAgICAgICAgICAgICAgICAgcmVmcywgb2JqLCByZWZzLT5yZWZCYXNlKCkpOwotICAgICAgICBvYmotPmluY1N0cm9uZyhtUHJvY2Vzcy5nZXQoKSk7Ci0gICAgICAgIElGX0xPR19SRU1PVEVSRUZTKCkgewotICAgICAgICAgICAgTE9HX1JFTU9URVJFRlMoIkJSX0FDUVVJUkUgZnJvbSBkcml2ZXIgb24gJXAiLCBvYmopOwotICAgICAgICAgICAgb2JqLT5wcmludFJlZnMoKTsKLSAgICAgICAgfQotICAgICAgICBtT3V0LndyaXRlSW50MzIoQkNfQUNRVUlSRV9ET05FKTsKLSAgICAgICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KXJlZnMpOwotICAgICAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3Qpb2JqKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfUkVMRUFTRToKLSAgICAgICAgcmVmcyA9IChSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgb2JqID0gKEJCaW5kZXIqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgQUxPR19BU1NFUlQocmVmcy0+cmVmQmFzZSgpID09IG9iaiwKLSAgICAgICAgICAgICAgICAgICAiQlJfUkVMRUFTRTogb2JqZWN0ICVwIGRvZXMgbm90IG1hdGNoIGNvb2tpZSAlcCAoZXhwZWN0ZWQgJXApIiwKLSAgICAgICAgICAgICAgICAgICByZWZzLCBvYmosIHJlZnMtPnJlZkJhc2UoKSk7Ci0gICAgICAgIElGX0xPR19SRU1PVEVSRUZTKCkgewotICAgICAgICAgICAgTE9HX1JFTU9URVJFRlMoIkJSX1JFTEVBU0UgZnJvbSBkcml2ZXIgb24gJXAiLCBvYmopOwotICAgICAgICAgICAgb2JqLT5wcmludFJlZnMoKTsKLSAgICAgICAgfQotICAgICAgICBtUGVuZGluZ1N0cm9uZ0RlcmVmcy5wdXNoKG9iaik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEJSX0lOQ1JFRlM6Ci0gICAgICAgIHJlZnMgPSAoUmVmQmFzZTo6d2Vha3JlZl90eXBlKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgIG9iaiA9IChCQmluZGVyKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgIHJlZnMtPmluY1dlYWsobVByb2Nlc3MuZ2V0KCkpOwotICAgICAgICBtT3V0LndyaXRlSW50MzIoQkNfSU5DUkVGU19ET05FKTsKLSAgICAgICAgbU91dC53cml0ZUludDMyKChpbnQzMl90KXJlZnMpOwotICAgICAgICBtT3V0LndyaXRlSW50MzIoKGludDMyX3Qpb2JqKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfREVDUkVGUzoKLSAgICAgICAgcmVmcyA9IChSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgb2JqID0gKEJCaW5kZXIqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgLy8gTk9URTogVGhpcyBhc3NlcnRpb24gaXMgbm90IHZhbGlkLCBiZWNhdXNlIHRoZSBvYmplY3QgbWF5IG5vCi0gICAgICAgIC8vIGxvbmdlciBleGlzdCAodGh1cyB0aGUgKEJCaW5kZXIqKWNhc3QgYWJvdmUgcmVzdWx0aW5nIGluIGEgZGlmZmVyZW50Ci0gICAgICAgIC8vIG1lbW9yeSBhZGRyZXNzKS4KLSAgICAgICAgLy9BTE9HX0FTU0VSVChyZWZzLT5yZWZCYXNlKCkgPT0gb2JqLAotICAgICAgICAvLyAgICAgICAgICAgIkJSX0RFQ1JFRlM6IG9iamVjdCAlcCBkb2VzIG5vdCBtYXRjaCBjb29raWUgJXAgKGV4cGVjdGVkICVwKSIsCi0gICAgICAgIC8vICAgICAgICAgICByZWZzLCBvYmosIHJlZnMtPnJlZkJhc2UoKSk7Ci0gICAgICAgIG1QZW5kaW5nV2Vha0RlcmVmcy5wdXNoKHJlZnMpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBCUl9BVFRFTVBUX0FDUVVJUkU6Ci0gICAgICAgIHJlZnMgPSAoUmVmQmFzZTo6d2Vha3JlZl90eXBlKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgIG9iaiA9IChCQmluZGVyKiltSW4ucmVhZEludDMyKCk7Ci0gICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgYm9vbCBzdWNjZXNzID0gcmVmcy0+YXR0ZW1wdEluY1N0cm9uZyhtUHJvY2Vzcy5nZXQoKSk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChzdWNjZXNzICYmIHJlZnMtPnJlZkJhc2UoKSA9PSBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICJCUl9BVFRFTVBUX0FDUVVJUkU6IG9iamVjdCAlcCBkb2VzIG5vdCBtYXRjaCBjb29raWUgJXAgKGV4cGVjdGVkICVwKSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZnMsIG9iaiwgcmVmcy0+cmVmQmFzZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbU91dC53cml0ZUludDMyKEJDX0FDUVVJUkVfUkVTVUxUKTsKLSAgICAgICAgICAgIG1PdXQud3JpdGVJbnQzMigoaW50MzJfdClzdWNjZXNzKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIEJSX1RSQU5TQUNUSU9OOgotICAgICAgICB7Ci0gICAgICAgICAgICBiaW5kZXJfdHJhbnNhY3Rpb25fZGF0YSB0cjsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Jbi5yZWFkKCZ0ciwgc2l6ZW9mKHRyKSk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChyZXN1bHQgPT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggY29tbWFuZCBkYXRhIGZvciBiclRSQU5TQUNUSU9OIik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUGFyY2VsIGJ1ZmZlcjsKLSAgICAgICAgICAgIGJ1ZmZlci5pcGNTZXREYXRhUmVmZXJlbmNlKAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRyLmRhdGEucHRyLmJ1ZmZlciksCi0gICAgICAgICAgICAgICAgdHIuZGF0YV9zaXplLAotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2l6ZV90Kj4odHIuZGF0YS5wdHIub2Zmc2V0cyksCi0gICAgICAgICAgICAgICAgdHIub2Zmc2V0c19zaXplL3NpemVvZihzaXplX3QpLCBmcmVlQnVmZmVyLCB0aGlzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29uc3QgcGlkX3Qgb3JpZ1BpZCA9IG1DYWxsaW5nUGlkOwotICAgICAgICAgICAgY29uc3QgdWlkX3Qgb3JpZ1VpZCA9IG1DYWxsaW5nVWlkOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBtQ2FsbGluZ1BpZCA9IHRyLnNlbmRlcl9waWQ7Ci0gICAgICAgICAgICBtQ2FsbGluZ1VpZCA9IHRyLnNlbmRlcl9ldWlkOwotICAgICAgICAgICAgbU9yaWdDYWxsaW5nVWlkID0gdHIuc2VuZGVyX2V1aWQ7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCBjdXJQcmlvID0gZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBtTXlUaHJlYWRJZCk7Ci0gICAgICAgICAgICBpZiAoZ0Rpc2FibGVCYWNrZ3JvdW5kU2NoZWR1bGluZykgewotICAgICAgICAgICAgICAgIGlmIChjdXJQcmlvID4gQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBpbmhlcml0ZWQgYSByZWR1Y2VkIHByaW9yaXR5IGZyb20gdGhlIGNhbGxlciwgYnV0IGRvIG5vdAotICAgICAgICAgICAgICAgICAgICAvLyB3YW50IHRvIHJ1biBpbiB0aGF0IHN0YXRlIGluIHRoaXMgcHJvY2Vzcy4gIFRoZSBkcml2ZXIgc2V0IG91cgotICAgICAgICAgICAgICAgICAgICAvLyBwcmlvcml0eSBhbHJlYWR5ICh0aG91Z2ggbm90IG91ciBzY2hlZHVsaW5nIGNsYXNzKSwgc28gYm91bmNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0IGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVmb3JlIGludm9raW5nIHRoZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCBtTXlUaHJlYWRJZCwgQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1clByaW8gPj0gQU5EUk9JRF9QUklPUklUWV9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdXNlIHRoZSBpbmhlcml0ZWQgcHJpb3JpdHkgZnJvbSB0aGUgY2FsbGVyLgotICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhpcyB0aHJlYWQgaXMgaW4gdGhlIGJhY2tncm91bmQgc2NoZWR1bGluZyBjbGFzcywKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGRyaXZlciB3b24ndCBtb2RpZnkgc2NoZWR1bGluZyBjbGFzc2VzIGZvciB1cy4KLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNjaGVkdWxpbmcgZ3JvdXAgaXMgcmVzZXQgdG8gZGVmYXVsdCBieSB0aGUgY2FsbGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgdGhpcyBtZXRob2QgcmV0dXJucyBhZnRlciB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRTY2hlZHVsaW5nR3JvdXAobU15VGhyZWFkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9UR1JPVVBfQkdfTk9OSU5URVJBQ1QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9BTE9HSSgiPj4+PiBUUkFOU0FDVCBmcm9tIHBpZCAlZCB1aWQgJWRcbiIsIG1DYWxsaW5nUGlkLCBtQ2FsbGluZ1VpZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFBhcmNlbCByZXBseTsKLSAgICAgICAgICAgIElGX0xPR19UUkFOU0FDVElPTlMoKSB7Ci0gICAgICAgICAgICAgICAgVGV4dE91dHB1dDo6QnVuZGxlIF9iKGFsb2cpOwotICAgICAgICAgICAgICAgIGFsb2cgPDwgIkJSX1RSQU5TQUNUSU9OIHRociAiIDw8ICh2b2lkKilwdGhyZWFkX3NlbGYoKQotICAgICAgICAgICAgICAgICAgICA8PCAiIC8gb2JqICIgPDwgdHIudGFyZ2V0LnB0ciA8PCAiIC8gY29kZSAiCi0gICAgICAgICAgICAgICAgICAgIDw8IFR5cGVDb2RlKHRyLmNvZGUpIDw8ICI6ICIgPDwgaW5kZW50IDw8IGJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICA8PCBkZWRlbnQgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICA8PCAiRGF0YSBhZGRyID0gIgotICAgICAgICAgICAgICAgICAgICA8PCByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0ci5kYXRhLnB0ci5idWZmZXIpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIsIG9mZnNldHMgYWRkcj0iCi0gICAgICAgICAgICAgICAgICAgIDw8IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc2l6ZV90Kj4odHIuZGF0YS5wdHIub2Zmc2V0cykgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0ci50YXJnZXQucHRyKSB7Ci0gICAgICAgICAgICAgICAgc3A8QkJpbmRlcj4gYigoQkJpbmRlciopdHIuY29va2llKTsKLSAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBlcnJvciA9IGItPnRyYW5zYWN0KHRyLmNvZGUsIGJ1ZmZlciwgJnJlcGx5LCB0ci5mbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgTk9fRVJST1IpIHJlcGx5LnNldEVycm9yKGVycm9yKTsKLQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXNfdCBlcnJvciA9IHRoZV9jb250ZXh0X29iamVjdC0+dHJhbnNhY3QodHIuY29kZSwgYnVmZmVyLCAmcmVwbHksIHRyLmZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBOT19FUlJPUikgcmVwbHkuc2V0RXJyb3IoZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0FMT0dJKCI8PDw8IFRSQU5TQUNUIGZyb20gcGlkICVkIHJlc3RvcmUgcGlkICVkIHVpZCAlZFxuIiwKLSAgICAgICAgICAgIC8vICAgICBtQ2FsbGluZ1BpZCwgb3JpZ1BpZCwgb3JpZ1VpZCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgodHIuZmxhZ3MgJiBURl9PTkVfV0FZKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgTE9HX09ORVdBWSgiU2VuZGluZyByZXBseSB0byAlZCEiLCBtQ2FsbGluZ1BpZCk7Ci0gICAgICAgICAgICAgICAgc2VuZFJlcGx5KHJlcGx5LCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HX09ORVdBWSgiTk9UIHNlbmRpbmcgcmVwbHkgdG8gJWQhIiwgbUNhbGxpbmdQaWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBtQ2FsbGluZ1BpZCA9IG9yaWdQaWQ7Ci0gICAgICAgICAgICBtQ2FsbGluZ1VpZCA9IG9yaWdVaWQ7Ci0gICAgICAgICAgICBtT3JpZ0NhbGxpbmdVaWQgPSBvcmlnVWlkOwotCi0gICAgICAgICAgICBJRl9MT0dfVFJBTlNBQ1RJT05TKCkgewotICAgICAgICAgICAgICAgIFRleHRPdXRwdXQ6OkJ1bmRsZSBfYihhbG9nKTsKLSAgICAgICAgICAgICAgICBhbG9nIDw8ICJCQ19SRVBMWSB0aHIgIiA8PCAodm9pZCopcHRocmVhZF9zZWxmKCkgPDwgIiAvIG9iaiAiCi0gICAgICAgICAgICAgICAgICAgIDw8IHRyLnRhcmdldC5wdHIgPDwgIjogIiA8PCBpbmRlbnQgPDwgcmVwbHkgPDwgZGVkZW50IDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIEJSX0RFQURfQklOREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBCcEJpbmRlciAqcHJveHkgPSAoQnBCaW5kZXIqKW1Jbi5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHByb3h5LT5zZW5kT2JpdHVhcnkoKTsKLSAgICAgICAgICAgIG1PdXQud3JpdGVJbnQzMihCQ19ERUFEX0JJTkRFUl9ET05FKTsKLSAgICAgICAgICAgIG1PdXQud3JpdGVJbnQzMigoaW50MzJfdClwcm94eSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIAotICAgIGNhc2UgQlJfQ0xFQVJfREVBVEhfTk9USUZJQ0FUSU9OX0RPTkU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEJwQmluZGVyICpwcm94eSA9IChCcEJpbmRlciopbUluLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcHJveHktPmdldFdlYWtSZWZzKCktPmRlY1dlYWsocHJveHkpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEJSX0ZJTklTSEVEOgotICAgICAgICByZXN1bHQgPSBUSU1FRF9PVVQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEJSX05PT1A6Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICBjYXNlIEJSX1NQQVdOX0xPT1BFUjoKLSAgICAgICAgbVByb2Nlc3MtPnNwYXduUG9vbGVkVGhyZWFkKGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHByaW50ZigiKioqIEJBRCBDT01NQU5EICVkIHJlY2VpdmVkIGZyb20gQmluZGVyIGRyaXZlclxuIiwgY21kKTsKLSAgICAgICAgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBtTGFzdEVycm9yID0gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjp0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KQotewotCUlQQ1RocmVhZFN0YXRlKiBjb25zdCBzZWxmID0gc3RhdGljX2Nhc3Q8SVBDVGhyZWFkU3RhdGUqPihzdCk7Ci0JaWYgKHNlbGYpIHsKLQkJc2VsZi0+Zmx1c2hDb21tYW5kcygpOwotI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKQotICAgICAgICBpb2N0bChzZWxmLT5tUHJvY2Vzcy0+bURyaXZlckZELCBCSU5ERVJfVEhSRUFEX0VYSVQsIDApOwotI2VuZGlmCi0JCWRlbGV0ZSBzZWxmOwotCX0KLX0KLQotCi12b2lkIElQQ1RocmVhZFN0YXRlOjpmcmVlQnVmZmVyKFBhcmNlbCogcGFyY2VsLCBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCogb2JqZWN0cywgc2l6ZV90IG9iamVjdHNTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUpCi17Ci0gICAgLy9BTE9HSSgiRnJlZWluZyBwYXJjZWwgJXAiLCAmcGFyY2VsKTsKLSAgICBJRl9MT0dfQ09NTUFORFMoKSB7Ci0gICAgICAgIGFsb2cgPDwgIldyaXRpbmcgQkNfRlJFRV9CVUZGRVIgZm9yICIgPDwgZGF0YSA8PCBlbmRsOwotICAgIH0KLSAgICBBTE9HX0FTU0VSVChkYXRhICE9IE5VTEwsICJDYWxsZWQgd2l0aCBOVUxMIGRhdGEiKTsKLSAgICBpZiAocGFyY2VsICE9IE5VTEwpIHBhcmNlbC0+Y2xvc2VGaWxlRGVzY3JpcHRvcnMoKTsKLSAgICBJUENUaHJlYWRTdGF0ZSogc3RhdGUgPSBzZWxmKCk7Ci0gICAgc3RhdGUtPm1PdXQud3JpdGVJbnQzMihCQ19GUkVFX0JVRkZFUik7Ci0gICAgc3RhdGUtPm1PdXQud3JpdGVJbnQzMigoaW50MzJfdClkYXRhKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5jcHAgYi9saWJzL2JpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTMwMzZmLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJQZXJtaXNzaW9uQ29udHJvbGxlciIKLQotI2luY2x1ZGUgPGJpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvYmluZGVyL1N0YXRpYy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQnBQZXJtaXNzaW9uQ29udHJvbGxlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJUGVybWlzc2lvbkNvbnRyb2xsZXI+Ci17Ci1wdWJsaWM6Ci0gICAgQnBQZXJtaXNzaW9uQ29udHJvbGxlcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJUGVybWlzc2lvbkNvbnRyb2xsZXI+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIGludDMyX3QgcGlkLCBpbnQzMl90IHVpZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElQZXJtaXNzaW9uQ29udHJvbGxlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KHBlcm1pc3Npb24pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDSEVDS19QRVJNSVNTSU9OX1RSQU5TQUNUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICAvLyBmYWlsIG9uIGV4Y2VwdGlvbgotICAgICAgICBpZiAocmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSAhPSAwKSByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpICE9IDA7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFBlcm1pc3Npb25Db250cm9sbGVyLCAiYW5kcm9pZC5vcy5JUGVybWlzc2lvbkNvbnRyb2xsZXIiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblBlcm1pc3Npb25Db250cm9sbGVyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgLy9wcmludGYoIlBlcm1pc3Npb25Db250cm9sbGVyIHJlY2VpdmVkOiAiKTsgZGF0YS5wcmludCgpOwotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgQ0hFQ0tfUEVSTUlTU0lPTl9UUkFOU0FDVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElQZXJtaXNzaW9uQ29udHJvbGxlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgU3RyaW5nMTYgcGVybWlzc2lvbiA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBpbnQzMl90IHBpZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQzMl90IHVpZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBib29sIHJlcyA9IGNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzID8gMSA6IDApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9JU2VydmljZU1hbmFnZXIuY3BwIGIvbGlicy9iaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1MDY0MC4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9JU2VydmljZU1hbmFnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlNlcnZpY2VNYW5hZ2VyIgotCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1N5c3RlbUNsb2NrLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2JpbmRlci9TdGF0aWMuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXNwPElTZXJ2aWNlTWFuYWdlcj4gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkKLXsKLSAgICBpZiAoZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlciAhPSBOVUxMKSByZXR1cm4gZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKLSAgICAKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jayk7Ci0gICAgICAgIGlmIChnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGdEZWZhdWx0U2VydmljZU1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJU2VydmljZU1hbmFnZXI+KAotICAgICAgICAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5nZXRDb250ZXh0T2JqZWN0KE5VTEwpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKLX0KLQotYm9vbCBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uKQotewotICAgIHJldHVybiBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb24sIE5VTEwsIE5VTEwpOwotfQotCi1zdGF0aWMgU3RyaW5nMTYgX3Blcm1pc3Npb24oInBlcm1pc3Npb24iKTsKLQotCi1ib29sIGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIGludDMyX3QqIG91dFBpZCwgaW50MzJfdCogb3V0VWlkKQotewotICAgIElQQ1RocmVhZFN0YXRlKiBpcGNTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgcGlkX3QgcGlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdQaWQoKTsKLSAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChvdXRQaWQpICpvdXRQaWQgPSBwaWQ7Ci0gICAgaWYgKG91dFVpZCkgKm91dFVpZCA9IHVpZDsKLSAgICByZXR1cm4gY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24sIHBpZCwgdWlkKTsKLX0KLQotYm9vbCBjaGVja1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIHBpZF90IHBpZCwgdWlkX3QgdWlkKQotewotICAgIHNwPElQZXJtaXNzaW9uQ29udHJvbGxlcj4gcGM7Ci0gICAgZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2subG9jaygpOwotICAgIHBjID0gZ1Blcm1pc3Npb25Db250cm9sbGVyOwotICAgIGdEZWZhdWx0U2VydmljZU1hbmFnZXJMb2NrLnVubG9jaygpOwotICAgIAotICAgIGludDY0X3Qgc3RhcnRUaW1lID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChwYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBib29sIHJlcyA9IHBjLT5jaGVja1Blcm1pc3Npb24ocGVybWlzc2lvbiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ2hlY2sgcGFzc2VkIGFmdGVyICVkIHNlY29uZHMgZm9yICVzIGZyb20gdWlkPSVkIHBpZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKHVwdGltZU1pbGxpcygpLXN0YXJ0VGltZSkvMTAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChwZXJtaXNzaW9uKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJcyB0aGlzIGEgcGVybWlzc2lvbiBmYWlsdXJlLCBvciBkaWQgdGhlIGNvbnRyb2xsZXIgZ28gYXdheT8KLSAgICAgICAgICAgIGlmIChwYy0+YXNCaW5kZXIoKS0+aXNCaW5kZXJBbGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIlBlcm1pc3Npb24gZmFpbHVyZTogJXMgZnJvbSB1aWQ9JWQgcGlkPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgocGVybWlzc2lvbikuc3RyaW5nKCksIHVpZCwgcGlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIE9iamVjdCBpcyBkZWFkIQotICAgICAgICAgICAgZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2subG9jaygpOwotICAgICAgICAgICAgaWYgKGdQZXJtaXNzaW9uQ29udHJvbGxlciA9PSBwYykgewotICAgICAgICAgICAgICAgIGdQZXJtaXNzaW9uQ29udHJvbGxlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLyBOZWVkIHRvIHJldHJpZXZlIHRoZSBwZXJtaXNzaW9uIGNvbnRyb2xsZXIuCi0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoX3Blcm1pc3Npb24pOwotICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwZXJtaXNzaW9uIGNvbnRyb2xsZXIgdG8gY29tZSBiYWNrLi4uCi0gICAgICAgICAgICBpZiAoc3RhcnRUaW1lID09IDApIHsKLSAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSB1cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBBTE9HSSgiV2FpdGluZyB0byBjaGVjayBwZXJtaXNzaW9uICVzIGZyb20gdWlkPSVkIHBpZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHBlcm1pc3Npb24pLnN0cmluZygpLCB1aWQsIHBpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbGVlcCgxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBjID0gaW50ZXJmYWNlX2Nhc3Q8SVBlcm1pc3Npb25Db250cm9sbGVyPihiaW5kZXIpOwotICAgICAgICAgICAgLy8gSW5zdGFsbCB0aGUgbmV3IHBlcm1pc3Npb24gY29udHJvbGxlciwgYW5kIHRyeSBhZ2Fpbi4gICAgICAgIAotICAgICAgICAgICAgZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2subG9jaygpOwotICAgICAgICAgICAgZ1Blcm1pc3Npb25Db250cm9sbGVyID0gcGM7Ci0gICAgICAgICAgICBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyTG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBCcFNlcnZpY2VNYW5hZ2VyIDogcHVibGljIEJwSW50ZXJmYWNlPElTZXJ2aWNlTWFuYWdlcj4KLXsKLXB1YmxpYzoKLSAgICBCcFNlcnZpY2VNYW5hZ2VyKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElTZXJ2aWNlTWFuYWdlcj4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJQmluZGVyPiBnZXRTZXJ2aWNlKGNvbnN0IFN0cmluZzE2JiBuYW1lKSBjb25zdAotICAgIHsKLSAgICAgICAgdW5zaWduZWQgbjsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IDU7IG4rKyl7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBzdmMgPSBjaGVja1NlcnZpY2UobmFtZSk7Ci0gICAgICAgICAgICBpZiAoc3ZjICE9IE5VTEwpIHJldHVybiBzdmM7Ci0gICAgICAgICAgICBBTE9HSSgiV2FpdGluZyBmb3Igc2VydmljZSAlcy4uLlxuIiwgU3RyaW5nOChuYW1lKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBzbGVlcCgxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElCaW5kZXI+IGNoZWNrU2VydmljZSggY29uc3QgU3RyaW5nMTYmIG5hbWUpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU2VydmljZU1hbmFnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihuYW1lKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENIRUNLX1NFUlZJQ0VfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTZXJ2aWNlKGNvbnN0IFN0cmluZzE2JiBuYW1lLCBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgICAgIGJvb2wgYWxsb3dJc29sYXRlZCkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTZXJ2aWNlTWFuYWdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG5hbWUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKHNlcnZpY2UpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYWxsb3dJc29sYXRlZCA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TRVJWSUNFX1RSQU5TQUNUSU9OLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gZXJyID09IE5PX0VSUk9SID8gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSA6IGVycjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFZlY3RvcjxTdHJpbmcxNj4gbGlzdFNlcnZpY2VzKCkKLSAgICB7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gcmVzOwotICAgICAgICBpbnQgbiA9IDA7Ci0KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTZXJ2aWNlTWFuYWdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihuKyspOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfU0VSVklDRVNfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcmVzLmFkZChyZXBseS5yZWFkU3RyaW5nMTYoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU2VydmljZU1hbmFnZXIsICJhbmRyb2lkLm9zLklTZXJ2aWNlTWFuYWdlciIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuU2VydmljZU1hbmFnZXI6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvL3ByaW50ZigiU2VydmljZU1hbmFnZXIgcmVjZWl2ZWQ6ICIpOyBkYXRhLnByaW50KCk7Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfU0VSVklDRV9UUkFOU0FDVElPTjogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTZXJ2aWNlTWFuYWdlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgU3RyaW5nMTYgd2hpY2ggPSBkYXRhLnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgc3A8SUJpbmRlcj4gYiA9IGNvbnN0X2Nhc3Q8Qm5TZXJ2aWNlTWFuYWdlcio+KHRoaXMpLT5nZXRTZXJ2aWNlKHdoaWNoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDSEVDS19TRVJWSUNFX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlcnZpY2VNYW5hZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBTdHJpbmcxNiB3aGljaCA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiID0gY29uc3RfY2FzdDxCblNlcnZpY2VNYW5hZ2VyKj4odGhpcyktPmNoZWNrU2VydmljZSh3aGljaCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoYik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQUREX1NFUlZJQ0VfVFJBTlNBQ1RJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2VydmljZU1hbmFnZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFN0cmluZzE2IHdoaWNoID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGIgPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGFkZFNlcnZpY2Uod2hpY2gsIGIpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBMSVNUX1NFUlZJQ0VTX1RSQU5TQUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlcnZpY2VNYW5hZ2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGxpc3QgPSBsaXN0U2VydmljZXMoKTsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBOID0gbGlzdC5zaXplKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihsaXN0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvTWVtb3J5QmFzZS5jcHAgYi9saWJzL2JpbmRlci9NZW1vcnlCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzMDY2Yi4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9NZW1vcnlCYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTWVtb3J5QmFzZTo6TWVtb3J5QmFzZShjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXAsCi0gICAgICAgIHNzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1TaXplKHNpemUpLCBtT2Zmc2V0KG9mZnNldCksIG1IZWFwKGhlYXApCi17Ci19Ci0KLXNwPElNZW1vcnlIZWFwPiBNZW1vcnlCYXNlOjpnZXRNZW1vcnkoc3NpemVfdCogb2Zmc2V0LCBzaXplX3QqIHNpemUpIGNvbnN0Ci17Ci0gICAgaWYgKG9mZnNldCkgKm9mZnNldCA9IG1PZmZzZXQ7Ci0gICAgaWYgKHNpemUpICAgKnNpemUgPSBtU2l6ZTsKLSAgICByZXR1cm4gbUhlYXA7Ci19Ci0KLU1lbW9yeUJhc2U6On5NZW1vcnlCYXNlKCkKLXsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvTWVtb3J5RGVhbGVyLmNwcCBiL2xpYnMvYmluZGVyL01lbW9yeURlYWxlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGUwYTcuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvTWVtb3J5RGVhbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZW1vcnlEZWFsZXIiCi0KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBBIHNpbXBsZSB0ZW1wbGF0aXplZCBkb3VibHkgbGlua2VkLWxpc3QgaW1wbGVtZW50YXRpb24KLSAqLwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgTk9ERT4KLWNsYXNzIExpbmtlZExpc3QKLXsKLSAgICBOT0RFKiAgbUZpcnN0OwotICAgIE5PREUqICBtTGFzdDsKLQotcHVibGljOgotICAgICAgICAgICAgICAgIExpbmtlZExpc3QoKSA6IG1GaXJzdCgwKSwgbUxhc3QoMCkgeyB9Ci0gICAgYm9vbCAgICAgICAgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1GaXJzdCA9PSAwOyB9Ci0gICAgTk9ERSBjb25zdCogaGVhZCgpIGNvbnN0IHsgcmV0dXJuIG1GaXJzdDsgfQotICAgIE5PREUqICAgICAgIGhlYWQoKSB7IHJldHVybiBtRmlyc3Q7IH0KLSAgICBOT0RFIGNvbnN0KiB0YWlsKCkgY29uc3QgeyByZXR1cm4gbUxhc3Q7IH0KLSAgICBOT0RFKiAgICAgICB0YWlsKCkgeyByZXR1cm4gbUxhc3Q7IH0KLQotICAgIHZvaWQgaW5zZXJ0QWZ0ZXIoTk9ERSogbm9kZSwgTk9ERSogbmV3Tm9kZSkgewotICAgICAgICBuZXdOb2RlLT5wcmV2ID0gbm9kZTsKLSAgICAgICAgbmV3Tm9kZS0+bmV4dCA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIGlmIChub2RlLT5uZXh0ID09IDApIG1MYXN0ID0gbmV3Tm9kZTsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5ld05vZGU7Ci0gICAgICAgIG5vZGUtPm5leHQgPSBuZXdOb2RlOwotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0QmVmb3JlKE5PREUqIG5vZGUsIE5PREUqIG5ld05vZGUpIHsKLSAgICAgICAgIG5ld05vZGUtPnByZXYgPSBub2RlLT5wcmV2OwotICAgICAgICAgbmV3Tm9kZS0+bmV4dCA9IG5vZGU7Ci0gICAgICAgICBpZiAobm9kZS0+cHJldiA9PSAwKSAgIG1GaXJzdCA9IG5ld05vZGU7Ci0gICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIG5vZGUtPnByZXYtPm5leHQgPSBuZXdOb2RlOwotICAgICAgICAgbm9kZS0+cHJldiA9IG5ld05vZGU7Ci0gICAgfQotCi0gICAgdm9pZCBpbnNlcnRIZWFkKE5PREUqIG5ld05vZGUpIHsKLSAgICAgICAgaWYgKG1GaXJzdCA9PSAwKSB7Ci0gICAgICAgICAgICBtRmlyc3QgPSBtTGFzdCA9IG5ld05vZGU7Ci0gICAgICAgICAgICBuZXdOb2RlLT5wcmV2ID0gbmV3Tm9kZS0+bmV4dCA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdOb2RlLT5wcmV2ID0gMDsKLSAgICAgICAgICAgIG5ld05vZGUtPm5leHQgPSBtRmlyc3Q7Ci0gICAgICAgICAgICBtRmlyc3QtPnByZXYgPSBuZXdOb2RlOwotICAgICAgICAgICAgbUZpcnN0ID0gbmV3Tm9kZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgaW5zZXJ0VGFpbChOT0RFKiBuZXdOb2RlKSB7Ci0gICAgICAgIGlmIChtTGFzdCA9PSAwKSB7Ci0gICAgICAgICAgICBpbnNlcnRIZWFkKG5ld05vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3Tm9kZS0+cHJldiA9IG1MYXN0OwotICAgICAgICAgICAgbmV3Tm9kZS0+bmV4dCA9IDA7Ci0gICAgICAgICAgICBtTGFzdC0+bmV4dCA9IG5ld05vZGU7Ci0gICAgICAgICAgICBtTGFzdCA9IG5ld05vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBOT0RFKiByZW1vdmUoTk9ERSogbm9kZSkgewotICAgICAgICBpZiAobm9kZS0+cHJldiA9PSAwKSAgICBtRmlyc3QgPSBub2RlLT5uZXh0OwotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBub2RlLT5wcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKLSAgICAgICAgaWYgKG5vZGUtPm5leHQgPT0gMCkgICAgbUxhc3QgPSBub2RlLT5wcmV2OwotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICBub2RlLT5uZXh0LT5wcmV2ID0gbm9kZS0+cHJldjsKLSAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBBbGxvY2F0aW9uIDogcHVibGljIE1lbW9yeUJhc2UgewotcHVibGljOgotICAgIEFsbG9jYXRpb24oY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiYgZGVhbGVyLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgfkFsbG9jYXRpb24oKTsKLXByaXZhdGU6Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yCi17Ci0gICAgZW51bSB7Ci0gICAgICAgIFBBR0VfQUxJR05FRCA9IDB4MDAwMDAwMDEKLSAgICB9OwotcHVibGljOgotICAgIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3Ioc2l6ZV90IHNpemUpOwotICAgIH5TaW1wbGVCZXN0Rml0QWxsb2NhdG9yKCk7Ci0KLSAgICBzaXplX3QgICAgICBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MgPSAwKTsKLSAgICBzdGF0dXNfdCAgICBkZWFsbG9jYXRlKHNpemVfdCBvZmZzZXQpOwotICAgIHNpemVfdCAgICAgIHNpemUoKSBjb25zdDsKLSAgICB2b2lkICAgICAgICBkdW1wKGNvbnN0IGNoYXIqIHdoYXQpIGNvbnN0OwotICAgIHZvaWQgICAgICAgIGR1bXAoU3RyaW5nOCYgcmVzLCBjb25zdCBjaGFyKiB3aGF0KSBjb25zdDsKLQotcHJpdmF0ZToKLQotICAgIHN0cnVjdCBjaHVua190IHsKLSAgICAgICAgY2h1bmtfdChzaXplX3Qgc3RhcnQsIHNpemVfdCBzaXplKQotICAgICAgICA6IHN0YXJ0KHN0YXJ0KSwgc2l6ZShzaXplKSwgZnJlZSgxKSwgcHJldigwKSwgbmV4dCgwKSB7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzdGFydDsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBzaXplIDogMjg7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgZnJlZSA6IDQ7Ci0gICAgICAgIG11dGFibGUgY2h1bmtfdCogICAgcHJldjsKLSAgICAgICAgbXV0YWJsZSBjaHVua190KiAgICBuZXh0OwotICAgIH07Ci0KLSAgICBzc2l6ZV90ICBhbGxvYyhzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MpOwotICAgIGNodW5rX3QqIGRlYWxsb2Moc2l6ZV90IHN0YXJ0KTsKLSAgICB2b2lkICAgICBkdW1wX2woY29uc3QgY2hhciogd2hhdCkgY29uc3Q7Ci0gICAgdm9pZCAgICAgZHVtcF9sKFN0cmluZzgmIHJlcywgY29uc3QgY2hhciogd2hhdCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50ICAgIGtNZW1vcnlBbGlnbjsKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgIG1Mb2NrOwotICAgIExpbmtlZExpc3Q8Y2h1bmtfdD4gbUxpc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBtSGVhcFNpemU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUFsbG9jYXRpb246OkFsbG9jYXRpb24oCi0gICAgICAgIGNvbnN0IHNwPE1lbW9yeURlYWxlcj4mIGRlYWxlciwKLSAgICAgICAgY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwLCBzc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCi0gICAgOiBNZW1vcnlCYXNlKGhlYXAsIG9mZnNldCwgc2l6ZSksIG1EZWFsZXIoZGVhbGVyKQotewotI2lmbmRlZiBOREVCVUcKLSAgICB2b2lkKiBjb25zdCBzdGFydF9wdHIgPSAodm9pZCopKGludHB0cl90KGhlYXAtPmJhc2UoKSkgKyBvZmZzZXQpOwotICAgIG1lbXNldChzdGFydF9wdHIsIDB4ZGEsIHNpemUpOwotI2VuZGlmCi19Ci0KLUFsbG9jYXRpb246On5BbGxvY2F0aW9uKCkKLXsKLSAgICBzaXplX3QgZnJlZWRPZmZzZXQgPSBnZXRPZmZzZXQoKTsKLSAgICBzaXplX3QgZnJlZWRTaXplICAgPSBnZXRTaXplKCk7Ci0gICAgaWYgKGZyZWVkU2l6ZSkgewotICAgICAgICAvKiBOT1RFOiBpdCdzIFZFUlkgaW1wb3J0YW50IHRvIG5vdCBmcmVlIGFsbG9jYXRpb25zIG9mIHNpemUgMCBiZWNhdXNlCi0gICAgICAgICAqIHRoZXkncmUgc3BlY2lhbCBhcyB0aGV5IGRvbid0IGhhdmUgYW55IHJlY29yZCBpbiB0aGUgYWxsb2NhdG9yCi0gICAgICAgICAqIGFuZCBjb3VsZCBhbGlhcyBzb21lIHJlYWwgYWxsb2NhdGlvbiAodGhlaXIgb2Zmc2V0IGlzIHplcm8pLiAqLwotCi0gICAgICAgIC8vIGtlZXAgdGhlIHNpemUgdG8gdW5tYXAgaW4gZXhjZXNzCi0gICAgICAgIHNpemVfdCBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0gICAgICAgIHNpemVfdCBzdGFydCA9IGZyZWVkT2Zmc2V0OwotICAgICAgICBzaXplX3QgZW5kID0gc3RhcnQgKyBmcmVlZFNpemU7Ci0gICAgICAgIHN0YXJ0ICY9IH4ocGFnZXNpemUtMSk7Ci0gICAgICAgIGVuZCA9IChlbmQgKyBwYWdlc2l6ZS0xKSAmIH4ocGFnZXNpemUtMSk7Ci0KLSAgICAgICAgLy8gZ2l2ZSBiYWNrIHRvIHRoZSBrZXJuZWwgdGhlIHBhZ2VzIHdlIGRvbid0IG5lZWQKLSAgICAgICAgc2l6ZV90IGZyZWVfc3RhcnQgPSBmcmVlZE9mZnNldDsKLSAgICAgICAgc2l6ZV90IGZyZWVfZW5kID0gZnJlZV9zdGFydCArIGZyZWVkU2l6ZTsKLSAgICAgICAgaWYgKHN0YXJ0IDwgZnJlZV9zdGFydCkKLSAgICAgICAgICAgIHN0YXJ0ID0gZnJlZV9zdGFydDsKLSAgICAgICAgaWYgKGVuZCA+IGZyZWVfZW5kKQotICAgICAgICAgICAgZW5kID0gZnJlZV9lbmQ7Ci0gICAgICAgIHN0YXJ0ID0gKHN0YXJ0ICsgcGFnZXNpemUtMSkgJiB+KHBhZ2VzaXplLTEpOwotICAgICAgICBlbmQgJj0gfihwYWdlc2l6ZS0xKTsKLQotICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgIHZvaWQqIGNvbnN0IHN0YXJ0X3B0ciA9ICh2b2lkKikoaW50cHRyX3QoZ2V0SGVhcCgpLT5iYXNlKCkpICsgc3RhcnQpOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBlbmQtc3RhcnQ7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgICAgICBtZW1zZXQoc3RhcnRfcHRyLCAweGRmLCBzaXplKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAvLyBNQURWX1JFTU9WRSBpcyBub3QgZGVmaW5lZCBvbiBEYXBwZXIgYmFzZWQgR29vYnVudHUKLSNpZmRlZiBNQURWX1JFTU9WRQotICAgICAgICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyID0gbWFkdmlzZShzdGFydF9wdHIsIHNpemUsIE1BRFZfUkVNT1ZFKTsKLSAgICAgICAgICAgICAgICBBTE9HV19JRihlcnIsICJtYWR2aXNlKCVwLCAldSwgTUFEVl9SRU1PVkUpIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3B0ciwgc2l6ZSwgZXJyPDAgPyBzdHJlcnJvcihlcnJubykgOiAiT2siKTsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgZG9uZSBhZnRlciBtYWR2aXNlKE1BRFZfUkVNT1ZFKSwgb3RoZXJ3aXNlIG1hZHZpc2UoKQotICAgICAgICAvLyBtaWdodCBraWNrIG91dCB0aGUgbWVtb3J5IHJlZ2lvbiB0aGF0J3MgYWxsb2NhdGVkIGFuZC9vciB3cml0dGVuCi0gICAgICAgIC8vIHJpZ2h0IGFmdGVyIHRoZSBkZWFsbG9jYXRpb24uCi0gICAgICAgIG1EZWFsZXItPmRlYWxsb2NhdGUoZnJlZWRPZmZzZXQpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1NZW1vcnlEZWFsZXI6Ok1lbW9yeURlYWxlcihzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogbmFtZSkKLSAgICA6IG1IZWFwKG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCBuYW1lKSksCi0gICAgbUFsbG9jYXRvcihuZXcgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcihzaXplKSkKLXsgICAgCi19Ci0KLU1lbW9yeURlYWxlcjo6fk1lbW9yeURlYWxlcigpCi17Ci0gICAgZGVsZXRlIG1BbGxvY2F0b3I7Ci19Ci0KLXNwPElNZW1vcnk+IE1lbW9yeURlYWxlcjo6YWxsb2NhdGUoc2l6ZV90IHNpemUpCi17Ci0gICAgc3A8SU1lbW9yeT4gbWVtb3J5OwotICAgIGNvbnN0IHNzaXplX3Qgb2Zmc2V0ID0gYWxsb2NhdG9yKCktPmFsbG9jYXRlKHNpemUpOwotICAgIGlmIChvZmZzZXQgPj0gMCkgewotICAgICAgICBtZW1vcnkgPSBuZXcgQWxsb2NhdGlvbih0aGlzLCBoZWFwKCksIG9mZnNldCwgc2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBtZW1vcnk7Ci19Ci0KLXZvaWQgTWVtb3J5RGVhbGVyOjpkZWFsbG9jYXRlKHNpemVfdCBvZmZzZXQpCi17Ci0gICAgYWxsb2NhdG9yKCktPmRlYWxsb2NhdGUob2Zmc2V0KTsKLX0KLQotdm9pZCBNZW1vcnlEZWFsZXI6OmR1bXAoY29uc3QgY2hhciogd2hhdCkgY29uc3QKLXsKLSAgICBhbGxvY2F0b3IoKS0+ZHVtcCh3aGF0KTsKLX0KLQotY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBNZW1vcnlEZWFsZXI6OmhlYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IZWFwOwotfQotCi1TaW1wbGVCZXN0Rml0QWxsb2NhdG9yKiBNZW1vcnlEZWFsZXI6OmFsbG9jYXRvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFsbG9jYXRvcjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBhbGlnbiBhbGwgdGhlIG1lbW9yeSBibG9ja3Mgb24gYSBjYWNoZS1saW5lIGJvdW5kYXJ5Ci1jb25zdCBpbnQgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6a01lbW9yeUFsaWduID0gMzI7Ci0KLVNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OlNpbXBsZUJlc3RGaXRBbGxvY2F0b3Ioc2l6ZV90IHNpemUpCi17Ci0gICAgc2l6ZV90IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICBtSGVhcFNpemUgPSAoKHNpemUgKyBwYWdlc2l6ZS0xKSAmIH4ocGFnZXNpemUtMSkpOwotCi0gICAgY2h1bmtfdCogbm9kZSA9IG5ldyBjaHVua190KDAsIG1IZWFwU2l6ZSAvIGtNZW1vcnlBbGlnbik7Ci0gICAgbUxpc3QuaW5zZXJ0SGVhZChub2RlKTsKLX0KLQotU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6flNpbXBsZUJlc3RGaXRBbGxvY2F0b3IoKQotewotICAgIHdoaWxlKCFtTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgZGVsZXRlIG1MaXN0LnJlbW92ZShtTGlzdC5oZWFkKCkpOwotICAgIH0KLX0KLQotc2l6ZV90IFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OnNpemUoKSBjb25zdAotewotICAgIHJldHVybiBtSGVhcFNpemU7Ci19Ci0KLXNpemVfdCBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjphbGxvY2F0ZShzaXplX3Qgc2l6ZSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzc2l6ZV90IG9mZnNldCA9IGFsbG9jKHNpemUsIGZsYWdzKTsKLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi1zdGF0dXNfdCBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjpkZWFsbG9jYXRlKHNpemVfdCBvZmZzZXQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBjaHVua190IGNvbnN0ICogY29uc3QgZnJlZWQgPSBkZWFsbG9jKG9mZnNldCk7Ci0gICAgaWYgKGZyZWVkKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotfQotCi1zc2l6ZV90IFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmFsbG9jKHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBzaXplID0gKHNpemUgKyBrTWVtb3J5QWxpZ24tMSkgLyBrTWVtb3J5QWxpZ247Ci0gICAgY2h1bmtfdCogZnJlZV9jaHVuayA9IDA7Ci0gICAgY2h1bmtfdCogY3VyID0gbUxpc3QuaGVhZCgpOwotCi0gICAgc2l6ZV90IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICB3aGlsZSAoY3VyKSB7Ci0gICAgICAgIGludCBleHRyYSA9IDA7Ci0gICAgICAgIGlmIChmbGFncyAmIFBBR0VfQUxJR05FRCkKLSAgICAgICAgICAgIGV4dHJhID0gKCAtY3VyLT5zdGFydCAmICgocGFnZXNpemUva01lbW9yeUFsaWduKS0xKSApIDsKLQotICAgICAgICAvLyBiZXN0IGZpdAotICAgICAgICBpZiAoY3VyLT5mcmVlICYmIChjdXItPnNpemUgPj0gKHNpemUrZXh0cmEpKSkgewotICAgICAgICAgICAgaWYgKCghZnJlZV9jaHVuaykgfHwgKGN1ci0+c2l6ZSA8IGZyZWVfY2h1bmstPnNpemUpKSB7Ci0gICAgICAgICAgICAgICAgZnJlZV9jaHVuayA9IGN1cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjdXItPnNpemUgPT0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci0KLSAgICBpZiAoZnJlZV9jaHVuaykgewotICAgICAgICBjb25zdCBzaXplX3QgZnJlZV9zaXplID0gZnJlZV9jaHVuay0+c2l6ZTsKLSAgICAgICAgZnJlZV9jaHVuay0+ZnJlZSA9IDA7Ci0gICAgICAgIGZyZWVfY2h1bmstPnNpemUgPSBzaXplOwotICAgICAgICBpZiAoZnJlZV9zaXplID4gc2l6ZSkgewotICAgICAgICAgICAgaW50IGV4dHJhID0gMDsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIFBBR0VfQUxJR05FRCkKLSAgICAgICAgICAgICAgICBleHRyYSA9ICggLWZyZWVfY2h1bmstPnN0YXJ0ICYgKChwYWdlc2l6ZS9rTWVtb3J5QWxpZ24pLTEpICkgOwotICAgICAgICAgICAgaWYgKGV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgY2h1bmtfdCogc3BsaXQgPSBuZXcgY2h1bmtfdChmcmVlX2NodW5rLT5zdGFydCwgZXh0cmEpOwotICAgICAgICAgICAgICAgIGZyZWVfY2h1bmstPnN0YXJ0ICs9IGV4dHJhOwotICAgICAgICAgICAgICAgIG1MaXN0Lmluc2VydEJlZm9yZShmcmVlX2NodW5rLCBzcGxpdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dFX0lGKChmbGFncyZQQUdFX0FMSUdORUQpICYmIAotICAgICAgICAgICAgICAgICAgICAoKGZyZWVfY2h1bmstPnN0YXJ0KmtNZW1vcnlBbGlnbikmKHBhZ2VzaXplLTEpKSwKLSAgICAgICAgICAgICAgICAgICAgIlBBR0VfQUxJR05FRCByZXF1ZXN0ZWQsIGJ1dCBwYWdlIGlzIG5vdCBhbGlnbmVkISEhIik7Ci0KLSAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgdGFpbF9mcmVlID0gZnJlZV9zaXplIC0gKHNpemUrZXh0cmEpOwotICAgICAgICAgICAgaWYgKHRhaWxfZnJlZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjaHVua190KiBzcGxpdCA9IG5ldyBjaHVua190KAotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9jaHVuay0+c3RhcnQgKyBmcmVlX2NodW5rLT5zaXplLCB0YWlsX2ZyZWUpOwotICAgICAgICAgICAgICAgIG1MaXN0Lmluc2VydEFmdGVyKGZyZWVfY2h1bmssIHNwbGl0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGZyZWVfY2h1bmstPnN0YXJ0KSprTWVtb3J5QWxpZ247Ci0gICAgfQotICAgIHJldHVybiBOT19NRU1PUlk7Ci19Ci0KLVNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmNodW5rX3QqIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmRlYWxsb2Moc2l6ZV90IHN0YXJ0KQotewotICAgIHN0YXJ0ID0gc3RhcnQgLyBrTWVtb3J5QWxpZ247Ci0gICAgY2h1bmtfdCogY3VyID0gbUxpc3QuaGVhZCgpOwotICAgIHdoaWxlIChjdXIpIHsKLSAgICAgICAgaWYgKGN1ci0+c3RhcnQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIExPR19GQVRBTF9JRihjdXItPmZyZWUsCi0gICAgICAgICAgICAgICAgImJsb2NrIGF0IG9mZnNldCAweCUwOGxYIG9mIHNpemUgMHglMDhsWCBhbHJlYWR5IGZyZWVkIiwKLSAgICAgICAgICAgICAgICBjdXItPnN0YXJ0KmtNZW1vcnlBbGlnbiwgY3VyLT5zaXplKmtNZW1vcnlBbGlnbik7Ci0KLSAgICAgICAgICAgIC8vIG1lcmdlIGZyZWVkIGJsb2NrcyB0b2dldGhlcgotICAgICAgICAgICAgY2h1bmtfdCogZnJlZWQgPSBjdXI7Ci0gICAgICAgICAgICBjdXItPmZyZWUgPSAxOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNodW5rX3QqIGNvbnN0IHAgPSBjdXItPnByZXY7Ci0gICAgICAgICAgICAgICAgY2h1bmtfdCogY29uc3QgbiA9IGN1ci0+bmV4dDsKLSAgICAgICAgICAgICAgICBpZiAocCAmJiAocC0+ZnJlZSB8fCAhY3VyLT5zaXplKSkgewotICAgICAgICAgICAgICAgICAgICBmcmVlZCA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIHAtPnNpemUgKz0gY3VyLT5zaXplOwotICAgICAgICAgICAgICAgICAgICBtTGlzdC5yZW1vdmUoY3VyKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGN1cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyID0gbjsKLSAgICAgICAgICAgIH0gd2hpbGUgKGN1ciAmJiBjdXItPmZyZWUpOwotCi0gICAgICAgICAgICAjaWZuZGVmIE5ERUJVRwotICAgICAgICAgICAgICAgIGlmICghZnJlZWQtPmZyZWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVtcF9sKCJkZWFsbG9jICghZnJlZWQtPmZyZWUpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICBMT0dfRkFUQUxfSUYoIWZyZWVkLT5mcmVlLAotICAgICAgICAgICAgICAgICJmcmVlZCBibG9jayBhdCBvZmZzZXQgMHglMDhsWCBvZiBzaXplIDB4JTA4bFggaXMgbm90IGZyZWUhIiwKLSAgICAgICAgICAgICAgICBmcmVlZC0+c3RhcnQgKiBrTWVtb3J5QWxpZ24sIGZyZWVkLT5zaXplICoga01lbW9yeUFsaWduKTsKLQotICAgICAgICAgICAgcmV0dXJuIGZyZWVkOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6ZHVtcChjb25zdCBjaGFyKiB3aGF0KSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZHVtcF9sKHdoYXQpOwotfQotCi12b2lkIFNpbXBsZUJlc3RGaXRBbGxvY2F0b3I6OmR1bXBfbChjb25zdCBjaGFyKiB3aGF0KSBjb25zdAotewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIGR1bXBfbChyZXN1bHQsIHdoYXQpOwotICAgIEFMT0dEKCIlcyIsIHJlc3VsdC5zdHJpbmcoKSk7Ci19Ci0KLXZvaWQgU2ltcGxlQmVzdEZpdEFsbG9jYXRvcjo6ZHVtcChTdHJpbmc4JiByZXN1bHQsCi0gICAgICAgIGNvbnN0IGNoYXIqIHdoYXQpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBkdW1wX2wocmVzdWx0LCB3aGF0KTsKLX0KLQotdm9pZCBTaW1wbGVCZXN0Rml0QWxsb2NhdG9yOjpkdW1wX2woU3RyaW5nOCYgcmVzdWx0LAotICAgICAgICBjb25zdCBjaGFyKiB3aGF0KSBjb25zdAotewotICAgIHNpemVfdCBzaXplID0gMDsKLSAgICBpbnQzMl90IGkgPSAwOwotICAgIGNodW5rX3QgY29uc3QqIGN1ciA9IG1MaXN0LmhlYWQoKTsKLSAgICAKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICVzICglcCwgc2l6ZT0ldSlcbiIsCi0gICAgICAgICAgICB3aGF0LCB0aGlzLCAodW5zaWduZWQgaW50KW1IZWFwU2l6ZSk7Ci0gICAgCi0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgCi0gICAgd2hpbGUgKGN1cikgewotICAgICAgICBjb25zdCBjaGFyKiBlcnJzW10gPSB7IiIsICJ8IGxpbmsgYm9ndXMgTlAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IGxpbmsgYm9ndXMgUE4iLCAifCBsaW5rIGJvZ3VzIE5QK1BOIiB9OwotICAgICAgICBpbnQgbnAgPSAoKGN1ci0+bmV4dCkgJiYgY3VyLT5uZXh0LT5wcmV2ICE9IGN1cikgPyAxIDogMDsKLSAgICAgICAgaW50IHBuID0gKChjdXItPnByZXYpICYmIGN1ci0+cHJldi0+bmV4dCAhPSBjdXIpID8gMiA6IDA7Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlM3U6ICUwOHggfCAweCUwOFggfCAweCUwOFggfCAlcyAlc1xuIiwKLSAgICAgICAgICAgIGksIGludChjdXIpLCBpbnQoY3VyLT5zdGFydCprTWVtb3J5QWxpZ24pLAotICAgICAgICAgICAgaW50KGN1ci0+c2l6ZSprTWVtb3J5QWxpZ24pLAotICAgICAgICAgICAgICAgICAgICBpbnQoY3VyLT5mcmVlKSA/ICJGIiA6ICJBIiwKLSAgICAgICAgICAgICAgICAgICAgZXJyc1tucHxwbl0pOwotICAgICAgICAKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgICAgIGlmICghY3VyLT5mcmVlKQotICAgICAgICAgICAgc2l6ZSArPSBjdXItPnNpemUqa01lbW9yeUFsaWduOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgY3VyID0gY3VyLT5uZXh0OwotICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiICBzaXplIGFsbG9jYXRlZDogJXUgKCV1IEtCKVxuIiwgaW50KHNpemUpLCBpbnQoc2l6ZS8xMDI0KSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9NZW1vcnlIZWFwQmFzZS5jcHAgYi9saWJzL2JpbmRlci9NZW1vcnlIZWFwQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2JmMWMuLjAwMDAwMDAKLS0tIGEvbGlicy9iaW5kZXIvTWVtb3J5SGVhcEJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lbW9yeUhlYXBCYXNlIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0jaW5jbHVkZSA8bGludXgvYW5kcm9pZF9wbWVtLmg+Ci0jZW5kaWYKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1NZW1vcnlIZWFwQmFzZTo6TWVtb3J5SGVhcEJhc2UoKQotICAgIDogbUZEKC0xKSwgbVNpemUoMCksIG1CYXNlKE1BUF9GQUlMRUQpLAotICAgICAgbURldmljZShOVUxMKSwgbU5lZWRVbm1hcChmYWxzZSksIG1PZmZzZXQoMCkKLXsKLX0KLQotTWVtb3J5SGVhcEJhc2U6Ok1lbW9yeUhlYXBCYXNlKHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncywgY2hhciBjb25zdCAqIG5hbWUpCi0gICAgOiBtRkQoLTEpLCBtU2l6ZSgwKSwgbUJhc2UoTUFQX0ZBSUxFRCksIG1GbGFncyhmbGFncyksCi0gICAgICBtRGV2aWNlKDApLCBtTmVlZFVubWFwKGZhbHNlKSwgbU9mZnNldCgwKQotewotICAgIGNvbnN0IHNpemVfdCBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0gICAgc2l6ZSA9ICgoc2l6ZSArIHBhZ2VzaXplLTEpICYgfihwYWdlc2l6ZS0xKSk7Ci0gICAgaW50IGZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24obmFtZSA9PSBOVUxMID8gIk1lbW9yeUhlYXBCYXNlIiA6IG5hbWUsIHNpemUpOwotICAgIEFMT0dFX0lGKGZkPDAsICJlcnJvciBjcmVhdGluZyBhc2htZW0gcmVnaW9uOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgaWYgKG1hcGZkKGZkLCBzaXplKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaWYgKGZsYWdzICYgUkVBRF9PTkxZKSB7Ci0gICAgICAgICAgICAgICAgYXNobWVtX3NldF9wcm90X3JlZ2lvbihmZCwgUFJPVF9SRUFEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotTWVtb3J5SGVhcEJhc2U6Ok1lbW9yeUhlYXBCYXNlKGNvbnN0IGNoYXIqIGRldmljZSwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGZsYWdzKQotICAgIDogbUZEKC0xKSwgbVNpemUoMCksIG1CYXNlKE1BUF9GQUlMRUQpLCBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbURldmljZSgwKSwgbU5lZWRVbm1hcChmYWxzZSksIG1PZmZzZXQoMCkKLXsKLSAgICBpbnQgb3Blbl9mbGFncyA9IE9fUkRXUjsKLSAgICBpZiAoZmxhZ3MgJiBOT19DQUNISU5HKQotICAgICAgICBvcGVuX2ZsYWdzIHw9IE9fU1lOQzsKLQotICAgIGludCBmZCA9IG9wZW4oZGV2aWNlLCBvcGVuX2ZsYWdzKTsKLSAgICBBTE9HRV9JRihmZDwwLCAiZXJyb3Igb3BlbmluZyAlczogJXMiLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLSAgICAgICAgc2l6ZSA9ICgoc2l6ZSArIHBhZ2VzaXplLTEpICYgfihwYWdlc2l6ZS0xKSk7Ci0gICAgICAgIGlmIChtYXBmZChmZCwgc2l6ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLU1lbW9yeUhlYXBCYXNlOjpNZW1vcnlIZWFwQmFzZShpbnQgZmQsIHNpemVfdCBzaXplLCB1aW50MzJfdCBmbGFncywgdWludDMyX3Qgb2Zmc2V0KQotICAgIDogbUZEKC0xKSwgbVNpemUoMCksIG1CYXNlKE1BUF9GQUlMRUQpLCBtRmxhZ3MoZmxhZ3MpLAotICAgICAgbURldmljZSgwKSwgbU5lZWRVbm1hcChmYWxzZSksIG1PZmZzZXQoMCkKLXsKLSAgICBjb25zdCBzaXplX3QgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotICAgIHNpemUgPSAoKHNpemUgKyBwYWdlc2l6ZS0xKSAmIH4ocGFnZXNpemUtMSkpOwotICAgIG1hcGZkKGR1cChmZCksIHNpemUsIG9mZnNldCk7Ci19Ci0KLXN0YXR1c190IE1lbW9yeUhlYXBCYXNlOjppbml0KGludCBmZCwgdm9pZCAqYmFzZSwgaW50IHNpemUsIGludCBmbGFncywgY29uc3QgY2hhciogZGV2aWNlKQotewotICAgIGlmIChtRkQgIT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBtRkQgPSBmZDsKLSAgICBtQmFzZSA9IGJhc2U7Ci0gICAgbVNpemUgPSBzaXplOwotICAgIG1GbGFncyA9IGZsYWdzOwotICAgIG1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNZW1vcnlIZWFwQmFzZTo6bWFwZmQoaW50IGZkLCBzaXplX3Qgc2l6ZSwgdWludDMyX3Qgb2Zmc2V0KQotewotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgLy8gdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHNpemUgYXV0b21hdGljYWxseQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgICAgICAvLyBmaXJzdCB0cnkgdGhlIFBNRU0gaW9jdGwKLSAgICAgICAgcG1lbV9yZWdpb24gcmVnOwotICAgICAgICBpbnQgZXJyID0gaW9jdGwoZmQsIFBNRU1fR0VUX1RPVEFMX1NJWkUsICZyZWcpOwotICAgICAgICBpZiAoZXJyID09IDApCi0gICAgICAgICAgICBzaXplID0gcmVnLmxlbjsKLSNlbmRpZgotICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7IC8vIHRyeSBmc3RhdAotICAgICAgICAgICAgc3RydWN0IHN0YXQgc2I7Ci0gICAgICAgICAgICBpZiAoZnN0YXQoZmQsICZzYikgPT0gMCkKLSAgICAgICAgICAgICAgICBzaXplID0gc2Iuc3Rfc2l6ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBpdCBkaWRuJ3Qgd29yaywgbGV0IG1tYXAoKSBmYWlsLgotICAgIH0KLQotICAgIGlmICgobUZsYWdzICYgRE9OVF9NQVBfTE9DQUxMWSkgPT0gMCkgewotICAgICAgICB2b2lkKiBiYXNlID0gKHVpbnQ4X3QqKW1tYXAoMCwgc2l6ZSwKLSAgICAgICAgICAgICAgICBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIG9mZnNldCk7Ci0gICAgICAgIGlmIChiYXNlID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJtbWFwKGZkPSVkLCBzaXplPSV1KSBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgIGZkLCB1aW50MzJfdChzaXplKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgLy9BTE9HRCgibW1hcChmZD0lZCwgYmFzZT0lcCwgc2l6ZT0lbHUpIiwgZmQsIGJhc2UsIHNpemUpOwotICAgICAgICBtQmFzZSA9IGJhc2U7Ci0gICAgICAgIG1OZWVkVW5tYXAgPSB0cnVlOwotICAgIH0gZWxzZSAgewotICAgICAgICBtQmFzZSA9IDA7IC8vIG5vdCBNQVBfRkFJTEVECi0gICAgICAgIG1OZWVkVW5tYXAgPSBmYWxzZTsKLSAgICB9Ci0gICAgbUZEID0gZmQ7Ci0gICAgbVNpemUgPSBzaXplOwotICAgIG1PZmZzZXQgPSBvZmZzZXQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1NZW1vcnlIZWFwQmFzZTo6fk1lbW9yeUhlYXBCYXNlKCkKLXsKLSAgICBkaXNwb3NlKCk7Ci19Ci0KLXZvaWQgTWVtb3J5SGVhcEJhc2U6OmRpc3Bvc2UoKQotewotICAgIGludCBmZCA9IGFuZHJvaWRfYXRvbWljX29yKC0xLCAmbUZEKTsKLSAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICBpZiAobU5lZWRVbm1hcCkgewotICAgICAgICAgICAgLy9BTE9HRCgibXVubWFwKGZkPSVkLCBiYXNlPSVwLCBzaXplPSVsdSkiLCBmZCwgbUJhc2UsIG1TaXplKTsKLSAgICAgICAgICAgIG11bm1hcChtQmFzZSwgbVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1CYXNlID0gMDsKLSAgICAgICAgbVNpemUgPSAwOwotICAgICAgICBjbG9zZShmZCk7Ci0gICAgfQotfQotCi1pbnQgTWVtb3J5SGVhcEJhc2U6OmdldEhlYXBJRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZEOwotfQotCi12b2lkKiBNZW1vcnlIZWFwQmFzZTo6Z2V0QmFzZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUJhc2U7Ci19Ci0KLXNpemVfdCBNZW1vcnlIZWFwQmFzZTo6Z2V0U2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLXVpbnQzMl90IE1lbW9yeUhlYXBCYXNlOjpnZXRGbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZsYWdzOwotfQotCi1jb25zdCBjaGFyKiBNZW1vcnlIZWFwQmFzZTo6Z2V0RGV2aWNlKCkgY29uc3QgewotICAgIHJldHVybiBtRGV2aWNlOwotfQotCi11aW50MzJfdCBNZW1vcnlIZWFwQmFzZTo6Z2V0T2Zmc2V0KCkgY29uc3QgewotICAgIHJldHVybiBtT2Zmc2V0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9QYXJjZWwuY3BwIGIvbGlicy9iaW5kZXIvUGFyY2VsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhMTRiYi4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9QYXJjZWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJQYXJjZWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JwQmluZGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KLSNpbmNsdWRlIDx1dGlscy9GbGF0dGVuYWJsZS5oPgotI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvYmluZGVyL2JpbmRlcl9tb2R1bGUuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2lmbmRlZiBJTlQzMl9NQVgKLSNkZWZpbmUgSU5UMzJfTUFYICgoaW50MzJfdCkoMjE0NzQ4MzY0NykpCi0jZW5kaWYKLQotI2RlZmluZSBMT0dfUkVGUyguLi4pCi0vLyNkZWZpbmUgTE9HX1JFRlMoLi4uKSBBTE9HKExPR19ERUJVRywgIlBhcmNlbCIsIF9fVkFfQVJHU19fKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBQQURfU0laRShzKSAoKChzKSszKSZ+MykKLQotLy8gTm90ZTogbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YSdzIFBFTkFMVFlfR0FUSEVSCi0jZGVmaW5lIFNUUklDVF9NT0RFX1BFTkFMVFlfR0FUSEVSIDB4MTAwCi0KLS8vIE5vdGU6IG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggYW5kcm9pZC9vcy9QYXJjZWwuamF2YSdzIEVYX0hBU19SRVBMWV9IRUFERVIKLSNkZWZpbmUgRVhfSEFTX1JFUExZX0hFQURFUiAtMTI4Ci0KLS8vIE1heGltdW0gc2l6ZSBvZiBhIGJsb2IgdG8gdHJhbnNmZXIgaW4tcGxhY2UuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IElOX1BMQUNFX0JMT0JfTElNSVQgPSA0MCAqIDEwMjQ7Ci0KLS8vIFhYWCBUaGlzIGNhbiBiZSBtYWRlIHB1YmxpYyBpZiB3ZSB3YW50IHRvIHByb3ZpZGUKLS8vIHN1cHBvcnQgZm9yIHR5cGVkIGRhdGEuCi1zdHJ1Y3Qgc21hbGxfZmxhdF9kYXRhCi17Ci0gICAgdWludDMyX3QgdHlwZTsKLSAgICB1aW50MzJfdCBkYXRhOwotfTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIGFjcXVpcmVfb2JqZWN0KGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0JiBvYmosIGNvbnN0IHZvaWQqIHdobykKLXsKLSAgICBzd2l0Y2ggKG9iai50eXBlKSB7Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfQklOREVSOgotICAgICAgICAgICAgaWYgKG9iai5iaW5kZXIpIHsKLSAgICAgICAgICAgICAgICBMT0dfUkVGUygiUGFyY2VsICVwIGFjcXVpcmluZyByZWZlcmVuY2Ugb24gbG9jYWwgJXAiLCB3aG8sIG9iai5jb29raWUpOwotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElCaW5kZXIqPihvYmouY29va2llKS0+aW5jU3Ryb25nKHdobyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6Ci0gICAgICAgICAgICBpZiAob2JqLmJpbmRlcikKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqPihvYmouYmluZGVyKS0+aW5jV2Vhayh3aG8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX0hBTkRMRTogewotICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4gYiA9IHByb2MtPmdldFN0cm9uZ1Byb3h5Rm9ySGFuZGxlKG9iai5oYW5kbGUpOwotICAgICAgICAgICAgaWYgKGIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPR19SRUZTKCJQYXJjZWwgJXAgYWNxdWlyaW5nIHJlZmVyZW5jZSBvbiByZW1vdGUgJXAiLCB3aG8sIGIuZ2V0KCkpOwotICAgICAgICAgICAgICAgIGItPmluY1N0cm9uZyh3aG8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKLSAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+IGIgPSBwcm9jLT5nZXRXZWFrUHJveHlGb3JIYW5kbGUob2JqLmhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoYiAhPSBOVUxMKSBiLmdldF9yZWZzKCktPmluY1dlYWsod2hvKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX0ZEOiB7Ci0gICAgICAgICAgICAvLyBpbnRlbnRpb25hbGx5IGJsYW5rIC0tIG5vdGhpbmcgdG8gZG8gdG8gYWNxdWlyZSB0aGlzLCBidXQgd2UgZG8KLSAgICAgICAgICAgIC8vIHJlY29nbml6ZSBpdCBhcyBhIGxlZ2l0aW1hdGUgb2JqZWN0IHR5cGUuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HRCgiSW52YWxpZCBvYmplY3QgdHlwZSAweCUwOGx4Iiwgb2JqLnR5cGUpOwotfQotCi12b2lkIHJlbGVhc2Vfb2JqZWN0KGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0JiBvYmosIGNvbnN0IHZvaWQqIHdobykKLXsKLSAgICBzd2l0Y2ggKG9iai50eXBlKSB7Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfQklOREVSOgotICAgICAgICAgICAgaWYgKG9iai5iaW5kZXIpIHsKLSAgICAgICAgICAgICAgICBMT0dfUkVGUygiUGFyY2VsICVwIHJlbGVhc2luZyByZWZlcmVuY2Ugb24gbG9jYWwgJXAiLCB3aG8sIG9iai5jb29raWUpOwotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PElCaW5kZXIqPihvYmouY29va2llKS0+ZGVjU3Ryb25nKHdobyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfV0VBS19CSU5ERVI6Ci0gICAgICAgICAgICBpZiAob2JqLmJpbmRlcikKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxSZWZCYXNlOjp3ZWFrcmVmX3R5cGUqPihvYmouYmluZGVyKS0+ZGVjV2Vhayh3aG8pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX0hBTkRMRTogewotICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4gYiA9IHByb2MtPmdldFN0cm9uZ1Byb3h5Rm9ySGFuZGxlKG9iai5oYW5kbGUpOwotICAgICAgICAgICAgaWYgKGIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIExPR19SRUZTKCJQYXJjZWwgJXAgcmVsZWFzaW5nIHJlZmVyZW5jZSBvbiByZW1vdGUgJXAiLCB3aG8sIGIuZ2V0KCkpOwotICAgICAgICAgICAgICAgIGItPmRlY1N0cm9uZyh3aG8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQklOREVSX1RZUEVfV0VBS19IQU5ETEU6IHsKLSAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+IGIgPSBwcm9jLT5nZXRXZWFrUHJveHlGb3JIYW5kbGUob2JqLmhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoYiAhPSBOVUxMKSBiLmdldF9yZWZzKCktPmRlY1dlYWsod2hvKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX0ZEOiB7Ci0gICAgICAgICAgICBpZiAob2JqLmNvb2tpZSAhPSAodm9pZCopMCkgY2xvc2Uob2JqLmhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HRSgiSW52YWxpZCBvYmplY3QgdHlwZSAweCUwOGx4Iiwgb2JqLnR5cGUpOwotfQotCi1pbmxpbmUgc3RhdGljIHN0YXR1c190IGZpbmlzaF9mbGF0dGVuX2JpbmRlcigKLSAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLCBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QmIGZsYXQsIFBhcmNlbCogb3V0KQotewotICAgIHJldHVybiBvdXQtPndyaXRlT2JqZWN0KGZsYXQsIGZhbHNlKTsKLX0KLQotc3RhdHVzX3QgZmxhdHRlbl9iaW5kZXIoY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiYgcHJvYywKLSAgICBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLCBQYXJjZWwqIG91dCkKLXsKLSAgICBmbGF0X2JpbmRlcl9vYmplY3Qgb2JqOwotICAgIAotICAgIG9iai5mbGFncyA9IDB4N2YgfCBGTEFUX0JJTkRFUl9GTEFHX0FDQ0VQVFNfRkRTOwotICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICBJQmluZGVyICpsb2NhbCA9IGJpbmRlci0+bG9jYWxCaW5kZXIoKTsKLSAgICAgICAgaWYgKCFsb2NhbCkgewotICAgICAgICAgICAgQnBCaW5kZXIgKnByb3h5ID0gYmluZGVyLT5yZW1vdGVCaW5kZXIoKTsKLSAgICAgICAgICAgIGlmIChwcm94eSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm51bGwgcHJveHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaGFuZGxlID0gcHJveHkgPyBwcm94eS0+aGFuZGxlKCkgOiAwOwotICAgICAgICAgICAgb2JqLnR5cGUgPSBCSU5ERVJfVFlQRV9IQU5ETEU7Ci0gICAgICAgICAgICBvYmouaGFuZGxlID0gaGFuZGxlOwotICAgICAgICAgICAgb2JqLmNvb2tpZSA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvYmoudHlwZSA9IEJJTkRFUl9UWVBFX0JJTkRFUjsKLSAgICAgICAgICAgIG9iai5iaW5kZXIgPSBsb2NhbC0+Z2V0V2Vha1JlZnMoKTsKLSAgICAgICAgICAgIG9iai5jb29raWUgPSBsb2NhbDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9iai50eXBlID0gQklOREVSX1RZUEVfQklOREVSOwotICAgICAgICBvYmouYmluZGVyID0gTlVMTDsKLSAgICAgICAgb2JqLmNvb2tpZSA9IE5VTEw7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmaW5pc2hfZmxhdHRlbl9iaW5kZXIoYmluZGVyLCBvYmosIG91dCk7Ci19Ci0KLXN0YXR1c190IGZsYXR0ZW5fYmluZGVyKGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgY29uc3Qgd3A8SUJpbmRlcj4mIGJpbmRlciwgUGFyY2VsKiBvdXQpCi17Ci0gICAgZmxhdF9iaW5kZXJfb2JqZWN0IG9iajsKLSAgICAKLSAgICBvYmouZmxhZ3MgPSAweDdmIHwgRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUzsKLSAgICBpZiAoYmluZGVyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gcmVhbCA9IGJpbmRlci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChyZWFsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIElCaW5kZXIgKmxvY2FsID0gcmVhbC0+bG9jYWxCaW5kZXIoKTsKLSAgICAgICAgICAgIGlmICghbG9jYWwpIHsKLSAgICAgICAgICAgICAgICBCcEJpbmRlciAqcHJveHkgPSByZWFsLT5yZW1vdGVCaW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJveHkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgibnVsbCBwcm94eSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGhhbmRsZSA9IHByb3h5ID8gcHJveHktPmhhbmRsZSgpIDogMDsKLSAgICAgICAgICAgICAgICBvYmoudHlwZSA9IEJJTkRFUl9UWVBFX1dFQUtfSEFORExFOwotICAgICAgICAgICAgICAgIG9iai5oYW5kbGUgPSBoYW5kbGU7Ci0gICAgICAgICAgICAgICAgb2JqLmNvb2tpZSA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9iai50eXBlID0gQklOREVSX1RZUEVfV0VBS19CSU5ERVI7Ci0gICAgICAgICAgICAgICAgb2JqLmJpbmRlciA9IGJpbmRlci5nZXRfcmVmcygpOwotICAgICAgICAgICAgICAgIG9iai5jb29raWUgPSBiaW5kZXIudW5zYWZlX2dldCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZpbmlzaF9mbGF0dGVuX2JpbmRlcihyZWFsLCBvYmosIG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFhYWCBIb3cgdG8gZGVhbD8gIEluIG9yZGVyIHRvIGZsYXR0ZW4gdGhlIGdpdmVuIGJpbmRlciwKLSAgICAgICAgLy8gd2UgbmVlZCB0byBwcm9iZSBpdCBmb3IgaW5mb3JtYXRpb24sIHdoaWNoIHJlcXVpcmVzIGEgcHJpbWFyeQotICAgICAgICAvLyByZWZlcmVuY2UuLi4gIGJ1dCB3ZSBkb24ndCBoYXZlIG9uZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIE9wZW5CaW5kZXIgaW1wbGVtZW50YXRpb24gdXNlcyBhIGR5bmFtaWNfY2FzdDw+IGhlcmUsCi0gICAgICAgIC8vIGJ1dCB3ZSBjYW4ndCBkbyB0aGF0IHdpdGggdGhlIGRpZmZlcmVudCByZWZlcmVuY2UgY291bnRpbmcKLSAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gd2UgYXJlIHVzaW5nLgotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHVuZmxhdHRlbiBCaW5kZXIgd2VhayByZWZlcmVuY2UhIik7Ci0gICAgICAgIG9iai50eXBlID0gQklOREVSX1RZUEVfQklOREVSOwotICAgICAgICBvYmouYmluZGVyID0gTlVMTDsKLSAgICAgICAgb2JqLmNvb2tpZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmaW5pc2hfZmxhdHRlbl9iaW5kZXIoTlVMTCwgb2JqLCBvdXQpOwotICAgIAotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9iai50eXBlID0gQklOREVSX1RZUEVfQklOREVSOwotICAgICAgICBvYmouYmluZGVyID0gTlVMTDsKLSAgICAgICAgb2JqLmNvb2tpZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBmaW5pc2hfZmxhdHRlbl9iaW5kZXIoTlVMTCwgb2JqLCBvdXQpOwotICAgIH0KLX0KLQotaW5saW5lIHN0YXRpYyBzdGF0dXNfdCBmaW5pc2hfdW5mbGF0dGVuX2JpbmRlcigKLSAgICBCcEJpbmRlciogcHJveHksIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgZmxhdCwgY29uc3QgUGFyY2VsJiBpbikKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0gICAgCi1zdGF0dXNfdCB1bmZsYXR0ZW5fYmluZGVyKGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4mIHByb2MsCi0gICAgY29uc3QgUGFyY2VsJiBpbiwgc3A8SUJpbmRlcj4qIG91dCkKLXsKLSAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIGZsYXQgPSBpbi5yZWFkT2JqZWN0KGZhbHNlKTsKLSAgICAKLSAgICBpZiAoZmxhdCkgewotICAgICAgICBzd2l0Y2ggKGZsYXQtPnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQklOREVSX1RZUEVfQklOREVSOgotICAgICAgICAgICAgICAgICpvdXQgPSBzdGF0aWNfY2FzdDxJQmluZGVyKj4oZmxhdC0+Y29va2llKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoX3VuZmxhdHRlbl9iaW5kZXIoTlVMTCwgKmZsYXQsIGluKTsKLSAgICAgICAgICAgIGNhc2UgQklOREVSX1RZUEVfSEFORExFOgotICAgICAgICAgICAgICAgICpvdXQgPSBwcm9jLT5nZXRTdHJvbmdQcm94eUZvckhhbmRsZShmbGF0LT5oYW5kbGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBmaW5pc2hfdW5mbGF0dGVuX2JpbmRlcigKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnBCaW5kZXIqPihvdXQtPmdldCgpKSwgKmZsYXQsIGluKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotICAgIHJldHVybiBCQURfVFlQRTsKLX0KLQotc3RhdHVzX3QgdW5mbGF0dGVuX2JpbmRlcihjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAotICAgIGNvbnN0IFBhcmNlbCYgaW4sIHdwPElCaW5kZXI+KiBvdXQpCi17Ci0gICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0ID0gaW4ucmVhZE9iamVjdChmYWxzZSk7Ci0gICAgCi0gICAgaWYgKGZsYXQpIHsKLSAgICAgICAgc3dpdGNoIChmbGF0LT50eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX0JJTkRFUjoKLSAgICAgICAgICAgICAgICAqb3V0ID0gc3RhdGljX2Nhc3Q8SUJpbmRlcio+KGZsYXQtPmNvb2tpZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaF91bmZsYXR0ZW5fYmluZGVyKE5VTEwsICpmbGF0LCBpbik7Ci0gICAgICAgICAgICBjYXNlIEJJTkRFUl9UWVBFX1dFQUtfQklOREVSOgotICAgICAgICAgICAgICAgIGlmIChmbGF0LT5iaW5kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBvdXQtPnNldF9vYmplY3RfYW5kX3JlZnMoCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxJQmluZGVyKj4oZmxhdC0+Y29va2llKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlZkJhc2U6OndlYWtyZWZfdHlwZSo+KGZsYXQtPmJpbmRlcikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICpvdXQgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmluaXNoX3VuZmxhdHRlbl9iaW5kZXIoTlVMTCwgKmZsYXQsIGluKTsKLSAgICAgICAgICAgIGNhc2UgQklOREVSX1RZUEVfSEFORExFOgotICAgICAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9XRUFLX0hBTkRMRToKLSAgICAgICAgICAgICAgICAqb3V0ID0gcHJvYy0+Z2V0V2Vha1Byb3h5Rm9ySGFuZGxlKGZsYXQtPmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaF91bmZsYXR0ZW5fYmluZGVyKAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxCcEJpbmRlcio+KG91dC0+dW5zYWZlX2dldCgpKSwgKmZsYXQsIGluKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQkFEX1RZUEU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QYXJjZWw6OlBhcmNlbCgpCi17Ci0gICAgaW5pdFN0YXRlKCk7Ci19Ci0KLVBhcmNlbDo6flBhcmNlbCgpCi17Ci0gICAgZnJlZURhdGFOb0luaXQoKTsKLX0KLQotY29uc3QgdWludDhfdCogUGFyY2VsOjpkYXRhKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbURhdGE7Ci19Ci0KLXNpemVfdCBQYXJjZWw6OmRhdGFTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKG1EYXRhU2l6ZSA+IG1EYXRhUG9zID8gbURhdGFTaXplIDogbURhdGFQb3MpOwotfQotCi1zaXplX3QgUGFyY2VsOjpkYXRhQXZhaWwoKSBjb25zdAotewotICAgIC8vIFRPRE86IGRlY2lkZSB3aGF0IHRvIGRvIGFib3V0IHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgY2FuCi0gICAgLy8gcmVwb3J0IGFuIGF2YWlsYWJsZS1kYXRhIHNpemUgdGhhdCBleGNlZWRzIGEgSmF2YSBpbnQncyBtYXgKLSAgICAvLyBwb3NpdGl2ZSB2YWx1ZSwgY2F1c2luZyBoYXZvYy4gIEZvcnR1bmF0ZWx5IHRoaXMgd2lsbCBvbmx5Ci0gICAgLy8gaGFwcGVuIGlmIHNvbWVvbmUgY29uc3RydWN0cyBhIFBhcmNlbCBjb250YWluaW5nIG1vcmUgdGhhbiB0d28KLSAgICAvLyBnaWdhYnl0ZXMgb2YgZGF0YSwgd2hpY2ggb24gdHlwaWNhbCBwaG9uZSBoYXJkd2FyZSBpcyBzaW1wbHkKLSAgICAvLyBub3QgcG9zc2libGUuCi0gICAgcmV0dXJuIGRhdGFTaXplKCkgLSBkYXRhUG9zaXRpb24oKTsKLX0KLQotc2l6ZV90IFBhcmNlbDo6ZGF0YVBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbURhdGFQb3M7Ci19Ci0KLXNpemVfdCBQYXJjZWw6OmRhdGFDYXBhY2l0eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1EYXRhQ2FwYWNpdHk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6c2V0RGF0YVNpemUoc2l6ZV90IHNpemUpCi17Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGVyciA9IGNvbnRpbnVlV3JpdGUoc2l6ZSk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBtRGF0YVNpemUgPSBzaXplOwotICAgICAgICBBTE9HVigic2V0RGF0YVNpemUgU2V0dGluZyBkYXRhIHNpemUgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgUGFyY2VsOjpzZXREYXRhUG9zaXRpb24oc2l6ZV90IHBvcykgY29uc3QKLXsKLSAgICBtRGF0YVBvcyA9IHBvczsKLSAgICBtTmV4dE9iamVjdEhpbnQgPSAwOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OnNldERhdGFDYXBhY2l0eShzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAoc2l6ZSA+IG1EYXRhQ2FwYWNpdHkpIHJldHVybiBjb250aW51ZVdyaXRlKHNpemUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpzZXREYXRhKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGxlbikKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSByZXN0YXJ0V3JpdGUobGVuKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1lbWNweShjb25zdF9jYXN0PHVpbnQ4X3QqPihkYXRhKCkpLCBidWZmZXIsIGxlbik7Ci0gICAgICAgIG1EYXRhU2l6ZSA9IGxlbjsKLSAgICAgICAgbUZkc0tub3duID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6YXBwZW5kRnJvbShjb25zdCBQYXJjZWwgKnBhcmNlbCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbikKLXsKLSAgICBjb25zdCBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwotICAgIHN0YXR1c190IGVycjsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gcGFyY2VsLT5tRGF0YTsKLSAgICBjb25zdCBzaXplX3QgKm9iamVjdHMgPSBwYXJjZWwtPm1PYmplY3RzOwotICAgIHNpemVfdCBzaXplID0gcGFyY2VsLT5tT2JqZWN0c1NpemU7Ci0gICAgaW50IHN0YXJ0UG9zID0gbURhdGFQb3M7Ci0gICAgaW50IGZpcnN0SW5kZXggPSAtMSwgbGFzdEluZGV4ID0gLTI7Ci0KLSAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIHJhbmdlIGNoZWNrcyBhZ2FpbnN0IHRoZSBzb3VyY2UgcGFyY2VsIHNpemUKLSAgICBpZiAoKG9mZnNldCA+IHBhcmNlbC0+bURhdGFTaXplKQotICAgICAgICAgICAgfHwgKGxlbiA+IHBhcmNlbC0+bURhdGFTaXplKQotICAgICAgICAgICAgfHwgKG9mZnNldCArIGxlbiA+IHBhcmNlbC0+bURhdGFTaXplKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIC8vIENvdW50IG9iamVjdHMgaW4gcmFuZ2UKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpIHNpemU7IGkrKykgewotICAgICAgICBzaXplX3Qgb2ZmID0gb2JqZWN0c1tpXTsKLSAgICAgICAgaWYgKChvZmYgPj0gb2Zmc2V0KSAmJiAob2ZmIDwgb2Zmc2V0ICsgbGVuKSkgewotICAgICAgICAgICAgaWYgKGZpcnN0SW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBmaXJzdEluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxhc3RJbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IG51bU9iamVjdHMgPSBsYXN0SW5kZXggLSBmaXJzdEluZGV4ICsgMTsKLQotICAgIGlmICgobURhdGFTaXplK2xlbikgPiBtRGF0YUNhcGFjaXR5KSB7Ci0gICAgICAgIC8vIGdyb3cgZGF0YQotICAgICAgICBlcnIgPSBncm93RGF0YShsZW4pOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gYXBwZW5kIGRhdGEKLSAgICBtZW1jcHkobURhdGEgKyBtRGF0YVBvcywgZGF0YSArIG9mZnNldCwgbGVuKTsKLSAgICBtRGF0YVBvcyArPSBsZW47Ci0gICAgbURhdGFTaXplICs9IGxlbjsKLQotICAgIGVyciA9IE5PX0VSUk9SOwotCi0gICAgaWYgKG51bU9iamVjdHMgPiAwKSB7Ci0gICAgICAgIC8vIGdyb3cgb2JqZWN0cwotICAgICAgICBpZiAobU9iamVjdHNDYXBhY2l0eSA8IG1PYmplY3RzU2l6ZSArIG51bU9iamVjdHMpIHsKLSAgICAgICAgICAgIGludCBuZXdTaXplID0gKChtT2JqZWN0c1NpemUgKyBudW1PYmplY3RzKSozKS8yOwotICAgICAgICAgICAgc2l6ZV90ICpvYmplY3RzID0KLSAgICAgICAgICAgICAgICAoc2l6ZV90KilyZWFsbG9jKG1PYmplY3RzLCBuZXdTaXplKnNpemVvZihzaXplX3QpKTsKLSAgICAgICAgICAgIGlmIChvYmplY3RzID09IChzaXplX3QqKTApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU9iamVjdHMgPSBvYmplY3RzOwotICAgICAgICAgICAgbU9iamVjdHNDYXBhY2l0eSA9IG5ld1NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGFwcGVuZCBhbmQgYWNxdWlyZSBvYmplY3RzCi0gICAgICAgIGludCBpZHggPSBtT2JqZWN0c1NpemU7Ci0gICAgICAgIGZvciAoaW50IGkgPSBmaXJzdEluZGV4OyBpIDw9IGxhc3RJbmRleDsgaSsrKSB7Ci0gICAgICAgICAgICBzaXplX3Qgb2ZmID0gb2JqZWN0c1tpXSAtIG9mZnNldCArIHN0YXJ0UG9zOwotICAgICAgICAgICAgbU9iamVjdHNbaWR4KytdID0gb2ZmOwotICAgICAgICAgICAgbU9iamVjdHNTaXplKys7Ci0KLSAgICAgICAgICAgIGZsYXRfYmluZGVyX29iamVjdCogZmxhdAotICAgICAgICAgICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxmbGF0X2JpbmRlcl9vYmplY3QqPihtRGF0YSArIG9mZik7Ci0gICAgICAgICAgICBhY3F1aXJlX29iamVjdChwcm9jLCAqZmxhdCwgdGhpcyk7Ci0KLSAgICAgICAgICAgIGlmIChmbGF0LT50eXBlID09IEJJTkRFUl9UWVBFX0ZEKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGZpbGUgZGVzY3JpcHRvciwgd2UgbmVlZCB0byBkdXAgaXQgc28gdGhlCi0gICAgICAgICAgICAgICAgLy8gbmV3IFBhcmNlbCBub3cgb3ducyBpdHMgb3duIGZkLCBhbmQgY2FuIGRlY2xhcmUgdGhhdCB3ZQotICAgICAgICAgICAgICAgIC8vIG9mZmljaWFsbHkga25vdyB3ZSBoYXZlIGZkcy4KLSAgICAgICAgICAgICAgICBmbGF0LT5oYW5kbGUgPSBkdXAoZmxhdC0+aGFuZGxlKTsKLSAgICAgICAgICAgICAgICBmbGF0LT5jb29raWUgPSAodm9pZCopMTsKLSAgICAgICAgICAgICAgICBtSGFzRmRzID0gbUZkc0tub3duID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoIW1BbGxvd0ZkcykgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBGRFNfTk9UX0FMTE9XRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotYm9vbCBQYXJjZWw6OnB1c2hBbGxvd0Zkcyhib29sIGFsbG93RmRzKQotewotICAgIGNvbnN0IGJvb2wgb3JpZ1ZhbHVlID0gbUFsbG93RmRzOwotICAgIGlmICghYWxsb3dGZHMpIHsKLSAgICAgICAgbUFsbG93RmRzID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBvcmlnVmFsdWU7Ci19Ci0KLXZvaWQgUGFyY2VsOjpyZXN0b3JlQWxsb3dGZHMoYm9vbCBsYXN0VmFsdWUpCi17Ci0gICAgbUFsbG93RmRzID0gbGFzdFZhbHVlOwotfQotCi1ib29sIFBhcmNlbDo6aGFzRmlsZURlc2NyaXB0b3JzKCkgY29uc3QKLXsKLSAgICBpZiAoIW1GZHNLbm93bikgewotICAgICAgICBzY2FuRm9yRmRzKCk7Ci0gICAgfQotICAgIHJldHVybiBtSGFzRmRzOwotfQotCi0vLyBXcml0ZSBSUEMgaGVhZGVycy4gIChwcmV2aW91c2x5IGp1c3QgdGhlIGludGVyZmFjZSB0b2tlbikKLXN0YXR1c190IFBhcmNlbDo6d3JpdGVJbnRlcmZhY2VUb2tlbihjb25zdCBTdHJpbmcxNiYgaW50ZXJmYWNlKQotewotICAgIHdyaXRlSW50MzIoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0U3RyaWN0TW9kZVBvbGljeSgpIHwKLSAgICAgICAgICAgICAgIFNUUklDVF9NT0RFX1BFTkFMVFlfR0FUSEVSKTsKLSAgICAvLyBjdXJyZW50bHkgdGhlIGludGVyZmFjZSBpZGVudGlmaWNhdGlvbiB0b2tlbiBpcyBqdXN0IGl0cyBuYW1lIGFzIGEgc3RyaW5nCi0gICAgcmV0dXJuIHdyaXRlU3RyaW5nMTYoaW50ZXJmYWNlKTsKLX0KLQotYm9vbCBQYXJjZWw6OmNoZWNrSW50ZXJmYWNlKElCaW5kZXIqIGJpbmRlcikgY29uc3QKLXsKLSAgICByZXR1cm4gZW5mb3JjZUludGVyZmFjZShiaW5kZXItPmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci19Ci0KLWJvb2wgUGFyY2VsOjplbmZvcmNlSW50ZXJmYWNlKGNvbnN0IFN0cmluZzE2JiBpbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZSogdGhyZWFkU3RhdGUpIGNvbnN0Ci17Ci0gICAgaW50MzJfdCBzdHJpY3RQb2xpY3kgPSByZWFkSW50MzIoKTsKLSAgICBpZiAodGhyZWFkU3RhdGUgPT0gTlVMTCkgewotICAgICAgICB0aHJlYWRTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgfQotICAgIGlmICgodGhyZWFkU3RhdGUtPmdldExhc3RUcmFuc2FjdGlvbkJpbmRlckZsYWdzKCkgJgotICAgICAgICAgSUJpbmRlcjo6RkxBR19PTkVXQVkpICE9IDApIHsKLSAgICAgIC8vIEZvciBvbmUtd2F5IGNhbGxzLCB0aGUgY2FsbGVlIGlzIHJ1bm5pbmcgZW50aXJlbHkKLSAgICAgIC8vIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBjYWxsZXIsIHNvIGRpc2FibGUgU3RyaWN0TW9kZSBlbnRpcmVseS4KLSAgICAgIC8vIE5vdCBvbmx5IGRvZXMgZGlzay9uZXR3b3JrIHVzYWdlIG5vdCBpbXBhY3QgdGhlIGNhbGxlciwgYnV0Ci0gICAgICAvLyB0aGVyZSdzIG5vIHdheSB0byBjb21tdWljYXRlIGJhY2sgYW55IHZpb2xhdGlvbnMgYW55d2F5LgotICAgICAgdGhyZWFkU3RhdGUtPnNldFN0cmljdE1vZGVQb2xpY3koMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocmVhZFN0YXRlLT5zZXRTdHJpY3RNb2RlUG9saWN5KHN0cmljdFBvbGljeSk7Ci0gICAgfQotICAgIGNvbnN0IFN0cmluZzE2IHN0cihyZWFkU3RyaW5nMTYoKSk7Ci0gICAgaWYgKHN0ciA9PSBpbnRlcmZhY2UpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIioqKiogZW5mb3JjZUludGVyZmFjZSgpIGV4cGVjdGVkICclcycgYnV0IHJlYWQgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICBTdHJpbmc4KGludGVyZmFjZSkuc3RyaW5nKCksIFN0cmluZzgoc3RyKS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLWNvbnN0IHNpemVfdCogUGFyY2VsOjpvYmplY3RzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU9iamVjdHM7Ci19Ci0KLXNpemVfdCBQYXJjZWw6Om9iamVjdHNDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1PYmplY3RzU2l6ZTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjplcnJvckNoZWNrKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbUVycm9yOwotfQotCi12b2lkIFBhcmNlbDo6c2V0RXJyb3Ioc3RhdHVzX3QgZXJyKQotewotICAgIG1FcnJvciA9IGVycjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpmaW5pc2hXcml0ZShzaXplX3QgbGVuKQotewotICAgIC8vcHJpbnRmKCJGaW5pc2ggd3JpdGUgb2YgJWRcbiIsIGxlbik7Ci0gICAgbURhdGFQb3MgKz0gbGVuOwotICAgIEFMT0dWKCJmaW5pc2hXcml0ZSBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgaWYgKG1EYXRhUG9zID4gbURhdGFTaXplKSB7Ci0gICAgICAgIG1EYXRhU2l6ZSA9IG1EYXRhUG9zOwotICAgICAgICBBTE9HVigiZmluaXNoV3JpdGUgU2V0dGluZyBkYXRhIHNpemUgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhU2l6ZSk7Ci0gICAgfQotICAgIC8vcHJpbnRmKCJOZXcgcG9zPSVkLCBzaXplPSVkXG4iLCBtRGF0YVBvcywgbURhdGFTaXplKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVVbnBhZGRlZChjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuKQotewotICAgIHNpemVfdCBlbmQgPSBtRGF0YVBvcyArIGxlbjsKLSAgICBpZiAoZW5kIDwgbURhdGFQb3MpIHsKLSAgICAgICAgLy8gaW50ZWdlciBvdmVyZmxvdwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChlbmQgPD0gbURhdGFDYXBhY2l0eSkgewotcmVzdGFydF93cml0ZToKLSAgICAgICAgbWVtY3B5KG1EYXRhK21EYXRhUG9zLCBkYXRhLCBsZW4pOwotICAgICAgICByZXR1cm4gZmluaXNoV3JpdGUobGVuKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBncm93RGF0YShsZW4pOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIGdvdG8gcmVzdGFydF93cml0ZTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW4pCi17Ci0gICAgdm9pZCogY29uc3QgZCA9IHdyaXRlSW5wbGFjZShsZW4pOwotICAgIGlmIChkKSB7Ci0gICAgICAgIG1lbWNweShkLCBkYXRhLCBsZW4pOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBtRXJyb3I7Ci19Ci0KLXZvaWQqIFBhcmNlbDo6d3JpdGVJbnBsYWNlKHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3Qgc2l6ZV90IHBhZGRlZCA9IFBBRF9TSVpFKGxlbik7Ci0KLSAgICAvLyBzYW5pdHkgY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cKLSAgICBpZiAobURhdGFQb3MrcGFkZGVkIDwgbURhdGFQb3MpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKChtRGF0YVBvcytwYWRkZWQpIDw9IG1EYXRhQ2FwYWNpdHkpIHsKLXJlc3RhcnRfd3JpdGU6Ci0gICAgICAgIC8vcHJpbnRmKCJXcml0aW5nICVsZCBieXRlcywgcGFkZGVkIHRvICVsZFxuIiwgbGVuLCBwYWRkZWQpOwotICAgICAgICB1aW50OF90KiBjb25zdCBkYXRhID0gbURhdGErbURhdGFQb3M7Ci0KLSAgICAgICAgLy8gTmVlZCB0byBwYWQgYXQgZW5kPwotICAgICAgICBpZiAocGFkZGVkICE9IGxlbikgewotI2lmIEJZVEVfT1JERVIgPT0gQklHX0VORElBTgotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1hc2tbNF0gPSB7Ci0gICAgICAgICAgICAgICAgMHgwMDAwMDAwMCwgMHhmZmZmZmYwMCwgMHhmZmZmMDAwMCwgMHhmZjAwMDAwMAotICAgICAgICAgICAgfTsKLSNlbmRpZgotI2lmIEJZVEVfT1JERVIgPT0gTElUVExFX0VORElBTgotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1hc2tbNF0gPSB7Ci0gICAgICAgICAgICAgICAgMHgwMDAwMDAwMCwgMHgwMGZmZmZmZiwgMHgwMDAwZmZmZiwgMHgwMDAwMDBmZgotICAgICAgICAgICAgfTsKLSNlbmRpZgotICAgICAgICAgICAgLy9wcmludGYoIkFwcGx5aW5nIHBhZCBtYXNrOiAlcCB0byAlcFxuIiwgKHZvaWQqKW1hc2tbcGFkZGVkLWxlbl0sCi0gICAgICAgICAgICAvLyAgICAqcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KGRhdGErcGFkZGVkLTQpKTsKLSAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGF0YStwYWRkZWQtNCkgJj0gbWFza1twYWRkZWQtbGVuXTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmlzaFdyaXRlKHBhZGRlZCk7Ci0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IGdyb3dEYXRhKHBhZGRlZCk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgZ290byByZXN0YXJ0X3dyaXRlOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlSW50MzIoaW50MzJfdCB2YWwpCi17Ci0gICAgcmV0dXJuIHdyaXRlQWxpZ25lZCh2YWwpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlSW50NjQoaW50NjRfdCB2YWwpCi17Ci0gICAgcmV0dXJuIHdyaXRlQWxpZ25lZCh2YWwpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlRmxvYXQoZmxvYXQgdmFsKQotewotICAgIHJldHVybiB3cml0ZUFsaWduZWQodmFsKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZURvdWJsZShkb3VibGUgdmFsKQotewotICAgIHJldHVybiB3cml0ZUFsaWduZWQodmFsKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZUludFB0cihpbnRwdHJfdCB2YWwpCi17Ci0gICAgcmV0dXJuIHdyaXRlQWxpZ25lZCh2YWwpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlQ1N0cmluZyhjb25zdCBjaGFyKiBzdHIpCi17Ci0gICAgcmV0dXJuIHdyaXRlKHN0ciwgc3RybGVuKHN0cikrMSk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVTdHJpbmc4KGNvbnN0IFN0cmluZzgmIHN0cikKLXsKLSAgICBzdGF0dXNfdCBlcnIgPSB3cml0ZUludDMyKHN0ci5ieXRlcygpKTsKLSAgICAvLyBvbmx5IHdyaXRlIHN0cmluZyBpZiBpdHMgbGVuZ3RoIGlzIG1vcmUgdGhhbiB6ZXJvIGNoYXJhY3RlcnMsCi0gICAgLy8gYXMgcmVhZFN0cmluZzggd2lsbCBvbmx5IHJlYWQgaWYgdGhlIGxlbmd0aCBmaWVsZCBpcyBub24temVyby4KLSAgICAvLyB0aGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIGhvdyB3cml0ZVN0cmluZzE2IHdvcmtzLgotICAgIGlmIChzdHIuYnl0ZXMoKSA+IDAgJiYgZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGVyciA9IHdyaXRlKHN0ci5zdHJpbmcoKSwgc3RyLmJ5dGVzKCkrMSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVTdHJpbmcxNihjb25zdCBTdHJpbmcxNiYgc3RyKQotewotICAgIHJldHVybiB3cml0ZVN0cmluZzE2KHN0ci5zdHJpbmcoKSwgc3RyLnNpemUoKSk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVTdHJpbmcxNihjb25zdCBjaGFyMTZfdCogc3RyLCBzaXplX3QgbGVuKQotewotICAgIGlmIChzdHIgPT0gTlVMTCkgcmV0dXJuIHdyaXRlSW50MzIoLTEpOwotICAgIAotICAgIHN0YXR1c190IGVyciA9IHdyaXRlSW50MzIobGVuKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGxlbiAqPSBzaXplb2YoY2hhcjE2X3QpOwotICAgICAgICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKXdyaXRlSW5wbGFjZShsZW4rc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICBtZW1jcHkoZGF0YSwgc3RyLCBsZW4pOwotICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcjE2X3QqPihkYXRhK2xlbikgPSAwOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGVyciA9IG1FcnJvcjsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVN0cm9uZ0JpbmRlcihjb25zdCBzcDxJQmluZGVyPiYgdmFsKQotewotICAgIHJldHVybiBmbGF0dGVuX2JpbmRlcihQcm9jZXNzU3RhdGU6OnNlbGYoKSwgdmFsLCB0aGlzKTsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZVdlYWtCaW5kZXIoY29uc3Qgd3A8SUJpbmRlcj4mIHZhbCkKLXsKLSAgICByZXR1cm4gZmxhdHRlbl9iaW5kZXIoUHJvY2Vzc1N0YXRlOjpzZWxmKCksIHZhbCwgdGhpcyk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVOYXRpdmVIYW5kbGUoY29uc3QgbmF0aXZlX2hhbmRsZSogaGFuZGxlKQotewotICAgIGlmICghaGFuZGxlIHx8IGhhbmRsZS0+dmVyc2lvbiAhPSBzaXplb2YobmF0aXZlX2hhbmRsZSkpCi0gICAgICAgIHJldHVybiBCQURfVFlQRTsKLQotICAgIHN0YXR1c190IGVycjsKLSAgICBlcnIgPSB3cml0ZUludDMyKGhhbmRsZS0+bnVtRmRzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSByZXR1cm4gZXJyOwotCi0gICAgZXJyID0gd3JpdGVJbnQzMihoYW5kbGUtPm51bUludHMpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0KLSAgICBmb3IgKGludCBpPTAgOyBlcnI9PU5PX0VSUk9SICYmIGk8aGFuZGxlLT5udW1GZHMgOyBpKyspCi0gICAgICAgIGVyciA9IHdyaXRlRHVwRmlsZURlc2NyaXB0b3IoaGFuZGxlLT5kYXRhW2ldKTsKLQotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0QoIndyaXRlIG5hdGl2ZSBoYW5kbGUsIHdyaXRlIGR1cCBmZCBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgZXJyID0gd3JpdGUoaGFuZGxlLT5kYXRhICsgaGFuZGxlLT5udW1GZHMsIHNpemVvZihpbnQpKmhhbmRsZS0+bnVtSW50cyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZUZpbGVEZXNjcmlwdG9yKGludCBmZCwgYm9vbCB0YWtlT3duZXJzaGlwKQotewotICAgIGZsYXRfYmluZGVyX29iamVjdCBvYmo7Ci0gICAgb2JqLnR5cGUgPSBCSU5ERVJfVFlQRV9GRDsKLSAgICBvYmouZmxhZ3MgPSAweDdmIHwgRkxBVF9CSU5ERVJfRkxBR19BQ0NFUFRTX0ZEUzsKLSAgICBvYmouaGFuZGxlID0gZmQ7Ci0gICAgb2JqLmNvb2tpZSA9ICh2b2lkKikgKHRha2VPd25lcnNoaXAgPyAxIDogMCk7Ci0gICAgcmV0dXJuIHdyaXRlT2JqZWN0KG9iaiwgdHJ1ZSk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVEdXBGaWxlRGVzY3JpcHRvcihpbnQgZmQpCi17Ci0gICAgaW50IGR1cEZkID0gZHVwKGZkKTsKLSAgICBpZiAoZHVwRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IHdyaXRlRmlsZURlc2NyaXB0b3IoZHVwRmQsIHRydWUgLyp0YWtlT3duZXJzaGlwKi8pOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgY2xvc2UoZHVwRmQpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlQmxvYihzaXplX3QgbGVuLCBXcml0YWJsZUJsb2IqIG91dEJsb2IpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotCi0gICAgaWYgKCFtQWxsb3dGZHMgfHwgbGVuIDw9IElOX1BMQUNFX0JMT0JfTElNSVQpIHsKLSAgICAgICAgQUxPR1YoIndyaXRlQmxvYjogd3JpdGUgaW4gcGxhY2UiKTsKLSAgICAgICAgc3RhdHVzID0gd3JpdGVJbnQzMigwKTsKLSAgICAgICAgaWYgKHN0YXR1cykgcmV0dXJuIHN0YXR1czsKLQotICAgICAgICB2b2lkKiBwdHIgPSB3cml0ZUlucGxhY2UobGVuKTsKLSAgICAgICAgaWYgKCFwdHIpIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICAgICAgb3V0QmxvYi0+aW5pdChmYWxzZSAvKm1hcHBlZCovLCBwdHIsIGxlbik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBBTE9HVigid3JpdGVCbG9iOiB3cml0ZSB0byBhc2htZW0iKTsKLSAgICBpbnQgZmQgPSBhc2htZW1fY3JlYXRlX3JlZ2lvbigiUGFyY2VsIEJsb2IiLCBsZW4pOwotICAgIGlmIChmZCA8IDApIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICBpbnQgcmVzdWx0ID0gYXNobWVtX3NldF9wcm90X3JlZ2lvbihmZCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7Ci0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgc3RhdHVzID0gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZvaWQqIHB0ciA9IDo6bW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKTsKLSAgICAgICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSAtZXJybm87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBhc2htZW1fc2V0X3Byb3RfcmVnaW9uKGZkLCBQUk9UX1JFQUQpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSByZXN1bHQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHdyaXRlSW50MzIoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gd3JpdGVGaWxlRGVzY3JpcHRvcihmZCwgdHJ1ZSAvKnRha2VPd25lcnNoaXAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRCbG9iLT5pbml0KHRydWUgLyptYXBwZWQqLywgcHRyLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIDo6bXVubWFwKHB0ciwgbGVuKTsKLSAgICB9Ci0gICAgOjpjbG9zZShmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZShjb25zdCBGbGF0dGVuYWJsZSYgdmFsKQotewotICAgIHN0YXR1c190IGVycjsKLQotICAgIC8vIHNpemUgaWYgbmVlZGVkCi0gICAgc2l6ZV90IGxlbiA9IHZhbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc2l6ZV90IGZkX2NvdW50ID0gdmFsLmdldEZkQ291bnQoKTsKLQotICAgIGVyciA9IHRoaXMtPndyaXRlSW50MzIobGVuKTsKLSAgICBpZiAoZXJyKSByZXR1cm4gZXJyOwotCi0gICAgZXJyID0gdGhpcy0+d3JpdGVJbnQzMihmZF9jb3VudCk7Ci0gICAgaWYgKGVycikgcmV0dXJuIGVycjsKLQotICAgIC8vIHBheWxvYWQKLSAgICB2b2lkKiBidWYgPSB0aGlzLT53cml0ZUlucGxhY2UoUEFEX1NJWkUobGVuKSk7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgaW50KiBmZHMgPSBOVUxMOwotICAgIGlmIChmZF9jb3VudCkgewotICAgICAgICBmZHMgPSBuZXcgaW50W2ZkX2NvdW50XTsKLSAgICB9Ci0KLSAgICBlcnIgPSB2YWwuZmxhdHRlbihidWYsIGxlbiwgZmRzLCBmZF9jb3VudCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxmZF9jb3VudCAmJiBlcnI9PU5PX0VSUk9SIDsgaSsrKSB7Ci0gICAgICAgIGVyciA9IHRoaXMtPndyaXRlRHVwRmlsZURlc2NyaXB0b3IoIGZkc1tpXSApOwotICAgIH0KLQotICAgIGlmIChmZF9jb3VudCkgewotICAgICAgICBkZWxldGUgW10gZmRzOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6d3JpdGVPYmplY3QoY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0JiB2YWwsIGJvb2wgbnVsbE1ldGFEYXRhKQotewotICAgIGNvbnN0IGJvb2wgZW5vdWdoRGF0YSA9IChtRGF0YVBvcytzaXplb2YodmFsKSkgPD0gbURhdGFDYXBhY2l0eTsKLSAgICBjb25zdCBib29sIGVub3VnaE9iamVjdHMgPSBtT2JqZWN0c1NpemUgPCBtT2JqZWN0c0NhcGFjaXR5OwotICAgIGlmIChlbm91Z2hEYXRhICYmIGVub3VnaE9iamVjdHMpIHsKLXJlc3RhcnRfd3JpdGU6Ci0gICAgICAgICpyZWludGVycHJldF9jYXN0PGZsYXRfYmluZGVyX29iamVjdCo+KG1EYXRhK21EYXRhUG9zKSA9IHZhbDsKLSAgICAgICAgCi0gICAgICAgIC8vIE5lZWQgdG8gd3JpdGUgbWV0YS1kYXRhPwotICAgICAgICBpZiAobnVsbE1ldGFEYXRhIHx8IHZhbC5iaW5kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbU9iamVjdHNbbU9iamVjdHNTaXplXSA9IG1EYXRhUG9zOwotICAgICAgICAgICAgYWNxdWlyZV9vYmplY3QoUHJvY2Vzc1N0YXRlOjpzZWxmKCksIHZhbCwgdGhpcyk7Ci0gICAgICAgICAgICBtT2JqZWN0c1NpemUrKzsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gcmVtZW1iZXIgaWYgaXQncyBhIGZpbGUgZGVzY3JpcHRvcgotICAgICAgICBpZiAodmFsLnR5cGUgPT0gQklOREVSX1RZUEVfRkQpIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93RmRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZEU19OT1RfQUxMT1dFRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1IYXNGZHMgPSBtRmRzS25vd24gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbmlzaFdyaXRlKHNpemVvZihmbGF0X2JpbmRlcl9vYmplY3QpKTsKLSAgICB9Ci0KLSAgICBpZiAoIWVub3VnaERhdGEpIHsKLSAgICAgICAgY29uc3Qgc3RhdHVzX3QgZXJyID0gZ3Jvd0RhdGEoc2l6ZW9mKHZhbCkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSByZXR1cm4gZXJyOwotICAgIH0KLSAgICBpZiAoIWVub3VnaE9iamVjdHMpIHsKLSAgICAgICAgc2l6ZV90IG5ld1NpemUgPSAoKG1PYmplY3RzU2l6ZSsyKSozKS8yOwotICAgICAgICBzaXplX3QqIG9iamVjdHMgPSAoc2l6ZV90KilyZWFsbG9jKG1PYmplY3RzLCBuZXdTaXplKnNpemVvZihzaXplX3QpKTsKLSAgICAgICAgaWYgKG9iamVjdHMgPT0gTlVMTCkgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgbU9iamVjdHMgPSBvYmplY3RzOwotICAgICAgICBtT2JqZWN0c0NhcGFjaXR5ID0gbmV3U2l6ZTsKLSAgICB9Ci0gICAgCi0gICAgZ290byByZXN0YXJ0X3dyaXRlOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OndyaXRlTm9FeGNlcHRpb24oKQotewotICAgIHJldHVybiB3cml0ZUludDMyKDApOwotfQotCi12b2lkIFBhcmNlbDo6cmVtb3ZlKHNpemVfdCBzdGFydCwgc2l6ZV90IGFtdCkKLXsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMKCJQYXJjZWw6OnJlbW92ZSgpIG5vdCB5ZXQgaW1wbGVtZW50ZWQhIik7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZCh2b2lkKiBvdXREYXRhLCBzaXplX3QgbGVuKSBjb25zdAotewotICAgIGlmICgobURhdGFQb3MrUEFEX1NJWkUobGVuKSkgPj0gbURhdGFQb3MgJiYgKG1EYXRhUG9zK1BBRF9TSVpFKGxlbikpIDw9IG1EYXRhU2l6ZSkgewotICAgICAgICBtZW1jcHkob3V0RGF0YSwgbURhdGErbURhdGFQb3MsIGxlbik7Ci0gICAgICAgIG1EYXRhUG9zICs9IFBBRF9TSVpFKGxlbik7Ci0gICAgICAgIEFMT0dWKCJyZWFkIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotfQotCi1jb25zdCB2b2lkKiBQYXJjZWw6OnJlYWRJbnBsYWNlKHNpemVfdCBsZW4pIGNvbnN0Ci17Ci0gICAgaWYgKChtRGF0YVBvcytQQURfU0laRShsZW4pKSA+PSBtRGF0YVBvcyAmJiAobURhdGFQb3MrUEFEX1NJWkUobGVuKSkgPD0gbURhdGFTaXplKSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIGRhdGEgPSBtRGF0YSttRGF0YVBvczsKLSAgICAgICAgbURhdGFQb3MgKz0gUEFEX1NJWkUobGVuKTsKLSAgICAgICAgQUxPR1YoInJlYWRJbnBsYWNlIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RhdHVzX3QgUGFyY2VsOjpyZWFkQWxpZ25lZChUICpwQXJnKSBjb25zdCB7Ci0gICAgQ09NUElMRV9USU1FX0FTU0VSVF9GVU5DVElPTl9TQ09QRShQQURfU0laRShzaXplb2YoVCkpID09IHNpemVvZihUKSk7Ci0KLSAgICBpZiAoKG1EYXRhUG9zK3NpemVvZihUKSkgPD0gbURhdGFTaXplKSB7Ci0gICAgICAgIGNvbnN0IHZvaWQqIGRhdGEgPSBtRGF0YSttRGF0YVBvczsKLSAgICAgICAgbURhdGFQb3MgKz0gc2l6ZW9mKFQpOwotICAgICAgICAqcEFyZyA9ICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oZGF0YSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgIH0KLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLVQgUGFyY2VsOjpyZWFkQWxpZ25lZCgpIGNvbnN0IHsKLSAgICBUIHJlc3VsdDsKLSAgICBpZiAocmVhZEFsaWduZWQoJnJlc3VsdCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RhdHVzX3QgUGFyY2VsOjp3cml0ZUFsaWduZWQoVCB2YWwpIHsKLSAgICBDT01QSUxFX1RJTUVfQVNTRVJUX0ZVTkNUSU9OX1NDT1BFKFBBRF9TSVpFKHNpemVvZihUKSkgPT0gc2l6ZW9mKFQpKTsKLQotICAgIGlmICgobURhdGFQb3Mrc2l6ZW9mKHZhbCkpIDw9IG1EYXRhQ2FwYWNpdHkpIHsKLXJlc3RhcnRfd3JpdGU6Ci0gICAgICAgICpyZWludGVycHJldF9jYXN0PFQqPihtRGF0YSttRGF0YVBvcykgPSB2YWw7Ci0gICAgICAgIHJldHVybiBmaW5pc2hXcml0ZShzaXplb2YodmFsKSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gZ3Jvd0RhdGEoc2l6ZW9mKHZhbCkpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIGdvdG8gcmVzdGFydF93cml0ZTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OnJlYWRJbnQzMihpbnQzMl90ICpwQXJnKSBjb25zdAotewotICAgIHJldHVybiByZWFkQWxpZ25lZChwQXJnKTsKLX0KLQotaW50MzJfdCBQYXJjZWw6OnJlYWRJbnQzMigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkPGludDMyX3Q+KCk7Ci19Ci0KLQotc3RhdHVzX3QgUGFyY2VsOjpyZWFkSW50NjQoaW50NjRfdCAqcEFyZykgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQocEFyZyk7Ci19Ci0KLQotaW50NjRfdCBQYXJjZWw6OnJlYWRJbnQ2NCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkPGludDY0X3Q+KCk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZEZsb2F0KGZsb2F0ICpwQXJnKSBjb25zdAotewotICAgIHJldHVybiByZWFkQWxpZ25lZChwQXJnKTsKLX0KLQotCi1mbG9hdCBQYXJjZWw6OnJlYWRGbG9hdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkPGZsb2F0PigpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OnJlYWREb3VibGUoZG91YmxlICpwQXJnKSBjb25zdAotewotICAgIHJldHVybiByZWFkQWxpZ25lZChwQXJnKTsKLX0KLQotCi1kb3VibGUgUGFyY2VsOjpyZWFkRG91YmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcmVhZEFsaWduZWQ8ZG91YmxlPigpOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OnJlYWRJbnRQdHIoaW50cHRyX3QgKnBBcmcpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkKHBBcmcpOwotfQotCi0KLWludHB0cl90IFBhcmNlbDo6cmVhZEludFB0cigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHJlYWRBbGlnbmVkPGludHB0cl90PigpOwotfQotCi0KLWNvbnN0IGNoYXIqIFBhcmNlbDo6cmVhZENTdHJpbmcoKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBhdmFpbCA9IG1EYXRhU2l6ZS1tRGF0YVBvczsKLSAgICBpZiAoYXZhaWwgPiAwKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHN0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG1EYXRhK21EYXRhUG9zKTsKLSAgICAgICAgLy8gaXMgdGhlIHN0cmluZydzIHRyYWlsaW5nIE5VTCB3aXRoaW4gdGhlIHBhcmNlbCdzIHZhbGlkIGJvdW5kcz8KLSAgICAgICAgY29uc3QgY2hhciogZW9zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obWVtY2hyKHN0ciwgMCwgYXZhaWwpKTsKLSAgICAgICAgaWYgKGVvcykgewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiA9IGVvcyAtIHN0cjsKLSAgICAgICAgICAgIG1EYXRhUG9zICs9IFBBRF9TSVpFKGxlbisxKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZWFkQ1N0cmluZyBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gc3RyOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1TdHJpbmc4IFBhcmNlbDo6cmVhZFN0cmluZzgoKSBjb25zdAotewotICAgIGludDMyX3Qgc2l6ZSA9IHJlYWRJbnQzMigpOwotICAgIC8vIHdhdGNoIGZvciBwb3RlbnRpYWwgaW50IG92ZXJmbG93IGFkZGluZyAxIGZvciB0cmFpbGluZyBOVUwKLSAgICBpZiAoc2l6ZSA+IDAgJiYgc2l6ZSA8IElOVDMyX01BWCkgewotICAgICAgICBjb25zdCBjaGFyKiBzdHIgPSAoY29uc3QgY2hhciopcmVhZElucGxhY2Uoc2l6ZSsxKTsKLSAgICAgICAgaWYgKHN0cikgcmV0dXJuIFN0cmluZzgoc3RyLCBzaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIFN0cmluZzgoKTsKLX0KLQotU3RyaW5nMTYgUGFyY2VsOjpyZWFkU3RyaW5nMTYoKSBjb25zdAotewotICAgIHNpemVfdCBsZW47Ci0gICAgY29uc3QgY2hhcjE2X3QqIHN0ciA9IHJlYWRTdHJpbmcxNklucGxhY2UoJmxlbik7Ci0gICAgaWYgKHN0cikgcmV0dXJuIFN0cmluZzE2KHN0ciwgbGVuKTsKLSAgICBBTE9HRSgiUmVhZGluZyBhIE5VTEwgc3RyaW5nIG5vdCBzdXBwb3J0ZWQgaGVyZS4iKTsKLSAgICByZXR1cm4gU3RyaW5nMTYoKTsKLX0KLQotY29uc3QgY2hhcjE2X3QqIFBhcmNlbDo6cmVhZFN0cmluZzE2SW5wbGFjZShzaXplX3QqIG91dExlbikgY29uc3QKLXsKLSAgICBpbnQzMl90IHNpemUgPSByZWFkSW50MzIoKTsKLSAgICAvLyB3YXRjaCBmb3IgcG90ZW50aWFsIGludCBvdmVyZmxvdyBmcm9tIHNpemUrMQotICAgIGlmIChzaXplID49IDAgJiYgc2l6ZSA8IElOVDMyX01BWCkgewotICAgICAgICAqb3V0TGVuID0gc2l6ZTsKLSAgICAgICAgY29uc3QgY2hhcjE2X3QqIHN0ciA9IChjb25zdCBjaGFyMTZfdCopcmVhZElucGxhY2UoKHNpemUrMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIGlmIChzdHIgIT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICAqb3V0TGVuID0gMDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3A8SUJpbmRlcj4gUGFyY2VsOjpyZWFkU3Ryb25nQmluZGVyKCkgY29uc3QKLXsKLSAgICBzcDxJQmluZGVyPiB2YWw7Ci0gICAgdW5mbGF0dGVuX2JpbmRlcihQcm9jZXNzU3RhdGU6OnNlbGYoKSwgKnRoaXMsICZ2YWwpOwotICAgIHJldHVybiB2YWw7Ci19Ci0KLXdwPElCaW5kZXI+IFBhcmNlbDo6cmVhZFdlYWtCaW5kZXIoKSBjb25zdAotewotICAgIHdwPElCaW5kZXI+IHZhbDsKLSAgICB1bmZsYXR0ZW5fYmluZGVyKFByb2Nlc3NTdGF0ZTo6c2VsZigpLCAqdGhpcywgJnZhbCk7Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotaW50MzJfdCBQYXJjZWw6OnJlYWRFeGNlcHRpb25Db2RlKCkgY29uc3QKLXsKLSAgaW50MzJfdCBleGNlcHRpb25fY29kZSA9IHJlYWRBbGlnbmVkPGludDMyX3Q+KCk7Ci0gIGlmIChleGNlcHRpb25fY29kZSA9PSBFWF9IQVNfUkVQTFlfSEVBREVSKSB7Ci0gICAgaW50MzJfdCBoZWFkZXJfc2l6ZSA9IHJlYWRBbGlnbmVkPGludDMyX3Q+KCk7Ci0gICAgLy8gU2tpcCBvdmVyIGZhdCByZXNwb25zZXMgaGVhZGVycy4gIE5vdCB1c2VkIChvciBwcm9wYWdhdGVkKSBpbgotICAgIC8vIG5hdGl2ZSBjb2RlCi0gICAgc2V0RGF0YVBvc2l0aW9uKGRhdGFQb3NpdGlvbigpICsgaGVhZGVyX3NpemUpOwotICAgIC8vIEFuZCBmYXQgcmVzcG9uc2UgaGVhZGVycyBhcmUgY3VycmVudGx5IG9ubHkgdXNlZCB3aGVuIHRoZXJlIGFyZSBubwotICAgIC8vIGV4Y2VwdGlvbnMsIHNvIHJldHVybiBubyBlcnJvcjoKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gZXhjZXB0aW9uX2NvZGU7Ci19Ci0KLW5hdGl2ZV9oYW5kbGUqIFBhcmNlbDo6cmVhZE5hdGl2ZUhhbmRsZSgpIGNvbnN0Ci17Ci0gICAgaW50IG51bUZkcywgbnVtSW50czsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgZXJyID0gcmVhZEludDMyKCZudW1GZHMpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiAwOwotICAgIGVyciA9IHJlYWRJbnQzMigmbnVtSW50cyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgcmV0dXJuIDA7Ci0KLSAgICBuYXRpdmVfaGFuZGxlKiBoID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUobnVtRmRzLCBudW1JbnRzKTsKLSAgICBmb3IgKGludCBpPTAgOyBlcnI9PU5PX0VSUk9SICYmIGk8bnVtRmRzIDsgaSsrKSB7Ci0gICAgICAgIGgtPmRhdGFbaV0gPSBkdXAocmVhZEZpbGVEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoaC0+ZGF0YVtpXSA8IDApIGVyciA9IEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZXJyID0gcmVhZChoLT5kYXRhICsgbnVtRmRzLCBzaXplb2YoaW50KSpudW1JbnRzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaCk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGgpOwotICAgICAgICBoID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGg7Ci19Ci0KLQotaW50IFBhcmNlbDo6cmVhZEZpbGVEZXNjcmlwdG9yKCkgY29uc3QKLXsKLSAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIGZsYXQgPSByZWFkT2JqZWN0KHRydWUpOwotICAgIGlmIChmbGF0KSB7Ci0gICAgICAgIHN3aXRjaCAoZmxhdC0+dHlwZSkgewotICAgICAgICAgICAgY2FzZSBCSU5ERVJfVFlQRV9GRDoKLSAgICAgICAgICAgICAgICAvL0FMT0dJKCJSZXR1cm5pbmcgZmlsZSBkZXNjcmlwdG9yICVsZCBmcm9tIHBhcmNlbCAlcFxuIiwgZmxhdC0+aGFuZGxlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmxhdC0+aGFuZGxlOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9UWVBFOwotfQotCi1zdGF0dXNfdCBQYXJjZWw6OnJlYWRCbG9iKHNpemVfdCBsZW4sIFJlYWRhYmxlQmxvYiogb3V0QmxvYikgY29uc3QKLXsKLSAgICBpbnQzMl90IHVzZUFzaG1lbTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWFkSW50MzIoJnVzZUFzaG1lbSk7Ci0gICAgaWYgKHN0YXR1cykgcmV0dXJuIHN0YXR1czsKLQotICAgIGlmICghdXNlQXNobWVtKSB7Ci0gICAgICAgIEFMT0dWKCJyZWFkQmxvYjogcmVhZCBpbiBwbGFjZSIpOwotICAgICAgICBjb25zdCB2b2lkKiBwdHIgPSByZWFkSW5wbGFjZShsZW4pOwotICAgICAgICBpZiAoIXB0cikgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgICAgICBvdXRCbG9iLT5pbml0KGZhbHNlIC8qbWFwcGVkKi8sIGNvbnN0X2Nhc3Q8dm9pZCo+KHB0ciksIGxlbik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBBTE9HVigicmVhZEJsb2I6IHJlYWQgZnJvbSBhc2htZW0iKTsKLSAgICBpbnQgZmQgPSByZWFkRmlsZURlc2NyaXB0b3IoKTsKLSAgICBpZiAoZmQgPT0gaW50KEJBRF9UWVBFKSkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIHZvaWQqIHB0ciA9IDo6bW1hcChOVUxMLCBsZW4sIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDApOwotICAgIGlmICghcHRyKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgb3V0QmxvYi0+aW5pdCh0cnVlIC8qbWFwcGVkKi8sIHB0ciwgbGVuKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVhZChGbGF0dGVuYWJsZSYgdmFsKSBjb25zdAotewotICAgIC8vIHNpemUKLSAgICBjb25zdCBzaXplX3QgbGVuID0gdGhpcy0+cmVhZEludDMyKCk7Ci0gICAgY29uc3Qgc2l6ZV90IGZkX2NvdW50ID0gdGhpcy0+cmVhZEludDMyKCk7Ci0KLSAgICAvLyBwYXlsb2FkCi0gICAgdm9pZCBjb25zdCogYnVmID0gdGhpcy0+cmVhZElucGxhY2UoUEFEX1NJWkUobGVuKSk7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgaW50KiBmZHMgPSBOVUxMOwotICAgIGlmIChmZF9jb3VudCkgewotICAgICAgICBmZHMgPSBuZXcgaW50W2ZkX2NvdW50XTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGZkX2NvdW50ICYmIGVycj09Tk9fRVJST1IgOyBpKyspIHsKLSAgICAgICAgZmRzW2ldID0gZHVwKHRoaXMtPnJlYWRGaWxlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKGZkc1tpXSA8IDApIGVyciA9IEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGVyciA9IHZhbC51bmZsYXR0ZW4oYnVmLCBsZW4sIGZkcywgZmRfY291bnQpOwotICAgIH0KLQotICAgIGlmIChmZF9jb3VudCkgewotICAgICAgICBkZWxldGUgW10gZmRzOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci1jb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIFBhcmNlbDo6cmVhZE9iamVjdChib29sIG51bGxNZXRhRGF0YSkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgRFBPUyA9IG1EYXRhUG9zOwotICAgIGlmICgoRFBPUytzaXplb2YoZmxhdF9iaW5kZXJfb2JqZWN0KSkgPD0gbURhdGFTaXplKSB7Ci0gICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogb2JqCi0gICAgICAgICAgICAgICAgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCo+KG1EYXRhK0RQT1MpOwotICAgICAgICBtRGF0YVBvcyA9IERQT1MgKyBzaXplb2YoZmxhdF9iaW5kZXJfb2JqZWN0KTsKLSAgICAgICAgaWYgKCFudWxsTWV0YURhdGEgJiYgKG9iai0+Y29va2llID09IE5VTEwgJiYgb2JqLT5iaW5kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdHJhbnNmZXJyaW5nIGEgTlVMTCBvYmplY3QsIHdlIGRvbid0IHdyaXRlIGl0IGludG8KLSAgICAgICAgICAgIC8vIHRoZSBvYmplY3QgbGlzdCwgc28gd2UgZG9uJ3Qgd2FudCB0byBjaGVjayBmb3IgaXQgd2hlbgotICAgICAgICAgICAgLy8gcmVhZGluZy4KLSAgICAgICAgICAgIEFMT0dWKCJyZWFkT2JqZWN0IFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgICAgIHJldHVybiBvYmo7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgb2JqZWN0IGlzIHZhbGlkLi4uCi0gICAgICAgIHNpemVfdCogY29uc3QgT0JKUyA9IG1PYmplY3RzOwotICAgICAgICBjb25zdCBzaXplX3QgTiA9IG1PYmplY3RzU2l6ZTsKLSAgICAgICAgc2l6ZV90IG9wb3MgPSBtTmV4dE9iamVjdEhpbnQ7Ci0gICAgICAgIAotICAgICAgICBpZiAoTiA+IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJQYXJjZWwgJXAgbG9va2luZyBmb3Igb2JqIGF0ICVkLCBoaW50PSVkXG4iLAotICAgICAgICAgICAgICAgICB0aGlzLCBEUE9TLCBvcG9zKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU3RhcnQgYXQgdGhlIGN1cnJlbnQgaGludCBwb3NpdGlvbiwgbG9va2luZyBmb3IgYW4gb2JqZWN0IGF0Ci0gICAgICAgICAgICAvLyB0aGUgY3VycmVudCBkYXRhIHBvc2l0aW9uLgotICAgICAgICAgICAgaWYgKG9wb3MgPCBOKSB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG9wb3MgPCAoTi0xKSAmJiBPQkpTW29wb3NdIDwgRFBPUykgewotICAgICAgICAgICAgICAgICAgICBvcG9zKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcG9zID0gTi0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE9CSlNbb3Bvc10gPT0gRFBPUykgewotICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQotICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJjZWwgZm91bmQgb2JqICVkIGF0IGluZGV4ICVkIHdpdGggZm9yd2FyZCBzZWFyY2giLAotICAgICAgICAgICAgICAgICAgICAgdGhpcywgRFBPUywgb3Bvcyk7Ci0gICAgICAgICAgICAgICAgbU5leHRPYmplY3RIaW50ID0gb3BvcysxOwotICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFkT2JqZWN0IFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgICAgIC8vIExvb2sgYmFja3dhcmRzIGZvciBpdC4uLgotICAgICAgICAgICAgd2hpbGUgKG9wb3MgPiAwICYmIE9CSlNbb3Bvc10gPiBEUE9TKSB7Ci0gICAgICAgICAgICAgICAgb3Bvcy0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE9CSlNbb3Bvc10gPT0gRFBPUykgewotICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQotICAgICAgICAgICAgICAgIEFMT0dWKCJQYXJjZWwgZm91bmQgb2JqICVkIGF0IGluZGV4ICVkIHdpdGggYmFja3dhcmQgc2VhcmNoIiwKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMsIERQT1MsIG9wb3MpOwotICAgICAgICAgICAgICAgIG1OZXh0T2JqZWN0SGludCA9IG9wb3MrMTsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVhZE9iamVjdCBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBTE9HVygiQXR0ZW1wdCB0byByZWFkIG9iamVjdCBmcm9tIFBhcmNlbCAlcCBhdCBvZmZzZXQgJWQgdGhhdCBpcyBub3QgaW4gdGhlIG9iamVjdCBsaXN0IiwKLSAgICAgICAgICAgICB0aGlzLCBEUE9TKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgUGFyY2VsOjpjbG9zZUZpbGVEZXNjcmlwdG9ycygpCi17Ci0gICAgc2l6ZV90IGkgPSBtT2JqZWN0c1NpemU7Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIC8vQUxPR0koIkNsb3NpbmcgZmlsZSBkZXNjcmlwdG9ycyBmb3IgJWQgb2JqZWN0cy4uLiIsIG1PYmplY3RzU2l6ZSk7Ci0gICAgfQotICAgIHdoaWxlIChpID4gMCkgewotICAgICAgICBpLS07Ci0gICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogZmxhdAotICAgICAgICAgICAgPSByZWludGVycHJldF9jYXN0PGZsYXRfYmluZGVyX29iamVjdCo+KG1EYXRhK21PYmplY3RzW2ldKTsKLSAgICAgICAgaWYgKGZsYXQtPnR5cGUgPT0gQklOREVSX1RZUEVfRkQpIHsKLSAgICAgICAgICAgIC8vQUxPR0koIkNsb3NpbmcgZmQ6ICVsZFxuIiwgZmxhdC0+aGFuZGxlKTsKLSAgICAgICAgICAgIGNsb3NlKGZsYXQtPmhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIFBhcmNlbDo6aXBjRGF0YSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi1zaXplX3QgUGFyY2VsOjppcGNEYXRhU2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChtRGF0YVNpemUgPiBtRGF0YVBvcyA/IG1EYXRhU2l6ZSA6IG1EYXRhUG9zKTsKLX0KLQotY29uc3Qgc2l6ZV90KiBQYXJjZWw6OmlwY09iamVjdHMoKSBjb25zdAotewotICAgIHJldHVybiBtT2JqZWN0czsKLX0KLQotc2l6ZV90IFBhcmNlbDo6aXBjT2JqZWN0c0NvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU9iamVjdHNTaXplOwotfQotCi12b2lkIFBhcmNlbDo6aXBjU2V0RGF0YVJlZmVyZW5jZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsCi0gICAgY29uc3Qgc2l6ZV90KiBvYmplY3RzLCBzaXplX3Qgb2JqZWN0c0NvdW50LCByZWxlYXNlX2Z1bmMgcmVsRnVuYywgdm9pZCogcmVsQ29va2llKQotewotICAgIGZyZWVEYXRhTm9Jbml0KCk7Ci0gICAgbUVycm9yID0gTk9fRVJST1I7Ci0gICAgbURhdGEgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihkYXRhKTsKLSAgICBtRGF0YVNpemUgPSBtRGF0YUNhcGFjaXR5ID0gZGF0YVNpemU7Ci0gICAgLy9BTE9HSSgic2V0RGF0YVJlZmVyZW5jZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlbHUgKHBpZD0lZClcbiIsIHRoaXMsIG1EYXRhU2l6ZSwgZ2V0cGlkKCkpOwotICAgIG1EYXRhUG9zID0gMDsKLSAgICBBTE9HVigic2V0RGF0YVJlZmVyZW5jZSBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgbU9iamVjdHMgPSBjb25zdF9jYXN0PHNpemVfdCo+KG9iamVjdHMpOwotICAgIG1PYmplY3RzU2l6ZSA9IG1PYmplY3RzQ2FwYWNpdHkgPSBvYmplY3RzQ291bnQ7Ci0gICAgbU5leHRPYmplY3RIaW50ID0gMDsKLSAgICBtT3duZXIgPSByZWxGdW5jOwotICAgIG1Pd25lckNvb2tpZSA9IHJlbENvb2tpZTsKLSAgICBzY2FuRm9yRmRzKCk7Ci19Ci0KLXZvaWQgUGFyY2VsOjpwcmludChUZXh0T3V0cHV0JiB0bywgdWludDMyX3QgZmxhZ3MpIGNvbnN0Ci17Ci0gICAgdG8gPDwgIlBhcmNlbCgiOwotICAgIAotICAgIGlmIChlcnJvckNoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgY29uc3Qgc3RhdHVzX3QgZXJyID0gZXJyb3JDaGVjaygpOwotICAgICAgICB0byA8PCAiRXJyb3I6ICIgPDwgKHZvaWQqKWVyciA8PCAiIFwiIiA8PCBzdHJlcnJvcigtZXJyKSA8PCAiXCIiOwotICAgIH0gZWxzZSBpZiAoZGF0YVNpemUoKSA+IDApIHsKLSAgICAgICAgY29uc3QgdWludDhfdCogREFUQSA9IGRhdGEoKTsKLSAgICAgICAgdG8gPDwgaW5kZW50IDw8IEhleER1bXAoREFUQSwgZGF0YVNpemUoKSkgPDwgZGVkZW50OwotICAgICAgICBjb25zdCBzaXplX3QqIE9CSlMgPSBvYmplY3RzKCk7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBOID0gb2JqZWN0c0NvdW50KCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogZmxhdAotICAgICAgICAgICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqPihEQVRBK09CSlNbaV0pOwotICAgICAgICAgICAgdG8gPDwgZW5kbCA8PCAiT2JqZWN0ICMiIDw8IGkgPDwgIiBAICIgPDwgKHZvaWQqKU9CSlNbaV0gPDwgIjogIgotICAgICAgICAgICAgICAgIDw8IFR5cGVDb2RlKGZsYXQtPnR5cGUgJiAweDdmN2Y3ZjAwKQotICAgICAgICAgICAgICAgIDw8ICIgPSAiIDw8IGZsYXQtPmJpbmRlcjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRvIDw8ICJOVUxMIjsKLSAgICB9Ci0gICAgCi0gICAgdG8gPDwgIikiOwotfQotCi12b2lkIFBhcmNlbDo6cmVsZWFzZU9iamVjdHMoKQotewotICAgIGNvbnN0IHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7Ci0gICAgc2l6ZV90IGkgPSBtT2JqZWN0c1NpemU7Ci0gICAgdWludDhfdCogY29uc3QgZGF0YSA9IG1EYXRhOwotICAgIHNpemVfdCogY29uc3Qgb2JqZWN0cyA9IG1PYmplY3RzOwotICAgIHdoaWxlIChpID4gMCkgewotICAgICAgICBpLS07Ci0gICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogZmxhdAotICAgICAgICAgICAgPSByZWludGVycHJldF9jYXN0PGZsYXRfYmluZGVyX29iamVjdCo+KGRhdGErb2JqZWN0c1tpXSk7Ci0gICAgICAgIHJlbGVhc2Vfb2JqZWN0KHByb2MsICpmbGF0LCB0aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFyY2VsOjphY3F1aXJlT2JqZWN0cygpCi17Ci0gICAgY29uc3Qgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKLSAgICBzaXplX3QgaSA9IG1PYmplY3RzU2l6ZTsKLSAgICB1aW50OF90KiBjb25zdCBkYXRhID0gbURhdGE7Ci0gICAgc2l6ZV90KiBjb25zdCBvYmplY3RzID0gbU9iamVjdHM7Ci0gICAgd2hpbGUgKGkgPiAwKSB7Ci0gICAgICAgIGktLTsKLSAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxhdF9iaW5kZXJfb2JqZWN0Kj4oZGF0YStvYmplY3RzW2ldKTsKLSAgICAgICAgYWNxdWlyZV9vYmplY3QocHJvYywgKmZsYXQsIHRoaXMpOwotICAgIH0KLX0KLQotdm9pZCBQYXJjZWw6OmZyZWVEYXRhKCkKLXsKLSAgICBmcmVlRGF0YU5vSW5pdCgpOwotICAgIGluaXRTdGF0ZSgpOwotfQotCi12b2lkIFBhcmNlbDo6ZnJlZURhdGFOb0luaXQoKQotewotICAgIGlmIChtT3duZXIpIHsKLSAgICAgICAgLy9BTE9HSSgiRnJlZWluZyBkYXRhIHJlZiBvZiAlcCAocGlkPSVkKVxuIiwgdGhpcywgZ2V0cGlkKCkpOwotICAgICAgICBtT3duZXIodGhpcywgbURhdGEsIG1EYXRhU2l6ZSwgbU9iamVjdHMsIG1PYmplY3RzU2l6ZSwgbU93bmVyQ29va2llKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZWxlYXNlT2JqZWN0cygpOwotICAgICAgICBpZiAobURhdGEpIGZyZWUobURhdGEpOwotICAgICAgICBpZiAobU9iamVjdHMpIGZyZWUobU9iamVjdHMpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgUGFyY2VsOjpncm93RGF0YShzaXplX3QgbGVuKQotewotICAgIHNpemVfdCBuZXdTaXplID0gKChtRGF0YVNpemUrbGVuKSozKS8yOwotICAgIHJldHVybiAobmV3U2l6ZSA8PSBtRGF0YVNpemUpCi0gICAgICAgICAgICA/IChzdGF0dXNfdCkgTk9fTUVNT1JZCi0gICAgICAgICAgICA6IGNvbnRpbnVlV3JpdGUobmV3U2l6ZSk7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6cmVzdGFydFdyaXRlKHNpemVfdCBkZXNpcmVkKQotewotICAgIGlmIChtT3duZXIpIHsKLSAgICAgICAgZnJlZURhdGEoKTsKLSAgICAgICAgcmV0dXJuIGNvbnRpbnVlV3JpdGUoZGVzaXJlZCk7Ci0gICAgfQotICAgIAotICAgIHVpbnQ4X3QqIGRhdGEgPSAodWludDhfdCopcmVhbGxvYyhtRGF0YSwgZGVzaXJlZCk7Ci0gICAgaWYgKCFkYXRhICYmIGRlc2lyZWQgPiBtRGF0YUNhcGFjaXR5KSB7Ci0gICAgICAgIG1FcnJvciA9IE5PX01FTU9SWTsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgCi0gICAgcmVsZWFzZU9iamVjdHMoKTsKLSAgICAKLSAgICBpZiAoZGF0YSkgewotICAgICAgICBtRGF0YSA9IGRhdGE7Ci0gICAgICAgIG1EYXRhQ2FwYWNpdHkgPSBkZXNpcmVkOwotICAgIH0KLSAgICAKLSAgICBtRGF0YVNpemUgPSBtRGF0YVBvcyA9IDA7Ci0gICAgQUxPR1YoInJlc3RhcnRXcml0ZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFTaXplKTsKLSAgICBBTE9HVigicmVzdGFydFdyaXRlIFNldHRpbmcgZGF0YSBwb3Mgb2YgJXAgdG8gJWRcbiIsIHRoaXMsIG1EYXRhUG9zKTsKLSAgICAgICAgCi0gICAgZnJlZShtT2JqZWN0cyk7Ci0gICAgbU9iamVjdHMgPSBOVUxMOwotICAgIG1PYmplY3RzU2l6ZSA9IG1PYmplY3RzQ2FwYWNpdHkgPSAwOwotICAgIG1OZXh0T2JqZWN0SGludCA9IDA7Ci0gICAgbUhhc0ZkcyA9IGZhbHNlOwotICAgIG1GZHNLbm93biA9IHRydWU7Ci0gICAgbUFsbG93RmRzID0gdHJ1ZTsKLSAgICAKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFBhcmNlbDo6Y29udGludWVXcml0ZShzaXplX3QgZGVzaXJlZCkKLXsKLSAgICAvLyBJZiBzaHJpbmtpbmcsIGZpcnN0IGFkanVzdCBmb3IgYW55IG9iamVjdHMgdGhhdCBhcHBlYXIKLSAgICAvLyBhZnRlciB0aGUgbmV3IGRhdGEgc2l6ZS4KLSAgICBzaXplX3Qgb2JqZWN0c1NpemUgPSBtT2JqZWN0c1NpemU7Ci0gICAgaWYgKGRlc2lyZWQgPCBtRGF0YVNpemUpIHsKLSAgICAgICAgaWYgKGRlc2lyZWQgPT0gMCkgewotICAgICAgICAgICAgb2JqZWN0c1NpemUgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2hpbGUgKG9iamVjdHNTaXplID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChtT2JqZWN0c1tvYmplY3RzU2l6ZS0xXSA8IGRlc2lyZWQpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIG9iamVjdHNTaXplLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG1Pd25lcikgewotICAgICAgICAvLyBJZiB0aGUgc2l6ZSBpcyBnb2luZyB0byB6ZXJvLCBqdXN0IHJlbGVhc2UgdGhlIG93bmVyJ3MgZGF0YS4KLSAgICAgICAgaWYgKGRlc2lyZWQgPT0gMCkgewotICAgICAgICAgICAgZnJlZURhdGEoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGlmZmVyZW50IG93bmVyLCB3ZSBuZWVkIHRvIHRha2UKLSAgICAgICAgLy8gcG9zZXNzaW9uLgotICAgICAgICB1aW50OF90KiBkYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhkZXNpcmVkKTsKLSAgICAgICAgaWYgKCFkYXRhKSB7Ci0gICAgICAgICAgICBtRXJyb3IgPSBOT19NRU1PUlk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCogb2JqZWN0cyA9IE5VTEw7Ci0gICAgICAgIAotICAgICAgICBpZiAob2JqZWN0c1NpemUpIHsKLSAgICAgICAgICAgIG9iamVjdHMgPSAoc2l6ZV90KiltYWxsb2Mob2JqZWN0c1NpemUqc2l6ZW9mKHNpemVfdCkpOwotICAgICAgICAgICAgaWYgKCFvYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgbUVycm9yID0gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIExpdHRsZSBoYWNrIHRvIG9ubHkgYWNxdWlyZSByZWZlcmVuY2VzIG9uIG9iamVjdHMKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgYmUga2VlcGluZy4KLSAgICAgICAgICAgIHNpemVfdCBvbGRPYmplY3RzU2l6ZSA9IG1PYmplY3RzU2l6ZTsKLSAgICAgICAgICAgIG1PYmplY3RzU2l6ZSA9IG9iamVjdHNTaXplOwotICAgICAgICAgICAgYWNxdWlyZU9iamVjdHMoKTsKLSAgICAgICAgICAgIG1PYmplY3RzU2l6ZSA9IG9sZE9iamVjdHNTaXplOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobURhdGEpIHsKLSAgICAgICAgICAgIG1lbWNweShkYXRhLCBtRGF0YSwgbURhdGFTaXplIDwgZGVzaXJlZCA/IG1EYXRhU2l6ZSA6IGRlc2lyZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvYmplY3RzICYmIG1PYmplY3RzKSB7Ci0gICAgICAgICAgICBtZW1jcHkob2JqZWN0cywgbU9iamVjdHMsIG9iamVjdHNTaXplKnNpemVvZihzaXplX3QpKTsKLSAgICAgICAgfQotICAgICAgICAvL0FMT0dJKCJGcmVlaW5nIGRhdGEgcmVmIG9mICVwIChwaWQ9JWQpXG4iLCB0aGlzLCBnZXRwaWQoKSk7Ci0gICAgICAgIG1Pd25lcih0aGlzLCBtRGF0YSwgbURhdGFTaXplLCBtT2JqZWN0cywgbU9iamVjdHNTaXplLCBtT3duZXJDb29raWUpOwotICAgICAgICBtT3duZXIgPSBOVUxMOwotCi0gICAgICAgIG1EYXRhID0gZGF0YTsKLSAgICAgICAgbU9iamVjdHMgPSBvYmplY3RzOwotICAgICAgICBtRGF0YVNpemUgPSAobURhdGFTaXplIDwgZGVzaXJlZCkgPyBtRGF0YVNpemUgOiBkZXNpcmVkOwotICAgICAgICBBTE9HVigiY29udGludWVXcml0ZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFTaXplKTsKLSAgICAgICAgbURhdGFDYXBhY2l0eSA9IGRlc2lyZWQ7Ci0gICAgICAgIG1PYmplY3RzU2l6ZSA9IG1PYmplY3RzQ2FwYWNpdHkgPSBvYmplY3RzU2l6ZTsKLSAgICAgICAgbU5leHRPYmplY3RIaW50ID0gMDsKLQotICAgIH0gZWxzZSBpZiAobURhdGEpIHsKLSAgICAgICAgaWYgKG9iamVjdHNTaXplIDwgbU9iamVjdHNTaXplKSB7Ci0gICAgICAgICAgICAvLyBOZWVkIHRvIHJlbGVhc2UgcmVmcyBvbiBhbnkgb2JqZWN0cyB3ZSBhcmUgZHJvcHBpbmcuCi0gICAgICAgICAgICBjb25zdCBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT1vYmplY3RzU2l6ZTsgaTxtT2JqZWN0c1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCogZmxhdAotICAgICAgICAgICAgICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxhdF9iaW5kZXJfb2JqZWN0Kj4obURhdGErbU9iamVjdHNbaV0pOwotICAgICAgICAgICAgICAgIGlmIChmbGF0LT50eXBlID09IEJJTkRFUl9UWVBFX0ZEKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbmVlZCB0byByZXNjYW4gYmVjYXVzZSB3ZSBtYXkgaGF2ZSBsb3BwZWQgb2ZmIHRoZSBvbmx5IEZEcwotICAgICAgICAgICAgICAgICAgICBtRmRzS25vd24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QocHJvYywgKmZsYXQsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2l6ZV90KiBvYmplY3RzID0KLSAgICAgICAgICAgICAgICAoc2l6ZV90KilyZWFsbG9jKG1PYmplY3RzLCBvYmplY3RzU2l6ZSpzaXplb2Yoc2l6ZV90KSk7Ci0gICAgICAgICAgICBpZiAob2JqZWN0cykgewotICAgICAgICAgICAgICAgIG1PYmplY3RzID0gb2JqZWN0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1PYmplY3RzU2l6ZSA9IG9iamVjdHNTaXplOwotICAgICAgICAgICAgbU5leHRPYmplY3RIaW50ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG93biB0aGUgZGF0YSwgc28gd2UgY2FuIGp1c3QgZG8gYSByZWFsbG9jKCkuCi0gICAgICAgIGlmIChkZXNpcmVkID4gbURhdGFDYXBhY2l0eSkgewotICAgICAgICAgICAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KilyZWFsbG9jKG1EYXRhLCBkZXNpcmVkKTsKLSAgICAgICAgICAgIGlmIChkYXRhKSB7Ci0gICAgICAgICAgICAgICAgbURhdGEgPSBkYXRhOwotICAgICAgICAgICAgICAgIG1EYXRhQ2FwYWNpdHkgPSBkZXNpcmVkOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNpcmVkID4gbURhdGFDYXBhY2l0eSkgewotICAgICAgICAgICAgICAgIG1FcnJvciA9IE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1EYXRhU2l6ZSA+IGRlc2lyZWQpIHsKLSAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBkZXNpcmVkOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjb250aW51ZVdyaXRlIFNldHRpbmcgZGF0YSBzaXplIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1EYXRhUG9zID4gZGVzaXJlZCkgewotICAgICAgICAgICAgICAgIG1EYXRhUG9zID0gZGVzaXJlZDsKLSAgICAgICAgICAgICAgICBBTE9HVigiY29udGludWVXcml0ZSBTZXR0aW5nIGRhdGEgcG9zIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVBvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZGF0YS4gIEVhc3khCi0gICAgICAgIHVpbnQ4X3QqIGRhdGEgPSAodWludDhfdCopbWFsbG9jKGRlc2lyZWQpOwotICAgICAgICBpZiAoIWRhdGEpIHsKLSAgICAgICAgICAgIG1FcnJvciA9IE5PX01FTU9SWTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmKCEobURhdGFDYXBhY2l0eSA9PSAwICYmIG1PYmplY3RzID09IE5VTEwKLSAgICAgICAgICAgICAmJiBtT2JqZWN0c0NhcGFjaXR5ID09IDApKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY29udGludWVXcml0ZTogJWQvJXAvJWQvJWQiLCBtRGF0YUNhcGFjaXR5LCBtT2JqZWN0cywgbU9iamVjdHNDYXBhY2l0eSwgZGVzaXJlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIG1EYXRhID0gZGF0YTsKLSAgICAgICAgbURhdGFTaXplID0gbURhdGFQb3MgPSAwOwotICAgICAgICBBTE9HVigiY29udGludWVXcml0ZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFTaXplKTsKLSAgICAgICAgQUxPR1YoImNvbnRpbnVlV3JpdGUgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgICAgICBtRGF0YUNhcGFjaXR5ID0gZGVzaXJlZDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgUGFyY2VsOjppbml0U3RhdGUoKQotewotICAgIG1FcnJvciA9IE5PX0VSUk9SOwotICAgIG1EYXRhID0gMDsKLSAgICBtRGF0YVNpemUgPSAwOwotICAgIG1EYXRhQ2FwYWNpdHkgPSAwOwotICAgIG1EYXRhUG9zID0gMDsKLSAgICBBTE9HVigiaW5pdFN0YXRlIFNldHRpbmcgZGF0YSBzaXplIG9mICVwIHRvICVkXG4iLCB0aGlzLCBtRGF0YVNpemUpOwotICAgIEFMT0dWKCJpbml0U3RhdGUgU2V0dGluZyBkYXRhIHBvcyBvZiAlcCB0byAlZFxuIiwgdGhpcywgbURhdGFQb3MpOwotICAgIG1PYmplY3RzID0gTlVMTDsKLSAgICBtT2JqZWN0c1NpemUgPSAwOwotICAgIG1PYmplY3RzQ2FwYWNpdHkgPSAwOwotICAgIG1OZXh0T2JqZWN0SGludCA9IDA7Ci0gICAgbUhhc0ZkcyA9IGZhbHNlOwotICAgIG1GZHNLbm93biA9IHRydWU7Ci0gICAgbUFsbG93RmRzID0gdHJ1ZTsKLSAgICBtT3duZXIgPSBOVUxMOwotfQotCi12b2lkIFBhcmNlbDo6c2NhbkZvckZkcygpIGNvbnN0Ci17Ci0gICAgYm9vbCBoYXNGZHMgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpPTA7IGk8bU9iamVjdHNTaXplOyBpKyspIHsKLSAgICAgICAgY29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0KiBmbGF0Ci0gICAgICAgICAgICA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxhdF9iaW5kZXJfb2JqZWN0Kj4obURhdGEgKyBtT2JqZWN0c1tpXSk7Ci0gICAgICAgIGlmIChmbGF0LT50eXBlID09IEJJTkRFUl9UWVBFX0ZEKSB7Ci0gICAgICAgICAgICBoYXNGZHMgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUhhc0ZkcyA9IGhhc0ZkczsKLSAgICBtRmRzS25vd24gPSB0cnVlOwotfQotCi0vLyAtLS0gUGFyY2VsOjpCbG9iIC0tLQotCi1QYXJjZWw6OkJsb2I6OkJsb2IoKSA6Ci0gICAgICAgIG1NYXBwZWQoZmFsc2UpLCBtRGF0YShOVUxMKSwgbVNpemUoMCkgewotfQotCi1QYXJjZWw6OkJsb2I6On5CbG9iKCkgewotICAgIHJlbGVhc2UoKTsKLX0KLQotdm9pZCBQYXJjZWw6OkJsb2I6OnJlbGVhc2UoKSB7Ci0gICAgaWYgKG1NYXBwZWQgJiYgbURhdGEpIHsKLSAgICAgICAgOjptdW5tYXAobURhdGEsIG1TaXplKTsKLSAgICB9Ci0gICAgY2xlYXIoKTsKLX0KLQotdm9pZCBQYXJjZWw6OkJsb2I6OmluaXQoYm9vbCBtYXBwZWQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgbU1hcHBlZCA9IG1hcHBlZDsKLSAgICBtRGF0YSA9IGRhdGE7Ci0gICAgbVNpemUgPSBzaXplOwotfQotCi12b2lkIFBhcmNlbDo6QmxvYjo6Y2xlYXIoKSB7Ci0gICAgbU1hcHBlZCA9IGZhbHNlOwotICAgIG1EYXRhID0gTlVMTDsKLSAgICBtU2l6ZSA9IDA7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9QZXJtaXNzaW9uQ2FjaGUuY3BwIGIvbGlicy9iaW5kZXIvUGVybWlzc2lvbkNhY2hlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUwM2JlOC4uMDAwMDAwMAotLS0gYS9saWJzL2JpbmRlci9QZXJtaXNzaW9uQ2FjaGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlBlcm1pc3Npb25DYWNoZSIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKFBlcm1pc3Npb25DYWNoZSkgOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBlcm1pc3Npb25DYWNoZTo6UGVybWlzc2lvbkNhY2hlKCkgewotfQotCi1zdGF0dXNfdCBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrKGJvb2wqIGdyYW50ZWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLCB1aWRfdCB1aWQpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEVudHJ5IGU7Ci0gICAgZS5uYW1lID0gcGVybWlzc2lvbjsKLSAgICBlLnVpZCAgPSB1aWQ7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZS5pbmRleE9mKGUpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICpncmFudGVkID0gbUNhY2hlLml0ZW1BdChpbmRleCkuZ3JhbnRlZDsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci19Ci0KLXZvaWQgUGVybWlzc2lvbkNhY2hlOjpjYWNoZShjb25zdCBTdHJpbmcxNiYgcGVybWlzc2lvbiwKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIGdyYW50ZWQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEVudHJ5IGU7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1QZXJtaXNzaW9uTmFtZXNQb29sLmluZGV4T2YocGVybWlzc2lvbik7Ci0gICAgaWYgKGluZGV4ID4gMCkgewotICAgICAgICBlLm5hbWUgPSBtUGVybWlzc2lvbk5hbWVzUG9vbC5pdGVtQXQoaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1QZXJtaXNzaW9uTmFtZXNQb29sLmFkZChwZXJtaXNzaW9uKTsKLSAgICAgICAgZS5uYW1lID0gcGVybWlzc2lvbjsKLSAgICB9Ci0gICAgLy8gbm90ZSwgd2UgZG9uJ3QgbmVlZCB0byBzdG9yZSB0aGUgcGlkLCB3aGljaCBpcyBub3QgYWN0dWFsbHkgdXNlZCBpbgotICAgIC8vIHBlcm1pc3Npb24gY2hlY2tzCi0gICAgZS51aWQgID0gdWlkOwotICAgIGUuZ3JhbnRlZCA9IGdyYW50ZWQ7Ci0gICAgaW5kZXggPSBtQ2FjaGUuaW5kZXhPZihlKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIG1DYWNoZS5hZGQoZSk7Ci0gICAgfQotfQotCi12b2lkIFBlcm1pc3Npb25DYWNoZTo6cHVyZ2UoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtQ2FjaGUuY2xlYXIoKTsKLX0KLQotYm9vbCBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24pIHsKLSAgICByZXR1cm4gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb24sIE5VTEwsIE5VTEwpOwotfQotCi1ib29sIFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbigKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBlcm1pc3Npb24sIGludDMyX3QqIG91dFBpZCwgaW50MzJfdCogb3V0VWlkKSB7Ci0gICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKLSAgICBwaWRfdCBwaWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIHVpZF90IHVpZCA9IGlwY1N0YXRlLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG91dFBpZCkgKm91dFBpZCA9IHBpZDsKLSAgICBpZiAob3V0VWlkKSAqb3V0VWlkID0gdWlkOwotICAgIHJldHVybiBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihwZXJtaXNzaW9uLCBwaWQsIHVpZCk7Ci19Ci0KLWJvb2wgUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIGlmICgodWlkID09IDApIHx8IChwaWQgPT0gZ2V0cGlkKCkpKSB7Ci0gICAgICAgIC8vIHJvb3QgYW5kIG91cnNlbHZlcyBpcyBhbHdheXMgb2theQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBQZXJtaXNzaW9uQ2FjaGUmIHBjKFBlcm1pc3Npb25DYWNoZTo6Z2V0SW5zdGFuY2UoKSk7Ci0gICAgYm9vbCBncmFudGVkID0gZmFsc2U7Ci0gICAgaWYgKHBjLmNoZWNrKCZncmFudGVkLCBwZXJtaXNzaW9uLCB1aWQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG5zZWNzX3QgdCA9IC1zeXN0ZW1UaW1lKCk7Ci0gICAgICAgIGdyYW50ZWQgPSBhbmRyb2lkOjpjaGVja1Blcm1pc3Npb24ocGVybWlzc2lvbiwgcGlkLCB1aWQpOwotICAgICAgICB0ICs9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgQUxPR0QoImNoZWNraW5nICVzIGZvciB1aWQ9JWQgPT4gJXMgKCVkIHVzKSIsCi0gICAgICAgICAgICAgICAgU3RyaW5nOChwZXJtaXNzaW9uKS5zdHJpbmcoKSwgdWlkLAotICAgICAgICAgICAgICAgIGdyYW50ZWQ/ImdyYW50ZWQiOiJkZW5pZWQiLCAoaW50KW5zMnVzKHQpKTsKLSAgICAgICAgcGMuY2FjaGUocGVybWlzc2lvbiwgdWlkLCBncmFudGVkKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdyYW50ZWQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1Byb2Nlc3NTdGF0ZS5jcHAgYi9saWJzL2JpbmRlci9Qcm9jZXNzU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmE0MTJjLi4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL1Byb2Nlc3NTdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUHJvY2Vzc1N0YXRlIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb2Nlc3NfbmFtZS5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0JwQmluZGVyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvYmluZGVyX21vZHVsZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvYmluZGVyL1N0YXRpYy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jZGVmaW5lIEJJTkRFUl9WTV9TSVpFICgoMSoxMDI0KjEwMjQpIC0gKDQwOTYgKjIpKQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0gCi0vLyBHbG9iYWwgdmFyaWFibGVzCi1pbnQgICAgICAgICAgICAgICAgIG1BcmdDOwotY29uc3QgY2hhciogY29uc3QqICBtQXJnVjsKLWludCAgICAgICAgICAgICAgICAgbUFyZ0xlbjsKLQotY2xhc3MgUG9vbFRocmVhZCA6IHB1YmxpYyBUaHJlYWQKLXsKLXB1YmxpYzoKLSAgICBQb29sVGhyZWFkKGJvb2wgaXNNYWluKQotICAgICAgICA6IG1Jc01haW4oaXNNYWluKQotICAgIHsKLSAgICB9Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKQotICAgIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2wobUlzTWFpbik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgY29uc3QgYm9vbCBtSXNNYWluOwotfTsKLQotc3A8UHJvY2Vzc1N0YXRlPiBQcm9jZXNzU3RhdGU6OnNlbGYoKQotewotICAgIGlmIChnUHJvY2VzcyAhPSBOVUxMKSByZXR1cm4gZ1Byb2Nlc3M7Ci0gICAgCi0gICAgQXV0b011dGV4IF9sKGdQcm9jZXNzTXV0ZXgpOwotICAgIGlmIChnUHJvY2VzcyA9PSBOVUxMKSBnUHJvY2VzcyA9IG5ldyBQcm9jZXNzU3RhdGU7Ci0gICAgcmV0dXJuIGdQcm9jZXNzOwotfQotCi12b2lkIFByb2Nlc3NTdGF0ZTo6c2V0Q29udGV4dE9iamVjdChjb25zdCBzcDxJQmluZGVyPiYgb2JqZWN0KQotewotICAgIHNldENvbnRleHRPYmplY3Qob2JqZWN0LCBTdHJpbmcxNigiZGVmYXVsdCIpKTsKLX0KLQotc3A8SUJpbmRlcj4gUHJvY2Vzc1N0YXRlOjpnZXRDb250ZXh0T2JqZWN0KGNvbnN0IHNwPElCaW5kZXI+JiBjYWxsZXIpCi17Ci0gICAgcmV0dXJuIGdldFN0cm9uZ1Byb3h5Rm9ySGFuZGxlKDApOwotfQotCi12b2lkIFByb2Nlc3NTdGF0ZTo6c2V0Q29udGV4dE9iamVjdChjb25zdCBzcDxJQmluZGVyPiYgb2JqZWN0LCBjb25zdCBTdHJpbmcxNiYgbmFtZSkKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIG1Db250ZXh0cy5hZGQobmFtZSwgb2JqZWN0KTsKLX0KLQotc3A8SUJpbmRlcj4gUHJvY2Vzc1N0YXRlOjpnZXRDb250ZXh0T2JqZWN0KGNvbnN0IFN0cmluZzE2JiBuYW1lLCBjb25zdCBzcDxJQmluZGVyPiYgY2FsbGVyKQotewotICAgIG1Mb2NrLmxvY2soKTsKLSAgICBzcDxJQmluZGVyPiBvYmplY3QoCi0gICAgICAgIG1Db250ZXh0cy5pbmRleE9mS2V5KG5hbWUpID49IDAgPyBtQ29udGV4dHMudmFsdWVGb3IobmFtZSkgOiBOVUxMKTsKLSAgICBtTG9jay51bmxvY2soKTsKLSAgICAKLSAgICAvL3ByaW50ZigiR2V0dGluZyBjb250ZXh0IG9iamVjdCAlcyBmb3IgJXBcbiIsIFN0cmluZzgobmFtZSkuc3RyaW5nKCksIGNhbGxlci5nZXQoKSk7Ci0gICAgCi0gICAgaWYgKG9iamVjdCAhPSBOVUxMKSByZXR1cm4gb2JqZWN0OwotCi0gICAgLy8gRG9uJ3QgYXR0ZW1wdCB0byByZXRyaWV2ZSBjb250ZXh0cyBpZiB3ZSBtYW5hZ2UgdGhlbQotICAgIGlmIChtTWFuYWdlc0NvbnRleHRzKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRDb250ZXh0T2JqZWN0KCVzKSBmYWlsZWQsIGJ1dCB3ZSBtYW5hZ2UgdGhlIGNvbnRleHRzIVxuIiwKLSAgICAgICAgICAgIFN0cmluZzgobmFtZSkuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgCi0gICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIC8vIG5vIGludGVyZmFjZSB0b2tlbiBvbiB0aGlzIG1hZ2ljIHRyYW5zYWN0aW9uCi0gICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihuYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihjYWxsZXIpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBpcGMtPnRyYW5zYWN0KDAgLyptYWdpYyovLCAwLCBkYXRhLCAmcmVwbHksIDApOwotICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBvYmplY3QgPSByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaXBjLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgCi0gICAgaWYgKG9iamVjdCAhPSBOVUxMKSBzZXRDb250ZXh0T2JqZWN0KG9iamVjdCwgbmFtZSk7Ci0gICAgcmV0dXJuIG9iamVjdDsKLX0KLQotdm9pZCBQcm9jZXNzU3RhdGU6OnN0YXJ0VGhyZWFkUG9vbCgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICBpZiAoIW1UaHJlYWRQb29sU3RhcnRlZCkgewotICAgICAgICBtVGhyZWFkUG9vbFN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBzcGF3blBvb2xlZFRocmVhZCh0cnVlKTsKLSAgICB9Ci19Ci0KLWJvb2wgUHJvY2Vzc1N0YXRlOjppc0NvbnRleHRNYW5hZ2VyKHZvaWQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1NYW5hZ2VzQ29udGV4dHM7Ci19Ci0KLWJvb2wgUHJvY2Vzc1N0YXRlOjpiZWNvbWVDb250ZXh0TWFuYWdlcihjb250ZXh0X2NoZWNrX2Z1bmMgY2hlY2tGdW5jLCB2b2lkKiB1c2VyRGF0YSkKLXsKLSAgICBpZiAoIW1NYW5hZ2VzQ29udGV4dHMpIHsKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICAgICAgbUJpbmRlckNvbnRleHRDaGVja0Z1bmMgPSBjaGVja0Z1bmM7Ci0gICAgICAgIG1CaW5kZXJDb250ZXh0VXNlckRhdGEgPSB1c2VyRGF0YTsKLQotICAgICAgICBpbnQgZHVtbXkgPSAwOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBpb2N0bChtRHJpdmVyRkQsIEJJTkRFUl9TRVRfQ09OVEVYVF9NR1IsICZkdW1teSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICAgICAgbU1hbmFnZXNDb250ZXh0cyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBtQmluZGVyQ29udGV4dENoZWNrRnVuYyA9IE5VTEw7Ci0gICAgICAgICAgICBtQmluZGVyQ29udGV4dFVzZXJEYXRhID0gTlVMTDsKLSAgICAgICAgICAgIEFMT0dFKCJCaW5kZXIgaW9jdGwgdG8gYmVjb21lIGNvbnRleHQgbWFuYWdlciBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtTWFuYWdlc0NvbnRleHRzOwotfQotCi1Qcm9jZXNzU3RhdGU6OmhhbmRsZV9lbnRyeSogUHJvY2Vzc1N0YXRlOjpsb29rdXBIYW5kbGVMb2NrZWQoaW50MzJfdCBoYW5kbGUpCi17Ci0gICAgY29uc3Qgc2l6ZV90IE49bUhhbmRsZVRvT2JqZWN0LnNpemUoKTsKLSAgICBpZiAoTiA8PSAoc2l6ZV90KWhhbmRsZSkgewotICAgICAgICBoYW5kbGVfZW50cnkgZTsKLSAgICAgICAgZS5iaW5kZXIgPSBOVUxMOwotICAgICAgICBlLnJlZnMgPSBOVUxMOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtSGFuZGxlVG9PYmplY3QuaW5zZXJ0QXQoZSwgTiwgaGFuZGxlKzEtTik7Ci0gICAgICAgIGlmIChlcnIgPCBOT19FUlJPUikgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAmbUhhbmRsZVRvT2JqZWN0LmVkaXRJdGVtQXQoaGFuZGxlKTsKLX0KLQotc3A8SUJpbmRlcj4gUHJvY2Vzc1N0YXRlOjpnZXRTdHJvbmdQcm94eUZvckhhbmRsZShpbnQzMl90IGhhbmRsZSkKLXsKLSAgICBzcDxJQmluZGVyPiByZXN1bHQ7Ci0KLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotCi0gICAgaGFuZGxlX2VudHJ5KiBlID0gbG9va3VwSGFuZGxlTG9ja2VkKGhhbmRsZSk7Ci0KLSAgICBpZiAoZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IEJwQmluZGVyIGlmIHRoZXJlIGlzbid0IGN1cnJlbnRseSBvbmUsIE9SIHdlCi0gICAgICAgIC8vIGFyZSB1bmFibGUgdG8gYWNxdWlyZSBhIHdlYWsgcmVmZXJlbmNlIG9uIHRoaXMgY3VycmVudCBvbmUuICBTZWUgY29tbWVudAotICAgICAgICAvLyBpbiBnZXRXZWFrUHJveHlGb3JIYW5kbGUoKSBmb3IgbW9yZSBpbmZvIGFib3V0IHRoaXMuCi0gICAgICAgIElCaW5kZXIqIGIgPSBlLT5iaW5kZXI7Ci0gICAgICAgIGlmIChiID09IE5VTEwgfHwgIWUtPnJlZnMtPmF0dGVtcHRJbmNXZWFrKHRoaXMpKSB7Ci0gICAgICAgICAgICBiID0gbmV3IEJwQmluZGVyKGhhbmRsZSk7IAotICAgICAgICAgICAgZS0+YmluZGVyID0gYjsKLSAgICAgICAgICAgIGlmIChiKSBlLT5yZWZzID0gYi0+Z2V0V2Vha1JlZnMoKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGxpdHRsZSBiaXQgb2YgbmFzdHluZXNzIGlzIHRvIGFsbG93IHVzIHRvIGFkZCBhIHByaW1hcnkKLSAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgcmVtb3RlIHByb3h5IHdoZW4gdGhpcyB0ZWFtIGRvZXNuJ3QgaGF2ZSBvbmUKLSAgICAgICAgICAgIC8vIGJ1dCBhbm90aGVyIHRlYW0gaXMgc2VuZGluZyB0aGUgaGFuZGxlIHRvIHVzLgotICAgICAgICAgICAgcmVzdWx0LmZvcmNlX3NldChiKTsKLSAgICAgICAgICAgIGUtPnJlZnMtPmRlY1dlYWsodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi13cDxJQmluZGVyPiBQcm9jZXNzU3RhdGU6OmdldFdlYWtQcm94eUZvckhhbmRsZShpbnQzMl90IGhhbmRsZSkKLXsKLSAgICB3cDxJQmluZGVyPiByZXN1bHQ7Ci0KLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotCi0gICAgaGFuZGxlX2VudHJ5KiBlID0gbG9va3VwSGFuZGxlTG9ja2VkKGhhbmRsZSk7Ci0KLSAgICBpZiAoZSAhPSBOVUxMKSB7ICAgICAgICAKLSAgICAgICAgLy8gV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgQnBCaW5kZXIgaWYgdGhlcmUgaXNuJ3QgY3VycmVudGx5IG9uZSwgT1Igd2UKLSAgICAgICAgLy8gYXJlIHVuYWJsZSB0byBhY3F1aXJlIGEgd2VhayByZWZlcmVuY2Ugb24gdGhpcyBjdXJyZW50IG9uZS4gIFRoZQotICAgICAgICAvLyBhdHRlbXB0SW5jV2VhaygpIGlzIHNhZmUgYmVjYXVzZSB3ZSBrbm93IHRoZSBCcEJpbmRlciBkZXN0cnVjdG9yIHdpbGwgYWx3YXlzCi0gICAgICAgIC8vIGNhbGwgZXhwdW5nZUhhbmRsZSgpLCB3aGljaCBhY3F1aXJlcyB0aGUgc2FtZSBsb2NrIHdlIGFyZSBob2xkaW5nIG5vdy4KLSAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgdGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHNvbWVvbmUKLSAgICAgICAgLy8gcmVsZWFzaW5nIGEgcmVmZXJlbmNlIG9uIHRoaXMgQnBCaW5kZXIsIGFuZCBhIG5ldyByZWZlcmVuY2Ugb24gaXRzIGhhbmRsZQotICAgICAgICAvLyBhcnJpdmluZyBmcm9tIHRoZSBkcml2ZXIuCi0gICAgICAgIElCaW5kZXIqIGIgPSBlLT5iaW5kZXI7Ci0gICAgICAgIGlmIChiID09IE5VTEwgfHwgIWUtPnJlZnMtPmF0dGVtcHRJbmNXZWFrKHRoaXMpKSB7Ci0gICAgICAgICAgICBiID0gbmV3IEJwQmluZGVyKGhhbmRsZSk7Ci0gICAgICAgICAgICByZXN1bHQgPSBiOwotICAgICAgICAgICAgZS0+YmluZGVyID0gYjsKLSAgICAgICAgICAgIGlmIChiKSBlLT5yZWZzID0gYi0+Z2V0V2Vha1JlZnMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGI7Ci0gICAgICAgICAgICBlLT5yZWZzLT5kZWNXZWFrKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBQcm9jZXNzU3RhdGU6OmV4cHVuZ2VIYW5kbGUoaW50MzJfdCBoYW5kbGUsIElCaW5kZXIqIGJpbmRlcikKLXsKLSAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIAotICAgIGhhbmRsZV9lbnRyeSogZSA9IGxvb2t1cEhhbmRsZUxvY2tlZChoYW5kbGUpOwotCi0gICAgLy8gVGhpcyBoYW5kbGUgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlcGxhY2VkIHdpdGggYSBuZXcgQnBCaW5kZXIKLSAgICAvLyAoaWYgc29tZW9uZSBmYWlsZWQgdGhlIEF0dGVtcHRJbmNXZWFrKCkgYWJvdmUpOyB3ZSBkb24ndCB3YW50Ci0gICAgLy8gdG8gb3ZlcndyaXRlIGl0LgotICAgIGlmIChlICYmIGUtPmJpbmRlciA9PSBiaW5kZXIpIGUtPmJpbmRlciA9IE5VTEw7Ci19Ci0KLXZvaWQgUHJvY2Vzc1N0YXRlOjpzZXRBcmdzKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pCi17Ci0gICAgbUFyZ0MgPSBhcmdjOwotICAgIG1BcmdWID0gKGNvbnN0IGNoYXIgKiopYXJndjsKLQotICAgIG1BcmdMZW4gPSAwOwotICAgIGZvciAoaW50IGk9MDsgaTxhcmdjOyBpKyspIHsKLSAgICAgICAgbUFyZ0xlbiArPSBzdHJsZW4oYXJndltpXSkgKyAxOwotICAgIH0KLSAgICBtQXJnTGVuLS07Ci19Ci0KLWludCBQcm9jZXNzU3RhdGU6OmdldEFyZ0MoKSBjb25zdAotewotICAgIHJldHVybiBtQXJnQzsKLX0KLQotY29uc3QgY2hhciogY29uc3QqIFByb2Nlc3NTdGF0ZTo6Z2V0QXJnVigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1BcmdWOwotfQotCi12b2lkIFByb2Nlc3NTdGF0ZTo6c2V0QXJnVjAoY29uc3QgY2hhciogdHh0KQotewotICAgIGlmIChtQXJnViAhPSBOVUxMKSB7Ci0gICAgICAgIHN0cm5jcHkoKGNoYXIqKW1BcmdWWzBdLCB0eHQsIG1BcmdMZW4pOwotICAgICAgICBzZXRfcHJvY2Vzc19uYW1lKHR4dCk7Ci0gICAgfQotfQotCi12b2lkIFByb2Nlc3NTdGF0ZTo6c3Bhd25Qb29sZWRUaHJlYWQoYm9vbCBpc01haW4pCi17Ci0gICAgaWYgKG1UaHJlYWRQb29sU3RhcnRlZCkgewotICAgICAgICBpbnQzMl90IHMgPSBhbmRyb2lkX2F0b21pY19hZGQoMSwgJm1UaHJlYWRQb29sU2VxKTsKLSAgICAgICAgY2hhciBidWZbMTZdOwotICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQmluZGVyXyVYIiwgcyk7Ci0gICAgICAgIEFMT0dWKCJTcGF3bmluZyBuZXcgcG9vbGVkIHRocmVhZCwgbmFtZT0lc1xuIiwgYnVmKTsKLSAgICAgICAgc3A8VGhyZWFkPiB0ID0gbmV3IFBvb2xUaHJlYWQoaXNNYWluKTsKLSAgICAgICAgdC0+cnVuKGJ1Zik7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IG9wZW5fZHJpdmVyKCkKLXsKLSAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L2JpbmRlciIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOwotICAgICAgICBpbnQgdmVyczsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gaW9jdGwoZmQsIEJJTkRFUl9WRVJTSU9OLCAmdmVycyk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCaW5kZXIgaW9jdGwgdG8gb2J0YWluIHZlcnNpb24gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBmZCA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gMCB8fCB2ZXJzICE9IEJJTkRFUl9DVVJSRU5UX1BST1RPQ09MX1ZFUlNJT04pIHsKLSAgICAgICAgICAgIEFMT0dFKCJCaW5kZXIgZHJpdmVyIHByb3RvY29sIGRvZXMgbm90IG1hdGNoIHVzZXIgc3BhY2UgcHJvdG9jb2whIik7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBmZCA9IC0xOwotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBtYXhUaHJlYWRzID0gMTU7Ci0gICAgICAgIHJlc3VsdCA9IGlvY3RsKGZkLCBCSU5ERVJfU0VUX01BWF9USFJFQURTLCAmbWF4VGhyZWFkcyk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJCaW5kZXIgaW9jdGwgdG8gc2V0IG1heCB0aHJlYWRzIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIk9wZW5pbmcgJy9kZXYvYmluZGVyJyBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0KLSAgICByZXR1cm4gZmQ7Ci19Ci0KLVByb2Nlc3NTdGF0ZTo6UHJvY2Vzc1N0YXRlKCkKLSAgICA6IG1Ecml2ZXJGRChvcGVuX2RyaXZlcigpKQotICAgICwgbVZNU3RhcnQoTUFQX0ZBSUxFRCkKLSAgICAsIG1NYW5hZ2VzQ29udGV4dHMoZmFsc2UpCi0gICAgLCBtQmluZGVyQ29udGV4dENoZWNrRnVuYyhOVUxMKQotICAgICwgbUJpbmRlckNvbnRleHRVc2VyRGF0YShOVUxMKQotICAgICwgbVRocmVhZFBvb2xTdGFydGVkKGZhbHNlKQotICAgICwgbVRocmVhZFBvb2xTZXEoMSkKLXsKLSAgICBpZiAobURyaXZlckZEID49IDApIHsKLSAgICAgICAgLy8gWFhYIElkZWFsbHksIHRoZXJlIHNob3VsZCBiZSBhIHNwZWNpZmljIGRlZmluZSBmb3Igd2hldGhlciB3ZQotICAgICAgICAvLyBoYXZlIG1tYXAgKG9yIHdoZXRoZXIgd2UgY291bGQgcG9zc2libHkgaGF2ZSB0aGUga2VybmVsIG1vZHVsZQotICAgICAgICAvLyBhdmFpbGFibGEpLgotI2lmICFkZWZpbmVkKEhBVkVfV0lOMzJfSVBDKQotICAgICAgICAvLyBtbWFwIHRoZSBiaW5kZXIsIHByb3ZpZGluZyBhIGNodW5rIG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSB0byByZWNlaXZlIHRyYW5zYWN0aW9ucy4KLSAgICAgICAgbVZNU3RhcnQgPSBtbWFwKDAsIEJJTkRFUl9WTV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFIHwgTUFQX05PUkVTRVJWRSwgbURyaXZlckZELCAwKTsKLSAgICAgICAgaWYgKG1WTVN0YXJ0ID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgIC8vICpzaWdoKgotICAgICAgICAgICAgQUxPR0UoIlVzaW5nIC9kZXYvYmluZGVyIGZhaWxlZDogdW5hYmxlIHRvIG1tYXAgdHJhbnNhY3Rpb24gbWVtb3J5LlxuIik7Ci0gICAgICAgICAgICBjbG9zZShtRHJpdmVyRkQpOwotICAgICAgICAgICAgbURyaXZlckZEID0gLTE7Ci0gICAgICAgIH0KLSNlbHNlCi0gICAgICAgIG1Ecml2ZXJGRCA9IC0xOwotI2VuZGlmCi0gICAgfQotCi0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRHJpdmVyRkQgPCAwLCAiQmluZGVyIGRyaXZlciBjb3VsZCBub3QgYmUgb3BlbmVkLiAgVGVybWluYXRpbmcuIik7Ci19Ci0KLVByb2Nlc3NTdGF0ZTo6flByb2Nlc3NTdGF0ZSgpCi17Ci19Ci0gICAgICAgIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1N0YXRpYy5jcHAgYi9saWJzL2JpbmRlci9TdGF0aWMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmIwMzA4Li4wMDAwMDAwCi0tLSBhL2xpYnMvYmluZGVyL1N0YXRpYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQWxsIHN0YXRpYyB2YXJpYWJsZXMgZ28gaGVyZSwgdG8gY29udHJvbCBpbml0aWFsaXphdGlvbiBhbmQKLS8vIGRlc3RydWN0aW9uIG9yZGVyIGluIHRoZSBsaWJyYXJ5LgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvU3RhdGljLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0gUHJvY2Vzc1N0YXRlLmNwcAotCi1NdXRleCBnUHJvY2Vzc011dGV4Owotc3A8UHJvY2Vzc1N0YXRlPiBnUHJvY2VzczsKLQotY2xhc3MgTGliVXRpbHNJUEN0U3RhdGljcwotewotcHVibGljOgotICAgIExpYlV0aWxzSVBDdFN0YXRpY3MoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgfkxpYlV0aWxzSVBDdFN0YXRpY3MoKQotICAgIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNodXRkb3duKCk7Ci0gICAgfQotfTsKLQotc3RhdGljIExpYlV0aWxzSVBDdFN0YXRpY3MgZ0lQQ1N0YXRpY3M7Ci0KLS8vIC0tLS0tLS0tLS0tLSBTZXJ2aWNlTWFuYWdlci5jcHAKLQotTXV0ZXggZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2s7Ci1zcDxJU2VydmljZU1hbmFnZXI+IGdEZWZhdWx0U2VydmljZU1hbmFnZXI7Ci1zcDxJUGVybWlzc2lvbkNvbnRyb2xsZXI+IGdQZXJtaXNzaW9uQ29udHJvbGxlcjsKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9BbmRyb2lkLm1rIGIvbGlicy9ndWkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0YWM2Mi4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCUJpdFR1YmUuY3BwIFwKLQlCdWZmZXJRdWV1ZS5jcHAgXAotCURpc3BsYXlFdmVudFJlY2VpdmVyLmNwcCBcCi0JSURpc3BsYXlFdmVudENvbm5lY3Rpb24uY3BwIFwKLQlJU2Vuc29yRXZlbnRDb25uZWN0aW9uLmNwcCBcCi0JSVNlbnNvclNlcnZlci5jcHAgXAotCUlTdXJmYWNlVGV4dHVyZS5jcHAgXAotCVNlbnNvci5jcHAgXAotCVNlbnNvckV2ZW50UXVldWUuY3BwIFwKLQlTZW5zb3JNYW5hZ2VyLmNwcCBcCi0JU3VyZmFjZVRleHR1cmUuY3BwIFwKLQlTdXJmYWNlVGV4dHVyZUNsaWVudC5jcHAgXAotCUlTdXJmYWNlQ29tcG9zZXIuY3BwIFwKLQlJU3VyZmFjZS5jcHAgXAotCUlTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwIFwKLQlJR3JhcGhpY0J1ZmZlckFsbG9jLmNwcCBcCi0JTGF5ZXJTdGF0ZS5jcHAgXAotCVN1cmZhY2UuY3BwIFwKLQlTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0JbGliYmluZGVyIFwKLQlsaWJoYXJkd2FyZSBcCi0JbGliaGFyZHdhcmVfbGVnYWN5IFwKLQlsaWJ1aSBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIgXAotCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmd1aQotCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIG9tYXA0KQotCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9GRU5DRV9TWU5DCi1lbmRpZgotaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLCBzNXBjMTEwKQotCUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9GRU5DRV9TWU5DCi1lbmRpZgotCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIHRlZ3JhKQotCUxPQ0FMX0NGTEFHUyArPSAtREFMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIKLWVuZGlmCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaWZlcSAoLCQoT05FX1NIT1RfTUFLRUZJTEUpKQotaW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQml0VHViZS5jcHAgYi9saWJzL2d1aS9CaXRUdWJlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmNDE3OC4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9CaXRUdWJlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1CaXRUdWJlOjpCaXRUdWJlKCkKLSAgICA6IG1TZW5kRmQoLTEpLCBtUmVjZWl2ZUZkKC0xKQotewotICAgIGludCBmZHNbMl07Ci0gICAgaWYgKHBpcGUoZmRzKSA9PSAwKSB7Ci0gICAgICAgIG1SZWNlaXZlRmQgPSBmZHNbMF07Ci0gICAgICAgIG1TZW5kRmQgPSBmZHNbMV07Ci0gICAgICAgIGZjbnRsKG1SZWNlaXZlRmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgICAgICBmY250bChtU2VuZEZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLSAgICAgICAgLy8gaWdub3JlIFNJR1BJUEUsIHdlIGhhbmRsZSB3cml0ZSBlcnJvcnMgdGhyb3VnaCBFUElQRSBpbnN0ZWFkCi0gICAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtUmVjZWl2ZUZkID0gLWVycm5vOwotICAgICAgICBBTE9HRSgiQml0VHViZTogcGlwZSBjcmVhdGlvbiBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKC1tUmVjZWl2ZUZkKSk7Ci0gICAgfQotfQotCi1CaXRUdWJlOjpCaXRUdWJlKGNvbnN0IFBhcmNlbCYgZGF0YSkKLSAgICA6IG1TZW5kRmQoLTEpLCBtUmVjZWl2ZUZkKC0xKQotewotICAgIG1SZWNlaXZlRmQgPSBkdXAoZGF0YS5yZWFkRmlsZURlc2NyaXB0b3IoKSk7Ci0gICAgaWYgKG1SZWNlaXZlRmQgPj0gMCkgewotICAgICAgICBmY250bChtUmVjZWl2ZUZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtUmVjZWl2ZUZkID0gLWVycm5vOwotICAgICAgICBBTE9HRSgiQml0VHViZShQYXJjZWwpOiBjYW4ndCBkdXAgZmlsZWRlc2NyaXB0b3IgKCVzKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLW1SZWNlaXZlRmQpKTsKLSAgICB9Ci19Ci0KLUJpdFR1YmU6On5CaXRUdWJlKCkKLXsKLSAgICBpZiAobVNlbmRGZCA+PSAwKQotICAgICAgICBjbG9zZShtU2VuZEZkKTsKLQotICAgIGlmIChtUmVjZWl2ZUZkID49IDApCi0gICAgICAgIGNsb3NlKG1SZWNlaXZlRmQpOwotfQotCi1zdGF0dXNfdCBCaXRUdWJlOjppbml0Q2hlY2soKSBjb25zdAotewotICAgIGlmIChtUmVjZWl2ZUZkIDwgMCkgewotICAgICAgICByZXR1cm4gc3RhdHVzX3QobVJlY2VpdmVGZCk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotaW50IEJpdFR1YmU6OmdldEZkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVJlY2VpdmVGZDsKLX0KLQotc3NpemVfdCBCaXRUdWJlOjp3cml0ZSh2b2lkIGNvbnN0KiB2YWRkciwgc2l6ZV90IHNpemUpCi17Ci0gICAgc3NpemVfdCBlcnIsIGxlbjsKLSAgICBkbyB7Ci0gICAgICAgIGxlbiA9IDo6d3JpdGUobVNlbmRGZCwgdmFkZHIsIHNpemUpOwotICAgICAgICBlcnIgPSBsZW4gPCAwID8gZXJybm8gOiAwOwotICAgIH0gd2hpbGUgKGVyciA9PSBFSU5UUik7Ci0gICAgcmV0dXJuIGVyciA9PSAwID8gbGVuIDogLWVycjsKLQotfQotCi1zc2l6ZV90IEJpdFR1YmU6OnJlYWQodm9pZCogdmFkZHIsIHNpemVfdCBzaXplKQotewotICAgIHNzaXplX3QgZXJyLCBsZW47Ci0gICAgZG8gewotICAgICAgICBsZW4gPSA6OnJlYWQobVJlY2VpdmVGZCwgdmFkZHIsIHNpemUpOwotICAgICAgICBlcnIgPSBsZW4gPCAwID8gZXJybm8gOiAwOwotICAgIH0gd2hpbGUgKGVyciA9PSBFSU5UUik7Ci0gICAgaWYgKGVyciA9PSBFQUdBSU4gfHwgZXJyID09IEVXT1VMREJMT0NLKSB7Ci0gICAgICAgIC8vIEVBR0FJTiBtZWFucyB0aGF0IHdlIGhhdmUgbm9uLWJsb2NraW5nIEkvTyBidXQgdGhlcmUgd2FzCi0gICAgICAgIC8vIG5vIGRhdGEgdG8gYmUgcmVhZC4gTm90aGluZyB0aGUgY2xpZW50IHNob3VsZCBjYXJlIGFib3V0LgotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGVyciA9PSAwID8gbGVuIDogLWVycjsKLX0KLQotc3RhdHVzX3QgQml0VHViZTo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHJlcGx5KSBjb25zdAotewotICAgIGlmIChtUmVjZWl2ZUZkIDwgMCkKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSByZXBseS0+d3JpdGVEdXBGaWxlRGVzY3JpcHRvcihtUmVjZWl2ZUZkKTsKLSAgICBjbG9zZShtUmVjZWl2ZUZkKTsKLSAgICBtUmVjZWl2ZUZkID0gLTE7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0J1ZmZlclF1ZXVlLmNwcCBiL2xpYnMvZ3VpL0J1ZmZlclF1ZXVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhNGMyMi4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9CdWZmZXJRdWV1ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUXVldWUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwotCi0jZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKLSNkZWZpbmUgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotCi0jaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZS5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLS8vIFRoaXMgY29tcGlsZSBvcHRpb24gY2F1c2VzIFN1cmZhY2VUZXh0dXJlIHRvIHJldHVybiB0aGUgYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5Ci0vLyBhdHRhY2hlZCB0byB0aGUgR0wgdGV4dHVyZSBmcm9tIGRlcXVldWVCdWZmZXIgd2hlbiBubyBvdGhlciBidWZmZXJzIGFyZQotLy8gYXZhaWxhYmxlLiAgSXQgcmVxdWlyZXMgdGhlIGRyaXZlcnMgKEdyYWxsb2MsIEdMLCBPTVggSUwsIGFuZCBDYW1lcmEpIHRvIGRvCi0vLyBpbXBsaWNpdCBjcm9zcy1wcm9jZXNzIHN5bmNocm9uaXphdGlvbiB0byBwcmV2ZW50IHRoZSBidWZmZXIgZnJvbSBiZWluZwotLy8gd3JpdHRlbiB0byBiZWZvcmUgdGhlIGJ1ZmZlciBoYXMgKGEpIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgR0wgdGV4dHVyZSBhbmQKLS8vIChiKSBhbGwgR0wgcmVhZHMgZnJvbSB0aGUgYnVmZmVyIGhhdmUgY29tcGxldGVkLgotCi0vLyBEdXJpbmcgcmVmYWN0b3JpbmcsIGRvIG5vdCBzdXBwb3J0IGRlcXVldWluZyB0aGUgY3VycmVudCBidWZmZXIKLSN1bmRlZiBBTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSCi0KLSNpZmRlZiBBTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSCi0jZGVmaW5lIEZMQUdfQUxMT1dfREVRVUVVRV9DVVJSRU5UX0JVRkZFUiAgICB0cnVlCi0jd2FybmluZyAiQUxMT1dfREVRVUVVRV9DVVJSRU5UX0JVRkZFUiBlbmFibGVkIgotI2Vsc2UKLSNkZWZpbmUgRkxBR19BTExPV19ERVFVRVVFX0NVUlJFTlRfQlVGRkVSICAgIGZhbHNlCi0jZW5kaWYKLQotLy8gTWFjcm9zIGZvciBpbmNsdWRpbmcgdGhlIEJ1ZmZlclF1ZXVlIG5hbWUgaW4gbG9nIG1lc3NhZ2VzCi0jZGVmaW5lIFNUX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAieCwgbUNvbnN1bWVyTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HRCh4LCAuLi4pIEFMT0dEKCJbJXNdICJ4LCBtQ29uc3VtZXJOYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dJKHgsIC4uLikgQUxPR0koIlslc10gIngsIG1Db25zdW1lck5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIFNUX0xPR1coeCwgLi4uKSBBTE9HVygiWyVzXSAieCwgbUNvbnN1bWVyTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICJ4LCBtQ29uc3VtZXJOYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotCi0jZGVmaW5lIEFUUkFDRV9CVUZGRVJfSU5ERVgoaW5kZXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBfX190cmFjZUJ1ZlsxMDI0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc25wcmludGYoX19fdHJhY2VCdWYsIDEwMjQsICIlczogJWQiLCBtQ29uc3VtZXJOYW1lLnN0cmluZygpLCAoaW5kZXgpKTsgICBcCi0gICAgYW5kcm9pZDo6U2NvcGVkVHJhY2UgX19fYnVmVHJhY2VyKEFUUkFDRV9UQUcsIF9fX3RyYWNlQnVmKTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBHZXQgYW4gSUQgdGhhdCdzIHVuaXF1ZSB3aXRoaW4gdGhpcyBwcm9jZXNzLgotc3RhdGljIGludDMyX3QgY3JlYXRlUHJvY2Vzc1VuaXF1ZUlkKCkgewotICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IGdsb2JhbENvdW50ZXIgPSAwOwotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJmdsb2JhbENvdW50ZXIpOwotfQotCi1CdWZmZXJRdWV1ZTo6QnVmZmVyUXVldWUoIGJvb2wgYWxsb3dTeW5jaHJvbm91c01vZGUgKSA6Ci0gICAgbURlZmF1bHRXaWR0aCgxKSwKLSAgICBtRGVmYXVsdEhlaWdodCgxKSwKLSAgICBtUGl4ZWxGb3JtYXQoUElYRUxfRk9STUFUX1JHQkFfODg4OCksCi0gICAgbUJ1ZmZlckNvdW50KE1JTl9BU1lOQ19CVUZGRVJfU0xPVFMpLAotICAgIG1DbGllbnRCdWZmZXJDb3VudCgwKSwKLSAgICBtU2VydmVyQnVmZmVyQ291bnQoTUlOX0FTWU5DX0JVRkZFUl9TTE9UUyksCi0gICAgbU5leHRUcmFuc2Zvcm0oMCksCi0gICAgbU5leHRTY2FsaW5nTW9kZShOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkUpLAotICAgIG1TeW5jaHJvbm91c01vZGUoZmFsc2UpLAotICAgIG1BbGxvd1N5bmNocm9ub3VzTW9kZShhbGxvd1N5bmNocm9ub3VzTW9kZSksCi0gICAgbUNvbm5lY3RlZEFwaShOT19DT05ORUNURURfQVBJKSwKLSAgICBtQWJhbmRvbmVkKGZhbHNlKSwKLSAgICBtRnJhbWVDb3VudGVyKDApLAotICAgIG1CdWZmZXJIYXNCZWVuUXVldWVkKGZhbHNlKQotewotICAgIC8vIENob29zZSBhIG5hbWUgdXNpbmcgdGhlIFBJRCBhbmQgYSBwcm9jZXNzLXVuaXF1ZSBJRC4KLSAgICBtQ29uc3VtZXJOYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJ1bm5hbWVkLSVkLSVkIiwgZ2V0cGlkKCksIGNyZWF0ZVByb2Nlc3NVbmlxdWVJZCgpKTsKLQotICAgIFNUX0xPR1YoIkJ1ZmZlclF1ZXVlIik7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXIoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgbUdyYXBoaWNCdWZmZXJBbGxvYyA9IGNvbXBvc2VyLT5jcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKTsKLSAgICBtTmV4dENyb3AubWFrZUludmFsaWQoKTsKLX0KLQotQnVmZmVyUXVldWU6On5CdWZmZXJRdWV1ZSgpIHsKLSAgICBTVF9MT0dWKCJ+QnVmZmVyUXVldWUiKTsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OnNldEJ1ZmZlckNvdW50U2VydmVyTG9ja2VkKGludCBidWZmZXJDb3VudCkgewotICAgIGlmIChidWZmZXJDb3VudCA+IE5VTV9CVUZGRVJfU0xPVFMpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICAvLyBzcGVjaWFsLWNhc2UsIG5vdGhpbmcgdG8gZG8KLSAgICBpZiAoYnVmZmVyQ291bnQgPT0gbUJ1ZmZlckNvdW50KQotICAgICAgICByZXR1cm4gT0s7Ci0KLSAgICBpZiAoIW1DbGllbnRCdWZmZXJDb3VudCAmJgotICAgICAgICBidWZmZXJDb3VudCA+PSBtQnVmZmVyQ291bnQpIHsKLSAgICAgICAgLy8gZWFzeSwgd2UganVzdCBoYXZlIG1vcmUgYnVmZmVycwotICAgICAgICBtQnVmZmVyQ291bnQgPSBidWZmZXJDb3VudDsKLSAgICAgICAgbVNlcnZlckJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7Ci0gICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHdlJ3JlIGhlcmUgYmVjYXVzZSB3ZSdyZSBlaXRoZXIKLSAgICAgICAgLy8gLSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBidWZmZXJzCi0gICAgICAgIC8vIC0gb3IgdGhlcmUgaXMgYSBjbGllbnQtYnVmZmVyLWNvdW50IGluIGVmZmVjdAotCi0gICAgICAgIC8vIGxlc3MgdGhhbiAyIGJ1ZmZlcnMgaXMgbmV2ZXIgYWxsb3dlZAotICAgICAgICBpZiAoYnVmZmVyQ291bnQgPCAyKQotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIG5vbiBjbGllbnQtYnVmZmVyLWNvdW50IGluIGVmZmVjdCwgdGhlIGNsaWVudCBpcyBub3QKLSAgICAgICAgLy8gYWxsb3dlZCB0byBkZXF1ZXVlIG1vcmUgdGhhbiBvbmUgYnVmZmVyIGF0IGEgdGltZSwKLSAgICAgICAgLy8gc28gdGhlIG5leHQgdGltZSB0aGV5IGRlcXVldWUgYSBidWZmZXIsIHdlIGtub3cgdGhhdCB0aGV5IGRvbid0Ci0gICAgICAgIC8vIG93biBvbmUuIHRoZSBhY3R1YWwgcmVzaXppbmcgd2lsbCBoYXBwZW4gZHVyaW5nIHRoZSBuZXh0Ci0gICAgICAgIC8vIGRlcXVldWVCdWZmZXIuCi0KLSAgICAgICAgbVNlcnZlckJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBCdWZmZXJRdWV1ZTo6aXNTeW5jaHJvbm91c01vZGUoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbVN5bmNocm9ub3VzTW9kZTsKLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6c2V0Q29uc3VtZXJOYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1Db25zdW1lck5hbWUgPSBuYW1lOwotfQotCi12b2lkIEJ1ZmZlclF1ZXVlOjpzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKAotICAgICAgICBjb25zdCBzcDxGcmFtZUF2YWlsYWJsZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKLSAgICBTVF9MT0dWKCJzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lciA9IGxpc3RlbmVyOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6c2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KSB7Ci0gICAgU1RfTE9HVigic2V0QnVmZmVyQ291bnQ6IGNvdW50PSVkIiwgYnVmZmVyQ291bnQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBTVF9MT0dFKCJzZXRCdWZmZXJDb3VudDogU3VyZmFjZVRleHR1cmUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlckNvdW50ID4gTlVNX0JVRkZFUl9TTE9UUykgewotICAgICAgICBTVF9MT0dFKCJzZXRCdWZmZXJDb3VudDogYnVmZmVyQ291bnQgbGFyZ2VyIHRoYW4gc2xvdHMgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gRXJyb3Igb3V0IGlmIHRoZSB1c2VyIGhhcyBkZXF1ZXVlZCBidWZmZXJzCi0gICAgZm9yIChpbnQgaT0wIDsgaTxtQnVmZmVyQ291bnQgOyBpKyspIHsKLSAgICAgICAgaWYgKG1TbG90c1tpXS5tQnVmZmVyU3RhdGUgPT0gQnVmZmVyU2xvdDo6REVRVUVVRUQpIHsKLSAgICAgICAgICAgIFNUX0xPR0UoInNldEJ1ZmZlckNvdW50OiBjbGllbnQgb3ducyBzb21lIGJ1ZmZlcnMiKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgaW50IG1pbkJ1ZmZlclNsb3RzID0gbVN5bmNocm9ub3VzTW9kZSA/Ci0gICAgICAgICAgICBNSU5fU1lOQ19CVUZGRVJfU0xPVFMgOiBNSU5fQVNZTkNfQlVGRkVSX1NMT1RTOwotICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgIG1DbGllbnRCdWZmZXJDb3VudCA9IDA7Ci0gICAgICAgIGJ1ZmZlckNvdW50ID0gKG1TZXJ2ZXJCdWZmZXJDb3VudCA+PSBtaW5CdWZmZXJTbG90cykgPwotICAgICAgICAgICAgICAgIG1TZXJ2ZXJCdWZmZXJDb3VudCA6IG1pbkJ1ZmZlclNsb3RzOwotICAgICAgICByZXR1cm4gc2V0QnVmZmVyQ291bnRTZXJ2ZXJMb2NrZWQoYnVmZmVyQ291bnQpOwotICAgIH0KLQotICAgIGlmIChidWZmZXJDb3VudCA8IG1pbkJ1ZmZlclNsb3RzKSB7Ci0gICAgICAgIFNUX0xPR0UoInNldEJ1ZmZlckNvdW50OiByZXF1ZXN0ZWQgYnVmZmVyIGNvdW50ICglZCkgaXMgbGVzcyB0aGFuICIKLSAgICAgICAgICAgICAgICAibWluaW11bSAoJWQpIiwgYnVmZmVyQ291bnQsIG1pbkJ1ZmZlclNsb3RzKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBoZXJlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB0aGUgY2xpZW50IGRvZXNuJ3QgaGF2ZSBkZXF1ZXVlZCBidWZmZXJzCi0gICAgLy8gYW5kIHdpbGwgcmVsZWFzZSBhbGwgb2YgaXRzIGJ1ZmZlciByZWZlcmVuY2VzLgotICAgIGZyZWVBbGxCdWZmZXJzTG9ja2VkKCk7Ci0gICAgbUJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7Ci0gICAgbUNsaWVudEJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7Ci0gICAgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQgPSBmYWxzZTsKLSAgICBtUXVldWUuY2xlYXIoKTsKLSAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBCdWZmZXJRdWV1ZTo6cXVlcnkoaW50IHdoYXQsIGludCogb3V0VmFsdWUpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgU1RfTE9HRSgicXVlcnk6IFN1cmZhY2VUZXh0dXJlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaW50IHZhbHVlOwotICAgIHN3aXRjaCAod2hhdCkgewotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19XSURUSDoKLSAgICAgICAgdmFsdWUgPSBtRGVmYXVsdFdpZHRoOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfSEVJR0hUOgotICAgICAgICB2YWx1ZSA9IG1EZWZhdWx0SGVpZ2h0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfRk9STUFUOgotICAgICAgICB2YWx1ZSA9IG1QaXhlbEZvcm1hdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlM6Ci0gICAgICAgIHZhbHVlID0gbVN5bmNocm9ub3VzTW9kZSA/Ci0gICAgICAgICAgICAgICAgKE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMtMSkgOiBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBvdXRWYWx1ZVswXSA9IHZhbHVlOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OnJlcXVlc3RCdWZmZXIoaW50IHNsb3QsIHNwPEdyYXBoaWNCdWZmZXI+KiBidWYpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoInJlcXVlc3RCdWZmZXI6IHNsb3Q9JWQiLCBzbG90KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR0UoInJlcXVlc3RCdWZmZXI6IFN1cmZhY2VUZXh0dXJlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIGlmIChzbG90IDwgMCB8fCBtQnVmZmVyQ291bnQgPD0gc2xvdCkgewotICAgICAgICBTVF9MT0dFKCJyZXF1ZXN0QnVmZmVyOiBzbG90IGluZGV4IG91dCBvZiByYW5nZSBbMCwgJWRdOiAlZCIsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBzbG90KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbVNsb3RzW3Nsb3RdLm1SZXF1ZXN0QnVmZmVyQ2FsbGVkID0gdHJ1ZTsKLSAgICAqYnVmID0gbVNsb3RzW3Nsb3RdLm1HcmFwaGljQnVmZmVyOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OmRlcXVldWVCdWZmZXIoaW50ICpvdXRCdWYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoImRlcXVldWVCdWZmZXI6IHc9JWQgaD0lZCBmbXQ9JSN4IHVzYWdlPSUjeCIsIHcsIGgsIGZvcm1hdCwgdXNhZ2UpOwotCi0gICAgaWYgKCh3ICYmICFoKSB8fCAoIXcgJiYgaCkpIHsKLSAgICAgICAgU1RfTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogaW52YWxpZCBzaXplOiB3PSV1LCBoPSV1IiwgdywgaCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmV0dXJuRmxhZ3MoT0spOwotICAgIEVHTERpc3BsYXkgZHB5ID0gRUdMX05PX0RJU1BMQVk7Ci0gICAgRUdMU3luY0tIUiBmZW5jZSA9IEVHTF9OT19TWU5DX0tIUjsKLQotICAgIHsgLy8gU2NvcGUgZm9yIHRoZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICAgICAgaW50IGZvdW5kID0gLTE7Ci0gICAgICAgIGludCBmb3VuZFN5bmMgPSAtMTsKLSAgICAgICAgaW50IGRlcXVldWVkQ291bnQgPSAwOwotICAgICAgICBib29sIHRyeUFnYWluID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHRyeUFnYWluKSB7Ci0gICAgICAgICAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICAgICAgICAgIFNUX0xPR0UoImRlcXVldWVCdWZmZXI6IFN1cmZhY2VUZXh0dXJlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgRklGTyB0byBkcmFpbiBpZiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcgotICAgICAgICAgICAgLy8gbmVlZHMgdG8gY2hhbmdlLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFRoZSBjb25kaXRpb24gIm51bWJlciBvZiBidWZmZXJzIG5lZWRzIHRvIGNoYW5nZSIgaXMgdHJ1ZSBpZgotICAgICAgICAgICAgLy8gLSB0aGUgY2xpZW50IGRvZXNuJ3QgY2FyZSBhYm91dCBob3cgbWFueSBidWZmZXJzIHRoZXJlIGFyZQotICAgICAgICAgICAgLy8gLSBBTkQgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVyIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgd2FzCi0gICAgICAgICAgICAvLyAgIHNldCBpbiB0aGUgbGFzdCBzZXRCdWZmZXJDb3VudFNlcnZlcigpCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtIE9SIC0KLSAgICAgICAgICAgIC8vICAgc2V0QnVmZmVyQ291bnRTZXJ2ZXIoKSB3YXMgc2V0IHRvIGEgdmFsdWUgaW5jb21wYXRpYmxlIHdpdGgKLSAgICAgICAgICAgIC8vICAgdGhlIHN5bmNocm9uaXphdGlvbiBtb2RlIChmb3IgaW5zdGFuY2UgYmVjYXVzZSB0aGUgc3luYyBtb2RlCi0gICAgICAgICAgICAvLyAgIGNoYW5nZWQgc2luY2UpCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQXMgbG9uZyBhcyB0aGlzIGNvbmRpdGlvbiBpcyB0cnVlIEFORCB0aGUgRklGTyBpcyBub3QgZW1wdHksIHdlCi0gICAgICAgICAgICAvLyB3YWl0IG9uIG1EZXF1ZXVlQ29uZGl0aW9uLgotCi0gICAgICAgICAgICBjb25zdCBpbnQgbWluQnVmZmVyQ291bnROZWVkZWQgPSBtU3luY2hyb25vdXNNb2RlID8KLSAgICAgICAgICAgICAgICAgICAgTUlOX1NZTkNfQlVGRkVSX1NMT1RTIDogTUlOX0FTWU5DX0JVRkZFUl9TTE9UUzsKLQotICAgICAgICAgICAgY29uc3QgYm9vbCBudW1iZXJPZkJ1ZmZlcnNOZWVkc1RvQ2hhbmdlID0gIW1DbGllbnRCdWZmZXJDb3VudCAmJgotICAgICAgICAgICAgICAgICAgICAoKG1TZXJ2ZXJCdWZmZXJDb3VudCAhPSBtQnVmZmVyQ291bnQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TZXJ2ZXJCdWZmZXJDb3VudCA8IG1pbkJ1ZmZlckNvdW50TmVlZGVkKSk7Ci0KLSAgICAgICAgICAgIGlmICghbVF1ZXVlLmlzRW1wdHkoKSAmJiBudW1iZXJPZkJ1ZmZlcnNOZWVkc1RvQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIEZJRk8gdG8gZHJhaW4KLSAgICAgICAgICAgICAgICBtRGVxdWV1ZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgICAgICAgICAgICAgLy8gTk9URTogd2UgY29udGludWUgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVldmFsdWF0ZSBvdXIKLSAgICAgICAgICAgICAgICAvLyB3aG9sZSBzdGF0ZSAoZWc6IHdlIGNvdWxkIGJlIGFiYW5kb25lZCBvciBkaXNjb25uZWN0ZWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChudW1iZXJPZkJ1ZmZlcnNOZWVkc1RvQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGVyZSB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgbVF1ZXVlIGlzIGVtcHR5Ci0gICAgICAgICAgICAgICAgZnJlZUFsbEJ1ZmZlcnNMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyQ291bnQgPSBtU2VydmVyQnVmZmVyQ291bnQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1CdWZmZXJDb3VudCA8IG1pbkJ1ZmZlckNvdW50TmVlZGVkKQotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ291bnQgPSBtaW5CdWZmZXJDb3VudE5lZWRlZDsKLSAgICAgICAgICAgICAgICBtQnVmZmVySGFzQmVlblF1ZXVlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybkZsYWdzIHw9IElTdXJmYWNlVGV4dHVyZTo6UkVMRUFTRV9BTExfQlVGRkVSUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbG9vayBmb3IgYSBmcmVlIGJ1ZmZlciB0byBnaXZlIHRvIHRoZSBjbGllbnQKLSAgICAgICAgICAgIGZvdW5kID0gSU5WQUxJRF9CVUZGRVJfU0xPVDsKLSAgICAgICAgICAgIGZvdW5kU3luYyA9IElOVkFMSURfQlVGRkVSX1NMT1Q7Ci0gICAgICAgICAgICBkZXF1ZXVlZENvdW50ID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJ1ZmZlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3RhdGUgPSBtU2xvdHNbaV0ubUJ1ZmZlclN0YXRlOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBCdWZmZXJTbG90OjpERVFVRVVFRCkgewotICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBsb2dpYyB1c2VkIHRvIGJlIGlmIChGTEFHX0FMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIpCi0gICAgICAgICAgICAgICAgLy8gYnV0IGRlcXVldWluZyB0aGUgY3VycmVudCBidWZmZXIgaXMgZGlzYWJsZWQuCi0gICAgICAgICAgICAgICAgaWYgKGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiB0ZW1wb3JhcmlseSByZW1vdmVkIHNvCi0gICAgICAgICAgICAgICAgICAgIC8vIEJ1ZmZlclF1ZXVlIGFuZCBTdXJmYWNlVGV4dHVyZSBjYW4gYmUgcmVmYWN0b3JlZCBpbnRvCi0gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIG9iamVjdHMKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQnVmZmVyU2xvdDo6RlJFRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgcmV0dXJuIHRoZSBvbGRlc3Qgb2YgdGhlIGZyZWUgYnVmZmVycyB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICogc3RhbGxpbmcgdGhlIHByb2R1Y2VyIGlmIHBvc3NpYmxlLiAgVGhpcyBpcyBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY29uc3VtZXIgbWF5IHN0aWxsIGhhdmUgcGVuZGluZyByZWFkcyBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlcnMgaW4gZmxpZ2h0LgotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT2xkZXIgPSBtU2xvdHNbaV0ubUZyYW1lTnVtYmVyIDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNsb3RzW2ZvdW5kXS5tRnJhbWVOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgPCAwIHx8IGlzT2xkZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFN5bmMgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gY2xpZW50cyBhcmUgbm90IGFsbG93ZWQgdG8gZGVxdWV1ZSBtb3JlIHRoYW4gb25lIGJ1ZmZlcgotICAgICAgICAgICAgLy8gaWYgdGhleSBkaWRuJ3Qgc2V0IGEgYnVmZmVyIGNvdW50LgotICAgICAgICAgICAgaWYgKCFtQ2xpZW50QnVmZmVyQ291bnQgJiYgZGVxdWV1ZWRDb3VudCkgewotICAgICAgICAgICAgICAgIFNUX0xPR0UoImRlcXVldWVCdWZmZXI6IGNhbid0IGRlcXVldWUgbXVsdGlwbGUgYnVmZmVycyB3aXRob3V0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIHRoZSBidWZmZXIgY291bnQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2VlIHdoZXRoZXIgYSBidWZmZXIgaGFzIGJlZW4gcXVldWVkIHNpbmNlIHRoZSBsYXN0Ci0gICAgICAgICAgICAvLyBzZXRCdWZmZXJDb3VudCBzbyB3ZSBrbm93IHdoZXRoZXIgdG8gcGVyZm9ybSB0aGUKLSAgICAgICAgICAgIC8vIE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgY2hlY2sgYmVsb3cuCi0gICAgICAgICAgICBpZiAobUJ1ZmZlckhhc0JlZW5RdWV1ZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNsaWVudCBpcyBub3QgdHJ5aW5nIHRvIGRlcXVldWUgbW9yZSBidWZmZXJzCi0gICAgICAgICAgICAgICAgLy8gdGhhbiBhbGxvd2VkLgotICAgICAgICAgICAgICAgIGNvbnN0IGludCBhdmFpbCA9IG1CdWZmZXJDb3VudCAtIChkZXF1ZXVlZENvdW50KzEpOwotICAgICAgICAgICAgICAgIGlmIChhdmFpbCA8IChNSU5fVU5ERVFVRVVFRF9CVUZGRVJTLWludChtU3luY2hyb25vdXNNb2RlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgU1RfTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogTUlOX1VOREVRVUVVRURfQlVGRkVSUz0lZCBleGNlZWRlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkZXF1ZXVlZD0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMtaW50KG1TeW5jaHJvbm91c01vZGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVldWVkQ291bnQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd2UncmUgaW4gc3luY2hyb25vdXMgbW9kZSBhbmQgZGlkbid0IGZpbmQgYSBidWZmZXIsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgIC8vIHdhaXQgZm9yIHNvbWUgYnVmZmVycyB0byBiZSBjb25zdW1lZAotICAgICAgICAgICAgdHJ5QWdhaW4gPSBtU3luY2hyb25vdXNNb2RlICYmIChmb3VuZFN5bmMgPT0gSU5WQUxJRF9CVUZGRVJfU0xPVCk7Ci0gICAgICAgICAgICBpZiAodHJ5QWdhaW4pIHsKLSAgICAgICAgICAgICAgICBtRGVxdWV1ZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN5bmNocm9ub3VzTW9kZSAmJiBmb3VuZCA9PSBJTlZBTElEX0JVRkZFUl9TTE9UKSB7Ci0gICAgICAgICAgICAvLyBmb3VuZFN5bmMgZ3VhcmFudGVlZCB0byBiZSAhPSBJTlZBTElEX0JVRkZFUl9TTE9UCi0gICAgICAgICAgICBmb3VuZCA9IGZvdW5kU3luYzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3VuZCA9PSBJTlZBTElEX0JVRkZFUl9TTE9UKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLgotICAgICAgICAgICAgU1RfTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogbm8gYXZhaWxhYmxlIGJ1ZmZlciBzbG90cyIpOwotICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGludCBidWYgPSBmb3VuZDsKLSAgICAgICAgKm91dEJ1ZiA9IGZvdW5kOwotCi0gICAgICAgIEFUUkFDRV9CVUZGRVJfSU5ERVgoYnVmKTsKLQotICAgICAgICBjb25zdCBib29sIHVzZURlZmF1bHRTaXplID0gIXcgJiYgIWg7Ci0gICAgICAgIGlmICh1c2VEZWZhdWx0U2l6ZSkgewotICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHNpemUKLSAgICAgICAgICAgIHcgPSBtRGVmYXVsdFdpZHRoOwotICAgICAgICAgICAgaCA9IG1EZWZhdWx0SGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgYm9vbCB1cGRhdGVGb3JtYXQgPSAoZm9ybWF0ICE9IDApOwotICAgICAgICBpZiAoIXVwZGF0ZUZvcm1hdCkgewotICAgICAgICAgICAgLy8ga2VlcCB0aGUgY3VycmVudCAob3IgZGVmYXVsdCkgZm9ybWF0Ci0gICAgICAgICAgICBmb3JtYXQgPSBtUGl4ZWxGb3JtYXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBidWZmZXIgaXMgbm93IGluIERFUVVFVUVEIChidXQgY2FuIGFsc28gYmUgY3VycmVudCBhdCB0aGUgc2FtZSB0aW1lLAotICAgICAgICAvLyBpZiB3ZSdyZSBpbiBzeW5jaHJvbm91cyBtb2RlKQotICAgICAgICBtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUgPSBCdWZmZXJTbG90OjpERVFVRVVFRDsKLQotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyKTsKLSAgICAgICAgaWYgKChidWZmZXIgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgICh1aW50MzJfdChidWZmZXItPndpZHRoKSAgIT0gdykgfHwKLSAgICAgICAgICAgICh1aW50MzJfdChidWZmZXItPmhlaWdodCkgIT0gaCkgfHwKLSAgICAgICAgICAgICh1aW50MzJfdChidWZmZXItPmZvcm1hdCkgIT0gZm9ybWF0KSB8fAotICAgICAgICAgICAgKCh1aW50MzJfdChidWZmZXItPnVzYWdlKSAmIHVzYWdlKSAhPSB1c2FnZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnJvcjsKLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgIG1HcmFwaGljQnVmZmVyQWxsb2MtPmNyZWF0ZUdyYXBoaWNCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgZm9ybWF0LCB1c2FnZSwgJmVycm9yKSk7Ci0gICAgICAgICAgICBpZiAoZ3JhcGhpY0J1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU1RfTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogU3VyZmFjZUNvbXBvc2VyOjpjcmVhdGVHcmFwaGljQnVmZmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodXBkYXRlRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgbVBpeGVsRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU2xvdHNbYnVmXS5tQWNxdWlyZUNhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXIgPSBncmFwaGljQnVmZmVyOwotICAgICAgICAgICAgbVNsb3RzW2J1Zl0ubVJlcXVlc3RCdWZmZXJDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG1TbG90c1tidWZdLm1GZW5jZSA9IEVHTF9OT19TWU5DX0tIUjsKLSAgICAgICAgICAgIG1TbG90c1tidWZdLm1FZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7Ci0KLQotCi0KLSAgICAgICAgICAgIHJldHVybkZsYWdzIHw9IElTdXJmYWNlVGV4dHVyZTo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjsKLSAgICAgICAgfQotCi0gICAgICAgIGRweSA9IG1TbG90c1tidWZdLm1FZ2xEaXNwbGF5OwotICAgICAgICBmZW5jZSA9IG1TbG90c1tidWZdLm1GZW5jZTsKLSAgICAgICAgbVNsb3RzW2J1Zl0ubUZlbmNlID0gRUdMX05PX1NZTkNfS0hSOwotICAgIH0gIC8vIGVuZCBsb2NrIHNjb3BlCi0KLSAgICBpZiAoZmVuY2UgIT0gRUdMX05PX1NZTkNfS0hSKSB7Ci0gICAgICAgIEVHTGludCByZXN1bHQgPSBlZ2xDbGllbnRXYWl0U3luY0tIUihkcHksIGZlbmNlLCAwLCAxMDAwMDAwMDAwKTsKLSAgICAgICAgLy8gSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIGxvZyB0aGUgZXJyb3IsIGJ1dCByZXR1cm4gdGhlIGJ1ZmZlciB3aXRob3V0Ci0gICAgICAgIC8vIHN5bmNocm9uaXppbmcgYWNjZXNzIHRvIGl0LiAgSXQncyB0b28gbGF0ZSBhdCB0aGlzIHBvaW50IHRvIGFib3J0IHRoZQotICAgICAgICAvLyBkZXF1ZXVlIG9wZXJhdGlvbi4KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlQnVmZmVyOiBlcnJvciB3YWl0aW5nIGZvciBmZW5jZTogJSN4IiwgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IEVHTF9USU1FT1VUX0VYUElSRURfS0hSKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUJ1ZmZlcjogdGltZW91dCB3YWl0aW5nIGZvciBmZW5jZSIpOwotICAgICAgICB9Ci0gICAgICAgIGVnbERlc3Ryb3lTeW5jS0hSKGRweSwgZmVuY2UpOwotCi0gICAgfQotCi0gICAgU1RfTE9HVigiZGVxdWV1ZUJ1ZmZlcjogcmV0dXJuaW5nIHNsb3Q9JWQgYnVmPSVwIGZsYWdzPSUjeCIsICpvdXRCdWYsCi0gICAgICAgICAgICBtU2xvdHNbKm91dEJ1Zl0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSwgcmV0dXJuRmxhZ3MpOwotCi0gICAgcmV0dXJuIHJldHVybkZsYWdzOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6c2V0U3luY2hyb25vdXNNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigic2V0U3luY2hyb25vdXNNb2RlOiBlbmFibGVkPSVkIiwgZW5hYmxlZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR0UoInNldFN5bmNocm9ub3VzTW9kZTogU3VyZmFjZVRleHR1cmUgaGFzIGJlZW4gYWJhbmRvbmVkISIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBpZiAoIW1BbGxvd1N5bmNocm9ub3VzTW9kZSAmJiBlbmFibGVkKQotICAgICAgICByZXR1cm4gZXJyOwotCi0gICAgaWYgKCFlbmFibGVkKSB7Ci0gICAgICAgIC8vIGdvaW5nIHRvIGFzeW5jaHJvbm91cyBtb2RlLCBkcmFpbiB0aGUgcXVldWUKLSAgICAgICAgZXJyID0gZHJhaW5RdWV1ZUxvY2tlZCgpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobVN5bmNocm9ub3VzTW9kZSAhPSBlbmFibGVkKSB7Ci0gICAgICAgIC8vIC0gaWYgd2UncmUgZ29pbmcgdG8gYXN5bmNocm9ub3VzIG1vZGUsIHRoZSBxdWV1ZSBpcyBndWFyYW50ZWVkIHRvIGJlCi0gICAgICAgIC8vIGVtcHR5IGhlcmUKLSAgICAgICAgLy8gLSBpZiB0aGUgY2xpZW50IHNldCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMsIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdAotICAgICAgICAvLyB3ZSBoYXZlIGF0IGxlYXN0IDMgKGJlY2F1c2Ugd2UgZG9uJ3QgYWxsb3cgbGVzcykKLSAgICAgICAgbVN5bmNocm9ub3VzTW9kZSA9IGVuYWJsZWQ7Ci0gICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6cXVldWVCdWZmZXIoaW50IGJ1ZiwgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQVRSQUNFX0JVRkZFUl9JTkRFWChidWYpOwotCi0gICAgU1RfTE9HVigicXVldWVCdWZmZXI6IHNsb3Q9JWQgdGltZT0lbGxkIiwgYnVmLCB0aW1lc3RhbXApOwotCi0gICAgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4gbGlzdGVuZXI7Ci0KLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICAgICAgU1RfTE9HRSgicXVldWVCdWZmZXI6IFN1cmZhY2VUZXh0dXJlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWYgPCAwIHx8IGJ1ZiA+PSBtQnVmZmVyQ291bnQpIHsKLSAgICAgICAgICAgIFNUX0xPR0UoInF1ZXVlQnVmZmVyOiBzbG90IGluZGV4IG91dCBvZiByYW5nZSBbMCwgJWRdOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXJDb3VudCwgYnVmKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9IGVsc2UgaWYgKG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSAhPSBCdWZmZXJTbG90OjpERVFVRVVFRCkgewotICAgICAgICAgICAgU1RfTE9HRSgicXVldWVCdWZmZXI6IHNsb3QgJWQgaXMgbm90IG93bmVkIGJ5IHRoZSBjbGllbnQgIgotICAgICAgICAgICAgICAgICAgICAiKHN0YXRlPSVkKSIsIGJ1ZiwgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9IGVsc2UgaWYgKCFtU2xvdHNbYnVmXS5tUmVxdWVzdEJ1ZmZlckNhbGxlZCkgewotICAgICAgICAgICAgU1RfTE9HRSgicXVldWVCdWZmZXI6IHNsb3QgJWQgd2FzIGVucXVldWVkIHdpdGhvdXQgcmVxdWVzdGluZyBhICIKLSAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciIsIGJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3luY2hyb25vdXNNb2RlKSB7Ci0gICAgICAgICAgICAvLyBJbiBzeW5jaHJvbm91cyBtb2RlIHdlIHF1ZXVlIGFsbCBidWZmZXJzIGluIGEgRklGTy4KLSAgICAgICAgICAgIG1RdWV1ZS5wdXNoX2JhY2soYnVmKTsKLQotICAgICAgICAgICAgLy8gU3luY2hyb25vdXMgbW9kZSBhbHdheXMgc2lnbmFscyB0aGF0IGFuIGFkZGl0aW9uYWwgZnJhbWUgc2hvdWxkCi0gICAgICAgICAgICAvLyBiZSBjb25zdW1lZC4KLSAgICAgICAgICAgIGxpc3RlbmVyID0gbUZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJbiBhc3luY2hyb25vdXMgbW9kZSB3ZSBvbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGJ1ZmZlci4KLSAgICAgICAgICAgIGlmIChtUXVldWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1RdWV1ZS5wdXNoX2JhY2soYnVmKTsKLQotICAgICAgICAgICAgICAgIC8vIEFzeW5jaHJvbm91cyBtb2RlIG9ubHkgc2lnbmFscyB0aGF0IGEgZnJhbWUgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgLy8gY29uc3VtZWQgaWYgbm8gcHJldmlvdXMgZnJhbWUgd2FzIHBlbmRpbmcuIElmIGEgZnJhbWUgd2VyZQotICAgICAgICAgICAgICAgIC8vIHBlbmRpbmcgdGhlbiB0aGUgY29uc3VtZXIgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4gbm90aWZpZWQuCi0gICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBtRnJhbWVBdmFpbGFibGVMaXN0ZW5lcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRmlmbzo6aXRlcmF0b3IgZnJvbnQobVF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBjdXJyZW50bHkgcXVldWVkIGlzIGZyZWVkCi0gICAgICAgICAgICAgICAgbVNsb3RzWypmcm9udF0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6RlJFRTsKLSAgICAgICAgICAgICAgICAvLyBhbmQgd2UgcmVjb3JkIHRoZSBuZXcgYnVmZmVyIGluZGV4IGluIHRoZSBxdWV1ZWQgbGlzdAotICAgICAgICAgICAgICAgICpmcm9udCA9IGJ1ZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OlFVRVVFRDsKLSAgICAgICAgbVNsb3RzW2J1Zl0ubUNyb3AgPSBtTmV4dENyb3A7Ci0gICAgICAgIG1TbG90c1tidWZdLm1UcmFuc2Zvcm0gPSBtTmV4dFRyYW5zZm9ybTsKLSAgICAgICAgbVNsb3RzW2J1Zl0ubVNjYWxpbmdNb2RlID0gbU5leHRTY2FsaW5nTW9kZTsKLSAgICAgICAgbVNsb3RzW2J1Zl0ubVRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLSAgICAgICAgbUZyYW1lQ291bnRlcisrOwotICAgICAgICBtU2xvdHNbYnVmXS5tRnJhbWVOdW1iZXIgPSBtRnJhbWVDb3VudGVyOwotCi0gICAgICAgIG1CdWZmZXJIYXNCZWVuUXVldWVkID0gdHJ1ZTsKLSAgICAgICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7Ci0KLSAgICAgICAgKm91dFdpZHRoID0gbURlZmF1bHRXaWR0aDsKLSAgICAgICAgKm91dEhlaWdodCA9IG1EZWZhdWx0SGVpZ2h0OwotICAgICAgICAqb3V0VHJhbnNmb3JtID0gMDsKLQotICAgICAgICBBVFJBQ0VfSU5UKG1Db25zdW1lck5hbWUuc3RyaW5nKCksIG1RdWV1ZS5zaXplKCkpOwotICAgIH0gLy8gc2NvcGUgZm9yIHRoZSBsb2NrCi0KLSAgICAvLyBjYWxsIGJhY2sgd2l0aG91dCBsb2NrIGhlbGQKLSAgICBpZiAobGlzdGVuZXIgIT0gMCkgewotICAgICAgICBsaXN0ZW5lci0+b25GcmFtZUF2YWlsYWJsZSgpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgQnVmZmVyUXVldWU6OmNhbmNlbEJ1ZmZlcihpbnQgYnVmKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBTVF9MT0dWKCJjYW5jZWxCdWZmZXI6IHNsb3Q9JWQiLCBidWYpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBTVF9MT0dXKCJjYW5jZWxCdWZmZXI6IEJ1ZmZlclF1ZXVlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChidWYgPCAwIHx8IGJ1ZiA+PSBtQnVmZmVyQ291bnQpIHsKLSAgICAgICAgU1RfTE9HRSgiY2FuY2VsQnVmZmVyOiBzbG90IGluZGV4IG91dCBvZiByYW5nZSBbMCwgJWRdOiAlZCIsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBidWYpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUgIT0gQnVmZmVyU2xvdDo6REVRVUVVRUQpIHsKLSAgICAgICAgU1RfTE9HRSgiY2FuY2VsQnVmZmVyOiBzbG90ICVkIGlzIG5vdCBvd25lZCBieSB0aGUgY2xpZW50IChzdGF0ZT0lZCkiLAotICAgICAgICAgICAgICAgIGJ1ZiwgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtU2xvdHNbYnVmXS5tQnVmZmVyU3RhdGUgPSBCdWZmZXJTbG90OjpGUkVFOwotICAgIG1TbG90c1tidWZdLm1GcmFtZU51bWJlciA9IDA7Ci0gICAgbURlcXVldWVDb25kaXRpb24uc2lnbmFsKCk7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXRDcm9wKGNvbnN0IFJlY3QmIGNyb3ApIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoInNldENyb3A6IGNyb3A9WyVkLCVkLCVkLCVkXSIsIGNyb3AubGVmdCwgY3JvcC50b3AsIGNyb3AucmlnaHQsCi0gICAgICAgICAgICBjcm9wLmJvdHRvbSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR0UoInNldENyb3A6IEJ1ZmZlclF1ZXVlIGhhcyBiZWVuIGFiYW5kb25lZCEiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIG1OZXh0Q3JvcCA9IGNyb3A7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6c2V0VHJhbnNmb3JtKHVpbnQzMl90IHRyYW5zZm9ybSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigic2V0VHJhbnNmb3JtOiB4Zm9ybT0lI3giLCB0cmFuc2Zvcm0pOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgU1RfTE9HRSgic2V0VHJhbnNmb3JtOiBCdWZmZXJRdWV1ZSBoYXMgYmVlbiBhYmFuZG9uZWQhIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBtTmV4dFRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXRTY2FsaW5nTW9kZShpbnQgbW9kZSkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgU1RfTE9HVigic2V0U2NhbGluZ01vZGU6IG1vZGU9JWQiLCBtb2RlKTsKLQotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRToKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1c6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNUX0xPR0UoInVua25vd24gc2NhbGluZyBtb2RlOiAlZCIsIG1vZGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1OZXh0U2NhbGluZ01vZGUgPSBtb2RlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OmNvbm5lY3QoaW50IGFwaSwKLSAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBTVF9MT0dWKCJjb25uZWN0OiBhcGk9JWQiLCBhcGkpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBTVF9MT0dFKCJjb25uZWN0OiBCdWZmZXJRdWV1ZSBoYXMgYmVlbiBhYmFuZG9uZWQhIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGludCBlcnIgPSBOT19FUlJPUjsKLSAgICBzd2l0Y2ggKGFwaSkgewotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0VHTDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DUFU6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfTUVESUE6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBOgotICAgICAgICAgICAgaWYgKG1Db25uZWN0ZWRBcGkgIT0gTk9fQ09OTkVDVEVEX0FQSSkgewotICAgICAgICAgICAgICAgIFNUX0xPR0UoImNvbm5lY3Q6IGFscmVhZHkgY29ubmVjdGVkIChjdXI9JWQsIHJlcT0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RlZEFwaSwgYXBpKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUlOVkFMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBpID0gYXBpOwotICAgICAgICAgICAgICAgICpvdXRXaWR0aCA9IG1EZWZhdWx0V2lkdGg7Ci0gICAgICAgICAgICAgICAgKm91dEhlaWdodCA9IG1EZWZhdWx0SGVpZ2h0OwotICAgICAgICAgICAgICAgICpvdXRUcmFuc2Zvcm0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBlcnIgPSAtRUlOVkFMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQgPSBmYWxzZTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpkaXNjb25uZWN0KGludCBhcGkpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoImRpc2Nvbm5lY3Q6IGFwaT0lZCIsIGFwaSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIC8vIGl0IGlzIG5vdCByZWFsbHkgYW4gZXJyb3IgdG8gZGlzY29ubmVjdCBhZnRlciB0aGUgc3VyZmFjZQotICAgICAgICAvLyBoYXMgYmVlbiBhYmFuZG9uZWQsIGl0IHNob3VsZCBqdXN0IGJlIGEgbm8tb3AuCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpbnQgZXJyID0gTk9fRVJST1I7Ci0gICAgc3dpdGNoIChhcGkpIHsKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9FR0w6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ1BVOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX01FRElBOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQToKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGVkQXBpID09IGFwaSkgewotICAgICAgICAgICAgICAgIGRyYWluUXVldWVBbmRGcmVlQnVmZmVyc0xvY2tlZCgpOwotICAgICAgICAgICAgICAgIG1Db25uZWN0ZWRBcGkgPSBOT19DT05ORUNURURfQVBJOwotICAgICAgICAgICAgICAgIG1OZXh0Q3JvcC5tYWtlSW52YWxpZCgpOwotICAgICAgICAgICAgICAgIG1OZXh0U2NhbGluZ01vZGUgPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkU7Ci0gICAgICAgICAgICAgICAgbU5leHRUcmFuc2Zvcm0gPSAwOwotICAgICAgICAgICAgICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBTVF9MT0dFKCJkaXNjb25uZWN0OiBjb25uZWN0ZWQgdG8gYW5vdGhlciBhcGkgKGN1cj0lZCwgcmVxPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkQXBpLCBhcGkpOwotICAgICAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNUX0xPR0UoImRpc2Nvbm5lY3Q6IHVua25vd24gQVBJICVkIiwgYXBpKTsKLSAgICAgICAgICAgIGVyciA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6ZHVtcChTdHJpbmc4JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgY2hhciBidWZmZXJbMTAyNF07Ci0gICAgQnVmZmVyUXVldWU6OmR1bXAocmVzdWx0LCAiIiwgYnVmZmVyLCAxMDI0KTsKLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6ZHVtcChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiJXNuZXh0ICAgOiB7Y3JvcD1bJWQsJWQsJWQsJWRdLCB0cmFuc2Zvcm09MHglMDJ4fVxuIgotICAgICAgICAgICAgLHByZWZpeCwgbU5leHRDcm9wLmxlZnQsIG1OZXh0Q3JvcC50b3AsIG1OZXh0Q3JvcC5yaWdodCwKLSAgICAgICAgICAgIG1OZXh0Q3JvcC5ib3R0b20sIG1OZXh0VHJhbnNmb3JtCi0gICAgKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBTdHJpbmc4IGZpZm87Ci0gICAgaW50IGZpZm9TaXplID0gMDsKLSAgICBGaWZvOjpjb25zdF9pdGVyYXRvciBpKG1RdWV1ZS5iZWdpbigpKTsKLSAgICB3aGlsZSAoaSAhPSBtUXVldWUuZW5kKCkpIHsKLSAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDJkICIsICppKyspOwotICAgICAgIGZpZm9TaXplKys7Ci0gICAgICAgZmlmby5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiJXMtQnVmZmVyUXVldWUgbUJ1ZmZlckNvdW50PSVkLCBtU3luY2hyb25vdXNNb2RlPSVkLCBkZWZhdWx0LXNpemU9WyVkeCVkXSwgIgotICAgICAgICAgICAgIm1QaXhlbEZvcm1hdD0lZCwgRklGTyglZCk9eyVzfVxuIiwKLSAgICAgICAgICAgIHByZWZpeCwgbUJ1ZmZlckNvdW50LCBtU3luY2hyb25vdXNNb2RlLCBtRGVmYXVsdFdpZHRoLAotICAgICAgICAgICAgbURlZmF1bHRIZWlnaHQsIG1QaXhlbEZvcm1hdCwgZmlmb1NpemUsIGZpZm8uc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotCi0gICAgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqIG9wZXJhdG9yKCkoaW50IHN0YXRlKSBjb25zdCB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCdWZmZXJTbG90OjpERVFVRVVFRDogcmV0dXJuICJERVFVRVVFRCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBCdWZmZXJTbG90OjpRVUVVRUQ6IHJldHVybiAiUVVFVUVEIjsKLSAgICAgICAgICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OkZSRUU6IHJldHVybiAiRlJFRSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBCdWZmZXJTbG90OjpBQ1FVSVJFRDogcmV0dXJuICJBQ1FVSVJFRCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVbmtub3duIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gc3RhdGVOYW1lOwotCi0gICAgZm9yIChpbnQgaT0wIDsgaTxtQnVmZmVyQ291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3QgQnVmZmVyU2xvdCYgc2xvdChtU2xvdHNbaV0pOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgIiVzJXNbJTAyZF0gIgotICAgICAgICAgICAgICAgICJzdGF0ZT0lLThzLCBjcm9wPVslZCwlZCwlZCwlZF0sICIKLSAgICAgICAgICAgICAgICAidHJhbnNmb3JtPTB4JTAyeCwgdGltZXN0YW1wPSVsbGQiLAotICAgICAgICAgICAgICAgIHByZWZpeCwgKHNsb3QubUJ1ZmZlclN0YXRlID09IEJ1ZmZlclNsb3Q6OkFDUVVJUkVEKT8iPiI6IiAiLCBpLAotICAgICAgICAgICAgICAgIHN0YXRlTmFtZShzbG90Lm1CdWZmZXJTdGF0ZSksCi0gICAgICAgICAgICAgICAgc2xvdC5tQ3JvcC5sZWZ0LCBzbG90Lm1Dcm9wLnRvcCwgc2xvdC5tQ3JvcC5yaWdodCwKLSAgICAgICAgICAgICAgICBzbG90Lm1Dcm9wLmJvdHRvbSwgc2xvdC5tVHJhbnNmb3JtLCBzbG90Lm1UaW1lc3RhbXAKLSAgICAgICAgKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWYoc2xvdC5tR3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgIGlmIChidWYgIT0gTlVMTCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICAgICAgICAiLCAlcCBbJTR1eCU0dTolNHUsJTNYXSIsCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi0+aGFuZGxlLCBidWYtPndpZHRoLCBidWYtPmhlaWdodCwgYnVmLT5zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgIGJ1Zi0+Zm9ybWF0KTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLX0KLQotdm9pZCBCdWZmZXJRdWV1ZTo6ZnJlZUJ1ZmZlckxvY2tlZChpbnQgaSkgewotICAgIG1TbG90c1tpXS5tR3JhcGhpY0J1ZmZlciA9IDA7Ci0gICAgbVNsb3RzW2ldLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OkZSRUU7Ci0gICAgbVNsb3RzW2ldLm1GcmFtZU51bWJlciA9IDA7Ci0gICAgbVNsb3RzW2ldLm1BY3F1aXJlQ2FsbGVkID0gZmFsc2U7Ci0KLSAgICAvLyBkZXN0cm95IGZlbmNlIGFzIEJ1ZmZlclF1ZXVlIG5vdyB0YWtlcyBvd25lcnNoaXAKLSAgICBpZiAobVNsb3RzW2ldLm1GZW5jZSAhPSBFR0xfTk9fU1lOQ19LSFIpIHsKLSAgICAgICAgZWdsRGVzdHJveVN5bmNLSFIobVNsb3RzW2ldLm1FZ2xEaXNwbGF5LCBtU2xvdHNbaV0ubUZlbmNlKTsKLSAgICAgICAgbVNsb3RzW2ldLm1GZW5jZSA9IEVHTF9OT19TWU5DX0tIUjsKLSAgICB9Ci19Ci0KLXZvaWQgQnVmZmVyUXVldWU6OmZyZWVBbGxCdWZmZXJzTG9ja2VkKCkgewotICAgIEFMT0dXX0lGKCFtUXVldWUuaXNFbXB0eSgpLAotICAgICAgICAgICAgImZyZWVBbGxCdWZmZXJzTG9ja2VkIGNhbGxlZCBidXQgbVF1ZXVlIGlzIG5vdCBlbXB0eSIpOwotICAgIG1RdWV1ZS5jbGVhcigpOwotICAgIG1CdWZmZXJIYXNCZWVuUXVldWVkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyBpKyspIHsKLSAgICAgICAgZnJlZUJ1ZmZlckxvY2tlZChpKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjphY3F1aXJlKEJ1ZmZlckl0ZW0gKmJ1ZmZlcikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgLy8gY2hlY2sgaWYgcXVldWUgaXMgZW1wdHkKLSAgICAvLyBJbiBhc3luY2hyb25vdXMgbW9kZSB0aGUgbGlzdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9uZSBidWZmZXIKLSAgICAvLyBkZWVwLCB3aGlsZSBpbiBzeW5jaHJvbm91cyBtb2RlIHdlIHVzZSB0aGUgb2xkZXN0IGJ1ZmZlci4KLSAgICBpZiAoIW1RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEZpZm86Oml0ZXJhdG9yIGZyb250KG1RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaW50IGJ1ZiA9ICpmcm9udDsKLQotICAgICAgICBBVFJBQ0VfQlVGRkVSX0lOREVYKGJ1Zik7Ci0KLSAgICAgICAgaWYgKG1TbG90c1tidWZdLm1BY3F1aXJlQ2FsbGVkKSB7Ci0gICAgICAgICAgICBidWZmZXItPm1HcmFwaGljQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+bUdyYXBoaWNCdWZmZXIgPSBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICBidWZmZXItPm1Dcm9wID0gbVNsb3RzW2J1Zl0ubUNyb3A7Ci0gICAgICAgIGJ1ZmZlci0+bVRyYW5zZm9ybSA9IG1TbG90c1tidWZdLm1UcmFuc2Zvcm07Ci0gICAgICAgIGJ1ZmZlci0+bVNjYWxpbmdNb2RlID0gbVNsb3RzW2J1Zl0ubVNjYWxpbmdNb2RlOwotICAgICAgICBidWZmZXItPm1GcmFtZU51bWJlciA9IG1TbG90c1tidWZdLm1GcmFtZU51bWJlcjsKLSAgICAgICAgYnVmZmVyLT5tVGltZXN0YW1wID0gbVNsb3RzW2J1Zl0ubVRpbWVzdGFtcDsKLSAgICAgICAgYnVmZmVyLT5tQnVmID0gYnVmOwotICAgICAgICBtU2xvdHNbYnVmXS5tQWNxdWlyZUNhbGxlZCA9IHRydWU7Ci0KLSAgICAgICAgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlID0gQnVmZmVyU2xvdDo6QUNRVUlSRUQ7Ci0gICAgICAgIG1RdWV1ZS5lcmFzZShmcm9udCk7Ci0KLSAgICAgICAgQVRSQUNFX0lOVChtQ29uc3VtZXJOYW1lLnN0cmluZygpLCBtUXVldWUuc2l6ZSgpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOyAvL3Nob3VsZCBiZSBhIGJldHRlciByZXR1cm4gY29kZQotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQnVmZmVyUXVldWU6OnJlbGVhc2VCdWZmZXIoaW50IGJ1ZiwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICBFR0xTeW5jS0hSIGZlbmNlKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBVFJBQ0VfQlVGRkVSX0lOREVYKGJ1Zik7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLQotICAgIGlmIChidWYgPT0gSU5WQUxJRF9CVUZGRVJfU0xPVCkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0KLSAgICBtU2xvdHNbYnVmXS5tRWdsRGlzcGxheSA9IGRpc3BsYXk7Ci0gICAgbVNsb3RzW2J1Zl0ubUZlbmNlID0gZmVuY2U7Ci0KLSAgICAvLyBUaGUgY3VycmVudCBidWZmZXIgYmVjb21lcyBGUkVFIGlmIGl0IHdhcyBzdGlsbCBpbiB0aGUgcXVldWVkCi0gICAgLy8gc3RhdGUuIElmIGl0IGhhcyBhbHJlYWR5IGJlZW4gZ2l2ZW4gdG8gdGhlIGNsaWVudAotICAgIC8vIChzeW5jaHJvbm91cyBtb2RlKSwgdGhlbiBpdCBzdGF5cyBpbiBERVFVRVVFRCBzdGF0ZS4KLSAgICBpZiAobVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlID09IEJ1ZmZlclNsb3Q6OlFVRVVFRAotICAgICAgICAgICAgfHwgbVNsb3RzW2J1Zl0ubUJ1ZmZlclN0YXRlID09IEJ1ZmZlclNsb3Q6OkFDUVVJUkVEKSB7Ci0gICAgICAgIG1TbG90c1tidWZdLm1CdWZmZXJTdGF0ZSA9IEJ1ZmZlclNsb3Q6OkZSRUU7Ci0gICAgfQotICAgIG1EZXF1ZXVlQ29uZGl0aW9uLnNpZ25hbCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6Y29uc3VtZXJEaXNjb25uZWN0KCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgLy8gT25jZSB0aGUgU3VyZmFjZVRleHR1cmUgZGlzY29ubmVjdHMsIHRoZSBCdWZmZXJRdWV1ZQotICAgIC8vIGlzIGNvbnNpZGVyZWQgYWJhbmRvbmVkCi0gICAgbUFiYW5kb25lZCA9IHRydWU7Ci0gICAgZnJlZUFsbEJ1ZmZlcnNMb2NrZWQoKTsKLSAgICBtRGVxdWV1ZUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlclF1ZXVlOjpzZXREZWZhdWx0QnVmZmVyU2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKQotewotICAgIFNUX0xPR1YoInNldERlZmF1bHRCdWZmZXJTaXplOiB3PSVkLCBoPSVkIiwgdywgaCk7Ci0gICAgaWYgKCF3IHx8ICFoKSB7Ci0gICAgICAgIFNUX0xPR0UoInNldERlZmF1bHRCdWZmZXJTaXplOiBkaW1lbnNpb25zIGNhbm5vdCBiZSAwICh3PSVkLCBoPSVkKSIsCi0gICAgICAgICAgICAgICAgdywgaCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtRGVmYXVsdFdpZHRoID0gdzsKLSAgICBtRGVmYXVsdEhlaWdodCA9IGg7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6c2V0QnVmZmVyQ291bnRTZXJ2ZXIoaW50IGJ1ZmZlckNvdW50KSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBzZXRCdWZmZXJDb3VudFNlcnZlckxvY2tlZChidWZmZXJDb3VudCk7Ci19Ci0KLXZvaWQgQnVmZmVyUXVldWU6OmZyZWVBbGxCdWZmZXJzRXhjZXB0SGVhZExvY2tlZCgpIHsKLSAgICBBTE9HV19JRighbVF1ZXVlLmlzRW1wdHkoKSwKLSAgICAgICAgICAgICJmcmVlQWxsQnVmZmVyc0V4Y2VwdEN1cnJlbnRMb2NrZWQgY2FsbGVkIGJ1dCBtUXVldWUgaXMgbm90IGVtcHR5Iik7Ci0gICAgaW50IGhlYWQgPSAtMTsKLSAgICBpZiAoIW1RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEZpZm86Oml0ZXJhdG9yIGZyb250KG1RdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgaGVhZCA9ICpmcm9udDsKLSAgICB9Ci0gICAgbUJ1ZmZlckhhc0JlZW5RdWV1ZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewotICAgICAgICBpZiAoaSAhPSBoZWFkKSB7Ci0gICAgICAgICAgICBmcmVlQnVmZmVyTG9ja2VkKGkpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6ZHJhaW5RdWV1ZUxvY2tlZCgpIHsKLSAgICB3aGlsZSAobVN5bmNocm9ub3VzTW9kZSAmJiAhbVF1ZXVlLmlzRW1wdHkoKSkgewotICAgICAgICBtRGVxdWV1ZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgICAgICBTVF9MT0dFKCJkcmFpblF1ZXVlTG9ja2VkOiBCdWZmZXJRdWV1ZSBoYXMgYmVlbiBhYmFuZG9uZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNvbm5lY3RlZEFwaSA9PSBOT19DT05ORUNURURfQVBJKSB7Ci0gICAgICAgICAgICBTVF9MT0dFKCJkcmFpblF1ZXVlTG9ja2VkOiBCdWZmZXJRdWV1ZSBpcyBub3QgY29ubmVjdGVkISIpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBCdWZmZXJRdWV1ZTo6ZHJhaW5RdWV1ZUFuZEZyZWVCdWZmZXJzTG9ja2VkKCkgewotICAgIHN0YXR1c190IGVyciA9IGRyYWluUXVldWVMb2NrZWQoKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChtU3luY2hyb25vdXNNb2RlKSB7Ci0gICAgICAgICAgICBmcmVlQWxsQnVmZmVyc0xvY2tlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZnJlZUFsbEJ1ZmZlcnNFeGNlcHRIZWFkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmNwcCBiL2xpYnMvZ3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3OTBhZC4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLSNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KLSNpbmNsdWRlIDxndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1EaXNwbGF5RXZlbnRSZWNlaXZlcjo6RGlzcGxheUV2ZW50UmVjZWl2ZXIoKSB7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc2YoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgaWYgKHNmICE9IE5VTEwpIHsKLSAgICAgICAgbUV2ZW50Q29ubmVjdGlvbiA9IHNmLT5jcmVhdGVEaXNwbGF5RXZlbnRDb25uZWN0aW9uKCk7Ci0gICAgICAgIGlmIChtRXZlbnRDb25uZWN0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1EYXRhQ2hhbm5lbCA9IG1FdmVudENvbm5lY3Rpb24tPmdldERhdGFDaGFubmVsKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLURpc3BsYXlFdmVudFJlY2VpdmVyOjp+RGlzcGxheUV2ZW50UmVjZWl2ZXIoKSB7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlFdmVudFJlY2VpdmVyOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgaWYgKG1EYXRhQ2hhbm5lbCAhPSBOVUxMKQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgcmV0dXJuIE5PX0lOSVQ7Ci19Ci0KLWludCBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6Z2V0RmQoKSBjb25zdCB7Ci0gICAgaWYgKG1EYXRhQ2hhbm5lbCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLQotICAgIHJldHVybiBtRGF0YUNoYW5uZWwtPmdldEZkKCk7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlFdmVudFJlY2VpdmVyOjpzZXRWc3luY1JhdGUodWludDMyX3QgY291bnQpIHsKLSAgICBpZiAoaW50MzJfdChjb3VudCkgPCAwKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgaWYgKG1FdmVudENvbm5lY3Rpb24gIT0gTlVMTCkgewotICAgICAgICBtRXZlbnRDb25uZWN0aW9uLT5zZXRWc3luY1JhdGUoY291bnQpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi1zdGF0dXNfdCBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6cmVxdWVzdE5leHRWc3luYygpIHsKLSAgICBpZiAobUV2ZW50Q29ubmVjdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgIG1FdmVudENvbm5lY3Rpb24tPnJlcXVlc3ROZXh0VnN5bmMoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotCi1zc2l6ZV90IERpc3BsYXlFdmVudFJlY2VpdmVyOjpnZXRFdmVudHMoRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkV2ZW50KiBldmVudHMsCi0gICAgICAgIHNpemVfdCBjb3VudCkgewotICAgIHJldHVybiBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6Z2V0RXZlbnRzKG1EYXRhQ2hhbm5lbCwgZXZlbnRzLCBjb3VudCk7Ci19Ci0KLXNzaXplX3QgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OmdldEV2ZW50cyhjb25zdCBzcDxCaXRUdWJlPiYgZGF0YUNoYW5uZWwsCi0gICAgICAgIEV2ZW50KiBldmVudHMsIHNpemVfdCBjb3VudCkKLXsKLSAgICBzc2l6ZV90IHNpemUgPSBkYXRhQ2hhbm5lbC0+cmVhZChldmVudHMsIHNpemVvZihldmVudHNbMF0pKmNvdW50KTsKLSAgICBBTE9HRV9JRihzaXplPDAsCi0gICAgICAgICAgICAiRGlzcGxheUV2ZW50UmVjZWl2ZXI6OmdldEV2ZW50cyBlcnJvciAoJXMpIiwKLSAgICAgICAgICAgIHN0cmVycm9yKC1zaXplKSk7Ci0gICAgaWYgKHNpemUgPj0gMCkgewotICAgICAgICAvLyBOb3RlOiBpZiAoc2l6ZSAlIHNpemVvZihldmVudHNbMF0pKSAhPSAwLCB3ZSd2ZSBnb3QgYQotICAgICAgICAvLyBwYXJ0aWFsIHJlYWQuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcXVldWUgZmlsZWQgdXAgKGllOiBpZiB3ZQotICAgICAgICAvLyBkaWRuJ3QgcHVsbCBmcm9tIGl0IGZhc3QgZW5vdWdoKS4KLSAgICAgICAgLy8gV2UgZGlzY2FyZCB0aGUgcGFydGlhbCBldmVudCBhbmQgcmVseSBvbiB0aGUgc2VuZGVyIHRvCi0gICAgICAgIC8vIHJlLXNlbmQgdGhlIGV2ZW50IGlmIGFwcHJvcHJpYXRlIChzb21lIGV2ZW50cywgbGlrZSBWU1lOQwotICAgICAgICAvLyBjYW4gYmUgbG9zdCBmb3JldmVyKS4KLQotICAgICAgICAvLyByZXR1cm5zIG51bWJlciBvZiBldmVudHMgcmVhZAotICAgICAgICBzaXplIC89IHNpemVvZihldmVudHNbMF0pOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAgYi9saWJzL2d1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2QxNzYuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lbnVtIHsKLSAgICBHRVRfREFUQV9DSEFOTkVMID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBTRVRfVlNZTkNfUkFURSwKLSAgICBSRVFVRVNUX05FWFRfVlNZTkMKLX07Ci0KLWNsYXNzIEJwRGlzcGxheUV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBCcEludGVyZmFjZTxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4KLXsKLXB1YmxpYzoKLSAgICBCcERpc3BsYXlFdmVudENvbm5lY3Rpb24oY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8Qml0VHViZT4gZ2V0RGF0YUNoYW5uZWwoKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURpc3BsYXlFdmVudENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfREFUQV9DSEFOTkVMLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gbmV3IEJpdFR1YmUocmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRWc3luY1JhdGUodWludDMyX3QgY291bnQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURpc3BsYXlFdmVudENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihjb3VudCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVlNZTkNfUkFURSwgZGF0YSwgJnJlcGx5KTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVxdWVzdE5leHRWc3luYygpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURpc3BsYXlFdmVudENvbm5lY3Rpb246OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRVFVRVNUX05FWFRfVlNZTkMsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShEaXNwbGF5RXZlbnRDb25uZWN0aW9uLCAiYW5kcm9pZC5ndWkuRGlzcGxheUV2ZW50Q29ubmVjdGlvbiIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX0RBVEFfQ0hBTk5FTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEaXNwbGF5RXZlbnRDb25uZWN0aW9uLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxCaXRUdWJlPiBjaGFubmVsKGdldERhdGFDaGFubmVsKCkpOwotICAgICAgICAgICAgY2hhbm5lbC0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1ZTWU5DX1JBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRGlzcGxheUV2ZW50Q29ubmVjdGlvbiwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc2V0VnN5bmNSYXRlKGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFJFUVVFU1RfTkVYVF9WU1lOQzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEaXNwbGF5RXZlbnRDb25uZWN0aW9uLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICByZXF1ZXN0TmV4dFZzeW5jKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmNwcCBiL2xpYnMvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBhNWU4YS4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gdGFnIGFzIHN1cmZhY2VmbGluZ2VyCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VGbGluZ2VyIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBDUkVBVEVfR1JBUEhJQ19CVUZGRVIgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotfTsKLQotY2xhc3MgQnBHcmFwaGljQnVmZmVyQWxsb2MgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUdyYXBoaWNCdWZmZXJBbGxvYz4KLXsKLXB1YmxpYzoKLSAgICBCcEdyYXBoaWNCdWZmZXJBbGxvYyhjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJR3JhcGhpY0J1ZmZlckFsbG9jPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPEdyYXBoaWNCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIHN0YXR1c190KiBlcnJvcikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJR3JhcGhpY0J1ZmZlckFsbG9jOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih1c2FnZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfR1JBUEhJQ19CVUZGRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXI7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LnJlYWQoKmdyYXBoaWNCdWZmZXIpOwotICAgICAgICAgICAgLy8gcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpOwotICAgICAgICAgICAgLy8gaGVyZSB3ZSBkb24ndCBldmVuIGhhdmUgdG8gcmVhZCB0aGUgQnVmZmVyUmVmZXJlbmNlIGZyb20KLSAgICAgICAgICAgIC8vIHRoZSBwYXJjZWwsIGl0J2xsIGRpZSB3aXRoIHRoZSBwYXJjZWwuCi0gICAgICAgIH0KLSAgICAgICAgKmVycm9yID0gcmVzdWx0OwotICAgICAgICByZXR1cm4gZ3JhcGhpY0J1ZmZlcjsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoR3JhcGhpY0J1ZmZlckFsbG9jLCAiYW5kcm9pZC51aS5JR3JhcGhpY0J1ZmZlckFsbG9jIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5HcmFwaGljQnVmZmVyQWxsb2M6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyBjb2RlcyB0aGF0IGRvbid0IHJlcXVpcmUgcGVybWlzc2lvbiBjaGVjawotCi0gICAgLyogQnVmZmVyUmVmZXJlbmNlIGp1c3Qga2VlcHMgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIGEKLSAgICAgKiBHcmFwaGljQnVmZmVyIHVudGlsIGl0IGlzIGRlc3Ryb3llZCAodGhhdCBpcywgdW50aWwKLSAgICAgKiBubyBsb2NhbCBvciByZW1vdGUgcHJvY2VzcyBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0KS4KLSAgICAgKi8KLSAgICBjbGFzcyBCdWZmZXJSZWZlcmVuY2UgOiBwdWJsaWMgQkJpbmRlciB7Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcjsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEJ1ZmZlclJlZmVyZW5jZShjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSA6IGJ1ZmZlcihidWZmZXIpIHsgfQotICAgIH07Ci0KLQotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0dSQVBISUNfQlVGRkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJBbGxvYywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgdyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBoID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB1c2FnZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnJvcjsKLSAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IHJlc3VsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUdyYXBoaWNCdWZmZXIodywgaCwgZm9ybWF0LCB1c2FnZSwgJmVycm9yKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycm9yKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgqcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAvLyBXZSBhZGQgYSBCdWZmZXJSZWZlcmVuY2UgdG8gdGhpcyBwYXJjZWwgdG8gbWFrZSBzdXJlIHRoZQotICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciBzdGF5cyBhbGl2ZSB1bnRpbCB0aGUgR3JhcGhpY0J1ZmZlciBvYmplY3Qgb24KLSAgICAgICAgICAgICAgICAvLyB0aGUgb3RoZXIgc2lkZSBoYXMgYmVlbiBjcmVhdGVkLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgdGhlIGJ1ZmZlciBoYW5kbGUgY2FuIGJlCi0gICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBkZXN0cm95ZWQgb24gaW1wbGVtZW50YXRpb25zCi0gICAgICAgICAgICAgICAgLy8gdGhhdCBkbyBub3QgdXNlIGZpbGUtZGVzY3JpcHRvcnMgdG8gdHJhY2sgdGhlaXIgYnVmZmVycy4KLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoIG5ldyBCdWZmZXJSZWZlcmVuY2UocmVzdWx0KSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmNwcCBiL2xpYnMvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTUxZThlLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPGd1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lbnVtIHsKLSAgICBHRVRfU0VOU09SX0NIQU5ORUwgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAotICAgIEVOQUJMRV9ESVNBQkxFLAotICAgIFNFVF9FVkVOVF9SQVRFCi19OwotCi1jbGFzcyBCcFNlbnNvckV2ZW50Q29ubmVjdGlvbiA6IHB1YmxpYyBCcEludGVyZmFjZTxJU2Vuc29yRXZlbnRDb25uZWN0aW9uPgotewotcHVibGljOgotICAgIEJwU2Vuc29yRXZlbnRDb25uZWN0aW9uKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElTZW5zb3JFdmVudENvbm5lY3Rpb24+KGltcGwpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8Qml0VHViZT4gZ2V0U2Vuc29yQ2hhbm5lbCgpIGNvbnN0Ci0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU2Vuc29yRXZlbnRDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NFTlNPUl9DSEFOTkVMLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gbmV3IEJpdFR1YmUocmVwbHkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlRGlzYWJsZShpbnQgaGFuZGxlLCBib29sIGVuYWJsZWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU2Vuc29yRXZlbnRDb25uZWN0aW9uOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoaGFuZGxlKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoRU5BQkxFX0RJU0FCTEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEV2ZW50UmF0ZShpbnQgaGFuZGxlLCBuc2Vjc190IG5zKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlbnNvckV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChucyk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfRVZFTlRfUkFURSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTZW5zb3JFdmVudENvbm5lY3Rpb24sICJhbmRyb2lkLmd1aS5TZW5zb3JFdmVudENvbm5lY3Rpb24iKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblNlbnNvckV2ZW50Q29ubmVjdGlvbjo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgR0VUX1NFTlNPUl9DSEFOTkVMOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlbnNvckV2ZW50Q29ubmVjdGlvbiwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8Qml0VHViZT4gY2hhbm5lbChnZXRTZW5zb3JDaGFubmVsKCkpOwotICAgICAgICAgICAgY2hhbm5lbC0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRU5BQkxFX0RJU0FCTEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2Vuc29yRXZlbnRDb25uZWN0aW9uLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludCBlbmFibGVkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGVuYWJsZURpc2FibGUoaGFuZGxlLCBlbmFibGVkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0VWRU5UX1JBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2Vuc29yRXZlbnRDb25uZWN0aW9uLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludCBucyA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXRFdmVudFJhdGUoaGFuZGxlLCBucyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSVNlbnNvclNlcnZlci5jcHAgYi9saWJzL2d1aS9JU2Vuc29yU2VydmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExMTA5Mi4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9JU2Vuc29yU2VydmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDxndWkvU2Vuc29yLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTZW5zb3JTZXJ2ZXIuaD4KLSNpbmNsdWRlIDxndWkvSVNlbnNvckV2ZW50Q29ubmVjdGlvbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVudW0gewotICAgIEdFVF9TRU5TT1JfTElTVCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgQ1JFQVRFX1NFTlNPUl9FVkVOVF9DT05ORUNUSU9OLAotfTsKLQotY2xhc3MgQnBTZW5zb3JTZXJ2ZXIgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNlbnNvclNlcnZlcj4KLXsKLXB1YmxpYzoKLSAgICBCcFNlbnNvclNlcnZlcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJU2Vuc29yU2VydmVyPihpbXBsKQotICAgIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFZlY3RvcjxTZW5zb3I+IGdldFNlbnNvckxpc3QoKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlbnNvclNlcnZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TRU5TT1JfTElTVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgU2Vuc29yIHM7Ci0gICAgICAgIFZlY3RvcjxTZW5zb3I+IHY7Ci0gICAgICAgIGludDMyX3QgbiA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB2LnNldENhcGFjaXR5KG4pOwotICAgICAgICB3aGlsZSAobi0tKSB7Ci0gICAgICAgICAgICByZXBseS5yZWFkKHN0YXRpY19jYXN0PEZsYXR0ZW5hYmxlJj4ocykpOwotICAgICAgICAgICAgdi5hZGQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJU2Vuc29yRXZlbnRDb25uZWN0aW9uPiBjcmVhdGVTZW5zb3JFdmVudENvbm5lY3Rpb24oKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNlbnNvclNlcnZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9TRU5TT1JfRVZFTlRfQ09OTkVDVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElTZW5zb3JFdmVudENvbm5lY3Rpb24+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNlbnNvclNlcnZlciwgImFuZHJvaWQuZ3VpLlNlbnNvclNlcnZlciIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuU2Vuc29yU2VydmVyOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfU0VOU09SX0xJU1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2Vuc29yU2VydmVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBWZWN0b3I8U2Vuc29yPiB2KGdldFNlbnNvckxpc3QoKSk7Ci0gICAgICAgICAgICBzaXplX3QgbiA9IHYuc2l6ZSgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobik7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoc3RhdGljX2Nhc3Q8Y29uc3QgRmxhdHRlbmFibGUmPih2W2ldKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX1NFTlNPUl9FVkVOVF9DT05ORUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNlbnNvclNlcnZlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4gY29ubmVjdGlvbihjcmVhdGVTZW5zb3JFdmVudENvbm5lY3Rpb24oKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoY29ubmVjdGlvbi0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU3VyZmFjZS5jcHAgYi9saWJzL2d1aS9JU3VyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZWExODMuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiSVN1cmZhY2UiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlVGV4dHVyZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQnBTdXJmYWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElTdXJmYWNlPgotewotcHVibGljOgotICAgIEJwU3VyZmFjZShjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJU3VyZmFjZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZVRleHR1cmU+IGdldFN1cmZhY2VUZXh0dXJlKCkgY29uc3QgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVVJGQUNFX1RFWFRVUkUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZVRleHR1cmU+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgfQotfTsKLQotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFN1cmZhY2UsICJhbmRyb2lkLnVpLklTdXJmYWNlIik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQm5TdXJmYWNlOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3dpdGNoKGNvZGUpIHsKLSAgICAgICAgY2FzZSBHRVRfU1VSRkFDRV9URVhUVVJFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlciggZ2V0U3VyZmFjZVRleHR1cmUoKS0+YXNCaW5kZXIoKSApOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwIGIvbGlicy9ndWkvSVN1cmZhY2VDb21wb3Nlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTc5NGMuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2VDb21wb3Nlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIHRhZyBhcyBzdXJmYWNlZmxpbmdlcgotI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlRmxpbmdlciIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLSNpbmNsdWRlIDxndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0xheWVyU3RhdGUuaD4KLQotI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSURpc3BsYXlFdmVudENvbm5lY3Rpb247Ci0KLWNsYXNzIEJwU3VyZmFjZUNvbXBvc2VyIDogcHVibGljIEJwSW50ZXJmYWNlPElTdXJmYWNlQ29tcG9zZXI+Ci17Ci1wdWJsaWM6Ci0gICAgQnBTdXJmYWNlQ29tcG9zZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVN1cmZhY2VDb21wb3Nlcj4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBjcmVhdGVDb25uZWN0aW9uKCkKLSAgICB7Ci0gICAgICAgIHVpbnQzMl90IG47Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6Q1JFQVRFX0NPTk5FQ1RJT04sIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gY3JlYXRlR3JhcGhpY0J1ZmZlckFsbG9jKCkKLSAgICB7Ci0gICAgICAgIHVpbnQzMl90IG47Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6Q1JFQVRFX0dSQVBISUNfQlVGRkVSX0FMTE9DLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SUdyYXBoaWNCdWZmZXJBbGxvYz4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPElNZW1vcnlIZWFwPiBnZXRDYmxrKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6R0VUX0NCTEssIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0VHJhbnNhY3Rpb25TdGF0ZShjb25zdCBWZWN0b3I8Q29tcG9zZXJTdGF0ZT4mIHN0YXRlLAotICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIFZlY3RvcjxDb21wb3NlclN0YXRlPjo6Y29uc3RfaXRlcmF0b3IgYihzdGF0ZS5iZWdpbigpKTsKLSAgICAgICAgVmVjdG9yPENvbXBvc2VyU3RhdGU+Ojpjb25zdF9pdGVyYXRvciBlKHN0YXRlLmVuZCgpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRlLnNpemUoKSk7Ci0gICAgICAgIGZvciAoIDsgYiAhPSBlIDsgKytiICkgewotICAgICAgICAgICAgYi0+d3JpdGUoZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YS53cml0ZUludDMyKG9yaWVudGF0aW9uKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpTRVRfVFJBTlNBQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGJvb3RGaW5pc2hlZCgpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OkJPT1RfRklOSVNIRUQsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjYXB0dXJlU2NyZWVuKERpc3BsYXlJRCBkcHksCi0gICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4qIGhlYXAsCi0gICAgICAgICAgICB1aW50MzJfdCogd2lkdGgsIHVpbnQzMl90KiBoZWlnaHQsIFBpeGVsRm9ybWF0KiBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCByZXFXaWR0aCwgdWludDMyX3QgcmVxSGVpZ2h0LAotICAgICAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaLCB1aW50MzJfdCBtYXhMYXllclopCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoZHB5KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcVdpZHRoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcUhlaWdodCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtaW5MYXllclopOwotICAgICAgICBkYXRhLndyaXRlSW50MzIobWF4TGF5ZXJaKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpDQVBUVVJFX1NDUkVFTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgKmhlYXAgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5SGVhcD4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgKndpZHRoID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICpoZWlnaHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgKmZvcm1hdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuRWxlY3Ryb25CZWFtT2ZmKGludDMyX3QgbW9kZSkKLSAgICB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2RlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEJuU3VyZmFjZUNvbXBvc2VyOjpUVVJOX0VMRUNUUk9OX0JFQU1fT0ZGLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB0dXJuRWxlY3Ryb25CZWFtT24oaW50MzJfdCBtb2RlKQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VDb21wb3Nlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG1vZGUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OlRVUk5fRUxFQ1RST05fQkVBTV9PTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBhdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2VUZXh0dXJlKSBjb25zdAotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBpbnQgZXJyID0gTk9fRVJST1I7Ci0gICAgICAgIGVyciA9IGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbigKLSAgICAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSVN1cmZhY2VDb21wb3Nlcjo6YXV0aGVudGljYXRlU3VyZmFjZVRleHR1cmU6IGVycm9yIHdyaXRpbmcgIgotICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlIGRlc2NyaXB0b3I6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyID0gZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihzdXJmYWNlVGV4dHVyZS0+YXNCaW5kZXIoKSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJU3VyZmFjZUNvbXBvc2VyOjphdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZTogZXJyb3Igd3JpdGluZyAiCi0gICAgICAgICAgICAgICAgICAgICJzdHJvbmcgYmluZGVyIHRvIHBhcmNlbDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OkFVVEhFTlRJQ0FURV9TVVJGQUNFLCBkYXRhLAotICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJU3VyZmFjZUNvbXBvc2VyOjphdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZTogZXJyb3IgIgotICAgICAgICAgICAgICAgICAgICAicGVyZm9ybWluZyB0cmFuc2FjdGlvbjogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgICAgIGVyciA9IHJlcGx5LnJlYWRJbnQzMigmcmVzdWx0KTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIklTdXJmYWNlQ29tcG9zZXI6OmF1dGhlbnRpY2F0ZVN1cmZhY2VUZXh0dXJlOiBlcnJvciAiCi0gICAgICAgICAgICAgICAgICAgICJyZXRyaWV2aW5nIHJlc3VsdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0ICE9IDA7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJRGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gY3JlYXRlRGlzcGxheUV2ZW50Q29ubmVjdGlvbigpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHNwPElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiByZXN1bHQ7Ci0gICAgICAgIGludCBlcnIgPSBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oCi0gICAgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoCi0gICAgICAgICAgICAgICAgQm5TdXJmYWNlQ29tcG9zZXI6OkNSRUFURV9ESVNQTEFZX0VWRU5UX0NPTk5FQ1RJT04sCi0gICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIklTdXJmYWNlQ29tcG9zZXI6OmNyZWF0ZURpc3BsYXlFdmVudENvbm5lY3Rpb246IGVycm9yIHBlcmZvcm1pbmcgIgotICAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb246ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IGludGVyZmFjZV9jYXN0PElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTdXJmYWNlQ29tcG9zZXIsICJhbmRyb2lkLnVpLklTdXJmYWNlQ29tcG9zZXIiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblN1cmZhY2VDb21wb3Nlcjo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgQ1JFQVRFX0NPTk5FQ1RJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiID0gY3JlYXRlQ29ubmVjdGlvbigpLT5hc0JpbmRlcigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGIpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENSRUFURV9HUkFQSElDX0JVRkZFUl9BTExPQzogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGIgPSBjcmVhdGVHcmFwaGljQnVmZmVyQWxsb2MoKS0+YXNCaW5kZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihiKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBTRVRfVFJBTlNBQ1RJT05fU1RBVEU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzaXplX3QgY291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgQ29tcG9zZXJTdGF0ZSBzOwotICAgICAgICAgICAgVmVjdG9yPENvbXBvc2VyU3RhdGU+IHN0YXRlOwotICAgICAgICAgICAgc3RhdGUuc2V0Q2FwYWNpdHkoY291bnQpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIHMucmVhZChkYXRhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS5hZGQocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgb3JpZW50YXRpb24gPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc2V0VHJhbnNhY3Rpb25TdGF0ZShzdGF0ZSwgb3JpZW50YXRpb24sIGZsYWdzKTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBCT09UX0ZJTklTSEVEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vdEZpbmlzaGVkKCk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VUX0NCTEs6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiID0gZ2V0Q2JsaygpLT5hc0JpbmRlcigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGIpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENBUFRVUkVfU0NSRUVOOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgRGlzcGxheUlEIGRweSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXFXaWR0aCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXFIZWlnaHQgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG1heExheWVyWiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcDsKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIGg7Ci0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gY2FwdHVyZVNjcmVlbihkcHksICZoZWFwLCAmdywgJmgsICZmLAotICAgICAgICAgICAgICAgICAgICByZXFXaWR0aCwgcmVxSGVpZ2h0LCBtaW5MYXllclosIG1heExheWVyWik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoaGVhcC0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih3KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZik7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFRVUk5fRUxFQ1RST05fQkVBTV9PRkY6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IG1vZGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gdHVybkVsZWN0cm9uQmVhbU9mZihtb2RlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgVFVSTl9FTEVDVFJPTl9CRUFNX09OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IHR1cm5FbGVjdHJvbkJlYW1Pbihtb2RlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVUSEVOVElDQVRFX1NVUkZBQ0U6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJU3VyZmFjZVRleHR1cmU+IHN1cmZhY2VUZXh0dXJlID0KLSAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VUZXh0dXJlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpbnQzMl90IHJlc3VsdCA9IGF1dGhlbnRpY2F0ZVN1cmZhY2VUZXh0dXJlKHN1cmZhY2VUZXh0dXJlKSA/IDEgOiAwOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBDUkVBVEVfRElTUExBWV9FVkVOVF9DT05ORUNUSU9OOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IGNvbm5lY3Rpb24oY3JlYXRlRGlzcGxheUV2ZW50Q29ubmVjdGlvbigpKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihjb25uZWN0aW9uLT5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OwpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgYi9saWJzL2d1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ZWQ1Yi4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gdGFnIGFzIHN1cmZhY2VmbGluZ2VyCi0jZGVmaW5lIExPR19UQUcgIlN1cmZhY2VGbGluZ2VyIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPHVpL1BvaW50Lmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9MYXllclN0YXRlLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gewotICAgIENSRUFURV9TVVJGQUNFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLSAgICBERVNUUk9ZX1NVUkZBQ0UKLX07Ci0KLWNsYXNzIEJwU3VyZmFjZUNvbXBvc2VyQ2xpZW50IDogcHVibGljIEJwSW50ZXJmYWNlPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+Ci17Ci1wdWJsaWM6Ci0gICAgQnBTdXJmYWNlQ29tcG9zZXJDbGllbnQoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SVN1cmZhY2VDb21wb3NlckNsaWVudD4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSggc3VyZmFjZV9kYXRhX3QqIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChuYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGRpc3BsYXkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcGFyYW1zLT5yZWFkRnJvbVBhcmNlbChyZXBseSk7Ci0gICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJU3VyZmFjZT4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzaWQpCi0gICAgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc2lkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERFU1RST1lfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTdXJmYWNlQ29tcG9zZXJDbGllbnQsICJhbmRyb2lkLnVpLklTdXJmYWNlQ29tcG9zZXJDbGllbnQiKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBCblN1cmZhY2VDb21wb3NlckNsaWVudDo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIENSRUFURV9TVVJGQUNFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlckNsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3VyZmFjZV9kYXRhX3QgcGFyYW1zOwotICAgICAgICAgICAgU3RyaW5nOCBuYW1lID0gZGF0YS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXkgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgdyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBoID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzcDxJU3VyZmFjZT4gcyA9IGNyZWF0ZVN1cmZhY2UoJnBhcmFtcywgbmFtZSwgZGlzcGxheSwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBmbGFncyk7Ci0gICAgICAgICAgICBwYXJhbXMud3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIocy0+YXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgREVTVFJPWV9TVVJGQUNFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlckNsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIGRlc3Ryb3lTdXJmYWNlKCBkYXRhLnJlYWRJbnQzMigpICkgKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIHBhcmNlbCkKLXsKLSAgICB0b2tlbiAgICA9IHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBpZGVudGl0eSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdAotewotICAgIHBhcmNlbC0+d3JpdGVJbnQzMih0b2tlbik7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKGlkZW50aXR5KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU3VyZmFjZVRleHR1cmUuY3BwIGIvbGlicy9ndWkvSVN1cmZhY2VUZXh0dXJlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNTYyNy4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9JU3VyZmFjZVRleHR1cmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZVRleHR1cmUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lbnVtIHsKLSAgICBSRVFVRVNUX0JVRkZFUiA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgU0VUX0JVRkZFUl9DT1VOVCwKLSAgICBERVFVRVVFX0JVRkZFUiwKLSAgICBRVUVVRV9CVUZGRVIsCi0gICAgQ0FOQ0VMX0JVRkZFUiwKLSAgICBTRVRfQ1JPUCwKLSAgICBTRVRfVFJBTlNGT1JNLAotICAgIFFVRVJZLAotICAgIFNFVF9TWU5DSFJPTk9VU19NT0RFLAotICAgIENPTk5FQ1QsCi0gICAgRElTQ09OTkVDVCwKLSAgICBTRVRfU0NBTElOR19NT0RFLAotfTsKLQotCi1jbGFzcyBCcFN1cmZhY2VUZXh0dXJlIDogcHVibGljIEJwSW50ZXJmYWNlPElTdXJmYWNlVGV4dHVyZT4KLXsKLXB1YmxpYzoKLSAgICBCcFN1cmZhY2VUZXh0dXJlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElTdXJmYWNlVGV4dHVyZT4oaW1wbCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0QnVmZmVyKGludCBidWZmZXJJZHgsIHNwPEdyYXBoaWNCdWZmZXI+KiBidWYpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVySWR4KTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID1yZW1vdGUoKS0+dHJhbnNhY3QoUkVRVUVTVF9CVUZGRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBub25OdWxsID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChub25OdWxsKSB7Ci0gICAgICAgICAgICAqYnVmID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgICAgIHJlcGx5LnJlYWQoKipidWYpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KQotICAgIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyQ291bnQpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPXJlbW90ZSgpLT50cmFuc2FjdChTRVRfQlVGRkVSX0NPVU5ULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUJ1ZmZlcihpbnQgKmJ1ZiwgdWludDMyX3QgdywgdWludDMyX3QgaCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIodyk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihoKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGZvcm1hdCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih1c2FnZSk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChERVFVRVVFX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAqYnVmID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXIoaW50IGJ1ZiwgaW50NjRfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmKTsKLSAgICAgICAgZGF0YS53cml0ZUludDY0KHRpbWVzdGFtcCk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChRVUVVRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgKm91dFdpZHRoID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICpvdXRIZWlnaHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgKm91dFRyYW5zZm9ybSA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2FuY2VsQnVmZmVyKGludCBidWYpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENBTkNFTF9CVUZGRVIsIGRhdGEsICZyZXBseSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDcm9wKGNvbnN0IFJlY3QmIHJlZykgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZVRleHR1cmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVGbG9hdChyZWcubGVmdCk7Ci0gICAgICAgIGRhdGEud3JpdGVGbG9hdChyZWcudG9wKTsKLSAgICAgICAgZGF0YS53cml0ZUZsb2F0KHJlZy5yaWdodCk7Ci0gICAgICAgIGRhdGEud3JpdGVGbG9hdChyZWcuYm90dG9tKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DUk9QLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtKHVpbnQzMl90IHRyYW5zZm9ybSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZVRleHR1cmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih0cmFuc2Zvcm0pOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1RSQU5TRk9STSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFNjYWxpbmdNb2RlKGludCBtb2RlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG1vZGUpOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NDQUxJTkdfTU9ERSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCBxdWVyeShpbnQgd2hhdCwgaW50KiB2YWx1ZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZVRleHR1cmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih3aGF0KTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVtb3RlKCktPnRyYW5zYWN0KFFVRVJZLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHZhbHVlWzBdID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY2hyb25vdXNNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZVRleHR1cmU6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihlbmFibGVkKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9TWU5DSFJPTk9VU19NT0RFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdChpbnQgYXBpLAotICAgICAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlVGV4dHVyZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGFwaSk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChDT05ORUNULCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgICpvdXRXaWR0aCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAqb3V0SGVpZ2h0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICpvdXRUcmFuc2Zvcm0gPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KGludCBhcGkpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVN1cmZhY2VUZXh0dXJlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoYXBpKTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID1yZW1vdGUoKS0+dHJhbnNhY3QoRElTQ09OTkVDVCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU3VyZmFjZVRleHR1cmUsICJhbmRyb2lkLmd1aS5TdXJmYWNlVGV4dHVyZSIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IEJuU3VyZmFjZVRleHR1cmU6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIFJFUVVFU1RfQlVGRkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgYnVmZmVySWR4ICAgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgaW50IHJlc3VsdCA9IHJlcXVlc3RCdWZmZXIoYnVmZmVySWR4LCAmYnVmZmVyKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlciAhPSAwKTsKLSAgICAgICAgICAgIGlmIChidWZmZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgqYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0JVRkZFUl9DT1VOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBzZXRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIERFUVVFVUVfQlVGRkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCB3ICAgICAgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgaCAgICAgID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCB1c2FnZSAgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50IGJ1ZjsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBkZXF1ZXVlQnVmZmVyKCZidWYsIHcsIGgsIGZvcm1hdCwgdXNhZ2UpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUVVFVUVfQlVGRkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgYnVmID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gZGF0YS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG91dFdpZHRoLCBvdXRIZWlnaHQsIG91dFRyYW5zZm9ybTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHF1ZXVlQnVmZmVyKGJ1ZiwgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgICAgICAmb3V0V2lkdGgsICZvdXRIZWlnaHQsICZvdXRUcmFuc2Zvcm0pOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob3V0V2lkdGgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob3V0SGVpZ2h0KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dFRyYW5zZm9ybSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENBTkNFTF9CVUZGRVI6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBidWYgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgY2FuY2VsQnVmZmVyKGJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX0NST1A6IHsKLSAgICAgICAgICAgIFJlY3QgcmVnOwotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgcmVnLmxlZnQgPSBkYXRhLnJlYWRGbG9hdCgpOwotICAgICAgICAgICAgcmVnLnRvcCA9IGRhdGEucmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICByZWcucmlnaHQgPSBkYXRhLnJlYWRGbG9hdCgpOwotICAgICAgICAgICAgcmVnLmJvdHRvbSA9IGRhdGEucmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXRDcm9wKHJlZyk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9UUkFOU0ZPUk06IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRyYW5zZm9ybSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1NDQUxJTkdfTU9ERTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IG1vZGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0U2NhbGluZ01vZGUobW9kZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFFVRVJZOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VUZXh0dXJlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgICBpbnQgd2hhdCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpbnQgcmVzID0gcXVlcnkod2hhdCwgJnZhbHVlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHZhbHVlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VUX1NZTkNIUk9OT1VTX01PREU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlZCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBzZXRTeW5jaHJvbm91c01vZGUoZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIENPTk5FQ1Q6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZVRleHR1cmUsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBhcGkgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3Qgb3V0V2lkdGgsIG91dEhlaWdodCwgb3V0VHJhbnNmb3JtOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gY29ubmVjdChhcGksCi0gICAgICAgICAgICAgICAgICAgICZvdXRXaWR0aCwgJm91dEhlaWdodCwgJm91dFRyYW5zZm9ybSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRXaWR0aCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRIZWlnaHQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIob3V0VHJhbnNmb3JtKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRElTQ09OTkVDVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlVGV4dHVyZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGFwaSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkaXNjb25uZWN0KGFwaSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9MYXllclN0YXRlLmNwcCBiL2xpYnMvZ3VpL0xheWVyU3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRjMzA1Li4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL0xheWVyU3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9MYXllclN0YXRlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgbGF5ZXJfc3RhdGVfdDo6d3JpdGUoUGFyY2VsJiBvdXRwdXQpIGNvbnN0Ci17Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgc2l6ZV90IGxlbiA9IHRyYW5zcGFyZW50UmVnaW9uLndyaXRlKE5VTEwsIDApOwotICAgIGVyciA9IG91dHB1dC53cml0ZUludDMyKGxlbik7Ci0gICAgaWYgKGVyciA8IE5PX0VSUk9SKSByZXR1cm4gZXJyOwotCi0gICAgdm9pZCogYnVmID0gb3V0cHV0LndyaXRlSW5wbGFjZShsZW4pOwotICAgIGlmIChidWYgPT0gTlVMTCkgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgIGVyciA9IHRyYW5zcGFyZW50UmVnaW9uLndyaXRlKGJ1ZiwgbGVuKTsKLSAgICBpZiAoZXJyIDwgTk9fRVJST1IpIHJldHVybiBlcnI7Ci0KLSAgICAvLyBOT1RFOiByZWdpb25zIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUKLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihsYXllcl9zdGF0ZV90KTsKLSAgICBzaXplIC09IHNpemVvZih0cmFuc3BhcmVudFJlZ2lvbik7Ci0gICAgZXJyID0gb3V0cHV0LndyaXRlKHRoaXMsIHNpemUpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IGxheWVyX3N0YXRlX3Q6OnJlYWQoY29uc3QgUGFyY2VsJiBpbnB1dCkKLXsKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgc2l6ZV90IGxlbiA9IGlucHV0LnJlYWRJbnQzMigpOwotICAgIHZvaWQgY29uc3QqIGJ1ZiA9IGlucHV0LnJlYWRJbnBsYWNlKGxlbik7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgZXJyID0gdHJhbnNwYXJlbnRSZWdpb24ucmVhZChidWYpOwotICAgIGlmIChlcnIgPCBOT19FUlJPUikgcmV0dXJuIGVycjsKLQotICAgIC8vIE5PVEU6IHJlZ2lvbnMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZQotICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKGxheWVyX3N0YXRlX3QpOwotICAgIHNpemUgLT0gc2l6ZW9mKHRyYW5zcGFyZW50UmVnaW9uKTsKLSAgICBpbnB1dC5yZWFkKHRoaXMsIHNpemUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXJTdGF0ZTo6d3JpdGUoUGFyY2VsJiBvdXRwdXQpIGNvbnN0IHsKLSAgICBvdXRwdXQud3JpdGVTdHJvbmdCaW5kZXIoY2xpZW50LT5hc0JpbmRlcigpKTsKLSAgICByZXR1cm4gc3RhdGUud3JpdGUob3V0cHV0KTsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXJTdGF0ZTo6cmVhZChjb25zdCBQYXJjZWwmIGlucHV0KSB7Ci0gICAgY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SVN1cmZhY2VDb21wb3NlckNsaWVudD4oaW5wdXQucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICByZXR1cm4gc3RhdGUucmVhZChpbnB1dCk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TZW5zb3IuY3BwIGIvbGlicy9ndWkvU2Vuc29yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhMmMwNDYuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU2Vuc29yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL0ZsYXR0ZW5hYmxlLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9zZW5zb3JzLmg+Ci0KLSNpbmNsdWRlIDxndWkvU2Vuc29yLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU2Vuc29yOjpTZW5zb3IoKQotICAgIDogbUhhbmRsZSgwKSwgbVR5cGUoMCksCi0gICAgICBtTWluVmFsdWUoMCksIG1NYXhWYWx1ZSgwKSwgbVJlc29sdXRpb24oMCksCi0gICAgICBtUG93ZXIoMCksIG1NaW5EZWxheSgwKQotewotfQotCi1TZW5zb3I6OlNlbnNvcihzdHJ1Y3Qgc2Vuc29yX3QgY29uc3QqIGh3U2Vuc29yKQotewotICAgIG1OYW1lID0gaHdTZW5zb3ItPm5hbWU7Ci0gICAgbVZlbmRvciA9IGh3U2Vuc29yLT52ZW5kb3I7Ci0gICAgbUhhbmRsZSA9IGh3U2Vuc29yLT5oYW5kbGU7Ci0gICAgbVR5cGUgPSBod1NlbnNvci0+dHlwZTsKLSAgICBtTWluVmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWluVmFsdWUKLSAgICBtTWF4VmFsdWUgPSBod1NlbnNvci0+bWF4UmFuZ2U7ICAgICAvLyBGSVhNRTogbWF4VmFsdWUKLSAgICBtUmVzb2x1dGlvbiA9IGh3U2Vuc29yLT5yZXNvbHV0aW9uOwotICAgIG1Qb3dlciA9IGh3U2Vuc29yLT5wb3dlcjsKLSAgICBtTWluRGVsYXkgPSBod1NlbnNvci0+bWluRGVsYXk7Ci19Ci0KLVNlbnNvcjo6flNlbnNvcigpCi17Ci19Ci0KLWNvbnN0IFN0cmluZzgmIFNlbnNvcjo6Z2V0TmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5hbWU7Ci19Ci0KLWNvbnN0IFN0cmluZzgmIFNlbnNvcjo6Z2V0VmVuZG9yKCkgY29uc3QgewotICAgIHJldHVybiBtVmVuZG9yOwotfQotCi1pbnQzMl90IFNlbnNvcjo6Z2V0SGFuZGxlKCkgY29uc3QgewotICAgIHJldHVybiBtSGFuZGxlOwotfQotCi1pbnQzMl90IFNlbnNvcjo6Z2V0VHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVR5cGU7Ci19Ci0KLWZsb2F0IFNlbnNvcjo6Z2V0TWluVmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1NaW5WYWx1ZTsKLX0KLQotZmxvYXQgU2Vuc29yOjpnZXRNYXhWYWx1ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1heFZhbHVlOwotfQotCi1mbG9hdCBTZW5zb3I6OmdldFJlc29sdXRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZXNvbHV0aW9uOwotfQotCi1mbG9hdCBTZW5zb3I6OmdldFBvd2VyVXNhZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Qb3dlcjsKLX0KLQotaW50MzJfdCBTZW5zb3I6OmdldE1pbkRlbGF5KCkgY29uc3QgewotICAgIHJldHVybiBtTWluRGVsYXk7Ci19Ci0KLW5zZWNzX3QgU2Vuc29yOjpnZXRNaW5EZWxheU5zKCkgY29uc3QgewotICAgIHJldHVybiBnZXRNaW5EZWxheSgpICogMTAwMDsKLX0KLQotaW50MzJfdCBTZW5zb3I6OmdldFZlcnNpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1WZXJzaW9uOwotfQotCi1zaXplX3QgU2Vuc29yOjpnZXRGbGF0dGVuZWRTaXplKCkgY29uc3QKLXsKLSAgICByZXR1cm4gIHNpemVvZihpbnQzMl90KSArICgobU5hbWUubGVuZ3RoKCkgKyAzKSAmIH4zKSArCi0gICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKyAoKG1WZW5kb3IubGVuZ3RoKCkgKyAzKSAmIH4zKSArCi0gICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKiAyICsKLSAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiA0ICsKLSAgICAgICAgICAgIHNpemVvZihpbnQzMl90KTsKLX0KLQotc2l6ZV90IFNlbnNvcjo6Z2V0RmRDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXNpemVfdCB3cml0ZSh2b2lkKiBidWZmZXIsIHNpemVfdCBvZmZzZXQsIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7Ci0gICAgbWVtY3B5KHN0YXRpY19jYXN0PGNoYXIqPihidWZmZXIpICsgb2Zmc2V0LCB2YWx1ZS5zdHJpbmcoKSwgdmFsdWUubGVuZ3RoKCkpOwotICAgIHJldHVybiAodmFsdWUubGVuZ3RoKCkgKyAzKSAmIH4zOwotfQotCi1zdGF0aWMgaW5saW5lCi1zaXplX3Qgd3JpdGUodm9pZCogYnVmZmVyLCBzaXplX3Qgb2Zmc2V0LCBmbG9hdCB2YWx1ZSkgewotICAgICpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4oc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZmZlcikgKyBvZmZzZXQpID0gdmFsdWU7Ci0gICAgcmV0dXJuIHNpemVvZihmbG9hdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXNpemVfdCB3cml0ZSh2b2lkKiBidWZmZXIsIHNpemVfdCBvZmZzZXQsIGludDMyX3QgdmFsdWUpIHsKLSAgICAqcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZmZlcikgKyBvZmZzZXQpID0gdmFsdWU7Ci0gICAgcmV0dXJuIHNpemVvZihpbnQzMl90KTsKLX0KLQotc3RhdHVzX3QgU2Vuc29yOjpmbGF0dGVuKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgIGludCBmZHNbXSwgc2l6ZV90IGNvdW50KSBjb25zdAotewotICAgIGlmIChzaXplIDwgU2Vuc29yOjpnZXRGbGF0dGVuZWRTaXplKCkpCi0gICAgICAgIHJldHVybiAtRU5PTUVNOwotCi0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBpbnQzMl90KG1OYW1lLmxlbmd0aCgpKSk7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtTmFtZSk7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBpbnQzMl90KG1WZW5kb3IubGVuZ3RoKCkpKTsKLSAgICBvZmZzZXQgKz0gd3JpdGUoYnVmZmVyLCBvZmZzZXQsIG1WZW5kb3IpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgbUhhbmRsZSk7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtVHlwZSk7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtTWluVmFsdWUpOwotICAgIG9mZnNldCArPSB3cml0ZShidWZmZXIsIG9mZnNldCwgbU1heFZhbHVlKTsKLSAgICBvZmZzZXQgKz0gd3JpdGUoYnVmZmVyLCBvZmZzZXQsIG1SZXNvbHV0aW9uKTsKLSAgICBvZmZzZXQgKz0gd3JpdGUoYnVmZmVyLCBvZmZzZXQsIG1Qb3dlcik7Ci0gICAgb2Zmc2V0ICs9IHdyaXRlKGJ1ZmZlciwgb2Zmc2V0LCBtTWluRGVsYXkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0aWMgaW5saW5lCi1zaXplX3QgcmVhZCh2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBvZmZzZXQsIFN0cmluZzgqIHZhbHVlLCBpbnQzMl90IGxlbikgewotICAgIHZhbHVlLT5zZXRUbyhzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oYnVmZmVyKSArIG9mZnNldCwgbGVuKTsKLSAgICByZXR1cm4gKGxlbiArIDMpICYgfjM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXNpemVfdCByZWFkKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IG9mZnNldCwgZmxvYXQqIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgY29uc3QqPihzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oYnVmZmVyKSArIG9mZnNldCk7Ci0gICAgcmV0dXJuIHNpemVvZihmbG9hdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXNpemVfdCByZWFkKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IG9mZnNldCwgaW50MzJfdCogdmFsdWUpIHsKLSAgICAqdmFsdWUgPSAqcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90IGNvbnN0Kj4oc3RhdGljX2Nhc3Q8Y2hhciBjb25zdCo+KGJ1ZmZlcikgKyBvZmZzZXQpOwotICAgIHJldHVybiBzaXplb2YoaW50MzJfdCk7Ci19Ci0KLXN0YXR1c190IFNlbnNvcjo6dW5mbGF0dGVuKHZvaWQgY29uc3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCi0gICAgICAgIGludCBmZHNbXSwgc2l6ZV90IGNvdW50KQotewotICAgIGludDMyX3QgbGVuOwotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCArPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCAmbGVuKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1OYW1lLCBsZW4pOwotICAgIG9mZnNldCArPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCAmbGVuKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1WZW5kb3IsIGxlbik7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtSGFuZGxlKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1UeXBlKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1NaW5WYWx1ZSk7Ci0gICAgb2Zmc2V0ICs9IHJlYWQoYnVmZmVyLCBvZmZzZXQsICZtTWF4VmFsdWUpOwotICAgIG9mZnNldCArPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCAmbVJlc29sdXRpb24pOwotICAgIG9mZnNldCArPSByZWFkKGJ1ZmZlciwgb2Zmc2V0LCAmbVBvd2VyKTsKLSAgICBvZmZzZXQgKz0gcmVhZChidWZmZXIsIG9mZnNldCwgJm1NaW5EZWxheSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS9TZW5zb3JFdmVudFF1ZXVlLmNwcCBiL2xpYnMvZ3VpL1NlbnNvckV2ZW50UXVldWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTVkZDkwMi4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9TZW5zb3JFdmVudFF1ZXVlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTZW5zb3JzIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9vcGVyLmg+Ci0KLSNpbmNsdWRlIDxndWkvU2Vuc29yLmg+Ci0jaW5jbHVkZSA8Z3VpL0JpdFR1YmUuaD4KLSNpbmNsdWRlIDxndWkvU2Vuc29yRXZlbnRRdWV1ZS5oPgotI2luY2x1ZGUgPGd1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmg+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL3NlbnNvci5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNlbnNvckV2ZW50UXVldWU6OlNlbnNvckV2ZW50UXVldWUoY29uc3Qgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pCi0gICAgOiBtU2Vuc29yRXZlbnRDb25uZWN0aW9uKGNvbm5lY3Rpb24pCi17Ci19Ci0KLVNlbnNvckV2ZW50UXVldWU6On5TZW5zb3JFdmVudFF1ZXVlKCkKLXsKLX0KLQotdm9pZCBTZW5zb3JFdmVudFF1ZXVlOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBtU2Vuc29yQ2hhbm5lbCA9IG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPmdldFNlbnNvckNoYW5uZWwoKTsKLX0KLQotaW50IFNlbnNvckV2ZW50UXVldWU6OmdldEZkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVNlbnNvckNoYW5uZWwtPmdldEZkKCk7Ci19Ci0KLXNzaXplX3QgU2Vuc29yRXZlbnRRdWV1ZTo6d3JpdGUoQVNlbnNvckV2ZW50IGNvbnN0KiBldmVudHMsIHNpemVfdCBudW1FdmVudHMpCi17Ci0gICAgc3NpemVfdCBzaXplID0gbVNlbnNvckNoYW5uZWwtPndyaXRlKGV2ZW50cywgbnVtRXZlbnRzICogc2l6ZW9mKGV2ZW50c1swXSkpOwotICAgIGlmIChzaXplID49IDApIHsKLSAgICAgICAgaWYgKHNpemUgJSBzaXplb2YoZXZlbnRzWzBdKSkgewotICAgICAgICAgICAgLy8gcGFydGlhbCB3cml0ZSEhISBzaG91bGQgbmV2ZXIgaGFwcGVuLgotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmV0dXJucyBudW1iZXIgb2YgZXZlbnRzIHdyaXR0ZW4KLSAgICAgICAgc2l6ZSAvPSBzaXplb2YoZXZlbnRzWzBdKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNzaXplX3QgU2Vuc29yRXZlbnRRdWV1ZTo6cmVhZChBU2Vuc29yRXZlbnQqIGV2ZW50cywgc2l6ZV90IG51bUV2ZW50cykKLXsKLSAgICBzc2l6ZV90IHNpemUgPSBtU2Vuc29yQ2hhbm5lbC0+cmVhZChldmVudHMsIG51bUV2ZW50cypzaXplb2YoZXZlbnRzWzBdKSk7Ci0gICAgQUxPR0VfSUYoc2l6ZTwwICYmIHNpemUhPS1FQUdBSU4sCi0gICAgICAgICAgICAiU2Vuc29yQ2hhbm5lbDo6cmVhZCBlcnJvciAoJXMpIiwgc3RyZXJyb3IoLXNpemUpKTsKLSAgICBpZiAoc2l6ZSA+PSAwKSB7Ci0gICAgICAgIGlmIChzaXplICUgc2l6ZW9mKGV2ZW50c1swXSkpIHsKLSAgICAgICAgICAgIC8vIHBhcnRpYWwgcmVhZCEhISBzaG91bGQgbmV2ZXIgaGFwcGVuLgotICAgICAgICAgICAgQUxPR0UoIlNlbnNvckV2ZW50UXVldWUgcGFydGlhbCByZWFkIChldmVudC1zaXplPSV1LCByZWFkPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihldmVudHNbMF0pLCBpbnQoc2l6ZSkpOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gcmV0dXJucyBudW1iZXIgb2YgZXZlbnRzIHJlYWQKLSAgICAgICAgc2l6ZSAvPSBzaXplb2YoZXZlbnRzWzBdKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNwPExvb3Blcj4gU2Vuc29yRXZlbnRRdWV1ZTo6Z2V0TG9vcGVyKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtTG9vcGVyID09IDApIHsKLSAgICAgICAgbUxvb3BlciA9IG5ldyBMb29wZXIodHJ1ZSk7Ci0gICAgICAgIG1Mb29wZXItPmFkZEZkKGdldEZkKCksIGdldEZkKCksIEFMT09QRVJfRVZFTlRfSU5QVVQsIE5VTEwsIE5VTEwpOwotICAgIH0KLSAgICByZXR1cm4gbUxvb3BlcjsKLX0KLQotc3RhdHVzX3QgU2Vuc29yRXZlbnRRdWV1ZTo6d2FpdEZvckV2ZW50KCkgY29uc3QKLXsKLSAgICBjb25zdCBpbnQgZmQgPSBnZXRGZCgpOwotICAgIHNwPExvb3Blcj4gbG9vcGVyKGdldExvb3BlcigpKTsKLQotICAgIGludDMyX3QgcmVzdWx0OwotICAgIGRvIHsKLSAgICAgICAgcmVzdWx0ID0gbG9vcGVyLT5wb2xsT25jZSgtMSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gQUxPT1BFUl9FVkVOVF9FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoIlNlbnNvckV2ZW50UXVldWU6OndhaXRGb3JFdmVudCBlcnJvciAoZXJybm89JWQpIiwgZXJybm8pOwotICAgICAgICAgICAgcmVzdWx0ID0gLUVQSVBFOyAvLyB1bmtub3duIGVycm9yLCBzbyB3ZSBtYWtlIHVwIG9uZQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXN1bHQgIT0gZmQpOwotCi0gICAgcmV0dXJuICAocmVzdWx0ID09IGZkKSA/IHN0YXR1c190KE5PX0VSUk9SKSA6IHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgU2Vuc29yRXZlbnRRdWV1ZTo6d2FrZSgpIGNvbnN0Ci17Ci0gICAgc3A8TG9vcGVyPiBsb29wZXIoZ2V0TG9vcGVyKCkpOwotICAgIGxvb3Blci0+d2FrZSgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgU2Vuc29yRXZlbnRRdWV1ZTo6ZW5hYmxlU2Vuc29yKFNlbnNvciBjb25zdCogc2Vuc29yKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPmVuYWJsZURpc2FibGUoc2Vuc29yLT5nZXRIYW5kbGUoKSwgdHJ1ZSk7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6OmRpc2FibGVTZW5zb3IoU2Vuc29yIGNvbnN0KiBzZW5zb3IpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlbnNvckV2ZW50Q29ubmVjdGlvbi0+ZW5hYmxlRGlzYWJsZShzZW5zb3ItPmdldEhhbmRsZSgpLCBmYWxzZSk7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6OmVuYWJsZVNlbnNvcihpbnQzMl90IGhhbmRsZSwgaW50MzJfdCB1cykgY29uc3QgewotICAgIHN0YXR1c190IGVyciA9IG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPmVuYWJsZURpc2FibGUoaGFuZGxlLCB0cnVlKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPnNldEV2ZW50UmF0ZShoYW5kbGUsIHVzMm5zKHVzKSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFNlbnNvckV2ZW50UXVldWU6OmRpc2FibGVTZW5zb3IoaW50MzJfdCBoYW5kbGUpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlbnNvckV2ZW50Q29ubmVjdGlvbi0+ZW5hYmxlRGlzYWJsZShoYW5kbGUsIGZhbHNlKTsKLX0KLQotc3RhdHVzX3QgU2Vuc29yRXZlbnRRdWV1ZTo6c2V0RXZlbnRSYXRlKFNlbnNvciBjb25zdCogc2Vuc29yLCBuc2Vjc190IG5zKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZW5zb3JFdmVudENvbm5lY3Rpb24tPnNldEV2ZW50UmF0ZShzZW5zb3ItPmdldEhhbmRsZSgpLCBucyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1NlbnNvck1hbmFnZXIuY3BwIGIvbGlicy9ndWkvU2Vuc29yTWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGRhNTYuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU2Vuc29yTWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU2Vuc29ycyIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVNlbnNvclNlcnZlci5oPgotI2luY2x1ZGUgPGd1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z3VpL1NlbnNvci5oPgotI2luY2x1ZGUgPGd1aS9TZW5zb3JNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1NlbnNvckV2ZW50UXVldWUuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoU2Vuc29yTWFuYWdlcikKLQotU2Vuc29yTWFuYWdlcjo6U2Vuc29yTWFuYWdlcigpCi0gICAgOiBtU2Vuc29yTGlzdCgwKQotewotICAgIC8vIG9rYXkgd2UncmUgbm90IGxvY2tlZCBoZXJlLCBidXQgaXQncyBub3QgbmVlZGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24KLSAgICBhc3NlcnRTdGF0ZUxvY2tlZCgpOwotfQotCi1TZW5zb3JNYW5hZ2VyOjp+U2Vuc29yTWFuYWdlcigpCi17Ci0gICAgZnJlZShtU2Vuc29yTGlzdCk7Ci19Ci0KLXZvaWQgU2Vuc29yTWFuYWdlcjo6c2Vuc29yTWFuYWdlckRpZWQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVNlbnNvclNlcnZlci5jbGVhcigpOwotICAgIGZyZWUobVNlbnNvckxpc3QpOwotICAgIG1TZW5zb3JMaXN0ID0gTlVMTDsKLSAgICBtU2Vuc29ycy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTZW5zb3JNYW5hZ2VyOjphc3NlcnRTdGF0ZUxvY2tlZCgpIGNvbnN0IHsKLSAgICBpZiAobVNlbnNvclNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIHRyeSBmb3Igb25lIHNlY29uZAotICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJzZW5zb3JzZXJ2aWNlIik7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0U2VydmljZShuYW1lLCAmbVNlbnNvclNlcnZlcik7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgdXNsZWVwKDI1MDAwMCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgRGVhdGhPYnNlcnZlciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgICAgICBTZW5zb3JNYW5hZ2VyJiBtU2Vuc29yTWFuZ2VyOwotICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZW5zb3JzZXJ2aWNlIGRpZWQgWyVwXSIsIHdoby51bnNhZmVfZ2V0KCkpOwotICAgICAgICAgICAgICAgIG1TZW5zb3JNYW5nZXIuc2Vuc29yTWFuYWdlckRpZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgRGVhdGhPYnNlcnZlcihTZW5zb3JNYW5hZ2VyJiBtZ3IpIDogbVNlbnNvck1hbmdlcihtZ3IpIHsgfQotICAgICAgICB9OwotCi0gICAgICAgIG1EZWF0aE9ic2VydmVyID0gbmV3IERlYXRoT2JzZXJ2ZXIoKmNvbnN0X2Nhc3Q8U2Vuc29yTWFuYWdlciAqPih0aGlzKSk7Ci0gICAgICAgIG1TZW5zb3JTZXJ2ZXItPmFzQmluZGVyKCktPmxpbmtUb0RlYXRoKG1EZWF0aE9ic2VydmVyKTsKLQotICAgICAgICBtU2Vuc29ycyA9IG1TZW5zb3JTZXJ2ZXItPmdldFNlbnNvckxpc3QoKTsKLSAgICAgICAgc2l6ZV90IGNvdW50ID0gbVNlbnNvcnMuc2l6ZSgpOwotICAgICAgICBtU2Vuc29yTGlzdCA9IChTZW5zb3IgY29uc3QqKiltYWxsb2MoY291bnQgKiBzaXplb2YoU2Vuc29yKikpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBtU2Vuc29yTGlzdFtpXSA9IG1TZW5zb3JzLmFycmF5KCkgKyBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLQotc3NpemVfdCBTZW5zb3JNYW5hZ2VyOjpnZXRTZW5zb3JMaXN0KFNlbnNvciBjb25zdCogY29uc3QqKiBsaXN0KSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3RhdHVzX3QgZXJyID0gYXNzZXJ0U3RhdGVMb2NrZWQoKTsKLSAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICByZXR1cm4gc3NpemVfdChlcnIpOwotICAgIH0KLSAgICAqbGlzdCA9IG1TZW5zb3JMaXN0OwotICAgIHJldHVybiBtU2Vuc29ycy5zaXplKCk7Ci19Ci0KLVNlbnNvciBjb25zdCogU2Vuc29yTWFuYWdlcjo6Z2V0RGVmYXVsdFNlbnNvcihpbnQgdHlwZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChhc3NlcnRTdGF0ZUxvY2tlZCgpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIEZvciBub3cgd2UganVzdCByZXR1cm4gdGhlIGZpcnN0IHNlbnNvciBvZiB0aGF0IHR5cGUgd2UgZmluZC4KLSAgICAgICAgLy8gaW4gdGhlIGZ1dHVyZSBpdCB3aWxsIG1ha2Ugc2Vuc2UgdG8gbGV0IHRoZSBTZW5zb3JTZXJ2aWNlIG1ha2UKLSAgICAgICAgLy8gdGhhdCBkZWNpc2lvbi4KLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxtU2Vuc29ycy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtU2Vuc29yTGlzdFtpXS0+Z2V0VHlwZSgpID09IHR5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1TZW5zb3JMaXN0W2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zcDxTZW5zb3JFdmVudFF1ZXVlPiBTZW5zb3JNYW5hZ2VyOjpjcmVhdGVFdmVudFF1ZXVlKCkKLXsKLSAgICBzcDxTZW5zb3JFdmVudFF1ZXVlPiBxdWV1ZTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgd2hpbGUgKGFzc2VydFN0YXRlTG9ja2VkKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3A8SVNlbnNvckV2ZW50Q29ubmVjdGlvbj4gY29ubmVjdGlvbiA9Ci0gICAgICAgICAgICAgICAgbVNlbnNvclNlcnZlci0+Y3JlYXRlU2Vuc29yRXZlbnRDb25uZWN0aW9uKCk7Ci0gICAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFNlbnNvclNlcnZpY2UganVzdCBkaWVkLgotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZUV2ZW50UXVldWU6IGNvbm5lY3Rpb24gaXMgTlVMTC4gU2Vuc29yU2VydmljZSBkaWVkLiIpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcXVldWUgPSBuZXcgU2Vuc29yRXZlbnRRdWV1ZShjb25uZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBxdWV1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2UuY3BwIGIvbGlicy9ndWkvU3VyZmFjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjI3ZWQuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU3VyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZSIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCi0jaW5jbHVkZSA8dWkvRGlzcGxheUluZm8uaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSA8dWkvUmVjdC5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyAgU3VyZmFjZUNvbnRyb2wKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU3VyZmFjZUNvbnRyb2w6OlN1cmZhY2VDb250cm9sKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZT4mIHN1cmZhY2UsCi0gICAgICAgIGNvbnN0IElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90JiBkYXRhKQotICAgIDogbUNsaWVudChjbGllbnQpLCBtU3VyZmFjZShzdXJmYWNlKSwKLSAgICAgIG1Ub2tlbihkYXRhLnRva2VuKSwgbUlkZW50aXR5KGRhdGEuaWRlbnRpdHkpCi17Ci19Ci0gICAgICAgIAotU3VyZmFjZUNvbnRyb2w6On5TdXJmYWNlQ29udHJvbCgpCi17Ci0gICAgZGVzdHJveSgpOwotfQotCi12b2lkIFN1cmZhY2VDb250cm9sOjpkZXN0cm95KCkKLXsKLSAgICBpZiAoaXNWYWxpZCgpKSB7Ci0gICAgICAgIG1DbGllbnQtPmRlc3Ryb3lTdXJmYWNlKG1Ub2tlbik7Ci0gICAgfQotCi0gICAgLy8gY2xlYXIgYWxsIHJlZmVyZW5jZXMgYW5kIHRyaWdnZXIgYW4gSVBDIG5vdywgdG8gbWFrZSBzdXJlIHRoaW5ncwotICAgIC8vIGhhcHBlbiB3aXRob3V0IGRlbGF5LCBzaW5jZSB0aGVzZSByZXNvdXJjZXMgYXJlIHF1aXRlIGhlYXZ5LgotICAgIG1DbGllbnQuY2xlYXIoKTsKLSAgICBtU3VyZmFjZS5jbGVhcigpOwotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLX0KLQotdm9pZCBTdXJmYWNlQ29udHJvbDo6Y2xlYXIoKSAKLXsKLSAgICAvLyBoZXJlLCB0aGUgd2luZG93IG1hbmFnZXIgdGVsbHMgdXMgZXhwbGljaXRseSB0aGF0IHdlIHNob3VsZCBkZXN0cm95Ci0gICAgLy8gdGhlIHN1cmZhY2UncyByZXNvdXJjZS4gU29vbiBhZnRlciB0aGlzIGNhbGwsIGl0IHdpbGwgYWxzbyByZWxlYXNlCi0gICAgLy8gaXRzIGxhc3QgcmVmZXJlbmNlICh3aGljaCB3aWxsIGNhbGwgdGhlIGR0b3IpOyBob3dldmVyLCBpdCBpcyBwb3NzaWJsZQotICAgIC8vIHRoYXQgYSBjbGllbnQgbGl2aW5nIGluIHRoZSBzYW1lIHByb2Nlc3Mgc3RpbGwgaG9sZHMgcmVmZXJlbmNlcyB3aGljaAotICAgIC8vIHdvdWxkIGRlbGF5IHRoZSBjYWxsIHRvIHRoZSBkdG9yIC0tIHRoYXQgaXMgd2h5IHdlIG5lZWQgdGhpcyBleHBsaWNpdAotICAgIC8vICJjbGVhcigpIiBjYWxsLgotICAgIGRlc3Ryb3koKTsKLX0KLQotYm9vbCBTdXJmYWNlQ29udHJvbDo6aXNTYW1lU3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBsaHMsIGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgcmhzKSAKLXsKLSAgICBpZiAobGhzID09IDAgfHwgcmhzID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gbGhzLT5tU3VyZmFjZS0+YXNCaW5kZXIoKSA9PSByaHMtPm1TdXJmYWNlLT5hc0JpbmRlcigpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6c2V0TGF5ZXIoaW50MzJfdCBsYXllcikgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnNldExheWVyKG1Ub2tlbiwgbGF5ZXIpOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldFBvc2l0aW9uKGludDMyX3QgeCwgaW50MzJfdCB5KSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2V0UG9zaXRpb24obVRva2VuLCB4LCB5KTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwotICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudChtQ2xpZW50KTsKLSAgICByZXR1cm4gY2xpZW50LT5zZXRTaXplKG1Ub2tlbiwgdywgaCk7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6aGlkZSgpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwotICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudChtQ2xpZW50KTsKLSAgICByZXR1cm4gY2xpZW50LT5oaWRlKG1Ub2tlbik7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6c2hvdyhpbnQzMl90IGxheWVyKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2hvdyhtVG9rZW4sIGxheWVyKTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpmcmVlemUoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+ZnJlZXplKG1Ub2tlbik7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6dW5mcmVlemUoKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+dW5mcmVlemUobVRva2VuKTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRGbGFncyh1aW50MzJfdCBmbGFncywgdWludDMyX3QgbWFzaykgewotICAgIHN0YXR1c190IGVyciA9IHZhbGlkYXRlKCk7Ci0gICAgaWYgKGVyciA8IDApIHJldHVybiBlcnI7Ci0gICAgY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50KG1DbGllbnQpOwotICAgIHJldHVybiBjbGllbnQtPnNldEZsYWdzKG1Ub2tlbiwgZmxhZ3MsIG1hc2spOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldFRyYW5zcGFyZW50UmVnaW9uSGludChjb25zdCBSZWdpb24mIHRyYW5zcGFyZW50KSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KG1Ub2tlbiwgdHJhbnNwYXJlbnQpOwotfQotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldEFscGhhKGZsb2F0IGFscGhhKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKLSAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKLSAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQobUNsaWVudCk7Ci0gICAgcmV0dXJuIGNsaWVudC0+c2V0QWxwaGEobVRva2VuLCBhbHBoYSk7Ci19Ci1zdGF0dXNfdCBTdXJmYWNlQ29udHJvbDo6c2V0TWF0cml4KGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwotICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudChtQ2xpZW50KTsKLSAgICByZXR1cm4gY2xpZW50LT5zZXRNYXRyaXgobVRva2VuLCBkc2R4LCBkdGR4LCBkc2R5LCBkdGR5KTsKLX0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRGcmVlemVUaW50KHVpbnQzMl90IHRpbnQpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwotICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwotICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudChtQ2xpZW50KTsKLSAgICByZXR1cm4gY2xpZW50LT5zZXRGcmVlemVUaW50KG1Ub2tlbiwgdGludCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjp2YWxpZGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1Ub2tlbjwwIHx8IG1DbGllbnQ9PTApIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgdG9rZW4gKCVkLCBpZGVudGl0eT0ldSkgb3IgY2xpZW50ICglcCkiLCAKLSAgICAgICAgICAgICAgICBtVG9rZW4sIG1JZGVudGl0eSwgbUNsaWVudC5nZXQoKSk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjp3cml0ZVN1cmZhY2VUb1BhcmNlbCgKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBjb250cm9sLCBQYXJjZWwqIHBhcmNlbCkKLXsKLSAgICBzcDxJU3VyZmFjZT4gc3VyOwotICAgIHVpbnQzMl90IGlkZW50aXR5ID0gMDsKLSAgICBpZiAoU3VyZmFjZUNvbnRyb2w6OmlzVmFsaWQoY29udHJvbCkpIHsKLSAgICAgICAgc3VyICAgICAgPSBjb250cm9sLT5tU3VyZmFjZTsKLSAgICAgICAgaWRlbnRpdHkgPSBjb250cm9sLT5tSWRlbnRpdHk7Ci0gICAgfQotICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoc3VyIT0wID8gc3VyLT5hc0JpbmRlcigpIDogTlVMTCk7Ci0gICAgcGFyY2VsLT53cml0ZVN0cm9uZ0JpbmRlcihOVUxMKTsgIC8vIE5VTEwgSVN1cmZhY2VUZXh0dXJlIGluIHRoaXMgY2FzZS4KLSAgICBwYXJjZWwtPndyaXRlSW50MzIoaWRlbnRpdHkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3A8U3VyZmFjZT4gU3VyZmFjZUNvbnRyb2w6OmdldFN1cmZhY2UoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1TdXJmYWNlRGF0YSA9PSAwKSB7Ci0gICAgICAgIHNwPFN1cmZhY2VDb250cm9sPiBzdXJmYWNlX2NvbnRyb2woY29uc3RfY2FzdDxTdXJmYWNlQ29udHJvbCo+KHRoaXMpKTsKLSAgICAgICAgbVN1cmZhY2VEYXRhID0gbmV3IFN1cmZhY2Uoc3VyZmFjZV9jb250cm9sKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1TdXJmYWNlRGF0YTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gIFN1cmZhY2UKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVN1cmZhY2U6OlN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZUNvbnRyb2w+JiBzdXJmYWNlKQotICAgIDogU3VyZmFjZVRleHR1cmVDbGllbnQoKSwKLSAgICAgIG1TdXJmYWNlKHN1cmZhY2UtPm1TdXJmYWNlKSwKLSAgICAgIG1JZGVudGl0eShzdXJmYWNlLT5tSWRlbnRpdHkpCi17Ci0gICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBzdDsKLSAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCkgewotICAgICAgICBzdCA9IG1TdXJmYWNlLT5nZXRTdXJmYWNlVGV4dHVyZSgpOwotICAgIH0KLSAgICBpbml0KHN0KTsKLX0KLQotU3VyZmFjZTo6U3VyZmFjZShjb25zdCBQYXJjZWwmIHBhcmNlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlZikKLSAgICA6IFN1cmZhY2VUZXh0dXJlQ2xpZW50KCkKLXsKLSAgICBtU3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlPihyZWYpOwotICAgIHNwPElCaW5kZXI+IHN0X2JpbmRlcihwYXJjZWwucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBzcDxJU3VyZmFjZVRleHR1cmU+IHN0OwotICAgIGlmIChzdF9iaW5kZXIgIT0gTlVMTCkgewotICAgICAgICBzdCA9IGludGVyZmFjZV9jYXN0PElTdXJmYWNlVGV4dHVyZT4oc3RfYmluZGVyKTsKLSAgICB9IGVsc2UgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKLSAgICAgICAgc3QgPSBtU3VyZmFjZS0+Z2V0U3VyZmFjZVRleHR1cmUoKTsKLSAgICB9Ci0KLSAgICBtSWRlbnRpdHkgICA9IHBhcmNlbC5yZWFkSW50MzIoKTsKLSAgICBpbml0KHN0KTsKLX0KLQotU3VyZmFjZTo6U3VyZmFjZShjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdCkKLSAgICA6IFN1cmZhY2VUZXh0dXJlQ2xpZW50KCksCi0gICAgICBtU3VyZmFjZShOVUxMKSwKLSAgICAgIG1JZGVudGl0eSgwKQotewotICAgIGluaXQoc3QpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlOjp3cml0ZVRvUGFyY2VsKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgUGFyY2VsKiBwYXJjZWwpCi17Ci0gICAgc3A8SVN1cmZhY2U+IHN1cjsKLSAgICBzcDxJU3VyZmFjZVRleHR1cmU+IHN0OwotICAgIHVpbnQzMl90IGlkZW50aXR5ID0gMDsKLSAgICBpZiAoU3VyZmFjZTo6aXNWYWxpZChzdXJmYWNlKSkgewotICAgICAgICBzdXIgICAgICA9IHN1cmZhY2UtPm1TdXJmYWNlOwotICAgICAgICBzdCAgICAgICA9IHN1cmZhY2UtPmdldElTdXJmYWNlVGV4dHVyZSgpOwotICAgICAgICBpZGVudGl0eSA9IHN1cmZhY2UtPm1JZGVudGl0eTsKLSAgICB9IGVsc2UgaWYgKHN1cmZhY2UgIT0gMCAmJgotICAgICAgICAgICAgKHN1cmZhY2UtPm1TdXJmYWNlICE9IE5VTEwgfHwKLSAgICAgICAgICAgICBzdXJmYWNlLT5nZXRJU3VyZmFjZVRleHR1cmUoKSAhPSBOVUxMKSkgewotICAgICAgICBBTE9HRSgiUGFyY2VsaW5nIGludmFsaWQgc3VyZmFjZSB3aXRoIG5vbi1OVUxMIElTdXJmYWNlL0lTdXJmYWNlVGV4dHVyZSBhcyBOVUxMOiAiCi0gICAgICAgICAgICAgIm1TdXJmYWNlID0gJXAsIHN1cmZhY2VUZXh0dXJlID0gJXAsIG1JZGVudGl0eSA9ICVkLCAiLAotICAgICAgICAgICAgIHN1cmZhY2UtPm1TdXJmYWNlLmdldCgpLCBzdXJmYWNlLT5nZXRJU3VyZmFjZVRleHR1cmUoKS5nZXQoKSwKLSAgICAgICAgICAgICBzdXJmYWNlLT5tSWRlbnRpdHkpOwotICAgIH0KLQotICAgIHBhcmNlbC0+d3JpdGVTdHJvbmdCaW5kZXIoc3VyICE9IE5VTEwgPyBzdXItPmFzQmluZGVyKCkgOiBOVUxMKTsKLSAgICBwYXJjZWwtPndyaXRlU3Ryb25nQmluZGVyKHN0ICE9IE5VTEwgPyBzdC0+YXNCaW5kZXIoKSA6IE5VTEwpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihpZGVudGl0eSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi19Ci0KLU11dGV4IFN1cmZhY2U6OnNDYWNoZWRTdXJmYWNlc0xvY2s7Ci1EZWZhdWx0S2V5ZWRWZWN0b3I8d3A8SUJpbmRlcj4sIHdwPFN1cmZhY2U+ID4gU3VyZmFjZTo6c0NhY2hlZFN1cmZhY2VzOwotCi1zcDxTdXJmYWNlPiBTdXJmYWNlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woc0NhY2hlZFN1cmZhY2VzTG9jayk7Ci0gICAgc3A8SUJpbmRlcj4gYmluZGVyKGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gc0NhY2hlZFN1cmZhY2VzLnZhbHVlRm9yKGJpbmRlcikucHJvbW90ZSgpOwotICAgIGlmIChzdXJmYWNlID09IDApIHsKLSAgICAgICBzdXJmYWNlID0gbmV3IFN1cmZhY2UoZGF0YSwgYmluZGVyKTsKLSAgICAgICBzQ2FjaGVkU3VyZmFjZXMuYWRkKGJpbmRlciwgc3VyZmFjZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhlIFN1cmZhY2Ugd2FzIGZvdW5kIGluIHRoZSBjYWNoZSwgYnV0IHdlIHN0aWxsIHNob3VsZCBjbGVhciBhbnkKLSAgICAgICAgLy8gcmVtYWluaW5nIGRhdGEgZnJvbSB0aGUgcGFyY2VsLgotICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsgIC8vIElTdXJmYWNlVGV4dHVyZQotICAgICAgICBkYXRhLnJlYWRJbnQzMigpOyAgICAgICAgIC8vIGlkZW50aXR5Ci0gICAgfQotICAgIGlmIChzdXJmYWNlLT5tU3VyZmFjZSA9PSBOVUxMICYmIHN1cmZhY2UtPmdldElTdXJmYWNlVGV4dHVyZSgpID09IE5VTEwpIHsKLSAgICAgICAgc3VyZmFjZSA9IDA7Ci0gICAgfQotICAgIGNsZWFuQ2FjaGVkU3VyZmFjZXNMb2NrZWQoKTsKLSAgICByZXR1cm4gc3VyZmFjZTsKLX0KLQotLy8gUmVtb3ZlIHRoZSBzdGFsZSBlbnRyaWVzIGZyb20gdGhlIHN1cmZhY2UgY2FjaGUuICBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZAotLy8gd2l0aCBzQ2FjaGVkU3VyZmFjZXNMb2NrIGhlbGQuCi12b2lkIFN1cmZhY2U6OmNsZWFuQ2FjaGVkU3VyZmFjZXNMb2NrZWQoKSB7Ci0gICAgZm9yIChpbnQgaSA9IHNDYWNoZWRTdXJmYWNlcy5zaXplKCktMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgd3A8U3VyZmFjZT4gcyhzQ2FjaGVkU3VyZmFjZXMudmFsdWVBdChpKSk7Ci0gICAgICAgIGlmIChzID09IDAgfHwgcy5wcm9tb3RlKCkgPT0gMCkgewotICAgICAgICAgICAgc0NhY2hlZFN1cmZhY2VzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZTo6aW5pdChjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlVGV4dHVyZSkKLXsKLSAgICBpZiAobVN1cmZhY2UgIT0gTlVMTCB8fCBzdXJmYWNlVGV4dHVyZSAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFX0lGKHN1cmZhY2VUZXh0dXJlPT0wLCAiZ290IGEgTlVMTCBJU3VyZmFjZVRleHR1cmUgZnJvbSBJU3VyZmFjZSIpOwotICAgICAgICBpZiAoc3VyZmFjZVRleHR1cmUgIT0gTlVMTCkgewotICAgICAgICAgICAgc2V0SVN1cmZhY2VUZXh0dXJlKHN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgICAgIHNldFVzYWdlKEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1JFTkRFUik7Ci0gICAgICAgIH0KLQotICAgICAgICBEaXNwbGF5SW5mbyBkaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbygwLCAmZGluZm8pOwotICAgICAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eGRwaSkgPSBkaW5mby54ZHBpOwotICAgICAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eWRwaSkgPSBkaW5mby55ZHBpOwotICAgICAgICBjb25zdF9jYXN0PHVpbnQzMl90Jj4oQU5hdGl2ZVdpbmRvdzo6ZmxhZ3MpID0gMDsKLSAgICB9Ci19Ci0KLVN1cmZhY2U6On5TdXJmYWNlKCkKLXsKLSAgICAvLyBjbGVhciBhbGwgcmVmZXJlbmNlcyBhbmQgdHJpZ2dlciBhbiBJUEMgbm93LCB0byBtYWtlIHN1cmUgdGhpbmdzCi0gICAgLy8gaGFwcGVuIHdpdGhvdXQgZGVsYXksIHNpbmNlIHRoZXNlIHJlc291cmNlcyBhcmUgcXVpdGUgaGVhdnkuCi0gICAgbVN1cmZhY2UuY2xlYXIoKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci19Ci0KLWJvb2wgU3VyZmFjZTo6aXNWYWxpZCgpIHsKLSAgICByZXR1cm4gZ2V0SVN1cmZhY2VUZXh0dXJlKCkgIT0gTlVMTDsKLX0KLQotc3A8SVN1cmZhY2VUZXh0dXJlPiBTdXJmYWNlOjpnZXRTdXJmYWNlVGV4dHVyZSgpIHsKLSAgICByZXR1cm4gZ2V0SVN1cmZhY2VUZXh0dXJlKCk7Ci19Ci0KLXNwPElCaW5kZXI+IFN1cmZhY2U6OmFzQmluZGVyKCkgY29uc3QgewotICAgIHJldHVybiBtU3VyZmFjZSE9MCA/IG1TdXJmYWNlLT5hc0JpbmRlcigpIDogMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgU3VyZmFjZTo6cXVlcnkoaW50IHdoYXQsIGludCogdmFsdWUpIGNvbnN0IHsKLSAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfQ09OQ1JFVEVfVFlQRToKLSAgICAgICAgKnZhbHVlID0gTkFUSVZFX1dJTkRPV19TVVJGQUNFOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBTdXJmYWNlVGV4dHVyZUNsaWVudDo6cXVlcnkod2hhdCwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2U6OmxvY2soU3VyZmFjZUluZm8qIG90aGVyLCBSZWdpb24qIGluT3V0RGlydHlSZWdpb24pIHsKLSAgICBBTmF0aXZlV2luZG93X0J1ZmZlciBvdXRCdWZmZXI7Ci0KLSAgICBBUmVjdCB0ZW1wOwotICAgIEFSZWN0KiBpbk91dERpcnR5Qm91bmRzID0gTlVMTDsKLSAgICBpZiAoaW5PdXREaXJ0eVJlZ2lvbikgewotICAgICAgICB0ZW1wID0gaW5PdXREaXJ0eVJlZ2lvbi0+Z2V0Qm91bmRzKCk7Ci0gICAgICAgIGluT3V0RGlydHlCb3VuZHMgPSAmdGVtcDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBTdXJmYWNlVGV4dHVyZUNsaWVudDo6bG9jaygmb3V0QnVmZmVyLCBpbk91dERpcnR5Qm91bmRzKTsKLQotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgb3RoZXItPncgPSB1aW50MzJfdChvdXRCdWZmZXIud2lkdGgpOwotICAgICAgICBvdGhlci0+aCA9IHVpbnQzMl90KG91dEJ1ZmZlci5oZWlnaHQpOwotICAgICAgICBvdGhlci0+cyA9IHVpbnQzMl90KG91dEJ1ZmZlci5zdHJpZGUpOwotICAgICAgICBvdGhlci0+dXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOOwotICAgICAgICBvdGhlci0+Zm9ybWF0ID0gdWludDMyX3Qob3V0QnVmZmVyLmZvcm1hdCk7Ci0gICAgICAgIG90aGVyLT5iaXRzID0gb3V0QnVmZmVyLmJpdHM7Ci0gICAgfQotCi0gICAgaWYgKGluT3V0RGlydHlSZWdpb24pIHsKLSAgICAgICAgaW5PdXREaXJ0eVJlZ2lvbi0+c2V0KCBzdGF0aWNfY2FzdDxSZWN0IGNvbnN0Jj4odGVtcCkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlOjp1bmxvY2tBbmRQb3N0KCkgewotICAgIHJldHVybiBTdXJmYWNlVGV4dHVyZUNsaWVudDo6dW5sb2NrQW5kUG9zdCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjFiYTYuLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdXJmYWNlQ29tcG9zZXJDbGllbnQiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1NpbmdsZXRvbi5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2UuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvTGF5ZXJTdGF0ZS5oPgotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL1NoYXJlZEJ1ZmZlclN0YWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoQ29tcG9zZXJTZXJ2aWNlKTsKLQotQ29tcG9zZXJTZXJ2aWNlOjpDb21wb3NlclNlcnZpY2UoKQotOiBTaW5nbGV0b248Q29tcG9zZXJTZXJ2aWNlPigpIHsKLSAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJTdXJmYWNlRmxpbmdlciIpOwotICAgIHdoaWxlIChnZXRTZXJ2aWNlKG5hbWUsICZtQ29tcG9zZXJTZXJ2aWNlKSAhPSBOT19FUlJPUikgewotICAgICAgICB1c2xlZXAoMjUwMDAwKTsKLSAgICB9Ci0gICAgbVNlcnZlckNibGtNZW1vcnkgPSBtQ29tcG9zZXJTZXJ2aWNlLT5nZXRDYmxrKCk7Ci0gICAgbVNlcnZlckNibGsgPSBzdGF0aWNfY2FzdDxzdXJmYWNlX2ZsaW5nZXJfY2Jsa190IHZvbGF0aWxlICo+KAotICAgICAgICAgICAgbVNlcnZlckNibGtNZW1vcnktPmdldEJhc2UoKSk7Ci19Ci0KLXNwPElTdXJmYWNlQ29tcG9zZXI+IENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkgewotICAgIHJldHVybiBDb21wb3NlclNlcnZpY2U6OmdldEluc3RhbmNlKCkubUNvbXBvc2VyU2VydmljZTsKLX0KLQotc3VyZmFjZV9mbGluZ2VyX2NibGtfdCBjb25zdCB2b2xhdGlsZSAqIENvbXBvc2VyU2VydmljZTo6Z2V0Q29udHJvbEJsb2NrKCkgewotICAgIHJldHVybiBDb21wb3NlclNlcnZpY2U6OmdldEluc3RhbmNlKCkubVNlcnZlckNibGs7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3A8SVN1cmZhY2VDb21wb3Nlcj4gZ2V0Q29tcG9zZXJTZXJ2aWNlKCkgewotICAgIHJldHVybiBDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpOwotfQotCi1zdGF0aWMgaW5saW5lIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3Qgdm9sYXRpbGUgKiBnZXRfY2JsaygpIHsKLSAgICByZXR1cm4gQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb250cm9sQmxvY2soKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE5PVEU6IHRoaXMgaXMgTk9UIGEgbWVtYmVyIGZ1bmN0aW9uIChpdCdzIGEgZnJpZW5kIGRlZmluZWQgd2l0aCBpdHMKLS8vIGRlY2xhcmF0aW9uKS4KLXN0YXRpYyBpbmxpbmUKLWludCBjb21wYXJlX3R5cGUoIGNvbnN0IENvbXBvc2VyU3RhdGUmIGxocywgY29uc3QgQ29tcG9zZXJTdGF0ZSYgcmhzKSB7Ci0gICAgaWYgKGxocy5jbGllbnQgPCByaHMuY2xpZW50KSAgcmV0dXJuIC0xOwotICAgIGlmIChsaHMuY2xpZW50ID4gcmhzLmNsaWVudCkgIHJldHVybiAxOwotICAgIGlmIChsaHMuc3RhdGUuc3VyZmFjZSA8IHJocy5zdGF0ZS5zdXJmYWNlKSAgcmV0dXJuIC0xOwotICAgIGlmIChsaHMuc3RhdGUuc3VyZmFjZSA+IHJocy5zdGF0ZS5zdXJmYWNlKSAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNsYXNzIENvbXBvc2VyIDogcHVibGljIFNpbmdsZXRvbjxDb21wb3Nlcj4KLXsKLSAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPENvbXBvc2VyPjsKLQotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICBTb3J0ZWRWZWN0b3I8Q29tcG9zZXJTdGF0ZT4gbVN0YXRlczsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWVudGF0aW9uOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRm9yY2VTeW5jaHJvbm91czsKLQotICAgIENvbXBvc2VyKCkgOiBTaW5nbGV0b248Q29tcG9zZXI+KCksCi0gICAgICAgIG1PcmllbnRhdGlvbihJU3VyZmFjZUNvbXBvc2VyOjplT3JpZW50YXRpb25VbmNoYW5nZWQpLAotICAgICAgICBtRm9yY2VTeW5jaHJvbm91cygwKQotICAgIHsgfQotCi0gICAgdm9pZCBjbG9zZUdsb2JhbFRyYW5zYWN0aW9uSW1wbChib29sIHN5bmNocm9ub3VzKTsKLQotICAgIGxheWVyX3N0YXRlX3QqIGdldExheWVyU3RhdGVMb2NrZWQoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCk7Ci0KLXB1YmxpYzoKLQotICAgIHN0YXR1c190IHNldFBvc2l0aW9uKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgU3VyZmFjZUlEIGlkLAotICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSk7Ci0gICAgc3RhdHVzX3Qgc2V0U2l6ZShjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwotICAgIHN0YXR1c190IHNldExheWVyKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgU3VyZmFjZUlEIGlkLAotICAgICAgICAgICAgaW50MzJfdCB6KTsKLSAgICBzdGF0dXNfdCBzZXRGbGFncyhjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBtYXNrKTsKLSAgICBzdGF0dXNfdCBzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiYgdHJhbnNwYXJlbnRSZWdpb24pOwotICAgIHN0YXR1c190IHNldEFscGhhKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgU3VyZmFjZUlEIGlkLAotICAgICAgICAgICAgZmxvYXQgYWxwaGEpOwotICAgIHN0YXR1c190IHNldE1hdHJpeChjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpOwotICAgIHN0YXR1c190IHNldEZyZWV6ZVRpbnQoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgICAgIHVpbnQzMl90IHRpbnQpOwotICAgIHN0YXR1c190IHNldE9yaWVudGF0aW9uKGludCBvcmllbnRhdGlvbik7Ci0KLSAgICBzdGF0aWMgdm9pZCBjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKGJvb2wgc3luY2hyb25vdXMpIHsKLSAgICAgICAgQ29tcG9zZXI6OmdldEluc3RhbmNlKCkuY2xvc2VHbG9iYWxUcmFuc2FjdGlvbkltcGwoc3luY2hyb25vdXMpOwotICAgIH0KLX07Ci0KLUFORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRShDb21wb3Nlcik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIENvbXBvc2VyOjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uSW1wbChib29sIHN5bmNocm9ub3VzKSB7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc20oZ2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotCi0gICAgVmVjdG9yPENvbXBvc2VyU3RhdGU+IHRyYW5zYWN0aW9uOwotICAgIGludCBvcmllbnRhdGlvbjsKLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0KLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB0cmFuc2FjdGlvbiA9IG1TdGF0ZXM7Ci0gICAgICAgIG1TdGF0ZXMuY2xlYXIoKTsKLQotICAgICAgICBvcmllbnRhdGlvbiA9IG1PcmllbnRhdGlvbjsKLSAgICAgICAgbU9yaWVudGF0aW9uID0gSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uVW5jaGFuZ2VkOwotCi0gICAgICAgIGlmIChzeW5jaHJvbm91cyB8fCBtRm9yY2VTeW5jaHJvbm91cykgewotICAgICAgICAgICAgZmxhZ3MgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZVN5bmNocm9ub3VzOwotICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVN5bmNocm9ub3VzID0gZmFsc2U7Ci0gICAgfQotCi0gICBzbS0+c2V0VHJhbnNhY3Rpb25TdGF0ZSh0cmFuc2FjdGlvbiwgb3JpZW50YXRpb24sIGZsYWdzKTsKLX0KLQotbGF5ZXJfc3RhdGVfdCogQ29tcG9zZXI6OmdldExheWVyU3RhdGVMb2NrZWQoCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgU3VyZmFjZUlEIGlkKSB7Ci0KLSAgICBDb21wb3NlclN0YXRlIHM7Ci0gICAgcy5jbGllbnQgPSBjbGllbnQtPm1DbGllbnQ7Ci0gICAgcy5zdGF0ZS5zdXJmYWNlID0gaWQ7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVN0YXRlcy5pbmRleE9mKHMpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBpdCwgYWRkIGFuIGluaXRpYWxpemVkIGxheWVyX3N0YXRlIHRvIG91ciBsaXN0Ci0gICAgICAgIGluZGV4ID0gbVN0YXRlcy5hZGQocyk7Ci0gICAgfQotCi0gICAgQ29tcG9zZXJTdGF0ZSogY29uc3Qgb3V0ID0gbVN0YXRlcy5lZGl0QXJyYXkoKTsKLSAgICByZXR1cm4gJihvdXRbaW5kZXhdLnN0YXRlKTsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldFBvc2l0aW9uKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgU3VyZmFjZUlEIGlkLCBmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBsYXllcl9zdGF0ZV90KiBzID0gZ2V0TGF5ZXJTdGF0ZUxvY2tlZChjbGllbnQsIGlkKTsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgcy0+d2hhdCB8PSBJU3VyZmFjZUNvbXBvc2VyOjplUG9zaXRpb25DaGFuZ2VkOwotICAgIHMtPnggPSB4OwotICAgIHMtPnkgPSB5OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldFNpemUoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBTdXJmYWNlSUQgaWQsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBzLT53aGF0IHw9IElTdXJmYWNlQ29tcG9zZXI6OmVTaXplQ2hhbmdlZDsKLSAgICBzLT53ID0gdzsKLSAgICBzLT5oID0gaDsKLQotICAgIC8vIFJlc2l6aW5nIGEgc3VyZmFjZSBtYWtlcyB0aGUgdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCi0gICAgbUZvcmNlU3luY2hyb25vdXMgPSB0cnVlOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDb21wb3Nlcjo6c2V0TGF5ZXIoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBTdXJmYWNlSUQgaWQsIGludDMyX3QgeikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbGF5ZXJfc3RhdGVfdCogcyA9IGdldExheWVyU3RhdGVMb2NrZWQoY2xpZW50LCBpZCk7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHMtPndoYXQgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVyQ2hhbmdlZDsKLSAgICBzLT56ID0gejsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyOjpzZXRGbGFncyhjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIFN1cmZhY2VJRCBpZCwgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgIHVpbnQzMl90IG1hc2spIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwotICAgIGlmICghcykKLSAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKLSAgICBzLT53aGF0IHw9IElTdXJmYWNlQ29tcG9zZXI6OmVWaXNpYmlsaXR5Q2hhbmdlZDsKLSAgICBzLT5mbGFncyAmPSB+bWFzazsKLSAgICBzLT5mbGFncyB8PSAoZmxhZ3MgJiBtYXNrKTsKLSAgICBzLT5tYXNrIHw9IG1hc2s7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDb21wb3Nlcjo6c2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIFN1cmZhY2VJRCBpZCwKLSAgICAgICAgY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudFJlZ2lvbikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbGF5ZXJfc3RhdGVfdCogcyA9IGdldExheWVyU3RhdGVMb2NrZWQoY2xpZW50LCBpZCk7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHMtPndoYXQgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZVRyYW5zcGFyZW50UmVnaW9uQ2hhbmdlZDsKLSAgICBzLT50cmFuc3BhcmVudFJlZ2lvbiA9IHRyYW5zcGFyZW50UmVnaW9uOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldEFscGhhKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgU3VyZmFjZUlEIGlkLCBmbG9hdCBhbHBoYSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbGF5ZXJfc3RhdGVfdCogcyA9IGdldExheWVyU3RhdGVMb2NrZWQoY2xpZW50LCBpZCk7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHMtPndoYXQgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZUFscGhhQ2hhbmdlZDsKLSAgICBzLT5hbHBoYSA9IGFscGhhOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQ29tcG9zZXI6OnNldE1hdHJpeChjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIFN1cmZhY2VJRCBpZCwgZmxvYXQgZHNkeCwgZmxvYXQgZHRkeCwKLSAgICAgICAgZmxvYXQgZHNkeSwgZmxvYXQgZHRkeSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbGF5ZXJfc3RhdGVfdCogcyA9IGdldExheWVyU3RhdGVMb2NrZWQoY2xpZW50LCBpZCk7Ci0gICAgaWYgKCFzKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHMtPndoYXQgfD0gSVN1cmZhY2VDb21wb3Nlcjo6ZU1hdHJpeENoYW5nZWQ7Ci0gICAgbGF5ZXJfc3RhdGVfdDo6bWF0cml4MjJfdCBtYXRyaXg7Ci0gICAgbWF0cml4LmRzZHggPSBkc2R4OwotICAgIG1hdHJpeC5kdGR4ID0gZHRkeDsKLSAgICBtYXRyaXguZHNkeSA9IGRzZHk7Ci0gICAgbWF0cml4LmR0ZHkgPSBkdGR5OwotICAgIHMtPm1hdHJpeCA9IG1hdHJpeDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IENvbXBvc2VyOjpzZXRGcmVlemVUaW50KGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgU3VyZmFjZUlEIGlkLCB1aW50MzJfdCB0aW50KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBsYXllcl9zdGF0ZV90KiBzID0gZ2V0TGF5ZXJTdGF0ZUxvY2tlZChjbGllbnQsIGlkKTsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgcy0+d2hhdCB8PSBJU3VyZmFjZUNvbXBvc2VyOjplRnJlZXplVGludENoYW5nZWQ7Ci0gICAgcy0+dGludCA9IHRpbnQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBDb21wb3Nlcjo6c2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLQotICAgIC8vIENoYW5naW5nIHRoZSBvcmllbnRhdGlvbiBtYWtlcyB0aGUgdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCi0gICAgbUZvcmNlU3luY2hyb25vdXMgPSB0cnVlOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpTdXJmYWNlQ29tcG9zZXJDbGllbnQoKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbUNvbXBvc2VyKENvbXBvc2VyOjpnZXRJbnN0YW5jZSgpKQotewotfQotCi12b2lkIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b25GaXJzdFJlZigpIHsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzbShnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgaWYgKHNtICE9IDApIHsKLSAgICAgICAgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gY29ubiA9IHNtLT5jcmVhdGVDb25uZWN0aW9uKCk7Ci0gICAgICAgIGlmIChjb25uICE9IDApIHsKLSAgICAgICAgICAgIG1DbGllbnQgPSBjb25uOwotICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotfQotCi1TdXJmYWNlQ29tcG9zZXJDbGllbnQ6On5TdXJmYWNlQ29tcG9zZXJDbGllbnQoKSB7Ci0gICAgZGlzcG9zZSgpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXR1czsKLX0KLQotc3A8SUJpbmRlcj4gU3VyZmFjZUNvbXBvc2VyQ2xpZW50Ojpjb25uZWN0aW9uKCkgY29uc3QgewotICAgIHJldHVybiAobUNsaWVudCAhPSAwKSA/IG1DbGllbnQtPmFzQmluZGVyKCkgOiAwOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmxpbmtUb0NvbXBvc2VyRGVhdGgoCi0gICAgICAgIGNvbnN0IHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAotICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gc20oZ2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgIHJldHVybiBzbS0+YXNCaW5kZXIoKS0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUsIGZsYWdzKTsKLX0KLQotdm9pZCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmRpc3Bvc2UoKSB7Ci0gICAgLy8gdGhpcyBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotICAgIHNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNsaWVudDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2xtKG1Mb2NrKTsKLSAgICBpZiAobUNsaWVudCAhPSAwKSB7Ci0gICAgICAgIGNsaWVudCA9IG1DbGllbnQ7IC8vIGhvbGQgcmVmIHdoaWxlIGxvY2sgaXMgaGVsZAotICAgICAgICBtQ2xpZW50LmNsZWFyKCk7Ci0gICAgfQotICAgIG1TdGF0dXMgPSBOT19JTklUOwotfQotCi1zcDxTdXJmYWNlQ29udHJvbD4gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjcmVhdGVTdXJmYWNlKAotICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgdWludDMyX3QgdywKLSAgICAgICAgdWludDMyX3QgaCwKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLXsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAxMjg7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiPHBpZF8lZD4iLCBnZXRwaWQoKSk7Ci0gICAgbmFtZS5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHJldHVybiBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNyZWF0ZVN1cmZhY2UobmFtZSwgZGlzcGxheSwKLSAgICAgICAgICAgIHcsIGgsIGZvcm1hdCwgZmxhZ3MpOwotfQotCi1zcDxTdXJmYWNlQ29udHJvbD4gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpjcmVhdGVTdXJmYWNlKAotICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAotICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgdWludDMyX3QgdywKLSAgICAgICAgdWludDMyX3QgaCwKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLXsKLSAgICBzcDxTdXJmYWNlQ29udHJvbD4gcmVzdWx0OwotICAgIGlmIChtU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90IGRhdGE7Ci0gICAgICAgIHNwPElTdXJmYWNlPiBzdXJmYWNlID0gbUNsaWVudC0+Y3JlYXRlU3VyZmFjZSgmZGF0YSwgbmFtZSwKLSAgICAgICAgICAgICAgICBkaXNwbGF5LCB3LCBoLCBmb3JtYXQsIGZsYWdzKTsKLSAgICAgICAgaWYgKHN1cmZhY2UgIT0gMCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFN1cmZhY2VDb250cm9sKHRoaXMsIHN1cmZhY2UsIGRhdGEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6ZGVzdHJveVN1cmZhY2UoU3VyZmFjZUlEIHNpZCkgewotICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKQotICAgICAgICByZXR1cm4gbVN0YXR1czsKLSAgICBzdGF0dXNfdCBlcnIgPSBtQ2xpZW50LT5kZXN0cm95U3VyZmFjZShzaWQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWlubGluZSBDb21wb3NlciYgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRDb21wb3NlcigpIHsKLSAgICByZXR1cm4gbUNvbXBvc2VyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKSB7Ci0gICAgLy8gQ3VycmVudGx5IGEgbm8tb3AKLX0KLQotdm9pZCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oYm9vbCBzeW5jaHJvbm91cykgewotICAgIENvbXBvc2VyOjpjbG9zZUdsb2JhbFRyYW5zYWN0aW9uKHN5bmNocm9ub3VzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldEZyZWV6ZVRpbnQoU3VyZmFjZUlEIGlkLCB1aW50MzJfdCB0aW50KSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0RnJlZXplVGludCh0aGlzLCBpZCwgdGludCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0UG9zaXRpb24oU3VyZmFjZUlEIGlkLCBmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0UG9zaXRpb24odGhpcywgaWQsIHgsIHkpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldFNpemUoU3VyZmFjZUlEIGlkLCB1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0U2l6ZSh0aGlzLCBpZCwgdywgaCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0TGF5ZXIoU3VyZmFjZUlEIGlkLCBpbnQzMl90IHopIHsKLSAgICByZXR1cm4gZ2V0Q29tcG9zZXIoKS5zZXRMYXllcih0aGlzLCBpZCwgeik7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6aGlkZShTdXJmYWNlSUQgaWQpIHsKLSAgICByZXR1cm4gZ2V0Q29tcG9zZXIoKS5zZXRGbGFncyh0aGlzLCBpZCwKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckhpZGRlbiwKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckhpZGRlbik7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2hvdyhTdXJmYWNlSUQgaWQsIGludDMyX3QpIHsKLSAgICByZXR1cm4gZ2V0Q29tcG9zZXIoKS5zZXRGbGFncyh0aGlzLCBpZCwKLSAgICAgICAgICAgIDAsCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4pOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmZyZWV6ZShTdXJmYWNlSUQgaWQpIHsKLSAgICByZXR1cm4gZ2V0Q29tcG9zZXIoKS5zZXRGbGFncyh0aGlzLCBpZCwKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckZyb3plbiwKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckZyb3plbik7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6dW5mcmVlemUoU3VyZmFjZUlEIGlkKSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0RmxhZ3ModGhpcywgaWQsCi0gICAgICAgICAgICAwLAotICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVyRnJvemVuKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXRGbGFncyhTdXJmYWNlSUQgaWQsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICB1aW50MzJfdCBtYXNrKSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0RmxhZ3ModGhpcywgaWQsIGZsYWdzLCBtYXNrKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoU3VyZmFjZUlEIGlkLAotICAgICAgICBjb25zdCBSZWdpb24mIHRyYW5zcGFyZW50UmVnaW9uKSB7Ci0gICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KHRoaXMsIGlkLCB0cmFuc3BhcmVudFJlZ2lvbik7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0QWxwaGEoU3VyZmFjZUlEIGlkLCBmbG9hdCBhbHBoYSkgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldEFscGhhKHRoaXMsIGlkLCBhbHBoYSk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0TWF0cml4KFN1cmZhY2VJRCBpZCwgZmxvYXQgZHNkeCwgZmxvYXQgZHRkeCwKLSAgICAgICAgZmxvYXQgZHNkeSwgZmxvYXQgZHRkeSkgewotICAgIHJldHVybiBnZXRDb21wb3NlcigpLnNldE1hdHJpeCh0aGlzLCBpZCwgZHNkeCwgZHRkeCwgZHNkeSwgZHRkeSk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSwKLSAgICAgICAgaW50IG9yaWVudGF0aW9uLCB1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gQ29tcG9zZXI6OmdldEluc3RhbmNlKCkuc2V0T3JpZW50YXRpb24ob3JpZW50YXRpb24pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oCi0gICAgICAgIERpc3BsYXlJRCBkcHksIERpc3BsYXlJbmZvKiBpbmZvKQotewotICAgIGlmICh1aW50MzJfdChkcHkpPj1OVU1fRElTUExBWV9NQVgpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICB2b2xhdGlsZSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190IGNvbnN0ICogY2JsayA9IGdldF9jYmxrKCk7Ci0gICAgdm9sYXRpbGUgZGlzcGxheV9jYmxrX3QgY29uc3QgKiBkY2JsayA9IGNibGstPmRpc3BsYXlzICsgZHB5OwotCi0gICAgaW5mby0+dyAgICAgICAgICAgICAgPSBkY2Jsay0+dzsKLSAgICBpbmZvLT5oICAgICAgICAgICAgICA9IGRjYmxrLT5oOwotICAgIGluZm8tPm9yaWVudGF0aW9uICAgID0gZGNibGstPm9yaWVudGF0aW9uOwotICAgIGluZm8tPnhkcGkgICAgICAgICAgID0gZGNibGstPnhkcGk7Ci0gICAgaW5mby0+eWRwaSAgICAgICAgICAgPSBkY2Jsay0+eWRwaTsKLSAgICBpbmZvLT5mcHMgICAgICAgICAgICA9IGRjYmxrLT5mcHM7Ci0gICAgaW5mby0+ZGVuc2l0eSAgICAgICAgPSBkY2Jsay0+ZGVuc2l0eTsKLSAgICByZXR1cm4gZ2V0UGl4ZWxGb3JtYXRJbmZvKGRjYmxrLT5mb3JtYXQsICYoaW5mby0+cGl4ZWxGb3JtYXRJbmZvKSk7Ci19Ci0KLXNzaXplX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5V2lkdGgoRGlzcGxheUlEIGRweSkKLXsKLSAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIHZvbGF0aWxlIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3QgKiBjYmxrID0gZ2V0X2NibGsoKTsKLSAgICB2b2xhdGlsZSBkaXNwbGF5X2NibGtfdCBjb25zdCAqIGRjYmxrID0gY2Jsay0+ZGlzcGxheXMgKyBkcHk7Ci0gICAgcmV0dXJuIGRjYmxrLT53OwotfQotCi1zc2l6ZV90IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUhlaWdodChEaXNwbGF5SUQgZHB5KQotewotICAgIGlmICh1aW50MzJfdChkcHkpPj1OVU1fRElTUExBWV9NQVgpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgdm9sYXRpbGUgc3VyZmFjZV9mbGluZ2VyX2NibGtfdCBjb25zdCAqIGNibGsgPSBnZXRfY2JsaygpOwotICAgIHZvbGF0aWxlIGRpc3BsYXlfY2Jsa190IGNvbnN0ICogZGNibGsgPSBjYmxrLT5kaXNwbGF5cyArIGRweTsKLSAgICByZXR1cm4gZGNibGstPmg7Ci19Ci0KLXNzaXplX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5T3JpZW50YXRpb24oRGlzcGxheUlEIGRweSkKLXsKLSAgICBpZiAodWludDMyX3QoZHB5KT49TlVNX0RJU1BMQVlfTUFYKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIHZvbGF0aWxlIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3QgKiBjYmxrID0gZ2V0X2NibGsoKTsKLSAgICB2b2xhdGlsZSBkaXNwbGF5X2NibGtfdCBjb25zdCAqIGRjYmxrID0gY2Jsay0+ZGlzcGxheXMgKyBkcHk7Ci0gICAgcmV0dXJuIGRjYmxrLT5vcmllbnRhdGlvbjsKLX0KLQotc3NpemVfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldE51bWJlck9mRGlzcGxheXMoKQotewotICAgIHZvbGF0aWxlIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QgY29uc3QgKiBjYmxrID0gZ2V0X2NibGsoKTsKLSAgICB1aW50MzJfdCBjb25uZWN0ZWQgPSBjYmxrLT5jb25uZWN0ZWQ7Ci0gICAgaW50IG4gPSAwOwotICAgIHdoaWxlIChjb25uZWN0ZWQpIHsKLSAgICAgICAgaWYgKGNvbm5lY3RlZCYxKSBuKys7Ci0gICAgICAgIGNvbm5lY3RlZCA+Pj0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIG47Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpmcmVlemVEaXNwbGF5KERpc3BsYXlJRCBkcHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8vIFRoaXMgaGFzIGJlZW4gbWFkZSBhIG5vLW9wIGJlY2F1c2UgaXQgY2FuIGNhdXNlIEdyYWxsb2MgYnVmZmVyIGRlYWRsb2Nrcy4KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6dW5mcmVlemVEaXNwbGF5KERpc3BsYXlJRCBkcHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIC8vIFRoaXMgaGFzIGJlZW4gbWFkZSBhIG5vLW9wIGJlY2F1c2UgaXQgY2FuIGNhdXNlIEdyYWxsb2MgYnVmZmVyIGRlYWRsb2Nrcy4KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU2NyZWVuc2hvdENsaWVudDo6U2NyZWVuc2hvdENsaWVudCgpCi0gICAgOiBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Gb3JtYXQoUElYRUxfRk9STUFUX05PTkUpIHsKLX0KLQotc3RhdHVzX3QgU2NyZWVuc2hvdENsaWVudDo6dXBkYXRlKCkgewotICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IHMoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbUhlYXAgPSAwOwotICAgIHJldHVybiBzLT5jYXB0dXJlU2NyZWVuKDAsICZtSGVhcCwKLSAgICAgICAgICAgICZtV2lkdGgsICZtSGVpZ2h0LCAmbUZvcm1hdCwgMCwgMCwKLSAgICAgICAgICAgIDAsIC0xVUwpOwotfQotCi1zdGF0dXNfdCBTY3JlZW5zaG90Q2xpZW50Ojp1cGRhdGUodWludDMyX3QgcmVxV2lkdGgsIHVpbnQzMl90IHJlcUhlaWdodCkgewotICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IHMoQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbUhlYXAgPSAwOwotICAgIHJldHVybiBzLT5jYXB0dXJlU2NyZWVuKDAsICZtSGVhcCwKLSAgICAgICAgICAgICZtV2lkdGgsICZtSGVpZ2h0LCAmbUZvcm1hdCwgcmVxV2lkdGgsIHJlcUhlaWdodCwKLSAgICAgICAgICAgIDAsIC0xVUwpOwotfQotCi1zdGF0dXNfdCBTY3JlZW5zaG90Q2xpZW50Ojp1cGRhdGUodWludDMyX3QgcmVxV2lkdGgsIHVpbnQzMl90IHJlcUhlaWdodCwKLSAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaLCB1aW50MzJfdCBtYXhMYXllclopIHsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgIGlmIChzID09IE5VTEwpIHJldHVybiBOT19JTklUOwotICAgIG1IZWFwID0gMDsKLSAgICByZXR1cm4gcy0+Y2FwdHVyZVNjcmVlbigwLCAmbUhlYXAsCi0gICAgICAgICAgICAmbVdpZHRoLCAmbUhlaWdodCwgJm1Gb3JtYXQsIHJlcVdpZHRoLCByZXFIZWlnaHQsCi0gICAgICAgICAgICBtaW5MYXllclosIG1heExheWVyWik7Ci19Ci0KLXZvaWQgU2NyZWVuc2hvdENsaWVudDo6cmVsZWFzZSgpIHsKLSAgICBtSGVhcCA9IDA7Ci19Ci0KLXZvaWQgY29uc3QqIFNjcmVlbnNob3RDbGllbnQ6OmdldFBpeGVscygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUhlYXAtPmdldEJhc2UoKTsKLX0KLQotdWludDMyX3QgU2NyZWVuc2hvdENsaWVudDo6Z2V0V2lkdGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1XaWR0aDsKLX0KLQotdWludDMyX3QgU2NyZWVuc2hvdENsaWVudDo6Z2V0SGVpZ2h0KCkgY29uc3QgewotICAgIHJldHVybiBtSGVpZ2h0OwotfQotCi1QaXhlbEZvcm1hdCBTY3JlZW5zaG90Q2xpZW50OjpnZXRGb3JtYXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Gb3JtYXQ7Ci19Ci0KLXVpbnQzMl90IFNjcmVlbnNob3RDbGllbnQ6OmdldFN0cmlkZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVdpZHRoOwotfQotCi1zaXplX3QgU2NyZWVuc2hvdENsaWVudDo6Z2V0U2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUhlYXAtPmdldFNpemUoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VUZXh0dXJlLmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2VUZXh0dXJlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyYWEzNC4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZVRleHR1cmUiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKLSNkZWZpbmUgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0vLyBUaGlzIGNvbXBpbGUgb3B0aW9uIG1ha2VzIFN1cmZhY2VUZXh0dXJlIHVzZSB0aGUgRUdMX0tIUl9mZW5jZV9zeW5jIGV4dGVuc2lvbgotLy8gdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBidWZmZXJzLiAgSXQgd2lsbCBjYXVzZSBkZXF1ZXVlQnVmZmVyIHRvIHN0YWxsLAotLy8gd2FpdGluZyBmb3IgdGhlIEdMIHJlYWRzIGZvciB0aGUgYnVmZmVyIGJlaW5nIGRlcXVldWVkIHRvIGNvbXBsZXRlIGJlZm9yZQotLy8gYWxsb3dpbmcgdGhlIGJ1ZmZlciB0byBiZSBkZXF1ZXVlZC4KLSNpZmRlZiBVU0VfRkVOQ0VfU1lOQwotI2lmZGVmIEFMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIKLSNlcnJvciAiVVNFX0ZFTkNFX1NZTkMgYW5kIEFMTE9XX0RFUVVFVUVfQ1VSUkVOVF9CVUZGRVIgYXJlIGluY29tcGF0aWJsZSIKLSNlbmRpZgotI2VuZGlmCi0KLS8vIE1hY3JvcyBmb3IgaW5jbHVkaW5nIHRoZSBTdXJmYWNlVGV4dHVyZSBuYW1lIGluIGxvZyBtZXNzYWdlcwotI2RlZmluZSBTVF9MT0dWKHgsIC4uLikgQUxPR1YoIlslc10gIngsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dEKHgsIC4uLikgQUxPR0QoIlslc10gIngsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dJKHgsIC4uLikgQUxPR0koIlslc10gIngsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dXKHgsIC4uLikgQUxPR1coIlslc10gIngsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBTVF9MT0dFKHgsIC4uLikgQUxPR0UoIlslc10gIngsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRyYW5zZm9ybSBtYXRyaWNlcwotc3RhdGljIGZsb2F0IG10eElkZW50aXR5WzE2XSA9IHsKLSAgICAxLCAwLCAwLCAwLAotICAgIDAsIDEsIDAsIDAsCi0gICAgMCwgMCwgMSwgMCwKLSAgICAwLCAwLCAwLCAxLAotfTsKLXN0YXRpYyBmbG9hdCBtdHhGbGlwSFsxNl0gPSB7Ci0gICAgLTEsIDAsIDAsIDAsCi0gICAgMCwgMSwgMCwgMCwKLSAgICAwLCAwLCAxLCAwLAotICAgIDEsIDAsIDAsIDEsCi19Owotc3RhdGljIGZsb2F0IG10eEZsaXBWWzE2XSA9IHsKLSAgICAxLCAwLCAwLCAwLAotICAgIDAsIC0xLCAwLCAwLAotICAgIDAsIDAsIDEsIDAsCi0gICAgMCwgMSwgMCwgMSwKLX07Ci1zdGF0aWMgZmxvYXQgbXR4Um90OTBbMTZdID0gewotICAgIDAsIDEsIDAsIDAsCi0gICAgLTEsIDAsIDAsIDAsCi0gICAgMCwgMCwgMSwgMCwKLSAgICAxLCAwLCAwLCAxLAotfTsKLXN0YXRpYyBmbG9hdCBtdHhSb3QxODBbMTZdID0gewotICAgIC0xLCAwLCAwLCAwLAotICAgIDAsIC0xLCAwLCAwLAotICAgIDAsIDAsIDEsIDAsCi0gICAgMSwgMSwgMCwgMSwKLX07Ci1zdGF0aWMgZmxvYXQgbXR4Um90MjcwWzE2XSA9IHsKLSAgICAwLCAtMSwgMCwgMCwKLSAgICAxLCAwLCAwLCAwLAotICAgIDAsIDAsIDEsIDAsCi0gICAgMCwgMSwgMCwgMSwKLX07Ci0KLXN0YXRpYyB2b2lkIG10eE11bChmbG9hdCBvdXRbMTZdLCBjb25zdCBmbG9hdCBhWzE2XSwgY29uc3QgZmxvYXQgYlsxNl0pOwotCi0vLyBHZXQgYW4gSUQgdGhhdCdzIHVuaXF1ZSB3aXRoaW4gdGhpcyBwcm9jZXNzLgotc3RhdGljIGludDMyX3QgY3JlYXRlUHJvY2Vzc1VuaXF1ZUlkKCkgewotICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IGdsb2JhbENvdW50ZXIgPSAwOwotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJmdsb2JhbENvdW50ZXIpOwotfQotCi1TdXJmYWNlVGV4dHVyZTo6U3VyZmFjZVRleHR1cmUoR0x1aW50IHRleCwgYm9vbCBhbGxvd1N5bmNocm9ub3VzTW9kZSwKLSAgICAgICAgR0xlbnVtIHRleFRhcmdldCwgYm9vbCB1c2VGZW5jZVN5bmMpIDoKLSAgICBCdWZmZXJRdWV1ZShhbGxvd1N5bmNocm9ub3VzTW9kZSksCi0gICAgbUN1cnJlbnRUcmFuc2Zvcm0oMCksCi0gICAgbUN1cnJlbnRUaW1lc3RhbXAoMCksCi0gICAgbVRleE5hbWUodGV4KSwKLSNpZmRlZiBVU0VfRkVOQ0VfU1lOQwotICAgIG1Vc2VGZW5jZVN5bmModXNlRmVuY2VTeW5jKSwKLSNlbHNlCi0gICAgbVVzZUZlbmNlU3luYyhmYWxzZSksCi0jZW5kaWYKLSAgICBtVGV4VGFyZ2V0KHRleFRhcmdldCksCi0gICAgbUFiYW5kb25lZChmYWxzZSksCi0gICAgbUN1cnJlbnRUZXh0dXJlKEJ1ZmZlclF1ZXVlOjpJTlZBTElEX0JVRkZFUl9TTE9UKQotewotICAgIC8vIENob29zZSBhIG5hbWUgdXNpbmcgdGhlIFBJRCBhbmQgYSBwcm9jZXNzLXVuaXF1ZSBJRC4KLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgidW5uYW1lZC0lZC0lZCIsIGdldHBpZCgpLCBjcmVhdGVQcm9jZXNzVW5pcXVlSWQoKSk7Ci0gICAgQnVmZmVyUXVldWU6OnNldENvbnN1bWVyTmFtZShtTmFtZSk7Ci0KLSAgICBTVF9MT0dWKCJTdXJmYWNlVGV4dHVyZSIpOwotICAgIG1lbWNweShtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCwgbXR4SWRlbnRpdHksCi0gICAgICAgICAgICBzaXplb2YobUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgpKTsKLX0KLQotU3VyZmFjZVRleHR1cmU6On5TdXJmYWNlVGV4dHVyZSgpIHsKLSAgICBTVF9MT0dWKCJ+U3VyZmFjZVRleHR1cmUiKTsKLSAgICBhYmFuZG9uKCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlOjpzZXRCdWZmZXJDb3VudFNlcnZlcihpbnQgYnVmZmVyQ291bnQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBCdWZmZXJRdWV1ZTo6c2V0QnVmZmVyQ291bnRTZXJ2ZXIoYnVmZmVyQ291bnQpOwotfQotCi0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlOjpzZXREZWZhdWx0QnVmZmVyU2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKQotewotICAgIHJldHVybiBCdWZmZXJRdWV1ZTo6c2V0RGVmYXVsdEJ1ZmZlclNpemUodywgaCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlOjp1cGRhdGVUZXhJbWFnZSgpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFNUX0xPR1YoInVwZGF0ZVRleEltYWdlIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIFNUX0xPR0UoImNhbGxpbmcgdXBkYXRlVGV4SW1hZ2UoKSBvbiBhbiBhYmFuZG9uZWQgU3VyZmFjZVRleHR1cmUiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgQnVmZmVySXRlbSBpdGVtOwotCi0gICAgLy8gSW4gYXN5bmNocm9ub3VzIG1vZGUgdGhlIGxpc3QgaXMgZ3VhcmFudGVlZCB0byBiZSBvbmUgYnVmZmVyCi0gICAgLy8gZGVlcCwgd2hpbGUgaW4gc3luY2hyb25vdXMgbW9kZSB3ZSB1c2UgdGhlIG9sZGVzdCBidWZmZXIuCi0gICAgaWYgKGFjcXVpcmUoJml0ZW0pID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGludCBidWYgPSBpdGVtLm1CdWY7Ci0gICAgICAgIC8vIFRoaXMgYnVmZmVyIHdhcyBuZXdseSBhbGxvY2F0ZWQsIHNvIHdlIG5lZWQgdG8gY2xlYW4gdXAgb24gb3VyIHNpZGUKLSAgICAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgbUVHTFNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXIgPSAwOwotICAgICAgICAgICAgaWYgKG1FR0xTbG90c1tidWZdLm1FZ2xJbWFnZSAhPSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgICAgICAgICAgZWdsRGVzdHJveUltYWdlS0hSKG1FR0xTbG90c1tidWZdLm1FZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgbUVHTFNsb3RzW2J1Zl0ubUVnbEltYWdlKTsKLSAgICAgICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tRWdsSW1hZ2UgPSBFR0xfTk9fSU1BR0VfS0hSOwotICAgICAgICAgICAgICAgIG1FR0xTbG90c1tidWZdLm1FZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlciA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIEdMIHRleHR1cmUgb2JqZWN0LgotICAgICAgICBFR0xJbWFnZUtIUiBpbWFnZSA9IG1FR0xTbG90c1tidWZdLm1FZ2xJbWFnZTsKLSAgICAgICAgRUdMRGlzcGxheSBkcHkgPSBlZ2xHZXRDdXJyZW50RGlzcGxheSgpOwotICAgICAgICBpZiAoaW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUikgewotICAgICAgICAgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIFNUX0xPR0UoImJ1ZmZlciBhdCBzbG90ICVkIGlzIG51bGwiLCBidWYpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbWFnZSA9IGNyZWF0ZUltYWdlKGRweSwgaXRlbS5tR3JhcGhpY0J1ZmZlcik7Ci0gICAgICAgICAgICBtRUdMU2xvdHNbYnVmXS5tRWdsSW1hZ2UgPSBpbWFnZTsKLSAgICAgICAgICAgIG1FR0xTbG90c1tidWZdLm1FZ2xEaXNwbGF5ID0gZHB5OwotICAgICAgICAgICAgaWYgKGltYWdlID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgICAgICAgICAvLyBOT1RFOiBpZiBkcHkgd2FzIGludmFsaWQsIGNyZWF0ZUltYWdlKCkgaXMgZ3VhcmFudGVlZCB0bwotICAgICAgICAgICAgICAgIC8vIGZhaWwuIHNvIHdlJ2QgZW5kIHVwIGhlcmUuCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBHTGludCBlcnJvcjsKLSAgICAgICAgd2hpbGUgKChlcnJvciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIFNUX0xPR1coInVwZGF0ZVRleEltYWdlOiBjbGVhcmluZyBHTCBlcnJvcjogJSMwNHgiLCBlcnJvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBnbEJpbmRUZXh0dXJlKG1UZXhUYXJnZXQsIG1UZXhOYW1lKTsKLSAgICAgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhtVGV4VGFyZ2V0LCAoR0xlZ2xJbWFnZU9FUylpbWFnZSk7Ci0KLSAgICAgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKChlcnJvciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIFNUX0xPR0UoImVycm9yIGJpbmRpbmcgZXh0ZXJuYWwgdGV4dHVyZSBpbWFnZSAlcCAoc2xvdCAlZCk6ICUjMDR4IiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UsIGJ1ZiwgZXJyb3IpOwotICAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmFpbGVkKSB7Ci0gICAgICAgICAgICByZWxlYXNlQnVmZmVyKGJ1ZiwgbUVHTFNsb3RzW2J1Zl0ubUVnbERpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIG1FR0xTbG90c1tidWZdLm1GZW5jZSk7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudFRleHR1cmUgIT0gSU5WQUxJRF9CVUZGRVJfU0xPVCkgewotICAgICAgICAgICAgaWYgKG1Vc2VGZW5jZVN5bmMpIHsKLSAgICAgICAgICAgICAgICBFR0xTeW5jS0hSIGZlbmNlID0gZWdsQ3JlYXRlU3luY0tIUihkcHksIEVHTF9TWU5DX0ZFTkNFX0tIUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChmZW5jZSA9PSBFR0xfTk9fU1lOQ19LSFIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoInVwZGF0ZVRleEltYWdlOiBlcnJvciBjcmVhdGluZyBmZW5jZTogJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUJ1ZmZlcihidWYsIG1FR0xTbG90c1tidWZdLm1FZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FR0xTbG90c1tidWZdLm1GZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBnbEZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgbUVHTFNsb3RzW21DdXJyZW50VGV4dHVyZV0ubUZlbmNlID0gZmVuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTVF9MT0dWKCJ1cGRhdGVUZXhJbWFnZTogKHNsb3Q9JWQgYnVmPSVwKSAtPiAoc2xvdD0lZCBidWY9JXApIiwKLSAgICAgICAgICAgICAgICBtQ3VycmVudFRleHR1cmUsCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRUZXh0dXJlQnVmICE9IE5VTEwgPyBtQ3VycmVudFRleHR1cmVCdWYtPmhhbmRsZSA6IDAsCi0gICAgICAgICAgICAgICAgYnVmLCBpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwgPyBpdGVtLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUgOiAwKTsKLQotICAgICAgICAvLyByZWxlYXNlIG9sZCBidWZmZXIKLSAgICAgICAgcmVsZWFzZUJ1ZmZlcihtQ3VycmVudFRleHR1cmUsCi0gICAgICAgICAgICAgICAgbUVHTFNsb3RzW21DdXJyZW50VGV4dHVyZV0ubUVnbERpc3BsYXksCi0gICAgICAgICAgICAgICAgbUVHTFNsb3RzW21DdXJyZW50VGV4dHVyZV0ubUZlbmNlKTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIFN1cmZhY2VUZXh0dXJlIHN0YXRlLgotICAgICAgICBtQ3VycmVudFRleHR1cmUgPSBidWY7Ci0gICAgICAgIG1DdXJyZW50VGV4dHVyZUJ1ZiA9IG1FR0xTbG90c1tidWZdLm1HcmFwaGljQnVmZmVyOwotICAgICAgICBtQ3VycmVudENyb3AgPSBpdGVtLm1Dcm9wOwotICAgICAgICBtQ3VycmVudFRyYW5zZm9ybSA9IGl0ZW0ubVRyYW5zZm9ybTsKLSAgICAgICAgbUN1cnJlbnRTY2FsaW5nTW9kZSA9IGl0ZW0ubVNjYWxpbmdNb2RlOwotICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCA9IGl0ZW0ubVRpbWVzdGFtcDsKLSAgICAgICAgY29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgoKTsKLQotICAgICAgICAvLyBOb3cgdGhhdCB3ZSd2ZSBwYXNzZWQgdGhlIHBvaW50IGF0IHdoaWNoIGZhaWx1cmVzIGNhbiBoYXBwZW4sCi0gICAgICAgIC8vIGl0J3Mgc2FmZSB0byByZW1vdmUgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuCi0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBhbHdheXMgYmluZCB0aGUgdGV4dHVyZSBldmVuIGlmIHdlIGRvbid0IHVwZGF0ZSBpdHMgY29udGVudHMuCi0gICAgICAgIGdsQmluZFRleHR1cmUobVRleFRhcmdldCwgbVRleE5hbWUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBTdXJmYWNlVGV4dHVyZTo6aXNFeHRlcm5hbEZvcm1hdCh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAvLyBzdXBwb3J0ZWQgWVVWIGZvcm1hdHMKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKLSAgICAvLyBMZWdhY3kvZGVwcmVjYXRlZCBZVVYgZm9ybWF0cwotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1A6Ci0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIEFueSBPRU0gZm9ybWF0IG5lZWRzIHRvIGJlIGNvbnNpZGVyZWQKLSAgICBpZiAoZm9ybWF0Pj0weDEwMCAmJiBmb3JtYXQ8PTB4MUZGKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotR0xlbnVtIFN1cmZhY2VUZXh0dXJlOjpnZXRDdXJyZW50VGV4dHVyZVRhcmdldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRleFRhcmdldDsKLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZTo6Z2V0VHJhbnNmb3JtTWF0cml4KGZsb2F0IG10eFsxNl0pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1lbWNweShtdHgsIG1DdXJyZW50VHJhbnNmb3JtTWF0cml4LCBzaXplb2YobUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgpKTsKLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZTo6Y29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgoKSB7Ci0gICAgU1RfTE9HVigiY29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgiKTsKLQotICAgIGZsb2F0IHhmb3JtWzE2XTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgeGZvcm1baV0gPSBtdHhJZGVudGl0eVtpXTsKLSAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHJhbnNmb3JtICYgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9IKSB7Ci0gICAgICAgIGZsb2F0IHJlc3VsdFsxNl07Ci0gICAgICAgIG10eE11bChyZXN1bHQsIHhmb3JtLCBtdHhGbGlwSCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgeGZvcm1baV0gPSByZXN1bHRbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHJhbnNmb3JtICYgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fRkxJUF9WKSB7Ci0gICAgICAgIGZsb2F0IHJlc3VsdFsxNl07Ci0gICAgICAgIG10eE11bChyZXN1bHQsIHhmb3JtLCBtdHhGbGlwVik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgeGZvcm1baV0gPSByZXN1bHRbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHJhbnNmb3JtICYgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fUk9UXzkwKSB7Ci0gICAgICAgIGZsb2F0IHJlc3VsdFsxNl07Ci0gICAgICAgIG10eE11bChyZXN1bHQsIHhmb3JtLCBtdHhSb3Q5MCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgeGZvcm1baV0gPSByZXN1bHRbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiYgYnVmKG1DdXJyZW50VGV4dHVyZUJ1Zik7Ci0gICAgZmxvYXQgdHgsIHR5LCBzeCwgc3k7Ci0gICAgaWYgKCFtQ3VycmVudENyb3AuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgYmlsaW5lYXIgc2FtcGxpbmcgYXQgdGhlIG9mIHRoZSBjcm9wIHJlY3RhbmdsZSB3ZQotICAgICAgICAvLyBtYXkgbmVlZCB0byBzaHJpbmsgaXQgYnkgMiB0ZXhlbHMgaW4gZWFjaCBkaXJlY3Rpb24uICBOb3JtYWxseSB0aGlzCi0gICAgICAgIC8vIHdvdWxkIGp1c3QgbmVlZCB0byB0YWtlIDEvMiBhIHRleGVsIG9mZiBlYWNoIGVuZCwgYnV0IGJlY2F1c2UgdGhlCi0gICAgICAgIC8vIGNocm9tYSBjaGFubmVscyB3aWxsIGxpa2VseSBiZSBzdWJzYW1wbGVkIHdlIG5lZWQgdG8gY2hvcCBvZmYgYSB3aG9sZQotICAgICAgICAvLyB0ZXhlbC4gIFRoaXMgd2lsbCBjYXVzZSBhcnRpZmFjdHMgaWYgc29tZW9uZSBkb2VzIG5lYXJlc3Qgc2FtcGxpbmcKLSAgICAgICAgLy8gd2l0aCAxOjEgcGl4ZWw6dGV4ZWwgcmF0aW8sIGJ1dCBpdCdzIGltcG9zc2libGUgdG8gc2ltdWx0YW5lb3VzbHkKLSAgICAgICAgLy8gYWNjb21vZGF0ZSB0aGUgYmlsaW5lYXIgYW5kIG5lYXJlc3Qgc2FtcGxpbmcgdXNlcy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgbmVhcmVzdCBzYW1wbGluZyB0dXJucyBvdXQgdG8gYmUgYSBkZXNpcmFibGUgdXNhZ2Ugb2YgdGhlc2UKLSAgICAgICAgLy8gdGV4dHVyZXMgdGhlbiB3ZSBjb3VsZCBhZGQgdGhlIGFiaWxpdHkgdG8gc3dpdGNoIGEgU3VyZmFjZVRleHR1cmUgdG8KLSAgICAgICAgLy8gbmVhcmVzdC1tb2RlLiAgUHJlZmVyYWJseSwgaG93ZXZlciwgdGhlIGltYWdlIHByb2R1Y2VycyAodmlkZW8KLSAgICAgICAgLy8gZGVjb2RlciwgY2FtZXJhLCBldGMuKSB3b3VsZCBzaW1wbHkgbm90IHVzZSBhIGNyb3AgcmVjdGFuZ2xlIChvciBhdAotICAgICAgICAvLyBsZWFzdCBub3QgdGVsbCB0aGUgZnJhbWV3b3JrIGFib3V0IGl0KSBzbyB0aGF0IHRoZSBHUFUgY2FuIGRvIHRoZQotICAgICAgICAvLyBjb3JyZWN0IGVkZ2UgYmVoYXZpb3IuCi0gICAgICAgIGludCB4c2hyaW5rID0gMCwgeXNocmluayA9IDA7Ci0gICAgICAgIGlmIChtQ3VycmVudENyb3AubGVmdCA+IDApIHsKLSAgICAgICAgICAgIHR4ID0gZmxvYXQobUN1cnJlbnRDcm9wLmxlZnQgKyAxKSAvIGZsb2F0KGJ1Zi0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICB4c2hyaW5rKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0eCA9IDAuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50Q3JvcC5yaWdodCA8IGludDMyX3QoYnVmLT5nZXRXaWR0aCgpKSkgewotICAgICAgICAgICAgeHNocmluaysrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudENyb3AuYm90dG9tIDwgaW50MzJfdChidWYtPmdldEhlaWdodCgpKSkgewotICAgICAgICAgICAgdHkgPSAoZmxvYXQoYnVmLT5nZXRIZWlnaHQoKSAtIG1DdXJyZW50Q3JvcC5ib3R0b20pICsgMS4wZikgLwotICAgICAgICAgICAgICAgICAgICBmbG9hdChidWYtPmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIHlzaHJpbmsrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHR5ID0gMC4wZjsKLSAgICAgICAgfQotICAgICAgICBpZiAobUN1cnJlbnRDcm9wLnRvcCA+IDApIHsKLSAgICAgICAgICAgIHlzaHJpbmsrKzsKLSAgICAgICAgfQotICAgICAgICBzeCA9IGZsb2F0KG1DdXJyZW50Q3JvcC53aWR0aCgpIC0geHNocmluaykgLyBmbG9hdChidWYtPmdldFdpZHRoKCkpOwotICAgICAgICBzeSA9IGZsb2F0KG1DdXJyZW50Q3JvcC5oZWlnaHQoKSAtIHlzaHJpbmspIC8gZmxvYXQoYnVmLT5nZXRIZWlnaHQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdHggPSAwLjBmOwotICAgICAgICB0eSA9IDAuMGY7Ci0gICAgICAgIHN4ID0gMS4wZjsKLSAgICAgICAgc3kgPSAxLjBmOwotICAgIH0KLSAgICBmbG9hdCBjcm9wWzE2XSA9IHsKLSAgICAgICAgc3gsIDAsIDAsIDAsCi0gICAgICAgIDAsIHN5LCAwLCAwLAotICAgICAgICAwLCAwLCAxLCAwLAotICAgICAgICB0eCwgdHksIDAsIDEsCi0gICAgfTsKLQotICAgIGZsb2F0IG10eEJlZm9yZUZsaXBWWzE2XTsKLSAgICBtdHhNdWwobXR4QmVmb3JlRmxpcFYsIGNyb3AsIHhmb3JtKTsKLQotICAgIC8vIFN1cmZhY2VGbGluZ2VyIGV4cGVjdHMgdGhlIHRvcCBvZiBpdHMgd2luZG93IHRleHR1cmVzIHRvIGJlIGF0IGEgWQotICAgIC8vIGNvb3JkaW5hdGUgb2YgMCwgc28gU3VyZmFjZVRleHR1cmUgbXVzdCBiZWhhdmUgdGhlIHNhbWUgd2F5LiAgV2UgZG9uJ3QKLSAgICAvLyB3YW50IHRvIGV4cG9zZSB0aGlzIHRvIGFwcGxpY2F0aW9ucywgaG93ZXZlciwgc28gd2UgbXVzdCBhZGQgYW4KLSAgICAvLyBhZGRpdGlvbmFsIHZlcnRpY2FsIGZsaXAgdG8gdGhlIHRyYW5zZm9ybSBhZnRlciBhbGwgdGhlIG90aGVyIHRyYW5zZm9ybXMuCi0gICAgbXR4TXVsKG1DdXJyZW50VHJhbnNmb3JtTWF0cml4LCBtdHhGbGlwViwgbXR4QmVmb3JlRmxpcFYpOwotfQotCi1uc2Vjc190IFN1cmZhY2VUZXh0dXJlOjpnZXRUaW1lc3RhbXAoKSB7Ci0gICAgU1RfTE9HVigiZ2V0VGltZXN0YW1wIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbUN1cnJlbnRUaW1lc3RhbXA7Ci19Ci0KLXZvaWQgU3VyZmFjZVRleHR1cmU6OnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIoCi0gICAgICAgIGNvbnN0IHNwPEZyYW1lQXZhaWxhYmxlTGlzdGVuZXI+JiBsaXN0ZW5lcikgewotICAgIFNUX0xPR1YoInNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIEJ1ZmZlclF1ZXVlOjpzZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLX0KLQotRUdMSW1hZ2VLSFIgU3VyZmFjZVRleHR1cmU6OmNyZWF0ZUltYWdlKEVHTERpc3BsYXkgZHB5LAotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlcikgewotICAgIEVHTENsaWVudEJ1ZmZlciBjYnVmID0gKEVHTENsaWVudEJ1ZmZlcilncmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKTsKLSAgICBFR0xpbnQgYXR0cnNbXSA9IHsKLSAgICAgICAgRUdMX0lNQUdFX1BSRVNFUlZFRF9LSFIsICAgIEVHTF9UUlVFLAotICAgICAgICBFR0xfTk9ORSwKLSAgICB9OwotICAgIEVHTEltYWdlS0hSIGltYWdlID0gZWdsQ3JlYXRlSW1hZ2VLSFIoZHB5LCBFR0xfTk9fQ09OVEVYVCwKLSAgICAgICAgICAgIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsIGNidWYsIGF0dHJzKTsKLSAgICBpZiAoaW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUikgewotICAgICAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOwotICAgICAgICBTVF9MT0dFKCJlcnJvciBjcmVhdGluZyBFR0xJbWFnZTogJSN4IiwgZXJyb3IpOwotICAgIH0KLSAgICByZXR1cm4gaW1hZ2U7Ci19Ci0KLXNwPEdyYXBoaWNCdWZmZXI+IFN1cmZhY2VUZXh0dXJlOjpnZXRDdXJyZW50QnVmZmVyKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgcmV0dXJuIG1DdXJyZW50VGV4dHVyZUJ1ZjsKLX0KLQotUmVjdCBTdXJmYWNlVGV4dHVyZTo6Z2V0Q3VycmVudENyb3AoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gbUN1cnJlbnRDcm9wOwotfQotCi11aW50MzJfdCBTdXJmYWNlVGV4dHVyZTo6Z2V0Q3VycmVudFRyYW5zZm9ybSgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBtQ3VycmVudFRyYW5zZm9ybTsKLX0KLQotdWludDMyX3QgU3VyZmFjZVRleHR1cmU6OmdldEN1cnJlbnRTY2FsaW5nTW9kZSgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBtQ3VycmVudFNjYWxpbmdNb2RlOwotfQotCi1ib29sIFN1cmZhY2VUZXh0dXJlOjppc1N5bmNocm9ub3VzTW9kZSgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBCdWZmZXJRdWV1ZTo6aXNTeW5jaHJvbm91c01vZGUoKTsKLX0KLQotdm9pZCBTdXJmYWNlVGV4dHVyZTo6YWJhbmRvbigpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1BYmFuZG9uZWQgPSB0cnVlOwotICAgIG1DdXJyZW50VGV4dHVyZUJ1Zi5jbGVhcigpOwotCi0gICAgLy8gZGVzdHJveSBhbGwgZWdsIGJ1ZmZlcnMKLSAgICBmb3IgKGludCBpID0wOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgaSsrKSB7Ci0gICAgICAgIG1FR0xTbG90c1tpXS5tR3JhcGhpY0J1ZmZlciA9IDA7Ci0gICAgICAgIGlmIChtRUdMU2xvdHNbaV0ubUVnbEltYWdlICE9IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgICAgIGVnbERlc3Ryb3lJbWFnZUtIUihtRUdMU2xvdHNbaV0ubUVnbERpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIG1FR0xTbG90c1tpXS5tRWdsSW1hZ2UpOwotICAgICAgICAgICAgbUVHTFNsb3RzW2ldLm1FZ2xJbWFnZSA9IEVHTF9OT19JTUFHRV9LSFI7Ci0gICAgICAgICAgICBtRUdMU2xvdHNbaV0ubUVnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGRpc2Nvbm5lY3QgZnJvbSB0aGUgQnVmZmVyUXVldWUKLSAgICBCdWZmZXJRdWV1ZTo6Y29uc3VtZXJEaXNjb25uZWN0KCk7Ci19Ci0KLXZvaWQgU3VyZmFjZVRleHR1cmU6OnNldE5hbWUoY29uc3QgU3RyaW5nOCYgbmFtZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG1OYW1lID0gbmFtZTsKLSAgICBCdWZmZXJRdWV1ZTo6c2V0Q29uc3VtZXJOYW1lKG5hbWUpOwotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlOjpkdW1wKFN0cmluZzgmIHJlc3VsdCkgY29uc3QKLXsKLSAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKLSAgICBkdW1wKHJlc3VsdCwgIiIsIGJ1ZmZlciwgMTAyNCk7Ci19Ci0KLXZvaWQgU3VyZmFjZVRleHR1cmU6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjb25zdCBjaGFyKiBwcmVmaXgsCi0gICAgICAgIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXNtVGV4TmFtZT0lZFxuIiwgcHJlZml4LCBtVGV4TmFtZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgIiVzbmV4dCAgIDoge2Nyb3A9WyVkLCVkLCVkLCVkXSwgdHJhbnNmb3JtPTB4JTAyeCwgY3VycmVudD0lZH1cbiIKLSAgICAgICAgICAgICxwcmVmaXgsIG1DdXJyZW50Q3JvcC5sZWZ0LAotICAgICAgICAgICAgbUN1cnJlbnRDcm9wLnRvcCwgbUN1cnJlbnRDcm9wLnJpZ2h0LCBtQ3VycmVudENyb3AuYm90dG9tLAotICAgICAgICAgICAgbUN1cnJlbnRUcmFuc2Zvcm0sIG1DdXJyZW50VGV4dHVyZQotICAgICk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0KLSAgICBCdWZmZXJRdWV1ZTo6ZHVtcChyZXN1bHQsIHByZWZpeCwgYnVmZmVyLCBTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQgbXR4TXVsKGZsb2F0IG91dFsxNl0sIGNvbnN0IGZsb2F0IGFbMTZdLCBjb25zdCBmbG9hdCBiWzE2XSkgewotICAgIG91dFswXSA9IGFbMF0qYlswXSArIGFbNF0qYlsxXSArIGFbOF0qYlsyXSArIGFbMTJdKmJbM107Ci0gICAgb3V0WzFdID0gYVsxXSpiWzBdICsgYVs1XSpiWzFdICsgYVs5XSpiWzJdICsgYVsxM10qYlszXTsKLSAgICBvdXRbMl0gPSBhWzJdKmJbMF0gKyBhWzZdKmJbMV0gKyBhWzEwXSpiWzJdICsgYVsxNF0qYlszXTsKLSAgICBvdXRbM10gPSBhWzNdKmJbMF0gKyBhWzddKmJbMV0gKyBhWzExXSpiWzJdICsgYVsxNV0qYlszXTsKLQotICAgIG91dFs0XSA9IGFbMF0qYls0XSArIGFbNF0qYls1XSArIGFbOF0qYls2XSArIGFbMTJdKmJbN107Ci0gICAgb3V0WzVdID0gYVsxXSpiWzRdICsgYVs1XSpiWzVdICsgYVs5XSpiWzZdICsgYVsxM10qYls3XTsKLSAgICBvdXRbNl0gPSBhWzJdKmJbNF0gKyBhWzZdKmJbNV0gKyBhWzEwXSpiWzZdICsgYVsxNF0qYls3XTsKLSAgICBvdXRbN10gPSBhWzNdKmJbNF0gKyBhWzddKmJbNV0gKyBhWzExXSpiWzZdICsgYVsxNV0qYls3XTsKLQotICAgIG91dFs4XSA9IGFbMF0qYls4XSArIGFbNF0qYls5XSArIGFbOF0qYlsxMF0gKyBhWzEyXSpiWzExXTsKLSAgICBvdXRbOV0gPSBhWzFdKmJbOF0gKyBhWzVdKmJbOV0gKyBhWzldKmJbMTBdICsgYVsxM10qYlsxMV07Ci0gICAgb3V0WzEwXSA9IGFbMl0qYls4XSArIGFbNl0qYls5XSArIGFbMTBdKmJbMTBdICsgYVsxNF0qYlsxMV07Ci0gICAgb3V0WzExXSA9IGFbM10qYls4XSArIGFbN10qYls5XSArIGFbMTFdKmJbMTBdICsgYVsxNV0qYlsxMV07Ci0KLSAgICBvdXRbMTJdID0gYVswXSpiWzEyXSArIGFbNF0qYlsxM10gKyBhWzhdKmJbMTRdICsgYVsxMl0qYlsxNV07Ci0gICAgb3V0WzEzXSA9IGFbMV0qYlsxMl0gKyBhWzVdKmJbMTNdICsgYVs5XSpiWzE0XSArIGFbMTNdKmJbMTVdOwotICAgIG91dFsxNF0gPSBhWzJdKmJbMTJdICsgYVs2XSpiWzEzXSArIGFbMTBdKmJbMTRdICsgYVsxNF0qYlsxNV07Ci0gICAgb3V0WzE1XSA9IGFbM10qYlsxMl0gKyBhWzddKmJbMTNdICsgYVsxMV0qYlsxNF0gKyBhWzE1XSpiWzE1XTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50LmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4ZGNhZi4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZVRleHR1cmVDbGllbnQiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgPGd1aS9JU3VyZmFjZUNvbXBvc2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZUNsaWVudC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvQ29tcG9zZXJTZXJ2aWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3VyZmFjZVRleHR1cmVDbGllbnQ6OlN1cmZhY2VUZXh0dXJlQ2xpZW50KAotICAgICAgICBjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlVGV4dHVyZSkKLXsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudDo6aW5pdCgpOwotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRJU3VyZmFjZVRleHR1cmUoc3VyZmFjZVRleHR1cmUpOwotfQotCi1TdXJmYWNlVGV4dHVyZUNsaWVudDo6U3VyZmFjZVRleHR1cmVDbGllbnQoKSB7Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmluaXQoKTsKLX0KLQotU3VyZmFjZVRleHR1cmVDbGllbnQ6On5TdXJmYWNlVGV4dHVyZUNsaWVudCgpIHsKLSAgICBpZiAobUNvbm5lY3RlZFRvQ3B1KSB7Ci0gICAgICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojppbml0KCkgewotICAgIC8vIEluaXRpYWxpemUgdGhlIEFOYXRpdmVXaW5kb3cgZnVuY3Rpb24gcG9pbnRlcnMuCi0gICAgQU5hdGl2ZVdpbmRvdzo6c2V0U3dhcEludGVydmFsICA9IGhvb2tfc2V0U3dhcEludGVydmFsOwotICAgIEFOYXRpdmVXaW5kb3c6OmRlcXVldWVCdWZmZXIgICAgPSBob29rX2RlcXVldWVCdWZmZXI7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6Y2FuY2VsQnVmZmVyICAgICA9IGhvb2tfY2FuY2VsQnVmZmVyOwotICAgIEFOYXRpdmVXaW5kb3c6OmxvY2tCdWZmZXIgICAgICAgPSBob29rX2xvY2tCdWZmZXI7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6cXVldWVCdWZmZXIgICAgICA9IGhvb2tfcXVldWVCdWZmZXI7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6cXVlcnkgICAgICAgICAgICA9IGhvb2tfcXVlcnk7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6cGVyZm9ybSAgICAgICAgICA9IGhvb2tfcGVyZm9ybTsKLQotICAgIGNvbnN0X2Nhc3Q8aW50Jj4oQU5hdGl2ZVdpbmRvdzo6bWluU3dhcEludGVydmFsKSA9IDA7Ci0gICAgY29uc3RfY2FzdDxpbnQmPihBTmF0aXZlV2luZG93OjptYXhTd2FwSW50ZXJ2YWwpID0gMTsKLQotICAgIG1SZXFXaWR0aCA9IDA7Ci0gICAgbVJlcUhlaWdodCA9IDA7Ci0gICAgbVJlcUZvcm1hdCA9IDA7Ci0gICAgbVJlcVVzYWdlID0gMDsKLSAgICBtVGltZXN0YW1wID0gTkFUSVZFX1dJTkRPV19USU1FU1RBTVBfQVVUTzsKLSAgICBtRGVmYXVsdFdpZHRoID0gMDsKLSAgICBtRGVmYXVsdEhlaWdodCA9IDA7Ci0gICAgbVRyYW5zZm9ybUhpbnQgPSAwOwotICAgIG1Db25uZWN0ZWRUb0NwdSA9IGZhbHNlOwotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRJU3VyZmFjZVRleHR1cmUoCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2VUZXh0dXJlKQotewotICAgIG1TdXJmYWNlVGV4dHVyZSA9IHN1cmZhY2VUZXh0dXJlOwotfQotCi1zcDxJU3VyZmFjZVRleHR1cmU+IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpnZXRJU3VyZmFjZVRleHR1cmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpob29rX3NldFN3YXBJbnRlcnZhbChBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCBpbnRlcnZhbCkgewotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KiBjID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIHJldHVybiBjLT5zZXRTd2FwSW50ZXJ2YWwoaW50ZXJ2YWwpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6Omhvb2tfZGVxdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqKiBidWZmZXIpIHsKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudCogYyA9IGdldFNlbGYod2luZG93KTsKLSAgICByZXR1cm4gYy0+ZGVxdWV1ZUJ1ZmZlcihidWZmZXIpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6Omhvb2tfY2FuY2VsQnVmZmVyKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyKSB7Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQqIGMgPSBnZXRTZWxmKHdpbmRvdyk7Ci0gICAgcmV0dXJuIGMtPmNhbmNlbEJ1ZmZlcihidWZmZXIpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6Omhvb2tfbG9ja0J1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcikgewotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KiBjID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIHJldHVybiBjLT5sb2NrQnVmZmVyKGJ1ZmZlcik7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6aG9va19xdWV1ZUJ1ZmZlcihBTmF0aXZlV2luZG93KiB3aW5kb3csCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcikgewotICAgIFN1cmZhY2VUZXh0dXJlQ2xpZW50KiBjID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIHJldHVybiBjLT5xdWV1ZUJ1ZmZlcihidWZmZXIpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6Omhvb2tfcXVlcnkoY29uc3QgQU5hdGl2ZVdpbmRvdyogd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50KiB2YWx1ZSkgewotICAgIGNvbnN0IFN1cmZhY2VUZXh0dXJlQ2xpZW50KiBjID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIHJldHVybiBjLT5xdWVyeSh3aGF0LCB2YWx1ZSk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6aG9va19wZXJmb3JtKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IG9wZXJhdGlvbiwgLi4uKSB7Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIHZhX3N0YXJ0KGFyZ3MsIG9wZXJhdGlvbik7Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnQqIGMgPSBnZXRTZWxmKHdpbmRvdyk7Ci0gICAgcmV0dXJuIGMtPnBlcmZvcm0ob3BlcmF0aW9uLCBhcmdzKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRTd2FwSW50ZXJ2YWwoaW50IGludGVydmFsKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICAvLyBFR0wgc3BlY2lmaWNhdGlvbiBzdGF0ZXM6Ci0gICAgLy8gIGludGVydmFsIGlzIHNpbGVudGx5IGNsYW1wZWQgdG8gbWluaW11bSBhbmQgbWF4aW11bSBpbXBsZW1lbnRhdGlvbgotICAgIC8vICBkZXBlbmRlbnQgdmFsdWVzIGJlZm9yZSBiZWluZyBzdG9yZWQuCi0gICAgLy8gQWx0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0bywgd2UgYXBwbHkgdGhlIHNhbWUgbG9naWMgaGVyZS4KLQotICAgIGlmIChpbnRlcnZhbCA8IG1pblN3YXBJbnRlcnZhbCkKLSAgICAgICAgaW50ZXJ2YWwgPSBtaW5Td2FwSW50ZXJ2YWw7Ci0KLSAgICBpZiAoaW50ZXJ2YWwgPiBtYXhTd2FwSW50ZXJ2YWwpCi0gICAgICAgIGludGVydmFsID0gbWF4U3dhcEludGVydmFsOwotCi0gICAgc3RhdHVzX3QgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXRTeW5jaHJvbm91c01vZGUoaW50ZXJ2YWwgPyB0cnVlIDogZmFsc2UpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkZXF1ZXVlQnVmZmVyKGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiogYnVmZmVyKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRlcXVldWVCdWZmZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGludCBidWYgPSAtMTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3VyZmFjZVRleHR1cmUtPmRlcXVldWVCdWZmZXIoJmJ1ZiwgbVJlcVdpZHRoLCBtUmVxSGVpZ2h0LAotICAgICAgICAgICAgbVJlcUZvcm1hdCwgbVJlcVVzYWdlKTsKLSAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICBBTE9HVigiZGVxdWV1ZUJ1ZmZlcjogSVN1cmZhY2VUZXh0dXJlOjpkZXF1ZXVlQnVmZmVyKCVkLCAlZCwgJWQsICVkKSIKLSAgICAgICAgICAgICAiZmFpbGVkOiAlZCIsIG1SZXFXaWR0aCwgbVJlcUhlaWdodCwgbVJlcUZvcm1hdCwgbVJlcVVzYWdlLAotICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIHNwPEdyYXBoaWNCdWZmZXI+JiBnYnVmKG1TbG90c1tidWZdKTsKLSAgICBpZiAocmVzdWx0ICYgSVN1cmZhY2VUZXh0dXJlOjpSRUxFQVNFX0FMTF9CVUZGRVJTKSB7Ci0gICAgICAgIGZyZWVBbGxCdWZmZXJzKCk7Ci0gICAgfQotCi0gICAgaWYgKChyZXN1bHQgJiBJU3VyZmFjZVRleHR1cmU6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04pIHx8IGdidWYgPT0gMCkgewotICAgICAgICByZXN1bHQgPSBtU3VyZmFjZVRleHR1cmUtPnJlcXVlc3RCdWZmZXIoYnVmLCAmZ2J1Zik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlQnVmZmVyOiBJU3VyZmFjZVRleHR1cmU6OnJlcXVlc3RCdWZmZXIgZmFpbGVkOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgfQotICAgICpidWZmZXIgPSBnYnVmLmdldCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpjYW5jZWxCdWZmZXIoYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZmZlcikgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpjYW5jZWxCdWZmZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIGludCBpID0gZ2V0U2xvdEZyb21CdWZmZXJMb2NrZWQoYnVmZmVyKTsKLSAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIG1TdXJmYWNlVGV4dHVyZS0+Y2FuY2VsQnVmZmVyKGkpOwotICAgIHJldHVybiBPSzsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpnZXRTbG90RnJvbUJ1ZmZlckxvY2tlZCgKLSAgICAgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZmZlcikgY29uc3QgewotICAgIGJvb2wgZHVtcGVkU3RhdGUgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewotICAgICAgICAvLyBYWFg6IER1bXAgdGhlIHNsb3RzIHdoZW5ldmVyIHdlIGhpdCBhIE5VTEwgZW50cnkgd2hpbGUgc2VhcmNoaW5nIGZvcgotICAgICAgICAvLyBhIGJ1ZmZlci4KLSAgICAgICAgaWYgKG1TbG90c1tpXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIWR1bXBlZFN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImdldFNsb3RGcm9tQnVmZmVyTG9ja2VkOiBlbmNvdW50ZXJlZCBOVUxMIGJ1ZmZlciBpbiBzbG90ICVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJsb29raW5nIGZvciBidWZmZXIgJXAiLCBpLCBidWZmZXItPmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOVU1fQlVGRkVSX1NMT1RTOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TbG90c1tqXSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZ2V0U2xvdEZyb21CdWZmZXJMb2NrZWQ6ICAgJTAyZDogTlVMTCIsIGopOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImdldFNsb3RGcm9tQnVmZmVyTG9ja2VkOiAgICUwMmQ6ICVwIiwgaiwgbVNsb3RzW2pdLT5oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGR1bXBlZFN0YXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2xvdHNbaV0gIT0gTlVMTCAmJiBtU2xvdHNbaV0tPmhhbmRsZSA9PSBidWZmZXItPmhhbmRsZSkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR0UoImdldFNsb3RGcm9tQnVmZmVyTG9ja2VkOiB1bmtub3duIGJ1ZmZlcjogJXAiLCBidWZmZXItPmhhbmRsZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpsb2NrQnVmZmVyKGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZmZXIpIHsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OmxvY2tCdWZmZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBPSzsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpxdWV1ZUJ1ZmZlcihhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmZmVyKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OnF1ZXVlQnVmZmVyIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBpbnQ2NF90IHRpbWVzdGFtcDsKLSAgICBpZiAobVRpbWVzdGFtcCA9PSBOQVRJVkVfV0lORE9XX1RJTUVTVEFNUF9BVVRPKSB7Ci0gICAgICAgIHRpbWVzdGFtcCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICAgICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpxdWV1ZUJ1ZmZlciBtYWtpbmcgdXAgdGltZXN0YW1wOiAlLjJmIG1zIiwKLSAgICAgICAgICAgICB0aW1lc3RhbXAgLyAxMDAwMDAwLmYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRpbWVzdGFtcCA9IG1UaW1lc3RhbXA7Ci0gICAgfQotICAgIGludCBpID0gZ2V0U2xvdEZyb21CdWZmZXJMb2NrZWQoYnVmZmVyKTsKLSAgICBpZiAoaSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICAgIHN0YXR1c190IGVyciA9IG1TdXJmYWNlVGV4dHVyZS0+cXVldWVCdWZmZXIoaSwgdGltZXN0YW1wLAotICAgICAgICAgICAgJm1EZWZhdWx0V2lkdGgsICZtRGVmYXVsdEhlaWdodCwgJm1UcmFuc2Zvcm1IaW50KTsKLSAgICBpZiAoZXJyICE9IE9LKSAgewotICAgICAgICBBTE9HRSgicXVldWVCdWZmZXI6IGVycm9yIHF1ZXVpbmcgYnVmZmVyIHRvIFN1cmZhY2VUZXh0dXJlLCAlZCIsIGVycik7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6cXVlcnkoaW50IHdoYXQsIGludCogdmFsdWUpIGNvbnN0IHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6cXVlcnkiKTsKLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19GT1JNQVQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXFGb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgKnZhbHVlID0gbVJlcUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19RVUVVRVNfVE9fV0lORE9XX0NPTVBPU0VSOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zZXJTZXJ2aWNlOjpnZXRDb21wb3NlclNlcnZpY2UoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb3Nlci0+YXV0aGVudGljYXRlU3VyZmFjZVRleHR1cmUobVN1cmZhY2VUZXh0dXJlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEU6Ci0gICAgICAgICAgICAgICAgKnZhbHVlID0gTkFUSVZFX1dJTkRPV19TVVJGQUNFX1RFWFRVUkVfQ0xJRU5UOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19ERUZBVUxUX1dJRFRIOgotICAgICAgICAgICAgICAgICp2YWx1ZSA9IG1EZWZhdWx0V2lkdGg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0RFRkFVTFRfSEVJR0hUOgotICAgICAgICAgICAgICAgICp2YWx1ZSA9IG1EZWZhdWx0SGVpZ2h0OwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSElOVDoKLSAgICAgICAgICAgICAgICAqdmFsdWUgPSBtVHJhbnNmb3JtSGludDsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZS0+cXVlcnkod2hhdCwgdmFsdWUpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnBlcmZvcm0oaW50IG9wZXJhdGlvbiwgdmFfbGlzdCBhcmdzKQotewotICAgIGludCByZXMgPSBOT19FUlJPUjsKLSAgICBzd2l0Y2ggKG9wZXJhdGlvbikgewotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19DT05ORUNUOgotICAgICAgICAvLyBkZXByZWNhdGVkLiBtdXN0IHJldHVybiBOT19FUlJPUi4KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX0RJU0NPTk5FQ1Q6Ci0gICAgICAgIC8vIGRlcHJlY2F0ZWQuIG11c3QgcmV0dXJuIE5PX0VSUk9SLgotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX1VTQUdFOgotICAgICAgICByZXMgPSBkaXNwYXRjaFNldFVzYWdlKGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0NST1A6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0Q3JvcChhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJfQ09VTlQ6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0QnVmZmVyQ291bnQoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19HRU9NRVRSWToKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hTZXRCdWZmZXJzR2VvbWV0cnkoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19UUkFOU0ZPUk06Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoU2V0QnVmZmVyc1RyYW5zZm9ybShhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RJTUVTVEFNUDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hTZXRCdWZmZXJzVGltZXN0YW1wKGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfRElNRU5TSU9OUzoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hTZXRCdWZmZXJzRGltZW5zaW9ucyhhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0ZPUk1BVDoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hTZXRCdWZmZXJzRm9ybWF0KGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfTE9DSzoKLSAgICAgICAgcmVzID0gZGlzcGF0Y2hMb2NrKGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfVU5MT0NLX0FORF9QT1NUOgotICAgICAgICByZXMgPSBkaXNwYXRjaFVubG9ja0FuZFBvc3QoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfU0NBTElOR19NT0RFOgotICAgICAgICByZXMgPSBkaXNwYXRjaFNldFNjYWxpbmdNb2RlKGFyZ3MpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NPTk5FQ1Q6Ci0gICAgICAgIHJlcyA9IGRpc3BhdGNoQ29ubmVjdChhcmdzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9ESVNDT05ORUNUOgotICAgICAgICByZXMgPSBkaXNwYXRjaERpc2Nvbm5lY3QoYXJncyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlcyA9IE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNwYXRjaENvbm5lY3QodmFfbGlzdCBhcmdzKSB7Ci0gICAgaW50IGFwaSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIHJldHVybiBjb25uZWN0KGFwaSk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hEaXNjb25uZWN0KHZhX2xpc3QgYXJncykgewotICAgIGludCBhcGkgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gZGlzY29ubmVjdChhcGkpOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmRpc3BhdGNoU2V0VXNhZ2UodmFfbGlzdCBhcmdzKSB7Ci0gICAgaW50IHVzYWdlID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIHNldFVzYWdlKHVzYWdlKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNwYXRjaFNldENyb3AodmFfbGlzdCBhcmdzKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IGNvbnN0KiByZWN0ID0gdmFfYXJnKGFyZ3MsIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCopOwotICAgIHJldHVybiBzZXRDcm9wKHJlaW50ZXJwcmV0X2Nhc3Q8UmVjdCBjb25zdCo+KHJlY3QpKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNwYXRjaFNldEJ1ZmZlckNvdW50KHZhX2xpc3QgYXJncykgewotICAgIHNpemVfdCBidWZmZXJDb3VudCA9IHZhX2FyZyhhcmdzLCBzaXplX3QpOwotICAgIHJldHVybiBzZXRCdWZmZXJDb3VudChidWZmZXJDb3VudCk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRCdWZmZXJzR2VvbWV0cnkodmFfbGlzdCBhcmdzKSB7Ci0gICAgaW50IHcgPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICBpbnQgaCA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIGludCBmID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgaW50IGVyciA9IHNldEJ1ZmZlcnNEaW1lbnNpb25zKHcsIGgpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICByZXR1cm4gc2V0QnVmZmVyc0Zvcm1hdChmKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNwYXRjaFNldEJ1ZmZlcnNEaW1lbnNpb25zKHZhX2xpc3QgYXJncykgewotICAgIGludCB3ID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgaW50IGggPSB2YV9hcmcoYXJncywgaW50KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc0RpbWVuc2lvbnModywgaCk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRCdWZmZXJzRm9ybWF0KHZhX2xpc3QgYXJncykgewotICAgIGludCBmID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIHNldEJ1ZmZlcnNGb3JtYXQoZik7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRTY2FsaW5nTW9kZSh2YV9saXN0IGFyZ3MpIHsKLSAgICBpbnQgbSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIHJldHVybiBzZXRTY2FsaW5nTW9kZShtKTsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNwYXRjaFNldEJ1ZmZlcnNUcmFuc2Zvcm0odmFfbGlzdCBhcmdzKSB7Ci0gICAgaW50IHRyYW5zZm9ybSA9IHZhX2FyZyhhcmdzLCBpbnQpOwotICAgIHJldHVybiBzZXRCdWZmZXJzVHJhbnNmb3JtKHRyYW5zZm9ybSk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hTZXRCdWZmZXJzVGltZXN0YW1wKHZhX2xpc3QgYXJncykgewotICAgIGludDY0X3QgdGltZXN0YW1wID0gdmFfYXJnKGFyZ3MsIGludDY0X3QpOwotICAgIHJldHVybiBzZXRCdWZmZXJzVGltZXN0YW1wKHRpbWVzdGFtcCk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hMb2NrKHZhX2xpc3QgYXJncykgewotICAgIEFOYXRpdmVXaW5kb3dfQnVmZmVyKiBvdXRCdWZmZXIgPSB2YV9hcmcoYXJncywgQU5hdGl2ZVdpbmRvd19CdWZmZXIqKTsKLSAgICBBUmVjdCogaW5PdXREaXJ0eUJvdW5kcyA9IHZhX2FyZyhhcmdzLCBBUmVjdCopOwotICAgIHJldHVybiBsb2NrKG91dEJ1ZmZlciwgaW5PdXREaXJ0eUJvdW5kcyk7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzcGF0Y2hVbmxvY2tBbmRQb3N0KHZhX2xpc3QgYXJncykgewotICAgIHJldHVybiB1bmxvY2tBbmRQb3N0KCk7Ci19Ci0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpjb25uZWN0KGludCBhcGkpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6Y29ubmVjdCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaW50IGVyciA9IG1TdXJmYWNlVGV4dHVyZS0+Y29ubmVjdChhcGksCi0gICAgICAgICAgICAmbURlZmF1bHRXaWR0aCwgJm1EZWZhdWx0SGVpZ2h0LCAmbVRyYW5zZm9ybUhpbnQpOwotICAgIGlmICghZXJyICYmIGFwaSA9PSBOQVRJVkVfV0lORE9XX0FQSV9DUFUpIHsKLSAgICAgICAgbUNvbm5lY3RlZFRvQ3B1ID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpkaXNjb25uZWN0KGludCBhcGkpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6ZGlzY29ubmVjdCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgZnJlZUFsbEJ1ZmZlcnMoKTsKLSAgICBpbnQgZXJyID0gbVN1cmZhY2VUZXh0dXJlLT5kaXNjb25uZWN0KGFwaSk7Ci0gICAgaWYgKCFlcnIpIHsKLSAgICAgICAgbVJlcUZvcm1hdCA9IDA7Ci0gICAgICAgIG1SZXFXaWR0aCA9IDA7Ci0gICAgICAgIG1SZXFIZWlnaHQgPSAwOwotICAgICAgICBtUmVxVXNhZ2UgPSAwOwotICAgICAgICBpZiAoYXBpID09IE5BVElWRV9XSU5ET1dfQVBJX0NQVSkgewotICAgICAgICAgICAgbUNvbm5lY3RlZFRvQ3B1ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotaW50IFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRVc2FnZSh1aW50MzJfdCByZXFVc2FnZSkKLXsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldFVzYWdlIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBtUmVxVXNhZ2UgPSByZXFVc2FnZTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0Q3JvcChSZWN0IGNvbnN0KiByZWN0KQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRDcm9wIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIFJlY3QgcmVhbFJlY3Q7Ci0gICAgaWYgKHJlY3QgPT0gTlVMTCB8fCByZWN0LT5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVhbFJlY3QgPSBSZWN0KDAsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlYWxSZWN0ID0gKnJlY3Q7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbVN1cmZhY2VUZXh0dXJlLT5zZXRDcm9wKCpyZWN0KTsKLSAgICBBTE9HRV9JRihlcnIsICJJU3VyZmFjZVRleHR1cmU6OnNldENyb3AoLi4uKSByZXR1cm5lZCAlcyIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyQ291bnQoaW50IGJ1ZmZlckNvdW50KQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRCdWZmZXJDb3VudCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtU3VyZmFjZVRleHR1cmUtPnNldEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKLSAgICBBTE9HRV9JRihlcnIsICJJU3VyZmFjZVRleHR1cmU6OnNldEJ1ZmZlckNvdW50KCVkKSByZXR1cm5lZCAlcyIsCi0gICAgICAgICAgICBidWZmZXJDb3VudCwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBmcmVlQWxsQnVmZmVycygpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc0RpbWVuc2lvbnMoaW50IHcsIGludCBoKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRCdWZmZXJzRGltZW5zaW9ucyIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAodzwwIHx8IGg8MCkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmICgodyAmJiAhaCkgfHwgKCF3ICYmIGgpKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgbVJlcVdpZHRoID0gdzsKLSAgICBtUmVxSGVpZ2h0ID0gaDsKLQotICAgIHN0YXR1c190IGVyciA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0Q3JvcChSZWN0KDAsIDApKTsKLSAgICBBTE9HRV9JRihlcnIsICJJU3VyZmFjZVRleHR1cmU6OnNldENyb3AoLi4uKSByZXR1cm5lZCAlcyIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc0Zvcm1hdChpbnQgZm9ybWF0KQotewotICAgIEFMT0dWKCJTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc0Zvcm1hdCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAoZm9ybWF0PDApCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBtUmVxRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldFNjYWxpbmdNb2RlKGludCBtb2RlKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRTY2FsaW5nTW9kZSglZCkiLCBtb2RlKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIC8vIG1vZGUgaXMgdmFsaWRhdGVkIG9uIHRoZSBzZXJ2ZXIKLSAgICBzdGF0dXNfdCBlcnIgPSBtU3VyZmFjZVRleHR1cmUtPnNldFNjYWxpbmdNb2RlKG1vZGUpOwotICAgIEFMT0dFX0lGKGVyciwgIklTdXJmYWNlVGV4dHVyZTo6c2V0U2NhbGluZ01vZGUoJWQpIHJldHVybmVkICVzIiwKLSAgICAgICAgICAgIG1vZGUsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc1RyYW5zZm9ybShpbnQgdHJhbnNmb3JtKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIlN1cmZhY2VUZXh0dXJlQ2xpZW50OjpzZXRCdWZmZXJzVHJhbnNmb3JtIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtU3VyZmFjZVRleHR1cmUtPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLWludCBTdXJmYWNlVGV4dHVyZUNsaWVudDo6c2V0QnVmZmVyc1RpbWVzdGFtcChpbnQ2NF90IHRpbWVzdGFtcCkKLXsKLSAgICBBTE9HVigiU3VyZmFjZVRleHR1cmVDbGllbnQ6OnNldEJ1ZmZlcnNUaW1lc3RhbXAiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1UaW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFN1cmZhY2VUZXh0dXJlQ2xpZW50OjpmcmVlQWxsQnVmZmVycygpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7IGkrKykgewotICAgICAgICBtU2xvdHNbaV0gPSAwOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdGhlIGxvY2svdW5sb2NrIEFQSXMgbXVzdCBiZSB1c2VkIGZyb20gdGhlIHNhbWUgdGhyZWFkCi0KLXN0YXRpYyBzdGF0dXNfdCBjb3B5Qmx0KAotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZHN0LAotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgc3JjLAotICAgICAgICBjb25zdCBSZWdpb24mIHJlZykKLXsKLSAgICAvLyBzcmMgYW5kIGRzdCB3aXRoLCBoZWlnaHQgYW5kIGZvcm1hdCBtdXN0IGJlIGlkZW50aWNhbC4gbm8gdmVyaWZpY2F0aW9uCi0gICAgLy8gaXMgZG9uZSBoZXJlLgotICAgIHN0YXR1c190IGVycjsKLSAgICB1aW50OF90IGNvbnN0ICogc3JjX2JpdHMgPSBOVUxMOwotICAgIGVyciA9IHNyYy0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4sIHJlZy5ib3VuZHMoKSwgKHZvaWQqKikmc3JjX2JpdHMpOwotICAgIEFMT0dFX0lGKGVyciwgImVycm9yIGxvY2tpbmcgc3JjIGJ1ZmZlciAlcyIsIHN0cmVycm9yKC1lcnIpKTsKLQotICAgIHVpbnQ4X3QqIGRzdF9iaXRzID0gTlVMTDsKLSAgICBlcnIgPSBkc3QtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgcmVnLmJvdW5kcygpLCAodm9pZCoqKSZkc3RfYml0cyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZXJyb3IgbG9ja2luZyBkc3QgYnVmZmVyICVzIiwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBoZWFkKHJlZy5iZWdpbigpKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIHRhaWwocmVnLmVuZCgpKTsKLSAgICBpZiAoaGVhZCAhPSB0YWlsICYmIHNyY19iaXRzICYmIGRzdF9iaXRzKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBicHAgPSBieXRlc1BlclBpeGVsKHNyYy0+Zm9ybWF0KTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGRicHIgPSBkc3QtPnN0cmlkZSAqIGJwcDsKLSAgICAgICAgY29uc3Qgc2l6ZV90IHNicHIgPSBzcmMtPnN0cmlkZSAqIGJwcDsKLQotICAgICAgICB3aGlsZSAoaGVhZCAhPSB0YWlsKSB7Ci0gICAgICAgICAgICBjb25zdCBSZWN0JiByKCpoZWFkKyspOwotICAgICAgICAgICAgc3NpemVfdCBoID0gci5oZWlnaHQoKTsKLSAgICAgICAgICAgIGlmIChoIDw9IDApIGNvbnRpbnVlOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSByLndpZHRoKCkgKiBicHA7Ci0gICAgICAgICAgICB1aW50OF90IGNvbnN0ICogcyA9IHNyY19iaXRzICsgKHIubGVmdCArIHNyYy0+c3RyaWRlICogci50b3ApICogYnBwOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAqIGQgPSBkc3RfYml0cyArIChyLmxlZnQgKyBkc3QtPnN0cmlkZSAqIHIudG9wKSAqIGJwcDsKLSAgICAgICAgICAgIGlmIChkYnByPT1zYnByICYmIHNpemU9PXNicHIpIHsKLSAgICAgICAgICAgICAgICBzaXplICo9IGg7Ci0gICAgICAgICAgICAgICAgaCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGQsIHMsIHNpemUpOwotICAgICAgICAgICAgICAgIGQgKz0gZGJwcjsKLSAgICAgICAgICAgICAgICBzICs9IHNicHI7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWggPiAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzcmNfYml0cykKLSAgICAgICAgc3JjLT51bmxvY2soKTsKLQotICAgIGlmIChkc3RfYml0cykKLSAgICAgICAgZHN0LT51bmxvY2soKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgU3VyZmFjZVRleHR1cmVDbGllbnQ6OmxvY2soCi0gICAgICAgIEFOYXRpdmVXaW5kb3dfQnVmZmVyKiBvdXRCdWZmZXIsIEFSZWN0KiBpbk91dERpcnR5Qm91bmRzKQotewotICAgIGlmIChtTG9ja2VkQnVmZmVyICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlN1cmZhY2U6OmxvY2sgZmFpbGVkLCBhbHJlYWR5IGxvY2tlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKCFtQ29ubmVjdGVkVG9DcHUpIHsKLSAgICAgICAgaW50IGVyciA9IFN1cmZhY2VUZXh0dXJlQ2xpZW50Ojpjb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gd2UncmUgaW50ZW5kaW5nIHRvIGRvIHNvZnR3YXJlIHJlbmRlcmluZyBmcm9tIHRoaXMgcG9pbnQKLSAgICAgICAgc2V0VXNhZ2UoR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7Ci0gICAgfQotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogb3V0OwotICAgIHN0YXR1c190IGVyciA9IGRlcXVldWVCdWZmZXIoJm91dCk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZGVxdWV1ZUJ1ZmZlciBmYWlsZWQgKCVzKSIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJhY2tCdWZmZXIoR3JhcGhpY0J1ZmZlcjo6Z2V0U2VsZihvdXQpKTsKLSAgICAgICAgZXJyID0gbG9ja0J1ZmZlcihiYWNrQnVmZmVyLmdldCgpKTsKLSAgICAgICAgQUxPR0VfSUYoZXJyLCAibG9ja0J1ZmZlciAoaGFuZGxlPSVwKSBmYWlsZWQgKCVzKSIsCi0gICAgICAgICAgICAgICAgYmFja0J1ZmZlci0+aGFuZGxlLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGNvbnN0IFJlY3QgYm91bmRzKGJhY2tCdWZmZXItPndpZHRoLCBiYWNrQnVmZmVyLT5oZWlnaHQpOwotCi0gICAgICAgICAgICBSZWdpb24gbmV3RGlydHlSZWdpb247Ci0gICAgICAgICAgICBpZiAoaW5PdXREaXJ0eUJvdW5kcykgewotICAgICAgICAgICAgICAgIG5ld0RpcnR5UmVnaW9uLnNldChzdGF0aWNfY2FzdDxSZWN0IGNvbnN0Jj4oKmluT3V0RGlydHlCb3VuZHMpKTsKLSAgICAgICAgICAgICAgICBuZXdEaXJ0eVJlZ2lvbi5hbmRTZWxmKGJvdW5kcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld0RpcnR5UmVnaW9uLnNldChib3VuZHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IGlmIHdlIGNhbiBjb3B5IHRoZSBmcm9udGJ1ZmZlciBiYWNrCi0gICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZnJvbnRCdWZmZXIobVBvc3RlZEJ1ZmZlcik7Ci0gICAgICAgICAgICBjb25zdCBib29sIGNhbkNvcHlCYWNrID0gKGZyb250QnVmZmVyICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgYmFja0J1ZmZlci0+d2lkdGggID09IGZyb250QnVmZmVyLT53aWR0aCAmJgotICAgICAgICAgICAgICAgICAgICBiYWNrQnVmZmVyLT5oZWlnaHQgPT0gZnJvbnRCdWZmZXItPmhlaWdodCAmJgotICAgICAgICAgICAgICAgICAgICBiYWNrQnVmZmVyLT5mb3JtYXQgPT0gZnJvbnRCdWZmZXItPmZvcm1hdCk7Ci0KLSAgICAgICAgICAgIGlmIChjYW5Db3B5QmFjaykgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgdGhlIGFyZWEgdGhhdCBpcyBpbnZhbGlkIGFuZCBub3QgcmVwYWludGVkIHRoaXMgcm91bmQKLSAgICAgICAgICAgICAgICBjb25zdCBSZWdpb24gY29weWJhY2sobU9sZERpcnR5UmVnaW9uLnN1YnRyYWN0KG5ld0RpcnR5UmVnaW9uKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb3B5YmFjay5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIGNvcHlCbHQoYmFja0J1ZmZlciwgZnJvbnRCdWZmZXIsIGNvcHliYWNrKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgd2UgY2FuJ3QgY29weS1iYWNrIGFueXRoaW5nLCBtb2RpZnkgdGhlIHVzZXIncyBkaXJ0eQotICAgICAgICAgICAgICAgIC8vIHJlZ2lvbiB0byBtYWtlIHN1cmUgdGhleSByZWRyYXcgdGhlIHdob2xlIGJ1ZmZlcgotICAgICAgICAgICAgICAgIG5ld0RpcnR5UmVnaW9uLnNldChib3VuZHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBhcmUgb2YgdGhlIGJ1ZmZlciB0aGF0IGlzICJjbGVhbiIKLSAgICAgICAgICAgIC8vIChpZTogdGhhdCB3aWxsIGJlIHJlZHJhd24pCi0gICAgICAgICAgICBtT2xkRGlydHlSZWdpb24gPSBuZXdEaXJ0eVJlZ2lvbjsKLQotICAgICAgICAgICAgaWYgKGluT3V0RGlydHlCb3VuZHMpIHsKLSAgICAgICAgICAgICAgICAqaW5PdXREaXJ0eUJvdW5kcyA9IG5ld0RpcnR5UmVnaW9uLmdldEJvdW5kcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkKiB2YWRkcjsKLSAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGJhY2tCdWZmZXItPmxvY2soCi0gICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgICAgICAgICAgICAgIG5ld0RpcnR5UmVnaW9uLmJvdW5kcygpLCAmdmFkZHIpOwotCi0gICAgICAgICAgICBBTE9HV19JRihyZXMsICJmYWlsZWQgbG9ja2luZyBidWZmZXIgKGhhbmRsZSA9ICVwKSIsCi0gICAgICAgICAgICAgICAgICAgIGJhY2tCdWZmZXItPmhhbmRsZSk7Ci0KLSAgICAgICAgICAgIG1Mb2NrZWRCdWZmZXIgPSBiYWNrQnVmZmVyOwotICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCAgPSBiYWNrQnVmZmVyLT53aWR0aDsKLSAgICAgICAgICAgIG91dEJ1ZmZlci0+aGVpZ2h0ID0gYmFja0J1ZmZlci0+aGVpZ2h0OwotICAgICAgICAgICAgb3V0QnVmZmVyLT5zdHJpZGUgPSBiYWNrQnVmZmVyLT5zdHJpZGU7Ci0gICAgICAgICAgICBvdXRCdWZmZXItPmZvcm1hdCA9IGJhY2tCdWZmZXItPmZvcm1hdDsKLSAgICAgICAgICAgIG91dEJ1ZmZlci0+Yml0cyAgID0gdmFkZHI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZVRleHR1cmVDbGllbnQ6OnVubG9ja0FuZFBvc3QoKQotewotICAgIGlmIChtTG9ja2VkQnVmZmVyID09IDApIHsKLSAgICAgICAgQUxPR0UoIlN1cmZhY2U6OnVubG9ja0FuZFBvc3QgZmFpbGVkLCBubyBsb2NrZWQgYnVmZmVyIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtTG9ja2VkQnVmZmVyLT51bmxvY2soKTsKLSAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdW5sb2NraW5nIGJ1ZmZlciAoJXApIiwgbUxvY2tlZEJ1ZmZlci0+aGFuZGxlKTsKLQotICAgIGVyciA9IHF1ZXVlQnVmZmVyKG1Mb2NrZWRCdWZmZXIuZ2V0KCkpOwotICAgIEFMT0dFX0lGKGVyciwgInF1ZXVlQnVmZmVyIChoYW5kbGU9JXApIGZhaWxlZCAoJXMpIiwKLSAgICAgICAgICAgIG1Mb2NrZWRCdWZmZXItPmhhbmRsZSwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgbVBvc3RlZEJ1ZmZlciA9IG1Mb2NrZWRCdWZmZXI7Ci0gICAgbUxvY2tlZEJ1ZmZlciA9IDA7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJzL2d1aS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWFjMTMzLi4wMDAwMDAwCi0tLSBhL2xpYnMvZ3VpL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzLAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IFN1cmZhY2VUZXh0dXJlX3Rlc3QKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBTdXJmYWNlX3Rlc3QuY3BwIFwKLSAgICBTdXJmYWNlVGV4dHVyZUNsaWVudF90ZXN0LmNwcCBcCi0gICAgU3VyZmFjZVRleHR1cmVfdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MiBcCi0JbGliYW5kcm9pZCBcCi0JbGliYmluZGVyIFwKLQlsaWJjdXRpbHMgXAotCWxpYmd1aSBcCi0JbGlic3RscG9ydCBcCi0JbGlidWkgXAotCWxpYnV0aWxzIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgYmlvbmljIFwKLSAgICBiaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2d0ZXN0L2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCi0KLSMgQnVpbGQgdGhlIGJpbmFyeSB0byAkKFRBUkdFVF9PVVRfREFUQV9OQVRJVkVfVEVTVFMpLyQoTE9DQUxfTU9EVUxFKQotIyB0byBpbnRlZ3JhdGUgd2l0aCBhdXRvLXRlc3QgZnJhbWV3b3JrLgotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi0jIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKLSMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KLWlmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlQ2xpZW50X3Rlc3QuY3BwIGIvbGlicy9ndWkvdGVzdHMvU3VyZmFjZVRleHR1cmVDbGllbnRfdGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTNjOTguLjAwMDAwMDAKLS0tIGEvbGlicy9ndWkvdGVzdHMvU3VyZmFjZVRleHR1cmVDbGllbnRfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZVRleHR1cmVDbGllbnQuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0KCk6Ci0gICAgICAgICAgICBtRWdsRGlzcGxheShFR0xfTk9fRElTUExBWSksCi0gICAgICAgICAgICBtRWdsU3VyZmFjZShFR0xfTk9fU1VSRkFDRSksCi0gICAgICAgICAgICBtRWdsQ29udGV4dChFR0xfTk9fQ09OVEVYVCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgbVNUID0gbmV3IFN1cmZhY2VUZXh0dXJlKDEyMyk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQobVNUKTsKLSAgICAgICAgbUFOVyA9IG1TVEM7Ci0KLSAgICAgICAgLy8gV2UgbmVlZCBhIHZhbGlkIEdMIGNvbnRleHQgc28gd2UgY2FuIHRlc3QgdXBkYXRlVGV4SW1hZ2UoKQotICAgICAgICAvLyBUaGlzIGluaXRpYWxpemVzIEVHTCBhbmQgY3JlYXRlIGEgZHVtbXkgR0wgY29udGV4dCB3aXRoIGEKLSAgICAgICAgLy8gcGJ1ZmZlciByZW5kZXIgdGFyZ2V0LgotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fRElTUExBWSwgbUVnbERpc3BsYXkpOwotCi0gICAgICAgIEVHTGludCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbjsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsSW5pdGlhbGl6ZShtRWdsRGlzcGxheSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbikpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIEVHTENvbmZpZyBteUNvbmZpZzsKLSAgICAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAwOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGdldENvbmZpZ0F0dHJpYnMoKSwKLSAgICAgICAgICAgICAgICAmbXlDb25maWcsIDEsICZudW1Db25maWdzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgRUdMaW50IHBidWZmZXJBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfV0lEVEgsIDE2LAotICAgICAgICAgICAgRUdMX0hFSUdIVCwgMTYsCi0gICAgICAgICAgICBFR0xfTk9ORSB9OwotICAgICAgICBtRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKG1FZ2xEaXNwbGF5LCBteUNvbmZpZywgcGJ1ZmZlckF0dHJpYnMpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX1NVUkZBQ0UsIG1FZ2xTdXJmYWNlKTsKLQotICAgICAgICBtRWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQobUVnbERpc3BsYXksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgMCk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUVnbENvbnRleHQpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsIG1FZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBtU1QuY2xlYXIoKTsKLSAgICAgICAgbVNUQy5jbGVhcigpOwotICAgICAgICBtQU5XLmNsZWFyKCk7Ci0KLSAgICAgICAgZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOwotICAgICAgICBlZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOwotICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UpOwotICAgICAgICBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgRUdMaW50IGNvbnN0KiBnZXRDb25maWdBdHRyaWJzKCkgewotICAgICAgICBzdGF0aWMgRUdMaW50IHNEZWZhdWx0Q29uZmlnQXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1BCVUZGRVJfQklULAotICAgICAgICAgICAgRUdMX05PTkUKLSAgICAgICAgfTsKLQotICAgICAgICByZXR1cm4gc0RlZmF1bHRDb25maWdBdHRyaWJzOwotICAgIH0KLQotICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBtU1Q7Ci0gICAgc3A8U3VyZmFjZVRleHR1cmVDbGllbnQ+IG1TVEM7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUFOVzsKLQotICAgIEVHTERpc3BsYXkgbUVnbERpc3BsYXk7Ci0gICAgRUdMU3VyZmFjZSBtRWdsU3VyZmFjZTsKLSAgICBFR0xDb250ZXh0IG1FZ2xDb250ZXh0OwotfTsKLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgR2V0SVN1cmZhY2VUZXh0dXJlSXNOb3ROdWxsKSB7Ci0gICAgc3A8SVN1cmZhY2VUZXh0dXJlPiBpc3QobVNUQy0+Z2V0SVN1cmZhY2VUZXh0dXJlKCkpOwotICAgIEFTU0VSVF9UUlVFKGlzdCAhPSBOVUxMKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgUXVldWVzVG9XaW5kb3dDb21wb3NpdG9ySXNGYWxzZSkgewotICAgIGludCByZXN1bHQgPSAtMTIzOwotICAgIGludCBlcnIgPSBtQU5XLT5xdWVyeShtQU5XLmdldCgpLCBOQVRJVkVfV0lORE9XX1FVRVVFU19UT19XSU5ET1dfQ09NUE9TRVIsCi0gICAgICAgICAgICAmcmVzdWx0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgRVhQRUNUX0VRKDAsIHJlc3VsdCk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIENvbmNyZXRlVHlwZUlzU3VyZmFjZVRleHR1cmVDbGllbnQpIHsKLSAgICBpbnQgcmVzdWx0ID0gLTEyMzsKLSAgICBpbnQgZXJyID0gbUFOVy0+cXVlcnkobUFOVy5nZXQoKSwgTkFUSVZFX1dJTkRPV19DT05DUkVURV9UWVBFLCAmcmVzdWx0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIGVycik7Ci0gICAgRVhQRUNUX0VRKE5BVElWRV9XSU5ET1dfU1VSRkFDRV9URVhUVVJFX0NMSUVOVCwgcmVzdWx0KTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgRWdsQ3JlYXRlV2luZG93U3VyZmFjZVN1Y2NlZWRzKSB7Ci0gICAgRUdMRGlzcGxheSBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX05FKEVHTF9OT19ESVNQTEFZLCBkcHkpOwotCi0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIEVYUEVDVF9UUlVFKGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsKLSAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDA7Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgRUdMX1JFRF9TSVpFLCA4LAotICAgICAgICBFR0xfR1JFRU5fU0laRSwgOCwKLSAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgRUdMX0FMUEhBX1NJWkUsIDgsCi0gICAgICAgIEVHTF9ERVBUSF9TSVpFLCAxNiwKLSAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgOCwKLSAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFWFBFQ1RfVFJVRShlZ2xDaG9vc2VDb25maWcoZHB5LCBjb25maWdBdHRyaWJzLCAmbXlDb25maWcsIDEsCi0gICAgICAgICAgICAmbnVtQ29uZmlncykpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBFR0xTdXJmYWNlIGVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIG1BTlcuZ2V0KCksCi0gICAgICAgICAgICBOVUxMKTsKLSAgICBFWFBFQ1RfTkUoRUdMX05PX1NVUkZBQ0UsIGVnbFN1cmZhY2UpOwotICAgIEVYUEVDVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgQnVmZmVyR2VvbWV0cnlJbnZhbGlkU2l6ZXNGYWlsKSB7Ci0gICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIC0xLCAgMCwgIDApKTsKLSAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgIDAsIC0xLCAgMCkpOwotICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAgMCwgIDAsIC0xKSk7Ci0gICAgRVhQRUNUX0dUKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIC0xLCAtMSwgIDApKTsKLSAgICBFWFBFQ1RfR1QoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgIDAsICA4LCAgMCkpOwotICAgIEVYUEVDVF9HVChPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAgOCwgIDAsICAwKSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIERlZmF1bHRHZW9tZXRyeVZhbHVlcykgewotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9FUSgxLCBidWYtPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMSwgYnVmLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCQV84ODg4LCBidWYtPmZvcm1hdCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5Q2FuQmVTZXQpIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDE2LCA4LCBQSVhFTF9GT1JNQVRfUkdCXzU2NSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7Ci0gICAgRVhQRUNUX0VRKDE2LCBidWYtPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoOCwgYnVmLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShQSVhFTF9GT1JNQVRfUkdCXzU2NSwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBCdWZmZXJHZW9tZXRyeURlZmF1bHRTaXplU2V0Rm9ybWF0KSB7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAwLCAwLCBQSVhFTF9GT1JNQVRfUkdCXzU2NSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSgxLCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JfNTY1LCBidWYtPmZvcm1hdCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIEJ1ZmZlckdlb21ldHJ5U2V0U2l6ZURlZmF1bHRGb3JtYXQpIHsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDE2LCA4LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSg4LCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIGJ1Zi0+Zm9ybWF0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWYpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgQnVmZmVyR2VvbWV0cnlTaXplQ2FuQmVVbnNldCkgewotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZjsKLSAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgMTYsIDgsIDApKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9FUSgxNiwgYnVmLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDgsIGJ1Zi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAwLCAwLCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKLSAgICBFWFBFQ1RfRVEoMSwgYnVmLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1Zi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBCdWZmZXJHZW9tZXRyeVNpemVDYW5CZUNoYW5nZWRXaXRob3V0Rm9ybWF0KSB7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmOwotICAgIEVYUEVDVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLCAwLCAwLCBQSVhFTF9GT1JNQVRfUkdCXzU2NSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSgxLCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JfNTY1LCBidWYtPmZvcm1hdCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1BTlcuZ2V0KCksIDE2LCA4LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWYpKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1Zi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSg4LCBidWYtPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKFBJWEVMX0ZPUk1BVF9SR0JfNTY1LCBidWYtPmZvcm1hdCk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmKSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIFN1cmZhY2VUZXh0dXJlU2V0RGVmYXVsdFNpemUpIHsKLSAgICBzcDxTdXJmYWNlVGV4dHVyZT4gc3QobVNUKTsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWY7Ci0gICAgRVhQRUNUX0VRKE9LLCBzdC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIDgpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9FUSgxNiwgYnVmLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDgsIGJ1Zi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgYnVmLT5mb3JtYXQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZikpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVNldERlZmF1bHRTaXplQWZ0ZXJEZXF1ZXVlKSB7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmWzJdOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlswXSwgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoMTYsIDgpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlswXSwgYnVmWzFdKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1ZlswXS0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSgxNiwgYnVmWzFdLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKDgsIGJ1ZlswXS0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoOCwgYnVmWzFdLT5oZWlnaHQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVNldERlZmF1bHRTaXplVnNHZW9tZXRyeSkgewotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZlsyXTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtQU5XLmdldCgpLCA0KSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnNldERlZmF1bHRCdWZmZXJTaXplKDE2LCA4KSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX0VRKDE2LCBidWZbMF0tPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMTYsIGJ1ZlsxXS0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSg4LCBidWZbMF0tPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKDgsIGJ1ZlsxXS0+aGVpZ2h0KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgMTIsIDI0LCAwKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX0VRKDEyLCBidWZbMF0tPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEoMTIsIGJ1ZlsxXS0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSgyNCwgYnVmWzBdLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUSgyNCwgYnVmWzFdLT5oZWlnaHQpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+Y2FuY2VsQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVRvb01hbnlVcGRhdGVUZXhJbWFnZSkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZShmYWxzZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLQotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLQotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVN5bmNNb2RlU2xvd1JldGlyZSkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzJdLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlswXSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzFdKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVN5bmNNb2RlRmFzdFJldGlyZSkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMV0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzJdLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMl0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMl0pOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBTdXJmYWNlVGV4dHVyZVN5bmNNb2RlRFFRUikgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlswXSkpOwotICAgIEVYUEVDVF9FUShPSywgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLSAgICBFWFBFQ1RfRVEobVNULT5nZXRDdXJyZW50QnVmZmVyKCkuZ2V0KCksIGJ1ZlswXSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMV0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgRVhQRUNUX0VRKG1TVC0+Z2V0Q3VycmVudEJ1ZmZlcigpLmdldCgpLCBidWZbMV0pOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzFdLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzJdKTsKLX0KLQotLy8gWFhYOiBXZSBjdXJyZW50bHkgaGF2ZSBubyBoYXJkd2FyZSB0aGF0IHByb3Blcmx5IGhhbmRsZXMgZGVxdWV1aW5nIHRoZQotLy8gYnVmZmVyIHRoYXQgaXMgY3VycmVudGx5IGJvdW5kIHRvIHRoZSB0ZXh0dXJlLgotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgRElTQUJMRURfU3VyZmFjZVRleHR1cmVTeW5jTW9kZURlcXVldWVDdXJyZW50KSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZlszXTsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogZmlyc3RCdWY7Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmZmlyc3RCdWYpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGZpcnN0QnVmKSk7Ci0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgZmlyc3RCdWYpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMl0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsyXSkpOwotICAgIEVYUEVDVF9ORShidWZbMF0sIGJ1ZlsxXSk7Ci0gICAgRVhQRUNUX05FKGJ1ZlsxXSwgYnVmWzJdKTsKLSAgICBFWFBFQ1RfTkUoYnVmWzJdLCBidWZbMF0pOwotICAgIEVYUEVDVF9FUShmaXJzdEJ1ZiwgYnVmWzJdKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgU3VyZmFjZVRleHR1cmVTeW5jTW9kZU1pblVuZGVxdWV1ZWQpIHsKLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYnVmWzNdOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDMpKTsKLQotICAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGRlcXVldWUgYWxsIHRoZSBidWZmZXJzIGJlZm9yZSB3ZSd2ZSBxdWV1ZWQgbUFOV3kuCi0gICAgRVhQRUNUX0VRKE9LLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZidWZbMF0pKTsKLSAgICBFWFBFQ1RfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEVYUEVDVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzJdKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmNhbmNlbEJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMl0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1ZlsxXSkpOwotCi0gICAgRVhQRUNUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIEVYUEVDVF9FUShtU1QtPmdldEN1cnJlbnRCdWZmZXIoKS5nZXQoKSwgYnVmWzFdKTsKLQotICAgIEVYUEVDVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzJdKSk7Ci0KLSAgICAvLyBPbmNlIHdlJ3ZlIHF1ZXVlZCBhIGJ1ZmZlciwgaG93ZXZlciB3ZSBzaG91bGQgbm90IGJlIGFibGUgdG8gZGVxdWV1ZSBtb3JlCi0gICAgLy8gdGhhbiAoYnVmZmVyLWNvdW50IC0gTUlOX1VOREVRVUVVRURfQlVGRkVSUyksIHdoaWNoIGlzIDIgaW4gdGhpcyBjYXNlLgotICAgIEVYUEVDVF9FUSgtRUJVU1ksIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5jYW5jZWxCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzJdKSk7Ci19Ci0KLS8vIFhYWDogVGhpcyBpcyBub3QgZXhwZWN0ZWQgdG8gcGFzcyB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGhhY2tzIGFyZSByZW1vdmVkCi0vLyBmcm9tIHRoZSBTdXJmYWNlVGV4dHVyZSBjbGFzcy4KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIERJU0FCTEVEX1N1cmZhY2VUZXh0dXJlU3luY01vZGVXYWl0UmV0aXJlKSB7Ci0gICAgY2xhc3MgTXlUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICAgICAgc3A8U3VyZmFjZVRleHR1cmU+IG1TVDsKLSAgICAgICAgRUdMQ29udGV4dCBjdHg7Ci0gICAgICAgIEVHTFN1cmZhY2Ugc3VyOwotICAgICAgICBFR0xEaXNwbGF5IGRweTsKLSAgICAgICAgYm9vbCBtQnVmZmVyUmV0aXJlZDsKLSAgICAgICAgTXV0ZXggbUxvY2s7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCkgewotICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXIsIHN1ciwgY3R4KTsKLSAgICAgICAgICAgIHVzbGVlcCgyMDAwMCk7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgICAgICAgICAgbUJ1ZmZlclJldGlyZWQgPSB0cnVlOwotICAgICAgICAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIHB1YmxpYzoKLSAgICAgICAgTXlUaHJlYWQoY29uc3Qgc3A8U3VyZmFjZVRleHR1cmU+JiBtU1QpCi0gICAgICAgICAgICA6IG1TVChtU1QpLCBtQnVmZmVyUmV0aXJlZChmYWxzZSkgewotICAgICAgICAgICAgY3R4ID0gZWdsR2V0Q3VycmVudENvbnRleHQoKTsKLSAgICAgICAgICAgIHN1ciA9IGVnbEdldEN1cnJlbnRTdXJmYWNlKEVHTF9EUkFXKTsKLSAgICAgICAgICAgIGRweSA9IGVnbEdldEN1cnJlbnREaXNwbGF5KCk7Ci0gICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChkcHksIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX0NPTlRFWFQpOwotICAgICAgICB9Ci0gICAgICAgIH5NeVRocmVhZCgpIHsKLSAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyLCBzdXIsIGN0eCk7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBidWZmZXJEZXF1ZXVlZCgpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEodHJ1ZSwgbUJ1ZmZlclJldGlyZWQpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgMykpOwotICAgIC8vIGRlcXVldWUvcXVldWUvdXBkYXRlIHNvIHdlIGhhdmUgYSBjdXJyZW50IGJ1ZmZlcgotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICBNeVRocmVhZCogdGhyZWFkID0gbmV3IE15VGhyZWFkKG1TVCk7Ci0gICAgc3A8VGhyZWFkPiB0aHJlYWRCYXNlKHRocmVhZCk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgdGhyZWFkLT5ydW4oKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsxXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzFdKSk7Ci0gICAgLy9BU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlsyXSkpOwotICAgIC8vQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMl0pKTsKLSAgICB0aHJlYWQtPmJ1ZmZlckRlcXVldWVkKCk7Ci0gICAgdGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgR2V0VHJhbnNmb3JtTWF0cml4UmV0dXJuc1ZlcnRpY2FsRmxpcCkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgZmxvYXQgbXR4WzE2XSA9IHt9OwotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmJ1ZlswXSkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIG1TVC0+Z2V0VHJhbnNmb3JtTWF0cml4KG10eCk7Ci0KLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzJdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbM10pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzRdKTsKLSAgICBFWFBFQ1RfRVEoLTEuZiwgbXR4WzVdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbNl0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs3XSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs5XSk7Ci0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzEwXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzExXSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTJdKTsKLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTNdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTRdKTsKLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTVdKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCwgR2V0VHJhbnNmb3JtTWF0cml4U3VjY2VlZHNBZnRlckZyZWVpbmdCdWZmZXJzKSB7Ci0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGJ1ZlszXTsKLSAgICBmbG9hdCBtdHhbMTZdID0ge307Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNikpOyAvLyBmcmVlcyBidWZmZXJzCi0gICAgbVNULT5nZXRUcmFuc2Zvcm1NYXRyaXgobXR4KTsKLQotICAgIEVYUEVDVF9FUSgxLmYsIG10eFswXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzFdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMl0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFszXSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbNF0pOwotICAgIEVYUEVDVF9FUSgtMS5mLCBtdHhbNV0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs2XSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzddKTsKLQotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs4XSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzldKTsKLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTBdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTFdKTsKLQotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxMl0pOwotICAgIEVYUEVDVF9FUSgxLmYsIG10eFsxM10pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxNF0pOwotICAgIEVYUEVDVF9FUSgxLmYsIG10eFsxNV0pOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBHZXRUcmFuc2Zvcm1NYXRyaXhTdWNjZWVkc0FmdGVyRnJlZWluZ0J1ZmZlcnNXaXRoQ3JvcCkgewotICAgIGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90KiBidWZbM107Ci0gICAgZmxvYXQgbXR4WzE2XSA9IHt9OwotICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBjcm9wOwotICAgIGNyb3AubGVmdCA9IDA7Ci0gICAgY3JvcC50b3AgPSAwOwotICAgIGNyb3AucmlnaHQgPSA1OwotICAgIGNyb3AuYm90dG9tID0gNTsKLQotICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1BTlcuZ2V0KCksIDQpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwgOCwgOCwgMCkpOwotICAgIEFTU0VSVF9FUShPSywgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYnVmWzBdKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9jcm9wKG1BTlcuZ2V0KCksICZjcm9wKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWZbMF0pKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0gICAgQVNTRVJUX0VRKE9LLCBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobUFOVy5nZXQoKSwgNikpOyAvLyBmcmVlcyBidWZmZXJzCi0gICAgbVNULT5nZXRUcmFuc2Zvcm1NYXRyaXgobXR4KTsKLQotICAgIC8vIFRoaXMgYWNjb3VudHMgZm9yIHRoZSAxIHRleGVsIHNocmluayBmb3IgZWFjaCBlZGdlIHRoYXQncyBpbmNsdWRlZCBpbiB0aGUKLSAgICAvLyB0cmFuc2Zvcm0gbWF0cml4IHRvIGF2b2lkIHRleHR1cmluZyBvdXRzaWRlIHRoZSBjcm9wIHJlZ2lvbi4KLSAgICBFWFBFQ1RfRVEoLjVmLCBtdHhbMF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFsxXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzJdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbM10pOwotCi0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzRdKTsKLSAgICBFWFBFQ1RfRVEoLS41ZiwgbXR4WzVdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbNl0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs3XSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbOF0pOwotICAgIEVYUEVDVF9FUSgwLmYsIG10eFs5XSk7Ci0gICAgRVhQRUNUX0VRKDEuZiwgbXR4WzEwXSk7Ci0gICAgRVhQRUNUX0VRKDAuZiwgbXR4WzExXSk7Ci0KLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTJdKTsKLSAgICBFWFBFQ1RfRVEoLjVmLCBtdHhbMTNdKTsKLSAgICBFWFBFQ1RfRVEoMC5mLCBtdHhbMTRdKTsKLSAgICBFWFBFQ1RfRVEoMS5mLCBtdHhbMTVdKTsKLX0KLQotLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIGJ1ZmZlciBmb3JtYXQgY2FuIGJlIHF1ZXJpZWQgaW1tZWRpYXRlbHkgYWZ0ZXIKLS8vIGl0IGlzIHNldC4KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUNsaWVudFRlc3QsIFF1ZXJ5Rm9ybWF0QWZ0ZXJTZXR0aW5nV29ya3MpIHsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBhbncobVNUQyk7Ci0gICAgaW50IGZtdHNbXSA9IHsKLSAgICAgICAgLy8gUkdCQV84ODg4IHNob3VsZCBub3QgY29tZSBmaXJzdCwgYXMgaXQncyB0aGUgZGVmYXVsdAotICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCwKLSAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsCi0gICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwKLSAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgICBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCwKLSAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTEsCi0gICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LAotICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lWMTIsCi0gICAgfTsKLQotICAgIGNvbnN0IGludCBudW1GbXRzID0gKHNpemVvZihmbXRzKSAvIHNpemVvZihmbXRzWzBdKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GbXRzOyBpKyspIHsKLSAgICAgIGludCBmbXQgPSAtMTsKLSAgICAgIEFTU0VSVF9FUShPSywgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShhbncuZ2V0KCksIDAsIDAsIGZtdHNbaV0pKTsKLSAgICAgIEFTU0VSVF9FUShPSywgYW53LT5xdWVyeShhbncuZ2V0KCksIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm10KSk7Ci0gICAgICBFWFBFQ1RfRVEoZm10c1tpXSwgZm10KTsKLSAgICB9Ci19Ci0KLWNsYXNzIE11bHRpU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0KLXB1YmxpYzoKLSAgICBNdWx0aVN1cmZhY2VUZXh0dXJlQ2xpZW50VGVzdCgpIDoKLSAgICAgICAgICAgIG1FZ2xEaXNwbGF5KEVHTF9OT19ESVNQTEFZKSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NVUkZBQ0VfVEVYVFVSRVM7IGkrKykgewotICAgICAgICAgICAgbUVnbFN1cmZhY2VzW2ldID0gRUdMX05PX0NPTlRFWFQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByb3RlY3RlZDoKLQotICAgIGVudW0geyBOVU1fU1VSRkFDRV9URVhUVVJFUyA9IDMyIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1FZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKEVHTF9OT19ESVNQTEFZLCBtRWdsRGlzcGxheSk7Ci0KLSAgICAgICAgRUdMaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xJbml0aWFsaXplKG1FZ2xEaXNwbGF5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgRUdMQ29uZmlnIG15Q29uZmlnOwotICAgICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDA7Ci0gICAgICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FCi0gICAgICAgIH07Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgY29uZmlnQXR0cmlicywgJm15Q29uZmlnLCAxLAotICAgICAgICAgICAgICAgICZudW1Db25maWdzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgbUVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsCi0gICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbUVnbENvbnRleHQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NVUkZBQ0VfVEVYVFVSRVM7IGkrKykgewotICAgICAgICAgICAgc3A8U3VyZmFjZVRleHR1cmU+IHN0KG5ldyBTdXJmYWNlVGV4dHVyZShpKSk7Ci0gICAgICAgICAgICBzcDxTdXJmYWNlVGV4dHVyZUNsaWVudD4gc3RjKG5ldyBTdXJmYWNlVGV4dHVyZUNsaWVudChzdCkpOwotICAgICAgICAgICAgbUVnbFN1cmZhY2VzW2ldID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShtRWdsRGlzcGxheSwgbXlDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdGMuZ2V0KCkpLCBOVUxMKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBBU1NFUlRfTkUoRUdMX05PX1NVUkZBQ0UsIG1FZ2xTdXJmYWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgRUdMX05PX0NPTlRFWFQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NVUkZBQ0VfVEVYVFVSRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKG1FZ2xTdXJmYWNlc1tpXSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICAgICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZXNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FZ2xDb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgICAgICBlZ2xEZXN0cm95Q29udGV4dChtRWdsRGlzcGxheSwgbUVnbENvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgICAgICBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLSAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlc1tOVU1fU1VSRkFDRV9URVhUVVJFU107Ci0gICAgRUdMQ29udGV4dCBtRWdsQ29udGV4dDsKLX07Ci0KLS8vIFhYWDogVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2UgaXQgY2F1c2VzIGEgaGFuZyBvbiBzb21lIGRldmljZXMuICBTZWUgYnVnCi0vLyA1MDE1NjcyLgotVEVTVF9GKE11bHRpU3VyZmFjZVRleHR1cmVDbGllbnRUZXN0LCBESVNBQkxFRF9NYWtlQ3VycmVudEJldHdlZW5TdXJmYWNlc1dvcmtzKSB7Ci0gICAgZm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgPCA4OyBpdGVyKyspIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1VSRkFDRV9URVhUVVJFUzsgaSsrKSB7Ci0gICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2VzW2ldLCBtRWdsU3VyZmFjZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgIG1FZ2xDb250ZXh0KTsKLSAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2VzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvdGVzdHMvU3VyZmFjZVRleHR1cmVfdGVzdC5jcHAgYi9saWJzL2d1aS90ZXN0cy9TdXJmYWNlVGV4dHVyZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2ZGVmZS4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS90ZXN0cy9TdXJmYWNlVGV4dHVyZV90ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3MzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZVRleHR1cmVfdGVzdCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgR0xUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0KLSAgICBHTFRlc3QoKToKLSAgICAgICAgICAgIG1FZ2xEaXNwbGF5KEVHTF9OT19ESVNQTEFZKSwKLSAgICAgICAgICAgIG1FZ2xTdXJmYWNlKEVHTF9OT19TVVJGQUNFKSwKLSAgICAgICAgICAgIG1FZ2xDb250ZXh0KEVHTF9OT19DT05URVhUKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fRElTUExBWSwgbUVnbERpc3BsYXkpOwotCi0gICAgICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbEluaXRpYWxpemUobUVnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgUmVjb3JkUHJvcGVydHkoIkVnbFZlcnNpb25NYWpvciIsIG1ham9yVmVyc2lvbik7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xWZXJzaW9uTWFqb3IiLCBtaW5vclZlcnNpb24pOwotCi0gICAgICAgIEVHTGludCBudW1Db25maWdzID0gMDsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsQ2hvb3NlQ29uZmlnKG1FZ2xEaXNwbGF5LCBnZXRDb25maWdBdHRyaWJzKCksICZtR2xDb25maWcsCi0gICAgICAgICAgICAgICAgMSwgJm51bUNvbmZpZ3MpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICBjaGFyKiBkaXNwbGF5U2Vjc0VudiA9IGdldGVudigiR0xURVNUX0RJU1BMQVlfU0VDUyIpOwotICAgICAgICBpZiAoZGlzcGxheVNlY3NFbnYgIT0gTlVMTCkgewotICAgICAgICAgICAgbURpc3BsYXlTZWNzID0gYXRvaShkaXNwbGF5U2Vjc0Vudik7Ci0gICAgICAgICAgICBpZiAobURpc3BsYXlTZWNzIDwgMCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5U2VjcyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRGlzcGxheVNlY3MgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1EaXNwbGF5U2VjcyA+IDApIHsKLSAgICAgICAgICAgIG1Db21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCkpOwotCi0gICAgICAgICAgICBtU3VyZmFjZUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIlRlc3QgU3VyZmFjZSIpLCAwLAotICAgICAgICAgICAgICAgICAgICBnZXRTdXJmYWNlV2lkdGgoKSwgZ2V0U3VyZmFjZUhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICBQSVhFTF9GT1JNQVRfUkdCXzg4OCwgMCk7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1TdXJmYWNlQ29udHJvbCAhPSBOVUxMKTsKLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1TdXJmYWNlQ29udHJvbC0+aXNWYWxpZCgpKTsKLQotICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVN1cmZhY2VDb250cm9sLT5zZXRMYXllcigweDdGRkZGRkZGKSk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TdXJmYWNlQ29udHJvbC0+c2hvdygpKTsKLSAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOwotCi0gICAgICAgICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cgPSBtU3VyZmFjZUNvbnRyb2wtPmdldFN1cmZhY2UoKTsKLSAgICAgICAgICAgIG1FZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShtRWdsRGlzcGxheSwgbUdsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ2V0KCksIE5VTEwpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRUdMaW50IHBidWZmZXJBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICAgICAgRUdMX1dJRFRILCBnZXRTdXJmYWNlV2lkdGgoKSwKLSAgICAgICAgICAgICAgICBFR0xfSEVJR0hULCBnZXRTdXJmYWNlSGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgRUdMX05PTkUgfTsKLQotICAgICAgICAgICAgbUVnbFN1cmZhY2UgPSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShtRWdsRGlzcGxheSwgbUdsQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBwYnVmZmVyQXR0cmlicyk7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKEVHTF9OT19TVVJGQUNFLCBtRWdsU3VyZmFjZSk7Ci0KLSAgICAgICAgbUVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBtR2xDb25maWcsIEVHTF9OT19DT05URVhULAotICAgICAgICAgICAgICAgIGdldENvbnRleHRBdHRyaWJzKCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX0NPTlRFWFQsIG1FZ2xDb250ZXh0KTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1FZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgRUdMaW50IHcsIGg7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbFF1ZXJ5U3VyZmFjZShtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIEVHTF9XSURUSCwgJncpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsUXVlcnlTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgUmVjb3JkUHJvcGVydHkoIkVnbFN1cmZhY2VXaWR0aCIsIHcpOwotICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiRWdsU3VyZmFjZUhlaWdodCIsIGgpOwotCi0gICAgICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgLy8gRGlzcGxheSB0aGUgcmVzdWx0IAotICAgICAgICBpZiAobURpc3BsYXlTZWNzID4gMCAmJiBtRWdsU3VyZmFjZSAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMobUVnbERpc3BsYXksIG1FZ2xTdXJmYWNlKTsKLSAgICAgICAgICAgIHNsZWVwKG1EaXNwbGF5U2Vjcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUNvbXBvc2VyQ2xpZW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1Db21wb3NlckNsaWVudC0+ZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRWdsQ29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1FZ2xDb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1FZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgICAgICBlZ2xUZXJtaW5hdGUobUVnbERpc3BsYXkpOwotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBFR0xpbnQgY29uc3QqIGdldENvbmZpZ0F0dHJpYnMoKSB7Ci0gICAgICAgIHN0YXRpYyBFR0xpbnQgc0RlZmF1bHRDb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfUEJVRkZFUl9CSVQsCi0gICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgICAgICBFR0xfUkVEX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfR1JFRU5fU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9CTFVFX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfQUxQSEFfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9ERVBUSF9TSVpFLCAxNiwKLSAgICAgICAgICAgIEVHTF9TVEVOQ0lMX1NJWkUsIDgsCi0gICAgICAgICAgICBFR0xfTk9ORSB9OwotCi0gICAgICAgIHJldHVybiBzRGVmYXVsdENvbmZpZ0F0dHJpYnM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBFR0xpbnQgY29uc3QqIGdldENvbnRleHRBdHRyaWJzKCkgewotICAgICAgICBzdGF0aWMgRUdMaW50IHNEZWZhdWx0Q29udGV4dEF0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLQotICAgICAgICByZXR1cm4gc0RlZmF1bHRDb250ZXh0QXR0cmliczsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIEVHTGludCBnZXRTdXJmYWNlV2lkdGgoKSB7Ci0gICAgICAgIHJldHVybiA1MTI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBFR0xpbnQgZ2V0U3VyZmFjZUhlaWdodCgpIHsKLSAgICAgICAgcmV0dXJuIDUxMjsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UsIEdMdWludCogb3V0U2hhZGVyKSB7Ci0gICAgICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGlmIChzaGFkZXIpIHsKLSAgICAgICAgICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOwotICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgR0xpbnQgY29tcGlsZWQgPSAwOwotICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICAgICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTaGFkZXIgY29tcGlsZSBsb2c6XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZBSUwoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKDB4MTAwMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIDB4MTAwMCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU2hhZGVyIGNvbXBpbGUgbG9nOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGQUlMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFTU0VSVF9UUlVFKHNoYWRlciAhPSAwKTsKLSAgICAgICAgKm91dFNoYWRlciA9IHNoYWRlcjsKLSAgICB9Ci0KLSAgICB2b2lkIGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlLAotICAgICAgICAgICAgR0x1aW50KiBvdXRQZ20pIHsKLSAgICAgICAgR0x1aW50IHZlcnRleFNoYWRlciwgZnJhZ21lbnRTaGFkZXI7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSgiY29tcGlsaW5nIHZlcnRleCBzaGFkZXIiKTsKLSAgICAgICAgICAgIGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSwgJnZlcnRleFNoYWRlcik7Ci0gICAgICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJjb21waWxpbmcgZnJhZ21lbnQgc2hhZGVyIik7Ci0gICAgICAgICAgICBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgcEZyYWdtZW50U291cmNlLCAmZnJhZ21lbnRTaGFkZXIpOwotICAgICAgICAgICAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGlmIChwcm9ncmFtKSB7Ci0gICAgICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBmcmFnbWVudFNoYWRlcik7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOwotICAgICAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJQcm9ncmFtIGxpbmsgbG9nOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGQUlMKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyKHZlcnRleFNoYWRlcik7Ci0gICAgICAgIGdsRGVsZXRlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHJvZ3JhbSAhPSAwKTsKLSAgICAgICAgKm91dFBnbSA9IHByb2dyYW07Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBhYnMoaW50IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSA+IDAgPyB2YWx1ZSA6IC12YWx1ZTsKLSAgICB9Ci0KLSAgICA6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBjaGVja1BpeGVsKGludCB4LCBpbnQgeSwgaW50IHIsCi0gICAgICAgICAgICBpbnQgZywgaW50IGIsIGludCBhLCBpbnQgdG9sZXJhbmNlPTIpIHsKLSAgICAgICAgR0x1Ynl0ZSBwaXhlbFs0XTsKLSAgICAgICAgU3RyaW5nOCBtc2c7Ci0gICAgICAgIGdsUmVhZFBpeGVscyh4LCB5LCAxLCAxLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbCk7Ci0gICAgICAgIEdMZW51bSBlcnIgPSBnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1zZyArPSBTdHJpbmc4Ojpmb3JtYXQoImVycm9yIHJlYWRpbmcgcGl4ZWw6ICUjeCIsIGVycik7Ci0gICAgICAgICAgICB3aGlsZSAoKGVyciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtc2cgKz0gU3RyaW5nODo6Zm9ybWF0KCIsICUjeCIsIGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBpeGVsIGNoZWNrIGZhaWx1cmU6ICVzXG4iLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgKLSAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKG1zZy5zdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyID49IDAgJiYgYWJzKHIgLSBpbnQocGl4ZWxbMF0pKSA+IHRvbGVyYW5jZSkgewotICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiciglZCBpc24ndCAlZCkiLCBwaXhlbFswXSwgcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGcgPj0gMCAmJiBhYnMoZyAtIGludChwaXhlbFsxXSkpID4gdG9sZXJhbmNlKSB7Ci0gICAgICAgICAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtc2cgKz0gIiAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiZyglZCBpc24ndCAlZCkiLCBwaXhlbFsxXSwgZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGIgPj0gMCAmJiBhYnMoYiAtIGludChwaXhlbFsyXSkpID4gdG9sZXJhbmNlKSB7Ci0gICAgICAgICAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtc2cgKz0gIiAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiYiglZCBpc24ndCAlZCkiLCBwaXhlbFsyXSwgYik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGEgPj0gMCAmJiBhYnMoYSAtIGludChwaXhlbFszXSkpID4gdG9sZXJhbmNlKSB7Ci0gICAgICAgICAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtc2cgKz0gIiAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnICs9IFN0cmluZzg6OmZvcm1hdCgiYSglZCBpc24ndCAlZCkiLCBwaXhlbFszXSwgYSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtc2cuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBpeGVsIGNoZWNrIGZhaWx1cmU6ICVzXG4iLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgKLSAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpNZXNzYWdlKG1zZy5zdHJpbmcoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IG1EaXNwbGF5U2VjczsKLSAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1Db21wb3NlckNsaWVudDsKLSAgICBzcDxTdXJmYWNlQ29udHJvbD4gbVN1cmZhY2VDb250cm9sOwotCi0gICAgRUdMRGlzcGxheSBtRWdsRGlzcGxheTsKLSAgICBFR0xTdXJmYWNlIG1FZ2xTdXJmYWNlOwotICAgIEVHTENvbnRleHQgbUVnbENvbnRleHQ7Ci0gICAgRUdMQ29uZmlnICBtR2xDb25maWc7Ci19OwotCi0vLyBYWFg6IENvZGUgYWJvdmUgdGhpcyBwb2ludCBzaG91bGQgbGl2ZSBlbHNld2hlcmUKLQotY2xhc3MgU3VyZmFjZVRleHR1cmVHTFRlc3QgOiBwdWJsaWMgR0xUZXN0IHsKLXByb3RlY3RlZDoKLSAgICBlbnVtIHsgVEVYX0lEID0gMTIzIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEdMVGVzdDo6U2V0VXAoKTsKLSAgICAgICAgbVNUID0gbmV3IFN1cmZhY2VUZXh0dXJlKFRFWF9JRCk7Ci0gICAgICAgIG1TVEMgPSBuZXcgU3VyZmFjZVRleHR1cmVDbGllbnQobVNUKTsKLSAgICAgICAgbUFOVyA9IG1TVEM7Ci0KLSAgICAgICAgY29uc3QgY2hhciB2c3JjW10gPQotICAgICAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAgICAgICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICAgICAgICAgInVuaWZvcm0gbWF0NCB0ZXhNYXRyaXg7XG4iCi0gICAgICAgICAgICAidm9pZCBtYWluKCkge1xuIgotICAgICAgICAgICAgIiAgdmVjMiB2VGV4Q29vcmRzID0gMC41ICogKHZQb3NpdGlvbi54eSArIHZlYzIoMS4wLCAxLjApKTtcbiIKLSAgICAgICAgICAgICIgIHRleENvb3JkcyA9ICh0ZXhNYXRyaXggKiB2ZWM0KHZUZXhDb29yZHMsIDAuMCwgMS4wKSkueHk7XG4iCi0gICAgICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAgICAgICAgICJ9XG4iOwotCi0gICAgICAgIGNvbnN0IGNoYXIgZnNyY1tdID0KLSAgICAgICAgICAgICIjZXh0ZW5zaW9uIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgOiByZXF1aXJlXG4iCi0gICAgICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgICAgICAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgdGV4U2FtcGxlcjtcbiIKLSAgICAgICAgICAgICJ2YXJ5aW5nIHZlYzIgdGV4Q29vcmRzO1xuIgotICAgICAgICAgICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAgICAgICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0ZXhTYW1wbGVyLCB0ZXhDb29yZHMpO1xuIgotICAgICAgICAgICAgIn1cbiI7Ci0KLSAgICAgICAgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKCJjcmVhdGluZyBzaGFkZXIgcHJvZ3JhbSIpOwotICAgICAgICAgICAgY3JlYXRlUHJvZ3JhbSh2c3JjLCBmc3JjLCAmbVBnbSk7Ci0gICAgICAgICAgICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtUG9zaXRpb25IYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKG1QZ20sICJ2UG9zaXRpb24iKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORSgtMSwgbVBvc2l0aW9uSGFuZGxlKTsKLSAgICAgICAgbVRleFNhbXBsZXJIYW5kbGUgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtUGdtLCAidGV4U2FtcGxlciIpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX05FKC0xLCBtVGV4U2FtcGxlckhhbmRsZSk7Ci0gICAgICAgIG1UZXhNYXRyaXhIYW5kbGUgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihtUGdtLCAidGV4TWF0cml4Iik7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoLTEsIG1UZXhNYXRyaXhIYW5kbGUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbUFOVy5jbGVhcigpOwotICAgICAgICBtU1RDLmNsZWFyKCk7Ci0gICAgICAgIG1TVC5jbGVhcigpOwotICAgICAgICBHTFRlc3Q6OlRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgLy8gZHJhd1RleHR1cmUgZHJhd3MgdGhlIFN1cmZhY2VUZXh0dXJlIG92ZXIgdGhlIGVudGlyZSBHTCB2aWV3cG9ydC4KLSAgICB2b2lkIGRyYXdUZXh0dXJlKCkgewotICAgICAgICBjb25zdCBHTGZsb2F0IHRyaWFuZ2xlVmVydGljZXNbXSA9IHsKLSAgICAgICAgICAgIC0xLjBmLCAxLjBmLAotICAgICAgICAgICAgLTEuMGYsIC0xLjBmLAotICAgICAgICAgICAgMS4wZiwgLTEuMGYsCi0gICAgICAgICAgICAxLjBmLCAxLjBmLAotICAgICAgICB9OwotCi0gICAgICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihtUG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwKLSAgICAgICAgICAgICAgICB0cmlhbmdsZVZlcnRpY2VzKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobVBvc2l0aW9uSGFuZGxlKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgZ2xVc2VQcm9ncmFtKG1QZ20pOwotICAgICAgICBnbFVuaWZvcm0xaShtVGV4U2FtcGxlckhhbmRsZSwgMCk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBURVhfSUQpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLQotICAgICAgICAvLyBYWFg6IFRoZXNlIGNhbGxzIGFyZSBub3QgbmVlZGVkIGZvciBHTF9URVhUVVJFX0VYVEVSTkFMX09FUyBhcwotICAgICAgICAvLyB0aGV5J3JlIHNldHRpbmcgdGhlIGRlZmF1dGxzIGZvciB0aGF0IHRhcmdldCwgYnV0IHdoZW4gaGFja2luZyB0aGluZ3MKLSAgICAgICAgLy8gdG8gdXNlIEdMX1RFWFRVUkVfMkQgdGhleSBhcmUgbmVlZGVkIHRvIGFjaGlldmUgdGhlIHNhbWUgYmVoYXZpb3IuCi0gICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9NSU5fRklMVEVSLAotICAgICAgICAgICAgICAgIEdMX0xJTkVBUik7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotICAgICAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwKLSAgICAgICAgICAgICAgICBHTF9MSU5FQVIpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX1dSQVBfUywKLSAgICAgICAgICAgICAgICBHTF9DTEFNUF9UT19FREdFKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1QsCi0gICAgICAgICAgICAgICAgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotCi0gICAgICAgIEdMZmxvYXQgdGV4TWF0cml4WzE2XTsKLSAgICAgICAgbVNULT5nZXRUcmFuc2Zvcm1NYXRyaXgodGV4TWF0cml4KTsKLSAgICAgICAgZ2xVbmlmb3JtTWF0cml4NGZ2KG1UZXhNYXRyaXhIYW5kbGUsIDEsIEdMX0ZBTFNFLCB0ZXhNYXRyaXgpOwotCi0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICB9Ci0KLSAgICBjbGFzcyBGcmFtZVdhaXRlciA6IHB1YmxpYyBTdXJmYWNlVGV4dHVyZTo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7Ci0gICAgcHVibGljOgotICAgICAgICBGcmFtZVdhaXRlcigpOgotICAgICAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzKDApIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd2FpdEZvckZyYW1lKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGVuZGluZ0ZyYW1lcy0tOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgbVBlbmRpbmdGcmFtZXMrKzsKLSAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbVBlbmRpbmdGcmFtZXM7Ci0gICAgICAgIE11dGV4IG1NdXRleDsKLSAgICAgICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0gICAgfTsKLQotICAgIHNwPFN1cmZhY2VUZXh0dXJlPiBtU1Q7Ci0gICAgc3A8U3VyZmFjZVRleHR1cmVDbGllbnQ+IG1TVEM7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gbUFOVzsKLQotICAgIEdMdWludCBtUGdtOwotICAgIEdMaW50IG1Qb3NpdGlvbkhhbmRsZTsKLSAgICBHTGludCBtVGV4U2FtcGxlckhhbmRsZTsKLSAgICBHTGludCBtVGV4TWF0cml4SGFuZGxlOwotfTsKLQotLy8gRmlsbCBhIFlWMTIgYnVmZmVyIHdpdGggYSBtdWx0aS1jb2xvcmVkIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi12b2lkIGZpbGxZVjEyQnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7Ci0gICAgY29uc3QgaW50IGJsb2NrV2lkdGggPSB3ID4gMTYgPyB3IC8gMTYgOiAxOwotICAgIGNvbnN0IGludCBibG9ja0hlaWdodCA9IGggPiAxNiA/IGggLyAxNiA6IDE7Ci0gICAgY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotICAgIGludCB5dXZUZXhTdHJpZGVZID0gc3RyaWRlOwotICAgIGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIGg7Ci0gICAgaW50IHl1dlRleFN0cmlkZVYgPSAoeXV2VGV4U3RyaWRlWS8yICsgMHhmKSAmIH4weGY7Ci0gICAgaW50IHl1dlRleE9mZnNldFUgPSB5dXZUZXhPZmZzZXRWICsgeXV2VGV4U3RyaWRlViAqIGgvMjsKLSAgICBpbnQgeXV2VGV4U3RyaWRlVSA9IHl1dlRleFN0cmlkZVY7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgIGludCBwYXJpdHlYID0gKHggLyBibG9ja1dpZHRoKSAmIDE7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WSA9ICh5IC8gYmxvY2tIZWlnaHQpICYgMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW50ZW5zaXR5ID0gKHBhcml0eVggXiBwYXJpdHlZKSA/IDYzIDogMTkxOwotICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFkgKyAoeSAqIHl1dlRleFN0cmlkZVkpICsgeF0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICBpZiAoeCA8IHcgLyAyICYmIHkgPCBoIC8gMikgewotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRVICsgKHkgKiB5dXZUZXhTdHJpZGVVKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIGlmICh4ICogMiA8IHcgLyAyICYmIHkgKiAyIDwgaCAvIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSoyICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkqMiAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMV0gPQotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICgoeSoyKzEpICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAwXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKCh5KjIrMSkgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEZpbGwgYSBZVjEyIGJ1ZmZlciB3aXRoIHJlZCBvdXRzaWRlIGEgZ2l2ZW4gcmVjdGFuZ2xlIGFuZCBncmVlbiBpbnNpZGUgaXQuCi12b2lkIGZpbGxZVjEyQnVmZmVyUmVjdCh1aW50OF90KiBidWYsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSwKLSAgICAgICAgY29uc3QgYW5kcm9pZF9uYXRpdmVfcmVjdF90JiByZWN0KSB7Ci0gICAgY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotICAgIGludCB5dXZUZXhTdHJpZGVZID0gc3RyaWRlOwotICAgIGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIGg7Ci0gICAgaW50IHl1dlRleFN0cmlkZVYgPSAoeXV2VGV4U3RyaWRlWS8yICsgMHhmKSAmIH4weGY7Ci0gICAgaW50IHl1dlRleE9mZnNldFUgPSB5dXZUZXhPZmZzZXRWICsgeXV2VGV4U3RyaWRlViAqIGgvMjsKLSAgICBpbnQgeXV2VGV4U3RyaWRlVSA9IHl1dlRleFN0cmlkZVY7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgIGJvb2wgaW5zaWRlID0gcmVjdC5sZWZ0IDw9IHggJiYgeCA8IHJlY3QucmlnaHQgJiYKLSAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgPD0geSAmJiB5IDwgcmVjdC5ib3R0b207Ci0gICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0WSArICh5ICogeXV2VGV4U3RyaWRlWSkgKyB4XSA9IGluc2lkZSA/IDI0MCA6IDY0OwotICAgICAgICAgICAgaWYgKHggPCB3IC8gMiAmJiB5IDwgaCAvIDIpIHsKLSAgICAgICAgICAgICAgICBib29sIGluc2lkZSA9IHJlY3QubGVmdCA8PSAyKnggJiYgMip4IDwgcmVjdC5yaWdodCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC50b3AgPD0gMip5ICYmIDIqeSA8IHJlY3QuYm90dG9tOwotICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRVICsgKHkgKiB5dXZUZXhTdHJpZGVVKSArIHhdID0gMTY7Ci0gICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSAqIHl1dlRleFN0cmlkZVYpICsgeF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlID8gMTYgOiAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgZmlsbFJHQkE4QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7Ci0gICAgY29uc3Qgc2l6ZV90IFBJWEVMX1NJWkUgPSA0OwotICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAoeSAqIHN0cmlkZSArIHgpICogUElYRUxfU0laRTsKLSAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBhcml0eVggPSAoeCAvICgxIDw8IChjKzIpKSkgJiAxOwotICAgICAgICAgICAgICAgIGludCBwYXJpdHlZID0gKHkgLyAoMSA8PCAoYysyKSkpICYgMTsKLSAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgY10gPSAocGFyaXR5WCBeIHBhcml0eVkpID8gMjMxIDogMzU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgZmlsbFJHQkE4QnVmZmVyU29saWQodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUsIHVpbnQ4X3QgciwKLSAgICAgICAgdWludDhfdCBnLCB1aW50OF90IGIsIHVpbnQ4X3QgYSkgewotICAgIGNvbnN0IHNpemVfdCBQSVhFTF9TSVpFID0gNDsKLSAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykgewotICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGg7IHgrKykgewotICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0ID0gKHkgKiBzdHJpZGUgKyB4KSAqIFBJWEVMX1NJWkU7Ci0gICAgICAgICAgICBidWZbb2Zmc2V0ICsgMF0gPSByOwotICAgICAgICAgICAgYnVmW29mZnNldCArIDFdID0gZzsKLSAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyAyXSA9IGI7Ci0gICAgICAgICAgICBidWZbb2Zmc2V0ICsgM10gPSBhOwotICAgICAgICB9Ci0gICAgfQotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRlc3QsIFRleHR1cmluZ0Zyb21DcHVGaWxsZWRZVjEyQnVmZmVyTnBvdCkgewotICAgIGNvbnN0IGludCB0ZXhXaWR0aCA9IDY0OwotICAgIGNvbnN0IGludCB0ZXhIZWlnaHQgPSA2NjsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLAotICAgICAgICAgICAgdGV4V2lkdGgsIHRleEhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSk7Ci0gICAgQVNTRVJUX1RSVUUoYW5iICE9IE5VTEwpOwotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmxvY2tCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4KLSAgICB1aW50OF90KiBpbWcgPSBOVUxMOwotICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgZmlsbFlWMTJCdWZmZXIoaW1nLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpKTsKLSAgICBidWYtPnVubG9jaygpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgZ2xDbGVhckNvbG9yKDAuMiwgMC4yLCAwLjIsIDAuMik7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdGV4V2lkdGgsIHRleEhlaWdodCk7Ci0gICAgZHJhd1RleHR1cmUoKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsICAwLCAyNTUsIDEyNywgMjU1LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgICAwLCAxMzMsICAgMCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgNjUsICAgMCwgMTMzLCAgIDAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDAsIDY1LCAyNTUsIDEyNywgMjU1LCAyNTUpKTsKLQotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjIsIDQ0LCAyNTUsIDEyNywgMjU1LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ1LCA1MiwgMjU1LCAxMjcsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1MiwgNTEsICA5OCwgMjU1LCAgNzMsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDcsIDMxLCAxNTUsICAgMCwgMTE4LCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDMxLCAgOSwgMTA3LCAgMjQsICA4NywgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyOSwgMzUsIDI1NSwgMTI3LCAyNTUsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzYsIDIyLCAxNTUsICAyOSwgICAwLCAyNTUpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkWVYxMkJ1ZmZlclBvdzIpIHsKLSAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjQ7Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMikpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pKTsKLQotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGZpbGxZVjEyQnVmZmVyKGltZywgdGV4V2lkdGgsIHRleEhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgIGdsQ2xlYXJDb2xvcigwLjIsIDAuMiwgMC4yLCAwLjIpOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHRleFdpZHRoLCB0ZXhIZWlnaHQpOwotICAgIGRyYXdUZXh0dXJlKCk7Ci0KLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCAgMCwgICAwLCAxMzMsICAgMCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgIDAsIDI1NSwgMTI3LCAyNTUsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsIDYzLCAgIDAsIDEzMywgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCA2MywgMjU1LCAxMjcsIDI1NSwgMjU1KSk7Ci0KLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDIyLCAxOSwgMTAwLCAyNTUsICA3NCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NSwgMTEsIDEwMCwgMjU1LCAgNzQsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTIsIDEyLCAxNTUsICAgMCwgMTgxLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA3LCAzMiwgMTUwLCAyMzcsIDE3MCwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMSwgNTQsICAgMCwgIDcxLCAxMTcsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjksIDI4LCAgIDAsIDEzMywgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDM2LCA0MSwgMTAwLCAyMzIsIDI1NSwgMjU1KSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgVGV4dHVyaW5nRnJvbUNwdUZpbGxlZFlWMTJCdWZmZXJXaXRoQ3JvcCkgewotICAgIGNvbnN0IGludCB0ZXhXaWR0aCA9IDY0OwotICAgIGNvbnN0IGludCB0ZXhIZWlnaHQgPSA2NjsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLAotICAgICAgICAgICAgdGV4V2lkdGgsIHRleEhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwotCi0gICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IGNyb3BzW10gPSB7Ci0gICAgICAgIHs0LCA2LCAyMiwgMzZ9LAotICAgICAgICB7MCwgNiwgMjIsIDM2fSwKLSAgICAgICAgezQsIDAsIDIyLCAzNn0sCi0gICAgICAgIHs0LCA2LCB0ZXhXaWR0aCwgMzZ9LAotICAgICAgICB7NCwgNiwgMjIsIHRleEhlaWdodH0sCi0gICAgfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGFuZHJvaWRfbmF0aXZlX3JlY3RfdCYgY3JvcChjcm9wc1tpXSk7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShTdHJpbmc4Ojpmb3JtYXQoInJlY3R7IGw6ICVkIHQ6ICVkIHI6ICVkIGI6ICVkIH0iLAotICAgICAgICAgICAgICAgIGNyb3AubGVmdCwgY3JvcC50b3AsIGNyb3AucmlnaHQsIGNyb3AuYm90dG9tKS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF9jcm9wKG1BTlcuZ2V0KCksICZjcm9wKSk7Ci0KLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgICAgICBBU1NFUlRfVFJVRShhbmIgIT0gTlVMTCk7Ci0KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgICAgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgICAgIHVpbnQ4X3QqIGltZyA9IE5VTEw7Ci0gICAgICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgICAgIGZpbGxZVjEyQnVmZmVyUmVjdChpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCksIGNyb3ApOwotICAgICAgICBidWYtPnVubG9jaygpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICAgICAgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgICAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgICAgICBnbFZpZXdwb3J0KDAsIDAsIDY0LCA2NCk7Ci0gICAgICAgIGRyYXdUZXh0dXJlKCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCAgMCwgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsIDYzLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjMsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjUsIDE0LCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzNSwgMzEsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDU3LCAgNiwgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDUsIDQyLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMiwgMzMsICA4MiwgMjU1LCAgMzUsIDI1NSkpOwotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE2LCAyNiwgIDgyLCAyNTUsICAzNSwgMjU1KSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsIDUxLCAgODIsIDI1NSwgIDM1LCAyNTUpKTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgdGVzdCBpcyBpbnRlbmRlZCB0byBjYXRjaCBzeW5jaHJvbml6YXRpb24gYnVncyBiZXR3ZWVuIHRoZSBDUFUtd3JpdHRlbgotLy8gYW5kIEdQVS1yZWFkIGJ1ZmZlcnMuCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRlc3QsIFRleHR1cmluZ0Zyb21DcHVGaWxsZWRZVjEyQnVmZmVyc1JlcGVhdGVkbHkpIHsKLSAgICBlbnVtIHsgdGV4V2lkdGggPSAxNiB9OwotICAgIGVudW0geyB0ZXhIZWlnaHQgPSAxNiB9OwotICAgIGVudW0geyBudW1GcmFtZXMgPSAxMDI0IH07Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TVC0+c2V0U3luY2hyb25vdXNNb2RlKHRydWUpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TVC0+c2V0QnVmZmVyQ291bnRTZXJ2ZXIoMikpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLAotICAgICAgICAgICAgdGV4V2lkdGgsIHRleEhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwotCi0gICAgc3RydWN0IFRlc3RQaXhlbCB7Ci0gICAgICAgIGludCB4OwotICAgICAgICBpbnQgeTsKLSAgICB9OwotICAgIGNvbnN0IFRlc3RQaXhlbCB0ZXN0UGl4ZWxzW10gPSB7Ci0gICAgICAgIHsgIDQsIDExIH0sCi0gICAgICAgIHsgMTIsIDE0IH0sCi0gICAgICAgIHsgIDcsICAyIH0sCi0gICAgfTsKLSAgICBlbnVtIHtudW1UZXN0UGl4ZWxzID0gc2l6ZW9mKHRlc3RQaXhlbHMpIC8gc2l6ZW9mKHRlc3RQaXhlbHNbMF0pfTsKLQotICAgIGNsYXNzIFByb2R1Y2VyVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgcHVibGljOgotICAgICAgICBQcm9kdWNlclRocmVhZChjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYW53LAotICAgICAgICAgICAgICAgIGNvbnN0IFRlc3RQaXhlbCogdGVzdFBpeGVscyk6Ci0gICAgICAgICAgICAgICAgbUFOVyhhbncpLAotICAgICAgICAgICAgICAgIG1UZXN0UGl4ZWxzKHRlc3RQaXhlbHMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHZpcnR1YWwgflByb2R1Y2VyVGhyZWFkKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwotICAgICAgICAgICAgICAgIGlmIChtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFuYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWYobmV3IEdyYXBoaWNCdWZmZXIoYW5iLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgIGlmIChtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY29uc3QgaW50IHl1dlRleE9mZnNldFkgPSAwOwotICAgICAgICAgICAgICAgIGludCBzdHJpZGUgPSBidWYtPmdldFN0cmlkZSgpOwotICAgICAgICAgICAgICAgIGludCB5dXZUZXhTdHJpZGVZID0gc3RyaWRlOwotICAgICAgICAgICAgICAgIGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIHRleEhlaWdodDsKLSAgICAgICAgICAgICAgICBpbnQgeXV2VGV4U3RyaWRlViA9ICh5dXZUZXhTdHJpZGVZLzIgKyAweGYpICYgfjB4ZjsKLSAgICAgICAgICAgICAgICBpbnQgeXV2VGV4T2Zmc2V0VSA9IHl1dlRleE9mZnNldFYgKyB5dXZUZXhTdHJpZGVWICogdGV4SGVpZ2h0LzI7Ci0gICAgICAgICAgICAgICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOwotCi0gICAgICAgICAgICAgICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICAgICAgICAgICAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotCi0gICAgICAgICAgICAgICAgLy8gR3JheSBvdXQgYWxsIHRoZSB0ZXN0IHBpeGVscyBmaXJzdCwgc28gd2UncmUgbW9yZSBsaWtlbHkgdG8KLSAgICAgICAgICAgICAgICAvLyBzZWUgYSBmYWlsdXJlIGlmIEdMIGlzIHN0aWxsIHRleHR1cmluZyBmcm9tIHRoZSBidWZmZXIgd2UKLSAgICAgICAgICAgICAgICAvLyBqdXN0IGRlcXVldWVkLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVGVzdFBpeGVsczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB4ID0gbVRlc3RQaXhlbHNbal0ueDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBtVGVzdFBpeGVsc1tqXS55OwotICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbHVlID0gMTI4OwotICAgICAgICAgICAgICAgICAgICBpbWdbeSpzdHJpZGUgKyB4XSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIGdyYXkuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCB0ZXhIZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHRleFdpZHRoOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGltZ1t5dXZUZXhPZmZzZXRZICsgeSp5dXZUZXhTdHJpZGVZICsgeF0gPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbWdbeXV2VGV4T2Zmc2V0VSArICh5LzIpKnl1dlRleFN0cmlkZVUgKyB4LzJdID0gMTI4OwotICAgICAgICAgICAgICAgICAgICAgICAgaW1nW3l1dlRleE9mZnNldFYgKyAoeS8yKSp5dXZUZXhTdHJpZGVWICsgeC8yXSA9IDEyODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdGVzdCBwaXhlbHMgdG8gZWl0aGVyIHdoaXRlIG9yIGJsYWNrLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtVGVzdFBpeGVsczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB4ID0gbVRlc3RQaXhlbHNbal0ueDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBtVGVzdFBpeGVsc1tqXS55OwotICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gKGkgJSBudW1UZXN0UGl4ZWxzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW1nW3kqc3RyaWRlICsgeF0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBidWYtPnVubG9jaygpOwotICAgICAgICAgICAgICAgIGlmIChtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7Ci0gICAgICAgIGNvbnN0IFRlc3RQaXhlbCogbVRlc3RQaXhlbHM7Ci0gICAgfTsKLQotICAgIHNwPEZyYW1lV2FpdGVyPiBmdyhuZXcgRnJhbWVXYWl0ZXIpOwotICAgIG1TVC0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihmdyk7Ci0KLSAgICBzcDxUaHJlYWQ+IHB0KG5ldyBQcm9kdWNlclRocmVhZChtQU5XLCB0ZXN0UGl4ZWxzKSk7Ci0gICAgcHQtPnJ1bigpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKLQotICAgIGdsQ2xlYXJDb2xvcigwLjIsIDAuMiwgMC4yLCAwLjIpOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICAvLyBXZSB3YWl0IGZvciB0aGUgZmlyc3QgdHdvIGZyYW1lcyB1cCBmcm9udCBzbyB0aGF0IHRoZSBwcm9kdWNlciB3aWxsIGJlCi0gICAgLy8gbGlrZWx5IHRvIGRlcXVldWUgdGhlIGJ1ZmZlciB0aGF0J3MgY3VycmVudGx5IGJlaW5nIHRleHR1cmVkIGZyb20uCi0gICAgZnctPndhaXRGb3JGcmFtZSgpOwotICAgIGZ3LT53YWl0Rm9yRnJhbWUoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKFN0cmluZzg6OmZvcm1hdCgiZnJhbWUgJWQiLCBpKS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgLy8gV2UgbXVzdCB3YWl0IGZvciBlYWNoIGZyYW1lIHRvIGNvbWUgaW4gYmVjYXVzZSBpZiB3ZSBldmVyIGRvIGFuCi0gICAgICAgIC8vIHVwZGF0ZVRleEltYWdlIGNhbGwgdGhhdCBkb2Vzbid0IGNvbnN1bWUgYSBuZXdseSBhdmFpbGFibGUgYnVmZmVyCi0gICAgICAgIC8vIHRoZW4gdGhlIHByb2R1Y2VyIGFuZCBjb25zdW1lciB3aWxsIGdldCBvdXQgb2Ygc3luYywgd2hpY2ggd2lsbCBjYXVzZQotICAgICAgICAvLyBhIGRlYWRsb2NrLgotICAgICAgICBpZiAoaSA+IDEpIHsKLSAgICAgICAgICAgIGZ3LT53YWl0Rm9yRnJhbWUoKTsKLSAgICAgICAgfQotICAgICAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0gICAgICAgIGRyYXdUZXh0dXJlKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1UZXN0UGl4ZWxzOyBqKyspIHsKLSAgICAgICAgICAgIGludCB4ID0gdGVzdFBpeGVsc1tqXS54OwotICAgICAgICAgICAgaW50IHkgPSB0ZXN0UGl4ZWxzW2pdLnk7Ci0gICAgICAgICAgICB1aW50OF90IHZhbHVlID0gMDsKLSAgICAgICAgICAgIGlmIChqID09IChpICUgbnVtVGVzdFBpeGVscykpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IHktaW52ZXJ0IHRoZSB0ZXh0dXJlIGNvb3JkcwotICAgICAgICAgICAgICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoeCwgdGV4SGVpZ2h0LXktMSwgMjU1LCAyNTUsIDI1NSwgMjU1KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgeS1pbnZlcnQgdGhlIHRleHR1cmUgY29vcmRzCi0gICAgICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCh4LCB0ZXhIZWlnaHQteS0xLCAwLCAwLCAwLCAyNTUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB0LT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBUZXh0dXJpbmdGcm9tQ3B1RmlsbGVkUkdCQUJ1ZmZlck5wb3QpIHsKLSAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjY7Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4KSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwotCi0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGFuYjsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHRoZSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGZpbGxSR0JBOEJ1ZmZlcihpbWcsIHRleFdpZHRoLCB0ZXhIZWlnaHQsIGJ1Zi0+Z2V0U3RyaWRlKCkpOwotICAgIGJ1Zi0+dW5sb2NrKCk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKLSAgICBkcmF3VGV4dHVyZSgpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsICAzNSwgIDM1LCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsICAwLCAyMzEsIDIzMSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2NSwgMjMxLCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjUsICAzNSwgIDM1LCAgMzUsICAzNSkpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNSwgMTAsICAzNSwgMjMxLCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjMsIDY1LCAyMzEsICAzNSwgMjMxLCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE5LCA0MCwgIDM1LCAyMzEsICAzNSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzOCwgMzAsIDIzMSwgIDM1LCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDIsIDU0LCAgMzUsICAzNSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDM3LCAzNCwgIDM1LCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMSwgIDgsIDIzMSwgIDM1LCAgMzUsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzcsIDQ3LCAyMzEsICAzNSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI1LCAzOCwgIDM1LCAgMzUsICAzNSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0OSwgIDYsICAzNSwgMjMxLCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNTQsIDUwLCAgMzUsIDIzMSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI3LCAyNiwgMjMxLCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxMCwgIDYsICAzNSwgIDM1LCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjksICA0LCAgMzUsICAzNSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDU1LCAyOCwgIDM1LCAgMzUsIDIzMSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1OCwgNTUsICAzNSwgIDM1LCAyMzEsIDIzMSkpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRlc3QsIFRleHR1cmluZ0Zyb21DcHVGaWxsZWRSR0JBQnVmZmVyUG93MikgewotICAgIGNvbnN0IGludCB0ZXhXaWR0aCA9IDY0OwotICAgIGNvbnN0IGludCB0ZXhIZWlnaHQgPSA2NDsKLQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtQU5XLmdldCgpLAotICAgICAgICAgICAgdGV4V2lkdGgsIHRleEhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1BTlcuZ2V0KCksCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKSk7Ci0KLSAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCogYW5iOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+ZGVxdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCAmYW5iKSk7Ci0gICAgQVNTRVJUX1RSVUUoYW5iICE9IE5VTEwpOwotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmxvY2tCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgY2hlY2tlcmJvYXJkIHBhdHRlcm4KLSAgICB1aW50OF90KiBpbWcgPSBOVUxMOwotICAgIGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgZmlsbFJHQkE4QnVmZmVyKGltZywgdGV4V2lkdGgsIHRleEhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSk7Ci0gICAgYnVmLT51bmxvY2soKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgIGdsQ2xlYXJDb2xvcigwLjIsIDAuMiwgMC4yLCAwLjIpOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHRleFdpZHRoLCB0ZXhIZWlnaHQpOwotICAgIGRyYXdUZXh0dXJlKCk7Ci0KLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCAgMCwgMjMxLCAyMzEsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg2MywgIDAsICAzNSwgIDM1LCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsIDYzLCAyMzEsIDIzMSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAwLCA2MywgIDM1LCAgMzUsICAzNSwgIDM1KSk7Ci0KLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDEyLCA0NiwgMjMxLCAyMzEsIDIzMSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNiwgIDEsIDIzMSwgMjMxLCAgMzUsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjEsIDEyLCAyMzEsICAzNSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDI2LCA1MSwgMjMxLCAgMzUsIDIzMSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNSwgMzIsICAzNSwgMjMxLCAyMzEsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTMsICA4LCAgMzUsIDIzMSwgMjMxLCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQ2LCAgMywgIDM1LCAgMzUsIDIzMSwgIDM1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgzMCwgMzMsICAzNSwgIDM1LCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDYsIDUyLCAyMzEsIDIzMSwgIDM1LCAgMzUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDU1LCAzMywgIDM1LCAyMzEsICAzNSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgxNiwgMjksICAzNSwgIDM1LCAyMzEsIDIzMSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDEsIDMwLCAgMzUsICAzNSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQxLCAzNywgIDM1LCAgMzUsIDIzMSwgMjMxKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NiwgMjksIDIzMSwgMjMxLCAgMzUsICAzNSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTUsIDI1LCAgMzUsIDIzMSwgIDM1LCAyMzEpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAzLCA1MiwgIDM1LCAyMzEsICAzNSwgIDM1KSk7Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVGVzdCwgQWJhbmRvblVuYmxvY2tzRGVxdWV1ZUJ1ZmZlcikgewotICAgIGNsYXNzIFByb2R1Y2VyVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgcHVibGljOgotICAgICAgICBQcm9kdWNlclRocmVhZChjb25zdCBzcDxBTmF0aXZlV2luZG93PiYgYW53KToKLSAgICAgICAgICAgICAgICBtQU5XKGFudyksCi0gICAgICAgICAgICAgICAgbURlcXVldWVFcnJvcihOT19FUlJPUikgewotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB+UHJvZHVjZXJUaHJlYWQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmI7Ci0KLSAgICAgICAgICAgIC8vIEZyYW1lIDEKLSAgICAgICAgICAgIGlmIChtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFuYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGFuYikKLSAgICAgICAgICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZyYW1lIDIKLSAgICAgICAgICAgIGlmIChtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFuYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGFuYikKLSAgICAgICAgICAgICAgICAgICAgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEZyYW1lIDMgLSBlcnJvciBleHBlY3RlZAotICAgICAgICAgICAgbURlcXVldWVFcnJvciA9IG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBnZXREZXF1ZXVlRXJyb3IoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgcmV0dXJuIG1EZXF1ZXVlRXJyb3I7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1BTlc7Ci0gICAgICAgIHN0YXR1c190IG1EZXF1ZXVlRXJyb3I7Ci0gICAgICAgIE11dGV4IG1NdXRleDsKLSAgICB9OwotCi0gICAgc3A8RnJhbWVXYWl0ZXI+IGZ3KG5ldyBGcmFtZVdhaXRlcik7Ci0gICAgbVNULT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKGZ3KTsKLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+c2V0U3luY2hyb25vdXNNb2RlKHRydWUpKTsKLSAgICBBU1NFUlRfRVEoT0ssIG1TVC0+c2V0QnVmZmVyQ291bnRTZXJ2ZXIoMikpOwotCi0gICAgc3A8VGhyZWFkPiBwdChuZXcgUHJvZHVjZXJUaHJlYWQobUFOVykpOwotICAgIHB0LT5ydW4oKTsKLQotICAgIGZ3LT53YWl0Rm9yRnJhbWUoKTsKLSAgICBmdy0+d2FpdEZvckZyYW1lKCk7Ci0KLSAgICAvLyBTbGVlcCBmb3IgMTAwbXMgdG8gYWxsb3cgdGhlIHByb2R1Y2VyIHRocmVhZCdzIGRlcXVldWVCdWZmZXIgY2FsbCB0bwotICAgIC8vIGJsb2NrIHdhaXRpbmcgZm9yIGEgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUuCi0gICAgdXNsZWVwKDEwMDAwMCk7Ci0KLSAgICBtU1QtPmFiYW5kb24oKTsKLQotICAgIHB0LT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLSAgICBBU1NFUlRfRVEoTk9fSU5JVCwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHJvZHVjZXJUaHJlYWQqPihwdC5nZXQoKSktPmdldERlcXVldWVFcnJvcigpKTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUZXN0LCBJbnZhbGlkV2lkdGhPckhlaWdodEZhaWxzKSB7Ci0gICAgaW50IHRleEhlaWdodCA9IDE2OwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKLQotICAgIEdMaW50IG1heFRleHR1cmVTaXplOwotICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJm1heFRleHR1cmVTaXplKTsKLQotICAgIC8vIG1ha2Ugc3VyZSBpdCB3b3JrcyB3aXRoIHNtYWxsIHRleHR1cmVzCi0gICAgbVNULT5zZXREZWZhdWx0QnVmZmVyU2l6ZSgxNiwgdGV4SGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEVYUEVDVF9FUSgxNiwgYW5iLT53aWR0aCk7Ci0gICAgRVhQRUNUX0VRKHRleEhlaWdodCwgYW5iLT5oZWlnaHQpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYW5iKSk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotCi0gICAgLy8gbWFrZSBzdXJlIGl0IHdvcmtzIHdpdGggR0xfTUFYX1RFWFRVUkVfU0laRQotICAgIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUobWF4VGV4dHVyZVNpemUsIHRleEhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICBFWFBFQ1RfRVEobWF4VGV4dHVyZVNpemUsIGFuYi0+d2lkdGgpOwotICAgIEVYUEVDVF9FUSh0ZXhIZWlnaHQsIGFuYi0+aGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIG1BTlctPnF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksIGFuYikpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgbVNULT51cGRhdGVUZXhJbWFnZSgpKTsKLQotICAgIC8vIG1ha2Ugc3VyZSBpdCBmYWlscyB3aXRoIEdMX01BWF9URVhUVVJFX1NJWkUrMQotICAgIG1TVC0+c2V0RGVmYXVsdEJ1ZmZlclNpemUobWF4VGV4dHVyZVNpemUrMSwgdGV4SGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEVYUEVDVF9FUShtYXhUZXh0dXJlU2l6ZSsxLCBhbmItPndpZHRoKTsKLSAgICBFWFBFQ1RfRVEodGV4SGVpZ2h0LCBhbmItPmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLCBhbmIpKTsKLSAgICBBU1NFUlRfTkUoTk9fRVJST1IsIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci19Ci0KLS8qCi0gKiBUaGlzIHRlc3QgZml4dHVyZSBpcyBmb3IgdGVzdGluZyBHTCAtPiBHTCB0ZXh0dXJlIHN0cmVhbWluZy4gIEl0IGNyZWF0ZXMgYW4KLSAqIEVHTFN1cmZhY2UgYW5kIGFuIEVHTENvbnRleHQgZm9yIHRoZSBpbWFnZSBwcm9kdWNlciB0byB1c2UuCi0gKi8KLWNsYXNzIFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdCA6IHB1YmxpYyBTdXJmYWNlVGV4dHVyZUdMVGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0KCk6Ci0gICAgICAgICAgICBtUHJvZHVjZXJFZ2xTdXJmYWNlKEVHTF9OT19TVVJGQUNFKSwKLSAgICAgICAgICAgIG1Qcm9kdWNlckVnbENvbnRleHQoRUdMX05PX0NPTlRFWFQpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFN1cmZhY2VUZXh0dXJlR0xUZXN0OjpTZXRVcCgpOwotCi0gICAgICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsKLSAgICAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAwOwotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGdldENvbmZpZ0F0dHJpYnMoKSwgJm15Q29uZmlnLAotICAgICAgICAgICAgICAgIDEsICZudW1Db25maWdzKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UobUVnbERpc3BsYXksIG15Q29uZmlnLAotICAgICAgICAgICAgICAgIG1BTlcuZ2V0KCksIE5VTEwpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBBU1NFUlRfTkUoRUdMX05PX1NVUkZBQ0UsIG1Qcm9kdWNlckVnbFN1cmZhY2UpOwotCi0gICAgICAgIG1Qcm9kdWNlckVnbENvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KG1FZ2xEaXNwbGF5LCBteUNvbmZpZywKLSAgICAgICAgICAgICAgICBFR0xfTk9fQ09OVEVYVCwgZ2V0Q29udGV4dEF0dHJpYnMoKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fQ09OVEVYVCwgbVByb2R1Y2VyRWdsQ29udGV4dCk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBpZiAobVByb2R1Y2VyRWdsQ29udGV4dCAhPSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICAgICAgZWdsRGVzdHJveUNvbnRleHQobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbENvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUHJvZHVjZXJFZ2xTdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgU3VyZmFjZVRleHR1cmVHTFRlc3Q6OlRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgRUdMU3VyZmFjZSBtUHJvZHVjZXJFZ2xTdXJmYWNlOwotICAgIEVHTENvbnRleHQgbVByb2R1Y2VyRWdsQ29udGV4dDsKLX07Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3QsIFRleHR1cmluZ0Zyb21HTEZpbGxlZFJHQkFCdWZmZXJQb3cyKSB7Ci0gICAgY29uc3QgaW50IHRleFdpZHRoID0gNjQ7Ci0gICAgY29uc3QgaW50IHRleEhlaWdodCA9IDY0OwotCi0gICAgbVNULT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKLQotICAgIC8vIERvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoaW5ncwotICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlLAotICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSwgbVByb2R1Y2VyRWdsQ29udGV4dCkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgd2UgcGljayB1cCBhIGJ1ZmZlciBvZiB0aGUgY29ycmVjdCBzaXplLgotICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlKTsKLQotICAgIGdsQ2xlYXJDb2xvcigwLjYsIDAuNiwgMC42LCAwLjYpOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGdsU2Npc3Nvcig0LCA0LCA0LCA0KTsKLSAgICBnbENsZWFyQ29sb3IoMS4wLCAwLjAsIDAuMCwgMS4wKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xTY2lzc29yKDI0LCA0OCwgNCwgNCk7Ci0gICAgZ2xDbGVhckNvbG9yKDAuMCwgMS4wLCAwLjAsIDEuMCk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgIGdsU2Npc3NvcigzNywgMTcsIDQsIDQpOwotICAgIGdsQ2xlYXJDb2xvcigwLjAsIDAuMCwgMS4wLCAxLjApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSk7Ci0KLSAgICAvLyBEbyB0aGUgY29uc3VtZXIgc2lkZSBvZiB0aGluZ3MKLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbUVnbFN1cmZhY2UsIG1FZ2xTdXJmYWNlLAotICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgZ2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7IC8vIFNraXAgdGhlIGZpcnN0IGZyYW1lLCB3aGljaCB3YXMgZW1wdHkKLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICBnbENsZWFyQ29sb3IoMC4yLCAwLjIsIDAuMiwgMC4yKTsKLSAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0KTsKLSAgICBkcmF3VGV4dHVyZSgpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgIDAsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNjMsICAwLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDYzLCA2MywgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMCwgNjMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggNCwgIDcsIDI1NSwgICAwLCAgIDAsIDI1NSkpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMjUsIDUxLCAgIDAsIDI1NSwgICAwLCAyNTUpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDQwLCAxOSwgICAwLCAgIDAsIDI1NSwgMjU1KSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCgyOSwgNTEsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoIDUsIDMyLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDEzLCAgOCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0NiwgIDMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMzAsIDMzLCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCA2LCA1MiwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg1NSwgMzMsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoMTYsIDI5LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAxLCAzMCwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCg0MSwgMzcsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotICAgIEVYUEVDVF9UUlVFKGNoZWNrUGl4ZWwoNDYsIDI5LCAxNTMsIDE1MywgMTUzLCAxNTMpKTsKLSAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKDE1LCAyNSwgMTUzLCAxNTMsIDE1MywgMTUzKSk7Ci0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMywgNTIsIDE1MywgMTUzLCAxNTMsIDE1MykpOwotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0LCBFZ2xEZXN0cm95U3VyZmFjZVVucmVmc0J1ZmZlcnMpIHsKLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXJzWzNdOwotCi0gICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGFzeW5jIG1vZGUgdG8gcnVuIG9uIGEgc2luZ2xlIHRocmVhZC4KLSAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UsIG1Qcm9kdWNlckVnbENvbnRleHQpKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIEVYUEVDVF9UUlVFKGVnbFN3YXBJbnRlcnZhbChtRWdsRGlzcGxheSwgMCkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAvLyBQcm9kdWNlIGEgZnJhbWUKLSAgICAgICAgRVhQRUNUX1RSVUUoZWdsTWFrZUN1cnJlbnQobUVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSwgbVByb2R1Y2VyRWdsQ29udGV4dCkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSk7Ci0KLSAgICAgICAgLy8gQ29uc3VtZSBhIGZyYW1lCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgICAgICBidWZmZXJzW2ldID0gbVNULT5nZXRDdXJyZW50QnVmZmVyKCk7Ci0gICAgfQotCi0gICAgLy8gRGVzdHJveSB0aGUgR0wgdGV4dHVyZSBvYmplY3QgdG8gcmVsZWFzZSBpdHMgcmVmIG9uIGJ1ZmZlcnNbMl0uCi0gICAgR0x1aW50IHRleElEID0gVEVYX0lEOwotICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleElEKTsKLQotICAgIC8vIERlc3Ryb3kgdGhlIEVHTFN1cmZhY2UKLSAgICBFWFBFQ1RfVFJVRShlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAvLyBSZWxlYXNlIHRoZSByZWYgdGhhdCB0aGUgU3VyZmFjZVRleHR1cmUgaGFzIG9uIGJ1ZmZlcnNbMl0uCi0gICAgbVNULT5hYmFuZG9uKCk7Ci0KLSAgICBFWFBFQ1RfRVEoMSwgYnVmZmVyc1swXS0+Z2V0U3Ryb25nQ291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1ZmZlcnNbMV0tPmdldFN0cm9uZ0NvdW50KCkpOwotCi0gICAgLy8gRGVwZW5kaW5nIG9uIGhvdyBsYXppbHkgdGhlIEdMIGRyaXZlciBkZXF1ZXVlcyBidWZmZXJzLCB3ZSBtYXkgZW5kIHVwCi0gICAgLy8gd2l0aCBlaXRoZXIgdHdvIG9yIHRocmVlIHRvdGFsIGJ1ZmZlcnMuICBJZiB0aGVyZSBhcmUgdGhyZWUsIG1ha2Ugc3VyZQotICAgIC8vIHRoZSBsYXN0IG9uZSB3YXMgcHJvcGVybHkgZG93bi1yZWYnZC4KLSAgICBpZiAoYnVmZmVyc1syXSAhPSBidWZmZXJzWzBdKSB7Ci0gICAgICAgIEVYUEVDVF9FUSgxLCBidWZmZXJzWzJdLT5nZXRTdHJvbmdDb3VudCgpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3QsIEVnbERlc3Ryb3lTdXJmYWNlQWZ0ZXJBYmFuZG9uVW5yZWZzQnVmZmVycykgewotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcnNbM107Ci0KLSAgICAvLyBUaGlzIHRlc3QgcmVxdWlyZXMgYXN5bmMgbW9kZSB0byBydW4gb24gYSBzaW5nbGUgdGhyZWFkLgotICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlLAotICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSwgbVByb2R1Y2VyRWdsQ29udGV4dCkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgRVhQRUNUX1RSVUUoZWdsU3dhcEludGVydmFsKG1FZ2xEaXNwbGF5LCAwKSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIC8vIFByb2R1Y2UgYSBmcmFtZQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgICAgICBtUHJvZHVjZXJFZ2xTdXJmYWNlLCBtUHJvZHVjZXJFZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgLy8gQ29uc3VtZSBhIGZyYW1lCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgICAgICBidWZmZXJzW2ldID0gbVNULT5nZXRDdXJyZW50QnVmZmVyKCk7Ci0gICAgfQotCi0gICAgLy8gQWJhbmRvbiB0aGUgU3VyZmFjZVRleHR1cmUsIHJlbGVhc2luZyB0aGUgcmVmIHRoYXQgdGhlIFN1cmZhY2VUZXh0dXJlIGhhcwotICAgIC8vIG9uIGJ1ZmZlcnNbMl0uCi0gICAgbVNULT5hYmFuZG9uKCk7Ci0KLSAgICAvLyBEZXN0cm95IHRoZSBHTCB0ZXh0dXJlIG9iamVjdCB0byByZWxlYXNlIGl0cyByZWYgb24gYnVmZmVyc1syXS4KLSAgICBHTHVpbnQgdGV4SUQgPSBURVhfSUQ7Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4SUQpOwotCi0gICAgLy8gRGVzdHJveSB0aGUgRUdMU3VyZmFjZS4KLSAgICBFWFBFQ1RfVFJVRShlZ2xEZXN0cm95U3VyZmFjZShtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSkpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBFWFBFQ1RfRVEoMSwgYnVmZmVyc1swXS0+Z2V0U3Ryb25nQ291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGJ1ZmZlcnNbMV0tPmdldFN0cm9uZ0NvdW50KCkpOwotCi0gICAgLy8gRGVwZW5kaW5nIG9uIGhvdyBsYXppbHkgdGhlIEdMIGRyaXZlciBkZXF1ZXVlcyBidWZmZXJzLCB3ZSBtYXkgZW5kIHVwCi0gICAgLy8gd2l0aCBlaXRoZXIgdHdvIG9yIHRocmVlIHRvdGFsIGJ1ZmZlcnMuICBJZiB0aGVyZSBhcmUgdGhyZWUsIG1ha2Ugc3VyZQotICAgIC8vIHRoZSBsYXN0IG9uZSB3YXMgcHJvcGVybHkgZG93bi1yZWYnZC4KLSAgICBpZiAoYnVmZmVyc1syXSAhPSBidWZmZXJzWzBdKSB7Ci0gICAgICAgIEVYUEVDVF9FUSgxLCBidWZmZXJzWzJdLT5nZXRTdHJvbmdDb3VudCgpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUdMVG9HTFRlc3QsIEVnbFN1cmZhY2VEZWZhdWx0c1RvU3luY2hyb25vdXNNb2RlKSB7Ci0gICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIDMgYnVmZmVycyB0byBydW4gb24gYSBzaW5nbGUgdGhyZWFkLgotICAgIG1TVC0+c2V0QnVmZmVyQ291bnRTZXJ2ZXIoMyk7Ci0KLSAgICBBU1NFUlRfVFJVRShtU1QtPmlzU3luY2hyb25vdXNNb2RlKCkpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIC8vIFByb2R1Y2UgYSBmcmFtZQotICAgICAgICBFWFBFQ1RfVFJVRShlZ2xNYWtlQ3VycmVudChtRWdsRGlzcGxheSwgbVByb2R1Y2VyRWdsU3VyZmFjZSwKLSAgICAgICAgICAgICAgICBtUHJvZHVjZXJFZ2xTdXJmYWNlLCBtUHJvZHVjZXJFZ2xDb250ZXh0KSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlKSk7Ci0gICAgICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgLy8gQ29uc3VtZSBhIGZyYW1lCi0gICAgICAgIEVYUEVDVF9UUlVFKGVnbE1ha2VDdXJyZW50KG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSwgbUVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgbUVnbENvbnRleHQpKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotICAgIH0KLQotICAgIEFTU0VSVF9UUlVFKG1TVC0+aXNTeW5jaHJvbm91c01vZGUoKSk7Ci19Ci0KLS8qCi0gKiBUaGlzIHRlc3QgZml4dHVyZSBpcyBmb3IgdGVzdGluZyBHTCAtPiBHTCB0ZXh0dXJlIHN0cmVhbWluZyBmcm9tIG9uZSB0aHJlYWQKLSAqIHRvIGFub3RoZXIuICBJdCBjb250YWlucyBmdW5jdGlvbmFsaXR5IHRvIGNyZWF0ZSBhIHByb2R1Y2VyIHRocmVhZCB0aGF0IHdpbGwKLSAqIHBlcmZvcm0gR0wgcmVuZGVyaW5nIHRvIGFuIEFOYXRpdmVXaW5kb3cgdGhhdCBmZWVkcyBmcmFtZXMgdG8gYQotICogU3VyZmFjZVRleHR1cmUuICBBZGRpdGlvbmFsbHkgaXQgc3VwcG9ydHMgaW50ZXJsb2NraW5nIHRoZSBwcm9kdWNlciBhbmQKLSAqIGNvbnN1bWVyIHRocmVhZHMgc28gdGhhdCBhIHNwZWNpZmljIHNlcXVlbmNlIG9mIGNhbGxzIGNhbiBiZQotICogZGV0ZXJtaW5pc3RpY2FsbHkgY3JlYXRlZCBieSB0aGUgdGVzdC4KLSAqCi0gKiBUaGUgaW50ZW5kZWQgdXNhZ2UgaXMgYXMgZm9sbG93czoKLSAqCi0gKiBURVNUX0YoLi4uKSB7Ci0gKiAgICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgewotICogICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgewotICogICAgICAgICAgICAgLi4uCi0gKiAgICAgICAgICAgICBzd2FwQnVmZmVycygpOwotICogICAgICAgICB9Ci0gKiAgICAgfTsKLSAqCi0gKiAgICAgcnVuUHJvZHVjZXJUaHJlYWQobmV3IFBUKCkpOwotICoKLSAqICAgICAvLyBUaGUgb3JkZXIgb2YgdGhlc2UgY2FsbHMgd2lsbCB2YXJ5IGZyb20gdGVzdCB0byB0ZXN0IGFuZCBtYXkgaW5jbHVkZQotICogICAgIC8vIG11bHRpcGxlIGZyYW1lcyBhbmQgYWRkaXRpb25hbCBvcGVyYXRpb25zIChlLmcuIEdMIHJlbmRlcmluZyBmcm9tIHRoZQotICogICAgIC8vIHRleHR1cmUpLgotICogICAgIGZjLT53YWl0Rm9yRnJhbWUoKTsKLSAqICAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0gKiAgICAgZmMtPmZpbmlzaEZyYW1lKCk7Ci0gKiB9Ci0gKgotICovCi1jbGFzcyBTdXJmYWNlVGV4dHVyZUdMVGhyZWFkVG9HTFRlc3QgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0IHsKLXByb3RlY3RlZDoKLQotICAgIC8vIFByb2R1Y2VyVGhyZWFkIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdG8gc2ltcGxpZnkgdGhlIGNyZWF0aW9uIG9mCi0gICAgLy8gT3BlbkdMIEVTIGZyYW1lIHByb2R1Y2VyIHRocmVhZHMuCi0gICAgY2xhc3MgUHJvZHVjZXJUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgflByb2R1Y2VyVGhyZWFkKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRFZ2xPYmplY3RzKEVHTERpc3BsYXkgcHJvZHVjZXJFZ2xEaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcHJvZHVjZXJFZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIEVHTENvbnRleHQgcHJvZHVjZXJFZ2xDb250ZXh0KSB7Ci0gICAgICAgICAgICBtUHJvZHVjZXJFZ2xEaXNwbGF5ID0gcHJvZHVjZXJFZ2xEaXNwbGF5OwotICAgICAgICAgICAgbVByb2R1Y2VyRWdsU3VyZmFjZSA9IHByb2R1Y2VyRWdsU3VyZmFjZTsKLSAgICAgICAgICAgIG1Qcm9kdWNlckVnbENvbnRleHQgPSBwcm9kdWNlckVnbENvbnRleHQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKLSAgICAgICAgICAgIGVnbE1ha2VDdXJyZW50KG1Qcm9kdWNlckVnbERpc3BsYXksIG1Qcm9kdWNlckVnbFN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlckVnbFN1cmZhY2UsIG1Qcm9kdWNlckVnbENvbnRleHQpOwotICAgICAgICAgICAgcmVuZGVyKCk7Ci0gICAgICAgICAgICBlZ2xNYWtlQ3VycmVudChtUHJvZHVjZXJFZ2xEaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT19DT05URVhUKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgPSAwOwotCi0gICAgICAgIHZvaWQgc3dhcEJ1ZmZlcnMoKSB7Ci0gICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhtUHJvZHVjZXJFZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVHTERpc3BsYXkgbVByb2R1Y2VyRWdsRGlzcGxheTsKLSAgICAgICAgRUdMU3VyZmFjZSBtUHJvZHVjZXJFZ2xTdXJmYWNlOwotICAgICAgICBFR0xDb250ZXh0IG1Qcm9kdWNlckVnbENvbnRleHQ7Ci0gICAgfTsKLQotICAgIC8vIEZyYW1lQ29uZGl0aW9uIGlzIGEgdXRpbGl0eSBjbGFzcyBmb3IgaW50ZXJsb2NraW5nIGJldHdlZW4gdGhlIHByb2R1Y2VyCi0gICAgLy8gYW5kIGNvbnN1bWVyIHRocmVhZHMuICBUaGUgRnJhbWVDb25kaXRpb24gb2JqZWN0IHNob3VsZCBiZSBjcmVhdGVkIGFuZAotICAgIC8vIGRlc3Ryb3llZCBpbiB0aGUgY29uc3VtZXIgdGhyZWFkIG9ubHkuICBUaGUgY29uc3VtZXIgdGhyZWFkIHNob3VsZCBzZXQKLSAgICAvLyB0aGUgRnJhbWVDb25kaXRpb24gYXMgdGhlIEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgb2YgdGhlIFN1cmZhY2VUZXh0dXJlLAotICAgIC8vIGFuZCBzaG91bGQgY2FsbCBib3RoIHdhaXRGb3JGcmFtZSBhbmQgZmluaXNoRnJhbWUgb25jZSBmb3IgZWFjaCBleHBlY3RlZAotICAgIC8vIGZyYW1lLgotICAgIC8vCi0gICAgLy8gVGhpcyBpbnRlcmxvY2tpbmcgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgb25GcmFtZUF2YWlsYWJsZSBnZXRzIGNhbGxlZAotICAgIC8vIHN5bmNocm9ub3VzbHkgZnJvbSBTdXJmYWNlVGV4dHVyZTo6cXVldWVCdWZmZXIuCi0gICAgY2xhc3MgRnJhbWVDb25kaXRpb24gOiBwdWJsaWMgU3VyZmFjZVRleHR1cmU6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgRnJhbWVDb25kaXRpb24oKToKLSAgICAgICAgICAgICAgICBtRnJhbWVBdmFpbGFibGUoZmFsc2UpLAotICAgICAgICAgICAgICAgIG1GcmFtZUZpbmlzaGVkKGZhbHNlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3YWl0Rm9yRnJhbWUgd2FpdHMgZm9yIHRoZSBuZXh0IGZyYW1lIHRvIGFycml2ZS4gIFRoaXMgc2hvdWxkIGJlCi0gICAgICAgIC8vIGNhbGxlZCBmcm9tIHRoZSBjb25zdW1lciB0aHJlYWQgb25jZSBmb3IgZXZlcnkgZnJhbWUgZXhwZWN0ZWQgYnkgdGhlCi0gICAgICAgIC8vIHRlc3QuCi0gICAgICAgIHZvaWQgd2FpdEZvckZyYW1lKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICAgICAgICAgIEFMT0dWKCIrd2FpdEZvckZyYW1lIik7Ci0gICAgICAgICAgICB3aGlsZSAoIW1GcmFtZUF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRnJhbWVBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgIEFMT0dWKCItd2FpdEZvckZyYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGxvdyB0aGUgcHJvZHVjZXIgdG8gcmV0dXJuIGZyb20gaXRzIHN3YXBCdWZmZXJzIGNhbGwgYW5kIGNvbnRpbnVlCi0gICAgICAgIC8vIG9uIHRvIHByb2R1Y2UgdGhlIG5leHQgZnJhbWUuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNvbnN1bWVyCi0gICAgICAgIC8vIHRocmVhZCBvbmNlIGZvciBldmVyeSBmcmFtZSBleHBlY3RlZCBieSB0aGUgdGVzdC4KLSAgICAgICAgdm9pZCBmaW5pc2hGcmFtZSgpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgICAgICAgICBBTE9HVigiK2ZpbmlzaEZyYW1lIik7Ci0gICAgICAgICAgICBtRnJhbWVGaW5pc2hlZCA9IHRydWU7Ci0gICAgICAgICAgICBtRnJhbWVGaW5pc2hDb25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgICAgICBBTE9HVigiLWZpbmlzaEZyYW1lIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgU3VyZmFjZVRleHR1cmUgb24gdGhlIHByb2R1Y2VyIHRocmVhZC4KLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgICAgICAgICAgQUxPR1YoIitvbkZyYW1lQXZhaWxhYmxlIik7Ci0gICAgICAgICAgICBtRnJhbWVBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgICAgICAgICAgd2hpbGUgKCFtRnJhbWVGaW5pc2hlZCkgewotICAgICAgICAgICAgICAgIG1GcmFtZUZpbmlzaENvbmRpdGlvbi53YWl0KG1NdXRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRnJhbWVGaW5pc2hlZCA9IGZhbHNlOwotICAgICAgICAgICAgQUxPR1YoIi1vbkZyYW1lQXZhaWxhYmxlIik7Ci0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgYm9vbCBtRnJhbWVBdmFpbGFibGU7Ci0gICAgICAgIGJvb2wgbUZyYW1lRmluaXNoZWQ7Ci0KLSAgICAgICAgTXV0ZXggbU11dGV4OwotICAgICAgICBDb25kaXRpb24gbUZyYW1lQXZhaWxhYmxlQ29uZGl0aW9uOwotICAgICAgICBDb25kaXRpb24gbUZyYW1lRmluaXNoQ29uZGl0aW9uOwotICAgIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIFN1cmZhY2VUZXh0dXJlR0xUb0dMVGVzdDo6U2V0VXAoKTsKLSAgICAgICAgbUZDID0gbmV3IEZyYW1lQ29uZGl0aW9uKCk7Ci0gICAgICAgIG1TVC0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcihtRkMpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgaWYgKG1Qcm9kdWNlclRocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUHJvZHVjZXJUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOwotICAgICAgICB9Ci0gICAgICAgIG1Qcm9kdWNlclRocmVhZC5jbGVhcigpOwotICAgICAgICBtRkMuY2xlYXIoKTsKLSAgICAgICAgU3VyZmFjZVRleHR1cmVHTFRvR0xUZXN0OjpUZWFyRG93bigpOwotICAgIH0KLQotICAgIHZvaWQgcnVuUHJvZHVjZXJUaHJlYWQoY29uc3Qgc3A8UHJvZHVjZXJUaHJlYWQ+IHByb2R1Y2VyVGhyZWFkKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1Qcm9kdWNlclRocmVhZCA9PSBOVUxMKTsKLSAgICAgICAgbVByb2R1Y2VyVGhyZWFkID0gcHJvZHVjZXJUaHJlYWQ7Ci0gICAgICAgIHByb2R1Y2VyVGhyZWFkLT5zZXRFZ2xPYmplY3RzKG1FZ2xEaXNwbGF5LCBtUHJvZHVjZXJFZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1Qcm9kdWNlckVnbENvbnRleHQpOwotICAgICAgICBwcm9kdWNlclRocmVhZC0+cnVuKCk7Ci0gICAgfQotCi0gICAgc3A8UHJvZHVjZXJUaHJlYWQ+IG1Qcm9kdWNlclRocmVhZDsKLSAgICBzcDxGcmFtZUNvbmRpdGlvbj4gbUZDOwotfTsKLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMVGVzdCwKLSAgICAgICAgVXBkYXRlVGV4SW1hZ2VCZWZvcmVGcmFtZUZpbmlzaGVkQ29tcGxldGVzKSB7Ci0gICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgewotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgewotICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOwotICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgIHN3YXBCdWZmZXJzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcnVuUHJvZHVjZXJUaHJlYWQobmV3IFBUKCkpOwotCi0gICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0gICAgbUZDLT5maW5pc2hGcmFtZSgpOwotCi0gICAgLy8gVE9ETzogQWRkIGZyYW1lIHZlcmlmaWNhdGlvbiBvbmNlIFJHQiBURVhfRVhURVJOQUxfT0VTIGlzIHN1cHBvcnRlZCEKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMVGVzdCwKLSAgICAgICAgVXBkYXRlVGV4SW1hZ2VBZnRlckZyYW1lRmluaXNoZWRDb21wbGV0ZXMpIHsKLSAgICBjbGFzcyBQVCA6IHB1YmxpYyBQcm9kdWNlclRocmVhZCB7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZW5kZXIoKSB7Ci0gICAgICAgICAgICBnbENsZWFyQ29sb3IoMC4wZiwgMS4wZiwgMC4wZiwgMS4wZik7Ci0gICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgc3dhcEJ1ZmZlcnMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7Ci0KLSAgICBtRkMtPndhaXRGb3JGcmFtZSgpOwotICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKLSAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0KLSAgICAvLyBUT0RPOiBBZGQgZnJhbWUgdmVyaWZpY2F0aW9uIG9uY2UgUkdCIFRFWF9FWFRFUk5BTF9PRVMgaXMgc3VwcG9ydGVkIQotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRocmVhZFRvR0xUZXN0LAotICAgICAgICBSZXBlYXRlZFVwZGF0ZVRleEltYWdlQmVmb3JlRnJhbWVGaW5pc2hlZENvbXBsZXRlcykgewotICAgIGVudW0geyBOVU1fSVRFUkFUSU9OUyA9IDEwMjQgfTsKLQotICAgIGNsYXNzIFBUIDogcHVibGljIFByb2R1Y2VyVGhyZWFkIHsKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlbmRlcigpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0lURVJBVElPTlM7IGkrKykgewotICAgICAgICAgICAgICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAxLjBmLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgICAgIEFMT0dWKCIrc3dhcEJ1ZmZlcnMiKTsKLSAgICAgICAgICAgICAgICBzd2FwQnVmZmVycygpOwotICAgICAgICAgICAgICAgIEFMT0dWKCItc3dhcEJ1ZmZlcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyBpKyspIHsKLSAgICAgICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICAgICAgQUxPR1YoIit1cGRhdGVUZXhJbWFnZSIpOwotICAgICAgICBtU1QtPnVwZGF0ZVRleEltYWdlKCk7Ci0gICAgICAgIEFMT0dWKCItdXBkYXRlVGV4SW1hZ2UiKTsKLSAgICAgICAgbUZDLT5maW5pc2hGcmFtZSgpOwotCi0gICAgICAgIC8vIFRPRE86IEFkZCBmcmFtZSB2ZXJpZmljYXRpb24gb25jZSBSR0IgVEVYX0VYVEVSTkFMX09FUyBpcyBzdXBwb3J0ZWQhCi0gICAgfQotfQotCi1URVNUX0YoU3VyZmFjZVRleHR1cmVHTFRocmVhZFRvR0xUZXN0LAotICAgICAgICBSZXBlYXRlZFVwZGF0ZVRleEltYWdlQWZ0ZXJGcmFtZUZpbmlzaGVkQ29tcGxldGVzKSB7Ci0gICAgZW51bSB7IE5VTV9JVEVSQVRJT05TID0gMTAyNCB9OwotCi0gICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgewotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOwotICAgICAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIitzd2FwQnVmZmVycyIpOwotICAgICAgICAgICAgICAgIHN3YXBCdWZmZXJzKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIi1zd2FwQnVmZmVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHJ1blByb2R1Y2VyVGhyZWFkKG5ldyBQVCgpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0lURVJBVElPTlM7IGkrKykgewotICAgICAgICBtRkMtPndhaXRGb3JGcmFtZSgpOwotICAgICAgICBtRkMtPmZpbmlzaEZyYW1lKCk7Ci0gICAgICAgIEFMT0dWKCIrdXBkYXRlVGV4SW1hZ2UiKTsKLSAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgICAgICBBTE9HVigiLXVwZGF0ZVRleEltYWdlIik7Ci0KLSAgICAgICAgLy8gVE9ETzogQWRkIGZyYW1lIHZlcmlmaWNhdGlvbiBvbmNlIFJHQiBURVhfRVhURVJOQUxfT0VTIGlzIHN1cHBvcnRlZCEKLSAgICB9Ci19Ci0KLS8vIFhYWDogVGhpcyB0ZXN0IGlzIGRpc2FibGVkIGJlY2F1c2UgaXQgaXMgY3VycmVudGx5IGhhbmdpbmcgb24gc29tZSBkZXZpY2VzLgotVEVTVF9GKFN1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMVGVzdCwKLSAgICAgICAgRElTQUJMRURfUmVwZWF0ZWRTd2FwQnVmZmVyc1doaWxlRGVxdWV1ZVN0YWxsZWRDb21wbGV0ZXMpIHsKLSAgICBlbnVtIHsgTlVNX0lURVJBVElPTlMgPSA2NCB9OwotCi0gICAgY2xhc3MgUFQgOiBwdWJsaWMgUHJvZHVjZXJUaHJlYWQgewotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyKCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZ2xDbGVhckNvbG9yKDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYpOwotICAgICAgICAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIitzd2FwQnVmZmVycyIpOwotICAgICAgICAgICAgICAgIHN3YXBCdWZmZXJzKCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIi1zd2FwQnVmZmVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRTeW5jaHJvbm91c01vZGUodHJ1ZSkpOwotICAgIEFTU0VSVF9FUShPSywgbVNULT5zZXRCdWZmZXJDb3VudFNlcnZlcigyKSk7Ci0KLSAgICBydW5Qcm9kdWNlclRocmVhZChuZXcgUFQoKSk7Ci0KLSAgICAvLyBBbGxvdyB0aHJlZSBmcmFtZXMgdG8gYmUgcmVuZGVyZWQgYW5kIHF1ZXVlZCBiZWZvcmUgc3RhcnRpbmcgdGhlCi0gICAgLy8gcmVuZGVyaW5nIGluIHRoaXMgdGhyZWFkLiAgRm9yIHRoZSBsYXR0ZXIgdHdvIGZyYW1lcyB3ZSBkb24ndCBjYWxsCi0gICAgLy8gdXBkYXRlVGV4SW1hZ2Ugc28gdGhlIG5leHQgZGVxdWV1ZSBmcm9tIHRoZSBwcm9kdWNlciB0aHJlYWQgd2lsbCBibG9jawotICAgIC8vIHdhaXRpbmcgZm9yIGEgZnJhbWUgdG8gYmVjb21lIGF2YWlsYWJsZS4KLSAgICBtRkMtPndhaXRGb3JGcmFtZSgpOwotICAgIG1GQy0+ZmluaXNoRnJhbWUoKTsKLQotICAgIC8vIFdlIG11c3QgY2FsbCB1cGRhdGVUZXhJbWFnZSB0byBjb25zdW1lIHRoZSBmaXJzdCBmcmFtZSBzbyB0aGF0IHRoZQotICAgIC8vIFN1cmZhY2VUZXh0dXJlIGlzIGFibGUgdG8gcmVkdWNlIHRoZSBidWZmZXIgY291bnQgdG8gMi4gIFRoaXMgaXMgYmVjYXVzZQotICAgIC8vIHRoZSBHTCBkcml2ZXIgbWF5IGRlcXVldWUgYSBidWZmZXIgd2hlbiB0aGUgRUdMU3VyZmFjZSBpcyBjcmVhdGVkLCBhbmQKLSAgICAvLyB0aGF0IGhhcHBlbnMgYmVmb3JlIHdlIGNhbGwgc2V0QnVmZmVyQ291bnRTZXJ2ZXIuICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi0gICAgLy8gZHJpdmVyIGRvZXMgbm90IGRlcXVldWUgYSBidWZmZXIgYXQgRUdMU3VyZmFjZSBjcmVhdGlvbiB0aW1lLCBzbyB3ZQotICAgIC8vIGNhbm5vdCByZWx5IG9uIHRoaXMgdG8gY2F1c2UgdGhlIHNlY29uZCBkZXF1ZXVlQnVmZmVyIGNhbGwgdG8gYmxvY2suCi0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICBtRkMtPmZpbmlzaEZyYW1lKCk7Ci0gICAgbUZDLT53YWl0Rm9yRnJhbWUoKTsKLSAgICBtRkMtPmZpbmlzaEZyYW1lKCk7Ci0KLSAgICAvLyBTbGVlcCBmb3IgMTAwbXMgdG8gYWxsb3cgdGhlIHByb2R1Y2VyIHRocmVhZCdzIGRlcXVldWVCdWZmZXIgY2FsbCB0bwotICAgIC8vIGJsb2NrIHdhaXRpbmcgZm9yIGEgYnVmZmVyIHRvIGJlY29tZSBhdmFpbGFibGUuCi0gICAgdXNsZWVwKDEwMDAwMCk7Ci0KLSAgICAvLyBSZW5kZXIgYW5kIHByZXNlbnQgYSBudW1iZXIgb2YgaW1hZ2VzLiAgVGhpcyB0aHJlYWQgc2hvdWxkIG5vdCBiZSBibG9ja2VkCi0gICAgLy8gYnkgdGhlIGZhY3QgdGhhdCB0aGUgcHJvZHVjZXIgdGhyZWFkIGlzIGJsb2NraW5nIGluIGRlcXVldWUuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgaSsrKSB7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKG1FZ2xEaXNwbGF5LCBtRWdsU3VyZmFjZSk7Ci0gICAgfQotCi0gICAgLy8gQ29uc3VtZSB0aGUgdHdvIHBlbmRpbmcgYnVmZmVycyB0byB1bmJsb2NrIHRoZSBwcm9kdWNlciB0aHJlYWQuCi0gICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKTsKLQotICAgIC8vIENvbnN1bWUgdGhlIHJlbWFpbmluZyBidWZmZXJzIGZyb20gdGhlIHByb2R1Y2VyIHRocmVhZC4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TLTM7IGkrKykgewotICAgICAgICBtRkMtPndhaXRGb3JGcmFtZSgpOwotICAgICAgICBtRkMtPmZpbmlzaEZyYW1lKCk7Ci0gICAgICAgIEFMT0dWKCIrdXBkYXRlVGV4SW1hZ2UiKTsKLSAgICAgICAgbVNULT51cGRhdGVUZXhJbWFnZSgpOwotICAgICAgICBBTE9HVigiLXVwZGF0ZVRleEltYWdlIik7Ci0gICAgfQotfQotCi1jbGFzcyBTdXJmYWNlVGV4dHVyZUZCT1Rlc3QgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmVHTFRlc3QgewotcHJvdGVjdGVkOgotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBTdXJmYWNlVGV4dHVyZUdMVGVzdDo6U2V0VXAoKTsKLQotICAgICAgICBnbEdlbkZyYW1lYnVmZmVycygxLCAmbUZibyk7Ci0gICAgICAgIEFTU0VSVF9FUShHTGVudW0oR0xfTk9fRVJST1IpLCBnbEdldEVycm9yKCkpOwotCi0gICAgICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1GYm9UZXgpOwotICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GYm9UZXgpOwotICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgZ2V0U3VyZmFjZVdpZHRoKCksCi0gICAgICAgICAgICAgICAgZ2V0U3VyZmFjZUhlaWdodCgpLCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKTsKLSAgICAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICAgICAgQVNTRVJUX0VRKEdMZW51bShHTF9OT19FUlJPUiksIGdsR2V0RXJyb3IoKSk7Ci0KLSAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GYm8pOwotICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwKLSAgICAgICAgICAgICAgICBHTF9URVhUVVJFXzJELCBtRmJvVGV4LCAwKTsKLSAgICAgICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOwotICAgICAgICBBU1NFUlRfRVEoR0xlbnVtKEdMX05PX0VSUk9SKSwgZ2xHZXRFcnJvcigpKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIFN1cmZhY2VUZXh0dXJlR0xUZXN0OjpUZWFyRG93bigpOwotCi0gICAgICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1GYm9UZXgpOwotICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmbUZibyk7Ci0gICAgfQotCi0gICAgR0x1aW50IG1GYm87Ci0gICAgR0x1aW50IG1GYm9UZXg7Ci19OwotCi0vLyBUaGlzIHRlc3QgaXMgaW50ZW5kZWQgdG8gdmVyaWZ5IHRoYXQgcHJvcGVyIHN5bmNocm9uaXphdGlvbiBpcyBkb25lIHdoZW4KLS8vIHJlbmRlcmluZyBpbnRvIGFuIEZCTy4KLVRFU1RfRihTdXJmYWNlVGV4dHVyZUZCT1Rlc3QsIEJsaXRGcm9tQ3B1RmlsbGVkQnVmZmVyVG9GYm8pIHsKLSAgICBjb25zdCBpbnQgdGV4V2lkdGggPSA2NDsKLSAgICBjb25zdCBpbnQgdGV4SGVpZ2h0ID0gNjQ7Ci0KLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkobUFOVy5nZXQoKSwKLSAgICAgICAgICAgIHRleFdpZHRoLCB0ZXhIZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4KSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQU5XLmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTikpOwotCi0gICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QqIGFuYjsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmRlcXVldWVCdWZmZXIobUFOVy5nZXQoKSwgJmFuYikpOwotICAgIEFTU0VSVF9UUlVFKGFuYiAhPSBOVUxMKTsKLQotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5sb2NrQnVmZmVyKG1BTlcuZ2V0KCksIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgIC8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIGdyZWVuCi0gICAgdWludDhfdCogaW1nID0gTlVMTDsKLSAgICBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgIGZpbGxSR0JBOEJ1ZmZlclNvbGlkKGltZywgdGV4V2lkdGgsIHRleEhlaWdodCwgYnVmLT5nZXRTdHJpZGUoKSwgMCwgMjU1LAotICAgICAgICAgICAgMCwgMjU1KTsKLSAgICBidWYtPnVubG9jaygpOwotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUFOVy0+cXVldWVCdWZmZXIobUFOVy5nZXQoKSwgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSkpOwotCi0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU1QtPnVwZGF0ZVRleEltYWdlKCkpOwotCi0gICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GYm8pOwotICAgIGRyYXdUZXh0dXJlKCk7Ci0gICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKFN0cmluZzg6OmZvcm1hdCgiZnJhbWUgJWQiLCBpKS5zdHJpbmcoKSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5kZXF1ZXVlQnVmZmVyKG1BTlcuZ2V0KCksICZhbmIpKTsKLSAgICAgICAgQVNTRVJUX1RSVUUoYW5iICE9IE5VTEwpOwotCi0gICAgICAgIGJ1ZiA9IG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1BTlctPmxvY2tCdWZmZXIobUFOVy5nZXQoKSwKLSAgICAgICAgICAgICAgICBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpKSk7Ci0KLSAgICAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggcmVkCi0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgYnVmLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sCi0gICAgICAgICAgICAgICAgKHZvaWQqKikoJmltZykpKTsKLSAgICAgICAgZmlsbFJHQkE4QnVmZmVyU29saWQoaW1nLCB0ZXhXaWR0aCwgdGV4SGVpZ2h0LCBidWYtPmdldFN0cmlkZSgpLCAyNTUsIDAsCi0gICAgICAgICAgICAgICAgMCwgMjU1KTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBidWYtPnVubG9jaygpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQU5XLT5xdWV1ZUJ1ZmZlcihtQU5XLmdldCgpLAotICAgICAgICAgICAgICAgIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCkpKTsKLQotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1TVC0+dXBkYXRlVGV4SW1hZ2UoKSk7Ci0KLSAgICAgICAgZHJhd1RleHR1cmUoKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShjaGVja1BpeGVsKCAyNCwgMzksIDI1NSwgMCwgMCwgMjU1KSk7Ci0gICAgfQotCi0gICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIG1GYm8pOwotCi0gICAgRVhQRUNUX1RSVUUoY2hlY2tQaXhlbCggMjQsIDM5LCAwLCAyNTUsIDAsIDI1NSkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9TdXJmYWNlX3Rlc3QuY3BwIGIvbGlicy9ndWkvdGVzdHMvU3VyZmFjZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NWQ2OC4uMDAwMDAwMAotLS0gYS9saWJzL2d1aS90ZXN0cy9TdXJmYWNlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL2d1aS9Db21wb3NlclNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdXJmYWNlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgbUNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQ29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKLQotICAgICAgICBtU3VyZmFjZUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgU3RyaW5nOCgiVGVzdCBTdXJmYWNlIiksIDAsIDMyLCAzMiwgUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMCk7Ci0KLSAgICAgICAgQVNTRVJUX1RSVUUobVN1cmZhY2VDb250cm9sICE9IE5VTEwpOwotICAgICAgICBBU1NFUlRfVFJVRShtU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0KLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNldExheWVyKDB4N2ZmZmZmZmYpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbigpOwotCi0gICAgICAgIG1TdXJmYWNlID0gbVN1cmZhY2VDb250cm9sLT5nZXRTdXJmYWNlKCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1TdXJmYWNlICE9IE5VTEwpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbUNvbXBvc2VyQ2xpZW50LT5kaXNwb3NlKCk7Ci0gICAgfQotCi0gICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7Ci0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1TdXJmYWNlQ29udHJvbDsKLX07Ci0KLVRFU1RfRihTdXJmYWNlVGVzdCwgUXVldWVzVG9XaW5kb3dDb21wb3NlcklzVHJ1ZVdoZW5WaXNpYmxlKSB7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TdXJmYWNlKTsKLSAgICBpbnQgcmVzdWx0ID0gLTEyMzsKLSAgICBpbnQgZXJyID0gYW53LT5xdWVyeShhbncuZ2V0KCksIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUiwKLSAgICAgICAgICAgICZyZXN1bHQpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmVzdWx0KTsKLX0KLQotVEVTVF9GKFN1cmZhY2VUZXN0LCBRdWV1ZXNUb1dpbmRvd0NvbXBvc2VySXNUcnVlV2hlblB1cmdhdG9yaXplZCkgewotICAgIG1TdXJmYWNlQ29udHJvbC5jbGVhcigpOwotCi0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gYW53KG1TdXJmYWNlKTsKLSAgICBpbnQgcmVzdWx0ID0gLTEyMzsKLSAgICBpbnQgZXJyID0gYW53LT5xdWVyeShhbncuZ2V0KCksIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUiwKLSAgICAgICAgICAgICZyZXN1bHQpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmVzdWx0KTsKLX0KLQotLy8gVGhpcyB0ZXN0IHByb2JhYmx5IGRvZXNuJ3QgYmVsb25nIGhlcmUuCi1URVNUX0YoU3VyZmFjZVRlc3QsIFNjcmVlbnNob3RzT2ZQcm90ZWN0ZWRCdWZmZXJzU3VjY2VlZCkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU3VyZmFjZSk7Ci0KLSAgICAvLyBWZXJpZnkgdGhlIHNjcmVlbnNob3Qgd29ya3Mgd2l0aCBubyBwcm90ZWN0ZWQgYnVmZmVycy4KLSAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcDsKLSAgICB1aW50MzJfdCB3PTAsIGg9MDsKLSAgICBQaXhlbEZvcm1hdCBmbXQ9MDsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBzZihDb21wb3NlclNlcnZpY2U6OmdldENvbXBvc2VyU2VydmljZSgpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHNmLT5jYXB0dXJlU2NyZWVuKDAsICZoZWFwLCAmdywgJmgsICZmbXQsIDY0LCA2NCwgMCwKLSAgICAgICAgICAgIDB4N2ZmZmZmZmYpKTsKLSAgICBBU1NFUlRfVFJVRShoZWFwICE9IE5VTEwpOwotCi0gICAgLy8gU2V0IHRoZSBQUk9URUNURUQgdXNhZ2UgYml0IGFuZCB2ZXJpZnkgdGhhdCB0aGUgc2NyZWVuc2hvdCBmYWlscy4gIE5vdGUKLSAgICAvLyB0aGF0IHdlIG5lZWQgdG8gZGVxdWV1ZSBhIGJ1ZmZlciBpbiBvcmRlciBmb3IgaXQgdG8gYWN0dWFsbHkgZ2V0Ci0gICAgLy8gYWxsb2NhdGVkIGluIFN1cmZhY2VGbGluZ2VyLgotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UoYW53LmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9QUk9URUNURUQpKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChhbncuZ2V0KCksIDMpKTsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWYgPSAwOwotCi0gICAgc3RhdHVzX3QgZXJyID0gYW53LT5kZXF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgJmJ1Zik7Ci0gICAgaWYgKGVycikgewotICAgICAgICAvLyB3ZSBjb3VsZCBmYWlsIGlmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAgIC8vIHRoYXQncyBva2F5IGFzIGxvbmcgYXMgdGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZS4KLSAgICAgICAgLy8gdHJ5IGFnYWluIHdpdGhvdXQgdGhlIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEIGJpdC4KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBuYXRpdmVfd2luZG93X3NldF91c2FnZShhbncuZ2V0KCksIDApKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhbnctPmRlcXVldWVCdWZmZXIoYW53LmdldCgpLCAmYnVmKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhbnctPmNhbmNlbEJ1ZmZlcihhbncuZ2V0KCksIGJ1ZikpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgLy8gTG9vcCB0byBtYWtlIHN1cmUgU3VyZmFjZUZsaW5nZXIgaGFzIHJldGlyZWQgYSBwcm90ZWN0ZWQgYnVmZmVyLgotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGFudy0+ZGVxdWV1ZUJ1ZmZlcihhbncuZ2V0KCksICZidWYpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhbnctPmxvY2tCdWZmZXIoYW53LmdldCgpLCBidWYpKTsKLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBhbnctPnF1ZXVlQnVmZmVyKGFudy5nZXQoKSwgYnVmKSk7Ci0gICAgfQotICAgIGhlYXAgPSAwOwotICAgIHcgPSBoID0gZm10ID0gMDsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHNmLT5jYXB0dXJlU2NyZWVuKDAsICZoZWFwLCAmdywgJmgsICZmbXQsCi0gICAgICAgICAgICA2NCwgNjQsIDAsIDB4N2ZmZmZmZmYpKTsKLSAgICBBU1NFUlRfVFJVRShoZWFwICE9IE5VTEwpOwotfQotCi1URVNUX0YoU3VyZmFjZVRlc3QsIENvbmNyZXRlVHlwZUlzU3VyZmFjZSkgewotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyhtU3VyZmFjZSk7Ci0gICAgaW50IHJlc3VsdCA9IC0xMjM7Ci0gICAgaW50IGVyciA9IGFudy0+cXVlcnkoYW53LmdldCgpLCBOQVRJVkVfV0lORE9XX0NPTkNSRVRFX1RZUEUsICZyZXN1bHQpOwotICAgIEVYUEVDVF9FUShOT19FUlJPUiwgZXJyKTsKLSAgICBFWFBFQ1RfRVEoTkFUSVZFX1dJTkRPV19TVVJGQUNFLCByZXN1bHQpOwotfQotCi19CmRpZmYgLS1naXQgYS9saWJzL3VpL0FuZHJvaWQubWsgYi9saWJzL3VpL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZmY3YTQuLjAwMDAwMDAKLS0tIGEvbGlicy91aS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCUZyYW1lYnVmZmVyTmF0aXZlV2luZG93LmNwcCBcCi0JR3JhcGhpY0J1ZmZlci5jcHAgXAotCUdyYXBoaWNCdWZmZXJBbGxvY2F0b3IuY3BwIFwKLQlHcmFwaGljQnVmZmVyTWFwcGVyLmNwcCBcCi0JUGl4ZWxGb3JtYXQuY3BwIFwKLQlSZWN0LmNwcCBcCi0JUmVnaW9uLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLQlsaWJoYXJkd2FyZQotCi1pZm5lcSAoJChCT0FSRF9GUkFNRUJVRkZFUl9GT1JDRV9GT1JNQVQpLCkKLUxPQ0FMX0NGTEFHUyArPSAtREZSQU1FQlVGRkVSX0ZPUkNFX0ZPUk1BVD0kKEJPQVJEX0ZSQU1FQlVGRkVSX0ZPUkNFX0ZPUk1BVCkKLWVuZGlmCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnVpCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotCi0jIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKLSMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KLWlmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvdWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuY3BwIGIvbGlicy91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzk5YjYuLjAwMDAwMDAKLS0tIGEvbGlicy91aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyogCi0qKgotKiogQ29weXJpZ2h0IDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUyAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5EIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2RlZmluZSBMT0dfVEFHICJGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPHVpL0FOYXRpdmVPYmplY3RCYXNlLmg+Ci0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBOYXRpdmVCdWZmZXIgCi0gICAgOiBwdWJsaWMgQU5hdGl2ZU9iamVjdEJhc2U8Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIsIAotICAgICAgICBOYXRpdmVCdWZmZXIsIAotICAgICAgICBMaWdodFJlZkJhc2U8TmF0aXZlQnVmZmVyPiA+Ci17Ci1wdWJsaWM6Ci0gICAgTmF0aXZlQnVmZmVyKGludCB3LCBpbnQgaCwgaW50IGYsIGludCB1KSA6IEJBU0UoKSB7Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXI6OndpZHRoICA9IHc7Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXI6OmhlaWdodCA9IGg7Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXI6OmZvcm1hdCA9IGY7Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXI6OnVzYWdlICA9IHU7Ci0gICAgfQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgTGlnaHRSZWZCYXNlPE5hdGl2ZUJ1ZmZlcj47ICAgIAotICAgIH5OYXRpdmVCdWZmZXIoKSB7IH07IC8vIHRoaXMgY2xhc3MgY2Fubm90IGJlIG92ZXJsb2FkZWQKLX07Ci0KLQotLyoKLSAqIFRoaXMgaW1wbGVtZW50cyB0aGUgKG1haW4pIGZyYW1lYnVmZmVyIG1hbmFnZW1lbnQuIFRoaXMgY2xhc3MgaXMgdXNlZAotICogbW9zdGx5IGJ5IFN1cmZhY2VGbGluZ2VyLCBidXQgYWxzbyBieSBjb21tYW5kIGxpbmUgR0wgYXBwbGljYXRpb24uCi0gKiAKLSAqIEluIGZhY3QgdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBBTmF0aXZlV2luZG93IG9uIHRvcCBvZgotICogdGhlIGZyYW1lYnVmZmVyLgotICogCi0gKiBDdXJyZW50bHkgaXQgaXMgcHJldHR5IHNpbXBsZSwgaXQgbWFuYWdlcyBvbmx5IHR3byBidWZmZXJzICh0aGUgZnJvbnQgYW5kIAotICogYmFjayBidWZmZXIpLgotICogCi0gKi8KLQotRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OkZyYW1lYnVmZmVyTmF0aXZlV2luZG93KCkgCi0gICAgOiBCQVNFKCksIGZiRGV2KDApLCBnckRldigwKSwgbVVwZGF0ZU9uRGVtYW5kKGZhbHNlKQotewotICAgIGh3X21vZHVsZV90IGNvbnN0KiBtb2R1bGU7Ci0gICAgaWYgKGh3X2dldF9tb2R1bGUoR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZtb2R1bGUpID09IDApIHsKLSAgICAgICAgaW50IHN0cmlkZTsKLSAgICAgICAgaW50IGVycjsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGVyciA9IGZyYW1lYnVmZmVyX29wZW4obW9kdWxlLCAmZmJEZXYpOwotICAgICAgICBBTE9HRV9JRihlcnIsICJjb3VsZG4ndCBvcGVuIGZyYW1lYnVmZmVyIEhBTCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAKLSAgICAgICAgZXJyID0gZ3JhbGxvY19vcGVuKG1vZHVsZSwgJmdyRGV2KTsKLSAgICAgICAgQUxPR0VfSUYoZXJyLCAiY291bGRuJ3Qgb3BlbiBncmFsbG9jIEhBTCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgICAgIC8vIGJhaWwgb3V0IGlmIHdlIGNhbid0IGluaXRpYWxpemUgdGhlIG1vZHVsZXMKLSAgICAgICAgaWYgKCFmYkRldiB8fCAhZ3JEZXYpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgICAgICBtVXBkYXRlT25EZW1hbmQgPSAoZmJEZXYtPnNldFVwZGF0ZVJlY3QgIT0gMCk7Ci0gICAgICAgIAotICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBidWZmZXIgRklGTwotICAgICAgICBtTnVtQnVmZmVycyA9IE5VTV9GUkFNRV9CVUZGRVJTOwotICAgICAgICBtTnVtRnJlZUJ1ZmZlcnMgPSBOVU1fRlJBTUVfQlVGRkVSUzsKLSAgICAgICAgbUJ1ZmZlckhlYWQgPSBtTnVtQnVmZmVycy0xOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgY2hhbmdlIHRoZSBmcmFtZWJ1ZmZlciBmb3JtYXQuIEl0IG1lcmVseQotICAgICAgICAgKiBmYWtlcyB0aGlzIGZvcm1hdCB0byBzdXJmYWNlZmxpbmdlciBzbyB0aGF0IHdoZW4gaXQgY3JlYXRlcwotICAgICAgICAgKiBmcmFtZWJ1ZmZlciBzdXJmYWNlcyBpdCB3aWxsIHVzZSB0aGlzIGZvcm1hdC4gSXQncyByZWFsbHkgYSBnaWFudAotICAgICAgICAgKiBIQUNLIHRvIGFsbG93IGludGVyd29ya2luZyB3aXRoIGJ1Z2d5IGdyYWxsb2MrR1BVIGRyaXZlcgotICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbnMuIFlvdSBzaG91bGQgKk5FVkVSKiBuZWVkIHRvIHNldCB0aGlzIGZvciBzaGlwcGluZwotICAgICAgICAgKiBkZXZpY2VzLgotICAgICAgICAgKi8KLSNpZmRlZiBGUkFNRUJVRkZFUl9GT1JDRV9GT1JNQVQKLSAgICAgICAgKigodWludDMyX3QgKikmZmJEZXYtPmZvcm1hdCkgPSBGUkFNRUJVRkZFUl9GT1JDRV9GT1JNQVQ7Ci0jZW5kaWYKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bUJ1ZmZlcnM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1ZmZlcnNbaV0gPSBuZXcgTmF0aXZlQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBmYkRldi0+Zm9ybWF0LCBHUkFMTE9DX1VTQUdFX0hXX0ZCKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtTnVtQnVmZmVyczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyID0gZ3JEZXYtPmFsbG9jKGdyRGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgZmJEZXYtPndpZHRoLCBmYkRldi0+aGVpZ2h0LCBmYkRldi0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19GQiwgJmJ1ZmZlcnNbaV0tPmhhbmRsZSwgJmJ1ZmZlcnNbaV0tPnN0cmlkZSk7Ci0KLSAgICAgICAgICAgICAgICBBTE9HRV9JRihlcnIsICJmYiBidWZmZXIgJWQgYWxsb2NhdGlvbiBmYWlsZWQgdz0lZCwgaD0lZCwgZXJyPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGZiRGV2LT53aWR0aCwgZmJEZXYtPmhlaWdodCwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgICAgICAgICAgICAgaWYgKGVycikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtQnVmZmVycyA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtRnJlZUJ1ZmZlcnMgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckhlYWQgPSBtTnVtQnVmZmVycy0xOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3RfY2FzdDx1aW50MzJfdCY+KEFOYXRpdmVXaW5kb3c6OmZsYWdzKSA9IGZiRGV2LT5mbGFnczsgCi0gICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQmPihBTmF0aXZlV2luZG93Ojp4ZHBpKSA9IGZiRGV2LT54ZHBpOwotICAgICAgICBjb25zdF9jYXN0PGZsb2F0Jj4oQU5hdGl2ZVdpbmRvdzo6eWRwaSkgPSBmYkRldi0+eWRwaTsKLSAgICAgICAgY29uc3RfY2FzdDxpbnQmPihBTmF0aXZlV2luZG93OjptaW5Td2FwSW50ZXJ2YWwpID0gCi0gICAgICAgICAgICBmYkRldi0+bWluU3dhcEludGVydmFsOwotICAgICAgICBjb25zdF9jYXN0PGludCY+KEFOYXRpdmVXaW5kb3c6Om1heFN3YXBJbnRlcnZhbCkgPSAKLSAgICAgICAgICAgIGZiRGV2LT5tYXhTd2FwSW50ZXJ2YWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkbid0IGdldCBncmFsbG9jIG1vZHVsZSIpOwotICAgIH0KLQotICAgIEFOYXRpdmVXaW5kb3c6OnNldFN3YXBJbnRlcnZhbCA9IHNldFN3YXBJbnRlcnZhbDsKLSAgICBBTmF0aXZlV2luZG93OjpkZXF1ZXVlQnVmZmVyID0gZGVxdWV1ZUJ1ZmZlcjsKLSAgICBBTmF0aXZlV2luZG93Ojpsb2NrQnVmZmVyID0gbG9ja0J1ZmZlcjsKLSAgICBBTmF0aXZlV2luZG93OjpxdWV1ZUJ1ZmZlciA9IHF1ZXVlQnVmZmVyOwotICAgIEFOYXRpdmVXaW5kb3c6OnF1ZXJ5ID0gcXVlcnk7Ci0gICAgQU5hdGl2ZVdpbmRvdzo6cGVyZm9ybSA9IHBlcmZvcm07Ci19Ci0KLUZyYW1lYnVmZmVyTmF0aXZlV2luZG93Ojp+RnJhbWVidWZmZXJOYXRpdmVXaW5kb3coKSAKLXsKLSAgICBpZiAoZ3JEZXYpIHsKLSAgICAgICAgaWYgKGJ1ZmZlcnNbMF0gIT0gTlVMTCkKLSAgICAgICAgICAgIGdyRGV2LT5mcmVlKGdyRGV2LCBidWZmZXJzWzBdLT5oYW5kbGUpOwotICAgICAgICBpZiAoYnVmZmVyc1sxXSAhPSBOVUxMKQotICAgICAgICAgICAgZ3JEZXYtPmZyZWUoZ3JEZXYsIGJ1ZmZlcnNbMV0tPmhhbmRsZSk7Ci0gICAgICAgIGdyYWxsb2NfY2xvc2UoZ3JEZXYpOwotICAgIH0KLQotICAgIGlmIChmYkRldikgewotICAgICAgICBmcmFtZWJ1ZmZlcl9jbG9zZShmYkRldik7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6c2V0VXBkYXRlUmVjdGFuZ2xlKGNvbnN0IFJlY3QmIHIpIAotewotICAgIGlmICghbVVwZGF0ZU9uRGVtYW5kKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgcmV0dXJuIGZiRGV2LT5zZXRVcGRhdGVSZWN0KGZiRGV2LCByLmxlZnQsIHIudG9wLCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotfQotCi1zdGF0dXNfdCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6Y29tcG9zaXRpb25Db21wbGV0ZSgpCi17Ci0gICAgaWYgKGZiRGV2LT5jb21wb3NpdGlvbkNvbXBsZXRlKSB7Ci0gICAgICAgIHJldHVybiBmYkRldi0+Y29tcG9zaXRpb25Db21wbGV0ZShmYkRldik7Ci0gICAgfQotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotaW50IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpzZXRTd2FwSW50ZXJ2YWwoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50IGludGVydmFsKSAKLXsKLSAgICBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCogZmIgPSBnZXRTZWxmKHdpbmRvdyktPmZiRGV2OwotICAgIHJldHVybiBmYi0+c2V0U3dhcEludGVydmFsKGZiLCBpbnRlcnZhbCk7Ci19Ci0KLXZvaWQgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OmR1bXAoU3RyaW5nOCYgcmVzdWx0KSB7Ci0gICAgaWYgKGZiRGV2LT5jb21tb24udmVyc2lvbiA+PSAxICYmIGZiRGV2LT5kdW1wKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNDA5NjsKLSAgICAgICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICAgICAgZmJEZXYtPmR1bXAoZmJEZXYsIGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci19Ci0KLS8vIG9ubHkgZm9yIGRlYnVnZ2luZyAvIGxvZ2dpbmcKLWludCBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdzo6Z2V0Q3VycmVudEJ1ZmZlckluZGV4KCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobXV0ZXgpOwotICAgIGNvbnN0IGludCBpbmRleCA9IG1DdXJyZW50QnVmZmVySW5kZXg7Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1pbnQgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OmRlcXVldWVCdWZmZXIoQU5hdGl2ZVdpbmRvdyogd2luZG93LCAKLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlcioqIGJ1ZmZlcikKLXsKLSAgICBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyogc2VsZiA9IGdldFNlbGYod2luZG93KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woc2VsZi0+bXV0ZXgpOwotICAgIGZyYW1lYnVmZmVyX2RldmljZV90KiBmYiA9IHNlbGYtPmZiRGV2OwotCi0gICAgaW50IGluZGV4ID0gc2VsZi0+bUJ1ZmZlckhlYWQrKzsKLSAgICBpZiAoc2VsZi0+bUJ1ZmZlckhlYWQgPj0gc2VsZi0+bU51bUJ1ZmZlcnMpCi0gICAgICAgIHNlbGYtPm1CdWZmZXJIZWFkID0gMDsKLQotICAgIC8vIHdhaXQgZm9yIGEgZnJlZSBidWZmZXIKLSAgICB3aGlsZSAoIXNlbGYtPm1OdW1GcmVlQnVmZmVycykgewotICAgICAgICBzZWxmLT5tQ29uZGl0aW9uLndhaXQoc2VsZi0+bXV0ZXgpOwotICAgIH0KLSAgICAvLyBnZXQgdGhpcyBidWZmZXIKLSAgICBzZWxmLT5tTnVtRnJlZUJ1ZmZlcnMtLTsKLSAgICBzZWxmLT5tQ3VycmVudEJ1ZmZlckluZGV4ID0gaW5kZXg7Ci0KLSAgICAqYnVmZmVyID0gc2VsZi0+YnVmZmVyc1tpbmRleF0uZ2V0KCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93Ojpsb2NrQnVmZmVyKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcikKLXsKLSAgICBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyogc2VsZiA9IGdldFNlbGYod2luZG93KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woc2VsZi0+bXV0ZXgpOwotCi0gICAgY29uc3QgaW50IGluZGV4ID0gc2VsZi0+bUN1cnJlbnRCdWZmZXJJbmRleDsKLQotICAgIC8vIHdhaXQgdGhhdCB0aGUgYnVmZmVyIHdlJ3JlIGxvY2tpbmcgaXMgbm90IGZyb250IGFueW1vcmUKLSAgICB3aGlsZSAoc2VsZi0+ZnJvbnQgPT0gYnVmZmVyKSB7Ci0gICAgICAgIHNlbGYtPm1Db25kaXRpb24ud2FpdChzZWxmLT5tdXRleCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OnF1ZXVlQnVmZmVyKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcikKLXsKLSAgICBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyogc2VsZiA9IGdldFNlbGYod2luZG93KTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woc2VsZi0+bXV0ZXgpOwotICAgIGZyYW1lYnVmZmVyX2RldmljZV90KiBmYiA9IHNlbGYtPmZiRGV2OwotICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUgPSBzdGF0aWNfY2FzdDxOYXRpdmVCdWZmZXIqPihidWZmZXIpLT5oYW5kbGU7Ci0KLSAgICBjb25zdCBpbnQgaW5kZXggPSBzZWxmLT5tQ3VycmVudEJ1ZmZlckluZGV4OwotICAgIGludCByZXMgPSBmYi0+cG9zdChmYiwgaGFuZGxlKTsKLSAgICBzZWxmLT5mcm9udCA9IHN0YXRpY19jYXN0PE5hdGl2ZUJ1ZmZlcio+KGJ1ZmZlcik7Ci0gICAgc2VsZi0+bU51bUZyZWVCdWZmZXJzKys7Ci0gICAgc2VsZi0+bUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICByZXR1cm4gcmVzOwotfQotCi1pbnQgRnJhbWVidWZmZXJOYXRpdmVXaW5kb3c6OnF1ZXJ5KGNvbnN0IEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKLSAgICAgICAgaW50IHdoYXQsIGludCogdmFsdWUpIAotewotICAgIGNvbnN0IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93KiBzZWxmID0gZ2V0U2VsZih3aW5kb3cpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChzZWxmLT5tdXRleCk7Ci0gICAgZnJhbWVidWZmZXJfZGV2aWNlX3QqIGZiID0gc2VsZi0+ZmJEZXY7Ci0gICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19XSURUSDoKLSAgICAgICAgICAgICp2YWx1ZSA9IGZiLT53aWR0aDsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0hFSUdIVDoKLSAgICAgICAgICAgICp2YWx1ZSA9IGZiLT5oZWlnaHQ7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19GT1JNQVQ6Ci0gICAgICAgICAgICAqdmFsdWUgPSBmYi0+Zm9ybWF0OwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQ09OQ1JFVEVfVFlQRToKLSAgICAgICAgICAgICp2YWx1ZSA9IE5BVElWRV9XSU5ET1dfRlJBTUVCVUZGRVI7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19RVUVVRVNfVE9fV0lORE9XX0NPTVBPU0VSOgotICAgICAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0RFRkFVTFRfV0lEVEg6Ci0gICAgICAgICAgICAqdmFsdWUgPSBmYi0+d2lkdGg7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19ERUZBVUxUX0hFSUdIVDoKLSAgICAgICAgICAgICp2YWx1ZSA9IGZiLT5oZWlnaHQ7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSElOVDoKLSAgICAgICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgICp2YWx1ZSA9IDA7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotaW50IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OjpwZXJmb3JtKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKLSAgICAgICAgaW50IG9wZXJhdGlvbiwgLi4uKQotewotICAgIHN3aXRjaCAob3BlcmF0aW9uKSB7Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19DT05ORUNUOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfRElTQ09OTkVDVDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9VU0FHRToKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0dFT01FVFJZOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfU0VUX0JVRkZFUlNfRElNRU5TSU9OUzoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX0ZPUk1BVDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJTX1RSQU5TRk9STToKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DT05ORUNUOgotICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0RJU0NPTk5FQ1Q6Ci0gICAgICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgaW1wbGVtZW50IHRoZXNlCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0xPQ0s6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19VTkxPQ0tfQU5EX1BPU1Q6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQ1JPUDoKLSAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NFVF9CVUZGRVJfQ09VTlQ6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfQlVGRkVSU19USU1FU1RBTVA6Ci0gICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19TRVRfU0NBTElOR19NT0RFOgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1FR0xOYXRpdmVXaW5kb3dUeXBlIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2Uodm9pZCkKLXsKLSAgICBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdyogdzsKLSAgICB3ID0gbmV3IEZyYW1lYnVmZmVyTmF0aXZlV2luZG93KCk7Ci0gICAgaWYgKHctPmdldERldmljZSgpID09IE5VTEwpIHsKLSAgICAgICAgLy8gZ2V0IGEgcmVmIHNvIGl0IGNhbiBiZSBkZXN0cm95ZWQgd2hlbiB3ZSBleGl0IHRoaXMgYmxvY2sKLSAgICAgICAgc3A8RnJhbWVidWZmZXJOYXRpdmVXaW5kb3c+IHJlZih3KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAoRUdMTmF0aXZlV2luZG93VHlwZSl3OwotfQpkaWZmIC0tZ2l0IGEvbGlicy91aS9HcmFwaGljQnVmZmVyLmNwcCBiL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MDYzZTUuLjAwMDAwMDAKLS0tIGEvbGlicy91aS9HcmFwaGljQnVmZmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBCdWZmZXIgYW5kIGltcGxlbWVudGF0aW9uIG9mIEFOYXRpdmVXaW5kb3dCdWZmZXIKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1HcmFwaGljQnVmZmVyOjpHcmFwaGljQnVmZmVyKCkKLSAgICA6IEJBU0UoKSwgbU93bmVyKG93bkRhdGEpLCBtQnVmZmVyTWFwcGVyKEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fRVJST1IpLCBtSW5kZXgoLTEpCi17Ci0gICAgd2lkdGggID0gCi0gICAgaGVpZ2h0ID0gCi0gICAgc3RyaWRlID0gCi0gICAgZm9ybWF0ID0gCi0gICAgdXNhZ2UgID0gMDsKLSAgICBoYW5kbGUgPSBOVUxMOwotfQotCi1HcmFwaGljQnVmZmVyOjpHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIAotICAgICAgICBQaXhlbEZvcm1hdCByZXFGb3JtYXQsIHVpbnQzMl90IHJlcVVzYWdlKQotICAgIDogQkFTRSgpLCBtT3duZXIob3duRGF0YSksIG1CdWZmZXJNYXBwZXIoR3JhcGhpY0J1ZmZlck1hcHBlcjo6Z2V0KCkpLAotICAgICAgbUluaXRDaGVjayhOT19FUlJPUiksIG1JbmRleCgtMSkKLXsKLSAgICB3aWR0aCAgPSAKLSAgICBoZWlnaHQgPSAKLSAgICBzdHJpZGUgPSAKLSAgICBmb3JtYXQgPSAKLSAgICB1c2FnZSAgPSAwOwotICAgIGhhbmRsZSA9IE5VTEw7Ci0gICAgbUluaXRDaGVjayA9IGluaXRTaXplKHcsIGgsIHJlcUZvcm1hdCwgcmVxVXNhZ2UpOwotfQotCi1HcmFwaGljQnVmZmVyOjpHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgIFBpeGVsRm9ybWF0IGluRm9ybWF0LCB1aW50MzJfdCBpblVzYWdlLAotICAgICAgICB1aW50MzJfdCBpblN0cmlkZSwgbmF0aXZlX2hhbmRsZV90KiBpbkhhbmRsZSwgYm9vbCBrZWVwT3duZXJzaGlwKQotICAgIDogQkFTRSgpLCBtT3duZXIoa2VlcE93bmVyc2hpcCA/IG93bkhhbmRsZSA6IG93bk5vbmUpLAotICAgICAgbUJ1ZmZlck1hcHBlcihHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKSksCi0gICAgICBtSW5pdENoZWNrKE5PX0VSUk9SKSwgbUluZGV4KC0xKQotewotICAgIHdpZHRoICA9IHc7Ci0gICAgaGVpZ2h0ID0gaDsKLSAgICBzdHJpZGUgPSBpblN0cmlkZTsKLSAgICBmb3JtYXQgPSBpbkZvcm1hdDsKLSAgICB1c2FnZSAgPSBpblVzYWdlOwotICAgIGhhbmRsZSA9IGluSGFuZGxlOwotfQotCi1HcmFwaGljQnVmZmVyOjpHcmFwaGljQnVmZmVyKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgYm9vbCBrZWVwT3duZXJzaGlwKQotICAgIDogQkFTRSgpLCBtT3duZXIoa2VlcE93bmVyc2hpcCA/IG93bkhhbmRsZSA6IG93bk5vbmUpLAotICAgICAgbUJ1ZmZlck1hcHBlcihHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKSksCi0gICAgICBtSW5pdENoZWNrKE5PX0VSUk9SKSwgbUluZGV4KC0xKSwgbVdyYXBwZWRCdWZmZXIoYnVmZmVyKQotewotICAgIHdpZHRoICA9IGJ1ZmZlci0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7Ci0gICAgc3RyaWRlID0gYnVmZmVyLT5zdHJpZGU7Ci0gICAgZm9ybWF0ID0gYnVmZmVyLT5mb3JtYXQ7Ci0gICAgdXNhZ2UgID0gYnVmZmVyLT51c2FnZTsKLSAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKLX0KLQotR3JhcGhpY0J1ZmZlcjo6fkdyYXBoaWNCdWZmZXIoKQotewotICAgIGlmIChoYW5kbGUpIHsKLSAgICAgICAgZnJlZV9oYW5kbGUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlcjo6ZnJlZV9oYW5kbGUoKQotewotICAgIGlmIChtT3duZXIgPT0gb3duSGFuZGxlKSB7Ci0gICAgICAgIG1CdWZmZXJNYXBwZXIudW5yZWdpc3RlckJ1ZmZlcihoYW5kbGUpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGhhbmRsZSk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZSo+KGhhbmRsZSkpOwotICAgIH0gZWxzZSBpZiAobU93bmVyID09IG93bkRhdGEpIHsKLSAgICAgICAgR3JhcGhpY0J1ZmZlckFsbG9jYXRvciYgYWxsb2NhdG9yKEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmdldCgpKTsKLSAgICAgICAgYWxsb2NhdG9yLmZyZWUoaGFuZGxlKTsKLSAgICB9Ci0gICAgbVdyYXBwZWRCdWZmZXIgPSAwOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbml0Q2hlY2s7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlcjo6ZHVtcEFsbG9jYXRpb25zVG9TeXN0ZW1Mb2coKQotewotICAgIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmR1bXBUb1N5c3RlbUxvZygpOwotfQotCi1BTmF0aXZlV2luZG93QnVmZmVyKiBHcmFwaGljQnVmZmVyOjpnZXROYXRpdmVCdWZmZXIoKSBjb25zdAotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93QnVmZmVyKj4oCi0gICAgICAgICAgICBjb25zdF9jYXN0PEdyYXBoaWNCdWZmZXIqPih0aGlzKSk7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OnJlYWxsb2NhdGUodWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZiwKLSAgICAgICAgdWludDMyX3QgcmVxVXNhZ2UpCi17Ci0gICAgaWYgKG1Pd25lciAhPSBvd25EYXRhKQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICBpZiAoaGFuZGxlICYmIHc9PXdpZHRoICYmIGg9PWhlaWdodCAmJiBmPT1mb3JtYXQgJiYgcmVxVXNhZ2U9PXVzYWdlKQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3ImIGFsbG9jYXRvcihHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpnZXQoKSk7Ci0gICAgICAgIGFsbG9jYXRvci5mcmVlKGhhbmRsZSk7Ci0gICAgICAgIGhhbmRsZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBpbml0U2l6ZSh3LCBoLCBmLCByZXFVc2FnZSk7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OmluaXRTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgcmVxVXNhZ2UpCi17Ci0gICAgR3JhcGhpY0J1ZmZlckFsbG9jYXRvciYgYWxsb2NhdG9yID0gR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6Z2V0KCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gYWxsb2NhdG9yLmFsbG9jKHcsIGgsIGZvcm1hdCwgcmVxVXNhZ2UsICZoYW5kbGUsICZzdHJpZGUpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgdGhpcy0+d2lkdGggID0gdzsKLSAgICAgICAgdGhpcy0+aGVpZ2h0ID0gaDsKLSAgICAgICAgdGhpcy0+Zm9ybWF0ID0gZm9ybWF0OwotICAgICAgICB0aGlzLT51c2FnZSAgPSByZXFVc2FnZTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlcjo6bG9jayh1aW50MzJfdCB1c2FnZSwgdm9pZCoqIHZhZGRyKQotewotICAgIGNvbnN0IFJlY3QgbG9ja0JvdW5kcyh3aWR0aCwgaGVpZ2h0KTsKLSAgICBzdGF0dXNfdCByZXMgPSBsb2NrKHVzYWdlLCBsb2NrQm91bmRzLCB2YWRkcik7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlcjo6bG9jayh1aW50MzJfdCB1c2FnZSwgY29uc3QgUmVjdCYgcmVjdCwgdm9pZCoqIHZhZGRyKQotewotICAgIGlmIChyZWN0LmxlZnQgPCAwIHx8IHJlY3QucmlnaHQgID4gdGhpcy0+d2lkdGggfHwgCi0gICAgICAgIHJlY3QudG9wICA8IDAgfHwgcmVjdC5ib3R0b20gPiB0aGlzLT5oZWlnaHQpIHsKLSAgICAgICAgQUxPR0UoImxvY2tpbmcgcGl4ZWxzICglZCwlZCwlZCwlZCkgb3V0c2lkZSBvZiBidWZmZXIgKHc9JWQsIGg9JWQpIiwKLSAgICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSwgCi0gICAgICAgICAgICAgICAgdGhpcy0+d2lkdGgsIHRoaXMtPmhlaWdodCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0YXR1c190IHJlcyA9IGdldEJ1ZmZlck1hcHBlcigpLmxvY2soaGFuZGxlLCB1c2FnZSwgcmVjdCwgdmFkZHIpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OnVubG9jaygpCi17Ci0gICAgc3RhdHVzX3QgcmVzID0gZ2V0QnVmZmVyTWFwcGVyKCkudW5sb2NrKGhhbmRsZSk7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotc2l6ZV90IEdyYXBoaWNCdWZmZXI6OmdldEZsYXR0ZW5lZFNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuICg4ICsgKGhhbmRsZSA/IGhhbmRsZS0+bnVtSW50cyA6IDApKSpzaXplb2YoaW50KTsKLX0KLQotc2l6ZV90IEdyYXBoaWNCdWZmZXI6OmdldEZkQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGhhbmRsZSA/IGhhbmRsZS0+bnVtRmRzIDogMDsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlcjo6ZmxhdHRlbih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkgY29uc3QKLXsKLSAgICBzaXplX3Qgc2l6ZU5lZWRlZCA9IEdyYXBoaWNCdWZmZXI6OmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBpZiAoc2l6ZSA8IHNpemVOZWVkZWQpIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICBzaXplX3QgZmRDb3VudE5lZWRlZCA9IEdyYXBoaWNCdWZmZXI6OmdldEZkQ291bnQoKTsKLSAgICBpZiAoY291bnQgPCBmZENvdW50TmVlZGVkKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgaW50KiBidWYgPSBzdGF0aWNfY2FzdDxpbnQqPihidWZmZXIpOwotICAgIGJ1ZlswXSA9ICdHQkZSJzsKLSAgICBidWZbMV0gPSB3aWR0aDsKLSAgICBidWZbMl0gPSBoZWlnaHQ7Ci0gICAgYnVmWzNdID0gc3RyaWRlOwotICAgIGJ1Zls0XSA9IGZvcm1hdDsKLSAgICBidWZbNV0gPSB1c2FnZTsKLSAgICBidWZbNl0gPSAwOwotICAgIGJ1Zls3XSA9IDA7Ci0KLSAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgIGJ1Zls2XSA9IGhhbmRsZS0+bnVtRmRzOwotICAgICAgICBidWZbN10gPSBoYW5kbGUtPm51bUludHM7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogY29uc3QgaCA9IGhhbmRsZTsKLSAgICAgICAgbWVtY3B5KGZkcywgICAgIGgtPmRhdGEsICAgICAgICAgICAgIGgtPm51bUZkcypzaXplb2YoaW50KSk7Ci0gICAgICAgIG1lbWNweSgmYnVmWzhdLCBoLT5kYXRhICsgaC0+bnVtRmRzLCBoLT5udW1JbnRzKnNpemVvZihpbnQpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXI6OnVuZmxhdHRlbih2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBzaXplLAotICAgICAgICBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkKLXsKLSAgICBpZiAoc2l6ZSA8IDgqc2l6ZW9mKGludCkpIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICBpbnQgY29uc3QqIGJ1ZiA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZlswXSAhPSAnR0JGUicpIHJldHVybiBCQURfVFlQRTsKLQotICAgIGNvbnN0IHNpemVfdCBudW1GZHMgID0gYnVmWzZdOwotICAgIGNvbnN0IHNpemVfdCBudW1JbnRzID0gYnVmWzddOwotCi0gICAgY29uc3Qgc2l6ZV90IHNpemVOZWVkZWQgPSAoOCArIG51bUludHMpICogc2l6ZW9mKGludCk7Ci0gICAgaWYgKHNpemUgPCBzaXplTmVlZGVkKSByZXR1cm4gTk9fTUVNT1JZOwotCi0gICAgc2l6ZV90IGZkQ291bnROZWVkZWQgPSAwOwotICAgIGlmIChjb3VudCA8IGZkQ291bnROZWVkZWQpIHJldHVybiBOT19NRU1PUlk7Ci0KLSAgICBpZiAoaGFuZGxlKSB7Ci0gICAgICAgIC8vIGZyZWUgcHJldmlvdXMgaGFuZGxlIGlmIGFueQotICAgICAgICBmcmVlX2hhbmRsZSgpOwotICAgIH0KLQotICAgIGlmIChudW1GZHMgfHwgbnVtSW50cykgewotICAgICAgICB3aWR0aCAgPSBidWZbMV07Ci0gICAgICAgIGhlaWdodCA9IGJ1ZlsyXTsKLSAgICAgICAgc3RyaWRlID0gYnVmWzNdOwotICAgICAgICBmb3JtYXQgPSBidWZbNF07Ci0gICAgICAgIHVzYWdlICA9IGJ1Zls1XTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZSogaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKG51bUZkcywgbnVtSW50cyk7Ci0gICAgICAgIG1lbWNweShoLT5kYXRhLCAgICAgICAgICBmZHMsICAgICBudW1GZHMqc2l6ZW9mKGludCkpOwotICAgICAgICBtZW1jcHkoaC0+ZGF0YSArIG51bUZkcywgJmJ1Zls4XSwgbnVtSW50cypzaXplb2YoaW50KSk7Ci0gICAgICAgIGhhbmRsZSA9IGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2lkdGggPSBoZWlnaHQgPSBzdHJpZGUgPSBmb3JtYXQgPSB1c2FnZSA9IDA7Ci0gICAgICAgIGhhbmRsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgbU93bmVyID0gb3duSGFuZGxlOwotCi0gICAgaWYgKGhhbmRsZSAhPSAwKSB7Ci0gICAgICAgIG1CdWZmZXJNYXBwZXIucmVnaXN0ZXJCdWZmZXIoaGFuZGxlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotdm9pZCBHcmFwaGljQnVmZmVyOjpzZXRJbmRleChpbnQgaW5kZXgpIHsKLSAgICBtSW5kZXggPSBpbmRleDsKLX0KLQotaW50IEdyYXBoaWNCdWZmZXI6OmdldEluZGV4KCkgY29uc3QgewotICAgIHJldHVybiBtSW5kZXg7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmNwcCBiL2xpYnMvdWkvR3JhcGhpY0J1ZmZlckFsbG9jYXRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTUwZDkuLjAwMDAwMDAKLS0tIGEvbGlicy91aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKiAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgIkdyYXBoaWNCdWZmZXJBbGxvY2F0b3IiCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3IgKQotCi1NdXRleCBHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjpzTG9jazsKLUtleWVkVmVjdG9yPGJ1ZmZlcl9oYW5kbGVfdCwKLSAgICBHcmFwaGljQnVmZmVyQWxsb2NhdG9yOjphbGxvY19yZWNfdD4gR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6c0FsbG9jTGlzdDsKLQotR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6R3JhcGhpY0J1ZmZlckFsbG9jYXRvcigpCi0gICAgOiBtQWxsb2NEZXYoMCkKLXsKLSAgICBod19tb2R1bGVfdCBjb25zdCogbW9kdWxlOwotICAgIGludCBlcnIgPSBod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKLSAgICBBTE9HRV9JRihlcnIsICJGQVRBTDogY2FuJ3QgZmluZCB0aGUgJXMgbW9kdWxlIiwgR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQpOwotICAgIGlmIChlcnIgPT0gMCkgewotICAgICAgICBncmFsbG9jX29wZW4obW9kdWxlLCAmbUFsbG9jRGV2KTsKLSAgICB9Ci19Ci0KLUdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6On5HcmFwaGljQnVmZmVyQWxsb2NhdG9yKCkKLXsKLSAgICBncmFsbG9jX2Nsb3NlKG1BbGxvY0Rldik7Ci19Ci0KLXZvaWQgR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6ZHVtcChTdHJpbmc4JiByZXN1bHQpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKLSAgICBLZXllZFZlY3RvcjxidWZmZXJfaGFuZGxlX3QsIGFsbG9jX3JlY190PiYgbGlzdChzQWxsb2NMaXN0KTsKLSAgICBzaXplX3QgdG90YWwgPSAwOwotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gNDA5NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBbGxvY2F0ZWQgYnVmZmVyczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBjb25zdCBzaXplX3QgYyA9IGxpc3Quc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8YyA7IGkrKykgewotICAgICAgICBjb25zdCBhbGxvY19yZWNfdCYgcmVjKGxpc3QudmFsdWVBdChpKSk7Ci0gICAgICAgIGlmIChyZWMuc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTEwcDogJTcuMmYgS2lCIHwgJTR1ICglNHUpIHggJTR1IHwgJThYIHwgMHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICBsaXN0LmtleUF0KGkpLCByZWMuc2l6ZS8xMDI0LjBmLAotICAgICAgICAgICAgICAgICAgICByZWMudywgcmVjLnMsIHJlYy5oLCByZWMuZm9ybWF0LCByZWMudXNhZ2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTEwcDogdW5rbm93biAgICAgfCAlNHUgKCU0dSkgeCAlNHUgfCAlOFggfCAweCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxpc3Qua2V5QXQoaSksCi0gICAgICAgICAgICAgICAgICAgIHJlYy53LCByZWMucywgcmVjLmgsIHJlYy5mb3JtYXQsIHJlYy51c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB0b3RhbCArPSByZWMuc2l6ZTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiVG90YWwgYWxsb2NhdGVkIChlc3RpbWF0ZSk6ICUuMmYgS0JcbiIsIHRvdGFsLzEwMjQuMGYpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBpZiAobUFsbG9jRGV2LT5jb21tb24udmVyc2lvbiA+PSAxICYmIG1BbGxvY0Rldi0+ZHVtcCkgewotICAgICAgICBtQWxsb2NEZXYtPmR1bXAobUFsbG9jRGV2LCBidWZmZXIsIFNJWkUpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmR1bXBUb1N5c3RlbUxvZygpCi17Ci0gICAgU3RyaW5nOCBzOwotICAgIEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmdldEluc3RhbmNlKCkuZHVtcChzKTsKLSAgICBBTE9HRCgiJXMiLCBzLnN0cmluZygpKTsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6YWxsb2ModWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICBpbnQgdXNhZ2UsIGJ1ZmZlcl9oYW5kbGVfdCogaGFuZGxlLCBpbnQzMl90KiBzdHJpZGUpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICAvLyBtYWtlIHN1cmUgdG8gbm90IGFsbG9jYXRlIGEgTiB4IDAgb3IgMCB4IE4gYnVmZmVyLCBzaW5jZSB0aGlzIGlzCi0gICAgLy8gYWxsb3dlZCBmcm9tIGFuIEFQSSBzdGFuZC1wb2ludCBhbGxvY2F0ZSBhIDF4MSBidWZmZXIgaW5zdGVhZC4KLSAgICBpZiAoIXcgfHwgIWgpCi0gICAgICAgIHcgPSBoID0gMTsKLQotICAgIC8vIHdlIGhhdmUgYSBoL3cgYWxsb2NhdG9yIGFuZCBoL3cgYnVmZmVyIGlzIHJlcXVlc3RlZAotICAgIHN0YXR1c190IGVycjsgCi0gICAgCi0gICAgZXJyID0gbUFsbG9jRGV2LT5hbGxvYyhtQWxsb2NEZXYsIHcsIGgsIGZvcm1hdCwgdXNhZ2UsIGhhbmRsZSwgc3RyaWRlKTsKLQotICAgIEFMT0dXX0lGKGVyciwgImFsbG9jKCV1LCAldSwgJWQsICUwOHgsIC4uLikgZmFpbGVkICVkICglcykiLAotICAgICAgICAgICAgdywgaCwgZm9ybWF0LCB1c2FnZSwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgCi0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woc0xvY2spOwotICAgICAgICBLZXllZFZlY3RvcjxidWZmZXJfaGFuZGxlX3QsIGFsbG9jX3JlY190PiYgbGlzdChzQWxsb2NMaXN0KTsKLSAgICAgICAgaW50IGJwcCA9IGJ5dGVzUGVyUGl4ZWwoZm9ybWF0KTsKLSAgICAgICAgaWYgKGJwcCA8IDApIHsKLSAgICAgICAgICAgIC8vIHByb2JhYmx5IGEgSEFMIGN1c3RvbSBmb3JtYXQuIGluIGFueSBjYXNlLCB3ZSBkb24ndCBrbm93Ci0gICAgICAgICAgICAvLyB3aGF0IGl0cyBwaXhlbCBzaXplIGlzLgotICAgICAgICAgICAgYnBwID0gMDsKLSAgICAgICAgfQotICAgICAgICBhbGxvY19yZWNfdCByZWM7Ci0gICAgICAgIHJlYy53ID0gdzsKLSAgICAgICAgcmVjLmggPSBoOwotICAgICAgICByZWMucyA9ICpzdHJpZGU7Ci0gICAgICAgIHJlYy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHJlYy51c2FnZSA9IHVzYWdlOwotICAgICAgICByZWMuc2l6ZSA9IGggKiBzdHJpZGVbMF0gKiBicHA7Ci0gICAgICAgIGxpc3QuYWRkKCpoYW5kbGUsIHJlYyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY0J1ZmZlckFsbG9jYXRvcjo6ZnJlZShidWZmZXJfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgZXJyID0gbUFsbG9jRGV2LT5mcmVlKG1BbGxvY0RldiwgaGFuZGxlKTsKLQotICAgIEFMT0dXX0lGKGVyciwgImZyZWUoLi4uKSBmYWlsZWQgJWQgKCVzKSIsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKLSAgICAgICAgS2V5ZWRWZWN0b3I8YnVmZmVyX2hhbmRsZV90LCBhbGxvY19yZWNfdD4mIGxpc3Qoc0FsbG9jTGlzdCk7Ci0gICAgICAgIGxpc3QucmVtb3ZlSXRlbShoYW5kbGUpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5jcHAgYi9saWJzL3VpL0dyYXBoaWNCdWZmZXJNYXBwZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdkYTk4Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJHcmFwaGljQnVmZmVyTWFwcGVyIgotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlck1hcHBlci5oPgotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKCBHcmFwaGljQnVmZmVyTWFwcGVyICkKLQotR3JhcGhpY0J1ZmZlck1hcHBlcjo6R3JhcGhpY0J1ZmZlck1hcHBlcigpCi0gICAgOiBtQWxsb2NNb2QoMCkKLXsKLSAgICBod19tb2R1bGVfdCBjb25zdCogbW9kdWxlOwotICAgIGludCBlcnIgPSBod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmbW9kdWxlKTsKLSAgICBBTE9HRV9JRihlcnIsICJGQVRBTDogY2FuJ3QgZmluZCB0aGUgJXMgbW9kdWxlIiwgR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQpOwotICAgIGlmIChlcnIgPT0gMCkgewotICAgICAgICBtQWxsb2NNb2QgPSAoZ3JhbGxvY19tb2R1bGVfdCBjb25zdCAqKW1vZHVsZTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJNYXBwZXI6OnJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBlcnIgPSBtQWxsb2NNb2QtPnJlZ2lzdGVyQnVmZmVyKG1BbGxvY01vZCwgaGFuZGxlKTsKLQotICAgIEFMT0dXX0lGKGVyciwgInJlZ2lzdGVyQnVmZmVyKCVwKSBmYWlsZWQgJWQgKCVzKSIsCi0gICAgICAgICAgICBoYW5kbGUsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJNYXBwZXI6OnVucmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IGVycjsKLQotICAgIGVyciA9IG1BbGxvY01vZC0+dW5yZWdpc3RlckJ1ZmZlcihtQWxsb2NNb2QsIGhhbmRsZSk7Ci0KLSAgICBBTE9HV19JRihlcnIsICJ1bnJlZ2lzdGVyQnVmZmVyKCVwKSBmYWlsZWQgJWQgKCVzKSIsCi0gICAgICAgICAgICBoYW5kbGUsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmxvY2soYnVmZmVyX2hhbmRsZV90IGhhbmRsZSwgCi0gICAgICAgIGludCB1c2FnZSwgY29uc3QgUmVjdCYgYm91bmRzLCB2b2lkKiogdmFkZHIpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBlcnIgPSBtQWxsb2NNb2QtPmxvY2sobUFsbG9jTW9kLCBoYW5kbGUsIHVzYWdlLAotICAgICAgICAgICAgYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy53aWR0aCgpLCBib3VuZHMuaGVpZ2h0KCksCi0gICAgICAgICAgICB2YWRkcik7Ci0KLSAgICBBTE9HV19JRihlcnIsICJsb2NrKC4uLikgZmFpbGVkICVkICglcykiLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyTWFwcGVyOjp1bmxvY2soYnVmZmVyX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IGVycjsKLQotICAgIGVyciA9IG1BbGxvY01vZC0+dW5sb2NrKG1BbGxvY01vZCwgaGFuZGxlKTsKLQotICAgIEFMT0dXX0lGKGVyciwgInVubG9jayguLi4pIGZhaWxlZCAlZCAoJXMpIiwgZXJyLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlicy91aS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJzL3VpL05PVElDRSBiL2xpYnMvdWkvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJzL3VpL1BpeGVsRm9ybWF0LmNwcCBiL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFkM2MyLi4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjb25zdCBpbnQgQ09NUE9ORU5UX1lVViA9IDB4RkY7Ci0KLXN0cnVjdCBJbmZvIHsKLSAgICBzaXplX3QgICAgICBzaXplOwotICAgIHNpemVfdCAgICAgIGJpdHNQZXJQaXhlbDsKLSAgICBzdHJ1Y3QgewotICAgICAgICB1aW50OF90ICAgICBhaDsKLSAgICAgICAgdWludDhfdCAgICAgYWw7Ci0gICAgICAgIHVpbnQ4X3QgICAgIHJoOwotICAgICAgICB1aW50OF90ICAgICBybDsKLSAgICAgICAgdWludDhfdCAgICAgZ2g7Ci0gICAgICAgIHVpbnQ4X3QgICAgIGdsOwotICAgICAgICB1aW50OF90ICAgICBiaDsKLSAgICAgICAgdWludDhfdCAgICAgYmw7Ci0gICAgfTsKLSAgICB1aW50OF90ICAgICBjb21wb25lbnRzOwotfTsKLQotc3RhdGljIEluZm8gY29uc3Qgc1BpeGVsRm9ybWF0SW5mb3NbXSA9IHsKLSAgICAgICAgeyAwLCAgMCwgeyAwLCAwLCAgIDAsIDAsICAgMCwgMCwgICAwLCAwIH0sIDAgfSwKLSAgICAgICAgeyA0LCAzMiwgezMyLDI0LCAgIDgsIDAsICAxNiwgOCwgIDI0LDE2IH0sIFBpeGVsRm9ybWF0SW5mbzo6UkdCQSB9LAotICAgICAgICB7IDQsIDI0LCB7IDAsIDAsICAgOCwgMCwgIDE2LCA4LCAgMjQsMTYgfSwgUGl4ZWxGb3JtYXRJbmZvOjpSR0IgIH0sCi0gICAgICAgIHsgMywgMjQsIHsgMCwgMCwgICA4LCAwLCAgMTYsIDgsICAyNCwxNiB9LCBQaXhlbEZvcm1hdEluZm86OlJHQiAgfSwKLSAgICAgICAgeyAyLCAxNiwgeyAwLCAwLCAgMTYsMTEsICAxMSwgNSwgICA1LCAwIH0sIFBpeGVsRm9ybWF0SW5mbzo6UkdCICB9LAotICAgICAgICB7IDQsIDMyLCB7MzIsMjQsICAyNCwxNiwgIDE2LCA4LCAgIDgsIDAgfSwgUGl4ZWxGb3JtYXRJbmZvOjpSR0JBIH0sCi0gICAgICAgIHsgMiwgMTYsIHsgMSwgMCwgIDE2LDExLCAgMTEsIDYsICAgNiwgMSB9LCBQaXhlbEZvcm1hdEluZm86OlJHQkEgfSwKLSAgICAgICAgeyAyLCAxNiwgeyA0LCAwLCAgMTYsMTIsICAxMiwgOCwgICA4LCA0IH0sIFBpeGVsRm9ybWF0SW5mbzo6UkdCQSB9LAotICAgICAgICB7IDEsICA4LCB7IDgsIDAsICAgMCwgMCwgICAwLCAwLCAgIDAsIDAgfSwgUGl4ZWxGb3JtYXRJbmZvOjpBTFBIQX0sCi0gICAgICAgIHsgMSwgIDgsIHsgMCwgMCwgICA4LCAwLCAgIDgsIDAsICAgOCwgMCB9LCBQaXhlbEZvcm1hdEluZm86OkwgICAgfSwKLSAgICAgICAgeyAyLCAxNiwgezE2LCA4LCAgIDgsIDAsICAgOCwgMCwgICA4LCAwIH0sIFBpeGVsRm9ybWF0SW5mbzo6TEEgICB9LAotICAgICAgICB7IDEsICA4LCB7IDAsIDAsICAgOCwgNSwgICA1LCAyLCAgIDIsIDAgfSwgUGl4ZWxGb3JtYXRJbmZvOjpSR0IgIH0sCi19OwotCi1zdGF0aWMgY29uc3QgSW5mbyogZ0dldFBpeGVsRm9ybWF0VGFibGUoc2l6ZV90KiBudW1FbnRyaWVzKSB7Ci0gICAgaWYgKG51bUVudHJpZXMpIHsKLSAgICAgICAgKm51bUVudHJpZXMgPSBzaXplb2Yoc1BpeGVsRm9ybWF0SW5mb3MpL3NpemVvZihJbmZvKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNQaXhlbEZvcm1hdEluZm9zOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNpemVfdCBQaXhlbEZvcm1hdEluZm86OmdldFNjYW5saW5lU2l6ZSh1bnNpZ25lZCBpbnQgd2lkdGgpIGNvbnN0Ci17Ci0gICAgc2l6ZV90IHNpemU7Ci0gICAgaWYgKGNvbXBvbmVudHMgPT0gQ09NUE9ORU5UX1lVVikgewotICAgICAgICAvLyBZQ2JDciBmb3JtYXRzIGFyZSBkaWZmZXJlbnQuCi0gICAgICAgIHNpemUgPSAod2lkdGggKiBiaXRzUGVyUGl4ZWwpPj4zOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemUgPSB3aWR0aCAqIGJ5dGVzUGVyUGl4ZWw7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi1zc2l6ZV90IGJ5dGVzUGVyUGl4ZWwoUGl4ZWxGb3JtYXQgZm9ybWF0KQotewotICAgIFBpeGVsRm9ybWF0SW5mbyBpbmZvOwotICAgIHN0YXR1c190IGVyciA9IGdldFBpeGVsRm9ybWF0SW5mbyhmb3JtYXQsICZpbmZvKTsKLSAgICByZXR1cm4gKGVyciA8IDApID8gZXJyIDogaW5mby5ieXRlc1BlclBpeGVsOwotfQotCi1zc2l6ZV90IGJpdHNQZXJQaXhlbChQaXhlbEZvcm1hdCBmb3JtYXQpCi17Ci0gICAgUGl4ZWxGb3JtYXRJbmZvIGluZm87Ci0gICAgc3RhdHVzX3QgZXJyID0gZ2V0UGl4ZWxGb3JtYXRJbmZvKGZvcm1hdCwgJmluZm8pOwotICAgIHJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiBpbmZvLmJpdHNQZXJQaXhlbDsKLX0KLQotc3RhdHVzX3QgZ2V0UGl4ZWxGb3JtYXRJbmZvKFBpeGVsRm9ybWF0IGZvcm1hdCwgUGl4ZWxGb3JtYXRJbmZvKiBpbmZvKQotewotICAgIGlmIChmb3JtYXQgPCAwKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgaWYgKGluZm8tPnZlcnNpb24gIT0gc2l6ZW9mKFBpeGVsRm9ybWF0SW5mbykpCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIC8vIFlVViBmb3JtYXQgZnJvbSB0aGUgSEFMIGFyZSBoYW5kbGVkIGhlcmUKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfU1A6Ci0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOgotICAgICAgICBpbmZvLT5iaXRzUGVyUGl4ZWwgPSAxNjsKLSAgICAgICAgZ290byBkb25lOwotICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A6Ci0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6Ci0gICAgICAgIGluZm8tPmJpdHNQZXJQaXhlbCA9IDEyOwotICAgICBkb25lOgotICAgICAgICBpbmZvLT5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIGluZm8tPmNvbXBvbmVudHMgPSBDT01QT05FTlRfWVVWOwotICAgICAgICBpbmZvLT5ieXRlc1BlclBpeGVsID0gMTsKLSAgICAgICAgaW5mby0+aF9hbHBoYSA9IDA7Ci0gICAgICAgIGluZm8tPmxfYWxwaGEgPSAwOwotICAgICAgICBpbmZvLT5oX3JlZCA9IGluZm8tPmhfZ3JlZW4gPSBpbmZvLT5oX2JsdWUgPSA4OwotICAgICAgICBpbmZvLT5sX3JlZCA9IGluZm8tPmxfZ3JlZW4gPSBpbmZvLT5sX2JsdWUgPSAwOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgc2l6ZV90IG51bUVudHJpZXM7Ci0gICAgY29uc3QgSW5mbyAqaSA9IGdHZXRQaXhlbEZvcm1hdFRhYmxlKCZudW1FbnRyaWVzKSArIGZvcm1hdDsKLSAgICBib29sIHZhbGlkID0gdWludDMyX3QoZm9ybWF0KSA8IG51bUVudHJpZXM7Ci0gICAgaWYgKCF2YWxpZCkgewotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIH0KLQotICAgIGluZm8tPmZvcm1hdCA9IGZvcm1hdDsKLSAgICBpbmZvLT5ieXRlc1BlclBpeGVsID0gaS0+c2l6ZTsKLSAgICBpbmZvLT5iaXRzUGVyUGl4ZWwgID0gaS0+Yml0c1BlclBpeGVsOwotICAgIGluZm8tPmhfYWxwaGEgICAgICAgPSBpLT5haDsKLSAgICBpbmZvLT5sX2FscGhhICAgICAgID0gaS0+YWw7Ci0gICAgaW5mby0+aF9yZWQgICAgICAgICA9IGktPnJoOwotICAgIGluZm8tPmxfcmVkICAgICAgICAgPSBpLT5ybDsKLSAgICBpbmZvLT5oX2dyZWVuICAgICAgID0gaS0+Z2g7Ci0gICAgaW5mby0+bF9ncmVlbiAgICAgICA9IGktPmdsOwotICAgIGluZm8tPmhfYmx1ZSAgICAgICAgPSBpLT5iaDsKLSAgICBpbmZvLT5sX2JsdWUgICAgICAgID0gaS0+Ymw7Ci0gICAgaW5mby0+Y29tcG9uZW50cyAgICA9IGktPmNvbXBvbmVudHM7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL2xpYnMvdWkvUmVjdC5jcHAgYi9saWJzL3VpL1JlY3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk0ZTAwLi4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvUmVjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgbWluKGludDMyX3QgYSwgaW50MzJfdCBiKSB7Ci0gICAgcmV0dXJuIChhPGIpID8gYSA6IGI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCBtYXgoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKLSAgICByZXR1cm4gKGE+YikgPyBhIDogYjsKLX0KLQotdm9pZCBSZWN0OjptYWtlSW52YWxpZCgpIHsKLSAgICBsZWZ0ID0gMDsKLSAgICB0b3AgPSAwOwotICAgIHJpZ2h0ID0gLTE7Ci0gICAgYm90dG9tID0gLTE7Ci19Ci0KLWJvb2wgUmVjdDo6b3BlcmF0b3IgPCAoY29uc3QgUmVjdCYgcmhzKSBjb25zdAotewotICAgIGlmICh0b3A8cmhzLnRvcCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHRvcCA9PSByaHMudG9wKSB7Ci0gICAgICAgIGlmIChsZWZ0IDwgcmhzLmxlZnQpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGxlZnQgPT0gcmhzLmxlZnQpIHsKLSAgICAgICAgICAgIGlmIChib3R0b208cmhzLmJvdHRvbSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChib3R0b20gPT0gcmhzLmJvdHRvbSkgewotICAgICAgICAgICAgICAgIGlmIChyaWdodDxyaHMucmlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotUmVjdCYgUmVjdDo6b2Zmc2V0VG8oaW50MzJfdCB4LCBpbnQzMl90IHkpCi17Ci0gICAgcmlnaHQgLT0gbGVmdCAtIHg7Ci0gICAgYm90dG9tIC09IHRvcCAtIHk7Ci0gICAgbGVmdCA9IHg7Ci0gICAgdG9wID0geTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLVJlY3QmIFJlY3Q6Om9mZnNldEJ5KGludDMyX3QgeCwgaW50MzJfdCB5KQotewotICAgIGxlZnQgKz0geDsKLSAgICB0b3AgICs9IHk7Ci0gICAgcmlnaHQrPSB4OwotICAgIGJvdHRvbSs9eTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IFJlY3QgUmVjdDo6b3BlcmF0b3IgKyAoY29uc3QgUG9pbnQmIHJocykgY29uc3QKLXsKLSAgICBjb25zdCBSZWN0IHJlc3VsdChsZWZ0K3Jocy54LCB0b3ArcmhzLnksIHJpZ2h0K3Jocy54LCBib3R0b20rcmhzLnkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWNvbnN0IFJlY3QgUmVjdDo6b3BlcmF0b3IgLSAoY29uc3QgUG9pbnQmIHJocykgY29uc3QKLXsKLSAgICBjb25zdCBSZWN0IHJlc3VsdChsZWZ0LXJocy54LCB0b3AtcmhzLnksIHJpZ2h0LXJocy54LCBib3R0b20tcmhzLnkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWJvb2wgUmVjdDo6aW50ZXJzZWN0KGNvbnN0IFJlY3QmIHdpdGgsIFJlY3QqIHJlc3VsdCkgY29uc3QKLXsKLSAgICByZXN1bHQtPmxlZnQgICAgPSBtYXgobGVmdCwgd2l0aC5sZWZ0KTsKLSAgICByZXN1bHQtPnRvcCAgICAgPSBtYXgodG9wLCB3aXRoLnRvcCk7Ci0gICAgcmVzdWx0LT5yaWdodCAgID0gbWluKHJpZ2h0LCB3aXRoLnJpZ2h0KTsKLSAgICByZXN1bHQtPmJvdHRvbSAgPSBtaW4oYm90dG9tLCB3aXRoLmJvdHRvbSk7Ci0gICAgcmV0dXJuICEocmVzdWx0LT5pc0VtcHR5KCkpOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91aS9SZWdpb24uY3BwIGIvbGlicy91aS9SZWdpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTJlNzMxLi4wMDAwMDAwCi0tLSBhL2xpYnMvdWkvUmVnaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJSZWdpb24iCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLSNpbmNsdWRlIDx1aS9SZWdpb24uaD4KLSNpbmNsdWRlIDx1aS9Qb2ludC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS91aS9SZWdpb25IZWxwZXIuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBWQUxJREFURV9SRUdJT05TICAgICAgICAoZmFsc2UpCi0jZGVmaW5lIFZBTElEQVRFX1dJVEhfQ09SRUNHICAgIChmYWxzZSkKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIFZBTElEQVRFX1dJVEhfQ09SRUNHCi0jaW5jbHVkZSA8Y29yZS9Ta1JlZ2lvbi5oPgotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZW51bSB7Ci0gICAgb3BfbmFuZCA9IHJlZ2lvbl9vcGVyYXRvcjxSZWN0Pjo6b3BfbmFuZCwKLSAgICBvcF9hbmQgID0gcmVnaW9uX29wZXJhdG9yPFJlY3Q+OjpvcF9hbmQsCi0gICAgb3Bfb3IgICA9IHJlZ2lvbl9vcGVyYXRvcjxSZWN0Pjo6b3Bfb3IsCi0gICAgb3BfeG9yICA9IHJlZ2lvbl9vcGVyYXRvcjxSZWN0Pjo6b3BfeG9yCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lvbjo6UmVnaW9uKCkKLSAgICA6IG1Cb3VuZHMoMCwwKQotewotfQotCi1SZWdpb246OlJlZ2lvbihjb25zdCBSZWdpb24mIHJocykKLSAgICA6IG1Cb3VuZHMocmhzLm1Cb3VuZHMpLCBtU3RvcmFnZShyaHMubVN0b3JhZ2UpCi17Ci0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgIHZhbGlkYXRlKHJocywgInJocyBjb3B5LWN0b3IiKTsKLSNlbmRpZgotfQotCi1SZWdpb246OlJlZ2lvbihjb25zdCBSZWN0JiByaHMpCi0gICAgOiBtQm91bmRzKHJocykKLXsKLX0KLQotUmVnaW9uOjpSZWdpb24oY29uc3Qgdm9pZCogYnVmZmVyKQotewotICAgIHN0YXR1c190IGVyciA9IHJlYWQoYnVmZmVyKTsKLSAgICBBTE9HRV9JRihlcnI8MCwgImVycm9yICVzIHJlYWRpbmcgUmVnaW9uIGZyb20gYnVmZmVyIiwgc3RyZXJyb3IoZXJyKSk7Ci19Ci0KLVJlZ2lvbjo6flJlZ2lvbigpCi17Ci19Ci0KLVJlZ2lvbiYgUmVnaW9uOjpvcGVyYXRvciA9IChjb25zdCBSZWdpb24mIHJocykKLXsKLSNpZiBWQUxJREFURV9SRUdJT05TCi0gICAgdmFsaWRhdGUoKnRoaXMsICJ0aGlzLT5vcGVyYXRvcj0iKTsKLSAgICB2YWxpZGF0ZShyaHMsICJyaHMub3BlcmF0b3I9Iik7Ci0jZW5kaWYKLSAgICBtQm91bmRzID0gcmhzLm1Cb3VuZHM7Ci0gICAgbVN0b3JhZ2UgPSByaHMubVN0b3JhZ2U7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1SZWdpb24mIFJlZ2lvbjo6bWFrZUJvdW5kc1NlbGYoKQotewotICAgIG1TdG9yYWdlLmNsZWFyKCk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi12b2lkIFJlZ2lvbjo6Y2xlYXIoKQotewotICAgIG1Cb3VuZHMuY2xlYXIoKTsKLSAgICBtU3RvcmFnZS5jbGVhcigpOwotfQotCi12b2lkIFJlZ2lvbjo6c2V0KGNvbnN0IFJlY3QmIHIpCi17Ci0gICAgbUJvdW5kcyA9IHI7Ci0gICAgbVN0b3JhZ2UuY2xlYXIoKTsKLX0KLQotdm9pZCBSZWdpb246OnNldCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKQotewotICAgIG1Cb3VuZHMgPSBSZWN0KGludCh3KSwgaW50KGgpKTsKLSAgICBtU3RvcmFnZS5jbGVhcigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgUmVnaW9uOjphZGRSZWN0VW5jaGVja2VkKGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKQotewotICAgIG1TdG9yYWdlLmFkZChSZWN0KGwsdCxyLGIpKTsKLSNpZiBWQUxJREFURV9SRUdJT05TCi0gICAgdmFsaWRhdGUoKnRoaXMsICJhZGRSZWN0VW5jaGVja2VkIik7Ci0jZW5kaWYKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpb24mIFJlZ2lvbjo6b3JTZWxmKGNvbnN0IFJlY3QmIHIpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyLCBvcF9vcik7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6eG9yU2VsZihjb25zdCBSZWN0JiByKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYociwgb3BfeG9yKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjphbmRTZWxmKGNvbnN0IFJlY3QmIHIpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyLCBvcF9hbmQpOwotfQotUmVnaW9uJiBSZWdpb246OnN1YnRyYWN0U2VsZihjb25zdCBSZWN0JiByKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYociwgb3BfbmFuZCk7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6b3BlcmF0aW9uU2VsZihjb25zdCBSZWN0JiByLCBpbnQgb3ApIHsKLSAgICBSZWdpb24gbGhzKCp0aGlzKTsKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgKnRoaXMsIGxocywgcik7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lvbiYgUmVnaW9uOjpvclNlbGYoY29uc3QgUmVnaW9uJiByaHMpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyaHMsIG9wX29yKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjp4b3JTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYocmhzLCBvcF94b3IpOwotfQotUmVnaW9uJiBSZWdpb246OmFuZFNlbGYoY29uc3QgUmVnaW9uJiByaHMpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyaHMsIG9wX2FuZCk7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6c3VidHJhY3RTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzKSB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvblNlbGYocmhzLCBvcF9uYW5kKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjpvcGVyYXRpb25TZWxmKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgb3ApIHsKLSAgICBSZWdpb24gbGhzKCp0aGlzKTsKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgKnRoaXMsIGxocywgcmhzKTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLVJlZ2lvbiYgUmVnaW9uOjp0cmFuc2xhdGVTZWxmKGludCB4LCBpbnQgeSkgewotICAgIGlmICh4fHkpIHRyYW5zbGF0ZSgqdGhpcywgeCwgeSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om1lcmdlKGNvbnN0IFJlY3QmIHJocykgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBvcF9vcik7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjptZXJnZUV4Y2x1c2l2ZShjb25zdCBSZWN0JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3BfeG9yKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246OmludGVyc2VjdChjb25zdCBSZWN0JiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gb3BlcmF0aW9uKHJocywgb3BfYW5kKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246OnN1YnRyYWN0KGNvbnN0IFJlY3QmIHJocykgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBvcF9uYW5kKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdGlvbihjb25zdCBSZWN0JiByaHMsIGludCBvcCkgY29uc3QgewotICAgIFJlZ2lvbiByZXN1bHQ7Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsIHJlc3VsdCwgKnRoaXMsIHJocyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBSZWdpb24gUmVnaW9uOjptZXJnZShjb25zdCBSZWdpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBvcF9vcik7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjptZXJnZUV4Y2x1c2l2ZShjb25zdCBSZWdpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBvcF94b3IpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6aW50ZXJzZWN0KGNvbnN0IFJlZ2lvbiYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbihyaHMsIG9wX2FuZCk7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjpzdWJ0cmFjdChjb25zdCBSZWdpb24mIHJocykgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBvcF9uYW5kKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om9wZXJhdGlvbihjb25zdCBSZWdpb24mIHJocywgaW50IG9wKSBjb25zdCB7Ci0gICAgUmVnaW9uIHJlc3VsdDsKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgcmVzdWx0LCAqdGhpcywgcmhzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1jb25zdCBSZWdpb24gUmVnaW9uOjp0cmFuc2xhdGUoaW50IHgsIGludCB5KSBjb25zdCB7Ci0gICAgUmVnaW9uIHJlc3VsdDsKLSAgICB0cmFuc2xhdGUocmVzdWx0LCAqdGhpcywgeCwgeSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpb24mIFJlZ2lvbjo6b3JTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgewotICAgIHJldHVybiBvcGVyYXRpb25TZWxmKHJocywgZHgsIGR5LCBvcF9vcik7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6eG9yU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyaHMsIGR4LCBkeSwgb3BfeG9yKTsKLX0KLVJlZ2lvbiYgUmVnaW9uOjphbmRTZWxmKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgewotICAgIHJldHVybiBvcGVyYXRpb25TZWxmKHJocywgZHgsIGR5LCBvcF9hbmQpOwotfQotUmVnaW9uJiBSZWdpb246OnN1YnRyYWN0U2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpIHsKLSAgICByZXR1cm4gb3BlcmF0aW9uU2VsZihyaHMsIGR4LCBkeSwgb3BfbmFuZCk7Ci19Ci1SZWdpb24mIFJlZ2lvbjo6b3BlcmF0aW9uU2VsZihjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHksIGludCBvcCkgewotICAgIFJlZ2lvbiBsaHMoKnRoaXMpOwotICAgIGJvb2xlYW5fb3BlcmF0aW9uKG9wLCAqdGhpcywgbGhzLCByaHMsIGR4LCBkeSk7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om1lcmdlKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBkeCwgZHksIG9wX29yKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246Om1lcmdlRXhjbHVzaXZlKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBkeCwgZHksIG9wX3hvcik7Ci19Ci1jb25zdCBSZWdpb24gUmVnaW9uOjppbnRlcnNlY3QoY29uc3QgUmVnaW9uJiByaHMsIGludCBkeCwgaW50IGR5KSBjb25zdCB7Ci0gICAgcmV0dXJuIG9wZXJhdGlvbihyaHMsIGR4LCBkeSwgb3BfYW5kKTsKLX0KLWNvbnN0IFJlZ2lvbiBSZWdpb246OnN1YnRyYWN0KGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSkgY29uc3QgewotICAgIHJldHVybiBvcGVyYXRpb24ocmhzLCBkeCwgZHksIG9wX25hbmQpOwotfQotY29uc3QgUmVnaW9uIFJlZ2lvbjo6b3BlcmF0aW9uKGNvbnN0IFJlZ2lvbiYgcmhzLCBpbnQgZHgsIGludCBkeSwgaW50IG9wKSBjb25zdCB7Ci0gICAgUmVnaW9uIHJlc3VsdDsKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgcmVzdWx0LCAqdGhpcywgcmhzLCBkeCwgZHkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBpcyBvdXIgcmVnaW9uIHJhc3Rlcml6ZXIsIHdoaWNoIG1lcmdlcyByZWN0cyBhbmQgc3BhbnMgdG9nZXRoZXIKLS8vIHRvIG9idGFpbiBhbiBvcHRpbWFsIHJlZ2lvbi4KLWNsYXNzIFJlZ2lvbjo6cmFzdGVyaXplciA6IHB1YmxpYyByZWdpb25fb3BlcmF0b3I8UmVjdD46OnJlZ2lvbl9yYXN0ZXJpemVyIAotewotICAgIFJlY3QmIGJvdW5kczsKLSAgICBWZWN0b3I8UmVjdD4mIHN0b3JhZ2U7Ci0gICAgUmVjdCogaGVhZDsKLSAgICBSZWN0KiB0YWlsOwotICAgIFZlY3RvcjxSZWN0PiBzcGFuOwotICAgIFJlY3QqIGN1cjsKLXB1YmxpYzoKLSAgICByYXN0ZXJpemVyKFJlZ2lvbiYgcmVnKSAKLSAgICAgICAgOiBib3VuZHMocmVnLm1Cb3VuZHMpLCBzdG9yYWdlKHJlZy5tU3RvcmFnZSksIGhlYWQoKSwgdGFpbCgpLCBjdXIoKSB7Ci0gICAgICAgIGJvdW5kcy50b3AgPSBib3VuZHMuYm90dG9tID0gMDsKLSAgICAgICAgYm91bmRzLmxlZnQgICA9IElOVF9NQVg7Ci0gICAgICAgIGJvdW5kcy5yaWdodCAgPSBJTlRfTUlOOwotICAgICAgICBzdG9yYWdlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgfnJhc3Rlcml6ZXIoKSB7Ci0gICAgICAgIGlmIChzcGFuLnNpemUoKSkgewotICAgICAgICAgICAgZmx1c2hTcGFuKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0b3JhZ2Uuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBib3VuZHMudG9wID0gc3RvcmFnZS5pdGVtQXQoMCkudG9wOwotICAgICAgICAgICAgYm91bmRzLmJvdHRvbSA9IHN0b3JhZ2UudG9wKCkuYm90dG9tOwotICAgICAgICAgICAgaWYgKHN0b3JhZ2Uuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICBzdG9yYWdlLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib3VuZHMubGVmdCAgPSAwOwotICAgICAgICAgICAgYm91bmRzLnJpZ2h0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0b3IoKShjb25zdCBSZWN0JiByZWN0KSB7Ci0gICAgICAgIC8vQUxPR0QoIj4+PiAlM2QsICUzZCwgJTNkLCAlM2QiLAotICAgICAgICAvLyAgICAgICAgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotICAgICAgICBpZiAoc3Bhbi5zaXplKCkpIHsKLSAgICAgICAgICAgIGlmIChjdXItPnRvcCAhPSByZWN0LnRvcCkgewotICAgICAgICAgICAgICAgIGZsdXNoU3BhbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXItPnJpZ2h0ID09IHJlY3QubGVmdCkgewotICAgICAgICAgICAgICAgIGN1ci0+cmlnaHQgPSByZWN0LnJpZ2h0OwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzcGFuLmFkZChyZWN0KTsKLSAgICAgICAgY3VyID0gc3Bhbi5lZGl0QXJyYXkoKSArIChzcGFuLnNpemUoKSAtIDEpOwotICAgIH0KLXByaXZhdGU6Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gCi0gICAgc3RhdGljIGlubGluZSBUIG1pbihUIHJocywgVCBsaHMpIHsgcmV0dXJuIHJocyA8IGxocyA/IHJocyA6IGxoczsgfQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IAotICAgIHN0YXRpYyBpbmxpbmUgVCBtYXgoVCByaHMsIFQgbGhzKSB7IHJldHVybiByaHMgPiBsaHMgPyByaHMgOiBsaHM7IH0KLSAgICB2b2lkIGZsdXNoU3BhbigpIHsKLSAgICAgICAgYm9vbCBtZXJnZSA9IGZhbHNlOwotICAgICAgICBpZiAodGFpbC1oZWFkID09IHNzaXplX3Qoc3Bhbi5zaXplKCkpKSB7Ci0gICAgICAgICAgICBSZWN0IGNvbnN0KiBwID0gc3Bhbi5lZGl0QXJyYXkoKTsKLSAgICAgICAgICAgIFJlY3QgY29uc3QqIHEgPSBoZWFkOwotICAgICAgICAgICAgaWYgKHAtPnRvcCA9PSBxLT5ib3R0b20pIHsKLSAgICAgICAgICAgICAgICBtZXJnZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHEgIT0gdGFpbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHAtPmxlZnQgIT0gcS0+bGVmdCkgfHwgKHAtPnJpZ2h0ICE9IHEtPnJpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHArKywgcSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobWVyZ2UpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBib3R0b20gPSBzcGFuWzBdLmJvdHRvbTsKLSAgICAgICAgICAgIFJlY3QqIHIgPSBoZWFkOwotICAgICAgICAgICAgd2hpbGUgKHIgIT0gdGFpbCkgewotICAgICAgICAgICAgICAgIHItPmJvdHRvbSA9IGJvdHRvbTsKLSAgICAgICAgICAgICAgICByKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBib3VuZHMubGVmdCA9IG1pbihzcGFuLml0ZW1BdCgwKS5sZWZ0LCBib3VuZHMubGVmdCk7Ci0gICAgICAgICAgICBib3VuZHMucmlnaHQgPSBtYXgoc3Bhbi50b3AoKS5yaWdodCwgYm91bmRzLnJpZ2h0KTsKLSAgICAgICAgICAgIHN0b3JhZ2UuYXBwZW5kVmVjdG9yKHNwYW4pOwotICAgICAgICAgICAgdGFpbCA9IHN0b3JhZ2UuZWRpdEFycmF5KCkgKyBzdG9yYWdlLnNpemUoKTsKLSAgICAgICAgICAgIGhlYWQgPSB0YWlsIC0gc3Bhbi5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3Bhbi5jbGVhcigpOwotICAgIH0KLX07Ci0KLWJvb2wgUmVnaW9uOjp2YWxpZGF0ZShjb25zdCBSZWdpb24mIHJlZywgY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICBib29sIHJlc3VsdCA9IHRydWU7Ci0gICAgY29uc3RfaXRlcmF0b3IgY3VyID0gcmVnLmJlZ2luKCk7Ci0gICAgY29uc3RfaXRlcmF0b3IgY29uc3QgdGFpbCA9IHJlZy5lbmQoKTsKLSAgICBjb25zdF9pdGVyYXRvciBwcmV2ID0gY3VyKys7Ci0gICAgUmVjdCBiKCpwcmV2KTsKLSAgICB3aGlsZSAoY3VyICE9IHRhaWwpIHsKLSAgICAgICAgYi5sZWZ0ICAgPSBiLmxlZnQgICA8IGN1ci0+bGVmdCAgID8gYi5sZWZ0ICAgOiBjdXItPmxlZnQ7Ci0gICAgICAgIGIudG9wICAgID0gYi50b3AgICAgPCBjdXItPnRvcCAgICA/IGIudG9wICAgIDogY3VyLT50b3A7Ci0gICAgICAgIGIucmlnaHQgID0gYi5yaWdodCAgPiBjdXItPnJpZ2h0ICA/IGIucmlnaHQgIDogY3VyLT5yaWdodDsKLSAgICAgICAgYi5ib3R0b20gPSBiLmJvdHRvbSA+IGN1ci0+Ym90dG9tID8gYi5ib3R0b20gOiBjdXItPmJvdHRvbTsKLSAgICAgICAgaWYgKGN1ci0+dG9wID09IHByZXYtPnRvcCkgewotICAgICAgICAgICAgaWYgKGN1ci0+Ym90dG9tICE9IHByZXYtPmJvdHRvbSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzcGFuICVwIiwgbmFtZSwgY3VyKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VyLT5sZWZ0IDwgcHJldi0+cmlnaHQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHNwYW5zIG92ZXJsYXAgaG9yaXpvbnRhbGx5IHByZXY9JXAsIGN1cj0lcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBwcmV2LCBjdXIpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGN1ci0+dG9wIDwgcHJldi0+Ym90dG9tKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IHNwYW5zIG92ZXJsYXAgdmVydGljYWxseSBwcmV2PSVwLCBjdXI9JXAiLAotICAgICAgICAgICAgICAgICAgICBuYW1lLCBwcmV2LCBjdXIpOwotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcHJldiA9IGN1cjsKLSAgICAgICAgY3VyKys7Ci0gICAgfQotICAgIGlmIChiICE9IHJlZy5nZXRCb3VuZHMoKSkgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGJvdW5kcyBbJWQsJWQsJWQsJWRdIHZzLiBbJWQsJWQsJWQsJWRdIiwgbmFtZSwKLSAgICAgICAgICAgICAgICBiLmxlZnQsIGIudG9wLCBiLnJpZ2h0LCBiLmJvdHRvbSwKLSAgICAgICAgICAgICAgICByZWcuZ2V0Qm91bmRzKCkubGVmdCwgcmVnLmdldEJvdW5kcygpLnRvcCwgCi0gICAgICAgICAgICAgICAgcmVnLmdldEJvdW5kcygpLnJpZ2h0LCByZWcuZ2V0Qm91bmRzKCkuYm90dG9tKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCA9PSBmYWxzZSkgewotICAgICAgICByZWcuZHVtcChuYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBSZWdpb246OmJvb2xlYW5fb3BlcmF0aW9uKGludCBvcCwgUmVnaW9uJiBkc3QsCi0gICAgICAgIGNvbnN0IFJlZ2lvbiYgbGhzLAotICAgICAgICBjb25zdCBSZWdpb24mIHJocywgaW50IGR4LCBpbnQgZHkpCi17Ci0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgIHZhbGlkYXRlKGxocywgImJvb2xlYW5fb3BlcmF0aW9uIChiZWZvcmUpOiBsaHMiKTsKLSAgICB2YWxpZGF0ZShyaHMsICJib29sZWFuX29wZXJhdGlvbiAoYmVmb3JlKTogcmhzIik7Ci0gICAgdmFsaWRhdGUoZHN0LCAiYm9vbGVhbl9vcGVyYXRpb24gKGJlZm9yZSk6IGRzdCIpOwotI2VuZGlmCi0KLSAgICBzaXplX3QgbGhzX2NvdW50OwotICAgIFJlY3QgY29uc3QgKiBjb25zdCBsaHNfcmVjdHMgPSBsaHMuZ2V0QXJyYXkoJmxoc19jb3VudCk7Ci0KLSAgICBzaXplX3QgcmhzX2NvdW50OwotICAgIFJlY3QgY29uc3QgKiBjb25zdCByaHNfcmVjdHMgPSByaHMuZ2V0QXJyYXkoJnJoc19jb3VudCk7Ci0KLSAgICByZWdpb25fb3BlcmF0b3I8UmVjdD46OnJlZ2lvbiBsaHNfcmVnaW9uKGxoc19yZWN0cywgbGhzX2NvdW50KTsKLSAgICByZWdpb25fb3BlcmF0b3I8UmVjdD46OnJlZ2lvbiByaHNfcmVnaW9uKHJoc19yZWN0cywgcmhzX2NvdW50LCBkeCwgZHkpOwotICAgIHJlZ2lvbl9vcGVyYXRvcjxSZWN0PiBvcGVyYXRpb24ob3AsIGxoc19yZWdpb24sIHJoc19yZWdpb24pOwotICAgIHsgLy8gc2NvcGUgZm9yIHJhc3Rlcml6ZXIgKGR0b3IgaGFzIHNpZGUgZWZmZWN0cykKLSAgICAgICAgcmFzdGVyaXplciByKGRzdCk7Ci0gICAgICAgIG9wZXJhdGlvbihyKTsKLSAgICB9Ci0KLSNpZiBWQUxJREFURV9SRUdJT05TCi0gICAgdmFsaWRhdGUobGhzLCAiYm9vbGVhbl9vcGVyYXRpb246IGxocyIpOwotICAgIHZhbGlkYXRlKHJocywgImJvb2xlYW5fb3BlcmF0aW9uOiByaHMiKTsKLSAgICB2YWxpZGF0ZShkc3QsICJib29sZWFuX29wZXJhdGlvbjogZHN0Iik7Ci0jZW5kaWYKLQotI2lmIFZBTElEQVRFX1dJVEhfQ09SRUNHCi0gICAgU2tSZWdpb24gc2tfbGhzOwotICAgIFNrUmVnaW9uIHNrX3JoczsKLSAgICBTa1JlZ2lvbiBza19kc3Q7Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxsaHNfY291bnQgOyBpKyspCi0gICAgICAgIHNrX2xocy5vcCgKLSAgICAgICAgICAgICAgICBsaHNfcmVjdHNbaV0ubGVmdCAgICsgZHgsCi0gICAgICAgICAgICAgICAgbGhzX3JlY3RzW2ldLnRvcCAgICArIGR5LAotICAgICAgICAgICAgICAgIGxoc19yZWN0c1tpXS5yaWdodCAgKyBkeCwKLSAgICAgICAgICAgICAgICBsaHNfcmVjdHNbaV0uYm90dG9tICsgZHksCi0gICAgICAgICAgICAgICAgU2tSZWdpb246OmtVbmlvbl9PcCk7Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxyaHNfY291bnQgOyBpKyspCi0gICAgICAgIHNrX3Jocy5vcCgKLSAgICAgICAgICAgICAgICByaHNfcmVjdHNbaV0ubGVmdCAgICsgZHgsCi0gICAgICAgICAgICAgICAgcmhzX3JlY3RzW2ldLnRvcCAgICArIGR5LAotICAgICAgICAgICAgICAgIHJoc19yZWN0c1tpXS5yaWdodCAgKyBkeCwKLSAgICAgICAgICAgICAgICByaHNfcmVjdHNbaV0uYm90dG9tICsgZHksCi0gICAgICAgICAgICAgICAgU2tSZWdpb246OmtVbmlvbl9PcCk7Ci0gCi0gICAgY29uc3QgY2hhciogbmFtZSA9ICItLS0iOwotICAgIFNrUmVnaW9uOjpPcCBza19vcDsKLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAgIGNhc2Ugb3Bfb3I6IHNrX29wID0gU2tSZWdpb246OmtVbmlvbl9PcDsgbmFtZT0iT1IiOyBicmVhazsKLSAgICAgICAgY2FzZSBvcF94b3I6IHNrX29wID0gU2tSZWdpb246OmtVbmlvbl9YT1I7IG5hbWU9IlhPUiI7IGJyZWFrOwotICAgICAgICBjYXNlIG9wX2FuZDogc2tfb3AgPSBTa1JlZ2lvbjo6a0ludGVyc2VjdF9PcDsgbmFtZT0iQU5EIjsgYnJlYWs7Ci0gICAgICAgIGNhc2Ugb3BfbmFuZDogc2tfb3AgPSBTa1JlZ2lvbjo6a0RpZmZlcmVuY2VfT3A7IG5hbWU9Ik5BTkQiOyBicmVhazsKLSAgICB9Ci0gICAgc2tfZHN0Lm9wKHNrX2xocywgc2tfcmhzLCBza19vcCk7Ci0KLSAgICBpZiAoc2tfZHN0LmlzRW1wdHkoKSAmJiBkc3QuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgYm9vbCBzYW1lID0gdHJ1ZTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGhlYWQgPSBkc3QuYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IHRhaWwgPSBkc3QuZW5kKCk7Ci0gICAgU2tSZWdpb246Okl0ZXJhdG9yIGl0KHNrX2RzdCk7Ci0gICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKLSAgICAgICAgaWYgKGhlYWQgIT0gdGFpbCkgewotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgICAgICBoZWFkLT5sZWZ0ICE9IGl0LnJlY3QoKS5mTGVmdCB8fCAgICAgCi0gICAgICAgICAgICAgICAgICAgIGhlYWQtPnRvcCAhPSBpdC5yZWN0KCkuZlRvcCB8fCAgICAgCi0gICAgICAgICAgICAgICAgICAgIGhlYWQtPnJpZ2h0ICE9IGl0LnJlY3QoKS5mUmlnaHQgfHwgICAgIAotICAgICAgICAgICAgICAgICAgICBoZWFkLT5ib3R0b20gIT0gaXQucmVjdCgpLmZCb3R0b20KLSAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIHNhbWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNhbWUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGhlYWQrKzsKLSAgICAgICAgaXQubmV4dCgpOwotICAgIH0KLSAgICAKLSAgICBpZiAoaGVhZCAhPSB0YWlsKSB7Ci0gICAgICAgIHNhbWUgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYoIXNhbWUpIHsKLSAgICAgICAgQUxPR0QoIi0tLVxucmVnaW9uIGJvb2xlYW4gJXMgZmFpbGVkIiwgbmFtZSk7Ci0gICAgICAgIGxocy5kdW1wKCJsaHMiKTsKLSAgICAgICAgcmhzLmR1bXAoInJocyIpOwotICAgICAgICBkc3QuZHVtcCgiZHN0Iik7Ci0gICAgICAgIEFMT0dEKCJzaG91bGQgYmUiKTsKLSAgICAgICAgU2tSZWdpb246Okl0ZXJhdG9yIGl0KHNrX2RzdCk7Ci0gICAgICAgIHdoaWxlICghaXQuZG9uZSgpKSB7Ci0gICAgICAgICAgICBBTE9HRCgiICAgIFslM2QsICUzZCwgJTNkLCAlM2RdIiwKLSAgICAgICAgICAgICAgICBpdC5yZWN0KCkuZkxlZnQsCi0gICAgICAgICAgICAgICAgaXQucmVjdCgpLmZUb3AsCi0gICAgICAgICAgICAgICAgaXQucmVjdCgpLmZSaWdodCwKLSAgICAgICAgICAgICAgICBpdC5yZWN0KCkuZkJvdHRvbSk7Ci0gICAgICAgICAgICBpdC5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLX0KLQotdm9pZCBSZWdpb246OmJvb2xlYW5fb3BlcmF0aW9uKGludCBvcCwgUmVnaW9uJiBkc3QsCi0gICAgICAgIGNvbnN0IFJlZ2lvbiYgbGhzLAotICAgICAgICBjb25zdCBSZWN0JiByaHMsIGludCBkeCwgaW50IGR5KQotewotICAgIGlmICghcmhzLmlzVmFsaWQoKSkgewotICAgICAgICBBTE9HRSgiUmVnaW9uOjpib29sZWFuX29wZXJhdGlvbihvcD0lZCkgaW52YWxpZCBSZWN0PXslZCwlZCwlZCwlZH0iLAotICAgICAgICAgICAgICAgIG9wLCByaHMubGVmdCwgcmhzLnRvcCwgcmhzLnJpZ2h0LCByaHMuYm90dG9tKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIFZBTElEQVRFX1dJVEhfQ09SRUNHIHx8IFZBTElEQVRFX1JFR0lPTlMKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgZHN0LCBsaHMsIFJlZ2lvbihyaHMpLCBkeCwgZHkpOwotI2Vsc2UKLSAgICBzaXplX3QgbGhzX2NvdW50OwotICAgIFJlY3QgY29uc3QgKiBjb25zdCBsaHNfcmVjdHMgPSBsaHMuZ2V0QXJyYXkoJmxoc19jb3VudCk7Ci0KLSAgICByZWdpb25fb3BlcmF0b3I8UmVjdD46OnJlZ2lvbiBsaHNfcmVnaW9uKGxoc19yZWN0cywgbGhzX2NvdW50KTsKLSAgICByZWdpb25fb3BlcmF0b3I8UmVjdD46OnJlZ2lvbiByaHNfcmVnaW9uKCZyaHMsIDEsIGR4LCBkeSk7Ci0gICAgcmVnaW9uX29wZXJhdG9yPFJlY3Q+IG9wZXJhdGlvbihvcCwgbGhzX3JlZ2lvbiwgcmhzX3JlZ2lvbik7Ci0gICAgeyAvLyBzY29wZSBmb3IgcmFzdGVyaXplciAoZHRvciBoYXMgc2lkZSBlZmZlY3RzKQotICAgICAgICByYXN0ZXJpemVyIHIoZHN0KTsKLSAgICAgICAgb3BlcmF0aW9uKHIpOwotICAgIH0KLQotI2VuZGlmCi19Ci0KLXZvaWQgUmVnaW9uOjpib29sZWFuX29wZXJhdGlvbihpbnQgb3AsIFJlZ2lvbiYgZHN0LAotICAgICAgICBjb25zdCBSZWdpb24mIGxocywgY29uc3QgUmVnaW9uJiByaHMpCi17Ci0gICAgYm9vbGVhbl9vcGVyYXRpb24ob3AsIGRzdCwgbGhzLCByaHMsIDAsIDApOwotfQotCi12b2lkIFJlZ2lvbjo6Ym9vbGVhbl9vcGVyYXRpb24oaW50IG9wLCBSZWdpb24mIGRzdCwKLSAgICAgICAgY29uc3QgUmVnaW9uJiBsaHMsIGNvbnN0IFJlY3QmIHJocykKLXsKLSAgICBib29sZWFuX29wZXJhdGlvbihvcCwgZHN0LCBsaHMsIHJocywgMCwgMCk7Ci19Ci0KLXZvaWQgUmVnaW9uOjp0cmFuc2xhdGUoUmVnaW9uJiByZWcsIGludCBkeCwgaW50IGR5KQotewotICAgIGlmICghcmVnLmlzRW1wdHkoKSkgewotI2lmIFZBTElEQVRFX1JFR0lPTlMKLSAgICAgICAgdmFsaWRhdGUocmVnLCAidHJhbnNsYXRlIChiZWZvcmUpIik7Ci0jZW5kaWYKLSAgICAgICAgcmVnLm1Cb3VuZHMudHJhbnNsYXRlKGR4LCBkeSk7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IHJlZy5tU3RvcmFnZS5zaXplKCk7Ci0gICAgICAgIFJlY3QqIHJlY3RzID0gcmVnLm1TdG9yYWdlLmVkaXRBcnJheSgpOwotICAgICAgICB3aGlsZSAoY291bnQpIHsKLSAgICAgICAgICAgIHJlY3RzLT50cmFuc2xhdGUoZHgsIGR5KTsKLSAgICAgICAgICAgIHJlY3RzKys7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICB9Ci0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgICAgICB2YWxpZGF0ZShyZWcsICJ0cmFuc2xhdGUgKGFmdGVyKSIpOwotI2VuZGlmCi0gICAgfQotfQotCi12b2lkIFJlZ2lvbjo6dHJhbnNsYXRlKFJlZ2lvbiYgZHN0LCBjb25zdCBSZWdpb24mIHJlZywgaW50IGR4LCBpbnQgZHkpCi17Ci0gICAgZHN0ID0gcmVnOwotICAgIHRyYW5zbGF0ZShkc3QsIGR4LCBkeSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3NpemVfdCBSZWdpb246OndyaXRlKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIGNvbnN0Ci17Ci0jaWYgVkFMSURBVEVfUkVHSU9OUwotICAgIHZhbGlkYXRlKCp0aGlzLCAid3JpdGUoYnVmZmVyKSIpOwotI2VuZGlmCi0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gbVN0b3JhZ2Uuc2l6ZSgpOwotICAgIGNvbnN0IHNpemVfdCBzaXplTmVlZGVkID0gc2l6ZW9mKGludDMyX3QpICsgKDErY291bnQpKnNpemVvZihSZWN0KTsKLSAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHNpemVOZWVkZWQgPiBzaXplKSByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBpbnQzMl90KiBjb25zdCBwID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KGJ1ZmZlcik7Ci0gICAgICAgICpwID0gY291bnQ7Ci0gICAgICAgIG1lbWNweShwKzEsICZtQm91bmRzLCBzaXplb2YoUmVjdCkpOwotICAgICAgICBpZiAoY291bnQpIHsKLSAgICAgICAgICAgIG1lbWNweShwKzUsIG1TdG9yYWdlLmFycmF5KCksIGNvdW50KnNpemVvZihSZWN0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNzaXplX3Qoc2l6ZU5lZWRlZCk7Ci19Ci0KLXNzaXplX3QgUmVnaW9uOjpyZWFkKGNvbnN0IHZvaWQqIGJ1ZmZlcikKLXsKLSAgICBpbnQzMl90IGNvbnN0KiBjb25zdCBwID0gc3RhdGljX2Nhc3Q8aW50MzJfdCBjb25zdCo+KGJ1ZmZlcik7IAotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9ICpwOwotICAgIG1lbWNweSgmbUJvdW5kcywgcCsxLCBzaXplb2YoUmVjdCkpOwotICAgIG1TdG9yYWdlLmNsZWFyKCk7Ci0gICAgaWYgKGNvdW50KSB7Ci0gICAgICAgIG1TdG9yYWdlLmluc2VydEF0KDAsIGNvdW50KTsKLSAgICAgICAgbWVtY3B5KG1TdG9yYWdlLmVkaXRBcnJheSgpLCBwKzUsIGNvdW50KnNpemVvZihSZWN0KSk7Ci0gICAgfQotI2lmIFZBTElEQVRFX1JFR0lPTlMKLSAgICB2YWxpZGF0ZSgqdGhpcywgInJlYWQoYnVmZmVyKSIpOwotI2VuZGlmCi0gICAgcmV0dXJuIHNzaXplX3Qoc2l6ZW9mKGludDMyX3QpICsgKDErY291bnQpKnNpemVvZihSZWN0KSk7Ci19Ci0KLXNzaXplX3QgUmVnaW9uOjp3cml0ZUVtcHR5KHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0gICAgY29uc3Qgc2l6ZV90IHNpemVOZWVkZWQgPSBzaXplb2YoaW50MzJfdCkgKyBzaXplb2YoUmVjdCk7Ci0gICAgaWYgKHNpemVOZWVkZWQgPiBzaXplKSByZXR1cm4gTk9fTUVNT1JZOwotICAgIGludDMyX3QqIGNvbnN0IHAgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oYnVmZmVyKTsgCi0gICAgbWVtc2V0KHAsIDAsIHNpemVOZWVkZWQpOwotICAgIHJldHVybiBzc2l6ZV90KHNpemVOZWVkZWQpOwotfQotCi1ib29sIFJlZ2lvbjo6aXNFbXB0eSh2b2lkKiBidWZmZXIpCi17Ci0gICAgaW50MzJfdCBjb25zdCogY29uc3QgcCA9IHN0YXRpY19jYXN0PGludDMyX3QgY29uc3QqPihidWZmZXIpOyAKLSAgICBSZWN0IGNvbnN0KiBjb25zdCBiID0gcmVpbnRlcnByZXRfY2FzdDxSZWN0IGNvbnN0ICo+KHArMSk7Ci0gICAgcmV0dXJuIGItPmlzRW1wdHkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpb246OmNvbnN0X2l0ZXJhdG9yIFJlZ2lvbjo6YmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlzUmVjdCgpID8gJm1Cb3VuZHMgOiBtU3RvcmFnZS5hcnJheSgpOwotfQotCi1SZWdpb246OmNvbnN0X2l0ZXJhdG9yIFJlZ2lvbjo6ZW5kKCkgY29uc3QgewotICAgIHJldHVybiBpc1JlY3QoKSA/ICgoJm1Cb3VuZHMpICsgMSkgOiAobVN0b3JhZ2UuYXJyYXkoKSArIG1TdG9yYWdlLnNpemUoKSk7Ci19Ci0KLVJlY3QgY29uc3QqIFJlZ2lvbjo6Z2V0QXJyYXkoc2l6ZV90KiBjb3VudCkgY29uc3QgewotICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0IGIoYmVnaW4oKSk7Ci0gICAgY29uc3RfaXRlcmF0b3IgY29uc3QgZShlbmQoKSk7Ci0gICAgaWYgKGNvdW50KSAqY291bnQgPSBlLWI7Ci0gICAgcmV0dXJuIGI7Ci19Ci0KLXNpemVfdCBSZWdpb246OmdldFJlY3RzKFZlY3RvcjxSZWN0PiYgcmVjdExpc3QpIGNvbnN0Ci17Ci0gICAgcmVjdExpc3QgPSBtU3RvcmFnZTsKLSAgICBpZiAocmVjdExpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LmFkZChtQm91bmRzKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlY3RMaXN0LnNpemUoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFJlZ2lvbjo6ZHVtcChTdHJpbmc4JiBvdXQsIGNvbnN0IGNoYXIqIHdoYXQsIHVpbnQzMl90IGZsYWdzKSBjb25zdAotewotICAgICh2b2lkKWZsYWdzOwotICAgIGNvbnN0X2l0ZXJhdG9yIGhlYWQgPSBiZWdpbigpOwotICAgIGNvbnN0X2l0ZXJhdG9yIGNvbnN0IHRhaWwgPSBlbmQoKTsKLQotICAgIHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBSZWdpb24gJXMgKHRoaXM9JXAsIGNvdW50PSVkKVxuIiwKLSAgICAgICAgICAgIHdoYXQsIHRoaXMsIHRhaWwtaGVhZCk7Ci0gICAgb3V0LmFwcGVuZChidWZmZXIpOwotICAgIHdoaWxlIChoZWFkICE9IHRhaWwpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIFslM2QsICUzZCwgJTNkLCAlM2RdXG4iLAotICAgICAgICAgICAgICAgIGhlYWQtPmxlZnQsIGhlYWQtPnRvcCwgaGVhZC0+cmlnaHQsIGhlYWQtPmJvdHRvbSk7Ci0gICAgICAgIG91dC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgaGVhZCsrOwotICAgIH0KLX0KLQotdm9pZCBSZWdpb246OmR1bXAoY29uc3QgY2hhciogd2hhdCwgdWludDMyX3QgZmxhZ3MpIGNvbnN0Ci17Ci0gICAgKHZvaWQpZmxhZ3M7Ci0gICAgY29uc3RfaXRlcmF0b3IgaGVhZCA9IGJlZ2luKCk7Ci0gICAgY29uc3RfaXRlcmF0b3IgY29uc3QgdGFpbCA9IGVuZCgpOwotICAgIEFMT0dEKCIgIFJlZ2lvbiAlcyAodGhpcz0lcCwgY291bnQ9JWQpXG4iLCB3aGF0LCB0aGlzLCB0YWlsLWhlYWQpOwotICAgIHdoaWxlIChoZWFkICE9IHRhaWwpIHsKLSAgICAgICAgQUxPR0QoIiAgICBbJTNkLCAlM2QsICUzZCwgJTNkXVxuIiwKLSAgICAgICAgICAgICAgICBoZWFkLT5sZWZ0LCBoZWFkLT50b3AsIGhlYWQtPnJpZ2h0LCBoZWFkLT5ib3R0b20pOwotICAgICAgICBoZWFkKys7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3VpL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJzL3VpL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwY2FkMzYuLjAwMDAwMDAKLS0tIGEvbGlicy91aS90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBCdWlsZCB0aGUgbWFudWFsIHRlc3QgcHJvZ3JhbXMuCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvbGlicy91aS90ZXN0cy9yZWdpb24vQW5kcm9pZC5tayBiL2xpYnMvdWkvdGVzdHMvcmVnaW9uL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzRhNWEuLjAwMDAwMDAKLS0tIGEvbGlicy91aS90ZXN0cy9yZWdpb24vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlyZWdpb24uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlidXRpbHMgXAotICAgIGxpYnVpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3QtcmVnaW9uCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbGlicy91aS90ZXN0cy9yZWdpb24vcmVnaW9uLmNwcCBiL2xpYnMvdWkvdGVzdHMvcmVnaW9uL3JlZ2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDcyOTQuLjAwMDAwMDAKLS0tIGEvbGlicy91aS90ZXN0cy9yZWdpb24vcmVnaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlJlZ2lvbiIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KLSNpbmNsdWRlIDx1aS9SZWN0Lmg+Ci0jaW5jbHVkZSA8dWkvUmVnaW9uLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbigpCi17Ci0gICAgUmVnaW9uIGVtcHR5OwotICAgIFJlZ2lvbiByZWcwKCBSZWN0KCAgMCwgMCwgIDEwMCwgMTAwICkgKTsKLSAgICBSZWdpb24gcmVnMSA9IHJlZzA7Ci0gICAgUmVnaW9uIHJlZzIsIHJlZzM7Ci0KLSAgICBSZWdpb24gcmVnNCA9IGVtcHR5IHwgcmVnMTsKLSAgICBSZWdpb24gcmVnNSA9IHJlZzEgfCBlbXB0eTsKLQotICAgIHJlZzQuZHVtcCgicmVnNCIpOwotICAgIHJlZzUuZHVtcCgicmVnNSIpOwotICAgIAotICAgIHJlZzAuZHVtcCgicmVnMCIpOwotICAgIHJlZzEuZHVtcCgicmVnMSIpOwotCi0gICAgcmVnMCA9IHJlZzAgfCByZWcwLnRyYW5zbGF0ZSgxNTAsIDApOwotICAgIHJlZzAuZHVtcCgicmVnMCIpOwotICAgIHJlZzEuZHVtcCgicmVnMSIpOwotCi0gICAgcmVnMCA9IHJlZzAgfCByZWcwLnRyYW5zbGF0ZSgzMDAsIDApOwotICAgIHJlZzAuZHVtcCgicmVnMCIpOwotICAgIHJlZzEuZHVtcCgicmVnMSIpOwotCi0gICAgLy9yZWcyID0gcmVnMCB8IHJlZzAudHJhbnNsYXRlKDAsIDEwMCk7Ci0gICAgLy9yZWcwLmR1bXAoInJlZzAiKTsKLSAgICAvL3JlZzEuZHVtcCgicmVnMSIpOwotICAgIC8vcmVnMi5kdW1wKCJyZWcyIik7Ci0KLSAgICAvL3JlZzMgPSByZWcwIHwgcmVnMC50cmFuc2xhdGUoMCwgMTUwKTsKLSAgICAvL3JlZzAuZHVtcCgicmVnMCIpOwotICAgIC8vcmVnMS5kdW1wKCJyZWcxIik7Ci0gICAgLy9yZWcyLmR1bXAoInJlZzIiKTsKLSAgICAvL3JlZzMuZHVtcCgicmVnMyIpOwotCi0gICAgQUxPR0QoIi0tLSIpOwotICAgIHJlZzIgPSByZWcwIHwgcmVnMC50cmFuc2xhdGUoMTAwLCAwKTsKLSAgICByZWcwLmR1bXAoInJlZzAiKTsKLSAgICByZWcxLmR1bXAoInJlZzEiKTsKLSAgICByZWcyLmR1bXAoInJlZzIiKTsKLSAgICAKLSAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9BbmRyb2lkLm1rIGIvbGlicy91dGlscy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2MwNDhhLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBsaWJ1dGlscyBpcyBhIGxpdHRsZSB1bmlxdWU6IEl0J3MgYnVpbHQgdHdpY2UsIG9uY2UgZm9yIHRoZSBob3N0Ci0jIGFuZCBvbmNlIGZvciB0aGUgZGV2aWNlLgotCi1jb21tb25Tb3VyY2VzOj0gXAotCUJhc2ljSGFzaHRhYmxlLmNwcCBcCi0JQmxvYkNhY2hlLmNwcCBcCi0JQnVmZmVyZWRUZXh0T3V0cHV0LmNwcCBcCi0JQ2FsbFN0YWNrLmNwcCBcCi0JRGVidWcuY3BwIFwKLQlGaWxlTWFwLmNwcCBcCi0JRmxhdHRlbmFibGUuY3BwIFwKLQlMaW5lYXJUcmFuc2Zvcm0uY3BwIFwKLQlQcm9wZXJ0eU1hcC5jcHAgXAotCVJlZkJhc2UuY3BwIFwKLQlTaGFyZWRCdWZmZXIuY3BwIFwKLQlTdGF0aWMuY3BwIFwKLQlTdG9wV2F0Y2guY3BwIFwKLQlTdHJpbmc4LmNwcCBcCi0JU3RyaW5nMTYuY3BwIFwKLQlTdHJpbmdBcnJheS5jcHAgXAotCVN5c3RlbUNsb2NrLmNwcCBcCi0JVGV4dE91dHB1dC5jcHAgXAotCVRocmVhZHMuY3BwIFwKLQlUaW1lcnMuY3BwIFwKLQlUb2tlbml6ZXIuY3BwIFwKLQlVbmljb2RlLmNwcCBcCi0JVmVjdG9ySW1wbC5jcHAgXAotCW1pc2MuY3BwCi0KLQotIyBGb3IgdGhlIGhvc3QKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICQoY29tbW9uU291cmNlcykKLQotTE9DQUxfTU9EVUxFOj0gbGlidXRpbHMKLQotTE9DQUxfQ0ZMQUdTICs9IC1ETElCVVRJTFNfTkFUSVZFPTEgJChUT09MX0NGTEFHUykKLQotaWZlcSAoJChIT1NUX09TKSx3aW5kb3dzKQotaWZlcSAoJChzdHJpcCAkKFVTRV9DWUdXSU4pLCksKQotIyBVbmRlciBNaW5HVywgY3R5cGUuaCBkb2Vzbid0IG5lZWQgbXVsdGktYnl0ZSBzdXBwb3J0Ci1MT0NBTF9DRkxBR1MgKz0gLURNQl9DVVJfTUFYPTEKLWVuZGlmCi1lbmRpZgotCi1pZmVxICgkKFRBUkdFVF9PUyksbGludXgpCi1MT0NBTF9MRExJQlMgKz0gLWxydCAtbGRsCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKLQotCi0jIEZvciB0aGUgZGV2aWNlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotCi0jIHdlIGhhdmUgdGhlIGNvbW1vbiBzb3VyY2VzLCBwbHVzIHNvbWUgZGV2aWNlLXNwZWNpZmljIHN0dWZmCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JJChjb21tb25Tb3VyY2VzKSBcCi0JTG9vcGVyLmNwcCBcCi0JVHJhY2UuY3BwCi0KLWlmZXEgKCQoVEFSR0VUX09TKSxsaW51eCkKLUxPQ0FMX0xETElCUyArPSAtbHJ0IC1sZGwKLWVuZGlmCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCQliaW9uaWMvbGliYy9wcml2YXRlCi0KLUxPQ0FMX0xETElCUyArPSAtbHB0aHJlYWQKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlibG9nIFwKLQlsaWJjdXRpbHMgXAotCWxpYmRsIFwKLQlsaWJjb3Jrc2NyZXcKLQotTE9DQUxfTU9EVUxFOj0gbGlidXRpbHMKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCi0jIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCi1pZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCi1pbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0Jhc2ljSGFzaHRhYmxlLmNwcCBiL2xpYnMvdXRpbHMvQmFzaWNIYXNodGFibGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjhlYzlmLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvQmFzaWNIYXNodGFibGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJhc2ljSGFzaHRhYmxlIgotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQmFzaWNIYXNodGFibGUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQmFzaWNIYXNodGFibGVJbXBsOjpCYXNpY0hhc2h0YWJsZUltcGwoc2l6ZV90IGVudHJ5U2l6ZSwgYm9vbCBoYXNUcml2aWFsRGVzdHJ1Y3RvciwKLSAgICAgICAgc2l6ZV90IG1pbmltdW1Jbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIDoKLSAgICAgICAgbUJ1Y2tldFNpemUoZW50cnlTaXplICsgc2l6ZW9mKEJ1Y2tldCkpLCBtSGFzVHJpdmlhbERlc3RydWN0b3IoaGFzVHJpdmlhbERlc3RydWN0b3IpLAotICAgICAgICBtTG9hZEZhY3Rvcihsb2FkRmFjdG9yKSwgbVNpemUoMCksCi0gICAgICAgIG1GaWxsZWRCdWNrZXRzKDApLCBtQnVja2V0cyhOVUxMKSB7Ci0gICAgZGV0ZXJtaW5lQ2FwYWNpdHkobWluaW11bUluaXRpYWxDYXBhY2l0eSwgbUxvYWRGYWN0b3IsICZtQnVja2V0Q291bnQsICZtQ2FwYWNpdHkpOwotfQotCi1CYXNpY0hhc2h0YWJsZUltcGw6OkJhc2ljSGFzaHRhYmxlSW1wbChjb25zdCBCYXNpY0hhc2h0YWJsZUltcGwmIG90aGVyKSA6Ci0gICAgICAgIG1CdWNrZXRTaXplKG90aGVyLm1CdWNrZXRTaXplKSwgbUhhc1RyaXZpYWxEZXN0cnVjdG9yKG90aGVyLm1IYXNUcml2aWFsRGVzdHJ1Y3RvciksCi0gICAgICAgIG1DYXBhY2l0eShvdGhlci5tQ2FwYWNpdHkpLCBtTG9hZEZhY3RvcihvdGhlci5tTG9hZEZhY3RvciksCi0gICAgICAgIG1TaXplKG90aGVyLm1TaXplKSwgbUZpbGxlZEJ1Y2tldHMob3RoZXIubUZpbGxlZEJ1Y2tldHMpLAotICAgICAgICBtQnVja2V0Q291bnQob3RoZXIubUJ1Y2tldENvdW50KSwgbUJ1Y2tldHMob3RoZXIubUJ1Y2tldHMpIHsKLSAgICBpZiAobUJ1Y2tldHMpIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtQnVja2V0cyktPmFjcXVpcmUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpkaXNwb3NlKCkgewotICAgIGlmIChtQnVja2V0cykgewotICAgICAgICByZWxlYXNlQnVja2V0cyhtQnVja2V0cywgbUJ1Y2tldENvdW50KTsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpjbG9uZSgpIHsKLSAgICBpZiAobUJ1Y2tldHMpIHsKLSAgICAgICAgdm9pZCogbmV3QnVja2V0cyA9IGFsbG9jYXRlQnVja2V0cyhtQnVja2V0Q291bnQpOwotICAgICAgICBjb3B5QnVja2V0cyhtQnVja2V0cywgbmV3QnVja2V0cywgbUJ1Y2tldENvdW50KTsKLSAgICAgICAgcmVsZWFzZUJ1Y2tldHMobUJ1Y2tldHMsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgIG1CdWNrZXRzID0gbmV3QnVja2V0czsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpzZXRUbyhjb25zdCBCYXNpY0hhc2h0YWJsZUltcGwmIG90aGVyKSB7Ci0gICAgaWYgKG1CdWNrZXRzKSB7Ci0gICAgICAgIHJlbGVhc2VCdWNrZXRzKG1CdWNrZXRzLCBtQnVja2V0Q291bnQpOwotICAgIH0KLQotICAgIG1DYXBhY2l0eSA9IG90aGVyLm1DYXBhY2l0eTsKLSAgICBtTG9hZEZhY3RvciA9IG90aGVyLm1Mb2FkRmFjdG9yOwotICAgIG1TaXplID0gb3RoZXIubVNpemU7Ci0gICAgbUZpbGxlZEJ1Y2tldHMgPSBvdGhlci5tRmlsbGVkQnVja2V0czsKLSAgICBtQnVja2V0Q291bnQgPSBvdGhlci5tQnVja2V0Q291bnQ7Ci0gICAgbUJ1Y2tldHMgPSBvdGhlci5tQnVja2V0czsKLQotICAgIGlmIChtQnVja2V0cykgewotICAgICAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1CdWNrZXRzKS0+YWNxdWlyZSgpOwotICAgIH0KLX0KLQotdm9pZCBCYXNpY0hhc2h0YWJsZUltcGw6OmNsZWFyKCkgewotICAgIGlmIChtQnVja2V0cykgewotICAgICAgICBpZiAobUZpbGxlZEJ1Y2tldHMpIHsKLSAgICAgICAgICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1CdWNrZXRzKTsKLSAgICAgICAgICAgIGlmIChzYi0+b25seU93bmVyKCkpIHsKLSAgICAgICAgICAgICAgICBkZXN0cm95QnVja2V0cyhtQnVja2V0cywgbUJ1Y2tldENvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQnVja2V0JiBidWNrZXQgPSBidWNrZXRBdChtQnVja2V0cywgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Y2tldC5jb29raWUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVsZWFzZUJ1Y2tldHMobUJ1Y2tldHMsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgbUJ1Y2tldHMgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGxlZEJ1Y2tldHMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG1TaXplID0gMDsKLSAgICB9Ci19Ci0KLXNzaXplX3QgQmFzaWNIYXNodGFibGVJbXBsOjpuZXh0KHNzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAobVNpemUpIHsKLSAgICAgICAgd2hpbGUgKHNpemVfdCgrK2luZGV4KSA8IG1CdWNrZXRDb3VudCkgewotICAgICAgICAgICAgY29uc3QgQnVja2V0JiBidWNrZXQgPSBidWNrZXRBdChtQnVja2V0cywgaW5kZXgpOwotICAgICAgICAgICAgaWYgKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zc2l6ZV90IEJhc2ljSGFzaHRhYmxlSW1wbDo6ZmluZChzc2l6ZV90IGluZGV4LCBoYXNoX3QgaGFzaCwKLSAgICAgICAgY29uc3Qgdm9pZCogX19yZXN0cmljdF9fIGtleSkgY29uc3QgewotICAgIGlmICghbVNpemUpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGhhc2ggPSB0cmltSGFzaChoYXNoKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGluZGV4ID0gY2hhaW5TdGFydChoYXNoLCBtQnVja2V0Q291bnQpOwotCi0gICAgICAgIGNvbnN0IEJ1Y2tldCYgYnVja2V0ID0gYnVja2V0QXQobUJ1Y2tldHMsIHNpemVfdChpbmRleCkpOwotICAgICAgICBpZiAoYnVja2V0LmNvb2tpZSAmIEJ1Y2tldDo6UFJFU0VOVCkgewotICAgICAgICAgICAgaWYgKGNvbXBhcmVCdWNrZXRLZXkoYnVja2V0LCBrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCEoYnVja2V0LmNvb2tpZSAmIEJ1Y2tldDo6Q09MTElTSU9OKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNpemVfdCBpbmMgPSBjaGFpbkluY3JlbWVudChoYXNoLCBtQnVja2V0Q291bnQpOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgaW5kZXggPSBjaGFpblNlZWsoaW5kZXgsIGluYywgbUJ1Y2tldENvdW50KTsKLQotICAgICAgICBjb25zdCBCdWNrZXQmIGJ1Y2tldCA9IGJ1Y2tldEF0KG1CdWNrZXRzLCBzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgaWYgKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgIGlmICgoYnVja2V0LmNvb2tpZSAmIEJ1Y2tldDo6SEFTSF9NQVNLKSA9PSBoYXNoCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbXBhcmVCdWNrZXRLZXkoYnVja2V0LCBrZXkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OkNPTExJU0lPTikpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc2l6ZV90IEJhc2ljSGFzaHRhYmxlSW1wbDo6YWRkKGhhc2hfdCBoYXNoLCBjb25zdCB2b2lkKiBlbnRyeSkgewotICAgIGlmICghbUJ1Y2tldHMpIHsKLSAgICAgICAgbUJ1Y2tldHMgPSBhbGxvY2F0ZUJ1Y2tldHMobUJ1Y2tldENvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICBlZGl0KCk7Ci0gICAgfQotCi0gICAgaGFzaCA9IHRyaW1IYXNoKGhhc2gpOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gY2hhaW5TdGFydChoYXNoLCBtQnVja2V0Q291bnQpOwotICAgICAgICBCdWNrZXQqIGJ1Y2tldCA9ICZidWNrZXRBdChtQnVja2V0cywgc2l6ZV90KGluZGV4KSk7Ci0gICAgICAgIGlmIChidWNrZXQtPmNvb2tpZSAmIEJ1Y2tldDo6UFJFU0VOVCkgewotICAgICAgICAgICAgc2l6ZV90IGluYyA9IGNoYWluSW5jcmVtZW50KGhhc2gsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgYnVja2V0LT5jb29raWUgfD0gQnVja2V0OjpDT0xMSVNJT047Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBjaGFpblNlZWsoaW5kZXgsIGluYywgbUJ1Y2tldENvdW50KTsKLSAgICAgICAgICAgICAgICBidWNrZXQgPSAmYnVja2V0QXQobUJ1Y2tldHMsIHNpemVfdChpbmRleCkpOwotICAgICAgICAgICAgfSB3aGlsZSAoYnVja2V0LT5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDMyX3QgY29sbGlzaW9uID0gYnVja2V0LT5jb29raWUgJiBCdWNrZXQ6OkNPTExJU0lPTjsKLSAgICAgICAgaWYgKCFjb2xsaXNpb24pIHsKLSAgICAgICAgICAgIGlmIChtRmlsbGVkQnVja2V0cyA+PSBtQ2FwYWNpdHkpIHsKLSAgICAgICAgICAgICAgICByZWhhc2gobUNhcGFjaXR5ICogMiwgbUxvYWRGYWN0b3IpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGxlZEJ1Y2tldHMgKz0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1Y2tldC0+Y29va2llID0gY29sbGlzaW9uIHwgQnVja2V0OjpQUkVTRU5UIHwgaGFzaDsKLSAgICAgICAgbVNpemUgKz0gMTsKLSAgICAgICAgaW5pdGlhbGl6ZUJ1Y2tldEVudHJ5KCpidWNrZXQsIGVudHJ5KTsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLX0KLQotdm9pZCBCYXNpY0hhc2h0YWJsZUltcGw6OnJlbW92ZUF0KHNpemVfdCBpbmRleCkgewotICAgIGVkaXQoKTsKLQotICAgIEJ1Y2tldCYgYnVja2V0ID0gYnVja2V0QXQobUJ1Y2tldHMsIGluZGV4KTsKLSAgICBidWNrZXQuY29va2llICY9IH5CdWNrZXQ6OlBSRVNFTlQ7Ci0gICAgaWYgKCEoYnVja2V0LmNvb2tpZSAmIEJ1Y2tldDo6Q09MTElTSU9OKSkgewotICAgICAgICBtRmlsbGVkQnVja2V0cyAtPSAxOwotICAgIH0KLSAgICBtU2l6ZSAtPSAxOwotICAgIGlmICghbUhhc1RyaXZpYWxEZXN0cnVjdG9yKSB7Ci0gICAgICAgIGRlc3Ryb3lCdWNrZXRFbnRyeShidWNrZXQpOwotICAgIH0KLX0KLQotdm9pZCBCYXNpY0hhc2h0YWJsZUltcGw6OnJlaGFzaChzaXplX3QgbWluaW11bUNhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0gICAgaWYgKG1pbmltdW1DYXBhY2l0eSA8IG1TaXplKSB7Ci0gICAgICAgIG1pbmltdW1DYXBhY2l0eSA9IG1TaXplOwotICAgIH0KLSAgICBzaXplX3QgbmV3QnVja2V0Q291bnQsIG5ld0NhcGFjaXR5OwotICAgIGRldGVybWluZUNhcGFjaXR5KG1pbmltdW1DYXBhY2l0eSwgbG9hZEZhY3RvciwgJm5ld0J1Y2tldENvdW50LCAmbmV3Q2FwYWNpdHkpOwotCi0gICAgaWYgKG5ld0J1Y2tldENvdW50ICE9IG1CdWNrZXRDb3VudCB8fCBuZXdDYXBhY2l0eSAhPSBtQ2FwYWNpdHkpIHsKLSAgICAgICAgaWYgKG1CdWNrZXRzKSB7Ci0gICAgICAgICAgICB2b2lkKiBuZXdCdWNrZXRzOwotICAgICAgICAgICAgaWYgKG1TaXplKSB7Ci0gICAgICAgICAgICAgICAgbmV3QnVja2V0cyA9IGFsbG9jYXRlQnVja2V0cyhuZXdCdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVja2V0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWNrZXQmIGZyb21CdWNrZXQgPSBidWNrZXRBdChtQnVja2V0cywgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tQnVja2V0LmNvb2tpZSAmIEJ1Y2tldDo6UFJFU0VOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF90IGhhc2ggPSBmcm9tQnVja2V0LmNvb2tpZSAmIEJ1Y2tldDo6SEFTSF9NQVNLOwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluZGV4ID0gY2hhaW5TdGFydChoYXNoLCBuZXdCdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXQqIHRvQnVja2V0ID0gJmJ1Y2tldEF0KG5ld0J1Y2tldHMsIHNpemVfdChpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvQnVja2V0LT5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5jID0gY2hhaW5JbmNyZW1lbnQoaGFzaCwgbmV3QnVja2V0Q291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9CdWNrZXQtPmNvb2tpZSB8PSBCdWNrZXQ6OkNPTExJU0lPTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjaGFpblNlZWsoaW5kZXgsIGluYywgbmV3QnVja2V0Q291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0J1Y2tldCA9ICZidWNrZXRBdChuZXdCdWNrZXRzLCBzaXplX3QoaW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0b0J1Y2tldC0+Y29va2llICYgQnVja2V0OjpQUkVTRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvQnVja2V0LT5jb29raWUgPSBCdWNrZXQ6OlBSRVNFTlQgfCBoYXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUJ1Y2tldEVudHJ5KCp0b0J1Y2tldCwgZnJvbUJ1Y2tldC5lbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG5ld0J1Y2tldHMgPSBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVsZWFzZUJ1Y2tldHMobUJ1Y2tldHMsIG1CdWNrZXRDb3VudCk7Ci0gICAgICAgICAgICBtQnVja2V0cyA9IG5ld0J1Y2tldHM7Ci0gICAgICAgICAgICBtRmlsbGVkQnVja2V0cyA9IG1TaXplOwotICAgICAgICB9Ci0gICAgICAgIG1CdWNrZXRDb3VudCA9IG5ld0J1Y2tldENvdW50OwotICAgICAgICBtQ2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLSAgICB9Ci0gICAgbUxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotfQotCi12b2lkKiBCYXNpY0hhc2h0YWJsZUltcGw6OmFsbG9jYXRlQnVja2V0cyhzaXplX3QgY291bnQpIGNvbnN0IHsKLSAgICBzaXplX3QgYnl0ZXMgPSBjb3VudCAqIG1CdWNrZXRTaXplOwotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKGJ5dGVzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFzYiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSAldSBieXRlcyBmb3IgaGFzaHRhYmxlIHdpdGggJXUgYnVja2V0cy4iLAotICAgICAgICAgICAgdWludDMyX3QoYnl0ZXMpLCB1aW50MzJfdChjb3VudCkpOwotICAgIHZvaWQqIGJ1Y2tldHMgPSBzYi0+ZGF0YSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBCdWNrZXQmIGJ1Y2tldCA9IGJ1Y2tldEF0KGJ1Y2tldHMsIGkpOwotICAgICAgICBidWNrZXQuY29va2llID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Y2tldHM7Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpyZWxlYXNlQnVja2V0cyh2b2lkKiBfX3Jlc3RyaWN0X18gYnVja2V0cywgc2l6ZV90IGNvdW50KSBjb25zdCB7Ci0gICAgU2hhcmVkQnVmZmVyKiBzYiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEoYnVja2V0cyk7Ci0gICAgaWYgKHNiLT5yZWxlYXNlKFNoYXJlZEJ1ZmZlcjo6ZUtlZXBTdG9yYWdlKSA9PSAxKSB7Ci0gICAgICAgIGRlc3Ryb3lCdWNrZXRzKGJ1Y2tldHMsIGNvdW50KTsKLSAgICAgICAgU2hhcmVkQnVmZmVyOjpkZWFsbG9jKHNiKTsKLSAgICB9Ci19Ci0KLXZvaWQgQmFzaWNIYXNodGFibGVJbXBsOjpkZXN0cm95QnVja2V0cyh2b2lkKiBfX3Jlc3RyaWN0X18gYnVja2V0cywgc2l6ZV90IGNvdW50KSBjb25zdCB7Ci0gICAgaWYgKCFtSGFzVHJpdmlhbERlc3RydWN0b3IpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBCdWNrZXQmIGJ1Y2tldCA9IGJ1Y2tldEF0KGJ1Y2tldHMsIGkpOwotICAgICAgICAgICAgaWYgKGJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgICAgICBkZXN0cm95QnVja2V0RW50cnkoYnVja2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBCYXNpY0hhc2h0YWJsZUltcGw6OmNvcHlCdWNrZXRzKGNvbnN0IHZvaWQqIF9fcmVzdHJpY3RfXyBmcm9tQnVja2V0cywKLSAgICAgICAgdm9pZCogX19yZXN0cmljdF9fIHRvQnVja2V0cywgc2l6ZV90IGNvdW50KSBjb25zdCB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IEJ1Y2tldCYgZnJvbUJ1Y2tldCA9IGJ1Y2tldEF0KGZyb21CdWNrZXRzLCBpKTsKLSAgICAgICAgQnVja2V0JiB0b0J1Y2tldCA9IGJ1Y2tldEF0KHRvQnVja2V0cywgaSk7Ci0gICAgICAgIHRvQnVja2V0LmNvb2tpZSA9IGZyb21CdWNrZXQuY29va2llOwotICAgICAgICBpZiAoZnJvbUJ1Y2tldC5jb29raWUgJiBCdWNrZXQ6OlBSRVNFTlQpIHsKLSAgICAgICAgICAgIGluaXRpYWxpemVCdWNrZXRFbnRyeSh0b0J1Y2tldCwgZnJvbUJ1Y2tldC5lbnRyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRhYmxlIG9mIDMxLWJpdCBwcmltZXMgd2hlcmUgZWFjaCBwcmltZSBpcyBubyBsZXNzIHRoYW4gdHdpY2UgYXMgbGFyZ2UKLS8vIGFzIHRoZSBwcmV2aW91cyBvbmUuICBHZW5lcmF0ZWQgYnkgInByaW1lcy5weSIuCi1zdGF0aWMgc2l6ZV90IFBSSU1FU1tdID0gewotICAgIDUsCi0gICAgMTEsCi0gICAgMjMsCi0gICAgNDcsCi0gICAgOTcsCi0gICAgMTk3LAotICAgIDM5NywKLSAgICA3OTcsCi0gICAgMTU5NywKLSAgICAzMjAzLAotICAgIDY0MjEsCi0gICAgMTI4NTMsCi0gICAgMjU3MTcsCi0gICAgNTE0MzcsCi0gICAgMTAyODc3LAotICAgIDIwNTc1OSwKLSAgICA0MTE1MjcsCi0gICAgODIzMTE3LAotICAgIDE2NDYyMzcsCi0gICAgMzI5MjQ4OSwKLSAgICA2NTg0OTgzLAotICAgIDEzMTY5OTc3LAotICAgIDI2MzM5OTY5LAotICAgIDUyNjc5OTY5LAotICAgIDEwNTM1OTkzOSwKLSAgICAyMTA3MTk4ODEsCi0gICAgNDIxNDM5NzgzLAotICAgIDg0Mjg3OTU3OSwKLSAgICAxNjg1NzU5MTY3LAotICAgIDAsCi19OwotCi12b2lkIEJhc2ljSGFzaHRhYmxlSW1wbDo6ZGV0ZXJtaW5lQ2FwYWNpdHkoc2l6ZV90IG1pbmltdW1DYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvciwKLSAgICAgICAgc2l6ZV90KiBfX3Jlc3RyaWN0X18gb3V0QnVja2V0Q291bnQsIHNpemVfdCogX19yZXN0cmljdF9fIG91dENhcGFjaXR5KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihsb2FkRmFjdG9yIDw9IDAuMGYgfHwgbG9hZEZhY3RvciA+IDEuMGYsCi0gICAgICAgICAgICAiSW52YWxpZCBsb2FkIGZhY3RvciAlMC4zZi4gIE11c3QgYmUgaW4gdGhlIHJhbmdlICgwLCAxXS4iLCBsb2FkRmFjdG9yKTsKLQotICAgIHNpemVfdCBjb3VudCA9IGNlaWxmKG1pbmltdW1DYXBhY2l0eSAvIGxvYWRGYWN0b3IpICsgMTsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGNvdW50ID4gUFJJTUVTW2ldICYmIGkgPCBORUxFTShQUklNRVMpKSB7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgY291bnQgPSBQUklNRVNbaV07Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighY291bnQsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHJlcXVpcmVkIG51bWJlciBvZiBidWNrZXRzIGZvciAiCi0gICAgICAgICAgICAiaGFzaHRhYmxlIHdpdGggbWluaW11bSBjYXBhY2l0eSAldSBhbmQgbG9hZCBmYWN0b3IgJTAuM2YuIiwKLSAgICAgICAgICAgIHVpbnQzMl90KG1pbmltdW1DYXBhY2l0eSksIGxvYWRGYWN0b3IpOwotICAgICpvdXRCdWNrZXRDb3VudCA9IGNvdW50OwotICAgICpvdXRDYXBhY2l0eSA9IGNlaWxmKChjb3VudCAtIDEpICogbG9hZEZhY3Rvcik7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0Jsb2JDYWNoZS5jcHAgYi9saWJzL3V0aWxzL0Jsb2JDYWNoZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMzk4ZWUuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9CbG9iQ2FjaGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkJsb2JDYWNoZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQmxvYkNhY2hlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gQmxvYkNhY2hlOjpIZWFkZXI6Om1NYWdpY051bWJlciB2YWx1ZQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGJsb2JDYWNoZU1hZ2ljID0gJ19CYiQnOwotCi0vLyBCbG9iQ2FjaGU6OkhlYWRlcjo6bUJsb2JDYWNoZVZlcnNpb24gdmFsdWUKLXN0YXRpYyBjb25zdCB1aW50MzJfdCBibG9iQ2FjaGVWZXJzaW9uID0gMTsKLQotLy8gQmxvYkNhY2hlOjpIZWFkZXI6Om1EZXZpY2VWZXJzaW9uIHZhbHVlCi1zdGF0aWMgY29uc3QgdWludDMyX3QgYmxvYkNhY2hlRGV2aWNlVmVyc2lvbiA9IDE7Ci0KLUJsb2JDYWNoZTo6QmxvYkNhY2hlKHNpemVfdCBtYXhLZXlTaXplLCBzaXplX3QgbWF4VmFsdWVTaXplLCBzaXplX3QgbWF4VG90YWxTaXplKToKLSAgICAgICAgbU1heEtleVNpemUobWF4S2V5U2l6ZSksCi0gICAgICAgIG1NYXhWYWx1ZVNpemUobWF4VmFsdWVTaXplKSwKLSAgICAgICAgbU1heFRvdGFsU2l6ZShtYXhUb3RhbFNpemUpLAotICAgICAgICBtVG90YWxTaXplKDApIHsKLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSNpZmRlZiBfV0lOMzIKLSAgICBzcmFuZChub3cpOwotI2Vsc2UKLSAgICBtUmFuZFN0YXRlWzBdID0gKG5vdyA+PiAwKSAmIDB4RkZGRjsKLSAgICBtUmFuZFN0YXRlWzFdID0gKG5vdyA+PiAxNikgJiAweEZGRkY7Ci0gICAgbVJhbmRTdGF0ZVsyXSA9IChub3cgPj4gMzIpICYgMHhGRkZGOwotI2VuZGlmCi0gICAgQUxPR1YoImluaXRpYWxpemluZyByYW5kb20gc2VlZCB1c2luZyAlbGxkIiwgbm93KTsKLX0KLQotdm9pZCBCbG9iQ2FjaGU6OnNldChjb25zdCB2b2lkKiBrZXksIHNpemVfdCBrZXlTaXplLCBjb25zdCB2b2lkKiB2YWx1ZSwKLSAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSkgewotICAgIGlmIChtTWF4S2V5U2l6ZSA8IGtleVNpemUpIHsKLSAgICAgICAgQUxPR1YoInNldDogbm90IGNhY2hpbmcgYmVjYXVzZSB0aGUga2V5IGlzIHRvbyBsYXJnZTogJWQgKGxpbWl0OiAlZCkiLAotICAgICAgICAgICAgICAgIGtleVNpemUsIG1NYXhLZXlTaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobU1heFZhbHVlU2l6ZSA8IHZhbHVlU2l6ZSkgewotICAgICAgICBBTE9HVigic2V0OiBub3QgY2FjaGluZyBiZWNhdXNlIHRoZSB2YWx1ZSBpcyB0b28gbGFyZ2U6ICVkIChsaW1pdDogJWQpIiwKLSAgICAgICAgICAgICAgICB2YWx1ZVNpemUsIG1NYXhWYWx1ZVNpemUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtTWF4VG90YWxTaXplIDwga2V5U2l6ZSArIHZhbHVlU2l6ZSkgewotICAgICAgICBBTE9HVigic2V0OiBub3QgY2FjaGluZyBiZWNhdXNlIHRoZSBjb21iaW5lZCBrZXkvdmFsdWUgc2l6ZSBpcyB0b28gIgotICAgICAgICAgICAgICAgICJsYXJnZTogJWQgKGxpbWl0OiAlZCkiLCBrZXlTaXplICsgdmFsdWVTaXplLCBtTWF4VG90YWxTaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoa2V5U2l6ZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzZXQ6IG5vdCBjYWNoaW5nIGJlY2F1c2Uga2V5U2l6ZSBpcyAwIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHZhbHVlU2l6ZSA8PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJzZXQ6IG5vdCBjYWNoaW5nIGJlY2F1c2UgdmFsdWVTaXplIGlzIDAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPEJsb2I+IGR1bW15S2V5KG5ldyBCbG9iKGtleSwga2V5U2l6ZSwgZmFsc2UpKTsKLSAgICBDYWNoZUVudHJ5IGR1bW15RW50cnkoZHVtbXlLZXksIE5VTEwpOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZUVudHJpZXMuaW5kZXhPZihkdW1teUVudHJ5KTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNhY2hlIGVudHJ5LgotICAgICAgICAgICAgc3A8QmxvYj4ga2V5QmxvYihuZXcgQmxvYihrZXksIGtleVNpemUsIHRydWUpKTsKLSAgICAgICAgICAgIHNwPEJsb2I+IHZhbHVlQmxvYihuZXcgQmxvYih2YWx1ZSwgdmFsdWVTaXplLCB0cnVlKSk7Ci0gICAgICAgICAgICBzaXplX3QgbmV3VG90YWxTaXplID0gbVRvdGFsU2l6ZSArIGtleVNpemUgKyB2YWx1ZVNpemU7Ci0gICAgICAgICAgICBpZiAobU1heFRvdGFsU2l6ZSA8IG5ld1RvdGFsU2l6ZSkgewotICAgICAgICAgICAgICAgIGlmIChpc0NsZWFuYWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIHRoZSBjYWNoZSBhbmQgdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgICAgICBjbGVhbigpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0OiBub3QgY2FjaGluZyBuZXcga2V5L3ZhbHVlIHBhaXIgYmVjYXVzZSB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBjYWNoZSBzaXplIGxpbWl0IHdvdWxkIGJlIGV4Y2VlZGVkOiAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIihsaW1pdDogJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTaXplICsgdmFsdWVTaXplLCBtTWF4VG90YWxTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhY2hlRW50cmllcy5hZGQoQ2FjaGVFbnRyeShrZXlCbG9iLCB2YWx1ZUJsb2IpKTsKLSAgICAgICAgICAgIG1Ub3RhbFNpemUgPSBuZXdUb3RhbFNpemU7Ci0gICAgICAgICAgICBBTE9HVigic2V0OiBjcmVhdGVkIG5ldyBjYWNoZSBlbnRyeSB3aXRoICVkIGJ5dGUga2V5IGFuZCAlZCBieXRlIHZhbHVlIiwKLSAgICAgICAgICAgICAgICAgICAga2V5U2l6ZSwgdmFsdWVTaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgZXhpc3RpbmcgY2FjaGUgZW50cnkuCi0gICAgICAgICAgICBzcDxCbG9iPiB2YWx1ZUJsb2IobmV3IEJsb2IodmFsdWUsIHZhbHVlU2l6ZSwgdHJ1ZSkpOwotICAgICAgICAgICAgc3A8QmxvYj4gb2xkVmFsdWVCbG9iKG1DYWNoZUVudHJpZXNbaW5kZXhdLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgc2l6ZV90IG5ld1RvdGFsU2l6ZSA9IG1Ub3RhbFNpemUgKyB2YWx1ZVNpemUgLSBvbGRWYWx1ZUJsb2ItPmdldFNpemUoKTsKLSAgICAgICAgICAgIGlmIChtTWF4VG90YWxTaXplIDwgbmV3VG90YWxTaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzQ2xlYW5hYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW4gdGhlIGNhY2hlIGFuZCB0cnkgYWdhaW4uCi0gICAgICAgICAgICAgICAgICAgIGNsZWFuKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXQ6IG5vdCBjYWNoaW5nIG5ldyB2YWx1ZSBiZWNhdXNlIHRoZSB0b3RhbCBjYWNoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgbGltaXQgd291bGQgYmUgZXhjZWVkZWQ6ICVkIChsaW1pdDogJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTaXplICsgdmFsdWVTaXplLCBtTWF4VG90YWxTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhY2hlRW50cmllcy5lZGl0SXRlbUF0KGluZGV4KS5zZXRWYWx1ZSh2YWx1ZUJsb2IpOwotICAgICAgICAgICAgbVRvdGFsU2l6ZSA9IG5ld1RvdGFsU2l6ZTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXQ6IHVwZGF0ZWQgZXhpc3RpbmcgY2FjaGUgZW50cnkgd2l0aCAlZCBieXRlIGtleSBhbmQgJWQgYnl0ZSAiCi0gICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIsIGtleVNpemUsIHZhbHVlU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zaXplX3QgQmxvYkNhY2hlOjpnZXQoY29uc3Qgdm9pZCoga2V5LCBzaXplX3Qga2V5U2l6ZSwgdm9pZCogdmFsdWUsCi0gICAgICAgIHNpemVfdCB2YWx1ZVNpemUpIHsKLSAgICBpZiAobU1heEtleVNpemUgPCBrZXlTaXplKSB7Ci0gICAgICAgIEFMT0dWKCJnZXQ6IG5vdCBzZWFyY2hpbmcgYmVjYXVzZSB0aGUga2V5IGlzIHRvbyBsYXJnZTogJWQgKGxpbWl0ICVkKSIsCi0gICAgICAgICAgICAgICAga2V5U2l6ZSwgbU1heEtleVNpemUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc3A8QmxvYj4gZHVtbXlLZXkobmV3IEJsb2Ioa2V5LCBrZXlTaXplLCBmYWxzZSkpOwotICAgIENhY2hlRW50cnkgZHVtbXlFbnRyeShkdW1teUtleSwgTlVMTCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1DYWNoZUVudHJpZXMuaW5kZXhPZihkdW1teUVudHJ5KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dWKCJnZXQ6IG5vIGNhY2hlIGVudHJ5IGZvdW5kIGZvciBrZXkgb2Ygc2l6ZSAlZCIsIGtleVNpemUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBUaGUga2V5IHdhcyBmb3VuZC4gUmV0dXJuIHRoZSB2YWx1ZSBpZiB0aGUgY2FsbGVyJ3MgYnVmZmVyIGlzIGxhcmdlCi0gICAgLy8gZW5vdWdoLgotICAgIHNwPEJsb2I+IHZhbHVlQmxvYihtQ2FjaGVFbnRyaWVzW2luZGV4XS5nZXRWYWx1ZSgpKTsKLSAgICBzaXplX3QgdmFsdWVCbG9iU2l6ZSA9IHZhbHVlQmxvYi0+Z2V0U2l6ZSgpOwotICAgIGlmICh2YWx1ZUJsb2JTaXplIDw9IHZhbHVlU2l6ZSkgewotICAgICAgICBBTE9HVigiZ2V0OiBjb3B5aW5nICVkIGJ5dGVzIHRvIGNhbGxlcidzIGJ1ZmZlciIsIHZhbHVlQmxvYlNpemUpOwotICAgICAgICBtZW1jcHkodmFsdWUsIHZhbHVlQmxvYi0+Z2V0RGF0YSgpLCB2YWx1ZUJsb2JTaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZ2V0OiBjYWxsZXIncyBidWZmZXIgaXMgdG9vIHNtYWxsIGZvciB2YWx1ZTogJWQgKG5lZWRzICVkKSIsCi0gICAgICAgICAgICAgICAgdmFsdWVTaXplLCB2YWx1ZUJsb2JTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlQmxvYlNpemU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IGFsaWduNChzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiAoc2l6ZSArIDMpICYgfjM7Ci19Ci0KLXNpemVfdCBCbG9iQ2FjaGU6OmdldEZsYXR0ZW5lZFNpemUoKSBjb25zdCB7Ci0gICAgc2l6ZV90IHNpemUgPSBzaXplb2YoSGVhZGVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYWNoZUVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgQ2FjaGVFbnRyeSYgZShtQ2FjaGVFbnRyaWVzW2ldKTsKLSAgICAgICAgc3A8QmxvYj4ga2V5QmxvYiA9IGUuZ2V0S2V5KCk7Ci0gICAgICAgIHNwPEJsb2I+IHZhbHVlQmxvYiA9IGUuZ2V0VmFsdWUoKTsKLSAgICAgICAgc2l6ZSA9IGFsaWduNChzaXplKTsKLSAgICAgICAgc2l6ZSArPSBzaXplb2YoRW50cnlIZWFkZXIpICsga2V5QmxvYi0+Z2V0U2l6ZSgpICsKLSAgICAgICAgICAgICAgICB2YWx1ZUJsb2ItPmdldFNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNpemVfdCBCbG9iQ2FjaGU6OmdldEZkQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IEJsb2JDYWNoZTo6ZmxhdHRlbih2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZmRzW10sIHNpemVfdCBjb3VudCkKLSAgICAgICAgY29uc3QgewotICAgIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJmbGF0dGVuOiBub256ZXJvIGZkIGNvdW50OiAlenUiLCBjb3VudCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdGhlIGNhY2hlIGhlYWRlcgotICAgIGlmIChzaXplIDwgc2l6ZW9mKEhlYWRlcikpIHsKLSAgICAgICAgQUxPR0UoImZsYXR0ZW46IG5vdCBlbm91Z2ggcm9vbSBmb3IgY2FjaGUgaGVhZGVyIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEhlYWRlciogaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxIZWFkZXIqPihidWZmZXIpOwotICAgIGhlYWRlci0+bU1hZ2ljTnVtYmVyID0gYmxvYkNhY2hlTWFnaWM7Ci0gICAgaGVhZGVyLT5tQmxvYkNhY2hlVmVyc2lvbiA9IGJsb2JDYWNoZVZlcnNpb247Ci0gICAgaGVhZGVyLT5tRGV2aWNlVmVyc2lvbiA9IGJsb2JDYWNoZURldmljZVZlcnNpb247Ci0gICAgaGVhZGVyLT5tTnVtRW50cmllcyA9IG1DYWNoZUVudHJpZXMuc2l6ZSgpOwotCi0gICAgLy8gV3JpdGUgY2FjaGUgZW50cmllcwotICAgIHVpbnQ4X3QqIGJ5dGVCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihidWZmZXIpOwotICAgIG9mZl90IGJ5dGVPZmZzZXQgPSBhbGlnbjQoc2l6ZW9mKEhlYWRlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNhY2hlRW50cmllcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBDYWNoZUVudHJ5JiBlKG1DYWNoZUVudHJpZXNbaV0pOwotICAgICAgICBzcDxCbG9iPiBrZXlCbG9iID0gZS5nZXRLZXkoKTsKLSAgICAgICAgc3A8QmxvYj4gdmFsdWVCbG9iID0gZS5nZXRWYWx1ZSgpOwotICAgICAgICBzaXplX3Qga2V5U2l6ZSA9IGtleUJsb2ItPmdldFNpemUoKTsKLSAgICAgICAgc2l6ZV90IHZhbHVlU2l6ZSA9IHZhbHVlQmxvYi0+Z2V0U2l6ZSgpOwotCi0gICAgICAgIHNpemVfdCBlbnRyeVNpemUgPSBzaXplb2YoRW50cnlIZWFkZXIpICsga2V5U2l6ZSArIHZhbHVlU2l6ZTsKLSAgICAgICAgaWYgKGJ5dGVPZmZzZXQgKyBlbnRyeVNpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmxhdHRlbjogbm90IGVub3VnaCByb29tIGZvciBjYWNoZSBlbnRyaWVzIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0KLSAgICAgICAgRW50cnlIZWFkZXIqIGVoZWFkZXIgPSByZWludGVycHJldF9jYXN0PEVudHJ5SGVhZGVyKj4oCi0gICAgICAgICAgICAmYnl0ZUJ1ZmZlcltieXRlT2Zmc2V0XSk7Ci0gICAgICAgIGVoZWFkZXItPm1LZXlTaXplID0ga2V5U2l6ZTsKLSAgICAgICAgZWhlYWRlci0+bVZhbHVlU2l6ZSA9IHZhbHVlU2l6ZTsKLQotICAgICAgICBtZW1jcHkoZWhlYWRlci0+bURhdGEsIGtleUJsb2ItPmdldERhdGEoKSwga2V5U2l6ZSk7Ci0gICAgICAgIG1lbWNweShlaGVhZGVyLT5tRGF0YSArIGtleVNpemUsIHZhbHVlQmxvYi0+Z2V0RGF0YSgpLCB2YWx1ZVNpemUpOwotCi0gICAgICAgIGJ5dGVPZmZzZXQgKz0gYWxpZ240KGVudHJ5U2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBCbG9iQ2FjaGU6OnVuZmxhdHRlbih2b2lkIGNvbnN0KiBidWZmZXIsIHNpemVfdCBzaXplLCBpbnQgZmRzW10sCi0gICAgICAgIHNpemVfdCBjb3VudCkgewotICAgIC8vIEFsbCBlcnJvcnMgc2hvdWxkIHJlc3VsdCBpbiB0aGUgQmxvYkNhY2hlIGJlaW5nIGluIGFuIGVtcHR5IHN0YXRlLgotICAgIG1DYWNoZUVudHJpZXMuY2xlYXIoKTsKLQotICAgIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJ1bmZsYXR0ZW46IG5vbnplcm8gZmQgY291bnQ6ICV6dSIsIGNvdW50KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBSZWFkIHRoZSBjYWNoZSBoZWFkZXIKLSAgICBpZiAoc2l6ZSA8IHNpemVvZihIZWFkZXIpKSB7Ci0gICAgICAgIEFMT0dFKCJ1bmZsYXR0ZW46IG5vdCBlbm91Z2ggcm9vbSBmb3IgY2FjaGUgaGVhZGVyIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGNvbnN0IEhlYWRlciogaGVhZGVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBIZWFkZXIqPihidWZmZXIpOwotICAgIGlmIChoZWFkZXItPm1NYWdpY051bWJlciAhPSBibG9iQ2FjaGVNYWdpYykgewotICAgICAgICBBTE9HRSgidW5mbGF0dGVuOiBiYWQgbWFnaWMgbnVtYmVyOiAlZCIsIGhlYWRlci0+bU1hZ2ljTnVtYmVyKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKGhlYWRlci0+bUJsb2JDYWNoZVZlcnNpb24gIT0gYmxvYkNhY2hlVmVyc2lvbiB8fAotICAgICAgICAgICAgaGVhZGVyLT5tRGV2aWNlVmVyc2lvbiAhPSBibG9iQ2FjaGVEZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgIC8vIFdlIHRyZWF0IHZlcnNpb24gbWlzbWF0Y2hlcyBhcyBhbiBlbXB0eSBjYWNoZS4KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIFJlYWQgY2FjaGUgZW50cmllcwotICAgIGNvbnN0IHVpbnQ4X3QqIGJ5dGVCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpOwotICAgIG9mZl90IGJ5dGVPZmZzZXQgPSBhbGlnbjQoc2l6ZW9mKEhlYWRlcikpOwotICAgIHNpemVfdCBudW1FbnRyaWVzID0gaGVhZGVyLT5tTnVtRW50cmllczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgewotICAgICAgICBpZiAoYnl0ZU9mZnNldCArIHNpemVvZihFbnRyeUhlYWRlcikgPiBzaXplKSB7Ci0gICAgICAgICAgICBtQ2FjaGVFbnRyaWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBBTE9HRSgidW5mbGF0dGVuOiBub3QgZW5vdWdoIHJvb20gZm9yIGNhY2hlIGVudHJ5IGhlYWRlcnMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBFbnRyeUhlYWRlciogZWhlYWRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRW50cnlIZWFkZXIqPigKLSAgICAgICAgICAgICAgICAmYnl0ZUJ1ZmZlcltieXRlT2Zmc2V0XSk7Ci0gICAgICAgIHNpemVfdCBrZXlTaXplID0gZWhlYWRlci0+bUtleVNpemU7Ci0gICAgICAgIHNpemVfdCB2YWx1ZVNpemUgPSBlaGVhZGVyLT5tVmFsdWVTaXplOwotICAgICAgICBzaXplX3QgZW50cnlTaXplID0gc2l6ZW9mKEVudHJ5SGVhZGVyKSArIGtleVNpemUgKyB2YWx1ZVNpemU7Ci0KLSAgICAgICAgaWYgKGJ5dGVPZmZzZXQgKyBlbnRyeVNpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICBtQ2FjaGVFbnRyaWVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBBTE9HRSgidW5mbGF0dGVuOiBub3QgZW5vdWdoIHJvb20gZm9yIGNhY2hlIGVudHJ5IGhlYWRlcnMiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhID0gZWhlYWRlci0+bURhdGE7Ci0gICAgICAgIHNldChkYXRhLCBrZXlTaXplLCBkYXRhICsga2V5U2l6ZSwgdmFsdWVTaXplKTsKLQotICAgICAgICBieXRlT2Zmc2V0ICs9IGFsaWduNChlbnRyeVNpemUpOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotbG9uZyBpbnQgQmxvYkNhY2hlOjpibG9iX3JhbmRvbSgpIHsKLSNpZmRlZiBfV0lOMzIKLSAgICByZXR1cm4gcmFuZCgpOwotI2Vsc2UKLSAgICByZXR1cm4gbnJhbmQ0OChtUmFuZFN0YXRlKTsKLSNlbmRpZgotfQotCi12b2lkIEJsb2JDYWNoZTo6Y2xlYW4oKSB7Ci0gICAgLy8gUmVtb3ZlIGEgcmFuZG9tIGNhY2hlIGVudHJ5IHVudGlsIHRoZSB0b3RhbCBjYWNoZSBzaXplIGdldHMgYmVsb3cgaGFsZgotICAgIC8vIHRoZSBtYXhpbXVtIHRvdGFsIGNhY2hlIHNpemUuCi0gICAgd2hpbGUgKG1Ub3RhbFNpemUgPiBtTWF4VG90YWxTaXplIC8gMikgewotICAgICAgICBzaXplX3QgaSA9IHNpemVfdChibG9iX3JhbmRvbSgpICUgKG1DYWNoZUVudHJpZXMuc2l6ZSgpKSk7Ci0gICAgICAgIGNvbnN0IENhY2hlRW50cnkmIGVudHJ5KG1DYWNoZUVudHJpZXNbaV0pOwotICAgICAgICBtVG90YWxTaXplIC09IGVudHJ5LmdldEtleSgpLT5nZXRTaXplKCkgKyBlbnRyeS5nZXRWYWx1ZSgpLT5nZXRTaXplKCk7Ci0gICAgICAgIG1DYWNoZUVudHJpZXMucmVtb3ZlQXQoaSk7Ci0gICAgfQotfQotCi1ib29sIEJsb2JDYWNoZTo6aXNDbGVhbmFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ub3RhbFNpemUgPiBtTWF4VG90YWxTaXplIC8gMjsKLX0KLQotQmxvYkNhY2hlOjpCbG9iOjpCbG9iKGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplLCBib29sIGNvcHlEYXRhKToKLSAgICAgICAgbURhdGEoY29weURhdGEgPyBtYWxsb2Moc2l6ZSkgOiBkYXRhKSwKLSAgICAgICAgbVNpemUoc2l6ZSksCi0gICAgICAgIG1Pd25zRGF0YShjb3B5RGF0YSkgewotICAgIGlmIChkYXRhICE9IE5VTEwgJiYgY29weURhdGEpIHsKLSAgICAgICAgbWVtY3B5KGNvbnN0X2Nhc3Q8dm9pZCo+KG1EYXRhKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotfQotCi1CbG9iQ2FjaGU6OkJsb2I6On5CbG9iKCkgewotICAgIGlmIChtT3duc0RhdGEpIHsKLSAgICAgICAgZnJlZShjb25zdF9jYXN0PHZvaWQqPihtRGF0YSkpOwotICAgIH0KLX0KLQotYm9vbCBCbG9iQ2FjaGU6OkJsb2I6Om9wZXJhdG9yPChjb25zdCBCbG9iJiByaHMpIGNvbnN0IHsKLSAgICBpZiAobVNpemUgPT0gcmhzLm1TaXplKSB7Ci0gICAgICAgIHJldHVybiBtZW1jbXAobURhdGEsIHJocy5tRGF0YSwgbVNpemUpIDwgMDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNpemUgPCByaHMubVNpemU7Ci0gICAgfQotfQotCi1jb25zdCB2b2lkKiBCbG9iQ2FjaGU6OkJsb2I6OmdldERhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1EYXRhOwotfQotCi1zaXplX3QgQmxvYkNhY2hlOjpCbG9iOjpnZXRTaXplKCkgY29uc3QgewotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpDYWNoZUVudHJ5KCkgewotfQotCi1CbG9iQ2FjaGU6OkNhY2hlRW50cnk6OkNhY2hlRW50cnkoY29uc3Qgc3A8QmxvYj4mIGtleSwgY29uc3Qgc3A8QmxvYj4mIHZhbHVlKToKLSAgICAgICAgbUtleShrZXkpLAotICAgICAgICBtVmFsdWUodmFsdWUpIHsKLX0KLQotQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpDYWNoZUVudHJ5KGNvbnN0IENhY2hlRW50cnkmIGNlKToKLSAgICAgICAgbUtleShjZS5tS2V5KSwKLSAgICAgICAgbVZhbHVlKGNlLm1WYWx1ZSkgewotfQotCi1ib29sIEJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6b3BlcmF0b3I8KGNvbnN0IENhY2hlRW50cnkmIHJocykgY29uc3QgewotICAgIHJldHVybiAqbUtleSA8ICpyaHMubUtleTsKLX0KLQotY29uc3QgQmxvYkNhY2hlOjpDYWNoZUVudHJ5JiBCbG9iQ2FjaGU6OkNhY2hlRW50cnk6Om9wZXJhdG9yPShjb25zdCBDYWNoZUVudHJ5JiByaHMpIHsKLSAgICBtS2V5ID0gcmhzLm1LZXk7Ci0gICAgbVZhbHVlID0gcmhzLm1WYWx1ZTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLXNwPEJsb2JDYWNoZTo6QmxvYj4gQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpnZXRLZXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1LZXk7Ci19Ci0KLXNwPEJsb2JDYWNoZTo6QmxvYj4gQmxvYkNhY2hlOjpDYWNoZUVudHJ5OjpnZXRWYWx1ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVZhbHVlOwotfQotCi12b2lkIEJsb2JDYWNoZTo6Q2FjaGVFbnRyeTo6c2V0VmFsdWUoY29uc3Qgc3A8QmxvYj4mIHZhbHVlKSB7Ci0gICAgbVZhbHVlID0gdmFsdWU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0LmNwcCBiL2xpYnMvdXRpbHMvQnVmZmVyZWRUZXh0T3V0cHV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5NjYyZS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0J1ZmZlcmVkVGV4dE91dHB1dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9CdWZmZXJlZFRleHRPdXRwdXQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPGN1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3V0aWxzL1N0YXRpYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEJ1ZmZlcmVkVGV4dE91dHB1dDo6QnVmZmVyU3RhdGUgOiBwdWJsaWMgUmVmQmFzZQotewotICAgIEJ1ZmZlclN0YXRlKGludDMyX3QgX3NlcSkKLSAgICAgICAgOiBzZXEoX3NlcSkKLSAgICAgICAgLCBidWZmZXIoTlVMTCkKLSAgICAgICAgLCBidWZmZXJQb3MoMCkKLSAgICAgICAgLCBidWZmZXJTaXplKDApCi0gICAgICAgICwgYXRGcm9udCh0cnVlKQotICAgICAgICAsIGluZGVudCgwKQotICAgICAgICAsIGJ1bmRsZSgwKSB7Ci0gICAgfQotICAgIH5CdWZmZXJTdGF0ZSgpIHsKLSAgICAgICAgZnJlZShidWZmZXIpOwotICAgIH0KLSAgICAKLSAgICBzdGF0dXNfdCBhcHBlbmQoY29uc3QgY2hhciogdHh0LCBzaXplX3QgbGVuKSB7Ci0gICAgICAgIGlmICgobGVuK2J1ZmZlclBvcykgPiBidWZmZXJTaXplKSB7Ci0gICAgICAgICAgICB2b2lkKiBiID0gcmVhbGxvYyhidWZmZXIsICgobGVuK2J1ZmZlclBvcykqMykvMik7Ci0gICAgICAgICAgICBpZiAoIWIpIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICBidWZmZXIgPSAoY2hhciopYjsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoYnVmZmVyK2J1ZmZlclBvcywgdHh0LCBsZW4pOwotICAgICAgICBidWZmZXJQb3MgKz0gbGVuOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIAotICAgIHZvaWQgcmVzdGFydCgpIHsKLSAgICAgICAgYnVmZmVyUG9zID0gMDsKLSAgICAgICAgYXRGcm9udCA9IHRydWU7Ci0gICAgICAgIGlmIChidWZmZXJTaXplID4gMjU2KSB7Ci0gICAgICAgICAgICB2b2lkKiBiID0gcmVhbGxvYyhidWZmZXIsIDI1Nik7Ci0gICAgICAgICAgICBpZiAoYikgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IChjaGFyKiliOwotICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAyNTY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY29uc3QgaW50MzJfdCBzZXE7Ci0gICAgY2hhciogYnVmZmVyOwotICAgIHNpemVfdCBidWZmZXJQb3M7Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgYm9vbCBhdEZyb250OwotICAgIGludDMyX3QgaW5kZW50OwotICAgIGludDMyX3QgYnVuZGxlOwotfTsKLQotc3RydWN0IEJ1ZmZlcmVkVGV4dE91dHB1dDo6VGhyZWFkU3RhdGUKLXsKLSAgICBWZWN0b3I8c3A8QnVmZmVyZWRUZXh0T3V0cHV0OjpCdWZmZXJTdGF0ZT4gPiBzdGF0ZXM7Ci19OwotCi1zdGF0aWMgbXV0ZXhfdCAgICAgICAgICBnTXV0ZXg7Ci0KLXN0YXRpYyB0aHJlYWRfc3RvcmVfdCAgIHRsczsKLQotQnVmZmVyZWRUZXh0T3V0cHV0OjpUaHJlYWRTdGF0ZSogQnVmZmVyZWRUZXh0T3V0cHV0OjpnZXRUaHJlYWRTdGF0ZSgpCi17Ci0gICAgVGhyZWFkU3RhdGUqICB0cyA9IChUaHJlYWRTdGF0ZSopIHRocmVhZF9zdG9yZV9nZXQoICZ0bHMgKTsKLSAgICBpZiAodHMpIHJldHVybiB0czsKLSAgICB0cyA9IG5ldyBUaHJlYWRTdGF0ZTsKLSAgICB0aHJlYWRfc3RvcmVfc2V0KCAmdGxzLCB0cywgdGhyZWFkRGVzdHJ1Y3RvciApOwotICAgIHJldHVybiB0czsKLX0KLQotdm9pZCBCdWZmZXJlZFRleHRPdXRwdXQ6OnRocmVhZERlc3RydWN0b3Iodm9pZCAqc3QpCi17Ci0gICAgZGVsZXRlICgoVGhyZWFkU3RhdGUqKXN0KTsKLX0KLQotc3RhdGljIHZvbGF0aWxlIGludDMyX3QgZ1NlcXVlbmNlID0gMDsKLQotc3RhdGljIHZvbGF0aWxlIGludDMyX3QgZ0ZyZWVCdWZmZXJJbmRleCA9IC0xOwotCi1zdGF0aWMgaW50MzJfdCBhbGxvY0J1ZmZlckluZGV4KCkKLXsKLSAgICBpbnQzMl90IHJlcyA9IC0xOwotICAgIAotICAgIG11dGV4X2xvY2soJmdNdXRleCk7Ci0gICAgCi0gICAgaWYgKGdGcmVlQnVmZmVySW5kZXggPj0gMCkgewotICAgICAgICByZXMgPSBnRnJlZUJ1ZmZlckluZGV4OwotICAgICAgICBnRnJlZUJ1ZmZlckluZGV4ID0gZ1RleHRCdWZmZXJzW3Jlc107Ci0gICAgICAgIGdUZXh0QnVmZmVycy5lZGl0SXRlbUF0KHJlcykgPSAtMTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IGdUZXh0QnVmZmVycy5zaXplKCk7Ci0gICAgICAgIGdUZXh0QnVmZmVycy5hZGQoLTEpOwotICAgIH0KLQotICAgIG11dGV4X3VubG9jaygmZ011dGV4KTsKLSAgICAKLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlQnVmZmVySW5kZXgoaW50MzJfdCBpZHgpCi17Ci0gICAgbXV0ZXhfbG9jaygmZ011dGV4KTsKLSAgICBnVGV4dEJ1ZmZlcnMuZWRpdEl0ZW1BdChpZHgpID0gZ0ZyZWVCdWZmZXJJbmRleDsKLSAgICBnRnJlZUJ1ZmZlckluZGV4ID0gaWR4OwotICAgIG11dGV4X3VubG9jaygmZ011dGV4KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUJ1ZmZlcmVkVGV4dE91dHB1dDo6QnVmZmVyZWRUZXh0T3V0cHV0KHVpbnQzMl90IGZsYWdzKQotICAgIDogbUZsYWdzKGZsYWdzKQotICAgICwgbVNlcShhbmRyb2lkX2F0b21pY19pbmMoJmdTZXF1ZW5jZSkpCi0gICAgLCBtSW5kZXgoYWxsb2NCdWZmZXJJbmRleCgpKQotewotICAgIG1HbG9iYWxTdGF0ZSA9IG5ldyBCdWZmZXJTdGF0ZShtU2VxKTsKLSAgICBpZiAobUdsb2JhbFN0YXRlKSBtR2xvYmFsU3RhdGUtPmluY1N0cm9uZyh0aGlzKTsKLX0KLSAgICAKLUJ1ZmZlcmVkVGV4dE91dHB1dDo6fkJ1ZmZlcmVkVGV4dE91dHB1dCgpCi17Ci0gICAgaWYgKG1HbG9iYWxTdGF0ZSkgbUdsb2JhbFN0YXRlLT5kZWNTdHJvbmcodGhpcyk7Ci0gICAgZnJlZUJ1ZmZlckluZGV4KG1JbmRleCk7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlcmVkVGV4dE91dHB1dDo6cHJpbnQoY29uc3QgY2hhciogdHh0LCBzaXplX3QgbGVuKQotewotICAgIC8vcHJpbnRmKCJCdWZmZXJlZFRleHRPdXRwdXQ6IHByaW50aW5nICVkXG4iLCBsZW4pOwotICAgIAotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgQnVmZmVyU3RhdGUqIGIgPSBnZXRCdWZmZXIoKTsKLSAgICAKLSAgICBjb25zdCBjaGFyKiBjb25zdCBlbmQgPSB0eHQrbGVuOwotICAgIAotICAgIHN0YXR1c190IGVycjsKLQotICAgIHdoaWxlICh0eHQgPCBlbmQpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBsaW5lLgotICAgICAgICBjb25zdCBjaGFyKiBmaXJzdCA9IHR4dDsKLSAgICAgICAgd2hpbGUgKHR4dCA8IGVuZCAmJiAqdHh0ICE9ICdcbicpIHR4dCsrOwotICAgICAgICAKLSAgICAgICAgLy8gSW5jbHVkZSB0aGlzIGFuZCBhbGwgZm9sbG93aW5nIGVtcHR5IGxpbmVzLgotICAgICAgICB3aGlsZSAodHh0IDwgZW5kICYmICp0eHQgPT0gJ1xuJykgdHh0Kys7Ci0gICAgICAgIAotICAgICAgICAvLyBTcGVjaWFsIGNhc2VzIGZvciBmaXJzdCBkYXRhIG9uIGEgbGluZS4KLSAgICAgICAgaWYgKGItPmF0RnJvbnQpIHsKLSAgICAgICAgICAgIGlmIChiLT5pbmRlbnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBsaW5lLCBhZGQgdGhlIGluZGVudC4KLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcmVmaXggPSBzdHJpbmdGb3JJbmRlbnQoYi0+aW5kZW50KTsKLSAgICAgICAgICAgICAgICBlcnIgPSBiLT5hcHBlbmQocHJlZml4LCBzdHJsZW4ocHJlZml4KSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgcmV0dXJuIGVycjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoKih0eHQtMSkgPT0gJ1xuJyAmJiAhYi0+YnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiBpZiB3ZSBhcmUgbm90IGluZGVudGluZyBvciBidW5kbGluZywgYW5kCi0gICAgICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIGdpdmVuIG9uZSBvciBtb3JlIGNvbXBsZXRlIGxpbmVzLCBqdXN0IHdyaXRlCi0gICAgICAgICAgICAgICAgLy8gdGhlbSBvdXQgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSBidWZmZXIuCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gU2x1cnAgdXAgYWxsIG9mIHRoZSBsaW5lcy4KLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsYXN0TGluZSA9IHR4dCsxOwotICAgICAgICAgICAgICAgIHdoaWxlICh0eHQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCp0eHQrKyA9PSAnXG4nKSBsYXN0TGluZSA9IHR4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RydWN0IGlvdmVjIHZlYzsKLSAgICAgICAgICAgICAgICB2ZWMuaW92X2Jhc2UgPSAodm9pZCopZmlyc3Q7Ci0gICAgICAgICAgICAgICAgdmVjLmlvdl9sZW4gPSBsYXN0TGluZS1maXJzdDsKLSAgICAgICAgICAgICAgICAvL3ByaW50ZigiV3JpdGluZyAlZCBieXRlcyBvZiBkYXRhIVxuIiwgdmVjLmlvdl9sZW4pOwotICAgICAgICAgICAgICAgIHdyaXRlTGluZXModmVjLCAxKTsKLSAgICAgICAgICAgICAgICB0eHQgPSBsYXN0TGluZTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQXBwZW5kIHRoZSBuZXcgdGV4dCB0byB0aGUgYnVmZmVyLgotICAgICAgICBlcnIgPSBiLT5hcHBlbmQoZmlyc3QsIHR4dC1maXJzdCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHJldHVybiBlcnI7Ci0gICAgICAgIGItPmF0RnJvbnQgPSAqKHR4dC0xKSA9PSAnXG4nOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2UgaGF2ZSBmaW5pc2hlZCBhIGxpbmUgYW5kIGFyZSBub3QgYnVuZGxpbmcsIHdyaXRlCi0gICAgICAgIC8vIGl0IG91dC4KLSAgICAgICAgLy9wcmludGYoIkJ1ZmZlciBpcyBub3cgJWQgYnl0ZXNcbiIsIGItPmJ1ZmZlclBvcyk7Ci0gICAgICAgIGlmIChiLT5hdEZyb250ICYmICFiLT5idW5kbGUpIHsKLSAgICAgICAgICAgIHN0cnVjdCBpb3ZlYyB2ZWM7Ci0gICAgICAgICAgICB2ZWMuaW92X2Jhc2UgPSBiLT5idWZmZXI7Ci0gICAgICAgICAgICB2ZWMuaW92X2xlbiA9IGItPmJ1ZmZlclBvczsKLSAgICAgICAgICAgIC8vcHJpbnRmKCJXcml0aW5nICVkIGJ5dGVzIG9mIGRhdGEhXG4iLCB2ZWMuaW92X2xlbik7Ci0gICAgICAgICAgICB3cml0ZUxpbmVzKHZlYywgMSk7Ci0gICAgICAgICAgICBiLT5yZXN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEJ1ZmZlcmVkVGV4dE91dHB1dDo6bW92ZUluZGVudChpbnQgZGVsdGEpCi17Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICBCdWZmZXJTdGF0ZSogYiA9IGdldEJ1ZmZlcigpOwotICAgIGItPmluZGVudCArPSBkZWx0YTsKLSAgICBpZiAoYi0+aW5kZW50IDwgMCkgYi0+aW5kZW50ID0gMDsKLX0KLQotdm9pZCBCdWZmZXJlZFRleHRPdXRwdXQ6OnB1c2hCdW5kbGUoKQotewotICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgQnVmZmVyU3RhdGUqIGIgPSBnZXRCdWZmZXIoKTsKLSAgICBiLT5idW5kbGUrKzsKLX0KLQotdm9pZCBCdWZmZXJlZFRleHRPdXRwdXQ6OnBvcEJ1bmRsZSgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLSAgICBCdWZmZXJTdGF0ZSogYiA9IGdldEJ1ZmZlcigpOwotICAgIGItPmJ1bmRsZS0tOwotICAgIExPR19GQVRBTF9JRihiLT5idW5kbGUgPCAwLAotICAgICAgICAiVGV4dE91dHB1dDo6cG9wQnVuZGxlKCkgY2FsbGVkIG1vcmUgdGltZXMgdGhhbiBwdXNoQnVuZGxlKCkiKTsKLSAgICBpZiAoYi0+YnVuZGxlIDwgMCkgYi0+YnVuZGxlID0gMDsKLSAgICAKLSAgICBpZiAoYi0+YnVuZGxlID09IDApIHsKLSAgICAgICAgLy8gTGFzdCBidW5kbGUsIHdyaXRlIG91dCBkYXRhIGlmIGl0IGlzIGNvbXBsZXRlLiAgSWYgaXQgaXMgbm90Ci0gICAgICAgIC8vIGNvbXBsZXRlLCBkb24ndCB3cml0ZSB1bnRpbCB0aGUgbGFzdCBsaW5lIGlzIGRvbmUuLi4gdGhpcyBtYXkKLSAgICAgICAgLy8gb3IgbWF5IG5vdCBiZSB0aGUgd3JpdGUgdGhpbmcgdG8gZG8sIGJ1dCBpdCdzIHRoZSBlYXNpZXN0LgotICAgICAgICBpZiAoYi0+YnVmZmVyUG9zID4gMCAmJiBiLT5hdEZyb250KSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgaW92ZWMgdmVjOwotICAgICAgICAgICAgdmVjLmlvdl9iYXNlID0gYi0+YnVmZmVyOwotICAgICAgICAgICAgdmVjLmlvdl9sZW4gPSBiLT5idWZmZXJQb3M7Ci0gICAgICAgICAgICB3cml0ZUxpbmVzKHZlYywgMSk7Ci0gICAgICAgICAgICBiLT5yZXN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUJ1ZmZlcmVkVGV4dE91dHB1dDo6QnVmZmVyU3RhdGUqIEJ1ZmZlcmVkVGV4dE91dHB1dDo6Z2V0QnVmZmVyKCkgY29uc3QKLXsKLSAgICBpZiAoKG1GbGFncyZNVUxUSVRIUkVBREVEKSAhPSAwKSB7Ci0gICAgICAgIFRocmVhZFN0YXRlKiB0cyA9IGdldFRocmVhZFN0YXRlKCk7Ci0gICAgICAgIGlmICh0cykgewotICAgICAgICAgICAgd2hpbGUgKHRzLT5zdGF0ZXMuc2l6ZSgpIDw9IChzaXplX3QpbUluZGV4KSB0cy0+c3RhdGVzLmFkZChOVUxMKTsKLSAgICAgICAgICAgIEJ1ZmZlclN0YXRlKiBicyA9IHRzLT5zdGF0ZXNbbUluZGV4XS5nZXQoKTsKLSAgICAgICAgICAgIGlmIChicyAhPSBOVUxMICYmIGJzLT5zZXEgPT0gbVNlcSkgcmV0dXJuIGJzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0cy0+c3RhdGVzLmVkaXRJdGVtQXQobUluZGV4KSA9IG5ldyBCdWZmZXJTdGF0ZShtSW5kZXgpOwotICAgICAgICAgICAgYnMgPSB0cy0+c3RhdGVzW21JbmRleF0uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoYnMgIT0gTlVMTCkgcmV0dXJuIGJzOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBtR2xvYmFsU3RhdGU7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0NhbGxTdGFjay5jcHAgYi9saWJzL3V0aWxzL0NhbGxTdGFjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZmQ4NGYuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9DYWxsU3RhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkNhbGxTdGFjayIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+Ci0jaW5jbHVkZSA8Y29ya3NjcmV3L2JhY2t0cmFjZS5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUNhbGxTdGFjazo6Q2FsbFN0YWNrKCkgOgotICAgICAgICBtQ291bnQoMCkgewotfQotCi1DYWxsU3RhY2s6OkNhbGxTdGFjayhjb25zdCBDYWxsU3RhY2smIHJocykgOgotICAgICAgICBtQ291bnQocmhzLm1Db3VudCkgewotICAgIGlmIChtQ291bnQpIHsKLSAgICAgICAgbWVtY3B5KG1TdGFjaywgcmhzLm1TdGFjaywgbUNvdW50ICogc2l6ZW9mKGJhY2t0cmFjZV9mcmFtZV90KSk7Ci0gICAgfQotfQotCi1DYWxsU3RhY2s6On5DYWxsU3RhY2soKSB7Ci19Ci0KLUNhbGxTdGFjayYgQ2FsbFN0YWNrOjpvcGVyYXRvciA9IChjb25zdCBDYWxsU3RhY2smIHJocykgewotICAgIG1Db3VudCA9IHJocy5tQ291bnQ7Ci0gICAgaWYgKG1Db3VudCkgewotICAgICAgICBtZW1jcHkobVN0YWNrLCByaHMubVN0YWNrLCBtQ291bnQgKiBzaXplb2YoYmFja3RyYWNlX2ZyYW1lX3QpKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIENhbGxTdGFjazo6b3BlcmF0b3IgPT0gKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdCB7Ci0gICAgaWYgKG1Db3VudCAhPSByaHMubUNvdW50KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuICFtQ291bnQgfHwgbWVtY21wKG1TdGFjaywgcmhzLm1TdGFjaywgbUNvdW50ICogc2l6ZW9mKGJhY2t0cmFjZV9mcmFtZV90KSkgPT0gMDsKLX0KLQotYm9vbCBDYWxsU3RhY2s6Om9wZXJhdG9yICE9IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3QgewotICAgIHJldHVybiAhb3BlcmF0b3IgPT0gKHJocyk7Ci19Ci0KLWJvb2wgQ2FsbFN0YWNrOjpvcGVyYXRvciA8IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3QgewotICAgIGlmIChtQ291bnQgIT0gcmhzLm1Db3VudCkKLSAgICAgICAgcmV0dXJuIG1Db3VudCA8IHJocy5tQ291bnQ7Ci0gICAgcmV0dXJuIG1lbWNtcChtU3RhY2ssIHJocy5tU3RhY2ssIG1Db3VudCAqIHNpemVvZihiYWNrdHJhY2VfZnJhbWVfdCkpIDwgMDsKLX0KLQotYm9vbCBDYWxsU3RhY2s6Om9wZXJhdG9yID49IChjb25zdCBDYWxsU3RhY2smIHJocykgY29uc3QgewotICAgIHJldHVybiAhb3BlcmF0b3IgPCAocmhzKTsKLX0KLQotYm9vbCBDYWxsU3RhY2s6Om9wZXJhdG9yID4gKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdCB7Ci0gICAgaWYgKG1Db3VudCAhPSByaHMubUNvdW50KQotICAgICAgICByZXR1cm4gbUNvdW50ID4gcmhzLm1Db3VudDsKLSAgICByZXR1cm4gbWVtY21wKG1TdGFjaywgcmhzLm1TdGFjaywgbUNvdW50ICogc2l6ZW9mKGJhY2t0cmFjZV9mcmFtZV90KSkgPiAwOwotfQotCi1ib29sIENhbGxTdGFjazo6b3BlcmF0b3IgPD0gKGNvbnN0IENhbGxTdGFjayYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuICFvcGVyYXRvciA+IChyaHMpOwotfQotCi1jb25zdCB2b2lkKiBDYWxsU3RhY2s6Om9wZXJhdG9yIFtdIChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICBpZiAoaW5kZXggPj0gaW50KG1Db3VudCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihtU3RhY2tbaW5kZXhdLmFic29sdXRlX3BjKTsKLX0KLQotdm9pZCBDYWxsU3RhY2s6OmNsZWFyKCkgewotICAgIG1Db3VudCA9IDA7Ci19Ci0KLXZvaWQgQ2FsbFN0YWNrOjp1cGRhdGUoaW50MzJfdCBpZ25vcmVEZXB0aCwgaW50MzJfdCBtYXhEZXB0aCkgewotICAgIGlmIChtYXhEZXB0aCA+IE1BWF9ERVBUSCkgewotICAgICAgICBtYXhEZXB0aCA9IE1BWF9ERVBUSDsKLSAgICB9Ci0gICAgc3NpemVfdCBjb3VudCA9IHVud2luZF9iYWNrdHJhY2UobVN0YWNrLCBpZ25vcmVEZXB0aCArIDEsIG1heERlcHRoKTsKLSAgICBtQ291bnQgPSBjb3VudCA+IDAgPyBjb3VudCA6IDA7Ci19Ci0KLXZvaWQgQ2FsbFN0YWNrOjpkdW1wKGNvbnN0IGNoYXIqIHByZWZpeCkgY29uc3QgewotICAgIGJhY2t0cmFjZV9zeW1ib2xfdCBzeW1ib2xzW21Db3VudF07Ci0KLSAgICBnZXRfYmFja3RyYWNlX3N5bWJvbHMobVN0YWNrLCBtQ291bnQsIHN5bWJvbHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvdW50OyBpKyspIHsKLSAgICAgICAgY2hhciBsaW5lW01BWF9CQUNLVFJBQ0VfTElORV9MRU5HVEhdOwotICAgICAgICBmb3JtYXRfYmFja3RyYWNlX2xpbmUoaSwgJm1TdGFja1tpXSwgJnN5bWJvbHNbaV0sCi0gICAgICAgICAgICAgICAgbGluZSwgTUFYX0JBQ0tUUkFDRV9MSU5FX0xFTkdUSCk7Ci0gICAgICAgIEFMT0dEKCIlcyVzIiwgcHJlZml4LCBsaW5lKTsKLSAgICB9Ci0gICAgZnJlZV9iYWNrdHJhY2Vfc3ltYm9scyhzeW1ib2xzLCBtQ291bnQpOwotfQotCi1TdHJpbmc4IENhbGxTdGFjazo6dG9TdHJpbmcoY29uc3QgY2hhciogcHJlZml4KSBjb25zdCB7Ci0gICAgU3RyaW5nOCBzdHI7Ci0gICAgYmFja3RyYWNlX3N5bWJvbF90IHN5bWJvbHNbbUNvdW50XTsKLQotICAgIGdldF9iYWNrdHJhY2Vfc3ltYm9scyhtU3RhY2ssIG1Db3VudCwgc3ltYm9scyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ291bnQ7IGkrKykgewotICAgICAgICBjaGFyIGxpbmVbTUFYX0JBQ0tUUkFDRV9MSU5FX0xFTkdUSF07Ci0gICAgICAgIGZvcm1hdF9iYWNrdHJhY2VfbGluZShpLCAmbVN0YWNrW2ldLCAmc3ltYm9sc1tpXSwKLSAgICAgICAgICAgICAgICBsaW5lLCBNQVhfQkFDS1RSQUNFX0xJTkVfTEVOR1RIKTsKLSAgICAgICAgc3RyLmFwcGVuZChwcmVmaXgpOwotICAgICAgICBzdHIuYXBwZW5kKGxpbmUpOwotICAgICAgICBzdHIuYXBwZW5kKCJcbiIpOwotICAgIH0KLSAgICBmcmVlX2JhY2t0cmFjZV9zeW1ib2xzKHN5bWJvbHMsIG1Db3VudCk7Ci0gICAgcmV0dXJuIHN0cjsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvRGVidWcuY3BwIGIvbGlicy91dGlscy9EZWJ1Zy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWM5ODMuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9EZWJ1Zy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY29uc3QgY2hhciBpbmRlbnRTdHJbXSA9Ci0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKLQotY29uc3QgY2hhciogc3RyaW5nRm9ySW5kZW50KGludDMyX3QgaW5kZW50TGV2ZWwpCi17Ci0gICAgc3NpemVfdCBvZmYgPSBzaXplb2YoaW5kZW50U3RyKS0xLShpbmRlbnRMZXZlbCoyKTsKLSAgICByZXR1cm4gaW5kZW50U3RyICsgKG9mZiA8IDAgPyAwIDogb2ZmKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIGRlZmF1bHRQcmludEZ1bmModm9pZCogY29va2llLCBjb25zdCBjaGFyKiB0eHQpCi17Ci0gICAgcHJpbnRmKCIlcyIsIHR4dCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW5saW5lIGludCBpc2lkZW50KGludCBjKQotewotICAgIHJldHVybiBpc2FsbnVtKGMpIHx8IGMgPT0gJ18nOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNhc2NpaXR5cGUoY2hhciBjKQotewotICAgIGlmKCBjID49ICcgJyAmJiBjIDwgMTI3ICYmIGMgIT0gJ1wnJyAmJiBjICE9ICdcXCcgKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciBtYWtlaGV4ZGlnaXQodWludDMyX3QgdmFsKQotewotICAgIHJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiJbdmFsJjB4Rl07Ci19Ci0KLXN0YXRpYyBjaGFyKiBhcHBlbmRoZXhudW0odWludDMyX3QgdmFsLCBjaGFyKiBvdXQpCi17Ci0gICAgZm9yKCBpbnQzMl90IGk9Mjg7IGk+PTA7IGktPTQgKSB7Ci0gICAgICAgICpvdXQrKyA9IG1ha2VoZXhkaWdpdCggdmFsPj5pICk7Ci0gICAgfQotICAgICpvdXQgPSAwOwotICAgIHJldHVybiBvdXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciBtYWtldXBwZXJoZXhkaWdpdCh1aW50MzJfdCB2YWwpCi17Ci0gICAgcmV0dXJuICIwMTIzNDU2Nzg5QUJDREVGIlt2YWwmMHhGXTsKLX0KLQotc3RhdGljIGNoYXIqIGFwcGVuZHVwcGVyaGV4bnVtKHVpbnQzMl90IHZhbCwgY2hhciogb3V0KQotewotICAgIGZvciggaW50MzJfdCBpPTI4OyBpPj0wOyBpLT00ICkgewotICAgICAgICAqb3V0KysgPSBtYWtldXBwZXJoZXhkaWdpdCggdmFsPj5pICk7Ci0gICAgfQotICAgICpvdXQgPSAwOwotICAgIHJldHVybiBvdXQ7Ci19Ci0KLXN0YXRpYyBjaGFyKiBhcHBlbmRjaGFyb3JudW0oY2hhciBjLCBjaGFyKiBvdXQsIGJvb2wgc2tpcHplcm8gPSB0cnVlKQotewotICAgIGlmIChza2lwemVybyAmJiBjID09IDApIHJldHVybiBvdXQ7Ci0KLSAgICBpZiAoaXNhc2NpaXR5cGUoYykpIHsKLSAgICAgICAgKm91dCsrID0gYzsKLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICAqb3V0KysgPSAnXFwnOwotICAgICpvdXQrKyA9ICd4JzsKLSAgICAqb3V0KysgPSBtYWtlaGV4ZGlnaXQoYz4+NCk7Ci0gICAgKm91dCsrID0gbWFrZWhleGRpZ2l0KGMpOwotICAgIHJldHVybiBvdXQ7Ci19Ci0KLXN0YXRpYyBjaGFyKiB0eXBldG9zdHJpbmcodWludDMyX3QgdHlwZSwgY2hhciogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZ1bGxDb250ZXh0ID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3QgPSBmYWxzZSkKLXsKLSAgICBjaGFyKiBwb3MgPSBvdXQ7Ci0gICAgY2hhciBjWzRdOwotICAgIGNbMF0gPSAoY2hhcikoKHR5cGU+PjI0KSYweEZGKTsKLSAgICBjWzFdID0gKGNoYXIpKCh0eXBlPj4xNikmMHhGRik7Ci0gICAgY1syXSA9IChjaGFyKSgodHlwZT4+OCkmMHhGRik7Ci0gICAgY1szXSA9IChjaGFyKSh0eXBlJjB4RkYpOwotICAgIGJvb2wgdmFsaWQ7Ci0gICAgaWYoICFzdHJpY3QgKSB7Ci0gICAgICAgIC8vIG5vdyBldmVuIGxlc3Mgc3RyaWN0IQotICAgICAgICAvLyB2YWxpZCA9IGlzYXNjaWl0eXBlKGNbM10pOwotICAgICAgICB2YWxpZCA9IHRydWU7Ci0gICAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICAgIGJvb2wgemVybyA9IHRydWU7Ci0gICAgICAgIHdoaWxlICh2YWxpZCAmJiBpPDMpIHsKLSAgICAgICAgICAgIGlmIChjW2ldID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoIXplcm8pIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHplcm8gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAvL2lmICghaXNhc2NpaXR5cGUoY1tpXSkpIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYgYWxsIHplcm9zLCBub3QgYSB2YWxpZCB0eXBlIGNvZGUuCi0gICAgICAgIGlmICh6ZXJvKSB2YWxpZCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhbGlkID0gaXNpZGVudChjWzNdKSA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgaW50MzJfdCBpID0gMDsKLSAgICAgICAgYm9vbCB6ZXJvID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHZhbGlkICYmIGk8MykgewotICAgICAgICAgICAgaWYgKGNbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghemVybykgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgemVybyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmICghaXNpZGVudChjW2ldKSkgdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiggdmFsaWQgJiYgKCFmdWxsQ29udGV4dCB8fCBjWzBdICE9ICcwJyB8fCBjWzFdICE9ICd4JykgKSB7Ci0gICAgICAgIGlmKCBmdWxsQ29udGV4dCApICpwb3MrKyA9ICdcJyc7Ci0gICAgICAgIHBvcyA9IGFwcGVuZGNoYXJvcm51bShjWzBdLCBwb3MpOwotICAgICAgICBwb3MgPSBhcHBlbmRjaGFyb3JudW0oY1sxXSwgcG9zKTsKLSAgICAgICAgcG9zID0gYXBwZW5kY2hhcm9ybnVtKGNbMl0sIHBvcyk7Ci0gICAgICAgIHBvcyA9IGFwcGVuZGNoYXJvcm51bShjWzNdLCBwb3MpOwotICAgICAgICBpZiggZnVsbENvbnRleHQgKSAqcG9zKysgPSAnXCcnOwotICAgICAgICAqcG9zID0gMDsKLSAgICAgICAgcmV0dXJuIHBvczsKLSAgICB9Ci0gICAgCi0gICAgaWYoIGZ1bGxDb250ZXh0ICkgewotICAgICAgICAqcG9zKysgPSAnMCc7Ci0gICAgICAgICpwb3MrKyA9ICd4JzsKLSAgICB9Ci0gICAgcmV0dXJuIGFwcGVuZGhleG51bSh0eXBlLCBwb3MpOwotfQotCi12b2lkIHByaW50VHlwZUNvZGUodWludDMyX3QgdHlwZUNvZGUsIGRlYnVnUHJpbnRGdW5jIGZ1bmMsIHZvaWQqIGNvb2tpZSkKLXsKLSAgICBjaGFyIGJ1ZmZlclszMl07Ci0gICAgY2hhciogZW5kID0gdHlwZXRvc3RyaW5nKHR5cGVDb2RlLCBidWZmZXIpOwotICAgICplbmQgPSAwOwotICAgIGZ1bmMgPyAoKmZ1bmMpKGNvb2tpZSwgYnVmZmVyKSA6IGRlZmF1bHRQcmludEZ1bmMoY29va2llLCBidWZmZXIpOwotfQotCi12b2lkIHByaW50SGV4RGF0YShpbnQzMl90IGluZGVudCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuZ3RoLAotICAgIHNpemVfdCBieXRlc1BlckxpbmUsIGludDMyX3Qgc2luZ2xlTGluZUJ5dGVzQ3V0b2ZmLAotICAgIHNpemVfdCBhbGlnbm1lbnQsIGJvb2wgY1N0eWxlLAotICAgIGRlYnVnUHJpbnRGdW5jIGZ1bmMsIHZvaWQqIGNvb2tpZSkKLXsKLSAgICBpZiAoYWxpZ25tZW50ID09IDApIHsKLSAgICAgICAgaWYgKGJ5dGVzUGVyTGluZSA+PSAxNikgYWxpZ25tZW50ID0gNDsKLSAgICAgICAgZWxzZSBpZiAoYnl0ZXNQZXJMaW5lID49IDgpIGFsaWdubWVudCA9IDI7Ci0gICAgICAgIGVsc2UgYWxpZ25tZW50ID0gMTsKLSAgICB9Ci0gICAgaWYgKGZ1bmMgPT0gTlVMTCkgZnVuYyA9IGRlZmF1bHRQcmludEZ1bmM7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0OwotICAgIAotICAgIHVuc2lnbmVkIGNoYXIgKnBvcyA9ICh1bnNpZ25lZCBjaGFyICopYnVmOwotICAgIAotICAgIGlmIChwb3MgPT0gTlVMTCkgewotICAgICAgICBpZiAoc2luZ2xlTGluZUJ5dGVzQ3V0b2ZmIDwgMCkgZnVuYyhjb29raWUsICJcbiIpOwotICAgICAgICBmdW5jKGNvb2tpZSwgIihOVUxMKSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICBpZiAoc2luZ2xlTGluZUJ5dGVzQ3V0b2ZmIDwgMCkgZnVuYyhjb29raWUsICJcbiIpOwotICAgICAgICBmdW5jKGNvb2tpZSwgIihlbXB0eSkiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpZiAoKGludDMyX3QpbGVuZ3RoIDwgMCkgewotICAgICAgICBpZiAoc2luZ2xlTGluZUJ5dGVzQ3V0b2ZmIDwgMCkgZnVuYyhjb29raWUsICJcbiIpOwotICAgICAgICBjaGFyIGJ1Zls2NF07Ci0gICAgICAgIHNwcmludGYoYnVmLCAiKGJhZCBsZW5ndGg6ICV6dSkiLCBsZW5ndGgpOwotICAgICAgICBmdW5jKGNvb2tpZSwgYnVmKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWF4Qnl0ZXNQZXJMaW5lID0gKHNpemVvZihidWZmZXIpLTEtMTEtNCkvKDMrMSk7Ci0gICAgCi0gICAgaWYgKGJ5dGVzUGVyTGluZSA+IG1heEJ5dGVzUGVyTGluZSkgYnl0ZXNQZXJMaW5lID0gbWF4Qnl0ZXNQZXJMaW5lOwotICAgIAotICAgIGNvbnN0IGJvb2wgb25lTGluZSA9IChpbnQzMl90KWxlbmd0aCA8PSBzaW5nbGVMaW5lQnl0ZXNDdXRvZmY7Ci0gICAgYm9vbCBuZXdMaW5lID0gZmFsc2U7Ci0gICAgaWYgKGNTdHlsZSkgewotICAgICAgICBpbmRlbnQrKzsKLSAgICAgICAgZnVuYyhjb29raWUsICJ7XG4iKTsKLSAgICAgICAgbmV3TGluZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICghb25lTGluZSkgewotICAgICAgICBmdW5jKGNvb2tpZSwgIlxuIik7Ci0gICAgICAgIG5ld0xpbmUgPSB0cnVlOwotICAgIH0KLSAgICAKLSAgICBmb3IgKG9mZnNldCA9IDA7IDsgb2Zmc2V0ICs9IGJ5dGVzUGVyTGluZSwgcG9zICs9IGJ5dGVzUGVyTGluZSkgewotICAgICAgICBsb25nIHJlbWFpbiA9IGxlbmd0aDsKLQotICAgICAgICBjaGFyKiBjID0gYnVmZmVyOwotICAgICAgICBpZiAoIW9uZUxpbmUgJiYgIWNTdHlsZSkgewotICAgICAgICAgICAgc3ByaW50ZihjLCAiMHglMDh4OiAiLCAoaW50KW9mZnNldCk7Ci0gICAgICAgICAgICBjICs9IDEyOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGluZGV4OwotICAgICAgICBzaXplX3Qgd29yZDsKLSAgICAgICAgCi0gICAgICAgIGZvciAod29yZCA9IDA7IHdvcmQgPCBieXRlc1BlckxpbmU7ICkgewotCi0jaWZkZWYgSEFWRV9MSVRUTEVfRU5ESUFOCi0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc3RhcnRJbmRleCA9IHdvcmQrKGFsaWdubWVudC0oYWxpZ25tZW50PzE6MCkpOwotICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBkaXIgPSAtMTsKLSNlbHNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc3RhcnRJbmRleCA9IHdvcmQ7Ci0gICAgICAgICAgICBjb25zdCBzc2l6ZV90IGRpciA9IDE7Ci0jZW5kaWYKLQotICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgYWxpZ25tZW50IHx8IChhbGlnbm1lbnQgPT0gMCAmJiBpbmRleCA8IGJ5dGVzUGVyTGluZSk7IGluZGV4KyspIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghY1N0eWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAwICYmIHdvcmQgPiAwICYmIGFsaWdubWVudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbi0tID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciB2YWwgPSAqKHBvcytzdGFydEluZGV4KyhpbmRleCpkaXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSBtYWtlaGV4ZGlnaXQodmFsPj40KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSBtYWtlaGV4ZGlnaXQodmFsKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghb25lTGluZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKmMrKyA9ICcgJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDAgJiYgd29yZCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gJywnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjKysgPSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmMrKyA9ICd4JzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsID0gKihwb3Mrc3RhcnRJbmRleCsoaW5kZXgqZGlyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gbWFrZWhleGRpZ2l0KHZhbD4+NCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqYysrID0gbWFrZWhleGRpZ2l0KHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1haW4tLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgd29yZCArPSBpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY1N0eWxlKSB7Ci0gICAgICAgICAgICByZW1haW4gPSBsZW5ndGg7Ci0gICAgICAgICAgICAqYysrID0gJyAnOwotICAgICAgICAgICAgKmMrKyA9ICdcJyc7Ci0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBieXRlc1BlckxpbmU7IGluZGV4KyspIHsKLQotICAgICAgICAgICAgICAgIGlmIChyZW1haW4tLSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciB2YWwgPSBwb3NbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAqYysrID0gKHZhbCA+PSAnICcgJiYgdmFsIDwgMTI3KSA/IHZhbCA6ICcuJzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvbmVMaW5lKSB7Ci0gICAgICAgICAgICAgICAgICAgICpjKysgPSAnICc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICAqYysrID0gJ1wnJzsKLSAgICAgICAgICAgIGlmIChsZW5ndGggPiBieXRlc1BlckxpbmUpICpjKysgPSAnXG4nOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApICpjKysgPSAnLCc7Ci0gICAgICAgICAgICAqYysrID0gJ1xuJzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXdMaW5lICYmIGluZGVudCkgZnVuYyhjb29raWUsIHN0cmluZ0ZvckluZGVudChpbmRlbnQpKTsKLSAgICAgICAgKmMgPSAwOwotICAgICAgICBmdW5jKGNvb2tpZSwgYnVmZmVyKTsKLSAgICAgICAgbmV3TGluZSA9IHRydWU7Ci0gICAgICAgIAotICAgICAgICBpZiAobGVuZ3RoIDw9IGJ5dGVzUGVyTGluZSkgYnJlYWs7Ci0gICAgICAgIGxlbmd0aCAtPSBieXRlc1BlckxpbmU7Ci0gICAgfQotCi0gICAgaWYgKGNTdHlsZSkgewotICAgICAgICBpZiAoaW5kZW50ID4gMCkgZnVuYyhjb29raWUsIHN0cmluZ0ZvckluZGVudChpbmRlbnQtMSkpOwotICAgICAgICBmdW5jKGNvb2tpZSwgIn07Iik7Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL0ZpbGVNYXAuY3BwIGIvbGlicy91dGlscy9GaWxlTWFwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMzcwZS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0ZpbGVNYXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gU2hhcmVkIGZpbGUgbWFwcGluZyBjbGFzcy4KLS8vCi0KLSNkZWZpbmUgTE9HX1RBRyAiZmlsZW1hcCIKLQotI2luY2x1ZGUgPHV0aWxzL0ZpbGVNYXAuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZmRlZiBIQVZFX1BPU0lYX0ZJTEVNQVAKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLypzdGF0aWMqLyBsb25nIEZpbGVNYXA6Om1QYWdlU2l6ZSA9IC0xOwotCi0KLS8qCi0gKiBDb25zdHJ1Y3Rvci4gIENyZWF0ZSBhbiBlbXB0eSBvYmplY3QuCi0gKi8KLUZpbGVNYXA6OkZpbGVNYXAodm9pZCkKLSAgICA6IG1SZWZDb3VudCgxKSwgbUZpbGVOYW1lKE5VTEwpLCBtQmFzZVB0cihOVUxMKSwgbUJhc2VMZW5ndGgoMCksCi0gICAgICBtRGF0YVB0cihOVUxMKSwgbURhdGFMZW5ndGgoMCkKLXsKLX0KLQotLyoKLSAqIERlc3RydWN0b3IuCi0gKi8KLUZpbGVNYXA6On5GaWxlTWFwKHZvaWQpCi17Ci0gICAgYXNzZXJ0KG1SZWZDb3VudCA9PSAwKTsKLQotICAgIC8vcHJpbnRmKCIrKysgcmVtb3ZpbmcgRmlsZU1hcCAlcCAldVxuIiwgbURhdGFQdHIsIG1EYXRhTGVuZ3RoKTsKLQotICAgIG1SZWZDb3VudCA9IC0xMDA7ICAgICAgIC8vIGhlbHAgY2F0Y2ggZG91YmxlLWZyZWUKLSAgICBpZiAobUZpbGVOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtRmlsZU5hbWUpOwotICAgIH0KLSNpZmRlZiBIQVZFX1BPU0lYX0ZJTEVNQVAgICAgCi0gICAgaWYgKG1CYXNlUHRyICYmIG11bm1hcChtQmFzZVB0ciwgbUJhc2VMZW5ndGgpICE9IDApIHsKLSAgICAgICAgQUxPR0QoIm11bm1hcCglcCwgJWQpIGZhaWxlZFxuIiwgbUJhc2VQdHIsIChpbnQpIG1CYXNlTGVuZ3RoKTsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1dJTjMyX0ZJTEVNQVAKLSAgICBpZiAobUJhc2VQdHIgJiYgVW5tYXBWaWV3T2ZGaWxlKG1CYXNlUHRyKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dEKCJVbm1hcFZpZXdPZkZpbGUoJXApIGZhaWxlZCwgZXJyb3IgPSAlbGRcbiIsIG1CYXNlUHRyLAotICAgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSApOwotICAgIH0KLSAgICBpZiAobUZpbGVNYXBwaW5nICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgICAgIENsb3NlSGFuZGxlKG1GaWxlTWFwcGluZyk7Ci0gICAgfQotICAgIENsb3NlSGFuZGxlKG1GaWxlSGFuZGxlKTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBDcmVhdGUgYSBuZXcgbWFwcGluZyBvbiBhbiBvcGVuIGZpbGUuCi0gKgotICogQ2xvc2luZyB0aGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IHVubWFwIHRoZSBwYWdlcywgc28gd2UgZG9uJ3QKLSAqIGNsYWltIG93bmVyc2hpcCBvZiB0aGUgZmQuCi0gKgotICogUmV0dXJucyAiZmFsc2UiIG9uIGZhaWx1cmUuCi0gKi8KLWJvb2wgRmlsZU1hcDo6Y3JlYXRlKGNvbnN0IGNoYXIqIG9yaWdGaWxlTmFtZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCwKLSAgICAgICAgYm9vbCByZWFkT25seSkKLXsKLSNpZmRlZiBIQVZFX1dJTjMyX0ZJTEVNQVAKLSAgICBpbnQgICAgIGFkanVzdDsKLSAgICBvZmY2NF90IGFkak9mZnNldDsKLSAgICBzaXplX3QgIGFkakxlbmd0aDsKLQotICAgIGlmIChtUGFnZVNpemUgPT0gLTEpIHsKLSAgICAgICAgU1lTVEVNX0lORk8gIHNpOwotICAgICAgICAKLSAgICAgICAgR2V0U3lzdGVtSW5mbyggJnNpICk7Ci0gICAgICAgIG1QYWdlU2l6ZSA9IHNpLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OwotICAgIH0KLQotICAgIERXT1JEICBwcm90ZWN0ID0gcmVhZE9ubHkgPyBQQUdFX1JFQURPTkxZIDogUEFHRV9SRUFEV1JJVEU7Ci0gICAgCi0gICAgbUZpbGVIYW5kbGUgID0gKEhBTkRMRSkgX2dldF9vc2ZoYW5kbGUoZmQpOwotICAgIG1GaWxlTWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nKCBtRmlsZUhhbmRsZSwgTlVMTCwgcHJvdGVjdCwgMCwgMCwgTlVMTCk7Ci0gICAgaWYgKG1GaWxlTWFwcGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDcmVhdGVGaWxlTWFwcGluZyglcCwgJWx4KSBmYWlsZWQgd2l0aCBlcnJvciAlbGRcbiIsCi0gICAgICAgICAgICAgIG1GaWxlSGFuZGxlLCBwcm90ZWN0LCBHZXRMYXN0RXJyb3IoKSApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGFkanVzdCAgICA9IG9mZnNldCAlIG1QYWdlU2l6ZTsKLSAgICBhZGpPZmZzZXQgPSBvZmZzZXQgLSBhZGp1c3Q7Ci0gICAgYWRqTGVuZ3RoID0gbGVuZ3RoICsgYWRqdXN0OwotICAgIAotICAgIG1CYXNlUHRyID0gTWFwVmlld09mRmlsZSggbUZpbGVNYXBwaW5nLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5ID8gRklMRV9NQVBfUkVBRCA6IEZJTEVfTUFQX0FMTF9BQ0NFU1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERXT1JEKShhZGpPZmZzZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqTGVuZ3RoICk7Ci0gICAgaWYgKG1CYXNlUHRyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIk1hcFZpZXdPZkZpbGUoJWxkLCAlbGQpIGZhaWxlZCB3aXRoIGVycm9yICVsZFxuIiwKLSAgICAgICAgICAgICAgYWRqT2Zmc2V0LCBhZGpMZW5ndGgsIEdldExhc3RFcnJvcigpICk7Ci0gICAgICAgIENsb3NlSGFuZGxlKG1GaWxlTWFwcGluZyk7Ci0gICAgICAgIG1GaWxlTWFwcGluZyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgSEFWRV9QT1NJWF9GSUxFTUFQCi0gICAgaW50ICAgICBwcm90LCBmbGFncywgYWRqdXN0OwotICAgIG9mZjY0X3QgYWRqT2Zmc2V0OwotICAgIHNpemVfdCAgYWRqTGVuZ3RoOwotCi0gICAgdm9pZCogcHRyOwotCi0gICAgYXNzZXJ0KG1SZWZDb3VudCA9PSAxKTsKLSAgICBhc3NlcnQoZmQgPj0gMCk7Ci0gICAgYXNzZXJ0KG9mZnNldCA+PSAwKTsKLSAgICBhc3NlcnQobGVuZ3RoID4gMCk7Ci0KLSAgICAvKiBpbml0IG9uIGZpcnN0IHVzZSAqLwotICAgIGlmIChtUGFnZVNpemUgPT0gLTEpIHsKLSNpZiBOT1RfVVNJTkdfS0xJQkMKLSAgICAgICAgbVBhZ2VTaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwotICAgICAgICBpZiAobVBhZ2VTaXplID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IGdldCBfU0NfUEFHRVNJWkVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICAvKiB0aGlzIGhvbGRzIGZvciBMaW51eCwgRGFyd2luLCBDeWd3aW4sIGFuZCBkb2Vzbid0IHBhaW4gdGhlIEFSTSAqLwotICAgICAgICBtUGFnZVNpemUgPSA0MDk2OwotI2VuZGlmCi0gICAgfQotCi0gICAgYWRqdXN0ICAgPSBvZmZzZXQgJSBtUGFnZVNpemU7Ci10cnlfYWdhaW46Ci0gICAgYWRqT2Zmc2V0ID0gb2Zmc2V0IC0gYWRqdXN0OwotICAgIGFkakxlbmd0aCA9IGxlbmd0aCArIGFkanVzdDsKLQotICAgIGZsYWdzID0gTUFQX1NIQVJFRDsKLSAgICBwcm90ID0gUFJPVF9SRUFEOwotICAgIGlmICghcmVhZE9ubHkpCi0gICAgICAgIHByb3QgfD0gUFJPVF9XUklURTsKLQotICAgIHB0ciA9IG1tYXAoTlVMTCwgYWRqTGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIGFkak9mZnNldCk7Ci0gICAgaWYgKHB0ciA9PSBNQVBfRkFJTEVEKSB7Ci0gICAgCS8vIEN5Z3dpbiBkb2VzIG5vdCBzZWVtIHRvIGxpa2UgZmlsZSBtYXBwaW5nIGZpbGVzIGZyb20gYW4gb2Zmc2V0LgotICAgIAkvLyBTbyBpZiB3ZSBmYWlsLCB0cnkgYWdhaW4gd2l0aCBvZmZzZXQgemVybwotICAgIAlpZiAoYWRqT2Zmc2V0ID4gMCkgewotICAgIAkJYWRqdXN0ID0gb2Zmc2V0OwotICAgIAkJZ290byB0cnlfYWdhaW47Ci0gICAgCX0KLSAgICAKLSAgICAgICAgQUxPR0UoIm1tYXAoJWxkLCVsZCkgZmFpbGVkOiAlc1xuIiwKLSAgICAgICAgICAgIChsb25nKSBhZGpPZmZzZXQsIChsb25nKSBhZGpMZW5ndGgsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbUJhc2VQdHIgPSBwdHI7Ci0jZW5kaWYgLyogSEFWRV9QT1NJWF9GSUxFTUFQICovCi0KLSAgICBtRmlsZU5hbWUgPSBvcmlnRmlsZU5hbWUgIT0gTlVMTCA/IHN0cmR1cChvcmlnRmlsZU5hbWUpIDogTlVMTDsKLSAgICBtQmFzZUxlbmd0aCA9IGFkakxlbmd0aDsKLSAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKLSAgICBtRGF0YVB0ciA9IChjaGFyKikgbUJhc2VQdHIgKyBhZGp1c3Q7Ci0gICAgbURhdGFMZW5ndGggPSBsZW5ndGg7Ci0KLSAgICBhc3NlcnQobUJhc2VQdHIgIT0gTlVMTCk7Ci0KLSAgICBBTE9HVigiTUFQOiBiYXNlICVwLyVkIGRhdGEgJXAvJWRcbiIsCi0gICAgICAgIG1CYXNlUHRyLCAoaW50KSBtQmFzZUxlbmd0aCwgbURhdGFQdHIsIChpbnQpIG1EYXRhTGVuZ3RoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKgotICogUHJvdmlkZSBndWlkYW5jZSB0byB0aGUgc3lzdGVtLgotICovCi1pbnQgRmlsZU1hcDo6YWR2aXNlKE1hcEFkdmljZSBhZHZpY2UpCi17Ci0jaWYgSEFWRV9NQURWSVNFCi0gICAgaW50IGNjLCBzeXNBZHZpY2U7Ci0KLSAgICBzd2l0Y2ggKGFkdmljZSkgewotICAgICAgICBjYXNlIE5PUk1BTDogICAgICAgIHN5c0FkdmljZSA9IE1BRFZfTk9STUFMOyAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFORE9NOiAgICAgICAgc3lzQWR2aWNlID0gTUFEVl9SQU5ET007ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRVFVRU5USUFMOiAgICBzeXNBZHZpY2UgPSBNQURWX1NFUVVFTlRJQUw7ICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdJTExORUVEOiAgICAgIHN5c0FkdmljZSA9IE1BRFZfV0lMTE5FRUQ7ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRE9OVE5FRUQ6ICAgICAgc3lzQWR2aWNlID0gTUFEVl9ET05UTkVFRDsgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBjYyA9IG1hZHZpc2UobUJhc2VQdHIsIG1CYXNlTGVuZ3RoLCBzeXNBZHZpY2UpOwotICAgIGlmIChjYyAhPSAwKQotICAgICAgICBBTE9HVygibWFkdmlzZSglZCkgZmFpbGVkOiAlc1xuIiwgc3lzQWR2aWNlLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBjYzsKLSNlbHNlCi0JcmV0dXJuIC0xOwotI2VuZGlmIC8vIEhBVkVfTUFEVklTRQotfQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9GbGF0dGVuYWJsZS5jcHAgYi9saWJzL3V0aWxzL0ZsYXR0ZW5hYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyZmZhYS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0ZsYXR0ZW5hYmxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvRmxhdHRlbmFibGUuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1GbGF0dGVuYWJsZTo6fkZsYXR0ZW5hYmxlKCkgewotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9MaW5lYXJUcmFuc2Zvcm0uY3BwIGIvbGlicy91dGlscy9MaW5lYXJUcmFuc2Zvcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzUyNDE1Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvTGluZWFyVHJhbnNmb3JtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xpbmVhclRyYW5zZm9ybS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+IHN0YXRpYyBpbmxpbmUgVCBBQlMoVCB4KSB7IHJldHVybiAoeCA8IDApID8gLXggOiB4OyB9Ci0KLS8vIFN0YXRpYyBtYXRoIG1ldGhvZHMgaW52b2x2aW5nIGxpbmVhciB0cmFuc2Zvcm1hdGlvbnMKLXN0YXRpYyBib29sIHNjYWxlX3U2NF90b191NjQoCi0gICAgICAgIHVpbnQ2NF90IHZhbCwKLSAgICAgICAgdWludDMyX3QgTiwKLSAgICAgICAgdWludDMyX3QgRCwKLSAgICAgICAgdWludDY0X3QqIHJlcywKLSAgICAgICAgYm9vbCByb3VuZF91cF9ub3RfZG93bikgewotICAgIHVpbnQ2NF90IHRtcDEsIHRtcDI7Ci0gICAgdWludDMyX3QgcjsKLQotICAgIGFzc2VydChyZXMpOwotICAgIGFzc2VydChEKTsKLQotICAgIC8vIExldCBVMzIoWCkgZGVub3RlIGEgdWludDMyX3QgY29udGFpbmluZyB0aGUgdXBwZXIgMzIgYml0cyBvZiBhIDY0IGJpdAotICAgIC8vIGludGVnZXIgWC4KLSAgICAvLyBMZXQgTDMyKFgpIGRlbm90ZSBhIHVpbnQzMl90IGNvbnRhaW5pbmcgdGhlIGxvd2VyIDMyIGJpdHMgb2YgYSA2NCBiaXQKLSAgICAvLyBpbnRlZ2VyIFguCi0gICAgLy8gTGV0IFhbQSwgQl0gd2l0aCBBIDw9IEIgZGVub3RlIGJpdHMgQSB0aHJvdWdoIEIgb2YgdGhlIGludGVnZXIgWC4KLSAgICAvLyBMZXQgKEEgfCBCKSBkZW5vdGUgdGhlIGNvbmNhdGluYXRpb24gb2YgdHdvIDMyIGJpdCBpbnRzLCBBIGFuZCBCLgotICAgIC8vIElPVyBYID0gKEEgfCBCKSA9PiBVMzIoWCkgPT0gQSAmJiBMMzIoWCkgPT0gQgotICAgIC8vCi0gICAgLy8gY29tcHV0ZSBNID0gdmFsICogTiAoYSA5NiBiaXQgaW50KQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIHRtcDIgPSBVMzIodmFsKSAqIE4gKGEgNjQgYml0IGludCkKLSAgICAvLyB0bXAxID0gTDMyKHZhbCkgKiBOIChhIDY0IGJpdCBpbnQpCi0gICAgLy8gd2hpY2ggbWVhbnMKLSAgICAvLyBNID0gdmFsICogTiA9ICh0bXAyIDw8IDMyKSArIHRtcDEKLSAgICB0bXAyID0gKHZhbCA+PiAzMikgKiBOOwotICAgIHRtcDEgPSAodmFsICYgVUlOVDMyX01BWCkgKiBOOwotCi0gICAgLy8gY29tcHV0ZSBNWzMyLCA5NV0KLSAgICAvLyB0bXAyID0gdG1wMiArIFUzMih0bXAxKQotICAgIC8vICAgICAgPSAoVTMyKHZhbCkgKiBOKSArIFUzMihMMzIodmFsKSAqIE4pCi0gICAgLy8gICAgICA9IE1bMzIsIDk1XQotICAgIHRtcDIgKz0gdG1wMSA+PiAzMjsKLQotICAgIC8vIGlmIE1bNjQsIDk1XSA+PSBELCB0aGVuIE0vRCBoYXMgYml0cyA+IDYzIHNldCBhbmQgd2UgaGF2ZQotICAgIC8vIGFuIG92ZXJmbG93LgotICAgIGlmICgodG1wMiA+PiAzMikgPj0gRCkgewotICAgICAgICAqcmVzID0gVUlOVDY0X01BWDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIERpdmlkZS4gIEdvaW5nIGluIHdlIGtub3cKLSAgICAvLyB0bXAyID0gTVszMiwgOTVdCi0gICAgLy8gVTMyKHRtcDIpIDwgRAotICAgIHIgPSB0bXAyICUgRDsKLSAgICB0bXAyIC89IEQ7Ci0KLSAgICAvLyBBdCB0aGlzIHBvaW50Ci0gICAgLy8gdG1wMSAgICAgID0gTDMyKHZhbCkgKiBOCi0gICAgLy8gdG1wMiAgICAgID0gTVszMiwgOTVdIC8gRAotICAgIC8vICAgICAgICAgICA9IChNIC8gRClbMzIsIDk1XQotICAgIC8vIHIgICAgICAgICA9IE1bMzIsIDk1XSAlIEQKLSAgICAvLyBVMzIodG1wMikgPSAwCi0gICAgLy8KLSAgICAvLyBjb21wdXRlIHRtcDEgPSAociB8IE1bMCwgMzFdKQotICAgIHRtcDEgPSAodG1wMSAmIFVJTlQzMl9NQVgpIHwgKCh1aW50NjRfdClyIDw8IDMyKTsKLQotICAgIC8vIERpdmlkZSBhZ2Fpbi4gIEtlZXAgdGhlIHJlbWFpbmRlciBhcm91bmQgaW4gb3JkZXIgdG8gcm91bmQgcHJvcGVybHkuCi0gICAgciA9IHRtcDEgJSBEOwotICAgIHRtcDEgLz0gRDsKLQotICAgIC8vIEF0IHRoaXMgcG9pbnQKLSAgICAvLyB0bXAyICAgICAgPSAoTSAvIEQpWzMyLCA5NV0KLSAgICAvLyB0bXAxICAgICAgPSAoTSAvIEQpWyAwLCAzMV0KLSAgICAvLyByICAgICAgICAgPSAgTSAlIEQKLSAgICAvLyBVMzIodG1wMSkgPSAwCi0gICAgLy8gVTMyKHRtcDIpID0gMAotCi0gICAgLy8gUGFjayB0aGUgcmVzdWx0IGFuZCBkZWFsIHdpdGggdGhlIHJvdW5kLXVwIGNhc2UgKEFzIHdlbGwgYXMgdGhlCi0gICAgLy8gcmVtb3RlIHBvc3NpYmxpbGl0eSBvdmVyIG92ZXJmbG93IGluIHN1Y2ggYSBjYXNlKS4KLSAgICAqcmVzID0gKHRtcDIgPDwgMzIpIHwgdG1wMTsKLSAgICBpZiAociAmJiByb3VuZF91cF9ub3RfZG93bikgewotICAgICAgICArKygqcmVzKTsKLSAgICAgICAgaWYgKCEoKnJlcykpIHsKLSAgICAgICAgICAgICpyZXMgPSBVSU5UNjRfTUFYOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGxpbmVhcl90cmFuc2Zvcm1fczY0X3RvX3M2NCgKLSAgICAgICAgaW50NjRfdCAgdmFsLAotICAgICAgICBpbnQ2NF90ICBiYXNpczEsCi0gICAgICAgIGludDMyX3QgIE4sCi0gICAgICAgIHVpbnQzMl90IEQsCi0gICAgICAgIGludDY0X3QgIGJhc2lzMiwKLSAgICAgICAgaW50NjRfdCogb3V0KSB7Ci0gICAgdWludDY0X3Qgc2NhbGVkLCByZXM7Ci0gICAgdWludDY0X3QgYWJzX3ZhbDsKLSAgICBib29sIGlzX25lZzsKLQotICAgIGlmICghb3V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBDb21wdXRlIGFicyh2YWwgLSBiYXNpc182NCkuIEtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3QgdGhpcyBkZWx0YQotICAgIC8vIHdpbGwgYmUgbmVnYXRpdmUgYWZ0ZXIgdGhlIHNjYWxlIG9wZXJ0YWlvbi4KLSAgICBpZiAodmFsIDwgYmFzaXMxKSB7Ci0gICAgICAgIGlzX25lZyA9IHRydWU7Ci0gICAgICAgIGFic192YWwgPSBiYXNpczEgLSB2YWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaXNfbmVnID0gZmFsc2U7Ci0gICAgICAgIGFic192YWwgPSB2YWwgLSBiYXNpczE7Ci0gICAgfQotCi0gICAgaWYgKE4gPCAwKQotICAgICAgICBpc19uZWcgPSAhaXNfbmVnOwotCi0gICAgaWYgKCFzY2FsZV91NjRfdG9fdTY0KGFic192YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyhOKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbmVnKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBvdmVyZmxvdy91bmRlZmxvdwotCi0gICAgLy8gaWYgc2NhbGVkIGlzID49IDB4ODAwMDxldGM+LCB0aGVuIHdlIGFyZSBnb2luZyB0byBvdmVyZmxvdyBvcgotICAgIC8vIHVuZGVyZmxvdyB1bmxlc3MgQUJTKGJhc2lzMikgaXMgbGFyZ2UgZW5vdWdoIHRvIHB1bGwgdXMgYmFjayBpbnRvIHRoZQotICAgIC8vIG5vbi1vdmVyZmxvdy91bmRlcmZsb3cgcmVnaW9uLgotICAgIGlmIChzY2FsZWQgJiBJTlQ2NF9NSU4pIHsKLSAgICAgICAgaWYgKGlzX25lZyAmJiAoYmFzaXMyIDwgMCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGNlcnRhaW4gdW5kZXJmbG93Ci0KLSAgICAgICAgaWYgKCFpc19uZWcgJiYgKGJhc2lzMiA+PSAwKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gY2VydGFpbiBvdmVyZmxvdwotCi0gICAgICAgIGlmIChBQlMoYmFzaXMyKSA8PSBzdGF0aWNfY2FzdDxpbnQ2NF90PihzY2FsZWQgJiBJTlQ2NF9NQVgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBub3QgZW5vdWdoCi0KLSAgICAgICAgLy8gTG9va3MgbGlrZSB3ZSBhcmUgT0sKLSAgICAgICAgKm91dCA9IChpc19uZWcgPyAoLXNjYWxlZCkgOiBzY2FsZWQpICsgYmFzaXMyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNjYWxlZCBmaXRzIHdpdGhpbiBzaWduZWQgYm91bmRzLCBzbyB3ZSBqdXN0IG5lZWQgdG8gY2hlY2sgZm9yCi0gICAgICAgIC8vIG92ZXIvdW5kZXJmbG93IGZvciB0d28gc2lnbmVkIGludGVnZXJzLiAgQmFzaWNhbGx5LCBpZiBib3RoIHNjYWxlZAotICAgICAgICAvLyBhbmQgYmFzaXMyIGhhdmUgdGhlIHNhbWUgc2lnbiBiaXQsIGFuZCB0aGUgcmVzdWx0IGhhcyBhIGRpZmZlcmVudAotICAgICAgICAvLyBzaWduIGJpdCwgdGhlbiB3ZSBoYXZlIHVuZGVyL292ZXJmbG93LiAgQW4gZWFzeSB3YXkgdG8gY29tcHV0ZSB0aGlzCi0gICAgICAgIC8vIGlzCi0gICAgICAgIC8vIChzY2FsZWRfc2lnbmJpdCBYTk9SIGJhc2lzX3NpZ25iaXQpICYmCi0gICAgICAgIC8vIChzY2FsZWRfc2lnbmJpdCBYT1IgcmVzX3NpZ25iaXQpCi0gICAgICAgIC8vID09Ci0gICAgICAgIC8vIChzY2FsZWRfc2lnbmJpdCBYT1IgYmFzaXNfc2lnbmJpdCBYT1IgMSkgJiYKLSAgICAgICAgLy8gKHNjYWxlZF9zaWduYml0IFhPUiByZXNfc2lnbmJpdCkKLQotICAgICAgICBpZiAoaXNfbmVnKQotICAgICAgICAgICAgc2NhbGVkID0gLXNjYWxlZDsKLSAgICAgICAgcmVzID0gc2NhbGVkICsgYmFzaXMyOwotCi0gICAgICAgIGlmICgoc2NhbGVkIF4gYmFzaXMyIF4gSU5UNjRfTUlOKSAmIChzY2FsZWQgXiByZXMpICYgSU5UNjRfTUlOKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICpvdXQgPSByZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTGluZWFyVHJhbnNmb3JtOjpkb0ZvcndhcmRUcmFuc2Zvcm0oaW50NjRfdCBhX2luLCBpbnQ2NF90KiBiX291dCkgY29uc3QgewotICAgIGlmICgwID09IGFfdG9fYl9kZW5vbSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGxpbmVhcl90cmFuc2Zvcm1fczY0X3RvX3M2NChhX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYV96ZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYV90b19iX251bWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYV90b19iX2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl96ZXJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYl9vdXQpOwotfQotCi1ib29sIExpbmVhclRyYW5zZm9ybTo6ZG9SZXZlcnNlVHJhbnNmb3JtKGludDY0X3QgYl9pbiwgaW50NjRfdCogYV9vdXQpIGNvbnN0IHsKLSAgICBpZiAoMCA9PSBhX3RvX2JfbnVtZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBsaW5lYXJfdHJhbnNmb3JtX3M2NF90b19zNjQoYl9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfemVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfdG9fYl9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfdG9fYl9udW1lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfemVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfb3V0KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgTGluZWFyVHJhbnNmb3JtOjpyZWR1Y2UoVCogTiwgVCogRCkgewotICAgIFQgYSwgYjsKLSAgICBpZiAoIU4gfHwgIUQgfHwgISgqRCkpIHsKLSAgICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGEgPSAqTjsKLSAgICBiID0gKkQ7Ci0KLSAgICBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICpEID0gMTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRoaXMgaW1wbGVtZW50cyBFdWNsaWQncyBtZXRob2QgdG8gZmluZCBHQ0QuCi0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICAgIFQgdG1wID0gYTsKLSAgICAgICAgYSA9IGI7Ci0gICAgICAgIGIgPSB0bXA7Ci0gICAgfQotCi0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgLy8gYSBpcyBub3cgdGhlIGdyZWF0ZXIgb2YgdGhlIHR3by4KLSAgICAgICAgY29uc3QgVCByZW1haW5kZXIgPSBhICUgYjsKLSAgICAgICAgaWYgKHJlbWFpbmRlciA9PSAwKSB7Ci0gICAgICAgICAgICAqTiAvPSBiOwotICAgICAgICAgICAgKkQgLz0gYjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICAvLyBieSBzd2FwcGluZyByZW1haW5kZXIgYW5kIGIsIHdlIGFyZSBndWFyYW50ZWVpbmcgdGhhdCBhIGlzCi0gICAgICAgIC8vIHN0aWxsIHRoZSBncmVhdGVyIG9mIHRoZSB0d28gdXBvbiBlbnRyYW5jZSB0byB0aGUgbG9vcC4KLSAgICAgICAgYSA9IGI7Ci0gICAgICAgIGIgPSByZW1haW5kZXI7Ci0gICAgfQotfTsKLQotdGVtcGxhdGUgdm9pZCBMaW5lYXJUcmFuc2Zvcm06OnJlZHVjZTx1aW50NjRfdD4odWludDY0X3QqIE4sIHVpbnQ2NF90KiBEKTsKLXRlbXBsYXRlIHZvaWQgTGluZWFyVHJhbnNmb3JtOjpyZWR1Y2U8dWludDMyX3Q+KHVpbnQzMl90KiBOLCB1aW50MzJfdCogRCk7Ci0KLXZvaWQgTGluZWFyVHJhbnNmb3JtOjpyZWR1Y2UoaW50MzJfdCogTiwgdWludDMyX3QqIEQpIHsKLSAgICBpZiAoTiAmJiBEICYmICpEKSB7Ci0gICAgICAgIGlmICgqTiA8IDApIHsKLSAgICAgICAgICAgICpOID0gLSgqTik7Ci0gICAgICAgICAgICByZWR1Y2UocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KE4pLCBEKTsKLSAgICAgICAgICAgICpOID0gLSgqTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWR1Y2UocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KE4pLCBEKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvTG9vcGVyLmNwcCBiL2xpYnMvdXRpbHMvTG9vcGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhYTY2NC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL0xvb3Blci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQgKzAsMCBAQAotLy8KLS8vIENvcHlyaWdodCAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBBIGxvb3BlciBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBlcG9sbCgpLgotLy8KLSNkZWZpbmUgTE9HX1RBRyAiTG9vcGVyIgotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLS8vIERlYnVncyBwb2xsIGFuZCB3YWtlIGludGVyYWN0aW9ucy4KLSNkZWZpbmUgREVCVUdfUE9MTF9BTkRfV0FLRSAwCi0KLS8vIERlYnVncyBjYWxsYmFjayByZWdpc3RyYXRpb24gYW5kIGludm9jYXRpb24uCi0jZGVmaW5lIERFQlVHX0NBTExCQUNLUyAwCi0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9vcGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFdlYWtNZXNzYWdlSGFuZGxlciAtLS0KLQotV2Vha01lc3NhZ2VIYW5kbGVyOjpXZWFrTWVzc2FnZUhhbmRsZXIoY29uc3Qgd3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyKSA6Ci0gICAgICAgIG1IYW5kbGVyKGhhbmRsZXIpIHsKLX0KLQotdm9pZCBXZWFrTWVzc2FnZUhhbmRsZXI6OmhhbmRsZU1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotICAgIHNwPE1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyID0gbUhhbmRsZXIucHJvbW90ZSgpOwotICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgaGFuZGxlci0+aGFuZGxlTWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci19Ci0KLQotLy8gLS0tIExvb3BlciAtLS0KLQotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0vLyBIaW50IGZvciBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVwb2xsIGluc3RhbmNlLgotc3RhdGljIGNvbnN0IGludCBFUE9MTF9TSVpFX0hJTlQgPSA4OwotCi0vLyBNYXhpbXVtIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGZvciB3aGljaCB0byByZXRyaWV2ZSBwb2xsIGV2ZW50cyBlYWNoIGl0ZXJhdGlvbi4KLXN0YXRpYyBjb25zdCBpbnQgRVBPTExfTUFYX0VWRU5UUyA9IDE2OwotI2VuZGlmCi0KLXN0YXRpYyBwdGhyZWFkX29uY2VfdCBnVExTT25jZSA9IFBUSFJFQURfT05DRV9JTklUOwotc3RhdGljIHB0aHJlYWRfa2V5X3QgZ1RMU0tleSA9IDA7Ci0KLUxvb3Blcjo6TG9vcGVyKGJvb2wgYWxsb3dOb25DYWxsYmFja3MpIDoKLSAgICAgICAgbUFsbG93Tm9uQ2FsbGJhY2tzKGFsbG93Tm9uQ2FsbGJhY2tzKSwgbVNlbmRpbmdNZXNzYWdlKGZhbHNlKSwKLSAgICAgICAgbVJlc3BvbnNlSW5kZXgoMCksIG1OZXh0TWVzc2FnZVVwdGltZShMTE9OR19NQVgpIHsKLSAgICBpbnQgd2FrZUZkc1syXTsKLSAgICBpbnQgcmVzdWx0ID0gcGlwZSh3YWtlRmRzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IGNyZWF0ZSB3YWtlIHBpcGUuICBlcnJubz0lZCIsIGVycm5vKTsKLQotICAgIG1XYWtlUmVhZFBpcGVGZCA9IHdha2VGZHNbMF07Ci0gICAgbVdha2VXcml0ZVBpcGVGZCA9IHdha2VGZHNbMV07Ci0KLSAgICByZXN1bHQgPSBmY250bChtV2FrZVJlYWRQaXBlRmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgbWFrZSB3YWtlIHJlYWQgcGlwZSBub24tYmxvY2tpbmcuICBlcnJubz0lZCIsCi0gICAgICAgICAgICBlcnJubyk7Ci0KLSAgICByZXN1bHQgPSBmY250bChtV2FrZVdyaXRlUGlwZUZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IG1ha2Ugd2FrZSB3cml0ZSBwaXBlIG5vbi1ibG9ja2luZy4gIGVycm5vPSVkIiwKLSAgICAgICAgICAgIGVycm5vKTsKLQotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0gICAgLy8gQWxsb2NhdGUgdGhlIGVwb2xsIGluc3RhbmNlIGFuZCByZWdpc3RlciB0aGUgd2FrZSBwaXBlLgotICAgIG1FcG9sbEZkID0gZXBvbGxfY3JlYXRlKEVQT0xMX1NJWkVfSElOVCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRXBvbGxGZCA8IDAsICJDb3VsZCBub3QgY3JlYXRlIGVwb2xsIGluc3RhbmNlLiAgZXJybm89JWQiLCBlcnJubyk7Ci0KLSAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgZXZlbnRJdGVtOwotICAgIG1lbXNldCgmIGV2ZW50SXRlbSwgMCwgc2l6ZW9mKGVwb2xsX2V2ZW50KSk7IC8vIHplcm8gb3V0IHVudXNlZCBtZW1iZXJzIG9mIGRhdGEgZmllbGQgdW5pb24KLSAgICBldmVudEl0ZW0uZXZlbnRzID0gRVBPTExJTjsKLSAgICBldmVudEl0ZW0uZGF0YS5mZCA9IG1XYWtlUmVhZFBpcGVGZDsKLSAgICByZXN1bHQgPSBlcG9sbF9jdGwobUVwb2xsRmQsIEVQT0xMX0NUTF9BREQsIG1XYWtlUmVhZFBpcGVGZCwgJiBldmVudEl0ZW0pOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgYWRkIHdha2UgcmVhZCBwaXBlIHRvIGVwb2xsIGluc3RhbmNlLiAgZXJybm89JWQiLAotICAgICAgICAgICAgZXJybm8pOwotI2Vsc2UKLSAgICAvLyBBZGQgdGhlIHdha2UgcGlwZSB0byB0aGUgaGVhZCBvZiB0aGUgcmVxdWVzdCBsaXN0IHdpdGggYSBudWxsIGNhbGxiYWNrLgotICAgIHN0cnVjdCBwb2xsZmQgcmVxdWVzdGVkRmQ7Ci0gICAgcmVxdWVzdGVkRmQuZmQgPSBtV2FrZVJlYWRQaXBlRmQ7Ci0gICAgcmVxdWVzdGVkRmQuZXZlbnRzID0gUE9MTElOOwotICAgIG1SZXF1ZXN0ZWRGZHMucHVzaChyZXF1ZXN0ZWRGZCk7Ci0KLSAgICBSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgcmVxdWVzdC5mZCA9IG1XYWtlUmVhZFBpcGVGZDsKLSAgICByZXF1ZXN0LmNhbGxiYWNrID0gTlVMTDsKLSAgICByZXF1ZXN0LmlkZW50ID0gMDsKLSAgICByZXF1ZXN0LmRhdGEgPSBOVUxMOwotICAgIG1SZXF1ZXN0cy5wdXNoKHJlcXVlc3QpOwotCi0gICAgbVBvbGxpbmcgPSBmYWxzZTsKLSAgICBtV2FpdGVycyA9IDA7Ci0jZW5kaWYKLQotI2lmZGVmIExPT1BFUl9TVEFUSVNUSUNTCi0gICAgbVBlbmRpbmdXYWtlVGltZSA9IC0xOwotICAgIG1QZW5kaW5nV2FrZUNvdW50ID0gMDsKLSAgICBtU2FtcGxlZFdha2VDeWNsZXMgPSAwOwotICAgIG1TYW1wbGVkV2FrZUNvdW50U3VtID0gMDsKLSAgICBtU2FtcGxlZFdha2VMYXRlbmN5U3VtID0gMDsKLQotICAgIG1TYW1wbGVkUG9sbHMgPSAwOwotICAgIG1TYW1wbGVkWmVyb1BvbGxDb3VudCA9IDA7Ci0gICAgbVNhbXBsZWRaZXJvUG9sbExhdGVuY3lTdW0gPSAwOwotICAgIG1TYW1wbGVkVGltZW91dFBvbGxDb3VudCA9IDA7Ci0gICAgbVNhbXBsZWRUaW1lb3V0UG9sbExhdGVuY3lTdW0gPSAwOwotI2VuZGlmCi19Ci0KLUxvb3Blcjo6fkxvb3BlcigpIHsKLSAgICBjbG9zZShtV2FrZVJlYWRQaXBlRmQpOwotICAgIGNsb3NlKG1XYWtlV3JpdGVQaXBlRmQpOwotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0gICAgY2xvc2UobUVwb2xsRmQpOwotI2VuZGlmCi19Ci0KLXZvaWQgTG9vcGVyOjppbml0VExTS2V5KCkgewotICAgIGludCByZXN1bHQgPSBwdGhyZWFkX2tleV9jcmVhdGUoJiBnVExTS2V5LCB0aHJlYWREZXN0cnVjdG9yKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSAwLCAiQ291bGQgbm90IGFsbG9jYXRlIFRMUyBrZXkuIik7Ci19Ci0KLXZvaWQgTG9vcGVyOjp0aHJlYWREZXN0cnVjdG9yKHZvaWQgKnN0KSB7Ci0gICAgTG9vcGVyKiBjb25zdCBzZWxmID0gc3RhdGljX2Nhc3Q8TG9vcGVyKj4oc3QpOwotICAgIGlmIChzZWxmICE9IE5VTEwpIHsKLSAgICAgICAgc2VsZi0+ZGVjU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKLSAgICB9Ci19Ci0KLXZvaWQgTG9vcGVyOjpzZXRGb3JUaHJlYWQoY29uc3Qgc3A8TG9vcGVyPiYgbG9vcGVyKSB7Ci0gICAgc3A8TG9vcGVyPiBvbGQgPSBnZXRGb3JUaHJlYWQoKTsgLy8gYWxzbyBoYXMgc2lkZS1lZmZlY3Qgb2YgaW5pdGlhbGl6aW5nIFRMUwotCi0gICAgaWYgKGxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgIGxvb3Blci0+aW5jU3Ryb25nKCh2b2lkKil0aHJlYWREZXN0cnVjdG9yKTsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdUTFNLZXksIGxvb3Blci5nZXQoKSk7Ci0KLSAgICBpZiAob2xkICE9IE5VTEwpIHsKLSAgICAgICAgb2xkLT5kZWNTdHJvbmcoKHZvaWQqKXRocmVhZERlc3RydWN0b3IpOwotICAgIH0KLX0KLQotc3A8TG9vcGVyPiBMb29wZXI6OmdldEZvclRocmVhZCgpIHsKLSAgICBpbnQgcmVzdWx0ID0gcHRocmVhZF9vbmNlKCYgZ1RMU09uY2UsIGluaXRUTFNLZXkpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IDAsICJwdGhyZWFkX29uY2UgZmFpbGVkIik7Ci0KLSAgICByZXR1cm4gKExvb3BlciopcHRocmVhZF9nZXRzcGVjaWZpYyhnVExTS2V5KTsKLX0KLQotc3A8TG9vcGVyPiBMb29wZXI6OnByZXBhcmUoaW50IG9wdHMpIHsKLSAgICBib29sIGFsbG93Tm9uQ2FsbGJhY2tzID0gb3B0cyAmIEFMT09QRVJfUFJFUEFSRV9BTExPV19OT05fQ0FMTEJBQ0tTOwotICAgIHNwPExvb3Blcj4gbG9vcGVyID0gTG9vcGVyOjpnZXRGb3JUaHJlYWQoKTsKLSAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbG9vcGVyID0gbmV3IExvb3BlcihhbGxvd05vbkNhbGxiYWNrcyk7Ci0gICAgICAgIExvb3Blcjo6c2V0Rm9yVGhyZWFkKGxvb3Blcik7Ci0gICAgfQotICAgIGlmIChsb29wZXItPmdldEFsbG93Tm9uQ2FsbGJhY2tzKCkgIT0gYWxsb3dOb25DYWxsYmFja3MpIHsKLSAgICAgICAgQUxPR1coIkxvb3BlciBhbHJlYWR5IHByZXBhcmVkIGZvciB0aGlzIHRocmVhZCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUgIgotICAgICAgICAgICAgICAgICJBTE9PUEVSX1BSRVBBUkVfQUxMT1dfTk9OX0NBTExCQUNLUyBvcHRpb24uIik7Ci0gICAgfQotICAgIHJldHVybiBsb29wZXI7Ci19Ci0KLWJvb2wgTG9vcGVyOjpnZXRBbGxvd05vbkNhbGxiYWNrcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFsbG93Tm9uQ2FsbGJhY2tzOwotfQotCi1pbnQgTG9vcGVyOjpwb2xsT25jZShpbnQgdGltZW91dE1pbGxpcywgaW50KiBvdXRGZCwgaW50KiBvdXRFdmVudHMsIHZvaWQqKiBvdXREYXRhKSB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICB3aGlsZSAobVJlc3BvbnNlSW5kZXggPCBtUmVzcG9uc2VzLnNpemUoKSkgewotICAgICAgICAgICAgY29uc3QgUmVzcG9uc2UmIHJlc3BvbnNlID0gbVJlc3BvbnNlcy5pdGVtQXQobVJlc3BvbnNlSW5kZXgrKyk7Ci0gICAgICAgICAgICBBTG9vcGVyX2NhbGxiYWNrRnVuYyBjYWxsYmFjayA9IHJlc3BvbnNlLnJlcXVlc3QuY2FsbGJhY2s7Ci0gICAgICAgICAgICBpZiAoIWNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlkZW50ID0gcmVzcG9uc2UucmVxdWVzdC5pZGVudDsKLSAgICAgICAgICAgICAgICBpbnQgZmQgPSByZXNwb25zZS5yZXF1ZXN0LmZkOwotICAgICAgICAgICAgICAgIGludCBldmVudHMgPSByZXNwb25zZS5ldmVudHM7Ci0gICAgICAgICAgICAgICAgdm9pZCogZGF0YSA9IHJlc3BvbnNlLnJlcXVlc3QuZGF0YTsKLSNpZiBERUJVR19QT0xMX0FORF9XQUtFCi0gICAgICAgICAgICAgICAgQUxPR0QoIiVwIH4gcG9sbE9uY2UgLSByZXR1cm5pbmcgc2lnbmFsbGVkIGlkZW50aWZpZXIgJWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmZD0lZCwgZXZlbnRzPTB4JXgsIGRhdGE9JXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgaWRlbnQsIGZkLCBldmVudHMsIGRhdGEpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgaWYgKG91dEZkICE9IE5VTEwpICpvdXRGZCA9IGZkOwotICAgICAgICAgICAgICAgIGlmIChvdXRFdmVudHMgIT0gTlVMTCkgKm91dEV2ZW50cyA9IGV2ZW50czsKLSAgICAgICAgICAgICAgICBpZiAob3V0RGF0YSAhPSBOVUxMKSAqb3V0RGF0YSA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgICAgICAgICAgQUxPR0QoIiVwIH4gcG9sbE9uY2UgLSByZXR1cm5pbmcgcmVzdWx0ICVkIiwgdGhpcywgcmVzdWx0KTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKG91dEZkICE9IE5VTEwpICpvdXRGZCA9IDA7Ci0gICAgICAgICAgICBpZiAob3V0RXZlbnRzICE9IE5VTEwpICpvdXRFdmVudHMgPSBOVUxMOwotICAgICAgICAgICAgaWYgKG91dERhdGEgIT0gTlVMTCkgKm91dERhdGEgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IHBvbGxJbm5lcih0aW1lb3V0TWlsbGlzKTsKLSAgICB9Ci19Ci0KLWludCBMb29wZXI6OnBvbGxJbm5lcihpbnQgdGltZW91dE1pbGxpcykgewotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UKLSAgICBBTE9HRCgiJXAgfiBwb2xsT25jZSAtIHdhaXRpbmc6IHRpbWVvdXRNaWxsaXM9JWQiLCB0aGlzLCB0aW1lb3V0TWlsbGlzKTsKLSNlbmRpZgotCi0gICAgLy8gQWRqdXN0IHRoZSB0aW1lb3V0IGJhc2VkIG9uIHdoZW4gdGhlIG5leHQgbWVzc2FnZSBpcyBkdWUuCi0gICAgaWYgKHRpbWVvdXRNaWxsaXMgIT0gMCAmJiBtTmV4dE1lc3NhZ2VVcHRpbWUgIT0gTExPTkdfTUFYKSB7Ci0gICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICBpbnQgbWVzc2FnZVRpbWVvdXRNaWxsaXMgPSB0b01pbGxpc2Vjb25kVGltZW91dERlbGF5KG5vdywgbU5leHRNZXNzYWdlVXB0aW1lKTsKLSAgICAgICAgaWYgKG1lc3NhZ2VUaW1lb3V0TWlsbGlzID49IDAKLSAgICAgICAgICAgICAgICAmJiAodGltZW91dE1pbGxpcyA8IDAgfHwgbWVzc2FnZVRpbWVvdXRNaWxsaXMgPCB0aW1lb3V0TWlsbGlzKSkgewotICAgICAgICAgICAgdGltZW91dE1pbGxpcyA9IG1lc3NhZ2VUaW1lb3V0TWlsbGlzOwotICAgICAgICB9Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgICAgICBBTE9HRCgiJXAgfiBwb2xsT25jZSAtIG5leHQgbWVzc2FnZSBpbiAlbGxkbnMsIGFkanVzdGVkIHRpbWVvdXQ6IHRpbWVvdXRNaWxsaXM9JWQiLAotICAgICAgICAgICAgICAgIHRoaXMsIG1OZXh0TWVzc2FnZVVwdGltZSAtIG5vdywgdGltZW91dE1pbGxpcyk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvLyBQb2xsLgotICAgIGludCByZXN1bHQgPSBBTE9PUEVSX1BPTExfV0FLRTsKLSAgICBtUmVzcG9uc2VzLmNsZWFyKCk7Ci0gICAgbVJlc3BvbnNlSW5kZXggPSAwOwotCi0jaWZkZWYgTE9PUEVSX1NUQVRJU1RJQ1MKLSAgICBuc2Vjc190IHBvbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0jZW5kaWYKLQotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0gICAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50SXRlbXNbRVBPTExfTUFYX0VWRU5UU107Ci0gICAgaW50IGV2ZW50Q291bnQgPSBlcG9sbF93YWl0KG1FcG9sbEZkLCBldmVudEl0ZW1zLCBFUE9MTF9NQVhfRVZFTlRTLCB0aW1lb3V0TWlsbGlzKTsKLSNlbHNlCi0gICAgLy8gV2FpdCBmb3Igd2FrZUFuZExvY2soKSB3YWl0ZXJzIHRvIHJ1biB0aGVuIHNldCBtUG9sbGluZyB0byB0cnVlLgotICAgIG1Mb2NrLmxvY2soKTsKLSAgICB3aGlsZSAobVdhaXRlcnMgIT0gMCkgewotICAgICAgICBtUmVzdW1lLndhaXQobUxvY2spOwotICAgIH0KLSAgICBtUG9sbGluZyA9IHRydWU7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0KLSAgICBzaXplX3QgcmVxdWVzdGVkQ291bnQgPSBtUmVxdWVzdGVkRmRzLnNpemUoKTsKLSAgICBpbnQgZXZlbnRDb3VudCA9IHBvbGwobVJlcXVlc3RlZEZkcy5lZGl0QXJyYXkoKSwgcmVxdWVzdGVkQ291bnQsIHRpbWVvdXRNaWxsaXMpOwotI2VuZGlmCi0KLSAgICAvLyBBY3F1aXJlIGxvY2suCi0gICAgbUxvY2subG9jaygpOwotCi0gICAgLy8gQ2hlY2sgZm9yIHBvbGwgZXJyb3IuCi0gICAgaWYgKGV2ZW50Q291bnQgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewotICAgICAgICAgICAgZ290byBEb25lOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dXKCJQb2xsIGZhaWxlZCB3aXRoIGFuIHVuZXhwZWN0ZWQgZXJyb3IsIGVycm5vPSVkIiwgZXJybm8pOwotICAgICAgICByZXN1bHQgPSBBTE9PUEVSX1BPTExfRVJST1I7Ci0gICAgICAgIGdvdG8gRG9uZTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgcG9sbCB0aW1lb3V0LgotICAgIGlmIChldmVudENvdW50ID09IDApIHsKLSNpZiBERUJVR19QT0xMX0FORF9XQUtFCi0gICAgICAgIEFMT0dEKCIlcCB+IHBvbGxPbmNlIC0gdGltZW91dCIsIHRoaXMpOwotI2VuZGlmCi0gICAgICAgIHJlc3VsdCA9IEFMT09QRVJfUE9MTF9USU1FT1VUOwotICAgICAgICBnb3RvIERvbmU7Ci0gICAgfQotCi0gICAgLy8gSGFuZGxlIGFsbCBldmVudHMuCi0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgIEFMT0dEKCIlcCB+IHBvbGxPbmNlIC0gaGFuZGxpbmcgZXZlbnRzIGZyb20gJWQgZmRzIiwgdGhpcywgZXZlbnRDb3VudCk7Ci0jZW5kaWYKLQotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudENvdW50OyBpKyspIHsKLSAgICAgICAgaW50IGZkID0gZXZlbnRJdGVtc1tpXS5kYXRhLmZkOwotICAgICAgICB1aW50MzJfdCBlcG9sbEV2ZW50cyA9IGV2ZW50SXRlbXNbaV0uZXZlbnRzOwotICAgICAgICBpZiAoZmQgPT0gbVdha2VSZWFkUGlwZUZkKSB7Ci0gICAgICAgICAgICBpZiAoZXBvbGxFdmVudHMgJiBFUE9MTElOKSB7Ci0gICAgICAgICAgICAgICAgYXdva2VuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJJZ25vcmluZyB1bmV4cGVjdGVkIGVwb2xsIGV2ZW50cyAweCV4IG9uIHdha2UgcmVhZCBwaXBlLiIsIGVwb2xsRXZlbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNzaXplX3QgcmVxdWVzdEluZGV4ID0gbVJlcXVlc3RzLmluZGV4T2ZLZXkoZmQpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3RJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGV2ZW50cyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGVwb2xsRXZlbnRzICYgRVBPTExJTikgZXZlbnRzIHw9IEFMT09QRVJfRVZFTlRfSU5QVVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGVwb2xsRXZlbnRzICYgRVBPTExPVVQpIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX09VVFBVVDsKLSAgICAgICAgICAgICAgICBpZiAoZXBvbGxFdmVudHMgJiBFUE9MTEVSUikgZXZlbnRzIHw9IEFMT09QRVJfRVZFTlRfRVJST1I7Ci0gICAgICAgICAgICAgICAgaWYgKGVwb2xsRXZlbnRzICYgRVBPTExIVVApIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX0hBTkdVUDsKLSAgICAgICAgICAgICAgICBwdXNoUmVzcG9uc2UoZXZlbnRzLCBtUmVxdWVzdHMudmFsdWVBdChyZXF1ZXN0SW5kZXgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIHVuZXhwZWN0ZWQgZXBvbGwgZXZlbnRzIDB4JXggb24gZmQgJWQgdGhhdCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIHJlZ2lzdGVyZWQuIiwgZXBvbGxFdmVudHMsIGZkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLURvbmU6IDsKLSNlbHNlCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0ZWRDb3VudDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBwb2xsZmQmIHJlcXVlc3RlZEZkID0gbVJlcXVlc3RlZEZkcy5pdGVtQXQoaSk7Ci0KLSAgICAgICAgc2hvcnQgcG9sbEV2ZW50cyA9IHJlcXVlc3RlZEZkLnJldmVudHM7Ci0gICAgICAgIGlmIChwb2xsRXZlbnRzKSB7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdGVkRmQuZmQgPT0gbVdha2VSZWFkUGlwZUZkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGxFdmVudHMgJiBQT0xMSU4pIHsKLSAgICAgICAgICAgICAgICAgICAgYXdva2VuKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIHVuZXhwZWN0ZWQgcG9sbCBldmVudHMgMHgleCBvbiB3YWtlIHJlYWQgcGlwZS4iLCBwb2xsRXZlbnRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBldmVudHMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChwb2xsRXZlbnRzICYgUE9MTElOKSBldmVudHMgfD0gQUxPT1BFUl9FVkVOVF9JTlBVVDsKLSAgICAgICAgICAgICAgICBpZiAocG9sbEV2ZW50cyAmIFBPTExPVVQpIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX09VVFBVVDsKLSAgICAgICAgICAgICAgICBpZiAocG9sbEV2ZW50cyAmIFBPTExFUlIpIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX0VSUk9SOwotICAgICAgICAgICAgICAgIGlmIChwb2xsRXZlbnRzICYgUE9MTEhVUCkgZXZlbnRzIHw9IEFMT09QRVJfRVZFTlRfSEFOR1VQOwotICAgICAgICAgICAgICAgIGlmIChwb2xsRXZlbnRzICYgUE9MTE5WQUwpIGV2ZW50cyB8PSBBTE9PUEVSX0VWRU5UX0lOVkFMSUQ7Ci0gICAgICAgICAgICAgICAgcHVzaFJlc3BvbnNlKGV2ZW50cywgbVJlcXVlc3RzLml0ZW1BdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoLS1ldmVudENvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLURvbmU6Ci0gICAgLy8gU2V0IG1Qb2xsaW5nIHRvIGZhbHNlIGFuZCB3YWtlIHVwIHRoZSB3YWtlQW5kTG9jaygpIHdhaXRlcnMuCi0gICAgbVBvbGxpbmcgPSBmYWxzZTsKLSAgICBpZiAobVdhaXRlcnMgIT0gMCkgewotICAgICAgICBtQXdha2UuYnJvYWRjYXN0KCk7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfU1RBVElTVElDUwotICAgIG5zZWNzX3QgcG9sbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbVNhbXBsZWRQb2xscyArPSAxOwotICAgIGlmICh0aW1lb3V0TWlsbGlzID09IDApIHsKLSAgICAgICAgbVNhbXBsZWRaZXJvUG9sbENvdW50ICs9IDE7Ci0gICAgICAgIG1TYW1wbGVkWmVyb1BvbGxMYXRlbmN5U3VtICs9IHBvbGxFbmRUaW1lIC0gcG9sbFN0YXJ0VGltZTsKLSAgICB9IGVsc2UgaWYgKHRpbWVvdXRNaWxsaXMgPiAwICYmIHJlc3VsdCA9PSBBTE9PUEVSX1BPTExfVElNRU9VVCkgewotICAgICAgICBtU2FtcGxlZFRpbWVvdXRQb2xsQ291bnQgKz0gMTsKLSAgICAgICAgbVNhbXBsZWRUaW1lb3V0UG9sbExhdGVuY3lTdW0gKz0gcG9sbEVuZFRpbWUgLSBwb2xsU3RhcnRUaW1lCi0gICAgICAgICAgICAgICAgLSBtaWxsaXNlY29uZHNfdG9fbmFub3NlY29uZHModGltZW91dE1pbGxpcyk7Ci0gICAgfQotICAgIGlmIChtU2FtcGxlZFBvbGxzID09IFNBTVBMRURfUE9MTFNfVE9fQUdHUkVHQVRFKSB7Ci0gICAgICAgIEFMT0dEKCIlcCB+IHBvbGwgbGF0ZW5jeSBzdGF0aXN0aWNzOiAlMC4zZm1zIHplcm8gdGltZW91dCwgJTAuM2ZtcyBub24temVybyB0aW1lb3V0IiwgdGhpcywKLSAgICAgICAgICAgICAgICAwLjAwMDAwMWYgKiBmbG9hdChtU2FtcGxlZFplcm9Qb2xsTGF0ZW5jeVN1bSkgLyBtU2FtcGxlZFplcm9Qb2xsQ291bnQsCi0gICAgICAgICAgICAgICAgMC4wMDAwMDFmICogZmxvYXQobVNhbXBsZWRUaW1lb3V0UG9sbExhdGVuY3lTdW0pIC8gbVNhbXBsZWRUaW1lb3V0UG9sbENvdW50KTsKLSAgICAgICAgbVNhbXBsZWRQb2xscyA9IDA7Ci0gICAgICAgIG1TYW1wbGVkWmVyb1BvbGxDb3VudCA9IDA7Ci0gICAgICAgIG1TYW1wbGVkWmVyb1BvbGxMYXRlbmN5U3VtID0gMDsKLSAgICAgICAgbVNhbXBsZWRUaW1lb3V0UG9sbENvdW50ID0gMDsKLSAgICAgICAgbVNhbXBsZWRUaW1lb3V0UG9sbExhdGVuY3lTdW0gPSAwOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gSW52b2tlIHBlbmRpbmcgbWVzc2FnZSBjYWxsYmFja3MuCi0gICAgbU5leHRNZXNzYWdlVXB0aW1lID0gTExPTkdfTUFYOwotICAgIHdoaWxlIChtTWVzc2FnZUVudmVsb3Blcy5zaXplKCkgIT0gMCkgewotICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICAgICAgY29uc3QgTWVzc2FnZUVudmVsb3BlJiBtZXNzYWdlRW52ZWxvcGUgPSBtTWVzc2FnZUVudmVsb3Blcy5pdGVtQXQoMCk7Ci0gICAgICAgIGlmIChtZXNzYWdlRW52ZWxvcGUudXB0aW1lIDw9IG5vdykgewotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBlbnZlbG9wZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgICAgLy8gV2Uga2VlcCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgdW50aWwgdGhlIGNhbGwgdG8gaGFuZGxlTWVzc2FnZQotICAgICAgICAgICAgLy8gZmluaXNoZXMuICBUaGVuIHdlIGRyb3AgaXQgc28gdGhhdCB0aGUgaGFuZGxlciBjYW4gYmUgZGVsZXRlZCAqYmVmb3JlKgotICAgICAgICAgICAgLy8gd2UgcmVhY3F1aXJlIG91ciBsb2NrLgotICAgICAgICAgICAgeyAvLyBvYnRhaW4gaGFuZGxlcgotICAgICAgICAgICAgICAgIHNwPE1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyID0gbWVzc2FnZUVudmVsb3BlLmhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZUVudmVsb3BlLm1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgbU1lc3NhZ2VFbnZlbG9wZXMucmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICAgICAgbVNlbmRpbmdNZXNzYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLQotI2lmIERFQlVHX1BPTExfQU5EX1dBS0UgfHwgREVCVUdfQ0FMTEJBQ0tTCi0gICAgICAgICAgICAgICAgQUxPR0QoIiVwIH4gcG9sbE9uY2UgLSBzZW5kaW5nIG1lc3NhZ2U6IGhhbmRsZXI9JXAsIHdoYXQ9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgaGFuZGxlci5nZXQoKSwgbWVzc2FnZS53aGF0KTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGhhbmRsZXItPmhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICB9IC8vIHJlbGVhc2UgaGFuZGxlcgotCi0gICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICBtU2VuZGluZ01lc3NhZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFMT09QRVJfUE9MTF9DQUxMQkFDSzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRoZSBsYXN0IG1lc3NhZ2UgbGVmdCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgZGV0ZXJtaW5lcyB0aGUgbmV4dCB3YWtldXAgdGltZS4KLSAgICAgICAgICAgIG1OZXh0TWVzc2FnZVVwdGltZSA9IG1lc3NhZ2VFbnZlbG9wZS51cHRpbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJlbGVhc2UgbG9jay4KLSAgICBtTG9jay51bmxvY2soKTsKLQotICAgIC8vIEludm9rZSBhbGwgcmVzcG9uc2UgY2FsbGJhY2tzLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlc3BvbnNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBSZXNwb25zZSYgcmVzcG9uc2UgPSBtUmVzcG9uc2VzLml0ZW1BdChpKTsKLSAgICAgICAgQUxvb3Blcl9jYWxsYmFja0Z1bmMgY2FsbGJhY2sgPSByZXNwb25zZS5yZXF1ZXN0LmNhbGxiYWNrOwotICAgICAgICBpZiAoY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGludCBmZCA9IHJlc3BvbnNlLnJlcXVlc3QuZmQ7Ci0gICAgICAgICAgICBpbnQgZXZlbnRzID0gcmVzcG9uc2UuZXZlbnRzOwotICAgICAgICAgICAgdm9pZCogZGF0YSA9IHJlc3BvbnNlLnJlcXVlc3QuZGF0YTsKLSNpZiBERUJVR19QT0xMX0FORF9XQUtFIHx8IERFQlVHX0NBTExCQUNLUwotICAgICAgICAgICAgQUxPR0QoIiVwIH4gcG9sbE9uY2UgLSBpbnZva2luZyBmZCBldmVudCBjYWxsYmFjayAlcDogZmQ9JWQsIGV2ZW50cz0weCV4LCBkYXRhPSVwIiwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgY2FsbGJhY2ssIGZkLCBldmVudHMsIGRhdGEpOwotI2VuZGlmCi0gICAgICAgICAgICBpbnQgY2FsbGJhY2tSZXN1bHQgPSBjYWxsYmFjayhmZCwgZXZlbnRzLCBkYXRhKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRmQoZmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gQUxPT1BFUl9QT0xMX0NBTExCQUNLOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWludCBMb29wZXI6OnBvbGxBbGwoaW50IHRpbWVvdXRNaWxsaXMsIGludCogb3V0RmQsIGludCogb3V0RXZlbnRzLCB2b2lkKiogb3V0RGF0YSkgewotICAgIGlmICh0aW1lb3V0TWlsbGlzIDw9IDApIHsKLSAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmVzdWx0ID0gcG9sbE9uY2UodGltZW91dE1pbGxpcywgb3V0RmQsIG91dEV2ZW50cywgb3V0RGF0YSk7Ci0gICAgICAgIH0gd2hpbGUgKHJlc3VsdCA9PSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0spOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5zZWNzX3QgZW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKQotICAgICAgICAgICAgICAgICsgbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHRpbWVvdXRNaWxsaXMpOwotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBwb2xsT25jZSh0aW1lb3V0TWlsbGlzLCBvdXRGZCwgb3V0RXZlbnRzLCBvdXREYXRhKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gQUxPT1BFUl9QT0xMX0NBTExCQUNLKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgICAgICAgICB0aW1lb3V0TWlsbGlzID0gdG9NaWxsaXNlY29uZFRpbWVvdXREZWxheShub3csIGVuZFRpbWUpOwotICAgICAgICAgICAgaWYgKHRpbWVvdXRNaWxsaXMgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBBTE9PUEVSX1BPTExfVElNRU9VVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBMb29wZXI6Ondha2UoKSB7Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgIEFMT0dEKCIlcCB+IHdha2UiLCB0aGlzKTsKLSNlbmRpZgotCi0jaWZkZWYgTE9PUEVSX1NUQVRJU1RJQ1MKLSAgICAvLyBGSVhNRTogUG9zc2libGUgcmFjZSB3aXRoIGF3b2tlbigpIGJ1dCB0aGlzIGNvZGUgaXMgZm9yIHRlc3Rpbmcgb25seSBhbmQgaXMgcmFyZWx5IGVuYWJsZWQuCi0gICAgaWYgKG1QZW5kaW5nV2FrZUNvdW50KysgPT0gMCkgewotICAgICAgICBtUGVuZGluZ1dha2VUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIH0KLSNlbmRpZgotCi0gICAgc3NpemVfdCBuV3JpdGU7Ci0gICAgZG8gewotICAgICAgICBuV3JpdGUgPSB3cml0ZShtV2FrZVdyaXRlUGlwZUZkLCAiVyIsIDEpOwotICAgIH0gd2hpbGUgKG5Xcml0ZSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAobldyaXRlICE9IDEpIHsKLSAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgewotICAgICAgICAgICAgQUxPR1coIkNvdWxkIG5vdCB3cml0ZSB3YWtlIHNpZ25hbCwgZXJybm89JWQiLCBlcnJubyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTG9vcGVyOjphd29rZW4oKSB7Ci0jaWYgREVCVUdfUE9MTF9BTkRfV0FLRQotICAgIEFMT0dEKCIlcCB+IGF3b2tlbiIsIHRoaXMpOwotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfU1RBVElTVElDUwotICAgIGlmIChtUGVuZGluZ1dha2VDb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dEKCIlcCB+IGF3b2tlbjogc3B1cmlvdXMhIiwgdGhpcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVNhbXBsZWRXYWtlQ3ljbGVzICs9IDE7Ci0gICAgICAgIG1TYW1wbGVkV2FrZUNvdW50U3VtICs9IG1QZW5kaW5nV2FrZUNvdW50OwotICAgICAgICBtU2FtcGxlZFdha2VMYXRlbmN5U3VtICs9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSAtIG1QZW5kaW5nV2FrZVRpbWU7Ci0gICAgICAgIG1QZW5kaW5nV2FrZUNvdW50ID0gMDsKLSAgICAgICAgbVBlbmRpbmdXYWtlVGltZSA9IC0xOwotICAgICAgICBpZiAobVNhbXBsZWRXYWtlQ3ljbGVzID09IFNBTVBMRURfV0FLRV9DWUNMRVNfVE9fQUdHUkVHQVRFKSB7Ci0gICAgICAgICAgICBBTE9HRCgiJXAgfiB3YWtlIHN0YXRpc3RpY3M6ICUwLjNmbXMgd2FrZSBsYXRlbmN5LCAlMC4zZiB3YWtlcyBwZXIgY3ljbGUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMWYgKiBmbG9hdChtU2FtcGxlZFdha2VMYXRlbmN5U3VtKSAvIG1TYW1wbGVkV2FrZUN5Y2xlcywKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQobVNhbXBsZWRXYWtlQ291bnRTdW0pIC8gbVNhbXBsZWRXYWtlQ3ljbGVzKTsKLSAgICAgICAgICAgIG1TYW1wbGVkV2FrZUN5Y2xlcyA9IDA7Ci0gICAgICAgICAgICBtU2FtcGxlZFdha2VDb3VudFN1bSA9IDA7Ci0gICAgICAgICAgICBtU2FtcGxlZFdha2VMYXRlbmN5U3VtID0gMDsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgY2hhciBidWZmZXJbMTZdOwotICAgIHNzaXplX3QgblJlYWQ7Ci0gICAgZG8gewotICAgICAgICBuUmVhZCA9IHJlYWQobVdha2VSZWFkUGlwZUZkLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgICB9IHdoaWxlICgoblJlYWQgPT0gLTEgJiYgZXJybm8gPT0gRUlOVFIpIHx8IG5SZWFkID09IHNpemVvZihidWZmZXIpKTsKLX0KLQotdm9pZCBMb29wZXI6OnB1c2hSZXNwb25zZShpbnQgZXZlbnRzLCBjb25zdCBSZXF1ZXN0JiByZXF1ZXN0KSB7Ci0gICAgUmVzcG9uc2UgcmVzcG9uc2U7Ci0gICAgcmVzcG9uc2UuZXZlbnRzID0gZXZlbnRzOwotICAgIHJlc3BvbnNlLnJlcXVlc3QgPSByZXF1ZXN0OwotICAgIG1SZXNwb25zZXMucHVzaChyZXNwb25zZSk7Ci19Ci0KLWludCBMb29wZXI6OmFkZEZkKGludCBmZCwgaW50IGlkZW50LCBpbnQgZXZlbnRzLCBBTG9vcGVyX2NhbGxiYWNrRnVuYyBjYWxsYmFjaywgdm9pZCogZGF0YSkgewotI2lmIERFQlVHX0NBTExCQUNLUwotICAgIEFMT0dEKCIlcCB+IGFkZEZkIC0gZmQ9JWQsIGlkZW50PSVkLCBldmVudHM9MHgleCwgY2FsbGJhY2s9JXAsIGRhdGE9JXAiLCB0aGlzLCBmZCwgaWRlbnQsCi0gICAgICAgICAgICBldmVudHMsIGNhbGxiYWNrLCBkYXRhKTsKLSNlbmRpZgotCi0gICAgaWYgKCEgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKCEgbUFsbG93Tm9uQ2FsbGJhY2tzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBhdHRlbXB0IHRvIHNldCBOVUxMIGNhbGxiYWNrIGJ1dCBub3QgYWxsb3dlZCBmb3IgdGhpcyBsb29wZXIuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaWRlbnQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBhdHRlbXB0IHRvIHNldCBOVUxMIGNhbGxiYWNrIHdpdGggaWRlbnQgPD0gMC4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotI2lmZGVmIExPT1BFUl9VU0VTX0VQT0xMCi0gICAgaW50IGVwb2xsRXZlbnRzID0gMDsKLSAgICBpZiAoZXZlbnRzICYgQUxPT1BFUl9FVkVOVF9JTlBVVCkgZXBvbGxFdmVudHMgfD0gRVBPTExJTjsKLSAgICBpZiAoZXZlbnRzICYgQUxPT1BFUl9FVkVOVF9PVVRQVVQpIGVwb2xsRXZlbnRzIHw9IEVQT0xMT1VUOwotCi0gICAgeyAvLyBhY3F1aXJlIGxvY2sKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQotICAgICAgICBSZXF1ZXN0IHJlcXVlc3Q7Ci0gICAgICAgIHJlcXVlc3QuZmQgPSBmZDsKLSAgICAgICAgcmVxdWVzdC5pZGVudCA9IGlkZW50OwotICAgICAgICByZXF1ZXN0LmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIHJlcXVlc3QuZGF0YSA9IGRhdGE7Ci0KLSAgICAgICAgc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50SXRlbTsKLSAgICAgICAgbWVtc2V0KCYgZXZlbnRJdGVtLCAwLCBzaXplb2YoZXBvbGxfZXZlbnQpKTsgLy8gemVybyBvdXQgdW51c2VkIG1lbWJlcnMgb2YgZGF0YSBmaWVsZCB1bmlvbgotICAgICAgICBldmVudEl0ZW0uZXZlbnRzID0gZXBvbGxFdmVudHM7Ci0gICAgICAgIGV2ZW50SXRlbS5kYXRhLmZkID0gZmQ7Ci0KLSAgICAgICAgc3NpemVfdCByZXF1ZXN0SW5kZXggPSBtUmVxdWVzdHMuaW5kZXhPZktleShmZCk7Ci0gICAgICAgIGlmIChyZXF1ZXN0SW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBpbnQgZXBvbGxSZXN1bHQgPSBlcG9sbF9jdGwobUVwb2xsRmQsIEVQT0xMX0NUTF9BREQsIGZkLCAmIGV2ZW50SXRlbSk7Ci0gICAgICAgICAgICBpZiAoZXBvbGxSZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGFkZGluZyBlcG9sbCBldmVudHMgZm9yIGZkICVkLCBlcnJubz0lZCIsIGZkLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlcXVlc3RzLmFkZChmZCwgcmVxdWVzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZXBvbGxSZXN1bHQgPSBlcG9sbF9jdGwobUVwb2xsRmQsIEVQT0xMX0NUTF9NT0QsIGZkLCAmIGV2ZW50SXRlbSk7Ci0gICAgICAgICAgICBpZiAoZXBvbGxSZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIG1vZGlmeWluZyBlcG9sbCBldmVudHMgZm9yIGZkICVkLCBlcnJubz0lZCIsIGZkLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlcXVlc3RzLnJlcGxhY2VWYWx1ZUF0KHJlcXVlc3RJbmRleCwgcmVxdWVzdCk7Ci0gICAgICAgIH0KLSAgICB9IC8vIHJlbGVhc2UgbG9jawotI2Vsc2UKLSAgICBpbnQgcG9sbEV2ZW50cyA9IDA7Ci0gICAgaWYgKGV2ZW50cyAmIEFMT09QRVJfRVZFTlRfSU5QVVQpIHBvbGxFdmVudHMgfD0gUE9MTElOOwotICAgIGlmIChldmVudHMgJiBBTE9PUEVSX0VWRU5UX09VVFBVVCkgcG9sbEV2ZW50cyB8PSBQT0xMT1VUOwotCi0gICAgd2FrZUFuZExvY2soKTsgLy8gYWNxdWlyZSBsb2NrCi0KLSAgICBzdHJ1Y3QgcG9sbGZkIHJlcXVlc3RlZEZkOwotICAgIHJlcXVlc3RlZEZkLmZkID0gZmQ7Ci0gICAgcmVxdWVzdGVkRmQuZXZlbnRzID0gcG9sbEV2ZW50czsKLQotICAgIFJlcXVlc3QgcmVxdWVzdDsKLSAgICByZXF1ZXN0LmZkID0gZmQ7Ci0gICAgcmVxdWVzdC5pZGVudCA9IGlkZW50OwotICAgIHJlcXVlc3QuY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICByZXF1ZXN0LmRhdGEgPSBkYXRhOwotICAgIHNzaXplX3QgaW5kZXggPSBnZXRSZXF1ZXN0SW5kZXhMb2NrZWQoZmQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgbVJlcXVlc3RlZEZkcy5wdXNoKHJlcXVlc3RlZEZkKTsKLSAgICAgICAgbVJlcXVlc3RzLnB1c2gocmVxdWVzdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVJlcXVlc3RlZEZkcy5yZXBsYWNlQXQocmVxdWVzdGVkRmQsIHNpemVfdChpbmRleCkpOwotICAgICAgICBtUmVxdWVzdHMucmVwbGFjZUF0KHJlcXVlc3QsIHNpemVfdChpbmRleCkpOwotICAgIH0KLQotICAgIG1Mb2NrLnVubG9jaygpOyAvLyByZWxlYXNlIGxvY2sKLSNlbmRpZgotICAgIHJldHVybiAxOwotfQotCi1pbnQgTG9vcGVyOjpyZW1vdmVGZChpbnQgZmQpIHsKLSNpZiBERUJVR19DQUxMQkFDS1MKLSAgICBBTE9HRCgiJXAgfiByZW1vdmVGZCAtIGZkPSVkIiwgdGhpcywgZmQpOwotI2VuZGlmCi0KLSNpZmRlZiBMT09QRVJfVVNFU19FUE9MTAotICAgIHsgLy8gYWNxdWlyZSBsb2NrCi0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgIHNzaXplX3QgcmVxdWVzdEluZGV4ID0gbVJlcXVlc3RzLmluZGV4T2ZLZXkoZmQpOwotICAgICAgICBpZiAocmVxdWVzdEluZGV4IDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZXBvbGxSZXN1bHQgPSBlcG9sbF9jdGwobUVwb2xsRmQsIEVQT0xMX0NUTF9ERUwsIGZkLCBOVUxMKTsKLSAgICAgICAgaWYgKGVwb2xsUmVzdWx0IDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlbW92aW5nIGVwb2xsIGV2ZW50cyBmb3IgZmQgJWQsIGVycm5vPSVkIiwgZmQsIGVycm5vKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIG1SZXF1ZXN0cy5yZW1vdmVJdGVtc0F0KHJlcXVlc3RJbmRleCk7Ci0gICAgfSAvLyByZWxlYXNlIGxvY2sKLSAgICByZXR1cm4gMTsKLSNlbHNlCi0gICAgd2FrZUFuZExvY2soKTsgLy8gYWNxdWlyZSBsb2NrCi0KLSAgICBzc2l6ZV90IGluZGV4ID0gZ2V0UmVxdWVzdEluZGV4TG9ja2VkKGZkKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBtUmVxdWVzdGVkRmRzLnJlbW92ZUF0KHNpemVfdChpbmRleCkpOwotICAgICAgICBtUmVxdWVzdHMucmVtb3ZlQXQoc2l6ZV90KGluZGV4KSk7Ci0gICAgfQotCi0gICAgbUxvY2sudW5sb2NrKCk7IC8vIHJlbGVhc2UgbG9jawotICAgIHJldHVybiBpbmRleCA+PSAwOwotI2VuZGlmCi19Ci0KLSNpZm5kZWYgTE9PUEVSX1VTRVNfRVBPTEwKLXNzaXplX3QgTG9vcGVyOjpnZXRSZXF1ZXN0SW5kZXhMb2NrZWQoaW50IGZkKSB7Ci0gICAgc2l6ZV90IHJlcXVlc3RDb3VudCA9IG1SZXF1ZXN0ZWRGZHMuc2l6ZSgpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0Q291bnQ7IGkrKykgewotICAgICAgICBpZiAobVJlcXVlc3RlZEZkcy5pdGVtQXQoaSkuZmQgPT0gZmQpIHsKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotfQotCi12b2lkIExvb3Blcjo6d2FrZUFuZExvY2soKSB7Ci0gICAgbUxvY2subG9jaygpOwotCi0gICAgbVdhaXRlcnMgKz0gMTsKLSAgICB3aGlsZSAobVBvbGxpbmcpIHsKLSAgICAgICAgd2FrZSgpOwotICAgICAgICBtQXdha2Uud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgbVdhaXRlcnMgLT0gMTsKLSAgICBpZiAobVdhaXRlcnMgPT0gMCkgewotICAgICAgICBtUmVzdW1lLnNpZ25hbCgpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIExvb3Blcjo6c2VuZE1lc3NhZ2UoY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLCBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgc2VuZE1lc3NhZ2VBdFRpbWUobm93LCBoYW5kbGVyLCBtZXNzYWdlKTsKLX0KLQotdm9pZCBMb29wZXI6OnNlbmRNZXNzYWdlRGVsYXllZChuc2Vjc190IHVwdGltZURlbGF5LCBjb25zdCBzcDxNZXNzYWdlSGFuZGxlcj4mIGhhbmRsZXIsCi0gICAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBzZW5kTWVzc2FnZUF0VGltZShub3cgKyB1cHRpbWVEZWxheSwgaGFuZGxlciwgbWVzc2FnZSk7Ci19Ci0KLXZvaWQgTG9vcGVyOjpzZW5kTWVzc2FnZUF0VGltZShuc2Vjc190IHVwdGltZSwgY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyLAotICAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0jaWYgREVCVUdfQ0FMTEJBQ0tTCi0gICAgQUxPR0QoIiVwIH4gc2VuZE1lc3NhZ2VBdFRpbWUgLSB1cHRpbWU9JWxsZCwgaGFuZGxlcj0lcCwgd2hhdD0lZCIsCi0gICAgICAgICAgICB0aGlzLCB1cHRpbWUsIGhhbmRsZXIuZ2V0KCksIG1lc3NhZ2Uud2hhdCk7Ci0jZW5kaWYKLQotICAgIHNpemVfdCBpID0gMDsKLSAgICB7IC8vIGFjcXVpcmUgbG9jawotICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotCi0gICAgICAgIHNpemVfdCBtZXNzYWdlQ291bnQgPSBtTWVzc2FnZUVudmVsb3Blcy5zaXplKCk7Ci0gICAgICAgIHdoaWxlIChpIDwgbWVzc2FnZUNvdW50ICYmIHVwdGltZSA+PSBtTWVzc2FnZUVudmVsb3Blcy5pdGVtQXQoaSkudXB0aW1lKSB7Ci0gICAgICAgICAgICBpICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlRW52ZWxvcGUgbWVzc2FnZUVudmVsb3BlKHVwdGltZSwgaGFuZGxlciwgbWVzc2FnZSk7Ci0gICAgICAgIG1NZXNzYWdlRW52ZWxvcGVzLmluc2VydEF0KG1lc3NhZ2VFbnZlbG9wZSwgaSwgMSk7Ci0KLSAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBJZiB0aGUgTG9vcGVyIGlzIGN1cnJlbnRseSBzZW5kaW5nIGEgbWVzc2FnZSwgdGhlbiB3ZSBjYW4gc2tpcAotICAgICAgICAvLyB0aGUgY2FsbCB0byB3YWtlKCkgYmVjYXVzZSB0aGUgbmV4dCB0aGluZyB0aGUgTG9vcGVyIHdpbGwgZG8gYWZ0ZXIgcHJvY2Vzc2luZwotICAgICAgICAvLyBtZXNzYWdlcyBpcyB0byBkZWNpZGUgd2hlbiB0aGUgbmV4dCB3YWtldXAgdGltZSBzaG91bGQgYmUuICBJbiBmYWN0LCBpdCBkb2VzCi0gICAgICAgIC8vIG5vdCBldmVuIG1hdHRlciB3aGV0aGVyIHRoaXMgY29kZSBpcyBydW5uaW5nIG9uIHRoZSBMb29wZXIgdGhyZWFkLgotICAgICAgICBpZiAobVNlbmRpbmdNZXNzYWdlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IC8vIHJlbGVhc2UgbG9jawotCi0gICAgLy8gV2FrZSB0aGUgcG9sbCBsb29wIG9ubHkgd2hlbiB3ZSBlbnF1ZXVlIGEgbmV3IG1lc3NhZ2UgYXQgdGhlIGhlYWQuCi0gICAgaWYgKGkgPT0gMCkgewotICAgICAgICB3YWtlKCk7Ci0gICAgfQotfQotCi12b2lkIExvb3Blcjo6cmVtb3ZlTWVzc2FnZXMoY29uc3Qgc3A8TWVzc2FnZUhhbmRsZXI+JiBoYW5kbGVyKSB7Ci0jaWYgREVCVUdfQ0FMTEJBQ0tTCi0gICAgQUxPR0QoIiVwIH4gcmVtb3ZlTWVzc2FnZXMgLSBoYW5kbGVyPSVwIiwgdGhpcywgaGFuZGxlci5nZXQoKSk7Ci0jZW5kaWYKLQotICAgIHsgLy8gYWNxdWlyZSBsb2NrCi0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1NZXNzYWdlRW52ZWxvcGVzLnNpemUoKTsgaSAhPSAwOyApIHsKLSAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VFbnZlbG9wZSYgbWVzc2FnZUVudmVsb3BlID0gbU1lc3NhZ2VFbnZlbG9wZXMuaXRlbUF0KC0taSk7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZUVudmVsb3BlLmhhbmRsZXIgPT0gaGFuZGxlcikgewotICAgICAgICAgICAgICAgIG1NZXNzYWdlRW52ZWxvcGVzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvLyByZWxlYXNlIGxvY2sKLX0KLQotdm9pZCBMb29wZXI6OnJlbW92ZU1lc3NhZ2VzKGNvbnN0IHNwPE1lc3NhZ2VIYW5kbGVyPiYgaGFuZGxlciwgaW50IHdoYXQpIHsKLSNpZiBERUJVR19DQUxMQkFDS1MKLSAgICBBTE9HRCgiJXAgfiByZW1vdmVNZXNzYWdlcyAtIGhhbmRsZXI9JXAsIHdoYXQ9JWQiLCB0aGlzLCBoYW5kbGVyLmdldCgpLCB3aGF0KTsKLSNlbmRpZgotCi0gICAgeyAvLyBhY3F1aXJlIGxvY2sKLSAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gbU1lc3NhZ2VFbnZlbG9wZXMuc2l6ZSgpOyBpICE9IDA7ICkgewotICAgICAgICAgICAgY29uc3QgTWVzc2FnZUVudmVsb3BlJiBtZXNzYWdlRW52ZWxvcGUgPSBtTWVzc2FnZUVudmVsb3Blcy5pdGVtQXQoLS1pKTsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlRW52ZWxvcGUuaGFuZGxlciA9PSBoYW5kbGVyCi0gICAgICAgICAgICAgICAgICAgICYmIG1lc3NhZ2VFbnZlbG9wZS5tZXNzYWdlLndoYXQgPT0gd2hhdCkgewotICAgICAgICAgICAgICAgIG1NZXNzYWdlRW52ZWxvcGVzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvLyByZWxlYXNlIGxvY2sKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbGlicy91dGlscy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL05PVElDRSBiL2xpYnMvdXRpbHMvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWIxZWZhLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvTk9USUNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLQotICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Byb3BlcnR5TWFwLmNwcCBiL2xpYnMvdXRpbHMvUHJvcGVydHlNYXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTIwNzAyLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvUHJvcGVydHlNYXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlByb3BlcnR5TWFwIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Qcm9wZXJ0eU1hcC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0vLyBFbmFibGVzIGRlYnVnIG91dHB1dCBmb3IgdGhlIHBhcnNlci4KLSNkZWZpbmUgREVCVUdfUEFSU0VSIDAKLQotLy8gRW5hYmxlcyBkZWJ1ZyBvdXRwdXQgZm9yIHBhcnNlciBwZXJmb3JtYW5jZS4KLSNkZWZpbmUgREVCVUdfUEFSU0VSX1BFUkZPUk1BTkNFIDAKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKiBXSElURVNQQUNFID0gIiBcdFxyIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBXSElURVNQQUNFX09SX1BST1BFUlRZX0RFTElNSVRFUiA9ICIgXHRccj0iOwotCi0KLS8vIC0tLSBQcm9wZXJ0eU1hcCAtLS0KLQotUHJvcGVydHlNYXA6OlByb3BlcnR5TWFwKCkgewotfQotCi1Qcm9wZXJ0eU1hcDo6flByb3BlcnR5TWFwKCkgewotfQotCi12b2lkIFByb3BlcnR5TWFwOjpjbGVhcigpIHsKLSAgICBtUHJvcGVydGllcy5jbGVhcigpOwotfQotCi12b2lkIFByb3BlcnR5TWFwOjphZGRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKSB7Ci0gICAgbVByb3BlcnRpZXMuYWRkKGtleSwgdmFsdWUpOwotfQotCi1ib29sIFByb3BlcnR5TWFwOjpoYXNQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByb3BlcnRpZXMuaW5kZXhPZktleShrZXkpID49IDA7Ci19Ci0KLWJvb2wgUHJvcGVydHlNYXA6OnRyeUdldFByb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSwgU3RyaW5nOCYgb3V0VmFsdWUpIGNvbnN0IHsKLSAgICBzc2l6ZV90IGluZGV4ID0gbVByb3BlcnRpZXMuaW5kZXhPZktleShrZXkpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG91dFZhbHVlID0gbVByb3BlcnRpZXMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUHJvcGVydHlNYXA6OnRyeUdldFByb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSwgYm9vbCYgb3V0VmFsdWUpIGNvbnN0IHsKLSAgICBpbnQzMl90IGludFZhbHVlOwotICAgIGlmICghdHJ5R2V0UHJvcGVydHkoa2V5LCBpbnRWYWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG91dFZhbHVlID0gaW50VmFsdWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUHJvcGVydHlNYXA6OnRyeUdldFByb3BlcnR5KGNvbnN0IFN0cmluZzgmIGtleSwgaW50MzJfdCYgb3V0VmFsdWUpIGNvbnN0IHsKLSAgICBTdHJpbmc4IHN0cmluZ1ZhbHVlOwotICAgIGlmICghIHRyeUdldFByb3BlcnR5KGtleSwgc3RyaW5nVmFsdWUpIHx8IHN0cmluZ1ZhbHVlLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIqIGVuZDsKLSAgICBpbnQgdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuc3RyaW5nKCksICYgZW5kLCAxMCk7Ci0gICAgaWYgKCplbmQgIT0gJ1wwJykgewotICAgICAgICBBTE9HVygiUHJvcGVydHkga2V5ICclcycgaGFzIGludmFsaWQgdmFsdWUgJyVzJy4gIEV4cGVjdGVkIGFuIGludGVnZXIuIiwKLSAgICAgICAgICAgICAgICBrZXkuc3RyaW5nKCksIHN0cmluZ1ZhbHVlLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBvdXRWYWx1ZSA9IHZhbHVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFByb3BlcnR5TWFwOjp0cnlHZXRQcm9wZXJ0eShjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiBvdXRWYWx1ZSkgY29uc3QgewotICAgIFN0cmluZzggc3RyaW5nVmFsdWU7Ci0gICAgaWYgKCEgdHJ5R2V0UHJvcGVydHkoa2V5LCBzdHJpbmdWYWx1ZSkgfHwgc3RyaW5nVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciogZW5kOwotICAgIGZsb2F0IHZhbHVlID0gc3RydG9mKHN0cmluZ1ZhbHVlLnN0cmluZygpLCAmIGVuZCk7Ci0gICAgaWYgKCplbmQgIT0gJ1wwJykgewotICAgICAgICBBTE9HVygiUHJvcGVydHkga2V5ICclcycgaGFzIGludmFsaWQgdmFsdWUgJyVzJy4gIEV4cGVjdGVkIGEgZmxvYXQuIiwKLSAgICAgICAgICAgICAgICBrZXkuc3RyaW5nKCksIHN0cmluZ1ZhbHVlLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBvdXRWYWx1ZSA9IHZhbHVlOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFByb3BlcnR5TWFwOjphZGRBbGwoY29uc3QgUHJvcGVydHlNYXAqIG1hcCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWFwLT5tUHJvcGVydGllcy5zaXplKCk7IGkrKykgewotICAgICAgICBtUHJvcGVydGllcy5hZGQobWFwLT5tUHJvcGVydGllcy5rZXlBdChpKSwgbWFwLT5tUHJvcGVydGllcy52YWx1ZUF0KGkpKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFByb3BlcnR5TWFwOjpsb2FkKGNvbnN0IFN0cmluZzgmIGZpbGVuYW1lLCBQcm9wZXJ0eU1hcCoqIG91dE1hcCkgewotICAgICpvdXRNYXAgPSBOVUxMOwotCi0gICAgVG9rZW5pemVyKiB0b2tlbml6ZXI7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVG9rZW5pemVyOjpvcGVuKGZpbGVuYW1lLCAmdG9rZW5pemVyKTsKLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvciAlZCBvcGVuaW5nIHByb3BlcnR5IGZpbGUgJXMuIiwgc3RhdHVzLCBmaWxlbmFtZS5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUHJvcGVydHlNYXAqIG1hcCA9IG5ldyBQcm9wZXJ0eU1hcCgpOwotICAgICAgICBpZiAoIW1hcCkgewotICAgICAgICAgICAgQUxPR0UoIkVycm9yIGFsbG9jYXRpbmcgcHJvcGVydHkgbWFwLiIpOwotICAgICAgICAgICAgc3RhdHVzID0gTk9fTUVNT1JZOwotICAgICAgICB9IGVsc2UgewotI2lmIERFQlVHX1BBUlNFUl9QRVJGT1JNQU5DRQotICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIFBhcnNlciBwYXJzZXIobWFwLCB0b2tlbml6ZXIpOwotICAgICAgICAgICAgc3RhdHVzID0gcGFyc2VyLnBhcnNlKCk7Ci0jaWYgREVCVUdfUEFSU0VSX1BFUkZPUk1BTkNFCi0gICAgICAgICAgICBuc2Vjc190IGVsYXBzZWRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpIC0gc3RhcnRUaW1lOwotICAgICAgICAgICAgQUxPR0QoIlBhcnNlZCBwcm9wZXJ0eSBmaWxlICclcycgJWQgbGluZXMgaW4gJTAuM2Ztcy4iLAotICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXItPmdldEZpbGVuYW1lKCkuc3RyaW5nKCksIHRva2VuaXplci0+Z2V0TGluZU51bWJlcigpLAotICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZSAvIDEwMDAwMDAuMCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChzdGF0dXMpIHsKLSAgICAgICAgICAgICAgICBkZWxldGUgbWFwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqb3V0TWFwID0gbWFwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSB0b2tlbml6ZXI7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotLy8gLS0tIFByb3BlcnR5TWFwOjpQYXJzZXIgLS0tCi0KLVByb3BlcnR5TWFwOjpQYXJzZXI6OlBhcnNlcihQcm9wZXJ0eU1hcCogbWFwLCBUb2tlbml6ZXIqIHRva2VuaXplcikgOgotICAgICAgICBtTWFwKG1hcCksIG1Ub2tlbml6ZXIodG9rZW5pemVyKSB7Ci19Ci0KLVByb3BlcnR5TWFwOjpQYXJzZXI6On5QYXJzZXIoKSB7Ci19Ci0KLXN0YXR1c190IFByb3BlcnR5TWFwOjpQYXJzZXI6OnBhcnNlKCkgewotICAgIHdoaWxlICghbVRva2VuaXplci0+aXNFb2YoKSkgewotI2lmIERFQlVHX1BBUlNFUgotICAgICAgICBBTE9HRCgiUGFyc2luZyAlczogJyVzJy4iLCBtVG9rZW5pemVyLT5nZXRMb2NhdGlvbigpLnN0cmluZygpLAotICAgICAgICAgICAgICAgIG1Ub2tlbml6ZXItPnBlZWtSZW1haW5kZXJPZkxpbmUoKS5zdHJpbmcoKSk7Ci0jZW5kaWYKLQotICAgICAgICBtVG9rZW5pemVyLT5za2lwRGVsaW1pdGVycyhXSElURVNQQUNFKTsKLQotICAgICAgICBpZiAoIW1Ub2tlbml6ZXItPmlzRW9sKCkgJiYgbVRva2VuaXplci0+cGVla0NoYXIoKSAhPSAnIycpIHsKLSAgICAgICAgICAgIFN0cmluZzgga2V5VG9rZW4gPSBtVG9rZW5pemVyLT5uZXh0VG9rZW4oV0hJVEVTUEFDRV9PUl9QUk9QRVJUWV9ERUxJTUlURVIpOwotICAgICAgICAgICAgaWYgKGtleVRva2VuLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXhwZWN0ZWQgbm9uLWVtcHR5IHByb3BlcnR5IGtleS4iLCBtVG9rZW5pemVyLT5nZXRMb2NhdGlvbigpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVG9rZW5pemVyLT5za2lwRGVsaW1pdGVycyhXSElURVNQQUNFKTsKLQotICAgICAgICAgICAgaWYgKG1Ub2tlbml6ZXItPm5leHRDaGFyKCkgIT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBFeHBlY3RlZCAnPScgYmV0d2VlbiBwcm9wZXJ0eSBrZXkgYW5kIHZhbHVlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5pemVyLT5nZXRMb2NhdGlvbigpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVG9rZW5pemVyLT5za2lwRGVsaW1pdGVycyhXSElURVNQQUNFKTsKLQotICAgICAgICAgICAgU3RyaW5nOCB2YWx1ZVRva2VuID0gbVRva2VuaXplci0+bmV4dFRva2VuKFdISVRFU1BBQ0UpOwotICAgICAgICAgICAgaWYgKHZhbHVlVG9rZW4uZmluZCgiXFwiLCAwKSA+PSAwIHx8IHZhbHVlVG9rZW4uZmluZCgiXCIiLCAwKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGb3VuZCByZXNlcnZlZCBjaGFyYWN0ZXIgJ1xcJyBvciAnXCInIGluIHByb3BlcnR5IHZhbHVlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5pemVyLT5nZXRMb2NhdGlvbigpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtVG9rZW5pemVyLT5za2lwRGVsaW1pdGVycyhXSElURVNQQUNFKTsKLSAgICAgICAgICAgIGlmICghbVRva2VuaXplci0+aXNFb2woKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXhwZWN0ZWQgZW5kIG9mIGxpbmUsIGdvdCAnJXMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5pemVyLT5nZXRMb2NhdGlvbigpLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRva2VuaXplci0+cGVla1JlbWFpbmRlck9mTGluZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobU1hcC0+aGFzUHJvcGVydHkoa2V5VG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBEdXBsaWNhdGUgcHJvcGVydHkgdmFsdWUgZm9yIGtleSAnJXMnLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVG9rZW5pemVyLT5nZXRMb2NhdGlvbigpLnN0cmluZygpLCBrZXlUb2tlbi5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbU1hcC0+YWRkUHJvcGVydHkoa2V5VG9rZW4sIHZhbHVlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgbVRva2VuaXplci0+bmV4dExpbmUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1JFQURNRSBiL2xpYnMvdXRpbHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTc0MWUwLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLUFuZHJvaWQgVXRpbGl0eSBGdW5jdGlvbiBMaWJyYXJ5Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0KLUlmIHlvdSBuZWVkIGEgZmVhdHVyZSB0aGF0IGlzIG5hdGl2ZSB0byBMaW51eCBidXQgbm90IHByZXNlbnQgb24gb3RoZXIKLXBsYXRmb3JtcywgY29uc3RydWN0IGEgcGxhdGZvcm0tZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIHRoYXQgc2hhcmVzCi10aGUgTGludXggaW50ZXJmYWNlLiAgVGhhdCB3YXkgdGhlIGFjdHVhbCBkZXZpY2UgcnVucyBhcyAibGlnaHQiIGFzCi1wb3NzaWJsZS4KLQotSWYgdGhhdCBpc24ndCBmZWFzaWJsZSwgY3JlYXRlIGEgc3lzdGVtLWluZGVwZW5kZW50IGludGVyZmFjZSBhbmQgaGlkZQotdGhlIGRldGFpbHMuCi0KLVRoZSB1bHRpbWF0ZSBnb2FsIGlzICpub3QqIHRvIGNyZWF0ZSBhIHN1cGVyLWR1cGVyIHBsYXRmb3JtIGFic3RyYWN0aW9uCi1sYXllci4gIFRoZSBnb2FsIGlzIHRvIHByb3ZpZGUgYW4gb3B0aW1pemVkIHNvbHV0aW9uIGZvciBMaW51eCB3aXRoCi1yZWFzb25hYmxlIGltcGxlbWVudGF0aW9ucyBmb3Igb3RoZXIgcGxhdGZvcm1zLgotCi0KLQotUmVzb3VyY2Ugb3ZlcmxheQotPT09PT09PT09PT09PT09PQotCi0KLUludHJvZHVjdGlvbgotLS0tLS0tLS0tLS0tCi0KLU92ZXJsYXkgcGFja2FnZXMgYXJlIHNwZWNpYWwgLmFwayBmaWxlcyB3aGljaCBwcm92aWRlIG5vIGNvZGUgYnV0Ci1hZGRpdGlvbmFsIHJlc291cmNlIHZhbHVlcyAoYW5kIHBvc3NpYmx5IG5ldyBjb25maWd1cmF0aW9ucykgZm9yCi1yZXNvdXJjZXMgaW4gb3RoZXIgcGFja2FnZXMuIFdoZW4gYW4gYXBwbGljYXRpb24gcmVxdWVzdHMgcmVzb3VyY2VzLAotdGhlIHN5c3RlbSB3aWxsIHJldHVybiB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGFwcGxpY2F0aW9uJ3Mgb3JpZ2luYWwKLXBhY2thZ2Ugb3IgYW55IGFzc29jaWF0ZWQgb3ZlcmxheSBwYWNrYWdlLiBBbnkgcmVkaXJlY3Rpb24gaXMgY29tcGxldGVseQotdHJhbnNwYXJlbnQgdG8gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uCi0KLVJlc291cmNlIHZhbHVlcyBoYXZlIHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZSB0YWJsZSwgbGlzdGVkIGluCi1kZXNjZW5kaW5nIHByZWNlZGVuY2UuCi0KLSAqIG92ZXJsYXkgcGFja2FnZSwgbWF0Y2hpbmcgY29uZmlnIChlZyByZXMvdmFsdWVzLWVuLWxhbmQpCi0KLSAqIG9yaWdpbmFsIHBhY2thZ2UsIG1hdGNoaW5nIGNvbmZpZwotCi0gKiBvdmVybGF5IHBhY2thZ2UsIG5vIGNvbmZpZyAoZWcgcmVzL3ZhbHVlcykKLQotICogb3JpZ2luYWwgcGFja2FnZSwgbm8gY29uZmlnCi0KLUR1cmluZyBjb21waWxhdGlvbiwgb3ZlcmxheSBwYWNrYWdlcyBhcmUgZGlmZmVyZW50aWF0ZWQgZnJvbSByZWd1bGFyCi1wYWNrYWdlcyBieSBwYXNzaW5nIHRoZSAtbyBmbGFnIHRvIGFhcHQuCi0KLQotQmFja2dyb3VuZAotLS0tLS0tLS0tLQotCi1UaGlzIHNlY3Rpb24gcHJvdmlkZXMgZ2VuZXJpYyBiYWNrZ3JvdW5kIG1hdGVyaWFsIG9uIHJlc291cmNlcyBpbgotQW5kcm9pZC4KLQotCi1Ib3cgcmVzb3VyY2VzIGFyZSBidW5kbGVkIGluIC5hcGsgZmlsZXMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotQW5kcm9pZCAuYXBrIGZpbGVzIGFyZSAuemlwIGZpbGVzLCB1c3VhbGx5IGhvdXNpbmcgLmRleCBjb2RlLAotY2VydGlmaWNhdGVzIGFuZCByZXNvdXJjZXMsIHRob3VnaCBwYWNrYWdlcyBjb250YWluaW5nIHJlc291cmNlcyBidXQKLW5vIGNvZGUgYXJlIHBvc3NpYmxlLiBSZXNvdXJjZXMgY2FuIGJlIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nCi1jYXRlZ29yaWVzOyBhIGBjb25maWd1cmF0aW9uJyBpbmRpY2F0ZXMgYSBzZXQgb2YgcGhvbmUgbGFuZ3VhZ2UsIGRpc3BsYXkKLWRlbnNpdHksIG5ldHdvcmsgb3BlcmF0b3IsIGV0Yy4KLQotICogYXNzZXRzOiB1bmNvbXByZXNzZWQsIHJhdyBmaWxlcyBwYWNrYWdlZCBhcyBwYXJ0IG9mIGFuIC5hcGsgYW5kCi0gICAgICAgICAgIGV4cGxpY2l0bHkgcmVmZXJlbmNlZCBieSBmaWxlbmFtZS4gVGhlc2UgZmlsZXMgYXJlCi0gICAgICAgICAgIGluZGVwZW5kZW50IG9mIGNvbmZpZ3VyYXRpb24uCi0KLSAqIHJlcy9kcmF3YWJsZTogYml0bWFwIG9yIHhtbCBncmFwaGljcy4gRWFjaCBmaWxlIG1heSBoYXZlIGRpZmZlcmVudAotICAgICAgICAgICAgICAgICB2YWx1ZXMgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24uCi0KLSAqIHJlcy92YWx1ZXM6IGludGVnZXJzLCBzdHJpbmdzLCBldGMuIEVhY2ggcmVzb3VyY2UgbWF5IGhhdmUgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICB2YWx1ZXMgZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24uCi0KLVJlc291cmNlIG1ldGEgaW5mb3JtYXRpb24gYW5kIGluZm9ybWF0aW9uIHByb3BlciBpcyBzdG9yZWQgaW4gYSBiaW5hcnkKLWZvcm1hdCBpbiBhIG5hbWVkIGZpbGUgcmVzb3VyY2VzLmFyc2MsIGJ1bmRsZWQgYXMgcGFydCBvZiB0aGUgLmFway4KLQotUmVzb3VyY2UgSURzIGFuZCBsb29rdXAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci1EdXJpbmcgY29tcGlsYXRpb24sIHRoZSBhYXB0IHRvb2wgZ2F0aGVycyBhcHBsaWNhdGlvbiByZXNvdXJjZXMgYW5kCi1nZW5lcmF0ZXMgYSByZXNvdXJjZXMuYXJzYyBmaWxlLiBFYWNoIHJlc291cmNlIG5hbWUgaXMgYXNzaWduZWQgYW4KLWludGVnZXIgSUQgMHhwcHR0aWlpICh0cmFuc2xhdGVkIHRvIGEgc3ltYm9saWMgbmFtZSB2aWEgUi5qYXZhKSwgd2hlcmUKLQotICogcHA6IGNvcnJlc3BvbmRzIHRvIHRoZSBwYWNrYWdlIG5hbWVzcGFjZSAoZGV0YWlscyBiZWxvdykuCi0KLSAqIHR0OiBjb3JyZXNwb25kcyB0byB0aGUgcmVzb3VyY2UgdHlwZSAoc3RyaW5nLCBpbnQsIGV0YykuIEV2ZXJ5Ci0gICAgICAgcmVzb3VyY2Ugb2YgdGhlIHNhbWUgdHlwZSB3aXRoaW4gdGhlIHNhbWUgcGFja2FnZSBoYXMgdGhlIHNhbWUKLSAgICAgICB0dCB2YWx1ZSwgYnV0IGRlcGVuZGluZyBvbiBhdmFpbGFibGUgdHlwZXMsIHRoZSBhY3R1YWwgbnVtZXJpY2FsCi0gICAgICAgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBiZXR3ZWVuIHBhY2thZ2VzLgotCi0gKiBpaWlpOiBzZXF1ZW50aWFsIG51bWJlciwgYXNzaWduZWQgaW4gdGhlIG9yZGVyIHJlc291cmNlcyBhcmUgZm91bmQuCi0KLVJlc291cmNlIHZhbHVlcyBhcmUgc3BlY2lmaWVkIHBhaXJlZCB3aXRoIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24KLWNvbnN0cmFpbnRzICh0aGUgZGVmYXVsdCBiZWluZyB0aGUgZW1wdHkgc2V0KSwgZWcgcmVzL3ZhbHVlcy1zdi1wb3J0Ci13aGljaCBpbXBvc2VzIHJlc3RyaWN0aW9ucyBvbiBsYW5ndWFnZSAoU3dlZGlzaCkgYW5kIGRpc3BsYXkgb3JpZW50YXRpb24KLShwb3J0cmFpdCkuIER1cmluZyBsb29rdXAsIGV2ZXJ5IGNvbnN0cmFpbnQgc2V0IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUKLWN1cnJlbnQgY29uZmlndXJhdGlvbiwgYW5kIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBiZXN0IG1hdGNoaW5nCi1jb25zdHJhaW50IHNldCBpcyByZXR1cm5lZCAoUmVzb3VyY2VUeXBlcy57aCxjcHB9KS4KLQotUGFyc2luZyBvZiByZXNvdXJjZXMuYXJzYyBpcyBoYW5kbGVkIGJ5IFJlc291cmNlVHlwZXMuY3BwOyB0aGlzIHV0aWxpdHkKLWlzIGdvdmVybmVkIGJ5IEFzc2V0TWFuYWdlci5jcHAsIHdoaWNoIHRyYWNrcyBsb2FkZWQgcmVzb3VyY2VzIHBlcgotcHJvY2Vzcy4KLQotQXNzZXRzIGFyZSBsb29rZWQgdXAgYnkgcGF0aCBhbmQgZmlsZW5hbWUgaW4gQXNzZXRNYW5hZ2VyLmNwcC4gVGhlIHBhdGgKLXRvIHJlc291cmNlcyBpbiByZXMvZHJhd2FibGUgYXJlIGxvY2F0ZWQgYnkgUmVzb3VyY2VUeXBlcy5jcHAgYW5kIHRoZW4KLWhhbmRsZWQgbGlrZSBhc3NldHMgYnkgQXNzZXRNYW5hZ2VyLmNwcC4gT3RoZXIgcmVzb3VyY2VzIGFyZSBoYW5kbGVkCi1zb2xlbHkgYnkgUmVzb3VyY2VUeXBlcy5jcHAuCi0KLVBhY2thZ2UgSUQgYXMgbmFtZXNwYWNlCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotVGhlIHBwIHBhcnQgb2YgYSByZXNvdXJjZSBJRCBkZWZpbmVzIGEgbmFtZXNwYWNlLiBBbmRyb2lkIGN1cnJlbnRseQotZGVmaW5lcyB0d28gbmFtZXNwYWNlczoKLQotICogMHgwMTogc3lzdGVtIHJlc291cmNlcyAocHJlLWluc3RhbGxlZCBpbiBmcmFtZXdvcmstcmVzLmFwaykKLQotICogMHg3ZjogYXBwbGljYXRpb24gcmVzb3VyY2VzIChidW5kbGVkIGluIHRoZSBhcHBsaWNhdGlvbiAuYXBrKQotCi1SZXNvdXJjZVR5cGVzLmNwcCBzdXBwb3J0cyBwYWNrYWdlIElEcyBiZXR3ZWVuIDB4MDEgYW5kIDB4N2YKLShpbmNsdXNpdmUpOyB2YWx1ZXMgb3V0c2lkZSB0aGlzIHJhbmdlIGFyZSBpbnZhbGlkLgotCi1FYWNoIHJ1bm5pbmcgKERhbHZpaykgcHJvY2VzcyBpcyBhc3NpZ25lZCBhIHVuaXF1ZSBpbnN0YW5jZSBvZgotQXNzZXRNYW5hZ2VyLCB3aGljaCBpbiB0dXJuIGtlZXBzIGEgZm9yZXN0IHN0cnVjdHVyZSBvZiBsb2FkZWQKLXJlc291cmNlLmFyc2MgZmlsZXMuIE5vcm1hbGx5LCB0aGlzIGZvcmVzdCBpcyBzdHJ1Y3R1cmVkIGFzIGZvbGxvd3MsCi13aGVyZSBtUGFja2FnZU1hcCBpcyB0aGUgaW50ZXJuYWwgdmVjdG9yIGVtcGxveWVkIGluIFJlc291cmNlVHlwZXMuY3BwLgotCi1tUGFja2FnZU1hcFsweDAwXSAtPiBzeXN0ZW0gcGFja2FnZQotbVBhY2thZ2VNYXBbMHgwMV0gLT4gTlVMTAotbVBhY2thZ2VNYXBbMHgwMl0gLT4gTlVMTAotLi4uCi1tUGFja2FnZU1hcFsweDdmIC0gMl0gLT4gTlVMTAotbVBhY2thZ2VNYXBbMHg3ZiAtIDFdIC0+IGFwcGxpY2F0aW9uIHBhY2thZ2UKLQotCi0KLVRoZSByZXNvdXJjZSBvdmVybGF5IGV4dGVuc2lvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSByZXNvdXJjZSBvdmVybGF5IG1lY2hhbmlzbSBhaW1zIHRvIChwYXJ0bHkpIHNoYWRvdyBhbmQgZXh0ZW5kCi1leGlzdGluZyByZXNvdXJjZXMgd2l0aCBuZXcgdmFsdWVzIGZvciBkZWZpbmVkIGFuZCBuZXcgY29uZmlndXJhdGlvbnMuCi1UZWNobmljYWxseSwgdGhpcyBpcyBhY2hpZXZlZCBieSBhZGRpbmcgcmVzb3VyY2Utb25seSBwYWNrYWdlcyAoY2FsbGVkCi1vdmVybGF5IHBhY2thZ2VzKSB0byBleGlzdGluZyByZXNvdXJjZSBuYW1lc3BhY2VzLCBsaWtlIHNvOgotCi1tUGFja2FnZU1hcFsweDAwXSAtPiBzeXN0ZW0gcGFja2FnZSAtPiBzeXN0ZW0gb3ZlcmxheSBwYWNrYWdlCi1tUGFja2FnZU1hcFsweDAxXSAtPiBOVUxMCi1tUGFja2FnZU1hcFsweDAyXSAtPiBOVUxMCi0uLi4KLW1QYWNrYWdlTWFwWzB4N2YgLSAyXSAtPiBOVUxMCi1tUGFja2FnZU1hcFsweDdmIC0gMV0gLT4gYXBwbGljYXRpb24gcGFja2FnZSAtPiBvdmVybGF5IDEgLT4gb3ZlcmxheSAyCi0KLVRoZSB1c2Ugb2Ygb3ZlcmxheSByZXNvdXJjZXMgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0bwotYXBwbGljYXRpb25zOyBubyBhZGRpdGlvbmFsIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBpbnRyb2R1Y2VkLCBvbmx5Ci1jb25maWd1cmF0aW9uL3ZhbHVlIHBhaXJzLiBBbnkgbnVtYmVyIG9mIG92ZXJsYXkgcGFja2FnZXMgbWF5IGJlIGxvYWRlZAotYXQgYSB0aW1lOyBvdmVybGF5IHBhY2thZ2VzIGFyZSBhZ25vc3RpYyB0byB3aGF0IHRoZXkgdGFyZ2V0IC0tIGJvdGgKLXN5c3RlbSBhbmQgYXBwbGljYXRpb24gcmVzb3VyY2VzIGFyZSBmYWlyIGdhbWUuCi0KLVRoZSBwYWNrYWdlIHRhcmdldGVkIGJ5IGFuIG92ZXJsYXkgcGFja2FnZSBpcyBjYWxsZWQgdGhlIHRhcmdldCBvcgotb3JpZ2luYWwgcGFja2FnZS4KLQotUmVzb3VyY2Ugb3ZlcmxheSBvcGVyYXRlcyBvbiBzeW1ib2xpYyByZXNvdXJjZXMgbmFtZXMuIEhlbmNlLCB0bwotb3ZlcnJpZGUgdGhlIHN0cmluZy9zdHIxIHJlc291cmNlcyBpbiBhIHBhY2thZ2UsIHRoZSBvdmVybGF5IHBhY2thZ2UKLXdvdWxkIGluY2x1ZGUgYSByZXNvdXJjZSBhbHNvIG5hbWVkIHN0cmluZy9zdHIxLiBUaGUgZW5kIHVzZXIgZG9lcyBub3QKLWhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIG51bWVyaWMgcmVzb3VyY2VzIElEcyBhc3NpZ25lZCBieSBhYXB0LCBhcyB0aGlzCi1pcyByZXNvbHZlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBzeXN0ZW0uCi0KLUFzIG9mIHRoaXMgd3JpdGluZywgdGhlIHVzZSBvZiByZXNvdXJjZSBvdmVybGF5IGhhcyBub3QgYmVlbiBmdWxseQotZXhwbG9yZWQuIFVudGlsIGl0IGhhcywgb25seSBPRU1zIGFyZSB0cnVzdGVkIHRvIHVzZSByZXNvdXJjZSBvdmVybGF5LgotRm9yIHRoaXMgcmVhc29uLCBvdmVybGF5IHBhY2thZ2VzIG11c3QgcmVzaWRlIGluIC9zeXN0ZW0vb3ZlcmxheS4KLQotCi1SZXNvdXJjZSBJRCBtYXBwaW5nCi1+fn5+fn5+fn5+fn5+fn5+fn5+Ci1SZXNvdXJjZSBpZGVudGlmaWVycyBtdXN0IGJlIGNvaGVyZW50IHdpdGhpbiB0aGUgc2FtZSBuYW1lc3BhY2UgKGllCi1QYWNrYWdlR3JvdXAgaW4gUmVzb3VyY2VUeXBlcy5jcHApLiBDYWxsaW5nIGFwcGxpY2F0aW9ucyB3aWxsIHJlZmVyIHRvCi1yZXNvdXJjZXMgdXNpbmcgdGhlIElEcyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hbCBwYWNrYWdlLCBidXQgdGhlcmUgaXMgbm8KLWd1YXJhbnRlZSBhYXB0IGhhcyBhc3NpZ25lZCB0aGUgc2FtZSBJRCB0byB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZSBpbgotYW4gb3ZlcmxheSBwYWNrYWdlLiBUbyB0cmFuc2xhdGUgYmV0d2VlbiB0aGUgdHdvLCBhIHJlc291cmNlIElEIG1hcHBpbmcKLXtvcmlnaW5hbCBJRCAtPiBvdmVybGF5IElEfSBpcyBjcmVhdGVkIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgotKFBhY2thZ2VNYW5hZ2VyU2VydmljZS5qYXZhKSBhbmQgdXNlZCBkdXJpbmcgcmVzb3VyY2UgbG9va3VwLiBUaGUKLW1hcHBpbmcgaXMgc3RvcmVkIGluIC9kYXRhL3Jlc291cmNlLWNhY2hlLCB3aXRoIGEgQGlkbWFwIGZpbGUgbmFtZQotc3VmZml4LgotCi1UaGUgaWRtYXAgZmlsZSBmb3JtYXQgaXMgZG9jdW1lbnRlZCBpbiBhIHNlcGFyYXRlIHNlY3Rpb24sIGJlbG93LgotCi0KLVBhY2thZ2UgbWFuYWdlbWVudAotfn5+fn5+fn5+fn5+fn5+fn5+Ci1QYWNrYWdlcyBhcmUgbWFuYWdlZCBieSB0aGUgUGFja2FnZU1hbmFnZXJTZXJ2aWNlLiBBZGRpdGlvbiBhbmQgcmVtb3ZhbAotb2YgcGFja2FnZXMgYXJlIG1vbml0b3JlZCB2aWEgdGhlIGlub3RpZnkgZnJhbWV3b3JrLCBleHBvc2VkIHZpYQotYW5kcm9pZC5vcy5GaWxlT2JzZXJ2ZXIuCi0KLUR1cmluZyBpbml0aWFsaXphdGlvbiBvZiBhIERhbHZpayBwcm9jZXNzLCBBY3Rpdml0eVRocmVhZC5qYXZhIHJlcXVlc3RzCi10aGUgcHJvY2VzcycgQXNzZXRNYW5hZ2VyIChieSBwcm94eSwgdmlhIEFzc2V0TWFuYWdlci5qYXZhIGFuZCBKTkkpCi10byBsb2FkIGEgbGlzdCBvZiBwYWNrYWdlcy4gVGhpcyBsaXN0IGluY2x1ZGVzIG92ZXJsYXkgcGFja2FnZXMsIGlmCi1wcmVzZW50LgotCi1XaGVuIGEgdGFyZ2V0IHBhY2thZ2Ugb3IgYSBjb3JyZXNwb25kaW5nIG92ZXJsYXkgcGFja2FnZSBpcyBpbnN0YWxsZWQsCi10aGUgdGFyZ2V0IHBhY2thZ2UncyBwcm9jZXNzIGlzIHN0b3BwZWQgYW5kIGEgbmV3IGlkbWFwIGlzIGdlbmVyYXRlZC4KLVRoaXMgaXMgc2ltaWxhciB0byBob3cgYXBwbGljYXRpb25zIGFyZSBzdG9wcGVkIHdoZW4gdGhlaXIgcGFja2FnZXMgYXJlCi11cGdyYWRlZC4KLQotCi1DcmVhdGluZyBvdmVybGF5IHBhY2thZ2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU92ZXJsYXkgcGFja2FnZXMgc2hvdWxkIGNvbnRhaW4gbm8gY29kZSwgZGVmaW5lIChzb21lKSByZXNvdXJjZXMgd2l0aAotdGhlIHNhbWUgdHlwZSBhbmQgbmFtZSBhcyBpbiB0aGUgb3JpZ2luYWwgcGFja2FnZSwgYW5kIGJlIGNvbXBpbGVkIHdpdGgKLXRoZSAtbyBmbGFnIHBhc3NlZCB0byBhYXB0LgotCi1UaGUgYWFwdCAtbyBmbGFnIGluc3RydWN0cyBhYXB0IHRvIGNyZWF0ZSBhbiBvdmVybGF5IHBhY2thZ2UuCi1UZWNobmljYWxseSwgdGhpcyBtZWFucyB0aGUgcGFja2FnZSB3aWxsIGJlIGFzc2lnbmVkIHBhY2thZ2UgaWQgMHgwMC4KLQotVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiBvdmVybGF5IHBhY2thZ2VzIG5hbWVzLCB0aG91Z2ggdGhlIG5hbWluZwotY29udmVudGlvbiA8b3JpZ2luYWwucGFja2FnZS5uYW1lPi5vdmVybGF5LjxuYW1lPiBpcyByZWNvbW1lbmRlZC4KLQotCi1FeGFtcGxlIG92ZXJsYXkgcGFja2FnZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotVG8gb3ZlcmxheSB0aGUgcmVzb3VyY2UgYm9vbC9iIGluIHBhY2thZ2UgY29tLmZvby5iYXIsIHRvIGJlIGFwcGxpZWQKLXdoZW4gdGhlIGRpc3BsYXkgaXMgaW4gbGFuZHNjYXBlIG1vZGUsIGNyZWF0ZSBhIG5ldyBwYWNrYWdlIHdpdGgKLW5vIHNvdXJjZSBjb2RlIGFuZCBhIHNpbmdsZSAueG1sIGZpbGUgdW5kZXIgcmVzL3ZhbHVlcy1sYW5kLCB3aXRoCi1hbiBlbnRyeSBmb3IgYm9vbC9iLiBDb21waWxlIHdpdGggYWFwdCAtbyBhbmQgcGxhY2UgdGhlIHJlc3VsdHMgaW4KLS9zeXN0ZW0vb3ZlcmxheSBieSBhZGRpbmcgdGhlIGZvbGxvd2luZyB0byBBbmRyb2lkLm1rOgotCi1MT0NBTF9BQVBUX0ZMQUdTIDo9IC1vIGNvbS5mb28uYmFyCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVQpL292ZXJsYXkKLQotCi1UaGUgSUQgbWFwIChpZG1hcCkgZmlsZSBmb3JtYXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgaWRtYXAgZm9ybWF0IGlzIGRlc2lnbmVkIGZvciBsb29rdXAgcGVyZm9ybWFuY2UuIEhvd2V2ZXIsIGxlYWRpbmcKLWFuZCB0cmFpbGluZyB1bmRlZmluZWQgb3ZlcmxheSB2YWx1ZXMgYXJlIGRpc2NhcmRlZCB0byByZWR1Y2UgdGhlIG1lbW9yeQotZm9vdHByaW50LgotCi0KLWlkbWFwIGdyYW1tYXIKLX5+fn5+fn5+fn5+fn4KLUFsbCBhdG9tcyAobmFtZXMgaW4gc3F1YXJlIGJyYWNrZXRzKSBhcmUgdWludDMyX3QgaW50ZWdlcnMuIFRoZQotaWRtYXAtbWFnaWMgY29uc3RhbnQgc3BlbGxzICJpZG1wIiBpbiBBU0NJSS4gT2Zmc2V0cyBhcmUgZ2l2ZW4gcmVsYXRpdmUKLXRvIHRoZSBkYXRhX2hlYWRlciwgbm90IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCi0KLW1hcCAgICAgICAgICA6PSBoZWFkZXIgZGF0YQotaGVhZGVyICAgICAgIDo9IGlkbWFwLW1hZ2ljIDxjcmMzMi1vcmlnaW5hbC1wa2c+IDxjcmMzMi1vdmVybGF5LXBrZz4KLWlkbWFwLW1hZ2ljICA6PSA8MHg3MDZkNjQ2OT4KLWRhdGEgICAgICAgICA6PSBkYXRhX2hlYWRlciB0eXBlX2Jsb2NrKwotZGF0YV9oZWFkZXIgIDo9IDxtPiBoZWFkZXJfYmxvY2t7bX0KLWhlYWRlcl9ibG9jayA6PSA8MD4gfCA8dHlwZV9ibG9ja19vZmZzZXQ+Ci10eXBlX2Jsb2NrICAgOj0gPG4+IDxpZF9vZmZzZXQ+IGVudHJ5e259Ci1lbnRyeSAgICAgICAgOj0gPHJlc291cmNlX2lkX2luX3RhcmdldF9wYWNrYWdlPgotCi0KLWlkbWFwIGV4YW1wbGUKLX5+fn5+fn5+fn5+fn4KLUdpdmVuIGEgcGFpciBvZiB0YXJnZXQgYW5kIG92ZXJsYXkgcGFja2FnZXMgd2l0aCBDUkMgc3VtcyAweDIxNmE4ZmUyCi1hbmQgMHg2YjliZWFlYywgZWFjaCBkZWZpbmluZyB0aGUgZm9sbG93aW5nIHJlc291cmNlcwotCi1OYW1lICAgICAgICAgIFRhcmdldCBwYWNrYWdlICBPdmVybGF5IHBhY2thZ2UKLXN0cmluZy9zdHIwICAgMHg3ZjAxMDAwMCAgICAgIC0KLXN0cmluZy9zdHIxICAgMHg3ZjAxMDAwMSAgICAgIDB4N2YwMTAwMDAKLXN0cmluZy9zdHIyICAgMHg3ZjAxMDAwMiAgICAgIC0KLXN0cmluZy9zdHIzICAgMHg3ZjAxMDAwMyAgICAgIDB4N2YwMTAwMDEKLXN0cmluZy9zdHI0ICAgMHg3ZjAxMDAwNCAgICAgIC0KLWJvb2wvYm9vbDAgICAgMHg3ZjAyMDAwMCAgICAgIC0KLWludGVnZXIvaW50MCAgMHg3ZjAzMDAwMCAgICAgIDB4N2YwMjAwMDAKLWludGVnZXIvaW50MSAgMHg3ZjAzMDAwMSAgICAgIC0KLQotdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgbWFwIGlzCi0KLTB4NzA2ZDY0NjkgMHgyMTZhOGZlMiAweDZiOWJlYWVjIDB4MDAwMDAwMDMgXAotMHgwMDAwMDAwNCAweDAwMDAwMDAwIDB4MDAwMDAwMDkgMHgwMDAwMDAwMyBcCi0weDAwMDAwMDAxIDB4N2YwMTAwMDAgMHgwMDAwMDAwMCAweDdmMDEwMDAxIFwKLTB4MDAwMDAwMDEgMHgwMDAwMDAwMCAweDdmMDIwMDAwCi0KLW9yLCBmb3JtYXR0ZWQgZGlmZmVyZW50bHkKLQotMHg3MDZkNjQ2OSAgIyBtYWdpYzogYWxsIGlkbWFwIGZpbGVzIGJlZ2luIHdpdGggdGhpcyBjb25zdGFudAotMHgyMTZhOGZlMiAgIyBDUkMzMiBvZiB0aGUgcmVzb3VyY2VzLmFyc2MgZmlsZSBpbiB0aGUgb3JpZ2luYWwgcGFja2FnZQotMHg2YjliZWFlYyAgIyBDUkMzMiBvZiB0aGUgcmVzb3VyY2VzLmFyc2MgZmlsZSBpbiB0aGUgb3ZlcmxheSBwYWNrYWdlCi0weDAwMDAwMDAzICAjIGhlYWRlcjsgdGhyZWUgdHlwZXMgKHN0cmluZywgYm9vbCwgaW50ZWdlcikgaW4gdGhlIHRhcmdldCBwYWNrYWdlCi0weDAwMDAwMDA0ICAjICAgaGVhZGVyX2Jsb2NrIGZvciB0eXBlIDAgKHN0cmluZykgaXMgbG9jYXRlZCBhdCBvZmZzZXQgNAotMHgwMDAwMDAwMCAgIyAgIG5vIGJvb2wgdHlwZSBleGlzdHMgaW4gb3ZlcmxheSBwYWNrYWdlIC0+IG5vIGhlYWRlcl9ibG9jawotMHgwMDAwMDAwOSAgIyAgIGhlYWRlcl9ibG9jayBmb3IgdHlwZSAyIChpbnRlZ2VyKSBpcyBsb2NhdGVkIGF0IG9mZnNldCA5Ci0weDAwMDAwMDAzICAjIGhlYWRlcl9ibG9jayBmb3Igc3RyaW5nOyBvdmVybGF5IElEcyBzcGFuIDMgZWxlbWVudHMKLTB4MDAwMDAwMDEgICMgICB0aGUgZmlyc3Qgc3RyaW5nIGluIHRhcmdldCBwYWNrYWdlIGlzIGVudHJ5IDEgPT0gb2Zmc2V0Ci0weDdmMDEwMDAwICAjICAgdGFyZ2V0IDB4N2YwMTAwMSAtPiBvdmVybGF5IDB4N2YwMTAwMDAKLTB4MDAwMDAwMDAgICMgICBzdHIyIG5vdCBkZWZpbmVkIGluIG92ZXJsYXkgcGFja2FnZQotMHg3ZjAxMDAwMSAgIyAgIHRhcmdldCAweDdmMDEwMDAzIC0+IG92ZXJsYXkgMHg3ZjAxMDAwMQotMHgwMDAwMDAwMSAgIyBoZWFkZXJfYmxvY2sgZm9yIGludGVnZXI7IG92ZXJsYXkgSURzIHNwYW4gMSBlbGVtZW50Ci0weDAwMDAwMDAwICAjICAgb2Zmc2V0ID09IDAKLTB4N2YwMjAwMDAgICMgICB0YXJnZXQgMHg3ZjAzMDAwMCAtPiBvdmVybGF5IDB4N2YwMjAwMDAKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvUmVmQmFzZS5jcHAgYi9saWJzL3V0aWxzL1JlZkJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODBhNzk1Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvUmVmQmFzZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiUmVmQmFzZSIKLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9UZXh0T3V0cHV0Lmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHR5cGVpbmZvPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotLy8gY29tcGlsZSB3aXRoIHJlZmNvdW50aW5nIGRlYnVnZ2luZyBlbmFibGVkCi0jZGVmaW5lIERFQlVHX1JFRlMgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBERUJVR19SRUZTX0ZBVEFMX1NBTklUWV9DSEVDS1MgIDAKLSNkZWZpbmUgREVCVUdfUkVGU19FTkFCTEVEX0JZX0RFRkFVTFQgICAxCi0jZGVmaW5lIERFQlVHX1JFRlNfQ0FMTFNUQUNLX0VOQUJMRUQgICAgMQotCi0vLyBsb2cgYWxsIHJlZmVyZW5jZSBjb3VudGluZyBvcGVyYXRpb25zCi0jZGVmaW5lIFBSSU5UX1JFRlMgICAgICAgICAgICAgICAgICAgICAgMAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0jZGVmaW5lIElOSVRJQUxfU1RST05HX1ZBTFVFICgxPDwyOCkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFJlZkJhc2U6OndlYWtyZWZfaW1wbCA6IHB1YmxpYyBSZWZCYXNlOjp3ZWFrcmVmX3R5cGUKLXsKLXB1YmxpYzoKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1TdHJvbmc7Ci0gICAgdm9sYXRpbGUgaW50MzJfdCAgICBtV2VhazsKLSAgICBSZWZCYXNlKiBjb25zdCAgICAgIG1CYXNlOwotICAgIHZvbGF0aWxlIGludDMyX3QgICAgbUZsYWdzOwotCi0jaWYgIURFQlVHX1JFRlMKLQotICAgIHdlYWtyZWZfaW1wbChSZWZCYXNlKiBiYXNlKQotICAgICAgICA6IG1TdHJvbmcoSU5JVElBTF9TVFJPTkdfVkFMVUUpCi0gICAgICAgICwgbVdlYWsoMCkKLSAgICAgICAgLCBtQmFzZShiYXNlKQotICAgICAgICAsIG1GbGFncygwKQotICAgIHsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFN0cm9uZ1JlZihjb25zdCB2b2lkKiAvKmlkKi8pIHsgfQotICAgIHZvaWQgcmVtb3ZlU3Ryb25nUmVmKGNvbnN0IHZvaWQqIC8qaWQqLykgeyB9Ci0gICAgdm9pZCByZW5hbWVTdHJvbmdSZWZJZChjb25zdCB2b2lkKiAvKm9sZF9pZCovLCBjb25zdCB2b2lkKiAvKm5ld19pZCovKSB7IH0KLSAgICB2b2lkIGFkZFdlYWtSZWYoY29uc3Qgdm9pZCogLyppZCovKSB7IH0KLSAgICB2b2lkIHJlbW92ZVdlYWtSZWYoY29uc3Qgdm9pZCogLyppZCovKSB7IH0KLSAgICB2b2lkIHJlbmFtZVdlYWtSZWZJZChjb25zdCB2b2lkKiAvKm9sZF9pZCovLCBjb25zdCB2b2lkKiAvKm5ld19pZCovKSB7IH0KLSAgICB2b2lkIHByaW50UmVmcygpIGNvbnN0IHsgfQotICAgIHZvaWQgdHJhY2tNZShib29sLCBib29sKSB7IH0KLQotI2Vsc2UKLQotICAgIHdlYWtyZWZfaW1wbChSZWZCYXNlKiBiYXNlKQotICAgICAgICA6IG1TdHJvbmcoSU5JVElBTF9TVFJPTkdfVkFMVUUpCi0gICAgICAgICwgbVdlYWsoMCkKLSAgICAgICAgLCBtQmFzZShiYXNlKQotICAgICAgICAsIG1GbGFncygwKQotICAgICAgICAsIG1TdHJvbmdSZWZzKE5VTEwpCi0gICAgICAgICwgbVdlYWtSZWZzKE5VTEwpCi0gICAgICAgICwgbVRyYWNrRW5hYmxlZCghIURFQlVHX1JFRlNfRU5BQkxFRF9CWV9ERUZBVUxUKQotICAgICAgICAsIG1SZXRhaW4oZmFsc2UpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB+d2Vha3JlZl9pbXBsKCkKLSAgICB7Ci0gICAgICAgIGJvb2wgZHVtcFN0YWNrID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVJldGFpbiAmJiBtU3Ryb25nUmVmcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkdW1wU3RhY2sgPSB0cnVlOwotI2lmIERFQlVHX1JFRlNfRkFUQUxfU0FOSVRZX0NIRUNLUwotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiU3Ryb25nIHJlZmVyZW5jZXMgcmVtYWluISIpOwotI2Vsc2UKLSAgICAgICAgICAgIEFMT0dFKCJTdHJvbmcgcmVmZXJlbmNlcyByZW1haW46Iik7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmcyA9IG1TdHJvbmdSZWZzOwotICAgICAgICAgICAgd2hpbGUgKHJlZnMpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGluYyA9IHJlZnMtPnJlZiA+PSAwID8gJysnIDogJy0nOwotICAgICAgICAgICAgICAgIEFMT0dEKCJcdCVjIElEICVwIChyZWYgJWQpOiIsIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAotICAgICAgICAgICAgICAgIHJlZnMtPnN0YWNrLmR1bXAoKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHJlZnMgPSByZWZzLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtUmV0YWluICYmIG1XZWFrUmVmcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkdW1wU3RhY2sgPSB0cnVlOwotI2lmIERFQlVHX1JFRlNfRkFUQUxfU0FOSVRZX0NIRUNLUwotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiV2VhayByZWZlcmVuY2VzIHJlbWFpbjoiKTsKLSNlbHNlCi0gICAgICAgICAgICBBTE9HRSgiV2VhayByZWZlcmVuY2VzIHJlbWFpbiEiKTsKLSNlbmRpZgotICAgICAgICAgICAgcmVmX2VudHJ5KiByZWZzID0gbVdlYWtSZWZzOwotICAgICAgICAgICAgd2hpbGUgKHJlZnMpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGluYyA9IHJlZnMtPnJlZiA+PSAwID8gJysnIDogJy0nOwotICAgICAgICAgICAgICAgIEFMT0dEKCJcdCVjIElEICVwIChyZWYgJWQpOiIsIGluYywgcmVmcy0+aWQsIHJlZnMtPnJlZik7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAotICAgICAgICAgICAgICAgIHJlZnMtPnN0YWNrLmR1bXAoKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHJlZnMgPSByZWZzLT5uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkdW1wU3RhY2spIHsKLSAgICAgICAgICAgIEFMT0dFKCJhYm92ZSBlcnJvcnMgYXQ6Iik7Ci0gICAgICAgICAgICBDYWxsU3RhY2sgc3RhY2s7Ci0gICAgICAgICAgICBzdGFjay51cGRhdGUoKTsKLSAgICAgICAgICAgIHN0YWNrLmR1bXAoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYWRkU3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKSB7Ci0gICAgICAgIC8vQUxPR0RfSUYobVRyYWNrRW5hYmxlZCwKLSAgICAgICAgLy8gICAgICAgICJhZGRTdHJvbmdSZWY6IFJlZkJhc2U9JXAsIGlkPSVwIiwgbUJhc2UsIGlkKTsKLSAgICAgICAgYWRkUmVmKCZtU3Ryb25nUmVmcywgaWQsIG1TdHJvbmcpOwotICAgIH0KLQotICAgIHZvaWQgcmVtb3ZlU3Ryb25nUmVmKGNvbnN0IHZvaWQqIGlkKSB7Ci0gICAgICAgIC8vQUxPR0RfSUYobVRyYWNrRW5hYmxlZCwKLSAgICAgICAgLy8gICAgICAgICJyZW1vdmVTdHJvbmdSZWY6IFJlZkJhc2U9JXAsIGlkPSVwIiwgbUJhc2UsIGlkKTsKLSAgICAgICAgaWYgKCFtUmV0YWluKSB7Ci0gICAgICAgICAgICByZW1vdmVSZWYoJm1TdHJvbmdSZWZzLCBpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhZGRSZWYoJm1TdHJvbmdSZWZzLCBpZCwgLW1TdHJvbmcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW5hbWVTdHJvbmdSZWZJZChjb25zdCB2b2lkKiBvbGRfaWQsIGNvbnN0IHZvaWQqIG5ld19pZCkgewotICAgICAgICAvL0FMT0dEX0lGKG1UcmFja0VuYWJsZWQsCi0gICAgICAgIC8vICAgICAgICAicmVuYW1lU3Ryb25nUmVmSWQ6IFJlZkJhc2U9JXAsIG9pZD0lcCwgbmlkPSVwIiwKLSAgICAgICAgLy8gICAgICAgIG1CYXNlLCBvbGRfaWQsIG5ld19pZCk7Ci0gICAgICAgIHJlbmFtZVJlZnNJZChtU3Ryb25nUmVmcywgb2xkX2lkLCBuZXdfaWQpOwotICAgIH0KLQotICAgIHZvaWQgYWRkV2Vha1JlZihjb25zdCB2b2lkKiBpZCkgewotICAgICAgICBhZGRSZWYoJm1XZWFrUmVmcywgaWQsIG1XZWFrKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlbW92ZVdlYWtSZWYoY29uc3Qgdm9pZCogaWQpIHsKLSAgICAgICAgaWYgKCFtUmV0YWluKSB7Ci0gICAgICAgICAgICByZW1vdmVSZWYoJm1XZWFrUmVmcywgaWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYWRkUmVmKCZtV2Vha1JlZnMsIGlkLCAtbVdlYWspOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCByZW5hbWVXZWFrUmVmSWQoY29uc3Qgdm9pZCogb2xkX2lkLCBjb25zdCB2b2lkKiBuZXdfaWQpIHsKLSAgICAgICAgcmVuYW1lUmVmc0lkKG1XZWFrUmVmcywgb2xkX2lkLCBuZXdfaWQpOwotICAgIH0KLQotICAgIHZvaWQgdHJhY2tNZShib29sIHRyYWNrLCBib29sIHJldGFpbikKLSAgICB7IAotICAgICAgICBtVHJhY2tFbmFibGVkID0gdHJhY2s7Ci0gICAgICAgIG1SZXRhaW4gPSByZXRhaW47Ci0gICAgfQotCi0gICAgdm9pZCBwcmludFJlZnMoKSBjb25zdAotICAgIHsKLSAgICAgICAgU3RyaW5nOCB0ZXh0OwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgICAgICAgICAgY2hhciBidWZbMTI4XTsKLSAgICAgICAgICAgIHNwcmludGYoYnVmLCAiU3Ryb25nIHJlZmVyZW5jZXMgb24gUmVmQmFzZSAlcCAod2Vha3JlZl90eXBlICVwKTpcbiIsIG1CYXNlLCB0aGlzKTsKLSAgICAgICAgICAgIHRleHQuYXBwZW5kKGJ1Zik7Ci0gICAgICAgICAgICBwcmludFJlZnNMb2NrZWQoJnRleHQsIG1TdHJvbmdSZWZzKTsKLSAgICAgICAgICAgIHNwcmludGYoYnVmLCAiV2VhayByZWZlcmVuY2VzIG9uIFJlZkJhc2UgJXAgKHdlYWtyZWZfdHlwZSAlcCk6XG4iLCBtQmFzZSwgdGhpcyk7Ci0gICAgICAgICAgICB0ZXh0LmFwcGVuZChidWYpOwotICAgICAgICAgICAgcHJpbnRSZWZzTG9ja2VkKCZ0ZXh0LCBtV2Vha1JlZnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgewotICAgICAgICAgICAgY2hhciBuYW1lWzEwMF07Ci0gICAgICAgICAgICBzbnByaW50ZihuYW1lLCAxMDAsICIvZGF0YS8lcC5zdGFjayIsIHRoaXMpOwotICAgICAgICAgICAgaW50IHJjID0gb3BlbihuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQpOwotICAgICAgICAgICAgaWYgKHJjID49IDApIHsKLSAgICAgICAgICAgICAgICB3cml0ZShyYywgdGV4dC5zdHJpbmcoKSwgdGV4dC5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgY2xvc2UocmMpOwotICAgICAgICAgICAgICAgIEFMT0dEKCJTVEFDSyBUUkFDRSBmb3IgJXAgc2F2ZWQgaW4gJXMiLCB0aGlzLCBuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgQUxPR0UoIkZBSUxFRCBUTyBQUklOVCBTVEFDSyBUUkFDRSBmb3IgJXAgaW4gJXM6ICVzIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0cnVjdCByZWZfZW50cnkKLSAgICB7Ci0gICAgICAgIHJlZl9lbnRyeSogbmV4dDsKLSAgICAgICAgY29uc3Qgdm9pZCogaWQ7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAotICAgICAgICBDYWxsU3RhY2sgc3RhY2s7Ci0jZW5kaWYKLSAgICAgICAgaW50MzJfdCByZWY7Ci0gICAgfTsKLQotICAgIHZvaWQgYWRkUmVmKHJlZl9lbnRyeSoqIHJlZnMsIGNvbnN0IHZvaWQqIGlkLCBpbnQzMl90IG1SZWYpCi0gICAgewotICAgICAgICBpZiAobVRyYWNrRW5hYmxlZCkgewotICAgICAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0KLSAgICAgICAgICAgIHJlZl9lbnRyeSogcmVmID0gbmV3IHJlZl9lbnRyeTsKLSAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBjb3VudCBhdCB0aGUgdGltZSBvZiB0aGUgc25hcHNob3QsIGJ1dCBiZWZvcmUgdGhlCi0gICAgICAgICAgICAvLyB1cGRhdGUuICBQb3NpdGl2ZSB2YWx1ZSBtZWFucyB3ZSBpbmNyZW1lbnQsIG5lZ2F0aXZlLS13ZQotICAgICAgICAgICAgLy8gZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQuCi0gICAgICAgICAgICByZWYtPnJlZiA9IG1SZWY7Ci0gICAgICAgICAgICByZWYtPmlkID0gaWQ7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAotICAgICAgICAgICAgcmVmLT5zdGFjay51cGRhdGUoMik7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJlZi0+bmV4dCA9ICpyZWZzOwotICAgICAgICAgICAgKnJlZnMgPSByZWY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJlbW92ZVJlZihyZWZfZW50cnkqKiByZWZzLCBjb25zdCB2b2lkKiBpZCkKLSAgICB7Ci0gICAgICAgIGlmIChtVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVmX2VudHJ5KiBjb25zdCBoZWFkID0gKnJlZnM7Ci0gICAgICAgICAgICByZWZfZW50cnkqIHJlZiA9IGhlYWQ7Ci0gICAgICAgICAgICB3aGlsZSAocmVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVmLT5pZCA9PSBpZCkgewotICAgICAgICAgICAgICAgICAgICAqcmVmcyA9IHJlZi0+bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlZjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWZzID0gJnJlZi0+bmV4dDsKLSAgICAgICAgICAgICAgICByZWYgPSAqcmVmczsKLSAgICAgICAgICAgIH0KLQotI2lmIERFQlVHX1JFRlNfRkFUQUxfU0FOSVRZX0NIRUNLUwotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiUmVmQmFzZTogcmVtb3ZpbmcgaWQgJXAgb24gUmVmQmFzZSAlcCIKLSAgICAgICAgICAgICAgICAgICAgIih3ZWFrcmVmX3R5cGUgJXApIHRoYXQgZG9lc24ndCBleGlzdCEiLAotICAgICAgICAgICAgICAgICAgICBpZCwgbUJhc2UsIHRoaXMpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIEFMT0dFKCJSZWZCYXNlOiByZW1vdmluZyBpZCAlcCBvbiBSZWZCYXNlICVwIgotICAgICAgICAgICAgICAgICAgICAiKHdlYWtyZWZfdHlwZSAlcCkgdGhhdCBkb2Vzbid0IGV4aXN0ISIsCi0gICAgICAgICAgICAgICAgICAgIGlkLCBtQmFzZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgIHJlZiA9IGhlYWQ7Ci0gICAgICAgICAgICB3aGlsZSAocmVmKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBpbmMgPSByZWYtPnJlZiA+PSAwID8gJysnIDogJy0nOwotICAgICAgICAgICAgICAgIEFMT0dEKCJcdCVjIElEICVwIChyZWYgJWQpOiIsIGluYywgcmVmLT5pZCwgcmVmLT5yZWYpOwotICAgICAgICAgICAgICAgIHJlZiA9IHJlZi0+bmV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2FsbFN0YWNrIHN0YWNrOwotICAgICAgICAgICAgc3RhY2sudXBkYXRlKCk7Ci0gICAgICAgICAgICBzdGFjay5kdW1wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJlbmFtZVJlZnNJZChyZWZfZW50cnkqIHIsIGNvbnN0IHZvaWQqIG9sZF9pZCwgY29uc3Qgdm9pZCogbmV3X2lkKQotICAgIHsKLSAgICAgICAgaWYgKG1UcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgICAgICAgICAgcmVmX2VudHJ5KiByZWYgPSByOwotICAgICAgICAgICAgd2hpbGUgKHJlZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlZi0+aWQgPT0gb2xkX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZi0+aWQgPSBuZXdfaWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlZiA9IHJlZi0+bmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcHJpbnRSZWZzTG9ja2VkKFN0cmluZzgqIG91dCwgY29uc3QgcmVmX2VudHJ5KiByZWZzKSBjb25zdAotICAgIHsKLSAgICAgICAgY2hhciBidWZbMTI4XTsKLSAgICAgICAgd2hpbGUgKHJlZnMpIHsKLSAgICAgICAgICAgIGNoYXIgaW5jID0gcmVmcy0+cmVmID49IDAgPyAnKycgOiAnLSc7Ci0gICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIlx0JWMgSUQgJXAgKHJlZiAlZCk6XG4iLCAKLSAgICAgICAgICAgICAgICAgICAgaW5jLCByZWZzLT5pZCwgcmVmcy0+cmVmKTsKLSAgICAgICAgICAgIG91dC0+YXBwZW5kKGJ1Zik7Ci0jaWYgREVCVUdfUkVGU19DQUxMU1RBQ0tfRU5BQkxFRAotICAgICAgICAgICAgb3V0LT5hcHBlbmQocmVmcy0+c3RhY2sudG9TdHJpbmcoIlx0XHQiKSk7Ci0jZWxzZQotICAgICAgICAgICAgb3V0LT5hcHBlbmQoIlx0XHQoY2FsbCBzdGFja3MgZGlzYWJsZWQpIik7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJlZnMgPSByZWZzLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbXV0YWJsZSBNdXRleCBtTXV0ZXg7Ci0gICAgcmVmX2VudHJ5KiBtU3Ryb25nUmVmczsKLSAgICByZWZfZW50cnkqIG1XZWFrUmVmczsKLQotICAgIGJvb2wgbVRyYWNrRW5hYmxlZDsKLSAgICAvLyBDb2xsZWN0IHN0YWNrIHRyYWNlcyBvbiBhZGRyZWYgYW5kIHJlbW92ZXJlZiwgaW5zdGVhZCBvZiBkZWxldGluZyB0aGUgc3RhY2sgcmVmZXJlbmNlcwotICAgIC8vIG9uIHJlbW92ZXJlZiB0aGF0IG1hdGNoIHRoZSBhZGRyZXNzIG9uZXMuCi0gICAgYm9vbCBtUmV0YWluOwotCi0jZW5kaWYKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFJlZkJhc2U6OmluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QKLXsKLSAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IHJlZnMgPSBtUmVmczsKLSAgICByZWZzLT5pbmNXZWFrKGlkKTsKLSAgICAKLSAgICByZWZzLT5hZGRTdHJvbmdSZWYoaWQpOwotICAgIGNvbnN0IGludDMyX3QgYyA9IGFuZHJvaWRfYXRvbWljX2luYygmcmVmcy0+bVN0cm9uZyk7Ci0gICAgQUxPR19BU1NFUlQoYyA+IDAsICJpbmNTdHJvbmcoKSBjYWxsZWQgb24gJXAgYWZ0ZXIgbGFzdCBzdHJvbmcgcmVmIiwgcmVmcyk7Ci0jaWYgUFJJTlRfUkVGUwotICAgIEFMT0dEKCJpbmNTdHJvbmcgb2YgJXAgZnJvbSAlcDogY250PSVkXG4iLCB0aGlzLCBpZCwgYyk7Ci0jZW5kaWYKLSAgICBpZiAoYyAhPSBJTklUSUFMX1NUUk9OR19WQUxVRSkgIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFuZHJvaWRfYXRvbWljX2FkZCgtSU5JVElBTF9TVFJPTkdfVkFMVUUsICZyZWZzLT5tU3Ryb25nKTsKLSAgICByZWZzLT5tQmFzZS0+b25GaXJzdFJlZigpOwotfQotCi12b2lkIFJlZkJhc2U6OmRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QKLXsKLSAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IHJlZnMgPSBtUmVmczsKLSAgICByZWZzLT5yZW1vdmVTdHJvbmdSZWYoaWQpOwotICAgIGNvbnN0IGludDMyX3QgYyA9IGFuZHJvaWRfYXRvbWljX2RlYygmcmVmcy0+bVN0cm9uZyk7Ci0jaWYgUFJJTlRfUkVGUwotICAgIEFMT0dEKCJkZWNTdHJvbmcgb2YgJXAgZnJvbSAlcDogY250PSVkXG4iLCB0aGlzLCBpZCwgYyk7Ci0jZW5kaWYKLSAgICBBTE9HX0FTU0VSVChjID49IDEsICJkZWNTdHJvbmcoKSBjYWxsZWQgb24gJXAgdG9vIG1hbnkgdGltZXMiLCByZWZzKTsKLSAgICBpZiAoYyA9PSAxKSB7Ci0gICAgICAgIHJlZnMtPm1CYXNlLT5vbkxhc3RTdHJvbmdSZWYoaWQpOwotICAgICAgICBpZiAoKHJlZnMtPm1GbGFncyZPQkpFQ1RfTElGRVRJTUVfTUFTSykgPT0gT0JKRUNUX0xJRkVUSU1FX1NUUk9ORykgewotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmVmcy0+ZGVjV2VhayhpZCk7Ci19Ci0KLXZvaWQgUmVmQmFzZTo6Zm9yY2VJbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0Ci17Ci0gICAgd2Vha3JlZl9pbXBsKiBjb25zdCByZWZzID0gbVJlZnM7Ci0gICAgcmVmcy0+aW5jV2VhayhpZCk7Ci0gICAgCi0gICAgcmVmcy0+YWRkU3Ryb25nUmVmKGlkKTsKLSAgICBjb25zdCBpbnQzMl90IGMgPSBhbmRyb2lkX2F0b21pY19pbmMoJnJlZnMtPm1TdHJvbmcpOwotICAgIEFMT0dfQVNTRVJUKGMgPj0gMCwgImZvcmNlSW5jU3Ryb25nIGNhbGxlZCBvbiAlcCBhZnRlciByZWYgY291bnQgdW5kZXJmbG93IiwKLSAgICAgICAgICAgICAgIHJlZnMpOwotI2lmIFBSSU5UX1JFRlMKLSAgICBBTE9HRCgiZm9yY2VJbmNTdHJvbmcgb2YgJXAgZnJvbSAlcDogY250PSVkXG4iLCB0aGlzLCBpZCwgYyk7Ci0jZW5kaWYKLQotICAgIHN3aXRjaCAoYykgewotICAgIGNhc2UgSU5JVElBTF9TVFJPTkdfVkFMVUU6Ci0gICAgICAgIGFuZHJvaWRfYXRvbWljX2FkZCgtSU5JVElBTF9TVFJPTkdfVkFMVUUsICZyZWZzLT5tU3Ryb25nKTsKLSAgICAgICAgLy8gZmFsbCB0aHJvdWdoLi4uCi0gICAgY2FzZSAwOgotICAgICAgICByZWZzLT5tQmFzZS0+b25GaXJzdFJlZigpOwotICAgIH0KLX0KLQotaW50MzJfdCBSZWZCYXNlOjpnZXRTdHJvbmdDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1SZWZzLT5tU3Ryb25nOwotfQotCi1SZWZCYXNlKiBSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OnJlZkJhc2UoKSBjb25zdAotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCB3ZWFrcmVmX2ltcGwqPih0aGlzKS0+bUJhc2U7Ci19Ci0KLXZvaWQgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjppbmNXZWFrKGNvbnN0IHZvaWQqIGlkKQotewotICAgIHdlYWtyZWZfaW1wbCogY29uc3QgaW1wbCA9IHN0YXRpY19jYXN0PHdlYWtyZWZfaW1wbCo+KHRoaXMpOwotICAgIGltcGwtPmFkZFdlYWtSZWYoaWQpOwotICAgIGNvbnN0IGludDMyX3QgYyA9IGFuZHJvaWRfYXRvbWljX2luYygmaW1wbC0+bVdlYWspOwotICAgIEFMT0dfQVNTRVJUKGMgPj0gMCwgImluY1dlYWsgY2FsbGVkIG9uICVwIGFmdGVyIGxhc3Qgd2VhayByZWYiLCB0aGlzKTsKLX0KLQotCi12b2lkIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6ZGVjV2Vhayhjb25zdCB2b2lkKiBpZCkKLXsKLSAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IGltcGwgPSBzdGF0aWNfY2FzdDx3ZWFrcmVmX2ltcGwqPih0aGlzKTsKLSAgICBpbXBsLT5yZW1vdmVXZWFrUmVmKGlkKTsKLSAgICBjb25zdCBpbnQzMl90IGMgPSBhbmRyb2lkX2F0b21pY19kZWMoJmltcGwtPm1XZWFrKTsKLSAgICBBTE9HX0FTU0VSVChjID49IDEsICJkZWNXZWFrIGNhbGxlZCBvbiAlcCB0b28gbWFueSB0aW1lcyIsIHRoaXMpOwotICAgIGlmIChjICE9IDEpIHJldHVybjsKLQotICAgIGlmICgoaW1wbC0+bUZsYWdzJk9CSkVDVF9MSUZFVElNRV9XRUFLKSA9PSBPQkpFQ1RfTElGRVRJTUVfU1RST05HKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdGhlIHJlZ3VsYXIgbGlmZXRpbWUgY2FzZS4gVGhlIG9iamVjdCBpcyBkZXN0cm95ZWQKLSAgICAgICAgLy8gd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIGdvZXMgYXdheS4gU2luY2Ugd2Vha3JlZl9pbXBsCi0gICAgICAgIC8vIG91dGxpdmUgdGhlIG9iamVjdCwgaXQgaXMgbm90IGRlc3Ryb3llZCBpbiB0aGUgZHRvciwgYW5kCi0gICAgICAgIC8vIHdlJ2xsIGhhdmUgdG8gZG8gaXQgaGVyZS4KLSAgICAgICAgaWYgKGltcGwtPm1TdHJvbmcgPT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZTogd2UgbmV2ZXIgaGFkIGEgc3Ryb25nIHJlZmVyZW5jZSwgc28gd2UgbmVlZCB0bwotICAgICAgICAgICAgLy8gZGVzdHJveSB0aGUgb2JqZWN0IG5vdy4KLSAgICAgICAgICAgIGRlbGV0ZSBpbXBsLT5tQmFzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEFMT0dWKCJGcmVlaW5nIHJlZnMgJXAgb2Ygb2xkIFJlZkJhc2UgJXBcbiIsIHRoaXMsIGltcGwtPm1CYXNlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBpbXBsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbGVzcyBjb21tb24gY2FzZTogbGlmZXRpbWUgaXMgT0JKRUNUX0xJRkVUSU1FX3tXRUFLfEZPUkVWRVJ9Ci0gICAgICAgIGltcGwtPm1CYXNlLT5vbkxhc3RXZWFrUmVmKGlkKTsKLSAgICAgICAgaWYgKChpbXBsLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX01BU0spID09IE9CSkVDVF9MSUZFVElNRV9XRUFLKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBPQkpFQ1RfTElGRVRJTUVfV0VBSyBjYXNlLiBUaGUgbGFzdCB3ZWFrLXJlZmVyZW5jZQotICAgICAgICAgICAgLy8gaXMgZ29uZSwgd2UgY2FuIGRlc3Ryb3kgdGhlIG9iamVjdC4KLSAgICAgICAgICAgIGRlbGV0ZSBpbXBsLT5tQmFzZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBSZWZCYXNlOjp3ZWFrcmVmX3R5cGU6OmF0dGVtcHRJbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpCi17Ci0gICAgaW5jV2VhayhpZCk7Ci0gICAgCi0gICAgd2Vha3JlZl9pbXBsKiBjb25zdCBpbXBsID0gc3RhdGljX2Nhc3Q8d2Vha3JlZl9pbXBsKj4odGhpcyk7Ci0gICAgCi0gICAgaW50MzJfdCBjdXJDb3VudCA9IGltcGwtPm1TdHJvbmc7Ci0gICAgQUxPR19BU1NFUlQoY3VyQ291bnQgPj0gMCwgImF0dGVtcHRJbmNTdHJvbmcgY2FsbGVkIG9uICVwIGFmdGVyIHVuZGVyZmxvdyIsCi0gICAgICAgICAgICAgICB0aGlzKTsKLSAgICB3aGlsZSAoY3VyQ291bnQgPiAwICYmIGN1ckNvdW50ICE9IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7Ci0gICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19jbXB4Y2hnKGN1ckNvdW50LCBjdXJDb3VudCsxLCAmaW1wbC0+bVN0cm9uZykgPT0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyQ291bnQgPSBpbXBsLT5tU3Ryb25nOwotICAgIH0KLSAgICAKLSAgICBpZiAoY3VyQ291bnQgPD0gMCB8fCBjdXJDb3VudCA9PSBJTklUSUFMX1NUUk9OR19WQUxVRSkgewotICAgICAgICBib29sIGFsbG93OwotICAgICAgICBpZiAoY3VyQ291bnQgPT0gSU5JVElBTF9TVFJPTkdfVkFMVUUpIHsKLSAgICAgICAgICAgIC8vIEF0dGVtcHRpbmcgdG8gYWNxdWlyZSBmaXJzdCBzdHJvbmcgcmVmZXJlbmNlLi4uICB0aGlzIGlzIGFsbG93ZWQKLSAgICAgICAgICAgIC8vIGlmIHRoZSBvYmplY3QgZG9lcyBOT1QgaGF2ZSBhIGxvbmdlciBsaWZldGltZSAobWVhbmluZyB0aGUKLSAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgbmVlZCB0byBzZWUgdGhpcyksIG9yIGlmIHRoZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgLy8gYWxsb3dzIGl0IHRvIGhhcHBlbi4KLSAgICAgICAgICAgIGFsbG93ID0gKGltcGwtPm1GbGFncyZPQkpFQ1RfTElGRVRJTUVfV0VBSykgIT0gT0JKRUNUX0xJRkVUSU1FX1dFQUsKLSAgICAgICAgICAgICAgICAgIHx8IGltcGwtPm1CYXNlLT5vbkluY1N0cm9uZ0F0dGVtcHRlZChGSVJTVF9JTkNfU1RST05HLCBpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBdHRlbXB0aW5nIHRvIHJldml2ZSB0aGUgb2JqZWN0Li4uICB0aGlzIGlzIGFsbG93ZWQKLSAgICAgICAgICAgIC8vIGlmIHRoZSBvYmplY3QgRE9FUyBoYXZlIGEgbG9uZ2VyIGxpZmV0aW1lIChzbyB3ZSBjYW4gc2FmZWx5Ci0gICAgICAgICAgICAvLyBjYWxsIHRoZSBvYmplY3Qgd2l0aCBvbmx5IGEgd2VhayByZWYpIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIC8vIGFsbG93cyBpdCB0byBoYXBwZW4uCi0gICAgICAgICAgICBhbGxvdyA9IChpbXBsLT5tRmxhZ3MmT0JKRUNUX0xJRkVUSU1FX1dFQUspID09IE9CSkVDVF9MSUZFVElNRV9XRUFLCi0gICAgICAgICAgICAgICAgICAmJiBpbXBsLT5tQmFzZS0+b25JbmNTdHJvbmdBdHRlbXB0ZWQoRklSU1RfSU5DX1NUUk9ORywgaWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYWxsb3cpIHsKLSAgICAgICAgICAgIGRlY1dlYWsoaWQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGN1ckNvdW50ID0gYW5kcm9pZF9hdG9taWNfaW5jKCZpbXBsLT5tU3Ryb25nKTsKLQotICAgICAgICAvLyBJZiB0aGUgc3Ryb25nIHJlZmVyZW5jZSBjb3VudCBoYXMgYWxyZWFkeSBiZWVuIGluY3JlbWVudGVkIGJ5Ci0gICAgICAgIC8vIHNvbWVvbmUgZWxzZSwgdGhlIGltcGxlbWVudG9yIG9mIG9uSW5jU3Ryb25nQXR0ZW1wdGVkKCkgaXMgaG9sZGluZwotICAgICAgICAvLyBhbiB1bm5lZWRlZCByZWZlcmVuY2UuICBTbyBjYWxsIG9uTGFzdFN0cm9uZ1JlZigpIGhlcmUgdG8gcmVtb3ZlIGl0LgotICAgICAgICAvLyAoTm8sIHRoaXMgaXMgbm90IHByZXR0eS4pICBOb3RlIHRoYXQgd2UgTVVTVCBOT1QgZG8gdGhpcyBpZiB3ZQotICAgICAgICAvLyBhcmUgaW4gZmFjdCBhY3F1aXJpbmcgdGhlIGZpcnN0IHJlZmVyZW5jZS4KLSAgICAgICAgaWYgKGN1ckNvdW50ID4gMCAmJiBjdXJDb3VudCA8IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7Ci0gICAgICAgICAgICBpbXBsLT5tQmFzZS0+b25MYXN0U3Ryb25nUmVmKGlkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpbXBsLT5hZGRTdHJvbmdSZWYoaWQpOwotCi0jaWYgUFJJTlRfUkVGUwotICAgIEFMT0dEKCJhdHRlbXB0SW5jU3Ryb25nIG9mICVwIGZyb20gJXA6IGNudD0lZFxuIiwgdGhpcywgaWQsIGN1ckNvdW50KTsKLSNlbmRpZgotCi0gICAgaWYgKGN1ckNvdW50ID09IElOSVRJQUxfU1RST05HX1ZBTFVFKSB7Ci0gICAgICAgIGFuZHJvaWRfYXRvbWljX2FkZCgtSU5JVElBTF9TVFJPTkdfVkFMVUUsICZpbXBsLT5tU3Ryb25nKTsKLSAgICAgICAgaW1wbC0+bUJhc2UtPm9uRmlyc3RSZWYoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjphdHRlbXB0SW5jV2Vhayhjb25zdCB2b2lkKiBpZCkKLXsKLSAgICB3ZWFrcmVmX2ltcGwqIGNvbnN0IGltcGwgPSBzdGF0aWNfY2FzdDx3ZWFrcmVmX2ltcGwqPih0aGlzKTsKLQotICAgIGludDMyX3QgY3VyQ291bnQgPSBpbXBsLT5tV2VhazsKLSAgICBBTE9HX0FTU0VSVChjdXJDb3VudCA+PSAwLCAiYXR0ZW1wdEluY1dlYWsgY2FsbGVkIG9uICVwIGFmdGVyIHVuZGVyZmxvdyIsCi0gICAgICAgICAgICAgICB0aGlzKTsKLSAgICB3aGlsZSAoY3VyQ291bnQgPiAwKSB7Ci0gICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19jbXB4Y2hnKGN1ckNvdW50LCBjdXJDb3VudCsxLCAmaW1wbC0+bVdlYWspID09IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ckNvdW50ID0gaW1wbC0+bVdlYWs7Ci0gICAgfQotCi0gICAgaWYgKGN1ckNvdW50ID4gMCkgewotICAgICAgICBpbXBsLT5hZGRXZWFrUmVmKGlkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY3VyQ291bnQgPiAwOwotfQotCi1pbnQzMl90IFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6Z2V0V2Vha0NvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3Qgd2Vha3JlZl9pbXBsKj4odGhpcyktPm1XZWFrOwotfQotCi12b2lkIFJlZkJhc2U6OndlYWtyZWZfdHlwZTo6cHJpbnRSZWZzKCkgY29uc3QKLXsKLSAgICBzdGF0aWNfY2FzdDxjb25zdCB3ZWFrcmVmX2ltcGwqPih0aGlzKS0+cHJpbnRSZWZzKCk7Ci19Ci0KLXZvaWQgUmVmQmFzZTo6d2Vha3JlZl90eXBlOjp0cmFja01lKGJvb2wgZW5hYmxlLCBib29sIHJldGFpbikKLXsKLSAgICBzdGF0aWNfY2FzdDx3ZWFrcmVmX2ltcGwqPih0aGlzKS0+dHJhY2tNZShlbmFibGUsIHJldGFpbik7Ci19Ci0KLVJlZkJhc2U6OndlYWtyZWZfdHlwZSogUmVmQmFzZTo6Y3JlYXRlV2Vhayhjb25zdCB2b2lkKiBpZCkgY29uc3QKLXsKLSAgICBtUmVmcy0+aW5jV2VhayhpZCk7Ci0gICAgcmV0dXJuIG1SZWZzOwotfQotCi1SZWZCYXNlOjp3ZWFrcmVmX3R5cGUqIFJlZkJhc2U6OmdldFdlYWtSZWZzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVJlZnM7Ci19Ci0KLVJlZkJhc2U6OlJlZkJhc2UoKQotICAgIDogbVJlZnMobmV3IHdlYWtyZWZfaW1wbCh0aGlzKSkKLXsKLX0KLQotUmVmQmFzZTo6flJlZkJhc2UoKQotewotICAgIGlmIChtUmVmcy0+bVN0cm9uZyA9PSBJTklUSUFMX1NUUk9OR19WQUxVRSkgewotICAgICAgICAvLyB3ZSBuZXZlciBhY3F1aXJlZCBhIHN0cm9uZyAoYW5kL29yIHdlYWspIHJlZmVyZW5jZSBvbiB0aGlzIG9iamVjdC4KLSAgICAgICAgZGVsZXRlIG1SZWZzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGxpZmUtdGltZSBvZiB0aGlzIG9iamVjdCBpcyBleHRlbmRlZCB0byBXRUFLIG9yIEZPUkVWRVIsIGluCi0gICAgICAgIC8vIHdoaWNoIGNhc2Ugd2Vha3JlZl9pbXBsIGRvZXNuJ3Qgb3V0LWxpdmUgdGhlIG9iamVjdCBhbmQgd2UKLSAgICAgICAgLy8gY2FuIGZyZWUgaXQgbm93LgotICAgICAgICBpZiAoKG1SZWZzLT5tRmxhZ3MgJiBPQkpFQ1RfTElGRVRJTUVfTUFTSykgIT0gT0JKRUNUX0xJRkVUSU1FX1NUUk9ORykgewotICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoZSB3ZWFrIGNvdW50IGlzIG5vdCAwIGlmIHRoZSBvYmplY3QKLSAgICAgICAgICAgIC8vIHJlLWFjcXVpcmVkIGEgd2VhayByZWZlcmVuY2UgaW4gaXRzIGRlc3RydWN0b3IKLSAgICAgICAgICAgIGlmIChtUmVmcy0+bVdlYWsgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlbGV0ZSBtUmVmczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBjbGVhciB0aGlzLgotICAgIGNvbnN0X2Nhc3Q8d2Vha3JlZl9pbXBsKiY+KG1SZWZzKSA9IE5VTEw7Ci19Ci0KLXZvaWQgUmVmQmFzZTo6ZXh0ZW5kT2JqZWN0TGlmZXRpbWUoaW50MzJfdCBtb2RlKQotewotICAgIGFuZHJvaWRfYXRvbWljX29yKG1vZGUsICZtUmVmcy0+bUZsYWdzKTsKLX0KLQotdm9pZCBSZWZCYXNlOjpvbkZpcnN0UmVmKCkKLXsKLX0KLQotdm9pZCBSZWZCYXNlOjpvbkxhc3RTdHJvbmdSZWYoY29uc3Qgdm9pZCogLyppZCovKQotewotfQotCi1ib29sIFJlZkJhc2U6Om9uSW5jU3Ryb25nQXR0ZW1wdGVkKHVpbnQzMl90IGZsYWdzLCBjb25zdCB2b2lkKiBpZCkKLXsKLSAgICByZXR1cm4gKGZsYWdzJkZJUlNUX0lOQ19TVFJPTkcpID8gdHJ1ZSA6IGZhbHNlOwotfQotCi12b2lkIFJlZkJhc2U6Om9uTGFzdFdlYWtSZWYoY29uc3Qgdm9pZCogLyppZCovKQotewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBSZWZCYXNlOjptb3ZlUmVmZXJlbmNlcyh2b2lkKiBkc3QsIHZvaWQgY29uc3QqIHNyYywgc2l6ZV90IG4sCi0gICAgICAgIGNvbnN0IFJlZmVyZW5jZUNvbnZlcnRlckJhc2UmIGNhc3RlcikKLXsKLSNpZiBERUJVR19SRUZTCi0gICAgY29uc3Qgc2l6ZV90IGl0ZW1TaXplID0gY2FzdGVyLmdldFJlZmVyZW5jZVR5cGVTaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIHZvaWQqICAgICAgIGQgPSByZWludGVycHJldF9jYXN0PHZvaWQgICAgICAqPihpbnRwdHJfdChkc3QpICsgaSppdGVtU2l6ZSk7Ci0gICAgICAgIHZvaWQgY29uc3QqIHMgPSByZWludGVycHJldF9jYXN0PHZvaWQgY29uc3QqPihpbnRwdHJfdChzcmMpICsgaSppdGVtU2l6ZSk7Ci0gICAgICAgIFJlZkJhc2UqIHJlZihyZWludGVycHJldF9jYXN0PFJlZkJhc2UqPihjYXN0ZXIuZ2V0UmVmZXJlbmNlQmFzZShkKSkpOwotICAgICAgICByZWYtPm1SZWZzLT5yZW5hbWVTdHJvbmdSZWZJZChzLCBkKTsKLSAgICAgICAgcmVmLT5tUmVmcy0+cmVuYW1lV2Vha1JlZklkKHMsIGQpOwotICAgIH0KLSNlbmRpZgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGV4dE91dHB1dCYgcHJpbnRTdHJvbmdQb2ludGVyKFRleHRPdXRwdXQmIHRvLCBjb25zdCB2b2lkKiB2YWwpCi17Ci0gICAgdG8gPDwgInNwPD4oIiA8PCB2YWwgPDwgIikiOwotICAgIHJldHVybiB0bzsKLX0KLQotVGV4dE91dHB1dCYgcHJpbnRXZWFrUG9pbnRlcihUZXh0T3V0cHV0JiB0bywgY29uc3Qgdm9pZCogdmFsKQotewotICAgIHRvIDw8ICJ3cDw+KCIgPDwgdmFsIDw8ICIpIjsKLSAgICByZXR1cm4gdG87Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvU2hhcmVkQnVmZmVyLmNwcCBiL2xpYnMvdXRpbHMvU2hhcmVkQnVmZmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU1NWZiNy4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1NoYXJlZEJ1ZmZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1NoYXJlZEJ1ZmZlci5oPgotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TaGFyZWRCdWZmZXIqIFNoYXJlZEJ1ZmZlcjo6YWxsb2Moc2l6ZV90IHNpemUpCi17Ci0gICAgU2hhcmVkQnVmZmVyKiBzYiA9IHN0YXRpY19jYXN0PFNoYXJlZEJ1ZmZlciAqPihtYWxsb2Moc2l6ZW9mKFNoYXJlZEJ1ZmZlcikgKyBzaXplKSk7Ci0gICAgaWYgKHNiKSB7Ci0gICAgICAgIHNiLT5tUmVmcyA9IDE7Ci0gICAgICAgIHNiLT5tU2l6ZSA9IHNpemU7Ci0gICAgfQotICAgIHJldHVybiBzYjsKLX0KLQotCi1zc2l6ZV90IFNoYXJlZEJ1ZmZlcjo6ZGVhbGxvYyhjb25zdCBTaGFyZWRCdWZmZXIqIHJlbGVhc2VkKQotewotICAgIGlmIChyZWxlYXNlZC0+bVJlZnMgIT0gMCkgcmV0dXJuIC0xOyAvLyBYWFg6IGludmFsaWQgb3BlcmF0aW9uCi0gICAgZnJlZShjb25zdF9jYXN0PFNoYXJlZEJ1ZmZlcio+KHJlbGVhc2VkKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVNoYXJlZEJ1ZmZlciogU2hhcmVkQnVmZmVyOjplZGl0KCkgY29uc3QKLXsKLSAgICBpZiAob25seU93bmVyKCkpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2hhcmVkQnVmZmVyKj4odGhpcyk7Ci0gICAgfQotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBhbGxvYyhtU2l6ZSk7Ci0gICAgaWYgKHNiKSB7Ci0gICAgICAgIG1lbWNweShzYi0+ZGF0YSgpLCBkYXRhKCksIHNpemUoKSk7Ci0gICAgICAgIHJlbGVhc2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNiOyAgICAKLX0KLQotU2hhcmVkQnVmZmVyKiBTaGFyZWRCdWZmZXI6OmVkaXRSZXNpemUoc2l6ZV90IG5ld1NpemUpIGNvbnN0Ci17Ci0gICAgaWYgKG9ubHlPd25lcigpKSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gY29uc3RfY2FzdDxTaGFyZWRCdWZmZXIqPih0aGlzKTsKLSAgICAgICAgaWYgKGJ1Zi0+bVNpemUgPT0gbmV3U2l6ZSkgcmV0dXJuIGJ1ZjsKLSAgICAgICAgYnVmID0gKFNoYXJlZEJ1ZmZlciopcmVhbGxvYyhidWYsIHNpemVvZihTaGFyZWRCdWZmZXIpICsgbmV3U2l6ZSk7Ci0gICAgICAgIGlmIChidWYgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmLT5tU2l6ZSA9IG5ld1NpemU7Ci0gICAgICAgICAgICByZXR1cm4gYnVmOwotICAgICAgICB9Ci0gICAgfQotICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBhbGxvYyhuZXdTaXplKTsKLSAgICBpZiAoc2IpIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IG15U2l6ZSA9IG1TaXplOwotICAgICAgICBtZW1jcHkoc2ItPmRhdGEoKSwgZGF0YSgpLCBuZXdTaXplIDwgbXlTaXplID8gbmV3U2l6ZSA6IG15U2l6ZSk7Ci0gICAgICAgIHJlbGVhc2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNiOyAgICAKLX0KLQotU2hhcmVkQnVmZmVyKiBTaGFyZWRCdWZmZXI6OmF0dGVtcHRFZGl0KCkgY29uc3QKLXsKLSAgICBpZiAob25seU93bmVyKCkpIHsKLSAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2hhcmVkQnVmZmVyKj4odGhpcyk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1TaGFyZWRCdWZmZXIqIFNoYXJlZEJ1ZmZlcjo6cmVzZXQoc2l6ZV90IG5ld19zaXplKSBjb25zdAotewotICAgIC8vIGNoZWFwLW8tcmVzZXQuCi0gICAgU2hhcmVkQnVmZmVyKiBzYiA9IGFsbG9jKG5ld19zaXplKTsKLSAgICBpZiAoc2IpIHsKLSAgICAgICAgcmVsZWFzZSgpOwotICAgIH0KLSAgICByZXR1cm4gc2I7Ci19Ci0KLXZvaWQgU2hhcmVkQnVmZmVyOjphY3F1aXJlKCkgY29uc3QgewotICAgIGFuZHJvaWRfYXRvbWljX2luYygmbVJlZnMpOwotfQotCi1pbnQzMl90IFNoYXJlZEJ1ZmZlcjo6cmVsZWFzZSh1aW50MzJfdCBmbGFncykgY29uc3QKLXsKLSAgICBpbnQzMl90IHByZXYgPSAxOwotICAgIGlmIChvbmx5T3duZXIoKSB8fCAoKHByZXYgPSBhbmRyb2lkX2F0b21pY19kZWMoJm1SZWZzKSkgPT0gMSkpIHsKLSAgICAgICAgbVJlZnMgPSAwOwotICAgICAgICBpZiAoKGZsYWdzICYgZUtlZXBTdG9yYWdlKSA9PSAwKSB7Ci0gICAgICAgICAgICBmcmVlKGNvbnN0X2Nhc3Q8U2hhcmVkQnVmZmVyKj4odGhpcykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcmV2OwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1N0YXRpYy5jcHAgYi9saWJzL3V0aWxzL1N0YXRpYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNGU5MTcuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9TdGF0aWMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEFsbCBzdGF0aWMgdmFyaWFibGVzIGdvIGhlcmUsIHRvIGNvbnRyb2wgaW5pdGlhbGl6YXRpb24gYW5kCi0vLyBkZXN0cnVjdGlvbiBvcmRlciBpbiB0aGUgbGlicmFyeS4KLQotI2luY2x1ZGUgPHByaXZhdGUvdXRpbHMvU3RhdGljLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9CdWZmZXJlZFRleHRPdXRwdXQuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBMaWJVdGlsc0ZpcnN0U3RhdGljcwotewotcHVibGljOgotICAgIExpYlV0aWxzRmlyc3RTdGF0aWNzKCkKLSAgICB7Ci0gICAgICAgIGluaXRpYWxpemVfc3RyaW5nOCgpOwotICAgICAgICBpbml0aWFsaXplX3N0cmluZzE2KCk7Ci0gICAgfQotICAgIAotICAgIH5MaWJVdGlsc0ZpcnN0U3RhdGljcygpCi0gICAgewotICAgICAgICB0ZXJtaW5hdGVfc3RyaW5nMTYoKTsKLSAgICAgICAgdGVybWluYXRlX3N0cmluZzgoKTsKLSAgICB9Ci19OwotCi1zdGF0aWMgTGliVXRpbHNGaXJzdFN0YXRpY3MgZ0ZpcnN0U3RhdGljczsKLWludCBnRGFyd2luQ2FudExvYWRBbGxPYmplY3RzID0gMTsKLQotLy8gLS0tLS0tLS0tLS0tIFRleHQgb3V0cHV0IHN0cmVhbXMKLQotVmVjdG9yPGludDMyX3Q+IGdUZXh0QnVmZmVyczsKLQotY2xhc3MgTG9nVGV4dE91dHB1dCA6IHB1YmxpYyBCdWZmZXJlZFRleHRPdXRwdXQKLXsKLXB1YmxpYzoKLSAgICBMb2dUZXh0T3V0cHV0KCkgOiBCdWZmZXJlZFRleHRPdXRwdXQoTVVMVElUSFJFQURFRCkgeyB9Ci0gICAgdmlydHVhbCB+TG9nVGV4dE91dHB1dCgpIHsgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVMaW5lcyhjb25zdCBzdHJ1Y3QgaW92ZWMmIHZlYywgc2l6ZV90IE4pCi0gICAgewotICAgICAgICAvL2FuZHJvaWRfd3JpdGV2TG9nKCZ2ZWMsIE4pOyAgICAgICA8LS0gdGhpcyBpcyBub3cgYSBuby1vcAotICAgICAgICBpZiAoTiAhPSAxKSBBTE9HSSgiV0FSTklORzogd3JpdGVMaW5lcyBOPSV6dVxuIiwgTik7Ci0gICAgICAgIEFMT0dJKCIlLipzIiwgKGludCl2ZWMuaW92X2xlbiwgKGNvbnN0IGNoYXIqKSB2ZWMuaW92X2Jhc2UpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotfTsKLQotY2xhc3MgRmRUZXh0T3V0cHV0IDogcHVibGljIEJ1ZmZlcmVkVGV4dE91dHB1dAotewotcHVibGljOgotICAgIEZkVGV4dE91dHB1dChpbnQgZmQpIDogQnVmZmVyZWRUZXh0T3V0cHV0KE1VTFRJVEhSRUFERUQpLCBtRkQoZmQpIHsgfQotICAgIHZpcnR1YWwgfkZkVGV4dE91dHB1dCgpIHsgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGVMaW5lcyhjb25zdCBzdHJ1Y3QgaW92ZWMmIHZlYywgc2l6ZV90IE4pCi0gICAgewotICAgICAgICB3cml0ZXYobUZELCAmdmVjLCBOKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBpbnQgbUZEOwotfTsKLQotc3RhdGljIExvZ1RleHRPdXRwdXQgZ0xvZ1RleHRPdXRwdXQ7Ci1zdGF0aWMgRmRUZXh0T3V0cHV0IGdTdGRvdXRUZXh0T3V0cHV0KFNURE9VVF9GSUxFTk8pOwotc3RhdGljIEZkVGV4dE91dHB1dCBnU3RkZXJyVGV4dE91dHB1dChTVERFUlJfRklMRU5PKTsKLQotVGV4dE91dHB1dCYgYWxvZyhnTG9nVGV4dE91dHB1dCk7Ci1UZXh0T3V0cHV0JiBhb3V0KGdTdGRvdXRUZXh0T3V0cHV0KTsKLVRleHRPdXRwdXQmIGFlcnIoZ1N0ZGVyclRleHRPdXRwdXQpOwotCi19ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvU3RvcFdhdGNoLmNwcCBiL2xpYnMvdXRpbHMvU3RvcFdhdGNoLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3MDhkNjIuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9TdG9wV2F0Y2guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RvcFdhdGNoIgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogZm9yIFBSSWQ2NCAqLwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUyAxCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi1TdG9wV2F0Y2g6OlN0b3BXYXRjaChjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvY2ssIHVpbnQzMl90IGZsYWdzKQotICAgIDogICBtTmFtZShuYW1lKSwgbUNsb2NrKGNsb2NrKSwgbUZsYWdzKGZsYWdzKQotewotICAgIHJlc2V0KCk7Ci19Ci0KLVN0b3BXYXRjaDo6flN0b3BXYXRjaCgpCi17Ci0gICAgbnNlY3NfdCBlbGFwc2VkID0gZWxhcHNlZFRpbWUoKTsKLSAgICBjb25zdCBpbnQgbiA9IG1OdW1MYXBzOwotICAgIEFMT0dEKCJTdG9wV2F0Y2ggJXMgKHVzKTogJSIgUFJJZDY0ICIgIiwgbU5hbWUsIG5zMnVzKGVsYXBzZWQpKTsKLSAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgY29uc3QgbnNlY3NfdCBzb0ZhciA9IG1MYXBzW2ldLnNvRmFyOwotICAgICAgICBjb25zdCBuc2Vjc190IHRoaXNMYXAgPSBtTGFwc1tpXS50aGlzTGFwOwotICAgICAgICBBTE9HRCgiIFslZDogJSIgUFJJZDY0ICIsICUiIFBSSWQ2NCwgaSwgbnMydXMoc29GYXIpLCBuczJ1cyh0aGlzTGFwKSk7Ci0gICAgfQotfQotCi1jb25zdCBjaGFyKiBTdG9wV2F0Y2g6Om5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBtTmFtZTsKLX0KLQotbnNlY3NfdCBTdG9wV2F0Y2g6OmxhcCgpCi17Ci0gICAgbnNlY3NfdCBlbGFwc2VkID0gZWxhcHNlZFRpbWUoKTsKLSAgICBpZiAobU51bUxhcHMgPj0gOCkgewotICAgICAgICBlbGFwc2VkID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBpbnQgbiA9IG1OdW1MYXBzOwotICAgICAgICBtTGFwc1tuXS5zb0ZhciAgID0gZWxhcHNlZDsKLSAgICAgICAgbUxhcHNbbl0udGhpc0xhcCA9IG4gPyAoZWxhcHNlZCAtIG1MYXBzW24tMV0uc29GYXIpIDogZWxhcHNlZDsKLSAgICAgICAgbU51bUxhcHMgPSBuKzE7Ci0gICAgfQotICAgIHJldHVybiBlbGFwc2VkOwotfQotCi1uc2Vjc190IFN0b3BXYXRjaDo6ZWxhcHNlZFRpbWUoKSBjb25zdAotewotICAgIHJldHVybiBzeXN0ZW1UaW1lKG1DbG9jaykgLSBtU3RhcnRUaW1lOwotfQotCi12b2lkIFN0b3BXYXRjaDo6cmVzZXQoKQotewotICAgIG1OdW1MYXBzID0gMDsKLSAgICBtU3RhcnRUaW1lID0gc3lzdGVtVGltZShtQ2xvY2spOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9TdHJpbmcxNi5jcHAgYi9saWJzL3V0aWxzL1N0cmluZzE2LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlMDcyZi4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1N0cmluZzE2LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvdXRpbHMvU3RhdGljLmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgU2hhcmVkQnVmZmVyKiBnRW1wdHlTdHJpbmdCdWYgPSBOVUxMOwotc3RhdGljIGNoYXIxNl90KiBnRW1wdHlTdHJpbmcgPSBOVUxMOwotCi1zdGF0aWMgaW5saW5lIGNoYXIxNl90KiBnZXRFbXB0eVN0cmluZygpCi17Ci0gICAgZ0VtcHR5U3RyaW5nQnVmLT5hY3F1aXJlKCk7Ci0gICByZXR1cm4gZ0VtcHR5U3RyaW5nOwotfQotCi12b2lkIGluaXRpYWxpemVfc3RyaW5nMTYoKQotewotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjphbGxvYyhzaXplb2YoY2hhcjE2X3QpKTsKLSAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAqc3RyID0gMDsKLSAgICBnRW1wdHlTdHJpbmdCdWYgPSBidWY7Ci0gICAgZ0VtcHR5U3RyaW5nID0gc3RyOwotfQotCi12b2lkIHRlcm1pbmF0ZV9zdHJpbmcxNigpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShnRW1wdHlTdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgZ0VtcHR5U3RyaW5nQnVmID0gTlVMTDsKLSAgICBnRW1wdHlTdHJpbmcgPSBOVUxMOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGNoYXIxNl90KiBhbGxvY0Zyb21VVEY4KGNvbnN0IGNoYXIqIHU4c3RyLCBzaXplX3QgdThsZW4pCi17Ci0gICAgaWYgKHU4bGVuID09IDApIHJldHVybiBnZXRFbXB0eVN0cmluZygpOwotCi0gICAgY29uc3QgdWludDhfdCogdThjdXIgPSAoY29uc3QgdWludDhfdCopIHU4c3RyOwotCi0gICAgY29uc3Qgc3NpemVfdCB1MTZsZW4gPSB1dGY4X3RvX3V0ZjE2X2xlbmd0aCh1OGN1ciwgdThsZW4pOwotICAgIGlmICh1MTZsZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBnZXRFbXB0eVN0cmluZygpOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHU4ZW5kID0gdThjdXIgKyB1OGxlbjsKLQotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjphbGxvYyhzaXplb2YoY2hhcjE2X3QpKih1MTZsZW4rMSkpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgdThjdXIgPSAoY29uc3QgdWludDhfdCopIHU4c3RyOwotICAgICAgICBjaGFyMTZfdCogdTE2c3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLQotICAgICAgICB1dGY4X3RvX3V0ZjE2KHU4Y3VyLCB1OGxlbiwgdTE2c3RyKTsKLQotICAgICAgICAvL3ByaW50ZigiQ3JlYXRlZCBVVEYtMTYgc3RyaW5nIGZyb20gVVRGLTggXCIlc1wiOiIsIGluKTsKLSAgICAgICAgLy9wcmludEhleERhdGEoMSwgc3RyLCBidWYtPnNpemUoKSwgMTYsIDEpOwotICAgICAgICAvL3ByaW50ZigiXG4iKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiB1MTZzdHI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TdHJpbmcxNjo6U3RyaW5nMTYoKQotICAgIDogbVN0cmluZyhnZXRFbXB0eVN0cmluZygpKQotewotfQotCi1TdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgU3RyaW5nMTYmIG8pCi0gICAgOiBtU3RyaW5nKG8ubVN0cmluZykKLXsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5hY3F1aXJlKCk7Ci19Ci0KLVN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBTdHJpbmcxNiYgbywgc2l6ZV90IGxlbiwgc2l6ZV90IGJlZ2luKQotICAgIDogbVN0cmluZyhnZXRFbXB0eVN0cmluZygpKQotewotICAgIHNldFRvKG8sIGxlbiwgYmVnaW4pOwotfQotCi1TdHJpbmcxNjo6U3RyaW5nMTYoY29uc3QgY2hhcjE2X3QqIG8pCi17Ci0gICAgc2l6ZV90IGxlbiA9IHN0cmxlbjE2KG8pOwotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjphbGxvYygobGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgIEFMT0dfQVNTRVJUKGJ1ZiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzaGFyZWQgYnVmZmVyIik7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAgICAgc3RyY3B5MTYoc3RyLCBvKTsKLSAgICAgICAgbVN0cmluZyA9IHN0cjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLX0KLQotU3RyaW5nMTY6OlN0cmluZzE2KGNvbnN0IGNoYXIxNl90KiBvLCBzaXplX3QgbGVuKQotewotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjphbGxvYygobGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgIEFMT0dfQVNTRVJUKGJ1ZiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzaGFyZWQgYnVmZmVyIik7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAgICAgbWVtY3B5KHN0ciwgbywgbGVuKnNpemVvZihjaGFyMTZfdCkpOwotICAgICAgICBzdHJbbGVuXSA9IDA7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci19Ci0KLVN0cmluZzE2OjpTdHJpbmcxNihjb25zdCBTdHJpbmc4JiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8uc3RyaW5nKCksIG8uc2l6ZSgpKSkKLXsKLX0KLQotU3RyaW5nMTY6OlN0cmluZzE2KGNvbnN0IGNoYXIqIG8pCi0gICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjgobywgc3RybGVuKG8pKSkKLXsKLX0KLQotU3RyaW5nMTY6OlN0cmluZzE2KGNvbnN0IGNoYXIqIG8sIHNpemVfdCBsZW4pCi0gICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjgobywgbGVuKSkKLXsKLX0KLQotU3RyaW5nMTY6On5TdHJpbmcxNigpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotfQotCi12b2lkIFN0cmluZzE2OjpzZXRUbyhjb25zdCBTdHJpbmcxNiYgb3RoZXIpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShvdGhlci5tU3RyaW5nKS0+YWNxdWlyZSgpOwotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICBtU3RyaW5nID0gb3RoZXIubVN0cmluZzsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6OnNldFRvKGNvbnN0IFN0cmluZzE2JiBvdGhlciwgc2l6ZV90IGxlbiwgc2l6ZV90IGJlZ2luKQotewotICAgIGNvbnN0IHNpemVfdCBOID0gb3RoZXIuc2l6ZSgpOwotICAgIGlmIChiZWdpbiA+PSBOKSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICAgICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgaWYgKChiZWdpbitsZW4pID4gTikgbGVuID0gTi1iZWdpbjsKLSAgICBpZiAoYmVnaW4gPT0gMCAmJiBsZW4gPT0gTikgewotICAgICAgICBzZXRUbyhvdGhlcik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoJm90aGVyID09IHRoaXMpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiTm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNldFRvKG90aGVyLnN0cmluZygpK2JlZ2luLCBsZW4pOwotfQotCi1zdGF0dXNfdCBTdHJpbmcxNjo6c2V0VG8oY29uc3QgY2hhcjE2X3QqIG90aGVyKQotewotICAgIHJldHVybiBzZXRUbyhvdGhlciwgc3RybGVuMTYob3RoZXIpKTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6OnNldFRvKGNvbnN0IGNoYXIxNl90KiBvdGhlciwgc2l6ZV90IGxlbikKLXsKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZykKLSAgICAgICAgLT5lZGl0UmVzaXplKChsZW4rMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAgICAgbWVtbW92ZShzdHIsIG90aGVyLCBsZW4qc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIHN0cltsZW5dID0gMDsKLSAgICAgICAgbVN0cmluZyA9IHN0cjsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fTUVNT1JZOwotfQotCi1zdGF0dXNfdCBTdHJpbmcxNjo6YXBwZW5kKGNvbnN0IFN0cmluZzE2JiBvdGhlcikKLXsKLSAgICBjb25zdCBzaXplX3QgbXlMZW4gPSBzaXplKCk7Ci0gICAgY29uc3Qgc2l6ZV90IG90aGVyTGVuID0gb3RoZXIuc2l6ZSgpOwotICAgIGlmIChteUxlbiA9PSAwKSB7Ci0gICAgICAgIHNldFRvKG90aGVyKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSBpZiAob3RoZXJMZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIAotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKQotICAgICAgICAtPmVkaXRSZXNpemUoKG15TGVuK290aGVyTGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgIG1lbWNweShzdHIrbXlMZW4sIG90aGVyLCAob3RoZXJMZW4rMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6OmFwcGVuZChjb25zdCBjaGFyMTZfdCogY2hycywgc2l6ZV90IG90aGVyTGVuKQotewotICAgIGNvbnN0IHNpemVfdCBteUxlbiA9IHNpemUoKTsKLSAgICBpZiAobXlMZW4gPT0gMCkgewotICAgICAgICBzZXRUbyhjaHJzLCBvdGhlckxlbik7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgaWYgKG90aGVyTGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICAKLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZykKLSAgICAgICAgLT5lZGl0UmVzaXplKChteUxlbitvdGhlckxlbisxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGNoYXIxNl90KiBzdHIgPSAoY2hhcjE2X3QqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICBtZW1jcHkoc3RyK215TGVuLCBjaHJzLCBvdGhlckxlbipzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgc3RyW215TGVuK290aGVyTGVuXSA9IDA7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6Omluc2VydChzaXplX3QgcG9zLCBjb25zdCBjaGFyMTZfdCogY2hycykKLXsKLSAgICByZXR1cm4gaW5zZXJ0KHBvcywgY2hycywgc3RybGVuMTYoY2hycykpOwotfQotCi1zdGF0dXNfdCBTdHJpbmcxNjo6aW5zZXJ0KHNpemVfdCBwb3MsIGNvbnN0IGNoYXIxNl90KiBjaHJzLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IHNpemVfdCBteUxlbiA9IHNpemUoKTsKLSAgICBpZiAobXlMZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gc2V0VG8oY2hycywgbGVuKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChwb3MgPiBteUxlbikgcG9zID0gbXlMZW47Ci0KLSAgICAjaWYgMAotICAgIHByaW50ZigiSW5zZXJ0IGluIHRvICVzOiBwb3M9JWQsIGxlbj0lZCwgbXlMZW49JWQsIGNocnM9JXNcbiIsCi0gICAgICAgICAgIFN0cmluZzgoKnRoaXMpLnN0cmluZygpLCBwb3MsCi0gICAgICAgICAgIGxlbiwgbXlMZW4sIFN0cmluZzgoY2hycywgbGVuKS5zdHJpbmcoKSk7Ci0gICAgI2VuZGlmCi0KLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZykKLSAgICAgICAgLT5lZGl0UmVzaXplKChteUxlbitsZW4rMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBjaGFyMTZfdCogc3RyID0gKGNoYXIxNl90KilidWYtPmRhdGEoKTsKLSAgICAgICAgaWYgKHBvcyA8IG15TGVuKSB7Ci0gICAgICAgICAgICBtZW1tb3ZlKHN0citwb3MrbGVuLCBzdHIrcG9zLCAobXlMZW4tcG9zKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkoc3RyK3BvcywgY2hycywgbGVuKnNpemVvZihjaGFyMTZfdCkpOwotICAgICAgICBzdHJbbXlMZW4rbGVuXSA9IDA7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgICAgICNpZiAwCi0gICAgICAgIHByaW50ZigiUmVzdWx0ICglZCBjaHJzKTogJXNcbiIsIHNpemUoKSwgU3RyaW5nOCgqdGhpcykuc3RyaW5nKCkpOwotICAgICAgICAjZW5kaWYKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fTUVNT1JZOwotfQotCi1zc2l6ZV90IFN0cmluZzE2OjpmaW5kRmlyc3QoY2hhcjE2X3QgYykgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyMTZfdCogc3RyID0gc3RyaW5nKCk7Ci0gICAgY29uc3QgY2hhcjE2X3QqIHAgPSBzdHI7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUgPSBwICsgc2l6ZSgpOwotICAgIHdoaWxlIChwIDwgZSkgewotICAgICAgICBpZiAoKnAgPT0gYykgewotICAgICAgICAgICAgcmV0dXJuIHAtc3RyOwotICAgICAgICB9Ci0gICAgICAgIHArKzsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zc2l6ZV90IFN0cmluZzE2OjpmaW5kTGFzdChjaGFyMTZfdCBjKSBjb25zdAotewotICAgIGNvbnN0IGNoYXIxNl90KiBzdHIgPSBzdHJpbmcoKTsKLSAgICBjb25zdCBjaGFyMTZfdCogcCA9IHN0cjsKLSAgICBjb25zdCBjaGFyMTZfdCogZSA9IHAgKyBzaXplKCk7Ci0gICAgd2hpbGUgKHAgPCBlKSB7Ci0gICAgICAgIGUtLTsKLSAgICAgICAgaWYgKCplID09IGMpIHsKLSAgICAgICAgICAgIHJldHVybiBlLXN0cjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLWJvb2wgU3RyaW5nMTY6OnN0YXJ0c1dpdGgoY29uc3QgU3RyaW5nMTYmIHByZWZpeCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgcHMgPSBwcmVmaXguc2l6ZSgpOwotICAgIGlmIChwcyA+IHNpemUoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBzdHJ6Y21wMTYobVN0cmluZywgcHMsIHByZWZpeC5zdHJpbmcoKSwgcHMpID09IDA7Ci19Ci0KLWJvb2wgU3RyaW5nMTY6OnN0YXJ0c1dpdGgoY29uc3QgY2hhcjE2X3QqIHByZWZpeCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgcHMgPSBzdHJsZW4xNihwcmVmaXgpOwotICAgIGlmIChwcyA+IHNpemUoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBzdHJuY21wMTYobVN0cmluZywgcHJlZml4LCBwcykgPT0gMDsKLX0KLQotc3RhdHVzX3QgU3RyaW5nMTY6Om1ha2VMb3dlcigpCi17Ci0gICAgY29uc3Qgc2l6ZV90IE4gPSBzaXplKCk7Ci0gICAgY29uc3QgY2hhcjE2X3QqIHN0ciA9IHN0cmluZygpOwotICAgIGNoYXIxNl90KiBlZGl0ID0gTlVMTDsKLSAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIxNl90IHYgPSBzdHJbaV07Ci0gICAgICAgIGlmICh2ID49ICdBJyAmJiB2IDw9ICdaJykgewotICAgICAgICAgICAgaWYgKCFlZGl0KSB7Ci0gICAgICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5lZGl0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWRpdCA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgbVN0cmluZyA9IHN0ciA9IGVkaXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZGl0W2ldID0gdG9sb3dlcigoY2hhcil2KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN0cmluZzE2OjpyZXBsYWNlQWxsKGNoYXIxNl90IHJlcGxhY2VUaGlzLCBjaGFyMTZfdCB3aXRoVGhpcykKLXsKLSAgICBjb25zdCBzaXplX3QgTiA9IHNpemUoKTsKLSAgICBjb25zdCBjaGFyMTZfdCogc3RyID0gc3RyaW5nKCk7Ci0gICAgY2hhcjE2X3QqIGVkaXQgPSBOVUxMOwotICAgIGZvciAoc2l6ZV90IGk9MDsgaTxOOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cltpXSA9PSByZXBsYWNlVGhpcykgewotICAgICAgICAgICAgaWYgKCFlZGl0KSB7Ci0gICAgICAgICAgICAgICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5lZGl0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWRpdCA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgbVN0cmluZyA9IHN0ciA9IGVkaXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZGl0W2ldID0gd2l0aFRoaXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdHJpbmcxNjo6cmVtb3ZlKHNpemVfdCBsZW4sIHNpemVfdCBiZWdpbikKLXsKLSAgICBjb25zdCBzaXplX3QgTiA9IHNpemUoKTsKLSAgICBpZiAoYmVnaW4gPj0gTikgewotICAgICAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIGlmICgoYmVnaW4rbGVuKSA+IE4pIGxlbiA9IE4tYmVnaW47Ci0gICAgaWYgKGJlZ2luID09IDAgJiYgbGVuID09IE4pIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGlmIChiZWdpbiA+IDApIHsKLSAgICAgICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgICAgICAtPmVkaXRSZXNpemUoKE4rMSkqc2l6ZW9mKGNoYXIxNl90KSk7Ci0gICAgICAgIGlmICghYnVmKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIGNoYXIxNl90KiBzdHIgPSAoY2hhcjE2X3QqKWJ1Zi0+ZGF0YSgpOwotICAgICAgICBtZW1tb3ZlKHN0ciwgc3RyK2JlZ2luLCAoTi1iZWdpbisxKSpzaXplb2YoY2hhcjE2X3QpKTsKLSAgICAgICAgbVN0cmluZyA9IHN0cjsKLSAgICB9Ci0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgIC0+ZWRpdFJlc2l6ZSgobGVuKzEpKnNpemVvZihjaGFyMTZfdCkpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgY2hhcjE2X3QqIHN0ciA9IChjaGFyMTZfdCopYnVmLT5kYXRhKCk7Ci0gICAgICAgIHN0cltsZW5dID0gMDsKLSAgICAgICAgbVN0cmluZyA9IHN0cjsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fTUVNT1JZOwotfQotCi1UZXh0T3V0cHV0JiBvcGVyYXRvcjw8KFRleHRPdXRwdXQmIHRvLCBjb25zdCBTdHJpbmcxNiYgdmFsKQotewotICAgIHRvIDw8IFN0cmluZzgodmFsKS5zdHJpbmcoKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1N0cmluZzguY3BwIGIvbGlicy91dGlscy9TdHJpbmc4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyZjAyNi4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1N0cmluZzguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVW5pY29kZS5oPgotI2luY2x1ZGUgPHV0aWxzL1NoYXJlZEJ1ZmZlci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGV4dE91dHB1dC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvdXRpbHMvU3RhdGljLmg+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKgotICogRnVuY3Rpb25zIG91dHNpZGUgYW5kcm9pZCBpcyBiZWxvdyB0aGUgbmFtZXNwYWNlIGFuZHJvaWQsIHNpbmNlIHRoZXkgdXNlCi0gKiBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBpbiBhbmRyb2lkIG5hbWVzcGFjZS4KLSAqLwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBTZXBhcmF0b3IgdXNlZCBieSByZXNvdXJjZSBwYXRocy4gVGhpcyBpcyBub3QgcGxhdGZvcm0gZGVwZW5kZW50IGNvbnRyYXJ5Ci0vLyB0byBPU19QQVRIX1NFUEFSQVRPUi4KLSNkZWZpbmUgUkVTX1BBVEhfU0VQQVJBVE9SICcvJwotCi1zdGF0aWMgU2hhcmVkQnVmZmVyKiBnRW1wdHlTdHJpbmdCdWYgPSBOVUxMOwotc3RhdGljIGNoYXIqIGdFbXB0eVN0cmluZyA9IE5VTEw7Ci0KLWV4dGVybiBpbnQgZ0RhcndpbkNhbnRMb2FkQWxsT2JqZWN0czsKLWludCBnRGFyd2luSXNSZWFsbHlBbm5veWluZzsKLQotc3RhdGljIGlubGluZSBjaGFyKiBnZXRFbXB0eVN0cmluZygpCi17Ci0gICAgZ0VtcHR5U3RyaW5nQnVmLT5hY3F1aXJlKCk7Ci0gICAgcmV0dXJuIGdFbXB0eVN0cmluZzsKLX0KLQotdm9pZCBpbml0aWFsaXplX3N0cmluZzgoKQotewotICAgIC8vIEhBQ0s6IFRoaXMgZHVtbXkgZGVwZW5kZW5jeSBmb3JjZXMgbGlua2luZyBsaWJ1dGlscyBTdGF0aWMuY3BwLAotICAgIC8vIHdoaWNoIGlzIG5lZWRlZCB0byBpbml0aWFsaXplIFN0cmluZzgvU3RyaW5nMTYgY2xhc3Nlcy4KLSAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJlIG5hbWVkIGZvciBEYXJ3aW4sIGJ1dCBhcmUgbmVlZGVkIGVsc2V3aGVyZSB0b28sCi0gICAgLy8gaW5jbHVkaW5nIHN0YXRpYyBsaW5raW5nIG9uIGFueSBwbGF0Zm9ybS4KLSAgICBnRGFyd2luSXNSZWFsbHlBbm5veWluZyA9IGdEYXJ3aW5DYW50TG9hZEFsbE9iamVjdHM7Ci0KLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoMSk7Ci0gICAgY2hhciogc3RyID0gKGNoYXIqKWJ1Zi0+ZGF0YSgpOwotICAgICpzdHIgPSAwOwotICAgIGdFbXB0eVN0cmluZ0J1ZiA9IGJ1ZjsKLSAgICBnRW1wdHlTdHJpbmcgPSBzdHI7Ci19Ci0KLXZvaWQgdGVybWluYXRlX3N0cmluZzgoKQotewotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEoZ0VtcHR5U3RyaW5nKS0+cmVsZWFzZSgpOwotICAgIGdFbXB0eVN0cmluZ0J1ZiA9IE5VTEw7Ci0gICAgZ0VtcHR5U3RyaW5nID0gTlVMTDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjaGFyKiBhbGxvY0Zyb21VVEY4KGNvbnN0IGNoYXIqIGluLCBzaXplX3QgbGVuKQotewotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjphbGxvYyhsZW4rMSk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGJ1ZiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzaGFyZWQgYnVmZmVyIik7Ci0gICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgIGNoYXIqIHN0ciA9IChjaGFyKilidWYtPmRhdGEoKTsKLSAgICAgICAgICAgIG1lbWNweShzdHIsIGluLCBsZW4pOwotICAgICAgICAgICAgc3RyW2xlbl0gPSAwOwotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLX0KLQotc3RhdGljIGNoYXIqIGFsbG9jRnJvbVVURjE2KGNvbnN0IGNoYXIxNl90KiBpbiwgc2l6ZV90IGxlbikKLXsKLSAgICBpZiAobGVuID09IDApIHJldHVybiBnZXRFbXB0eVN0cmluZygpOwotCi0gICAgY29uc3Qgc3NpemVfdCBieXRlcyA9IHV0ZjE2X3RvX3V0ZjhfbGVuZ3RoKGluLCBsZW4pOwotICAgIGlmIChieXRlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKGJ5dGVzKzEpOwotICAgIEFMT0dfQVNTRVJUKGJ1ZiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBzaGFyZWQgYnVmZmVyIik7Ci0gICAgaWYgKCFidWYpIHsKLSAgICAgICAgcmV0dXJuIGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgY2hhciogc3RyID0gKGNoYXIqKWJ1Zi0+ZGF0YSgpOwotICAgIHV0ZjE2X3RvX3V0ZjgoaW4sIGxlbiwgc3RyKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgY2hhciogYWxsb2NGcm9tVVRGMzIoY29uc3QgY2hhcjMyX3QqIGluLCBzaXplX3QgbGVuKQotewotICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBjb25zdCBzc2l6ZV90IGJ5dGVzID0gdXRmMzJfdG9fdXRmOF9sZW5ndGgoaW4sIGxlbik7Ci0gICAgaWYgKGJ5dGVzIDwgMCkgewotICAgICAgICByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoYnl0ZXMrMSk7Ci0gICAgQUxPR19BU1NFUlQoYnVmLCAiVW5hYmxlIHRvIGFsbG9jYXRlIHNoYXJlZCBidWZmZXIiKTsKLSAgICBpZiAoIWJ1ZikgewotICAgICAgICByZXR1cm4gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBjaGFyKiBzdHIgPSAoY2hhciopIGJ1Zi0+ZGF0YSgpOwotICAgIHV0ZjMyX3RvX3V0ZjgoaW4sIGxlbiwgc3RyKTsKLQotICAgIHJldHVybiBzdHI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TdHJpbmc4OjpTdHJpbmc4KCkKLSAgICA6IG1TdHJpbmcoZ2V0RW1wdHlTdHJpbmcoKSkKLXsKLX0KLQotU3RyaW5nODo6U3RyaW5nOChjb25zdCBTdHJpbmc4JiBvKQotICAgIDogbVN0cmluZyhvLm1TdHJpbmcpCi17Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+YWNxdWlyZSgpOwotfQotCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IGNoYXIqIG8pCi0gICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjgobywgc3RybGVuKG8pKSkKLXsKLSAgICBpZiAobVN0cmluZyA9PSBOVUxMKSB7Ci0gICAgICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotICAgIH0KLX0KLQotU3RyaW5nODo6U3RyaW5nOChjb25zdCBjaGFyKiBvLCBzaXplX3QgbGVuKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEY4KG8sIGxlbikpCi17Ci0gICAgaWYgKG1TdHJpbmcgPT0gTlVMTCkgewotICAgICAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICB9Ci19Ci0KLVN0cmluZzg6OlN0cmluZzgoY29uc3QgU3RyaW5nMTYmIG8pCi0gICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjE2KG8uc3RyaW5nKCksIG8uc2l6ZSgpKSkKLXsKLX0KLQotU3RyaW5nODo6U3RyaW5nOChjb25zdCBjaGFyMTZfdCogbykKLSAgICA6IG1TdHJpbmcoYWxsb2NGcm9tVVRGMTYobywgc3RybGVuMTYobykpKQotewotfQotCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IGNoYXIxNl90KiBvLCBzaXplX3QgbGVuKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEYxNihvLCBsZW4pKQotewotfQotCi1TdHJpbmc4OjpTdHJpbmc4KGNvbnN0IGNoYXIzMl90KiBvKQotICAgIDogbVN0cmluZyhhbGxvY0Zyb21VVEYzMihvLCBzdHJsZW4zMihvKSkpCi17Ci19Ci0KLVN0cmluZzg6OlN0cmluZzgoY29uc3QgY2hhcjMyX3QqIG8sIHNpemVfdCBsZW4pCi0gICAgOiBtU3RyaW5nKGFsbG9jRnJvbVVURjMyKG8sIGxlbikpCi17Ci19Ci0KLVN0cmluZzg6On5TdHJpbmc4KCkKLXsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci19Ci0KLVN0cmluZzggU3RyaW5nODo6Zm9ybWF0KGNvbnN0IGNoYXIqIGZtdCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotCi0gICAgU3RyaW5nOCByZXN1bHQoZm9ybWF0VihmbXQsIGFyZ3MpKTsKLQotICAgIHZhX2VuZChhcmdzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1TdHJpbmc4IFN0cmluZzg6OmZvcm1hdFYoY29uc3QgY2hhciogZm10LCB2YV9saXN0IGFyZ3MpCi17Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdFYoZm10LCBhcmdzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIFN0cmluZzg6OmNsZWFyKCkgewotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLX0KLQotdm9pZCBTdHJpbmc4OjpzZXRUbyhjb25zdCBTdHJpbmc4JiBvdGhlcikKLXsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG90aGVyLm1TdHJpbmcpLT5hY3F1aXJlKCk7Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotICAgIG1TdHJpbmcgPSBvdGhlci5tU3RyaW5nOwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjpzZXRUbyhjb25zdCBjaGFyKiBvdGhlcikKLXsKLSAgICBjb25zdCBjaGFyICpuZXdTdHJpbmcgPSBhbGxvY0Zyb21VVEY4KG90aGVyLCBzdHJsZW4ob3RoZXIpKTsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgbVN0cmluZyA9IG5ld1N0cmluZzsKLSAgICBpZiAobVN0cmluZykgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6c2V0VG8oY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciAqbmV3U3RyaW5nID0gYWxsb2NGcm9tVVRGOChvdGhlciwgbGVuKTsKLSAgICBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpLT5yZWxlYXNlKCk7Ci0gICAgbVN0cmluZyA9IG5ld1N0cmluZzsKLSAgICBpZiAobVN0cmluZykgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgbVN0cmluZyA9IGdldEVtcHR5U3RyaW5nKCk7Ci0gICAgcmV0dXJuIE5PX01FTU9SWTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6c2V0VG8oY29uc3QgY2hhcjE2X3QqIG90aGVyLCBzaXplX3QgbGVuKQotewotICAgIGNvbnN0IGNoYXIgKm5ld1N0cmluZyA9IGFsbG9jRnJvbVVURjE2KG90aGVyLCBsZW4pOwotICAgIFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZyktPnJlbGVhc2UoKTsKLSAgICBtU3RyaW5nID0gbmV3U3RyaW5nOwotICAgIGlmIChtU3RyaW5nKSByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICBtU3RyaW5nID0gZ2V0RW1wdHlTdHJpbmcoKTsKLSAgICByZXR1cm4gTk9fTUVNT1JZOwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjpzZXRUbyhjb25zdCBjaGFyMzJfdCogb3RoZXIsIHNpemVfdCBsZW4pCi17Ci0gICAgY29uc3QgY2hhciAqbmV3U3RyaW5nID0gYWxsb2NGcm9tVVRGMzIob3RoZXIsIGxlbik7Ci0gICAgU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKS0+cmVsZWFzZSgpOwotICAgIG1TdHJpbmcgPSBuZXdTdHJpbmc7Ci0gICAgaWYgKG1TdHJpbmcpIHJldHVybiBOT19FUlJPUjsKLQotICAgIG1TdHJpbmcgPSBnZXRFbXB0eVN0cmluZygpOwotICAgIHJldHVybiBOT19NRU1PUlk7Ci19Ci0KLXN0YXR1c190IFN0cmluZzg6OmFwcGVuZChjb25zdCBTdHJpbmc4JiBvdGhlcikKLXsKLSAgICBjb25zdCBzaXplX3Qgb3RoZXJMZW4gPSBvdGhlci5ieXRlcygpOwotICAgIGlmIChieXRlcygpID09IDApIHsKLSAgICAgICAgc2V0VG8ob3RoZXIpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIGlmIChvdGhlckxlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVhbF9hcHBlbmQob3RoZXIuc3RyaW5nKCksIG90aGVyTGVuKTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6YXBwZW5kKGNvbnN0IGNoYXIqIG90aGVyKQotewotICAgIHJldHVybiBhcHBlbmQob3RoZXIsIHN0cmxlbihvdGhlcikpOwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjphcHBlbmQoY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBvdGhlckxlbikKLXsKLSAgICBpZiAoYnl0ZXMoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBzZXRUbyhvdGhlciwgb3RoZXJMZW4pOwotICAgIH0gZWxzZSBpZiAob3RoZXJMZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlYWxfYXBwZW5kKG90aGVyLCBvdGhlckxlbik7Ci19Ci0KLXN0YXR1c190IFN0cmluZzg6OmFwcGVuZEZvcm1hdChjb25zdCBjaGFyKiBmbXQsIC4uLikKLXsKLSAgICB2YV9saXN0IGFyZ3M7Ci0gICAgdmFfc3RhcnQoYXJncywgZm10KTsKLQotICAgIHN0YXR1c190IHJlc3VsdCA9IGFwcGVuZEZvcm1hdFYoZm10LCBhcmdzKTsKLQotICAgIHZhX2VuZChhcmdzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjphcHBlbmRGb3JtYXRWKGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcmdzKQotewotICAgIGludCByZXN1bHQgPSBOT19FUlJPUjsKLSAgICBpbnQgbiA9IHZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFyZ3MpOwotICAgIGlmIChuICE9IDApIHsKLSAgICAgICAgc2l6ZV90IG9sZExlbmd0aCA9IGxlbmd0aCgpOwotICAgICAgICBjaGFyKiBidWYgPSBsb2NrQnVmZmVyKG9sZExlbmd0aCArIG4pOwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICB2c25wcmludGYoYnVmICsgb2xkTGVuZ3RoLCBuICsgMSwgZm10LCBhcmdzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBTdHJpbmc4OjpyZWFsX2FwcGVuZChjb25zdCBjaGFyKiBvdGhlciwgc2l6ZV90IG90aGVyTGVuKQotewotICAgIGNvbnN0IHNpemVfdCBteUxlbiA9IGJ5dGVzKCk7Ci0gICAgCi0gICAgU2hhcmVkQnVmZmVyKiBidWYgPSBTaGFyZWRCdWZmZXI6OmJ1ZmZlckZyb21EYXRhKG1TdHJpbmcpCi0gICAgICAgIC0+ZWRpdFJlc2l6ZShteUxlbitvdGhlckxlbisxKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGNoYXIqIHN0ciA9IChjaGFyKilidWYtPmRhdGEoKTsKLSAgICAgICAgbVN0cmluZyA9IHN0cjsKLSAgICAgICAgc3RyICs9IG15TGVuOwotICAgICAgICBtZW1jcHkoc3RyLCBvdGhlciwgb3RoZXJMZW4pOwotICAgICAgICBzdHJbb3RoZXJMZW5dID0gJ1wwJzsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fTUVNT1JZOwotfQotCi1jaGFyKiBTdHJpbmc4Ojpsb2NrQnVmZmVyKHNpemVfdCBzaXplKQotewotICAgIFNoYXJlZEJ1ZmZlciogYnVmID0gU2hhcmVkQnVmZmVyOjpidWZmZXJGcm9tRGF0YShtU3RyaW5nKQotICAgICAgICAtPmVkaXRSZXNpemUoc2l6ZSsxKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGNoYXIqIHN0ciA9IChjaGFyKilidWYtPmRhdGEoKTsKLSAgICAgICAgbVN0cmluZyA9IHN0cjsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgU3RyaW5nODo6dW5sb2NrQnVmZmVyKCkKLXsKLSAgICB1bmxvY2tCdWZmZXIoc3RybGVuKG1TdHJpbmcpKTsKLX0KLQotc3RhdHVzX3QgU3RyaW5nODo6dW5sb2NrQnVmZmVyKHNpemVfdCBzaXplKQotewotICAgIGlmIChzaXplICE9IHRoaXMtPnNpemUoKSkgewotICAgICAgICBTaGFyZWRCdWZmZXIqIGJ1ZiA9IFNoYXJlZEJ1ZmZlcjo6YnVmZmVyRnJvbURhdGEobVN0cmluZykKLSAgICAgICAgICAgIC0+ZWRpdFJlc2l6ZShzaXplKzEpOwotICAgICAgICBpZiAoISBidWYpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyKiBzdHIgPSAoY2hhciopYnVmLT5kYXRhKCk7Ci0gICAgICAgIHN0cltzaXplXSA9IDA7Ci0gICAgICAgIG1TdHJpbmcgPSBzdHI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zc2l6ZV90IFN0cmluZzg6OmZpbmQoY29uc3QgY2hhciogb3RoZXIsIHNpemVfdCBzdGFydCkgY29uc3QKLXsKLSAgICBzaXplX3QgbGVuID0gc2l6ZSgpOwotICAgIGlmIChzdGFydCA+PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjb25zdCBjaGFyKiBzID0gbVN0cmluZytzdGFydDsKLSAgICBjb25zdCBjaGFyKiBwID0gc3Ryc3RyKHMsIG90aGVyKTsKLSAgICByZXR1cm4gcCA/IHAtbVN0cmluZyA6IC0xOwotfQotCi12b2lkIFN0cmluZzg6OnRvTG93ZXIoKQotewotICAgIHRvTG93ZXIoMCwgc2l6ZSgpKTsKLX0KLQotdm9pZCBTdHJpbmc4Ojp0b0xvd2VyKHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBjb25zdCBzaXplX3QgbGVuID0gc2l6ZSgpOwotICAgIGlmIChzdGFydCA+PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoc3RhcnQrbGVuZ3RoID4gbGVuKSB7Ci0gICAgICAgIGxlbmd0aCA9IGxlbi1zdGFydDsKLSAgICB9Ci0gICAgY2hhciogYnVmID0gbG9ja0J1ZmZlcihsZW4pOwotICAgIGJ1ZiArPSBzdGFydDsKLSAgICB3aGlsZSAobGVuZ3RoID4gMCkgewotICAgICAgICAqYnVmID0gdG9sb3dlcigqYnVmKTsKLSAgICAgICAgYnVmKys7Ci0gICAgICAgIGxlbmd0aC0tOwotICAgIH0KLSAgICB1bmxvY2tCdWZmZXIobGVuKTsKLX0KLQotdm9pZCBTdHJpbmc4Ojp0b1VwcGVyKCkKLXsKLSAgICB0b1VwcGVyKDAsIHNpemUoKSk7Ci19Ci0KLXZvaWQgU3RyaW5nODo6dG9VcHBlcihzaXplX3Qgc3RhcnQsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgY29uc3Qgc2l6ZV90IGxlbiA9IHNpemUoKTsKLSAgICBpZiAoc3RhcnQgPj0gbGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0K2xlbmd0aCA+IGxlbikgewotICAgICAgICBsZW5ndGggPSBsZW4tc3RhcnQ7Ci0gICAgfQotICAgIGNoYXIqIGJ1ZiA9IGxvY2tCdWZmZXIobGVuKTsKLSAgICBidWYgKz0gc3RhcnQ7Ci0gICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgKmJ1ZiA9IHRvdXBwZXIoKmJ1Zik7Ci0gICAgICAgIGJ1ZisrOwotICAgICAgICBsZW5ndGgtLTsKLSAgICB9Ci0gICAgdW5sb2NrQnVmZmVyKGxlbik7Ci19Ci0KLXNpemVfdCBTdHJpbmc4OjpnZXRVdGYzMkxlbmd0aCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHV0ZjhfdG9fdXRmMzJfbGVuZ3RoKG1TdHJpbmcsIGxlbmd0aCgpKTsKLX0KLQotaW50MzJfdCBTdHJpbmc4OjpnZXRVdGYzMkF0KHNpemVfdCBpbmRleCwgc2l6ZV90ICpuZXh0X2luZGV4KSBjb25zdAotewotICAgIHJldHVybiB1dGYzMl9mcm9tX3V0ZjhfYXQobVN0cmluZywgbGVuZ3RoKCksIGluZGV4LCBuZXh0X2luZGV4KTsKLX0KLQotdm9pZCBTdHJpbmc4OjpnZXRVdGYzMihjaGFyMzJfdCogZHN0KSBjb25zdAotewotICAgIHV0ZjhfdG9fdXRmMzIobVN0cmluZywgbGVuZ3RoKCksIGRzdCk7Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IFN0cmluZzgmIHZhbCkKLXsKLSAgICB0byA8PCB2YWwuc3RyaW5nKCk7Ci0gICAgcmV0dXJuIHRvOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhdGggZnVuY3Rpb25zCi0KLXZvaWQgU3RyaW5nODo6c2V0UGF0aE5hbWUoY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICBzZXRQYXRoTmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwotfQotCi12b2lkIFN0cmluZzg6OnNldFBhdGhOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBsZW4pCi17Ci0gICAgY2hhciogYnVmID0gbG9ja0J1ZmZlcihsZW4pOwotCi0gICAgbWVtY3B5KGJ1ZiwgbmFtZSwgbGVuKTsKLQotICAgIC8vIHJlbW92ZSB0cmFpbGluZyBwYXRoIHNlcGFyYXRvciwgaWYgcHJlc2VudAotICAgIGlmIChsZW4gPiAwICYmIGJ1ZltsZW4tMV0gPT0gT1NfUEFUSF9TRVBBUkFUT1IpCi0gICAgICAgIGxlbi0tOwotCi0gICAgYnVmW2xlbl0gPSAnXDAnOwotCi0gICAgdW5sb2NrQnVmZmVyKGxlbik7Ci19Ci0KLVN0cmluZzggU3RyaW5nODo6Z2V0UGF0aExlYWYodm9pZCkgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyKiBjcDsKLSAgICBjb25zdCBjaGFyKmNvbnN0IGJ1ZiA9IG1TdHJpbmc7Ci0KLSAgICBjcCA9IHN0cnJjaHIoYnVmLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGNwID09IE5VTEwpCi0gICAgICAgIHJldHVybiBTdHJpbmc4KCp0aGlzKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBTdHJpbmc4KGNwKzEpOwotfQotCi1TdHJpbmc4IFN0cmluZzg6OmdldFBhdGhEaXIodm9pZCkgY29uc3QKLXsKLSAgICBjb25zdCBjaGFyKiBjcDsKLSAgICBjb25zdCBjaGFyKmNvbnN0IHN0ciA9IG1TdHJpbmc7Ci0KLSAgICBjcCA9IHN0cnJjaHIoc3RyLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGNwID09IE5VTEwpCi0gICAgICAgIHJldHVybiBTdHJpbmc4KCIiKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBTdHJpbmc4KHN0ciwgY3AgLSBzdHIpOwotfQotCi1TdHJpbmc4IFN0cmluZzg6OndhbGtQYXRoKFN0cmluZzgqIG91dFJlbWFpbnMpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciogY3A7Ci0gICAgY29uc3QgY2hhcipjb25zdCBzdHIgPSBtU3RyaW5nOwotICAgIGNvbnN0IGNoYXIqIGJ1ZiA9IHN0cjsKLQotICAgIGNwID0gc3RyY2hyKGJ1ZiwgT1NfUEFUSF9TRVBBUkFUT1IpOwotICAgIGlmIChjcCA9PSBidWYpIHsKLSAgICAgICAgLy8gZG9uJ3QgaW5jbHVkZSBhIGxlYWRpbmcgJy8nLgotICAgICAgICBidWYgPSBidWYrMTsKLSAgICAgICAgY3AgPSBzdHJjaHIoYnVmLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgfQotCi0gICAgaWYgKGNwID09IE5VTEwpIHsKLSAgICAgICAgU3RyaW5nOCByZXMgPSBidWYgIT0gc3RyID8gU3RyaW5nOChidWYpIDogKnRoaXM7Ci0gICAgICAgIGlmIChvdXRSZW1haW5zKSAqb3V0UmVtYWlucyA9IFN0cmluZzgoIiIpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIFN0cmluZzggcmVzKGJ1ZiwgY3AtYnVmKTsKLSAgICBpZiAob3V0UmVtYWlucykgKm91dFJlbWFpbnMgPSBTdHJpbmc4KGNwKzEpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRpbmcgdGhlIHN0YXJ0IG9mIGFuIGV4dGVuc2lvbiBpbiBhIHBhdGhuYW1lLgotICoKLSAqIFJldHVybnMgYSBwb2ludGVyIGluc2lkZSBtU3RyaW5nLCBvciBOVUxMIGlmIG5vIGV4dGVuc2lvbiB3YXMgZm91bmQuCi0gKi8KLWNoYXIqIFN0cmluZzg6OmZpbmRfZXh0ZW5zaW9uKHZvaWQpIGNvbnN0Ci17Ci0gICAgY29uc3QgY2hhciogbGFzdFNsYXNoOwotICAgIGNvbnN0IGNoYXIqIGxhc3REb3Q7Ci0gICAgaW50IGV4dExlbjsKLSAgICBjb25zdCBjaGFyKiBjb25zdCBzdHIgPSBtU3RyaW5nOwotCi0gICAgLy8gb25seSBsb29rIGF0IHRoZSBmaWxlbmFtZQotICAgIGxhc3RTbGFzaCA9IHN0cnJjaHIoc3RyLCBPU19QQVRIX1NFUEFSQVRPUik7Ci0gICAgaWYgKGxhc3RTbGFzaCA9PSBOVUxMKQotICAgICAgICBsYXN0U2xhc2ggPSBzdHI7Ci0gICAgZWxzZQotICAgICAgICBsYXN0U2xhc2grKzsKLQotICAgIC8vIGZpbmQgdGhlIGxhc3QgZG90Ci0gICAgbGFzdERvdCA9IHN0cnJjaHIobGFzdFNsYXNoLCAnLicpOwotICAgIGlmIChsYXN0RG90ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLy8gbG9va3MgZ29vZCwgc2hpcCBpdAotICAgIHJldHVybiBjb25zdF9jYXN0PGNoYXIqPihsYXN0RG90KTsKLX0KLQotU3RyaW5nOCBTdHJpbmc4OjpnZXRQYXRoRXh0ZW5zaW9uKHZvaWQpIGNvbnN0Ci17Ci0gICAgY2hhciogZXh0OwotCi0gICAgZXh0ID0gZmluZF9leHRlbnNpb24oKTsKLSAgICBpZiAoZXh0ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiBTdHJpbmc4KGV4dCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7Ci19Ci0KLVN0cmluZzggU3RyaW5nODo6Z2V0QmFzZVBhdGgodm9pZCkgY29uc3QKLXsKLSAgICBjaGFyKiBleHQ7Ci0gICAgY29uc3QgY2hhciogY29uc3Qgc3RyID0gbVN0cmluZzsKLQotICAgIGV4dCA9IGZpbmRfZXh0ZW5zaW9uKCk7Ci0gICAgaWYgKGV4dCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gU3RyaW5nOCgqdGhpcyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gU3RyaW5nOChzdHIsIGV4dCAtIHN0cik7Ci19Ci0KLVN0cmluZzgmIFN0cmluZzg6OmFwcGVuZFBhdGgoY29uc3QgY2hhciogbmFtZSkKLXsKLSAgICAvLyBUT0RPOiBUaGUgdGVzdCBiZWxvdyB3aWxsIGZhaWwgZm9yIFdpbjMyIHBhdGhzLiBGaXggbGF0ZXIgb3IgaWdub3JlLgotICAgIGlmIChuYW1lWzBdICE9IE9TX1BBVEhfU0VQQVJBVE9SKSB7Ci0gICAgICAgIGlmICgqbmFtZSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCi0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbGVuID0gbGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgLy8gbm8gZXhpc3RpbmcgZmlsZW5hbWUsIGp1c3QgdXNlIHRoZSBuZXcgb25lCi0gICAgICAgICAgICBzZXRQYXRoTmFtZShuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIG1ha2Ugcm9vbSBmb3Igb2xkUGF0aCArICcvJyArIG5ld1BhdGgKLSAgICAgICAgaW50IG5ld2xlbiA9IHN0cmxlbihuYW1lKTsKLQotICAgICAgICBjaGFyKiBidWYgPSBsb2NrQnVmZmVyKGxlbisxK25ld2xlbik7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IGEgJy8nIGlmIG5lZWRlZAotICAgICAgICBpZiAoYnVmW2xlbi0xXSAhPSBPU19QQVRIX1NFUEFSQVRPUikKLSAgICAgICAgICAgIGJ1ZltsZW4rK10gPSBPU19QQVRIX1NFUEFSQVRPUjsKLQotICAgICAgICBtZW1jcHkoYnVmK2xlbiwgbmFtZSwgbmV3bGVuKzEpOwotICAgICAgICBsZW4gKz0gbmV3bGVuOwotCi0gICAgICAgIHVubG9ja0J1ZmZlcihsZW4pOwotCi0gICAgICAgIHJldHVybiAqdGhpczsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRQYXRoTmFtZShuYW1lKTsKLSAgICAgICAgcmV0dXJuICp0aGlzOwotICAgIH0KLX0KLQotU3RyaW5nOCYgU3RyaW5nODo6Y29udmVydFRvUmVzUGF0aCgpCi17Ci0jaWYgT1NfUEFUSF9TRVBBUkFUT1IgIT0gUkVTX1BBVEhfU0VQQVJBVE9SCi0gICAgc2l6ZV90IGxlbiA9IGxlbmd0aCgpOwotICAgIGlmIChsZW4gPiAwKSB7Ci0gICAgICAgIGNoYXIgKiBidWYgPSBsb2NrQnVmZmVyKGxlbik7Ci0gICAgICAgIGZvciAoY2hhciAqIGVuZCA9IGJ1ZiArIGxlbjsgYnVmIDwgZW5kOyArK2J1ZikgewotICAgICAgICAgICAgaWYgKCpidWYgPT0gT1NfUEFUSF9TRVBBUkFUT1IpCi0gICAgICAgICAgICAgICAgKmJ1ZiA9IFJFU19QQVRIX1NFUEFSQVRPUjsKLSAgICAgICAgfQotICAgICAgICB1bmxvY2tCdWZmZXIobGVuKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1N0cmluZ0FycmF5LmNwcCBiL2xpYnMvdXRpbHMvU3RyaW5nQXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQyZDY4Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvU3RyaW5nQXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLwotLy8gU29ydGFibGUgYXJyYXkgb2Ygc3RyaW5ncy4gIFNUTC1pc2gsIGJ1dCBTVEwtZnJlZS4KLS8vICAKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nQXJyYXkuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLwotLy8gQW4gZXhwYW5kaW5nIGFycmF5IG9mIHN0cmluZ3MuICBBZGQsIGdldCwgc29ydCwgZGVsZXRlLgotLy8KLVN0cmluZ0FycmF5OjpTdHJpbmdBcnJheSgpCi0gICAgOiBtTWF4KDApLCBtQ3VycmVudCgwKSwgbUFycmF5KE5VTEwpCi17Ci19Ci0KLVN0cmluZ0FycmF5OjogflN0cmluZ0FycmF5KCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUN1cnJlbnQ7IGkrKykKLSAgICAgICAgZGVsZXRlW10gbUFycmF5W2ldOwotICAgIGRlbGV0ZVtdIG1BcnJheTsKLX0KLQotLy8KLS8vIEFkZCBhIHN0cmluZy4gIEEgY29weSBvZiB0aGUgc3RyaW5nIGlzIG1hZGUuCi0vLwotYm9vbCBTdHJpbmdBcnJheTo6cHVzaF9iYWNrKGNvbnN0IGNoYXIqIHN0cikgewotICAgIGlmIChtQ3VycmVudCA+PSBtTWF4KSB7Ci0gICAgICAgIGNoYXIqKiB0bXA7Ci0KLSAgICAgICAgaWYgKG1NYXggPT0gMCkKLSAgICAgICAgICAgIG1NYXggPSAxNjsgICAgICAvLyBpbml0aWFsIHN0b3JhZ2UKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbU1heCAqPSAyOwotCi0gICAgICAgIHRtcCA9IG5ldyBjaGFyKlttTWF4XTsKLSAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIG1lbWNweSh0bXAsIG1BcnJheSwgbUN1cnJlbnQgKiBzaXplb2YoY2hhciopKTsKLSAgICAgICAgZGVsZXRlW10gbUFycmF5OwotICAgICAgICBtQXJyYXkgPSB0bXA7Ci0gICAgfQotCi0gICAgaW50IGxlbiA9IHN0cmxlbihzdHIpOwotICAgIG1BcnJheVttQ3VycmVudF0gPSBuZXcgY2hhcltsZW4rMV07Ci0gICAgbWVtY3B5KG1BcnJheVttQ3VycmVudF0sIHN0ciwgbGVuKzEpOwotICAgIG1DdXJyZW50Kys7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8KLS8vIERlbGV0ZSBhbiBlbnRyeS4KLS8vCi12b2lkIFN0cmluZ0FycmF5OjplcmFzZShpbnQgaWR4KSB7Ci0gICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IG1DdXJyZW50KQotICAgICAgICByZXR1cm47Ci0gICAgZGVsZXRlW10gbUFycmF5W2lkeF07Ci0gICAgaWYgKGlkeCA8IG1DdXJyZW50LTEpIHsKLSAgICAgICAgbWVtbW92ZSgmbUFycmF5W2lkeF0sICZtQXJyYXlbaWR4KzFdLAotICAgICAgICAgICAgICAgIChtQ3VycmVudC0xIC0gaWR4KSAqIHNpemVvZihjaGFyKikpOwotICAgIH0KLSAgICBtQ3VycmVudC0tOwotfQotCi0vLwotLy8gU29ydCB0aGUgYXJyYXkuCi0vLwotdm9pZCBTdHJpbmdBcnJheTo6c29ydChpbnQgKCpjb21wYXJlKShjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopKSB7Ci0gICAgcXNvcnQobUFycmF5LCBtQ3VycmVudCwgc2l6ZW9mKGNoYXIqKSwgY29tcGFyZSk7Ci19Ci0KLS8vCi0vLyBQYXNzIHRoaXMgdG8gdGhlIHNvcnQgcm91dGluZSB0byBkbyBhbiBhc2NlbmRpbmcgYWxwaGFiZXRpY2FsIHNvcnQuCi0vLwotaW50IFN0cmluZ0FycmF5OjpjbXBBc2NlbmRpbmdBbHBoYShjb25zdCB2b2lkKiBwc3RyMSwgY29uc3Qgdm9pZCogcHN0cjIpIHsKLSAgICByZXR1cm4gc3RyY21wKCooY29uc3QgY2hhcioqKXBzdHIxLCAqKGNvbnN0IGNoYXIqKilwc3RyMik7Ci19Ci0KLS8vCi0vLyBTZXQgZW50cnkgTiB0byBzcGVjaWZpZWQgc3RyaW5nLgotLy8gW3Nob3VsZCB1c2Ugb3BlcmF0b3JbXSBoZXJlXQotLy8KLXZvaWQgU3RyaW5nQXJyYXk6OnNldEVudHJ5KGludCBpZHgsIGNvbnN0IGNoYXIqIHN0cikgewotICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBtQ3VycmVudCkKLSAgICAgICAgcmV0dXJuOwotICAgIGRlbGV0ZVtdIG1BcnJheVtpZHhdOwotICAgIGludCBsZW4gPSBzdHJsZW4oc3RyKTsKLSAgICBtQXJyYXlbaWR4XSA9IG5ldyBjaGFyW2xlbisxXTsKLSAgICBtZW1jcHkobUFycmF5W2lkeF0sIHN0ciwgbGVuKzEpOwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1N5c3RlbUNsb2NrLmNwcCBiL2xpYnMvdXRpbHMvU3lzdGVtQ2xvY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhhYzEwLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvU3lzdGVtQ2xvY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qCi0gKiBTeXN0ZW0gY2xvY2sgZnVuY3Rpb25zLgotICovCi0KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfYWxhcm0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TeXN0ZW1DbG9jay5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jZGVmaW5lIExPR19UQUcgIlN5c3RlbUNsb2NrIgotI2luY2x1ZGUgInV0aWxzL0xvZy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qCi0gKiBTZXQgdGhlIGN1cnJlbnQgdGltZS4gIFRoaXMgb25seSB3b3JrcyB3aGVuIHJ1bm5pbmcgYXMgcm9vdC4KLSAqLwotaW50IHNldEN1cnJlbnRUaW1lTWlsbGlzKGludDY0X3QgbWlsbGlzKQotewotI2lmIFdJTjMyCi0gICAgLy8gbm90IGltcGxlbWVudGVkCi0gICAgcmV0dXJuIC0xOwotI2Vsc2UKLSAgICBzdHJ1Y3QgdGltZXZhbCB0djsKLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7Ci0gICAgaW50IGZkOwotICAgIGludCByZXM7Ci0jZW5kaWYKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIGlmIChtaWxsaXMgPD0gMCB8fCBtaWxsaXMgLyAxMDAwTEwgPj0gSU5UX01BWCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdHYudHZfc2VjID0gKHRpbWVfdCkgKG1pbGxpcyAvIDEwMDBMTCk7Ci0gICAgdHYudHZfdXNlYyA9IChzdXNlY29uZHNfdCkgKChtaWxsaXMgJSAxMDAwTEwpICogMTAwMExMKTsKLQotICAgIEFMT0dEKCJTZXR0aW5nIHRpbWUgb2YgZGF5IHRvIHNlYz0lZFxuIiwgKGludCkgdHYudHZfc2VjKTsKLQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIGZkID0gb3BlbigiL2Rldi9hbGFybSIsIE9fUkRXUik7Ci0gICAgaWYoZmQgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gb3BlbiBhbGFybSBkcml2ZXI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHRzLnR2X3NlYyA9IHR2LnR2X3NlYzsKLSAgICB0cy50dl9uc2VjID0gdHYudHZfdXNlYyAqIDEwMDA7Ci0gICAgcmVzID0gaW9jdGwoZmQsIEFORFJPSURfQUxBUk1fU0VUX1JUQywgJnRzKTsKLSAgICBpZihyZXMgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gc2V0IHJ0YyB0byAlbGQ6ICVzXG4iLCB0di50dl9zZWMsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldCA9IC0xOwotICAgIH0KLSAgICBjbG9zZShmZCk7Ci0jZWxzZQotICAgIGlmIChzZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gc2V0IGNsb2NrIHRvICVkLiVkOiAlc1xuIiwKLSAgICAgICAgICAgIChpbnQpIHR2LnR2X3NlYywgKGludCkgdHYudHZfdXNlYywgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gcmV0OwotI2VuZGlmIC8vIFdJTjMyCi19Ci0KLS8qCi0gKiBuYXRpdmUgcHVibGljIHN0YXRpYyBsb25nIHVwdGltZU1pbGxpcygpOwotICovCi1pbnQ2NF90IHVwdGltZU1pbGxpcygpCi17Ci0gICAgaW50NjRfdCB3aGVuID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIHJldHVybiAoaW50NjRfdCkgbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHdoZW4pOwotfQotCi0vKgotICogbmF0aXZlIHB1YmxpYyBzdGF0aWMgbG9uZyBlbGFwc2VkUmVhbHRpbWUoKTsKLSAqLwotaW50NjRfdCBlbGFwc2VkUmVhbHRpbWUoKQotewotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIHN0YXRpYyBpbnQgc19mZCA9IC0xOwotCi0gICAgaWYgKHNfZmQgPT0gLTEpIHsKLSAgICAgICAgaW50IGZkID0gb3BlbigiL2Rldi9hbGFybSIsIE9fUkRPTkxZKTsKLSAgICAgICAgaWYgKGFuZHJvaWRfYXRvbWljX2NtcHhjaGcoLTEsIGZkLCAmc19mZCkpIHsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLSAgICBpbnQgcmVzdWx0ID0gaW9jdGwoc19mZCwKLSAgICAgICAgICAgIEFORFJPSURfQUxBUk1fR0VUX1RJTUUoQU5EUk9JRF9BTEFSTV9FTEFQU0VEX1JFQUxUSU1FKSwgJnRzKTsKLQotICAgIGlmIChyZXN1bHQgPT0gMCkgewotICAgICAgICBpbnQ2NF90IHdoZW4gPSBzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHRzLnR2X3NlYykgKyB0cy50dl9uc2VjOwotICAgICAgICByZXR1cm4gKGludDY0X3QpIG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh3aGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBYWFg6IHRoZXJlIHdhcyBhbiBlcnJvciwgcHJvYmFibHkgYmVjYXVzZSB0aGUgZHJpdmVyIGRpZG4ndAotICAgICAgICAvLyBleGlzdCAuLi4gdGhpcyBzaG91bGQgcmV0dXJuCi0gICAgICAgIC8vIGEgcmVhbCBlcnJvciwgbGlrZSBhbiBleGNlcHRpb24hCi0gICAgICAgIGludDY0X3Qgd2hlbiA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICAgICAgcmV0dXJuIChpbnQ2NF90KSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMod2hlbik7Ci0gICAgfQotI2Vsc2UKLSAgICBpbnQ2NF90IHdoZW4gPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgcmV0dXJuIChpbnQ2NF90KSBuYW5vc2Vjb25kc190b19taWxsaXNlY29uZHMod2hlbik7Ci0jZW5kaWYKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvVGV4dE91dHB1dC5jcHAgYi9saWJzL3V0aWxzL1RleHRPdXRwdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDQ4MjNkLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvVGV4dE91dHB1dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9UZXh0T3V0cHV0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGV4dE91dHB1dDo6VGV4dE91dHB1dCgpIHsgCi19Ci0KLVRleHRPdXRwdXQ6On5UZXh0T3V0cHV0KCkgeyAKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGJvb2wgdmFsKQotewotICAgIGlmICh2YWwpIHRvLnByaW50KCJ0cnVlIiwgNCk7Ci0gICAgZWxzZSB0by5wcmludCgiZmFsc2UiLCA1KTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGludCB2YWwpCi17Ci0gICAgY2hhciBidWZbMTZdOwotICAgIHNwcmludGYoYnVmLCAiJWQiLCB2YWwpOwotICAgIHRvLnByaW50KGJ1Ziwgc3RybGVuKGJ1ZikpOwotICAgIHJldHVybiB0bzsKLX0KLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgbG9uZyB2YWwpCi17Ci0gICAgY2hhciBidWZbMTZdOwotICAgIHNwcmludGYoYnVmLCAiJWxkIiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIHVuc2lnbmVkIGludCB2YWwpCi17Ci0gICAgY2hhciBidWZbMTZdOwotICAgIHNwcmludGYoYnVmLCAiJXUiLCB2YWwpOwotICAgIHRvLnByaW50KGJ1Ziwgc3RybGVuKGJ1ZikpOwotICAgIHJldHVybiB0bzsKLX0KLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0gICAgY2hhciBidWZbMTZdOwotICAgIHNwcmludGYoYnVmLCAiJWx1IiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGxvbmcgbG9uZyB2YWwpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIHNwcmludGYoYnVmLCAiJUxkIiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCi17Ci0gICAgY2hhciBidWZbMzJdOwotICAgIHNwcmludGYoYnVmLCAiJUx1IiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLXN0YXRpYyBUZXh0T3V0cHV0JiBwcmludF9mbG9hdChUZXh0T3V0cHV0JiB0bywgZG91YmxlIHZhbHVlKQotewotICAgIGNoYXIgYnVmWzY0XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVnIiwgdmFsdWUpOwotICAgIGlmKCAhc3RyY2hyKGJ1ZiwgJy4nKSAmJiAhc3RyY2hyKGJ1ZiwgJ2UnKSAmJgotICAgICAgICAhc3RyY2hyKGJ1ZiwgJ0UnKSApIHsKLSAgICAgICAgc3RybmNhdChidWYsICIuMCIsIHNpemVvZihidWYpLTEpOwotICAgIH0KLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGZsb2F0IHZhbCkKLXsKLSAgICByZXR1cm4gcHJpbnRfZmxvYXQodG8sdmFsKTsKLX0KLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgZG91YmxlIHZhbCkKLXsKLSAgICByZXR1cm4gcHJpbnRfZmxvYXQodG8sdmFsKTsKLX0KLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgdm9pZCogdmFsKQotewotICAgIGNoYXIgYnVmWzE2XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVwIiwgdmFsKTsKLSAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKLSAgICByZXR1cm4gdG87Ci19Ci0KLXN0YXRpYyB2b2lkIHRleHRPdXRwdXRQcmludGVyKHZvaWQqIGNvb2tpZSwgY29uc3QgY2hhciogdHh0KQotewotICAgICgoVGV4dE91dHB1dCopY29va2llKS0+cHJpbnQodHh0LCBzdHJsZW4odHh0KSk7Ci19Ci0KLVRleHRPdXRwdXQmIG9wZXJhdG9yPDwoVGV4dE91dHB1dCYgdG8sIGNvbnN0IFR5cGVDb2RlJiB2YWwpCi17Ci0gICAgcHJpbnRUeXBlQ29kZSh2YWwudHlwZUNvZGUoKSwgdGV4dE91dHB1dFByaW50ZXIsICh2b2lkKikmdG8pOwotICAgIHJldHVybiB0bzsKLX0KLQotSGV4RHVtcDo6SGV4RHVtcChjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplLCBzaXplX3QgYnl0ZXNQZXJMaW5lKQotICAgIDogbUJ1ZmZlcihidWYpCi0gICAgLCBtU2l6ZShzaXplKQotICAgICwgbUJ5dGVzUGVyTGluZShieXRlc1BlckxpbmUpCi0gICAgLCBtU2luZ2xlTGluZUN1dG9mZigxNikKLSAgICAsIG1BbGlnbm1lbnQoNCkKLSAgICAsIG1DQXJyYXlTdHlsZShmYWxzZSkKLXsKLSAgICBpZiAoYnl0ZXNQZXJMaW5lID49IDE2KSBtQWxpZ25tZW50ID0gNDsKLSAgICBlbHNlIGlmIChieXRlc1BlckxpbmUgPj0gOCkgbUFsaWdubWVudCA9IDI7Ci0gICAgZWxzZSBtQWxpZ25tZW50ID0gMTsKLX0KLQotVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3QgSGV4RHVtcCYgdmFsKQotewotICAgIHByaW50SGV4RGF0YSgwLCB2YWwuYnVmZmVyKCksIHZhbC5zaXplKCksIHZhbC5ieXRlc1BlckxpbmUoKSwKLSAgICAgICAgdmFsLnNpbmdsZUxpbmVDdXRvZmYoKSwgdmFsLmFsaWdubWVudCgpLCB2YWwuY2FycmF5U3R5bGUoKSwKLSAgICAgICAgdGV4dE91dHB1dFByaW50ZXIsICh2b2lkKikmdG8pOwotICAgIHJldHVybiB0bzsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAgYi9saWJzL3V0aWxzL1RocmVhZHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjIwN2Y1Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvVGhyZWFkcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vICNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgImxpYnV0aWxzLnRocmVhZHMiCi0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSMgaW5jbHVkZSA8cHRocmVhZC5oPgotIyBpbmNsdWRlIDxzY2hlZC5oPgotIyBpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSMgaW5jbHVkZSA8YmlvbmljX3B0aHJlYWQuaD4KLSNlbmRpZgotI2VsaWYgZGVmaW5lZChIQVZFX1dJTjMyX1RIUkVBRFMpCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jIGluY2x1ZGUgPHByb2Nlc3MuaD4KLSMgZGVmaW5lIEhBVkVfQ1JFQVRFVEhSRUFEICAvLyBDeWd3aW4sIHZzLiBIQVZFX19CRUdJTlRIUkVBREVYIGZvciBNaW5HVwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKEhBVkVfUFJDVEwpCi0jaW5jbHVkZSA8c3lzL3ByY3RsLmg+Ci0jZW5kaWYKLQotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogICAgICBUaHJlYWQgd3JhcHBlcnMKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKgotICogQ3JlYXRlIGFuZCBydW4gYSBuZXcgdGhyZWFkLgotICoKLSAqIFdlIGNyZWF0ZSBpdCAiZGV0YWNoZWQiLCBzbyBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmLgotICovCi0KLXR5cGVkZWYgdm9pZCogKCphbmRyb2lkX3B0aHJlYWRfZW50cnkpKHZvaWQqKTsKLQotc3RhdGljIHB0aHJlYWRfb25jZV90IGdEb1NjaGVkdWxpbmdHcm91cE9uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLXN0YXRpYyBib29sIGdEb1NjaGVkdWxpbmdHcm91cCA9IHRydWU7Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRG9TY2hlZHVsaW5nR3JvdXAodm9pZCkgewotICAgIGNoYXIgYnVmW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaW50IGxlbiA9IHByb3BlcnR5X2dldCgiZGVidWcuc3lzLm5vc2NoZWRncm91cHMiLCBidWYsICIiKTsKLSAgICBpZiAobGVuID4gMCkgewotICAgICAgICBpbnQgdGVtcDsKLSAgICAgICAgaWYgKHNzY2FuZihidWYsICIlZCIsICZ0ZW1wKSA9PSAxKSB7Ci0gICAgICAgICAgICBnRG9TY2hlZHVsaW5nR3JvdXAgPSB0ZW1wID09IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0cnVjdCB0aHJlYWRfZGF0YV90IHsKLSAgICB0aHJlYWRfZnVuY190ICAgZW50cnlGdW5jdGlvbjsKLSAgICB2b2lkKiAgICAgICAgICAgdXNlckRhdGE7Ci0gICAgaW50ICAgICAgICAgICAgIHByaW9yaXR5OwotICAgIGNoYXIgKiAgICAgICAgICB0aHJlYWROYW1lOwotCi0gICAgLy8gd2UgdXNlIHRoaXMgdHJhbXBvbGluZSB3aGVuIHdlIG5lZWQgdG8gc2V0IHRoZSBwcmlvcml0eSB3aXRoCi0gICAgLy8gbmljZS9zZXRwcmlvcml0eSwgYW5kIG5hbWUgd2l0aCBwcmN0bC4KLSAgICBzdGF0aWMgaW50IHRyYW1wb2xpbmUoY29uc3QgdGhyZWFkX2RhdGFfdCogdCkgewotICAgICAgICB0aHJlYWRfZnVuY190IGYgPSB0LT5lbnRyeUZ1bmN0aW9uOwotICAgICAgICB2b2lkKiB1ID0gdC0+dXNlckRhdGE7Ci0gICAgICAgIGludCBwcmlvID0gdC0+cHJpb3JpdHk7Ci0gICAgICAgIGNoYXIgKiBuYW1lID0gdC0+dGhyZWFkTmFtZTsKLSAgICAgICAgZGVsZXRlIHQ7Ci0gICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgcHJpbyk7Ci0gICAgICAgIHB0aHJlYWRfb25jZSgmZ0RvU2NoZWR1bGluZ0dyb3VwT25jZSwgY2hlY2tEb1NjaGVkdWxpbmdHcm91cCk7Ci0gICAgICAgIGlmIChnRG9TY2hlZHVsaW5nR3JvdXApIHsKLSAgICAgICAgICAgIGlmIChwcmlvID49IEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHNldF9zY2hlZF9wb2xpY3koYW5kcm9pZEdldFRpZCgpLCBTUF9CQUNLR1JPVU5EKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0X3NjaGVkX3BvbGljeShhbmRyb2lkR2V0VGlkKCksIFNQX0ZPUkVHUk9VTkQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAobmFtZSkgewotI2lmIGRlZmluZWQoSEFWRV9QUkNUTCkKLSAgICAgICAgICAgIC8vIE1hYyBPUyBkb2Vzbid0IGhhdmUgdGhpcywgYW5kIHdlIGJ1aWxkIGxpYnV0aWwgZm9yIHRoZSBob3N0IHRvbwotICAgICAgICAgICAgaW50IGhhc0F0ID0gMDsKLSAgICAgICAgICAgIGludCBoYXNEb3QgPSAwOwotICAgICAgICAgICAgY2hhciAqcyA9IG5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoKnMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKnMgPT0gJy4nKSBoYXNEb3QgPSAxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCpzID09ICdAJykgaGFzQXQgPSAxOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsZW4gPSBzIC0gbmFtZTsKLSAgICAgICAgICAgIGlmIChsZW4gPCAxNSB8fCBoYXNBdCB8fCAhaGFzRG90KSB7Ci0gICAgICAgICAgICAgICAgcyA9IG5hbWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHMgPSBuYW1lICsgbGVuIC0gMTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIHMsIDAsIDAsIDApOwotI2VuZGlmCi0gICAgICAgICAgICBmcmVlKG5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmKHUpOwotICAgIH0KLX07Ci0KLWludCBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGhyZWFkU3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfdGhyZWFkX2lkX3QgKnRocmVhZElkKQotewotICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7IAotICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKLSAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKLQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUyAgLyogdmFsZ3JpbmQgaXMgcmVqZWN0aW5nIFJULXByaW9yaXR5IGNyZWF0ZSByZXFzICovCi0gICAgaWYgKHRocmVhZFByaW9yaXR5ICE9IFBSSU9SSVRZX0RFRkFVTFQgfHwgdGhyZWFkTmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIE5vdyB0aGF0IHRoZSBwdGhyZWFkX3QgaGFzIGEgbWV0aG9kIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQKLSAgICAgICAgLy8gYW5kcm9pZF90aHJlYWRfaWRfdCAocGlkKSBmcm9tIHB0aHJlYWRfdCwgaXQgd291bGQgYmUgcG9zc2libGUgdG8gYXZvaWQKLSAgICAgICAgLy8gdGhpcyB0cmFtcG9saW5lIGluIHNvbWUgY2FzZXMgYXMgdGhlIHBhcmVudCBjb3VsZCBzZXQgdGhlIHByb3BlcnRpZXMKLSAgICAgICAgLy8gZm9yIHRoZSBjaGlsZC4gIEhvd2V2ZXIsIHRoZXJlIHdvdWxkIGJlIGEgcmFjZSBjb25kaXRpb24gYmVjYXVzZSB0aGUKLSAgICAgICAgLy8gY2hpbGQgYmVjb21lcyByZWFkeSBpbW1lZGlhdGVseSwgYW5kIGl0IGRvZXNuJ3Qgd29yayBmb3IgdGhlIG5hbWUuCi0gICAgICAgIC8vIHByY3RsKFBSX1NFVF9OQU1FKSBvbmx5IHdvcmtzIGZvciBzZWxmOyBwcmN0bChQUl9TRVRfVEhSRUFEX05BTUUpIHdhcwotICAgICAgICAvLyBwcm9wb3NlZCBidXQgbm90IHlldCBhY2NlcHRlZC4KLSAgICAgICAgdGhyZWFkX2RhdGFfdCogdCA9IG5ldyB0aHJlYWRfZGF0YV90OwotICAgICAgICB0LT5wcmlvcml0eSA9IHRocmVhZFByaW9yaXR5OwotICAgICAgICB0LT50aHJlYWROYW1lID0gdGhyZWFkTmFtZSA/IHN0cmR1cCh0aHJlYWROYW1lKSA6IE5VTEw7Ci0gICAgICAgIHQtPmVudHJ5RnVuY3Rpb24gPSBlbnRyeUZ1bmN0aW9uOwotICAgICAgICB0LT51c2VyRGF0YSA9IHVzZXJEYXRhOwotICAgICAgICBlbnRyeUZ1bmN0aW9uID0gKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCkmdGhyZWFkX2RhdGFfdDo6dHJhbXBvbGluZTsKLSAgICAgICAgdXNlckRhdGEgPSB0OyAgICAgICAgICAgIAotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKHRocmVhZFN0YWNrU2l6ZSkgewotICAgICAgICBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRyLCB0aHJlYWRTdGFja1NpemUpOwotICAgIH0KLSAgICAKLSAgICBlcnJubyA9IDA7Ci0gICAgcHRocmVhZF90IHRocmVhZDsKLSAgICBpbnQgcmVzdWx0ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZCwgJmF0dHIsCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkX3B0aHJlYWRfZW50cnkpZW50cnlGdW5jdGlvbiwgdXNlckRhdGEpOwotICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKLSAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgQUxPR0UoImFuZHJvaWRDcmVhdGVSYXdUaHJlYWRFdGMgZmFpbGVkIChlbnRyeT0lcCwgcmVzPSVkLCBlcnJubz0lZClcbiIKLSAgICAgICAgICAgICAiKGFuZHJvaWQgdGhyZWFkUHJpb3JpdHk9JWQpIiwKLSAgICAgICAgICAgIGVudHJ5RnVuY3Rpb24sIHJlc3VsdCwgZXJybm8sIHRocmVhZFByaW9yaXR5KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gTm90ZSB0aGF0ICp0aHJlYWRJRCBpcyBkaXJlY3RseSBhdmFpbGFibGUgdG8gdGhlIHBhcmVudCBvbmx5LCBhcyBpdCBpcwotICAgIC8vIGFzc2lnbmVkIGFmdGVyIHRoZSBjaGlsZCBzdGFydHMuICBVc2UgbWVtb3J5IGJhcnJpZXIgLyBsb2NrIGlmIHRoZSBjaGlsZAotICAgIC8vIG9yIG90aGVyIHRocmVhZHMgYWxzbyBuZWVkIGFjY2Vzcy4KLSAgICBpZiAodGhyZWFkSWQgIT0gTlVMTCkgewotICAgICAgICAqdGhyZWFkSWQgPSAoYW5kcm9pZF90aHJlYWRfaWRfdCl0aHJlYWQ7IC8vIFhYWDogdGhpcyBpcyBub3QgcG9ydGFibGUKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLXN0YXRpYyBwdGhyZWFkX3QgYW5kcm9pZF90aHJlYWRfaWRfdF90b19wdGhyZWFkKGFuZHJvaWRfdGhyZWFkX2lkX3QgdGhyZWFkKQotewotICAgIHJldHVybiAocHRocmVhZF90KSB0aHJlYWQ7Ci19Ci0jZW5kaWYKLQotYW5kcm9pZF90aHJlYWRfaWRfdCBhbmRyb2lkR2V0VGhyZWFkSWQoKQotewotICAgIHJldHVybiAoYW5kcm9pZF90aHJlYWRfaWRfdClwdGhyZWFkX3NlbGYoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2VsaWYgZGVmaW5lZChIQVZFX1dJTjMyX1RIUkVBRFMpCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBUcmFtcG9saW5lIHRvIG1ha2UgdXMgX19zdGRjYWxsLWNvbXBsaWFudC4KLSAqCi0gKiBXZSdyZSBleHBlY3RlZCB0byBkZWxldGUgInZEZXRhaWxzIiB3aGVuIHdlJ3JlIGRvbmUuCi0gKi8KLXN0cnVjdCB0aHJlYWREZXRhaWxzIHsKLSAgICBpbnQgKCpmdW5jKSh2b2lkKik7Ci0gICAgdm9pZCogYXJnOwotfTsKLXN0YXRpYyBfX3N0ZGNhbGwgdW5zaWduZWQgaW50IHRocmVhZEludGVybWVkaWFyeSh2b2lkKiB2RGV0YWlscykKLXsKLSAgICBzdHJ1Y3QgdGhyZWFkRGV0YWlscyogcERldGFpbHMgPSAoc3RydWN0IHRocmVhZERldGFpbHMqKSB2RGV0YWlsczsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgcmVzdWx0ID0gKCoocERldGFpbHMtPmZ1bmMpKShwRGV0YWlscy0+YXJnKTsKLQotICAgIGRlbGV0ZSBwRGV0YWlsczsKLQotICAgIEFMT0coTE9HX1ZFUkJPU0UsICJ0aHJlYWQiLCAidGhyZWFkIGV4aXRpbmdcbiIpOwotICAgIHJldHVybiAodW5zaWduZWQgaW50KSByZXN1bHQ7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYW5kIHJ1biBhIG5ldyB0aHJlYWQuCi0gKi8KLXN0YXRpYyBib29sIGRvQ3JlYXRlVGhyZWFkKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBmbiwgdm9pZCogYXJnLCBhbmRyb2lkX3RocmVhZF9pZF90ICppZCkKLXsKLSAgICBIQU5ETEUgaFRocmVhZDsKLSAgICBzdHJ1Y3QgdGhyZWFkRGV0YWlscyogcERldGFpbHMgPSBuZXcgdGhyZWFkRGV0YWlsczsgLy8gbXVzdCBiZSBvbiBoZWFwCi0gICAgdW5zaWduZWQgaW50IHRocmRhZGRyOwotCi0gICAgcERldGFpbHMtPmZ1bmMgPSBmbjsKLSAgICBwRGV0YWlscy0+YXJnID0gYXJnOwotCi0jaWYgZGVmaW5lZChIQVZFX19CRUdJTlRIUkVBREVYKQotICAgIGhUaHJlYWQgPSAoSEFORExFKSBfYmVnaW50aHJlYWRleChOVUxMLCAwLCB0aHJlYWRJbnRlcm1lZGlhcnksIHBEZXRhaWxzLCAwLAotICAgICAgICAgICAgICAgICAgICAmdGhyZGFkZHIpOwotICAgIGlmIChoVGhyZWFkID09IDApCi0jZWxpZiBkZWZpbmVkKEhBVkVfQ1JFQVRFVEhSRUFEKQotICAgIGhUaHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpIHRocmVhZEludGVybWVkaWFyeSwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBwRGV0YWlscywgMCwgKERXT1JEKikgJnRocmRhZGRyKTsKLSAgICBpZiAoaFRocmVhZCA9PSBOVUxMKQotI2VuZGlmCi0gICAgewotICAgICAgICBBTE9HKExPR19XQVJOLCAidGhyZWFkIiwgIldBUk5JTkc6IHRocmVhZCBjcmVhdGUgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIGRlZmluZWQoSEFWRV9DUkVBVEVUSFJFQUQpCi0gICAgLyogY2xvc2UgdGhlIG1hbmFnZW1lbnQgaGFuZGxlICovCi0gICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7Ci0jZW5kaWYKLQotICAgIGlmIChpZCAhPSBOVUxMKSB7Ci0gICAgICAJKmlkID0gKGFuZHJvaWRfdGhyZWFkX2lkX3QpdGhyZGFkZHI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0aHJlYWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGhyZWFkUHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3RocmVhZF9pZF90ICp0aHJlYWRJZCkKLXsKLSAgICByZXR1cm4gZG9DcmVhdGVUaHJlYWQoICBmbiwgdXNlckRhdGEsIHRocmVhZElkKTsKLX0KLQotYW5kcm9pZF90aHJlYWRfaWRfdCBhbmRyb2lkR2V0VGhyZWFkSWQoKQotewotICAgIHJldHVybiAoYW5kcm9pZF90aHJlYWRfaWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2Vsc2UKLSNlcnJvciAiVGhyZWFkcyBub3Qgc3VwcG9ydGVkIgotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IGFuZHJvaWRDcmVhdGVUaHJlYWQoYW5kcm9pZF90aHJlYWRfZnVuY190IGZuLCB2b2lkKiBhcmcpCi17Ci0gICAgcmV0dXJuIGNyZWF0ZVRocmVhZEV0YyhmbiwgYXJnKTsKLX0KLQotaW50IGFuZHJvaWRDcmVhdGVUaHJlYWRHZXRJRChhbmRyb2lkX3RocmVhZF9mdW5jX3QgZm4sIHZvaWQgKmFyZywgYW5kcm9pZF90aHJlYWRfaWRfdCAqaWQpCi17Ci0gICAgcmV0dXJuIGNyZWF0ZVRocmVhZEV0YyhmbiwgYXJnLCAiYW5kcm9pZDp1bm5hbWVkX3RocmVhZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxULCAwLCBpZCk7Ci19Ci0KLXN0YXRpYyBhbmRyb2lkX2NyZWF0ZV90aHJlYWRfZm4gZ0NyZWF0ZVRocmVhZEZuID0gYW5kcm9pZENyZWF0ZVJhd1RocmVhZEV0YzsKLQotaW50IGFuZHJvaWRDcmVhdGVUaHJlYWRFdGMoYW5kcm9pZF90aHJlYWRfZnVuY190IGVudHJ5RnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRocmVhZFByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0aHJlYWRTdGFja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF90aHJlYWRfaWRfdCAqdGhyZWFkSWQpCi17Ci0gICAgcmV0dXJuIGdDcmVhdGVUaHJlYWRGbihlbnRyeUZ1bmN0aW9uLCB1c2VyRGF0YSwgdGhyZWFkTmFtZSwKLSAgICAgICAgdGhyZWFkUHJpb3JpdHksIHRocmVhZFN0YWNrU2l6ZSwgdGhyZWFkSWQpOwotfQotCi12b2lkIGFuZHJvaWRTZXRDcmVhdGVUaHJlYWRGdW5jKGFuZHJvaWRfY3JlYXRlX3RocmVhZF9mbiBmdW5jKQotewotICAgIGdDcmVhdGVUaHJlYWRGbiA9IGZ1bmM7Ci19Ci0KLXBpZF90IGFuZHJvaWRHZXRUaWQoKQotewotI2lmZGVmIEhBVkVfR0VUVElECi0gICAgcmV0dXJuIGdldHRpZCgpOwotI2Vsc2UKLSAgICByZXR1cm4gZ2V0cGlkKCk7Ci0jZW5kaWYKLX0KLQotaW50IGFuZHJvaWRTZXRUaHJlYWRTY2hlZHVsaW5nR3JvdXAocGlkX3QgdGlkLCBpbnQgZ3JwKQotewotICAgIGlmIChncnAgPiBBTkRST0lEX1RHUk9VUF9NQVggfHwgZ3JwIDwgMCkgeyAKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0gICAgcHRocmVhZF9vbmNlKCZnRG9TY2hlZHVsaW5nR3JvdXBPbmNlLCBjaGVja0RvU2NoZWR1bGluZ0dyb3VwKTsKLSAgICBpZiAoZ0RvU2NoZWR1bGluZ0dyb3VwKSB7Ci0gICAgICAgIC8vIHNldF9zY2hlZF9wb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCB0aWQgPT0gMAotICAgICAgICBpZiAodGlkID09IDApIHsKLSAgICAgICAgICAgIHRpZCA9IGFuZHJvaWRHZXRUaWQoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2V0X3NjaGVkX3BvbGljeSh0aWQsIChncnAgPT0gQU5EUk9JRF9UR1JPVVBfQkdfTk9OSU5URVJBQ1QpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX0JBQ0tHUk9VTkQgOiBTUF9GT1JFR1JPVU5EKSkgewotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0gICAgCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1pbnQgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHBpZF90IHRpZCwgaW50IHByaSkKLXsKLSAgICBpbnQgcmMgPSAwOwotICAgIAotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSAgICBpbnQgbGFzdGVyciA9IDA7Ci0KLSAgICBwdGhyZWFkX29uY2UoJmdEb1NjaGVkdWxpbmdHcm91cE9uY2UsIGNoZWNrRG9TY2hlZHVsaW5nR3JvdXApOwotICAgIGlmIChnRG9TY2hlZHVsaW5nR3JvdXApIHsKLSAgICAgICAgLy8gc2V0X3NjaGVkX3BvbGljeSBkb2VzIG5vdCBzdXBwb3J0IHRpZCA9PSAwCi0gICAgICAgIGludCBwb2xpY3lfdGlkOwotICAgICAgICBpZiAodGlkID09IDApIHsKLSAgICAgICAgICAgIHBvbGljeV90aWQgPSBhbmRyb2lkR2V0VGlkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb2xpY3lfdGlkID0gdGlkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmkgPj0gQU5EUk9JRF9QUklPUklUWV9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICByYyA9IHNldF9zY2hlZF9wb2xpY3kocG9saWN5X3RpZCwgU1BfQkFDS0dST1VORCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCB0aWQpID49IEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCkgewotICAgICAgICAgICAgcmMgPSBzZXRfc2NoZWRfcG9saWN5KHBvbGljeV90aWQsIFNQX0ZPUkVHUk9VTkQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJjKSB7Ci0gICAgICAgIGxhc3RlcnIgPSBlcnJubzsKLSAgICB9Ci0KLSAgICBpZiAoc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCB0aWQsIHByaSkgPCAwKSB7Ci0gICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJybm8gPSBsYXN0ZXJyOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIHJldHVybiByYzsKLX0KLQotaW50IGFuZHJvaWRHZXRUaHJlYWRQcmlvcml0eShwaWRfdCB0aWQpIHsKLSNpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRFMpCi0gICAgcmV0dXJuIGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgdGlkKTsKLSNlbHNlCi0gICAgcmV0dXJuIEFORFJPSURfUFJJT1JJVFlfTk9STUFMOwotI2VuZGlmCi19Ci0KLWludCBhbmRyb2lkR2V0VGhyZWFkU2NoZWR1bGluZ0dyb3VwKHBpZF90IHRpZCkKLXsKLSAgICBpbnQgcmV0ID0gQU5EUk9JRF9UR1JPVVBfREVGQVVMVDsKLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLSAgICAvLyBjb252ZW50aW9uIGlzIHRvIG5vdCBjYWxsIGdldC9zZXRfc2NoZWRfcG9saWN5IG1ldGhvZHMgaWYgZGlzYWJsZWQgYnkgcHJvcGVydHkKLSAgICBwdGhyZWFkX29uY2UoJmdEb1NjaGVkdWxpbmdHcm91cE9uY2UsIGNoZWNrRG9TY2hlZHVsaW5nR3JvdXApOwotICAgIGlmIChnRG9TY2hlZHVsaW5nR3JvdXApIHsKLSAgICAgICAgU2NoZWRQb2xpY3kgcG9saWN5OwotICAgICAgICAvLyBnZXRfc2NoZWRfcG9saWN5IGRvZXMgbm90IHN1cHBvcnQgdGlkID09IDAKLSAgICAgICAgaWYgKHRpZCA9PSAwKSB7Ci0gICAgICAgICAgICB0aWQgPSBhbmRyb2lkR2V0VGlkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdldF9zY2hlZF9wb2xpY3kodGlkLCAmcG9saWN5KSA8IDApIHsKLSAgICAgICAgICAgIHJldCA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICAgICAgICAgIGNhc2UgU1BfQkFDS0dST1VORDoKLSAgICAgICAgICAgICAgICByZXQgPSBBTkRST0lEX1RHUk9VUF9CR19OT05JTlRFUkFDVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1BfRk9SRUdST1VORDoKLSAgICAgICAgICAgICAgICByZXQgPSBBTkRST0lEX1RHUk9VUF9GR19CT09TVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGFzIGVudW0gU2NoZWRQb2xpY3kgZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgdmFsdWVzCi0gICAgICAgICAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogICAgICBNdXRleCBjbGFzcwotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKi8KLQotI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEUykKLS8vIGltcGxlbWVudGVkIGFzIGlubGluZXMgaW4gdGhyZWFkcy5oCi0jZWxpZiBkZWZpbmVkKEhBVkVfV0lOMzJfVEhSRUFEUykKLQotTXV0ZXg6Ok11dGV4KCkKLXsKLSAgICBIQU5ETEUgaE11dGV4OwotCi0gICAgYXNzZXJ0KHNpemVvZihoTXV0ZXgpID09IHNpemVvZihtU3RhdGUpKTsKLQotICAgIGhNdXRleCA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKTsKLSAgICBtU3RhdGUgPSAodm9pZCopIGhNdXRleDsKLX0KLQotTXV0ZXg6Ok11dGV4KGNvbnN0IGNoYXIqIG5hbWUpCi17Ci0gICAgLy8gWFhYOiBuYW1lIG5vdCB1c2VkIGZvciBub3cKLSAgICBIQU5ETEUgaE11dGV4OwotCi0gICAgYXNzZXJ0KHNpemVvZihoTXV0ZXgpID09IHNpemVvZihtU3RhdGUpKTsKLQotICAgIGhNdXRleCA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKTsKLSAgICBtU3RhdGUgPSAodm9pZCopIGhNdXRleDsKLX0KLQotTXV0ZXg6Ok11dGV4KGludCB0eXBlLCBjb25zdCBjaGFyKiBuYW1lKQotewotICAgIC8vIFhYWDogdHlwZSBhbmQgbmFtZSBub3QgdXNlZCBmb3Igbm93Ci0gICAgSEFORExFIGhNdXRleDsKLQotICAgIGFzc2VydChzaXplb2YoaE11dGV4KSA9PSBzaXplb2YobVN0YXRlKSk7Ci0KLSAgICBoTXV0ZXggPSBDcmVhdGVNdXRleChOVUxMLCBGQUxTRSwgTlVMTCk7Ci0gICAgbVN0YXRlID0gKHZvaWQqKSBoTXV0ZXg7Ci19Ci0KLU11dGV4Ojp+TXV0ZXgoKQotewotICAgIENsb3NlSGFuZGxlKChIQU5ETEUpIG1TdGF0ZSk7Ci19Ci0KLXN0YXR1c190IE11dGV4Ojpsb2NrKCkKLXsKLSAgICBEV09SRCBkd1dhaXRSZXN1bHQ7Ci0gICAgZHdXYWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdCgoSEFORExFKSBtU3RhdGUsIElORklOSVRFKTsKLSAgICByZXR1cm4gZHdXYWl0UmVzdWx0ICE9IFdBSVRfT0JKRUNUXzAgPyAtMSA6IE5PX0VSUk9SOwotfQotCi12b2lkIE11dGV4Ojp1bmxvY2soKQotewotICAgIGlmICghUmVsZWFzZU11dGV4KChIQU5ETEUpIG1TdGF0ZSkpCi0gICAgICAgIEFMT0coTE9HX1dBUk4sICJ0aHJlYWQiLCAiV0FSTklORzogYmFkIHJlc3VsdCBmcm9tIHVubG9ja2luZyBtdXRleFxuIik7Ci19Ci0KLXN0YXR1c190IE11dGV4Ojp0cnlMb2NrKCkKLXsKLSAgICBEV09SRCBkd1dhaXRSZXN1bHQ7Ci0KLSAgICBkd1dhaXRSZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KChIQU5ETEUpIG1TdGF0ZSwgMCk7Ci0gICAgaWYgKGR3V2FpdFJlc3VsdCAhPSBXQUlUX09CSkVDVF8wICYmIGR3V2FpdFJlc3VsdCAhPSBXQUlUX1RJTUVPVVQpCi0gICAgICAgIEFMT0coTE9HX1dBUk4sICJ0aHJlYWQiLCAiV0FSTklORzogYmFkIHJlc3VsdCBmcm9tIHRyeS1sb2NraW5nIG11dGV4XG4iKTsKLSAgICByZXR1cm4gKGR3V2FpdFJlc3VsdCA9PSBXQUlUX09CSkVDVF8wKSA/IDAgOiAtMTsKLX0KLQotI2Vsc2UKLSNlcnJvciAiU29tZWJvZHkgZm9yZ290IHRvIGltcGxlbWVudCB0aHJlYWRzIGZvciB0aGlzIHBsYXRmb3JtLiIKLSNlbmRpZgotCi0KLS8qCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICAgICAgQ29uZGl0aW9uIGNsYXNzCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi0jaWYgZGVmaW5lZChIQVZFX1BUSFJFQURTKQotLy8gaW1wbGVtZW50ZWQgYXMgaW5saW5lcyBpbiB0aHJlYWRzLmgKLSNlbGlmIGRlZmluZWQoSEFWRV9XSU4zMl9USFJFQURTKQotCi0vKgotICogV2luZG93cyBkb2Vzbid0IGhhdmUgYSBjb25kaXRpb24gdmFyaWFibGUgc29sdXRpb24uICBJdCdzIHBvc3NpYmxlCi0gKiB0byBjcmVhdGUgb25lLCBidXQgaXQncyBlYXN5IHRvIGdldCBpdCB3cm9uZy4gIEZvciBhIGRpc2N1c3Npb24sIGFuZAotICogdGhlIG9yaWdpbiBvZiB0aGlzIGltcGxlbWVudGF0aW9uLCBzZWU6Ci0gKgotICogIGh0dHA6Ly93d3cuY3Mud3VzdGwuZWR1L35zY2htaWR0L3dpbjMyLWN2LTEuaHRtbAotICoKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG93biBvbiB0aGUgcGFnZSBkb2VzIE5PVCBmb2xsb3cgUE9TSVggc2VtYW50aWNzLgotICogQXMgYW4gb3B0aW1pemF0aW9uIHRoZXkgcmVxdWlyZSBhY3F1aXJpbmcgdGhlIGV4dGVybmFsIG11dGV4IGJlZm9yZQotICogY2FsbGluZyBzaWduYWwoKSBhbmQgYnJvYWRjYXN0KCksIHdoZXJlYXMgUE9TSVggb25seSByZXF1aXJlcyBncmFiYmluZwotICogaXQgYmVmb3JlIGNhbGxpbmcgd2FpdCgpLiAgVGhlIGltcGxlbWVudGF0aW9uIGhlcmUgaGFzIGJlZW4gdW4tb3B0aW1pemVkCi0gKiB0byBoYXZlIHRoZSBjb3JyZWN0IGJlaGF2aW9yLgotICovCi10eXBlZGVmIHN0cnVjdCBXaW5Db25kaXRpb24gewotICAgIC8vIE51bWJlciBvZiB3YWl0aW5nIHRocmVhZHMuCi0gICAgaW50ICAgICAgICAgICAgICAgICB3YWl0ZXJzQ291bnQ7Ci0KLSAgICAvLyBTZXJpYWxpemUgYWNjZXNzIHRvIHdhaXRlcnNDb3VudC4KLSAgICBDUklUSUNBTF9TRUNUSU9OICAgIHdhaXRlcnNDb3VudExvY2s7Ci0KLSAgICAvLyBTZW1hcGhvcmUgdXNlZCB0byBxdWV1ZSB1cCB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBjb25kaXRpb24gdG8KLSAgICAvLyBiZWNvbWUgc2lnbmFsZWQuCi0gICAgSEFORExFICAgICAgICAgICAgICBzZW1hOwotCi0gICAgLy8gQW4gYXV0by1yZXNldCBldmVudCB1c2VkIGJ5IHRoZSBicm9hZGNhc3Qvc2lnbmFsIHRocmVhZCB0byB3YWl0Ci0gICAgLy8gZm9yIGFsbCB0aGUgd2FpdGluZyB0aHJlYWQocykgdG8gd2FrZSB1cCBhbmQgYmUgcmVsZWFzZWQgZnJvbQotICAgIC8vIHRoZSBzZW1hcGhvcmUuCi0gICAgSEFORExFICAgICAgICAgICAgICB3YWl0ZXJzRG9uZTsKLQotICAgIC8vIFRoaXMgbXV0ZXggd291bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmIHdlIHJlcXVpcmVkIHRoYXQgdGhlIGNhbGxlcgotICAgIC8vIGxvY2sgdGhlIGV4dGVybmFsIG11dGV4IGJlZm9yZSBjYWxsaW5nIHNpZ25hbCgpIGFuZCBicm9hZGNhc3QoKS4KLSAgICAvLyBJJ20gdHJ5aW5nIHRvIG1pbWljIHB0aHJlYWQgc2VtYW50aWNzIHRob3VnaC4KLSAgICBIQU5ETEUgICAgICAgICAgICAgIGludGVybmFsTXV0ZXg7Ci0KLSAgICAvLyBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIHdlcmUgYnJvYWRjYXN0aW5nIG9yIHNpZ25hbGluZy4gIFRoaXMKLSAgICAvLyBhbGxvd3MgdXMgdG8gb3B0aW1pemUgdGhlIGNvZGUgaWYgd2UncmUganVzdCBzaWduYWxpbmcuCi0gICAgYm9vbCAgICAgICAgICAgICAgICB3YXNCcm9hZGNhc3Q7Ci0KLSAgICBzdGF0dXNfdCB3YWl0KFdpbkNvbmRpdGlvbiogY29uZFN0YXRlLCBIQU5ETEUgaE11dGV4LCBuc2Vjc190KiBhYnN0aW1lKQotICAgIHsKLSAgICAgICAgLy8gSW5jcmVtZW50IHRoZSB3YWl0IGNvdW50LCBhdm9pZGluZyByYWNlIGNvbmRpdGlvbnMuCi0gICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZjb25kU3RhdGUtPndhaXRlcnNDb3VudExvY2spOwotICAgICAgICBjb25kU3RhdGUtPndhaXRlcnNDb3VudCsrOwotICAgICAgICAvL3ByaW50ZigiKysrIHdhaXQ6IGluY3Igd2FpdGVyc0NvdW50IHRvICVkICh0aWQ9JWxkKVxuIiwKLSAgICAgICAgLy8gICAgY29uZFN0YXRlLT53YWl0ZXJzQ291bnQsIGdldFRocmVhZElkKCkpOwotICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICAKLSAgICAgICAgRFdPUkQgdGltZW91dCA9IElORklOSVRFOwotICAgICAgICBpZiAoYWJzdGltZSkgewotICAgICAgICAgICAgbnNlY3NfdCByZWx0aW1lID0gKmFic3RpbWUgLSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICBpZiAocmVsdGltZSA8IDApCi0gICAgICAgICAgICAgICAgcmVsdGltZSA9IDA7Ci0gICAgICAgICAgICB0aW1lb3V0ID0gcmVsdGltZS8xMDAwMDAwOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBBdG9taWNhbGx5IHJlbGVhc2UgdGhlIGV4dGVybmFsIG11dGV4IGFuZCB3YWl0IG9uIHRoZSBzZW1hcGhvcmUuCi0gICAgICAgIERXT1JEIHJlcyA9Ci0gICAgICAgICAgICBTaWduYWxPYmplY3RBbmRXYWl0KGhNdXRleCwgY29uZFN0YXRlLT5zZW1hLCB0aW1lb3V0LCBGQUxTRSk7Ci0gICAgCi0gICAgICAgIC8vcHJpbnRmKCIrKysgd2FpdDogYXdha2UgKHRpZD0lbGQpXG4iLCBnZXRUaHJlYWRJZCgpKTsKLSAgICAKLSAgICAgICAgLy8gUmVhY3F1aXJlIGxvY2sgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLgotICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICAKLSAgICAgICAgLy8gTm8gbG9uZ2VyIHdhaXRpbmcuCi0gICAgICAgIGNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50LS07Ci0gICAgCi0gICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSdyZSB0aGUgbGFzdCB3YWl0ZXIgYWZ0ZXIgYSBicm9hZGNhc3QuCi0gICAgICAgIGJvb2wgbGFzdFdhaXRlciA9IChjb25kU3RhdGUtPndhc0Jyb2FkY2FzdCAmJiBjb25kU3RhdGUtPndhaXRlcnNDb3VudCA9PSAwKTsKLSAgICAKLSAgICAgICAgLy9wcmludGYoIisrKyB3YWl0OiBsYXN0V2FpdGVyPSVkICh3YXNCYz0lZCB3Yz0lZClcbiIsCi0gICAgICAgIC8vICAgIGxhc3RXYWl0ZXIsIGNvbmRTdGF0ZS0+d2FzQnJvYWRjYXN0LCBjb25kU3RhdGUtPndhaXRlcnNDb3VudCk7Ci0gICAgCi0gICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZjb25kU3RhdGUtPndhaXRlcnNDb3VudExvY2spOwotICAgIAotICAgICAgICAvLyBJZiB3ZSdyZSB0aGUgbGFzdCB3YWl0ZXIgdGhyZWFkIGR1cmluZyB0aGlzIHBhcnRpY3VsYXIgYnJvYWRjYXN0Ci0gICAgICAgIC8vIHRoZW4gc2lnbmFsIGJyb2FkY2FzdCgpIHRoYXQgd2UncmUgYWxsIGF3YWtlLiAgSXQnbGwgZHJvcCB0aGUKLSAgICAgICAgLy8gaW50ZXJuYWwgbXV0ZXguCi0gICAgICAgIGlmIChsYXN0V2FpdGVyKSB7Ci0gICAgICAgICAgICAvLyBBdG9taWNhbGx5IHNpZ25hbCB0aGUgIndhaXRlcnNEb25lIiBldmVudCBhbmQgd2FpdCB1bnRpbCB3ZQotICAgICAgICAgICAgLy8gY2FuIGFjcXVpcmUgdGhlIGludGVybmFsIG11dGV4LiAgV2Ugd2FudCB0byBkbyB0aGlzIGluIG9uZSBzdGVwCi0gICAgICAgICAgICAvLyBiZWNhdXNlIGl0IGVuc3VyZXMgdGhhdCBldmVyeWJvZHkgaXMgaW4gdGhlIG11dGV4IEZJRk8gYmVmb3JlCi0gICAgICAgICAgICAvLyBhbnkgdGhyZWFkIGhhcyBhIGNoYW5jZSB0byBydW4uICBXaXRob3V0IGl0LCBhbm90aGVyIHRocmVhZAotICAgICAgICAgICAgLy8gY291bGQgd2FrZSB1cCwgZG8gd29yaywgYW5kIGhvcCBiYWNrIGluIGFoZWFkIG9mIHVzLgotICAgICAgICAgICAgU2lnbmFsT2JqZWN0QW5kV2FpdChjb25kU3RhdGUtPndhaXRlcnNEb25lLCBjb25kU3RhdGUtPmludGVybmFsTXV0ZXgsCi0gICAgICAgICAgICAgICAgSU5GSU5JVEUsIEZBTFNFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEdyYWIgdGhlIGludGVybmFsIG11dGV4LgotICAgICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChjb25kU3RhdGUtPmludGVybmFsTXV0ZXgsIElORklOSVRFKTsKLSAgICAgICAgfQotICAgIAotICAgICAgICAvLyBSZWxlYXNlIHRoZSBpbnRlcm5hbCBhbmQgZ3JhYiB0aGUgZXh0ZXJuYWwuCi0gICAgICAgIFJlbGVhc2VNdXRleChjb25kU3RhdGUtPmludGVybmFsTXV0ZXgpOwotICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhNdXRleCwgSU5GSU5JVEUpOwotICAgIAotICAgICAgICByZXR1cm4gcmVzID09IFdBSVRfT0JKRUNUXzAgPyBOT19FUlJPUiA6IC0xOwotICAgIH0KLX0gV2luQ29uZGl0aW9uOwotCi0vKgotICogQ29uc3RydWN0b3IuICBTZXQgdXAgdGhlIFdpbkNvbmRpdGlvbiBzdHVmZi4KLSAqLwotQ29uZGl0aW9uOjpDb25kaXRpb24oKQotewotICAgIFdpbkNvbmRpdGlvbiogY29uZFN0YXRlID0gbmV3IFdpbkNvbmRpdGlvbjsKLQotICAgIGNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50ID0gMDsKLSAgICBjb25kU3RhdGUtPndhc0Jyb2FkY2FzdCA9IGZhbHNlOwotICAgIC8vIHNlbWFwaG9yZTogbm8gc2VjdXJpdHksIGluaXRpYWwgdmFsdWUgb2YgMAotICAgIGNvbmRTdGF0ZS0+c2VtYSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAweDdmZmZmZmZmLCBOVUxMKTsKLSAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZjb25kU3RhdGUtPndhaXRlcnNDb3VudExvY2spOwotICAgIC8vIGF1dG8tcmVzZXQgZXZlbnQsIG5vdCBzaWduYWxlZCBpbml0aWFsbHkKLSAgICBjb25kU3RhdGUtPndhaXRlcnNEb25lID0gQ3JlYXRlRXZlbnQoTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMKTsKLSAgICAvLyB1c2VkIHNvIHdlIGRvbid0IGhhdmUgdG8gbG9jayBleHRlcm5hbCBtdXRleCBvbiBzaWduYWwvYnJvYWRjYXN0Ci0gICAgY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4ID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpOwotCi0gICAgbVN0YXRlID0gY29uZFN0YXRlOwotfQotCi0vKgotICogRGVzdHJ1Y3Rvci4gIEZyZWUgV2luZG93cyByZXNvdXJjZXMgYXMgd2VsbCBhcyBvdXIgYWxsb2NhdGVkIHN0b3JhZ2UuCi0gKi8KLUNvbmRpdGlvbjo6fkNvbmRpdGlvbigpCi17Ci0gICAgV2luQ29uZGl0aW9uKiBjb25kU3RhdGUgPSAoV2luQ29uZGl0aW9uKikgbVN0YXRlOwotICAgIGlmIChjb25kU3RhdGUgIT0gTlVMTCkgewotICAgICAgICBDbG9zZUhhbmRsZShjb25kU3RhdGUtPnNlbWEpOwotICAgICAgICBDbG9zZUhhbmRsZShjb25kU3RhdGUtPndhaXRlcnNEb25lKTsKLSAgICAgICAgZGVsZXRlIGNvbmRTdGF0ZTsKLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgQ29uZGl0aW9uOjp3YWl0KE11dGV4JiBtdXRleCkKLXsKLSAgICBXaW5Db25kaXRpb24qIGNvbmRTdGF0ZSA9IChXaW5Db25kaXRpb24qKSBtU3RhdGU7Ci0gICAgSEFORExFIGhNdXRleCA9IChIQU5ETEUpIG11dGV4Lm1TdGF0ZTsKLSAgICAKLSAgICByZXR1cm4gKChXaW5Db25kaXRpb24qKW1TdGF0ZSktPndhaXQoY29uZFN0YXRlLCBoTXV0ZXgsIE5VTEwpOwotfQotCi1zdGF0dXNfdCBDb25kaXRpb246OndhaXRSZWxhdGl2ZShNdXRleCYgbXV0ZXgsIG5zZWNzX3QgcmVsdGltZSkKLXsKLSAgICBXaW5Db25kaXRpb24qIGNvbmRTdGF0ZSA9IChXaW5Db25kaXRpb24qKSBtU3RhdGU7Ci0gICAgSEFORExFIGhNdXRleCA9IChIQU5ETEUpIG11dGV4Lm1TdGF0ZTsKLSAgICBuc2Vjc190IGFic1RpbWUgPSBzeXN0ZW1UaW1lKCkrcmVsdGltZTsKLQotICAgIHJldHVybiAoKFdpbkNvbmRpdGlvbiopbVN0YXRlKS0+d2FpdChjb25kU3RhdGUsIGhNdXRleCwgJmFic1RpbWUpOwotfQotCi0vKgotICogU2lnbmFsIHRoZSBjb25kaXRpb24gdmFyaWFibGUsIGFsbG93aW5nIG9uZSB0aHJlYWQgdG8gY29udGludWUuCi0gKi8KLXZvaWQgQ29uZGl0aW9uOjpzaWduYWwoKQotewotICAgIFdpbkNvbmRpdGlvbiogY29uZFN0YXRlID0gKFdpbkNvbmRpdGlvbiopIG1TdGF0ZTsKLQotICAgIC8vIExvY2sgdGhlIGludGVybmFsIG11dGV4LiAgVGhpcyBlbnN1cmVzIHRoYXQgd2UgZG9uJ3QgY2xhc2ggd2l0aAotICAgIC8vIGJyb2FkY2FzdCgpLgotICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4LCBJTkZJTklURSk7Ci0KLSAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICBib29sIGhhdmVXYWl0ZXJzID0gKGNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50ID4gMCk7Ci0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50TG9jayk7Ci0KLSAgICAvLyBJZiBubyB3YWl0ZXJzLCB0aGVuIHRoaXMgaXMgYSBuby1vcC4gIE90aGVyd2lzZSwga25vY2sgdGhlIHNlbWFwaG9yZQotICAgIC8vIGRvd24gYSBub3RjaC4KLSAgICBpZiAoaGF2ZVdhaXRlcnMpCi0gICAgICAgIFJlbGVhc2VTZW1hcGhvcmUoY29uZFN0YXRlLT5zZW1hLCAxLCAwKTsKLQotICAgIC8vIFJlbGVhc2UgaW50ZXJuYWwgbXV0ZXguCi0gICAgUmVsZWFzZU11dGV4KGNvbmRTdGF0ZS0+aW50ZXJuYWxNdXRleCk7Ci19Ci0KLS8qCi0gKiBTaWduYWwgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZSwgYWxsb3dpbmcgYWxsIHRocmVhZHMgdG8gY29udGludWUuCi0gKgotICogRmlyc3Qgd2UgaGF2ZSB0byB3YWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhlIHNlbWFwaG9yZSwgdGhlbgotICogd2Ugd2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZSBhY3R1YWxseSBiZWVuIHdva2VuIGJlZm9yZQotICogcmVsZWFzaW5nIHRoZSBpbnRlcm5hbCBtdXRleC4gIFRoaXMgZW5zdXJlcyB0aGF0IGFsbCB0aHJlYWRzIGFyZSB3b2tlbi4KLSAqLwotdm9pZCBDb25kaXRpb246OmJyb2FkY2FzdCgpCi17Ci0gICAgV2luQ29uZGl0aW9uKiBjb25kU3RhdGUgPSAoV2luQ29uZGl0aW9uKikgbVN0YXRlOwotCi0gICAgLy8gTG9jayB0aGUgaW50ZXJuYWwgbXV0ZXguICBUaGlzIGtlZXBzIHRoZSBndXlzIHdlJ3JlIHdha2luZyB1cAotICAgIC8vIGZyb20gZ2V0dGluZyB0b28gZmFyLgotICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZFN0YXRlLT5pbnRlcm5hbE11dGV4LCBJTkZJTklURSk7Ci0KLSAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICBib29sIGhhdmVXYWl0ZXJzID0gZmFsc2U7Ci0KLSAgICBpZiAoY29uZFN0YXRlLT53YWl0ZXJzQ291bnQgPiAwKSB7Ci0gICAgICAgIGhhdmVXYWl0ZXJzID0gdHJ1ZTsKLSAgICAgICAgY29uZFN0YXRlLT53YXNCcm9hZGNhc3QgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChoYXZlV2FpdGVycykgewotICAgICAgICAvLyBXYWtlIHVwIGFsbCB0aGUgd2FpdGVycy4KLSAgICAgICAgUmVsZWFzZVNlbWFwaG9yZShjb25kU3RhdGUtPnNlbWEsIGNvbmRTdGF0ZS0+d2FpdGVyc0NvdW50LCAwKTsKLQotICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLQotICAgICAgICAvLyBXYWl0IGZvciBhbGwgYXdha2VuZWQgdGhyZWFkcyB0byBhY3F1aXJlIHRoZSBjb3VudGluZyBzZW1hcGhvcmUuCi0gICAgICAgIC8vIFRoZSBsYXN0IGd1eSB3aG8gd2FzIHdhaXRpbmcgc2V0cyB0aGlzLgotICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRTdGF0ZS0+d2FpdGVyc0RvbmUsIElORklOSVRFKTsKLQotICAgICAgICAvLyBSZXNldCB3YXNCcm9hZGNhc3QuICAoTm8gY3JpdCBzZWN0aW9uIG5lZWRlZCBiZWNhdXNlIG5vYm9keQotICAgICAgICAvLyBlbHNlIGNhbiB3YWtlIHVwIHRvIHBva2UgYXQgaXQuKQotICAgICAgICBjb25kU3RhdGUtPndhc0Jyb2FkY2FzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbm90aGluZyB0byBkbwotICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmY29uZFN0YXRlLT53YWl0ZXJzQ291bnRMb2NrKTsKLSAgICB9Ci0KLSAgICAvLyBSZWxlYXNlIGludGVybmFsIG11dGV4LgotICAgIFJlbGVhc2VNdXRleChjb25kU3RhdGUtPmludGVybmFsTXV0ZXgpOwotfQotCi0jZWxzZQotI2Vycm9yICJjb25kaXRpb24gdmFyaWFibGVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiBUaGlzIGlzIG91ciB0aHJlYWQgb2JqZWN0IQotICovCi0KLVRocmVhZDo6VGhyZWFkKGJvb2wgY2FuQ2FsbEphdmEpCi0gICAgOiAgIG1DYW5DYWxsSmF2YShjYW5DYWxsSmF2YSksCi0gICAgICAgIG1UaHJlYWQodGhyZWFkX2lkX3QoLTEpKSwKLSAgICAgICAgbUxvY2soIlRocmVhZDo6bUxvY2siKSwKLSAgICAgICAgbVN0YXR1cyhOT19FUlJPUiksCi0gICAgICAgIG1FeGl0UGVuZGluZyhmYWxzZSksIG1SdW5uaW5nKGZhbHNlKQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgICAgICAsIG1UaWQoLTEpCi0jZW5kaWYKLXsKLX0KLQotVGhyZWFkOjp+VGhyZWFkKCkKLXsKLX0KLQotc3RhdHVzX3QgVGhyZWFkOjpyZWFkeVRvUnVuKCkKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFRocmVhZDo6cnVuKGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgcHJpb3JpdHksIHNpemVfdCBzdGFjaykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCi0gICAgaWYgKG1SdW5uaW5nKSB7Ci0gICAgICAgIC8vIHRocmVhZCBhbHJlYWR5IHN0YXJ0ZWQKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8vIHJlc2V0IHN0YXR1cyBhbmQgZXhpdFBlbmRpbmcgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZSwgc28gd2UgY2FuCi0gICAgLy8gdHJ5IGFnYWluIGFmdGVyIGFuIGVycm9yIGhhcHBlbmVkIChlaXRoZXIgYmVsb3csIG9yIGluIHJlYWR5VG9SdW4oKSkKLSAgICBtU3RhdHVzID0gTk9fRVJST1I7Ci0gICAgbUV4aXRQZW5kaW5nID0gZmFsc2U7Ci0gICAgbVRocmVhZCA9IHRocmVhZF9pZF90KC0xKTsKLSAgICAKLSAgICAvLyBob2xkIGEgc3Ryb25nIHJlZmVyZW5jZSBvbiBvdXJzZWxmCi0gICAgbUhvbGRTZWxmID0gdGhpczsKLQotICAgIG1SdW5uaW5nID0gdHJ1ZTsKLQotICAgIGJvb2wgcmVzOwotICAgIGlmIChtQ2FuQ2FsbEphdmEpIHsKLSAgICAgICAgcmVzID0gY3JlYXRlVGhyZWFkRXRjKF90aHJlYWRMb29wLAotICAgICAgICAgICAgICAgIHRoaXMsIG5hbWUsIHByaW9yaXR5LCBzdGFjaywgJm1UaHJlYWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IGFuZHJvaWRDcmVhdGVSYXdUaHJlYWRFdGMoX3RocmVhZExvb3AsCi0gICAgICAgICAgICAgICAgdGhpcywgbmFtZSwgcHJpb3JpdHksIHN0YWNrLCAmbVRocmVhZCk7Ci0gICAgfQotICAgIAotICAgIGlmIChyZXMgPT0gZmFsc2UpIHsKLSAgICAgICAgbVN0YXR1cyA9IFVOS05PV05fRVJST1I7ICAgLy8gc29tZXRoaW5nIGhhcHBlbmVkIQotICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotICAgICAgICBtVGhyZWFkID0gdGhyZWFkX2lkX3QoLTEpOwotICAgICAgICBtSG9sZFNlbGYuY2xlYXIoKTsgIC8vICJ0aGlzIiBtYXkgaGF2ZSBnb25lIGF3YXkgYWZ0ZXIgdGhpcy4KLQotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0gICAgCi0gICAgLy8gRG8gbm90IHJlZmVyIHRvIG1TdGF0dXMgaGVyZTogVGhlIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcgKG1heSwgaW4gZmFjdAotICAgIC8vIGFscmVhZHkgaGF2ZSBleGl0ZWQgd2l0aCBhIHZhbGlkIG1TdGF0dXMgcmVzdWx0KS4gVGhlIE5PX0VSUk9SIGluZGljYXRpb24KLSAgICAvLyBoZXJlIG1lcmVseSBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bGx5IHN0YXJ0aW5nIHRoZSB0aHJlYWQgYW5kIGRvZXMgbm90Ci0gICAgLy8gaW1wbHkgc3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbi9leGVjdXRpb24uCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotCi0gICAgLy8gRXhpdGluZyBzY29wZSBvZiBtTG9jayBpcyBhIG1lbW9yeSBiYXJyaWVyIGFuZCBhbGxvd3MgbmV3IHRocmVhZCB0byBydW4KLX0KLQotaW50IFRocmVhZDo6X3RocmVhZExvb3Aodm9pZCogdXNlcikKLXsKLSAgICBUaHJlYWQqIGNvbnN0IHNlbGYgPSBzdGF0aWNfY2FzdDxUaHJlYWQqPih1c2VyKTsKLQotICAgIHNwPFRocmVhZD4gc3Ryb25nKHNlbGYtPm1Ib2xkU2VsZik7Ci0gICAgd3A8VGhyZWFkPiB3ZWFrKHN0cm9uZyk7Ci0gICAgc2VsZi0+bUhvbGRTZWxmLmNsZWFyKCk7Ci0KLSNpZmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICAvLyB0aGlzIGlzIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgd2l0aCBnZGIKLSAgICBzZWxmLT5tVGlkID0gZ2V0dGlkKCk7Ci0jZW5kaWYKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gICAgZG8gewotICAgICAgICBib29sIHJlc3VsdDsKLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgc2VsZi0+bVN0YXR1cyA9IHNlbGYtPnJlYWR5VG9SdW4oKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IChzZWxmLT5tU3RhdHVzID09IE5PX0VSUk9SKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCAmJiAhc2VsZi0+ZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgIC8vIEJpbmRlciB0aHJlYWRzIChhbmQgbWF5YmUgb3RoZXJzKSByZWx5IG9uIHRocmVhZExvb3AKLSAgICAgICAgICAgICAgICAvLyBydW5uaW5nIGF0IGxlYXN0IG9uY2UgYWZ0ZXIgYSBzdWNjZXNzZnVsIDo6cmVhZHlUb1J1bigpCi0gICAgICAgICAgICAgICAgLy8gKHVubGVzcywgb2YgY291cnNlLCB0aGUgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZW4gYXNrZWQgdG8gZXhpdAotICAgICAgICAgICAgICAgIC8vIGF0IHRoYXQgcG9pbnQpLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aHJlYWRzIGFyZSBlc3NlbnRpYWxseSB1c2VkIGxpa2UgdGhpczoKLSAgICAgICAgICAgICAgICAvLyAgIChuZXcgVGhyZWFkU3ViY2xhc3MoKSktPnJ1bigpOwotICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsZXIgdGhlcmVmb3JlIGRvZXMgbm90IHJldGFpbiBhIHN0cm9uZyByZWZlcmVuY2UgdG8KLSAgICAgICAgICAgICAgICAvLyB0aGUgdGhyZWFkIGFuZCB0aGUgdGhyZWFkIHdvdWxkIHNpbXBseSBkaXNhcHBlYXIgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgLy8gc3VjY2Vzc2Z1bCA6OnJlYWR5VG9SdW4oKSBjYWxsIGluc3RlYWQgb2YgZW50ZXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcCBhdCBsZWFzdCBvbmNlLgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYtPnRocmVhZExvb3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYtPnRocmVhZExvb3AoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGVzdGFibGlzaCBhIHNjb3BlIGZvciBtTG9jawotICAgICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChzZWxmLT5tTG9jayk7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gZmFsc2UgfHwgc2VsZi0+bUV4aXRQZW5kaW5nKSB7Ci0gICAgICAgICAgICBzZWxmLT5tRXhpdFBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgc2VsZi0+bVJ1bm5pbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIC8vIGNsZWFyIHRocmVhZCBJRCBzbyB0aGF0IHJlcXVlc3RFeGl0QW5kV2FpdCgpIGRvZXMgbm90IGV4aXQgaWYKLSAgICAgICAgICAgIC8vIGNhbGxlZCBieSBhIG5ldyB0aHJlYWQgdXNpbmcgdGhlIHNhbWUgdGhyZWFkIElEIGFzIHRoaXMgb25lLgotICAgICAgICAgICAgc2VsZi0+bVRocmVhZCA9IHRocmVhZF9pZF90KC0xKTsKLSAgICAgICAgICAgIC8vIG5vdGUgdGhhdCBpbnRlcmVzdGVkIG9ic2VydmVycyBibG9ja2VkIGluIHJlcXVlc3RFeGl0QW5kV2FpdCBhcmUKLSAgICAgICAgICAgIC8vIGF3b2tlbiBieSBicm9hZGNhc3QsIGJ1dCBibG9ja2VkIG9uIG1Mb2NrIHVudGlsIGJyZWFrIGV4aXRzIHNjb3BlCi0gICAgICAgICAgICBzZWxmLT5tVGhyZWFkRXhpdGVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gUmVsZWFzZSBvdXIgc3Ryb25nIHJlZmVyZW5jZSwgdG8gbGV0IGEgY2hhbmNlIHRvIHRoZSB0aHJlYWQKLSAgICAgICAgLy8gdG8gZGllIGEgcGVhY2VmdWwgZGVhdGguCi0gICAgICAgIHN0cm9uZy5jbGVhcigpOwotICAgICAgICAvLyBBbmQgaW1tZWRpYXRlbHksIHJlLWFjcXVpcmUgYSBzdHJvbmcgcmVmZXJlbmNlIGZvciB0aGUgbmV4dCBsb29wCi0gICAgICAgIHN0cm9uZyA9IHdlYWsucHJvbW90ZSgpOwotICAgIH0gd2hpbGUoc3Ryb25nICE9IDApOwotICAgIAotICAgIHJldHVybiAwOwotfQotCi12b2lkIFRocmVhZDo6cmVxdWVzdEV4aXQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbUV4aXRQZW5kaW5nID0gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1UaHJlYWQgPT0gZ2V0VGhyZWFkSWQoKSkgewotICAgICAgICBBTE9HVygKLSAgICAgICAgIlRocmVhZCAodGhpcz0lcCk6IGRvbid0IGNhbGwgd2FpdEZvckV4aXQoKSBmcm9tIHRoaXMgIgotICAgICAgICAiVGhyZWFkIG9iamVjdCdzIHRocmVhZC4gSXQncyBhIGd1YXJhbnRlZWQgZGVhZGxvY2shIiwKLSAgICAgICAgdGhpcyk7Ci0KLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwotICAgIH0KLSAgICAKLSAgICBtRXhpdFBlbmRpbmcgPSB0cnVlOwotCi0gICAgd2hpbGUgKG1SdW5uaW5nID09IHRydWUpIHsKLSAgICAgICAgbVRocmVhZEV4aXRlZENvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0gICAgLy8gVGhpcyBuZXh0IGxpbmUgaXMgcHJvYmFibHkgbm90IG5lZWRlZCBhbnkgbW9yZSwgYnV0IGlzIGJlaW5nIGxlZnQgZm9yCi0gICAgLy8gaGlzdG9yaWNhbCByZWZlcmVuY2UuIE5vdGUgdGhhdCBlYWNoIGludGVyZXN0ZWQgcGFydHkgd2lsbCBjbGVhciBmbGFnLgotICAgIG1FeGl0UGVuZGluZyA9IGZhbHNlOwotCi0gICAgcmV0dXJuIG1TdGF0dXM7Ci19Ci0KLXN0YXR1c190IFRocmVhZDo6am9pbigpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVRocmVhZCA9PSBnZXRUaHJlYWRJZCgpKSB7Ci0gICAgICAgIEFMT0dXKAotICAgICAgICAiVGhyZWFkICh0aGlzPSVwKTogZG9uJ3QgY2FsbCBqb2luKCkgZnJvbSB0aGlzICIKLSAgICAgICAgIlRocmVhZCBvYmplY3QncyB0aHJlYWQuIEl0J3MgYSBndWFyYW50ZWVkIGRlYWRsb2NrISIsCi0gICAgICAgIHRoaXMpOwotCi0gICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKLSAgICB9Ci0KLSAgICB3aGlsZSAobVJ1bm5pbmcgPT0gdHJ1ZSkgewotICAgICAgICBtVGhyZWFkRXhpdGVkQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtU3RhdHVzOwotfQotCi0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi1waWRfdCBUaHJlYWQ6OmdldFRpZCgpIGNvbnN0Ci17Ci0gICAgLy8gbVRpZCBpcyBub3QgZGVmaW5lZCB1bnRpbCB0aGUgY2hpbGQgaW5pdGlhbGl6ZXMgaXQsIGFuZCB0aGUgY2FsbGVyIG1heSBuZWVkIGl0IGVhcmxpZXIKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHBpZF90IHRpZDsKLSAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgcHRocmVhZF90IHB0aHJlYWQgPSBhbmRyb2lkX3RocmVhZF9pZF90X3RvX3B0aHJlYWQobVRocmVhZCk7Ci0gICAgICAgIHRpZCA9IF9fcHRocmVhZF9nZXR0aWQocHRocmVhZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coIlRocmVhZCAodGhpcz0lcCk6IGdldFRpZCgpIGlzIHVuZGVmaW5lZCBiZWZvcmUgcnVuKCkiLCB0aGlzKTsKLSAgICAgICAgdGlkID0gLTE7Ci0gICAgfQotICAgIHJldHVybiB0aWQ7Ci19Ci0jZW5kaWYKLQotYm9vbCBUaHJlYWQ6OmV4aXRQZW5kaW5nKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtRXhpdFBlbmRpbmc7Ci19Ci0KLQotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvVGltZXJzLmNwcCBiL2xpYnMvdXRpbHMvVGltZXJzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiNDcwMS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1RpbWVycy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBUaW1lciBmdW5jdGlvbnMuCi0vLwotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWZkZWYgSEFWRV9XSU4zMl9USFJFQURTCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLW5zZWNzX3Qgc3lzdGVtVGltZShpbnQgY2xvY2spCi17Ci0jaWYgZGVmaW5lZChIQVZFX1BPU0lYX0NMT0NLUykKLSAgICBzdGF0aWMgY29uc3QgY2xvY2tpZF90IGNsb2Nrc1tdID0gewotICAgICAgICAgICAgQ0xPQ0tfUkVBTFRJTUUsCi0gICAgICAgICAgICBDTE9DS19NT05PVE9OSUMsCi0gICAgICAgICAgICBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsCi0gICAgICAgICAgICBDTE9DS19USFJFQURfQ1BVVElNRV9JRAotICAgIH07Ci0gICAgc3RydWN0IHRpbWVzcGVjIHQ7Ci0gICAgdC50dl9zZWMgPSB0LnR2X25zZWMgPSAwOwotICAgIGNsb2NrX2dldHRpbWUoY2xvY2tzW2Nsb2NrXSwgJnQpOwotICAgIHJldHVybiBuc2Vjc190KHQudHZfc2VjKSoxMDAwMDAwMDAwTEwgKyB0LnR2X25zZWM7Ci0jZWxzZQotICAgIC8vIHdlIGRvbid0IHN1cHBvcnQgdGhlIGNsb2NrcyBoZXJlLgotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0gICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwOwotICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7Ci0gICAgcmV0dXJuIG5zZWNzX3QodC50dl9zZWMpKjEwMDAwMDAwMDBMTCArIG5zZWNzX3QodC50dl91c2VjKSoxMDAwTEw7Ci0jZW5kaWYKLX0KLQotaW50IHRvTWlsbGlzZWNvbmRUaW1lb3V0RGVsYXkobnNlY3NfdCByZWZlcmVuY2VUaW1lLCBuc2Vjc190IHRpbWVvdXRUaW1lKQotewotICAgIGludCB0aW1lb3V0RGVsYXlNaWxsaXM7Ci0gICAgaWYgKHRpbWVvdXRUaW1lID4gcmVmZXJlbmNlVGltZSkgewotICAgICAgICB1aW50NjRfdCB0aW1lb3V0RGVsYXkgPSB1aW50NjRfdCh0aW1lb3V0VGltZSAtIHJlZmVyZW5jZVRpbWUpOwotICAgICAgICBpZiAodGltZW91dERlbGF5ID4gdWludDY0X3QoKElOVF9NQVggLSAxKSAqIDEwMDAwMDBMTCkpIHsKLSAgICAgICAgICAgIHRpbWVvdXREZWxheU1pbGxpcyA9IC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGltZW91dERlbGF5TWlsbGlzID0gKHRpbWVvdXREZWxheSArIDk5OTk5OUxMKSAvIDEwMDAwMDBMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRpbWVvdXREZWxheU1pbGxpcyA9IDA7Ci0gICAgfQotICAgIHJldHVybiB0aW1lb3V0RGVsYXlNaWxsaXM7Ci19Ci0KLQotLyoKLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogICAgICBEdXJhdGlvblRpbWVyCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqLwotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLy8gU3RhcnQgdGhlIHRpbWVyLgotdm9pZCBEdXJhdGlvblRpbWVyOjpzdGFydCh2b2lkKQotewotICAgIGdldHRpbWVvZmRheSgmbVN0YXJ0V2hlbiwgTlVMTCk7Ci19Ci0KLS8vIFN0b3AgdGhlIHRpbWVyLgotdm9pZCBEdXJhdGlvblRpbWVyOjpzdG9wKHZvaWQpCi17Ci0gICAgZ2V0dGltZW9mZGF5KCZtU3RvcFdoZW4sIE5VTEwpOwotfQotCi0vLyBHZXQgdGhlIGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcy4KLWxvbmcgbG9uZyBEdXJhdGlvblRpbWVyOjpkdXJhdGlvblVzZWNzKHZvaWQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIChsb25nKSBzdWJ0cmFjdFRpbWV2YWxzKCZtU3RvcFdoZW4sICZtU3RhcnRXaGVuKTsKLX0KLQotLy8gU3VidHJhY3QgdHdvIHRpbWV2YWxzLiAgUmV0dXJucyB0aGUgZGlmZmVyZW5jZSAocHR2MS1wdHYyKSBpbgotLy8gbWljcm9zZWNvbmRzLgotLypzdGF0aWMqLyBsb25nIGxvbmcgRHVyYXRpb25UaW1lcjo6c3VidHJhY3RUaW1ldmFscyhjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHR2MSwKLSAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCogcHR2MikKLXsKLSAgICBsb25nIGxvbmcgc3RvcCAgPSAoKGxvbmcgbG9uZykgcHR2MS0+dHZfc2VjKSAqIDEwMDAwMDBMTCArCi0gICAgICAgICAgICAgICAgICAgICAgKChsb25nIGxvbmcpIHB0djEtPnR2X3VzZWMpOwotICAgIGxvbmcgbG9uZyBzdGFydCA9ICgobG9uZyBsb25nKSBwdHYyLT50dl9zZWMpICogMTAwMDAwMExMICsKLSAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykgcHR2Mi0+dHZfdXNlYyk7Ci0gICAgcmV0dXJuIHN0b3AgLSBzdGFydDsKLX0KLQotLy8gQWRkIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgdG8gdGhlIHRpbWV2YWwuCi0vKnN0YXRpYyovIHZvaWQgRHVyYXRpb25UaW1lcjo6YWRkVG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsKiBwdHYsIGxvbmcgdXNlYykKLXsKLSAgICBpZiAodXNlYyA8IDApIHsKLSAgICAgICAgQUxPRyhMT0dfV0FSTiwgIiIsICJOZWdhdGl2ZSB2YWx1ZXMgbm90IHN1cHBvcnRlZCBpbiBhZGRUb1RpbWV2YWxcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gbm9ybWFsaXplIHR2X3VzZWMgaWYgbmVjZXNzYXJ5Ci0gICAgaWYgKHB0di0+dHZfdXNlYyA+PSAxMDAwMDAwKSB7Ci0gICAgICAgIHB0di0+dHZfc2VjICs9IHB0di0+dHZfdXNlYyAvIDEwMDAwMDA7Ci0gICAgICAgIHB0di0+dHZfdXNlYyAlPSAxMDAwMDAwOwotICAgIH0KLQotICAgIHB0di0+dHZfdXNlYyArPSB1c2VjICUgMTAwMDAwMDsKLSAgICBpZiAocHR2LT50dl91c2VjID49IDEwMDAwMDApIHsKLSAgICAgICAgcHR2LT50dl91c2VjIC09IDEwMDAwMDA7Ci0gICAgICAgIHB0di0+dHZfc2VjKys7Ci0gICAgfQotICAgIHB0di0+dHZfc2VjICs9IHVzZWMgLyAxMDAwMDAwOwotfQotCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1Rva2VuaXplci5jcHAgYi9saWJzL3V0aWxzL1Rva2VuaXplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZGEyYmYuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy9Ub2tlbml6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlRva2VuaXplciIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1Rva2VuaXplci5oPgotCi0vLyBFbmFibGVzIGRlYnVnIG91dHB1dCBmb3IgdGhlIHRva2VuaXplci4KLSNkZWZpbmUgREVCVUdfVE9LRU5JWkVSIDAKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0RlbGltaXRlcihjaGFyIGNoLCBjb25zdCBjaGFyKiBkZWxpbWl0ZXJzKSB7Ci0gICAgcmV0dXJuIHN0cmNocihkZWxpbWl0ZXJzLCBjaCkgIT0gTlVMTDsKLX0KLQotVG9rZW5pemVyOjpUb2tlbml6ZXIoY29uc3QgU3RyaW5nOCYgZmlsZW5hbWUsIEZpbGVNYXAqIGZpbGVNYXAsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgOgotICAgICAgICBtRmlsZW5hbWUoZmlsZW5hbWUpLCBtRmlsZU1hcChmaWxlTWFwKSwKLSAgICAgICAgbUJ1ZmZlcihidWZmZXIpLCBtTGVuZ3RoKGxlbmd0aCksIG1DdXJyZW50KGJ1ZmZlciksIG1MaW5lTnVtYmVyKDEpIHsKLX0KLQotVG9rZW5pemVyOjp+VG9rZW5pemVyKCkgewotICAgIGlmIChtRmlsZU1hcCkgewotICAgICAgICBtRmlsZU1hcC0+cmVsZWFzZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlbGV0ZVtdIG1CdWZmZXI7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBUb2tlbml6ZXI6Om9wZW4oY29uc3QgU3RyaW5nOCYgZmlsZW5hbWUsIFRva2VuaXplcioqIG91dFRva2VuaXplcikgewotICAgICpvdXRUb2tlbml6ZXIgPSBOVUxMOwotCi0gICAgaW50IHJlc3VsdCA9IE5PX0VSUk9SOwotICAgIGludCBmZCA9IDo6b3BlbihmaWxlbmFtZS5zdHJpbmcoKSwgT19SRE9OTFkpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICBBTE9HRSgiRXJyb3Igb3BlbmluZyBmaWxlICclcycsICVzLiIsIGZpbGVuYW1lLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cnVjdCBzdGF0IHN0YXQ7Ci0gICAgICAgIGlmIChmc3RhdChmZCwgJnN0YXQpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSAtZXJybm87Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgZ2V0dGluZyBzaXplIG9mIGZpbGUgJyVzJywgJXMuIiwgZmlsZW5hbWUuc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gc2l6ZV90KHN0YXQuc3Rfc2l6ZSk7Ci0KLSAgICAgICAgICAgIEZpbGVNYXAqIGZpbGVNYXAgPSBuZXcgRmlsZU1hcCgpOwotICAgICAgICAgICAgY2hhciogYnVmZmVyOwotICAgICAgICAgICAgaWYgKGZpbGVNYXAtPmNyZWF0ZShOVUxMLCBmZCwgMCwgbGVuZ3RoLCB0cnVlKSkgewotICAgICAgICAgICAgICAgIGZpbGVNYXAtPmFkdmlzZShGaWxlTWFwOjpTRVFVRU5USUFMKTsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oZmlsZU1hcC0+Z2V0RGF0YVB0cigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmlsZU1hcC0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIGZpbGVNYXAgPSBOVUxMOwotCi0gICAgICAgICAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHJlYWRpbmcgaW50byBhIGJ1ZmZlciBzaW5jZSB3ZSBjYW4ndCBtbWFwIGZpbGVzIGluIHN5c2ZzLgotICAgICAgICAgICAgICAgIC8vIFRoZSBsZW5ndGggd2Ugb2J0YWluZWQgZnJvbSBzdGF0IGlzIHdyb25nIHRvbyAoaXQgd2lsbCBhbHdheXMgYmUgNDA5NikKLSAgICAgICAgICAgICAgICAvLyBzbyB3ZSBtdXN0IHRydXN0IHRoYXQgcmVhZCB3aWxsIHJlYWQgdGhlIGVudGlyZSBmaWxlLgotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2xlbmd0aF07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBucmQgPSByZWFkKGZkLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKG5yZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLWVycm5vOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVhZGluZyBmaWxlICclcycsICVzLiIsIGZpbGVuYW1lLnN0cmluZygpLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gc2l6ZV90KG5yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICAgICAgICAgICpvdXRUb2tlbml6ZXIgPSBuZXcgVG9rZW5pemVyKGZpbGVuYW1lLCBmaWxlTWFwLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2xvc2UoZmQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1TdHJpbmc4IFRva2VuaXplcjo6Z2V0TG9jYXRpb24oKSBjb25zdCB7Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJXM6JWQiLCBtRmlsZW5hbWUuc3RyaW5nKCksIG1MaW5lTnVtYmVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1TdHJpbmc4IFRva2VuaXplcjo6cGVla1JlbWFpbmRlck9mTGluZSgpIGNvbnN0IHsKLSAgICBjb25zdCBjaGFyKiBlbmQgPSBnZXRFbmQoKTsKLSAgICBjb25zdCBjaGFyKiBlb2wgPSBtQ3VycmVudDsKLSAgICB3aGlsZSAoZW9sICE9IGVuZCkgewotICAgICAgICBjaGFyIGNoID0gKmVvbDsKLSAgICAgICAgaWYgKGNoID09ICdcbicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGVvbCArPSAxOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOChtQ3VycmVudCwgZW9sIC0gbUN1cnJlbnQpOwotfQotCi1TdHJpbmc4IFRva2VuaXplcjo6bmV4dFRva2VuKGNvbnN0IGNoYXIqIGRlbGltaXRlcnMpIHsKLSNpZiBERUJVR19UT0tFTklaRVIKLSAgICBBTE9HRCgibmV4dFRva2VuIik7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyKiBlbmQgPSBnZXRFbmQoKTsKLSAgICBjb25zdCBjaGFyKiB0b2tlblN0YXJ0ID0gbUN1cnJlbnQ7Ci0gICAgd2hpbGUgKG1DdXJyZW50ICE9IGVuZCkgewotICAgICAgICBjaGFyIGNoID0gKm1DdXJyZW50OwotICAgICAgICBpZiAoY2ggPT0gJ1xuJyB8fCBpc0RlbGltaXRlcihjaCwgZGVsaW1pdGVycykpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50ICs9IDE7Ci0gICAgfQotICAgIHJldHVybiBTdHJpbmc4KHRva2VuU3RhcnQsIG1DdXJyZW50IC0gdG9rZW5TdGFydCk7Ci19Ci0KLXZvaWQgVG9rZW5pemVyOjpuZXh0TGluZSgpIHsKLSNpZiBERUJVR19UT0tFTklaRVIKLSAgICBBTE9HRCgibmV4dExpbmUiKTsKLSNlbmRpZgotICAgIGNvbnN0IGNoYXIqIGVuZCA9IGdldEVuZCgpOwotICAgIHdoaWxlIChtQ3VycmVudCAhPSBlbmQpIHsKLSAgICAgICAgY2hhciBjaCA9ICoobUN1cnJlbnQrKyk7Ci0gICAgICAgIGlmIChjaCA9PSAnXG4nKSB7Ci0gICAgICAgICAgICBtTGluZU51bWJlciArPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgVG9rZW5pemVyOjpza2lwRGVsaW1pdGVycyhjb25zdCBjaGFyKiBkZWxpbWl0ZXJzKSB7Ci0jaWYgREVCVUdfVE9LRU5JWkVSCi0gICAgQUxPR0QoInNraXBEZWxpbWl0ZXJzIik7Ci0jZW5kaWYKLSAgICBjb25zdCBjaGFyKiBlbmQgPSBnZXRFbmQoKTsKLSAgICB3aGlsZSAobUN1cnJlbnQgIT0gZW5kKSB7Ci0gICAgICAgIGNoYXIgY2ggPSAqbUN1cnJlbnQ7Ci0gICAgICAgIGlmIChjaCA9PSAnXG4nIHx8ICFpc0RlbGltaXRlcihjaCwgZGVsaW1pdGVycykpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50ICs9IDE7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1RyYWNlLmNwcCBiL2xpYnMvdXRpbHMvVHJhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDkyNzhhLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvVHJhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdm9sYXRpbGUgaW50MzJfdCBUcmFjZXI6OnNJc1JlYWR5ID0gMDsKLWludCBUcmFjZXI6OnNUcmFjZUZEID0gLTE7Ci11aW50NjRfdCBUcmFjZXI6OnNFbmFibGVkVGFncyA9IDA7Ci1NdXRleCBUcmFjZXI6OnNNdXRleDsKLQotdm9pZCBUcmFjZXI6OmluaXQoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc011dGV4KTsKLQotICAgIGlmICghc0lzUmVhZHkpIHsKLSAgICAgICAgY29uc3QgY2hhciogY29uc3QgdHJhY2VGaWxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvdHJhY2VfbWFya2VyIjsKLSAgICAgICAgc1RyYWNlRkQgPSBvcGVuKHRyYWNlRmlsZU5hbWUsIE9fV1JPTkxZKTsKLSAgICAgICAgaWYgKHNUcmFjZUZEID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igb3BlbmluZyB0cmFjZSBmaWxlOiAlcyAoJWQpIiwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgICAgICAgICBwcm9wZXJ0eV9nZXQoImF0cmFjZS50YWdzLmVuYWJsZWZsYWdzIiwgdmFsdWUsICIwIik7Ci0gICAgICAgICAgICBzRW5hYmxlZFRhZ3MgPSBzdHJ0b2xsKHZhbHVlLCBOVUxMLCAwKSB8IEFUUkFDRV9UQUdfQUxXQVlTOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZSgxLCAmc0lzUmVhZHkpOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1VuaWNvZGUuY3BwIGIvbGlicy91dGlscy9Vbmljb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjYmYwMy4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1VuaWNvZGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvVW5pY29kZS5oPgotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpZmRlZiBIQVZFX1dJTlNPQ0sKLSMgdW5kZWYgIG5odG9sCi0jIHVuZGVmICBodG9ubAotIyB1bmRlZiAgbmh0b3MKLSMgdW5kZWYgIGh0b25zCi0KLSMgaWZkZWYgSEFWRV9MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgbnRvaGwoeCkgICAgKCAoKHgpIDw8IDI0KSB8ICgoKHgpID4+IDI0KSAmIDI1NSkgfCAoKCh4KSA8PCA4KSAmIDB4ZmYwMDAwKSB8ICgoKHgpID4+IDgpICYgMHhmZjAwKSApCi0jICBkZWZpbmUgaHRvbmwoeCkgICAgbnRvaGwoeCkKLSMgIGRlZmluZSBudG9ocyh4KSAgICAoICgoKHgpIDw8IDgpICYgMHhmZjAwKSB8ICgoKHgpID4+IDgpICYgMjU1KSApCi0jICBkZWZpbmUgaHRvbnMoeCkgICAgbnRvaHMoeCkKLSMgZWxzZQotIyAgZGVmaW5lIG50b2hsKHgpICAgICh4KQotIyAgZGVmaW5lIGh0b25sKHgpICAgICh4KQotIyAgZGVmaW5lIG50b2hzKHgpICAgICh4KQotIyAgZGVmaW5lIGh0b25zKHgpICAgICh4KQotIyBlbmRpZgotI2Vsc2UKLSMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2VuZGlmCi0KLWV4dGVybiAiQyIgewotCi1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga0J5dGVNYXNrID0gMHgwMDAwMDBCRjsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrQnl0ZU1hcmsgPSAweDAwMDAwMDgwOwotCi0vLyBTdXJyb2dhdGVzIGFyZW4ndCB2YWxpZCBmb3IgVVRGLTMyIGNoYXJhY3RlcnMsIHNvIGRlZmluZSBzb21lCi0vLyBjb25zdGFudHMgdGhhdCB3aWxsIGxldCB1cyBzY3JlZW4gdGhlbSBvdXQuCi1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVIaWdoU3RhcnQgID0gMHgwMDAwRDgwMDsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUhpZ2hFbmQgICAgPSAweDAwMDBEQkZGOwotc3RhdGljIGNvbnN0IGNoYXIzMl90IGtVbmljb2RlU3Vycm9nYXRlTG93U3RhcnQgICA9IDB4MDAwMERDMDA7Ci1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga1VuaWNvZGVTdXJyb2dhdGVMb3dFbmQgICAgID0gMHgwMDAwREZGRjsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZVN0YXJ0ICAgICAgPSBrVW5pY29kZVN1cnJvZ2F0ZUhpZ2hTdGFydDsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZVN1cnJvZ2F0ZUVuZCAgICAgICAgPSBrVW5pY29kZVN1cnJvZ2F0ZUxvd0VuZDsKLXN0YXRpYyBjb25zdCBjaGFyMzJfdCBrVW5pY29kZU1heENvZGVwb2ludCAgICAgICAgPSAweDAwMTBGRkZGOwotCi0vLyBNYXNrIHVzZWQgdG8gc2V0IGFwcHJvcHJpYXRlIGJpdHMgaW4gZmlyc3QgYnl0ZSBvZiBVVEYtOCBzZXF1ZW5jZSwKLS8vIGluZGV4ZWQgYnkgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzZXF1ZW5jZS4KLS8vIDB4eHh4eHh4Ci0vLyAtPiAoMDAtN2YpIDdiaXQuIEJpdCBtYXNrIGZvciB0aGUgZmlyc3QgYnl0ZSBpcyAweDAwMDAwMDAwCi0vLyAxMTB5eXl5eCAxMHh4eHh4eAotLy8gLT4gKGMwLWRmKSg4MC1iZikgMTFiaXQuIEJpdCBtYXNrIGlzIDB4MDAwMDAwQzAKLS8vIDExMTB5eXl5IDEweXh4eHh4IDEweHh4eHh4Ci0vLyAtPiAoZTAtZWYpKDgwLWJmKSg4MC1iZikgMTZiaXQuIEJpdCBtYXNrIGlzIDB4MDAwMDAwRTAKLS8vIDExMTEweXl5IDEweXl4eHh4IDEweHh4eHh4IDEweHh4eHh4Ci0vLyAtPiAoZjAtZjcpKDgwLWJmKSg4MC1iZikoODAtYmYpIDIxYml0LiBCaXQgbWFzayBpcyAweDAwMDAwMEYwCi1zdGF0aWMgY29uc3QgY2hhcjMyX3Qga0ZpcnN0Qnl0ZU1hcmtbXSA9IHsKLSAgICAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMEMwLCAweDAwMDAwMEUwLCAweDAwMDAwMEYwCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGLTMyCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioKLSAqIFJldHVybiBudW1iZXIgb2YgVVRGLTggYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBjaGFyYWN0ZXIuIElmIHRoZSBjaGFyYWN0ZXIKLSAqIGlzIGludmFsaWQsIHJldHVybiBzaXplIG9mIDAuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aChjaGFyMzJfdCBzcmNDaGFyKQotewotICAgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgYnl0ZXMgdGhlIHJlc3VsdCB3aWxsIHJlcXVpcmUuCi0gICAgaWYgKHNyY0NoYXIgPCAweDAwMDAwMDgwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAoc3JjQ2hhciA8IDB4MDAwMDA4MDApIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgfSBlbHNlIGlmIChzcmNDaGFyIDwgMHgwMDAxMDAwMCkgewotICAgICAgICBpZiAoKHNyY0NoYXIgPCBrVW5pY29kZVN1cnJvZ2F0ZVN0YXJ0KSB8fCAoc3JjQ2hhciA+IGtVbmljb2RlU3Vycm9nYXRlRW5kKSkgewotICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTdXJyb2dhdGVzIGFyZSBpbnZhbGlkIFVURi0zMiBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gTWF4IGNvZGUgcG9pbnQgZm9yIFVuaWNvZGUgaXMgMHgwMDEwRkZGRi4KLSAgICBlbHNlIGlmIChzcmNDaGFyIDw9IGtVbmljb2RlTWF4Q29kZXBvaW50KSB7Ci0gICAgICAgIHJldHVybiA0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEludmFsaWQgVVRGLTMyIGNoYXJhY3Rlci4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vLyBXcml0ZSBvdXQgdGhlIHNvdXJjZSBjaGFyYWN0ZXIgdG8gPGRzdFA+LgotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgodWludDhfdCogZHN0UCwgY2hhcjMyX3Qgc3JjQ2hhciwgc2l6ZV90IGJ5dGVzKQotewotICAgIGRzdFAgKz0gYnl0ZXM7Ci0gICAgc3dpdGNoIChieXRlcykKLSAgICB7ICAgLyogbm90ZTogZXZlcnl0aGluZyBmYWxscyB0aHJvdWdoLiAqLwotICAgICAgICBjYXNlIDQ6ICotLWRzdFAgPSAodWludDhfdCkoKHNyY0NoYXIgfCBrQnl0ZU1hcmspICYga0J5dGVNYXNrKTsgc3JjQ2hhciA+Pj0gNjsKLSAgICAgICAgY2FzZSAzOiAqLS1kc3RQID0gKHVpbnQ4X3QpKChzcmNDaGFyIHwga0J5dGVNYXJrKSAmIGtCeXRlTWFzayk7IHNyY0NoYXIgPj49IDY7Ci0gICAgICAgIGNhc2UgMjogKi0tZHN0UCA9ICh1aW50OF90KSgoc3JjQ2hhciB8IGtCeXRlTWFyaykgJiBrQnl0ZU1hc2spOyBzcmNDaGFyID4+PSA2OwotICAgICAgICBjYXNlIDE6ICotLWRzdFAgPSAodWludDhfdCkoc3JjQ2hhciB8IGtGaXJzdEJ5dGVNYXJrW2J5dGVzXSk7Ci0gICAgfQotfQotCi1zaXplX3Qgc3RybGVuMzIoY29uc3QgY2hhcjMyX3QgKnMpCi17Ci0gIGNvbnN0IGNoYXIzMl90ICpzcyA9IHM7Ci0gIHdoaWxlICggKnNzICkKLSAgICBzcysrOwotICByZXR1cm4gc3MtczsKLX0KLQotc2l6ZV90IHN0cm5sZW4zMihjb25zdCBjaGFyMzJfdCAqcywgc2l6ZV90IG1heGxlbikKLXsKLSAgY29uc3QgY2hhcjMyX3QgKnNzID0gczsKLSAgd2hpbGUgKChtYXhsZW4gPiAwKSAmJiAqc3MpIHsKLSAgICBzcysrOwotICAgIG1heGxlbi0tOwotICB9Ci0gIHJldHVybiBzcy1zOwotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgdXRmMzJfYXRfaW50ZXJuYWwoY29uc3QgY2hhciogY3VyLCBzaXplX3QgKm51bV9yZWFkKQotewotICAgIGNvbnN0IGNoYXIgZmlyc3RfY2hhciA9ICpjdXI7Ci0gICAgaWYgKChmaXJzdF9jaGFyICYgMHg4MCkgPT0gMCkgeyAvLyBBU0NJSQotICAgICAgICAqbnVtX3JlYWQgPSAxOwotICAgICAgICByZXR1cm4gKmN1cjsKLSAgICB9Ci0gICAgY3VyKys7Ci0gICAgY2hhcjMyX3QgbWFzaywgdG9faWdub3JlX21hc2s7Ci0gICAgc2l6ZV90IG51bV90b19yZWFkID0gMDsKLSAgICBjaGFyMzJfdCB1dGYzMiA9IGZpcnN0X2NoYXI7Ci0gICAgZm9yIChudW1fdG9fcmVhZCA9IDEsIG1hc2sgPSAweDQwLCB0b19pZ25vcmVfbWFzayA9IDB4RkZGRkZGODA7Ci0gICAgICAgICAoZmlyc3RfY2hhciAmIG1hc2spOwotICAgICAgICAgbnVtX3RvX3JlYWQrKywgdG9faWdub3JlX21hc2sgfD0gbWFzaywgbWFzayA+Pj0gMSkgewotICAgICAgICAvLyAweDNGID09IDAwMTExMTExCi0gICAgICAgIHV0ZjMyID0gKHV0ZjMyIDw8IDYpICsgKCpjdXIrKyAmIDB4M0YpOwotICAgIH0KLSAgICB0b19pZ25vcmVfbWFzayB8PSBtYXNrOwotICAgIHV0ZjMyICY9IH4odG9faWdub3JlX21hc2sgPDwgKDYgKiAobnVtX3RvX3JlYWQgLSAxKSkpOwotCi0gICAgKm51bV9yZWFkID0gbnVtX3RvX3JlYWQ7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHV0ZjMyKTsKLX0KLQotaW50MzJfdCB1dGYzMl9mcm9tX3V0ZjhfYXQoY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjX2xlbiwgc2l6ZV90IGluZGV4LCBzaXplX3QgKm5leHRfaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4ID49IHNyY19sZW4pIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBzaXplX3QgZHVtbXlfaW5kZXg7Ci0gICAgaWYgKG5leHRfaW5kZXggPT0gTlVMTCkgewotICAgICAgICBuZXh0X2luZGV4ID0gJmR1bW15X2luZGV4OwotICAgIH0KLSAgICBzaXplX3QgbnVtX3JlYWQ7Ci0gICAgaW50MzJfdCByZXQgPSB1dGYzMl9hdF9pbnRlcm5hbChzcmMgKyBpbmRleCwgJm51bV9yZWFkKTsKLSAgICBpZiAocmV0ID49IDApIHsKLSAgICAgICAgKm5leHRfaW5kZXggPSBpbmRleCArIG51bV9yZWFkOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgdXRmMzJfdG9fdXRmOF9sZW5ndGgoY29uc3QgY2hhcjMyX3QgKnNyYywgc2l6ZV90IHNyY19sZW4pCi17Ci0gICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyY19sZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgY29uc3QgY2hhcjMyX3QgKmVuZCA9IHNyYyArIHNyY19sZW47Ci0gICAgd2hpbGUgKHNyYyA8IGVuZCkgewotICAgICAgICByZXQgKz0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKCpzcmMrKyk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgdXRmMzJfdG9fdXRmOChjb25zdCBjaGFyMzJfdCogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhciogZHN0KQotewotICAgIGlmIChzcmMgPT0gTlVMTCB8fCBzcmNfbGVuID09IDAgfHwgZHN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IGNoYXIzMl90ICpjdXJfdXRmMzIgPSBzcmM7Ci0gICAgY29uc3QgY2hhcjMyX3QgKmVuZF91dGYzMiA9IHNyYyArIHNyY19sZW47Ci0gICAgY2hhciAqY3VyID0gZHN0OwotICAgIHdoaWxlIChjdXJfdXRmMzIgPCBlbmRfdXRmMzIpIHsKLSAgICAgICAgc2l6ZV90IGxlbiA9IHV0ZjMyX2NvZGVwb2ludF91dGY4X2xlbmd0aCgqY3VyX3V0ZjMyKTsKLSAgICAgICAgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgoKHVpbnQ4X3QgKiljdXIsICpjdXJfdXRmMzIrKywgbGVuKTsKLSAgICAgICAgY3VyICs9IGxlbjsKLSAgICB9Ci0gICAgKmN1ciA9ICdcMCc7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBVVEYtMTYKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBzdHJjbXAxNihjb25zdCBjaGFyMTZfdCAqczEsIGNvbnN0IGNoYXIxNl90ICpzMikKLXsKLSAgY2hhcjE2X3QgY2g7Ci0gIGludCBkID0gMDsKLQotICB3aGlsZSAoIDEgKSB7Ci0gICAgZCA9IChpbnQpKGNoID0gKnMxKyspIC0gKGludCkqczIrKzsKLSAgICBpZiAoIGQgfHwgIWNoICkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLWludCBzdHJuY21wMTYoY29uc3QgY2hhcjE2X3QgKnMxLCBjb25zdCBjaGFyMTZfdCAqczIsIHNpemVfdCBuKQotewotICBjaGFyMTZfdCBjaDsKLSAgaW50IGQgPSAwOwotCi0gIHdoaWxlICggbi0tICkgewotICAgIGQgPSAoaW50KShjaCA9ICpzMSsrKSAtIChpbnQpKnMyKys7Ci0gICAgaWYgKCBkIHx8ICFjaCApCi0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBkOwotfQotCi1jaGFyMTZfdCAqc3RyY3B5MTYoY2hhcjE2X3QgKmRzdCwgY29uc3QgY2hhcjE2X3QgKnNyYykKLXsKLSAgY2hhcjE2X3QgKnEgPSBkc3Q7Ci0gIGNvbnN0IGNoYXIxNl90ICpwID0gc3JjOwotICBjaGFyMTZfdCBjaDsKLQotICBkbyB7Ci0gICAgKnErKyA9IGNoID0gKnArKzsKLSAgfSB3aGlsZSAoIGNoICk7Ci0KLSAgcmV0dXJuIGRzdDsKLX0KLQotc2l6ZV90IHN0cmxlbjE2KGNvbnN0IGNoYXIxNl90ICpzKQotewotICBjb25zdCBjaGFyMTZfdCAqc3MgPSBzOwotICB3aGlsZSAoICpzcyApCi0gICAgc3MrKzsKLSAgcmV0dXJuIHNzLXM7Ci19Ci0KLQotY2hhcjE2X3QgKnN0cm5jcHkxNihjaGFyMTZfdCAqZHN0LCBjb25zdCBjaGFyMTZfdCAqc3JjLCBzaXplX3QgbikKLXsKLSAgY2hhcjE2X3QgKnEgPSBkc3Q7Ci0gIGNvbnN0IGNoYXIxNl90ICpwID0gc3JjOwotICBjaGFyIGNoOwotCi0gIHdoaWxlIChuKSB7Ci0gICAgbi0tOwotICAgICpxKysgPSBjaCA9ICpwKys7Ci0gICAgaWYgKCAhY2ggKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICAqcSA9IDA7Ci0KLSAgcmV0dXJuIGRzdDsKLX0KLQotc2l6ZV90IHN0cm5sZW4xNihjb25zdCBjaGFyMTZfdCAqcywgc2l6ZV90IG1heGxlbikKLXsKLSAgY29uc3QgY2hhcjE2X3QgKnNzID0gczsKLQotICAvKiBJbXBvcnRhbnQ6IHRoZSBtYXhsZW4gdGVzdCBtdXN0IHByZWNlZGUgdGhlIHJlZmVyZW5jZSB0aHJvdWdoIHNzOwotICAgICBzaW5jZSB0aGUgYnl0ZSBiZXlvbmQgdGhlIG1heGltdW0gbWF5IHNlZ2ZhdWx0ICovCi0gIHdoaWxlICgobWF4bGVuID4gMCkgJiYgKnNzKSB7Ci0gICAgc3MrKzsKLSAgICBtYXhsZW4tLTsKLSAgfQotICByZXR1cm4gc3MtczsKLX0KLQotaW50IHN0cnpjbXAxNihjb25zdCBjaGFyMTZfdCAqczEsIHNpemVfdCBuMSwgY29uc3QgY2hhcjE2X3QgKnMyLCBzaXplX3QgbjIpCi17Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUxID0gczErbjE7Ci0gICAgY29uc3QgY2hhcjE2X3QqIGUyID0gczIrbjI7Ci0KLSAgICB3aGlsZSAoczEgPCBlMSAmJiBzMiA8IGUyKSB7Ci0gICAgICAgIGNvbnN0IGludCBkID0gKGludCkqczErKyAtIChpbnQpKnMyKys7Ci0gICAgICAgIGlmIChkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuMSA8IG4yCi0gICAgICAgID8gKDAgLSAoaW50KSpzMikKLSAgICAgICAgOiAobjEgPiBuMgotICAgICAgICAgICA/ICgoaW50KSpzMSAtIDApCi0gICAgICAgICAgIDogMCk7Ci19Ci0KLWludCBzdHJ6Y21wMTZfaF9uKGNvbnN0IGNoYXIxNl90ICpzMUgsIHNpemVfdCBuMSwgY29uc3QgY2hhcjE2X3QgKnMyTiwgc2l6ZV90IG4yKQotewotICAgIGNvbnN0IGNoYXIxNl90KiBlMSA9IHMxSCtuMTsKLSAgICBjb25zdCBjaGFyMTZfdCogZTIgPSBzMk4rbjI7Ci0KLSAgICB3aGlsZSAoczFIIDwgZTEgJiYgczJOIDwgZTIpIHsKLSAgICAgICAgY29uc3QgY2hhcjE2X3QgYzIgPSBudG9ocygqczJOKTsKLSAgICAgICAgY29uc3QgaW50IGQgPSAoaW50KSpzMUgrKyAtIChpbnQpYzI7Ci0gICAgICAgIHMyTisrOwotICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbjEgPCBuMgotICAgICAgICA/ICgwIC0gKGludCludG9ocygqczJOKSkKLSAgICAgICAgOiAobjEgPiBuMgotICAgICAgICAgICA/ICgoaW50KSpzMUggLSAwKQotICAgICAgICAgICA6IDApOwotfQotCi12b2lkIHV0ZjE2X3RvX3V0ZjgoY29uc3QgY2hhcjE2X3QqIHNyYywgc2l6ZV90IHNyY19sZW4sIGNoYXIqIGRzdCkKLXsKLSAgICBpZiAoc3JjID09IE5VTEwgfHwgc3JjX2xlbiA9PSAwIHx8IGRzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyMTZfdCogY3VyX3V0ZjE2ID0gc3JjOwotICAgIGNvbnN0IGNoYXIxNl90KiBjb25zdCBlbmRfdXRmMTYgPSBzcmMgKyBzcmNfbGVuOwotICAgIGNoYXIgKmN1ciA9IGRzdDsKLSAgICB3aGlsZSAoY3VyX3V0ZjE2IDwgZW5kX3V0ZjE2KSB7Ci0gICAgICAgIGNoYXIzMl90IHV0ZjMyOwotICAgICAgICAvLyBzdXJyb2dhdGUgcGFpcnMKLSAgICAgICAgaWYgKCgqY3VyX3V0ZjE2ICYgMHhGQzAwKSA9PSAweEQ4MDApIHsKLSAgICAgICAgICAgIHV0ZjMyID0gKCpjdXJfdXRmMTYrKyAtIDB4RDgwMCkgPDwgMTA7Ci0gICAgICAgICAgICB1dGYzMiB8PSAqY3VyX3V0ZjE2KysgLSAweERDMDA7Ci0gICAgICAgICAgICB1dGYzMiArPSAweDEwMDAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXRmMzIgPSAoY2hhcjMyX3QpICpjdXJfdXRmMTYrKzsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKHV0ZjMyKTsKLSAgICAgICAgdXRmMzJfY29kZXBvaW50X3RvX3V0ZjgoKHVpbnQ4X3QqKWN1ciwgdXRmMzIsIGxlbik7Ci0gICAgICAgIGN1ciArPSBsZW47Ci0gICAgfQotICAgICpjdXIgPSAnXDAnOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGLTgKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXNzaXplX3QgdXRmOF9sZW5ndGgoY29uc3QgY2hhciAqc3JjKQotewotICAgIGNvbnN0IGNoYXIgKmN1ciA9IHNyYzsKLSAgICBzaXplX3QgcmV0ID0gMDsKLSAgICB3aGlsZSAoKmN1ciAhPSAnXDAnKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgZmlyc3RfY2hhciA9ICpjdXIrKzsKLSAgICAgICAgaWYgKChmaXJzdF9jaGFyICYgMHg4MCkgPT0gMCkgeyAvLyBBU0NJSQotICAgICAgICAgICAgcmV0ICs9IDE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyAoVVRGLTgncyBjaGFyYWN0ZXIgbXVzdCBub3QgYmUgbGlrZSAxMHh4eHh4eCwKLSAgICAgICAgLy8gIGJ1dCAxMTB4eHh4eCwgMTExMHh4eHgsIC4uLiBvciAxMTExMTEweCkKLSAgICAgICAgaWYgKChmaXJzdF9jaGFyICYgMHg0MCkgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCBtYXNrLCB0b19pZ25vcmVfbWFzazsKLSAgICAgICAgc2l6ZV90IG51bV90b19yZWFkID0gMDsKLSAgICAgICAgY2hhcjMyX3QgdXRmMzIgPSAwOwotICAgICAgICBmb3IgKG51bV90b19yZWFkID0gMSwgbWFzayA9IDB4NDAsIHRvX2lnbm9yZV9tYXNrID0gMHg4MDsKLSAgICAgICAgICAgICBudW1fdG9fcmVhZCA8IDUgJiYgKGZpcnN0X2NoYXIgJiBtYXNrKTsKLSAgICAgICAgICAgICBudW1fdG9fcmVhZCsrLCB0b19pZ25vcmVfbWFzayB8PSBtYXNrLCBtYXNrID4+PSAxKSB7Ci0gICAgICAgICAgICBpZiAoKCpjdXIgJiAweEMwKSAhPSAweDgwKSB7IC8vIG11c3QgYmUgMTB4eHh4eHgKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyAweDNGID09IDAwMTExMTExCi0gICAgICAgICAgICB1dGYzMiA9ICh1dGYzMiA8PCA2KSArICgqY3VyKysgJiAweDNGKTsKLSAgICAgICAgfQotICAgICAgICAvLyAiZmlyc3RfY2hhciIgbXVzdCBiZSAoMTEweHh4eHggLSAxMTExMHh4eCkKLSAgICAgICAgaWYgKG51bV90b19yZWFkID09IDUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICB0b19pZ25vcmVfbWFzayB8PSBtYXNrOwotICAgICAgICB1dGYzMiB8PSAoKH50b19pZ25vcmVfbWFzaykgJiBmaXJzdF9jaGFyKSA8PCAoNiAqIChudW1fdG9fcmVhZCAtIDEpKTsKLSAgICAgICAgaWYgKHV0ZjMyID4ga1VuaWNvZGVNYXhDb2RlcG9pbnQpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCArPSBudW1fdG9fcmVhZDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3NpemVfdCB1dGYxNl90b191dGY4X2xlbmd0aChjb25zdCBjaGFyMTZfdCAqc3JjLCBzaXplX3Qgc3JjX2xlbikKLXsKLSAgICBpZiAoc3JjID09IE5VTEwgfHwgc3JjX2xlbiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzaXplX3QgcmV0ID0gMDsKLSAgICBjb25zdCBjaGFyMTZfdCogY29uc3QgZW5kID0gc3JjICsgc3JjX2xlbjsKLSAgICB3aGlsZSAoc3JjIDwgZW5kKSB7Ci0gICAgICAgIGlmICgoKnNyYyAmIDB4RkMwMCkgPT0gMHhEODAwICYmIChzcmMgKyAxKSA8IGVuZAotICAgICAgICAgICAgICAgICYmICgqKytzcmMgJiAweEZDMDApID09IDB4REMwMCkgewotICAgICAgICAgICAgLy8gc3Vycm9nYXRlIHBhaXJzIGFyZSBhbHdheXMgNCBieXRlcy4KLSAgICAgICAgICAgIHJldCArPSA0OwotICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgKz0gdXRmMzJfY29kZXBvaW50X3V0ZjhfbGVuZ3RoKChjaGFyMzJfdCkgKnNyYysrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIFJldHVybnMgMS00IGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgbGVhZGluZyBiaXRzLgotICoKLSAqIDExMTEgLT4gNAotICogMTExMCAtPiAzCi0gKiAxMTB4IC0+IDIKLSAqIDEweHggLT4gMQotICogMHh4eCAtPiAxCi0gKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHV0ZjhfY29kZXBvaW50X2xlbih1aW50OF90IGNoKQotewotICAgIHJldHVybiAoKDB4ZTUwMDAwMDAgPj4gKChjaCA+PiAzKSAmIDB4MWUpKSAmIDMpICsgMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHV0Zjhfc2hpZnRfYW5kX21hc2sodWludDMyX3QqIGNvZGVQb2ludCwgY29uc3QgdWludDhfdCBieXRlKQotewotICAgICpjb2RlUG9pbnQgPDw9IDY7Ci0gICAgKmNvZGVQb2ludCB8PSAweDNGICYgYnl0ZTsKLX0KLQotc2l6ZV90IHV0ZjhfdG9fdXRmMzJfbGVuZ3RoKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY19sZW4pCi17Ci0gICAgaWYgKHNyYyA9PSBOVUxMIHx8IHNyY19sZW4gPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgc2l6ZV90IHJldCA9IDA7Ci0gICAgY29uc3QgY2hhciogY3VyOwotICAgIGNvbnN0IGNoYXIqIGVuZDsKLSAgICBzaXplX3QgbnVtX3RvX3NraXA7Ci0gICAgZm9yIChjdXIgPSBzcmMsIGVuZCA9IHNyYyArIHNyY19sZW4sIG51bV90b19za2lwID0gMTsKLSAgICAgICAgIGN1ciA8IGVuZDsKLSAgICAgICAgIGN1ciArPSBudW1fdG9fc2tpcCwgcmV0KyspIHsKLSAgICAgICAgY29uc3QgY2hhciBmaXJzdF9jaGFyID0gKmN1cjsKLSAgICAgICAgbnVtX3RvX3NraXAgPSAxOwotICAgICAgICBpZiAoKGZpcnN0X2NoYXIgJiAweDgwKSA9PSAwKSB7ICAvLyBBU0NJSQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBtYXNrOwotCi0gICAgICAgIGZvciAobWFzayA9IDB4NDA7IChmaXJzdF9jaGFyICYgbWFzayk7IG51bV90b19za2lwKyssIG1hc2sgPj49IDEpIHsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIHV0ZjhfdG9fdXRmMzIoY29uc3QgY2hhciogc3JjLCBzaXplX3Qgc3JjX2xlbiwgY2hhcjMyX3QqIGRzdCkKLXsKLSAgICBpZiAoc3JjID09IE5VTEwgfHwgc3JjX2xlbiA9PSAwIHx8IGRzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyKiBjdXIgPSBzcmM7Ci0gICAgY29uc3QgY2hhciogY29uc3QgZW5kID0gc3JjICsgc3JjX2xlbjsKLSAgICBjaGFyMzJfdCogY3VyX3V0ZjMyID0gZHN0OwotICAgIHdoaWxlIChjdXIgPCBlbmQpIHsKLSAgICAgICAgc2l6ZV90IG51bV9yZWFkOwotICAgICAgICAqY3VyX3V0ZjMyKysgPSBzdGF0aWNfY2FzdDxjaGFyMzJfdD4odXRmMzJfYXRfaW50ZXJuYWwoY3VyLCAmbnVtX3JlYWQpKTsKLSAgICAgICAgY3VyICs9IG51bV9yZWFkOwotICAgIH0KLSAgICAqY3VyX3V0ZjMyID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB1aW50MzJfdCB1dGY4X3RvX3V0ZjMyX2NvZGVwb2ludChjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgdWludDMyX3QgdW5pY29kZTsKLQotICAgIHN3aXRjaCAobGVuZ3RoKQotICAgIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmV0dXJuIHNyY1swXTsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdW5pY29kZSA9IHNyY1swXSAmIDB4MWY7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbMV0pOwotICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHVuaWNvZGUgPSBzcmNbMF0gJiAweDBmOwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzFdKTsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1syXSk7Ci0gICAgICAgICAgICByZXR1cm4gdW5pY29kZTsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgdW5pY29kZSA9IHNyY1swXSAmIDB4MDc7Ci0gICAgICAgICAgICB1dGY4X3NoaWZ0X2FuZF9tYXNrKCZ1bmljb2RlLCBzcmNbMV0pOwotICAgICAgICAgICAgdXRmOF9zaGlmdF9hbmRfbWFzaygmdW5pY29kZSwgc3JjWzJdKTsKLSAgICAgICAgICAgIHV0Zjhfc2hpZnRfYW5kX21hc2soJnVuaWNvZGUsIHNyY1szXSk7Ci0gICAgICAgICAgICByZXR1cm4gdW5pY29kZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAweGZmZmY7Ci0gICAgfQotCi0gICAgLy9wcmludGYoIkNoYXIgYXQgJXA6IGxlbj0lZCwgdXRmLTE2PSVwXG4iLCBzcmMsIGxlbmd0aCwgKHZvaWQqKXJlc3VsdCk7Ci19Ci0KLXNzaXplX3QgdXRmOF90b191dGYxNl9sZW5ndGgoY29uc3QgdWludDhfdCogdThzdHIsIHNpemVfdCB1OGxlbikKLXsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB1OGVuZCA9IHU4c3RyICsgdThsZW47Ci0gICAgY29uc3QgdWludDhfdCogdThjdXIgPSB1OHN0cjsKLQotICAgIC8qIFZhbGlkYXRlIHRoYXQgdGhlIFVURi04IGlzIHRoZSBjb3JyZWN0IGxlbiAqLwotICAgIHNpemVfdCB1MTZtZWFzdXJlZExlbiA9IDA7Ci0gICAgd2hpbGUgKHU4Y3VyIDwgdThlbmQpIHsKLSAgICAgICAgdTE2bWVhc3VyZWRMZW4rKzsKLSAgICAgICAgaW50IHU4Y2hhckxlbiA9IHV0ZjhfY29kZXBvaW50X2xlbigqdThjdXIpOwotICAgICAgICB1aW50MzJfdCBjb2RlcG9pbnQgPSB1dGY4X3RvX3V0ZjMyX2NvZGVwb2ludCh1OGN1ciwgdThjaGFyTGVuKTsKLSAgICAgICAgaWYgKGNvZGVwb2ludCA+IDB4RkZGRikgdTE2bWVhc3VyZWRMZW4rKzsgLy8gdGhpcyB3aWxsIGJlIGEgc3Vycm9nYXRlIHBhaXIgaW4gdXRmMTYKLSAgICAgICAgdThjdXIgKz0gdThjaGFyTGVuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1ha2Ugc3VyZSB0aGF0IHdlIGVuZGVkIHdoZXJlIHdlIHRob3VnaHQgd2Ugd291bGQgYW5kIHRoZSBvdXRwdXQgVVRGLTE2Ci0gICAgICogd2lsbCBiZSBleGFjdGx5IGhvdyBsb25nIHdlIHdlcmUgdG9sZCBpdCB3b3VsZCBiZS4KLSAgICAgKi8KLSAgICBpZiAodThjdXIgIT0gdThlbmQpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiB1MTZtZWFzdXJlZExlbjsKLX0KLQotY2hhcjE2X3QqIHV0ZjhfdG9fdXRmMTZfbm9fbnVsbF90ZXJtaW5hdG9yKGNvbnN0IHVpbnQ4X3QqIHU4c3RyLCBzaXplX3QgdThsZW4sIGNoYXIxNl90KiB1MTZzdHIpCi17Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgdThlbmQgPSB1OHN0ciArIHU4bGVuOwotICAgIGNvbnN0IHVpbnQ4X3QqIHU4Y3VyID0gdThzdHI7Ci0gICAgY2hhcjE2X3QqIHUxNmN1ciA9IHUxNnN0cjsKLQotICAgIHdoaWxlICh1OGN1ciA8IHU4ZW5kKSB7Ci0gICAgICAgIHNpemVfdCB1OGxlbiA9IHV0ZjhfY29kZXBvaW50X2xlbigqdThjdXIpOwotICAgICAgICB1aW50MzJfdCBjb2RlcG9pbnQgPSB1dGY4X3RvX3V0ZjMyX2NvZGVwb2ludCh1OGN1ciwgdThsZW4pOwotCi0gICAgICAgIC8vIENvbnZlcnQgdGhlIFVURjMyIGNvZGVwb2ludCB0byBvbmUgb3IgbW9yZSBVVEYxNiBjb2RlcG9pbnRzCi0gICAgICAgIGlmIChjb2RlcG9pbnQgPD0gMHhGRkZGKSB7Ci0gICAgICAgICAgICAvLyBTaW5nbGUgVVRGMTYgY2hhcmFjdGVyCi0gICAgICAgICAgICAqdTE2Y3VyKysgPSAoY2hhcjE2X3QpIGNvZGVwb2ludDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIE11bHRpcGxlIFVURjE2IGNoYXJhY3RlcnMgd2l0aCBzdXJyb2dhdGVzCi0gICAgICAgICAgICBjb2RlcG9pbnQgPSBjb2RlcG9pbnQgLSAweDEwMDAwOwotICAgICAgICAgICAgKnUxNmN1cisrID0gKGNoYXIxNl90KSAoKGNvZGVwb2ludCA+PiAxMCkgKyAweEQ4MDApOwotICAgICAgICAgICAgKnUxNmN1cisrID0gKGNoYXIxNl90KSAoKGNvZGVwb2ludCAmIDB4M0ZGKSArIDB4REMwMCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1OGN1ciArPSB1OGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIHUxNmN1cjsKLX0KLQotdm9pZCB1dGY4X3RvX3V0ZjE2KGNvbnN0IHVpbnQ4X3QqIHU4c3RyLCBzaXplX3QgdThsZW4sIGNoYXIxNl90KiB1MTZzdHIpIHsKLSAgICBjaGFyMTZfdCogZW5kID0gdXRmOF90b191dGYxNl9ub19udWxsX3Rlcm1pbmF0b3IodThzdHIsIHU4bGVuLCB1MTZzdHIpOwotICAgICplbmQgPSAwOwotfQotCi19CmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL1ZlY3RvckltcGwuY3BwIGIvbGlicy91dGlscy9WZWN0b3JJbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwYWUzZS4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL1ZlY3RvckltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlZlY3RvciIKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TaGFyZWRCdWZmZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3JJbXBsLmg+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3Qgc2l6ZV90IGtNaW5WZWN0b3JDYXBhY2l0eSA9IDQ7Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IG1heChzaXplX3QgYSwgc2l6ZV90IGIpIHsKLSAgICByZXR1cm4gYT5iID8gYSA6IGI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVmVjdG9ySW1wbDo6VmVjdG9ySW1wbChzaXplX3QgaXRlbVNpemUsIHVpbnQzMl90IGZsYWdzKQotICAgIDogbVN0b3JhZ2UoMCksIG1Db3VudCgwKSwgbUZsYWdzKGZsYWdzKSwgbUl0ZW1TaXplKGl0ZW1TaXplKQotewotfQotCi1WZWN0b3JJbXBsOjpWZWN0b3JJbXBsKGNvbnN0IFZlY3RvckltcGwmIHJocykKLSAgICA6ICAgbVN0b3JhZ2UocmhzLm1TdG9yYWdlKSwgbUNvdW50KHJocy5tQ291bnQpLAotICAgICAgICBtRmxhZ3MocmhzLm1GbGFncyksIG1JdGVtU2l6ZShyaHMubUl0ZW1TaXplKQotewotICAgIGlmIChtU3RvcmFnZSkgewotICAgICAgICBTaGFyZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlcihtU3RvcmFnZSktPmFjcXVpcmUoKTsKLSAgICB9Ci19Ci0KLVZlY3RvckltcGw6On5WZWN0b3JJbXBsKCkKLXsKLSAgICBBTE9HX0FTU0VSVCghbUNvdW50LAotICAgICAgICAiWyVwXSAiCi0gICAgICAgICJzdWJjbGFzc2VzIG9mIFZlY3RvckltcGwgbXVzdCBjYWxsIGZpbmlzaF92ZWN0b3IoKSIKLSAgICAgICAgIiBpbiB0aGVpciBkZXN0cnVjdG9yLiBMZWFraW5nICVkIGJ5dGVzLiIsCi0gICAgICAgIHRoaXMsIChpbnQpKG1Db3VudCptSXRlbVNpemUpKTsKLSAgICAvLyBXZSBjYW4ndCBjYWxsIF9kb19kZXN0cm95KCkgaGVyZSBiZWNhdXNlIHRoZSB2dGFibGUgaXMgYWxyZWFkeSBnb25lLiAKLX0KLQotVmVjdG9ySW1wbCYgVmVjdG9ySW1wbDo6b3BlcmF0b3IgPSAoY29uc3QgVmVjdG9ySW1wbCYgcmhzKQotewotICAgIEFMT0dfQVNTRVJUKG1JdGVtU2l6ZSA9PSByaHMubUl0ZW1TaXplLAotICAgICAgICAiVmVjdG9yPD4gaGF2ZSBkaWZmZXJlbnQgdHlwZXMgKHRoaXM9JXAsIHJocz0lcCkiLCB0aGlzLCAmcmhzKTsKLSAgICBpZiAodGhpcyAhPSAmcmhzKSB7Ci0gICAgICAgIHJlbGVhc2Vfc3RvcmFnZSgpOwotICAgICAgICBpZiAocmhzLm1Db3VudCkgewotICAgICAgICAgICAgbVN0b3JhZ2UgPSByaHMubVN0b3JhZ2U7Ci0gICAgICAgICAgICBtQ291bnQgPSByaHMubUNvdW50OwotICAgICAgICAgICAgU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIobVN0b3JhZ2UpLT5hY3F1aXJlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU3RvcmFnZSA9IDA7Ci0gICAgICAgICAgICBtQ291bnQgPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCogVmVjdG9ySW1wbDo6ZWRpdEFycmF5SW1wbCgpCi17Ci0gICAgaWYgKG1TdG9yYWdlKSB7Ci0gICAgICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlcihtU3RvcmFnZSktPmF0dGVtcHRFZGl0KCk7Ci0gICAgICAgIGlmIChzYiA9PSAwKSB7Ci0gICAgICAgICAgICBzYiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MoY2FwYWNpdHkoKSAqIG1JdGVtU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoc2IpIHsKLSAgICAgICAgICAgICAgICBfZG9fY29weShzYi0+ZGF0YSgpLCBtU3RvcmFnZSwgbUNvdW50KTsKLSAgICAgICAgICAgICAgICByZWxlYXNlX3N0b3JhZ2UoKTsKLSAgICAgICAgICAgICAgICBtU3RvcmFnZSA9IHNiLT5kYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1TdG9yYWdlOwotfQotCi1zaXplX3QgVmVjdG9ySW1wbDo6Y2FwYWNpdHkoKSBjb25zdAotewotICAgIGlmIChtU3RvcmFnZSkgewotICAgICAgICByZXR1cm4gU2hhcmVkQnVmZmVyOjpzaGFyZWRCdWZmZXIobVN0b3JhZ2UpLT5zaXplKCkgLyBtSXRlbVNpemU7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zc2l6ZV90IFZlY3RvckltcGw6Omluc2VydFZlY3RvckF0KGNvbnN0IFZlY3RvckltcGwmIHZlY3Rvciwgc2l6ZV90IGluZGV4KQotewotICAgIHJldHVybiBpbnNlcnRBcnJheUF0KHZlY3Rvci5hcnJheUltcGwoKSwgaW5kZXgsIHZlY3Rvci5zaXplKCkpOwotfQotCi1zc2l6ZV90IFZlY3RvckltcGw6OmFwcGVuZFZlY3Rvcihjb25zdCBWZWN0b3JJbXBsJiB2ZWN0b3IpCi17Ci0gICAgcmV0dXJuIGluc2VydFZlY3RvckF0KHZlY3Rvciwgc2l6ZSgpKTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjppbnNlcnRBcnJheUF0KGNvbnN0IHZvaWQqIGFycmF5LCBzaXplX3QgaW5kZXgsIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgaWYgKGluZGV4ID4gc2l6ZSgpKQotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIHZvaWQqIHdoZXJlID0gX2dyb3coaW5kZXgsIGxlbmd0aCk7Ci0gICAgaWYgKHdoZXJlKSB7Ci0gICAgICAgIF9kb19jb3B5KHdoZXJlLCBhcnJheSwgbGVuZ3RoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdoZXJlID8gaW5kZXggOiAoc3NpemVfdClOT19NRU1PUlk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6YXBwZW5kQXJyYXkoY29uc3Qgdm9pZCogYXJyYXksIHNpemVfdCBsZW5ndGgpCi17Ci0gICAgcmV0dXJuIGluc2VydEFycmF5QXQoYXJyYXksIHNpemUoKSwgbGVuZ3RoKTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjppbnNlcnRBdChzaXplX3QgaW5kZXgsIHNpemVfdCBudW1JdGVtcykKLXsKLSAgICByZXR1cm4gaW5zZXJ0QXQoMCwgaW5kZXgsIG51bUl0ZW1zKTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjppbnNlcnRBdChjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QgaW5kZXgsIHNpemVfdCBudW1JdGVtcykKLXsKLSAgICBpZiAoaW5kZXggPiBzaXplKCkpCi0gICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgdm9pZCogd2hlcmUgPSBfZ3JvdyhpbmRleCwgbnVtSXRlbXMpOwotICAgIGlmICh3aGVyZSkgewotICAgICAgICBpZiAoaXRlbSkgewotICAgICAgICAgICAgX2RvX3NwbGF0KHdoZXJlLCBpdGVtLCBudW1JdGVtcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfZG9fY29uc3RydWN0KHdoZXJlLCBudW1JdGVtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHdoZXJlID8gaW5kZXggOiAoc3NpemVfdClOT19NRU1PUlk7Ci19Ci0KLXN0YXRpYyBpbnQgc29ydFByb3h5KGNvbnN0IHZvaWQqIGxocywgY29uc3Qgdm9pZCogcmhzLCB2b2lkKiBmdW5jKQotewotICAgIHJldHVybiAoKihWZWN0b3JJbXBsOjpjb21wYXJfdClmdW5jKShsaHMsIHJocyk7Ci19Ci0KLXN0YXR1c190IFZlY3RvckltcGw6OnNvcnQoVmVjdG9ySW1wbDo6Y29tcGFyX3QgY21wKQotewotICAgIHJldHVybiBzb3J0KHNvcnRQcm94eSwgKHZvaWQqKWNtcCk7Ci19Ci0KLXN0YXR1c190IFZlY3RvckltcGw6OnNvcnQoVmVjdG9ySW1wbDo6Y29tcGFyX3JfdCBjbXAsIHZvaWQqIHN0YXRlKQotewotICAgIC8vIHRoZSBzb3J0IG11c3QgYmUgc3RhYmxlLiB3ZSdyZSB1c2luZyBpbnNlcnRpb24gc29ydCB3aGljaAotICAgIC8vIGlzIHdlbGwgc3VpdGVkIGZvciBzbWFsbCBhbmQgYWxyZWFkeSBzb3J0ZWQgYXJyYXlzCi0gICAgLy8gZm9yIGJpZyBhcnJheXMsIGl0IGNvdWxkIGJlIGJldHRlciB0byB1c2UgbWVyZ2Vzb3J0Ci0gICAgY29uc3Qgc3NpemVfdCBjb3VudCA9IHNpemUoKTsKLSAgICBpZiAoY291bnQgPiAxKSB7Ci0gICAgICAgIHZvaWQqIGFycmF5ID0gY29uc3RfY2FzdDx2b2lkKj4oYXJyYXlJbXBsKCkpOwotICAgICAgICB2b2lkKiB0ZW1wID0gMDsKLSAgICAgICAgc3NpemVfdCBpID0gMTsKLSAgICAgICAgd2hpbGUgKGkgPCBjb3VudCkgewotICAgICAgICAgICAgdm9pZCogaXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFycmF5KSArIG1JdGVtU2l6ZSooaSk7Ci0gICAgICAgICAgICB2b2lkKiBjdXJyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXJyYXkpICsgbUl0ZW1TaXplKihpLTEpOwotICAgICAgICAgICAgaWYgKGNtcChjdXJyLCBpdGVtLCBzdGF0ZSkgPiAwKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIXRlbXApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBtb2RpZnkgdGhlIGFycmF5Li4uCi0gICAgICAgICAgICAgICAgICAgIGFycmF5ID0gZWRpdEFycmF5SW1wbCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5KSByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgICAgICAgICB0ZW1wID0gbWFsbG9jKG1JdGVtU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdGVtcCkgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFycmF5KSArIG1JdGVtU2l6ZSooaSk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihhcnJheSkgKyBtSXRlbVNpemUqKGktMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgX2RvX2Rlc3Ryb3kodGVtcCwgMSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgX2RvX2NvcHkodGVtcCwgaXRlbSwgMSk7Ci0KLSAgICAgICAgICAgICAgICBzc2l6ZV90IGogPSBpLTE7Ci0gICAgICAgICAgICAgICAgdm9pZCogbmV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFycmF5KSArIG1JdGVtU2l6ZSooaSk7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIF9kb19kZXN0cm95KG5leHQsIDEpOwotICAgICAgICAgICAgICAgICAgICBfZG9fY29weShuZXh0LCBjdXJyLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGN1cnI7Ci0gICAgICAgICAgICAgICAgICAgIC0tajsKLSAgICAgICAgICAgICAgICAgICAgY3VyciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFycmF5KSArIG1JdGVtU2l6ZSooaik7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9IHdoaWxlIChqPj0wICYmIChjbXAoY3VyciwgdGVtcCwgc3RhdGUpID4gMCkpOwotCi0gICAgICAgICAgICAgICAgX2RvX2Rlc3Ryb3kobmV4dCwgMSk7Ci0gICAgICAgICAgICAgICAgX2RvX2NvcHkobmV4dCwgdGVtcCwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICh0ZW1wKSB7Ci0gICAgICAgICAgICBfZG9fZGVzdHJveSh0ZW1wLCAxKTsKLSAgICAgICAgICAgIGZyZWUodGVtcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFZlY3RvckltcGw6OnBvcCgpCi17Ci0gICAgaWYgKHNpemUoKSkKLSAgICAgICAgcmVtb3ZlSXRlbXNBdChzaXplKCktMSwgMSk7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6cHVzaCgpCi17Ci0gICAgcHVzaCgwKTsKLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpwdXNoKGNvbnN0IHZvaWQqIGl0ZW0pCi17Ci0gICAgaW5zZXJ0QXQoaXRlbSwgc2l6ZSgpKTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjphZGQoKQotewotICAgIHJldHVybiBhZGQoMCk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6YWRkKGNvbnN0IHZvaWQqIGl0ZW0pCi17Ci0gICAgcmV0dXJuIGluc2VydEF0KGl0ZW0sIHNpemUoKSk7Ci19Ci0KLXNzaXplX3QgVmVjdG9ySW1wbDo6cmVwbGFjZUF0KHNpemVfdCBpbmRleCkKLXsKLSAgICByZXR1cm4gcmVwbGFjZUF0KDAsIGluZGV4KTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjpyZXBsYWNlQXQoY29uc3Qgdm9pZCogcHJvdG90eXBlLCBzaXplX3QgaW5kZXgpCi17Ci0gICAgQUxPR19BU1NFUlQoaW5kZXg8c2l6ZSgpLAotICAgICAgICAiWyVwXSByZXBsYWNlOiBpbmRleD0lZCwgc2l6ZT0lZCIsIHRoaXMsIChpbnQpaW5kZXgsIChpbnQpc2l6ZSgpKTsKLQotICAgIHZvaWQqIGl0ZW0gPSBlZGl0SXRlbUxvY2F0aW9uKGluZGV4KTsKLSAgICBpZiAoaXRlbSAhPSBwcm90b3R5cGUpIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIF9kb19kZXN0cm95KGl0ZW0sIDEpOwotICAgICAgICBpZiAocHJvdG90eXBlID09IDApIHsKLSAgICAgICAgICAgIF9kb19jb25zdHJ1Y3QoaXRlbSwgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBfZG9fY29weShpdGVtLCBwcm90b3R5cGUsIDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzc2l6ZV90KGluZGV4KTsKLX0KLQotc3NpemVfdCBWZWN0b3JJbXBsOjpyZW1vdmVJdGVtc0F0KHNpemVfdCBpbmRleCwgc2l6ZV90IGNvdW50KQotewotICAgIEFMT0dfQVNTRVJUKChpbmRleCtjb3VudCk8PXNpemUoKSwKLSAgICAgICAgIlslcF0gcmVtb3ZlOiBpbmRleD0lZCwgY291bnQ9JWQsIHNpemU9JWQiLAotICAgICAgICAgICAgICAgdGhpcywgKGludClpbmRleCwgKGludCljb3VudCwgKGludClzaXplKCkpOwotCi0gICAgaWYgKChpbmRleCtjb3VudCkgPiBzaXplKCkpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICBfc2hyaW5rKGluZGV4LCBjb3VudCk7Ci0gICByZXR1cm4gaW5kZXg7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6ZmluaXNoX3ZlY3RvcigpCi17Ci0gICAgcmVsZWFzZV9zdG9yYWdlKCk7Ci0gICAgbVN0b3JhZ2UgPSAwOwotICAgIG1Db3VudCA9IDA7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6Y2xlYXIoKQotewotICAgIF9zaHJpbmsoMCwgbUNvdW50KTsKLX0KLQotdm9pZCogVmVjdG9ySW1wbDo6ZWRpdEl0ZW1Mb2NhdGlvbihzaXplX3QgaW5kZXgpCi17Ci0gICAgQUxPR19BU1NFUlQoaW5kZXg8Y2FwYWNpdHkoKSwKLSAgICAgICAgIlslcF0gZWRpdEl0ZW1Mb2NhdGlvbjogaW5kZXg9JWQsIGNhcGFjaXR5PSVkLCBjb3VudD0lZCIsCi0gICAgICAgIHRoaXMsIChpbnQpaW5kZXgsIChpbnQpY2FwYWNpdHkoKSwgKGludCltQ291bnQpOwotICAgICAgICAgICAgCi0gICAgdm9pZCogYnVmZmVyID0gZWRpdEFycmF5SW1wbCgpOwotICAgIGlmIChidWZmZXIpCi0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXIpICsgaW5kZXgqbUl0ZW1TaXplOwotICAgIHJldHVybiAwOwotfQotCi1jb25zdCB2b2lkKiBWZWN0b3JJbXBsOjppdGVtTG9jYXRpb24oc2l6ZV90IGluZGV4KSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKGluZGV4PGNhcGFjaXR5KCksCi0gICAgICAgICJbJXBdIGl0ZW1Mb2NhdGlvbjogaW5kZXg9JWQsIGNhcGFjaXR5PSVkLCBjb3VudD0lZCIsCi0gICAgICAgIHRoaXMsIChpbnQpaW5kZXgsIChpbnQpY2FwYWNpdHkoKSwgKGludCltQ291bnQpOwotCi0gICAgY29uc3QgIHZvaWQqIGJ1ZmZlciA9IGFycmF5SW1wbCgpOwotICAgIGlmIChidWZmZXIpCi0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIpICsgaW5kZXgqbUl0ZW1TaXplOwotICAgIHJldHVybiAwOwotfQotCi1zc2l6ZV90IFZlY3RvckltcGw6OnNldENhcGFjaXR5KHNpemVfdCBuZXdfY2FwYWNpdHkpCi17Ci0gICAgc2l6ZV90IGN1cnJlbnRfY2FwYWNpdHkgPSBjYXBhY2l0eSgpOwotICAgIHNzaXplX3QgYW1vdW50ID0gbmV3X2NhcGFjaXR5IC0gc2l6ZSgpOwotICAgIGlmIChhbW91bnQgPD0gMCkgewotICAgICAgICAvLyB3ZSBjYW4ndCByZWR1Y2UgdGhlIGNhcGFjaXR5Ci0gICAgICAgIHJldHVybiBjdXJyZW50X2NhcGFjaXR5OwotICAgIH0gCi0gICAgU2hhcmVkQnVmZmVyKiBzYiA9IFNoYXJlZEJ1ZmZlcjo6YWxsb2MobmV3X2NhcGFjaXR5ICogbUl0ZW1TaXplKTsKLSAgICBpZiAoc2IpIHsKLSAgICAgICAgdm9pZCogYXJyYXkgPSBzYi0+ZGF0YSgpOwotICAgICAgICBfZG9fY29weShhcnJheSwgbVN0b3JhZ2UsIHNpemUoKSk7Ci0gICAgICAgIHJlbGVhc2Vfc3RvcmFnZSgpOwotICAgICAgICBtU3RvcmFnZSA9IGNvbnN0X2Nhc3Q8dm9pZCo+KGFycmF5KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICByZXR1cm4gbmV3X2NhcGFjaXR5OwotfQotCi12b2lkIFZlY3RvckltcGw6OnJlbGVhc2Vfc3RvcmFnZSgpCi17Ci0gICAgaWYgKG1TdG9yYWdlKSB7Ci0gICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlcihtU3RvcmFnZSk7Ci0gICAgICAgIGlmIChzYi0+cmVsZWFzZShTaGFyZWRCdWZmZXI6OmVLZWVwU3RvcmFnZSkgPT0gMSkgewotICAgICAgICAgICAgX2RvX2Rlc3Ryb3kobVN0b3JhZ2UsIG1Db3VudCk7Ci0gICAgICAgICAgICBTaGFyZWRCdWZmZXI6OmRlYWxsb2Moc2IpOwotICAgICAgICB9IAotICAgIH0KLX0KLQotdm9pZCogVmVjdG9ySW1wbDo6X2dyb3coc2l6ZV90IHdoZXJlLCBzaXplX3QgYW1vdW50KQotewotLy8gICAgQUxPR1YoIl9ncm93KHRoaXM9JXAsIHdoZXJlPSVkLCBhbW91bnQ9JWQpIGNvdW50PSVkLCBjYXBhY2l0eT0lZCIsCi0vLyAgICAgICAgdGhpcywgKGludCl3aGVyZSwgKGludClhbW91bnQsIChpbnQpbUNvdW50LCAoaW50KWNhcGFjaXR5KCkpOwotCi0gICAgQUxPR19BU1NFUlQod2hlcmUgPD0gbUNvdW50LAotICAgICAgICAgICAgIlslcF0gX2dyb3c6IHdoZXJlPSVkLCBhbW91bnQ9JWQsIGNvdW50PSVkIiwKLSAgICAgICAgICAgIHRoaXMsIChpbnQpd2hlcmUsIChpbnQpYW1vdW50LCAoaW50KW1Db3VudCk7IC8vIGNhbGxlciBhbHJlYWR5IGNoZWNrZWQKLQotICAgIGNvbnN0IHNpemVfdCBuZXdfc2l6ZSA9IG1Db3VudCArIGFtb3VudDsKLSAgICBpZiAoY2FwYWNpdHkoKSA8IG5ld19zaXplKSB7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBuZXdfY2FwYWNpdHkgPSBtYXgoa01pblZlY3RvckNhcGFjaXR5LCAoKG5ld19zaXplKjMpKzEpLzIpOwotLy8gICAgICAgIEFMT0dWKCJncm93IHZlY3RvciAlcCwgbmV3X2NhcGFjaXR5PSVkIiwgdGhpcywgKGludCluZXdfY2FwYWNpdHkpOwotICAgICAgICBpZiAoKG1TdG9yYWdlKSAmJgotICAgICAgICAgICAgKG1Db3VudD09d2hlcmUpICYmCi0gICAgICAgICAgICAobUZsYWdzICYgSEFTX1RSSVZJQUxfQ09QWSkgJiYKLSAgICAgICAgICAgIChtRmxhZ3MgJiBIQVNfVFJJVklBTF9EVE9SKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyKiBjdXJfc2IgPSBTaGFyZWRCdWZmZXI6OnNoYXJlZEJ1ZmZlcihtU3RvcmFnZSk7Ci0gICAgICAgICAgICBTaGFyZWRCdWZmZXIqIHNiID0gY3VyX3NiLT5lZGl0UmVzaXplKG5ld19jYXBhY2l0eSAqIG1JdGVtU2l6ZSk7Ci0gICAgICAgICAgICBtU3RvcmFnZSA9IHNiLT5kYXRhKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTaGFyZWRCdWZmZXIqIHNiID0gU2hhcmVkQnVmZmVyOjphbGxvYyhuZXdfY2FwYWNpdHkgKiBtSXRlbVNpemUpOwotICAgICAgICAgICAgaWYgKHNiKSB7Ci0gICAgICAgICAgICAgICAgdm9pZCogYXJyYXkgPSBzYi0+ZGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICh3aGVyZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIF9kb19jb3B5KGFycmF5LCBtU3RvcmFnZSwgd2hlcmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAod2hlcmUgIT0gbUNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZyb20gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4obVN0b3JhZ2UpICsgd2hlcmUqbUl0ZW1TaXplOwotICAgICAgICAgICAgICAgICAgICB2b2lkKiBkZXN0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGFycmF5KSArICh3aGVyZSthbW91bnQpKm1JdGVtU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgX2RvX2NvcHkoZGVzdCwgZnJvbSwgbUNvdW50LXdoZXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVsZWFzZV9zdG9yYWdlKCk7Ci0gICAgICAgICAgICAgICAgbVN0b3JhZ2UgPSBjb25zdF9jYXN0PHZvaWQqPihhcnJheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAod2hlcmUgIT0gbUNvdW50KSB7Ci0gICAgICAgICAgICB2b2lkKiBhcnJheSA9IGVkaXRBcnJheUltcGwoKTsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZyb20gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oYXJyYXkpICsgd2hlcmUqbUl0ZW1TaXplOwotICAgICAgICAgICAgdm9pZCogdG8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oYXJyYXkpICsgKHdoZXJlK2Ftb3VudCkqbUl0ZW1TaXplOwotICAgICAgICAgICAgX2RvX21vdmVfZm9yd2FyZCh0bywgZnJvbSwgbUNvdW50IC0gd2hlcmUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1Db3VudCA9IG5ld19zaXplOwotICAgIHZvaWQqIGZyZWVfc3BhY2UgPSBjb25zdF9jYXN0PHZvaWQqPihpdGVtTG9jYXRpb24od2hlcmUpKTsKLSAgICByZXR1cm4gZnJlZV9zcGFjZTsKLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpfc2hyaW5rKHNpemVfdCB3aGVyZSwgc2l6ZV90IGFtb3VudCkKLXsKLSAgICBpZiAoIW1TdG9yYWdlKQotICAgICAgICByZXR1cm47Ci0KLS8vICAgIEFMT0dWKCJfc2hyaW5rKHRoaXM9JXAsIHdoZXJlPSVkLCBhbW91bnQ9JWQpIGNvdW50PSVkLCBjYXBhY2l0eT0lZCIsCi0vLyAgICAgICAgdGhpcywgKGludCl3aGVyZSwgKGludClhbW91bnQsIChpbnQpbUNvdW50LCAoaW50KWNhcGFjaXR5KCkpOwotCi0gICAgQUxPR19BU1NFUlQod2hlcmUgKyBhbW91bnQgPD0gbUNvdW50LAotICAgICAgICAgICAgIlslcF0gX3Nocmluazogd2hlcmU9JWQsIGFtb3VudD0lZCwgY291bnQ9JWQiLAotICAgICAgICAgICAgdGhpcywgKGludCl3aGVyZSwgKGludClhbW91bnQsIChpbnQpbUNvdW50KTsgLy8gY2FsbGVyIGFscmVhZHkgY2hlY2tlZAotCi0gICAgY29uc3Qgc2l6ZV90IG5ld19zaXplID0gbUNvdW50IC0gYW1vdW50OwotICAgIGlmIChuZXdfc2l6ZSozIDwgY2FwYWNpdHkoKSkgewotICAgICAgICBjb25zdCBzaXplX3QgbmV3X2NhcGFjaXR5ID0gbWF4KGtNaW5WZWN0b3JDYXBhY2l0eSwgbmV3X3NpemUqMik7Ci0vLyAgICAgICAgQUxPR1YoInNocmluayB2ZWN0b3IgJXAsIG5ld19jYXBhY2l0eT0lZCIsIHRoaXMsIChpbnQpbmV3X2NhcGFjaXR5KTsKLSAgICAgICAgaWYgKCh3aGVyZSA9PSBuZXdfc2l6ZSkgJiYKLSAgICAgICAgICAgIChtRmxhZ3MgJiBIQVNfVFJJVklBTF9DT1BZKSAmJgotICAgICAgICAgICAgKG1GbGFncyAmIEhBU19UUklWSUFMX0RUT1IpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXIqIGN1cl9zYiA9IFNoYXJlZEJ1ZmZlcjo6c2hhcmVkQnVmZmVyKG1TdG9yYWdlKTsKLSAgICAgICAgICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBjdXJfc2ItPmVkaXRSZXNpemUobmV3X2NhcGFjaXR5ICogbUl0ZW1TaXplKTsKLSAgICAgICAgICAgIG1TdG9yYWdlID0gc2ItPmRhdGEoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNoYXJlZEJ1ZmZlciogc2IgPSBTaGFyZWRCdWZmZXI6OmFsbG9jKG5ld19jYXBhY2l0eSAqIG1JdGVtU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoc2IpIHsKLSAgICAgICAgICAgICAgICB2b2lkKiBhcnJheSA9IHNiLT5kYXRhKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHdoZXJlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgX2RvX2NvcHkoYXJyYXksIG1TdG9yYWdlLCB3aGVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh3aGVyZSAhPSBuZXdfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBmcm9tID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KG1TdG9yYWdlKSArICh3aGVyZSthbW91bnQpKm1JdGVtU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihhcnJheSkgKyB3aGVyZSptSXRlbVNpemU7Ci0gICAgICAgICAgICAgICAgICAgIF9kb19jb3B5KGRlc3QsIGZyb20sIG5ld19zaXplIC0gd2hlcmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWxlYXNlX3N0b3JhZ2UoKTsKLSAgICAgICAgICAgICAgICBtU3RvcmFnZSA9IGNvbnN0X2Nhc3Q8dm9pZCo+KGFycmF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZvaWQqIGFycmF5ID0gZWRpdEFycmF5SW1wbCgpOwotICAgICAgICB2b2lkKiB0byA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihhcnJheSkgKyB3aGVyZSptSXRlbVNpemU7Ci0gICAgICAgIF9kb19kZXN0cm95KHRvLCBhbW91bnQpOwotICAgICAgICBpZiAod2hlcmUgIT0gbmV3X3NpemUpIHsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZyb20gPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oYXJyYXkpICsgKHdoZXJlK2Ftb3VudCkqbUl0ZW1TaXplOwotICAgICAgICAgICAgX2RvX21vdmVfYmFja3dhcmQodG8sIGZyb20sIG5ld19zaXplIC0gd2hlcmUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1Db3VudCA9IG5ld19zaXplOwotfQotCi1zaXplX3QgVmVjdG9ySW1wbDo6aXRlbVNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JdGVtU2l6ZTsKLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpfZG9fY29uc3RydWN0KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0Ci17Ci0gICAgaWYgKCEobUZsYWdzICYgSEFTX1RSSVZJQUxfQ1RPUikpIHsKLSAgICAgICAgZG9fY29uc3RydWN0KHN0b3JhZ2UsIG51bSk7Ci0gICAgfQotfQotCi12b2lkIFZlY3RvckltcGw6Ol9kb19kZXN0cm95KHZvaWQqIHN0b3JhZ2UsIHNpemVfdCBudW0pIGNvbnN0Ci17Ci0gICAgaWYgKCEobUZsYWdzICYgSEFTX1RSSVZJQUxfRFRPUikpIHsKLSAgICAgICAgZG9fZGVzdHJveShzdG9yYWdlLCBudW0pOwotICAgIH0KLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpfZG9fY29weSh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdAotewotICAgIGlmICghKG1GbGFncyAmIEhBU19UUklWSUFMX0NPUFkpKSB7Ci0gICAgICAgIGRvX2NvcHkoZGVzdCwgZnJvbSwgbnVtKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtZW1jcHkoZGVzdCwgZnJvbSwgbnVtKml0ZW1TaXplKCkpOwotICAgIH0KLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpfZG9fc3BsYXQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogaXRlbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGRvX3NwbGF0KGRlc3QsIGl0ZW0sIG51bSk7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6X2RvX21vdmVfZm9yd2FyZCh2b2lkKiBkZXN0LCBjb25zdCB2b2lkKiBmcm9tLCBzaXplX3QgbnVtKSBjb25zdCB7Ci0gICAgZG9fbW92ZV9mb3J3YXJkKGRlc3QsIGZyb20sIG51bSk7Ci19Ci0KLXZvaWQgVmVjdG9ySW1wbDo6X2RvX21vdmVfYmFja3dhcmQodm9pZCogZGVzdCwgY29uc3Qgdm9pZCogZnJvbSwgc2l6ZV90IG51bSkgY29uc3QgewotICAgIGRvX21vdmVfYmFja3dhcmQoZGVzdCwgZnJvbSwgbnVtKTsKLX0KLQotdm9pZCBWZWN0b3JJbXBsOjpyZXNlcnZlZFZlY3RvckltcGwxKCkgeyB9Ci12b2lkIFZlY3RvckltcGw6OnJlc2VydmVkVmVjdG9ySW1wbDIoKSB7IH0KLXZvaWQgVmVjdG9ySW1wbDo6cmVzZXJ2ZWRWZWN0b3JJbXBsMygpIHsgfQotdm9pZCBWZWN0b3JJbXBsOjpyZXNlcnZlZFZlY3RvckltcGw0KCkgeyB9Ci12b2lkIFZlY3RvckltcGw6OnJlc2VydmVkVmVjdG9ySW1wbDUoKSB7IH0KLXZvaWQgVmVjdG9ySW1wbDo6cmVzZXJ2ZWRWZWN0b3JJbXBsNigpIHsgfQotdm9pZCBWZWN0b3JJbXBsOjpyZXNlcnZlZFZlY3RvckltcGw3KCkgeyB9Ci12b2lkIFZlY3RvckltcGw6OnJlc2VydmVkVmVjdG9ySW1wbDgoKSB7IH0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1Tb3J0ZWRWZWN0b3JJbXBsOjpTb3J0ZWRWZWN0b3JJbXBsKHNpemVfdCBpdGVtU2l6ZSwgdWludDMyX3QgZmxhZ3MpCi0gICAgOiBWZWN0b3JJbXBsKGl0ZW1TaXplLCBmbGFncykKLXsKLX0KLQotU29ydGVkVmVjdG9ySW1wbDo6U29ydGVkVmVjdG9ySW1wbChjb25zdCBWZWN0b3JJbXBsJiByaHMpCi06IFZlY3RvckltcGwocmhzKQotewotfQotCi1Tb3J0ZWRWZWN0b3JJbXBsOjp+U29ydGVkVmVjdG9ySW1wbCgpCi17Ci19Ci0KLVNvcnRlZFZlY3RvckltcGwmIFNvcnRlZFZlY3RvckltcGw6Om9wZXJhdG9yID0gKGNvbnN0IFNvcnRlZFZlY3RvckltcGwmIHJocykKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U29ydGVkVmVjdG9ySW1wbCY+KCBWZWN0b3JJbXBsOjpvcGVyYXRvciA9IChzdGF0aWNfY2FzdDxjb25zdCBWZWN0b3JJbXBsJj4ocmhzKSkgKTsKLX0KLQotc3NpemVfdCBTb3J0ZWRWZWN0b3JJbXBsOjppbmRleE9mKGNvbnN0IHZvaWQqIGl0ZW0pIGNvbnN0Ci17Ci0gICAgcmV0dXJuIF9pbmRleE9yZGVyT2YoaXRlbSk7Ci19Ci0KLXNpemVfdCBTb3J0ZWRWZWN0b3JJbXBsOjpvcmRlck9mKGNvbnN0IHZvaWQqIGl0ZW0pIGNvbnN0Ci17Ci0gICAgc2l6ZV90IG87Ci0gICAgX2luZGV4T3JkZXJPZihpdGVtLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXNzaXplX3QgU29ydGVkVmVjdG9ySW1wbDo6X2luZGV4T3JkZXJPZihjb25zdCB2b2lkKiBpdGVtLCBzaXplX3QqIG9yZGVyKSBjb25zdAotewotICAgIC8vIGJpbmFyeSBzZWFyY2gKLSAgICBzc2l6ZV90IGVyciA9IE5BTUVfTk9UX0ZPVU5EOwotICAgIHNzaXplX3QgbCA9IDA7Ci0gICAgc3NpemVfdCBoID0gc2l6ZSgpLTE7Ci0gICAgc3NpemVfdCBtaWQ7Ci0gICAgY29uc3Qgdm9pZCogYSA9IGFycmF5SW1wbCgpOwotICAgIGNvbnN0IHNpemVfdCBzID0gaXRlbVNpemUoKTsKLSAgICB3aGlsZSAobCA8PSBoKSB7Ci0gICAgICAgIG1pZCA9IGwgKyAoaCAtIGwpLzI7Ci0gICAgICAgIGNvbnN0IHZvaWQqIGNvbnN0IGN1cnIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oYSkgKyAobWlkKnMpOwotICAgICAgICBjb25zdCBpbnQgYyA9IGRvX2NvbXBhcmUoY3VyciwgaXRlbSk7Ci0gICAgICAgIGlmIChjID09IDApIHsKLSAgICAgICAgICAgIGVyciA9IGwgPSBtaWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChjIDwgMCkgewotICAgICAgICAgICAgbCA9IG1pZCArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoID0gbWlkIC0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAob3JkZXIpICpvcmRlciA9IGw7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3NpemVfdCBTb3J0ZWRWZWN0b3JJbXBsOjphZGQoY29uc3Qgdm9pZCogaXRlbSkKLXsKLSAgICBzaXplX3Qgb3JkZXI7Ci0gICAgc3NpemVfdCBpbmRleCA9IF9pbmRleE9yZGVyT2YoaXRlbSwgJm9yZGVyKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGluZGV4ID0gVmVjdG9ySW1wbDo6aW5zZXJ0QXQoaXRlbSwgb3JkZXIsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gVmVjdG9ySW1wbDo6cmVwbGFjZUF0KGl0ZW0sIGluZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi1zc2l6ZV90IFNvcnRlZFZlY3RvckltcGw6Om1lcmdlKGNvbnN0IFZlY3RvckltcGwmIHZlY3RvcikKLXsKLSAgICAvLyBuYWl2ZSBtZXJnZS4uLgotICAgIGlmICghdmVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIgPSB2ZWN0b3IuYXJyYXlJbXBsKCk7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBpcyA9IGl0ZW1TaXplKCk7Ci0gICAgICAgIHNpemVfdCBzID0gdmVjdG9yLnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxzIDsgaSsrKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGVyciA9IGFkZCggcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyKSArIGkqaXMgKTsKLSAgICAgICAgICAgIGlmIChlcnI8MCkgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zc2l6ZV90IFNvcnRlZFZlY3RvckltcGw6Om1lcmdlKGNvbnN0IFNvcnRlZFZlY3RvckltcGwmIHZlY3RvcikKLXsKLSAgICAvLyB3ZSd2ZSBtZXJnaW5nIGEgc29ydGVkIHZlY3Rvci4uLiBuaWNlIQotICAgIHNzaXplX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgaWYgKCF2ZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIGZpcnN0IHRha2UgY2FyZSBvZiB0aGUgY2FzZSB3aGVyZSB0aGUgdmVjdG9ycyBhcmUgc29ydGVkIHRvZ2V0aGVyCi0gICAgICAgIGlmIChkb19jb21wYXJlKHZlY3Rvci5pdGVtTG9jYXRpb24odmVjdG9yLnNpemUoKS0xKSwgYXJyYXlJbXBsKCkpIDw9IDApIHsKLSAgICAgICAgICAgIGVyciA9IFZlY3RvckltcGw6Omluc2VydFZlY3RvckF0KHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPih2ZWN0b3IpLCAwKTsKLSAgICAgICAgfSBlbHNlIGlmIChkb19jb21wYXJlKHZlY3Rvci5hcnJheUltcGwoKSwgaXRlbUxvY2F0aW9uKHNpemUoKS0xKSkgPj0gMCkgewotICAgICAgICAgICAgZXJyID0gVmVjdG9ySW1wbDo6YXBwZW5kVmVjdG9yKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPih2ZWN0b3IpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYmUgbWFkZSBhIGxpdHRsZSBiZXR0ZXIKLSAgICAgICAgICAgIGVyciA9IG1lcmdlKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvckltcGwmPih2ZWN0b3IpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zc2l6ZV90IFNvcnRlZFZlY3RvckltcGw6OnJlbW92ZShjb25zdCB2b2lkKiBpdGVtKQotewotICAgIHNzaXplX3QgaSA9IGluZGV4T2YoaXRlbSk7Ci0gICAgaWYgKGk+PTApIHsKLSAgICAgICAgVmVjdG9ySW1wbDo6cmVtb3ZlSXRlbXNBdChpLCAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIGk7Ci19Ci0KLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsMSgpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsMigpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsMygpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsNCgpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsNSgpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsNigpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsNygpIHsgfTsKLXZvaWQgU29ydGVkVmVjdG9ySW1wbDo6cmVzZXJ2ZWRTb3J0ZWRWZWN0b3JJbXBsOCgpIHsgfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvbWlzYy5jcHAgYi9saWJzL3V0aWxzL21pc2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg5ZDE1Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvbWlzYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vCi0vLyBNaXNjZWxsYW5lb3VzIHV0aWxpdHkgZnVuY3Rpb25zLgotLy8KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqIExpa2Ugc3RyZHVwKCksIGJ1dCB1c2VzIEMrKyAibmV3IiBvcGVyYXRvciBpbnN0ZWFkIG9mIG1hbGxvYy4KLSAqLwotY2hhciogc3RyZHVwTmV3KGNvbnN0IGNoYXIqIHN0cikKLXsKLSAgICBjaGFyKiBuZXdTdHI7Ci0gICAgaW50IGxlbjsKLQotICAgIGlmIChzdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBsZW4gPSBzdHJsZW4oc3RyKTsKLSAgICBuZXdTdHIgPSBuZXcgY2hhcltsZW4rMV07Ci0gICAgbWVtY3B5KG5ld1N0ciwgc3RyLCBsZW4rMSk7Ci0KLSAgICByZXR1cm4gbmV3U3RyOwotfQotCi0vKgotICogQ29uY2F0ZW5hdGUgYW4gYXJndW1lbnQgdmVjdG9yLgotICovCi1jaGFyKiBjb25jYXRBcmd2KGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pCi17Ci0gICAgY2hhciogbmV3U3RyID0gTlVMTDsKLSAgICBpbnQgbGVuLCB0b3RhbExlbiwgcG9zbiwgaWR4OwotCi0gICAgLyoKLSAgICAgKiBGaXJzdCwgZmlndXJlIG91dCB0aGUgdG90YWwgbGVuZ3RoLgotICAgICAqLwotICAgIHRvdGFsTGVuID0gaWR4ID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoaWR4ID09IGFyZ2MgfHwgYXJndltpZHhdID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGlkeCkKLSAgICAgICAgICAgIHRvdGFsTGVuKys7ICAvLyBsZWF2ZSBhIHNwYWNlIGJldHdlZW4gYXJncwotICAgICAgICB0b3RhbExlbiArPSBzdHJsZW4oYXJndltpZHhdKTsKLSAgICAgICAgaWR4Kys7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBBbGxvYyB0aGUgc3RyaW5nLgotICAgICAqLwotICAgIG5ld1N0ciA9IG5ldyBjaGFyW3RvdGFsTGVuICsxXTsKLSAgICBpZiAobmV3U3RyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyoKLSAgICAgKiBGaW5hbGx5LCBhbGxvY2F0ZSB0aGUgc3RyaW5nIGFuZCBjb3B5IGRhdGEgb3Zlci4KLSAgICAgKi8KLSAgICBpZHggPSBwb3NuID0gMDsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoaWR4ID09IGFyZ2MgfHwgYXJndltpZHhdID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKGlkeCkKLSAgICAgICAgICAgIG5ld1N0cltwb3NuKytdID0gJyAnOwotCi0gICAgICAgIGxlbiA9IHN0cmxlbihhcmd2W2lkeF0pOwotICAgICAgICBtZW1jcHkoJm5ld1N0cltwb3NuXSwgYXJndltpZHhdLCBsZW4pOwotICAgICAgICBwb3NuICs9IGxlbjsKLQotICAgICAgICBpZHgrKzsKLSAgICB9Ci0KLSAgICBhc3NlcnQocG9zbiA9PSB0b3RhbExlbik7Ci0gICAgbmV3U3RyW3Bvc25dID0gJ1wwJzsKLQotICAgIHJldHVybiBuZXdTdHI7Ci19Ci0KLS8qCi0gKiBDb3VudCB0aGUgI29mIGFyZ3MgaW4gYW4gYXJndW1lbnQgdmVjdG9yLiAgRG9uJ3QgY291bnQgdGhlIGZpbmFsIE5VTEwuCi0gKi8KLWludCBjb3VudEFyZ3YoY29uc3QgY2hhciogY29uc3QgYXJndltdKQotewotICAgIGludCBjb3VudCA9IDA7Ci0KLSAgICB3aGlsZSAoYXJndltjb3VudF0gIT0gTlVMTCkKLSAgICAgICAgY291bnQrKzsKLQotICAgIHJldHVybiBjb3VudDsKLX0KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLS8qCi0gKiBHZXQgYSBmaWxlJ3MgdHlwZS4KLSAqLwotRmlsZVR5cGUgZ2V0RmlsZVR5cGUoY29uc3QgY2hhciogZmlsZU5hbWUpCi17Ci0gICAgc3RydWN0IHN0YXQgc2I7Ci0KLSAgICBpZiAoc3RhdChmaWxlTmFtZSwgJnNiKSA8IDApIHsKLSAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFTk9URElSKQotICAgICAgICAgICAgcmV0dXJuIGtGaWxlVHlwZU5vbmV4aXN0ZW50OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0RmlsZVR5cGUgZ290IGVycm5vPSVkIG9uICclcydcbiIsCi0gICAgICAgICAgICAgICAgZXJybm8sIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBrRmlsZVR5cGVVbmtub3duOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKFNfSVNSRUcoc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlUmVndWxhcjsKLSAgICAgICAgZWxzZSBpZiAoU19JU0RJUihzYi5zdF9tb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBrRmlsZVR5cGVEaXJlY3Rvcnk7Ci0gICAgICAgIGVsc2UgaWYgKFNfSVNDSFIoc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlQ2hhckRldjsKLSAgICAgICAgZWxzZSBpZiAoU19JU0JMSyhzYi5zdF9tb2RlKSkKLSAgICAgICAgICAgIHJldHVybiBrRmlsZVR5cGVCbG9ja0RldjsKLSAgICAgICAgZWxzZSBpZiAoU19JU0ZJRk8oc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlRmlmbzsKLSNpZmRlZiBIQVZFX1NZTUxJTktTICAgICAgICAgICAgCi0gICAgICAgIGVsc2UgaWYgKFNfSVNMTksoc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlU3ltbGluazsKLSAgICAgICAgZWxzZSBpZiAoU19JU1NPQ0soc2Iuc3RfbW9kZSkpCi0gICAgICAgICAgICByZXR1cm4ga0ZpbGVUeXBlU29ja2V0OwotI2VuZGlmICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBrRmlsZVR5cGVVbmtub3duOwotICAgIH0KLX0KLQotLyoKLSAqIEdldCBhIGZpbGUncyBtb2RpZmljYXRpb24gZGF0ZS4KLSAqLwotdGltZV90IGdldEZpbGVNb2REYXRlKGNvbnN0IGNoYXIqIGZpbGVOYW1lKQotewotICAgIHN0cnVjdCBzdGF0IHNiOwotCi0gICAgaWYgKHN0YXQoZmlsZU5hbWUsICZzYikgPCAwKQotICAgICAgICByZXR1cm4gKHRpbWVfdCkgLTE7Ci0KLSAgICByZXR1cm4gc2Iuc3RfbXRpbWU7Ci19Ci0KLS8qCi0gKiBSb3VuZCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIuCi0gKgotICogRm91bmQgb24gaHR0cDovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9+c2VhbmRlci9iaXRoYWNrcy5odG1sLgotICovCi11bnNpZ25lZCBpbnQgcm91bmRVcFBvd2VyMih1bnNpZ25lZCBpbnQgdmFsKQotewotICAgIHZhbC0tOwotICAgIHZhbCB8PSB2YWwgPj4gMTsKLSAgICB2YWwgfD0gdmFsID4+IDI7Ci0gICAgdmFsIHw9IHZhbCA+PiA0OwotICAgIHZhbCB8PSB2YWwgPj4gODsKLSAgICB2YWwgfD0gdmFsID4+IDE2OwotICAgIHZhbCsrOwotCi0gICAgcmV0dXJuIHZhbDsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9wcmltZXMucHkgYi9saWJzL3V0aWxzL3ByaW1lcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTE2MWRkOC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL3ByaW1lcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjIuNgotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIwotIyBHZW5lcmF0ZXMgYSB0YWJsZSBvZiBwcmltZSBudW1iZXJzIGZvciB1c2UgaW4gQmFzaWNIYXNodGFibGUuY3BwLgotIwotIyBFYWNoIHByaW1lIGlzIGNob3NlbiBzdWNoIHRoYXQgaXQgaXMgYSBsaXR0bGUgbW9yZSB0aGFuIHR3aWNlIGFzIGxhcmdlIGFzCi0jIHRoZSBwcmV2aW91cyBwcmltZSBpbiB0aGUgdGFibGUuICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBjaG9vc2UgYSBuZXcKLSMgaGFzaHRhYmxlIHNpemUgd2hlbiB0aGUgdW5kZXJseWluZyBhcnJheSBpcyBncm93biBieSBhcyBub21pbmFsIGZhY3RvcgotIyBvZiB0d28gZWFjaCB0aW1lLgotIwotCi1kZWYgaXNfb2RkX3ByaW1lKG4pOgotICBsaW1pdCA9IChuIC0gMSkgLyAyCi0gIGQgPSAzCi0gIHdoaWxlIGQgPD0gbGltaXQ6Ci0gICAgaWYgbiAlIGQgPT0gMDoKLSAgICAgIHJldHVybiBGYWxzZQotICAgIGQgKz0gMgotICByZXR1cm4gVHJ1ZQotCi1wcmludCAic3RhdGljIHNpemVfdCBQUklNRVNbXSA9IHsiCi0KLW4gPSA1Ci1tYXggPSAyKiozMSAtIDEKLXdoaWxlIG4gPCBtYXg6Ci0gIHByaW50ICIgICAgJWQsIiAlIChuKQotICBuID0gbiAqIDIgKyAxCi0gIHdoaWxlIG5vdCBpc19vZGRfcHJpbWUobik6Ci0gICAgbiArPSAyCi0KLXByaW50ICIgICAgMCwiCi1wcmludCAifTsiCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL0FuZHJvaWQubWsgYi9saWJzL3V0aWxzL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODExZmMuLjAwMDAwMDAKLS0tIGEvbGlicy91dGlscy90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgotdGVzdF9zcmNfZmlsZXMgOj0gXAotCUJhc2ljSGFzaHRhYmxlX3Rlc3QuY3BwIFwKLQlCbG9iQ2FjaGVfdGVzdC5jcHAgXAotCUxvb3Blcl90ZXN0LmNwcCBcCi0JU3RyaW5nOF90ZXN0LmNwcCBcCi0JVW5pY29kZV90ZXN0LmNwcCBcCi0KLXNoYXJlZF9saWJyYXJpZXMgOj0gXAotCWxpYnogXAotCWxpYmxvZyBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0JbGlic3RscG9ydAotCi1zdGF0aWNfbGlicmFyaWVzIDo9IFwKLQlsaWJndGVzdCBcCi0JbGliZ3Rlc3RfbWFpbgotCi1jX2luY2x1ZGVzIDo9IFwKLSAgICBleHRlcm5hbC96bGliIFwKLSAgICBleHRlcm5hbC9pY3U0Yy9jb21tb24gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQKLQotbW9kdWxlX3RhZ3MgOj0gZW5nIHRlc3RzCi0KLSQoZm9yZWFjaCBmaWxlLCQodGVzdF9zcmNfZmlsZXMpLCBcCi0gICAgJChldmFsIGluY2x1ZGUgJChDTEVBUl9WQVJTKSkgXAotICAgICQoZXZhbCBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICQoc2hhcmVkX2xpYnJhcmllcykpIFwKLSAgICAkKGV2YWwgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSAkKHN0YXRpY19saWJyYXJpZXMpKSBcCi0gICAgJChldmFsIExPQ0FMX0NfSU5DTFVERVMgOj0gJChjX2luY2x1ZGVzKSkgXAotICAgICQoZXZhbCBMT0NBTF9TUkNfRklMRVMgOj0gJChmaWxlKSkgXAotICAgICQoZXZhbCBMT0NBTF9NT0RVTEUgOj0gJChub3RkaXIgJChmaWxlOiUuY3BwPSUpKSkgXAotICAgICQoZXZhbCBMT0NBTF9NT0RVTEVfVEFHUyA6PSAkKG1vZHVsZV90YWdzKSkgXAotICAgICQoZXZhbCBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkpIFwKLSkKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvdGVzdHMvQmFzaWNIYXNodGFibGVfdGVzdC5jcHAgYi9saWJzL3V0aWxzL3Rlc3RzL0Jhc2ljSGFzaHRhYmxlX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGNmNzUwLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvdGVzdHMvQmFzaWNIYXNodGFibGVfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQmFzaWNIYXNodGFibGVfdGVzdCIKLQotI2luY2x1ZGUgPHV0aWxzL0Jhc2ljSGFzaHRhYmxlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdHlwZWRlZiBpbnQgU2ltcGxlS2V5OwotdHlwZWRlZiBpbnQgU2ltcGxlVmFsdWU7Ci10eXBlZGVmIGtleV92YWx1ZV9wYWlyX3Q8U2ltcGxlS2V5LCBTaW1wbGVWYWx1ZT4gU2ltcGxlRW50cnk7Ci10eXBlZGVmIEJhc2ljSGFzaHRhYmxlPFNpbXBsZUtleSwgU2ltcGxlRW50cnk+IFNpbXBsZUhhc2h0YWJsZTsKLQotc3RydWN0IENvbXBsZXhLZXkgewotICAgIGludCBrOwotCi0gICAgZXhwbGljaXQgQ29tcGxleEtleShpbnQgaykgOiBrKGspIHsKLSAgICAgICAgaW5zdGFuY2VDb3VudCArPSAxOwotICAgIH0KLQotICAgIENvbXBsZXhLZXkoY29uc3QgQ29tcGxleEtleSYgb3RoZXIpIDogayhvdGhlci5rKSB7Ci0gICAgICAgIGluc3RhbmNlQ291bnQgKz0gMTsKLSAgICB9Ci0KLSAgICB+Q29tcGxleEtleSgpIHsKLSAgICAgICAgaW5zdGFuY2VDb3VudCAtPSAxOwotICAgIH0KLQotICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgQ29tcGxleEtleSYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGsgPT0gb3RoZXIuazsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yICE9KGNvbnN0IENvbXBsZXhLZXkmIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBrICE9IG90aGVyLms7Ci0gICAgfQotCi0gICAgc3RhdGljIHNzaXplX3QgaW5zdGFuY2VDb3VudDsKLX07Ci0KLXNzaXplX3QgQ29tcGxleEtleTo6aW5zdGFuY2VDb3VudCA9IDA7Ci0KLXRlbXBsYXRlPD4gaW5saW5lIGhhc2hfdCBoYXNoX3R5cGUoY29uc3QgQ29tcGxleEtleSYgdmFsdWUpIHsKLSAgICByZXR1cm4gaGFzaF90eXBlKHZhbHVlLmspOwotfQotCi1zdHJ1Y3QgQ29tcGxleFZhbHVlIHsKLSAgICBpbnQgdjsKLQotICAgIGV4cGxpY2l0IENvbXBsZXhWYWx1ZShpbnQgdikgOiB2KHYpIHsKLSAgICAgICAgaW5zdGFuY2VDb3VudCArPSAxOwotICAgIH0KLQotICAgIENvbXBsZXhWYWx1ZShjb25zdCBDb21wbGV4VmFsdWUmIG90aGVyKSA6IHYob3RoZXIudikgewotICAgICAgICBpbnN0YW5jZUNvdW50ICs9IDE7Ci0gICAgfQotCi0gICAgfkNvbXBsZXhWYWx1ZSgpIHsKLSAgICAgICAgaW5zdGFuY2VDb3VudCAtPSAxOwotICAgIH0KLQotICAgIHN0YXRpYyBzc2l6ZV90IGluc3RhbmNlQ291bnQ7Ci19OwotCi1zc2l6ZV90IENvbXBsZXhWYWx1ZTo6aW5zdGFuY2VDb3VudCA9IDA7Ci0KLXR5cGVkZWYga2V5X3ZhbHVlX3BhaXJfdDxDb21wbGV4S2V5LCBDb21wbGV4VmFsdWU+IENvbXBsZXhFbnRyeTsKLXR5cGVkZWYgQmFzaWNIYXNodGFibGU8Q29tcGxleEtleSwgQ29tcGxleEVudHJ5PiBDb21wbGV4SGFzaHRhYmxlOwotCi1jbGFzcyBCYXNpY0hhc2h0YWJsZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBDb21wbGV4S2V5OjppbnN0YW5jZUNvdW50ID0gMDsKLSAgICAgICAgQ29tcGxleFZhbHVlOjppbnN0YW5jZUNvdW50ID0gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMCwgMCkpOwotICAgIH0KLQotICAgIHZvaWQgYXNzZXJ0SW5zdGFuY2VDb3VudChzc2l6ZV90IGtleXMsIHNzaXplX3QgdmFsdWVzKSB7Ci0gICAgICAgIGlmIChrZXlzICE9IENvbXBsZXhLZXk6Omluc3RhbmNlQ291bnQgfHwgdmFsdWVzICE9IENvbXBsZXhWYWx1ZTo6aW5zdGFuY2VDb3VudCkgewotICAgICAgICAgICAgRkFJTCgpIDw8ICJFeHBlY3RlZCAiIDw8IGtleXMgPDwgIiBrZXlzIGFuZCAiIDw8IHZhbHVlcyA8PCAiIHZhbHVlcyAiCi0gICAgICAgICAgICAgICAgICAgICJidXQgdGhlcmUgd2VyZSBhY3R1YWxseSAiIDw8IENvbXBsZXhLZXk6Omluc3RhbmNlQ291bnQgPDwgIiBrZXlzIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgIDw8IENvbXBsZXhWYWx1ZTo6aW5zdGFuY2VDb3VudCA8PCAiIHZhbHVlcyI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXB1YmxpYzoKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVEVudHJ5PgotICAgIHN0YXRpYyB2b2lkIGNvb2tpZUF0KGNvbnN0IEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT4mIGgsIHNpemVfdCBpbmRleCwKLSAgICAgICAgICAgIGJvb2wqIGNvbGxpc2lvbiwgYm9vbCogcHJlc2VudCwgaGFzaF90KiBoYXNoKSB7Ci0gICAgICAgIHVpbnQzMl90IGNvb2tpZSA9IGguY29va2llQXQoaW5kZXgpOwotICAgICAgICAqY29sbGlzaW9uID0gY29va2llICYgQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5Pjo6QnVja2V0OjpDT0xMSVNJT047Ci0gICAgICAgICpwcmVzZW50ID0gY29va2llICYgQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5Pjo6QnVja2V0OjpQUkVTRU5UOwotICAgICAgICAqaGFzaCA9IGNvb2tpZSAmIEJhc2ljSGFzaHRhYmxlPFRLZXksIFRFbnRyeT46OkJ1Y2tldDo6SEFTSF9NQVNLOwotICAgIH0KLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUS2V5LCB0eXBlbmFtZSBURW50cnk+Ci0gICAgc3RhdGljIGNvbnN0IHZvaWQqIGdldEJ1Y2tldHMoY29uc3QgQmFzaWNIYXNodGFibGU8VEtleSwgVEVudHJ5PiYgaCkgewotICAgICAgICByZXR1cm4gaC5tQnVja2V0czsKLSAgICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVFZhbHVlPgotc3RhdGljIHNpemVfdCBhZGQoQmFzaWNIYXNodGFibGU8VEtleSwga2V5X3ZhbHVlX3BhaXJfdDxUS2V5LCBUVmFsdWU+ID4mIGgsCi0gICAgICAgIGNvbnN0IFRLZXkmIGtleSwgY29uc3QgVFZhbHVlJiB2YWx1ZSkgewotICAgIHJldHVybiBoLmFkZChoYXNoX3R5cGUoa2V5KSwga2V5X3ZhbHVlX3BhaXJfdDxUS2V5LCBUVmFsdWU+KGtleSwgdmFsdWUpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRLZXksIHR5cGVuYW1lIFRWYWx1ZT4KLXN0YXRpYyBzc2l6ZV90IGZpbmQoQmFzaWNIYXNodGFibGU8VEtleSwga2V5X3ZhbHVlX3BhaXJfdDxUS2V5LCBUVmFsdWU+ID4mIGgsCi0gICAgICAgIHNzaXplX3QgaW5kZXgsIGNvbnN0IFRLZXkmIGtleSkgewotICAgIHJldHVybiBoLmZpbmQoaW5kZXgsIGhhc2hfdHlwZShrZXkpLCBrZXkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVFZhbHVlPgotc3RhdGljIGJvb2wgcmVtb3ZlKEJhc2ljSGFzaHRhYmxlPFRLZXksIGtleV92YWx1ZV9wYWlyX3Q8VEtleSwgVFZhbHVlPiA+JiBoLAotICAgICAgICBjb25zdCBUS2V5JiBrZXkpIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gZmluZChoLCAtMSwga2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBoLnJlbW92ZUF0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFRFbnRyeT4KLXN0YXRpYyB2b2lkIGdldEtleVZhbHVlKGNvbnN0IFRFbnRyeSYgZW50cnksIGludCoga2V5LCBpbnQqIHZhbHVlKTsKLQotdGVtcGxhdGUgPD4gdm9pZCBnZXRLZXlWYWx1ZShjb25zdCBTaW1wbGVFbnRyeSYgZW50cnksIGludCoga2V5LCBpbnQqIHZhbHVlKSB7Ci0gICAgKmtleSA9IGVudHJ5LmtleTsKLSAgICAqdmFsdWUgPSBlbnRyeS52YWx1ZTsKLX0KLQotdGVtcGxhdGUgPD4gdm9pZCBnZXRLZXlWYWx1ZShjb25zdCBDb21wbGV4RW50cnkmIGVudHJ5LCBpbnQqIGtleSwgaW50KiB2YWx1ZSkgewotICAgICprZXkgPSBlbnRyeS5rZXkuazsKLSAgICAqdmFsdWUgPSBlbnRyeS52YWx1ZS52OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVEtleSwgdHlwZW5hbWUgVFZhbHVlPgotc3RhdGljIHZvaWQgZHVtcChCYXNpY0hhc2h0YWJsZTxUS2V5LCBrZXlfdmFsdWVfcGFpcl90PFRLZXksIFRWYWx1ZT4gPiYgaCkgewotICAgIEFMT0dEKCJoYXNodGFibGUgJXAsIHNpemU9JXUsIGNhcGFjaXR5PSV1LCBidWNrZXRDb3VudD0ldSIsCi0gICAgICAgICAgICAmaCwgaC5zaXplKCksIGguY2FwYWNpdHkoKSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGguYnVja2V0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGJvb2wgY29sbGlzaW9uLCBwcmVzZW50OwotICAgICAgICBoYXNoX3QgaGFzaDsKLSAgICAgICAgQmFzaWNIYXNodGFibGVUZXN0Ojpjb29raWVBdChoLCBpLCAmY29sbGlzaW9uLCAmcHJlc2VudCwgJmhhc2gpOwotICAgICAgICBpZiAocHJlc2VudCkgewotICAgICAgICAgICAgaW50IGtleSwgdmFsdWU7Ci0gICAgICAgICAgICBnZXRLZXlWYWx1ZShoLmVudHJ5QXQoaSksICZrZXksICZ2YWx1ZSk7Ci0gICAgICAgICAgICBBTE9HRCgiICBbJTN1XSA9IGNvbGxpc2lvbj0lZCwgcHJlc2VudD0lZCwgaGFzaD0weCUwOHgsIGtleT0lM2QsIHZhbHVlPSUzZCwgIgotICAgICAgICAgICAgICAgICAgICAiaGFzaF90eXBlKGtleSk9MHglMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgaSwgY29sbGlzaW9uLCBwcmVzZW50LCBoYXNoLCBrZXksIHZhbHVlLCBoYXNoX3R5cGUoa2V5KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRCgiICBbJTN1XSA9IGNvbGxpc2lvbj0lZCwgcHJlc2VudD0lZCIsCi0gICAgICAgICAgICAgICAgICAgIGksIGNvbGxpc2lvbiwgcHJlc2VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIERlZmF1bHRDb25zdHJ1Y3Rvcl9XaXRoRGVmYXVsdFByb3BlcnRpZXMpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaDsKLQotICAgIEVYUEVDVF9FUSgwVSwgaC5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgzVSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoNVUsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAuNzVmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIENvbnN0cnVjdG9yX1dpdGhOb25Vbml0eUxvYWRGYWN0b3IpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaCg1MiwgMC44Zik7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoNzdVLCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUSg5N1UsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAuOGYsIGgubG9hZEZhY3RvcigpKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgQ29uc3RydWN0b3JfV2l0aFVuaXR5TG9hZEZhY3RvckFuZEV4YWN0Q2FwYWNpdHkpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaCg0NiwgMS4wZik7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoNDZVLCBoLmNhcGFjaXR5KCkpOyAvLyBtdXN0IGJlIG9uZSBsZXNzIHRoYW4gYnVja2V0Q291bnQgYmVjYXVzZSBsb2FkRmFjdG9yID09IDEuMGYKLSAgICBFWFBFQ1RfRVEoNDdVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLjBmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIENvbnN0cnVjdG9yX1dpdGhVbml0eUxvYWRGYWN0b3JBbmRJbmV4YWN0Q2FwYWNpdHkpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaCg0MiwgMS4wZik7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoNDZVLCBoLmNhcGFjaXR5KCkpOyAvLyBtdXN0IGJlIG9uZSBsZXNzIHRoYW4gYnVja2V0Q291bnQgYmVjYXVzZSBsb2FkRmFjdG9yID09IDEuMGYKLSAgICBFWFBFQ1RfRVEoNDdVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLjBmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIEZpbmRBZGRGaW5kUmVtb3ZlRmluZF9PbmVFbnRyeSkgewotICAgIFNpbXBsZUhhc2h0YWJsZSBoOwotICAgIHNzaXplX3QgaW5kZXggPSBmaW5kKGgsIC0xLCA4KTsKLSAgICBBU1NFUlRfRVEoLTEsIGluZGV4KTsKLQotICAgIGluZGV4ID0gYWRkKGgsIDgsIDEpOwotICAgIEFTU0VSVF9FUSgxVSwgaC5zaXplKCkpOwotCi0gICAgQVNTRVJUX0VRKGluZGV4LCBmaW5kKGgsIC0xLCA4KSk7Ci0gICAgQVNTRVJUX0VRKDgsIGguZW50cnlBdChpbmRleCkua2V5KTsKLSAgICBBU1NFUlRfRVEoMSwgaC5lbnRyeUF0KGluZGV4KS52YWx1ZSk7Ci0KLSAgICBpbmRleCA9IGZpbmQoaCwgaW5kZXgsIDgpOwotICAgIEFTU0VSVF9FUSgtMSwgaW5kZXgpOwotCi0gICAgQVNTRVJUX1RSVUUocmVtb3ZlKGgsIDgpKTsKLSAgICBBU1NFUlRfRVEoMFUsIGguc2l6ZSgpKTsKLQotICAgIGluZGV4ID0gZmluZChoLCAtMSwgOCk7Ci0gICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIEZpbmRBZGRGaW5kUmVtb3ZlRmluZF9NdWx0aXBsZUVudHJ5V2l0aFVuaXF1ZUtleSkgewotICAgIGNvbnN0IHNpemVfdCBOID0gMTE7Ci0KLSAgICBTaW1wbGVIYXNodGFibGUgaDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgICBzc2l6ZV90IGluZGV4ID0gZmluZChoLCAtMSwgaW50KGkpKTsKLSAgICAgICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci0KLSAgICAgICAgaW5kZXggPSBhZGQoaCwgaW50KGkpLCBpbnQoaSAqIDEwKSk7Ci0gICAgICAgIEFTU0VSVF9FUShpICsgMSwgaC5zaXplKCkpOwotCi0gICAgICAgIEFTU0VSVF9FUShpbmRleCwgZmluZChoLCAtMSwgaW50KGkpKSk7Ci0gICAgICAgIEFTU0VSVF9FUShpbnQoaSksIGguZW50cnlBdChpbmRleCkua2V5KTsKLSAgICAgICAgQVNTRVJUX0VRKGludChpICogMTApLCBoLmVudHJ5QXQoaW5kZXgpLnZhbHVlKTsKLQotICAgICAgICBpbmRleCA9IGZpbmQoaCwgaW5kZXgsIGludChpKSk7Ci0gICAgICAgIEFTU0VSVF9FUSgtMSwgaW5kZXgpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSBOOyAtLWkgPiAwOyApIHsKLSAgICAgICAgQVNTRVJUX1RSVUUocmVtb3ZlKGgsIGludChpKSkpIDw8ICJpID0gIiA8PCBpOwotICAgICAgICBBU1NFUlRfRVEoaSwgaC5zaXplKCkpOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBmaW5kKGgsIC0xLCBpbnQoaSkpOwotICAgICAgICBBU1NFUlRfRVEoLTEsIGluZGV4KTsKLSAgICB9Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIEZpbmRBZGRGaW5kUmVtb3ZlRmluZF9NdWx0aXBsZUVudHJ5V2l0aER1cGxpY2F0ZUtleSkgewotICAgIGNvbnN0IHNpemVfdCBOID0gMTE7Ci0gICAgY29uc3QgaW50IEsgPSAxOwotCi0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOOyBpKyspIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IGZpbmQoaCwgLTEsIEspOwotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoLTEsIGluZGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFTU0VSVF9ORSgtMSwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkKGgsIEssIGludChpKSk7Ci0gICAgICAgIEFTU0VSVF9FUShpICsgMSwgaC5zaXplKCkpOwotCi0gICAgICAgIGluZGV4ID0gLTE7Ci0gICAgICAgIGludCB2YWx1ZXMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8PSBpOyBqKyspIHsKLSAgICAgICAgICAgIGluZGV4ID0gZmluZChoLCBpbmRleCwgSyk7Ci0gICAgICAgICAgICBBU1NFUlRfR0UoaW5kZXgsIDApOwotICAgICAgICAgICAgQVNTRVJUX0VRKEssIGguZW50cnlBdChpbmRleCkua2V5KTsKLSAgICAgICAgICAgIHZhbHVlcyB8PSAxIDw8IGguZW50cnlBdChpbmRleCkudmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgQVNTRVJUX0VRKHZhbHVlcywgKDEgPDwgKGkgKyAxKSkgLSAxKTsKLQotICAgICAgICBpbmRleCA9IGZpbmQoaCwgaW5kZXgsIEspOwotICAgICAgICBBU1NFUlRfRVEoLTEsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gTjsgLS1pID4gMDsgKSB7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHJlbW92ZShoLCBLKSkgPDwgImkgPSAiIDw8IGk7Ci0gICAgICAgIEFTU0VSVF9FUShpLCBoLnNpemUoKSk7Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IC0xOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGk7IGorKykgewotICAgICAgICAgICAgaW5kZXggPSBmaW5kKGgsIGluZGV4LCBLKTsKLSAgICAgICAgICAgIEFTU0VSVF9HRShpbmRleCwgMCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoSywgaC5lbnRyeUF0KGluZGV4KS5rZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXggPSBmaW5kKGgsIGluZGV4LCBLKTsKLSAgICAgICAgQVNTRVJUX0VRKC0xLCBpbmRleCk7Ci0gICAgfQotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBDbGVhcl9XaGVuQWxyZWFkeUVtcHR5X0RvZXNOb3RoaW5nKSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0gICAgaC5jbGVhcigpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDNVLCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUSg1VSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMC43NWYsIGgubG9hZEZhY3RvcigpKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgQ2xlYXJfQWZ0ZXJFbGVtZW50c0FkZGVkX1JlbW92ZXNUaGVtKSB7Ci0gICAgU2ltcGxlSGFzaHRhYmxlIGg7Ci0gICAgYWRkKGgsIDAsIDApOwotICAgIGFkZChoLCAxLCAwKTsKLSAgICBoLmNsZWFyKCk7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoM1UsIGguY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKDVVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLjc1ZiwgaC5sb2FkRmFjdG9yKCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBDbGVhcl9BZnRlckVsZW1lbnRzQWRkZWRfRGVzdHJveXNUaGVtKSB7Ci0gICAgQ29tcGxleEhhc2h0YWJsZSBoOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDApLCBDb21wbGV4VmFsdWUoMCkpOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDEpLCBDb21wbGV4VmFsdWUoMCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotCi0gICAgaC5jbGVhcigpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMCwgMCkpOwotCi0gICAgRVhQRUNUX0VRKDBVLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDNVLCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUSg1VSwgaC5idWNrZXRDb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMC43NWYsIGgubG9hZEZhY3RvcigpKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgUmVtb3ZlX0FmdGVyRWxlbWVudHNBZGRlZF9EZXN0cm95c1RoZW0pIHsKLSAgICBDb21wbGV4SGFzaHRhYmxlIGg7Ci0gICAgYWRkKGgsIENvbXBsZXhLZXkoMCksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgYWRkKGgsIENvbXBsZXhLZXkoMSksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0KLSAgICBBU1NFUlRfVFJVRShyZW1vdmUoaCwgQ29tcGxleEtleSgwKSkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMSwgMSkpOwotCi0gICAgQVNTRVJUX1RSVUUocmVtb3ZlKGgsIENvbXBsZXhLZXkoMSkpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLQotICAgIEVYUEVDVF9FUSgwVSwgaC5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgzVSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoNVUsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAuNzVmLCBoLmxvYWRGYWN0b3IoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIERlc3RydWN0b3JfQWZ0ZXJFbGVtZW50c0FkZGVkX0Rlc3Ryb3lzVGhlbSkgewotICAgIHsKLSAgICAgICAgQ29tcGxleEhhc2h0YWJsZSBoOwotICAgICAgICBhZGQoaCwgQ29tcGxleEtleSgwKSwgQ29tcGxleFZhbHVlKDApKTsKLSAgICAgICAgYWRkKGgsIENvbXBsZXhLZXkoMSksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotICAgIH0gLy8gaCBpcyBkZXN0cm95ZWQgaGVyZQotCi0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgwLCAwKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIE5leHRfV2hlbkVtcHR5X1JldHVybnNNaW51c09uZSkgewotICAgIFNpbXBsZUhhc2h0YWJsZSBoOwotCi0gICAgQVNTRVJUX0VRKC0xLCBoLm5leHQoLTEpKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgTmV4dF9XaGVuTm9uRW1wdHlfSXRlcmF0ZXNPdmVyQWxsRW50cmllcykgewotICAgIGNvbnN0IGludCBOID0gODg7Ci0KLSAgICBTaW1wbGVIYXNodGFibGUgaDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgICBhZGQoaCwgaSwgaSAqIDEwKTsKLSAgICB9Ci0KLSAgICBib29sIHNldFtOXTsKLSAgICBtZW1zZXQoc2V0LCAwLCBzaXplb2YoYm9vbCkgKiBOKTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoc3NpemVfdCBpbmRleCA9IC0xOyAoaW5kZXggPSBoLm5leHQoaW5kZXgpKSAhPSAtMTsgKSB7Ci0gICAgICAgIEFTU0VSVF9HRShpbmRleCwgMCk7Ci0gICAgICAgIEFTU0VSVF9MVChzaXplX3QoaW5kZXgpLCBoLmJ1Y2tldENvdW50KCkpOwotCi0gICAgICAgIGNvbnN0IFNpbXBsZUVudHJ5JiBlbnRyeSA9IGguZW50cnlBdChpbmRleCk7Ci0gICAgICAgIEFTU0VSVF9HRShlbnRyeS5rZXksIDApOwotICAgICAgICBBU1NFUlRfTFQoZW50cnkua2V5LCBOKTsKLSAgICAgICAgQVNTRVJUX0VRKGZhbHNlLCBzZXRbZW50cnkua2V5XSk7Ci0gICAgICAgIEFTU0VSVF9FUShlbnRyeS5rZXkgKiAxMCwgZW50cnkudmFsdWUpOwotCi0gICAgICAgIHNldFtlbnRyeS5rZXldID0gdHJ1ZTsKLSAgICAgICAgY291bnQgKz0gMTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKE4sIGNvdW50KTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgQWRkX1JlaGFzaGVzT25EZW1hbmQpIHsKLSAgICBTaW1wbGVIYXNodGFibGUgaDsKLSAgICBzaXplX3QgaW5pdGlhbENhcGFjaXR5ID0gaC5jYXBhY2l0eSgpOwotICAgIHNpemVfdCBpbml0aWFsQnVja2V0Q291bnQgPSBoLmJ1Y2tldENvdW50KCk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluaXRpYWxDYXBhY2l0eTsgaSsrKSB7Ci0gICAgICAgIGFkZChoLCBpbnQoaSksIDApOwotICAgIH0KLQotICAgIEVYUEVDVF9FUShpbml0aWFsQ2FwYWNpdHksIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoaW5pdGlhbENhcGFjaXR5LCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUShpbml0aWFsQnVja2V0Q291bnQsIGguYnVja2V0Q291bnQoKSk7Ci0KLSAgICBhZGQoaCwgLTEsIC0xKTsKLQotICAgIEVYUEVDVF9FUShpbml0aWFsQ2FwYWNpdHkgKyAxLCBoLnNpemUoKSk7Ci0gICAgRVhQRUNUX0dUKGguY2FwYWNpdHkoKSwgaW5pdGlhbENhcGFjaXR5KTsKLSAgICBFWFBFQ1RfR1QoaC5idWNrZXRDb3VudCgpLCBpbml0aWFsQnVja2V0Q291bnQpOwotICAgIEVYUEVDVF9HVChoLmJ1Y2tldENvdW50KCksIGguY2FwYWNpdHkoKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIFJlaGFzaF9XaGVuQ2FwYWNpdHlBbmRCdWNrZXRDb3VudFVuY2hhbmdlZF9Eb2VzTm90aGluZykgewotICAgIENvbXBsZXhIYXNodGFibGUgaDsKLSAgICBhZGQoaCwgQ29tcGxleEtleSgwKSwgQ29tcGxleFZhbHVlKDApKTsKLSAgICBjb25zdCB2b2lkKiBvbGRCdWNrZXRzID0gZ2V0QnVja2V0cyhoKTsKLSAgICBBU1NFUlRfTkUoKHZvaWQqKU5VTEwsIG9sZEJ1Y2tldHMpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMSwgMSkpOwotCi0gICAgaC5yZWhhc2goaC5jYXBhY2l0eSgpLCBoLmxvYWRGYWN0b3IoKSk7Ci0KLSAgICBBU1NFUlRfRVEob2xkQnVja2V0cywgZ2V0QnVja2V0cyhoKSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgxLCAxKSk7Ci19Ci0KLVRFU1RfRihCYXNpY0hhc2h0YWJsZVRlc3QsIFJlaGFzaF9XaGVuRW1wdHlBbmRIYXNOb0J1Y2tldHNfQnV0RG9lc05vdEFsbG9jYXRlQnVja2V0cykgewotICAgIENvbXBsZXhIYXNodGFibGUgaDsKLSAgICBBU1NFUlRfRVEoKHZvaWQqKU5VTEwsIGdldEJ1Y2tldHMoaCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMCwgMCkpOwotCi0gICAgaC5yZWhhc2goOSwgMS4wZik7Ci0KLSAgICBFWFBFQ1RfRVEoMFUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMTBVLCBoLmNhcGFjaXR5KCkpOwotICAgIEVYUEVDVF9FUSgxMVUsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEuMGYsIGgubG9hZEZhY3RvcigpKTsKLSAgICBFWFBFQ1RfRVEoKHZvaWQqKU5VTEwsIGdldEJ1Y2tldHMoaCkpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMCwgMCkpOwotfQotCi1URVNUX0YoQmFzaWNIYXNodGFibGVUZXN0LCBSZWhhc2hfV2hlbkVtcHR5QW5kSGFzQnVja2V0c19SZWxlYXNlc0J1Y2tldHNBbmRTZXRzQ2FwYWNpdHkpIHsKLSAgICBDb21wbGV4SGFzaHRhYmxlIGgoMTApOwotICAgIGFkZChoLCBDb21wbGV4S2V5KDApLCBDb21wbGV4VmFsdWUoMCkpOwotICAgIEFTU0VSVF9UUlVFKHJlbW92ZShoLCBDb21wbGV4S2V5KDApKSk7Ci0gICAgQVNTRVJUX05FKCh2b2lkKilOVUxMLCBnZXRCdWNrZXRzKGgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLQotICAgIGgucmVoYXNoKDAsIDAuNzVmKTsKLQotICAgIEVYUEVDVF9FUSgwVSwgaC5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgzVSwgaC5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoNVUsIGguYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAuNzVmLCBoLmxvYWRGYWN0b3IoKSk7Ci0gICAgRVhQRUNUX0VRKCh2b2lkKilOVUxMLCBnZXRCdWNrZXRzKGgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDAsIDApKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgUmVoYXNoX1doZW5MZXNzVGhhbkN1cnJlbnRDYXBhY2l0eV9TaHJpbmtzQnVja2V0cykgewotICAgIENvbXBsZXhIYXNodGFibGUgaCgxMCk7Ci0gICAgYWRkKGgsIENvbXBsZXhLZXkoMCksIENvbXBsZXhWYWx1ZSgwKSk7Ci0gICAgYWRkKGgsIENvbXBsZXhLZXkoMSksIENvbXBsZXhWYWx1ZSgxKSk7Ci0gICAgY29uc3Qgdm9pZCogb2xkQnVja2V0cyA9IGdldEJ1Y2tldHMoaCk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0KLSAgICBoLnJlaGFzaCgwLCAwLjc1Zik7Ci0KLSAgICBFWFBFQ1RfRVEoMlUsIGguc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoM1UsIGguY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKDVVLCBoLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLjc1ZiwgaC5sb2FkRmFjdG9yKCkpOwotICAgIEVYUEVDVF9ORShvbGRCdWNrZXRzLCBnZXRCdWNrZXRzKGgpKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLX0KLQotVEVTVF9GKEJhc2ljSGFzaHRhYmxlVGVzdCwgQ29weU9uV3JpdGUpIHsKLSAgICBDb21wbGV4SGFzaHRhYmxlIGgxOwotICAgIGFkZChoMSwgQ29tcGxleEtleSgwKSwgQ29tcGxleFZhbHVlKDApKTsKLSAgICBhZGQoaDEsIENvbXBsZXhLZXkoMSksIENvbXBsZXhWYWx1ZSgxKSk7Ci0gICAgY29uc3Qgdm9pZCogb3JpZ2luYWxCdWNrZXRzID0gZ2V0QnVja2V0cyhoMSk7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0gICAgc3NpemVfdCBpbmRleDAgPSBmaW5kKGgxLCAtMSwgQ29tcGxleEtleSgwKSk7Ci0gICAgRVhQRUNUX0dFKGluZGV4MCwgMCk7Ci0KLSAgICAvLyBjb3B5IGNvbnN0cnVjdG9yIGFjcXVpcmVzIHNoYXJlZCByZWZlcmVuY2UKLSAgICBDb21wbGV4SGFzaHRhYmxlIGgyKGgxKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLSAgICBBU1NFUlRfRVEob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgyKSk7Ci0gICAgRVhQRUNUX0VRKGgxLnNpemUoKSwgaDIuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoaDEuY2FwYWNpdHkoKSwgaDIuY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKGgxLmJ1Y2tldENvdW50KCksIGgyLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUShoMS5sb2FkRmFjdG9yKCksIGgyLmxvYWRGYWN0b3IoKSk7Ci0gICAgRVhQRUNUX0VRKGluZGV4MCwgZmluZChoMiwgLTEsIENvbXBsZXhLZXkoMCkpKTsKLQotICAgIC8vIG9wZXJhdG9yPSBhY3F1aXJlcyBzaGFyZWQgcmVmZXJlbmNlCi0gICAgQ29tcGxleEhhc2h0YWJsZSBoMzsKLSAgICBoMyA9IGgyOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoMiwgMikpOwotICAgIEFTU0VSVF9FUShvcmlnaW5hbEJ1Y2tldHMsIGdldEJ1Y2tldHMoaDMpKTsKLSAgICBFWFBFQ1RfRVEoaDEuc2l6ZSgpLCBoMy5zaXplKCkpOwotICAgIEVYUEVDVF9FUShoMS5jYXBhY2l0eSgpLCBoMy5jYXBhY2l0eSgpKTsKLSAgICBFWFBFQ1RfRVEoaDEuYnVja2V0Q291bnQoKSwgaDMuYnVja2V0Q291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKGgxLmxvYWRGYWN0b3IoKSwgaDMubG9hZEZhY3RvcigpKTsKLSAgICBFWFBFQ1RfRVEoaW5kZXgwLCBmaW5kKGgzLCAtMSwgQ29tcGxleEtleSgwKSkpOwotCi0gICAgLy8gZWRpdEVudHJ5QXQgY29waWVzIHNoYXJlZCBjb250ZW50cwotICAgIGgxLmVkaXRFbnRyeUF0KGluZGV4MCkudmFsdWUudiA9IDQyOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoNCwgNCkpOwotICAgIEFTU0VSVF9ORShvcmlnaW5hbEJ1Y2tldHMsIGdldEJ1Y2tldHMoaDEpKTsKLSAgICBFWFBFQ1RfRVEoNDIsIGgxLmVudHJ5QXQoaW5kZXgwKS52YWx1ZS52KTsKLSAgICBFWFBFQ1RfRVEoMCwgaDIuZW50cnlBdChpbmRleDApLnZhbHVlLnYpOwotICAgIEVYUEVDVF9FUSgwLCBoMy5lbnRyeUF0KGluZGV4MCkudmFsdWUudik7Ci0KLSAgICAvLyBjbGVhciByZWxlYXNlcyByZWZlcmVuY2UgdG8gc2hhcmVkIGNvbnRlbnRzCi0gICAgaDIuY2xlYXIoKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDQsIDQpKTsKLSAgICBFWFBFQ1RfRVEoMFUsIGgyLnNpemUoKSk7Ci0gICAgQVNTRVJUX05FKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMikpOwotCi0gICAgLy8gb3BlcmF0b3I9IGFjcXVpcmVzIHNoYXJlZCByZWZlcmVuY2UsIGRlc3Ryb3lzIHVuc2hhcmVkIGNvbnRlbnRzCi0gICAgaDEgPSBoMzsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLSAgICBBU1NFUlRfRVEob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgxKSk7Ci0gICAgRVhQRUNUX0VRKGgzLnNpemUoKSwgaDEuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoaDMuY2FwYWNpdHkoKSwgaDEuY2FwYWNpdHkoKSk7Ci0gICAgRVhQRUNUX0VRKGgzLmJ1Y2tldENvdW50KCksIGgxLmJ1Y2tldENvdW50KCkpOwotICAgIEVYUEVDVF9FUShoMy5sb2FkRmFjdG9yKCksIGgxLmxvYWRGYWN0b3IoKSk7Ci0gICAgRVhQRUNUX0VRKGluZGV4MCwgZmluZChoMSwgLTEsIENvbXBsZXhLZXkoMCkpKTsKLQotICAgIC8vIGFkZCBjb3BpZXMgc2hhcmVkIGNvbnRlbnRzCi0gICAgYWRkKGgxLCBDb21wbGV4S2V5KDIpLCBDb21wbGV4VmFsdWUoMikpOwotICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGFzc2VydEluc3RhbmNlQ291bnQoNSwgNSkpOwotICAgIEFTU0VSVF9ORShvcmlnaW5hbEJ1Y2tldHMsIGdldEJ1Y2tldHMoaDEpKTsKLSAgICBFWFBFQ1RfRVEoM1UsIGgxLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDBVLCBoMi5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgyVSwgaDMuc2l6ZSgpKTsKLQotICAgIC8vIHJlbW92ZSBjb3BpZXMgc2hhcmVkIGNvbnRlbnRzCi0gICAgaDEgPSBoMzsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDIsIDIpKTsKLSAgICBBU1NFUlRfRVEob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgxKSk7Ci0gICAgaDEucmVtb3ZlQXQoaW5kZXgwKTsKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShhc3NlcnRJbnN0YW5jZUNvdW50KDMsIDMpKTsKLSAgICBBU1NFUlRfTkUob3JpZ2luYWxCdWNrZXRzLCBnZXRCdWNrZXRzKGgxKSk7Ci0gICAgRVhQRUNUX0VRKDFVLCBoMS5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgwVSwgaDIuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMlUsIGgzLnNpemUoKSk7Ci0KLSAgICAvLyByZWhhc2ggY29waWVzIHNoYXJlZCBjb250ZW50cwotICAgIGgxID0gaDM7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCgyLCAyKSk7Ci0gICAgQVNTRVJUX0VRKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMSkpOwotICAgIGgxLnJlaGFzaCgxMCwgMS4wZik7Ci0gICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYXNzZXJ0SW5zdGFuY2VDb3VudCg0LCA0KSk7Ci0gICAgQVNTRVJUX05FKG9yaWdpbmFsQnVja2V0cywgZ2V0QnVja2V0cyhoMSkpOwotICAgIEVYUEVDVF9FUSgyVSwgaDEuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMFUsIGgyLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDJVLCBoMy5zaXplKCkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL0Jsb2JDYWNoZV90ZXN0LmNwcCBiL2xpYnMvdXRpbHMvdGVzdHMvQmxvYkNhY2hlX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRjYzM5Li4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvdGVzdHMvQmxvYkNhY2hlX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Jsb2JDYWNoZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEJsb2JDYWNoZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICBlbnVtIHsKLSAgICAgICAgTUFYX0tFWV9TSVpFID0gNiwKLSAgICAgICAgTUFYX1ZBTFVFX1NJWkUgPSA4LAotICAgICAgICBNQVhfVE9UQUxfU0laRSA9IDEzLAotICAgIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1CQyA9IG5ldyBCbG9iQ2FjaGUoTUFYX0tFWV9TSVpFLCBNQVhfVkFMVUVfU0laRSwgTUFYX1RPVEFMX1NJWkUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbUJDLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgc3A8QmxvYkNhY2hlPiBtQkM7Ci19OwotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgQ2FjaGVTaW5nbGVWYWx1ZVN1Y2NlZWRzKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoJ2UnLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgnZicsIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKCdnJywgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoJ2gnLCBidWZbM10pOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgQ2FjaGVUd29WYWx1ZXNTdWNjZWVkcykgewotICAgIGNoYXIgYnVmWzJdID0geyAweGVlLCAweGVlIH07Ci0gICAgbUJDLT5zZXQoImFiIiwgMiwgImNkIiwgMik7Ci0gICAgbUJDLT5zZXQoImVmIiwgMiwgImdoIiwgMik7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCgyKSwgbUJDLT5nZXQoImFiIiwgMiwgYnVmLCAyKSk7Ci0gICAgQVNTRVJUX0VRKCdjJywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ2QnLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUShzaXplX3QoMiksIG1CQy0+Z2V0KCJlZiIsIDIsIGJ1ZiwgMikpOwotICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCdoJywgYnVmWzFdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIEdldE9ubHlXcml0ZXNJbnNpZGVCb3VuZHMpIHsKLSAgICBjaGFyIGJ1Zls2XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDQpLCBtQkMtPmdldCgiYWJjZCIsIDQsIGJ1ZisxLCA0KSk7Ci0gICAgQVNTRVJUX0VRKDB4ZWUsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCdlJywgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoJ2YnLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlszXSk7Ci0gICAgQVNTRVJUX0VRKCdoJywgYnVmWzRdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzVdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIEdldE9ubHlXcml0ZXNJZkJ1ZmZlcklzTGFyZ2VFbm91Z2gpIHsKLSAgICBjaGFyIGJ1ZlszXSA9IHsgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDQpLCBtQkMtPmdldCgiYWJjZCIsIDQsIGJ1ZiwgMykpOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMl0pOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgR2V0RG9lc250QWNjZXNzTnVsbEJ1ZmZlcikgewotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDQpLCBtQkMtPmdldCgiYWJjZCIsIDQsIE5VTEwsIDApKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIE11bHRpcGxlU2V0c0NhY2hlTGF0ZXN0VmFsdWUpIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJpamtsIiwgNCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoJ2knLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgnaicsIGJ1ZlsxXSk7Ci0gICAgQVNTRVJUX0VRKCdrJywgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoJ2wnLCBidWZbM10pOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgU2Vjb25kU2V0S2VlcHNGaXJzdFZhbHVlSWZUb29MYXJnZSkgewotICAgIGNoYXIgYnVmW01BWF9WQUxVRV9TSVpFKzFdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgYnVmLCBNQVhfVkFMVUVfU0laRSsxKTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDQpLCBtQkMtPmdldCgiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgnZScsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCdmJywgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoJ2cnLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgnaCcsIGJ1ZlszXSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBEb2VzbnRDYWNoZUlmS2V5SXNUb29CaWcpIHsKLSAgICBjaGFyIGtleVtNQVhfS0VZX1NJWkUrMV07Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9LRVlfU0laRSsxOyBpKyspIHsKLSAgICAgICAga2V5W2ldID0gJ2EnOwotICAgIH0KLSAgICBtQkMtPnNldChrZXksIE1BWF9LRVlfU0laRSsxLCAiYmJiYiIsIDQpOwotICAgIEFTU0VSVF9FUShzaXplX3QoMCksIG1CQy0+Z2V0KGtleSwgTUFYX0tFWV9TSVpFKzEsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMF0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgweGVlLCBidWZbM10pOwotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgRG9lc250Q2FjaGVJZlZhbHVlSXNUb29CaWcpIHsKLSAgICBjaGFyIGJ1ZltNQVhfVkFMVUVfU0laRSsxXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9WQUxVRV9TSVpFKzE7IGkrKykgewotICAgICAgICBidWZbaV0gPSAnYic7Ci0gICAgfQotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgYnVmLCBNQVhfVkFMVUVfU0laRSsxKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9WQUxVRV9TSVpFKzE7IGkrKykgewotICAgICAgICBidWZbaV0gPSAweGVlOwotICAgIH0KLSAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMtPmdldCgiYWJjZCIsIDQsIGJ1ZiwgTUFYX1ZBTFVFX1NJWkUrMSkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1ZBTFVFX1NJWkUrMTsgaSsrKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRShpKTsKLSAgICAgICAgQVNTRVJUX0VRKDB4ZWUsIGJ1ZltpXSk7Ci0gICAgfQotfQotCi1URVNUX0YoQmxvYkNhY2hlVGVzdCwgRG9lc250Q2FjaGVJZktleVZhbHVlUGFpcklzVG9vQmlnKSB7Ci0gICAgLy8gQ2hlY2sgYSB0ZXN0aW5nIGFzc3VtcHRpb25zCi0gICAgQVNTRVJUX1RSVUUoTUFYX1RPVEFMX1NJWkUgPCBNQVhfS0VZX1NJWkUgKyBNQVhfVkFMVUVfU0laRSk7Ci0gICAgQVNTRVJUX1RSVUUoTUFYX0tFWV9TSVpFIDwgTUFYX1RPVEFMX1NJWkUpOwotCi0gICAgZW51bSB7IGJ1ZlNpemUgPSBNQVhfVE9UQUxfU0laRSAtIE1BWF9LRVlfU0laRSArIDEgfTsKLQotICAgIGNoYXIga2V5W01BWF9LRVlfU0laRV07Ci0gICAgY2hhciBidWZbYnVmU2l6ZV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfS0VZX1NJWkU7IGkrKykgewotICAgICAgICBrZXlbaV0gPSAnYSc7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmU2l6ZTsgaSsrKSB7Ci0gICAgICAgIGJ1ZltpXSA9ICdiJzsKLSAgICB9Ci0KLSAgICBtQkMtPnNldChrZXksIE1BWF9LRVlfU0laRSwgYnVmLCBNQVhfVkFMVUVfU0laRSk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCgwKSwgbUJDLT5nZXQoa2V5LCBNQVhfS0VZX1NJWkUsIE5VTEwsIDApKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlTWF4S2V5U2l6ZVN1Y2NlZWRzKSB7Ci0gICAgY2hhciBrZXlbTUFYX0tFWV9TSVpFXTsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0tFWV9TSVpFOyBpKyspIHsKLSAgICAgICAga2V5W2ldID0gJ2EnOwotICAgIH0KLSAgICBtQkMtPnNldChrZXksIE1BWF9LRVlfU0laRSwgInd4eXoiLCA0KTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDQpLCBtQkMtPmdldChrZXksIE1BWF9LRVlfU0laRSwgYnVmLCA0KSk7Ci0gICAgQVNTRVJUX0VRKCd3JywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ3gnLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgneScsIGJ1ZlsyXSk7Ci0gICAgQVNTRVJUX0VRKCd6JywgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlTWF4VmFsdWVTaXplU3VjY2VlZHMpIHsKLSAgICBjaGFyIGJ1ZltNQVhfVkFMVUVfU0laRV07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfVkFMVUVfU0laRTsgaSsrKSB7Ci0gICAgICAgIGJ1ZltpXSA9ICdiJzsKLSAgICB9Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCBidWYsIE1BWF9WQUxVRV9TSVpFKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9WQUxVRV9TSVpFOyBpKyspIHsKLSAgICAgICAgYnVmW2ldID0gMHhlZTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKHNpemVfdChNQVhfVkFMVUVfU0laRSksIG1CQy0+Z2V0KCJhYmNkIiwgNCwgYnVmLAotICAgICAgICAgICAgTUFYX1ZBTFVFX1NJWkUpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9WQUxVRV9TSVpFOyBpKyspIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKGkpOwotICAgICAgICBBU1NFUlRfRVEoJ2InLCBidWZbaV0pOwotICAgIH0KLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlTWF4S2V5VmFsdWVQYWlyU2l6ZVN1Y2NlZWRzKSB7Ci0gICAgLy8gQ2hlY2sgYSB0ZXN0aW5nIGFzc3VtcHRpb24KLSAgICBBU1NFUlRfVFJVRShNQVhfS0VZX1NJWkUgPCBNQVhfVE9UQUxfU0laRSk7Ci0KLSAgICBlbnVtIHsgYnVmU2l6ZSA9IE1BWF9UT1RBTF9TSVpFIC0gTUFYX0tFWV9TSVpFIH07Ci0KLSAgICBjaGFyIGtleVtNQVhfS0VZX1NJWkVdOwotICAgIGNoYXIgYnVmW2J1ZlNpemVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0tFWV9TSVpFOyBpKyspIHsKLSAgICAgICAga2V5W2ldID0gJ2EnOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1ZlNpemU7IGkrKykgewotICAgICAgICBidWZbaV0gPSAnYic7Ci0gICAgfQotCi0gICAgbUJDLT5zZXQoa2V5LCBNQVhfS0VZX1NJWkUsIGJ1ZiwgYnVmU2l6ZSk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdChidWZTaXplKSwgbUJDLT5nZXQoa2V5LCBNQVhfS0VZX1NJWkUsIE5VTEwsIDApKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZVRlc3QsIENhY2hlTWluS2V5QW5kVmFsdWVTaXplU3VjY2VlZHMpIHsKLSAgICBjaGFyIGJ1ZlsxXSA9IHsgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJ4IiwgMSwgInkiLCAxKTsKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDEpLCBtQkMtPmdldCgieCIsIDEsIGJ1ZiwgMSkpOwotICAgIEFTU0VSVF9FUSgneScsIGJ1ZlswXSk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBDYWNoZVNpemVEb2VzbnRFeGNlZWRUb3RhbExpbWl0KSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBtQkMtPnNldCgmaywgMSwgIngiLCAxKTsKLSAgICB9Ci0gICAgaW50IG51bUNhY2hlZCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBpZiAobUJDLT5nZXQoJmssIDEsIE5VTEwsIDApID09IDEpIHsKLSAgICAgICAgICAgIG51bUNhY2hlZCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIEFTU0VSVF9HRShNQVhfVE9UQUxfU0laRSAvIDIsIG51bUNhY2hlZCk7Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVUZXN0LCBFeGNlZWRpbmdUb3RhbExpbWl0SGFsdmVzQ2FjaGVTaXplKSB7Ci0gICAgLy8gRmlsbCB1cCB0aGUgZW50aXJlIGNhY2hlIHdpdGggMSBjaGFyIGtleS92YWx1ZSBwYWlycy4KLSAgICBjb25zdCBpbnQgbWF4RW50cmllcyA9IE1BWF9UT1RBTF9TSVpFIC8gMjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXM7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBtQkMtPnNldCgmaywgMSwgIngiLCAxKTsKLSAgICB9Ci0gICAgLy8gSW5zZXJ0IG9uZSBtb3JlIGVudHJ5LCBjYXVzaW5nIGEgY2FjaGUgb3ZlcmZsb3cuCi0gICAgewotICAgICAgICB1aW50OF90IGsgPSBtYXhFbnRyaWVzOwotICAgICAgICBtQkMtPnNldCgmaywgMSwgIngiLCAxKTsKLSAgICB9Ci0gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBjYWNoZS4KLSAgICBpbnQgbnVtQ2FjaGVkID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXMrMTsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgayA9IGk7Ci0gICAgICAgIGlmIChtQkMtPmdldCgmaywgMSwgTlVMTCwgMCkgPT0gMSkgewotICAgICAgICAgICAgbnVtQ2FjaGVkKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQVNTRVJUX0VRKG1heEVudHJpZXMvMiArIDEsIG51bUNhY2hlZCk7Ci19Ci0KLWNsYXNzIEJsb2JDYWNoZUZsYXR0ZW5UZXN0IDogcHVibGljIEJsb2JDYWNoZVRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgQmxvYkNhY2hlVGVzdDo6U2V0VXAoKTsKLSAgICAgICAgbUJDMiA9IG5ldyBCbG9iQ2FjaGUoTUFYX0tFWV9TSVpFLCBNQVhfVkFMVUVfU0laRSwgTUFYX1RPVEFMX1NJWkUpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbUJDMi5jbGVhcigpOwotICAgICAgICBCbG9iQ2FjaGVUZXN0OjpUZWFyRG93bigpOwotICAgIH0KLQotICAgIHZvaWQgcm91bmRUcmlwKCkgewotICAgICAgICBzaXplX3Qgc2l6ZSA9IG1CQy0+Z2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgICAgICB1aW50OF90KiBmbGF0ID0gbmV3IHVpbnQ4X3Rbc2l6ZV07Ci0gICAgICAgIEFTU0VSVF9FUShPSywgbUJDLT5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICAgICAgQVNTRVJUX0VRKE9LLCBtQkMyLT51bmZsYXR0ZW4oZmxhdCwgc2l6ZSwgTlVMTCwgMCkpOwotICAgICAgICBkZWxldGVbXSBmbGF0OwotICAgIH0KLQotICAgIHNwPEJsb2JDYWNoZT4gbUJDMjsKLX07Ci0KLVRFU1RfRihCbG9iQ2FjaGVGbGF0dGVuVGVzdCwgRmxhdHRlbk9uZVZhbHVlKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgcm91bmRUcmlwKCk7Ci0gICAgQVNTRVJUX0VRKHNpemVfdCg0KSwgbUJDMi0+Z2V0KCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci0gICAgQVNTRVJUX0VRKCdlJywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ2YnLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlsyXSk7Ci0gICAgQVNTRVJUX0VRKCdoJywgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZUZsYXR0ZW5UZXN0LCBGbGF0dGVuRnVsbENhY2hlKSB7Ci0gICAgLy8gRmlsbCB1cCB0aGUgZW50aXJlIGNhY2hlIHdpdGggMSBjaGFyIGtleS92YWx1ZSBwYWlycy4KLSAgICBjb25zdCBpbnQgbWF4RW50cmllcyA9IE1BWF9UT1RBTF9TSVpFIC8gMjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXM7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBtQkMtPnNldCgmaywgMSwgJmssIDEpOwotICAgIH0KLQotICAgIHJvdW5kVHJpcCgpOwotCi0gICAgLy8gVmVyaWZ5IHRoZSBkZXNlcmlhbGl6ZWQgY2FjaGUKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXM7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICB1aW50OF90IHYgPSAweGVlOwotICAgICAgICBBU1NFUlRfRVEoc2l6ZV90KDEpLCBtQkMyLT5nZXQoJmssIDEsICZ2LCAxKSk7Ci0gICAgICAgIEFTU0VSVF9FUShrLCB2KTsKLSAgICB9Ci19Ci0KLVRFU1RfRihCbG9iQ2FjaGVGbGF0dGVuVGVzdCwgRmxhdHRlbkRvZXNudENoYW5nZUNhY2hlKSB7Ci0gICAgLy8gRmlsbCB1cCB0aGUgZW50aXJlIGNhY2hlIHdpdGggMSBjaGFyIGtleS92YWx1ZSBwYWlycy4KLSAgICBjb25zdCBpbnQgbWF4RW50cmllcyA9IE1BWF9UT1RBTF9TSVpFIC8gMjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heEVudHJpZXM7IGkrKykgewotICAgICAgICB1aW50OF90IGsgPSBpOwotICAgICAgICBtQkMtPnNldCgmaywgMSwgJmssIDEpOwotICAgIH0KLQotICAgIHNpemVfdCBzaXplID0gbUJDLT5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgdWludDhfdCogZmxhdCA9IG5ldyB1aW50OF90W3NpemVdOwotICAgIEFTU0VSVF9FUShPSywgbUJDLT5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICBkZWxldGVbXSBmbGF0OwotCi0gICAgLy8gVmVyaWZ5IHRoZSBjYWNoZSB0aGF0IHdlIGp1c3Qgc2VyaWFsaXplZAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4RW50cmllczsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgayA9IGk7Ci0gICAgICAgIHVpbnQ4X3QgdiA9IDB4ZWU7Ci0gICAgICAgIEFTU0VSVF9FUShzaXplX3QoMSksIG1CQy0+Z2V0KCZrLCAxLCAmdiwgMSkpOwotICAgICAgICBBU1NFUlRfRVEoaywgdik7Ci0gICAgfQotfQotCi1URVNUX0YoQmxvYkNhY2hlRmxhdHRlblRlc3QsIEZsYXR0ZW5DYXRjaGVzQnVmZmVyVG9vU21hbGwpIHsKLSAgICAvLyBGaWxsIHVwIHRoZSBlbnRpcmUgY2FjaGUgd2l0aCAxIGNoYXIga2V5L3ZhbHVlIHBhaXJzLgotICAgIGNvbnN0IGludCBtYXhFbnRyaWVzID0gTUFYX1RPVEFMX1NJWkUgLyAyOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4RW50cmllczsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgayA9IGk7Ci0gICAgICAgIG1CQy0+c2V0KCZrLCAxLCAmaywgMSk7Ci0gICAgfQotCi0gICAgc2l6ZV90IHNpemUgPSBtQkMtPmdldEZsYXR0ZW5lZFNpemUoKSAtIDE7Ci0gICAgdWludDhfdCogZmxhdCA9IG5ldyB1aW50OF90W3NpemVdOwotICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1CQy0+ZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgZGVsZXRlW10gZmxhdDsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZUZsYXR0ZW5UZXN0LCBVbmZsYXR0ZW5DYXRjaGVzQmFkTWFnaWMpIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLQotICAgIHNpemVfdCBzaXplID0gbUJDLT5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgdWludDhfdCogZmxhdCA9IG5ldyB1aW50OF90W3NpemVdOwotICAgIEFTU0VSVF9FUShPSywgbUJDLT5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICBmbGF0WzFdID0gfmZsYXRbMV07Ci0KLSAgICAvLyBCYWQgbWFnaWMgc2hvdWxkIGNhdXNlIGFuIGVycm9yLgotICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1CQzItPnVuZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgZGVsZXRlW10gZmxhdDsKLQotICAgIC8vIFRoZSBlcnJvciBzaG91bGQgY2F1c2UgdGhlIHVuZmxhdHRlbiB0byByZXN1bHQgaW4gYW4gZW1wdHkgY2FjaGUKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMyLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZUZsYXR0ZW5UZXN0LCBVbmZsYXR0ZW5DYXRjaGVzQmFkQmxvYkNhY2hlVmVyc2lvbikgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUJDLT5zZXQoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotCi0gICAgc2l6ZV90IHNpemUgPSBtQkMtPmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICB1aW50OF90KiBmbGF0ID0gbmV3IHVpbnQ4X3Rbc2l6ZV07Ci0gICAgQVNTRVJUX0VRKE9LLCBtQkMtPmZsYXR0ZW4oZmxhdCwgc2l6ZSwgTlVMTCwgMCkpOwotICAgIGZsYXRbNV0gPSB+ZmxhdFs1XTsKLQotICAgIC8vIFZlcnNpb24gbWlzbWF0Y2hlcyBzaG91bGRuJ3QgY2F1c2UgZXJyb3JzLCBidXQgc2hvdWxkIG5vdCB1c2UgdGhlCi0gICAgLy8gc2VyaWFsaXplZCBlbnRyaWVzCi0gICAgQVNTRVJUX0VRKE9LLCBtQkMyLT51bmZsYXR0ZW4oZmxhdCwgc2l6ZSwgTlVMTCwgMCkpOwotICAgIGRlbGV0ZVtdIGZsYXQ7Ci0KLSAgICAvLyBUaGUgdmVyc2lvbiBtaXNtYXRjaCBzaG91bGQgY2F1c2UgdGhlIHVuZmxhdHRlbiB0byByZXN1bHQgaW4gYW4gZW1wdHkKLSAgICAvLyBjYWNoZQotICAgIEFTU0VSVF9FUShzaXplX3QoMCksIG1CQzItPmdldCgiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotfQotCi1URVNUX0YoQmxvYkNhY2hlRmxhdHRlblRlc3QsIFVuZmxhdHRlbkNhdGNoZXNCYWRCbG9iQ2FjaGVEZXZpY2VWZXJzaW9uKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQkMtPnNldCgiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1CQy0+Z2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHVpbnQ4X3QqIGZsYXQgPSBuZXcgdWludDhfdFtzaXplXTsKLSAgICBBU1NFUlRfRVEoT0ssIG1CQy0+ZmxhdHRlbihmbGF0LCBzaXplLCBOVUxMLCAwKSk7Ci0gICAgZmxhdFsxMF0gPSB+ZmxhdFsxMF07Ci0KLSAgICAvLyBWZXJzaW9uIG1pc21hdGNoZXMgc2hvdWxkbid0IGNhdXNlIGVycm9ycywgYnV0IHNob3VsZCBub3QgdXNlIHRoZQotICAgIC8vIHNlcmlhbGl6ZWQgZW50cmllcwotICAgIEFTU0VSVF9FUShPSywgbUJDMi0+dW5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLSAgICBkZWxldGVbXSBmbGF0OwotCi0gICAgLy8gVGhlIHZlcnNpb24gbWlzbWF0Y2ggc2hvdWxkIGNhdXNlIHRoZSB1bmZsYXR0ZW4gdG8gcmVzdWx0IGluIGFuIGVtcHR5Ci0gICAgLy8gY2FjaGUKLSAgICBBU1NFUlRfRVEoc2l6ZV90KDApLCBtQkMyLT5nZXQoImFiY2QiLCA0LCBidWYsIDQpKTsKLX0KLQotVEVTVF9GKEJsb2JDYWNoZUZsYXR0ZW5UZXN0LCBVbmZsYXR0ZW5DYXRjaGVzQnVmZmVyVG9vU21hbGwpIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1CQy0+c2V0KCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLQotICAgIHNpemVfdCBzaXplID0gbUJDLT5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgdWludDhfdCogZmxhdCA9IG5ldyB1aW50OF90W3NpemVdOwotICAgIEFTU0VSVF9FUShPSywgbUJDLT5mbGF0dGVuKGZsYXQsIHNpemUsIE5VTEwsIDApKTsKLQotICAgIC8vIEEgYnVmZmVyIHRydW5jYXRpb24gc2hvdWxkdCBjYXVzZSBhbiBlcnJvcgotICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1CQzItPnVuZmxhdHRlbihmbGF0LCBzaXplLTEsIE5VTEwsIDApKTsKLSAgICBkZWxldGVbXSBmbGF0OwotCi0gICAgLy8gVGhlIGVycm9yIHNob3VsZCBjYXVzZSB0aGUgdW5mbGF0dGVuIHRvIHJlc3VsdCBpbiBhbiBlbXB0eSBjYWNoZQotICAgIEFTU0VSVF9FUShzaXplX3QoMCksIG1CQzItPmdldCgiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3V0aWxzL3Rlc3RzL0xvb3Blcl90ZXN0LmNwcCBiL2xpYnMvdXRpbHMvdGVzdHMvTG9vcGVyX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYyYmEyLi4wMDAwMDAwCi0tLSBhL2xpYnMvdXRpbHMvdGVzdHMvTG9vcGVyX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8vCi0vLyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotCi0jaW5jbHVkZSA8dXRpbHMvTG9vcGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RvcFdhdGNoLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJUZXN0SGVscGVycy5oIgotCi0vLyAjIG9mIG1pbGxpc2Vjb25kcyB0byBmdWRnZSBzdG9wd2F0Y2ggbWVhc3VyZW1lbnRzCi0jZGVmaW5lIFRJTUlOR19UT0xFUkFOQ0VfTVMgMjUKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1lbnVtIHsKLSAgICBNU0dfVEVTVDEgPSAxLAotICAgIE1TR19URVNUMiA9IDIsCi0gICAgTVNHX1RFU1QzID0gMywKLSAgICBNU0dfVEVTVDQgPSA0LAotfTsKLQotY2xhc3MgRGVsYXllZFdha2UgOiBwdWJsaWMgRGVsYXllZFRhc2sgewotICAgIHNwPExvb3Blcj4gbUxvb3BlcjsKLQotcHVibGljOgotICAgIERlbGF5ZWRXYWtlKGludCBkZWxheU1pbGxpcywgY29uc3Qgc3A8TG9vcGVyPiBsb29wZXIpIDoKLSAgICAgICAgRGVsYXllZFRhc2soZGVsYXlNaWxsaXMpLCBtTG9vcGVyKGxvb3BlcikgewotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBkb1Rhc2soKSB7Ci0gICAgICAgIG1Mb29wZXItPndha2UoKTsKLSAgICB9Ci19OwotCi1jbGFzcyBEZWxheWVkV3JpdGVTaWduYWwgOiBwdWJsaWMgRGVsYXllZFRhc2sgewotICAgIFBpcGUqIG1QaXBlOwotCi1wdWJsaWM6Ci0gICAgRGVsYXllZFdyaXRlU2lnbmFsKGludCBkZWxheU1pbGxpcywgUGlwZSogcGlwZSkgOgotICAgICAgICBEZWxheWVkVGFzayhkZWxheU1pbGxpcyksIG1QaXBlKHBpcGUpIHsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgZG9UYXNrKCkgewotICAgICAgICBtUGlwZS0+d3JpdGVTaWduYWwoKTsKLSAgICB9Ci19OwotCi1jbGFzcyBDYWxsYmFja0hhbmRsZXIgewotcHVibGljOgotICAgIHZvaWQgc2V0Q2FsbGJhY2soY29uc3Qgc3A8TG9vcGVyPiYgbG9vcGVyLCBpbnQgZmQsIGludCBldmVudHMpIHsKLSAgICAgICAgbG9vcGVyLT5hZGRGZChmZCwgMCwgZXZlbnRzLCBzdGF0aWNIYW5kbGVyLCB0aGlzKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5DYWxsYmFja0hhbmRsZXIoKSB7IH0KLQotICAgIHZpcnR1YWwgaW50IGhhbmRsZXIoaW50IGZkLCBpbnQgZXZlbnRzKSA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIGludCBzdGF0aWNIYW5kbGVyKGludCBmZCwgaW50IGV2ZW50cywgdm9pZCogZGF0YSkgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FsbGJhY2tIYW5kbGVyKj4oZGF0YSktPmhhbmRsZXIoZmQsIGV2ZW50cyk7Ci0gICAgfQotfTsKLQotY2xhc3MgU3R1YkNhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBDYWxsYmFja0hhbmRsZXIgewotcHVibGljOgotICAgIGludCBuZXh0UmVzdWx0OwotICAgIGludCBjYWxsYmFja0NvdW50OwotCi0gICAgaW50IGZkOwotICAgIGludCBldmVudHM7Ci0KLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyKGludCBuZXh0UmVzdWx0KSA6IG5leHRSZXN1bHQobmV4dFJlc3VsdCksCi0gICAgICAgICAgICBjYWxsYmFja0NvdW50KDApLCBmZCgtMSksIGV2ZW50cygtMSkgewotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgaW50IGhhbmRsZXIoaW50IGZkLCBpbnQgZXZlbnRzKSB7Ci0gICAgICAgIGNhbGxiYWNrQ291bnQgKz0gMTsKLSAgICAgICAgdGhpcy0+ZmQgPSBmZDsKLSAgICAgICAgdGhpcy0+ZXZlbnRzID0gZXZlbnRzOwotICAgICAgICByZXR1cm4gbmV4dFJlc3VsdDsKLSAgICB9Ci19OwotCi1jbGFzcyBTdHViTWVzc2FnZUhhbmRsZXIgOiBwdWJsaWMgTWVzc2FnZUhhbmRsZXIgewotcHVibGljOgotICAgIFZlY3RvcjxNZXNzYWdlPiBtZXNzYWdlczsKLQotICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgICAgICAgbWVzc2FnZXMucHVzaChtZXNzYWdlKTsKLSAgICB9Ci19OwotCi1jbGFzcyBMb29wZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHNwPExvb3Blcj4gbUxvb3BlcjsKLQotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgbUxvb3BlciA9IG5ldyBMb29wZXIodHJ1ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBtTG9vcGVyLmNsZWFyKCk7Ci0gICAgfQotfTsKLQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbk5vblplcm9UaW1lb3V0QW5kTm90QXdva2VuX1dhaXRzRm9yVGltZW91dCkgewotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMTAwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiBlcXVhbCB0aW1lb3V0IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1RJTUVPVVQsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9USU1FT1VUIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5Ob25aZXJvVGltZW91dEFuZEF3b2tlbkJlZm9yZVdhaXRpbmdfSW1tZWRpYXRlbHlSZXR1cm5zKSB7Ci0gICAgbUxvb3Blci0+d2FrZSgpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gemVybyBiZWNhdXNlIHdha2UoKSB3YXMgY2FsbGVkIGJlZm9yZSB3YWl0aW5nIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1dBS0UsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIGxvb3Agd2FzIGF3b2tlbiI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuTm9uWmVyb1RpbWVvdXRBbmRBd29rZW5XaGlsZVdhaXRpbmdfUHJvbXB0bHlSZXR1cm5zKSB7Ci0gICAgc3A8RGVsYXllZFdha2U+IGRlbGF5ZWRXYWtlID0gbmV3IERlbGF5ZWRXYWtlKDEwMCwgbUxvb3Blcik7Ci0gICAgZGVsYXllZFdha2UtPnJ1bigpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMTAwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiBlcXVhbCB3YWtlIGRlbGF5IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1dBS0UsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIGxvb3Agd2FzIGF3b2tlbiI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuWmVyb1RpbWVvdXRBbmROb1JlZ2lzdGVyZWRGRHNfSW1tZWRpYXRlbHlSZXR1cm5zKSB7Ci0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGJlIGFwcHJveC4gemVybyI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuWmVyb1RpbWVvdXRBbmROb1NpZ25hbGxlZEZEc19JbW1lZGlhdGVseVJldHVybnMpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKHRydWUpOwotCi0gICAgaGFuZGxlci5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYmUgYXBwcm94LiB6ZXJvIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1RJTUVPVVQsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9USU1FT1VUIjsKLSAgICBFWFBFQ1RfRVEoMCwgaGFuZGxlci5jYWxsYmFja0NvdW50KQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBub3QgaGF2ZSBiZWVuIGludm9rZWQgYmVjYXVzZSBGRCB3YXMgbm90IHNpZ25hbGxlZCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuWmVyb1RpbWVvdXRBbmRTaWduYWxsZWRGRF9JbW1lZGlhdGVseUludm9rZXNDYWxsYmFja0FuZFJldHVybnMpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKHRydWUpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLndyaXRlU2lnbmFsKCkpOwotICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGJlIGFwcHJveC4gemVybyI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgRkQgd2FzIHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UiOwotICAgIEVYUEVDVF9FUShwaXBlLnJlY2VpdmVGZCwgaGFuZGxlci5mZCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgaGF2ZSByZWNlaXZlZCBwaXBlIGZkIGFzIHBhcmFtZXRlciI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfRVZFTlRfSU5QVVQsIGhhbmRsZXIuZXZlbnRzKQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBoYXZlIHJlY2VpdmVkIEFMT09QRVJfRVZFTlRfSU5QVVQgYXMgZXZlbnRzIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5Ob25aZXJvVGltZW91dEFuZE5vU2lnbmFsbGVkRkRzX1dhaXRzRm9yVGltZW91dEFuZFJldHVybnMpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKHRydWUpOwotCi0gICAgaGFuZGxlci5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgdGltZW91dCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCI7Ci0gICAgRVhQRUNUX0VRKDAsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnZva2VkIGJlY2F1c2UgRkQgd2FzIG5vdCBzaWduYWxsZWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbk5vblplcm9UaW1lb3V0QW5kU2lnbmFsbGVkRkRCZWZvcmVXYWl0aW5nX0ltbWVkaWF0ZWx5SW52b2tlc0NhbGxiYWNrQW5kUmV0dXJucykgewotICAgIFBpcGUgcGlwZTsKLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIodHJ1ZSk7Ci0KLSAgICBwaXBlLndyaXRlU2lnbmFsKCk7Ci0gICAgaGFuZGxlci5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEFTU0VSVF9FUShPSywgcGlwZS5yZWFkU2lnbmFsKCkpCi0gICAgICAgICAgICA8PCAic2lnbmFsIHNob3VsZCBhY3R1YWxseSBoYXZlIGJlZW4gd3JpdHRlbiI7Ci0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGJlIGFwcHJveC4gemVybyI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgRkQgd2FzIHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX0VRKDEsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UiOwotICAgIEVYUEVDVF9FUShwaXBlLnJlY2VpdmVGZCwgaGFuZGxlci5mZCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgaGF2ZSByZWNlaXZlZCBwaXBlIGZkIGFzIHBhcmFtZXRlciI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfRVZFTlRfSU5QVVQsIGhhbmRsZXIuZXZlbnRzKQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBoYXZlIHJlY2VpdmVkIEFMT09QRVJfRVZFTlRfSU5QVVQgYXMgZXZlbnRzIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFBvbGxPbmNlX1doZW5Ob25aZXJvVGltZW91dEFuZFNpZ25hbGxlZEZEV2hpbGVXYWl0aW5nX1Byb21wdGx5SW52b2tlc0NhbGxiYWNrQW5kUmV0dXJucykgewotICAgIFBpcGUgcGlwZTsKLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIodHJ1ZSk7Ci0gICAgc3A8RGVsYXllZFdyaXRlU2lnbmFsPiBkZWxheWVkV3JpdGVTaWduYWwgPSBuZXcgRGVsYXllZFdyaXRlU2lnbmFsKDEwMCwgJiBwaXBlKTsKLQotICAgIGhhbmRsZXIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOwotICAgIGRlbGF5ZWRXcml0ZVNpZ25hbC0+cnVuKCk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQotICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwotICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgc2lnbmFsIGRlbGF5IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKLSAgICBFWFBFQ1RfRVEoMSwgaGFuZGxlci5jYWxsYmFja0NvdW50KQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSI7Ci0gICAgRVhQRUNUX0VRKHBpcGUucmVjZWl2ZUZkLCBoYW5kbGVyLmZkKQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBoYXZlIHJlY2VpdmVkIHBpcGUgZmQgYXMgcGFyYW1ldGVyIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9FVkVOVF9JTlBVVCwgaGFuZGxlci5ldmVudHMpCi0gICAgICAgICAgICA8PCAiY2FsbGJhY2sgc2hvdWxkIGhhdmUgcmVjZWl2ZWQgQUxPT1BFUl9FVkVOVF9JTlBVVCBhcyBldmVudHMiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbkNhbGxiYWNrQWRkZWRUaGVuUmVtb3ZlZF9DYWxsYmFja1Nob3VsZE5vdEJlSW52b2tlZCkgewotICAgIFBpcGUgcGlwZTsKLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIodHJ1ZSk7Ci0KLSAgICBoYW5kbGVyLnNldENhbGxiYWNrKG1Mb29wZXIsIHBpcGUucmVjZWl2ZUZkLCBBTE9PUEVSX0VWRU5UX0lOUFVUKTsKLSAgICBwaXBlLndyaXRlU2lnbmFsKCk7IC8vIHdvdWxkIGNhdXNlIEZEIHRvIGJlIGNvbnNpZGVyZWQgc2lnbmFsbGVkCi0gICAgbUxvb3Blci0+cmVtb3ZlRmQocGlwZS5yZWNlaXZlRmQpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQotICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwotICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gZXF1YWwgdGltZW91dCBiZWNhdXNlIEZEIHdhcyBubyBsb25nZXIgcmVnaXN0ZXJlZCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCI7Ci0gICAgRVhQRUNUX0VRKDAsIGhhbmRsZXIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJjYWxsYmFjayBzaG91bGQgbm90IGJlIGludm9rZWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbkNhbGxiYWNrUmV0dXJuc0ZhbHNlX0NhbGxiYWNrU2hvdWxkTm90QmVJbnZva2VkQWdhaW5MYXRlcikgewotICAgIFBpcGUgcGlwZTsKLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIoZmFsc2UpOwotCi0gICAgaGFuZGxlci5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0KLSAgICAvLyBGaXJzdCBsb29wOiBDYWxsYmFjayBpcyByZWdpc3RlcmVkIGFuZCBGRCBpcyBzaWduYWxsZWQuCi0gICAgcGlwZS53cml0ZVNpZ25hbCgpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgQVNTRVJUX0VRKE9LLCBwaXBlLnJlYWRTaWduYWwoKSkKLSAgICAgICAgICAgIDw8ICJzaWduYWwgc2hvdWxkIGFjdHVhbGx5IGhhdmUgYmVlbiB3cml0dGVuIjsKLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiBlcXVhbCB6ZXJvIGJlY2F1c2UgRkQgd2FzIGFscmVhZHkgc2lnbmFsbGVkIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBGRCB3YXMgc2lnbmFsbGVkIjsKLSAgICBFWFBFQ1RfRVEoMSwgaGFuZGxlci5jYWxsYmFja0NvdW50KQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIjsKLQotICAgIC8vIFNlY29uZCBsb29wOiBDYWxsYmFjayBpcyBubyBsb25nZXIgcmVnaXN0ZXJlZCBhbmQgRkQgaXMgc2lnbmFsbGVkLgotICAgIHBpcGUud3JpdGVTaWduYWwoKTsKLQotICAgIHN0b3BXYXRjaC5yZXNldCgpOwotICAgIHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotICAgIGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQotICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIGVxdWFsIHplcm8gYmVjYXVzZSB0aW1lb3V0IHdhcyB6ZXJvIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1RJTUVPVVQsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9USU1FT1VUIjsKLSAgICBFWFBFQ1RfRVEoMSwgaGFuZGxlci5jYWxsYmFja0NvdW50KQotICAgICAgICAgICAgPDwgImNhbGxiYWNrIHNob3VsZCBub3QgYmUgaW52b2tlZCB0aGlzIHRpbWUiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUG9sbE9uY2VfV2hlbk5vbkNhbGxiYWNrRmRJc1NpZ25hbGxlZF9SZXR1cm5zSWRlbnQpIHsKLSAgICBjb25zdCBpbnQgZXhwZWN0ZWRJZGVudCA9IDU7Ci0gICAgdm9pZCogZXhwZWN0ZWREYXRhID0gdGhpczsKLQotICAgIFBpcGUgcGlwZTsKLQotICAgIHBpcGUud3JpdGVTaWduYWwoKTsKLSAgICBtTG9vcGVyLT5hZGRGZChwaXBlLnJlY2VpdmVGZCwgZXhwZWN0ZWRJZGVudCwgQUxPT1BFUl9FVkVOVF9JTlBVVCwgTlVMTCwgZXhwZWN0ZWREYXRhKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IGZkOwotICAgIGludCBldmVudHM7Ci0gICAgdm9pZCogZGF0YTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwLCAmZmQsICZldmVudHMsICZkYXRhKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQotICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBiZSBhcHByb3guIHplcm8iOwotICAgIEVYUEVDVF9FUShleHBlY3RlZElkZW50LCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSB0aGUgaWRlbnQgb2YgdGhlIEZEIHRoYXQgd2FzIHNpZ25hbGxlZCI7Ci0gICAgRVhQRUNUX0VRKHBpcGUucmVjZWl2ZUZkLCBmZCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSBzaG91bGQgaGF2ZSByZXR1cm5lZCB0aGUgcmVjZWl2ZWQgcGlwZSBmZCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfRVZFTlRfSU5QVVQsIGV2ZW50cykKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSBzaG91bGQgaGF2ZSByZXR1cm5lZCBBTE9PUEVSX0VWRU5UX0lOUFVUIGFzIGV2ZW50cyI7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkRGF0YSwgZGF0YSkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSBzaG91bGQgaGF2ZSByZXR1cm5lZCB0aGUgZGF0YSI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBBZGRGZF9XaGVuQ2FsbGJhY2tBZGRlZF9SZXR1cm5zT25lKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5hZGRGZChwaXBlLnJlY2VpdmVGZCwgMCwgQUxPT1BFUl9FVkVOVF9JTlBVVCwgTlVMTCwgTlVMTCk7Ci0KLSAgICBFWFBFQ1RfRVEoMSwgcmVzdWx0KQotICAgICAgICAgICAgPDwgImFkZEZkIHNob3VsZCByZXR1cm4gMSBiZWNhdXNlIEZEIHdhcyBhZGRlZCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBBZGRGZF9XaGVuSWRlbnRJc05lZ2F0aXZlQW5kQ2FsbGJhY2tJc051bGxfUmV0dXJuc0Vycm9yKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5hZGRGZChwaXBlLnJlY2VpdmVGZCwgLTEsIEFMT09QRVJfRVZFTlRfSU5QVVQsIE5VTEwsIE5VTEwpOwotCi0gICAgRVhQRUNUX0VRKC0xLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAiYWRkRmQgc2hvdWxkIHJldHVybiAtMSBiZWNhdXNlIGFyZ3VtZW50cyB3ZXJlIGludmFsaWQiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgQWRkRmRfV2hlbk5vQ2FsbGJhY2tBbmRBbGxvd05vbkNhbGxiYWNrc0lzRmFsc2VfUmV0dXJuc0Vycm9yKSB7Ci0gICAgUGlwZSBwaXBlOwotICAgIHNwPExvb3Blcj4gbG9vcGVyID0gbmV3IExvb3BlcihmYWxzZSAvKmFsbG93Tm9uQ2FsbGJhY2tzKi8pOwotICAgIGludCByZXN1bHQgPSBsb29wZXItPmFkZEZkKHBpcGUucmVjZWl2ZUZkLCAwLCAwLCBOVUxMLCBOVUxMKTsKLQotICAgIEVYUEVDVF9FUSgtMSwgcmVzdWx0KQotICAgICAgICAgICAgPDwgImFkZEZkIHNob3VsZCByZXR1cm4gLTEgYmVjYXVzZSBhcmd1bWVudHMgd2VyZSBpbnZhbGlkIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFJlbW92ZUZkX1doZW5DYWxsYmFja05vdEFkZGVkX1JldHVybnNaZXJvKSB7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnJlbW92ZUZkKDEpOwotCi0gICAgRVhQRUNUX0VRKDAsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJyZW1vdmVGZCBzaG91bGQgcmV0dXJuIDAgYmVjYXVzZSBGRCBub3QgcmVnaXN0ZXJlZCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBSZW1vdmVGZF9XaGVuQ2FsbGJhY2tBZGRlZFRoZW5SZW1vdmVkVHdpY2VfUmV0dXJuc09uY2VGaXJzdFRpbWVBbmRSZXR1cm5zWmVyb1NlY29uZFRpbWUpIHsKLSAgICBQaXBlIHBpcGU7Ci0gICAgU3R1YkNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKGZhbHNlKTsKLSAgICBoYW5kbGVyLnNldENhbGxiYWNrKG1Mb29wZXIsIHBpcGUucmVjZWl2ZUZkLCBBTE9PUEVSX0VWRU5UX0lOUFVUKTsKLQotICAgIC8vIEZpcnN0IHRpbWUuCi0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnJlbW92ZUZkKHBpcGUucmVjZWl2ZUZkKTsKLQotICAgIEVYUEVDVF9FUSgxLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicmVtb3ZlRmQgc2hvdWxkIHJldHVybiAxIGZpcnN0IHRpbWUgYmVjYXVzZSBGRCB3YXMgcmVnaXN0ZXJlZCI7Ci0KLSAgICAvLyBTZWNvbmQgdGltZS4KLSAgICByZXN1bHQgPSBtTG9vcGVyLT5yZW1vdmVGZChwaXBlLnJlY2VpdmVGZCk7Ci0KLSAgICBFWFBFQ1RfRVEoMCwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInJlbW92ZUZkIHNob3VsZCByZXR1cm4gMCBzZWNvbmQgdGltZSBiZWNhdXNlIEZEIHdhcyBubyBsb25nZXIgcmVnaXN0ZXJlZCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBQb2xsT25jZV9XaGVuQ2FsbGJhY2tBZGRlZFR3aWNlX09ubHlTZWNvbmRDYWxsYmFja1Nob3VsZEJlSW52b2tlZCkgewotICAgIFBpcGUgcGlwZTsKLSAgICBTdHViQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIxKHRydWUpOwotICAgIFN0dWJDYWxsYmFja0hhbmRsZXIgaGFuZGxlcjIodHJ1ZSk7Ci0KLSAgICBoYW5kbGVyMS5zZXRDYWxsYmFjayhtTG9vcGVyLCBwaXBlLnJlY2VpdmVGZCwgQUxPT1BFUl9FVkVOVF9JTlBVVCk7Ci0gICAgaGFuZGxlcjIuc2V0Q2FsbGJhY2sobUxvb3BlciwgcGlwZS5yZWNlaXZlRmQsIEFMT09QRVJfRVZFTlRfSU5QVVQpOyAvLyByZXBsYWNlIGl0Ci0gICAgcGlwZS53cml0ZVNpZ25hbCgpOyAvLyB3b3VsZCBjYXVzZSBGRCB0byBiZSBjb25zaWRlcmVkIHNpZ25hbGxlZAotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBBU1NFUlRfRVEoT0ssIHBpcGUucmVhZFNpZ25hbCgpKQotICAgICAgICAgICAgPDwgInNpZ25hbCBzaG91bGQgYWN0dWFsbHkgaGF2ZSBiZWVuIHdyaXR0ZW4iOwotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBGRCB3YXMgYWxyZWFkeSBzaWduYWxsZWQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIEZEIHdhcyBzaWduYWxsZWQiOwotICAgIEVYUEVDVF9FUSgwLCBoYW5kbGVyMS5jYWxsYmFja0NvdW50KQotICAgICAgICAgICAgPDwgIm9yaWdpbmFsIGhhbmRsZXIgY2FsbGJhY2sgc2hvdWxkIG5vdCBiZSBpbnZva2VkIGJlY2F1c2UgaXQgd2FzIHJlcGxhY2VkIjsKLSAgICBFWFBFQ1RfRVEoMSwgaGFuZGxlcjIuY2FsbGJhY2tDb3VudCkKLSAgICAgICAgICAgIDw8ICJyZXBsYWNlbWVudCBoYW5kbGVyIGNhbGxiYWNrIHNob3VsZCBiZSBpbnZva2VkIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFNlbmRNZXNzYWdlX1doZW5PbmVNZXNzYWdlSXNFbnF1ZXVlX1Nob3VsZEludm9rZUhhbmRsZXJEdXJpbmdOZXh0UG9sbCkgewotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMSkpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwKTsKLSAgICBpbnQzMl90IGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigwLCBlbGFwc2VkTWlsbGlzLCBUSU1JTkdfVE9MRVJBTkNFX01TKQotICAgICAgICAgICAgPDwgImVsYXBzZWQgdGltZSBzaG91bGQgYXBwcm94LiB6ZXJvIGJlY2F1c2UgbWVzc2FnZSB3YXMgYWxyZWFkeSBzZW50IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBtZXNzYWdlIHdhcyBzZW50IjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDEpLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QxLCBoYW5kbGVyLT5tZXNzYWdlc1swXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBTZW5kTWVzc2FnZV9XaGVuTXVsdGlwbGVNZXNzYWdlc0FyZUVucXVldWVkX1Nob3VsZEludm9rZUhhbmRsZXJzSW5PcmRlckR1cmluZ05leHRQb2xsKSB7Ci0gICAgc3A8U3R1Yk1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyMSA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIyID0gbmV3IFN0dWJNZXNzYWdlSGFuZGxlcigpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIxLCBNZXNzYWdlKE1TR19URVNUMSkpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIyLCBNZXNzYWdlKE1TR19URVNUMikpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIxLCBNZXNzYWdlKE1TR19URVNUMykpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIxLCBNZXNzYWdlKE1TR19URVNUNCkpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gemVybyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgc2VudCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgzKSwgaGFuZGxlcjEtPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXIxLT5tZXNzYWdlc1swXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMywgaGFuZGxlcjEtPm1lc3NhZ2VzWzFdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1Q0LCBoYW5kbGVyMS0+bWVzc2FnZXNbMl0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXIyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QyLCBoYW5kbGVyMi0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgU2VuZE1lc3NhZ2VEZWxheWVkX1doZW5TZW50VG9UaGVGdXR1cmVfU2hvdWxkSW52b2tlSGFuZGxlckFmdGVyRGVsYXlUaW1lKSB7Ci0gICAgc3A8U3R1Yk1lc3NhZ2VIYW5kbGVyPiBoYW5kbGVyID0gbmV3IFN0dWJNZXNzYWdlSGFuZGxlcigpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlRGVsYXllZChtczJucygxMDApLCBoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMSkpOwotCi0gICAgU3RvcFdhdGNoIHN0b3BXYXRjaCgicG9sbE9uY2UiKTsKLSAgICBpbnQgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJmaXJzdCBwb2xsIHNob3VsZCBlbmQgcXVpY2tseSBiZWNhdXNlIG5leHQgbWVzc2FnZSB0aW1lb3V0IHdhcyBjb21wdXRlZCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9XQUtFLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfV0FLRSBkdWUgdG8gd2FrZXVwIjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDApLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAibm8gbWVzc2FnZSBoYW5kbGVkIHlldCI7Ci0KLSAgICByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDAwKTsKLSAgICBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX0VRKHNpemVfdCgxKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMSwgaGFuZGxlci0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9ORUFSKDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJzZWNvbmQgcG9sbCBzaG91bGQgZW5kIGFyb3VuZCB0aGUgdGltZSBvZiB0aGUgZGVsYXllZCBtZXNzYWdlIGRpc3BhdGNoIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSBtZXNzYWdlIHdhcyBzZW50IjsKLQotICAgIHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDEwMCArIDEwMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJ0aGlyZCBwb2xsIHNob3VsZCB0aW1lb3V0IjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1RJTUVPVVQsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9USU1FT1VUIGJlY2F1c2UgdGhlcmUgd2VyZSBubyBtZXNzYWdlcyBsZWZ0IjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFNlbmRNZXNzYWdlRGVsYXllZF9XaGVuU2VudFRvVGhlUGFzdF9TaG91bGRJbnZva2VIYW5kbGVyRHVyaW5nTmV4dFBvbGwpIHsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2VEZWxheWVkKG1zMm5zKC0xMDAwKSwgaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gemVybyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgc2VudCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgxKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMSwgaGFuZGxlci0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgU2VuZE1lc3NhZ2VEZWxheWVkX1doZW5TZW50VG9UaGVQcmVzZW50X1Nob3VsZEludm9rZUhhbmRsZXJEdXJpbmdOZXh0UG9sbCkgewotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZURlbGF5ZWQoMCwgaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMCk7Ci0gICAgaW50MzJfdCBlbGFwc2VkTWlsbGlzID0gbnMybXMoc3RvcFdhdGNoLmVsYXBzZWRUaW1lKCkpOwotCi0gICAgRVhQRUNUX05FQVIoMCwgZWxhcHNlZE1pbGxpcywgVElNSU5HX1RPTEVSQU5DRV9NUykKLSAgICAgICAgICAgIDw8ICJlbGFwc2VkIHRpbWUgc2hvdWxkIGFwcHJveC4gemVybyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgc2VudCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgxKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUMSwgaGFuZGxlci0+bWVzc2FnZXNbMF0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgU2VuZE1lc3NhZ2VBdFRpbWVfV2hlblNlbnRUb1RoZUZ1dHVyZV9TaG91bGRJbnZva2VIYW5kbGVyQWZ0ZXJEZWxheVRpbWUpIHsKLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2VBdFRpbWUobm93ICsgbXMybnMoMTAwKSwgaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDEpKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDEwMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZmlyc3QgcG9sbCBzaG91bGQgZW5kIHF1aWNrbHkgYmVjYXVzZSBuZXh0IG1lc3NhZ2UgdGltZW91dCB3YXMgY29tcHV0ZWQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfV0FLRSwgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX1dBS0UgZHVlIHRvIHdha2V1cCI7Ci0gICAgRVhQRUNUX0VRKHNpemVfdCgwKSwgaGFuZGxlci0+bWVzc2FnZXMuc2l6ZSgpKQotICAgICAgICAgICAgPDwgIm5vIG1lc3NhZ2UgaGFuZGxlZCB5ZXQiOwotCi0gICAgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMTAwMCk7Ci0gICAgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLSAgICBFWFBFQ1RfTkVBUigxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAic2Vjb25kIHBvbGwgc2hvdWxkIGVuZCBhcm91bmQgdGhlIHRpbWUgb2YgdGhlIGRlbGF5ZWQgbWVzc2FnZSBkaXNwYXRjaCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9DQUxMQkFDSywgcmVzdWx0KQotICAgICAgICAgICAgPDwgInBvbGxPbmNlIHJlc3VsdCBzaG91bGQgYmUgQUxPT1BFUl9QT0xMX0NBTExCQUNLIGJlY2F1c2UgbWVzc2FnZSB3YXMgc2VudCI7Ci0KLSAgICByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGVsYXBzZWRNaWxsaXMgPSBuczJtcyhzdG9wV2F0Y2guZWxhcHNlZFRpbWUoKSk7Ci0KLSAgICBFWFBFQ1RfTkVBUigxMDAgKyAxMDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAidGhpcmQgcG9sbCBzaG91bGQgdGltZW91dCI7Ci0gICAgRVhQRUNUX0VRKEFMT09QRVJfUE9MTF9USU1FT1VULCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfVElNRU9VVCBiZWNhdXNlIHRoZXJlIHdlcmUgbm8gbWVzc2FnZXMgbGVmdCI7Ci19Ci0KLVRFU1RfRihMb29wZXJUZXN0LCBTZW5kTWVzc2FnZUF0VGltZV9XaGVuU2VudFRvVGhlUGFzdF9TaG91bGRJbnZva2VIYW5kbGVyRHVyaW5nTmV4dFBvbGwpIHsKLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBzcDxTdHViTWVzc2FnZUhhbmRsZXI+IGhhbmRsZXIgPSBuZXcgU3R1Yk1lc3NhZ2VIYW5kbGVyKCk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2VBdFRpbWUobm93IC0gbXMybnMoMTAwMCksIGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QxKSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHNlbnQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIHNlbnQiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFNlbmRNZXNzYWdlQXRUaW1lX1doZW5TZW50VG9UaGVQcmVzZW50X1Nob3VsZEludm9rZUhhbmRsZXJEdXJpbmdOZXh0UG9sbCkgewotICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZUF0VGltZShub3csIGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QxKSk7Ci0KLSAgICBTdG9wV2F0Y2ggc3RvcFdhdGNoKCJwb2xsT25jZSIpOwotICAgIGludCByZXN1bHQgPSBtTG9vcGVyLT5wb2xsT25jZSgxMDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHNlbnQiOwotICAgIEVYUEVDVF9FUShBTE9PUEVSX1BPTExfQ0FMTEJBQ0ssIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9DQUxMQkFDSyBiZWNhdXNlIG1lc3NhZ2Ugd2FzIHNlbnQiOwotICAgIEVYUEVDVF9FUShzaXplX3QoMSksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotICAgIEVYUEVDVF9FUShNU0dfVEVTVDEsIGhhbmRsZXItPm1lc3NhZ2VzWzBdLndoYXQpCi0gICAgICAgICAgICA8PCAiaGFuZGxlZCBtZXNzYWdlIjsKLX0KLQotVEVTVF9GKExvb3BlclRlc3QsIFJlbW92ZU1lc3NhZ2VfV2hlblJlbW92aW5nQWxsTWVzc2FnZXNGb3JIYW5kbGVyX1Nob3VsZFJlbW92ZVRob3NlTWVzc2FnZSkgewotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMSkpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QyKSk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UoaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDMpKTsKLSAgICBtTG9vcGVyLT5yZW1vdmVNZXNzYWdlcyhoYW5kbGVyKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBzZW50IHNvIGxvb3BlciB3YXMgYXdva2VuIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1dBS0UsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9XQUtFIGJlY2F1c2UgbG9vcGVyIHdhcyBhd29rZW4iOwotICAgIEVYUEVDVF9FUShzaXplX3QoMCksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJubyBtZXNzYWdlcyB0byBoYW5kbGUiOwotCi0gICAgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMCk7Ci0KLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1RJTUVPVVQsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9USU1FT1VUIGJlY2F1c2UgdGhlcmUgd2FzIG5vdGhpbmcgdG8gZG8iOwotICAgIEVYUEVDVF9FUShzaXplX3QoMCksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJubyBtZXNzYWdlcyB0byBoYW5kbGUiOwotfQotCi1URVNUX0YoTG9vcGVyVGVzdCwgUmVtb3ZlTWVzc2FnZV9XaGVuUmVtb3ZpbmdTb21lTWVzc2FnZXNGb3JIYW5kbGVyX1Nob3VsZFJlbW92ZVRob3NlTWVzc2FnZSkgewotICAgIHNwPFN0dWJNZXNzYWdlSGFuZGxlcj4gaGFuZGxlciA9IG5ldyBTdHViTWVzc2FnZUhhbmRsZXIoKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUMSkpOwotICAgIG1Mb29wZXItPnNlbmRNZXNzYWdlKGhhbmRsZXIsIE1lc3NhZ2UoTVNHX1RFU1QyKSk7Ci0gICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UoaGFuZGxlciwgTWVzc2FnZShNU0dfVEVTVDMpKTsKLSAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZShoYW5kbGVyLCBNZXNzYWdlKE1TR19URVNUNCkpOwotICAgIG1Mb29wZXItPnJlbW92ZU1lc3NhZ2VzKGhhbmRsZXIsIE1TR19URVNUMyk7Ci0gICAgbUxvb3Blci0+cmVtb3ZlTWVzc2FnZXMoaGFuZGxlciwgTVNHX1RFU1QxKTsKLQotICAgIFN0b3BXYXRjaCBzdG9wV2F0Y2goInBvbGxPbmNlIik7Ci0gICAgaW50IHJlc3VsdCA9IG1Mb29wZXItPnBvbGxPbmNlKDApOwotICAgIGludDMyX3QgZWxhcHNlZE1pbGxpcyA9IG5zMm1zKHN0b3BXYXRjaC5lbGFwc2VkVGltZSgpKTsKLQotICAgIEVYUEVDVF9ORUFSKDAsIGVsYXBzZWRNaWxsaXMsIFRJTUlOR19UT0xFUkFOQ0VfTVMpCi0gICAgICAgICAgICA8PCAiZWxhcHNlZCB0aW1lIHNob3VsZCBhcHByb3guIHplcm8gYmVjYXVzZSBtZXNzYWdlIHdhcyBzZW50IHNvIGxvb3BlciB3YXMgYXdva2VuIjsKLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX0NBTExCQUNLLCByZXN1bHQpCi0gICAgICAgICAgICA8PCAicG9sbE9uY2UgcmVzdWx0IHNob3VsZCBiZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0sgYmVjYXVzZSB0d28gbWVzc2FnZXMgd2VyZSBzZW50IjsKLSAgICBFWFBFQ1RfRVEoc2l6ZV90KDIpLCBoYW5kbGVyLT5tZXNzYWdlcy5zaXplKCkpCi0gICAgICAgICAgICA8PCAibm8gbWVzc2FnZXMgdG8gaGFuZGxlIjsKLSAgICBFWFBFQ1RfRVEoTVNHX1RFU1QyLCBoYW5kbGVyLT5tZXNzYWdlc1swXS53aGF0KQotICAgICAgICAgICAgPDwgImhhbmRsZWQgbWVzc2FnZSI7Ci0gICAgRVhQRUNUX0VRKE1TR19URVNUNCwgaGFuZGxlci0+bWVzc2FnZXNbMV0ud2hhdCkKLSAgICAgICAgICAgIDw8ICJoYW5kbGVkIG1lc3NhZ2UiOwotCi0gICAgcmVzdWx0ID0gbUxvb3Blci0+cG9sbE9uY2UoMCk7Ci0KLSAgICBFWFBFQ1RfRVEoQUxPT1BFUl9QT0xMX1RJTUVPVVQsIHJlc3VsdCkKLSAgICAgICAgICAgIDw8ICJwb2xsT25jZSByZXN1bHQgc2hvdWxkIGJlIEFMT09QRVJfUE9MTF9USU1FT1VUIGJlY2F1c2UgdGhlcmUgd2FzIG5vdGhpbmcgdG8gZG8iOwotICAgIEVYUEVDVF9FUShzaXplX3QoMiksIGhhbmRsZXItPm1lc3NhZ2VzLnNpemUoKSkKLSAgICAgICAgICAgIDw8ICJubyBtb3JlIG1lc3NhZ2VzIHRvIGhhbmRsZSI7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvdGVzdHMvU3RyaW5nOF90ZXN0LmNwcCBiL2xpYnMvdXRpbHMvdGVzdHMvU3RyaW5nOF90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyYzY4ZC4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL3Rlc3RzL1N0cmluZzhfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJpbmc4X3Rlc3QiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIH0KLX07Ci0KLVRFU1RfRihTdHJpbmc4VGVzdCwgQ3N0cikgewotICAgIFN0cmluZzggdG1wKCJIZWxsbywgd29ybGQhIik7Ci0KLSAgICBFWFBFQ1RfU1RSRVEodG1wLnN0cmluZygpLCAiSGVsbG8sIHdvcmxkISIpOwotfQotCi1URVNUX0YoU3RyaW5nOFRlc3QsIE9wZXJhdG9yUGx1cykgewotICAgIFN0cmluZzggc3JjMSgiSGVsbG8sICIpOwotCi0gICAgLy8gVGVzdCBhZGRpbmcgU3RyaW5nOCArIGNvbnN0IGNoYXIqCi0gICAgY29uc3QgY2hhciogY2NzcmMyID0gIndvcmxkISI7Ci0gICAgU3RyaW5nOCBkc3QxID0gc3JjMSArIGNjc3JjMjsKLSAgICBFWFBFQ1RfU1RSRVEoZHN0MS5zdHJpbmcoKSwgIkhlbGxvLCB3b3JsZCEiKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIkhlbGxvLCAiKTsKLSAgICBFWFBFQ1RfU1RSRVEoY2NzcmMyLCAid29ybGQhIik7Ci0KLSAgICAvLyBUZXN0IGFkZGluZyBTdHJpbmc4ICsgU3RyaW5nOAotICAgIFN0cmluZzggc3NyYzIoIndvcmxkISIpOwotICAgIFN0cmluZzggZHN0MiA9IHNyYzEgKyBzc3JjMjsKLSAgICBFWFBFQ1RfU1RSRVEoZHN0Mi5zdHJpbmcoKSwgIkhlbGxvLCB3b3JsZCEiKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIkhlbGxvLCAiKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3NyYzIuc3RyaW5nKCksICJ3b3JsZCEiKTsKLX0KLQotVEVTVF9GKFN0cmluZzhUZXN0LCBPcGVyYXRvclBsdXNFcXVhbHMpIHsKLSAgICBTdHJpbmc4IHNyYzEoIk15IHZvaWNlIik7Ci0KLSAgICAvLyBUZXN0aW5nIFN0cmluZzggKz0gU3RyaW5nOAotICAgIFN0cmluZzggc3JjMigiIGlzIG15IHBhc3Nwb3J0LiIpOwotICAgIHNyYzEgKz0gc3JjMjsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMS5zdHJpbmcoKSwgIk15IHZvaWNlIGlzIG15IHBhc3Nwb3J0LiIpOwotICAgIEVYUEVDVF9TVFJFUShzcmMyLnN0cmluZygpLCAiIGlzIG15IHBhc3Nwb3J0LiIpOwotCi0gICAgLy8gQWRkaW5nIGNvbnN0IGNoYXIqIHRvIHRoZSBwcmV2aW91cyBzdHJpbmcuCi0gICAgY29uc3QgY2hhciogc3JjMyA9ICIgVmVyaWZ5IG1lLiI7Ci0gICAgc3JjMSArPSBzcmMzOwotICAgIEVYUEVDVF9TVFJFUShzcmMxLnN0cmluZygpLCAiTXkgdm9pY2UgaXMgbXkgcGFzc3BvcnQuIFZlcmlmeSBtZS4iKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMi5zdHJpbmcoKSwgIiBpcyBteSBwYXNzcG9ydC4iKTsKLSAgICBFWFBFQ1RfU1RSRVEoc3JjMywgIiBWZXJpZnkgbWUuIik7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYnMvdXRpbHMvdGVzdHMvVW5pY29kZV90ZXN0LmNwcCBiL2xpYnMvdXRpbHMvdGVzdHMvVW5pY29kZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjMTMwYy4uMDAwMDAwMAotLS0gYS9saWJzL3V0aWxzL3Rlc3RzL1VuaWNvZGVfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiVW5pY29kZV90ZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1VuaWNvZGUuaD4KLQotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVW5pY29kZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICB9Ci19OwotCi1URVNUX0YoVW5pY29kZVRlc3QsIFVURjh0b1VURjE2WmVyb0xlbmd0aCkgewotICAgIHNzaXplX3QgbWVhc3VyZWQ7Ci0KLSAgICBjb25zdCB1aW50OF90IHN0cltdID0geyB9OwotCi0gICAgbWVhc3VyZWQgPSB1dGY4X3RvX3V0ZjE2X2xlbmd0aChzdHIsIDApOwotICAgIEVYUEVDVF9FUSgwLCBtZWFzdXJlZCkKLSAgICAgICAgICAgIDw8ICJaZXJvIGxlbmd0aCBpbnB1dCBzaG91bGQgcmV0dXJuIHplcm8gbGVuZ3RoIG91dHB1dC4iOwotfQotCi1URVNUX0YoVW5pY29kZVRlc3QsIFVURjh0b1VURjE2QVNDSUlMZW5ndGgpIHsKLSAgICBzc2l6ZV90IG1lYXN1cmVkOwotCi0gICAgLy8gVSswMDMwIG9yIEFTQ0lJICcwJwotICAgIGNvbnN0IHVpbnQ4X3Qgc3RyW10gPSB7IDB4MzAgfTsKLQotICAgIG1lYXN1cmVkID0gdXRmOF90b191dGYxNl9sZW5ndGgoc3RyLCBzaXplb2Yoc3RyKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG1lYXN1cmVkKQotICAgICAgICAgICAgPDwgIkFTQ0lJIGdseXBocyBzaG91bGQgaGF2ZSBhIGxlbmd0aCBvZiAxIGNoYXIxNl90IjsKLX0KLQotVEVTVF9GKFVuaWNvZGVUZXN0LCBVVEY4dG9VVEYxNlBsYW5lMUxlbmd0aCkgewotICAgIHNzaXplX3QgbWVhc3VyZWQ7Ci0KLSAgICAvLyBVKzIzMjMgU01JTEUKLSAgICBjb25zdCB1aW50OF90IHN0cltdID0geyAweEUyLCAweDhDLCAweEEzIH07Ci0KLSAgICBtZWFzdXJlZCA9IHV0ZjhfdG9fdXRmMTZfbGVuZ3RoKHN0ciwgc2l6ZW9mKHN0cikpOwotICAgIEVYUEVDVF9FUSgxLCBtZWFzdXJlZCkKLSAgICAgICAgICAgIDw8ICJQbGFuZSAxIGdseXBocyBzaG91bGQgaGF2ZSBhIGxlbmd0aCBvZiAxIGNoYXIxNl90IjsKLX0KLQotVEVTVF9GKFVuaWNvZGVUZXN0LCBVVEY4dG9VVEYxNlN1cnJvZ2F0ZUxlbmd0aCkgewotICAgIHNzaXplX3QgbWVhc3VyZWQ7Ci0KLSAgICAvLyBVKzEwMDAwCi0gICAgY29uc3QgdWludDhfdCBzdHJbXSA9IHsgMHhGMCwgMHg5MCwgMHg4MCwgMHg4MCB9OwotCi0gICAgbWVhc3VyZWQgPSB1dGY4X3RvX3V0ZjE2X2xlbmd0aChzdHIsIHNpemVvZihzdHIpKTsKLSAgICBFWFBFQ1RfRVEoMiwgbWVhc3VyZWQpCi0gICAgICAgICAgICA8PCAiU3Vycm9nYXRlIHBhaXJzIHNob3VsZCBoYXZlIGEgbGVuZ3RoIG9mIDIgY2hhcjE2X3QiOwotfQotCi1URVNUX0YoVW5pY29kZVRlc3QsIFVURjh0b1VURjE2VHJ1bmNhdGVkVVRGOCkgewotICAgIHNzaXplX3QgbWVhc3VyZWQ7Ci0KLSAgICAvLyBUcnVuY2F0ZWQgVSsyMzIzIFNNSUxFCi0gICAgLy8gVSsyMzIzIFNNSUxFCi0gICAgY29uc3QgdWludDhfdCBzdHJbXSA9IHsgMHhFMiwgMHg4QyB9OwotCi0gICAgbWVhc3VyZWQgPSB1dGY4X3RvX3V0ZjE2X2xlbmd0aChzdHIsIHNpemVvZihzdHIpKTsKLSAgICBFWFBFQ1RfRVEoLTEsIG1lYXN1cmVkKQotICAgICAgICAgICAgPDwgIlRydW5jYXRlZCBVVEYtOCBzaG91bGQgcmV0dXJuIC0xIHRvIGluZGljYXRlIGludmFsaWQiOwotfQotCi1URVNUX0YoVW5pY29kZVRlc3QsIFVURjh0b1VURjE2Tm9ybWFsKSB7Ci0gICAgY29uc3QgdWludDhfdCBzdHJbXSA9IHsKLSAgICAgICAgMHgzMCwgLy8gVSswMDMwLCAxIFVURi0xNiBjaGFyYWN0ZXIKLSAgICAgICAgMHhDNCwgMHg4MCwgLy8gVSswMTAwLCAxIFVURi0xNiBjaGFyYWN0ZXIKLSAgICAgICAgMHhFMiwgMHg4QywgMHhBMywgLy8gVSsyMzIzLCAxIFVURi0xNiBjaGFyYWN0ZXIKLSAgICAgICAgMHhGMCwgMHg5MCwgMHg4MCwgMHg4MCwgLy8gVSsxMDAwMCwgMiBVVEYtMTYgY2hhcmFjdGVyCi0gICAgfTsKLQotICAgIGNoYXIxNl90IG91dHB1dFsxICsgMSArIDEgKyAyICsgMV07IC8vIFJvb20gZm9yIE5VTEwKLQotICAgIHV0ZjhfdG9fdXRmMTYoc3RyLCBzaXplb2Yoc3RyKSwgb3V0cHV0KTsKLQotICAgIEVYUEVDVF9FUSgweDAwMzAsIG91dHB1dFswXSkKLSAgICAgICAgICAgIDw8ICJzaG91bGQgYmUgVSswMDMwIjsKLSAgICBFWFBFQ1RfRVEoMHgwMTAwLCBvdXRwdXRbMV0pCi0gICAgICAgICAgICA8PCAic2hvdWxkIGJlIFUrMDEwMCI7Ci0gICAgRVhQRUNUX0VRKDB4MjMyMywgb3V0cHV0WzJdKQotICAgICAgICAgICAgPDwgInNob3VsZCBiZSBVKzIzMjMiOwotICAgIEVYUEVDVF9FUSgweEQ4MDAsIG91dHB1dFszXSkKLSAgICAgICAgICAgIDw8ICJzaG91bGQgYmUgZmlyc3QgaGFsZiBvZiBzdXJyb2dhdGUgVSsxMDAwMCI7Ci0gICAgRVhQRUNUX0VRKDB4REMwMCwgb3V0cHV0WzRdKQotICAgICAgICAgICAgPDwgInNob3VsZCBiZSBzZWNvbmQgaGFsZiBvZiBzdXJyb2dhdGUgVSsxMDAwMCI7Ci0gICAgRVhQRUNUX0VRKE5VTEwsIG91dHB1dFs1XSkKLSAgICAgICAgICAgIDw8ICJzaG91bGQgYmUgTlVMTCB0ZXJtaW5hdGVkIjsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvU2VydmljZS5qYXZhCmluZGV4IDFjN2Y1NzcuLmFhNjBkMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1NlcnZpY2UuamF2YQorKysgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TZXJ2aWNlLmphdmEKQEAgLTIwMzUsMjAgKzIwMzUsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlYWRTZXR0aW5ncygpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQobUNvbnRlbnRSZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lSW5kZXhTZXR0aW5nTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01hbmFnZXIuREVGQVVMVF9TVFJFQU1fVk9MVU1FW21TdHJlYW1UeXBlXSk7Ci0KLSAgICAgICAgICAgIG1JbmRleC5jbGVhcigpOwotICAgICAgICAgICAgbUluZGV4LnB1dChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0RFRkFVTFQsIGluZGV4KTsKLQotICAgICAgICAgICAgaW5kZXggPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RBdWRpYmxlVm9sdW1lSW5kZXhTZXR0aW5nTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5kZXggPiAwKSA/IGluZGV4IDogQXVkaW9NYW5hZ2VyLkRFRkFVTFRfU1RSRUFNX1ZPTFVNRVttU3RyZWFtVHlwZV0pOwotICAgICAgICAgICAgbUxhc3RBdWRpYmxlSW5kZXguY2xlYXIoKTsKLSAgICAgICAgICAgIG1MYXN0QXVkaWJsZUluZGV4LnB1dChBdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0RFRkFVTFQsIGluZGV4KTsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tTaWxlbnRWb2x1bWUgPSAobVJpbmdlck1vZGUgPT0gQXVkaW9NYW5hZ2VyLlJJTkdFUl9NT0RFX05PUk1BTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdHJlYW1BZmZlY3RlZEJ5UmluZ2VyTW9kZShtU3RyZWFtVHlwZSk7CiAKICAgICAgICAgICAgIGludCByZW1haW5pbmdEZXZpY2VzID0gQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9BTEw7CisKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyByZW1haW5pbmdEZXZpY2VzICE9IDA7IGkrKykgewogICAgICAgICAgICAgICAgIGludCBkZXZpY2UgPSAoMSA8PCBpKTsKICAgICAgICAgICAgICAgICBpZiAoKGRldmljZSAmIHJlbWFpbmluZ0RldmljZXMpID09IDApIHsKQEAgLTIwNTcsMTcgKzIwNDgsNTggQEAKICAgICAgICAgICAgICAgICByZW1haW5pbmdEZXZpY2VzICY9IH5kZXZpY2U7CiAKICAgICAgICAgICAgICAgICAvLyByZXRyaWV2ZSBjdXJyZW50IHZvbHVtZSBmb3IgZGV2aWNlCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRTZXR0aW5nTmFtZUZvckRldmljZShmYWxzZSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpbmRleCA9IFNldHRpbmdzLlN5c3RlbS5nZXRJbnQobUNvbnRlbnRSZXNvbHZlciwgbmFtZSwgLTEpOworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0U2V0dGluZ05hbWVGb3JEZXZpY2UoZmFsc2UgLyogbGFzdEF1ZGlibGUgKi8sIGRldmljZSk7CisgICAgICAgICAgICAgICAgLy8gaWYgbm8gdm9sdW1lIHN0b3JlZCBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSwgdXNlIGRlZmF1bHQgdm9sdW1lIGlmIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAvLyBkZXZpY2UsIGNvbnRpbnVlIG90aGVyd2lzZQorICAgICAgICAgICAgICAgIGludCBkZWZhdWx0SW5kZXggPSAoZGV2aWNlID09IEF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfREVGQVVMVCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5ERUZBVUxUX1NUUkVBTV9WT0xVTUVbbVN0cmVhbVR5cGVdIDogLTE7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gU2V0dGluZ3MuU3lzdGVtLmdldEludChtQ29udGVudFJlc29sdmVyLCBuYW1lLCBkZWZhdWx0SW5kZXgpOwogICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUluZGV4LnB1dChkZXZpY2UsIGdldFZhbGlkSW5kZXgoMTAgKiBpbmRleCkpOwogCiAgICAgICAgICAgICAgICAgLy8gcmV0cmlldmUgbGFzdCBhdWRpYmxlIHZvbHVtZSBmb3IgZGV2aWNlCi0gICAgICAgICAgICAgICAgbmFtZSA9IGdldFNldHRpbmdOYW1lRm9yRGV2aWNlKHRydWUsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsIG5hbWUsIC0xKTsKLSAgICAgICAgICAgICAgICBtTGFzdEF1ZGlibGVJbmRleC5wdXQoZGV2aWNlLCBnZXRWYWxpZEluZGV4KDEwICogaW5kZXgpKTsKKyAgICAgICAgICAgICAgICBuYW1lID0gZ2V0U2V0dGluZ05hbWVGb3JEZXZpY2UodHJ1ZSAgLyogbGFzdEF1ZGlibGUgKi8sIGRldmljZSk7CisgICAgICAgICAgICAgICAgLy8gdXNlIHN0b3JlZCBsYXN0IGF1ZGlibGUgaW5kZXggaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHVzZSBjdXJyZW50IGluZGV4IGlmIG5vdCAwCisgICAgICAgICAgICAgICAgLy8gb3IgZGVmYXVsdCBpbmRleAorICAgICAgICAgICAgICAgIGRlZmF1bHRJbmRleCA9IChpbmRleCA+IDApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4IDogQXVkaW9NYW5hZ2VyLkRFRkFVTFRfU1RSRUFNX1ZPTFVNRVttU3RyZWFtVHlwZV07CisgICAgICAgICAgICAgICAgaW50IGxhc3RBdWRpYmxlSW5kZXggPSBTZXR0aW5ncy5TeXN0ZW0uZ2V0SW50KG1Db250ZW50UmVzb2x2ZXIsIG5hbWUsIGRlZmF1bHRJbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBhIGxhc3QgYXVkaWJsZSBpbmRleCBvZiAwIGlzIG5ldmVyIHN0b3JlZCwgZXhjZXB0IG9uIG5vbi12b2ljZSBjYXBhYmxlIGRldmljZXMKKyAgICAgICAgICAgICAgICAvLyAoZS5nLiB0YWJsZXRzKSBmb3IgdGhlIG11c2ljIHN0cmVhbSB0eXBlLCB3aGVyZSB0aGUgbXVzaWMgc3RyZWFtIHZvbHVtZSBjYW4gcmVhY2gKKyAgICAgICAgICAgICAgICAvLyAwIHdpdGhvdXQgdGhlIGRldmljZSBiZWluZyBpbiBzaWxlbnQgbW9kZQorICAgICAgICAgICAgICAgIGlmICgobGFzdEF1ZGlibGVJbmRleCA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG1Wb2ljZUNhcGFibGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoU1RSRUFNX1ZPTFVNRV9BTElBU1ttU3RyZWFtVHlwZV0gIT0gQXVkaW9TeXN0ZW0uU1RSRUFNX01VU0lDKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEF1ZGlibGVJbmRleCA9IEF1ZGlvTWFuYWdlci5ERUZBVUxUX1NUUkVBTV9WT0xVTUVbbVN0cmVhbVR5cGVdOworICAgICAgICAgICAgICAgICAgICAvLyBDb3JyZWN0IHRoZSBkYXRhIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgc2VuZE1zZyhtQXVkaW9IYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19QRVJTSVNUX1ZPTFVNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5ETVNHX1FVRVVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUlNJU1RfTEFTVF9BVURJQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUlNJU1RfREVMQVkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdEF1ZGlibGVJbmRleC5wdXQoZGV2aWNlLCBnZXRWYWxpZEluZGV4KDEwICogbGFzdEF1ZGlibGVJbmRleCkpOworICAgICAgICAgICAgICAgIC8vIHRoZSBpbml0aWFsIGluZGV4IHNob3VsZCBuZXZlciBiZSAwIGZvciBhIHN0cmVhbSBhZmZlY3RlZCBieSByaW5nZXIgbW9kZSBpZiBub3QKKyAgICAgICAgICAgICAgICAvLyBpbiBzaWxlbnQgb3IgdmlicmF0ZSBtb2RlLgorICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgcGVybWl0dGVkIG9uIHRhYmxldHMgZm9yIG11c2ljIHN0cmVhbSB0eXBlLgorICAgICAgICAgICAgICAgIGlmIChjaGVja1NpbGVudFZvbHVtZSAmJiAoaW5kZXggPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtVm9pY2VDYXBhYmxlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKFNUUkVBTV9WT0xVTUVfQUxJQVNbbVN0cmVhbVR5cGVdICE9IEF1ZGlvU3lzdGVtLlNUUkVBTV9NVVNJQykpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gbGFzdEF1ZGlibGVJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgZGF0YSBiYXNlCisgICAgICAgICAgICAgICAgICAgIHNlbmRNc2cobUF1ZGlvSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUEVSU0lTVF9WT0xVTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VORE1TR19RVUVVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJTSVNUX0NVUlJFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSU0lTVF9ERUxBWSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1JbmRleC5wdXQoZGV2aWNlLCBnZXRWYWxpZEluZGV4KDEwICogaW5kZXgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9TeXN0ZW0uamF2YSBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1N5c3RlbS5qYXZhCmluZGV4IGQzNTRjZGIuLmI1ZTgzMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1N5c3RlbS5qYXZhCisrKyBiL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1N5c3RlbS5qYXZhCkBAIC0yNzksNiArMjc5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUX05BTUU7CiAgICAgICAgIGNhc2UgREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUX05BTUU7CisgICAgICAgIGNhc2UgREVWSUNFX0lOX0RFRkFVTFQ6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEgYi9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQ2FtY29yZGVyUHJvZmlsZS5qYXZhCmluZGV4IGU5NGJkZGMuLjUxMTExMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmphdmEKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuamF2YQpAQCAtNjcsNiArNjcsOCBAQAogCiAgICAgLyoqCiAgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSA0ODBwICg3MjAgeCA0ODApIHJlc29sdXRpb24uCisgICAgICogTm90ZSB0aGF0IHRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gZm9yIDQ4MHAgY2FuIGFsc28gYmUgb3RoZXIKKyAgICAgKiB2YWx1ZXMsIHN1Y2ggYXMgNjQwIG9yIDcwNCwgaW5zdGVhZCBvZiA3MjAuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVBTElUWV80ODBQID0gNDsKIApAQCAtNzYsNyArNzgsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRVUFMSVRZXzcyMFAgPSA1OwogCiAgICAgLyoqCi0gICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAxMDgwcCAoMTkyMCB4IDEwODgpIHJlc29sdXRpb24uCisgICAgICogUXVhbGl0eSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSAxMDgwcCAoMTkyMCB4IDEwODApIHJlc29sdXRpb24uCisgICAgICogTm90ZSB0aGF0IHRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGZvciAxMDgwcCBjYW4gYWxzbyBiZSAxMDg4LAorICAgICAqIGluc3RlYWQgb2YgMTA4MCAodXNlZCBieSBzb21lIHZlbmRvcnMgdG8gYXZvaWQgY3JvcHBpbmcgZHVyaW5nCisgICAgICogdmlkZW8gcGxheWJhY2spLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVQUxJVFlfMTA4MFAgPSA2OwogCmRpZmYgLS1naXQgYS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFBY3Rpb25Tb3VuZC5qYXZhIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQWN0aW9uU291bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTUyMGZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL01lZGlhQWN0aW9uU291bmQuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5tZWRpYTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQubWVkaWEuU291bmRQb29sOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKy8qKgorICogPHA+QSBjbGFzcyBmb3IgcHJvZHVjaW5nIHNvdW5kcyB0aGF0IG1hdGNoIHRob3NlIHByb2R1Y2VkIGJ5IHZhcmlvdXMgYWN0aW9ucworICogdGFrZW4gYnkgdGhlIG1lZGlhIGFuZCBjYW1lcmEgQVBJcy4gIDwvcD4KKyAqCisgKiA8cD5Vc2UgdGhpcyBjbGFzcyB0byBwbGF5IGFuIGFwcHJvcHJpYXRlIGNhbWVyYSBvcGVyYXRpb24gc291bmQgd2hlbgorICogaW1wbGVtZW50aW5nIGEgY3VzdG9tIHN0aWxsIG9yIHZpZGVvIHJlY29yZGluZyBtZWNoYW5pc20gKHRocm91Z2ggdGhlIENhbWVyYQorICogcHJldmlldyBjYWxsYmFja3Mgd2l0aCB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEjc2V0UHJldmlld0NhbGxiYWNrCisgKiBDYW1lcmEuc2V0UHJldmlld0NhbGxiYWNrfSwgb3IgdGhyb3VnaCBHUFUgcHJvY2Vzc2luZyB3aXRoIHtAbGluaworICogYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEjc2V0UHJldmlld1RleHR1cmUgQ2FtZXJhLnNldFByZXZpZXdUZXh0dXJlfSwgZm9yCisgKiBleGFtcGxlKSwgb3Igd2hlbiBpbXBsZW1lbnRpbmcgc29tZSBvdGhlciBjYW1lcmEtbGlrZSBmdW5jdGlvbiBpbiB5b3VyCisgKiBhcHBsaWNhdGlvbi48L3A+CisgKgorICogPHA+VGhlcmUgaXMgbm8gbmVlZCB0byBwbGF5IHNvdW5kcyB3aGVuIHVzaW5nCisgKiB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEjdGFrZVBpY3R1cmUgQ2FtZXJhLnRha2VQaWN0dXJlfSBvcgorICoge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlcn0gZm9yIHN0aWxsIGltYWdlcyBvciB2aWRlbywgcmVzcGVjdGl2ZWx5LAorICogYXMgdGhlIEFuZHJvaWQgZnJhbWV3b3JrIHdpbGwgcGxheSB0aGUgYXBwcm9wcmlhdGUgc291bmRzIHdoZW4gbmVlZGVkIGZvcgorICogdGhlc2UgY2FsbHMuPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIE1lZGlhQWN0aW9uU291bmQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fTUVESUFfU09VTkRfU1RSRUFNUyA9IDE7CisKKyAgICBwcml2YXRlIFNvdW5kUG9vbCBtU291bmRQb29sOworICAgIHByaXZhdGUgaW50W10gICAgIG1Tb3VuZElkczsKKyAgICBwcml2YXRlIGludCAgICAgICBtU291bmRJZFRvUGxheTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNPVU5EX0ZJTEVTID0geworICAgICAgICAiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9jYW1lcmFfY2xpY2sub2dnIiwKKyAgICAgICAgIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2ZvY3VzLm9nZyIsCisgICAgICAgICIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyIsCisgICAgICAgICIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvUmVjb3JkLm9nZyIKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUFjdGlvblNvdW5kIjsKKyAgICAvKioKKyAgICAgKiBUaGUgc291bmQgdXNlZCBieQorICAgICAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSN0YWtlUGljdHVyZSBDYW1lcmEudGFrZVBpY3R1cmV9IHRvCisgICAgICogaW5kaWNhdGUgc3RpbGwgaW1hZ2UgY2FwdHVyZS4KKyAgICAgKiBAc2VlICNwbGF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hVVFRFUl9DTElDSyAgICAgICAgID0gMDsKKworICAgIC8qKgorICAgICAqIEEgc291bmQgdG8gaW5kaWNhdGUgdGhhdCBmb2N1c2luZyBoYXMgY29tcGxldGVkLiBCZWNhdXNlIGRlY2lkaW5nCisgICAgICogd2hlbiB0aGlzIG9jY3VycyBpcyBhcHBsaWNhdGlvbi1kZXBlbmRlbnQsIHRoaXMgc291bmQgaXMgbm90IHVzZWQgYnkKKyAgICAgKiBhbnkgbWV0aG9kcyBpbiB0aGUgbWVkaWEgb3IgY2FtZXJhIEFQSXMuCisgICAgICogQHNlZSAjcGxheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPQ1VTX0NPTVBMRVRFICAgICAgICA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291bmQgdXNlZCBieQorICAgICAqIHtAbGluayBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIjc3RhcnQgTWVkaWFSZWNvcmRlci5zdGFydCgpfSB0bworICAgICAqIGluZGljYXRlIHRoZSBzdGFydCBvZiB2aWRlbyByZWNvcmRpbmcuCisgICAgICogQHNlZSAjcGxheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1ZJREVPX1JFQ09SRElORyA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc291bmQgdXNlZCBieQorICAgICAqIHtAbGluayBhbmRyb2lkLm1lZGlhLk1lZGlhUmVjb3JkZXIjc3RvcCBNZWRpYVJlY29yZGVyLnN0b3AoKX0gdG8KKyAgICAgKiBpbmRpY2F0ZSB0aGUgZW5kIG9mIHZpZGVvIHJlY29yZGluZy4KKyAgICAgKiBAc2VlICNwbGF5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RPUF9WSURFT19SRUNPUkRJTkcgID0gMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTT1VORF9OT1RfTE9BREVEID0gLTE7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgTWVkaWFBY3Rpb25Tb3VuZCBpbnN0YW5jZS4gT25seSBhIHNpbmdsZSBpbnN0YW5jZSBpcworICAgICAqIG5lZWRlZCBmb3IgcGxheWluZyBhbnkgcGxhdGZvcm0gbWVkaWEgYWN0aW9uIHNvdW5kOyB5b3UgZG8gbm90IG5lZWQgYQorICAgICAqIHNlcGFyYXRlIGluc3RhbmNlIGZvciBlYWNoIHNvdW5kIHR5cGUuCisgICAgICovCisgICAgcHVibGljIE1lZGlhQWN0aW9uU291bmQoKSB7CisgICAgICAgIG1Tb3VuZFBvb2wgPSBuZXcgU291bmRQb29sKE5VTV9NRURJQV9TT1VORF9TVFJFQU1TLAorICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5TVFJFQU1fU1lTVEVNX0VORk9SQ0VELCAwKTsKKyAgICAgICAgbVNvdW5kUG9vbC5zZXRPbkxvYWRDb21wbGV0ZUxpc3RlbmVyKG1Mb2FkQ29tcGxldGVMaXN0ZW5lcik7CisgICAgICAgIG1Tb3VuZElkcyA9IG5ldyBpbnRbU09VTkRfRklMRVMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU291bmRJZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIG1Tb3VuZElkc1tpXSA9IFNPVU5EX05PVF9MT0FERUQ7CisgICAgICAgIH0KKyAgICAgICAgbVNvdW5kSWRUb1BsYXkgPSBTT1VORF9OT1RfTE9BREVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZWxvYWQgYSBwcmVkZWZpbmVkIHBsYXRmb3JtIHNvdW5kIHRvIG1pbmltaXplIGxhdGVuY3kgd2hlbiB0aGUgc291bmQgaXMKKyAgICAgKiBwbGF5ZWQgbGF0ZXIgYnkge0BsaW5rICNwbGF5fS4KKyAgICAgKiBAcGFyYW0gc291bmROYW1lIFRoZSB0eXBlIG9mIHNvdW5kIHRvIHByZWxvYWQsIHNlbGVjdGVkIGZyb20KKyAgICAgKiAgICAgICAgIFNIVVRURVJfQ0xJQ0ssIEZPQ1VTX0NPTVBMRVRFLCBTVEFSVF9WSURFT19SRUNPUkRJTkcsIG9yCisgICAgICogICAgICAgICBTVE9QX1ZJREVPX1JFQ09SRElORy4KKyAgICAgKiBAc2VlICNwbGF5CisgICAgICogQHNlZSAjU0hVVFRFUl9DTElDSworICAgICAqIEBzZWUgI0ZPQ1VTX0NPTVBMRVRFCisgICAgICogQHNlZSAjU1RBUlRfVklERU9fUkVDT1JESU5HCisgICAgICogQHNlZSAjU1RPUF9WSURFT19SRUNPUkRJTkcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9hZChpbnQgc291bmROYW1lKSB7CisgICAgICAgIGlmIChzb3VuZE5hbWUgPCAwIHx8IHNvdW5kTmFtZSA+PSBTT1VORF9GSUxFUy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHNvdW5kIHJlcXVlc3RlZDogIiArIHNvdW5kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Tb3VuZElkc1tzb3VuZE5hbWVdID09IFNPVU5EX05PVF9MT0FERUQpIHsKKyAgICAgICAgICAgIG1Tb3VuZElkc1tzb3VuZE5hbWVdID0KKyAgICAgICAgICAgICAgICAgICAgbVNvdW5kUG9vbC5sb2FkKFNPVU5EX0ZJTEVTW3NvdW5kTmFtZV0sIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UGxheSBvbmUgb2YgdGhlIHByZWRlZmluZWQgcGxhdGZvcm0gc291bmRzIGZvciBtZWRpYSBhY3Rpb25zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlVzZSB0aGlzIG1ldGhvZCB0byBwbGF5IGEgcGxhdGZvcm0tc3BlY2lmaWMgc291bmQgZm9yIHZhcmlvdXMgbWVkaWEKKyAgICAgKiBhY3Rpb25zLiBUaGUgc291bmQgcGxheWJhY2sgaXMgZG9uZSBhc3luY2hyb25vdXNseSwgd2l0aCB0aGUgc2FtZQorICAgICAqIGJlaGF2aW9yIGFuZCBjb250ZW50IGFzIHRoZSBzb3VuZHMgcGxheWVkIGJ5CisgICAgICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhI3Rha2VQaWN0dXJlIENhbWVyYS50YWtlUGljdHVyZX0sCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciNzdGFydCBNZWRpYVJlY29yZGVyLnN0YXJ0fSwgYW5kCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuTWVkaWFSZWNvcmRlciNzdG9wIE1lZGlhUmVjb3JkZXIuc3RvcH0uPC9wPgorICAgICAqCisgICAgICogPHA+VXNpbmcgdGhpcyBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBtYXRjaCB0aGUgZGVmYXVsdCBkZXZpY2Ugc291bmRzCisgICAgICogd2hlbiByZWNvcmRpbmcgb3IgY2FwdHVyaW5nIGRhdGEgdGhyb3VnaCB0aGUgcHJldmlldyBjYWxsYmFja3MsIG9yIHdoZW4KKyAgICAgKiBpbXBsZW1lbnRpbmcgY3VzdG9tIGNhbWVyYS1saWtlIGZlYXR1cmVzIGluIHlvdXIKKyAgICAgKiBhcHBsaWNhdGlvbi48L3A+CisgICAgICoKKyAgICAgKiA8cD5JZiB0aGUgc291bmQgaGFzIG5vdCBiZWVuIGxvYWRlZCBieSB7QGxpbmsgI2xvYWR9IGJlZm9yZSBjYWxsaW5nIHBsYXksCisgICAgICogcGxheSB3aWxsIGxvYWQgdGhlIHNvdW5kIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBsYXRlbmN5IGJlZm9yZQorICAgICAqIHNvdW5kIHBsYXliYWNrIGJlZ2lucy4gPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHNvdW5kTmFtZSBUaGUgdHlwZSBvZiBzb3VuZCB0byBwbGF5LCBzZWxlY3RlZCBmcm9tCisgICAgICogICAgICAgICBTSFVUVEVSX0NMSUNLLCBGT0NVU19DT01QTEVURSwgU1RBUlRfVklERU9fUkVDT1JESU5HLCBvcgorICAgICAqICAgICAgICAgU1RPUF9WSURFT19SRUNPUkRJTkcuCisgICAgICogQHNlZSBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYSN0YWtlUGljdHVyZQorICAgICAqIEBzZWUgYW5kcm9pZC5tZWRpYS5NZWRpYVJlY29yZGVyCisgICAgICogQHNlZSAjU0hVVFRFUl9DTElDSworICAgICAqIEBzZWUgI0ZPQ1VTX0NPTVBMRVRFCisgICAgICogQHNlZSAjU1RBUlRfVklERU9fUkVDT1JESU5HCisgICAgICogQHNlZSAjU1RPUF9WSURFT19SRUNPUkRJTkcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcGxheShpbnQgc291bmROYW1lKSB7CisgICAgICAgIGlmIChzb3VuZE5hbWUgPCAwIHx8IHNvdW5kTmFtZSA+PSBTT1VORF9GSUxFUy5sZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIHNvdW5kIHJlcXVlc3RlZDogIiArIHNvdW5kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Tb3VuZElkc1tzb3VuZE5hbWVdID09IFNPVU5EX05PVF9MT0FERUQpIHsKKyAgICAgICAgICAgIG1Tb3VuZElkVG9QbGF5ID0KKyAgICAgICAgICAgICAgICAgICAgbVNvdW5kUG9vbC5sb2FkKFNPVU5EX0ZJTEVTW3NvdW5kTmFtZV0sIDEpOworICAgICAgICAgICAgbVNvdW5kSWRzW3NvdW5kTmFtZV0gPSBtU291bmRJZFRvUGxheTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Tb3VuZFBvb2wucGxheShtU291bmRJZHNbc291bmROYW1lXSwgMS4wZiwgMS4wZiwgMCwgMCwgMS4wZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNvdW5kUG9vbC5PbkxvYWRDb21wbGV0ZUxpc3RlbmVyIG1Mb2FkQ29tcGxldGVMaXN0ZW5lciA9CisgICAgICAgICAgICBuZXcgU291bmRQb29sLk9uTG9hZENvbXBsZXRlTGlzdGVuZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9hZENvbXBsZXRlKFNvdW5kUG9vbCBzb3VuZFBvb2wsCisgICAgICAgICAgICAgICAgaW50IHNhbXBsZUlkLCBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobVNvdW5kSWRUb1BsYXkgPT0gc2FtcGxlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc291bmRQb29sLnBsYXkoc2FtcGxlSWQsIDEuMGYsIDEuMGYsIDAsIDAsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBtU291bmRJZFRvUGxheSA9IFNPVU5EX05PVF9MT0FERUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJVbmFibGUgdG8gbG9hZCBzb3VuZCBmb3IgcGxheWJhY2sgKHN0YXR1czogIiArCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgKyAiKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEZyZWUgdXAgYWxsIGF1ZGlvIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgTWVkaWFBY3Rpb25Tb3VuZCBpbnN0YW5jZS4gRG8KKyAgICAgKiBub3QgY2FsbCBhbnkgb3RoZXIgbWV0aG9kcyBvbiBhIE1lZGlhQWN0aW9uU291bmQgaW5zdGFuY2UgYWZ0ZXIgY2FsbGluZworICAgICAqIHJlbGVhc2UoKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBpZiAobVNvdW5kUG9vbCAhPSBudWxsKSB7CisgICAgICAgICAgICBtU291bmRQb29sLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Tb3VuZFBvb2wgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCmluZGV4IDQwNDg1M2MuLmExY2JmMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKQEAgLTQwNSw5ICs0MDUsOSBAQAogfQogCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICB2b2lkICpwYXJhbTIpIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW0yKSB7CiAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIE91dHB1dERlc2NyaXB0b3IgKmRlc2M7CisgICAgY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqZGVzYzsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKIAogICAgIGlmIChpb0hhbmRsZSA9PSAwKSByZXR1cm47CkBAIC00MTcsNyArNDE3LDcgQEAKICAgICBzd2l0Y2ggKGV2ZW50KSB7CiAgICAgY2FzZSBTVFJFQU1fQ09ORklHX0NIQU5HRUQ6CiAgICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIHN0cmVhbSA9ICooYXVkaW9fc3RyZWFtX3R5cGVfdCAqKXBhcmFtMjsKKyAgICAgICAgc3RyZWFtID0gKihjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICopcGFyYW0yOwogICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgU1RSRUFNX0NPTkZJR19DSEFOR0VEIHN0cmVhbSAlZCwgb3V0cHV0ICVkIiwgc3RyZWFtLCBpb0hhbmRsZSk7CiAgICAgICAgIGlmIChnU3RyZWFtT3V0cHV0TWFwLmluZGV4T2ZLZXkoc3RyZWFtKSA+PSAwKSB7CiAgICAgICAgICAgICBnU3RyZWFtT3V0cHV0TWFwLnJlcGxhY2VWYWx1ZUZvcihzdHJlYW0sIGlvSGFuZGxlKTsKQEAgLTQyOSw3ICs0MjksNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhcmFtMiA9PSBOVUxMKSBicmVhazsKLSAgICAgICAgZGVzYyA9IChPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOworICAgICAgICBkZXNjID0gKGNvbnN0IE91dHB1dERlc2NyaXB0b3IgKilwYXJhbTI7CiAKICAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7CiAgICAgICAgIGdPdXRwdXRzLmFkZChpb0hhbmRsZSwgb3V0cHV0RGVzYyk7CkBAIC00NTgsNyArNDU4LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIGRlc2MgPSAoT3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKKyAgICAgICAgZGVzYyA9IChjb25zdCBPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogCiAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQgY2hhbm5lbHMgJWQgZnJhbWVDb3VudCAlZCBsYXRlbmN5ICVkIiwKICAgICAgICAgICAgICAgICBpb0hhbmRsZSwgZGVzYy0+c2FtcGxpbmdSYXRlLCBkZXNjLT5mb3JtYXQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmluZGV4IGNlMjhiMzMuLjFkYjM5YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCkBAIC0zOSwxOCArMzksMTggQEAKICAgICB7CiAgICAgfQogCi0gICAgdm9pZCBpb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgdm9pZCAqcGFyYW0yKQorICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXJDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgaW9IYW5kbGUpOwogICAgICAgICBpZiAoZXZlbnQgPT0gQXVkaW9TeXN0ZW06OlNUUkVBTV9DT05GSUdfQ0hBTkdFRCkgewotICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtID0gKih1aW50MzJfdCAqKXBhcmFtMjsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbSA9ICooY29uc3QgdWludDMyX3QgKilwYXJhbTI7CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RyZWFtKTsKICAgICAgICAgfSBlbHNlIGlmIChldmVudCAhPSBBdWRpb1N5c3RlbTo6T1VUUFVUX0NMT1NFRCAmJiBldmVudCAhPSBBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VEKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqZGVzYyA9IChBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yICpkZXNjID0gKGNvbnN0IEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yICopcGFyYW0yOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPnNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+Zm9ybWF0KTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5jaGFubmVscyk7CkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlckNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGV2ZW50ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdm9pZCAqcGFyYW0yID0gTlVMTDsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtMiA9IE5VTEw7CiAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciBkZXNjOwogICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtOwogICAgICAgICAgICAgaWYgKGV2ZW50ID09IEF1ZGlvU3lzdGVtOjpTVFJFQU1fQ09ORklHX0NIQU5HRUQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKaW5kZXggYjIxZTg2YS4uOWUwMGJiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXdlc29tZVBsYXllci5jcHAKQEAgLTIxMDgsNiArMjEwOCw4IEBACiAKICAgICAgICAgbVdWTUV4dHJhY3RvciA9IG5ldyBXVk1FeHRyYWN0b3IoZGF0YVNvdXJjZSk7CiAgICAgICAgIG1XVk1FeHRyYWN0b3ItPnNldEFkYXB0aXZlU3RyZWFtaW5nTW9kZSh0cnVlKTsKKyAgICAgICAgaWYgKG1VSURWYWxpZCkKKyAgICAgICAgICAgIG1XVk1FeHRyYWN0b3ItPnNldFVJRChtVUlEKTsKICAgICAgICAgZXh0cmFjdG9yID0gbVdWTUV4dHJhY3RvcjsKICAgICB9IGVsc2UgewogICAgICAgICBleHRyYWN0b3IgPSBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV1ZNRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1dWTUV4dHJhY3Rvci5jcHAKaW5kZXggYzdhZDUxMy4uZGFjODEwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvV1ZNRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9XVk1FeHRyYWN0b3IuY3BwCkBAIC0xMjMsNiArMTIzLDEyIEBACiAgICAgfQogfQogCit2b2lkIFdWTUV4dHJhY3Rvcjo6c2V0VUlEKHVpZF90IHVpZCkgeworICAgIGlmIChtSW1wbCAhPSBOVUxMKSB7CisgICAgICAgIG1JbXBsLT5zZXRVSUQodWlkKTsKKyAgICB9Cit9CisKIGJvb2wgU25pZmZXVk0oCiAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICBzcDxBTWVzc2FnZT4gKikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKaW5kZXggNzRmZTQ3OC4uYjNjMzUwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCkBAIC0xMDQxLDcgKzEwNDEsNyBAQAogICAgIC8qIE1hcmtlciBCaXQgKi8KICAgICBpZiAoIUJpdHN0cmVhbVJlYWQxQml0cyhzdHJlYW0pKQogICAgIHsKLSAgICAgICAgbXA0ZGVjX2xvZygiRGVjb2RlU2hvcnRIZWFkZXIoKTogTWFya2V0IGJpdCB3cm9uZy5cbiIpOworICAgICAgICBtcDRkZWNfbG9nKCJEZWNvZGVTaG9ydEhlYWRlcigpOiBNYXJrZXIgYml0IHdyb25nLlxuIik7CiAgICAgICAgIHN0YXR1cyA9IFBWX0ZBSUw7CiAgICAgICAgIGdvdG8gcmV0dXJuX3BvaW50OwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1dWTUV4dHJhY3Rvci5oCmluZGV4IDlmNzYzZjkuLjNjM2NhODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvV1ZNRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9XVk1FeHRyYWN0b3IuaApAQCAtMzQsNiArMzQsNyBAQAogCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldENhY2hlZER1cmF0aW9uVXMoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldEFkYXB0aXZlU3RyZWFtaW5nTW9kZShib29sIGFkYXB0aXZlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFVJRCh1aWRfdCB1aWQpID0gMDsKIH07CiAKIGNsYXNzIFdWTUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CkBAIC02MCw2ICs2MSw4IEBACiAgICAgLy8gaXMgdXNlZC4KICAgICB2b2lkIHNldEFkYXB0aXZlU3RyZWFtaW5nTW9kZShib29sIGFkYXB0aXZlKTsKIAorICAgIHZvaWQgc2V0VUlEKHVpZF90IHVpZCk7CisKICAgICBzdGF0aWMgYm9vbCBnZXRWZW5kb3JMaWJIYW5kbGUoKTsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbC5oIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVhMzQyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKiAtKi0gbW9kZTogYzsgdGFiLXdpZHRoOiA4OyAtKi0gKi8KLS8qIHZpOiBzZXQgc3c9NCB0cz04OiAqLwotLyogUmVmZXJlbmNlIHZlcnNpb24gb2YgZWdsLmggZm9yIEVHTCAxLjQuCi0gKiAkUmV2aXNpb246IDkzNTYgJCBvbiAkRGF0ZTogMjAwOS0xMC0yMSAwMjo1MjoyNSAtMDcwMCAoV2VkLCAyMSBPY3QgMjAwOSkgJAotICovCi0KLS8qCi0qKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCi0qKgotKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bwotKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSoqCi0qKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgotKioKLSoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0qKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0qKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCi0qLwotCi0jaWZuZGVmIF9fZWdsX2hfCi0jZGVmaW5lIF9fZWdsX2hfCi0KLS8qIEFsbCBwbGF0Zm9ybS1kZXBlbmRlbnQgdHlwZXMgYW5kIG1hY3JvIGJvaWxlcnBsYXRlIChzdWNoIGFzIEVHTEFQSQotICogYW5kIEVHTEFQSUVOVFJZKSBzaG91bGQgZ28gaW4gZWdscGxhdGZvcm0uaC4KLSAqLwotI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEVHTCBUeXBlcyAqLwotLyogRUdMaW50IGlzIGRlZmluZWQgaW4gZWdscGxhdGZvcm0uaCAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgRUdMQm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEVHTGVudW07Ci10eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKLXR5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKLXR5cGVkZWYgdm9pZCAqRUdMRGlzcGxheTsKLXR5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKLXR5cGVkZWYgdm9pZCAqRUdMQ2xpZW50QnVmZmVyOwotCi0vKiBFR0wgVmVyc2lvbmluZyAqLwotI2RlZmluZSBFR0xfVkVSU0lPTl8xXzAJCQkxCi0jZGVmaW5lIEVHTF9WRVJTSU9OXzFfMQkJCTEKLSNkZWZpbmUgRUdMX1ZFUlNJT05fMV8yCQkJMQotI2RlZmluZSBFR0xfVkVSU0lPTl8xXzMJCQkxCi0jZGVmaW5lIEVHTF9WRVJTSU9OXzFfNAkJCTEKLQotLyogRUdMIEVudW1lcmFudHMuIEJpdG1hc2tzIGFuZCBvdGhlciBleGNlcHRpb25hbCBjYXNlcyBhc2lkZSwgbW9zdAotICogZW51bXMgYXJlIGFzc2lnbmVkIHVuaXF1ZSB2YWx1ZXMgc3RhcnRpbmcgYXQgMHgzMDAwLgotICovCi0KLS8qIEVHTCBhbGlhc2VzICovCi0jZGVmaW5lIEVHTF9GQUxTRQkJCTAKLSNkZWZpbmUgRUdMX1RSVUUJCQkxCi0KLS8qIE91dC1vZi1iYW5kIGhhbmRsZSB2YWx1ZXMgKi8KLSNkZWZpbmUgRUdMX0RFRkFVTFRfRElTUExBWQkJKChFR0xOYXRpdmVEaXNwbGF5VHlwZSkwKQotI2RlZmluZSBFR0xfTk9fQ09OVEVYVAkJCSgoRUdMQ29udGV4dCkwKQotI2RlZmluZSBFR0xfTk9fRElTUExBWQkJCSgoRUdMRGlzcGxheSkwKQotI2RlZmluZSBFR0xfTk9fU1VSRkFDRQkJCSgoRUdMU3VyZmFjZSkwKQotCi0vKiBPdXQtb2YtYmFuZCBhdHRyaWJ1dGUgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJCSgoRUdMaW50KS0xKQotCi0vKiBFcnJvcnMgLyBHZXRFcnJvciByZXR1cm4gdmFsdWVzICovCi0jZGVmaW5lIEVHTF9TVUNDRVNTCQkJMHgzMDAwCi0jZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJCTB4MzAwMQotI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJCTB4MzAwMgotI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkJMHgzMDAzCi0jZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCQkweDMwMDQKLSNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCQkweDMwMDUKLSNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkJMHgzMDA2Ci0jZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFCQkweDMwMDcKLSNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkJMHgzMDA4Ci0jZGVmaW5lIEVHTF9CQURfTUFUQ0gJCQkweDMwMDkKLSNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCQkweDMwMEEKLSNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCQkweDMwMEIKLSNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJCTB4MzAwQwotI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCQkweDMwMEQKLSNkZWZpbmUgRUdMX0NPTlRFWFRfTE9TVAkJMHgzMDBFCS8qIEVHTCAxLjEgLSBJTUdfcG93ZXJfbWFuYWdlbWVudCAqLwotCi0vKiBSZXNlcnZlZCAweDMwMEYtMHgzMDFGIGZvciBhZGRpdGlvbmFsIGVycm9ycyAqLwotCi0vKiBDb25maWcgYXR0cmlidXRlcyAqLwotI2RlZmluZSBFR0xfQlVGRkVSX1NJWkUJCQkweDMwMjAKLSNkZWZpbmUgRUdMX0FMUEhBX1NJWkUJCQkweDMwMjEKLSNkZWZpbmUgRUdMX0JMVUVfU0laRQkJCTB4MzAyMgotI2RlZmluZSBFR0xfR1JFRU5fU0laRQkJCTB4MzAyMwotI2RlZmluZSBFR0xfUkVEX1NJWkUJCQkweDMwMjQKLSNkZWZpbmUgRUdMX0RFUFRIX1NJWkUJCQkweDMwMjUKLSNkZWZpbmUgRUdMX1NURU5DSUxfU0laRQkJMHgzMDI2Ci0jZGVmaW5lIEVHTF9DT05GSUdfQ0FWRUFUCQkweDMwMjcKLSNkZWZpbmUgRUdMX0NPTkZJR19JRAkJCTB4MzAyOAotI2RlZmluZSBFR0xfTEVWRUwJCQkweDMwMjkKLSNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX0hFSUdIVAkJMHgzMDJBCi0jZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMJCTB4MzAyQgotI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfV0lEVEgJCTB4MzAyQwotI2RlZmluZSBFR0xfTkFUSVZFX1JFTkRFUkFCTEUJCTB4MzAyRAotI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9JRAkJMHgzMDJFCi0jZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUJCTB4MzAyRgotI2RlZmluZSBFR0xfU0FNUExFUwkJCTB4MzAzMQotI2RlZmluZSBFR0xfU0FNUExFX0JVRkZFUlMJCTB4MzAzMgotI2RlZmluZSBFR0xfU1VSRkFDRV9UWVBFCQkweDMwMzMKLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1RZUEUJCTB4MzAzNAotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRQkweDMwMzUKLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFCTB4MzAzNgotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFCTB4MzAzNwotI2RlZmluZSBFR0xfTk9ORQkJCTB4MzAzOAkvKiBBdHRyaWIgbGlzdCB0ZXJtaW5hdG9yICovCi0jZGVmaW5lIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCCQkweDMwMzkKLSNkZWZpbmUgRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBCTB4MzAzQQotI2RlZmluZSBFR0xfTUlOX1NXQVBfSU5URVJWQUwJCTB4MzAzQgotI2RlZmluZSBFR0xfTUFYX1NXQVBfSU5URVJWQUwJCTB4MzAzQwotI2RlZmluZSBFR0xfTFVNSU5BTkNFX1NJWkUJCTB4MzAzRAotI2RlZmluZSBFR0xfQUxQSEFfTUFTS19TSVpFCQkweDMwM0UKLSNkZWZpbmUgRUdMX0NPTE9SX0JVRkZFUl9UWVBFCQkweDMwM0YKLSNkZWZpbmUgRUdMX1JFTkRFUkFCTEVfVFlQRQkJMHgzMDQwCi0jZGVmaW5lIEVHTF9NQVRDSF9OQVRJVkVfUElYTUFQCQkweDMwNDEJLyogUHNldWRvLWF0dHJpYnV0ZSAobm90IHF1ZXJ5YWJsZSkgKi8KLSNkZWZpbmUgRUdMX0NPTkZPUk1BTlQJCQkweDMwNDIKLQotLyogUmVzZXJ2ZWQgMHgzMDQxLTB4MzA0RiBmb3IgYWRkaXRpb25hbCBjb25maWcgYXR0cmlidXRlcyAqLwotCi0vKiBDb25maWcgYXR0cmlidXRlIHZhbHVlcyAqLwotI2RlZmluZSBFR0xfU0xPV19DT05GSUcJCQkweDMwNTAJLyogRUdMX0NPTkZJR19DQVZFQVQgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX05PTl9DT05GT1JNQU5UX0NPTkZJRwkweDMwNTEJLyogRUdMX0NPTkZJR19DQVZFQVQgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX1JHQgkJMHgzMDUyCS8qIEVHTF9UUkFOU1BBUkVOVF9UWVBFIHZhbHVlICovCi0jZGVmaW5lIEVHTF9SR0JfQlVGRkVSCQkJMHgzMDhFCS8qIEVHTF9DT0xPUl9CVUZGRVJfVFlQRSB2YWx1ZSAqLwotI2RlZmluZSBFR0xfTFVNSU5BTkNFX0JVRkZFUgkJMHgzMDhGCS8qIEVHTF9DT0xPUl9CVUZGRVJfVFlQRSB2YWx1ZSAqLwotCi0vKiBNb3JlIGNvbmZpZyBhdHRyaWJ1dGUgdmFsdWVzLCBmb3IgRUdMX1RFWFRVUkVfRk9STUFUICovCi0jZGVmaW5lIEVHTF9OT19URVhUVVJFCQkJMHgzMDVDCi0jZGVmaW5lIEVHTF9URVhUVVJFX1JHQgkJCTB4MzA1RAotI2RlZmluZSBFR0xfVEVYVFVSRV9SR0JBCQkweDMwNUUKLSNkZWZpbmUgRUdMX1RFWFRVUkVfMkQJCQkweDMwNUYKLQotLyogQ29uZmlnIGF0dHJpYnV0ZSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX1BCVUZGRVJfQklUCQkJMHgwMDAxCS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9QSVhNQVBfQklUCQkJMHgwMDAyCS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9XSU5ET1dfQklUCQkJMHgwMDA0CS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFX0xJTkVBUl9CSVQJMHgwMDIwCS8qIEVHTF9TVVJGQUNFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9WR19BTFBIQV9GT1JNQVRfUFJFX0JJVAkweDAwNDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX01VTFRJU0FNUExFX1JFU09MVkVfQk9YX0JJVCAweDAyMDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLSNkZWZpbmUgRUdMX1NXQVBfQkVIQVZJT1JfUFJFU0VSVkVEX0JJVCAweDA0MDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBtYXNrIGJpdHMgKi8KLQotI2RlZmluZSBFR0xfT1BFTkdMX0VTX0JJVAkJMHgwMDAxCS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9PUEVOVkdfQklUCQkJMHgwMDAyCS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9PUEVOR0xfRVMyX0JJVAkJMHgwMDA0CS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCi0jZGVmaW5lIEVHTF9PUEVOR0xfQklUCQkJMHgwMDA4CS8qIEVHTF9SRU5ERVJBQkxFX1RZUEUgbWFzayBiaXRzICovCi0KLS8qIFF1ZXJ5U3RyaW5nIHRhcmdldHMgKi8KLSNkZWZpbmUgRUdMX1ZFTkRPUgkJCTB4MzA1MwotI2RlZmluZSBFR0xfVkVSU0lPTgkJCTB4MzA1NAotI2RlZmluZSBFR0xfRVhURU5TSU9OUwkJCTB4MzA1NQotI2RlZmluZSBFR0xfQ0xJRU5UX0FQSVMJCQkweDMwOEQKLQotLyogUXVlcnlTdXJmYWNlIC8gU3VyZmFjZUF0dHJpYiAvIENyZWF0ZVBidWZmZXJTdXJmYWNlIHRhcmdldHMgKi8KLSNkZWZpbmUgRUdMX0hFSUdIVAkJCTB4MzA1NgotI2RlZmluZSBFR0xfV0lEVEgJCQkweDMwNTcKLSNkZWZpbmUgRUdMX0xBUkdFU1RfUEJVRkZFUgkJMHgzMDU4Ci0jZGVmaW5lIEVHTF9URVhUVVJFX0ZPUk1BVAkJMHgzMDgwCi0jZGVmaW5lIEVHTF9URVhUVVJFX1RBUkdFVAkJMHgzMDgxCi0jZGVmaW5lIEVHTF9NSVBNQVBfVEVYVFVSRQkJMHgzMDgyCi0jZGVmaW5lIEVHTF9NSVBNQVBfTEVWRUwJCTB4MzA4MwotI2RlZmluZSBFR0xfUkVOREVSX0JVRkZFUgkJMHgzMDg2Ci0jZGVmaW5lIEVHTF9WR19DT0xPUlNQQUNFCQkweDMwODcKLSNkZWZpbmUgRUdMX1ZHX0FMUEhBX0ZPUk1BVAkJMHgzMDg4Ci0jZGVmaW5lIEVHTF9IT1JJWk9OVEFMX1JFU09MVVRJT04JMHgzMDkwCi0jZGVmaW5lIEVHTF9WRVJUSUNBTF9SRVNPTFVUSU9OCQkweDMwOTEKLSNkZWZpbmUgRUdMX1BJWEVMX0FTUEVDVF9SQVRJTwkJMHgzMDkyCi0jZGVmaW5lIEVHTF9TV0FQX0JFSEFWSU9SCQkweDMwOTMKLSNkZWZpbmUgRUdMX01VTFRJU0FNUExFX1JFU09MVkUJCTB4MzA5OQotCi0vKiBFR0xfUkVOREVSX0JVRkZFUiB2YWx1ZXMgLyBCaW5kVGV4SW1hZ2UgLyBSZWxlYXNlVGV4SW1hZ2UgYnVmZmVyIHRhcmdldHMgKi8KLSNkZWZpbmUgRUdMX0JBQ0tfQlVGRkVSCQkJMHgzMDg0Ci0jZGVmaW5lIEVHTF9TSU5HTEVfQlVGRkVSCQkweDMwODUKLQotLyogT3BlblZHIGNvbG9yIHNwYWNlcyAqLwotI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9zUkdCCQkweDMwODkJLyogRUdMX1ZHX0NPTE9SU1BBQ0UgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSCTB4MzA4QQkvKiBFR0xfVkdfQ09MT1JTUEFDRSB2YWx1ZSAqLwotCi0vKiBPcGVuVkcgYWxwaGEgZm9ybWF0cyAqLwotI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX05PTlBSRQkweDMwOEIJLyogRUdMX0FMUEhBX0ZPUk1BVCB2YWx1ZSAqLwotI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX1BSRQkJMHgzMDhDCS8qIEVHTF9BTFBIQV9GT1JNQVQgdmFsdWUgKi8KLQotLyogQ29uc3RhbnQgc2NhbGUgZmFjdG9yIGJ5IHdoaWNoIGZyYWN0aW9uYWwgZGlzcGxheSByZXNvbHV0aW9ucyAmCi0gKiBhc3BlY3QgcmF0aW8gYXJlIHNjYWxlZCB3aGVuIHF1ZXJpZWQgYXMgaW50ZWdlciB2YWx1ZXMuCi0gKi8KLSNkZWZpbmUgRUdMX0RJU1BMQVlfU0NBTElORwkJMTAwMDAKLQotLyogVW5rbm93biBkaXNwbGF5IHJlc29sdXRpb24vYXNwZWN0IHJhdGlvICovCi0jZGVmaW5lIEVHTF9VTktOT1dOCQkJKChFR0xpbnQpLTEpCi0KLS8qIEJhY2sgYnVmZmVyIHN3YXAgYmVoYXZpb3JzICovCi0jZGVmaW5lIEVHTF9CVUZGRVJfUFJFU0VSVkVECQkweDMwOTQJLyogRUdMX1NXQVBfQkVIQVZJT1IgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX0JVRkZFUl9ERVNUUk9ZRUQJCTB4MzA5NQkvKiBFR0xfU1dBUF9CRUhBVklPUiB2YWx1ZSAqLwotCi0vKiBDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlciBidWZmZXIgdHlwZXMgKi8KLSNkZWZpbmUgRUdMX09QRU5WR19JTUFHRQkJMHgzMDk2Ci0KLS8qIFF1ZXJ5Q29udGV4dCB0YXJnZXRzICovCi0jZGVmaW5lIEVHTF9DT05URVhUX0NMSUVOVF9UWVBFCQkweDMwOTcKLQotLyogQ3JlYXRlQ29udGV4dCBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OCTB4MzA5OAotCi0vKiBNdWx0aXNhbXBsZSByZXNvbHV0aW9uIGJlaGF2aW9ycyAqLwotI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9ERUZBVUxUIDB4MzA5QQkvKiBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRSB2YWx1ZSAqLwotI2RlZmluZSBFR0xfTVVMVElTQU1QTEVfUkVTT0xWRV9CT1gJMHgzMDlCCS8qIEVHTF9NVUxUSVNBTVBMRV9SRVNPTFZFIHZhbHVlICovCi0KLS8qIEJpbmRBUEkvUXVlcnlBUEkgdGFyZ2V0cyAqLwotI2RlZmluZSBFR0xfT1BFTkdMX0VTX0FQSQkJMHgzMEEwCi0jZGVmaW5lIEVHTF9PUEVOVkdfQVBJCQkJMHgzMEExCi0jZGVmaW5lIEVHTF9PUEVOR0xfQVBJCQkJMHgzMEEyCi0KLS8qIEdldEN1cnJlbnRTdXJmYWNlIHRhcmdldHMgKi8KLSNkZWZpbmUgRUdMX0RSQVcJCQkweDMwNTkKLSNkZWZpbmUgRUdMX1JFQUQJCQkweDMwNUEKLQotLyogV2FpdE5hdGl2ZSBlbmdpbmVzICovCi0jZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUJCTB4MzA1QgotCi0vKiBFR0wgMS4yIHRva2VucyByZW5hbWVkIGZvciBjb25zaXN0ZW5jeSBpbiBFR0wgMS4zICovCi0jZGVmaW5lIEVHTF9DT0xPUlNQQUNFCQkJRUdMX1ZHX0NPTE9SU1BBQ0UKLSNkZWZpbmUgRUdMX0FMUEhBX0ZPUk1BVAkJRUdMX1ZHX0FMUEhBX0ZPUk1BVAotI2RlZmluZSBFR0xfQ09MT1JTUEFDRV9zUkdCCQlFR0xfVkdfQ09MT1JTUEFDRV9zUkdCCi0jZGVmaW5lIEVHTF9DT0xPUlNQQUNFX0xJTkVBUgkJRUdMX1ZHX0NPTE9SU1BBQ0VfTElORUFSCi0jZGVmaW5lIEVHTF9BTFBIQV9GT1JNQVRfTk9OUFJFCQlFR0xfVkdfQUxQSEFfRk9STUFUX05PTlBSRQotI2RlZmluZSBFR0xfQUxQSEFfRk9STUFUX1BSRQkJRUdMX1ZHX0FMUEhBX0ZPUk1BVF9QUkUKLQotLyogRUdMIGV4dGVuc2lvbnMgbXVzdCByZXF1ZXN0IGVudW0gYmxvY2tzIGZyb20gdGhlIEtocm9ub3MKLSAqIEFQSSBSZWdpc3RyYXIsIHdobyBtYWludGFpbnMgdGhlIGVudW1lcmFudCByZWdpc3RyeS4gU3VibWl0Ci0gKiBhIGJ1ZyBpbiBLaHJvbm9zIEJ1Z3ppbGxhIGFnYWluc3QgdGFzayAiUmVnaXN0cnkiLgotICovCi0KLQotCi0vKiBFR0wgRnVuY3Rpb25zICovCi0KLUVHTEFQSSBFR0xpbnQgRUdMQVBJRU5UUlkgZWdsR2V0RXJyb3Iodm9pZCk7Ci0KLUVHTEFQSSBFR0xEaXNwbGF5IEVHTEFQSUVOVFJZIGVnbEdldERpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheV9pZCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xJbml0aWFsaXplKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFRlcm1pbmF0ZShFR0xEaXNwbGF5IGRweSk7Ci0KLUVHTEFQSSBjb25zdCBjaGFyICogRUdMQVBJRU5UUlkgZWdsUXVlcnlTdHJpbmcoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKTsKLQotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsR2V0Q29uZmlncyhFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnICpjb25maWdzLAotCQkJIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbENob29zZUNvbmZpZyhFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwKLQkJCSAgIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLAotCQkJICAgRUdMaW50ICpudW1fY29uZmlnKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEdldENvbmZpZ0F0dHJpYihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLQkJCSAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotCi1FR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotCQkJCSAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW4sCi0JCQkJICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUVHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotCQkJCSAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotRUdMQVBJIEVHTFN1cmZhY2UgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLQkJCQkgIEVHTE5hdGl2ZVBpeG1hcFR5cGUgcGl4bWFwLAotCQkJCSAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFF1ZXJ5U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAotCQkJICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0KLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbEJpbmRBUEkoRUdMZW51bSBhcGkpOwotRUdMQVBJIEVHTGVudW0gRUdMQVBJRU5UUlkgZWdsUXVlcnlBUEkodm9pZCk7Ci0KLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXRDbGllbnQodm9pZCk7Ci0KLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFJlbGVhc2VUaHJlYWQodm9pZCk7Ci0KLUVHTEFQSSBFR0xTdXJmYWNlIEVHTEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyKAotCSAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xlbnVtIGJ1ZnR5cGUsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsCi0JICAgICAgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci0KLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN1cmZhY2VBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwKLQkJCSAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgdmFsdWUpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsQmluZFRleEltYWdlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsUmVsZWFzZVRleEltYWdlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpOwotCi0KLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFN3YXBJbnRlcnZhbChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGludGVydmFsKTsKLQotCi1FR0xBUEkgRUdMQ29udGV4dCBFR0xBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotCQkJICAgIEVHTENvbnRleHQgc2hhcmVfY29udGV4dCwKLQkJCSAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xNYWtlQ3VycmVudChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAotCQkJICBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KTsKLQotRUdMQVBJIEVHTENvbnRleHQgRUdMQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQodm9pZCk7Ci1FR0xBUEkgRUdMU3VyZmFjZSBFR0xBUElFTlRSWSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xpbnQgcmVhZGRyYXcpOwotRUdMQVBJIEVHTERpc3BsYXkgRUdMQVBJRU5UUlkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LAotCQkJICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0KLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXRHTCh2b2lkKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbFdhaXROYXRpdmUoRUdMaW50IGVuZ2luZSk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTd2FwQnVmZmVycyhFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbENvcHlCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0JCQkgIEVHTE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKLQotLyogVGhpcyBpcyBhIGdlbmVyaWMgZnVuY3Rpb24gcG9pbnRlciB0eXBlLCB3aG9zZSBuYW1lIGluZGljYXRlcyBpdCBtdXN0Ci0gKiBiZSBjYXN0IHRvIHRoZSBwcm9wZXIgdHlwZSAqYW5kIGNhbGxpbmcgY29udmVudGlvbiogYmVmb3JlIHVzZS4KLSAqLwotdHlwZWRlZiB2b2lkICgqX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkodm9pZCk7Ci0KLS8qIE5vdywgZGVmaW5lIGVnbEdldFByb2NBZGRyZXNzIHVzaW5nIHRoZSBnZW5lcmljIGZ1bmN0aW9uIHB0ci4gdHlwZSAqLwotRUdMQVBJIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgRUdMQVBJRU5UUlkKLSAgICAgICBlZ2xHZXRQcm9jQWRkcmVzcyhjb25zdCBjaGFyICpwcm9jbmFtZSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvRUdML2VnbGV4dC5oIGIvb3BlbmdsL2luY2x1ZGUvRUdML2VnbGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTExODYzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jaWZuZGVmIF9fZWdsZXh0X2hfCi0jZGVmaW5lIF9fZWdsZXh0X2hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSoqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwIFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSoqCi0qKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0qKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0qKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCi0qKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotKioKLSoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0qKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCi0qKgotKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0qKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KLSovCi0KLSNpbmNsdWRlIDxFR0wvZWdscGxhdGZvcm0uaD4KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEhlYWRlciBmaWxlIHZlcnNpb24gbnVtYmVyICovCi0vKiBDdXJyZW50IHZlcnNpb24gYXQgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9lZ2wvICovCi0vKiAkUmV2aXNpb246IDExMjQ5ICQgb24gJERhdGU6IDIwMTAtMDUtMDUgMDk6NTQ6MjggLTA3MDAgKFdlZCwgMDUgTWF5IDIwMTApICQgKi8KLSNkZWZpbmUgRUdMX0VHTEVYVF9WRVJTSU9OIDUKLQotI2lmbmRlZiBFR0xfS0hSX2NvbmZpZ19hdHRyaWJzCi0jZGVmaW5lIEVHTF9LSFJfY29uZmlnX2F0dHJpYnMgMQotI2RlZmluZSBFR0xfQ09ORk9STUFOVF9LSFIJCQkweDMwNDIJLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfVkdfQ09MT1JTUEFDRV9MSU5FQVJfQklUX0tIUgkweDAwMjAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLwotI2RlZmluZSBFR0xfVkdfQUxQSEFfRk9STUFUX1BSRV9CSVRfS0hSCQkweDAwNDAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9sb2NrX3N1cmZhY2UKLSNkZWZpbmUgRUdMX0tIUl9sb2NrX3N1cmZhY2UgMQotI2RlZmluZSBFR0xfUkVBRF9TVVJGQUNFX0JJVF9LSFIJCTB4MDAwMQkvKiBFR0xfTE9DS19VU0FHRV9ISU5UX0tIUiBiaXRmaWVsZCAqLwotI2RlZmluZSBFR0xfV1JJVEVfU1VSRkFDRV9CSVRfS0hSCQkweDAwMDIJLyogRUdMX0xPQ0tfVVNBR0VfSElOVF9LSFIgYml0ZmllbGQgKi8KLSNkZWZpbmUgRUdMX0xPQ0tfU1VSRkFDRV9CSVRfS0hSCQkweDAwODAJLyogRUdMX1NVUkZBQ0VfVFlQRSBiaXRmaWVsZCAqLwotI2RlZmluZSBFR0xfT1BUSU1BTF9GT1JNQVRfQklUX0tIUgkJMHgwMTAwCS8qIEVHTF9TVVJGQUNFX1RZUEUgYml0ZmllbGQgKi8KLSNkZWZpbmUgRUdMX01BVENIX0ZPUk1BVF9LSFIJCQkweDMwNDMJLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfRk9STUFUX1JHQl81NjVfRVhBQ1RfS0hSCQkweDMwQzAJLyogRUdMX01BVENIX0ZPUk1BVF9LSFIgdmFsdWUgKi8KLSNkZWZpbmUgRUdMX0ZPUk1BVF9SR0JfNTY1X0tIUgkJCTB4MzBDMQkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLwotI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9FWEFDVF9LSFIJCTB4MzBDMgkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLwotI2RlZmluZSBFR0xfRk9STUFUX1JHQkFfODg4OF9LSFIJCTB4MzBDMwkvKiBFR0xfTUFUQ0hfRk9STUFUX0tIUiB2YWx1ZSAqLwotI2RlZmluZSBFR0xfTUFQX1BSRVNFUlZFX1BJWEVMU19LSFIJCTB4MzBDNAkvKiBlZ2xMb2NrU3VyZmFjZUtIUiBhdHRyaWJ1dGUgKi8KLSNkZWZpbmUgRUdMX0xPQ0tfVVNBR0VfSElOVF9LSFIJCQkweDMwQzUJLyogZWdsTG9ja1N1cmZhY2VLSFIgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfUE9JTlRFUl9LSFIJCQkweDMwQzYJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfQklUTUFQX1BJVENIX0tIUgkJCTB4MzBDNwkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfT1JJR0lOX0tIUgkJCTB4MzBDOAkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfUkVEX09GRlNFVF9LSFIJCTB4MzBDOQkvKiBlZ2xRdWVyeVN1cmZhY2UgYXR0cmlidXRlICovCi0jZGVmaW5lIEVHTF9CSVRNQVBfUElYRUxfR1JFRU5fT0ZGU0VUX0tIUgkweDMwQ0EJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0JMVUVfT0ZGU0VUX0tIUgkweDMwQ0IJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfQklUTUFQX1BJWEVMX0FMUEhBX09GRlNFVF9LSFIJMHgzMENDCS8qIGVnbFF1ZXJ5U3VyZmFjZSBhdHRyaWJ1dGUgKi8KLSNkZWZpbmUgRUdMX0JJVE1BUF9QSVhFTF9MVU1JTkFOQ0VfT0ZGU0VUX0tIUgkweDMwQ0QJLyogZWdsUXVlcnlTdXJmYWNlIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBFR0xfTE9XRVJfTEVGVF9LSFIJCQkweDMwQ0UJLyogRUdMX0JJVE1BUF9PUklHSU5fS0hSIHZhbHVlICovCi0jZGVmaW5lIEVHTF9VUFBFUl9MRUZUX0tIUgkJCTB4MzBDRgkvKiBFR0xfQklUTUFQX09SSUdJTl9LSFIgdmFsdWUgKi8KLSNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbExvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xVbmxvY2tTdXJmYWNlS0hSIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7Ci0jZW5kaWYgLyogRUdMX0VHTEVYVF9QUk9UT1RZUEVTICovCi10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xMT0NLU1VSRkFDRUtIUlBST0MpIChFR0xEaXNwbGF5IGRpc3BsYXksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xVTkxPQ0tTVVJGQUNFS0hSUFJPQykgKEVHTERpc3BsYXkgZGlzcGxheSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9LSFJfaW1hZ2UKLSNkZWZpbmUgRUdMX0tIUl9pbWFnZSAxCi0jZGVmaW5lIEVHTF9OQVRJVkVfUElYTUFQX0tIUgkJCTB4MzBCMAkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLXR5cGVkZWYgdm9pZCAqRUdMSW1hZ2VLSFI7Ci0jZGVmaW5lIEVHTF9OT19JTUFHRV9LSFIJCQkoKEVHTEltYWdlS0hSKTApCi0jaWZkZWYgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1FR0xBUEkgRUdMSW1hZ2VLSFIgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlSW1hZ2VLSFIgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotRUdMQVBJIEVHTEJvb2xlYW4gRUdMQVBJRU5UUlkgZWdsRGVzdHJveUltYWdlS0hSIChFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1hZ2UpOwotI2VuZGlmIC8qIEVHTF9FR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiBFR0xJbWFnZUtIUiAoRUdMQVBJRU5UUllQIFBGTkVHTENSRUFURUlNQUdFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotdHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWUlNQUdFS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xJbWFnZUtIUiBpbWFnZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX3ZnX3BhcmVudF9pbWFnZQotI2RlZmluZSBFR0xfS0hSX3ZnX3BhcmVudF9pbWFnZSAxCi0jZGVmaW5lIEVHTF9WR19QQVJFTlRfSU1BR0VfS0hSCQkJMHgzMEJBCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9nbF90ZXh0dXJlXzJEX2ltYWdlCi0jZGVmaW5lIEVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSAxCi0jZGVmaW5lIEVHTF9HTF9URVhUVVJFXzJEX0tIUgkJCTB4MzBCMQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfTEVWRUxfS0hSCQkweDMwQkMJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgYXR0cmlidXRlICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZQotI2RlZmluZSBFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZSAxCi0jZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfS0hSCTB4MzBCMwkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9LSFIJMHgzMEI0CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZX0tIUgkweDMwQjUJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZGVmaW5lIEVHTF9HTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfS0hSCTB4MzBCNgkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9LSFIJMHgzMEI3CS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aX0tIUgkweDMwQjgJLyogZWdsQ3JlYXRlSW1hZ2VLSFIgdGFyZ2V0ICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfS0hSX2dsX3RleHR1cmVfM0RfaW1hZ2UKLSNkZWZpbmUgRUdMX0tIUl9nbF90ZXh0dXJlXzNEX2ltYWdlIDEKLSNkZWZpbmUgRUdMX0dMX1RFWFRVUkVfM0RfS0hSCQkJMHgzMEIyCS8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2RlZmluZSBFR0xfR0xfVEVYVFVSRV9aT0ZGU0VUX0tIUgkJMHgzMEJECS8qIGVnbENyZWF0ZUltYWdlS0hSIGF0dHJpYnV0ZSAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9nbF9yZW5kZXJidWZmZXJfaW1hZ2UKLSNkZWZpbmUgRUdMX0tIUl9nbF9yZW5kZXJidWZmZXJfaW1hZ2UgMQotI2RlZmluZSBFR0xfR0xfUkVOREVSQlVGRkVSX0tIUgkJCTB4MzBCOQkvKiBlZ2xDcmVhdGVJbWFnZUtIUiB0YXJnZXQgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9LSFJfcmV1c2FibGVfc3luYwotI2RlZmluZSBFR0xfS0hSX3JldXNhYmxlX3N5bmMgMQotCi10eXBlZGVmIHZvaWQqIEVHTFN5bmNLSFI7Ci10eXBlZGVmIGtocm9ub3NfdXRpbWVfbmFub3NlY29uZHNfdCBFR0xUaW1lS0hSOwotCi0jZGVmaW5lIEVHTF9TWU5DX1NUQVRVU19LSFIJCQkweDMwRjEKLSNkZWZpbmUgRUdMX1NJR05BTEVEX0tIUgkJCTB4MzBGMgotI2RlZmluZSBFR0xfVU5TSUdOQUxFRF9LSFIJCQkweDMwRjMKLSNkZWZpbmUgRUdMX1RJTUVPVVRfRVhQSVJFRF9LSFIJCQkweDMwRjUKLSNkZWZpbmUgRUdMX0NPTkRJVElPTl9TQVRJU0ZJRURfS0hSCQkweDMwRjYKLSNkZWZpbmUgRUdMX1NZTkNfVFlQRV9LSFIJCQkweDMwRjcKLSNkZWZpbmUgRUdMX1NZTkNfUkVVU0FCTEVfS0hSCQkJMHgzMEZBCi0jZGVmaW5lIEVHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVF9LSFIJCTB4MDAwMQkvKiBlZ2xDbGllbnRXYWl0U3luY0tIUiA8ZmxhZ3M+IGJpdGZpZWxkICovCi0jZGVmaW5lIEVHTF9GT1JFVkVSX0tIUgkJCQkweEZGRkZGRkZGRkZGRkZGRkZ1bGwKLSNkZWZpbmUgRUdMX05PX1NZTkNfS0hSCQkJCSgoRUdMU3luY0tIUikwKQotI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUwotRUdMQVBJIEVHTFN5bmNLSFIgRUdMQVBJRU5UUlkgZWdsQ3JlYXRlU3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUVHTEFQSSBFR0xCb29sZWFuIEVHTEFQSUVOVFJZIGVnbERlc3Ryb3lTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMpOwotRUdMQVBJIEVHTGludCBFR0xBUElFTlRSWSBlZ2xDbGllbnRXYWl0U3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVLSFIgdGltZW91dCk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xTaWduYWxTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGVudW0gbW9kZSk7Ci1FR0xBUEkgRUdMQm9vbGVhbiBFR0xBUElFTlRSWSBlZ2xHZXRTeW5jQXR0cmliS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotI2VuZGlmIC8qIEVHTF9FR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiBFR0xTeW5jS0hSIChFR0xBUElFTlRSWVAgUEZORUdMQ1JFQVRFU1lOQ0tIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLXR5cGVkZWYgRUdMQm9vbGVhbiAoRUdMQVBJRU5UUllQIFBGTkVHTERFU1RST1lTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMpOwotdHlwZWRlZiBFR0xpbnQgKEVHTEFQSUVOVFJZUCBQRk5FR0xDTElFTlRXQUlUU1lOQ0tIUlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMU3luY0tIUiBzeW5jLCBFR0xpbnQgZmxhZ3MsIEVHTFRpbWVLSFIgdGltZW91dCk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTSUdOQUxTWU5DS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGVudW0gbW9kZSk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xHRVRTWU5DQVRUUklCS0hSUFJPQykgKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9pbWFnZV9iYXNlCi0jZGVmaW5lIEVHTF9LSFJfaW1hZ2VfYmFzZSAxCi0vKiBNb3N0IGludGVyZmFjZXMgZGVmaW5lZCBieSBFR0xfS0hSX2ltYWdlX3BpeG1hcCBhYm92ZSAqLwotI2RlZmluZSBFR0xfSU1BR0VfUFJFU0VSVkVEX0tIUgkJCTB4MzBEMgkvKiBlZ2xDcmVhdGVJbWFnZUtIUiBhdHRyaWJ1dGUgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9LSFJfaW1hZ2VfcGl4bWFwCi0jZGVmaW5lIEVHTF9LSFJfaW1hZ2VfcGl4bWFwIDEKLS8qIEludGVyZmFjZXMgZGVmaW5lZCBieSBFR0xfS0hSX2ltYWdlIGFib3ZlICovCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkKLSNkZWZpbmUgRUdMX0lNR19jb250ZXh0X3ByaW9yaXR5IDEKLSNkZWZpbmUgRUdMX0NPTlRFWFRfUFJJT1JJVFlfTEVWRUxfSU1HCQkweDMxMDAKLSNkZWZpbmUgRUdMX0NPTlRFWFRfUFJJT1JJVFlfSElHSF9JTUcJCTB4MzEwMQotI2RlZmluZSBFR0xfQ09OVEVYVF9QUklPUklUWV9NRURJVU1fSU1HCQkweDMxMDIKLSNkZWZpbmUgRUdMX0NPTlRFWFRfUFJJT1JJVFlfTE9XX0lNRwkJMHgzMTAzCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfTlZfY292ZXJhZ2Vfc2FtcGxlCi0jZGVmaW5lIEVHTF9OVl9jb3ZlcmFnZV9zYW1wbGUgMQotI2RlZmluZSBFR0xfQ09WRVJBR0VfQlVGRkVSU19OViAweDMwRTAKLSNkZWZpbmUgRUdMX0NPVkVSQUdFX1NBTVBMRVNfTlYgMHgzMEUxCi0jZW5kaWYKLQotI2lmbmRlZiBFR0xfTlZfZGVwdGhfbm9ubGluZWFyCi0jZGVmaW5lIEVHTF9OVl9kZXB0aF9ub25saW5lYXIgMQotI2RlZmluZSBFR0xfREVQVEhfRU5DT0RJTkdfTlYgMHgzMEUyCi0jZGVmaW5lIEVHTF9ERVBUSF9FTkNPRElOR19OT05FX05WIDAKLSNkZWZpbmUgRUdMX0RFUFRIX0VOQ09ESU5HX05PTkxJTkVBUl9OViAweDMwRTMKLSNlbmRpZgotCi0jaWZuZGVmIEVHTF9OVl9zeW5jCi0jZGVmaW5lIEVHTF9OVl9zeW5jIDEKLSNkZWZpbmUgRUdMX1NZTkNfUFJJT1JfQ09NTUFORFNfQ09NUExFVEVfTlYJMHgzMEU2Ci0jZGVmaW5lIEVHTF9TWU5DX1NUQVRVU19OVgkJCTB4MzBFNwotI2RlZmluZSBFR0xfU0lHTkFMRURfTlYJCQkJMHgzMEU4Ci0jZGVmaW5lIEVHTF9VTlNJR05BTEVEX05WCQkJMHgzMEU5Ci0jZGVmaW5lIEVHTF9TWU5DX0ZMVVNIX0NPTU1BTkRTX0JJVF9OVgkJMHgwMDAxCi0jZGVmaW5lIEVHTF9GT1JFVkVSX05WCQkJCTB4RkZGRkZGRkZGRkZGRkZGRnVsbAotI2RlZmluZSBFR0xfQUxSRUFEWV9TSUdOQUxFRF9OVgkJCTB4MzBFQQotI2RlZmluZSBFR0xfVElNRU9VVF9FWFBJUkVEX05WCQkJMHgzMEVCCi0jZGVmaW5lIEVHTF9DT05ESVRJT05fU0FUSVNGSUVEX05WCQkweDMwRUMKLSNkZWZpbmUgRUdMX1NZTkNfVFlQRV9OVgkJCTB4MzBFRAotI2RlZmluZSBFR0xfU1lOQ19DT05ESVRJT05fTlYJCQkweDMwRUUKLSNkZWZpbmUgRUdMX1NZTkNfRkVOQ0VfTlYJCQkweDMwRUYKLSNkZWZpbmUgRUdMX05PX1NZTkNfTlYJCQkJKChFR0xTeW5jTlYpMCkKLXR5cGVkZWYgdm9pZCogRUdMU3luY05WOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgRUdMVGltZU5WOwotI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUwotRUdMU3luY05WIGVnbENyZWF0ZUZlbmNlU3luY05WIChFR0xEaXNwbGF5IGRweSwgRUdMZW51bSBjb25kaXRpb24sIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3luY05WIChFR0xTeW5jTlYgc3luYyk7Ci1FR0xCb29sZWFuIGVnbEZlbmNlTlYgKEVHTFN5bmNOViBzeW5jKTsKLUVHTGludCBlZ2xDbGllbnRXYWl0U3luY05WIChFR0xTeW5jTlYgc3luYywgRUdMaW50IGZsYWdzLCBFR0xUaW1lTlYgdGltZW91dCk7Ci1FR0xCb29sZWFuIGVnbFNpZ25hbFN5bmNOViAoRUdMU3luY05WIHN5bmMsIEVHTGVudW0gbW9kZSk7Ci1FR0xCb29sZWFuIGVnbEdldFN5bmNBdHRyaWJOViAoRUdMU3luY05WIHN5bmMsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotI2VuZGlmIC8qIEVHTF9FR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiBFR0xTeW5jTlYgKEVHTEFQSUVOVFJZUCBQRk5FR0xDUkVBVEVGRU5DRVNZTkNOVlBST0MpIChFR0xEaXNwbGF5IGRweSwgRUdMZW51bSBjb25kaXRpb24sIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOwotdHlwZWRlZiBFR0xCb29sZWFuIChFR0xBUElFTlRSWVAgUEZORUdMREVTVFJPWVNZTkNOVlBST0MpIChFR0xTeW5jTlYgc3luYyk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xGRU5DRU5WUFJPQykgKEVHTFN5bmNOViBzeW5jKTsKLXR5cGVkZWYgRUdMaW50IChFR0xBUElFTlRSWVAgUEZORUdMQ0xJRU5UV0FJVFNZTkNOVlBST0MpIChFR0xTeW5jTlYgc3luYywgRUdMaW50IGZsYWdzLCBFR0xUaW1lTlYgdGltZW91dCk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xTSUdOQUxTWU5DTlZQUk9DKSAoRUdMU3luY05WIHN5bmMsIEVHTGVudW0gbW9kZSk7Ci10eXBlZGVmIEVHTEJvb2xlYW4gKEVHTEFQSUVOVFJZUCBQRk5FR0xHRVRTWU5DQVRUUklCTlZQUk9DKSAoRUdMU3luY05WIHN5bmMsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0tIUl9mZW5jZV9zeW5jCi0jZGVmaW5lIEVHTF9LSFJfZmVuY2Vfc3luYyAxCi0vKiBSZXVzZXMgbW9zdCB0b2tlbnMgYW5kIGVudHJ5IHBvaW50cyBmcm9tIEVHTF9LSFJfcmV1c2FibGVfc3luYyAqLwotI2RlZmluZSBFR0xfU1lOQ19QUklPUl9DT01NQU5EU19DT01QTEVURV9LSFIJMHgzMEYwCi0jZGVmaW5lIEVHTF9TWU5DX0NPTkRJVElPTl9LSFIJCQkweDMwRjgKLSNkZWZpbmUgRUdMX1NZTkNfRkVOQ0VfS0hSCQkJMHgzMEY5Ci0jZW5kaWYKLQotI2lmbmRlZiBFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyCi0jZGVmaW5lIEVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIgMQotc3RydWN0IEFOYXRpdmVXaW5kb3dCdWZmZXI7Ci0jZGVmaW5lIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQgICAgICAgICAgICAgICAweDMxNDAgIC8qIGVnbENyZWF0ZUltYWdlS0hSIHRhcmdldCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgRUdMX0FORFJPSURfcmVjb3JkYWJsZQotI2RlZmluZSBFR0xfQU5EUk9JRF9yZWNvcmRhYmxlIDEKLSNkZWZpbmUgRUdMX1JFQ09SREFCTEVfQU5EUk9JRCAgICAgICAgICAgICAgICAgIDB4MzE0MiAgLyogRUdMQ29uZmlnIGF0dHJpYnV0ZSAqLwotI2VuZGlmCi0KLS8qIEVHTF9OVl9zeXN0ZW1fdGltZQotICovCi0jaWZuZGVmIEVHTF9OVl9zeXN0ZW1fdGltZQotI2RlZmluZSBFR0xfTlZfc3lzdGVtX3RpbWUgMQotdHlwZWRlZiBraHJvbm9zX2ludDY0X3QgRUdMaW50NjROVjsKLXR5cGVkZWYga2hyb25vc191aW50NjRfdCBFR0x1aW50NjROVjsKLSNpZmRlZiBFR0xfRUdMRVhUX1BST1RPVFlQRVMKLUVHTEFQSSBFR0x1aW50NjROViBFR0xBUElFTlRSWSBlZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYodm9pZCk7Ci1FR0xBUEkgRUdMdWludDY0TlYgRUdMQVBJRU5UUlkgZWdsR2V0U3lzdGVtVGltZU5WKHZvaWQpOwotI2VuZGlmCi10eXBlZGVmIEVHTHVpbnQ2NE5WIChFR0xBUElFTlRSWVAgUEZORUdMR0VUU1lTVEVNVElNRUZSRVFVRU5DWU5WUFJPQykodm9pZCk7Ci10eXBlZGVmIEVHTHVpbnQ2NE5WIChFR0xBUElFTlRSWVAgUEZORUdMR0VUU1lTVEVNVElNRU5WUFJPQykodm9pZCk7Ci0jZW5kaWYKLQotCi0vKiBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlCi0gKi8KLSNpZm5kZWYgRUdMX0FORFJPSURfYmxvYl9jYWNoZQotI2RlZmluZSBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIDEKLXR5cGVkZWYga2hyb25vc19zc2l6ZV90IEVHTHNpemVpQU5EUk9JRDsKLXR5cGVkZWYgdm9pZCAoKkVHTFNldEJsb2JGdW5jQU5EUk9JRCkgKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsIGNvbnN0IHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKTsKLXR5cGVkZWYgRUdMc2l6ZWlBTkRST0lEICgqRUdMR2V0QmxvYkZ1bmNBTkRST0lEKSAoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpOwotI2lmZGVmIEVHTF9FR0xFWFRfUFJPVE9UWVBFUwotRUdMQVBJIHZvaWQgRUdMQVBJRU5UUlkgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEKEVHTERpc3BsYXkgZHB5LCBFR0xTZXRCbG9iRnVuY0FORFJPSUQgc2V0LCBFR0xHZXRCbG9iRnVuY0FORFJPSUQgZ2V0KTsKLSNlbmRpZiAvKiBFR0xfRUdMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoRUdMQVBJRU5UUllQIFBGTkVHTFNFVEJMT0JDQUNIRUZVTkNTQU5EUk9JRFBST0MpIChFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgRUdMU2V0QmxvYkZ1bmNBTkRST0lEIHNldCwgRUdMR2V0QmxvYkZ1bmNBTkRST0lEIGdldCk7Ci0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9FR0wvZWdscGxhdGZvcm0uaCBiL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmFjNzFiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9pbmNsdWRlL0VHTC9lZ2xwbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSNpZm5kZWYgX19lZ2xwbGF0Zm9ybV9oXwotI2RlZmluZSBfX2VnbHBsYXRmb3JtX2hfCi0KLS8qCi0qKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOSBUaGUgS2hyb25vcyBHcm91cCBJbmMuCi0qKgotKiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSoqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSoqICJNYXRlcmlhbHMiKSwgdG8gZGVhbCBpbiB0aGUgTWF0ZXJpYWxzIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotKiogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotKiogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBNYXRlcmlhbHMsIGFuZCB0bwotKiogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgTWF0ZXJpYWxzIGFyZSBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSoqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSoqCi0qKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotKiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgTWF0ZXJpYWxzLgotKioKLSoqIFRIRSBNQVRFUklBTFMgQVJFIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0qKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSoqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCi0qKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAotKiogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSoqIE1BVEVSSUFMUyBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBNQVRFUklBTFMuCi0qLwotCi0vKiBQbGF0Zm9ybS1zcGVjaWZpYyB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9yIGVnbC5oCi0gKiAkUmV2aXNpb246IDk3MjQgJCBvbiAkRGF0ZTogMjAwOS0xMi0wMiAwMjowNTozMyAtMDgwMCAoV2VkLCAwMiBEZWMgMjAwOSkgJAotICoKLSAqIEFkb3B0ZXJzIG1heSBtb2RpZnkga2hycGxhdGZvcm0uaCBhbmQgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uCi0gKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gc3VibWl0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zIGdyb3VwIHNvIHRoYXQKLSAqIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuICBQbGVhc2Ugc3VibWl0IGNoYW5nZXMKLSAqIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEgKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkKLSAqIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QgIkVHTCIgY29tcG9uZW50ICJSZWdpc3RyeSIuCi0gKi8KLQotI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgotCi0vKiBNYWNyb3MgdXNlZCBpbiBFR0wgZnVuY3Rpb24gcHJvdG90eXBlIGRlY2xhcmF0aW9ucy4KLSAqCi0gKiBFR0wgZnVuY3Rpb25zIHNob3VsZCBiZSBwcm90b3R5cGVkIGFzOgotICoKLSAqIEVHTEFQSSByZXR1cm4tdHlwZSBFR0xBUElFTlRSWSBlZ2xGdW5jdGlvbihhcmd1bWVudHMpOwotICogdHlwZWRlZiByZXR1cm4tdHlwZSAoRVhQQVBJRU5UUllQIFBGTkVHTEZVTkNUSU9OUFJPQykgKGFyZ3VtZW50cyk7Ci0gKgotICogS0hST05PU19BUElDQUxMIGFuZCBLSFJPTk9TX0FQSUVOVFJZIGFyZSBkZWZpbmVkIGluIEtIUi9raHJwbGF0Zm9ybS5oCi0gKi8KLQotI2lmbmRlZiBFR0xBUEkKLSNkZWZpbmUgRUdMQVBJIEtIUk9OT1NfQVBJQ0FMTAotI2VuZGlmCi0KLSNpZm5kZWYgRUdMQVBJRU5UUlkKLSNkZWZpbmUgRUdMQVBJRU5UUlkgIEtIUk9OT1NfQVBJRU5UUlkKLSNlbmRpZgotI2RlZmluZSBFR0xBUElFTlRSWVAgRUdMQVBJRU5UUlkqCi0KLS8qIFRoZSB0eXBlcyBOYXRpdmVEaXNwbGF5VHlwZSwgTmF0aXZlV2luZG93VHlwZSwgYW5kIE5hdGl2ZVBpeG1hcFR5cGUKLSAqIGFyZSBhbGlhc2VzIG9mIHdpbmRvdy1zeXN0ZW0tZGVwZW5kZW50IHR5cGVzLCBzdWNoIGFzIFggRGlzcGxheSAqIG9yCi0gKiBXaW5kb3dzIERldmljZSBDb250ZXh0LiBUaGV5IG11c3QgYmUgZGVmaW5lZCBpbiBwbGF0Zm9ybS1zcGVjaWZpYwotICogY29kZSBiZWxvdy4gVGhlIEVHTC1wcmVmaXhlZCB2ZXJzaW9ucyBvZiBOYXRpdmUqVHlwZSBhcmUgdGhlIHNhbWUKLSAqIHR5cGVzLCByZW5hbWVkIGluIEVHTCAxLjMgc28gYWxsIHR5cGVzIGluIHRoZSBBUEkgc3RhcnQgd2l0aCAiRUdMIi4KLSAqLwotCi0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19WQzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pIC8qIFdpbjMyIGFuZCBXaW5DRSAqLwotI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQotI2VuZGlmCi0jaW5jbHVkZSA8d2luZG93cy5oPgotCi10eXBlZGVmIEhEQyAgICAgRUdMTmF0aXZlRGlzcGxheVR5cGU7Ci10eXBlZGVmIEhCSVRNQVAgRUdMTmF0aXZlUGl4bWFwVHlwZTsKLXR5cGVkZWYgSFdORCAgICBFR0xOYXRpdmVXaW5kb3dUeXBlOwotCi0jZWxpZiBkZWZpbmVkKF9fV0lOU0NXX18pIHx8IGRlZmluZWQoX19TWU1CSUFOMzJfXykgIC8qIFN5bWJpYW4gKi8KLQotdHlwZWRlZiBpbnQgICBFR0xOYXRpdmVEaXNwbGF5VHlwZTsKLXR5cGVkZWYgdm9pZCAqRUdMTmF0aXZlV2luZG93VHlwZTsKLXR5cGVkZWYgdm9pZCAqRUdMTmF0aXZlUGl4bWFwVHlwZTsKLQotI2VsaWYgZGVmaW5lZChfX0FORFJPSURfXykgfHwgZGVmaW5lZChBTkRST0lEKQotCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+Ci0KLXN0cnVjdCBlZ2xfbmF0aXZlX3BpeG1hcF90OwotCi10eXBlZGVmIHN0cnVjdCBBTmF0aXZlV2luZG93KiAgICAgICAgICAgRUdMTmF0aXZlV2luZG93VHlwZTsKLXR5cGVkZWYgc3RydWN0IGVnbF9uYXRpdmVfcGl4bWFwX3QqICAgICBFR0xOYXRpdmVQaXhtYXBUeXBlOwotdHlwZWRlZiB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTE5hdGl2ZURpc3BsYXlUeXBlOwotCi0jZWxpZiBkZWZpbmVkKF9fdW5peF9fKQotCi0vKiBYMTEgKHRlbnRhdGl2ZSkgICovCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLSNpbmNsdWRlIDxYMTEvWHV0aWwuaD4KLQotdHlwZWRlZiBEaXNwbGF5ICpFR0xOYXRpdmVEaXNwbGF5VHlwZTsKLXR5cGVkZWYgUGl4bWFwICAgRUdMTmF0aXZlUGl4bWFwVHlwZTsKLXR5cGVkZWYgV2luZG93ICAgRUdMTmF0aXZlV2luZG93VHlwZTsKLQotI2Vsc2UKLSNlcnJvciAiUGxhdGZvcm0gbm90IHJlY29nbml6ZWQiCi0jZW5kaWYKLQotLyogRUdMIDEuMiB0eXBlcywgcmVuYW1lZCBmb3IgY29uc2lzdGVuY3kgaW4gRUdMIDEuMyAqLwotdHlwZWRlZiBFR0xOYXRpdmVEaXNwbGF5VHlwZSBOYXRpdmVEaXNwbGF5VHlwZTsKLXR5cGVkZWYgRUdMTmF0aXZlUGl4bWFwVHlwZSAgTmF0aXZlUGl4bWFwVHlwZTsKLXR5cGVkZWYgRUdMTmF0aXZlV2luZG93VHlwZSAgTmF0aXZlV2luZG93VHlwZTsKLQotCi0vKiBEZWZpbmUgRUdMaW50LiBUaGlzIG11c3QgYmUgYSBzaWduZWQgaW50ZWdyYWwgdHlwZSBsYXJnZSBlbm91Z2ggdG8gY29udGFpbgotICogYWxsIGxlZ2FsIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzIHBhc3NlZCBpbnRvIGFuZCBvdXQgb2YgRUdMLCB3aGV0aGVyCi0gKiB0aGVpciB0eXBlIGlzIGJvb2xlYW4sIGJpdG1hc2ssIGVudW1lcmFudCAoc3ltYm9saWMgY29uc3RhbnQpLCBpbnRlZ2VyLAotICogaGFuZGxlLCBvciBvdGhlci4gIFdoaWxlIGluIGdlbmVyYWwgYSAzMi1iaXQgaW50ZWdlciB3aWxsIHN1ZmZpY2UsIGlmCi0gKiBoYW5kbGVzIGFyZSA2NCBiaXQgdHlwZXMsIHRoZW4gRUdMaW50IHNob3VsZCBiZSBkZWZpbmVkIGFzIGEgc2lnbmVkIDY0LWJpdAotICogaW50ZWdlciB0eXBlLgotICovCi10eXBlZGVmIGtocm9ub3NfaW50MzJfdCBFR0xpbnQ7Ci0KLSNlbmRpZiAvKiBfX2VnbHBsYXRmb3JtX2ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0VUQzEvZXRjMS5oIGIvb3BlbmdsL2luY2x1ZGUvRVRDMS9ldGMxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzg5MDUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvRVRDMS9ldGMxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2lmbmRlZiBfX2V0YzFfaF9fCi0jZGVmaW5lIF9fZXRjMV9oX18KLQotI2RlZmluZSBFVEMxX0VOQ09ERURfQkxPQ0tfU0laRSA4Ci0jZGVmaW5lIEVUQzFfREVDT0RFRF9CTE9DS19TSVpFIDQ4Ci0KLSNpZm5kZWYgRVRDMV9SR0I4X09FUwotI2RlZmluZSBFVEMxX1JHQjhfT0VTIDB4OEQ2NAotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBldGMxX2J5dGU7Ci10eXBlZGVmIGludCBldGMxX2Jvb2w7Ci10eXBlZGVmIHVuc2lnbmVkIGludCBldGMxX3VpbnQzMjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBFbmNvZGUgYSBibG9jayBvZiBwaXhlbHMuCi0vLwotLy8gcEluIGlzIGEgcG9pbnRlciB0byBhIEVUQ19ERUNPREVEX0JMT0NLX1NJWkUgYXJyYXkgb2YgYnl0ZXMgdGhhdCByZXByZXNlbnQgYQotLy8gNCB4IDQgc3F1YXJlIG9mIDMtYnl0ZSBwaXhlbHMgaW4gZm9ybSBSLCBHLCBCLiBCeXRlICgzICogKHggKyA0ICogeSkgaXMgdGhlIFIKLS8vIHZhbHVlIG9mIHBpeGVsICh4LCB5KS4KLS8vCi0vLyB2YWxpZFBpeGVsTWFzayBpcyBhIDE2LWJpdCBtYXNrIHdoZXJlIGJpdCAoMSA8PCAoeCArIHkgKiA0KSkgaW5kaWNhdGVzIHdoZXRoZXIKLS8vIHRoZSBjb3JyZXNwb25kaW5nICh4LHkpIHBpeGVsIGlzIHZhbGlkLiBJbnZhbGlkIHBpeGVsIGNvbG9yIHZhbHVlcyBhcmUgaWdub3JlZCB3aGVuIGNvbXByZXNzaW5nLgotLy8KLS8vIHBPdXQgaXMgYW4gRVRDMSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCi0KLXZvaWQgZXRjMV9lbmNvZGVfYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHZhbGlkUGl4ZWxNYXNrLCBldGMxX2J5dGUqIHBPdXQpOwotCi0vLyBEZWNvZGUgYSBibG9jayBvZiBwaXhlbHMuCi0vLwotLy8gcEluIGlzIGFuIEVUQzEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLgotLy8KLS8vIHBPdXQgaXMgYSBwb2ludGVyIHRvIGEgRVRDX0RFQ09ERURfQkxPQ0tfU0laRSBhcnJheSBvZiBieXRlcyB0aGF0IHJlcHJlc2VudCBhCi0vLyA0IHggNCBzcXVhcmUgb2YgMy1ieXRlIHBpeGVscyBpbiBmb3JtIFIsIEcsIEIuIEJ5dGUgKDMgKiAoeCArIDQgKiB5KSBpcyB0aGUgUgotLy8gdmFsdWUgb2YgcGl4ZWwgKHgsIHkpLgotCi12b2lkIGV0YzFfZGVjb2RlX2Jsb2NrKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX2J5dGUqIHBPdXQpOwotCi0vLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGVuY29kZWQgaW1hZ2UgZGF0YSAoZG9lcyBub3QgaW5jbHVkZSBzaXplIG9mIFBLTSBoZWFkZXIpLgotCi1ldGMxX3VpbnQzMiBldGMxX2dldF9lbmNvZGVkX2RhdGFfc2l6ZShldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0KTsKLQotLy8gRW5jb2RlIGFuIGVudGlyZSBpbWFnZS4KLS8vIHBJbiAtIHBvaW50ZXIgdG8gdGhlIGltYWdlIGRhdGEuIEZvcm1hdHRlZCBzdWNoIHRoYXQKLS8vICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5OwotLy8gcE91dCAtIHBvaW50ZXIgdG8gZW5jb2RlZCBkYXRhLiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBzdG9yZSBlbnRpcmUgZW5jb2RlZCBpbWFnZS4KLS8vIHBpeGVsU2l6ZSBjYW4gYmUgMiBvciAzLiAyIGlzIGFuIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IGltYWdlLCAzIGlzIGEgR0xfQllURSBSR0IgaW1hZ2UuCi0vLyByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgotCi1pbnQgZXRjMV9lbmNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQsCi0gICAgICAgIGV0YzFfdWludDMyIHBpeGVsU2l6ZSwgZXRjMV91aW50MzIgc3RyaWRlLCBldGMxX2J5dGUqIHBPdXQpOwotCi0vLyBEZWNvZGUgYW4gZW50aXJlIGltYWdlLgotLy8gcEluIC0gcG9pbnRlciB0byBlbmNvZGVkIGRhdGEuCi0vLyBwT3V0IC0gcG9pbnRlciB0byB0aGUgaW1hZ2UgZGF0YS4gV2lsbCBiZSB3cml0dGVuIHN1Y2ggdGhhdAotLy8gICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5LiBNdXN0IGJlCi0vLyAgICAgICAgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIGVudGlyZSBpbWFnZS4KLS8vIHBpeGVsU2l6ZSBjYW4gYmUgMiBvciAzLiAyIGlzIGFuIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81IGltYWdlLCAzIGlzIGEgR0xfQllURSBSR0IgaW1hZ2UuCi0vLyByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZXJlIGlzIGFuIGVycm9yLgotCi1pbnQgZXRjMV9kZWNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfYnl0ZSogcE91dCwKLSAgICAgICAgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKLSAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUpOwotCi0vLyBTaXplIG9mIGEgUEtNIGhlYWRlciwgaW4gYnl0ZXMuCi0KLSNkZWZpbmUgRVRDX1BLTV9IRUFERVJfU0laRSAxNgotCi0vLyBGb3JtYXQgYSBQS00gaGVhZGVyCi0KLXZvaWQgZXRjMV9wa21fZm9ybWF0X2hlYWRlcihldGMxX2J5dGUqIHBIZWFkZXIsIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpOwotCi0vLyBDaGVjayBpZiBhIFBLTSBoZWFkZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4KLQotZXRjMV9ib29sIGV0YzFfcGttX2lzX3ZhbGlkKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcik7Ci0KLS8vIFJlYWQgdGhlIGltYWdlIHdpZHRoIGZyb20gYSBQS00gaGVhZGVyCi0KLWV0YzFfdWludDMyIGV0YzFfcGttX2dldF93aWR0aChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpOwotCi0vLyBSZWFkIHRoZSBpbWFnZSBoZWlnaHQgZnJvbSBhIFBLTSBoZWFkZXIKLQotZXRjMV91aW50MzIgZXRjMV9wa21fZ2V0X2hlaWdodChjb25zdCBldGMxX2J5dGUqIHBIZWFkZXIpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZWdsLmggYi9vcGVuZ2wvaW5jbHVkZS9HTEVTL2VnbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc4ZTAwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKgotICogU2tlbGV0b24gZWdsLmggdG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IGZvciBlYXJseSBHTEVTIDEuMAotICogYXBwbGljYXRpb25zLiBTZXZlcmFsIGVhcmx5IGltcGxlbWVudGF0aW9ucyBpbmNsdWRlZCBnbC5oCi0gKiBpbiBlZ2wuaCBsZWFkaW5nIGFwcGxpY2F0aW9ucyB0byBpbmNsdWRlIG9ubHkgZWdsLmgKLSAqCi0gKiAkUmV2aXNpb246IDYyNTIgJCBvbiAkRGF0ZTo6IDIwMDgtMDgtMDYgMTY6MzU6MDggLTA3MDAgIyQKLSAqLwotCi0jaWZuZGVmIF9fbGVnYWN5X2VnbF9oXwotI2RlZmluZSBfX2xlZ2FjeV9lZ2xfaF8KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNlbmRpZiAvKiBfX2xlZ2FjeV9lZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI4ZDg1YS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NzAgKzAsMCBAQAotI2lmbmRlZiBfX2dsX2hfCi0jZGVmaW5lIF9fZ2xfaF8KLQotLyogJFJldmlzaW9uOiAxMDYwMSAkIG9uICREYXRlOjogMjAxMC0wMy0wNCAyMjoxNToyNyAtMDgwMCAjJCAqLwotCi0jaW5jbHVkZSA8R0xFUy9nbHBsYXRmb3JtLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCi0gKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCi0gKi8KLQotdHlwZWRlZiB2b2lkICAgICAgICAgICAgIEdMdm9pZDsKLXR5cGVkZWYgY2hhciAgICAgICAgICAgICBHTGNoYXI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgR0xlbnVtOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgIEdMYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGJpdGZpZWxkOwotdHlwZWRlZiBraHJvbm9zX2ludDhfdCAgIEdMYnl0ZTsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICBHTHNob3J0OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMaW50OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMc2l6ZWk7Ci10eXBlZGVmIGtocm9ub3NfdWludDhfdCAgR0x1Ynl0ZTsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBHTHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTHVpbnQ7Ci10eXBlZGVmIGtocm9ub3NfZmxvYXRfdCAgR0xmbG9hdDsKLXR5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGNsYW1wZjsKLXR5cGVkZWYga2hyb25vc19pbnQzMl90ICBHTGZpeGVkOwotdHlwZWRlZiBraHJvbm9zX2ludDMyX3QgIEdMY2xhbXB4OwotCi10eXBlZGVmIGtocm9ub3NfaW50cHRyX3QgR0xpbnRwdHI7Ci10eXBlZGVmIGtocm9ub3Nfc3NpemVfdCAgR0xzaXplaXB0cjsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogT3BlbkdMIEVTIGNvcmUgdmVyc2lvbnMgKi8KLSNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTV8xXzAgICAgICAgICAgMQotI2RlZmluZSBHTF9WRVJTSU9OX0VTX0NMXzFfMCAgICAgICAgICAxCi0jZGVmaW5lIEdMX1ZFUlNJT05fRVNfQ01fMV8xICAgICAgICAgIDEKLSNkZWZpbmUgR0xfVkVSU0lPTl9FU19DTF8xXzEgICAgICAgICAgMQotCi0vKiBDbGVhckJ1ZmZlck1hc2sgKi8KLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLQotLyogQm9vbGVhbiAqLwotI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotCi0vKiBCZWdpbk1vZGUgKi8KLSNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKLSNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgotCi0vKiBBbHBoYUZ1bmN0aW9uICovCi0jZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQotI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCi0jZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKLSNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAotI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1Ci0jZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKLSNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNwotCi0vKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLSNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAotI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCi0jZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKLSNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMwotI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0Ci0jZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKLQotLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLS8qICAgICAgR0xfWkVSTyAqLwotLyogICAgICBHTF9PTkUgKi8KLSNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgotI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3Ci0jZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKLS8qICAgICAgR0xfU1JDX0FMUEhBICovCi0vKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KLS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0vKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KLQotLyogQ2xpcFBsYW5lTmFtZSAqLwotI2RlZmluZSBHTF9DTElQX1BMQU5FMCAgICAgICAgICAgICAgICAgICAgMHgzMDAwCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUxICAgICAgICAgICAgICAgICAgICAweDMwMDEKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTIgICAgICAgICAgICAgICAgICAgIDB4MzAwMgotI2RlZmluZSBHTF9DTElQX1BMQU5FMyAgICAgICAgICAgICAgICAgICAgMHgzMDAzCi0jZGVmaW5lIEdMX0NMSVBfUExBTkU0ICAgICAgICAgICAgICAgICAgICAweDMwMDQKLSNkZWZpbmUgR0xfQ0xJUF9QTEFORTUgICAgICAgICAgICAgICAgICAgIDB4MzAwNQotCi0vKiBDb2xvck1hdGVyaWFsRmFjZSAqLwotLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLwotCi0vKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCi0vKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KLQotLyogQ29sb3JQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCi0vKiAgICAgIEdMX0ZMT0FUICovCi0vKiAgICAgIEdMX0ZJWEVEICovCi0KLS8qIEN1bGxGYWNlTW9kZSAqLwotI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0Ci0jZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKLSNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAotCi0vKiBEZXB0aEZ1bmN0aW9uICovCi0vKiAgICAgIEdMX05FVkVSICovCi0vKiAgICAgIEdMX0xFU1MgKi8KLS8qICAgICAgR0xfRVFVQUwgKi8KLS8qICAgICAgR0xfTEVRVUFMICovCi0vKiAgICAgIEdMX0dSRUFURVIgKi8KLS8qICAgICAgR0xfTk9URVFVQUwgKi8KLS8qICAgICAgR0xfR0VRVUFMICovCi0vKiAgICAgIEdMX0FMV0FZUyAqLwotCi0vKiBFbmFibGVDYXAgKi8KLSNkZWZpbmUgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MAotI2RlZmluZSBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMHgwQjUwCi0jZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKLSNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAotI2RlZmluZSBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQkMwCi0jZGVmaW5lIEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRTIKLSNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgIDB4MEJGMgotI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCi0jZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKLSNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQotLyogICAgICBHTF9MSUdIVDAgKi8KLS8qICAgICAgR0xfTElHSFQxICovCi0vKiAgICAgIEdMX0xJR0hUMiAqLwotLyogICAgICBHTF9MSUdIVDMgKi8KLS8qICAgICAgR0xfTElHSFQ0ICovCi0vKiAgICAgIEdMX0xJR0hUNSAqLwotLyogICAgICBHTF9MSUdIVDYgKi8KLS8qICAgICAgR0xfTElHSFQ3ICovCi0jZGVmaW5lIEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAweDBCMTAKLSNkZWZpbmUgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgIDB4MEIyMAotI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCi0jZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAweDBCNTcKLSNkZWZpbmUgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMQotI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCi0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NAotI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc1Ci0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAweDgwNzYKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgIDB4ODA3OAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgMHg4MDlECi0jZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAweDgwOUUKLSNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgIDB4ODA5RgotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCi0KLS8qIEVycm9yQ29kZSAqLwotI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCi0jZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKLSNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgotI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCi0jZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKLSNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQotCi0vKiBGb2dNb2RlICovCi0vKiAgICAgIEdMX0xJTkVBUiAqLwotI2RlZmluZSBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKLQotLyogRm9nUGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAweDBCNjIKLSNkZWZpbmUgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MwotI2RlZmluZSBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY0Ci0jZGVmaW5lIEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDBCNjUKLSNkZWZpbmUgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NgotCi0vKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KLSNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAotI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCi0KLS8qIEdldFBOYW1lICovCi0jZGVmaW5lIEdMX0NVUlJFTlRfQ09MT1IgICAgICAgICAgICAgICAgICAweDBCMDAKLSNkZWZpbmUgR0xfQ1VSUkVOVF9OT1JNQUwgICAgICAgICAgICAgICAgIDB4MEIwMgotI2RlZmluZSBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICAgICAgICAgMHgwQjAzCi0jZGVmaW5lIEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAweDBCMTEKLSNkZWZpbmUgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgIDB4ODEyNgotI2RlZmluZSBHTF9QT0lOVF9TSVpFX01BWCAgICAgICAgICAgICAgICAgMHg4MTI3Ci0jZGVmaW5lIEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAweDgxMjgKLSNkZWZpbmUgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgIDB4ODEyOQotI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCi0jZGVmaW5lIEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAweDBCMjEKLSNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgotI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECi0jZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKLSNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQotI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2Ci0jZGVmaW5lIEdMX1NIQURFX01PREVMICAgICAgICAgICAgICAgICAgICAweDBCNTQKLSNkZWZpbmUgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgIDB4MEI3MAotI2RlZmluZSBHTF9ERVBUSF9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQjcyCi0jZGVmaW5lIEdMX0RFUFRIX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAweDBCNzMKLSNkZWZpbmUgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgIDB4MEI3NAotI2RlZmluZSBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgMHgwQjkxCi0jZGVmaW5lIEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAweDBCOTIKLSNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MwotI2RlZmluZSBHTF9TVEVOQ0lMX0ZBSUwgICAgICAgICAgICAgICAgICAgMHgwQjk0Ci0jZGVmaW5lIEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAweDBCOTUKLSNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgIDB4MEI5NgotI2RlZmluZSBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgMHgwQjk3Ci0jZGVmaW5lIEdMX1NURU5DSUxfV1JJVEVNQVNLICAgICAgICAgICAgICAweDBCOTgKLSNkZWZpbmUgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgIDB4MEJBMAotI2RlZmluZSBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMHgwQkEyCi0jZGVmaW5lIEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAweDBCQTMKLSNkZWZpbmUgR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgIDB4MEJBNAotI2RlZmluZSBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgMHgwQkE1Ci0jZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAweDBCQTYKLSNkZWZpbmUgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgIDB4MEJBNwotI2RlZmluZSBHTF9URVhUVVJFX01BVFJJWCAgICAgICAgICAgICAgICAgMHgwQkE4Ci0jZGVmaW5lIEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAweDBCQzEKLSNkZWZpbmUgR0xfQUxQSEFfVEVTVF9SRUYgICAgICAgICAgICAgICAgIDB4MEJDMgotI2RlZmluZSBHTF9CTEVORF9EU1QgICAgICAgICAgICAgICAgICAgICAgMHgwQkUwCi0jZGVmaW5lIEdMX0JMRU5EX1NSQyAgICAgICAgICAgICAgICAgICAgICAweDBCRTEKLSNkZWZpbmUgR0xfTE9HSUNfT1BfTU9ERSAgICAgICAgICAgICAgICAgIDB4MEJGMAotI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCi0jZGVmaW5lIEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAweDBDMTEKLSNkZWZpbmUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgIDB4MEMyMgotI2RlZmluZSBHTF9DT0xPUl9XUklURU1BU0sgICAgICAgICAgICAgICAgMHgwQzIzCi0jZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKLSNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQotI2RlZmluZSBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgMHgwRDMxCi0jZGVmaW5lIEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAweDBEMzIKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgIDB4MEQzMwotI2RlZmluZSBHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgMHgwRDM2Ci0jZGVmaW5lIEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAweDBEMzgKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgIDB4MEQzOQotI2RlZmluZSBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgMHgwRDNBCi0jZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKLSNkZWZpbmUgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDB4MEQ1MAotI2RlZmluZSBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwRDUyCi0jZGVmaW5lIEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTMKLSNkZWZpbmUgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NAotI2RlZmluZSBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU1Ci0jZGVmaW5lIEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTYKLSNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDB4MEQ1NwotI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9VTklUUyAgICAgICAgICAgMHgyQTAwCi0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKLSNkZWZpbmUgR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SICAgICAgICAgIDB4ODAzOAotI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgMHg4MDY5Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAweDgwN0EKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgIDB4ODA3QgotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfU1RSSURFICAgICAgICAgICAgMHg4MDdDCi0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAweDgwN0UKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZX1NUUklERSAgICAgICAgICAgIDB4ODA3RgotI2RlZmluZSBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgMHg4MDgxCi0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAweDgwODIKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfU1RSSURFICAgICAgICAgICAgIDB4ODA4MwotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUgICAgICAgMHg4MDg4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAweDgwODkKLSNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgIDB4ODA4QQotI2RlZmluZSBHTF9WRVJURVhfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgMHg4MDhFCi0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAweDgwOEYKLSNkZWZpbmUgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgIDB4ODA5MAotI2RlZmluZSBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgMHg4MDkyCi0jZGVmaW5lIEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAweDgwQTgKLSNkZWZpbmUgR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBBOQotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0VfVkFMVUUgICAgICAgICAgMHg4MEFBCi0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAweDgwQUIKLQotLyogR2V0VGV4dHVyZVBhcmFtZXRlciAqLwotLyogICAgICBHTF9URVhUVVJFX01BR19GSUxURVIgKi8KLS8qICAgICAgR0xfVEVYVFVSRV9NSU5fRklMVEVSICovCi0vKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9TICovCi0vKiAgICAgIEdMX1RFWFRVUkVfV1JBUF9UICovCi0KLSNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgotI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCi0KLS8qIEhpbnRNb2RlICovCi0jZGVmaW5lIEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAweDExMDAKLSNkZWZpbmUgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMQotI2RlZmluZSBHTF9OSUNFU1QgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAyCi0KLS8qIEhpbnRUYXJnZXQgKi8KLSNkZWZpbmUgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgIDB4MEM1MAotI2RlZmluZSBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgMHgwQzUxCi0jZGVmaW5lIEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAweDBDNTIKLSNkZWZpbmUgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEM1NAotI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgMHg4MTkyCi0KLS8qIExpZ2h0TW9kZWxQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgIDB4MEI1MwotI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSAgICAgICAgICAgMHgwQjUyCi0KLS8qIExpZ2h0UGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDAKLSNkZWZpbmUgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMQotI2RlZmluZSBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAyCi0jZGVmaW5lIEdMX1BPU0lUSU9OICAgICAgICAgICAgICAgICAgICAgICAweDEyMDMKLSNkZWZpbmUgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgIDB4MTIwNAotI2RlZmluZSBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgMHgxMjA1Ci0jZGVmaW5lIEdMX1NQT1RfQ1VUT0ZGICAgICAgICAgICAgICAgICAgICAweDEyMDYKLSNkZWZpbmUgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgIDB4MTIwNwotI2RlZmluZSBHTF9MSU5FQVJfQVRURU5VQVRJT04gICAgICAgICAgICAgMHgxMjA4Ci0jZGVmaW5lIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAweDEyMDkKLQotLyogRGF0YVR5cGUgKi8KLSNkZWZpbmUgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMAotI2RlZmluZSBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgMHgxNDAxCi0jZGVmaW5lIEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDIKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgIDB4MTQwMwotI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2Ci0jZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKLQotLyogTG9naWNPcCAqLwotI2RlZmluZSBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAwCi0jZGVmaW5lIEdMX0FORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDEKLSNkZWZpbmUgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgIDB4MTUwMgotI2RlZmluZSBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAzCi0jZGVmaW5lIEdMX0FORF9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAweDE1MDQKLSNkZWZpbmUgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNQotI2RlZmluZSBHTF9YT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA2Ci0jZGVmaW5lIEdMX09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDcKLSNkZWZpbmUgR0xfTk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOAotI2RlZmluZSBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA5Ci0jZGVmaW5lIEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEEKLSNkZWZpbmUgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgIDB4MTUwQgotI2RlZmluZSBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgMHgxNTBDCi0jZGVmaW5lIEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAweDE1MEQKLSNkZWZpbmUgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRQotI2RlZmluZSBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBGCi0KLS8qIE1hdGVyaWFsRmFjZSAqLwotLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLwotCi0vKiBNYXRlcmlhbFBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxNjAwCi0jZGVmaW5lIEdMX1NISU5JTkVTUyAgICAgICAgICAgICAgICAgICAgICAweDE2MDEKLSNkZWZpbmUgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgIDB4MTYwMgotLyogICAgICBHTF9BTUJJRU5UICovCi0vKiAgICAgIEdMX0RJRkZVU0UgKi8KLS8qICAgICAgR0xfU1BFQ1VMQVIgKi8KLQotLyogTWF0cml4TW9kZSAqLwotI2RlZmluZSBHTF9NT0RFTFZJRVcgICAgICAgICAgICAgICAgICAgICAgMHgxNzAwCi0jZGVmaW5lIEdMX1BST0pFQ1RJT04gICAgICAgICAgICAgICAgICAgICAweDE3MDEKLSNkZWZpbmUgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMgotCi0vKiBOb3JtYWxQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9CWVRFICovCi0vKiAgICAgIEdMX1NIT1JUICovCi0vKiAgICAgIEdMX0ZMT0FUICovCi0vKiAgICAgIEdMX0ZJWEVEICovCi0KLS8qIFBpeGVsRm9ybWF0ICovCi0jZGVmaW5lIEdMX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDYKLSNkZWZpbmUgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNwotI2RlZmluZSBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA4Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAweDE5MDkKLSNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgIDB4MTkwQQotCi0vKiBQaXhlbFN0b3JlUGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAweDBDRjUKLSNkZWZpbmUgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgIDB4MEQwNQotCi0vKiBQaXhlbFR5cGUgKi8KLS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICAgICAgICAgMHg4MDMzCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAweDgwMzQKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgIDB4ODM2MwotCi0vKiBTaGFkaW5nTW9kZWwgKi8KLSNkZWZpbmUgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMAotI2RlZmluZSBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAxCi0KLS8qIFN0ZW5jaWxGdW5jdGlvbiAqLwotLyogICAgICBHTF9ORVZFUiAqLwotLyogICAgICBHTF9MRVNTICovCi0vKiAgICAgIEdMX0VRVUFMICovCi0vKiAgICAgIEdMX0xFUVVBTCAqLwotLyogICAgICBHTF9HUkVBVEVSICovCi0vKiAgICAgIEdMX05PVEVRVUFMICovCi0vKiAgICAgIEdMX0dFUVVBTCAqLwotLyogICAgICBHTF9BTFdBWVMgKi8KLQotLyogU3RlbmNpbE9wICovCi0vKiAgICAgIEdMX1pFUk8gKi8KLSNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAotI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCi0jZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKLSNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMwotLyogICAgICBHTF9JTlZFUlQgKi8KLQotLyogU3RyaW5nTmFtZSAqLwotI2RlZmluZSBHTF9WRU5ET1IgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAwCi0jZGVmaW5lIEdMX1JFTkRFUkVSICAgICAgICAgICAgICAgICAgICAgICAweDFGMDEKLSNkZWZpbmUgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMgotI2RlZmluZSBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgMHgxRjAzCi0KLS8qIFRleENvb3JkUG9pbnRlclR5cGUgKi8KLS8qICAgICAgR0xfU0hPUlQgKi8KLS8qICAgICAgR0xfRkxPQVQgKi8KLS8qICAgICAgR0xfRklYRUQgKi8KLS8qICAgICAgR0xfQllURSAqLwotCi0vKiBUZXh0dXJlRW52TW9kZSAqLwotI2RlZmluZSBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAwCi0jZGVmaW5lIEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAweDIxMDEKLS8qICAgICAgR0xfQkxFTkQgKi8KLSNkZWZpbmUgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwNAotLyogICAgICBHTF9SRVBMQUNFICovCi0KLS8qIFRleHR1cmVFbnZQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgIDB4MjIwMAotI2RlZmluZSBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgMHgyMjAxCi0KLS8qIFRleHR1cmVFbnZUYXJnZXQgKi8KLSNkZWZpbmUgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgIDB4MjMwMAotCi0vKiBUZXh0dXJlTWFnRmlsdGVyICovCi0jZGVmaW5lIEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDAKLSNkZWZpbmUgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMQotCi0vKiBUZXh0dXJlTWluRmlsdGVyICovCi0vKiAgICAgIEdMX05FQVJFU1QgKi8KLS8qICAgICAgR0xfTElORUFSICovCi0jZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAweDI3MDAKLSNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgIDB4MjcwMQotI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9MSU5FQVIgICAgICAgICAgMHgyNzAyCi0jZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAweDI3MDMKLQotLyogVGV4dHVyZVBhcmFtZXRlck5hbWUgKi8KLSNkZWZpbmUgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgIDB4MjgwMAotI2RlZmluZSBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgMHgyODAxCi0jZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAweDI4MDIKLSNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgIDB4MjgwMwotI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgMHg4MTkxCi0KLS8qIFRleHR1cmVUYXJnZXQgKi8KLS8qICAgICAgR0xfVEVYVFVSRV8yRCAqLwotCi0vKiBUZXh0dXJlVW5pdCAqLwotI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCi0jZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKLSNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgotI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCi0jZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKLSNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQotI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2Ci0jZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKLSNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAotI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5Ci0jZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKLSNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgotI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCi0jZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKLSNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQotI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCi0jZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKLSNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQotI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCi0jZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKLSNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAotI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKLSNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENwotI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKLSNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQotI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCi0jZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKLSNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAotI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCi0jZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKLSNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgIDB4ODRFMAotI2RlZmluZSBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgMHg4NEUxCi0KLS8qIFRleHR1cmVXcmFwTW9kZSAqLwotI2RlZmluZSBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgMHgyOTAxCi0jZGVmaW5lIEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAweDgxMkYKLQotLyogVmVydGV4UG9pbnRlclR5cGUgKi8KLS8qICAgICAgR0xfU0hPUlQgKi8KLS8qICAgICAgR0xfRkxPQVQgKi8KLS8qICAgICAgR0xfRklYRUQgKi8KLS8qICAgICAgR0xfQllURSAqLwotCi0vKiBMaWdodE5hbWUgKi8KLSNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAotI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCi0jZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKLSNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMwotI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0Ci0jZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKLSNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgotI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3Ci0KLS8qIEJ1ZmZlciBPYmplY3RzICovCi0jZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MwotCi0jZGVmaW5lIEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgMHg4ODk0Ci0jZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgMHg4ODk1Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgMHg4ODk2Ci0jZGVmaW5lIEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgMHg4ODk3Ci0jZGVmaW5lIEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgMHg4ODk4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlBCi0KLSNkZWZpbmUgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgIDB4ODhFNAotI2RlZmluZSBHTF9EWU5BTUlDX0RSQVcgICAgICAgICAgICAgICAgICAgMHg4OEU4Ci0KLSNkZWZpbmUgR0xfQlVGRkVSX1NJWkUgICAgICAgICAgICAgICAgICAgIDB4ODc2NAotI2RlZmluZSBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgMHg4NzY1Ci0KLS8qIFRleHR1cmUgY29tYmluZSArIGRvdDMgKi8KLSNkZWZpbmUgR0xfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgIDB4ODRFNwotI2RlZmluZSBHTF9DT01CSU5FICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTcwCi0jZGVmaW5lIEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAweDg1NzEKLSNkZWZpbmUgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgIDB4ODU3MgotI2RlZmluZSBHTF9SR0JfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMHg4NTczCi0jZGVmaW5lIEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAweDg1NzQKLSNkZWZpbmUgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgIDB4ODU3NQotI2RlZmluZSBHTF9DT05TVEFOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4NTc2Ci0jZGVmaW5lIEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAweDg1NzcKLSNkZWZpbmUgR0xfUFJFVklPVVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODU3OAotI2RlZmluZSBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgMHg4NTkwCi0jZGVmaW5lIEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAweDg1OTEKLSNkZWZpbmUgR0xfT1BFUkFORDJfUkdCICAgICAgICAgICAgICAgICAgIDB4ODU5MgotI2RlZmluZSBHTF9PUEVSQU5EMF9BTFBIQSAgICAgICAgICAgICAgICAgMHg4NTk4Ci0jZGVmaW5lIEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAweDg1OTkKLSNkZWZpbmUgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgIDB4ODU5QQotCi0jZGVmaW5lIEdMX0FMUEhBX1NDQUxFICAgICAgICAgICAgICAgICAgICAweDBEMUMKLQotI2RlZmluZSBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgMHg4NTgwCi0jZGVmaW5lIEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg1ODEKLSNkZWZpbmUgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgIDB4ODU4MgotI2RlZmluZSBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgMHg4NTg4Ci0jZGVmaW5lIEdMX1NSQzFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAweDg1ODkKLSNkZWZpbmUgR0xfU1JDMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgIDB4ODU4QQotCi0jZGVmaW5lIEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAweDg2QUUKLSNkZWZpbmUgR0xfRE9UM19SR0JBICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIHJlcXVpcmVkIE9FUyBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIE9FU19yZWFkX2Zvcm1hdCAqLwotI2lmbmRlZiBHTF9PRVNfcmVhZF9mb3JtYXQKLSNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICAgICAgICAgICAgICAgICAweDhCOUEKLSNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICAweDhCOUIKLSNlbmRpZgotCi0vKiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTAKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTEKLSNkZWZpbmUgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTIKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTMKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTQKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTUKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTYKLSNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTcKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTgKLSNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCOTkKLSNlbmRpZgotCi0vKiBPRVNfcG9pbnRfc2l6ZV9hcnJheSAqLwotI2lmbmRlZiBHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheQotI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5QwotI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QQotI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QgotI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODk4QwotI2RlZmluZSBHTF9QT0lOVF9TSVpFX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgIDB4OEI5RgotI2VuZGlmCi0KLS8qIEdMX09FU19wb2ludF9zcHJpdGUgKi8KLSNpZm5kZWYgR0xfT0VTX3BvaW50X3Nwcml0ZQotI2RlZmluZSBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2MQotI2RlZmluZSBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg2MgotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBdmFpbGFibGUgb25seSBpbiBDb21tb24gcHJvZmlsZSAqLwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBbHBoYUZ1bmMgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZWYgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjRmIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhSYW5nZWYgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9nZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRm9nZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bWYgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmVmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0RmxvYXR2IChHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldExpZ2h0ZnYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZmdiAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0ZiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodGZ2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbGYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsM2YgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xPcnRob2YgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcmYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJvdGF0ZWYgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2FsZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLQotLyogQXZhaWxhYmxlIGluIGJvdGggQ29tbW9uIGFuZCBDb21tb24tTGl0ZSBwcm9maWxlcyAqLwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEFscGhhRnVuY3ggKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCaW5kQnVmZmVyIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFRleHR1cmUgKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckNvbG9yeCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoeCAoR0xjbGFtcHggZGVwdGgpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZXggKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvcjR1YiAoR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNHggKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDdWxsRmFjZSAoR0xlbnVtIG1vZGUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVCdWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGUgKEdMZW51bSBjYXApOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdFbGVtZW50cyAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoICh2b2lkKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRnJ1c3R1bXggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCb29sZWFudiAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmV4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgZXFuWzRdKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuQnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKLUdMX0FQSSBHTGVudW0gR0xfQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZpeGVkdiAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBvaW50ZXJ2IChHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcyk7Ci1HTF9BUEkgY29uc3QgR0x1Ynl0ZSAqIEdMX0FQSUVOVFJZIGdsR2V0U3RyaW5nIChHTGVudW0gbmFtZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEVudml2IChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhFbnZ4diAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0VGV4UGFyYW1ldGVyeHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsSGludCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUpOwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQgYnVmZmVyKTsKLUdMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0VuYWJsZWQgKEdMZW51bSBjYXApOwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzVGV4dHVyZSAoR0x1aW50IHRleHR1cmUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVseCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHRNb2RlbHh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0eCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodHh2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoeCAoR0xmaXhlZCB3aWR0aCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExvYWRJZGVudGl0eSAodm9pZCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExvYWRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9naWNPcCAoR0xlbnVtIG9wY29kZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdGVyaWFseHYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdHJpeE1vZGUgKEdMZW51bSBtb2RlKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHggKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE5vcm1hbDN4IChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsUG9pbnRlciAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xPcnRob3ggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRQYXJhbWV0ZXJ4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemV4IChHTGZpeGVkIHNpemUpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0eCAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb3BNYXRyaXggKHZvaWQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQdXNoTWF0cml4ICh2b2lkKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVhZFBpeGVscyAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFJvdGF0ZXggKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZXggKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2NhbGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTaGFkZU1vZGVsIChHTGVudW0gbW9kZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEVudmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4RW52eHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyeCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4UGFyYW1ldGVyaXYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcnh2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVHJhbnNsYXRleCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBSZXF1aXJlZCBPRVMgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9PRVNfcmVhZF9mb3JtYXQgKi8KLSNpZm5kZWYgR0xfT0VTX3JlYWRfZm9ybWF0Ci0jZGVmaW5lIEdMX09FU19yZWFkX2Zvcm1hdCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlCi0jZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgMQotI2VuZGlmCi0KLS8qIEdMX09FU19wb2ludF9zaXplX2FycmF5ICovCi0jaWZuZGVmIEdMX09FU19wb2ludF9zaXplX2FycmF5Ci0jZGVmaW5lIEdMX09FU19wb2ludF9zaXplX2FycmF5IDEKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplUG9pbnRlck9FUyAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotI2VuZGlmCi0KLS8qIEdMX09FU19wb2ludF9zcHJpdGUgKi8KLSNpZm5kZWYgR0xfT0VTX3BvaW50X3Nwcml0ZQotI2RlZmluZSBHTF9PRVNfcG9pbnRfc3ByaXRlIDEKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19nbF9oXyAqLwotCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dsZXh0LmggYi9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dsZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YWZhYWIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvR0xFUy9nbGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0jaWZuZGVmIF9fZ2xleHRfaF8KLSNkZWZpbmUgX19nbGV4dF9oXwotCi0vKiAkUmV2aXNpb246IDE2NDgxICQgb24gJERhdGU6OiAyMDEyLTAxLTA0IDEwOjQzOjU2IC0wODAwICMkICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyoKLSAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCi0gKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCi0gKi8KLQotI2lmbmRlZiBHTF9BUElFTlRSWVAKLSMgICBkZWZpbmUgR0xfQVBJRU5UUllQIEdMX0FQSUVOVFJZKgotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogT0VTIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlICovCi0jaWZuZGVmIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZQotLyogQkxFTkRfRVFVQVRJT05fUkdCX09FUyBzYW1lIGFzIEJMRU5EX0VRVUFUSU9OX09FUyAqLwotI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9SR0JfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOQotI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9BTFBIQV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgzRAotI2VuZGlmCi0KLS8qIEdMX09FU19ibGVuZF9mdW5jX3NlcGFyYXRlICovCi0jaWZuZGVmIEdMX09FU19ibGVuZF9mdW5jX3NlcGFyYXRlCi0jZGVmaW5lIEdMX0JMRU5EX0RTVF9SR0JfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEM4Ci0jZGVmaW5lIEdMX0JMRU5EX1NSQ19SR0JfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEM5Ci0jZGVmaW5lIEdMX0JMRU5EX0RTVF9BTFBIQV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MENBCi0jZGVmaW5lIEdMX0JMRU5EX1NSQ19BTFBIQV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MENCCi0jZW5kaWYKLQotLyogR0xfT0VTX2JsZW5kX3N1YnRyYWN0ICovCi0jaWZuZGVmIEdMX09FU19ibGVuZF9zdWJ0cmFjdAotI2RlZmluZSBHTF9CTEVORF9FUVVBVElPTl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwOQotI2RlZmluZSBHTF9GVU5DX0FERF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwNgotI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwQQotI2RlZmluZSBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwQgotI2VuZGlmCi0KLS8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCi0jZGVmaW5lIEdMX0VUQzFfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY0Ci0jZW5kaWYKLQotLyogR0xfT0VTX2RlcHRoMjQgKi8KLSNpZm5kZWYgR0xfT0VTX2RlcHRoMjQKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTYKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGgzMiAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGgzMgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNwotI2VuZGlmCi0KLS8qIEdMX09FU19kcmF3X3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfT0VTX2RyYXdfdGV4dHVyZQotI2RlZmluZSBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI5RAotI2VuZGlmCi0KLS8qIEdMX09FU19FR0xfaW1hZ2UgKi8KLSNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQotdHlwZWRlZiB2b2lkKiBHTGVnbEltYWdlT0VTOwotI2VuZGlmCi0KLS8qIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgKi8KLSNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbAotLyogR0xlZ2xJbWFnZU9FUyBkZWZpbmVkIGluIEdMX09FU19FR0xfaW1hZ2UgYWxyZWFkeS4gKi8KLSNkZWZpbmUgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjUKLSNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0VYVEVSTkFMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjcKLSNkZWZpbmUgR0xfUkVRVUlSRURfVEVYVFVSRV9JTUFHRV9VTklUU19PRVMgICAgICAgICAgICAgICAgICAgICAweDhENjgKLSNlbmRpZgotCi0vKiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50ICovCi0jaWZuZGVmIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDUKLSNlbmRpZgotCi0vKiBHTF9PRVNfZml4ZWRfcG9pbnQgKi8KLSNpZm5kZWYgR0xfT0VTX2ZpeGVkX3BvaW50Ci0jZGVmaW5lIEdMX0ZJWEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCi0jZW5kaWYKLQotLyogR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCAqLwotI2lmbmRlZiBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0Ci0jZGVmaW5lIEdMX05PTkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MQotI2RlZmluZSBHTF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NgotI2RlZmluZSBHTF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NwotI2RlZmluZSBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ2MgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQxNl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNQotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0MwotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MQotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1MwotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ1NQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgICAgIDB4OENEMAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUyAgICAgICAgICAgICAgIDB4OENEMQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTICAgICAgICAgICAgIDB4OENEMgotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRV9PRVMgICAgIDB4OENEMwotI2RlZmluZSBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENFMAotI2RlZmluZSBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQyMAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENENQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgIDB4OENENgotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgICAgIDB4OENENwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgICAgIDB4OENEOQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgICAgIDB4OENEQQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENERAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNwotI2RlZmluZSBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRFOAotI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMgICAgICAgICAgICAgICAgICAgIDB4MDUwNgotI2VuZGlmCi0KLS8qIEdMX09FU19tYXBidWZmZXIgKi8KLSNpZm5kZWYgR0xfT0VTX21hcGJ1ZmZlcgotI2RlZmluZSBHTF9XUklURV9PTkxZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCOQotI2RlZmluZSBHTF9CVUZGRVJfQUNDRVNTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQgotI2RlZmluZSBHTF9CVUZGRVJfTUFQUEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCQwotI2RlZmluZSBHTF9CVUZGRVJfTUFQX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODhCRAotI2VuZGlmCi0KLS8qIEdMX09FU19tYXRyaXhfZ2V0ICovCi0jaWZuZGVmIEdMX09FU19tYXRyaXhfZ2V0Ci0jZGVmaW5lIEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICAgMHg4OThECi0jZGVmaW5lIEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgMHg4OThFCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICAgICAgICAgICAgICAgMHg4OThGCi0jZW5kaWYKLQotLyogR0xfT0VTX21hdHJpeF9wYWxldHRlICovCi0jaWZuZGVmIEdMX09FU19tYXRyaXhfcGFsZXR0ZQotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBNAotI2RlZmluZSBHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MgotI2RlZmluZSBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MAotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NAotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBRAotI2RlZmluZSBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0MwotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NgotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0NwotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0OAotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0OQotI2RlZmluZSBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgIDB4OEI5RQotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQgotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBOQotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQQotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODZBQwotI2RlZmluZSBHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgIDB4ODg5RQotI2VuZGlmCi0KLS8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLwotI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKLSNkZWZpbmUgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RjkKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzI0XzhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkEKLSNkZWZpbmUgR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4RjAKLSNlbmRpZgotCi0vKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLwotI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAotI2RlZmluZSBHTF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1MQotI2RlZmluZSBHTF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OAotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsMSAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKLSNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDYKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbDQgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0Ci0jZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDQ3Ci0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWw4ICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsOAotI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0OAotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsX3dyYXAgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWxfd3JhcAotI2RlZmluZSBHTF9JTkNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwNwotI2RlZmluZSBHTF9ERUNSX1dSQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX2N1YmVfbWFwCi0jZGVmaW5lIEdMX05PUk1BTF9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTExCi0jZGVmaW5lIEdMX1JFRkxFQ1RJT05fTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTEyCi0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTEzCi0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTE0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTE5Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9PRVMgICAgICAgICAgICAgICAgICAgICAgMHg4NTFBCi0jZGVmaW5lIEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgMHg4NTFDCi0jZGVmaW5lIEdMX1RFWFRVUkVfR0VOX01PREVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNTAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfR0VOX1NUUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDYwCi0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0ICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdAotI2RlZmluZSBHTF9NSVJST1JFRF9SRVBFQVRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODM3MAotI2VuZGlmCi0KLS8qIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0ICovCi0jaWZuZGVmIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NUI1Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBTUQgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BTURfY29tcHJlc3NlZF8zRENfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF8zRENfdGV4dHVyZQotI2RlZmluZSBHTF8zRENfWF9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdGOQotI2RlZmluZSBHTF8zRENfWFlfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODdGQQotI2VuZGlmCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkX0FUQ190ZXh0dXJlCi0jZGVmaW5lIEdMX0FUQ19SR0JfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzkyCi0jZGVmaW5lIEdMX0FUQ19SR0JBX0VYUExJQ0lUX0FMUEhBX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzkzCi0jZGVmaW5lIEdMX0FUQ19SR0JBX0lOVEVSUE9MQVRFRF9BTFBIQV9BTUQgICAgICAgICAgICAgICAgICAgICAgMHg4N0VFCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUFBMRSBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfMkRfbGltaXRlZF9ucG90ICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCi0jaWZuZGVmIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0FCCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfQVBQTEUgICAgICAgICAgICAgMHg4RDU2Ci0jZGVmaW5lIEdMX01BWF9TQU1QTEVTX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDU3Ci0jZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E4Ci0jZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E5Ci0jZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElOR19BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E2Ci0jZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0FBCi0jZW5kaWYKLQotLyogR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAqLwotI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbAotI2RlZmluZSBHTF9URVhUVVJFX01BWF9MRVZFTF9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODEzRAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQVJNIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQVJNX3JnYmE4ICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRVhUIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfRVhUX2JsZW5kX21pbm1heCAqLwotI2lmbmRlZiBHTF9FWFRfYmxlbmRfbWlubWF4Ci0jZGVmaW5lIEdMX01JTl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3Ci0jZGVmaW5lIEdMX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA4Ci0jZW5kaWYKLQotLyogR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgKi8KLSNpZm5kZWYgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIKLSNkZWZpbmUgR0xfQ09MT1JfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDAKLSNkZWZpbmUgR0xfREVQVEhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDEKLSNkZWZpbmUgR0xfU1RFTkNJTF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDIKLSNlbmRpZgotCi0vKiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX1NBTVBMRVNfRVhUICAgICAgICAgICAweDhENkMKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzMKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9FWFQgICAgICAgICAgICAgICAweDkxMzQKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzUKLSNlbmRpZgotCi0vKiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfRVhUX3JlYWRfZm9ybWF0X2JncmEgKi8KLSNpZm5kZWYgR0xfRVhUX3JlYWRfZm9ybWF0X2JncmEKLSNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNF9SRVZfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgzNjUKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfMV81XzVfNV9SRVZfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDgzNjYKLSNlbmRpZgotCi0vKiBHTF9FWFRfcm9idXN0bmVzcyAqLwotI2lmbmRlZiBHTF9FWFRfcm9idXN0bmVzcwotLyogcmV1c2UgR0xfTk9fRVJST1IgKi8KLSNkZWZpbmUgR0xfR1VJTFRZX0NPTlRFWFRfUkVTRVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNTMKLSNkZWZpbmUgR0xfSU5OT0NFTlRfQ09OVEVYVF9SRVNFVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNTQKLSNkZWZpbmUgR0xfVU5LTk9XTl9DT05URVhUX1JFU0VUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNTUKLSNkZWZpbmUgR0xfQ09OVEVYVF9ST0JVU1RfQUNDRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkwRjMKLSNkZWZpbmUgR0xfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgyNTYKLSNkZWZpbmUgR0xfTE9TRV9DT05URVhUX09OX1JFU0VUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNTIKLSNkZWZpbmUgR0xfTk9fUkVTRVRfTk9USUZJQ0FUSU9OX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNjEKLSNlbmRpZgotCi0vKiBHTF9FWFRfc1JHQiAqLwotI2lmbmRlZiBHTF9FWFRfc1JHQgotI2RlZmluZSBHTF9TUkdCX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MAotI2RlZmluZSBHTF9TUkdCX0FMUEhBX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MgotI2RlZmluZSBHTF9TUkdCOF9BTFBIQThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEM0MwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTE9SX0VOQ09ESU5HX0VYVCAgICAgICAgICAgIDB4ODIxMAotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MQotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODNGMAotI2RlZmluZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDB4ODNGMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMKLSNkZWZpbmUgR0xfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkUKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAgICAgICAgICAgICAgICAgICAweDg0RkYKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4Ci0jZGVmaW5lIEdMX0JHUkFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfTE9EX0JJQVNfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0RkQKLSNkZWZpbmUgR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MDAKLSNkZWZpbmUgR0xfVEVYVFVSRV9MT0RfQklBU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1MDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UKLSNkZWZpbmUgR0xfVEVYVFVSRV9JTU1VVEFCTEVfRk9STUFUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMkYKLSNkZWZpbmUgR0xfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwM0MgIAotI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0MAotI2RlZmluZSBHTF9MVU1JTkFOQ0U4X0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA0NQotI2RlZmluZSBHTF9SR0JBMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxNCAgCi0jZGVmaW5lIEdMX1JHQjMyRl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE1Ci0jZGVmaW5lIEdMX0FMUEhBMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE2Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRTMyRl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE4Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTMyRl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE5Ci0vKiByZXVzZSBHTF9SR0JBMTZGX0VYVCAqLwotI2RlZmluZSBHTF9SR0IxNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQgotI2RlZmluZSBHTF9BTFBIQTE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQwotI2RlZmluZSBHTF9MVU1JTkFOQ0UxNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxRQotI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEExNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxRgotI2RlZmluZSBHTF9SR0IxMF9BMl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1OSAgCi0jZGVmaW5lIEdMX1JHQjEwX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDUyCi0jZGVmaW5lIEdMX0JHUkE4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5M0ExCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBJTUcgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9JTUdfcmVhZF9mb3JtYXQgKi8KLSNpZm5kZWYgR0xfSU1HX3JlYWRfZm9ybWF0Ci0jZGVmaW5lIEdMX0JHUkFfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEUxCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzRfUkVWX0lNRyAgICAgICAgICAgICAgICAgICAgICAgMHg4MzY1Ci0jZW5kaWYKLQotLyogR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgKi8KLSNpZm5kZWYgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgICAweDhDMDAKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgICAweDhDMDEKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcgICAgICAgICAgICAgICAgICAgICAweDhDMDIKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUcgICAgICAgICAgICAgICAgICAgICAweDhDMDMKLSNlbmRpZgotCi0vKiBHTF9JTUdfdGV4dHVyZV9lbnZfZW5oYW5jZWRfZml4ZWRfZnVuY3Rpb24gKi8KLSNpZm5kZWYgR0xfSU1HX3RleHR1cmVfZW52X2VuaGFuY2VkX2ZpeGVkX2Z1bmN0aW9uCi0jZGVmaW5lIEdMX01PRFVMQVRFX0NPTE9SX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzA0Ci0jZGVmaW5lIEdMX1JFQ0lQX0FERF9TSUdORURfQUxQSEFfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzA1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQUxQSEFfTU9EVUxBVEVfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzA2Ci0jZGVmaW5lIEdMX0ZBQ1RPUl9BTFBIQV9NT0RVTEFURV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzA3Ci0jZGVmaW5lIEdMX0ZSQUdNRU5UX0FMUEhBX01PRFVMQVRFX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzA4Ci0jZGVmaW5lIEdMX0FERF9CTEVORF9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzA5Ci0jZGVmaW5lIEdMX0RPVDNfUkdCQV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NkFGCi0jZW5kaWYKLQotLyogR0xfSU1HX3VzZXJfY2xpcF9wbGFuZSAqLwotI2lmbmRlZiBHTF9JTUdfdXNlcl9jbGlwX3BsYW5lCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUwX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUxX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUyX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAyCi0jZGVmaW5lIEdMX0NMSVBfUExBTkUzX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAzCi0jZGVmaW5lIEdMX0NMSVBfUExBTkU0X0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA0Ci0jZGVmaW5lIEdMX0NMSVBfUExBTkU1X0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDA1Ci0jZGVmaW5lIEdMX01BWF9DTElQX1BMQU5FU19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRDMyCi0jZW5kaWYKLQotLyogR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTMzCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfSU1HICAgICAgICAgICAgICAgMHg5MTM0Ci0jZGVmaW5lIEdMX01BWF9TQU1QTEVTX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTM1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfU0FNUExFU19JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTM2Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBOViBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX05WX2ZlbmNlICovCi0jaWZuZGVmIEdMX05WX2ZlbmNlCi0jZGVmaW5lIEdMX0FMTF9DT01QTEVURURfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEYyCi0jZGVmaW5lIEdMX0ZFTkNFX1NUQVRVU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEYzCi0jZGVmaW5lIEdMX0ZFTkNFX0NPTkRJVElPTl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEY0Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBRQ09NIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfUUNPTV9kcml2ZXJfY29udHJvbCAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9RQ09NX2V4dGVuZGVkX2dldCAqLwotI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldAotI2RlZmluZSBHTF9URVhUVVJFX1dJRFRIX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEMgotI2RlZmluZSBHTF9URVhUVVJFX0hFSUdIVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEMwotI2RlZmluZSBHTF9URVhUVVJFX0RFUFRIX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENAotI2RlZmluZSBHTF9URVhUVVJFX0lOVEVSTkFMX0ZPUk1BVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENQotI2RlZmluZSBHTF9URVhUVVJFX0ZPUk1BVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENgotI2RlZmluZSBHTF9URVhUVVJFX1RZUEVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJENwotI2RlZmluZSBHTF9URVhUVVJFX0lNQUdFX1ZBTElEX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEOAotI2RlZmluZSBHTF9URVhUVVJFX05VTV9MRVZFTFNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEOQotI2RlZmluZSBHTF9URVhUVVJFX1RBUkdFVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEQQotI2RlZmluZSBHTF9URVhUVVJFX09CSkVDVF9WQUxJRF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEQgotI2RlZmluZSBHTF9TVEFURV9SRVNUT1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJEQwotI2VuZGlmCi0KLS8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MiAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUgKi8KLSNpZm5kZWYgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlCi0jZGVmaW5lIEdMX1BFUkZNT05fR0xPQkFMX01PREVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RkEwCi0jZW5kaWYKLQotLyogR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nICovCi0jaWZuZGVmIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZwotI2RlZmluZSBHTF9XUklURU9OTFlfUkVOREVSSU5HX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgyMwotI2VuZGlmCi0KLS8qIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nICovCi0jaWZuZGVmIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQwX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUMV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDJfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQzX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUNF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDVfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ2X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUN19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEVuZCBvZiBleHRlbnNpb24gdG9rZW5zLCBzdGFydCBvZiBjb3JyZXNwb25kaW5nIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBPRVMgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUgKi8KLSNpZm5kZWYgR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlCi0jZGVmaW5lIEdMX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OU0VQQVJBVEVPRVNQUk9DKSAoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpOwotI2VuZGlmCi0KLS8qIEdMX09FU19ibGVuZF9mdW5jX3NlcGFyYXRlICovCi0jaWZuZGVmIEdMX09FU19ibGVuZF9mdW5jX3NlcGFyYXRlCi0jZGVmaW5lIEdMX09FU19ibGVuZF9mdW5jX3NlcGFyYXRlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTIChHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxFTkRGVU5DU0VQQVJBVEVPRVNQUk9DKSAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwotI2VuZGlmCi0KLS8qIEdMX09FU19ibGVuZF9zdWJ0cmFjdCAqLwotI2lmbmRlZiBHTF9PRVNfYmxlbmRfc3VidHJhY3QKLSNkZWZpbmUgR0xfT0VTX2JsZW5kX3N1YnRyYWN0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb25PRVMgKEdMZW51bSBtb2RlKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xCTEVOREVRVUFUSU9OT0VTUFJPQykgKEdMZW51bSBtb2RlKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfYnl0ZV9jb29yZGluYXRlcyAqLwotI2lmbmRlZiBHTF9PRVNfYnl0ZV9jb29yZGluYXRlcwotI2RlZmluZSBHTF9PRVNfYnl0ZV9jb29yZGluYXRlcyAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKLSNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgMQotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aDI0ICovCi0jaWZuZGVmIEdMX09FU19kZXB0aDI0Ci0jZGVmaW5lIEdMX09FU19kZXB0aDI0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGgzMiAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGgzMgotI2RlZmluZSBHTF9PRVNfZGVwdGgzMiAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2RyYXdfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfZHJhd190ZXh0dXJlCi0jZGVmaW5lIEdMX09FU19kcmF3X3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleHNPRVMgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleGlPRVMgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4eE9FUyAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEcmF3VGV4c3ZPRVMgKGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXhpdk9FUyAoY29uc3QgR0xpbnQgKmNvb3Jkcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdUZXh4dk9FUyAoY29uc3QgR0xmaXhlZCAqY29vcmRzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleGZPRVMgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRHJhd1RleGZ2T0VTIChjb25zdCBHTGZsb2F0ICpjb29yZHMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhTT0VTUFJPQykgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWElPRVNQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhYT0VTUFJPQykgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWFNWT0VTUFJPQykgKGNvbnN0IEdMc2hvcnQgKmNvb3Jkcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhJVk9FU1BST0MpIChjb25zdCBHTGludCAqY29vcmRzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWFhWT0VTUFJPQykgKGNvbnN0IEdMZml4ZWQgKmNvb3Jkcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERSQVdURVhGT0VTUFJPQykgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRFJBV1RFWEZWT0VTUFJPQykgKGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZSAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlCi0jZGVmaW5lIEdMX09FU19FR0xfaW1hZ2UgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVHTElNQUdFVEFSR0VUVEVYVFVSRTJET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFJFTkRFUkJVRkZFUlNUT1JBR0VPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsCi0jZGVmaW5lIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgMQotLyogZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyBkZWZpbmVkIGluIEdMX09FU19FR0xfaW1hZ2UgYWxyZWFkeS4gKi8KLSNlbmRpZgotCi0vKiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50ICovCi0jaWZuZGVmIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQKLSNkZWZpbmUgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2V4dGVuZGVkX21hdHJpeF9wYWxldHRlICovCi0jaWZuZGVmIEdMX09FU19leHRlbmRlZF9tYXRyaXhfcGFsZXR0ZQotI2RlZmluZSBHTF9PRVNfZXh0ZW5kZWRfbWF0cml4X3BhbGV0dGUgMQotI2VuZGlmCi0KLS8qIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcCAqLwotI2lmbmRlZiBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAKLSNkZWZpbmUgR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZml4ZWRfcG9pbnQgKi8KLSNpZm5kZWYgR0xfT0VTX2ZpeGVkX3BvaW50Ci0jZGVmaW5lIEdMX09FU19maXhlZF9wb2ludCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xBbHBoYUZ1bmN4T0VTIChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJDb2xvcnhPRVMgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJEZXB0aHhPRVMgKEdMY2xhbXB4IGRlcHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5leE9FUyAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yNHhPRVMgKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aFJhbmdleE9FUyAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4T0VTIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGb2d4dk9FUyAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcnVzdHVteE9FUyAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldENsaXBQbGFuZXhPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRGaXhlZHZPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0TGlnaHR4dk9FUyAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldE1hdGVyaWFseHZPRVMgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEVudnh2T0VTIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleFBhcmFtZXRlcnh2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0TW9kZWx4T0VTIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaWdodE1vZGVseHZPRVMgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTGlnaHR4T0VTIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExpZ2h0eHZPRVMgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xMaW5lV2lkdGh4T0VTIChHTGZpeGVkIHdpZHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTG9hZE1hdHJpeHhPRVMgKGNvbnN0IEdMZml4ZWQgKm0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbHhPRVMgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNYXRlcmlhbHh2T0VTIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0TWF0cml4eE9FUyAoY29uc3QgR0xmaXhlZCAqbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0eE9FUyAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsM3hPRVMgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xPcnRob3hPRVMgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFBhcmFtZXRlcnhPRVMgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50UGFyYW1ldGVyeHZPRVMgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXpleE9FUyAoR0xmaXhlZCBzaXplKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9seWdvbk9mZnNldHhPRVMgKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUm90YXRleE9FUyAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleE9FUyAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTY2FsZXhPRVMgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZ4T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhFbnZ4dk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4dk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUcmFuc2xhdGV4T0VTIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xBTFBIQUZVTkNYT0VTUFJPQykgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDTEVBUkNPTE9SWE9FU1BST0MpIChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMRUFSREVQVEhYT0VTUFJPQykgKEdMY2xhbXB4IGRlcHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ0xJUFBMQU5FWE9FU1BST0MpIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09MT1I0WE9FU1BST0MpIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVQVEhSQU5HRVhPRVNQUk9DKSAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGT0dYT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZPR1hWT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRlJVU1RVTVhPRVNQUk9DKSAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVENMSVBQTEFORVhPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZJWEVEVk9FU1BST0MpIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVExJR0hUWFZPRVNQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE1BVEVSSUFMWFZPRVNQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUVEVYRU5WWFZPRVNQUk9DKSAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhQQVJBTUVURVJYVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExJR0hUTU9ERUxYT0VTUFJPQykgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExJR0hUTU9ERUxYVk9FU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExJR0hUWE9FU1BST0MpIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExJR0hUWFZPRVNQUk9DKSAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExJTkVXSURUSFhPRVNQUk9DKSAoR0xmaXhlZCB3aWR0aCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExPQURNQVRSSVhYT0VTUFJPQykgKGNvbnN0IEdMZml4ZWQgKm0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xNQVRFUklBTFhPRVNQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1BVEVSSUFMWFZPRVNQUk9DKSAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVE1BVFJJWFhPRVNQUk9DKSAoY29uc3QgR0xmaXhlZCAqbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1VTFRJVEVYQ09PUkQ0WE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xOT1JNQUwzWE9FU1BST0MpIChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMT1JUSE9YT0VTUFJPQykgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQT0lOVFBBUkFNRVRFUlhPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9JTlRQQVJBTUVURVJYVk9FU1BST0MpIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBPSU5UU0laRVhPRVNQUk9DKSAoR0xmaXhlZCBzaXplKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9MWUdPTk9GRlNFVFhPRVNQUk9DKSAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xST1RBVEVYT0VTUFJPQykgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xTQU1QTEVDT1ZFUkFHRVhPRVNQUk9DKSAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xTQ0FMRVhPRVNQUk9DKSAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEVOVlhPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYRU5WWFZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhQQVJBTUVURVJYT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFBBUkFNRVRFUlhWT0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVFJBTlNMQVRFWE9FU1BST0MpIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0ICovCi0jaWZuZGVmIEdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLSNkZWZpbmUgR0xfT0VTX2ZyYW1lYnVmZmVyX29iamVjdCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyT0VTIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUmVuZGVyYnVmZmVyc09FUyAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlck9FUyAoR0x1aW50IGZyYW1lYnVmZmVyKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZEZyYW1lYnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotR0xfQVBJIEdMZW51bSBHTF9BUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgKEdMZW51bSB0YXJnZXQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuZXJhdGVNaXBtYXBPRVMgKEdMZW51bSB0YXJnZXQpOwotI2VuZGlmCi10eXBlZGVmIEdMYm9vbGVhbiAoR0xfQVBJRU5UUllQIFBGTkdMSVNSRU5ERVJCVUZGRVJPRVNQUk9DKSAoR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJJTkRSRU5ERVJCVUZGRVJPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURVJFTkRFUkJVRkZFUlNPRVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5SRU5ERVJCVUZGRVJTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVOREVSQlVGRkVSU1RPUkFHRU9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUkVOREVSQlVGRkVSUEFSQU1FVEVSSVZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU0ZSQU1FQlVGRkVST0VTUFJPQykgKEdMdWludCBmcmFtZWJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJJTkRGUkFNRUJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVGUkFNRUJVRkZFUlNPRVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTkZSQU1FQlVGRkVSU09FU1BST0MpIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKTsKLXR5cGVkZWYgR0xlbnVtIChHTF9BUElFTlRSWVAgUEZOR0xDSEVDS0ZSQU1FQlVGRkVSU1RBVFVTT0VTUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlJFTkRFUkJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTJET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRGUkFNRUJVRkZFUkFUVEFDSE1FTlRQQVJBTUVURVJJVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VORVJBVEVNSVBNQVBPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX21hcGJ1ZmZlciAqLwotI2lmbmRlZiBHTF9PRVNfbWFwYnVmZmVyCi0jZGVmaW5lIEdMX09FU19tYXBidWZmZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkKiBHTF9BUElFTlRSWSBnbE1hcEJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Ci1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsVW5tYXBCdWZmZXJPRVMgKEdMZW51bSB0YXJnZXQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRCdWZmZXJQb2ludGVydk9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKiogcGFyYW1zKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkKiAoR0xfQVBJRU5UUllQIFBGTkdMTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFVOTUFQQlVGRkVST0VTUFJPQykgKEdMZW51bSB0YXJnZXQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRCVUZGRVJQT0lOVEVSVk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqKiBwYXJhbXMpOwotI2VuZGlmCi0KLS8qIEdMX09FU19tYXRyaXhfZ2V0ICovCi0jaWZuZGVmIEdMX09FU19tYXRyaXhfZ2V0Ci0jZGVmaW5lIEdMX09FU19tYXRyaXhfZ2V0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfbWF0cml4X3BhbGV0dGUgKi8KLSNpZm5kZWYgR0xfT0VTX21hdHJpeF9wYWxldHRlCi0jZGVmaW5lIEdMX09FU19tYXRyaXhfcGFsZXR0ZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyAoR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyAodm9pZCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xXZWlnaHRQb2ludGVyT0VTIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ1VSUkVOVFBBTEVUVEVNQVRSSVhPRVNQUk9DKSAoR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTExPQURQQUxFVFRFRlJPTU1PREVMVklFV01BVFJJWE9FU1BST0MpICh2b2lkKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTUFUUklYSU5ERVhQT0lOVEVST0VTUFJPQykgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMV0VJR0hUUE9JTlRFUk9FU1BST0MpIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsICovCi0jaWZuZGVmIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbAotI2RlZmluZSBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgMQotI2VuZGlmCi0KLS8qIEdMX09FU19xdWVyeV9tYXRyaXggKi8KLSNpZm5kZWYgR0xfT0VTX3F1ZXJ5X21hdHJpeAotI2RlZmluZSBHTF9PRVNfcXVlcnlfbWF0cml4IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgR0xiaXRmaWVsZCBHTF9BUElFTlRSWSBnbFF1ZXJ5TWF0cml4eE9FUyAoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSk7Ci0jZW5kaWYKLXR5cGVkZWYgR0xiaXRmaWVsZCAoR0xfQVBJRU5UUllQIFBGTkdMUVVFUllNQVRSSVhYT0VTUFJPQykgKEdMZml4ZWQgbWFudGlzc2FbMTZdLCBHTGludCBleHBvbmVudFsxNl0pOwotI2VuZGlmCi0KLS8qIEdMX09FU19yZ2I4X3JnYmE4ICovCi0jaWZuZGVmIEdMX09FU19yZ2I4X3JnYmE4Ci0jZGVmaW5lIEdMX09FU19yZ2I4X3JnYmE4IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfc2luZ2xlX3ByZWNpc2lvbiAqLwotI2lmbmRlZiBHTF9PRVNfc2luZ2xlX3ByZWNpc2lvbgotI2RlZmluZSBHTF9PRVNfc2luZ2xlX3ByZWNpc2lvbiAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZk9FUyAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcnVzdHVtZk9FUyAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE9ydGhvZk9FUyAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZWZPRVMgKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRDbGlwUGxhbmVmT0VTIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xlYXJEZXB0aGZPRVMgKEdMY2xhbXBmIGRlcHRoKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERVBUSFJBTkdFRk9FU1BST0MpIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSVVNUVU1GT0VTUFJPQykgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xPUlRIT0ZPRVNQUk9DKSAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMSVBQTEFORUZPRVNQUk9DKSAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVENMSVBQTEFORUZPRVNQUk9DKSAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMRUFSREVQVEhGT0VTUFJPQykgKEdMY2xhbXBmIGRlcHRoKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbDEgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWwxCi0jZGVmaW5lIEdMX09FU19zdGVuY2lsMSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWw0ICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsNAotI2RlZmluZSBHTF9PRVNfc3RlbmNpbDQgMQotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsOCAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDgKLSNkZWZpbmUgR0xfT0VTX3N0ZW5jaWw4IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbF93cmFwICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsX3dyYXAKLSNkZWZpbmUgR0xfT0VTX3N0ZW5jaWxfd3JhcCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfY3ViZV9tYXAgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VuZk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhHZW5mdk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbmlPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbml2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleEdlbnhPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4R2VueHZPRVMgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRUZXhHZW5mdk9FUyAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEdlbml2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldFRleEdlbnh2T0VTIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5GT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VORlZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWEdFTklPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VOSVZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhHRU5YT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYR0VOWFZPRVNQUk9DKSAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWEdFTkZWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRURVhHRU5JVk9FU1BST0MpIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFRFWEdFTlhWT0VTUFJPQykgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2Vudl9jcm9zc2JhciAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9lbnZfY3Jvc3NiYXIKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfZW52X2Nyb3NzYmFyIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfbWlycm9yZWRfcmVwZWF0Ci0jZGVmaW5lIEdMX09FU190ZXh0dXJlX21pcnJvcmVkX3JlcGVhdCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFZlcnRleEFycmF5T0VTIChHTHVpbnQgYXJyYXkpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5WZXJ0ZXhBcnJheXNPRVMgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwotR0xfQVBJIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzVmVydGV4QXJyYXlPRVMgKEdMdWludCBhcnJheSk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQklORFZFUlRFWEFSUkFZT0VTUFJPQykgKEdMdWludCBhcnJheSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURVZFUlRFWEFSUkFZU09FU1BST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOVkVSVEVYQVJSQVlTT0VTUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTVkVSVEVYQVJSQVlPRVNQUk9DKSAoR0x1aW50IGFycmF5KTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFNRCBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlCi0jZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlIDEKLSNlbmRpZgotCi0vKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQotI2RlZmluZSBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUFBMRSBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfMkRfbGltaXRlZF9ucG90ICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfMkRfbGltaXRlZF9ucG90Ci0jZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfMkRfbGltaXRlZF9ucG90IDEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAqLwotI2lmbmRlZiBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZQotI2RlZmluZSBHTF9BUFBMRV9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSAodm9pZCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVBUFBMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRVNPTFZFTVVMVElTQU1QTEVGUkFNRUJVRkZFUkFQUExFUFJPQykgKHZvaWQpOwotI2VuZGlmCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4Ci0jZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4IDEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAqLwotI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbAotI2RlZmluZSBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUk0gZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BUk1fcmdiYTggKi8KLSNpZm5kZWYgR0xfQVJNX3JnYmE4Ci0jZGVmaW5lIEdMX0FSTV9yZ2JhOCAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBFWFQgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9FWFRfYmxlbmRfbWlubWF4ICovCi0jaWZuZGVmIEdMX0VYVF9ibGVuZF9taW5tYXgKLSNkZWZpbmUgR0xfRVhUX2JsZW5kX21pbm1heCAxCi0jZW5kaWYKLQotLyogR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgKi8KLSNpZm5kZWYgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIKLSNkZWZpbmUgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xESVNDQVJERlJBTUVCVUZGRVJFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlCi0jZGVmaW5lIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyRE1VTFRJU0FNUExFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzICovCi0jaWZuZGVmIEdMX0VYVF9tdWx0aV9kcmF3X2FycmF5cwotI2RlZmluZSBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTXVsdGlEcmF3QXJyYXlzRVhUIChHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50c0VYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAqLwotI2lmbmRlZiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYQotI2RlZmluZSBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3JvYnVzdG5lc3MgKi8KLSNpZm5kZWYgR0xfRVhUX3JvYnVzdG5lc3MKLSNkZWZpbmUgR0xfRVhUX3JvYnVzdG5lc3MgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSBHTGVudW0gR0xfQVBJRU5UUlkgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUICh2b2lkKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVhZG5QaXhlbHNFWFQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0blVuaWZvcm1mdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRuVW5pZm9ybWl2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7Ci0jZW5kaWYKLXR5cGVkZWYgR0xlbnVtIChHTF9BUElFTlRSWVAgUEZOR0xHRVRHUkFQSElDU1JFU0VUU1RBVFVTRVhUUFJPQykgKHZvaWQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRUFETlBJWEVMU0VYVFBST0MpIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVE5VTklGT1JNRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUlWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBHTGludCAqcGFyYW1zKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfc1JHQiAqLwotI2lmbmRlZiBHTF9FWFRfc1JHQgotI2RlZmluZSBHTF9FWFRfc1JHQiAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4Ci0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfbG9kX2JpYXMgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc3RvcmFnZQotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UxREVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdG9yYWdlM0RFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4dHVyZVN0b3JhZ2UxREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTJERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTNERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFNUT1JBR0UxREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTJERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1RPUkFHRTNERVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UxREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFRVUkVTVE9SQUdFMkRFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYVFVSRVNUT1JBR0UzREVYVFBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogSU1HIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfSU1HX3JlYWRfZm9ybWF0ICovCi0jaWZuZGVmIEdMX0lNR19yZWFkX2Zvcm1hdAotI2RlZmluZSBHTF9JTUdfcmVhZF9mb3JtYXQgMQotI2VuZGlmCi0KLS8qIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjICovCi0jaWZuZGVmIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjCi0jZGVmaW5lIEdMX0lNR190ZXh0dXJlX2NvbXByZXNzaW9uX3B2cnRjIDEKLSNlbmRpZgotCi0vKiBHTF9JTUdfdGV4dHVyZV9lbnZfZW5oYW5jZWRfZml4ZWRfZnVuY3Rpb24gKi8KLSNpZm5kZWYgR0xfSU1HX3RleHR1cmVfZW52X2VuaGFuY2VkX2ZpeGVkX2Z1bmN0aW9uCi0jZGVmaW5lIEdMX0lNR190ZXh0dXJlX2Vudl9lbmhhbmNlZF9maXhlZF9mdW5jdGlvbiAxCi0jZW5kaWYKLQotLyogR0xfSU1HX3VzZXJfY2xpcF9wbGFuZSAqLwotI2lmbmRlZiBHTF9JTUdfdXNlcl9jbGlwX3BsYW5lCi0jZGVmaW5lIEdMX0lNR191c2VyX2NsaXBfcGxhbmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ2xpcFBsYW5lZklNRyAoR0xlbnVtIHAsIGNvbnN0IEdMZmxvYXQgKmVxbik7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENsaXBQbGFuZXhJTUcgKEdMZW51bSBwLCBjb25zdCBHTGZpeGVkICplcW4pOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMSVBQTEFORUZJTUdQUk9DKSAoR0xlbnVtIHAsIGNvbnN0IEdMZmxvYXQgKmVxbik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENMSVBQTEFORVhJTUdQUk9DKSAoR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbik7Ci0jZW5kaWYKLQotLyogR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlCi0jZGVmaW5lIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUlNRykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTJETVVMVElTQU1QTEVJTUcpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogTlYgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBOVl9mZW5jZSAqLwotI2lmbmRlZiBHTF9OVl9mZW5jZQotI2RlZmluZSBHTF9OVl9mZW5jZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVGZW5jZXNOViAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZlbmNlc05WIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKLUdMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc0ZlbmNlTlYgKEdMdWludCBmZW5jZSk7Ci1HTF9BUEkgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsVGVzdEZlbmNlTlYgKEdMdWludCBmZW5jZSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZlbmNlaXZOViAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xGaW5pc2hGZW5jZU5WIChHTHVpbnQgZmVuY2UpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xTZXRGZW5jZU5WIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTERFTEVURUZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmZW5jZXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5GRU5DRVNOVlBST0MpIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU0ZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xURVNURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRGRU5DRUlWTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGSU5JU0hGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNFVEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKTsKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIFFDT00gZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9RQ09NX2RyaXZlcl9jb250cm9sICovCi0jaWZuZGVmIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wKLSNkZWZpbmUgR0xfUUNPTV9kcml2ZXJfY29udHJvbCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXREcml2ZXJDb250cm9sc1FDT00gKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NIChHTHVpbnQgZHJpdmVyQ29udHJvbCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVERSSVZFUkNPTlRST0xTUUNPTVBST0MpIChHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVREUklWRVJDT05UUk9MU1RSSU5HUUNPTVBST0MpIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVOQUJMRURSSVZFUkNPTlRST0xRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRElTQUJMRURSSVZFUkNPTlRST0xRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sKTsKLSNlbmRpZgotCi0vKiBHTF9RQ09NX2V4dGVuZGVkX2dldCAqLwotI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldAotI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRUZXh0dXJlc1FDT00gKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRCdWZmZXJzUUNPTSAoR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NIChHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00gKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00gKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NIChHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKipwYXJhbXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFRFWFRVUkVTUUNPTVBST0MpIChHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFJFTkRFUkJVRkZFUlNRQ09NUFJPQykgKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRGUkFNRUJVRkZFUlNRQ09NUFJPQykgKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRURVhMRVZFTFBBUkFNRVRFUklWUUNPTVBST0MpIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRURVhPQkpFQ1RTVEFURU9WRVJSSURFSVFDT01QUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFRFWFNVQklNQUdFUUNPTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEJVRkZFUlBPSU5URVJWUUNPTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKipwYXJhbXMpOwotI2VuZGlmCi0KLS8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MiAqLwotI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldDIKLSNkZWZpbmUgR0xfUUNPTV9leHRlbmRlZF9nZXQyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFNoYWRlcnNRQ09NIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0UHJvZ3JhbXNRQ09NIChHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKTsKLUdMX0FQSSBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NIChHTHVpbnQgcHJvZ3JhbSk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRTSEFERVJTUUNPTVBST0MpIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUFJPR1JBTVNRQ09NUFJPQykgKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTEVYVElTUFJPR1JBTUJJTkFSWVFDT01QUk9DKSAoR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNQklOQVJZU09VUkNFUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUgKi8KLSNpZm5kZWYgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlCi0jZGVmaW5lIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAxCi0jZW5kaWYKLQotLyogR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nICovCi0jaWZuZGVmIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZwotI2RlZmluZSBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgMQotI2VuZGlmCi0KLS8qIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nICovCi0jaWZuZGVmIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFN0YXJ0VGlsaW5nUUNPTSAoR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsRW5kVGlsaW5nUUNPTSAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNUQVJUVElMSU5HUUNPTVBST0MpIChHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFTkRUSUxJTkdRQ09NUFJPQykgKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19nbGV4dF9oXyAqLwotCmRpZmYgLS1naXQgYS9vcGVuZ2wvaW5jbHVkZS9HTEVTL2dscGxhdGZvcm0uaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGI2ZWUyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9pbmNsdWRlL0dMRVMvZ2xwbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI2lmbmRlZiBfX2dscGxhdGZvcm1faF8KLSNkZWZpbmUgX19nbHBsYXRmb3JtX2hfCi0KLS8qICRSZXZpc2lvbjogMTA2MDEgJCBvbiAkRGF0ZTo6IDIwMTAtMDMtMDQgMjI6MTU6MjcgLTA4MDAgIyQgKi8KLQotLyoKLSAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCi0gKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCi0gKi8KLQotLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBPcGVuR0wgRVMgMS5YICBnbC5oCi0gKgotICogQWRvcHRlcnMgbWF5IG1vZGlmeSBraHJwbGF0Zm9ybS5oIGFuZCB0aGlzIGZpbGUgdG8gc3VpdCB0aGVpciBwbGF0Zm9ybS4KLSAqIFlvdSBhcmUgZW5jb3VyYWdlZCB0byBzdWJtaXQgYWxsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIEtocm9ub3MgZ3JvdXAgc28gdGhhdAotICogdGhleSBjYW4gYmUgaW5jbHVkZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZmlsZS4gIFBsZWFzZSBzdWJtaXQgY2hhbmdlcwotICogYnkgc2VuZGluZyB0aGVtIHRvIHRoZSBwdWJsaWMgS2hyb25vcyBCdWd6aWxsYSAoaHR0cDovL2tocm9ub3Mub3JnL2J1Z3ppbGxhKQotICogYnkgZmlsaW5nIGEgYnVnIGFnYWluc3QgcHJvZHVjdCAiT3BlbkdMLUVTIiBjb21wb25lbnQgIlJlZ2lzdHJ5Ii4KLSAqLwotCi0jaW5jbHVkZSA8S0hSL2tocnBsYXRmb3JtLmg+Ci0KLSNpZm5kZWYgR0xfQVBJCi0jZGVmaW5lIEdMX0FQSSAgICAgIEtIUk9OT1NfQVBJQ0FMTAotI2VuZGlmCi0KLSNpZm5kZWYgR0xfQVBJRU5UUlkKLSNkZWZpbmUgR0xfQVBJRU5UUlkgS0hST05PU19BUElFTlRSWQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX2dscGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0dMRVMyL2dsMi5oIGIvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDNiODcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotI2lmbmRlZiBfX2dsMl9oXwotI2RlZmluZSBfX2dsMl9oXwotCi0vKiAkUmV2aXNpb246IDEwNjAyICQgb24gJERhdGU6OiAyMDEwLTAzLTA0IDIyOjM1OjM0IC0wODAwICMkICovCi0KLSNpbmNsdWRlIDxHTEVTMi9nbDJwbGF0Zm9ybS5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgotICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRGF0YSB0eXBlIGRlZmluaXRpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdHlwZWRlZiB2b2lkICAgICAgICAgICAgIEdMdm9pZDsKLXR5cGVkZWYgY2hhciAgICAgICAgICAgICBHTGNoYXI7Ci10eXBlZGVmIHVuc2lnbmVkIGludCAgICAgR0xlbnVtOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgIEdMYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTGJpdGZpZWxkOwotdHlwZWRlZiBraHJvbm9zX2ludDhfdCAgIEdMYnl0ZTsKLXR5cGVkZWYgc2hvcnQgICAgICAgICAgICBHTHNob3J0OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMaW50OwotdHlwZWRlZiBpbnQgICAgICAgICAgICAgIEdMc2l6ZWk7Ci10eXBlZGVmIGtocm9ub3NfdWludDhfdCAgR0x1Ynl0ZTsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICBHTHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICBHTHVpbnQ7Ci10eXBlZGVmIGtocm9ub3NfZmxvYXRfdCAgR0xmbG9hdDsKLXR5cGVkZWYga2hyb25vc19mbG9hdF90ICBHTGNsYW1wZjsKLXR5cGVkZWYga2hyb25vc19pbnQzMl90ICBHTGZpeGVkOwotCi0vKiBHTCB0eXBlcyBmb3IgaGFuZGxpbmcgbGFyZ2UgdmVydGV4IGJ1ZmZlciBvYmplY3RzICovCi10eXBlZGVmIGtocm9ub3NfaW50cHRyX3QgR0xpbnRwdHI7Ci10eXBlZGVmIGtocm9ub3Nfc3NpemVfdCAgR0xzaXplaXB0cjsKLQotLyogT3BlbkdMIEVTIGNvcmUgdmVyc2lvbnMgKi8KLSNkZWZpbmUgR0xfRVNfVkVSU0lPTl8yXzAgICAgICAgICAgICAgICAgIDEKLQotLyogQ2xlYXJCdWZmZXJNYXNrICovCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0KLS8qIEJvb2xlYW4gKi8KLSNkZWZpbmUgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLQotLyogQmVnaW5Nb2RlICovCi0jZGVmaW5lIEdMX1BPSU5UUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAweDAwMDMKLSNkZWZpbmUgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgMHgwMDA1Ci0jZGVmaW5lIEdMX1RSSUFOR0xFX0ZBTiAgICAgICAgICAgICAgICAgICAweDAwMDYKLQotLyogQWxwaGFGdW5jdGlvbiAobm90IHN1cHBvcnRlZCBpbiBFUzIwKSAqLwotLyogICAgICBHTF9ORVZFUiAqLwotLyogICAgICBHTF9MRVNTICovCi0vKiAgICAgIEdMX0VRVUFMICovCi0vKiAgICAgIEdMX0xFUVVBTCAqLwotLyogICAgICBHTF9HUkVBVEVSICovCi0vKiAgICAgIEdMX05PVEVRVUFMICovCi0vKiAgICAgIEdMX0dFUVVBTCAqLwotLyogICAgICBHTF9BTFdBWVMgKi8KLQotLyogQmxlbmRpbmdGYWN0b3JEZXN0ICovCi0jZGVmaW5lIEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDAKLSNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgIDB4MDMwMQotI2RlZmluZSBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzAyCi0jZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAweDAzMDMKLSNkZWZpbmUgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNAotI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgMHgwMzA1Ci0KLS8qIEJsZW5kaW5nRmFjdG9yU3JjICovCi0vKiAgICAgIEdMX1pFUk8gKi8KLS8qICAgICAgR0xfT05FICovCi0jZGVmaW5lIEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDAzMDYKLSNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgIDB4MDMwNwotI2RlZmluZSBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgMHgwMzA4Ci0vKiAgICAgIEdMX1NSQ19BTFBIQSAqLwotLyogICAgICBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICovCi0vKiAgICAgIEdMX0RTVF9BTFBIQSAqLwotLyogICAgICBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICovCi0KLS8qIEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAqLwotI2RlZmluZSBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA2Ci0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OICAgICAgICAgICAgICAgICAweDgwMDkKLSNkZWZpbmUgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgIDB4ODAwOSAgICAvKiBzYW1lIGFzIEJMRU5EX0VRVUFUSU9OICovCi0jZGVmaW5lIEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICAweDg4M0QKLQotLyogQmxlbmRTdWJ0cmFjdCAqLwotI2RlZmluZSBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgMHg4MDBBCi0jZGVmaW5lIEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVCAgICAgICAgICAweDgwMEIKLQotLyogU2VwYXJhdGUgQmxlbmQgRnVuY3Rpb25zICovCi0jZGVmaW5lIEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAweDgwQzgKLSNkZWZpbmUgR0xfQkxFTkRfU1JDX1JHQiAgICAgICAgICAgICAgICAgIDB4ODBDOQotI2RlZmluZSBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgMHg4MENBCi0jZGVmaW5lIEdMX0JMRU5EX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAweDgwQ0IKLSNkZWZpbmUgR0xfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgIDB4ODAwMQotI2RlZmluZSBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgMHg4MDAyCi0jZGVmaW5lIEdMX0NPTlNUQU5UX0FMUEhBICAgICAgICAgICAgICAgICAweDgwMDMKLSNkZWZpbmUgR0xfT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBICAgICAgIDB4ODAwNAotI2RlZmluZSBHTF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgMHg4MDA1Ci0KLS8qIEJ1ZmZlciBPYmplY3RzICovCi0jZGVmaW5lIEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAweDg4OTIKLSNkZWZpbmUgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgIDB4ODg5MwotI2RlZmluZSBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgMHg4ODk0Ci0jZGVmaW5lIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAweDg4OTUKLQotI2RlZmluZSBHTF9TVFJFQU1fRFJBVyAgICAgICAgICAgICAgICAgICAgMHg4OEUwCi0jZGVmaW5lIEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAweDg4RTQKLSNkZWZpbmUgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgIDB4ODhFOAotCi0jZGVmaW5lIEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAweDg3NjQKLSNkZWZpbmUgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgIDB4ODc2NQotCi0jZGVmaW5lIEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQiAgICAgICAgICAweDg2MjYKLQotLyogQ3VsbEZhY2VNb2RlICovCi0jZGVmaW5lIEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDQKLSNkZWZpbmUgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNQotI2RlZmluZSBHTF9GUk9OVF9BTkRfQkFDSyAgICAgICAgICAgICAgICAgMHgwNDA4Ci0KLS8qIERlcHRoRnVuY3Rpb24gKi8KLS8qICAgICAgR0xfTkVWRVIgKi8KLS8qICAgICAgR0xfTEVTUyAqLwotLyogICAgICBHTF9FUVVBTCAqLwotLyogICAgICBHTF9MRVFVQUwgKi8KLS8qICAgICAgR0xfR1JFQVRFUiAqLwotLyogICAgICBHTF9OT1RFUVVBTCAqLwotLyogICAgICBHTF9HRVFVQUwgKi8KLS8qICAgICAgR0xfQUxXQVlTICovCi0KLS8qIEVuYWJsZUNhcCAqLwotI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCi0jZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKLSNkZWZpbmUgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJFMgotI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCi0jZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKLSNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQotI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCi0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKLSNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgIDB4ODA5RQotI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCi0KLS8qIEVycm9yQ29kZSAqLwotI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCi0jZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKLSNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgotI2RlZmluZSBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgMHgwNTA1Ci0KLS8qIEZyb250RmFjZURpcmVjdGlvbiAqLwotI2RlZmluZSBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwCi0jZGVmaW5lIEdMX0NDVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDEKLQotLyogR2V0UE5hbWUgKi8KLSNkZWZpbmUgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDB4MEIyMQotI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECi0jZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKLSNkZWZpbmUgR0xfQ1VMTF9GQUNFX01PREUgICAgICAgICAgICAgICAgIDB4MEI0NQotI2RlZmluZSBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgMHgwQjQ2Ci0jZGVmaW5lIEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAweDBCNzAKLSNkZWZpbmUgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgIDB4MEI3MgotI2RlZmluZSBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQjczCi0jZGVmaW5lIEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAweDBCNzQKLSNkZWZpbmUgR0xfU1RFTkNJTF9DTEVBUl9WQUxVRSAgICAgICAgICAgIDB4MEI5MQotI2RlZmluZSBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgMHgwQjkyCi0jZGVmaW5lIEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAweDBCOTQKLSNkZWZpbmUgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwgICAgICAgIDB4MEI5NQotI2RlZmluZSBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgMHgwQjk2Ci0jZGVmaW5lIEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAweDBCOTcKLSNkZWZpbmUgR0xfU1RFTkNJTF9WQUxVRV9NQVNLICAgICAgICAgICAgIDB4MEI5MwotI2RlZmluZSBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgMHgwQjk4Ci0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19GVU5DICAgICAgICAgICAgICAweDg4MDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX0ZBSUwgICAgICAgICAgICAgIDB4ODgwMQotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICAgMHg4ODAyCi0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MgICAweDg4MDMKLSNkZWZpbmUgR0xfU1RFTkNJTF9CQUNLX1JFRiAgICAgICAgICAgICAgIDB4OENBMwotI2RlZmluZSBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgMHg4Q0E0Ci0jZGVmaW5lIEdMX1NURU5DSUxfQkFDS19XUklURU1BU0sgICAgICAgICAweDhDQTUKLSNkZWZpbmUgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMgotI2RlZmluZSBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgMHgwQzEwCi0vKiAgICAgIEdMX1NDSVNTT1JfVEVTVCAqLwotI2RlZmluZSBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgMHgwQzIyCi0jZGVmaW5lIEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAweDBDMjMKLSNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQotI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1Ci0jZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAweDBEMzMKLSNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgIDB4MEQzQQotI2RlZmluZSBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgMHgwRDUwCi0jZGVmaW5lIEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAweDBENTIKLSNkZWZpbmUgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MwotI2RlZmluZSBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgMHgwRDU0Ci0jZGVmaW5lIEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTUKLSNkZWZpbmUgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NgotI2RlZmluZSBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgMHgwRDU3Ci0jZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAweDJBMDAKLS8qICAgICAgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAqLwotI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgMHg4MDM4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAweDgwNjkKLSNkZWZpbmUgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgIDB4ODBBOAotI2RlZmluZSBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgMHg4MEE5Ci0jZGVmaW5lIEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAweDgwQUEKLSNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFX0lOVkVSVCAgICAgICAgIDB4ODBBQgotCi0vKiBHZXRUZXh0dXJlUGFyYW1ldGVyICovCi0vKiAgICAgIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAqLwotLyogICAgICBHTF9URVhUVVJFX01JTl9GSUxURVIgKi8KLS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1MgKi8KLS8qICAgICAgR0xfVEVYVFVSRV9XUkFQX1QgKi8KLQotI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKLQotLyogSGludE1vZGUgKi8KLSNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAotI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCi0jZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKLQotLyogSGludFRhcmdldCAqLwotI2RlZmluZSBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgIDB4ODE5MgotCi0vKiBEYXRhVHlwZSAqLwotI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCi0jZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKLSNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCi0jZGVmaW5lIEdMX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDQKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgIDB4MTQwNQotI2RlZmluZSBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDA2Ci0jZGVmaW5lIEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MEMKLQotLyogUGl4ZWxGb3JtYXQgKi8KLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgIDB4MTkwMgotI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2Ci0jZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKLSNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAotI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5Ci0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKLQotLyogUGl4ZWxUeXBlICovCi0vKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMwotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKLQotLyogU2hhZGVycyAqLwotI2RlZmluZSBHTF9GUkFHTUVOVF9TSEFERVIgICAgICAgICAgICAgICAgICAweDhCMzAKLSNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUiAgICAgICAgICAgICAgICAgICAgMHg4QjMxCi0jZGVmaW5lIEdMX01BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAgIDB4ODg2OQotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyAgICAgICAweDhERkIKLSNkZWZpbmUgR0xfTUFYX1ZBUllJTkdfVkVDVE9SUyAgICAgICAgICAgICAgMHg4REZDCi0jZGVmaW5lIEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIDB4OEI0RAotI2RlZmluZSBHTF9NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAweDhCNEMKLSNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMgICAgICAgICAgMHg4ODcyCi0jZGVmaW5lIEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAgIDB4OERGRAotI2RlZmluZSBHTF9TSEFERVJfVFlQRSAgICAgICAgICAgICAgICAgICAgICAweDhCNEYKLSNkZWZpbmUgR0xfREVMRVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgMHg4QjgwCi0jZGVmaW5lIEdMX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgIDB4OEI4MgotI2RlZmluZSBHTF9WQUxJREFURV9TVEFUVVMgICAgICAgICAgICAgICAgICAweDhCODMKLSNkZWZpbmUgR0xfQVRUQUNIRURfU0hBREVSUyAgICAgICAgICAgICAgICAgMHg4Qjg1Ci0jZGVmaW5lIEdMX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAgIDB4OEI4NgotI2RlZmluZSBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIICAgICAgICAweDhCODcKLSNkZWZpbmUgR0xfQUNUSVZFX0FUVFJJQlVURVMgICAgICAgICAgICAgICAgMHg4Qjg5Ci0jZGVmaW5lIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCAgICAgIDB4OEI4QQotI2RlZmluZSBHTF9TSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04gICAgICAgICAweDhCOEMKLSNkZWZpbmUgR0xfQ1VSUkVOVF9QUk9HUkFNICAgICAgICAgICAgICAgICAgMHg4QjhECi0KLS8qIFN0ZW5jaWxGdW5jdGlvbiAqLwotI2RlZmluZSBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDEKLSNkZWZpbmUgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMgotI2RlZmluZSBHTF9MRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAzCi0jZGVmaW5lIEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDQKLSNkZWZpbmUgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNQotI2RlZmluZSBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA2Ci0jZGVmaW5lIEdMX0FMV0FZUyAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDcKLQotLyogU3RlbmNpbE9wICovCi0vKiAgICAgIEdMX1pFUk8gKi8KLSNkZWZpbmUgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMAotI2RlZmluZSBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAxCi0jZGVmaW5lIEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDIKLSNkZWZpbmUgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMwotI2RlZmluZSBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBBCi0jZGVmaW5lIEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAweDg1MDcKLSNkZWZpbmUgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgIDB4ODUwOAotCi0vKiBTdHJpbmdOYW1lICovCi0jZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKLSNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQotI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCi0jZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKLQotLyogVGV4dHVyZU1hZ0ZpbHRlciAqLwotI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCi0jZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKLQotLyogVGV4dHVyZU1pbkZpbHRlciAqLwotLyogICAgICBHTF9ORUFSRVNUICovCi0vKiAgICAgIEdMX0xJTkVBUiAqLwotI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgMHgyNzAwCi0jZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAweDI3MDEKLSNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgIDB4MjcwMgotI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgMHgyNzAzCi0KLS8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDAKLSNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDB4MjgwMQotI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgMHgyODAyCi0jZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAweDI4MDMKLQotLyogVGV4dHVyZVRhcmdldCAqLwotLyogICAgICBHTF9URVhUVVJFXzJEICovCi0jZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKLQotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgMHg4NTEzCi0jZGVmaW5lIEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUCAgICAgICAweDg1MTQKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgIDB4ODUxNQotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ggICAgMHg4NTE2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWSAgICAweDg1MTcKLSNkZWZpbmUgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgIDB4ODUxOAotI2RlZmluZSBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgMHg4NTE5Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAweDg1MUEKLSNkZWZpbmUgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgIDB4ODUxQwotCi0vKiBUZXh0dXJlVW5pdCAqLwotI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCi0jZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKLSNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgotI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCi0jZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKLSNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQotI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2Ci0jZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKLSNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAotI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5Ci0jZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKLSNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgotI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCi0jZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKLSNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQotI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCi0jZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKLSNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQotI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCi0jZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKLSNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAotI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKLSNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENwotI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKLSNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQotI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCi0jZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKLSNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAotI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCi0jZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKLSNkZWZpbmUgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgIDB4ODRFMAotCi0vKiBUZXh0dXJlV3JhcE1vZGUgKi8KLSNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQotI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCi0jZGVmaW5lIEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAweDgzNzAKLQotLyogVW5pZm9ybSBUeXBlcyAqLwotI2RlZmluZSBHTF9GTE9BVF9WRUMyICAgICAgICAgICAgICAgICAgICAgMHg4QjUwCi0jZGVmaW5lIEdMX0ZMT0FUX1ZFQzMgICAgICAgICAgICAgICAgICAgICAweDhCNTEKLSNkZWZpbmUgR0xfRkxPQVRfVkVDNCAgICAgICAgICAgICAgICAgICAgIDB4OEI1MgotI2RlZmluZSBHTF9JTlRfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgMHg4QjUzCi0jZGVmaW5lIEdMX0lOVF9WRUMzICAgICAgICAgICAgICAgICAgICAgICAweDhCNTQKLSNkZWZpbmUgR0xfSU5UX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1NQotI2RlZmluZSBHTF9CT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjU2Ci0jZGVmaW5lIEdMX0JPT0xfVkVDMiAgICAgICAgICAgICAgICAgICAgICAweDhCNTcKLSNkZWZpbmUgR0xfQk9PTF9WRUMzICAgICAgICAgICAgICAgICAgICAgIDB4OEI1OAotI2RlZmluZSBHTF9CT09MX1ZFQzQgICAgICAgICAgICAgICAgICAgICAgMHg4QjU5Ci0jZGVmaW5lIEdMX0ZMT0FUX01BVDIgICAgICAgICAgICAgICAgICAgICAweDhCNUEKLSNkZWZpbmUgR0xfRkxPQVRfTUFUMyAgICAgICAgICAgICAgICAgICAgIDB4OEI1QgotI2RlZmluZSBHTF9GTE9BVF9NQVQ0ICAgICAgICAgICAgICAgICAgICAgMHg4QjVDCi0jZGVmaW5lIEdMX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgICAgICAweDhCNUUKLSNkZWZpbmUgR0xfU0FNUExFUl9DVUJFICAgICAgICAgICAgICAgICAgIDB4OEI2MAotCi0vKiBWZXJ0ZXggQXJyYXlzICovCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCAgICAgICAgMHg4NjIyCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSAgICAgICAgICAgMHg4NjIzCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICAgICAgICAgMHg4NjI0Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSAgICAgICAgICAgMHg4NjI1Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCAgICAgMHg4ODZBCi0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAgICAgMHg4NjQ1Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcgMHg4ODlGCi0KLS8qIFJlYWQgRm9ybWF0ICovCi0jZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSAgIDB4OEI5QQotI2RlZmluZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAweDhCOUIKLQotLyogU2hhZGVyIFNvdXJjZSAqLwotI2RlZmluZSBHTF9DT01QSUxFX1NUQVRVUyAgICAgICAgICAgICAgICAgMHg4QjgxCi0jZGVmaW5lIEdMX0lORk9fTE9HX0xFTkdUSCAgICAgICAgICAgICAgICAweDhCODQKLSNkZWZpbmUgR0xfU0hBREVSX1NPVVJDRV9MRU5HVEggICAgICAgICAgIDB4OEI4OAotI2RlZmluZSBHTF9TSEFERVJfQ09NUElMRVIgICAgICAgICAgICAgICAgMHg4REZBCi0KLS8qIFNoYWRlciBCaW5hcnkgKi8KLSNkZWZpbmUgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgICAgIDB4OERGOAotI2RlZmluZSBHTF9OVU1fU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgMHg4REY5Ci0KLS8qIFNoYWRlciBQcmVjaXNpb24tU3BlY2lmaWVkIFR5cGVzICovCi0jZGVmaW5lIEdMX0xPV19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAweDhERjAKLSNkZWZpbmUgR0xfTUVESVVNX0ZMT0FUICAgICAgICAgICAgICAgICAgIDB4OERGMQotI2RlZmluZSBHTF9ISUdIX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgMHg4REYyCi0jZGVmaW5lIEdMX0xPV19JTlQgICAgICAgICAgICAgICAgICAgICAgICAweDhERjMKLSNkZWZpbmUgR0xfTUVESVVNX0lOVCAgICAgICAgICAgICAgICAgICAgIDB4OERGNAotI2RlZmluZSBHTF9ISUdIX0lOVCAgICAgICAgICAgICAgICAgICAgICAgMHg4REY1Ci0KLS8qIEZyYW1lYnVmZmVyIE9iamVjdC4gKi8KLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVIgICAgICAgICAgICAgICAgICAgIDB4OEQ0MAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVIgICAgICAgICAgICAgICAgICAgMHg4RDQxCi0KLSNkZWZpbmUgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA1NgotI2RlZmluZSBHTF9SR0I1X0ExICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU3Ci0jZGVmaW5lIEdMX1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjIKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgIDB4ODFBNQotI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYICAgICAgICAgICAgICAgICAgMHgxOTAxCi0jZGVmaW5lIEdMX1NURU5DSUxfSU5ERVg4ICAgICAgICAgICAgICAgICAweDhENDgKLQotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfV0lEVEggICAgICAgICAgICAgMHg4RDQyCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9IRUlHSFQgICAgICAgICAgICAweDhENDMKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAgIDB4OEQ0NAotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkUgICAgICAgICAgMHg4RDUwCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFICAgICAgICAweDhENTEKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAgICAgICAgIDB4OEQ1MgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRSAgICAgICAgMHg4RDUzCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFICAgICAgICAweDhENTQKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAgICAgIDB4OEQ1NQotCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUgICAgICAgICAgIDB4OENEMAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FICAgICAgICAgICAweDhDRDEKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMICAgICAgICAgMHg4Q0QyCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFIDB4OENEMwotCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwICAgICAgICAgICAgICAweDhDRTAKLSNkZWZpbmUgR0xfREVQVEhfQVRUQUNITUVOVCAgICAgICAgICAgICAgIDB4OEQwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0FUVEFDSE1FTlQgICAgICAgICAgICAgMHg4RDIwCi0KLSNkZWZpbmUgR0xfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLQotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSAgICAgICAgICAgICAgICAgICAgICAweDhDRDUKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UICAgICAgICAgMHg4Q0Q2Ci0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIDB4OENENwotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgICAgICAgICAweDhDRDkKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgICAgMHg4Q0RECi0KLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfQklORElORyAgICAgICAgICAgIDB4OENBNgotI2RlZmluZSBHTF9SRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgMHg4Q0E3Ci0jZGVmaW5lIEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRSAgICAgICAgICAweDg0RTgKLQotI2RlZmluZSBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTiAgMHgwNTA2Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogR0wgY29yZSBmdW5jdGlvbnMuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEF0dGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCaW5kQXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRCdWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCaW5kRnJhbWVidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJpbmRSZW5kZXJidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZENvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEJsZW5kRXF1YXRpb24gKCBHTGVudW0gbW9kZSApOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xCdWZmZXJEYXRhIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQnVmZmVyU3ViRGF0YSAoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci1HTF9BUElDQUxMIEdMZW51bSAgICAgICBHTF9BUElFTlRSWSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMgKEdMZW51bSB0YXJnZXQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsQ2xlYXJDb2xvciAoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZGVwdGgpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvbXBpbGVTaGFkZXIgKEdMdWludCBzaGFkZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbENvcHlUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCBHTHVpbnQgICAgICAgR0xfQVBJRU5UUlkgZ2xDcmVhdGVQcm9ncmFtICh2b2lkKTsKLUdMX0FQSUNBTEwgR0x1aW50ICAgICAgIEdMX0FQSUVOVFJZIGdsQ3JlYXRlU2hhZGVyIChHTGVudW0gdHlwZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEN1bGxGYWNlIChHTGVudW0gbW9kZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZUJ1ZmZlcnMgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlRnJhbWVidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVsZXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZWxldGVSZW5kZXJidWZmZXJzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZVNoYWRlciAoR0x1aW50IHNoYWRlcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogdGV4dHVyZXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGVwdGhNYXNrIChHTGJvb2xlYW4gZmxhZyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbERldGFjaFNoYWRlciAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEaXNhYmxlIChHTGVudW0gY2FwKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IChHTHVpbnQgaW5kZXgpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEcmF3QXJyYXlzIChHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBpbmRpY2VzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgKEdMdWludCBpbmRleCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEZpbmlzaCAodm9pZCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xGcm9udEZhY2UgKEdMZW51bSBtb2RlKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2VuQnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQqIGJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZW5lcmF0ZU1pcG1hcCAoR0xlbnVtIHRhcmdldCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdlbkZyYW1lYnVmZmVycyAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdlblJlbmRlcmJ1ZmZlcnMgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50KiB0ZXh0dXJlcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZUF0dHJpYiAoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEFjdGl2ZVVuaWZvcm0gKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRBdHRhY2hlZFNoYWRlcnMgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heGNvdW50LCBHTHNpemVpKiBjb3VudCwgR0x1aW50KiBzaGFkZXJzKTsKLUdMX0FQSUNBTEwgaW50ICAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0QXR0cmliTG9jYXRpb24gKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRCb29sZWFudiAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBhcmFtZXRlcml2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCBHTGVudW0gICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEZsb2F0diAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldEludGVnZXJ2IChHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtaXYgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRQcm9ncmFtSW5mb0xvZyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVyaXYgKEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFNoYWRlckluZm9Mb2cgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0U2hhZGVyU291cmNlIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpOwotR0xfQVBJQ0FMTCBjb25zdCBHTHVieXRlKiBHTF9BUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybWZ2IChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbEdldFVuaWZvcm1pdiAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgaW50ICAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VW5pZm9ybUxvY2F0aW9uIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsR2V0VmVydGV4QXR0cmliZnYgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJpdiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiAgICBHTF9BUElFTlRSWSBnbElzQnVmZmVyIChHTHVpbnQgYnVmZmVyKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNFbmFibGVkIChHTGVudW0gY2FwKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNGcmFtZWJ1ZmZlciAoR0x1aW50IGZyYW1lYnVmZmVyKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiAgICBHTF9BUElFTlRSWSBnbElzUmVuZGVyYnVmZmVyIChHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuICAgIEdMX0FQSUVOVFJZIGdsSXNTaGFkZXIgKEdMdWludCBzaGFkZXIpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gICAgR0xfQVBJRU5UUlkgZ2xJc1RleHR1cmUgKEdMdWludCB0ZXh0dXJlKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsTGlua1Byb2dyYW0gKEdMdWludCBwcm9ncmFtKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsUGl4ZWxTdG9yZWkgKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgKHZvaWQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2UgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU2Npc3NvciAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTaGFkZXJCaW5hcnkgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBzaGFkZXJzLCBHTGVudW0gYmluYXJ5Zm9ybWF0LCBjb25zdCBHTHZvaWQqIGJpbmFyeSwgR0xzaXplaSBsZW5ndGgpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xTaGFkZXJTb3VyY2UgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxGdW5jU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrIChHTHVpbnQgbWFzayk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzayk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsU3RlbmNpbE9wU2VwYXJhdGUgKEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFRleFBhcmFtZXRlcmkgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJpdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0xaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMWl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtMmYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0yZnYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLUdMX0FQSUNBTEwgdm9pZCAgICAgICAgIEdMX0FQSUVOVFJZIGdsVW5pZm9ybTJpIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0yaXYgKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zZiAoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm0zaSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtM2l2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGYgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFVuaWZvcm00aSAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtNGl2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4MmZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4M2Z2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVbmlmb3JtTWF0cml4NGZ2IChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xVc2VQcm9ncmFtIChHTHVpbnQgcHJvZ3JhbSk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbSAoR0x1aW50IHByb2dyYW0pOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIxZiAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjFmdiAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjJmIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIyZnYgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZiAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWIzZnYgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpOwotR0xfQVBJQ0FMTCB2b2lkICAgICAgICAgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhBdHRyaWI0ZiAoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYjRmdiAoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZlcnRleEF0dHJpYlBvaW50ZXIgKEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cik7Ci1HTF9BUElDQUxMIHZvaWQgICAgICAgICBHTF9BUElFTlRSWSBnbFZpZXdwb3J0IChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX2dsMl9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmggYi9vcGVuZ2wvaW5jbHVkZS9HTEVTMi9nbDJleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4ZDgwYTEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIyICswLDAgQEAKLSNpZm5kZWYgX19nbDJleHRfaF8KLSNkZWZpbmUgX19nbDJleHRfaF8KLQotLyogJFJldmlzaW9uOiAxNjYxOSAkIG9uICREYXRlOjogMjAxMi0wMS0xOCAxMDowMDoxNCAtMDgwMCAjJCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGRvY3VtZW50IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBTR0kgRnJlZSBTb2Z0d2FyZSBCIExpY2Vuc2UgVmVyc2lvbgotICogMi4wLiBGb3IgZGV0YWlscywgc2VlIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQi8gLgotICovCi0KLSNpZm5kZWYgR0xfQVBJRU5UUllQCi0jICAgZGVmaW5lIEdMX0FQSUVOVFJZUCBHTF9BUElFTlRSWSoKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIE9FUyBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlICovCi0jaWZuZGVmIEdMX09FU19jb21wcmVzc2VkX0VUQzFfUkdCOF90ZXh0dXJlCi0jZGVmaW5lIEdMX0VUQzFfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDY0Ci0jZW5kaWYKLQotLyogR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkwCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkxCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkyCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QjkzCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk0Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk1Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk2Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk3Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk4Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Qjk5Ci0jZW5kaWYKLQotLyogR0xfT0VTX2RlcHRoMjQgKi8KLSNpZm5kZWYgR0xfT0VTX2RlcHRoMjQKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMjRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgxQTYKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGgzMiAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGgzMgotI2RlZmluZSBHTF9ERVBUSF9DT01QT05FTlQzMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODFBNwotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aF90ZXh0dXJlICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX09FU19FR0xfaW1hZ2UgKi8KLSNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQotdHlwZWRlZiB2b2lkKiBHTGVnbEltYWdlT0VTOwotI2VuZGlmCi0KLS8qIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgKi8KLSNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbAotLyogR0xlZ2xJbWFnZU9FUyBkZWZpbmVkIGluIEdMX09FU19FR0xfaW1hZ2UgYWxyZWFkeS4gKi8KLSNkZWZpbmUgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjUKLSNkZWZpbmUgR0xfU0FNUExFUl9FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjYKLSNkZWZpbmUgR0xfVEVYVFVSRV9CSU5ESU5HX0VYVEVSTkFMX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjcKLSNkZWZpbmUgR0xfUkVRVUlSRURfVEVYVFVSRV9JTUFHRV9VTklUU19PRVMgICAgICAgICAgICAgICAgICAgICAweDhENjgKLSNlbmRpZgotCi0vKiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50ICovCi0jaWZuZGVmIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDUKLSNlbmRpZgotCi0vKiBHTF9PRVNfZ2V0X3Byb2dyYW1fYmluYXJ5ICovCi0jaWZuZGVmIEdMX09FU19nZXRfcHJvZ3JhbV9iaW5hcnkKLSNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfTEVOR1RIX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3NDEKLSNkZWZpbmUgR0xfTlVNX1BST0dSQU1fQklOQVJZX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAweDg3RkUKLSNkZWZpbmUgR0xfUFJPR1JBTV9CSU5BUllfRk9STUFUU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3RkYKLSNlbmRpZgotCi0vKiBHTF9PRVNfbWFwYnVmZmVyICovCi0jaWZuZGVmIEdMX09FU19tYXBidWZmZXIKLSNkZWZpbmUgR0xfV1JJVEVfT05MWV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QjkKLSNkZWZpbmUgR0xfQlVGRkVSX0FDQ0VTU19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QkIKLSNkZWZpbmUgR0xfQlVGRkVSX01BUFBFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QkMKLSNkZWZpbmUgR0xfQlVGRkVSX01BUF9QT0lOVEVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4QkQKLSNlbmRpZgotCi0vKiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwgKi8KLSNpZm5kZWYgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsCi0jZGVmaW5lIEdMX0RFUFRIX1NURU5DSUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEY5Ci0jZGVmaW5lIEdMX1VOU0lHTkVEX0lOVF8yNF84X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEZBCi0jZGVmaW5lIEdMX0RFUFRIMjRfU1RFTkNJTDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OEYwCi0jZW5kaWYKLQotLyogR0xfT0VTX3JnYjhfcmdiYTggKi8KLSNpZm5kZWYgR0xfT0VTX3JnYjhfcmdiYTgKLSNkZWZpbmUgR0xfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTEKLSNkZWZpbmUgR0xfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTgKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgKi8KLSNpZm5kZWYgR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9ERVJJVkFUSVZFX0hJTlRfT0VTICAgICAgICAgICAgICAgICAgMHg4QjhCCi0jZW5kaWYKLQotLyogR0xfT0VTX3N0ZW5jaWwxICovCi0jaWZuZGVmIEdMX09FU19zdGVuY2lsMQotI2RlZmluZSBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEQ0NgotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsNCAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDQKLSNkZWZpbmUgR0xfU1RFTkNJTF9JTkRFWDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENDcKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV8zRCAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV8zRAotI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA3MgotI2RlZmluZSBHTF9URVhUVVJFXzNEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA2RgotI2RlZmluZSBHTF9URVhUVVJFX0JJTkRJTkdfM0RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA2QQotI2RlZmluZSBHTF9NQVhfM0RfVEVYVFVSRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA3MwotI2RlZmluZSBHTF9TQU1QTEVSXzNEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI1RgotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfM0RfWk9GRlNFVF9PRVMgICAgICAgIDB4OENENAotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2Zsb2F0ICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0ICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQKLSNkZWZpbmUgR0xfSEFMRl9GTE9BVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhENjEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9PRVNfdGV4dHVyZV9ucG90ICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0ICovCi0jaWZuZGVmIEdMX09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NUI1Ci0jZW5kaWYKLQotLyogR0xfT0VTX3ZlcnRleF9oYWxmX2Zsb2F0ICovCi0vKiBHTF9IQUxGX0ZMT0FUX09FUyBkZWZpbmVkIGluIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQgYWxyZWFkeS4gKi8KLQotLyogR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF90eXBlXzEwXzEwXzEwXzIKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAweDhERjYKLSNkZWZpbmUgR0xfSU5UXzEwXzEwXzEwXzJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhERjcKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFNRCBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlCi0jZGVmaW5lIEdMXzNEQ19YX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0Y5Ci0jZGVmaW5lIEdMXzNEQ19YWV9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4N0ZBCi0jZW5kaWYKLQotLyogR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfQU1EX2NvbXByZXNzZWRfQVRDX3RleHR1cmUKLSNkZWZpbmUgR0xfQVRDX1JHQl9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDOTIKLSNkZWZpbmUgR0xfQVRDX1JHQkFfRVhQTElDSVRfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDOTMKLSNkZWZpbmUgR0xfQVRDX1JHQkFfSU5URVJQT0xBVEVEX0FMUEhBX0FNRCAgICAgICAgICAgICAgICAgICAgICAweDg3RUUKLSNlbmRpZgotCi0vKiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvciAqLwotI2lmbmRlZiBHTF9BTURfcGVyZm9ybWFuY2VfbW9uaXRvcgotI2RlZmluZSBHTF9DT1VOVEVSX1RZUEVfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDMAotI2RlZmluZSBHTF9DT1VOVEVSX1JBTkdFX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDMQotI2RlZmluZSBHTF9VTlNJR05FRF9JTlQ2NF9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDMgotI2RlZmluZSBHTF9QRVJDRU5UQUdFX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDMwotI2RlZmluZSBHTF9QRVJGTU9OX1JFU1VMVF9BVkFJTEFCTEVfQU1EICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDNAotI2RlZmluZSBHTF9QRVJGTU9OX1JFU1VMVF9TSVpFX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDNQotI2RlZmluZSBHTF9QRVJGTU9OX1JFU1VMVF9BTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEJDNgotI2VuZGlmCi0KLS8qIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwICovCi0jaWZuZGVmIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwCi0jZGVmaW5lIEdMX1o0MDBfQklOQVJZX0FNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NzQwCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBTkdMRSBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX2JsaXQgKi8KLSNpZm5kZWYgR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdAotI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0FOR0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBOAotI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0FOR0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENBOQotI2RlZmluZSBHTF9EUkFXX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgIDB4OENBNgotI2RlZmluZSBHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQU5HTEUgICAgICAgICAgICAgICAgICAgICAgIDB4OENBQQotI2VuZGlmCi0KLS8qIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCi0jaWZuZGVmIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FOR0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0FCCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfQU5HTEUgICAgICAgICAgICAgMHg4RDU2Ci0jZGVmaW5lIEdMX01BWF9TQU1QTEVTX0FOR0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDU3Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUFBMRSBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FQUExFX3JnYl80MjIgKi8KLSNpZm5kZWYgR0xfQVBQTEVfcmdiXzQyMgotI2RlZmluZSBHTF9SR0JfNDIyX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEExRgotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODVCQQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF84XzhfUkVWX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODVCQgotI2VuZGlmCi0KLS8qIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCi0jaWZuZGVmIEdMX0FQUExFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0FCCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfQVBQTEUgICAgICAgICAgICAgMHg4RDU2Ci0jZGVmaW5lIEdMX01BWF9TQU1QTEVTX0FQUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RDU3Ci0jZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E4Ci0jZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQVBQTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E5Ci0jZGVmaW5lIEdMX0RSQVdfRlJBTUVCVUZGRVJfQklORElOR19BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0E2Ci0jZGVmaW5lIEdMX1JFQURfRlJBTUVCVUZGRVJfQklORElOR19BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0FBCi0jZW5kaWYKLQotLyogR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggKi8KLSNpZm5kZWYgR0xfQVBQTEVfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAqLwotI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbAotI2RlZmluZSBHTF9URVhUVVJFX01BWF9MRVZFTF9BUFBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODEzRAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQVJNIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQVJNX21hbGlfc2hhZGVyX2JpbmFyeSAqLwotI2lmbmRlZiBHTF9BUk1fbWFsaV9zaGFkZXJfYmluYXJ5Ci0jZGVmaW5lIEdMX01BTElfU0hBREVSX0JJTkFSWV9BUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4RjYwCi0jZW5kaWYKLQotLyogR0xfQVJNX3JnYmE4ICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRVhUIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfRVhUX2JsZW5kX21pbm1heCAqLwotI2lmbmRlZiBHTF9FWFRfYmxlbmRfbWlubWF4Ci0jZGVmaW5lIEdMX01JTl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA3Ci0jZGVmaW5lIEdMX01BWF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDA4Ci0jZW5kaWYKLQotLyogR0xfRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0ICovCi0jaWZuZGVmIEdMX0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdAotI2RlZmluZSBHTF9SR0JBMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQQotI2RlZmluZSBHTF9SR0IxNkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODgxQgotI2RlZmluZSBHTF9SRzE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRgotI2RlZmluZSBHTF9SMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyRAotI2RlZmluZSBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX0NPTVBPTkVOVF9UWVBFX0VYVCAgICAgICAgICAgIDB4ODIxMQotI2RlZmluZSBHTF9VTlNJR05FRF9OT1JNQUxJWkVEX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEMxNwotI2VuZGlmCi0KLS8qIEdMX0VYVF9kZWJ1Z19sYWJlbCAqLwotI2lmbmRlZiBHTF9FWFRfZGVidWdfbGFiZWwKLSNkZWZpbmUgR0xfUFJPR1JBTV9QSVBFTElORV9PQkpFQ1RfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAweDhBNEYKLSNkZWZpbmUgR0xfUFJPR1JBTV9PQkpFQ1RfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCNDAKLSNkZWZpbmUgR0xfU0hBREVSX09CSkVDVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCNDgKLSNkZWZpbmUgR0xfQlVGRkVSX09CSkVDVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxNTEKLSNkZWZpbmUgR0xfUVVFUllfT0JKRUNUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxNTMKLSNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZX09CSkVDVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxNTQKLSNlbmRpZgotCi0vKiBHTF9FWFRfZGVidWdfbWFya2VyICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyICovCi0jaWZuZGVmIEdMX0VYVF9kaXNjYXJkX2ZyYW1lYnVmZmVyCi0jZGVmaW5lIEdMX0NPTE9SX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAwCi0jZGVmaW5lIEdMX0RFUFRIX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAxCi0jZGVmaW5lIEdMX1NURU5DSUxfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODAyCi0jZW5kaWYKLQotLyogR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9TQU1QTEVTX0VYVCAgICAgICAgICAgMHg4RDZDCi0jZGVmaW5lIEdMX1JFTkRFUkJVRkZFUl9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTMzCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTVVMVElTQU1QTEVfRVhUICAgICAgICAgICAgICAgMHg5MTM0Ci0jZGVmaW5lIEdMX01BWF9TQU1QTEVTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTM1Ci0jZW5kaWYKLQotLyogR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX0VYVF9vY2NsdXNpb25fcXVlcnlfYm9vbGVhbiAqLwotI2lmbmRlZiBHTF9FWFRfb2NjbHVzaW9uX3F1ZXJ5X2Jvb2xlYW4KLSNkZWZpbmUgR0xfQU5ZX1NBTVBMRVNfUEFTU0VEX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhDMkYKLSNkZWZpbmUgR0xfQU5ZX1NBTVBMRVNfUEFTU0VEX0NPTlNFUlZBVElWRV9FWFQgICAgICAgICAgICAgICAgICAweDhENkEKLSNkZWZpbmUgR0xfQ1VSUkVOVF9RVUVSWV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NjUKLSNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NjYKLSNkZWZpbmUgR0xfUVVFUllfUkVTVUxUX0FWQUlMQUJMRV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4NjcKLSNlbmRpZgotCi0vKiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAqLwotI2lmbmRlZiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYQotI2RlZmluZSBHTF9CR1JBX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODM2NQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVl9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODM2NgotI2VuZGlmCi0KLS8qIEdMX0VYVF9yb2J1c3RuZXNzICovCi0jaWZuZGVmIEdMX0VYVF9yb2J1c3RuZXNzCi0vKiByZXVzZSBHTF9OT19FUlJPUiAqLwotI2RlZmluZSBHTF9HVUlMVFlfQ09OVEVYVF9SRVNFVF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1MwotI2RlZmluZSBHTF9JTk5PQ0VOVF9DT05URVhUX1JFU0VUX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1NAotI2RlZmluZSBHTF9VTktOT1dOX0NPTlRFWFRfUkVTRVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1NQotI2RlZmluZSBHTF9DT05URVhUX1JPQlVTVF9BQ0NFU1NfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTBGMwotI2RlZmluZSBHTF9SRVNFVF9OT1RJRklDQVRJT05fU1RSQVRFR1lfRVhUICAgICAgICAgICAgICAgICAgICAgIDB4ODI1NgotI2RlZmluZSBHTF9MT1NFX0NPTlRFWFRfT05fUkVTRVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI1MgotI2RlZmluZSBHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI2MQotI2VuZGlmCi0KLS8qIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cyAqLwotI2lmbmRlZiBHTF9FWFRfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMKLSNkZWZpbmUgR0xfVkVSVEVYX1NIQURFUl9CSVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEdMX0ZSQUdNRU5UX1NIQURFUl9CSVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBHTF9BTExfU0hBREVSX0JJVFNfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKLSNkZWZpbmUgR0xfUFJPR1JBTV9TRVBBUkFCTEVfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNTgKLSNkZWZpbmUgR0xfQUNUSVZFX1BST0dSQU1fRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNTkKLSNkZWZpbmUgR0xfUFJPR1JBTV9QSVBFTElORV9CSU5ESU5HX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAweDgyNUEKLSNlbmRpZgotCi0vKiBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX0VYVF9zaGFkb3dfc2FtcGxlcnMgKi8KLSNpZm5kZWYgR0xfRVhUX3NoYWRvd19zYW1wbGVycwotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfTU9ERV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0QwotI2RlZmluZSBHTF9URVhUVVJFX0NPTVBBUkVfRlVOQ19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0RAotI2RlZmluZSBHTF9DT01QQVJFX1JFRl9UT19URVhUVVJFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODg0RQotI2RlZmluZSBHTF9TQU1QTEVSXzJEX1NIQURPV19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEI2MgotI2VuZGlmCi0KLS8qIEdMX0VYVF9zUkdCICovCi0jaWZuZGVmIEdMX0VYVF9zUkdCCi0jZGVmaW5lIEdMX1NSR0JfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQwCi0jZGVmaW5lIEdMX1NSR0JfQUxQSEFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQyCi0jZGVmaW5lIEdMX1NSR0I4X0FMUEhBOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzQzCi0jZGVmaW5lIEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkdfRVhUICAgICAgICAgICAgMHg4MjEwCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MSAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHg4M0YwCi0jZGVmaW5lIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMHg4M0YxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYwotI2RlZmluZSBHTF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRQotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRGRgotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OCAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODgKLSNkZWZpbmUgR0xfQkdSQV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwRTEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9yZyAqLwotI2lmbmRlZiBHTF9FWFRfdGV4dHVyZV9yZwotI2RlZmluZSBHTF9SRURfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwMwotI2RlZmluZSBHTF9SR19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyNwotI2RlZmluZSBHTF9SOF9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyOQotI2RlZmluZSBHTF9SRzhfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODIyQgotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfc3RvcmFnZQotI2RlZmluZSBHTF9URVhUVVJFX0lNTVVUQUJMRV9GT1JNQVRfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTEyRgotI2RlZmluZSBHTF9BTFBIQThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAzQyAgCi0jZGVmaW5lIEdMX0xVTUlOQU5DRThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwCi0jZGVmaW5lIEdMX0xVTUlOQU5DRThfQUxQSEE4X0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQ1Ci0jZGVmaW5lIEdMX1JHQkEzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODE0ICAKLSNkZWZpbmUgR0xfUkdCMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTUKLSNkZWZpbmUgR0xfQUxQSEEzMkZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTYKLSNkZWZpbmUgR0xfTFVNSU5BTkNFMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTgKLSNkZWZpbmUgR0xfTFVNSU5BTkNFX0FMUEhBMzJGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg4MTkKLS8qIHJldXNlIEdMX1JHQkExNkZfRVhUICovCi0jZGVmaW5lIEdMX1JHQjE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFCCi0jZGVmaW5lIEdMX0FMUEhBMTZGX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFDCi0jZGVmaW5lIEdMX0xVTUlOQU5DRTE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFFCi0jZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQTE2Rl9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODFGCi0jZGVmaW5lIEdMX1JHQjEwX0EyX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDU5ICAKLSNkZWZpbmUgR0xfUkdCMTBfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNTIKLSNkZWZpbmUgR0xfQkdSQThfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkzQTEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV90eXBlXzJfMTBfMTBfMTBfUkVWICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYKLSNkZWZpbmUgR0xfVU5TSUdORURfSU5UXzJfMTBfMTBfMTBfUkVWX0VYVCAgICAgICAgICAgICAgICAgICAgICAweDgzNjgKLSNlbmRpZgotCi0vKiBHTF9FWFRfdW5wYWNrX3N1YmltYWdlICovCi0jaWZuZGVmIEdMX0VYVF91bnBhY2tfc3ViaW1hZ2UKLSNkZWZpbmUgR0xfVU5QQUNLX1JPV19MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDRjIKLSNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfUk9XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDRjMKLSNkZWZpbmUgR0xfVU5QQUNLX1NLSVBfUElYRUxTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDRjQKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIERNUCBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0RNUF9zaGFkZXJfYmluYXJ5ICovCi0jaWZuZGVmIEdMX0RNUF9zaGFkZXJfYmluYXJ5Ci0jZGVmaW5lIEdMX1NIQURFUl9CSU5BUllfRE1QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MjUwCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBJTUcgZXh0ZW5zaW9uIHRva2VucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfSU1HX3Byb2dyYW1fYmluYXJ5Ci0jZGVmaW5lIEdMX1NHWF9QUk9HUkFNX0JJTkFSWV9JTUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MTMwCi0jZW5kaWYKLQotLyogR0xfSU1HX3JlYWRfZm9ybWF0ICovCi0jaWZuZGVmIEdMX0lNR19yZWFkX2Zvcm1hdAotI2RlZmluZSBHTF9CR1JBX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODBFMQotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVl9JTUcgICAgICAgICAgICAgICAgICAgICAgIDB4ODM2NQotI2VuZGlmCi0KLS8qIEdMX0lNR19zaGFkZXJfYmluYXJ5ICovCi0jaWZuZGVmIEdMX0lNR19zaGFkZXJfYmluYXJ5Ci0jZGVmaW5lIEdMX1NHWF9CSU5BUllfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QzBBCi0jZW5kaWYKLQotLyogR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgKi8KLSNpZm5kZWYgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgICAweDhDMDAKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRyAgICAgICAgICAgICAgICAgICAgICAweDhDMDEKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUcgICAgICAgICAgICAgICAgICAgICAweDhDMDIKLSNkZWZpbmUgR0xfQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUcgICAgICAgICAgICAgICAgICAgICAweDhDMDMKLSNlbmRpZgotCi0vKiBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUKLSNkZWZpbmUgR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzMKLSNkZWZpbmUgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9JTUcgICAgICAgICAgICAgICAweDkxMzQKLSNkZWZpbmUgR0xfTUFYX1NBTVBMRVNfSU1HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzUKLSNkZWZpbmUgR0xfVEVYVFVSRV9TQU1QTEVTX0lNRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDkxMzYKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIE5WIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfTlZfY292ZXJhZ2Vfc2FtcGxlICovCi0jaWZuZGVmIEdMX05WX2NvdmVyYWdlX3NhbXBsZQotI2RlZmluZSBHTF9DT1ZFUkFHRV9DT01QT05FTlRfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVEMAotI2RlZmluZSBHTF9DT1ZFUkFHRV9DT01QT05FTlQ0X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVEMQotI2RlZmluZSBHTF9DT1ZFUkFHRV9BVFRBQ0hNRU5UX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVEMgotI2RlZmluZSBHTF9DT1ZFUkFHRV9CVUZGRVJTX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVEMwotI2RlZmluZSBHTF9DT1ZFUkFHRV9TQU1QTEVTX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVENAotI2RlZmluZSBHTF9DT1ZFUkFHRV9BTExfRlJBR01FTlRTX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVENQotI2RlZmluZSBHTF9DT1ZFUkFHRV9FREdFX0ZSQUdNRU5UU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVENgotI2RlZmluZSBHTF9DT1ZFUkFHRV9BVVRPTUFUSUNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEVENwotI2RlZmluZSBHTF9DT1ZFUkFHRV9CVUZGRVJfQklUX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAotI2VuZGlmCi0KLS8qIEdMX05WX2RlcHRoX25vbmxpbmVhciAqLwotI2lmbmRlZiBHTF9OVl9kZXB0aF9ub25saW5lYXIKLSNkZWZpbmUgR0xfREVQVEhfQ09NUE9ORU5UMTZfTk9OTElORUFSX05WICAgICAgICAgICAgICAgICAgICAgICAweDhFMkMKLSNlbmRpZgotCi0vKiBHTF9OVl9kcmF3X2J1ZmZlcnMgKi8KLSNpZm5kZWYgR0xfTlZfZHJhd19idWZmZXJzCi0jZGVmaW5lIEdMX01BWF9EUkFXX0JVRkZFUlNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI0Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI1Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI2Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI3Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSM19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI4Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSNF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODI5Ci0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSNV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODJBCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSNl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODJCCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSN19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODJDCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSOF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODJECi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSOV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODJFCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTBfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODJGCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTFfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODMwCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTJfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODMxCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODMyCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTRfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODMzCi0jZGVmaW5lIEdMX0RSQVdfQlVGRkVSMTVfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODM0Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQwX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0UwCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0UxCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQyX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0UyCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQzX05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0UzCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ0X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0U0Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ1X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0U1Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ2X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0U2Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ3X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0U3Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ4X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0U4Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQ5X05WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0U5Ci0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0VBCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0VCCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0VDCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxM19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0VECi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNF9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0VFCi0jZGVmaW5lIEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4Q0VGCi0jZW5kaWYKLQotLyogR0xfTlZfZmJvX2NvbG9yX2F0dGFjaG1lbnRzICovCi0jaWZuZGVmIEdMX05WX2Zib19jb2xvcl9hdHRhY2htZW50cwotI2RlZmluZSBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OENERgotLyogR0xfQ09MT1JfQVRUQUNITUVOVHswLTE1fV9OViBkZWZpbmVkIGluIEdMX05WX2RyYXdfYnVmZmVycyBhbHJlYWR5LiAqLwotI2VuZGlmCi0KLS8qIEdMX05WX2ZlbmNlICovCi0jaWZuZGVmIEdMX05WX2ZlbmNlCi0jZGVmaW5lIEdMX0FMTF9DT01QTEVURURfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEYyCi0jZGVmaW5lIEdMX0ZFTkNFX1NUQVRVU19OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEYzCi0jZGVmaW5lIEdMX0ZFTkNFX0NPTkRJVElPTl9OViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NEY0Ci0jZW5kaWYKLQotLyogR0xfTlZfcmVhZF9idWZmZXIgKi8KLSNpZm5kZWYgR0xfTlZfcmVhZF9idWZmZXIKLSNkZWZpbmUgR0xfUkVBRF9CVUZGRVJfTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDMDIKLSNlbmRpZgotCi0vKiBHTF9OVl9yZWFkX2J1ZmZlcl9mcm9udCAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9OVl9yZWFkX2RlcHRoICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX05WX3JlYWRfZGVwdGhfc3RlbmNpbCAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9OVl9yZWFkX3N0ZW5jaWwgKi8KLS8qIE5vIG5ldyB0b2tlbnMgaW50cm9kdWNlZCBieSB0aGlzIGV4dGVuc2lvbi4gKi8KLQotLyogR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjX3VwZGF0ZSAqLwotLyogTm8gbmV3IHRva2VucyBpbnRyb2R1Y2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAqLwotCi0vKiBHTF9OVl90ZXh0dXJlX25wb3RfMkRfbWlwbWFwICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogUUNPTSBleHRlbnNpb24gdG9rZW5zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX1FDT01fYWxwaGFfdGVzdCAqLwotI2lmbmRlZiBHTF9RQ09NX2FscGhhX3Rlc3QKLSNkZWZpbmUgR0xfQUxQSEFfVEVTVF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCQzAKLSNkZWZpbmUgR0xfQUxQSEFfVEVTVF9GVU5DX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCQzEKLSNkZWZpbmUgR0xfQUxQSEFfVEVTVF9SRUZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCQzIKLSNlbmRpZgotCi0vKiBHTF9RQ09NX2RyaXZlcl9jb250cm9sICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX1FDT01fZXh0ZW5kZWRfZ2V0ICovCi0jaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfV0lEVEhfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQyCi0jZGVmaW5lIEdMX1RFWFRVUkVfSEVJR0hUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQzCi0jZGVmaW5lIEdMX1RFWFRVUkVfREVQVEhfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ0Ci0jZGVmaW5lIEdMX1RFWFRVUkVfSU5URVJOQUxfRk9STUFUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ1Ci0jZGVmaW5lIEdMX1RFWFRVUkVfRk9STUFUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfVFlQRV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ3Ci0jZGVmaW5lIEdMX1RFWFRVUkVfSU1BR0VfVkFMSURfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ4Ci0jZGVmaW5lIEdMX1RFWFRVUkVfTlVNX0xFVkVMU19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkQ5Ci0jZGVmaW5lIEdMX1RFWFRVUkVfVEFSR0VUX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkRBCi0jZGVmaW5lIEdMX1RFWFRVUkVfT0JKRUNUX1ZBTElEX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkRCCi0jZGVmaW5lIEdMX1NUQVRFX1JFU1RPUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4QkRDCi0jZW5kaWYKLQotLyogR0xfUUNPTV9leHRlbmRlZF9nZXQyICovCi0vKiBObyBuZXcgdG9rZW5zIGludHJvZHVjZWQgYnkgdGhpcyBleHRlbnNpb24uICovCi0KLS8qIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAqLwotI2lmbmRlZiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUKLSNkZWZpbmUgR0xfUEVSRk1PTl9HTE9CQUxfTU9ERV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGQTAKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX1dSSVRFT05MWV9SRU5ERVJJTkdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4ODIzCi0jZW5kaWYKLQotLyogR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcgKi8KLSNpZm5kZWYgR0xfUUNPTV90aWxlZF9yZW5kZXJpbmcKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEdMX0NPTE9SX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUMF9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDFfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQyX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUM19RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDRfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCi0jZGVmaW5lIEdMX0RFUFRIX0JVRkZFUl9CSVQ1X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUNl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVDdfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCi0jZGVmaW5lIEdMX1NURU5DSUxfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDBfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQxX1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUMl9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDNfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ0X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBHTF9NVUxUSVNBTVBMRV9CVUZGRVJfQklUNV9RQ09NICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEVfQlVGRkVSX0JJVDZfUUNPTSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIEdMX01VTFRJU0FNUExFX0JVRkZFUl9CSVQ3X1FDT00gICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogVklWIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfVklWX3NoYWRlcl9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfVklWX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfU0hBREVSX0JJTkFSWV9WSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhGQzQKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEVuZCBvZiBleHRlbnNpb24gdG9rZW5zLCBzdGFydCBvZiBjb3JyZXNwb25kaW5nIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBPRVMgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotI2RlZmluZSBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9PRVNfY29tcHJlc3NlZF9wYWxldHRlZF90ZXh0dXJlCi0jZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgMQotI2VuZGlmCi0KLS8qIEdMX09FU19kZXB0aDI0ICovCi0jaWZuZGVmIEdMX09FU19kZXB0aDI0Ci0jZGVmaW5lIEdMX09FU19kZXB0aDI0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZGVwdGgzMiAqLwotI2lmbmRlZiBHTF9PRVNfZGVwdGgzMgotI2RlZmluZSBHTF9PRVNfZGVwdGgzMiAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2RlcHRoX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfT0VTX2RlcHRoX3RleHR1cmUKLSNkZWZpbmUgR0xfT0VTX2RlcHRoX3RleHR1cmUgMQotI2VuZGlmCi0KLS8qIEdMX09FU19FR0xfaW1hZ2UgKi8KLSNpZm5kZWYgR0xfT0VTX0VHTF9pbWFnZQotI2RlZmluZSBHTF9PRVNfRUdMX2ltYWdlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVHTElNQUdFVEFSR0VUVEVYVFVSRTJET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFR0xJTUFHRVRBUkdFVFJFTkRFUkJVRkZFUlNUT1JBR0VPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX0VHTF9pbWFnZV9leHRlcm5hbCAqLwotI2lmbmRlZiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsCi0jZGVmaW5lIEdMX09FU19FR0xfaW1hZ2VfZXh0ZXJuYWwgMQotLyogZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyBkZWZpbmVkIGluIEdMX09FU19FR0xfaW1hZ2UgYWxyZWFkeS4gKi8KLSNlbmRpZgotCi0vKiBHTF9PRVNfZWxlbWVudF9pbmRleF91aW50ICovCi0jaWZuZGVmIEdMX09FU19lbGVtZW50X2luZGV4X3VpbnQKLSNkZWZpbmUgR0xfT0VTX2VsZW1lbnRfaW5kZXhfdWludCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX2Zib19yZW5kZXJfbWlwbWFwICovCi0jaWZuZGVmIEdMX09FU19mYm9fcmVuZGVyX21pcG1hcAotI2RlZmluZSBHTF9PRVNfZmJvX3JlbmRlcl9taXBtYXAgMQotI2VuZGlmCi0KLS8qIEdMX09FU19mcmFnbWVudF9wcmVjaXNpb25faGlnaCAqLwotI2lmbmRlZiBHTF9PRVNfZnJhZ21lbnRfcHJlY2lzaW9uX2hpZ2gKLSNkZWZpbmUgR0xfT0VTX2ZyYWdtZW50X3ByZWNpc2lvbl9oaWdoIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfZ2V0X3Byb2dyYW1fYmluYXJ5ICovCi0jaWZuZGVmIEdMX09FU19nZXRfcHJvZ3JhbV9iaW5hcnkKLSNkZWZpbmUgR0xfT0VTX2dldF9wcm9ncmFtX2JpbmFyeSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbUJpbmFyeU9FUyAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbUJpbmFyeU9FUyAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1CSU5BUllPRVNQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNQklOQVJZT0VTUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xpbnQgbGVuZ3RoKTsKLSNlbmRpZgotCi0vKiBHTF9PRVNfbWFwYnVmZmVyICovCi0jaWZuZGVmIEdMX09FU19tYXBidWZmZXIKLSNkZWZpbmUgR0xfT0VTX21hcGJ1ZmZlciAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkKiBHTF9BUElFTlRSWSBnbE1hcEJ1ZmZlck9FUyAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2Vzcyk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbFVubWFwQnVmZmVyT0VTIChHTGVudW0gdGFyZ2V0KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBhcmFtcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCogKEdMX0FQSUVOVFJZUCBQRk5HTE1BUEJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xVTk1BUEJVRkZFUk9FU1BST0MpIChHTGVudW0gdGFyZ2V0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUQlVGRkVSUE9JTlRFUlZPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwYXJhbXMpOwotI2VuZGlmCi0KLS8qIEdMX09FU19wYWNrZWRfZGVwdGhfc3RlbmNpbCAqLwotI2lmbmRlZiBHTF9PRVNfcGFja2VkX2RlcHRoX3N0ZW5jaWwKLSNkZWZpbmUgR0xfT0VTX3BhY2tlZF9kZXB0aF9zdGVuY2lsIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfcmdiOF9yZ2JhOCAqLwotI2lmbmRlZiBHTF9PRVNfcmdiOF9yZ2JhOAotI2RlZmluZSBHTF9PRVNfcmdiOF9yZ2JhOCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzICovCi0jaWZuZGVmIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcwotI2RlZmluZSBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgMQotI2VuZGlmCi0KLS8qIEdMX09FU19zdGVuY2lsMSAqLwotI2lmbmRlZiBHTF9PRVNfc3RlbmNpbDEKLSNkZWZpbmUgR0xfT0VTX3N0ZW5jaWwxIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfc3RlbmNpbDQgKi8KLSNpZm5kZWYgR0xfT0VTX3N0ZW5jaWw0Ci0jZGVmaW5lIEdMX09FU19zdGVuY2lsNCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfM0QgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfM0QKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfM0QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleEltYWdlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhTdWJJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWElNQUdFM0RPRVNQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVEVYU1VCSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPUFlURVhTVUJJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPTVBSRVNTRURURVhJTUFHRTNET0VTUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xDT01QUkVTU0VEVEVYU1VCSU1BR0UzRE9FU1BST0MpIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUzRE9FUykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2Zsb2F0ICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX2Zsb2F0Ci0jZGVmaW5lIEdMX09FU190ZXh0dXJlX2Zsb2F0IDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIgKi8KLSNpZm5kZWYgR0xfT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyCi0jZGVmaW5lIEdMX09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3RleHR1cmVfaGFsZl9mbG9hdCAqLwotI2lmbmRlZiBHTF9PRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Ci0jZGVmaW5lIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXQgMQotI2VuZGlmCi0KLS8qIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyCi0jZGVmaW5lIEdMX09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIDEKLSNlbmRpZgotCi0vKiBHTF9PRVNfdGV4dHVyZV9ucG90ICovCi0jaWZuZGVmIEdMX09FU190ZXh0dXJlX25wb3QKLSNkZWZpbmUgR0xfT0VTX3RleHR1cmVfbnBvdCAxCi0jZW5kaWYKLQotLyogR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgKi8KLSNpZm5kZWYgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QKLSNkZWZpbmUgR0xfT0VTX3ZlcnRleF9hcnJheV9vYmplY3QgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJpbmRWZXJ0ZXhBcnJheU9FUyAoR0x1aW50IGFycmF5KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVZlcnRleEFycmF5c09FUyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZW5WZXJ0ZXhBcnJheXNPRVMgKEdMc2l6ZWkgbiwgR0x1aW50ICphcnJheXMpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xJc1ZlcnRleEFycmF5T0VTIChHTHVpbnQgYXJyYXkpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJJTkRWRVJURVhBUlJBWU9FU1BST0MpIChHTHVpbnQgYXJyYXkpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xERUxFVEVWRVJURVhBUlJBWVNPRVNQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTlZFUlRFWEFSUkFZU09FU1BST0MpIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1ZFUlRFWEFSUkFZT0VTUFJPQykgKEdMdWludCBhcnJheSk7Ci0jZW5kaWYKLQotLyogR0xfT0VTX3ZlcnRleF9oYWxmX2Zsb2F0ICovCi0jaWZuZGVmIEdMX09FU192ZXJ0ZXhfaGFsZl9mbG9hdAotI2RlZmluZSBHTF9PRVNfdmVydGV4X2hhbGZfZmxvYXQgMQotI2VuZGlmCi0KLS8qIEdMX09FU192ZXJ0ZXhfdHlwZV8xMF8xMF8xMF8yICovCi0jaWZuZGVmIEdMX09FU192ZXJ0ZXhfdHlwZV8xMF8xMF8xMF8yCi0jZGVmaW5lIEdMX09FU192ZXJ0ZXhfdHlwZV8xMF8xMF8xMF8yIDEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFNRCBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlICovCi0jaWZuZGVmIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlCi0jZGVmaW5lIEdMX0FNRF9jb21wcmVzc2VkXzNEQ190ZXh0dXJlIDEKLSNlbmRpZgotCi0vKiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAqLwotI2lmbmRlZiBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZQotI2RlZmluZSBHTF9BTURfY29tcHJlc3NlZF9BVENfdGV4dHVyZSAxCi0jZW5kaWYKLQotLyogQU1EX3BlcmZvcm1hbmNlX21vbml0b3IgKi8KLSNpZm5kZWYgR0xfQU1EX3BlcmZvcm1hbmNlX21vbml0b3IKLSNkZWZpbmUgR0xfQU1EX3BlcmZvcm1hbmNlX21vbml0b3IgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EIChHTGludCAqbnVtR3JvdXBzLCBHTHNpemVpIGdyb3Vwc1NpemUsIEdMdWludCAqZ3JvdXBzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQgKEdMdWludCBncm91cCwgR0xpbnQgKm51bUNvdW50ZXJzLCBHTGludCAqbWF4QWN0aXZlQ291bnRlcnMsIEdMc2l6ZWkgY291bnRlclNpemUsIEdMdWludCAqY291bnRlcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQgKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUGVyZk1vbml0b3JzQU1EIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRGVsZXRlUGVyZk1vbml0b3JzQU1EIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJlZ2luUGVyZk1vbml0b3JBTUQgKEdMdWludCBtb25pdG9yKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEVuZFBlcmZNb25pdG9yQU1EIChHTHVpbnQgbW9uaXRvcik7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EIChHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SR1JPVVBTQU1EUFJPQykgKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJTQU1EUFJPQykgKEdMdWludCBncm91cCwgR0xpbnQgKm51bUNvdW50ZXJzLCBHTGludCAqbWF4QWN0aXZlQ291bnRlcnMsIEdMc2l6ZWkgY291bnRlclNpemUsIEdMdWludCAqY291bnRlcnMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkdST1VQU1RSSU5HQU1EUFJPQykgKEdMdWludCBncm91cCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZ3JvdXBTdHJpbmcpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRQRVJGTU9OSVRPUkNPVU5URVJTVFJJTkdBTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBFUkZNT05JVE9SQ09VTlRFUklORk9BTURQUk9DKSAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRU5QRVJGTU9OSVRPUlNBTURQUk9DKSAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUEVSRk1PTklUT1JTQU1EUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFNFTEVDVFBFUkZNT05JVE9SQ09VTlRFUlNBTURQUk9DKSAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkVHSU5QRVJGTU9OSVRPUkFNRFBST0MpIChHTHVpbnQgbW9uaXRvcik7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVORFBFUkZNT05JVE9SQU1EUFJPQykgKEdMdWludCBtb25pdG9yKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUEVSRk1PTklUT1JDT1VOVEVSREFUQUFNRFBST0MpIChHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pOwotI2VuZGlmCi0KLS8qIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwICovCi0jaWZuZGVmIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwCi0jZGVmaW5lIEdMX0FNRF9wcm9ncmFtX2JpbmFyeV9aNDAwIDEKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqIEFOR0xFIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfQU5HTEVfZnJhbWVidWZmZXJfYmxpdCAqLwotI2lmbmRlZiBHTF9BTkdMRV9mcmFtZWJ1ZmZlcl9ibGl0Ci0jZGVmaW5lIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX2JsaXQgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFIChHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQkxJVEZSQU1FQlVGRkVSQU5HTEVQUk9DKSAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpOwotI2VuZGlmCi0KLS8qIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlICovCi0jaWZuZGVmIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlCi0jZGVmaW5lIEdMX0FOR0xFX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVBTkdMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogQVBQTEUgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BUFBMRV9yZ2JfNDIyICovCi0jaWZuZGVmIEdMX0FQUExFX3JnYl80MjIKLSNkZWZpbmUgR0xfQVBQTEVfcmdiXzQyMiAxCi0jZW5kaWYKLQotLyogR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgKi8KLSNpZm5kZWYgR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUKLSNkZWZpbmUgR0xfQVBQTEVfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSAodm9pZCk7Ci0jZW5kaWYgLyogR0xfR0xFWFRfUFJPVE9UWVBFUyAqLwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRU5ERVJCVUZGRVJTVE9SQUdFTVVMVElTQU1QTEVBUFBMRVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRVNPTFZFTVVMVElTQU1QTEVGUkFNRUJVRkZFUkFQUExFUFJPQykgKHZvaWQpOwotI2VuZGlmCi0KLS8qIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCi0jaWZuZGVmIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4Ci0jZGVmaW5lIEdMX0FQUExFX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4IDEKLSNlbmRpZgotCi0vKiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAqLwotI2lmbmRlZiBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbAotI2RlZmluZSBHTF9BUFBMRV90ZXh0dXJlX21heF9sZXZlbCAxCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiBBUk0gZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9BUk1fbWFsaV9zaGFkZXJfYmluYXJ5ICovCi0jaWZuZGVmIEdMX0FSTV9tYWxpX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfQVJNX21hbGlfc2hhZGVyX2JpbmFyeSAxCi0jZW5kaWYKLQotLyogR0xfQVJNX3JnYmE4ICovCi0jaWZuZGVmIEdMX0FSTV9yZ2JhOAotI2RlZmluZSBHTF9BUk1fcmdiYTggMQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRVhUIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfRVhUX2JsZW5kX21pbm1heCAqLwotI2lmbmRlZiBHTF9FWFRfYmxlbmRfbWlubWF4Ci0jZGVmaW5lIEdMX0VYVF9ibGVuZF9taW5tYXggMQotI2VuZGlmCi0KLS8qIEdMX0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCAqLwotI2lmbmRlZiBHTF9FWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQKLSNkZWZpbmUgR0xfRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0IDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfZGVidWdfbGFiZWwgKi8KLSNpZm5kZWYgR0xfRVhUX2RlYnVnX2xhYmVsCi0jZGVmaW5lIEdMX0VYVF9kZWJ1Z19sYWJlbCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsTGFiZWxPYmplY3RFWFQgKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRPYmplY3RMYWJlbEVYVCAoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xMQUJFTE9CSkVDVEVYVFBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVRPQkpFQ1RMQUJFTEVYVFBST0MpIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9kZWJ1Z19tYXJrZXIgKi8KLSNpZm5kZWYgR0xfRVhUX2RlYnVnX21hcmtlcgotI2RlZmluZSBHTF9FWFRfZGVidWdfbWFya2VyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xJbnNlcnRFdmVudE1hcmtlckVYVCAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFB1c2hHcm91cE1hcmtlckVYVCAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFBvcEdyb3VwTWFya2VyRVhUICh2b2lkKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xJTlNFUlRFVkVOVE1BUktFUkVYVFBST0MpIChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQVVNIR1JPVVBNQVJLRVJFWFRQUk9DKSAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUE9QR1JPVVBNQVJLRVJFWFRQUk9DKSAodm9pZCk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgKi8KLSNpZm5kZWYgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIKLSNkZWZpbmUgR0xfRVhUX2Rpc2NhcmRfZnJhbWVidWZmZXIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRElTQ0FSREZSQU1FQlVGRkVSRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfRVhUX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQotI2RlZmluZSBHTF9FWFRfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xGUkFNRUJVRkZFUlRFWFRVUkUyRE1VTFRJU0FNUExFRVhUUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBHTF9FWFRfbXVsdGlfZHJhd19hcnJheXMKLSNkZWZpbmUgR0xfRVhUX211bHRpX2RyYXdfYXJyYXlzIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0aURyYXdBcnJheXNFWFQgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xNdWx0aURyYXdFbGVtZW50c0VYVCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwotI2VuZGlmIC8qIEdMX0dMRVhUX1BST1RPVFlQRVMgKi8KLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMTVVMVElEUkFXQVJSQVlTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTE1VTFRJRFJBV0VMRU1FTlRTRVhUUFJPQykgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfb2NjbHVzaW9uX3F1ZXJ5X2Jvb2xlYW4gKi8KLSNpZm5kZWYgR0xfRVhUX29jY2x1c2lvbl9xdWVyeV9ib29sZWFuCi0jZGVmaW5lIEdMX0VYVF9vY2NsdXNpb25fcXVlcnlfYm9vbGVhbiAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUXVlcmllc0VYVCAoR0xzaXplaSBuLCBHTHVpbnQgKmlkcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xEZWxldGVRdWVyaWVzRVhUIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNRdWVyeUVYVCAoR0x1aW50IGlkKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEJlZ2luUXVlcnlFWFQgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmRRdWVyeUVYVCAoR0xlbnVtIHRhcmdldCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXRRdWVyeWl2RVhUIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UXVlcnlPYmplY3R1aXZFWFQgKEdMdWludCBpZCwgR0xlbnVtIHBuYW1lLCBHTHVpbnQgKnBhcmFtcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOUVVFUklFU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUVVFUklFU0VYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1FVRVJZRVhUUFJPQykgKEdMdWludCBpZCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJFR0lOUVVFUllFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRU5EUVVFUllFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFFVRVJZSVZFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUVVFUllPQkpFQ1RVSVZFWFRQUk9DKSAoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAqLwotI2lmbmRlZiBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYQotI2RlZmluZSBHTF9FWFRfcmVhZF9mb3JtYXRfYmdyYSAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3JvYnVzdG5lc3MgKi8KLSNpZm5kZWYgR0xfRVhUX3JvYnVzdG5lc3MKLSNkZWZpbmUgR0xfRVhUX3JvYnVzdG5lc3MgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgR0xlbnVtIEdMX0FQSUVOVFJZIGdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCAodm9pZCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZWFkblBpeGVsc0VYVCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0blVuaWZvcm1mdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0blVuaWZvcm1pdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpOwotI2VuZGlmCi10eXBlZGVmIEdMZW51bSAoR0xfQVBJRU5UUllQIFBGTkdMR0VUR1JBUEhJQ1NSRVNFVFNUQVRVU0VYVFBST0MpICh2b2lkKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUkVBRE5QSVhFTFNFWFRQUk9DKSAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVROVU5JRk9STUZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBmbG9hdCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUTlVOSUZPUk1JVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7Ci0jZW5kaWYKLQotLyogR0xfRVhUX3NlcGFyYXRlX3NoYWRlcl9vYmplY3RzICovCi0jaWZuZGVmIEdMX0VYVF9zZXBhcmF0ZV9zaGFkZXJfb2JqZWN0cwotI2RlZmluZSBHTF9FWFRfc2VwYXJhdGVfc2hhZGVyX29iamVjdHMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFVzZVByb2dyYW1TdGFnZXNFWFQgKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQgKEdMdWludCBwaXBlbGluZSwgR0x1aW50IHByb2dyYW0pOwotR0xfQVBJQ0FMTCBHTHVpbnQgR0xfQVBJRU5UUlkgZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqKnN0cmluZ3MpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCAoR0x1aW50IHBpcGVsaW5lKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCAoR0xzaXplaSBuLCBHTHVpbnQgKnBpcGVsaW5lcyk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbElzUHJvZ3JhbVBpcGVsaW5lRVhUIChHTHVpbnQgcGlwZWxpbmUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVBhcmFtZXRlcmlFWFQgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldFByb2dyYW1QaXBlbGluZWl2RVhUIChHTHVpbnQgcGlwZWxpbmUsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTFpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yaUVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2lFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTRpRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0yZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNmRVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00ZkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMml2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMWZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtMmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtNGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUIChHTHVpbnQgcGlwZWxpbmUpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCAoR0x1aW50IHBpcGVsaW5lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xVU0VQUk9HUkFNU1RBR0VTRVhUUFJPQykgKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQUNUSVZFU0hBREVSUFJPR1JBTUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKTsKLXR5cGVkZWYgR0x1aW50IChHTF9BUElFTlRSWVAgUEZOR0xDUkVBVEVTSEFERVJQUk9HUkFNVkVYVFBST0MpIChHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqc3RyaW5ncyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEJJTkRQUk9HUkFNUElQRUxJTkVFWFRQUk9DKSAoR0x1aW50IHBpcGVsaW5lKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFUFJPR1JBTVBJUEVMSU5FU0VYVFBST0MpIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VOUFJPR1JBTVBJUEVMSU5FU0VYVFBST0MpIChHTHNpemVpIG4sIEdMdWludCAqcGlwZWxpbmVzKTsKLXR5cGVkZWYgR0xib29sZWFuIChHTF9BUElFTlRSWVAgUEZOR0xJU1BST0dSQU1QSVBFTElORUVYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNUEFSQU1FVEVSSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCB2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVFBST0dSQU1QSVBFTElORUlWRVhUUFJPQykgKEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xSUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00SUVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0zRkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRGRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0xSVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTJJVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0lWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk00SVZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTFGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk0yRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STTRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMUFJPR1JBTVVOSUZPUk1NQVRSSVgyRlZFWFRQUk9DKSAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFBST0dSQU1VTklGT1JNTUFUUklYM0ZWRVhUUFJPQykgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xQUk9HUkFNVU5JRk9STU1BVFJJWDRGVkVYVFBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMVkFMSURBVEVQUk9HUkFNUElQRUxJTkVFWFRQUk9DKSAoR0x1aW50IHBpcGVsaW5lKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMR0VUUFJPR1JBTVBJUEVMSU5FSU5GT0xPR0VYVFBST0MpIChHTHVpbnQgcGlwZWxpbmUsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmluZm9Mb2cpOwotI2VuZGlmCi0KLS8qIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgKi8KLSNpZm5kZWYgR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZAotI2RlZmluZSBHTF9FWFRfc2hhZGVyX3RleHR1cmVfbG9kIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfc2hhZG93X3NhbXBsZXJzICovCi0jaWZuZGVmIEdMX0VYVF9zaGFkb3dfc2FtcGxlcnMKLSNkZWZpbmUgR0xfRVhUX3NoYWRvd19zYW1wbGVycyAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3NSR0IgKi8KLSNpZm5kZWYgR0xfRVhUX3NSR0IKLSNkZWZpbmUgR0xfRVhUX3NSR0IgMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX2NvbXByZXNzaW9uX2R4dDEgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fZHh0MQotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9keHQxIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMgKi8KLSNpZm5kZWYgR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3RleHR1cmVfZm9ybWF0X0JHUkE4ODg4ICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX2Zvcm1hdF9CR1JBODg4OAotI2RlZmluZSBHTF9FWFRfdGV4dHVyZV9mb3JtYXRfQkdSQTg4ODggMQotI2VuZGlmCi0KLS8qIEdMX0VYVF90ZXh0dXJlX3JnICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3JnCi0jZGVmaW5lIEdMX0VYVF90ZXh0dXJlX3JnIDEKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV9zdG9yYWdlICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3N0b3JhZ2UKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfc3RvcmFnZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTFERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFRleFN0b3JhZ2UyREVYVCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4U3RvcmFnZTNERVhUIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTFERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXh0dXJlU3RvcmFnZTJERVhUIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4dHVyZVN0b3JhZ2UzREVYVCAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhTVE9SQUdFMURFWFRQUk9DKSAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFNUT1JBR0UyREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFNUT1JBR0UzREVYVFBST0MpIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFRVUkVTVE9SQUdFMURFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xURVhUVVJFU1RPUkFHRTJERVhUUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFRFWFRVUkVTVE9SQUdFM0RFWFRQUk9DKSAoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLSNlbmRpZgotCi0vKiBHTF9FWFRfdGV4dHVyZV90eXBlXzJfMTBfMTBfMTBfUkVWICovCi0jaWZuZGVmIEdMX0VYVF90ZXh0dXJlX3R5cGVfMl8xMF8xMF8xMF9SRVYKLSNkZWZpbmUgR0xfRVhUX3RleHR1cmVfdHlwZV8yXzEwXzEwXzEwX1JFViAxCi0jZW5kaWYKLQotLyogR0xfRVhUX3VucGFja19zdWJpbWFnZSAqLwotI2lmbmRlZiBHTF9FWFRfdW5wYWNrX3N1YmltYWdlCi0jZGVmaW5lIEdMX0VYVF91bnBhY2tfc3ViaW1hZ2UgMQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogRE1QIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfRE1QX3NoYWRlcl9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfRE1QX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfRE1QX3NoYWRlcl9iaW5hcnkgMQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogSU1HIGV4dGVuc2lvbiBmdW5jdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfSU1HX3Byb2dyYW1fYmluYXJ5ICovCi0jaWZuZGVmIEdMX0lNR19wcm9ncmFtX2JpbmFyeQotI2RlZmluZSBHTF9JTUdfcHJvZ3JhbV9iaW5hcnkgMQotI2VuZGlmCi0KLS8qIEdMX0lNR19yZWFkX2Zvcm1hdCAqLwotI2lmbmRlZiBHTF9JTUdfcmVhZF9mb3JtYXQKLSNkZWZpbmUgR0xfSU1HX3JlYWRfZm9ybWF0IDEKLSNlbmRpZgotCi0vKiBHTF9JTUdfc2hhZGVyX2JpbmFyeSAqLwotI2lmbmRlZiBHTF9JTUdfc2hhZGVyX2JpbmFyeQotI2RlZmluZSBHTF9JTUdfc2hhZGVyX2JpbmFyeSAxCi0jZW5kaWYKLQotLyogR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgKi8KLSNpZm5kZWYgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMKLSNkZWZpbmUgR0xfSU1HX3RleHR1cmVfY29tcHJlc3Npb25fcHZydGMgMQotI2VuZGlmCi0KLS8qIEdMX0lNR19tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUgKi8KLSNpZm5kZWYgR0xfSU1HX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZQotI2RlZmluZSBHTF9JTUdfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTFJFTkRFUkJVRkZFUlNUT1JBR0VNVUxUSVNBTVBMRUlNRykgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZSQU1FQlVGRkVSVEVYVFVSRTJETVVMVElTQU1QTEVJTUcpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogTlYgZXh0ZW5zaW9uIGZ1bmN0aW9ucwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHTF9OVl9jb3ZlcmFnZV9zYW1wbGUgKi8KLSNpZm5kZWYgR0xfTlZfY292ZXJhZ2Vfc2FtcGxlCi0jZGVmaW5lIEdMX05WX2NvdmVyYWdlX3NhbXBsZSAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsQ292ZXJhZ2VNYXNrTlYgKEdMYm9vbGVhbiBtYXNrKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbENvdmVyYWdlT3BlcmF0aW9uTlYgKEdMZW51bSBvcGVyYXRpb24pOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTENPVkVSQUdFTUFTS05WUFJPQykgKEdMYm9vbGVhbiBtYXNrKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMQ09WRVJBR0VPUEVSQVRJT05OVlBST0MpIChHTGVudW0gb3BlcmF0aW9uKTsKLSNlbmRpZgotCi0vKiBHTF9OVl9kZXB0aF9ub25saW5lYXIgKi8KLSNpZm5kZWYgR0xfTlZfZGVwdGhfbm9ubGluZWFyCi0jZGVmaW5lIEdMX05WX2RlcHRoX25vbmxpbmVhciAxCi0jZW5kaWYKLQotLyogR0xfTlZfZHJhd19idWZmZXJzICovCi0jaWZuZGVmIEdMX05WX2RyYXdfYnVmZmVycwotI2RlZmluZSBHTF9OVl9kcmF3X2J1ZmZlcnMgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERyYXdCdWZmZXJzTlYgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xEUkFXQlVGRkVSU05WUFJPQykgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKTsKLSNlbmRpZgotCi0vKiBHTF9OVl9mYm9fY29sb3JfYXR0YWNobWVudHMgKi8KLSNpZm5kZWYgR0xfTlZfZmJvX2NvbG9yX2F0dGFjaG1lbnRzCi0jZGVmaW5lIEdMX05WX2Zib19jb2xvcl9hdHRhY2htZW50cyAxCi0jZW5kaWYKLQotLyogR0xfTlZfZmVuY2UgKi8KLSNpZm5kZWYgR0xfTlZfZmVuY2UKLSNkZWZpbmUgR0xfTlZfZmVuY2UgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERlbGV0ZUZlbmNlc05WIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdlbkZlbmNlc05WIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKTsKLUdMX0FQSUNBTEwgR0xib29sZWFuIEdMX0FQSUVOVFJZIGdsSXNGZW5jZU5WIChHTHVpbnQgZmVuY2UpOwotR0xfQVBJQ0FMTCBHTGJvb2xlYW4gR0xfQVBJRU5UUlkgZ2xUZXN0RmVuY2VOViAoR0x1aW50IGZlbmNlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEdldEZlbmNlaXZOViAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRmluaXNoRmVuY2VOViAoR0x1aW50IGZlbmNlKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbFNldEZlbmNlTlYgKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMREVMRVRFRkVOQ0VTTlZQUk9DKSAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFTkZFTkNFU05WUFJPQykgKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTElTRkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTFRFU1RGRU5DRU5WUFJPQykgKEdMdWludCBmZW5jZSk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVEZFTkNFSVZOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEZJTklTSEZFTkNFTlZQUk9DKSAoR0x1aW50IGZlbmNlKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU0VURkVOQ0VOVlBST0MpIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pOwotI2VuZGlmCi0KLS8qIEdMX05WX3JlYWRfYnVmZmVyICovCi0jaWZuZGVmIEdMX05WX3JlYWRfYnVmZmVyCi0jZGVmaW5lIEdMX05WX3JlYWRfYnVmZmVyIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xSZWFkQnVmZmVyTlYgKEdMZW51bSBtb2RlKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xSRUFEQlVGRkVSTlZQUk9DKSAoR0xlbnVtIG1vZGUpOwotI2VuZGlmCi0KLS8qIEdMX05WX3JlYWRfYnVmZmVyX2Zyb250ICovCi0jaWZuZGVmIEdMX05WX3JlYWRfYnVmZmVyX2Zyb250Ci0jZGVmaW5lIEdMX05WX3JlYWRfYnVmZmVyX2Zyb250IDEKLSNlbmRpZgotCi0vKiBHTF9OVl9yZWFkX2RlcHRoICovCi0jaWZuZGVmIEdMX05WX3JlYWRfZGVwdGgKLSNkZWZpbmUgR0xfTlZfcmVhZF9kZXB0aCAxCi0jZW5kaWYKLQotLyogR0xfTlZfcmVhZF9kZXB0aF9zdGVuY2lsICovCi0jaWZuZGVmIEdMX05WX3JlYWRfZGVwdGhfc3RlbmNpbAotI2RlZmluZSBHTF9OVl9yZWFkX2RlcHRoX3N0ZW5jaWwgMQotI2VuZGlmCi0KLS8qIEdMX05WX3JlYWRfc3RlbmNpbCAqLwotI2lmbmRlZiBHTF9OVl9yZWFkX3N0ZW5jaWwKLSNkZWZpbmUgR0xfTlZfcmVhZF9zdGVuY2lsIDEKLSNlbmRpZgotCi0vKiBHTF9OVl90ZXh0dXJlX2NvbXByZXNzaW9uX3MzdGNfdXBkYXRlICovCi0jaWZuZGVmIEdMX05WX3RleHR1cmVfY29tcHJlc3Npb25fczN0Y191cGRhdGUKLSNkZWZpbmUgR0xfTlZfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjX3VwZGF0ZSAxCi0jZW5kaWYKLQotLyogR0xfTlZfdGV4dHVyZV9ucG90XzJEX21pcG1hcCAqLwotI2lmbmRlZiBHTF9OVl90ZXh0dXJlX25wb3RfMkRfbWlwbWFwCi0jZGVmaW5lIEdMX05WX3RleHR1cmVfbnBvdF8yRF9taXBtYXAgMQotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogUUNPTSBleHRlbnNpb24gZnVuY3Rpb25zCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIEdMX1FDT01fYWxwaGFfdGVzdCAqLwotI2lmbmRlZiBHTF9RQ09NX2FscGhhX3Rlc3QKLSNkZWZpbmUgR0xfUUNPTV9hbHBoYV90ZXN0IDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xBbHBoYUZ1bmNRQ09NIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xBTFBIQUZVTkNRQ09NUFJPQykgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOwotI2VuZGlmCi0KLS8qIEdMX1FDT01fZHJpdmVyX2NvbnRyb2wgKi8KLSNpZm5kZWYgR0xfUUNPTV9kcml2ZXJfY29udHJvbAotI2RlZmluZSBHTF9RQ09NX2RyaXZlcl9jb250cm9sIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXREcml2ZXJDb250cm9sc1FDT00gKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSAoR0x1aW50IGRyaXZlckNvbnRyb2wsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmRyaXZlckNvbnRyb2xTdHJpbmcpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gKEdMdWludCBkcml2ZXJDb250cm9sKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSAoR0x1aW50IGRyaXZlckNvbnRyb2wpOwotI2VuZGlmCi10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEdFVERSSVZFUkNPTlRST0xTUUNPTVBST0MpIChHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xHRVREUklWRVJDT05UUk9MU1RSSU5HUUNPTVBST0MpIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVOQUJMRURSSVZFUkNPTlRST0xRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRElTQUJMRURSSVZFUkNPTlRST0xRQ09NUFJPQykgKEdMdWludCBkcml2ZXJDb250cm9sKTsKLSNlbmRpZgotCi0vKiBHTF9RQ09NX2V4dGVuZGVkX2dldCAqLwotI2lmbmRlZiBHTF9RQ09NX2V4dGVuZGVkX2dldAotI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldCAxCi0jaWZkZWYgR0xfR0xFWFRfUFJPVE9UWVBFUwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4dHVyZXNRQ09NIChHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEJ1ZmZlcnNRQ09NIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NIChHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00gKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00gKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00gKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pOwotR0xfQVBJQ0FMTCB2b2lkIEdMX0FQSUVOVFJZIGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscyk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYVFVSRVNRQ09NUFJPQykgKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRCVUZGRVJTUUNPTVBST0MpIChHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUkVOREVSQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVEZSQU1FQlVGRkVSU1FDT01QUk9DKSAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVEdFVFRFWExFVkVMUEFSQU1FVEVSSVZRQ09NUFJPQykgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVYVFRFWE9CSkVDVFNUQVRFT1ZFUlJJREVJUUNPTVBST0MpIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUVEVYU1VCSU1BR0VRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUQlVGRkVSUE9JTlRFUlZRQ09NUFJPQykgKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcyk7Ci0jZW5kaWYKLQotLyogR0xfUUNPTV9leHRlbmRlZF9nZXQyICovCi0jaWZuZGVmIEdMX1FDT01fZXh0ZW5kZWRfZ2V0MgotI2RlZmluZSBHTF9RQ09NX2V4dGVuZGVkX2dldDIgMQotI2lmZGVmIEdMX0dMRVhUX1BST1RPVFlQRVMKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFNoYWRlcnNRQ09NIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFByb2dyYW1zUUNPTSAoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcyk7Ci1HTF9BUElDQUxMIEdMYm9vbGVhbiBHTF9BUElFTlRSWSBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00gKEdMdWludCBwcm9ncmFtKTsKLUdMX0FQSUNBTEwgdm9pZCBHTF9BUElFTlRSWSBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKLSNlbmRpZgotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRTSEFERVJTUUNPTVBST0MpIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKTsKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMRVhUR0VUUFJPR1JBTVNRQ09NUFJPQykgKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOwotdHlwZWRlZiBHTGJvb2xlYW4gKEdMX0FQSUVOVFJZUCBQRk5HTEVYVElTUFJPR1JBTUJJTkFSWVFDT01QUk9DKSAoR0x1aW50IHByb2dyYW0pOwotdHlwZWRlZiB2b2lkIChHTF9BUElFTlRSWVAgUEZOR0xFWFRHRVRQUk9HUkFNQklOQVJZU09VUkNFUUNPTVBST0MpIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKTsKLSNlbmRpZgotCi0vKiBHTF9RQ09NX3BlcmZtb25fZ2xvYmFsX21vZGUgKi8KLSNpZm5kZWYgR0xfUUNPTV9wZXJmbW9uX2dsb2JhbF9tb2RlCi0jZGVmaW5lIEdMX1FDT01fcGVyZm1vbl9nbG9iYWxfbW9kZSAxCi0jZW5kaWYKLQotLyogR0xfUUNPTV93cml0ZW9ubHlfcmVuZGVyaW5nICovCi0jaWZuZGVmIEdMX1FDT01fd3JpdGVvbmx5X3JlbmRlcmluZwotI2RlZmluZSBHTF9RQ09NX3dyaXRlb25seV9yZW5kZXJpbmcgMQotI2VuZGlmCi0KLS8qIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nICovCi0jaWZuZGVmIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nCi0jZGVmaW5lIEdMX1FDT01fdGlsZWRfcmVuZGVyaW5nIDEKLSNpZmRlZiBHTF9HTEVYVF9QUk9UT1RZUEVTCi1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xTdGFydFRpbGluZ1FDT00gKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci1HTF9BUElDQUxMIHZvaWQgR0xfQVBJRU5UUlkgZ2xFbmRUaWxpbmdRQ09NIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZCAoR0xfQVBJRU5UUllQIFBGTkdMU1RBUlRUSUxJTkdRQ09NUFJPQykgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci10eXBlZGVmIHZvaWQgKEdMX0FQSUVOVFJZUCBQRk5HTEVORFRJTElOR1FDT01QUk9DKSAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spOwotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogVklWIGV4dGVuc2lvbiB0b2tlbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR0xfVklWX3NoYWRlcl9iaW5hcnkgKi8KLSNpZm5kZWYgR0xfVklWX3NoYWRlcl9iaW5hcnkKLSNkZWZpbmUgR0xfVklWX3NoYWRlcl9iaW5hcnkgMQotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX2dsMmV4dF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wycGxhdGZvcm0uaCBiL29wZW5nbC9pbmNsdWRlL0dMRVMyL2dsMnBsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZmEzYzQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvR0xFUzIvZ2wycGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNpZm5kZWYgX19nbDJwbGF0Zm9ybV9oXwotI2RlZmluZSBfX2dsMnBsYXRmb3JtX2hfCi0KLS8qICRSZXZpc2lvbjogMTA2MDIgJCBvbiAkRGF0ZTo6IDIwMTAtMDMtMDQgMjI6MzU6MzQgLTA4MDAgIyQgKi8KLQotLyoKLSAqIFRoaXMgZG9jdW1lbnQgaXMgbGljZW5zZWQgdW5kZXIgdGhlIFNHSSBGcmVlIFNvZnR3YXJlIEIgTGljZW5zZSBWZXJzaW9uCi0gKiAyLjAuIEZvciBkZXRhaWxzLCBzZWUgaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0ZyZWVCLyAuCi0gKi8KLQotLyogUGxhdGZvcm0tc3BlY2lmaWMgdHlwZXMgYW5kIGRlZmluaXRpb25zIGZvciBPcGVuR0wgRVMgMi5YICBnbDIuaAotICoKLSAqIEFkb3B0ZXJzIG1heSBtb2RpZnkga2hycGxhdGZvcm0uaCBhbmQgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uCi0gKiBZb3UgYXJlIGVuY291cmFnZWQgdG8gc3VibWl0IGFsbCBtb2RpZmljYXRpb25zIHRvIHRoZSBLaHJvbm9zIGdyb3VwIHNvIHRoYXQKLSAqIHRoZXkgY2FuIGJlIGluY2x1ZGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUuICBQbGVhc2Ugc3VibWl0IGNoYW5nZXMKLSAqIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEgKGh0dHA6Ly9raHJvbm9zLm9yZy9idWd6aWxsYSkKLSAqIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QgIk9wZW5HTC1FUyIgY29tcG9uZW50ICJSZWdpc3RyeSIuCi0gKi8KLQotI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgotCi0jaWZuZGVmIEdMX0FQSUNBTEwKLSNkZWZpbmUgR0xfQVBJQ0FMTCAgS0hST05PU19BUElDQUxMCi0jZW5kaWYKLQotI2lmbmRlZiBHTF9BUElFTlRSWQotI2RlZmluZSBHTF9BUElFTlRSWSBLSFJPTk9TX0FQSUVOVFJZCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fZ2wycGxhdGZvcm1faF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC9pbmNsdWRlL0tIUi9raHJwbGF0Zm9ybS5oIGIvb3BlbmdsL2luY2x1ZGUvS0hSL2tocnBsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NjBiZDcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2luY2x1ZGUvS0hSL2tocnBsYXRmb3JtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotI2lmbmRlZiBfX2tocnBsYXRmb3JtX2hfCi0jZGVmaW5lIF9fa2hycGxhdGZvcm1faF8KLQotLyoKLSoqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KLSoqCi0qKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotKiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZC9vciBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQotKiogIk1hdGVyaWFscyIpLCB0byBkZWFsIGluIHRoZSBNYXRlcmlhbHMgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCi0qKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCi0qKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIE1hdGVyaWFscywgYW5kIHRvCi0qKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBNYXRlcmlhbHMgYXJlIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwotKiogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotKioKLSoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0qKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBNYXRlcmlhbHMuCi0qKgotKiogVEhFIE1BVEVSSUFMUyBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSoqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgotKiogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgotKiogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSoqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCi0qKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotKiogTUFURVJJQUxTIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIE1BVEVSSUFMUy4KLSovCi0KLS8qIFBsYXRmb3JtLXNwZWNpZmljIHR5cGVzIGFuZCBkZWZpbml0aW9ucy4KLSAqICRSZXZpc2lvbjogNzI0NCAkIG9uICREYXRlOiAyMDA5LTAxLTIwIDE3OjA2OjU5IC0wODAwIChUdWUsIDIwIEphbiAyMDA5KSAkCi0gKiAKLSAqIEFkb3B0ZXJzIG1heSBtb2RpZnkgdGhpcyBmaWxlIHRvIHN1aXQgdGhlaXIgcGxhdGZvcm0uIEFkb3B0ZXJzIGFyZQotICogZW5jb3VyYWdlZCB0byBzdWJtaXQgcGxhdGZvcm0gc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyB0byB0aGUgS2hyb25vcwotICogZ3JvdXAgc28gdGhhdCB0aGV5IGNhbiBiZSBpbmNsdWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhpcyBmaWxlLgotICogUGxlYXNlIHN1Ym1pdCBjaGFuZ2VzIGJ5IHNlbmRpbmcgdGhlbSB0byB0aGUgcHVibGljIEtocm9ub3MgQnVnemlsbGEKLSAqIChodHRwOi8va2hyb25vcy5vcmcvYnVnemlsbGEpIGJ5IGZpbGluZyBhIGJ1ZyBhZ2FpbnN0IHByb2R1Y3QKLSAqICJLaHJvbm9zIChnZW5lcmFsKSIgY29tcG9uZW50ICJSZWdpc3RyeSIuCi0gKgotICogQSBwcmVkZWZpbmVkIHRlbXBsYXRlIHdoaWNoIGZpbGxzIGluIHNvbWUgb2YgdGhlIGJ1ZyBmaWVsZHMgY2FuIGJlCi0gKiByZWFjaGVkIHVzaW5nIGh0dHA6Ly90aW55dXJsLmNvbS9raHJwbGF0Zm9ybS1oLWJ1Z3JlcG9ydCwgYnV0IHlvdQotICogbXVzdCBjcmVhdGUgYSBCdWd6aWxsYSBsb2dpbiBmaXJzdC4KLSAqIAotICoKLSAqIFNlZSB0aGUgSW1wbGVtZW50ZXIncyBHdWlkZWxpbmVzIGZvciBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGlzIGZpbGUKLSAqIHNob3VsZCBiZSBsb2NhdGVkIG9uIHlvdXIgc3lzdGVtLgotICogICAgaHR0cDovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9pbXBsZW1lbnRlcnNfZ3VpZGUucGRmCi0gKgotICogCi0gKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCi0gKiAgICAgICAgI2luY2x1ZGUgPEtIUi9raHJwbGF0Zm9ybS5oPgotICogYnkgdGhlIEtocm9ub3MgQVBJIGhlYWRlciBmaWxlIHRoYXQgdXNlcyBpdHMgdHlwZXMgYW5kIGRlZmluZXMuCi0gKgotICogVGhlIHR5cGVzIGluIHRoaXMgZmlsZSBzaG91bGQgb25seSBiZSB1c2VkIHRvIGRlZmluZSBBUEktc3BlY2lmaWMgdHlwZXMuCi0gKiBUeXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZToKLSAqICAgIGtocm9ub3NfaW50OF90ICAgICAgICAgICAgICBzaWduZWQgICA4ICBiaXQKLSAqICAgIGtocm9ub3NfdWludDhfdCAgICAgICAgICAgICB1bnNpZ25lZCA4ICBiaXQKLSAqICAgIGtocm9ub3NfaW50MTZfdCAgICAgICAgICAgICBzaWduZWQgICAxNiBiaXQKLSAqICAgIGtocm9ub3NfdWludDE2X3QgICAgICAgICAgICB1bnNpZ25lZCAxNiBiaXQKLSAqICAgIGtocm9ub3NfaW50MzJfdCAgICAgICAgICAgICBzaWduZWQgICAzMiBiaXQKLSAqICAgIGtocm9ub3NfdWludDMyX3QgICAgICAgICAgICB1bnNpZ25lZCAzMiBiaXQKLSAqICAgIGtocm9ub3NfaW50NjRfdCAgICAgICAgICAgICBzaWduZWQgICA2NCBiaXQKLSAqICAgIGtocm9ub3NfdWludDY0X3QgICAgICAgICAgICB1bnNpZ25lZCA2NCBiaXQKLSAqICAgIGtocm9ub3NfaW50cHRyX3QgICAgICAgICAgICBzaWduZWQgICBzYW1lIG51bWJlciBvZiBiaXRzIGFzIGEgcG9pbnRlcgotICogICAga2hyb25vc191aW50cHRyX3QgICAgICAgICAgIHVuc2lnbmVkIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgYSBwb2ludGVyCi0gKiAgICBraHJvbm9zX3NzaXplX3QgICAgICAgICAgICAgc2lnbmVkICAgc2l6ZQotICogICAga2hyb25vc191c2l6ZV90ICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUKLSAqICAgIGtocm9ub3NfZmxvYXRfdCAgICAgICAgICAgICBzaWduZWQgICAzMiBiaXQgZmxvYXRpbmcgcG9pbnQKLSAqICAgIGtocm9ub3NfdGltZV9uc190ICAgICAgICAgICB1bnNpZ25lZCA2NCBiaXQgdGltZSBpbiBuYW5vc2Vjb25kcwotICogICAga2hyb25vc191dGltZV9uYW5vc2Vjb25kc190IHVuc2lnbmVkIHRpbWUgaW50ZXJ2YWwgb3IgYWJzb2x1dGUgdGltZSBpbgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbm9zZWNvbmRzCi0gKiAgICBraHJvbm9zX3N0aW1lX25hbm9zZWNvbmRzX3Qgc2lnbmVkIHRpbWUgaW50ZXJ2YWwgaW4gbmFub3NlY29uZHMKLSAqCi0gKiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgaXMgMSBpZiA2NCBiaXQgaW50ZWdlcnMgYXJlIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIDAuCi0gKiBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgaXMgMSBpZiBmbG9hdHMgYXJlIHN1cHBvcnRlZDsgb3RoZXJ3aXNlIDAuCi0gKiAKLSAqCi0gKiBNYWNyb3MgZGVmaW5lZCBpbiB0aGlzIGZpbGU6Ci0gKiAgICBLSFJPTk9TX0FQSUNBTEwKLSAqICAgIEtIUk9OT1NfQVBJRU5UUlkKLSAqICAgIEtIUk9OT1NfQVBJQVRUUklCVVRFUwotICogVGhlc2UgbWF5IGJlIHVzZWQgaW4gZnVuY3Rpb24gcHJvdG90eXBlcyBhczoKLSAqICAgICAgS0hST05PU19BUElDQUxMIHZvaWQgS0hST05PU19BUElFTlRSWSBmdW5jbmFtZSgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmcxLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZzIpIEtIUk9OT1NfQVBJQVRUUklCVVRFUzsKLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIERlZmluaXRpb24gb2YgS0hST05PU19BUElDQUxMCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoaXMgcHJlY2VkZXMgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBpbiB0aGUgZnVuY3Rpb24gcHJvdG90eXBlLgotICovCi0jaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fU0NJVEVDSF9TTkFQX18pCi0jICAgZGVmaW5lIEtIUk9OT1NfQVBJQ0FMTCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSNlbGlmIGRlZmluZWQgKF9fU1lNQklBTjMyX18pCi0jICAgZGVmaW5lIEtIUk9OT1NfQVBJQ0FMTCBJTVBPUlRfQwotI2VsaWYgZGVmaW5lZChBTkRST0lEKQotIyAgIGRlZmluZSBLSFJPTk9TX0FQSUNBTEwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKLSNlbHNlCi0jICAgZGVmaW5lIEtIUk9OT1NfQVBJQ0FMTAotI2VuZGlmCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRGVmaW5pdGlvbiBvZiBLSFJPTk9TX0FQSUVOVFJZCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRoaXMgZm9sbG93cyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uICBhbmQgcHJlY2VkZXMgdGhlIGZ1bmN0aW9uCi0gKiBuYW1lIGluIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUuCi0gKi8KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKLSAgICAvKiBXaW4zMiBidXQgbm90IFdpbkNFICovCi0jICAgZGVmaW5lIEtIUk9OT1NfQVBJRU5UUlkgX19zdGRjYWxsCi0jZWxzZQotIyAgIGRlZmluZSBLSFJPTk9TX0FQSUVOVFJZCi0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBEZWZpbml0aW9uIG9mIEtIUk9OT1NfQVBJQVRUUklCVVRFUwotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGlzIGZvbGxvd3MgdGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgb2YgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBhcmd1bWVudHMuCi0gKi8KLSNpZiBkZWZpbmVkIChfX0FSTUNDXzJfXykKLSNkZWZpbmUgS0hST05PU19BUElBVFRSSUJVVEVTIF9fc29mdGZwCi0jZWxzZQotI2RlZmluZSBLSFJPTk9TX0FQSUFUVFJJQlVURVMKLSNlbmRpZgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIGJhc2ljIHR5cGUgZGVmaW5pdGlvbnMKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIChkZWZpbmVkKF9fU1REQ19WRVJTSU9OX18pICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkgfHwgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX1NDT19fKSB8fCBkZWZpbmVkKF9fVVNMQ19fKQotCi0KLS8qCi0gKiBVc2luZyA8c3RkaW50Lmg+Ci0gKi8KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLXR5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwotdHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwotdHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Ci10eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7Ci0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQotCi0jZWxpZiBkZWZpbmVkKF9fVk1TICkgfHwgZGVmaW5lZChfX3NnaSkKLQotLyoKLSAqIFVzaW5nIDxpbnR0eXBlcy5oPgotICovCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLXR5cGVkZWYgaW50MzJfdCAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwotdHlwZWRlZiB1aW50MzJfdCAgICAgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwotdHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Ci10eXBlZGVmIHVpbnQ2NF90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDY0X3Q7Ci0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQotCi0jZWxpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19TQ0lURUNIX1NOQVBfXykKLQotLyoKLSAqIFdpbjMyCi0gKi8KLXR5cGVkZWYgX19pbnQzMiAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyICAgICAgICBraHJvbm9zX3VpbnQzMl90OwotdHlwZWRlZiBfX2ludDY0ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDY0X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgICAgICAgIGtocm9ub3NfdWludDY0X3Q7Ci0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQotCi0jZWxpZiBkZWZpbmVkKF9fc3VuX18pIHx8IGRlZmluZWQoX19kaWdpdGFsX18pCi0KLS8qCi0gKiBTdW4gb3IgRGlnaXRhbAotICovCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICAgICAga2hyb25vc191aW50MzJfdDsKLSNpZiBkZWZpbmVkKF9fYXJjaDY0X18pIHx8IGRlZmluZWQoX0xQNjQpCi10eXBlZGVmIGxvbmcgaW50ICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBpbnQgICAgICAga2hyb25vc191aW50NjRfdDsKLSNlbHNlCi10eXBlZGVmIGxvbmcgbG9uZyBpbnQgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGludCAga2hyb25vc191aW50NjRfdDsKLSNlbmRpZiAvKiBfX2FyY2g2NF9fICovCi0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9JTlQ2NCAgIDEKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0ZMT0FUICAgMQotCi0jZWxpZiAwCi0KLS8qCi0gKiBIeXBvdGhldGljYWwgcGxhdGZvcm0gd2l0aCBubyBmbG9hdCBvciBpbnQ2NCBzdXBwb3J0Ci0gKi8KLXR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICAgICAga2hyb25vc19pbnQzMl90OwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgICAgICBraHJvbm9zX3VpbnQzMl90OwotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfSU5UNjQgICAwCi0jZGVmaW5lIEtIUk9OT1NfU1VQUE9SVF9GTE9BVCAgIDAKLQotI2Vsc2UKLQotLyoKLSAqIEdlbmVyaWMgZmFsbGJhY2sKLSAqLwotI2luY2x1ZGUgPHN0ZGludC5oPgotdHlwZWRlZiBpbnQzMl90ICAgICAgICAgICAgICAgICBraHJvbm9zX2ludDMyX3Q7Ci10eXBlZGVmIHVpbnQzMl90ICAgICAgICAgICAgICAgIGtocm9ub3NfdWludDMyX3Q7Ci10eXBlZGVmIGludDY0X3QgICAgICAgICAgICAgICAgIGtocm9ub3NfaW50NjRfdDsKLXR5cGVkZWYgdWludDY0X3QgICAgICAgICAgICAgICAga2hyb25vc191aW50NjRfdDsKLSNkZWZpbmUgS0hST05PU19TVVBQT1JUX0lOVDY0ICAgMQotI2RlZmluZSBLSFJPTk9TX1NVUFBPUlRfRkxPQVQgICAxCi0KLSNlbmRpZgotCi0KLS8qCi0gKiBUeXBlcyB0aGF0IGFyZSAoc28gZmFyKSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zCi0gKi8KLXR5cGVkZWYgc2lnbmVkICAgY2hhciAgICAgICAgICBraHJvbm9zX2ludDhfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgICBraHJvbm9zX3VpbnQ4X3Q7Ci10eXBlZGVmIHNpZ25lZCAgIHNob3J0IGludCAgICAga2hyb25vc19pbnQxNl90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgICAgIGtocm9ub3NfdWludDE2X3Q7Ci10eXBlZGVmIHNpZ25lZCAgIGxvbmcgIGludCAgICAga2hyb25vc19pbnRwdHJfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgaW50ICAgICBraHJvbm9zX3VpbnRwdHJfdDsKLXR5cGVkZWYgc2lnbmVkICAgbG9uZyAgaW50ICAgICBraHJvbm9zX3NzaXplX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgIGludCAgICAga2hyb25vc191c2l6ZV90OwotCi0jaWYgS0hST05PU19TVVBQT1JUX0ZMT0FUCi0vKgotICogRmxvYXQgdHlwZQotICovCi10eXBlZGVmICAgICAgICAgIGZsb2F0ICAgICAgICAga2hyb25vc19mbG9hdF90OwotI2VuZGlmCi0KLSNpZiBLSFJPTk9TX1NVUFBPUlRfSU5UNjQKLS8qIFRpbWUgdHlwZXMKLSAqCi0gKiBUaGVzZSB0eXBlcyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSB0aW1lIGludGVydmFsIGluIG5hbm9zZWNvbmRzIG9yIAotICogYW4gYWJzb2x1dGUgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZS4gIFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUgaXMgdGhlIG51bWJlciAKLSAqIG9mIG5hbm9zZWNvbmRzIHNpbmNlIHNvbWUgYXJiaXRyYXJ5IHN5c3RlbSBldmVudCAoZS5nLiBzaW5jZSB0aGUgbGFzdCAKLSAqIHRpbWUgdGhlIHN5c3RlbSBib290ZWQpLiAgVGhlIFVuYWRqdXN0ZWQgU3lzdGVtIFRpbWUgaXMgYW4gdW5zaWduZWQgCi0gKiA2NCBiaXQgdmFsdWUgdGhhdCB3cmFwcyBiYWNrIHRvIDAgZXZlcnkgNTg0IHllYXJzLiAgVGltZSBpbnRlcnZhbHMgCi0gKiBtYXkgYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZC4KLSAqLwotdHlwZWRlZiBraHJvbm9zX3VpbnQ2NF90ICAgICAgIGtocm9ub3NfdXRpbWVfbmFub3NlY29uZHNfdDsKLXR5cGVkZWYga2hyb25vc19pbnQ2NF90ICAgICAgICBraHJvbm9zX3N0aW1lX25hbm9zZWNvbmRzX3Q7Ci0jZW5kaWYKLQotCi0jZW5kaWYgLyogX19raHJwbGF0Zm9ybV9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9BbmRyb2lkLm1rIGIvb3BlbmdsL2xpYmFnbC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWU1OGYyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jCi0jIEJ1aWxkIHRoZSBzb2Z0d2FyZSBPcGVuR0wgRVMgbGlicmFyeQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWVnbC5jcHAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3RhdGUuY3BwCQkgICAgICAgICAgICBcCi0JdGV4dHVyZS5jcHAJCSAgICAgICAgICAgIFwKLSAgICBUb2tlbml6ZXIuY3BwICAgICAgICAgICAgICAgXAotICAgIFRva2VuTWFuYWdlci5jcHAgICAgICAgICAgICBcCi0gICAgVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwICAgIFwKLSAgICBCdWZmZXJPYmplY3RNYW5hZ2VyLmNwcCAgICAgXAotCWFycmF5LmNwcC5hcm0JCSAgICAgICAgXAotCWZwLmNwcC5hcm0JCSAgICAgICAgICAgIFwKLQlsaWdodC5jcHAuYXJtCQkgICAgICAgIFwKLQltYXRyaXguY3BwLmFybQkJICAgICAgICBcCi0JbWlwbWFwLmNwcC5hcm0JCSAgICAgICAgXAotCXByaW1pdGl2ZXMuY3BwLmFybQkgICAgICAgIFwKLQl2ZXJ0ZXguY3BwLmFybQotCi1MT0NBTF9DRkxBR1MgKz0gLURMT0dfVEFHPVwibGliYWdsXCIKLUxPQ0FMX0NGTEFHUyArPSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmhhcmR3YXJlIGxpYnV0aWxzIGxpYnBpeGVsZmxpbmdlciBsaWJFVEMxCi1MT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKLQotaWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQotCUxPQ0FMX1NSQ19GSUxFUyArPSBmaXhlZF9hc20uUyBpdGVyYXRvcnMuUwotCUxPQ0FMX0NGTEFHUyArPSAtZnN0cmljdC1hbGlhc2luZwotZW5kaWYKLQotaWZlcSAoJChBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUiksdHJ1ZSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi0KLSMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgotIyBvbiBBUk0gcGxhdGZvcm1zLCB3ZSBuZWVkIHRvIG1pcnJvciB0aGUgQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIKLSMgYmVoYXZpb3IgZnJvbSB0aGUgYmlvbmljIEFuZHJvaWQubWsgZmlsZQotaWZlcSAoJChUQVJHRVRfQVJDSCktJChBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUiksYXJtLXRydWUpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9BUk1fVExTX1JFR0lTVEVSCi1lbmRpZgotTE9DQUxfQ19JTkNMVURFUyArPSBiaW9uaWMvbGliYy9wcml2YXRlCi0KLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9TSEFSRURfTElCUkFSSUVTKS9lZ2wKLUxPQ0FMX01PRFVMRTo9IGxpYkdMRVNfYW5kcm9pZAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmMjhlZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL0J1ZmZlck9iamVjdE1hbmFnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMDgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSAiQnVmZmVyT2JqZWN0TWFuYWdlci5oIgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgbmFtZXNwYWNlIGdsOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OkVHTEJ1ZmZlck9iamVjdE1hbmFnZXIoKSAKLTogVG9rZW5NYW5hZ2VyKCksIG1Db3VudCgwKQotewotfQotCi1FR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjp+RUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpCi17Ci0gICAgLy8gZGVzdHJveSBhbGwgdGhlIGJ1ZmZlciBvYmplY3RzIGFuZCB0aGVpciBzdG9yYWdlCi0gICAgR0xzaXplaSBuID0gbUJ1ZmZlcnMuc2l6ZSgpOwotICAgIGZvciAoR0xzaXplaSBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgYnVmZmVyX3QqIGJvID0gbUJ1ZmZlcnMudmFsdWVBdChpKTsKLSAgICAgICAgZnJlZShiby0+ZGF0YSk7Ci0gICAgICAgIGRlbGV0ZSBibzsKLSAgICB9Ci19Ci0KLWJ1ZmZlcl90IGNvbnN0KiBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjpiaW5kKEdMdWludCBidWZmZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpbnQzMl90IGkgPSBtQnVmZmVycy5pbmRleE9mS2V5KGJ1ZmZlcik7Ci0gICAgaWYgKGkgPj0gMCkgewotICAgICAgICByZXR1cm4gbUJ1ZmZlcnMudmFsdWVBdChpKTsKLSAgICB9Ci0gICAgYnVmZmVyX3QqIGJvID0gbmV3IGJ1ZmZlcl90OwotICAgIGJvLT5kYXRhID0gMDsKLSAgICBiby0+dXNhZ2UgPSBHTF9TVEFUSUNfRFJBVzsKLSAgICBiby0+c2l6ZSA9IDA7Ci0gICAgYm8tPm5hbWUgPSBidWZmZXI7Ci0gICAgbUJ1ZmZlcnMuYWRkKGJ1ZmZlciwgYm8pOwotICAgIHJldHVybiBibzsKLX0KLQotaW50IEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OmFsbG9jYXRlU3RvcmUoYnVmZmVyX3QqIGJvLAotICAgICAgICBHTHNpemVpcHRyIHNpemUsIEdMZW51bSB1c2FnZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChzaXplICE9IGJvLT5zaXplKSB7Ci0gICAgICAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KiltYWxsb2Moc2l6ZSk7Ci0gICAgICAgIGlmIChkYXRhID09IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGZyZWUoYm8tPmRhdGEpOwotICAgICAgICBiby0+ZGF0YSA9IGRhdGE7Ci0gICAgICAgIGJvLT5zaXplID0gc2l6ZTsKLSAgICB9Ci0gICAgYm8tPnVzYWdlID0gdXNhZ2U7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcjo6ZGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgY29uc3QgR0x1aW50IHQgPSAqYnVmZmVycysrOwotICAgICAgICBpZiAodCkgewotICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IG1CdWZmZXJzLmluZGV4T2ZLZXkodCk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGJ1ZmZlcl90KiBibyA9IG1CdWZmZXJzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGZyZWUoYm8tPmRhdGEpOwotICAgICAgICAgICAgICAgIG1CdWZmZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBibzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvQnVmZmVyT2JqZWN0TWFuYWdlci5oIGIvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTM0MGEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9CdWZmZXJPYmplY3RNYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICoqCi0gKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19CVUZGRVJfT0JKRUNUX01BTkFHRVJfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX0JVRkZFUl9PQkpFQ1RfTUFOQUdFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0F0b21pYy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSAiVG9rZW5pemVyLmgiCi0jaW5jbHVkZSAiVG9rZW5NYW5hZ2VyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBnbCB7Ci0KLXN0cnVjdCBidWZmZXJfdCB7Ci0gICAgR0xzaXplaXB0ciAgICAgIHNpemU7Ci0gICAgR0xlbnVtICAgICAgICAgIHVzYWdlOwotICAgIHVpbnQ4X3QqICAgICAgICBkYXRhOwotICAgIHVpbnQzMl90ICAgICAgICBuYW1lOwotfTsKLQotfTsKLQotY2xhc3MgRUdMQnVmZmVyT2JqZWN0TWFuYWdlciA6IHB1YmxpYyBUb2tlbk1hbmFnZXIKLXsKLXB1YmxpYzoKLSAgICBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyKCk7Ci0gICAgfkVHTEJ1ZmZlck9iamVjdE1hbmFnZXIoKTsKLQotICAgIC8vIHByb3RvY29sIGZvciBzcDw+Ci0gICAgaW5saW5lICB2b2lkICAgIGluY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7Ci0gICAgaW5saW5lICB2b2lkICAgIGRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3Q7Ci0gICAgdHlwZWRlZiB2b2lkICAgIHdlYWtyZWZfdHlwZTsKLQotICAgIGdsOjpidWZmZXJfdCBjb25zdCogYmluZChHTHVpbnQgYnVmZmVyKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGFsbG9jYXRlU3RvcmUoZ2w6OmJ1ZmZlcl90KiBibywgR0xzaXplaXB0ciBzaXplLCBHTGVudW0gdXNhZ2UpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgZGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycyk7Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSB2b2xhdGlsZSBpbnQzMl90ICAgICAgICAgICAgbUNvdW50OwotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwotICAgIEtleWVkVmVjdG9yPEdMdWludCwgZ2w6OmJ1ZmZlcl90Kj4gIG1CdWZmZXJzOwotfTsKLQotdm9pZCBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyOjppbmNTdHJvbmcoY29uc3Qgdm9pZCogaWQpIGNvbnN0IHsKLSAgICBhbmRyb2lkX2F0b21pY19pbmMoJm1Db3VudCk7Ci19Ci12b2lkIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI6OmRlY1N0cm9uZyhjb25zdCB2b2lkKiBpZCkgY29uc3QgewotICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJm1Db3VudCkgPT0gMSkgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX0JVRkZFUl9PQkpFQ1RfTUFOQUdFUl9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuY3BwIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDQ1Y2MuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTFRleHR1cmVPYmplY3Q6OkVHTFRleHR1cmVPYmplY3QoKQotICAgIDogbVNpemUoMCkKLXsKLSAgICBpbml0KCk7Ci19Ci0KLUVHTFRleHR1cmVPYmplY3Q6On5FR0xUZXh0dXJlT2JqZWN0KCkKLXsKLSAgICBpZiAoIWRpcmVjdCkgewotICAgICAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKQotICAgICAgICAgICAgZnJlZShzdXJmYWNlLmRhdGEpOwotICAgICAgICBpZiAobU1pcG1hcHMpCi0gICAgICAgICAgICBmcmVlTWlwbWFwcygpOwotICAgIH0KLX0KLQotdm9pZCBFR0xUZXh0dXJlT2JqZWN0Ojppbml0KCkKLXsKLSAgICBtZW1zZXQoJnN1cmZhY2UsIDAsIHNpemVvZihzdXJmYWNlKSk7Ci0gICAgc3VyZmFjZS52ZXJzaW9uID0gc2l6ZW9mKHN1cmZhY2UpOwotICAgIG1NaXBtYXBzID0gMDsKLSAgICBtTnVtRXh0cmFMb2QgPSAwOwotICAgIG1Jc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgd3JhcHMgPSBHTF9SRVBFQVQ7Ci0gICAgd3JhcHQgPSBHTF9SRVBFQVQ7Ci0gICAgbWluX2ZpbHRlciA9IEdMX0xJTkVBUjsKLSAgICBtYWdfZmlsdGVyID0gR0xfTElORUFSOwotICAgIGludGVybmFsZm9ybWF0ID0gMDsKLSAgICBtZW1zZXQoY3JvcF9yZWN0LCAwLCBzaXplb2YoY3JvcF9yZWN0KSk7Ci0gICAgZ2VuZXJhdGVfbWlwbWFwID0gR0xfRkFMU0U7Ci0gICAgZGlyZWN0ID0gR0xfRkFMU0U7Ci0gICAgYnVmZmVyID0gMDsKLX0KLQotdm9pZCBFR0xUZXh0dXJlT2JqZWN0Ojpjb3B5UGFyYW1ldGVycyhjb25zdCBzcDxFR0xUZXh0dXJlT2JqZWN0PiYgb2xkKQotewotICAgIHdyYXBzID0gb2xkLT53cmFwczsKLSAgICB3cmFwdCA9IG9sZC0+d3JhcHQ7Ci0gICAgbWluX2ZpbHRlciA9IG9sZC0+bWluX2ZpbHRlcjsKLSAgICBtYWdfZmlsdGVyID0gb2xkLT5tYWdfZmlsdGVyOwotICAgIG1lbWNweShjcm9wX3JlY3QsIG9sZC0+Y3JvcF9yZWN0LCBzaXplb2YoY3JvcF9yZWN0KSk7Ci0gICAgZ2VuZXJhdGVfbWlwbWFwID0gb2xkLT5nZW5lcmF0ZV9taXBtYXA7Ci0gICAgZGlyZWN0ID0gb2xkLT5kaXJlY3Q7Ci19Ci0KLXN0YXR1c190IEVHTFRleHR1cmVPYmplY3Q6OmFsbG9jYXRlTWlwbWFwcygpCi17Ci0gICAgLy8gaGVyZSwgYnkgY29uc3RydWN0aW9uLCBtTWlwbWFwcz0wICYmIG1OdW1FeHRyYUxvZD0wCi0KLSAgICBpZiAoIXN1cmZhY2UuZGF0YSkKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICBpbnQgdyA9IHN1cmZhY2Uud2lkdGg7Ci0gICAgaW50IGggPSBzdXJmYWNlLmhlaWdodDsKLSAgICBjb25zdCBpbnQgbnVtTG9kcyA9IDMxIC0gZ2dsQ2x6KG1heCh3LGgpKTsKLSAgICBpZiAobnVtTG9kcyA8PSAwKQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICBtTWlwbWFwcyA9IChHR0xTdXJmYWNlKiltYWxsb2MobnVtTG9kcyAqIHNpemVvZihHR0xTdXJmYWNlKSk7Ci0gICAgaWYgKCFtTWlwbWFwcykKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLQotICAgIG1lbXNldChtTWlwbWFwcywgMCwgbnVtTG9kcyAqIHNpemVvZihHR0xTdXJmYWNlKSk7Ci0gICAgbU51bUV4dHJhTG9kID0gbnVtTG9kczsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgRUdMVGV4dHVyZU9iamVjdDo6ZnJlZU1pcG1hcHMoKQotewotICAgIGlmIChtTWlwbWFwcykgewotICAgICAgICBmb3IgKGludCBpPTAgOyBpPG1OdW1FeHRyYUxvZCA7IGkrKykgewotICAgICAgICAgICAgaWYgKG1NaXBtYXBzW2ldLmRhdGEpIHsKLSAgICAgICAgICAgICAgICBmcmVlKG1NaXBtYXBzW2ldLmRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZyZWUobU1pcG1hcHMpOwotICAgICAgICBtTWlwbWFwcyA9IDA7Ci0gICAgICAgIG1OdW1FeHRyYUxvZCA9IDA7Ci0gICAgfQotfQotCi1jb25zdCBHR0xTdXJmYWNlJiBFR0xUZXh0dXJlT2JqZWN0OjptaXAoaW50IGxvZCkgY29uc3QKLXsKLSAgICBpZiAobG9kPD0wIHx8ICFtTWlwbWFwcykKLSAgICAgICAgcmV0dXJuIHN1cmZhY2U7Ci0gICAgbG9kID0gbWluKGxvZC0xLCBtTnVtRXh0cmFMb2QtMSk7Ci0gICAgcmV0dXJuIG1NaXBtYXBzW2xvZF07Ci19Ci0KLUdHTFN1cmZhY2UmIEVHTFRleHR1cmVPYmplY3Q6OmVkaXRNaXAoaW50IGxvZCkKLXsKLSAgICByZXR1cm4gY29uc3RfY2FzdDxHR0xTdXJmYWNlJj4obWlwKGxvZCkpOwotfQotCi1zdGF0dXNfdCBFR0xUZXh0dXJlT2JqZWN0OjpzZXRTdXJmYWNlKEdHTFN1cmZhY2UgY29uc3QqIHMpCi17Ci0gICAgLy8gWFhYOiBnbEZsdXNoKCkgb24gJ3MnCi0gICAgaWYgKG1TaXplICYmIHN1cmZhY2UuZGF0YSkgewotICAgICAgICBmcmVlKHN1cmZhY2UuZGF0YSk7Ci0gICAgfQotICAgIHN1cmZhY2UgPSAqczsKLSAgICBpbnRlcm5hbGZvcm1hdCA9IDA7Ci0gICAgYnVmZmVyID0gMDsKLQotICAgIC8vIHdlIHNob3VsZCBrZWVwIHRoZSBjcm9wX3JlY3QsIGJ1dCBpdCdzIGRlbGljYXRlIGJlY2F1c2UKLSAgICAvLyB0aGUgbmV3IHNpemUgb2YgdGhlIHN1cmZhY2UgY291bGQgbWFrZSBpdCBpbnZhbGlkLgotICAgIC8vIHNvIGZvciBub3csIHdlIGp1c3QgbG9vc2UgaXQuCi0gICAgbWVtc2V0KGNyb3BfcmVjdCwgMCwgc2l6ZW9mKGNyb3BfcmVjdCkpOwotCi0gICAgLy8gaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBrZWVwIHRoZSBnZW5lcmF0ZV9taXBtYXAgZmxhZywKLSAgICAvLyB3ZSB3b3VsZCBoYXZlIHRvIGdlbmVyYXRlIHRoZW0gcmlnaHQgbm93IHRob3VnaC4KLSAgICBnZW5lcmF0ZV9taXBtYXAgPSBHTF9GQUxTRTsKLQotICAgIGRpcmVjdCA9IEdMX1RSVUU7Ci0gICAgbVNpemUgPSAwOyAgLy8gd2UgZG9uJ3Qgb3duIHRoaXMgc3VyZmFjZQotICAgIGlmIChtTWlwbWFwcykKLSAgICAgICAgZnJlZU1pcG1hcHMoKTsKLSAgICBtSXNDb21wbGV0ZSA9IHRydWU7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBFR0xUZXh0dXJlT2JqZWN0OjpzZXRJbWFnZShBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVfYnVmZmVyKQotewotICAgIEdHTFN1cmZhY2Ugc3VyOwotICAgIHN1ci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgIHN1ci53aWR0aCA9IG5hdGl2ZV9idWZmZXItPndpZHRoOwotICAgIHN1ci5oZWlnaHQ9IG5hdGl2ZV9idWZmZXItPmhlaWdodDsKLSAgICBzdXIuc3RyaWRlPSBuYXRpdmVfYnVmZmVyLT5zdHJpZGU7Ci0gICAgc3VyLmZvcm1hdD0gbmF0aXZlX2J1ZmZlci0+Zm9ybWF0OwotICAgIHN1ci5kYXRhICA9IDA7Ci0gICAgc2V0U3VyZmFjZSgmc3VyKTsKLSAgICBidWZmZXIgPSBuYXRpdmVfYnVmZmVyOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgRUdMVGV4dHVyZU9iamVjdDo6cmVhbGxvY2F0ZSgKLSAgICAgICAgR0xpbnQgbGV2ZWwsIGludCB3LCBpbnQgaCwgaW50IHMsCi0gICAgICAgIGludCBmb3JtYXQsIGludCBjb21wcmVzc2VkRm9ybWF0LCBpbnQgYnByKQotewotICAgIGNvbnN0IHNpemVfdCBzaXplID0gaCAqIGJwcjsKLSAgICBpZiAobGV2ZWwgPT0gMCkKLSAgICB7Ci0gICAgICAgIGlmIChzaXplIT1tU2l6ZSB8fCAhc3VyZmFjZS5kYXRhKSB7Ci0gICAgICAgICAgICBpZiAobVNpemUgJiYgc3VyZmFjZS5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShzdXJmYWNlLmRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VyZmFjZS5kYXRhID0gKEdHTHVieXRlKiltYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoIXN1cmZhY2UuZGF0YSkgewotICAgICAgICAgICAgICAgIG1TaXplID0gMDsKLSAgICAgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2l6ZSA9IHNpemU7Ci0gICAgICAgIH0KLSAgICAgICAgc3VyZmFjZS52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgICAgICBzdXJmYWNlLndpZHRoICA9IHc7Ci0gICAgICAgIHN1cmZhY2UuaGVpZ2h0ID0gaDsKLSAgICAgICAgc3VyZmFjZS5zdHJpZGUgPSBzOwotICAgICAgICBzdXJmYWNlLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgc3VyZmFjZS5jb21wcmVzc2VkRm9ybWF0ID0gY29tcHJlc3NlZEZvcm1hdDsKLSAgICAgICAgaWYgKG1NaXBtYXBzKQotICAgICAgICAgICAgZnJlZU1pcG1hcHMoKTsKLSAgICAgICAgbUlzQ29tcGxldGUgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoIW1NaXBtYXBzKSB7Ci0gICAgICAgICAgICBpZiAoYWxsb2NhdGVNaXBtYXBzKCkgIT0gTk9fRVJST1IpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dXX0lGKGxldmVsLTEgPj0gbU51bUV4dHJhTG9kLAotICAgICAgICAgICAgICAgICJzcGVjaWZ5aW5nIG1pcG1hcCBsZXZlbCAlZCwgYnV0ICMgb2YgbGV2ZWwgaXMgJWQiLAotICAgICAgICAgICAgICAgIGxldmVsLCBtTnVtRXh0cmFMb2QrMSk7Ci0KLSAgICAgICAgR0dMU3VyZmFjZSYgbWlwbWFwID0gZWRpdE1pcChsZXZlbCk7Ci0gICAgICAgIGlmIChtaXBtYXAuZGF0YSkKLSAgICAgICAgICAgIGZyZWUobWlwbWFwLmRhdGEpOwotCi0gICAgICAgIG1pcG1hcC5kYXRhID0gKEdHTHVieXRlKiltYWxsb2Moc2l6ZSk7Ci0gICAgICAgIGlmICghbWlwbWFwLmRhdGEpIHsKLSAgICAgICAgICAgIG1lbXNldCgmbWlwbWFwLCAwLCBzaXplb2YoR0dMU3VyZmFjZSkpOwotICAgICAgICAgICAgbUlzQ29tcGxldGUgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLQotICAgICAgICBtaXBtYXAudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKLSAgICAgICAgbWlwbWFwLndpZHRoICA9IHc7Ci0gICAgICAgIG1pcG1hcC5oZWlnaHQgPSBoOwotICAgICAgICBtaXBtYXAuc3RyaWRlID0gczsKLSAgICAgICAgbWlwbWFwLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgbWlwbWFwLmNvbXByZXNzZWRGb3JtYXQgPSBjb21wcmVzc2VkRm9ybWF0OwotCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSB0ZXh0dXJlIGlzIGNvbXBsZXRlCi0gICAgICAgIG1Jc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgY29uc3QgR0dMU3VyZmFjZSogcHJldiA9ICZzdXJmYWNlOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPG1OdW1FeHRyYUxvZCA7IGkrKykgewotICAgICAgICAgICAgY29uc3QgR0dMU3VyZmFjZSogY3VyciA9IG1NaXBtYXBzICsgaTsKLSAgICAgICAgICAgIGlmIChjdXJyLT5mb3JtYXQgIT0gc3VyZmFjZS5mb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCB3ID0gKHByZXYtPndpZHRoICA+PiAxKSA/IDogMTsKLSAgICAgICAgICAgIHVpbnQzMl90IGggPSAocHJldi0+aGVpZ2h0ID4+IDEpID8gOiAxOwotICAgICAgICAgICAgaWYgKHcgIT0gY3Vyci0+d2lkdGggfHwgaCAhPSBjdXJyLT5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBtSXNDb21wbGV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJldiA9IGN1cnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTFN1cmZhY2VNYW5hZ2VyOjpFR0xTdXJmYWNlTWFuYWdlcigpCi0gICAgOiBUb2tlbk1hbmFnZXIoKQotewotfQotCi1FR0xTdXJmYWNlTWFuYWdlcjo6fkVHTFN1cmZhY2VNYW5hZ2VyKCkKLXsKLSAgICAvLyBldmVyeXRoaW5nIGdldHMgZnJlZWQgYXV0b21hdGljYWxseSBoZXJlLi4uCi19Ci0KLXNwPEVHTFRleHR1cmVPYmplY3Q+IEVHTFN1cmZhY2VNYW5hZ2VyOjpjcmVhdGVUZXh0dXJlKEdMdWludCBuYW1lKQotewotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHJlc3VsdDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1UZXh0dXJlcy5pbmRleE9mS2V5KG5hbWUpID49IDApCi0gICAgICAgIHJldHVybiByZXN1bHQ7IC8vIGFscmVhZHkgZXhpc3RzIQotCi0gICAgcmVzdWx0ID0gbmV3IEVHTFRleHR1cmVPYmplY3QoKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1UZXh0dXJlcy5hZGQobmFtZSwgcmVzdWx0KTsKLSAgICBpZiAoZXJyIDwgMCkKLSAgICAgICAgcmVzdWx0LmNsZWFyKCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zcDxFR0xUZXh0dXJlT2JqZWN0PiBFR0xTdXJmYWNlTWFuYWdlcjo6cmVtb3ZlVGV4dHVyZShHTHVpbnQgbmFtZSkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVGV4dHVyZXMuaW5kZXhPZktleShuYW1lKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiByZXN1bHQobVRleHR1cmVzLnZhbHVlQXQoaW5kZXgpKTsKLSAgICAgICAgbVRleHR1cmVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3A8RUdMVGV4dHVyZU9iamVjdD4gRUdMU3VyZmFjZU1hbmFnZXI6OnJlcGxhY2VUZXh0dXJlKEdMdWludCBuYW1lKQotewotICAgIHNwPEVHTFRleHR1cmVPYmplY3Q+IHRleDsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVGV4dHVyZXMuaW5kZXhPZktleShuYW1lKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBjb25zdCBzcDxFR0xUZXh0dXJlT2JqZWN0PiYgb2xkID0gbVRleHR1cmVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBjb25zdCB1aW50MzJfdCByZWZzID0gb2xkLT5nZXRTdHJvbmdDb3VudCgpOwotICAgICAgICBpZiAoZ2dsX2xpa2VseShyZWZzID09IDEpKSB7Ci0gICAgICAgICAgICAvLyB3ZSdyZSB0aGUgb25seSBvd25lcgotICAgICAgICAgICAgdGV4ID0gb2xkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8ga2VlcCB0aGUgdGV4dHVyZSdzIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIHRleCA9IG5ldyBFR0xUZXh0dXJlT2JqZWN0KCk7Ci0gICAgICAgICAgICB0ZXgtPmNvcHlQYXJhbWV0ZXJzKG9sZCk7Ci0gICAgICAgICAgICBtVGV4dHVyZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgICAgICBtVGV4dHVyZXMuYWRkKG5hbWUsIHRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRleDsKLX0KLQotdm9pZCBFR0xTdXJmYWNlTWFuYWdlcjo6ZGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRva2VucykKLXsKLSAgICAvLyBmcmVlIGFsbCB0ZXh0dXJlcwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICBjb25zdCBHTHVpbnQgdCgqdG9rZW5zKyspOwotICAgICAgICBpZiAodCkgewotICAgICAgICAgICAgbVRleHR1cmVzLnJlbW92ZUl0ZW0odCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNwPEVHTFRleHR1cmVPYmplY3Q+IEVHTFN1cmZhY2VNYW5hZ2VyOjp0ZXh0dXJlKEdMdWludCBuYW1lKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UZXh0dXJlcy5pbmRleE9mS2V5KG5hbWUpOwotICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICByZXR1cm4gbVRleHR1cmVzLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5oIGIvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTllMDNlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvVGV4dHVyZU9iamVjdE1hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19TVVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19TVVJGQUNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvQXRvbWljLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotCi0jaW5jbHVkZSAiVG9rZW5pemVyLmgiCi0jaW5jbHVkZSAiVG9rZW5NYW5hZ2VyLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEVHTFRleHR1cmVPYmplY3QgOiBwdWJsaWMgTGlnaHRSZWZCYXNlPEVHTFRleHR1cmVPYmplY3Q+Ci17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIEVHTFRleHR1cmVPYmplY3QoKTsKLSAgICAgICAgICAgICAgICAgICB+RUdMVGV4dHVyZU9iamVjdCgpOwotCi0gICAgc3RhdHVzX3QgICAgc2V0U3VyZmFjZShHR0xTdXJmYWNlIGNvbnN0KiBzKTsKLSAgICBzdGF0dXNfdCAgICBzZXRJbWFnZShBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIpOwotICAgIHZvaWQgICAgICAgIHNldEltYWdlQml0cyh2b2lkKiB2YWRkcikgeyBzdXJmYWNlLmRhdGEgPSAoR0dMdWJ5dGUqKXZhZGRyOyB9Ci0KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWxsb2NhdGUoR0xpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LCBpbnQgY29tcHJlc3NlZEZvcm1hdCwgaW50IGJwcik7Ci0gICAgaW5saW5lICBzaXplX3QgICAgICBzaXplKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KLSAgICBjb25zdCBHR0xTdXJmYWNlJiAgIG1pcChpbnQgbG9kKSBjb25zdDsKLSAgICBHR0xTdXJmYWNlJiAgICAgICAgIGVkaXRNaXAoaW50IGxvZCk7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICBoYXNNaXBtYXBzKCkgY29uc3QgeyByZXR1cm4gbU1pcG1hcHMhPTA7IH0KLSAgICBib29sICAgICAgICAgICAgICAgIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBtSXNDb21wbGV0ZTsgfQotICAgIHZvaWQgICAgICAgICAgICAgICAgY29weVBhcmFtZXRlcnMoY29uc3Qgc3A8RUdMVGV4dHVyZU9iamVjdD4mIG9sZCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgIHN0YXR1c190ICAgICAgICBhbGxvY2F0ZU1pcG1hcHMoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGZyZWVNaXBtYXBzKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBpbml0KCk7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICBtU2l6ZTsKLSAgICBHR0xTdXJmYWNlICAgICAgICAgICptTWlwbWFwczsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1FeHRyYUxvZDsKLSAgICBib29sICAgICAgICAgICAgICAgIG1Jc0NvbXBsZXRlOwotCi1wdWJsaWM6Ci0gICAgR0dMU3VyZmFjZSAgICAgICAgICBzdXJmYWNlOwotICAgIEdMZW51bSAgICAgICAgICAgICAgd3JhcHM7Ci0gICAgR0xlbnVtICAgICAgICAgICAgICB3cmFwdDsKLSAgICBHTGVudW0gICAgICAgICAgICAgIG1pbl9maWx0ZXI7Ci0gICAgR0xlbnVtICAgICAgICAgICAgICBtYWdfZmlsdGVyOwotICAgIEdMZW51bSAgICAgICAgICAgICAgaW50ZXJuYWxmb3JtYXQ7Ci0gICAgR0xpbnQgICAgICAgICAgICAgICBjcm9wX3JlY3RbNF07Ci0gICAgR0xpbnQgICAgICAgICAgICAgICBnZW5lcmF0ZV9taXBtYXA7Ci0gICAgR0xpbnQgICAgICAgICAgICAgICBkaXJlY3Q7Ci0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBFR0xTdXJmYWNlTWFuYWdlciA6Ci0gICAgcHVibGljIExpZ2h0UmVmQmFzZTxFR0xTdXJmYWNlTWFuYWdlcj4sCi0gICAgcHVibGljIFRva2VuTWFuYWdlcgotewotcHVibGljOgotICAgICAgICAgICAgICAgIEVHTFN1cmZhY2VNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgfkVHTFN1cmZhY2VNYW5hZ2VyKCk7Ci0KLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiAgICBjcmVhdGVUZXh0dXJlKEdMdWludCBuYW1lKTsKLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiAgICByZW1vdmVUZXh0dXJlKEdMdWludCBuYW1lKTsKLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiAgICByZXBsYWNlVGV4dHVyZShHTHVpbnQgbmFtZSk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRva2Vucyk7Ci0gICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gICAgdGV4dHVyZShHTHVpbnQgbmFtZSk7Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKLSAgICBLZXllZFZlY3RvcjwgR0x1aW50LCBzcDxFR0xUZXh0dXJlT2JqZWN0PiA+IG1UZXh0dXJlczsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1NVUkZBQ0VfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5jcHAgYi9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYTYwMjUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9zdXJmYWNlLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIlRva2VuTWFuYWdlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRva2VuTWFuYWdlcjo6VG9rZW5NYW5hZ2VyKCkKLXsKLSAgICAvLyB0b2tlbiAwIGlzIGFsd2F5cyByZXNlcnZlZAotICAgIG1Ub2tlbml6ZXIucmVzZXJ2ZSgwKTsKLX0KLQotVG9rZW5NYW5hZ2VyOjp+VG9rZW5NYW5hZ2VyKCkKLXsKLX0KLQotc3RhdHVzX3QgVG9rZW5NYW5hZ2VyOjpnZXRUb2tlbihHTHNpemVpIG4sIEdMdWludCAqdG9rZW5zKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChHTHNpemVpIGk9MCA7IGk8biA7IGkrKykKLSAgICAgICAgKnRva2VucysrID0gbVRva2VuaXplci5hY3F1aXJlKCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFRva2VuTWFuYWdlcjo6cmVjeWNsZVRva2VucyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdG9rZW5zKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IEdMdWludCB0b2tlbiA9ICp0b2tlbnMrKzsKLSAgICAgICAgaWYgKHRva2VuKSB7Ci0gICAgICAgICAgICBtVG9rZW5pemVyLnJlbGVhc2UodG9rZW4pOwotICAgICAgICB9Ci0gICAgfQotfQotCi1ib29sIFRva2VuTWFuYWdlcjo6aXNUb2tlblZhbGlkKEdMdWludCB0b2tlbikgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtVG9rZW5pemVyLmlzQWNxdWlyZWQodG9rZW4pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5oIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbk1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljMTQ2OS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL1Rva2VuTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19UT0tFTl9NQU5BR0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19UT0tFTl9NQU5BR0VSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSAiVG9rZW5pemVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBUb2tlbk1hbmFnZXIKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgICAgICBUb2tlbk1hbmFnZXIoKTsKLSAgICAgICAgICAgICAgICB+VG9rZW5NYW5hZ2VyKCk7Ci0KLSAgICBzdGF0dXNfdCAgICBnZXRUb2tlbihHTHNpemVpIG4sIEdMdWludCAqdG9rZW5zKTsKLSAgICB2b2lkICAgICAgICByZWN5Y2xlVG9rZW5zKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0b2tlbnMpOwotICAgIGJvb2wgICAgICAgIGlzVG9rZW5WYWxpZChHTHVpbnQgdG9rZW4pIGNvbnN0OwotCi1wcml2YXRlOgotICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKLSAgICBUb2tlbml6ZXIgICAgICAgbVRva2VuaXplcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1RPS0VOX01BTkFHRVJfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5jcHAgYi9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzhkNmQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9Ub2tlbml6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvVG9rZW5pemVyLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiVG9rZW5pemVyLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BTkRST0lEX0JBU0lDX1RZUEVTX1RSQUlUUyhUb2tlbml6ZXI6OnJ1bl90KQotCi1Ub2tlbml6ZXI6OlRva2VuaXplcigpCi17Ci19Ci0KLVRva2VuaXplcjo6VG9rZW5pemVyKGNvbnN0IFRva2VuaXplciYgb3RoZXIpCi0gICAgOiBtUmFuZ2VzKG90aGVyLm1SYW5nZXMpCi17Ci19Ci0KLVRva2VuaXplcjo6flRva2VuaXplcigpCi17Ci19Ci0KLXVpbnQzMl90IFRva2VuaXplcjo6YWNxdWlyZSgpCi17Ci0gICAgaWYgKCFtUmFuZ2VzLnNpemUoKSB8fCBtUmFuZ2VzWzBdLmZpcnN0KSB7Ci0gICAgICAgIF9pbnNlcnRUb2tlbkF0KDAsMCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICAvLyBqdXN0IGV4dGVuZCB0aGUgZmlyc3QgcnVuCi0gICAgY29uc3QgcnVuX3QmIHJ1biA9IG1SYW5nZXNbMF07Ci0gICAgdWludDMyX3QgdG9rZW4gPSBydW4uZmlyc3QgKyBydW4ubGVuZ3RoOwotICAgIF9pbnNlcnRUb2tlbkF0KHRva2VuLCAxKTsKLSAgICByZXR1cm4gdG9rZW47Ci19Ci0KLWJvb2wgVG9rZW5pemVyOjppc0FjcXVpcmVkKHVpbnQzMl90IHRva2VuKSBjb25zdAotewotICAgIHJldHVybiAoX2luZGV4T3JkZXJPZih0b2tlbikgPj0gMCk7Ci19Ci0KLXN0YXR1c190IFRva2VuaXplcjo6cmVzZXJ2ZSh1aW50MzJfdCB0b2tlbikKLXsKLSAgICBzaXplX3QgbzsKLSAgICBjb25zdCBzc2l6ZV90IGkgPSBfaW5kZXhPcmRlck9mKHRva2VuLCAmbyk7Ci0gICAgaWYgKGkgPj0gMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOyAvLyB0aGlzIHRva2VuIGlzIGFscmVhZHkgdGFrZW4KLSAgICB9Ci0gICAgc3NpemVfdCBlcnIgPSBfaW5zZXJ0VG9rZW5BdCh0b2tlbiwgbyk7Ci0gICAgcmV0dXJuIChlcnI8MCkgPyBlcnIgOiBzdGF0dXNfdChOT19FUlJPUik7Ci19Ci0KLXN0YXR1c190IFRva2VuaXplcjo6cmVsZWFzZSh1aW50MzJfdCB0b2tlbikKLXsKLSAgICBjb25zdCBzc2l6ZV90IGkgPSBfaW5kZXhPcmRlck9mKHRva2VuKTsKLSAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgIGNvbnN0IHJ1bl90JiBydW4gPSBtUmFuZ2VzW2ldOwotICAgICAgICBpZiAoKHRva2VuID49IHJ1bi5maXJzdCkgJiYgKHRva2VuIDwgcnVuLmZpcnN0K3J1bi5sZW5ndGgpKSB7Ci0gICAgICAgICAgICAvLyB0b2tlbiBpbiB0aGlzIHJhbmdlLCB3ZSBuZWVkIHRvIHNwbGl0Ci0gICAgICAgICAgICBydW5fdCYgcnVuID0gbVJhbmdlcy5lZGl0SXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKCh0b2tlbiA9PSBydW4uZmlyc3QpIHx8ICh0b2tlbiA9PSBydW4uZmlyc3QrcnVuLmxlbmd0aC0xKSkgewotICAgICAgICAgICAgICAgIGlmICh0b2tlbiA9PSBydW4uZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVuLmZpcnN0ICs9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bi5sZW5ndGggLT0gMTsKLSAgICAgICAgICAgICAgICBpZiAocnVuLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFhYWDogc2hvdWxkIHdlIHN5c3RlbWF0aWNhbGx5IHJlbW92ZSBhIHJ1biB0aGF0J3MgZW1wdHk/Ci0gICAgICAgICAgICAgICAgICAgIG1SYW5nZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHNwbGl0IHRoZSBydW4KLSAgICAgICAgICAgICAgICBydW5fdCBuZXdfcnVuOwotICAgICAgICAgICAgICAgIG5ld19ydW4uZmlyc3QgPSB0b2tlbisxOwotICAgICAgICAgICAgICAgIG5ld19ydW4ubGVuZ3RoID0gcnVuLmZpcnN0K3J1bi5sZW5ndGggLSBuZXdfcnVuLmZpcnN0OwotICAgICAgICAgICAgICAgIHJ1bi5sZW5ndGggPSB0b2tlbiAtIHJ1bi5maXJzdDsKLSAgICAgICAgICAgICAgICBtUmFuZ2VzLmluc2VydEF0KG5ld19ydW4sIGkrMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotfQotCi1zc2l6ZV90IFRva2VuaXplcjo6X2luZGV4T3JkZXJPZih1aW50MzJfdCB0b2tlbiwgc2l6ZV90KiBvcmRlcikgY29uc3QKLXsKLSAgICAvLyBiaW5hcnkgc2VhcmNoCi0gICAgc3NpemVfdCBlcnIgPSBOQU1FX05PVF9GT1VORDsKLSAgICBzc2l6ZV90IGwgPSAwOwotICAgIHNzaXplX3QgaCA9IG1SYW5nZXMuc2l6ZSgpLTE7Ci0gICAgc3NpemVfdCBtaWQ7Ci0gICAgY29uc3QgcnVuX3QqIGEgPSBtUmFuZ2VzLmFycmF5KCk7Ci0gICAgd2hpbGUgKGwgPD0gaCkgewotICAgICAgICBtaWQgPSBsICsgKGggLSBsKS8yOwotICAgICAgICBjb25zdCBydW5fdCogY29uc3QgY3VyciA9IGEgKyBtaWQ7Ci0gICAgICAgIGludCBjID0gMDsKLSAgICAgICAgaWYgKHRva2VuIDwgY3Vyci0+Zmlyc3QpICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKHRva2VuID49IGN1cnItPmZpcnN0K2N1cnItPmxlbmd0aCkgICAgIGMgPSAtMTsKLSAgICAgICAgaWYgKGMgPT0gMCkgewotICAgICAgICAgICAgZXJyID0gbCA9IG1pZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGMgPCAwKSB7Ci0gICAgICAgICAgICBsID0gbWlkICsgMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGggPSBtaWQgLSAxOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChvcmRlcikgKm9yZGVyID0gbDsKLSAgICByZXR1cm4gZXJyOwotfQotCi1zc2l6ZV90IFRva2VuaXplcjo6X2luc2VydFRva2VuQXQodWludDMyX3QgdG9rZW4sIHNpemVfdCBpbmRleCkKLXsKLSAgICBjb25zdCBzaXplX3QgYyA9IG1SYW5nZXMuc2l6ZSgpOwotCi0gICAgaWYgKGluZGV4ID49IDEpIHsKLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBtZXJnZSB3aXRoIHRoZSBwcmV2aW91cyBydW4/Ci0gICAgICAgIHJ1bl90JiBwID0gbVJhbmdlcy5lZGl0SXRlbUF0KGluZGV4LTEpOwotICAgICAgICBpZiAocC5maXJzdCtwLmxlbmd0aCA9PSB0b2tlbikgewotICAgICAgICAgICAgcC5sZW5ndGggKz0gMTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IGMpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBydW5fdCYgbiA9IG1SYW5nZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgIGlmICh0b2tlbisxID09IG4uZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgcC5sZW5ndGggKz0gbi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIG1SYW5nZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChpbmRleCA8IGMpIHsKLSAgICAgICAgLy8gZG8gd2UgbmVlZCB0byBtZXJnZSB3aXRoIHRoZSBuZXh0IHJ1bj8KLSAgICAgICAgcnVuX3QmIG4gPSBtUmFuZ2VzLmVkaXRJdGVtQXQoaW5kZXgpOwotICAgICAgICBpZiAodG9rZW4rMSA9PSBuLmZpcnN0KSB7Ci0gICAgICAgICAgICBuLmZpcnN0IC09IDE7Ci0gICAgICAgICAgICBuLmxlbmd0aCArPSAxOwotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1SYW5nZXMuaW5zZXJ0QXQocnVuX3QodG9rZW4sMSksIGluZGV4KTsKLX0KLQotdm9pZCBUb2tlbml6ZXI6OmR1bXAoKSBjb25zdAotewotICAgIGNvbnN0IHJ1bl90KiByYW5nZXMgPSBtUmFuZ2VzLmFycmF5KCk7Ci0gICAgY29uc3Qgc2l6ZV90IGMgPSBtUmFuZ2VzLnNpemUoKTsKLSAgICBBTE9HRCgiVG9rZW5pemVyICglcCwgc2l6ZSA9ICV1KVxuIiwgdGhpcywgYyk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjIDsgaSsrKSB7Ci0gICAgICAgIEFMT0dEKCIldTogKCV1LCAldSlcbiIsIGksIHJhbmdlc1tpXS5maXJzdCwgcmFuZ2VzW2ldLmxlbmd0aCk7Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oIGIvb3BlbmdsL2xpYmFnbC9Ub2tlbml6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1NTVjYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL1Rva2VuaXplci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9Ub2tlbml6ZXIuaAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1RPS0VOSVpFUl9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfVE9LRU5JWkVSX0gKLQotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgVG9rZW5pemVyCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgVG9rZW5pemVyKCk7Ci0gICAgICAgICAgICAgICAgVG9rZW5pemVyKGNvbnN0IFRva2VuaXplciYgb3RoZXIpOwotICAgICAgICAgICAgICAgIH5Ub2tlbml6ZXIoKTsKLQotICAgIHVpbnQzMl90ICAgIGFjcXVpcmUoKTsKLSAgICBzdGF0dXNfdCAgICByZXNlcnZlKHVpbnQzMl90IHRva2VuKTsKLSAgICBzdGF0dXNfdCAgICByZWxlYXNlKHVpbnQzMl90IHRva2VuKTsKLSAgICBib29sICAgICAgICBpc0FjcXVpcmVkKHVpbnQzMl90IHRva2VuKSBjb25zdDsKLQotICAgIHZvaWQgZHVtcCgpIGNvbnN0OwotCi0gICAgc3RydWN0IHJ1bl90IHsKLSAgICAgICAgcnVuX3QoKSB7fTsKLSAgICAgICAgcnVuX3QodWludDMyX3QgZiwgdWludDMyX3QgbCkgOiBmaXJzdChmKSwgbGVuZ3RoKGwpIHt9Ci0gICAgICAgIHVpbnQzMl90ICAgIGZpcnN0OwotICAgICAgICB1aW50MzJfdCAgICBsZW5ndGg7Ci0gICAgfTsKLXByaXZhdGU6Ci0gICAgc3NpemVfdCBfaW5kZXhPcmRlck9mKHVpbnQzMl90IHRva2VuLCBzaXplX3QqIG9yZGVyPTApIGNvbnN0OwotICAgIHNzaXplX3QgX2luc2VydFRva2VuQXQodWludDMyX3QgdG9rZW4sIHNpemVfdCBpbmRleCk7Ci0gICAgVmVjdG9yPHJ1bl90PiAgIG1SYW5nZXM7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1RPS0VOSVpFUl9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcCBiL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmJlOWI1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU4OCArMCwwIEBACi0vKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiY29udGV4dC5oIgotI2luY2x1ZGUgImZwLmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLSNpbmNsdWRlICJ2ZXJ0ZXguaCIKLSNpbmNsdWRlICJsaWdodC5oIgotI2luY2x1ZGUgInByaW1pdGl2ZXMuaCIKLSNpbmNsdWRlICJ0ZXh0dXJlLmgiCi0jaW5jbHVkZSAiQnVmZmVyT2JqZWN0TWFuYWdlci5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgVkNfQ0FDSEVfU1RBVElTVElDUyAgICAgMAotI2RlZmluZSBWQ19DQUNIRV9UWVBFX05PTkUgICAgICAwCi0jZGVmaW5lIFZDX0NBQ0hFX1RZUEVfSU5ERVhFRCAgIDEKLSNkZWZpbmUgVkNfQ0FDSEVfVFlQRV9MUlUgICAgICAgMgotI2RlZmluZSBWQ19DQUNIRV9UWVBFICAgICAgICAgICBWQ19DQUNIRV9UWVBFX0lOREVYRUQKLQotI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHZvaWQgdmFsaWRhdGVfYXJyYXlzKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIG1vZGUpOwotCi1zdGF0aWMgdm9pZCBjb21waWxlRWxlbWVudHNfX2dlbmVyaWMob2dsZXNfY29udGV4dF90KiwKLSAgICAgICAgdmVydGV4X3QqLCBHTGludCwgR0xzaXplaSk7Ci1zdGF0aWMgdm9pZCBjb21waWxlRWxlbWVudF9fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICB2ZXJ0ZXhfdCosIEdMaW50KTsKLQotc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAob2dsZXNfY29udGV4dF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotc3RhdGljIHZvaWQgZHJhd1ByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7Ci1zdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVzKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKLXN0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVTdHJpcChvZ2xlc19jb250ZXh0X3QqLCBHTGludCwgR0xzaXplaSk7Ci1zdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKLXN0YXRpYyB2b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVzKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKLQotc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzUG9pbnRzKG9nbGVzX2NvbnRleHRfdCosCi0gICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOwotc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwKG9nbGVzX2NvbnRleHRfdCosCi0gICAgICAgIEdMc2l6ZWksIGNvbnN0IEdMdm9pZCopOwotc3RhdGljIHZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3Aob2dsZXNfY29udGV4dF90KiwKLSAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7Ci1zdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKLXN0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlU3RyaXAob2dsZXNfY29udGV4dF90KiwKLSAgICAgICAgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7Ci1zdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbihvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKLXN0YXRpYyB2b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlcyhvZ2xlc19jb250ZXh0X3QqLAotICAgICAgICBHTHNpemVpLCBjb25zdCBHTHZvaWQqKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHZvaWQgKCphcnJheXNfcHJpbXNfZmN0X3QpKG9nbGVzX2NvbnRleHRfdCosIEdMaW50LCBHTHNpemVpKTsKLXN0YXRpYyBjb25zdCBhcnJheXNfcHJpbXNfZmN0X3QgZHJhd0FycmF5c1ByaW1zW10gPSB7Ci0gICAgZHJhd1ByaW1pdGl2ZXNQb2ludHMsCi0gICAgZHJhd1ByaW1pdGl2ZXNMaW5lcywKLSAgICBkcmF3UHJpbWl0aXZlc0xpbmVMb29wLAotICAgIGRyYXdQcmltaXRpdmVzTGluZVN0cmlwLAotICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVzLAotICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVTdHJpcCwKLSAgICBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuCi19OwotCi10eXBlZGVmIHZvaWQgKCplbGVtZW50c19wcmltc19mY3RfdCkob2dsZXNfY29udGV4dF90KiwgR0xzaXplaSwgY29uc3QgR0x2b2lkKik7Ci1zdGF0aWMgY29uc3QgZWxlbWVudHNfcHJpbXNfZmN0X3QgZHJhd0VsZW1lbnRzUHJpbXNbXSA9IHsKLSAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNQb2ludHMsCi0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZXMsCi0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZUxvb3AsCi0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzTGluZVN0cmlwLAotICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlcywKLSAgICBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwLAotICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuCi19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi12b2lkIG9nbGVzX2luaXRfYXJyYXkob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGMtPmFycmF5cy52ZXJ0ZXguc2l6ZSA9IDQ7Ci0gICAgYy0+YXJyYXlzLnZlcnRleC50eXBlID0gR0xfRkxPQVQ7Ci0gICAgYy0+YXJyYXlzLmNvbG9yLnNpemUgPSA0OwotICAgIGMtPmFycmF5cy5jb2xvci50eXBlID0gR0xfRkxPQVQ7Ci0gICAgYy0+YXJyYXlzLm5vcm1hbC5zaXplID0gNDsKLSAgICBjLT5hcnJheXMubm9ybWFsLnR5cGUgPSBHTF9GTE9BVDsKLSAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgYy0+YXJyYXlzLnRleHR1cmVbaV0uc2l6ZSA9IDQ7Ci0gICAgICAgIGMtPmFycmF5cy50ZXh0dXJlW2ldLnR5cGUgPSBHTF9GTE9BVDsKLSAgICB9Ci0gICAgYy0+dmMuaW5pdCgpOwotCi0gICAgaWYgKCFjLT52Yy52QnVmZmVyKSB7Ci0gICAgICAgIC8vIHRoaXMgY291bGQgaGF2ZSBmYWlsZWQKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7Ci0gICAgfQotfQotCi12b2lkIG9nbGVzX3VuaW5pdF9hcnJheShvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgYy0+dmMudW5pbml0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIEFycmF5IGZldGNoZXJzCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgY3VycmVudENvbG9yKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgewotICAgIG1lbWNweSh2LCBjLT5jdXJyZW50LmNvbG9yLnYsIHNpemVvZih2ZWM0X3QpKTsKLX0KLXN0YXRpYyB2b2lkIGN1cnJlbnRDb2xvcl9jbGFtcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQqIHYsIGNvbnN0IEdMdm9pZCopIHsKLSAgICBtZW1jcHkodiwgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52LCBzaXplb2YodmVjNF90KSk7Ci19Ci1zdGF0aWMgdm9pZCBjdXJyZW50Tm9ybWFsKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCogdiwgY29uc3QgR0x2b2lkKikgewotICAgIG1lbWNweSh2LCBjLT5jdXJyZW50Tm9ybWFsLnYsIHNpemVvZih2ZWMzX3QpKTsKLX0KLXN0YXRpYyB2b2lkIGN1cnJlbnRUZXhDb29yZChvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQqIHYsIGNvbnN0IEdMdm9pZCopIHsKLSAgICBtZW1jcHkodiwgYy0+Y3VycmVudC50ZXh0dXJlW2MtPmFycmF5cy50bXVdLnYsIHNpemVvZih2ZWM0X3QpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBmZXRjaE5vcChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiwgY29uc3QgR0x2b2lkKikgewotfQotc3RhdGljIHZvaWQgZmV0Y2gyYihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGJ5dGUqIHApIHsKLSAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKLSAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoMnMob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xzaG9ydCogcCkgewotICAgIHZbMF0gPSBnZ2xJbnRUb0ZpeGVkKHBbMF0pOwotICAgIHZbMV0gPSBnZ2xJbnRUb0ZpeGVkKHBbMV0pOwotfQotc3RhdGljIHZvaWQgZmV0Y2gyeChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7Ci0gICAgbWVtY3B5KHYsIHAsIDIqc2l6ZW9mKEdMZml4ZWQpKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoMmYob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmbG9hdCogcCkgewotICAgIHZbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocFswXSk7Ci0gICAgdlsxXSA9IGdnbEZsb2F0VG9GaXhlZChwWzFdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoM2Iob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7Ci0gICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7Ci0gICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7Ci0gICAgdlsyXSA9IGdnbEludFRvRml4ZWQocFsyXSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaDNzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKLSAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKLSAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKLSAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoM3gob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgewotICAgIG1lbWNweSh2LCBwLCAzKnNpemVvZihHTGZpeGVkKSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaDNmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKLSAgICB2WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMF0pOwotICAgIHZbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocFsxXSk7Ci0gICAgdlsyXSA9IGdnbEZsb2F0VG9GaXhlZChwWzJdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoNGIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xieXRlKiBwKSB7Ci0gICAgdlswXSA9IGdnbEludFRvRml4ZWQocFswXSk7Ci0gICAgdlsxXSA9IGdnbEludFRvRml4ZWQocFsxXSk7Ci0gICAgdlsyXSA9IGdnbEludFRvRml4ZWQocFsyXSk7Ci0gICAgdlszXSA9IGdnbEludFRvRml4ZWQocFszXSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaDRzKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMc2hvcnQqIHApIHsKLSAgICB2WzBdID0gZ2dsSW50VG9GaXhlZChwWzBdKTsKLSAgICB2WzFdID0gZ2dsSW50VG9GaXhlZChwWzFdKTsKLSAgICB2WzJdID0gZ2dsSW50VG9GaXhlZChwWzJdKTsKLSAgICB2WzNdID0gZ2dsSW50VG9GaXhlZChwWzNdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoNHgob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0xmaXhlZCogcCkgewotICAgIG1lbWNweSh2LCBwLCA0KnNpemVvZihHTGZpeGVkKSk7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaDRmKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZmxvYXQqIHApIHsKLSAgICB2WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbMF0pOwotICAgIHZbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocFsxXSk7Ci0gICAgdlsyXSA9IGdnbEZsb2F0VG9GaXhlZChwWzJdKTsKLSAgICB2WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBbM10pOwotfQotc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQ0dWIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0x1Ynl0ZSogcCkgewotICAgIHZbMF0gPSBHR0xfVUJfVE9fWChwWzBdKTsKLSAgICB2WzFdID0gR0dMX1VCX1RPX1gocFsxXSk7Ci0gICAgdlsyXSA9IEdHTF9VQl9UT19YKHBbMl0pOwotICAgIHZbM10gPSBHR0xfVUJfVE9fWChwWzNdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoQ2xhbXA0eChvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZpeGVkKiBwKSB7Ci0gICAgdlswXSA9IGdnbENsYW1weChwWzBdKTsKLSAgICB2WzFdID0gZ2dsQ2xhbXB4KHBbMV0pOwotICAgIHZbMl0gPSBnZ2xDbGFtcHgocFsyXSk7Ci0gICAgdlszXSA9IGdnbENsYW1weChwWzNdKTsKLX0KLXN0YXRpYyB2b2lkIGZldGNoQ2xhbXA0ZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7Ci0gICAgdlswXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFswXSkpOwotICAgIHZbMV0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pKTsKLSAgICB2WzJdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzJdKSk7Ci0gICAgdlszXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFszXSkpOwotfQotc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQzdWIob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCogdiwgY29uc3QgR0x1Ynl0ZSogcCkgewotICAgIHZbMF0gPSBHR0xfVUJfVE9fWChwWzBdKTsKLSAgICB2WzFdID0gR0dMX1VCX1RPX1gocFsxXSk7Ci0gICAgdlsyXSA9IEdHTF9VQl9UT19YKHBbMl0pOwotICAgIHZbM10gPSAweDEwMDAwOwotfQotc3RhdGljIHZvaWQgZmV0Y2hDbGFtcDN4KG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMZml4ZWQqIHApIHsKLSAgICB2WzBdID0gZ2dsQ2xhbXB4KHBbMF0pOwotICAgIHZbMV0gPSBnZ2xDbGFtcHgocFsxXSk7Ci0gICAgdlsyXSA9IGdnbENsYW1weChwWzJdKTsKLSAgICB2WzNdID0gMHgxMDAwMDsKLX0KLXN0YXRpYyB2b2lkIGZldGNoQ2xhbXAzZihvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTGZsb2F0KiBwKSB7Ci0gICAgdlswXSA9IGdnbENsYW1weChnZ2xGbG9hdFRvRml4ZWQocFswXSkpOwotICAgIHZbMV0gPSBnZ2xDbGFtcHgoZ2dsRmxvYXRUb0ZpeGVkKHBbMV0pKTsKLSAgICB2WzJdID0gZ2dsQ2xhbXB4KGdnbEZsb2F0VG9GaXhlZChwWzJdKSk7Ci0gICAgdlszXSA9IDB4MTAwMDA7Ci19Ci1zdGF0aWMgdm9pZCBmZXRjaEV4cGFuZDNiKG9nbGVzX2NvbnRleHRfdCosIEdMZml4ZWQqIHYsIGNvbnN0IEdMYnl0ZSogcCkgewotICAgIHZbMF0gPSBHR0xfQl9UT19YKHBbMF0pOwotICAgIHZbMV0gPSBHR0xfQl9UT19YKHBbMV0pOwotICAgIHZbMl0gPSBHR0xfQl9UT19YKHBbMl0pOwotfQotc3RhdGljIHZvaWQgZmV0Y2hFeHBhbmQzcyhvZ2xlc19jb250ZXh0X3QqLCBHTGZpeGVkKiB2LCBjb25zdCBHTHNob3J0KiBwKSB7Ci0gICAgdlswXSA9IEdHTF9TX1RPX1gocFswXSk7Ci0gICAgdlsxXSA9IEdHTF9TX1RPX1gocFsxXSk7Ci0gICAgdlsyXSA9IEdHTF9TX1RPX1gocFsyXSk7Ci19Ci0KLXR5cGVkZWYgYXJyYXlfdDo6ZmV0Y2hlcl90IGZuX3Q7Ci0KLXN0YXRpYyBjb25zdCBmbl90IGNvbG9yX2ZjdFsyXVsxNl0gPSB7IC8vIHNpemU9ezMsNH0sIHR5cGU9e3ViLGYseH0KLSAgICB7IDAsIChmbl90KWZldGNoRXhwYW5kM3ViLCAwLCAwLCAwLCAwLAotICAgICAgICAgKGZuX3QpZmV0Y2gzZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgIChmbl90KWZldGNoM3ggfSwKLSAgICB7IDAsIChmbl90KWZldGNoRXhwYW5kNHViLCAwLCAwLCAwLCAwLAotICAgICAgICAgKGZuX3QpZmV0Y2g0ZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgIChmbl90KWZldGNoNHggfSwKLX07Ci1zdGF0aWMgY29uc3QgZm5fdCBjb2xvcl9jbGFtcF9mY3RbMl1bMTZdID0geyAvLyBzaXplPXszLDR9LCB0eXBlPXt1YixmLHh9Ci0gICAgeyAwLCAoZm5fdClmZXRjaEV4cGFuZDN1YiwgMCwgMCwgMCwgMCwKLSAgICAgICAgIChmbl90KWZldGNoQ2xhbXAzZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgICAgIChmbl90KWZldGNoQ2xhbXAzeCB9LAotICAgIHsgMCwgKGZuX3QpZmV0Y2hFeHBhbmQ0dWIsIDAsIDAsIDAsIDAsCi0gICAgICAgICAoZm5fdClmZXRjaENsYW1wNGYsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAgICAoZm5fdClmZXRjaENsYW1wNHggfSwKLX07Ci1zdGF0aWMgY29uc3QgZm5fdCBub3JtYWxfZmN0WzFdWzE2XSA9IHsgLy8gc2l6ZT17M30sIHR5cGU9e2IscyxmLHh9Ci0gICAgeyAoZm5fdClmZXRjaEV4cGFuZDNiLCAwLAotICAgICAgKGZuX3QpZmV0Y2hFeHBhbmQzcywgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoM2YsIDAsIDAsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDN4IH0sCi19Owotc3RhdGljIGNvbnN0IGZuX3QgdmVydGV4X2ZjdFszXVsxNl0gPSB7IC8vIHNpemU9ezIsMyw0fSwgdHlwZT17YixzLGYseH0KLSAgICB7IChmbl90KWZldGNoMmIsIDAsCi0gICAgICAoZm5fdClmZXRjaDJzLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gyZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoM3ggfSwKLSAgICB7IChmbl90KWZldGNoM2IsIDAsCi0gICAgICAoZm5fdClmZXRjaDNzLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gzZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoM3ggfSwKLSAgICB7IChmbl90KWZldGNoNGIsIDAsCi0gICAgICAoZm5fdClmZXRjaDRzLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2g0ZiwgMCwgMCwgMCwgMCwgMCwKLSAgICAgIChmbl90KWZldGNoNHggfQotfTsKLXN0YXRpYyBjb25zdCBmbl90IHRleHR1cmVfZmN0WzNdWzE2XSA9IHsgLy8gc2l6ZT17MiwzLDR9LCB0eXBlPXtiLHMsZix4fQotICAgIHsgKGZuX3QpZmV0Y2gyYiwgMCwKLSAgICAgIChmbl90KWZldGNoMnMsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDJmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gyeCB9LAotICAgIHsgKGZuX3QpZmV0Y2gzYiwgMCwKLSAgICAgIChmbl90KWZldGNoM3MsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDNmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2gzeCB9LAotICAgIHsgKGZuX3QpZmV0Y2g0YiwgMCwKLSAgICAgIChmbl90KWZldGNoNHMsIDAsIDAsIDAsCi0gICAgICAoZm5fdClmZXRjaDRmLCAwLCAwLCAwLCAwLCAwLAotICAgICAgKGZuX3QpZmV0Y2g0eCB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBhcnJheV90Ci0jZW5kaWYKLQotdm9pZCBhcnJheV90Ojppbml0KAotICAgICAgICBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgY29uc3QgYnVmZmVyX3QqIGJvLCBHTHNpemVpIGNvdW50KQotewotICAgIGlmICghc3RyaWRlKSB7Ci0gICAgICAgIHN0cmlkZSA9IHNpemU7Ci0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIEdMX1NIT1JUOgotICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAgICAgc3RyaWRlICo9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgY2FzZSBHTF9GSVhFRDoKLSAgICAgICAgICAgIHN0cmlkZSAqPSA0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGhpcy0+c2l6ZSA9IHNpemU7Ci0gICAgdGhpcy0+dHlwZSA9IHR5cGU7Ci0gICAgdGhpcy0+c3RyaWRlID0gc3RyaWRlOwotICAgIHRoaXMtPnBvaW50ZXIgPSBwb2ludGVyOwotICAgIHRoaXMtPmJvID0gYm87Ci0gICAgdGhpcy0+Ym91bmRzID0gY291bnQ7Ci19Ci0KLWlubGluZSB2b2lkIGFycmF5X3Q6OnJlc29sdmUoKQotewotICAgIHBoeXNpY2FsX3BvaW50ZXIgPSAoYm8pID8gKGJvLT5kYXRhICsgdWludHB0cl90KHBvaW50ZXIpKSA6IHBvaW50ZXI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIHZlcnRleF9jYWNoZV90Ci0jZW5kaWYKLQotdm9pZCB2ZXJ0ZXhfY2FjaGVfdDo6aW5pdCgpCi17Ci0gICAgLy8gbWFrZSBzdXJlIHRoZSBzaXplIG9mIHZlcnRleF90IGFsbG93cyBjYWNoZS1saW5lIGFsaWdubWVudAotICAgIENUQTwoc2l6ZW9mKHZlcnRleF90KSAmIDB4MUYpID09IDA+IGFzc2VydEFsaWduZWRTaXplOwotCi0gICAgY29uc3QgaW50IGFsaWduID0gMzI7Ci0gICAgY29uc3Qgc2l6ZV90IHMgPSBWRVJURVhfQlVGRkVSX1NJWkUgKyBWRVJURVhfQ0FDSEVfU0laRTsKLSAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IHMqc2l6ZW9mKHZlcnRleF90KSArIGFsaWduOwotICAgIGJhc2UgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgaWYgKGJhc2UpIHsKLSAgICAgICAgbWVtc2V0KGJhc2UsIDAsIHNpemUpOwotICAgICAgICB2QnVmZmVyID0gKHZlcnRleF90KikoKHNpemVfdChiYXNlKSArIGFsaWduIC0gMSkgJiB+KGFsaWduLTEpKTsKLSAgICAgICAgdkNhY2hlID0gdkJ1ZmZlciArIFZFUlRFWF9CVUZGRVJfU0laRTsKLSAgICAgICAgc2VxdWVuY2UgPSAwOwotICAgIH0KLX0KLQotdm9pZCB2ZXJ0ZXhfY2FjaGVfdDo6dW5pbml0KCkKLXsKLSAgICBmcmVlKGJhc2UpOwotICAgIGJhc2UgPSB2QnVmZmVyID0gdkNhY2hlID0gMDsKLX0KLQotdm9pZCB2ZXJ0ZXhfY2FjaGVfdDo6Y2xlYXIoKQotewotI2lmIFZDX0NBQ0hFX1NUQVRJU1RJQ1MKLSAgICBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgdG90YWwgPSAwOwotICAgIG1pc3NlcyA9IDA7Ci0jZW5kaWYKLQotI2lmIFZDX0NBQ0hFX1RZUEUgPT0gVkNfQ0FDSEVfVFlQRV9MUlUKLSAgICB2ZXJ0ZXhfdCogdiA9IHZCdWZmZXI7Ci0gICAgc2l6ZV90IGNvdW50ID0gVkVSVEVYX0JVRkZFUl9TSVpFICsgVkVSVEVYX0NBQ0hFX1NJWkU7Ci0gICAgZG8gewotICAgICAgICB2LT5tcnUgPSAwOwotICAgICAgICB2Kys7Ci0gICAgfSB3aGlsZSAoLS1jb3VudCk7Ci0jZW5kaWYKLQotICAgIHNlcXVlbmNlICs9IElOREVYX1NFUTsKLSAgICBpZiAoc2VxdWVuY2UgPj0gMHg4MDAwMDAwMExVKSB7Ci0gICAgICAgIHNlcXVlbmNlID0gSU5ERVhfU0VROwotICAgICAgICB2ZXJ0ZXhfdCogdiA9IHZCdWZmZXI7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IFZFUlRFWF9CVUZGRVJfU0laRSArIFZFUlRFWF9DQUNIRV9TSVpFOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2LT5pbmRleCA9IDA7Ci0gICAgICAgICAgICB2Kys7Ci0gICAgICAgIH0gd2hpbGUgKC0tY291bnQpOwotICAgIH0KLX0KLQotdm9pZCB2ZXJ0ZXhfY2FjaGVfdDo6ZHVtcF9zdGF0cyhHTGVudW0gbW9kZSkKLXsKLSNpZiBWQ19DQUNIRV9TVEFUSVNUSUNTCi0gICAgbnNlY3NfdCB0aW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpIC0gc3RhcnRUaW1lOwotICAgIHVpbnQzMl90IGhpdHMgPSB0b3RhbCAtIG1pc3NlczsKLSAgICB1aW50MzJfdCBwcmltX2NvdW50OwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfUE9JTlRTOiAgICAgICAgICAgICBwcmltX2NvdW50ID0gdG90YWw7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MSU5FX1NUUklQOiAgICAgICAgIHByaW1fY291bnQgPSB0b3RhbCAtIDE7ICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xJTkVfTE9PUDogICAgICAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMTsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTElORVM6ICAgICAgICAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLyAyOyAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9UUklBTkdMRV9TVFJJUDogICAgIHByaW1fY291bnQgPSB0b3RhbCAtIDI7ICAgICBicmVhazsKLSAgICBjYXNlIEdMX1RSSUFOR0xFX0ZBTjogICAgICAgcHJpbV9jb3VudCA9IHRvdGFsIC0gMjsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVFJJQU5HTEVTOiAgICAgICAgICBwcmltX2NvdW50ID0gdG90YWwgLyAzOyAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgcmV0dXJuOwotICAgIH0KLSAgICBwcmludGYoICJ0b3RhbD0lNXUsIGhpdHM9JTV1LCBtaXNzPSU1dSwgaGl0cmF0ZT0lM3UlJSwiCi0gICAgICAgICAgICAiIHByaW1zPSU1dSwgdGltZT0lNnUgdXMsIHByaW1zL3M9JWQsIHYvdD0lZlxuIiwKLSAgICAgICAgICAgIHRvdGFsLCBoaXRzLCBtaXNzZXMsIChoaXRzKjEwMCkvdG90YWwsCi0gICAgICAgICAgICBwcmltX2NvdW50LCBpbnQobnMydXModGltZSkpLCBpbnQocHJpbV9jb3VudCpmbG9hdChzZWNvbmRzKDEpKS90aW1lKSwKLSAgICAgICAgICAgIGZsb2F0KG1pc3NlcykgLyBwcmltX2NvdW50KTsKLSNlbmRpZgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCBlbmFibGVEaXNhYmxlQ2xpZW50U3RhdGUob2dsZXNfY29udGV4dF90KiBjLCBHTGVudW0gYXJyYXksIGJvb2wgZW5hYmxlKQotewotICAgIGNvbnN0IGludCB0bXUgPSBjLT5hcnJheXMuYWN0aXZlVGV4dHVyZTsKLSAgICBhcnJheV90KiBhOwotICAgIHN3aXRjaCAoYXJyYXkpIHsKLSAgICBjYXNlIEdMX0NPTE9SX0FSUkFZOiAgICAgICAgICAgIGEgPSAmYy0+YXJyYXlzLmNvbG9yOyAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9OT1JNQUxfQVJSQVk6ICAgICAgICAgICBhID0gJmMtPmFycmF5cy5ub3JtYWw7ICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRV9DT09SRF9BUlJBWTogICAgYSA9ICZjLT5hcnJheXMudGV4dHVyZVt0bXVdOyAgICBicmVhazsKLSAgICBjYXNlIEdMX1ZFUlRFWF9BUlJBWTogICAgICAgICAgIGEgPSAmYy0+YXJyYXlzLnZlcnRleDsgICAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhLT5lbmFibGUgPSBlbmFibGUgPyBHTF9UUlVFIDogR0xfRkFMU0U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIFZlcnRleCBDYWNoZQotI2VuZGlmCi0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12ZXJ0ZXhfdCogY2FjaGVfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGluZGV4KQotewotICAgICNpZiBWQ19DQUNIRV9TVEFUSVNUSUNTCi0gICAgICAgIGMtPnZjLm1pc3NlcysrOwotICAgICNlbmRpZgotICAgIGlmIChnZ2xfdW5saWtlbHkodi0+bG9ja2VkKSkgewotICAgICAgICAvLyB3ZSdyZSBqdXN0IGxvb2tpbmcgZm9yIGFuIGVudHJ5IGluIHRoZSBjYWNoZSB0aGF0IGlzIG5vdCBsb2NrZWQuCi0gICAgICAgIC8vIGFuZCB3ZSBrbm93IHRoYXQgdGhlcmUgY2Fubm90IGJlIG1vcmUgdGhhbiAyIGxvY2tlZCBlbnRyaWVzCi0gICAgICAgIC8vIGJlY2F1c2UgYSB0cmlhbmdsZSBuZWVkcyBhdCBtb3N0IDMgdmVydGljZXMuCi0gICAgICAgIC8vIFdlIG5ldmVyIHVzZSB0aGUgZmlyc3QgYW5kIHNlY29uZCBlbnRyaWVzIGJlY2F1c2UgdGhleSBtaWdodCBiZSBpbgotICAgICAgICAvLyB1c2UgYnkgdGhlIHN0cmlwZXIgb3IgZmFuZXIuIEFueSBvdGhlciBlbnRyeSB3aWxsIGRvIGFzIGxvbmcgYXMKLSAgICAgICAgLy8gaXQncyBub3QgbG9ja2VkLgotICAgICAgICAvLyBXZSBjb21wdXRlIGRpcmVjdGx5IHRoZSBpbmRleCBvZiBhICJmcmVlIiBlbnRyeSBmcm9tIHRoZSBsb2NrZWQKLSAgICAgICAgLy8gc3RhdGUgb2YgdlsyXSBhbmQgdlszXS4KLSAgICAgICAgdiA9IGMtPnZjLnZCdWZmZXIgKyAyOwotICAgICAgICB2ICs9IHZbMF0ubG9ja2VkIHwgKHZbMV0ubG9ja2VkPDwxKTsKLSAgICB9Ci0gICAgLy8gbm90ZTogY29tcGlsZUVsZW1lbnQgY2xlYXJzIHYtPmZsYWdzCi0gICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYsIGluZGV4KTsKLSAgICB2LT5sb2NrZWQgPSAxOwotICAgIHJldHVybiB2OwotfQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdmVydGV4X3QqIGZldGNoX3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHNpemVfdCBpbmRleCkKLXsKLSAgICBpbmRleCB8PSBjLT52Yy5zZXF1ZW5jZTsKLQotI2lmIFZDX0NBQ0hFX1RZUEUgPT0gVkNfQ0FDSEVfVFlQRV9JTkRFWEVECi0KLSAgICB2ZXJ0ZXhfdCogY29uc3QgdiA9IGMtPnZjLnZDYWNoZSArCi0gICAgICAgICAgICAoaW5kZXggJiAodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFLTEpKTsKLQotICAgIGlmIChnZ2xfbGlrZWx5KHYtPmluZGV4ID09IGluZGV4KSkgewotICAgICAgICB2LT5sb2NrZWQgPSAxOwotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0gICAgcmV0dXJuIGNhY2hlX3ZlcnRleChjLCB2LCBpbmRleCk7Ci0KLSNlbGlmIFZDX0NBQ0hFX1RZUEUgPT0gVkNfQ0FDSEVfVFlQRV9MUlUKLQotICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkNhY2hlICsKLSAgICAgICAgICAgIChpbmRleCAmICgodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFLTEpPj4xKSkqMjsKLQotICAgIC8vIGFsd2F5cyByZWNvcmQgTFJVIGluIHZbMF0KLSAgICBpZiAoZ2dsX2xpa2VseSh2WzBdLmluZGV4ID09IGluZGV4KSkgewotICAgICAgICB2WzBdLmxvY2tlZCA9IDE7Ci0gICAgICAgIHZbMF0ubXJ1ID0gMDsKLSAgICAgICAgcmV0dXJuICZ2WzBdOwotICAgIH0KLQotICAgIGlmIChnZ2xfbGlrZWx5KHZbMV0uaW5kZXggPT0gaW5kZXgpKSB7Ci0gICAgICAgIHZbMV0ubG9ja2VkID0gMTsKLSAgICAgICAgdlswXS5tcnUgPSAxOwotICAgICAgICByZXR1cm4gJnZbMV07Ci0gICAgfQotCi0gICAgY29uc3QgaW50IGxydSA9IDEgLSB2WzBdLm1ydTsKLSAgICB2WzBdLm1ydSA9IGxydTsKLSAgICByZXR1cm4gY2FjaGVfdmVydGV4KGMsICZ2W2xydV0sIGluZGV4KTsKLQotI2VsaWYgVkNfQ0FDSEVfVFlQRSA9PSBWQ19DQUNIRV9UWVBFX05PTkUKLQotICAgIC8vIGp1c3QgZm9yIGRlYnVnZ2luZy4uLgotICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlciArIDI7Ci0gICAgcmV0dXJuIGNhY2hlX3ZlcnRleChjLCB2LCBpbmRleCk7Ci0KLSNlbmRpZgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBQcmltaXRpdmUgQXNzZW1ibHkKLSNlbmRpZgotCi12b2lkIGRyYXdQcmltaXRpdmVzUG9pbnRzKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDEpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyB2ZXJ0ZXggY2FjaGUgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDEKLSAgICBjb25zdCBHTHNpemVpIHZjcyA9Ci0gICAgICAgICAgICAodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCi0gICAgICAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKTsKLSAgICBkbyB7Ci0gICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKLSAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OwotICAgICAgICBjLT5hcnJheXMuY3VsbCA9IHZlcnRleF90OjpDTElQX0FMTDsKLSAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKLSAgICAgICAgZmlyc3QgKz0gbnVtOwotICAgICAgICBjb3VudCAtPSBudW07Ci0gICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKLSAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdlswXS5mbGFnczsKLSAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclBvaW50KGMsIHYpOwotICAgICAgICAgICAgICAgIHYrKzsKLSAgICAgICAgICAgICAgICBudW0tLTsKLSAgICAgICAgICAgIH0gd2hpbGUgKG51bSk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChjb3VudCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVTdHJpcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgdmVydGV4X3QgKnYsICp2MCwgKnYxOwotICAgIGMtPmFycmF5cy5jdWxsID0gdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudChjLCBjLT52Yy52QnVmZmVyLCBmaXJzdCk7Ci0gICAgZmlyc3QgKz0gMTsKLSAgICBjb3VudCAtPSAxOwotCi0gICAgLy8gdmVydGV4IGNhY2hlIHNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiAxCi0gICAgY29uc3QgR0xzaXplaSB2Y3MgPQotICAgICAgICAodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCi0gICAgICAgICB2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0NBQ0hFX1NJWkUgLSAxKTsKLSAgICBkbyB7Ci0gICAgICAgIHYwID0gYy0+dmMudkJ1ZmZlciArIDA7Ci0gICAgICAgIHYgID0gYy0+dmMudkJ1ZmZlciArIDE7Ci0gICAgICAgIEdMc2l6ZWkgbnVtID0gY291bnQgPiB2Y3MgPyB2Y3MgOiBjb3VudDsKLSAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKLSAgICAgICAgZmlyc3QgKz0gbnVtOwotICAgICAgICBjb3VudCAtPSBudW07Ci0gICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKLSAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHYxID0gdisrOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOwotICAgICAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgICAgICAgICAgYy0+cHJpbXMucmVuZGVyTGluZShjLCB2MCwgdjEpOwotICAgICAgICAgICAgICAgIHYwID0gdjE7Ci0gICAgICAgICAgICAgICAgbnVtLS07Ci0gICAgICAgICAgICB9IHdoaWxlIChudW0pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvcHkgYmFjayB0aGUgbGFzdCBwcm9jZXNzZWQgdmVydGV4Ci0gICAgICAgIGMtPnZjLnZCdWZmZXJbMF0gPSAqdjA7Ci0gICAgICAgIGMtPmFycmF5cy5jdWxsID0gdjAtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgIH0gd2hpbGUgKGNvdW50KTsKLX0KLQotdm9pZCBkcmF3UHJpbWl0aXZlc0xpbmVMb29wKG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDIpKQotICAgICAgICByZXR1cm47Ci0gICAgZHJhd1ByaW1pdGl2ZXNMaW5lU3RyaXAoYywgZmlyc3QsIGNvdW50KTsKLSAgICBpZiAoZ2dsX2xpa2VseShjb3VudCA+PSAzKSkgewotICAgICAgICB2ZXJ0ZXhfdCogdjAgPSBjLT52Yy52QnVmZmVyOwotICAgICAgICB2ZXJ0ZXhfdCogdjEgPSBjLT52Yy52QnVmZmVyICsgMTsKLSAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYxLCBmaXJzdCk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOwotICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Ci0gICAgfQotfQotCi12b2lkIGRyYXdQcmltaXRpdmVzTGluZXMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMikpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMgotICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0KLSAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKLSAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKSAvIDIpICogMjsKLSAgICBkbyB7Ci0gICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKLSAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OwotICAgICAgICBjLT5hcnJheXMuY3VsbCA9IHZlcnRleF90OjpDTElQX0FMTDsKLSAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKLSAgICAgICAgZmlyc3QgKz0gbnVtOwotICAgICAgICBjb3VudCAtPSBudW07Ci0gICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKLSAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAotICAgICAgICAgICAgbnVtIC09IDI7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2WzBdLmZsYWdzICYgdlsxXS5mbGFnczsKLSAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdiwgdisxKTsKLSAgICAgICAgICAgICAgICB2ICs9IDI7Ci0gICAgICAgICAgICAgICAgbnVtIC09IDI7Ci0gICAgICAgICAgICB9IHdoaWxlIChudW0gPj0gMCk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChjb3VudCA+PSAyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuT3JTdHJpcChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50LCBpbnQgd2luZGluZykKLXsKLSAgICAvLyB3aW5kaW5nID09IDIgOiBmYW4KLSAgICAvLyB3aW5kaW5nID09IDEgOiBzdHJpcAotCi0gICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDMpKQotICAgICAgICByZXR1cm47Ci0KLSAgICB2ZXJ0ZXhfdCAqdiwgKnYwLCAqdjEsICp2MjsKLSAgICBjLT5hcnJheXMuY3VsbCA9IHZlcnRleF90OjpDTElQX0FMTDsKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzKGMsIGMtPnZjLnZCdWZmZXIsIGZpcnN0LCAyKTsKLSAgICBmaXJzdCArPSAyOwotICAgIGNvdW50IC09IDI7Ci0KLSAgICAvLyB2ZXJ0ZXggY2FjaGUgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIDIuIFRoaXMgaXMgZXh0cmVtZWx5IGltcG9ydGFudAotICAgIC8vIGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIHByZXNlcnZlIHRoZSBzYW1lIHdpbmRpbmcgd2hlbiB0aGUgd2hvbGUKLSAgICAvLyBiYXRjaCBpcyBjdWxsZWQuIFdlIGFsc28gbmVlZCAyIGV4dHJhIHZlcnRpY2VzIGluIHRoZSBhcnJheSwgYmVjYXVzZQotICAgIC8vIHdlIGFsd2F5cyBrZWVwIHRoZSB0d28gZmlyc3Qgb25lcy4KLSAgICBjb25zdCBHTHNpemVpIHZjcyA9Ci0gICAgICAgICgodmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9CVUZGRVJfU0laRSArCi0gICAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFIC0gMikgLyAyKSAqIDI7Ci0gICAgZG8gewotICAgICAgICB2MCA9IGMtPnZjLnZCdWZmZXIgKyAwOwotICAgICAgICB2MSA9IGMtPnZjLnZCdWZmZXIgKyAxOwotICAgICAgICB2ICA9IGMtPnZjLnZCdWZmZXIgKyAyOwotICAgICAgICBHTHNpemVpIG51bSA9IGNvdW50ID4gdmNzID8gdmNzIDogY291bnQ7Ci0gICAgICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudHMoYywgdiwgZmlyc3QsIG51bSk7Ci0gICAgICAgIGZpcnN0ICs9IG51bTsKLSAgICAgICAgY291bnQgLT0gbnVtOwotICAgICAgICBpZiAoIWMtPmFycmF5cy5jdWxsKSB7Ci0gICAgICAgICAgICAvLyBxdWljay90cml2aWFsIHJlamVjdCBvZiB0aGUgd2hvbGUgYmF0Y2gKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB2MiA9IHYrKzsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFnczsKLSAgICAgICAgICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotICAgICAgICAgICAgICAgIHN3YXAoKCh3aW5kaW5nXj0xKSA/IHYxIDogdjApLCB2Mik7Ci0gICAgICAgICAgICAgICAgbnVtLS07Ci0gICAgICAgICAgICB9IHdoaWxlIChudW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3VudCkgewotICAgICAgICAgICAgdjAgPSBjLT52Yy52QnVmZmVyICsgMiArIHZjcyAtIDI7Ci0gICAgICAgICAgICB2MSA9IGMtPnZjLnZCdWZmZXIgKyAyICsgdmNzIC0gMTsKLSAgICAgICAgICAgIGlmICgod2luZGluZyYyKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gZm9yIHN0cmlwcyBjb3B5IGJhY2sgdGhlIHR3byBsYXN0IGNvbXBpbGVkIHZlcnRpY2VzCi0gICAgICAgICAgICAgICAgYy0+dmMudkJ1ZmZlclswXSA9ICp2MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMtPnZjLnZCdWZmZXJbMV0gPSAqdjE7Ci0gICAgICAgICAgICBjLT5hcnJheXMuY3VsbCA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHZlcnRleF90OjpDTElQX0FMTDsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGNvdW50ID4gMCk7Ci19Ci0KLXZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpIHsKLSAgICBkcmF3UHJpbWl0aXZlc1RyaWFuZ2xlRmFuT3JTdHJpcChjLCBmaXJzdCwgY291bnQsIDEpOwotfQotCi12b2lkIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW4ob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgewotICAgIGRyYXdQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGZpcnN0LCBjb3VudCwgMik7Ci19Ci0KLXZvaWQgZHJhd1ByaW1pdGl2ZXNUcmlhbmdsZXMob2dsZXNfY29udGV4dF90KiBjLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMykpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIHZlcnRleCBjYWNoZSBzaXplIG11c3QgYmUgbXVsdGlwbGUgb2YgMwotICAgIGNvbnN0IEdMc2l6ZWkgdmNzID0KLSAgICAgICAgKCh2ZXJ0ZXhfY2FjaGVfdDo6VkVSVEVYX0JVRkZFUl9TSVpFICsKLSAgICAgICAgdmVydGV4X2NhY2hlX3Q6OlZFUlRFWF9DQUNIRV9TSVpFKSAvIDMpICogMzsKLSAgICBkbyB7Ci0gICAgICAgIHZlcnRleF90KiB2ID0gYy0+dmMudkJ1ZmZlcjsKLSAgICAgICAgR0xzaXplaSBudW0gPSBjb3VudCA+IHZjcyA/IHZjcyA6IGNvdW50OwotICAgICAgICBjLT5hcnJheXMuY3VsbCA9IHZlcnRleF90OjpDTElQX0FMTDsKLSAgICAgICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50cyhjLCB2LCBmaXJzdCwgbnVtKTsKLSAgICAgICAgZmlyc3QgKz0gbnVtOwotICAgICAgICBjb3VudCAtPSBudW07Ci0gICAgICAgIGlmICghYy0+YXJyYXlzLmN1bGwpIHsKLSAgICAgICAgICAgIC8vIHF1aWNrL3RyaXZpYWwgcmVqZWN0IG9mIHRoZSB3aG9sZSBiYXRjaAotICAgICAgICAgICAgbnVtIC09IDM7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2WzBdLmZsYWdzICYgdlsxXS5mbGFncyAmIHZbMl0uZmxhZ3M7Ci0gICAgICAgICAgICAgICAgaWYgKGdnbF9saWtlbHkoIShjYyAmIHZlcnRleF90OjpDTElQX0FMTCkpKQotICAgICAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJUcmlhbmdsZShjLCB2LCB2KzEsIHYrMik7Ci0gICAgICAgICAgICAgICAgdiArPSAzOwotICAgICAgICAgICAgICAgIG51bSAtPSAzOwotICAgICAgICAgICAgfSB3aGlsZSAobnVtID49IDApOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoY291bnQgPj0gMyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLS8vIHRoaXMgbG9va3MgZ29vZnksIGJ1dCBnY2MgZG9lcyBhIGdyZWF0IGpvYiB3aXRoIHRoaXMuLi4KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWRfaW5kZXgoaW50IHR5cGUsIGNvbnN0IEdMdm9pZComIHApIHsKLSAgICB1bnNpZ25lZCBpbnQgcjsKLSAgICBpZiAodHlwZSkgewotICAgICAgICByID0gKihjb25zdCBHTHVieXRlKilwOwotICAgICAgICBwID0gKGNvbnN0IEdMdWJ5dGUqKXAgKyAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHIgPSAqKGNvbnN0IEdMdXNob3J0KilwOwotICAgICAgICBwID0gKGNvbnN0IEdMdXNob3J0KilwICsgMTsKLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNQb2ludHMob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseShjb3VudCA8IDEpKQotICAgICAgICByZXR1cm47Ci0gICAgY29uc3QgaW50IHR5cGUgPSAoYy0+YXJyYXlzLmluZGljZXNUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOwotICAgIGRvIHsKLSAgICAgICAgdmVydGV4X3QgKiB2ID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOwotICAgICAgICBpZiAoZ2dsX2xpa2VseSghKHYtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJQb2ludChjLCB2KTsKLSAgICAgICAgdi0+bG9ja2VkID0gMDsKLSAgICAgICAgY291bnQtLTsKLSAgICB9IHdoaWxlKGNvdW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGRyYXdJbmRleGVkUHJpbWl0aXZlc0xpbmVTdHJpcChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMikpCi0gICAgICAgIHJldHVybjsKLQotICAgIHZlcnRleF90ICogY29uc3QgdiA9IGMtPnZjLnZCdWZmZXI7Ci0gICAgdmVydGV4X3QqIHYwID0gdjsKLSAgICB2ZXJ0ZXhfdCogdjE7Ci0KLSAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7Ci0gICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICBjb3VudCAtPSAxOwotICAgIGRvIHsKLSAgICAgICAgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOwotICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Ci0gICAgICAgIHYwLT5sb2NrZWQgPSAwOwotICAgICAgICB2MCA9IHYxOwotICAgICAgICBjb3VudC0tOwotICAgIH0gd2hpbGUgKGNvdW50KTsKLSAgICB2MS0+bG9ja2VkID0gMDsKLX0KLQotdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lTG9vcChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDw9IDIpKSB7Ci0gICAgICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc0xpbmVzKGMsIGNvdW50LCBpbmRpY2VzKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZlcnRleF90ICogY29uc3QgdiA9IGMtPnZjLnZCdWZmZXI7Ci0gICAgdmVydGV4X3QqIHYwID0gdjsKLSAgICB2ZXJ0ZXhfdCogdjE7Ci0KLSAgICBjb25zdCBpbnQgdHlwZSA9IChjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfQllURSk7Ci0gICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYwLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICBjb3VudCAtPSAxOwotICAgIGRvIHsKLSAgICAgICAgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOwotICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Ci0gICAgICAgIHYwLT5sb2NrZWQgPSAwOwotICAgICAgICB2MCA9IHYxOwotICAgICAgICBjb3VudC0tOwotICAgIH0gd2hpbGUgKGNvdW50KTsKLSAgICB2MS0+bG9ja2VkID0gMDsKLQotICAgIHYxID0gYy0+dmMudkJ1ZmZlcjsKLSAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFnczsKLSAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUoYywgdjAsIHYxKTsKLX0KLQotdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNMaW5lcyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMikpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvdW50IC09IDI7Ci0gICAgY29uc3QgaW50IHR5cGUgPSAoYy0+YXJyYXlzLmluZGljZXNUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOwotICAgIGRvIHsKLSAgICAgICAgdmVydGV4X3QqIGNvbnN0IHYwID0gZmV0Y2hfdmVydGV4KGMsIHJlYWRfaW5kZXgodHlwZSwgaW5kaWNlcykpOwotICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGNjID0gdjAtPmZsYWdzICYgdjEtPmZsYWdzOwotICAgICAgICBpZiAoZ2dsX2xpa2VseSghKGNjICYgdmVydGV4X3Q6OkNMSVBfQUxMKSkpCi0gICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lKGMsIHYwLCB2MSk7Ci0gICAgICAgIHYwLT5sb2NrZWQgPSAwOwotICAgICAgICB2MS0+bG9ja2VkID0gMDsKLSAgICAgICAgY291bnQgLT0gMjsKLSAgICB9IHdoaWxlIChjb3VudCA+PSAwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbk9yU3RyaXAob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTHNpemVpIGNvdW50LCBjb25zdCBHTHZvaWQgKmluZGljZXMsIGludCB3aW5kaW5nKQotewotICAgIC8vIHdpbmRpbmcgPT0gMiA6IGZhbgotICAgIC8vIHdpbmRpbmcgPT0gMSA6IHN0cmlwCi0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50IDwgMykpCi0gICAgICAgIHJldHVybjsKLQotICAgIHZlcnRleF90ICogY29uc3QgdiA9IGMtPnZjLnZCdWZmZXI7Ci0gICAgdmVydGV4X3QqIHYwID0gdjsKLSAgICB2ZXJ0ZXhfdCogdjEgPSB2KzE7Ci0gICAgdmVydGV4X3QqIHYyOwotCi0gICAgY29uc3QgaW50IHR5cGUgPSAoYy0+YXJyYXlzLmluZGljZXNUeXBlID09IEdMX1VOU0lHTkVEX0JZVEUpOwotICAgIGMtPmFycmF5cy5jb21waWxlRWxlbWVudChjLCB2MCwgcmVhZF9pbmRleCh0eXBlLCBpbmRpY2VzKSk7Ci0gICAgYy0+YXJyYXlzLmNvbXBpbGVFbGVtZW50KGMsIHYxLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICBjb3VudCAtPSAyOwotCi0gICAgLy8gbm90ZTogR0NDIDQuMS4xIGhlcmUgbWFrZXMgYSBwcmV0eSBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb24KLSAgICAvLyB3aGVyZSBpdCBkdXBsaWNhdGVzIHRoZSBsb29wIGJlbG93IGJhc2VkIG9uIGMtPmFycmF5cy5pbmRpY2VzVHlwZQotCi0gICAgZG8gewotICAgICAgICB2MiA9IGZldGNoX3ZlcnRleChjLCByZWFkX2luZGV4KHR5cGUsIGluZGljZXMpKTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgY2MgPSB2MC0+ZmxhZ3MgJiB2MS0+ZmxhZ3MgJiB2Mi0+ZmxhZ3M7Ci0gICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotICAgICAgICB2ZXJ0ZXhfdCogJiBjb25zdW1lZCA9ICgod2luZGluZ149MSkgPyB2MSA6IHYwKTsKLSAgICAgICAgY29uc3VtZWQtPmxvY2tlZCA9IDA7Ci0gICAgICAgIGNvbnN1bWVkID0gdjI7Ci0gICAgICAgIGNvdW50LS07Ci0gICAgfSB3aGlsZSAoY291bnQpOwotICAgIHYwLT5sb2NrZWQgPSB2MS0+bG9ja2VkID0gMDsKLSAgICB2Mi0+bG9ja2VkID0gMDsKLX0KLQotdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZVN0cmlwKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKSB7Ci0gICAgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVGYW5PclN0cmlwKGMsIGNvdW50LCBpbmRpY2VzLCAxKTsKLX0KLQotdm9pZCBkcmF3SW5kZXhlZFByaW1pdGl2ZXNUcmlhbmdsZUZhbihvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykgewotICAgIGRyYXdJbmRleGVkUHJpbWl0aXZlc1RyaWFuZ2xlRmFuT3JTdHJpcChjLCBjb3VudCwgaW5kaWNlcywgMik7Ci19Ci0KLXZvaWQgZHJhd0luZGV4ZWRQcmltaXRpdmVzVHJpYW5nbGVzKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xzaXplaSBjb3VudCwgY29uc3QgR0x2b2lkICppbmRpY2VzKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkoY291bnQgPCAzKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY291bnQgLT0gMzsKLSAgICBpZiAoZ2dsX2xpa2VseShjLT5hcnJheXMuaW5kaWNlc1R5cGUgPT0gR0xfVU5TSUdORURfU0hPUlQpKSB7Ci0gICAgICAgIC8vIFRoaXMgY2FzZSBpcyBwcm9iYWJseSBvdXIgbW9zdCBjb21tb24gY2FzZS4uLgotICAgICAgICB1aW50MTZfdCBjb25zdCAqIHAgPSAodWludDE2X3QgY29uc3QgKilpbmRpY2VzOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjAgPSBmZXRjaF92ZXJ0ZXgoYywgKnArKyk7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgKnArKyk7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjIgPSBmZXRjaF92ZXJ0ZXgoYywgKnArKyk7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFnczsKLSAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJUcmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKLSAgICAgICAgICAgIHYwLT5sb2NrZWQgPSAwOwotICAgICAgICAgICAgdjEtPmxvY2tlZCA9IDA7Ci0gICAgICAgICAgICB2Mi0+bG9ja2VkID0gMDsKLSAgICAgICAgICAgIGNvdW50IC09IDM7Ci0gICAgICAgIH0gd2hpbGUgKGNvdW50ID49IDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QgY29uc3QgKiBwID0gKHVpbnQ4X3QgY29uc3QgKilpbmRpY2VzOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjAgPSBmZXRjaF92ZXJ0ZXgoYywgKnArKyk7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjEgPSBmZXRjaF92ZXJ0ZXgoYywgKnArKyk7Ci0gICAgICAgICAgICB2ZXJ0ZXhfdCogY29uc3QgdjIgPSBmZXRjaF92ZXJ0ZXgoYywgKnArKyk7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjYyA9IHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFnczsKLSAgICAgICAgICAgIGlmIChnZ2xfbGlrZWx5KCEoY2MgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSkKLSAgICAgICAgICAgICAgICBjLT5wcmltcy5yZW5kZXJUcmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKLSAgICAgICAgICAgIHYwLT5sb2NrZWQgPSAwOwotICAgICAgICAgICAgdjEtPmxvY2tlZCA9IDA7Ci0gICAgICAgICAgICB2Mi0+bG9ja2VkID0gMDsKLSAgICAgICAgICAgIGNvdW50IC09IDM7Ci0gICAgICAgIH0gd2hpbGUgKGNvdW50ID49IDApOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgQXJyYXkgY29tcGlsZXJzCi0jZW5kaWYKLQotdm9pZCBjb21waWxlRWxlbWVudF9fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCkKLXsKLSAgICB2LT5mbGFncyA9IDA7Ci0gICAgdi0+aW5kZXggPSBmaXJzdDsKLSAgICBmaXJzdCAmPSB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSzsKLSAgICBjb25zdCBHTHVieXRlKiB2cCA9IGMtPmFycmF5cy52ZXJ0ZXguZWxlbWVudChmaXJzdCk7Ci0gICAgdi0+b2JqLnogPSAwOwotICAgIHYtPm9iai53ID0gMHgxMDAwMDsKLSAgICBjLT5hcnJheXMudmVydGV4LmZldGNoKGMsIHYtPm9iai52LCB2cCk7Ci0gICAgYy0+YXJyYXlzLm12cF90cmFuc2Zvcm0oJmMtPnRyYW5zZm9ybXMubXZwLCAmdi0+Y2xpcCwgJnYtPm9iaik7Ci0gICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlKGMsIHYpOwotfQotCi12b2lkIGNvbXBpbGVFbGVtZW50c19fZ2VuZXJpYyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2LCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBjb25zdCBHTHVieXRlKiB2cCA9IGMtPmFycmF5cy52ZXJ0ZXguZWxlbWVudCgKLSAgICAgICAgICAgIGZpcnN0ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOwotICAgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBjLT5hcnJheXMudmVydGV4LnN0cmlkZTsKLSAgICB0cmFuc2Zvcm1fdCBjb25zdCogY29uc3QgbXZwID0gJmMtPnRyYW5zZm9ybXMubXZwOwotICAgIGRvIHsKLSAgICAgICAgdi0+ZmxhZ3MgPSAwOwotICAgICAgICB2LT5pbmRleCA9IGZpcnN0Kys7Ci0gICAgICAgIHYtPm9iai56ID0gMDsKLSAgICAgICAgdi0+b2JqLncgPSAweDEwMDAwOwotICAgICAgICBjLT5hcnJheXMudmVydGV4LmZldGNoKGMsIHYtPm9iai52LCB2cCk7Ci0gICAgICAgIGMtPmFycmF5cy5tdnBfdHJhbnNmb3JtKG12cCwgJnYtPmNsaXAsICZ2LT5vYmopOwotICAgICAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUoYywgdik7Ci0gICAgICAgIHZwICs9IHN0cmlkZTsKLSAgICAgICAgdisrOwotICAgIH0gd2hpbGUgKC0tY291bnQpOwotfQotCi0vKgotdm9pZCBjb21waWxlRWxlbWVudHNfXzN4X2Z1bGwob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdiwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpCi17Ci0gICAgY29uc3QgR0xmaXhlZCogdnAgPSAoY29uc3QgR0xmaXhlZCopYy0+YXJyYXlzLnZlcnRleC5lbGVtZW50KGZpcnN0KTsKLSAgICBjb25zdCBzaXplX3Qgc3RyaWRlID0gYy0+YXJyYXlzLnZlcnRleC5zdHJpZGUgLyA0OwotLy8gICAgY29uc3QgR0xmaXhlZCogY29uc3QmIG0gPSBjLT50cmFuc2Zvcm1zLm12cC5tYXRyaXgubTsKLQotICAgIEdMZml4ZWQgbVsxNl07Ci0gICAgbWVtY3B5KCZtLCBjLT50cmFuc2Zvcm1zLm12cC5tYXRyaXgubSwgc2l6ZW9mKG0pKTsKLQotICAgIGRvIHsKLSAgICAgICAgY29uc3QgR0xmaXhlZCByeCA9IHZwWzBdOwotICAgICAgICBjb25zdCBHTGZpeGVkIHJ5ID0gdnBbMV07Ci0gICAgICAgIGNvbnN0IEdMZml4ZWQgcnogPSB2cFsyXTsKLSAgICAgICAgdnAgKz0gc3RyaWRlOwotICAgICAgICB2LT5pbmRleCA9IGZpcnN0Kys7Ci0gICAgICAgIHYtPmNsaXAueCA9IG1sYTNhKHJ4LCBtWyAwXSwgcnksIG1bIDRdLCByeiwgbVsgOF0sIG1bMTJdKTsKLSAgICAgICAgdi0+Y2xpcC55ID0gbWxhM2EocngsIG1bIDFdLCByeSwgbVsgNV0sIHJ6LCBtWyA5XSwgbVsxM10pOwotICAgICAgICB2LT5jbGlwLnogPSBtbGEzYShyeCwgbVsgMl0sIHJ5LCBtWyA2XSwgcnosIG1bMTBdLCBtWzE0XSk7Ci0gICAgICAgIHYtPmNsaXAudyA9IG1sYTNhKHJ4LCBtWyAzXSwgcnksIG1bIDddLCByeiwgbVsxMV0sIG1bMTVdKTsKLQotICAgICAgICBjb25zdCBHTGZpeGVkIHcgPSB2LT5jbGlwLnc7Ci0gICAgICAgIHVpbnQzMl90IGNsaXAgPSAwOwotICAgICAgICBpZiAodi0+Y2xpcC54IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9MOwotICAgICAgICBpZiAodi0+Y2xpcC54ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9SOwotICAgICAgICBpZiAodi0+Y2xpcC55IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9COwotICAgICAgICBpZiAodi0+Y2xpcC55ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9UOwotICAgICAgICBpZiAodi0+Y2xpcC56IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9OOwotICAgICAgICBpZiAodi0+Y2xpcC56ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9GOwotICAgICAgICB2LT5mbGFncyA9IGNsaXA7Ci0gICAgICAgIGMtPmFycmF5cy5jdWxsICY9IGNsaXA7Ci0KLSAgICAgICAgLy9jLT5hcnJheXMucGVyc3BlY3RpdmUoYywgdik7Ci0gICAgICAgIHYrKzsKLSAgICB9IHdoaWxlICgtLWNvdW50KTsKLX0KLSovCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIGNsaXBwZXJzCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgY2xpcFZlYzQodmVjNF90JiBudiwKLSAgICAgICAgR0xmaXhlZCB0LCBjb25zdCB2ZWM0X3QmIHMsIGNvbnN0IHZlYzRfdCYgcCkKLXsKLSAgICBmb3IgKGludCBpPTA7IGk8NCA7IGkrKykKLSAgICAgICAgbnYudltpXSA9IGdnbE11bEFkZHgodCwgcy52W2ldIC0gcC52W2ldLCBwLnZbaV0sIDI4KTsKLX0KLQotc3RhdGljIHZvaWQgY2xpcFZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiBudiwKLSAgICAgICAgR0xmaXhlZCB0LCBjb25zdCB2ZXJ0ZXhfdCogcywgY29uc3QgdmVydGV4X3QqIHApCi17Ci0gICAgY2xpcFZlYzQobnYtPmNsaXAsIHQsIHMtPmNsaXAsIHAtPmNsaXApOwotICAgIG52LT5mb2cgPSBnZ2xNdWxBZGR4KHQsIHMtPmZvZyAtIHAtPmZvZywgcC0+Zm9nLCAyOCk7Ci0gICAgb2dsZXNfdmVydGV4X3Byb2plY3QoYywgbnYpOwotICAgIG52LT5mbGFncyB8PSAgdmVydGV4X3Q6OkxJVCB8IHZlcnRleF90OjpFWUUgfCB2ZXJ0ZXhfdDo6VFQ7Ci0gICAgbnYtPmZsYWdzICY9IH52ZXJ0ZXhfdDo6Q0xJUF9BTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhDKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAotICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKLXsKLSAgICBjbGlwVmVjNChudi0+Y29sb3IsIHQsIHMtPmNvbG9yLCBwLT5jb2xvcik7Ci0gICAgY2xpcFZlcnRleChjLCBudiwgdCwgcywgcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaXBWZXJ0ZXhUKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAotICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKLXsKLSAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpCi0gICAgICAgICAgICBjbGlwVmVjNChudi0+dGV4dHVyZVtpXSwgdCwgcy0+dGV4dHVyZVtpXSwgcC0+dGV4dHVyZVtpXSk7Ci0gICAgfQotICAgIGNsaXBWZXJ0ZXgoYywgbnYsIHQsIHMsIHApOwotfQotCi1zdGF0aWMgdm9pZCBjbGlwVmVydGV4QWxsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAotICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKLXsKLSAgICBjbGlwVmVjNChudi0+Y29sb3IsIHQsIHMtPmNvbG9yLCBwLT5jb2xvcik7Ci0gICAgY2xpcFZlcnRleFQoYywgbnYsIHQsIHMsIHApOwotfQotCi1zdGF0aWMgdm9pZCBjbGlwRXllKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIG52LAotICAgICAgICBHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCkKLXsKLSAgICBudi0+Y2xlYXIoKTsKLSAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBudiwgdCwgcCwgcyk7Ci0gICAgY2xpcFZlYzQobnYtPmV5ZSwgdCwgcy0+ZXllLCBwLT5leWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi12b2lkIHZhbGlkYXRlX2FycmF5cyhvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBtb2RlKQotewotICAgIHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0KLSAgICAvLyBQZXJzcGVjdGl2ZSBjb3JyZWN0aW9uIGlzIG5vdCBuZWVkIGlmIE9ydGhvIHRyYW5zZm9ybSwgYnV0Ci0gICAgLy8gdGhlIHVzZXIgY2FuIHN0aWxsIHByb3ZpZGUgdGhlIHcgY29vcmRpbmF0ZSBtYW51YWxseSwgc28gd2UgY2FuJ3QKLSAgICAvLyBhdXRvbWF0aWNhbGx5IHR1cm4gaXQgb2ZmIChpbiBmYWN0IHdlIGNvdWxkIHdoZW4gdGhlIDR0aCBjb29yZGluYXRlCi0gICAgLy8gaXMgbm90IHNwY2lmaWVkIGluIHRoZSB2ZXJ0ZXggYXJyYXkpLgotICAgIC8vIFcgaW50ZXJwb2xhdGlvbiBpcyBuZXZlciBuZWVkZWQgZm9yIHBvaW50cy4KLSAgICBHTGJvb2xlYW4gcGVyc3BlY3RpdmUgPQotICAgICAgICBjLT5wZXJzcGVjdGl2ZSAmJiBtb2RlIT1HTF9QT0lOVFMgJiYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZW5hYmxlRGlzYWJsZShjLCBHR0xfV19MRVJQLCBwZXJzcGVjdGl2ZSk7Ci0KLSAgICAvLyBzZXQgYW50aS1hbGlhc2luZwotICAgIEdMYm9vbGVhbiBzbW9vdGggPSBHTF9GQUxTRTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEdMX1BPSU5UUzoKLSAgICAgICAgc21vb3RoID0gYy0+cG9pbnQuc21vb3RoOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0xJTkVTOgotICAgIGNhc2UgR0xfTElORV9MT09QOgotICAgIGNhc2UgR0xfTElORV9TVFJJUDoKLSAgICAgICAgc21vb3RoID0gYy0+bGluZS5zbW9vdGg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoKChlbmFibGVzICYgR0dMX0VOQUJMRV9BQSk/MTowKSAhPSBzbW9vdGgpCi0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZW5hYmxlRGlzYWJsZShjLCBHR0xfQUEsIHNtb290aCk7Ci0KLSAgICAvLyBzZXQgdGhlIHNoYWRlIG1vZGVsIGZvciB0aGlzIHByaW1pdGl2ZQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Muc2hhZGVNb2RlbChjLAotICAgICAgICAgICAgKG1vZGUgPT0gR0xfUE9JTlRTKSA/IEdMX0ZMQVQgOiBjLT5saWdodGluZy5zaGFkZU1vZGVsKTsKLQotICAgIC8vIGNvbXB1dGUgYWxsIHRoZSBtYXRyaWNlcyB3ZSdsbCBuZWVkLi4uCi0gICAgdWludDMyX3Qgd2FudCA9Ci0gICAgICAgICAgICB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZQIHwKLSAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpWSUVXUE9SVDsKLSAgICBpZiAoYy0+bGlnaHRpbmcuZW5hYmxlKSB7IC8vIG5lZWRzIG5vcm1hbCB0cmFuc2Zvcm1zIGFuZCBleWUgY29vcmRzCi0gICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WVUk7Ci0gICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6Ok1PREVMVklFVzsKLSAgICB9Ci0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpIHsgLy8gbmVlZHMgdGV4dHVyZSB0cmFuc2Zvcm1zCi0gICAgICAgIHdhbnQgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6OlRFWFRVUkU7Ci0gICAgfQotICAgIGlmIChjLT5jbGlwUGxhbmVzLmVuYWJsZSB8fCAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSkgewotICAgICAgICB3YW50IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVc7IC8vIG5lZWRzIGV5ZSBjb29yZHMKLSAgICB9Ci0gICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHdhbnQpOwotCi0gICAgLy8gdGV4dHVyZXMuLi4KLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKLSAgICAgICAgb2dsZXNfdmFsaWRhdGVfdGV4dHVyZShjKTsKLQotICAgIC8vIHZlcnRleCBjb21waWxlcnMKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnQgPSBjb21waWxlRWxlbWVudF9fZ2VuZXJpYzsKLSAgICBjLT5hcnJheXMuY29tcGlsZUVsZW1lbnRzID0gY29tcGlsZUVsZW1lbnRzX19nZW5lcmljOwotCi0gICAgLy8gdmVydGV4IHRyYW5zZm9ybQotICAgIGMtPmFycmF5cy5tdnBfdHJhbnNmb3JtID0KLSAgICAgICAgYy0+dHJhbnNmb3Jtcy5tdnAucG9pbnR2W2MtPmFycmF5cy52ZXJ0ZXguc2l6ZSAtIDJdOwotCi0gICAgYy0+YXJyYXlzLm12X3RyYW5zZm9ybSA9Ci0gICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnRyYW5zZm9ybS5wb2ludHZbYy0+YXJyYXlzLnZlcnRleC5zaXplIC0gMl07Ci0KLSAgICAvKgotICAgICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogIHBpY2sgZmV0Y2hlcnMKLSAgICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAqLwotCi0gICAgYXJyYXlfbWFjaGluZV90JiBhbSA9IGMtPmFycmF5czsKLSAgICBhbS52ZXJ0ZXguZmV0Y2ggPSBmZXRjaE5vcDsKLSAgICBhbS5ub3JtYWwuZmV0Y2ggPSBjdXJyZW50Tm9ybWFsOwotICAgIGFtLmNvbG9yLmZldGNoID0gY3VycmVudENvbG9yOwotCi0gICAgaWYgKGFtLnZlcnRleC5lbmFibGUpIHsKLSAgICAgICAgYW0udmVydGV4LnJlc29sdmUoKTsKLSAgICAgICAgaWYgKGFtLnZlcnRleC5ibyB8fCBhbS52ZXJ0ZXgucG9pbnRlcikgewotICAgICAgICAgICAgYW0udmVydGV4LmZldGNoID0gdmVydGV4X2ZjdFthbS52ZXJ0ZXguc2l6ZS0yXVthbS52ZXJ0ZXgudHlwZSAmIDB4Rl07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYW0ubm9ybWFsLmVuYWJsZSkgewotICAgICAgICBhbS5ub3JtYWwucmVzb2x2ZSgpOwotICAgICAgICBpZiAoYW0ubm9ybWFsLmJvIHx8IGFtLm5vcm1hbC5wb2ludGVyKSB7Ci0gICAgICAgICAgICBhbS5ub3JtYWwuZmV0Y2ggPSBub3JtYWxfZmN0W2FtLm5vcm1hbC5zaXplLTNdW2FtLm5vcm1hbC50eXBlICYgMHhGXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhbS5jb2xvci5lbmFibGUpIHsKLSAgICAgICAgYW0uY29sb3IucmVzb2x2ZSgpOwotICAgICAgICBpZiAoYy0+bGlnaHRpbmcuZW5hYmxlKSB7Ci0gICAgICAgICAgICBpZiAoYW0uY29sb3IuYm8gfHwgYW0uY29sb3IucG9pbnRlcikgewotICAgICAgICAgICAgICAgIGFtLmNvbG9yLmZldGNoID0gY29sb3JfZmN0W2FtLmNvbG9yLnNpemUtM11bYW0uY29sb3IudHlwZSAmIDB4Rl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYW0uY29sb3IuYm8gfHwgYW0uY29sb3IucG9pbnRlcikgewotICAgICAgICAgICAgICAgIGFtLmNvbG9yLmZldGNoID0gY29sb3JfY2xhbXBfZmN0W2FtLmNvbG9yLnNpemUtM11bYW0uY29sb3IudHlwZSAmIDB4Rl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgYWN0aXZlVG11Q291bnQgPSAwOwotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBhbS50ZXh0dXJlW2ldLmZldGNoID0gY3VycmVudFRleENvb3JkOwotICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkgewotCi0gICAgICAgICAgICAvLyB0ZXh0dXJlIGZldGNoZXJzLi4uCi0gICAgICAgICAgICBpZiAoYW0udGV4dHVyZVtpXS5lbmFibGUpIHsKLSAgICAgICAgICAgICAgICBhbS50ZXh0dXJlW2ldLnJlc29sdmUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYW0udGV4dHVyZVtpXS5ibyB8fCBhbS50ZXh0dXJlW2ldLnBvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgYW0udGV4dHVyZVtpXS5mZXRjaCA9IHRleHR1cmVfZmN0W2FtLnRleHR1cmVbaV0uc2l6ZS0yXVthbS50ZXh0dXJlW2ldLnR5cGUgJiAweEZdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGV4dHVyZSB0cmFuc2Zvcm0uLi4KLSAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IGMtPmFycmF5cy50ZXh0dXJlW2ldLnNpemUgLSAyOwotICAgICAgICAgICAgYy0+YXJyYXlzLnRleF90cmFuc2Zvcm1baV0gPQotICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS50cmFuc2Zvcm0ucG9pbnR2W2luZGV4XTsKLQotICAgICAgICAgICAgYW0udG11ID0gaTsKLSAgICAgICAgICAgIGFjdGl2ZVRtdUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBwaWNrIHRoZSB2ZXJ0ZXgtY2xpcHBlcgotICAgIHVpbnQzMl90IGNsaXBwZXIgPSAwOwotICAgIC8vIHdlIG11c3QgcmVsb2FkICdlbmFibGVzJyBoZXJlCi0gICAgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIKQotICAgICAgICBjbGlwcGVyIHw9IDE7ICAgLy8gd2UgbmVlZCB0byBpbnRlcnBvbGF0ZSBjb2xvcnMKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKLSAgICAgICAgY2xpcHBlciB8PSAyOyAgIC8vIHdlIG5lZWQgdG8gaW50ZXJwb2xhdGUgdGV4dHVyZXMKLSAgICBzd2l0Y2ggKGNsaXBwZXIpIHsKLSAgICBjYXNlIDA6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleDsgICAgICBicmVhazsKLSAgICBjYXNlIDE6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleEM7ICAgICBicmVhazsKLSAgICBjYXNlIDI6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleFQ7ICAgICBicmVhazsKLSAgICBjYXNlIDM6IGMtPmFycmF5cy5jbGlwVmVydGV4ID0gY2xpcFZlcnRleEFsbDsgICBicmVhazsKLSAgICB9Ci0gICAgYy0+YXJyYXlzLmNsaXBFeWUgPSBjbGlwRXllOwotCi0gICAgLy8gcGljayB0aGUgcHJpbWl0aXZlIHJhc3Rlcml6ZXIKLSAgICBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKGMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgYXJyYXkgQVBJCi0jZW5kaWYKLQotdm9pZCBnbFZlcnRleFBvaW50ZXIoCi0gICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoc2l6ZTwyIHx8IHNpemU+NCB8fCBzdHJpZGU8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEdMX0JZVEU6Ci0gICAgY2FzZSBHTF9TSE9SVDoKLSAgICBjYXNlIEdMX0ZJWEVEOgotICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+YXJyYXlzLnZlcnRleC5pbml0KHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Ci19Ci0KLXZvaWQgZ2xDb2xvclBvaW50ZXIoCi0gICAgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoc2l6ZSE9NCB8fCBzdHJpZGU8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6Ci0gICAgY2FzZSBHTF9GSVhFRDoKLSAgICBjYXNlIEdMX0ZMT0FUOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPmFycmF5cy5jb2xvci5pbml0KHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciwgMCk7Ci19Ci0KLXZvaWQgZ2xOb3JtYWxQb2ludGVyKAotICAgIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHN0cmlkZTwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0xfQllURToKLSAgICBjYXNlIEdMX1NIT1JUOgotICAgIGNhc2UgR0xfRklYRUQ6Ci0gICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5hcnJheXMubm9ybWFsLmluaXQoMywgdHlwZSwgc3RyaWRlLCBwb2ludGVyLCBjLT5hcnJheXMuYXJyYXlfYnVmZmVyLCAwKTsKLX0KLQotdm9pZCBnbFRleENvb3JkUG9pbnRlcigKLSAgICBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChzaXplPDIgfHwgc2l6ZT40IHx8IHN0cmlkZTwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0xfQllURToKLSAgICBjYXNlIEdMX1NIT1JUOgotICAgIGNhc2UgR0xfRklYRUQ6Ci0gICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb25zdCBpbnQgdG11ID0gYy0+YXJyYXlzLmFjdGl2ZVRleHR1cmU7Ci0gICAgYy0+YXJyYXlzLnRleHR1cmVbdG11XS5pbml0KHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciwKLSAgICAgICAgICAgIGMtPmFycmF5cy5hcnJheV9idWZmZXIsIDApOwotfQotCi0KLXZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZShHTGVudW0gYXJyYXkpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGVuYWJsZURpc2FibGVDbGllbnRTdGF0ZShjLCBhcnJheSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xlbnVtIGFycmF5KSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBlbmFibGVEaXNhYmxlQ2xpZW50U3RhdGUoYywgYXJyYXksIGZhbHNlKTsKLX0KLQotdm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGV4dHVyZTxHTF9URVhUVVJFMCB8fCB0ZXh0dXJlPj1HTF9URVhUVVJFMCtHR0xfVEVYVFVSRV9VTklUX0NPVU5UKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+YXJyYXlzLmFjdGl2ZVRleHR1cmUgPSB0ZXh0dXJlIC0gR0xfVEVYVFVSRTA7Ci19Ci0KLXZvaWQgZ2xEcmF3QXJyYXlzKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChjb3VudDwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfUE9JTlRTOgotICAgIGNhc2UgR0xfTElORV9TVFJJUDoKLSAgICBjYXNlIEdMX0xJTkVfTE9PUDoKLSAgICBjYXNlIEdMX0xJTkVTOgotICAgIGNhc2UgR0xfVFJJQU5HTEVfU1RSSVA6Ci0gICAgY2FzZSBHTF9UUklBTkdMRV9GQU46Ci0gICAgY2FzZSBHTF9UUklBTkdMRVM6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY291bnQgPT0gMCB8fCAhYy0+YXJyYXlzLnZlcnRleC5lbmFibGUpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoKGMtPmN1bGwuZW5hYmxlKSAmJiAoYy0+Y3VsbC5jdWxsRmFjZSA9PSBHTF9GUk9OVF9BTkRfQkFDSykpCi0gICAgICAgIHJldHVybjsgLy8gYWxsIHRyaWFuZ2xlcyBhcmUgY3VsbGVkCi0KLQotICAgIHZhbGlkYXRlX2FycmF5cyhjLCBtb2RlKTsKLQotICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpCi0gICAgICAgIG9nbGVzX2xvY2tfdGV4dHVyZXMoYyk7Ci0KLSAgICBkcmF3QXJyYXlzUHJpbXNbbW9kZV0oYywgZmlyc3QsIGNvdW50KTsKLQotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKQotICAgICAgICBvZ2xlc191bmxvY2tfdGV4dHVyZXMoYyk7Ci0KLSNpZiBWQ19DQUNIRV9TVEFUSVNUSUNTCi0gICAgYy0+dmMudG90YWwgPSBjb3VudDsKLSAgICBjLT52Yy5kdW1wX3N0YXRzKG1vZGUpOwotI2VuZGlmCi19Ci0KLXZvaWQgZ2xEcmF3RWxlbWVudHMoCi0gICAgR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoY291bnQ8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEdMX1BPSU5UUzoKLSAgICBjYXNlIEdMX0xJTkVfU1RSSVA6Ci0gICAgY2FzZSBHTF9MSU5FX0xPT1A6Ci0gICAgY2FzZSBHTF9MSU5FUzoKLSAgICBjYXNlIEdMX1RSSUFOR0xFX1NUUklQOgotICAgIGNhc2UgR0xfVFJJQU5HTEVfRkFOOgotICAgIGNhc2UgR0xfVFJJQU5HTEVTOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKLSAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICBjLT5hcnJheXMuaW5kaWNlc1R5cGUgPSB0eXBlOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChjb3VudCA9PSAwIHx8ICFjLT5hcnJheXMudmVydGV4LmVuYWJsZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmICgoYy0+Y3VsbC5lbmFibGUpICYmIChjLT5jdWxsLmN1bGxGYWNlID09IEdMX0ZST05UX0FORF9CQUNLKSkKLSAgICAgICAgcmV0dXJuOyAvLyBhbGwgdHJpYW5nbGVzIGFyZSBjdWxsZWQKLQotICAgIC8vIGNsZWFyIHRoZSB2ZXJ0ZXgtY2FjaGUKLSAgICBjLT52Yy5jbGVhcigpOwotICAgIHZhbGlkYXRlX2FycmF5cyhjLCBtb2RlKTsKLQotICAgIC8vIGlmIGluZGljZXMgYXJlIGluIGEgYnVmZmVyIG9iamVjdCwgdGhlIHBvaW50ZXIgaXMgdHJlYXRlZCBhcyBhbgotICAgIC8vIG9mZnNldCBpbiB0aGF0IGJ1ZmZlci4KLSAgICBpZiAoYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyKSB7Ci0gICAgICAgIGluZGljZXMgPSBjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXItPmRhdGEgKyB1aW50cHRyX3QoaW5kaWNlcyk7Ci0gICAgfQotCi0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKLSAgICAgICAgb2dsZXNfbG9ja190ZXh0dXJlcyhjKTsKLQotICAgIGRyYXdFbGVtZW50c1ByaW1zW21vZGVdKGMsIGNvdW50LCBpbmRpY2VzKTsKLSAgICAKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykKLSAgICAgICAgb2dsZXNfdW5sb2NrX3RleHR1cmVzKGMpOwotCi0gICAgCi0jaWYgVkNfQ0FDSEVfU1RBVElTVElDUwotICAgIGMtPnZjLnRvdGFsID0gY291bnQ7Ci0gICAgYy0+dmMuZHVtcF9zdGF0cyhtb2RlKTsKLSNlbmRpZgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBidWZmZXJzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZ2xCaW5kQnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoKHRhcmdldCE9R0xfQVJSQVlfQlVGRkVSKSAmJiAodGFyZ2V0IT1HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBjcmVhdGUgYSBidWZmZXIgb2JqZWN0LCBvciBiaW5kIGFuIGV4aXN0aW5nIG9uZQotICAgIGJ1ZmZlcl90IGNvbnN0KiBibyA9IDA7Ci0gICAgaWYgKGJ1ZmZlcikgewotICAgICAgICBibyA9IGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPmJpbmQoYnVmZmVyKTsKLSAgICAgICAgaWYgKCFibykgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgKCh0YXJnZXQgPT0gR0xfQVJSQVlfQlVGRkVSKSA/Ci0gICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyIDogYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyKSA9IGJvOwotfQotCi12b2lkIGdsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKCh0YXJnZXQhPUdMX0FSUkFZX0JVRkZFUikgJiYgKHRhcmdldCE9R0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHNpemU8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKHVzYWdlIT1HTF9TVEFUSUNfRFJBVykgJiYgKHVzYWdlIT1HTF9EWU5BTUlDX0RSQVcpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYnVmZmVyX3QgY29uc3QqIGJvID0gKCh0YXJnZXQgPT0gR0xfQVJSQVlfQlVGRkVSKSA/Ci0gICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyIDogYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyKTsKLQotICAgIGlmIChibyA9PSAwKSB7Ci0gICAgICAgIC8vIGNhbid0IG1vZGlmeSBidWZmZXIgMAotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBidWZmZXJfdCogZWRpdF9ibyA9IGNvbnN0X2Nhc3Q8YnVmZmVyX3QqPihibyk7Ci0gICAgaWYgKGMtPmJ1ZmZlck9iamVjdE1hbmFnZXItPmFsbG9jYXRlU3RvcmUoZWRpdF9ibywgc2l6ZSwgdXNhZ2UpICE9IDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGRhdGEpIHsKLSAgICAgICAgbWVtY3B5KGJvLT5kYXRhLCBkYXRhLCBzaXplKTsKLSAgICB9Ci19Ci0KLXZvaWQgZ2xCdWZmZXJTdWJEYXRhKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoKHRhcmdldCE9R0xfQVJSQVlfQlVGRkVSKSAmJiAodGFyZ2V0IT1HTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAob2Zmc2V0PDAgfHwgc2l6ZTwwIHx8IGRhdGE9PTApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYnVmZmVyX3QgY29uc3QqIGJvID0gKCh0YXJnZXQgPT0gR0xfQVJSQVlfQlVGRkVSKSA/Ci0gICAgICAgICAgICBjLT5hcnJheXMuYXJyYXlfYnVmZmVyIDogYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyKTsKLQotICAgIGlmIChibyA9PSAwKSB7Ci0gICAgICAgIC8vIGNhbid0IG1vZGlmeSBidWZmZXIgMAotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG9mZnNldCtzaXplID4gYm8tPnNpemUpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWVtY3B5KGJvLT5kYXRhICsgb2Zmc2V0LCBkYXRhLCBzaXplKTsKLX0KLQotdm9pZCBnbERlbGV0ZUJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGJ1ZmZlcnMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAobjwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIEdMdWludCBuYW1lID0gYnVmZmVyc1tpXTsKLSAgICAgICAgaWYgKG5hbWUpIHsKLSAgICAgICAgICAgIC8vIHVuYmluZCBib3VuZCBkZWxldGVkIGJ1ZmZlcnMuLi4KLSAgICAgICAgICAgIGlmIChjLT5hcnJheXMuZWxlbWVudF9hcnJheV9idWZmZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmVsZW1lbnRfYXJyYXlfYnVmZmVyID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYy0+YXJyYXlzLmFycmF5X2J1ZmZlcikgewotICAgICAgICAgICAgICAgIGlmIChjLT5hcnJheXMuYXJyYXlfYnVmZmVyLT5uYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmFycmF5X2J1ZmZlciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGMtPmFycmF5cy52ZXJ0ZXguYm8pIHsKLSAgICAgICAgICAgICAgICBpZiAoYy0+YXJyYXlzLnZlcnRleC5iby0+bmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy52ZXJ0ZXguYm8gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjLT5hcnJheXMubm9ybWFsLmJvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5ub3JtYWwuYm8tPm5hbWUgPT0gbmFtZSkgewotICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMubm9ybWFsLmJvID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYy0+YXJyYXlzLmNvbG9yLmJvKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMtPmFycmF5cy5jb2xvci5iby0+bmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jb2xvci5ibyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgdD0wIDsgdDxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgdCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMtPmFycmF5cy50ZXh0dXJlW3RdLmJvKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLT5hcnJheXMudGV4dHVyZVt0XS5iby0+bmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMudGV4dHVyZVt0XS5ibyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+ZGVsZXRlQnVmZmVycyhuLCBidWZmZXJzKTsKLSAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyLT5yZWN5Y2xlVG9rZW5zKG4sIGJ1ZmZlcnMpOwotfQotCi12b2lkIGdsR2VuQnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogYnVmZmVycykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChuPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+Z2V0VG9rZW4obiwgYnVmZmVycyk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2FycmF5LmggYi9vcGVuZ2wvbGliYWdsL2FycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTY5NzguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9hcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9hcnJheS5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX0FSUkFZX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19BUlJBWV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgZ2wgewotc3RydWN0IG9nbGVzX2NvbnRleHRfdDsKLX07Ci0KLXZvaWQgb2dsZXNfaW5pdF9hcnJheShvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc191bmluaXRfYXJyYXkob2dsZXNfY29udGV4dF90KiBjKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfQVJSQVlfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2NvbnRleHQuaCBiL29wZW5nbC9saWJhZ2wvY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY1YTMwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfQ09OVEVYVF9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfQ09OVEVYVF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaWZkZWYgSEFWRV9BTkRST0lEX09TCi0jaW5jbHVkZSA8YmlvbmljX3Rscy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotCi1jb25zdCB1bnNpZ25lZCBpbnQgT0dMRVNfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTID0gMTAKLSNpZmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotICAgICAgICArIDEKLSNlbmRpZgotICAgICAgICA7Ci0KLWNsYXNzIEVHTFRleHR1cmVPYmplY3Q7Ci1jbGFzcyBFR0xTdXJmYWNlTWFuYWdlcjsKLWNsYXNzIEVHTEJ1ZmZlck9iamVjdE1hbmFnZXI7Ci0KLW5hbWVzcGFjZSBnbCB7Ci0KLXN0cnVjdCBvZ2xlc19jb250ZXh0X3Q7Ci1zdHJ1Y3QgbWF0cml4eF90Owotc3RydWN0IHRyYW5zZm9ybV90Owotc3RydWN0IGJ1ZmZlcl90OwotCi1vZ2xlc19jb250ZXh0X3QqIGdldEdsQ29udGV4dCgpOwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZSB2b2lkIHN3YXAoVCYgYSwgVCYgYikgewotICAgIFQgdChhKTsgYSA9IGI7IGIgPSB0OwotfQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWlubGluZSBUIG1heChUIGEsIFQgYikgewotICAgIHJldHVybiBhPGIgPyBiIDogYTsKLX0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgVCBtYXgoVCBhLCBUIGIsIFQgYykgewotICAgIHJldHVybiBtYXgoYSwgbWF4KGIsIGMpKTsKLX0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgVCBtaW4oVCBhLCBUIGIpIHsKLSAgICByZXR1cm4gYTxiID8gYSA6IGI7Ci19Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotaW5saW5lIFQgbWluKFQgYSwgVCBiLCBUIGMpIHsKLSAgICByZXR1cm4gbWluKGEsIG1pbihiLCBjKSk7Ci19Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotaW5saW5lIFQgbWluKFQgYSwgVCBiLCBUIGMsIFQgZCkgewotICAgIHJldHVybiBtaW4obWluKGEsYiksIG1pbihjLGQpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdmVydGljZXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IHZlYzNfdCB7Ci0gICAgdW5pb24gewotICAgICAgICBzdHJ1Y3QgeyBHTGZpeGVkIHgsIHksIHo7IH07Ci0gICAgICAgIHN0cnVjdCB7IEdMZml4ZWQgciwgZywgYjsgfTsKLSAgICAgICAgc3RydWN0IHsgR0xmaXhlZCBTLCBULCBSOyB9OwotICAgICAgICBHTGZpeGVkIHZbM107Ci0gICAgfTsKLX07Ci0KLXN0cnVjdCB2ZWM0X3QgewotICAgIHVuaW9uIHsKLSAgICAgICAgc3RydWN0IHsgR0xmaXhlZCB4LCB5LCB6LCB3OyB9OwotICAgICAgICBzdHJ1Y3QgeyBHTGZpeGVkIHIsIGcsIGIsIGE7IH07Ci0gICAgICAgIHN0cnVjdCB7IEdMZml4ZWQgUywgVCwgUiwgUTsgfTsKLSAgICAgICAgR0xmaXhlZCB2WzRdOwotICAgIH07Ci19OwotCi1zdHJ1Y3QgdmVydGV4X3QgewotICAgIGVudW0gewotICAgICAgICAvLyB0aGVzZSBjb25zdGFudCBtYXR0ZXIgZm9yIG91ciBjbGlwcGluZwotICAgICAgICBDTElQX0wgICAgICAgICAgPSAweDAwMDEsICAgLy8gY2xpcHBpbmcgZmxhZ3MKLSAgICAgICAgQ0xJUF9SICAgICAgICAgID0gMHgwMDAyLAotICAgICAgICBDTElQX0IgICAgICAgICAgPSAweDAwMDQsCi0gICAgICAgIENMSVBfVCAgICAgICAgICA9IDB4MDAwOCwKLSAgICAgICAgQ0xJUF9OICAgICAgICAgID0gMHgwMDEwLAotICAgICAgICBDTElQX0YgICAgICAgICAgPSAweDAwMjAsCi0KLSAgICAgICAgRVlFICAgICAgICAgICAgID0gMHgwMDQwLAotICAgICAgICBSRVNFUlZFRCAgICAgICAgPSAweDAwODAsCi0KLSAgICAgICAgVVNFUl9DTElQXzAgICAgID0gMHgwMTAwLCAgIC8vIHVzZXIgY2xpcHBpbmcgZmxhZ3MKLSAgICAgICAgVVNFUl9DTElQXzEgICAgID0gMHgwMjAwLAotICAgICAgICBVU0VSX0NMSVBfMiAgICAgPSAweDA0MDAsCi0gICAgICAgIFVTRVJfQ0xJUF8zICAgICA9IDB4MDgwMCwKLSAgICAgICAgVVNFUl9DTElQXzQgICAgID0gMHgxMDAwLAotICAgICAgICBVU0VSX0NMSVBfNSAgICAgPSAweDIwMDAsCi0KLSAgICAgICAgTElUICAgICAgICAgICAgID0gMHg0MDAwLCAgIC8vIGxpZ2h0aW5nIGhhcyBiZWVuIGFwcGxpZWQKLSAgICAgICAgVFQgICAgICAgICAgICAgID0gMHg4MDAwLCAgIC8vIHRleHR1cmUgY29vcmRzIHRyYW5zZm9ybWVkCi0KLSAgICAgICAgRlJVU1RVTV9DTElQX0FMTD0gMHgwMDNGLAotICAgICAgICBVU0VSX0NMSVBfQUxMICAgPSAweDNGMDAsCi0gICAgICAgIENMSVBfQUxMICAgICAgICA9IDB4M0YzRiwKLSAgICB9OwotCi0gICAgLy8gdGhlIGZpZWxkcyBiZWxvdyBhcmUgYXJyYW5nZWQgdG8gbWluaW1pemUgZC1jYWNoZSB1c2FnZQotICAgIC8vIHdlIGdyb3VwIHRvZ2V0aGVyLCBieSBjYWNoZS1saW5lLCB0aGUgZmllbGRzIG1vc3QgbGlrZWx5IHRvIGJlIHVzZWQKLQotICAgIHVuaW9uIHsKLSAgICB2ZWM0X3QgICAgICAgICAgb2JqOwotICAgIHZlYzRfdCAgICAgICAgICBleWU7Ci0gICAgfTsKLSAgICB2ZWM0X3QgICAgICAgICAgY2xpcDsKLQotICAgIHVpbnQzMl90ICAgICAgICBmbGFnczsKLSAgICBzaXplX3QgICAgICAgICAgaW5kZXg7ICAvLyBjYWNoZSB0YWcsIGFuZCB2ZXJ0ZXggaW5kZXgKLSAgICBHTGZpeGVkICAgICAgICAgZm9nOwotICAgIHVpbnQ4X3QgICAgICAgICBsb2NrZWQ7Ci0gICAgdWludDhfdCAgICAgICAgIG1ydTsKLSAgICB1aW50OF90ICAgICAgICAgcmVzZXJ2ZWRbMl07Ci0gICAgdmVjNF90ICAgICAgICAgIHdpbmRvdzsKLQotICAgIHZlYzRfdCAgICAgICAgICBjb2xvcjsKLSAgICB2ZWM0X3QgICAgICAgICAgdGV4dHVyZVtHR0xfVEVYVFVSRV9VTklUX0NPVU5UXTsKLSAgICB1aW50MzJfdCAgICAgICAgcmVzZXJ2ZWQxWzRdOwotCi0gICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgIGZsYWdzID0gaW5kZXggPSBsb2NrZWQgPSBtcnUgPSAwOwotICAgIH0KLX07Ci0KLXN0cnVjdCBwb2ludF9zaXplX3QgewotICAgIEdHTGNvb3JkICAgIHNpemU7Ci0gICAgR0xib29sZWFuICAgc21vb3RoOwotfTsKLQotc3RydWN0IGxpbmVfd2lkdGhfdCB7Ci0gICAgR0dMY29vcmQgICAgd2lkdGg7Ci0gICAgR0xib29sZWFuICAgc21vb3RoOwotfTsKLQotc3RydWN0IHBvbHlnb25fb2Zmc2V0X3QgewotICAgIEdMZml4ZWQgICAgIGZhY3RvcjsKLSAgICBHTGZpeGVkICAgICB1bml0czsKLSAgICBHTGJvb2xlYW4gICBlbmFibGU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBhcnJheXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGFycmF5X3QgewotICAgIHR5cGVkZWYgdm9pZCAoKmZldGNoZXJfdCkob2dsZXNfY29udGV4dF90KiwgR0xmaXhlZCosIGNvbnN0IEdMdm9pZCopOwotICAgIGZldGNoZXJfdCAgICAgICBmZXRjaDsKLSAgICBHTHZvaWQgY29uc3QqICAgcGh5c2ljYWxfcG9pbnRlcjsKLSAgICBHTGludCAgICAgICAgICAgc2l6ZTsKLSAgICBHTHNpemVpICAgICAgICAgc3RyaWRlOwotICAgIEdMdm9pZCBjb25zdCogICBwb2ludGVyOwotICAgIGJ1ZmZlcl90IGNvbnN0KiBibzsKLSAgICB1aW50MTZfdCAgICAgICAgdHlwZTsKLSAgICBHTGJvb2xlYW4gICAgICAgZW5hYmxlOwotICAgIEdMYm9vbGVhbiAgICAgICBwYWQ7Ci0gICAgR0xzaXplaSAgICAgICAgIGJvdW5kczsKLSAgICB2b2lkIGluaXQoR0xpbnQsIEdMZW51bSwgR0xzaXplaSwgY29uc3QgR0x2b2lkICosIGNvbnN0IGJ1ZmZlcl90KiwgR0xzaXplaSk7Ci0gICAgaW5saW5lIHZvaWQgcmVzb2x2ZSgpOwotICAgIGlubGluZSBjb25zdCBHTHVieXRlKiBlbGVtZW50KEdMaW50IGkpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChjb25zdCBHTHVieXRlKilwaHlzaWNhbF9wb2ludGVyICsgaSAqIHN0cmlkZTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgYXJyYXlfbWFjaGluZV90IHsKLSAgICBhcnJheV90ICAgICAgICAgdmVydGV4OwotICAgIGFycmF5X3QgICAgICAgICBub3JtYWw7Ci0gICAgYXJyYXlfdCAgICAgICAgIGNvbG9yOwotICAgIGFycmF5X3QgICAgICAgICB0ZXh0dXJlW0dHTF9URVhUVVJFX1VOSVRfQ09VTlRdOwotICAgIHVpbnQ4X3QgICAgICAgICBhY3RpdmVUZXh0dXJlOwotICAgIHVpbnQ4X3QgICAgICAgICB0bXU7Ci0gICAgdWludDE2X3QgICAgICAgIGN1bGw7Ci0gICAgdWludDMyX3QgICAgICAgIGZsYWdzOwotICAgIEdMZW51bSAgICAgICAgICBpbmRpY2VzVHlwZTsKLSAgICBidWZmZXJfdCBjb25zdCogYXJyYXlfYnVmZmVyOwotICAgIGJ1ZmZlcl90IGNvbnN0KiBlbGVtZW50X2FycmF5X2J1ZmZlcjsKLQotICAgIHZvaWQgKCpjb21waWxlRWxlbWVudHMpKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90KiwgR0xpbnQsIEdMc2l6ZWkpOwotICAgIHZvaWQgKCpjb21waWxlRWxlbWVudCkob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqLCBHTGludCk7Ci0KLSAgICB2b2lkICgqbXZwX3RyYW5zZm9ybSkodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqLCB2ZWM0X3QgY29uc3QqKTsKLSAgICB2b2lkICgqbXZfdHJhbnNmb3JtKSh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCosIHZlYzRfdCBjb25zdCopOwotICAgIHZvaWQgKCp0ZXhfdHJhbnNmb3JtWzJdKSh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCosIHZlYzRfdCBjb25zdCopOwotICAgIHZvaWQgKCpwZXJzcGVjdGl2ZSkob2dsZXNfY29udGV4dF90KmMsIHZlcnRleF90KiB2KTsKLSAgICB2b2lkICgqY2xpcFZlcnRleCkob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogbnYsCi0gICAgICAgICAgICBHR0xmaXhlZCB0LCBjb25zdCB2ZXJ0ZXhfdCogcywgY29uc3QgdmVydGV4X3QqIHApOwotICAgIHZvaWQgKCpjbGlwRXllKShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiBudiwKLSAgICAgICAgICAgIEdHTGZpeGVkIHQsIGNvbnN0IHZlcnRleF90KiBzLCBjb25zdCB2ZXJ0ZXhfdCogcCk7Ci19OwotCi1zdHJ1Y3QgdmVydGV4X2NhY2hlX3QgewotICAgIGVudW0gewotICAgICAgICAvLyBtdXN0IGJlIGF0IGxlYXN0IDQKLSAgICAgICAgLy8gMyB2ZXJ0aWNlIGZvciB0cmlhbmdsZXMKLSAgICAgICAgLy8gb3IgMiArIDIgZm9yIGluZGV4ZWQgdHJpYW5nbGVzIHcvIGNhY2hlIGNvbnRlbnRpb24KLSAgICAgICAgVkVSVEVYX0JVRkZFUl9TSVpFICA9IDgsCi0gICAgICAgIC8vIG11c3QgYmUgYSBwb3dlciBvZiB0d28gYW5kIGF0IGxlYXN0IDMKLSAgICAgICAgVkVSVEVYX0NBQ0hFX1NJWkUgICA9IDY0LCAgIC8vIDggS0IKLQotICAgICAgICBJTkRFWF9CSVRTICAgICAgPSAxNiwKLSAgICAgICAgSU5ERVhfTUFTSyAgICAgID0gKCgxTFU8PElOREVYX0JJVFMpLTEpLAotICAgICAgICBJTkRFWF9TRVEgICAgICAgPSAxTFU8PElOREVYX0JJVFMsCi0gICAgfTsKLSAgICB2ZXJ0ZXhfdCogICAgICAgdkJ1ZmZlcjsKLSAgICB2ZXJ0ZXhfdCogICAgICAgdkNhY2hlOwotICAgIHVpbnQzMl90ICAgICAgICBzZXF1ZW5jZTsKLSAgICB2b2lkKiAgICAgICAgICAgYmFzZTsKLSAgICB1aW50MzJfdCAgICAgICAgdG90YWw7Ci0gICAgdWludDMyX3QgICAgICAgIG1pc3NlczsKLSAgICBpbnQ2NF90ICAgICAgICAgc3RhcnRUaW1lOwotICAgIHZvaWQgaW5pdCgpOwotICAgIHZvaWQgdW5pbml0KCk7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIHZvaWQgZHVtcF9zdGF0cyhHTGVudW0gbW9kZSk7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBmb2cKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGZvZ190IHsKLSAgICBHTGZpeGVkICAgICBkZW5zaXR5OwotICAgIEdMZml4ZWQgICAgIHN0YXJ0OwotICAgIEdMZml4ZWQgICAgIGVuZDsKLSAgICBHTGZpeGVkICAgICBpbnZFbmRNaW51c1N0YXJ0OwotICAgIEdMZW51bSAgICAgIG1vZGU7Ci0gICAgR0xmaXhlZCAgICAgKCpmb2cpKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHVzZXIgY2xpcCBwbGFuZXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgdW5zaWduZWQgaW50IE9HTEVTX01BWF9DTElQX1BMQU5FUyA9IDY7Ci0KLXN0cnVjdCBjbGlwX3BsYW5lX3QgewotICAgIHZlYzRfdCAgICAgIGVxdWF0aW9uOwotfTsKLQotc3RydWN0IHVzZXJfY2xpcF9wbGFuZXNfdCB7Ci0gICAgY2xpcF9wbGFuZV90ICAgIHBsYW5lW09HTEVTX01BWF9DTElQX1BMQU5FU107Ci0gICAgdWludDMyX3QgICAgICAgIGVuYWJsZTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGxpZ2h0aW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHVuc2lnbmVkIGludCBPR0xFU19NQVhfTElHSFRTID0gODsKLQotc3RydWN0IGxpZ2h0X3QgewotICAgIHZlYzRfdCAgICAgIGFtYmllbnQ7Ci0gICAgdmVjNF90ICAgICAgZGlmZnVzZTsKLSAgICB2ZWM0X3QgICAgICBzcGVjdWxhcjsKLSAgICB2ZWM0X3QgICAgICBpbXBsaWNpdEFtYmllbnQ7Ci0gICAgdmVjNF90ICAgICAgaW1wbGljaXREaWZmdXNlOwotICAgIHZlYzRfdCAgICAgIGltcGxpY2l0U3BlY3VsYXI7Ci0gICAgdmVjNF90ICAgICAgcG9zaXRpb247ICAgICAgIC8vIHBvc2l0aW9uIGluIGV5ZSBzcGFjZQotICAgIHZlYzRfdCAgICAgIG9ialBvc2l0aW9uOwotICAgIHZlYzRfdCAgICAgIG5vcm1hbGl6ZWRPYmpQb3NpdGlvbjsKLSAgICB2ZWM0X3QgICAgICBzcG90RGlyOwotICAgIHZlYzRfdCAgICAgIG5vcm1hbGl6ZWRTcG90RGlyOwotICAgIEdMZml4ZWQgICAgIHNwb3RFeHA7Ci0gICAgR0xmaXhlZCAgICAgc3BvdEN1dG9mZjsKLSAgICBHTGZpeGVkICAgICBzcG90Q3V0b2ZmQ29zaW5lOwotICAgIEdMZml4ZWQgICAgIGF0dGVudWF0aW9uWzNdOwotICAgIEdMZml4ZWQgICAgIHJDb25zdEF0dGVudWF0aW9uOwotICAgIEdMYm9vbGVhbiAgIGVuYWJsZTsKLX07Ci0KLXN0cnVjdCBtYXRlcmlhbF90IHsKLSAgICB2ZWM0X3QgICAgICBhbWJpZW50OwotICAgIHZlYzRfdCAgICAgIGRpZmZ1c2U7Ci0gICAgdmVjNF90ICAgICAgc3BlY3VsYXI7Ci0gICAgdmVjNF90ICAgICAgZW1pc3Npb247Ci0gICAgR0xmaXhlZCAgICAgc2hpbmluZXNzOwotfTsKLQotc3RydWN0IGxpZ2h0X21vZGVsX3QgewotICAgIHZlYzRfdCAgICAgIGFtYmllbnQ7Ci0gICAgR0xib29sZWFuICAgdHdvU2lkZTsKLX07Ci0KLXN0cnVjdCBjb2xvcl9tYXRlcmlhbF90IHsKLSAgICBHTGVudW0gICAgICBmYWNlOwotICAgIEdMZW51bSAgICAgIG1vZGU7Ci0gICAgR0xib29sZWFuICAgZW5hYmxlOwotfTsKLQotc3RydWN0IGxpZ2h0aW5nX3QgewotICAgIGxpZ2h0X3QgICAgICAgICAgICAgbGlnaHRzW09HTEVTX01BWF9MSUdIVFNdOwotICAgIG1hdGVyaWFsX3QgICAgICAgICAgZnJvbnQ7Ci0gICAgbGlnaHRfbW9kZWxfdCAgICAgICBsaWdodE1vZGVsOwotICAgIGNvbG9yX21hdGVyaWFsX3QgICAgY29sb3JNYXRlcmlhbDsKLSAgICB2ZWM0X3QgICAgICAgICAgICAgIGltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQ7Ci0gICAgdmVjNF90ICAgICAgICAgICAgICBvYmpWaWV3ZXI7Ci0gICAgdWludDMyX3QgICAgICAgICAgICBlbmFibGVkTGlnaHRzOwotICAgIEdMYm9vbGVhbiAgICAgICAgICAgZW5hYmxlOwotICAgIEdMZW51bSAgICAgICAgICAgICAgc2hhZGVNb2RlbDsKLSAgICB0eXBlZGVmIHZvaWQgKCpsaWdodF9mY3RfdCkob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKLSAgICB2b2lkICgqbGlnaHRWZXJ0ZXgpKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOwotICAgIHZvaWQgKCpsaWdodFRyaWFuZ2xlKShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLX07Ci0KLXN0cnVjdCBjdWxsaW5nX3QgewotICAgIEdMZW51bSAgICAgIGN1bGxGYWNlOwotICAgIEdMZW51bSAgICAgIGZyb250RmFjZTsKLSAgICBHTGJvb2xlYW4gICBlbmFibGU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyB0ZXh0dXJlcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgdGV4dHVyZV91bml0X3QgewotICAgIEdMdWludCAgICAgICAgICAgICAgbmFtZTsKLSAgICBFR0xUZXh0dXJlT2JqZWN0KiAgIHRleHR1cmU7Ci0gICAgdWludDhfdCAgICAgICAgICAgICBkaXJ0eTsKLX07Ci0KLXN0cnVjdCB0ZXh0dXJlX3N0YXRlX3QKLXsKLSAgICB0ZXh0dXJlX3VuaXRfdCAgICAgIHRtdVtHR0xfVEVYVFVSRV9VTklUX0NPVU5UXTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIGFjdGl2ZTsgICAgIC8vIGFjdGl2ZSB0bXUKLSAgICBFR0xUZXh0dXJlT2JqZWN0KiAgIGRlZmF1bHRUZXh0dXJlOwotICAgIEdHTENvbnRleHQqICAgICAgICAgZ2dsOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgcGFja0FsaWdubWVudDsKLSAgICB1aW50OF90ICAgICAgICAgICAgIHVucGFja0FsaWdubWVudDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHRyYW5zZm9ybWF0aW9uIGFuZCBtYXRyaWNlcwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgbWF0cml4Zl90OwotCi1zdHJ1Y3QgbWF0cml4eF90IHsKLSAgICBHTGZpeGVkIG1bMTZdOwotICAgIHZvaWQgbG9hZChjb25zdCBtYXRyaXhmX3QmIHJocyk7Ci19OwotCi1zdHJ1Y3QgbWF0cml4X3N0YWNrX3Q7Ci0KLQotc3RydWN0IG1hdHJpeGZfdCB7Ci0gICAgdm9pZCBsb2FkSWRlbnRpdHkoKTsKLSAgICB2b2lkIGxvYWQoY29uc3QgbWF0cml4Zl90JiByaHMpOwotCi0gICAgaW5saW5lIEdMZmxvYXQqIGVkaXRFbGVtZW50cygpIHsgcmV0dXJuIG07IH0KLSAgICBpbmxpbmUgR0xmbG9hdCBjb25zdCogZWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBtOyB9Ci0KLSAgICB2b2lkIHNldChjb25zdCBHTGZpeGVkKiByaHMpOwotICAgIHZvaWQgc2V0KGNvbnN0IEdMZmxvYXQqIHJocyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBtdWx0aXBseShtYXRyaXhmX3QmIHIsCi0gICAgICAgICAgICBjb25zdCBtYXRyaXhmX3QmIGxocywgY29uc3QgbWF0cml4Zl90JiByaHMpOwotCi0gICAgdm9pZCBkdW1wKGNvbnN0IGNoYXIqIHdoYXQpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgbWF0cml4X3N0YWNrX3Q7Ci0gICAgR0xmbG9hdCAgICAgbVsxNl07Ci0gICAgdm9pZCBsb2FkKGNvbnN0IEdMZml4ZWQqIHJocyk7Ci0gICAgdm9pZCBsb2FkKGNvbnN0IEdMZmxvYXQqIHJocyk7Ci0gICAgdm9pZCBtdWx0aXBseShjb25zdCBtYXRyaXhmX3QmIHJocyk7Ci0gICAgdm9pZCB0cmFuc2xhdGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci0gICAgdm9pZCBzY2FsZShHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLSAgICB2b2lkIHJvdGF0ZShHTGZsb2F0IGEsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotfTsKLQotZW51bSB7Ci0gICAgT1BfSURFTlRJVFkgICAgICAgICA9IDB4MDAsCi0gICAgT1BfVFJBTlNMQVRFICAgICAgICA9IDB4MDEsCi0gICAgT1BfVU5JRk9STV9TQ0FMRSAgICA9IDB4MDIsCi0gICAgT1BfU0NBTEUgICAgICAgICAgICA9IDB4MDUsCi0gICAgT1BfUk9UQVRFICAgICAgICAgICA9IDB4MDgsCi0gICAgT1BfU0tFVyAgICAgICAgICAgICA9IDB4MTAsCi0gICAgT1BfQUxMICAgICAgICAgICAgICA9IDB4MUYKLX07Ci0KLXN0cnVjdCB0cmFuc2Zvcm1fdCB7Ci0gICAgZW51bSB7Ci0gICAgICAgIEZMQUdTXzJEX1BST0pFQ1RJT04gPSAweDEKLSAgICB9OwotICAgIG1hdHJpeHhfdCAgICAgICBtYXRyaXg7Ci0gICAgdWludDMyX3QgICAgICAgIGZsYWdzOwotICAgIHVpbnQzMl90ICAgICAgICBvcHM7Ci0KLSAgICB1bmlvbiB7Ci0gICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICB2b2lkICgqcG9pbnQyKSh0cmFuc2Zvcm1fdCBjb25zdCogdCwgdmVjNF90KiwgdmVjNF90IGNvbnN0Kik7Ci0gICAgICAgICAgICB2b2lkICgqcG9pbnQzKSh0cmFuc2Zvcm1fdCBjb25zdCogdCwgdmVjNF90KiwgdmVjNF90IGNvbnN0Kik7Ci0gICAgICAgICAgICB2b2lkICgqcG9pbnQ0KSh0cmFuc2Zvcm1fdCBjb25zdCogdCwgdmVjNF90KiwgdmVjNF90IGNvbnN0Kik7Ci0gICAgICAgIH07Ci0gICAgICAgIHZvaWQgKCpwb2ludHZbM10pKHRyYW5zZm9ybV90IGNvbnN0KiB0LCB2ZWM0X3QqLCB2ZWM0X3QgY29uc3QqKTsKLSAgICB9OwotCi0gICAgdm9pZCBsb2FkSWRlbnRpdHkoKTsKLSAgICB2b2lkIHBpY2tlcigpOwotICAgIHZvaWQgZHVtcChjb25zdCBjaGFyKiB3aGF0KTsKLX07Ci0KLXN0cnVjdCBtdnVpX3RyYW5zZm9ybV90IDogcHVibGljIHRyYW5zZm9ybV90Ci17Ci0gICAgdm9pZCBwaWNrZXIoKTsKLX07Ci0KLXN0cnVjdCBtYXRyaXhfc3RhY2tfdCB7Ci0gICAgZW51bSB7Ci0gICAgICAgIERPX1BJQ0tFUiAgICAgICAgICAgPSAweDEsCi0gICAgICAgIERPX0ZMT0FUX1RPX0ZJWEVEICAgPSAweDIKLSAgICB9OwotICAgIHRyYW5zZm9ybV90ICAgICB0cmFuc2Zvcm07Ci0gICAgdWludDhfdCAgICAgICAgIG1heERlcHRoOwotICAgIHVpbnQ4X3QgICAgICAgICBkZXB0aDsKLSAgICB1aW50OF90ICAgICAgICAgZGlydHk7Ci0gICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkOwotICAgIG1hdHJpeGZfdCAgICAgICAqc3RhY2s7Ci0gICAgdWludDhfdCAgICAgICAgICpvcHM7Ci0gICAgdm9pZCBpbml0KGludCBkZXB0aCk7Ci0gICAgdm9pZCB1bmluaXQoKTsKLSAgICB2b2lkIGxvYWRJZGVudGl0eSgpOwotICAgIHZvaWQgbG9hZChjb25zdCBHTGZpeGVkKiByaHMpOwotICAgIHZvaWQgbG9hZChjb25zdCBHTGZsb2F0KiByaHMpOwotICAgIHZvaWQgbXVsdGlwbHkoY29uc3QgbWF0cml4Zl90JiByaHMpOwotICAgIHZvaWQgdHJhbnNsYXRlKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotICAgIHZvaWQgc2NhbGUoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci0gICAgdm9pZCByb3RhdGUoR0xmbG9hdCBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLSAgICBHTGludCBwdXNoKCk7Ci0gICAgR0xpbnQgcG9wKCk7Ci0gICAgdm9pZCB2YWxpZGF0ZSgpOwotICAgIG1hdHJpeGZfdCYgdG9wKCkgeyByZXR1cm4gc3RhY2tbZGVwdGhdOyB9Ci0gICAgY29uc3QgbWF0cml4Zl90JiB0b3AoKSBjb25zdCB7IHJldHVybiBzdGFja1tkZXB0aF07IH0KLSAgICB1aW50MzJfdCB0b3Bfb3BzKCkgY29uc3QgeyByZXR1cm4gb3BzW2RlcHRoXTsgfQotICAgIGlubGluZSBib29sIGlzUmlnaWRCb2R5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gIShvcHNbZGVwdGhdICYgfihPUF9UUkFOU0xBVEV8T1BfVU5JRk9STV9TQ0FMRXxPUF9ST1RBVEUpKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgdnBfdHJhbnNmb3JtX3QgewotICAgIHRyYW5zZm9ybV90ICAgICB0cmFuc2Zvcm07Ci0gICAgbWF0cml4Zl90ICAgICAgIG1hdHJpeDsKLSAgICBHTGZsb2F0ICAgICAgICAgek5lYXI7Ci0gICAgR0xmbG9hdCAgICAgICAgIHpGYXI7Ci0gICAgdm9pZCBsb2FkSWRlbnRpdHkoKTsKLX07Ci0KLXN0cnVjdCB0cmFuc2Zvcm1fc3RhdGVfdCB7Ci0gICAgZW51bSB7Ci0gICAgICAgIE1PREVMVklFVyAgICAgICAgICAgPSAweDAxLAotICAgICAgICBQUk9KRUNUSU9OICAgICAgICAgID0gMHgwMiwKLSAgICAgICAgVklFV1BPUlQgICAgICAgICAgICA9IDB4MDQsCi0gICAgICAgIFRFWFRVUkUgICAgICAgICAgICAgPSAweDA4LAotICAgICAgICBNVlVJICAgICAgICAgICAgICAgID0gMHgxMCwKLSAgICAgICAgTVZJVCAgICAgICAgICAgICAgICA9IDB4MjAsCi0gICAgICAgIE1WUCAgICAgICAgICAgICAgICAgPSAweDQwLAotICAgIH07Ci0gICAgbWF0cml4X3N0YWNrX3QgICAgICAqY3VycmVudDsKLSAgICBtYXRyaXhfc3RhY2tfdCAgICAgIG1vZGVsdmlldzsKLSAgICBtYXRyaXhfc3RhY2tfdCAgICAgIHByb2plY3Rpb247Ci0gICAgbWF0cml4X3N0YWNrX3QgICAgICB0ZXh0dXJlW0dHTF9URVhUVVJFX1VOSVRfQ09VTlRdOwotCi0gICAgLy8gbW9kZWx2aWV3ICogcHJvamVjdGlvbgotICAgIHRyYW5zZm9ybV90ICAgICAgICAgbXZwICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwotICAgIC8vIHZpZXdwb3J0IHRyYW5zZm9ybWF0aW9uCi0gICAgdnBfdHJhbnNmb3JtX3QgICAgICB2cHQgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0gICAgLy8gc2FtZSBmb3IgNC1EIHZlcnRpY2VzCi0gICAgdHJhbnNmb3JtX3QgICAgICAgICBtdnA0OwotICAgIC8vIGZ1bGwgbW9kZWx2aWV3IGludmVyc2UgdHJhbnNwb3NlCi0gICAgdHJhbnNmb3JtX3QgICAgICAgICBtdml0NDsKLSAgICAvLyB1cHBlciAzeDMgb2YgbXYtaW52ZXJzZS10cmFuc3Bvc2UgKGZvciBub3JtYWxzKQotICAgIG12dWlfdHJhbnNmb3JtX3QgICAgbXZ1aTsKLQotICAgIEdMZW51bSAgICAgICAgICAgICAgbWF0cml4TW9kZTsKLSAgICBHTGVudW0gICAgICAgICAgICAgIHJlc2NhbGVOb3JtYWxzOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgZGlydHk7Ci0gICAgdm9pZCBpbnZhbGlkYXRlKCk7Ci0gICAgdm9pZCB1cGRhdGVfbXZwKCk7Ci0gICAgdm9pZCB1cGRhdGVfbXZpdCgpOwotICAgIHZvaWQgdXBkYXRlX212dWkoKTsKLX07Ci0KLXN0cnVjdCB2aWV3cG9ydF90IHsKLSAgICBHTGludCAgICAgICB4OwotICAgIEdMaW50ICAgICAgIHk7Ci0gICAgR0xzaXplaSAgICAgdzsKLSAgICBHTHNpemVpICAgICBoOwotICAgIHN0cnVjdCB7Ci0gICAgICAgIEdMaW50ICAgICAgIHg7Ci0gICAgICAgIEdMaW50ICAgICAgIHk7Ci0gICAgfSBzdXJmYWNlcG9ydDsKLSAgICBzdHJ1Y3QgewotICAgICAgICBHTGludCAgICAgICB4OwotICAgICAgICBHTGludCAgICAgICB5OwotICAgICAgICBHTHNpemVpICAgICB3OwotICAgICAgICBHTHNpemVpICAgICBoOwotICAgIH0gc2Npc3NvcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIExlcnBpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGNvbXB1dGVfaXRlcmF0b3JzX3QKLXsKLSAgICB2b2lkIGluaXRUcmlhbmdsZSgKLSAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MCwKLSAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MSwKLSAgICAgICAgICAgIHZlcnRleF90IGNvbnN0KiB2Mik7Ci0KLSAgICB2b2lkIGluaXRMaW5lKAotICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLAotICAgICAgICAgICAgdmVydGV4X3QgY29uc3QqIHYxKTsKLQotICAgIGlubGluZSB2b2lkIGluaXRMZXJwKHZlcnRleF90IGNvbnN0KiB2MCwgdWludDMyX3QgZW5hYmxlcyk7Ci0KLSAgICBpbnQgaXRlcmF0b3JzU2NhbGUoaW50MzJfdCBpdFszXSwKLSAgICAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0OwotCi0gICAgdm9pZCBpdGVyYXRvcnMxNjE2KEdHTGZpeGVkIGl0WzNdLAotICAgICAgICAgICAgR0dMZml4ZWQgYzAsIEdHTGZpeGVkIGMxLCBHR0xmaXhlZCBjMikgY29uc3Q7Ci0KLSAgICB2b2lkIGl0ZXJhdG9yczAwMzIoaW50MzJfdCBpdFszXSwKLSAgICAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0OwotCi0gICAgdm9pZCBpdGVyYXRvcnMwMDMyKGludDY0X3QgaXRbM10sCi0gICAgICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdDsKLQotICAgIEdHTGNvb3JkIGFyZWEoKSBjb25zdCB7IHJldHVybiBtX2FyZWE7IH0KLQotcHJpdmF0ZToKLSAgICAvLyBkb24ndCBjaGFuZ2Ugb3JkZXIgb2YgbWVtYmVycyBoZXJlIC0tIHVzZWQgYnkgaXRlcmF0b3JzLlMKLSAgICBHR0xjb29yZCBtX2R4MDEsIG1fZHkxMCwgbV9keDIwLCBtX2R5MDI7Ci0gICAgR0dMY29vcmQgbV94MCwgbV95MDsKLSAgICBHR0xjb29yZCBtX2FyZWE7Ci0gICAgdWludDhfdCBtX3NjYWxlOwotICAgIHVpbnQ4X3QgbV9hcmVhX3NjYWxlOwotICAgIHVpbnQ4X3QgbV9yZXNlcnZlZFsyXTsKLQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc3RhdGUKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmZGVmIEhBVkVfQU5EUk9JRF9PUwotICAgIC8vIFdlIGhhdmUgYSBkZWRpY2F0ZWQgVExTIHNsb3QgaW4gYmlvbmljCi0gICAgaW5saW5lIHZvaWQgc2V0R2xUaHJlYWRTcGVjaWZpYyhvZ2xlc19jb250ZXh0X3QgKnZhbHVlKSB7Ci0gICAgICAgICgodWludDMyX3QgKilfX2dldF90bHMoKSlbVExTX1NMT1RfT1BFTkdMXSA9ICh1aW50MzJfdCl2YWx1ZTsKLSAgICB9Ci0gICAgaW5saW5lIG9nbGVzX2NvbnRleHRfdCogZ2V0R2xUaHJlYWRTcGVjaWZpYygpIHsKLSAgICAgICAgcmV0dXJuIChvZ2xlc19jb250ZXh0X3QgKikoKCh1bnNpZ25lZCAqKV9fZ2V0X3RscygpKVtUTFNfU0xPVF9PUEVOR0xdKTsKLSAgICB9Ci0jZWxzZQotICAgIGV4dGVybiBwdGhyZWFkX2tleV90IGdHTEtleTsKLSAgICBpbmxpbmUgdm9pZCBzZXRHbFRocmVhZFNwZWNpZmljKG9nbGVzX2NvbnRleHRfdCAqdmFsdWUpIHsKLSAgICAgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnR0xLZXksIHZhbHVlKTsKLSAgICB9Ci0gICAgaW5saW5lIG9nbGVzX2NvbnRleHRfdCogZ2V0R2xUaHJlYWRTcGVjaWZpYygpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PG9nbGVzX2NvbnRleHRfdCo+KHB0aHJlYWRfZ2V0c3BlY2lmaWMoZ0dMS2V5KSk7Ci0gICAgfQotI2VuZGlmCi0KLQotc3RydWN0IHByaW1zX3QgewotICAgIHR5cGVkZWYgb2dsZXNfY29udGV4dF90KiBHTDsKLSAgICB2b2lkICgqcmVuZGVyUG9pbnQpKEdMLCB2ZXJ0ZXhfdCopOwotICAgIHZvaWQgKCpyZW5kZXJMaW5lKShHTCwgdmVydGV4X3QqLCB2ZXJ0ZXhfdCopOwotICAgIHZvaWQgKCpyZW5kZXJUcmlhbmdsZSkoR0wsIHZlcnRleF90KiwgdmVydGV4X3QqLCB2ZXJ0ZXhfdCopOwotfTsKLQotc3RydWN0IG9nbGVzX2NvbnRleHRfdCB7Ci0gICAgY29udGV4dF90ICAgICAgICAgICAgICAgcmFzdGVyaXplcjsKLSAgICBhcnJheV9tYWNoaW5lX3QgICAgICAgICBhcnJheXMgICAgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwotICAgIHRleHR1cmVfc3RhdGVfdCAgICAgICAgIHRleHR1cmVzOwotICAgIHRyYW5zZm9ybV9zdGF0ZV90ICAgICAgIHRyYW5zZm9ybXM7Ci0gICAgdmVydGV4X2NhY2hlX3QgICAgICAgICAgdmM7Ci0gICAgcHJpbXNfdCAgICAgICAgICAgICAgICAgcHJpbXM7Ci0gICAgY3VsbGluZ190ICAgICAgICAgICAgICAgY3VsbDsKLSAgICBsaWdodGluZ190ICAgICAgICAgICAgICBsaWdodGluZzsKLSAgICB1c2VyX2NsaXBfcGxhbmVzX3QgICAgICBjbGlwUGxhbmVzOwotICAgIGNvbXB1dGVfaXRlcmF0b3JzX3QgICAgIGxlcnA7ICAgICAgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDMyKSkpOwotICAgIHZlcnRleF90ICAgICAgICAgICAgICAgIGN1cnJlbnQ7Ci0gICAgdmVjNF90ICAgICAgICAgICAgICAgICAgY3VycmVudENvbG9yQ2xhbXBlZDsKLSAgICB2ZWMzX3QgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9ybWFsOwotICAgIHZpZXdwb3J0X3QgICAgICAgICAgICAgIHZpZXdwb3J0OwotICAgIHBvaW50X3NpemVfdCAgICAgICAgICAgIHBvaW50OwotICAgIGxpbmVfd2lkdGhfdCAgICAgICAgICAgIGxpbmU7Ci0gICAgcG9seWdvbl9vZmZzZXRfdCAgICAgICAgcG9seWdvbk9mZnNldDsKLSAgICBmb2dfdCAgICAgICAgICAgICAgICAgICBmb2c7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgcGVyc3BlY3RpdmUgOiAxOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHRyYW5zZm9ybVRleHR1cmVzIDogMTsKLSAgICBFR0xTdXJmYWNlTWFuYWdlciogICAgICBzdXJmYWNlTWFuYWdlcjsKLSAgICBFR0xCdWZmZXJPYmplY3RNYW5hZ2VyKiBidWZmZXJPYmplY3RNYW5hZ2VyOwotCi0gICAgR0xlbnVtICAgICAgICAgICAgICAgICAgZXJyb3I7Ci0KLSAgICBzdGF0aWMgaW5saW5lIG9nbGVzX2NvbnRleHRfdCogZ2V0KCkgewotICAgICAgICByZXR1cm4gZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotICAgIH0KLQotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGdsCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Z2w7Ci0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX0NPTlRFWFRfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2R4dC5jcHAgYi9vcGVuZ2wvbGliYWdsL2R4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOGM4MWYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9keHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvZHh0LmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNkZWZpbmUgVElNSU5HIDAKLQotI2lmIFRJTUlORwotI2luY2x1ZGUgPHN5cy90aW1lLmg+IC8vIGZvciBvcHRpbWl6YXRpb24gdGltaW5nCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPHV0aWxzL0VuZGlhbi5oPgotCi0jaW5jbHVkZSAiY29udGV4dC5oIgotCi0jZGVmaW5lIFRJTUlORyAwCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHVpbnQ4X3QgYXZnMjN0YWJbNjQqNjRdOwotc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfaW5pdGlhbGl6ZWQgPSAwOwotCi0vLyBEZWZpbml0aW9ucyBiZWxvdyBhcmUgZXF1aXZhbGVudCB0byB0aGVzZSBvdmVyIHRoZSB2YWxpZCByYW5nZSBvZiBhcmd1bWVudHMKLS8vICAjZGVmaW5lIGRpdjUoeCkgKCh4KS81KQotLy8gICNkZWZpbmUgZGl2Nyh4KSAoKHgpLzcpCi0KLS8vIFVzZSBmaXhlZC1wb2ludCB0byBkaXZpZGUgYnkgNSBhbmQgNwotLy8gMzI3NyA9IDJeMTQvNSArIDEKLS8vIDIzNDEgPSAyXjE0LzcgKyAxCi0jZGVmaW5lIGRpdjUoeCkgKCgoeCkqMzI3NykgPj4gMTQpCi0jZGVmaW5lIGRpdjcoeCkgKCgoeCkqMjM0MSkgPj4gMTQpCi0KLS8vIFRhYmxlIHdpdGggZW50cnkgW2EgPDwgNiB8IGJdID0gKDIqYSArIGIpLzMgZm9yIDAgPD0gYSxiIDwgNjQKLSNkZWZpbmUgYXZnMjMoeDAseDEpIGF2ZzIzdGFiWygoeDApIDw8IDYpIHwgKHgxKV0KLQotLy8gRXh0cmFjdCA1LzYvNSBSR0IKLSNkZWZpbmUgcmVkKHgpICAgKCgoeCkgPj4gMTEpICYgMHgxZikKLSNkZWZpbmUgZ3JlZW4oeCkgKCgoeCkgPj4gIDUpICYgMHgzZikKLSNkZWZpbmUgYmx1ZSh4KSAgKCAoeCkgICAgICAgICYgMHgxZikKLQotLyoKLSAqIENvbnZlcnQgNS82LzUgUkdCIChhcyAzIGludHMpIHRvIDgvOC84Ci0gKgotICogT3BlcmF0aW9uIGNvdW50OiA4IDw8LCAwICYsIDUgfAotICovCi1pbmxpbmUgc3RhdGljIGludCByZ2I1NjVTZXBUbzg4OChpbnQgciwgaW50IGcsIGludCBiKQotCi17Ci0gICAgcmV0dXJuICgoKChyIDw8IDMpIHwgKHIgPj4gMikpIDw8IDE2KSB8Ci0gICAgICAgICAgICAoKChnIDw8IDIpIHwgKGcgPj4gNCkpIDw8ICA4KSB8Ci0gICAgICAgICAgICAgKChiIDw8IDMpIHwgKGIgPj4gMikpKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgNS82LzUgUkdCIChhcyBhIHNpbmdsZSAxNi1iaXQgd29yZCkgdG8gOC84LzgKLSAqCi0gKiAgICAgICAgICAgICAgICAgICByNHIzcjJyMSByMGc1ZzRnMyBnMmcxZzBiNCBiM2IyYjFiMCAgIHJnYgotICogICAgICAgICAgICByNHIzcjIgcjFyMGc1ZzQgZzNnMmcxZzAgYjRiM2IyYjEgYjAgMCAwIDAgICByZ2IgPDwgMwotICogcjRyM3IycjEgcjByNHIzcjIgZzVnNGczZzIgZzFnMGc1ZzQgYjRiM2IyYjEgYjBiNGIzYjIgICBkZXNpcmVkIHJlc3VsdAotICoKLSAqIENvbnN0cnVjdCB0aGUgMjQtYml0IFJHQiB3b3JkIGFzOgotICoKLSAqIHI0cjNyMnIxIHIwLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tICAocmdiIDw8IDgpICYgMHhmODAwMDAKLSAqICAgICAgICAgICAgcjRyM3IyIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tICAocmdiIDw8IDMpICYgMHgwNzAwMDAKLSAqICAgICAgICAgICAgICAgICAgIGc1ZzRnM2cyIGcxZzAtLS0tIC0tLS0tLS0tIC0tLS0tLS0tICAocmdiIDw8IDUpICYgMHgwMGZjMDAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNWc0IC0tLS0tLS0tIC0tLS0tLS0tICAocmdiID4+IDEpICYgMHgwMDAzMDAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI0YjNiMmIxIGIwLS0tLS0tICAocmdiIDw8IDMpICYgMHgwMDAwZjgKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjRiM2IyICAocmdiID4+IDIpICYgMHgwMDAwMDcKLSAqCi0gKiBPcGVyYXRpb24gY291bnQ6IDUgPDwsIDYgJiwgNSB8IChuLmIuIHJnYiA+PiAzIGlzIHVzZWQgdHdpY2UpCi0gKi8KLWlubGluZSBzdGF0aWMgaW50IHJnYjU2NVRvODg4KGludCByZ2IpCi0KLXsKLSAgICBpbnQgcmdiMyA9IHJnYiA+PiAzOwotICAgIHJldHVybiAoKChyZ2IgPDwgOCkgJiAweGY4MDAwMCkgfAotICAgICAgICAgICAgKCByZ2IzICAgICAgJiAweDA3MDAwMCkgfAotICAgICAgICAgICAgKChyZ2IgPDwgNSkgJiAweDAwZmMwMCkgfAotICAgICAgICAgICAgKChyZ2IgPj4gMSkgJiAweDAwMDMwMCkgfAotICAgICAgICAgICAgKCByZ2IzICAgICAgJiAweDAwMDBmOCkgfAotICAgICAgICAgICAgKChyZ2IgPj4gMikgJiAweDAwMDAwNykpOwotfQotCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotc3RhdGljIHVpbnQzMl90IHN3YXAodWludDMyX3QgeCkgewotICAgIGludCBiMCA9ICh4ID4+IDI0KSAmIDB4ZmY7Ci0gICAgaW50IGIxID0gKHggPj4gMTYpICYgMHhmZjsKLSAgICBpbnQgYjIgPSAoeCA+PiAgOCkgJiAweGZmOwotICAgIGludCBiMyA9ICh4ICAgICAgKSAmIDB4ZmY7Ci0gICAgCi0gICAgcmV0dXJuICh1aW50MzJfdCkoKGIzIDw8IDI0KSB8IChiMiA8PCAxNikgfCAoYjEgPDwgOCkgfCBiMCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQKLWluaXRfdGFibGVzKCkKLXsKLSAgICBpZiAodGFibGVzX2luaXRpYWxpemVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY0OyBpKyspIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA2NDsgaisrKSB7Ci0gICAgICAgICAgICBpbnQgYXZnID0gKDIqaSArIGopLzM7Ci0gICAgICAgICAgICBhdmcyM3RhYlsoaSA8PCA2KSB8IGpdID0gYXZnOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXNtIHZvbGF0aWxlICgiIiA6IDogOiAibWVtb3J5Iik7Ci0gICAgdGFibGVzX2luaXRpYWxpemVkID0gMTsKLX0KLQotLyoKLSAqIFV0aWxpdHkgdG8gc2NhbiBhIERYVDEgY29tcHJlc3NlZCB0ZXh0dXJlIHRvIGRldGVybWluZSB3aGV0aGVyIGl0Ci0gKiBjb250YWlucyBhIHRyYW5zcGFyZW50IHBpeGVsIChjb2xvcjAgPCBjb2xvcjEsIGNvZGUgPT0gMykuICBUaGlzCi0gKiBtYXkgYmUgdXNlZnVsIGlmIHRoZSBhcHBsaWNhdGlvbiBsYWNrcyBpbmZvcm1hdGlvbiBhcyB0byB3aGV0aGVyCi0gKiB0aGUgdHJ1ZSBmb3JtYXQgaXMgR0xfQ09NUFJFU1NFRF9SR0JfUzNUQ19EWFQxX0VYVCBvcgotICogR0xfQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQuCi0gKi8KLWJvb2wKLURYVDFIYXNBbHBoYShjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeyAgICAKLSNpZiBUSU1JTkcKLSAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydF90LCBlbmRfdDsKLSAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7Ci0gICAgCi0gICAgZ2V0dGltZW9mZGF5KCZzdGFydF90LCAmdHopOwotI2VuZGlmCi0KLSAgICBib29sIGhhc0FscGhhID0gZmFsc2U7Ci0KLSAgICBpbnQgeGJsb2NrcyA9ICh3aWR0aCArIDMpLzQ7Ci0gICAgaW50IHlibG9ja3MgPSAoaGVpZ2h0ICsgMykvNDsKLSAgICBpbnQgbnVtYmxvY2tzID0geGJsb2Nrcyp5YmxvY2tzOwotCi0gICAgdWludDMyX3QgY29uc3QgKmQzMiA9ICh1aW50MzJfdCAqKWRhdGE7Ci0gICAgZm9yIChpbnQgYiA9IDA7IGIgPCBudW1ibG9ja3M7IGIrKykgewotICAgICAgICB1aW50MzJfdCBjb2xvcnMgPSAqZDMyKys7Ci0gICAgICAgIAotI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KLSAgICAgICAgY29sb3JzID0gc3dhcChjb2xvcnMpOwotI2VuZGlmCi0gICAgICAgIAotICAgICAgICB1aW50MTZfdCBjb2xvcjAgPSBjb2xvcnMgJiAweGZmZmY7Ci0gICAgICAgIHVpbnQxNl90IGNvbG9yMSA9IGNvbG9ycyA+PiAxNjsKLSAgICAgICAgCi0gICAgICAgIGlmIChjb2xvcjAgPCBjb2xvcjEpIHsKLSAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gbmVlZCB0byBlbmRpYW4tc3dhcCB3aXRoaW4gJ2JpdHMnCi0gICAgICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBjYXJlIHdoaWNoIHBpeGVsIGlzIHRoZSB0cmFuc3BhcmVudCBvbmUKLSAgICAgICAgICAgIHVpbnQzMl90IGJpdHMgPSAqZDMyKys7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIERldGVjdCBpZiBhbnkgKG9kZCwgZXZlbikgcGFpciBvZiBiaXRzIGFyZSAnMTEnCi0gICAgICAgICAgICAvLyAgICAgIGJpdHM6IGIzMSBiMzAgYjI5IC4uLiBiMyBiMiBiMSBiMAotICAgICAgICAgICAgLy8gYml0cyA+PiAxOiBiMzEgYjMxIGIzMCAuLi4gYjQgYjMgYjIgYjEKLSAgICAgICAgICAgIC8vICAgICAgICAgJjogYjMxIChiMzEgJiBiMzApIChiMjkgJiBiMjgpIC4uLiAoYjIgJiBiMSkgKGIxICYgYjApCi0gICAgICAgICAgICAvLyAgJiAweDU1Li46ICAgMCAoYjMxICYgYjMwKSAgICAgICAwICAgICAuLi4gICAgIDAgICAgIChiMSAmIGIwKQotICAgICAgICAgICAgaWYgKCgoYml0cyAmIChiaXRzID4+IDEpKSAmIDB4NTU1NTU1NTUpICE9IDApIHsKLSAgICAgICAgICAgICAgICBoYXNBbHBoYSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU2tpcCA0IGJ5dGVzCi0gICAgICAgICAgICArK2QzMjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSBkb25lOgotI2lmIFRJTUlORwotICAgIGdldHRpbWVvZmRheSgmZW5kX3QsICZ0eik7Ci0gICAgbG9uZyB1c2VjID0gKGVuZF90LnR2X3NlYyAtIHN0YXJ0X3QudHZfc2VjKSoxMDAwMDAwICsKLSAgICAgICAgKGVuZF90LnR2X3VzZWMgLSBzdGFydF90LnR2X3VzZWMpOwotICAgIAotICAgIHByaW50ZigiU2Nhbm5lZCB3PSVkIGg9JWQgaW4gJWxkIHVzZWNcbiIsIHdpZHRoLCBoZWlnaHQsIHVzZWMpOwotI2VuZGlmCi0gICAgCi0gICAgcmV0dXJuIGhhc0FscGhhOwotfQotCi1zdGF0aWMgdm9pZAotZGVjb2RlRFhUMShjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgYm9vbCBoYXNBbHBoYSkKLSAgICAKLXsKLSAgICBpbml0X3RhYmxlcygpOwotICAgIAotICAgIHVpbnQzMl90IGNvbnN0ICpkMzIgPSAodWludDMyX3QgKilkYXRhOwotICAgIAotICAgIC8vIENvbG9yIHRhYmxlIGZvciB0aGUgY3VycmVudCBibG9jawotICAgIHVpbnQxNl90IGNbNF07Ci0gICAgY1swXSA9IGNbMV0gPSBjWzJdID0gY1szXSA9IDA7Ci0gICAgCi0gICAgLy8gU3BlY2lmaWVkIGNvbG9ycyBmcm9tIHRoZSBwcmV2aW91cyBibG9jawotICAgIHVpbnQxNl90IHByZXZfY29sb3IwID0gMHgwMDAwOwotICAgIHVpbnQxNl90IHByZXZfY29sb3IxID0gMHgwMDAwOwotICAgIAotICAgIHVpbnQxNl90KiByb3dQdHIgPSAodWludDE2X3QqKXN1cmZhY2U7Ci0gICAgZm9yIChpbnQgYmFzZV95ID0gMDsgYmFzZV95IDwgaGVpZ2h0OyBiYXNlX3kgKz0gNCwgcm93UHRyICs9IDQqc3RyaWRlKSB7Ci0gICAgICAgIHVpbnQxNl90ICpibG9ja1B0ciA9IHJvd1B0cjsKLSAgICAgICAgZm9yIChpbnQgYmFzZV94ID0gMDsgYmFzZV94IDwgd2lkdGg7IGJhc2VfeCArPSA0LCBibG9ja1B0ciArPSA0KSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjb2xvcnMgPSAqZDMyKys7Ci0gICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gKmQzMisrOwotICAgICAgICAgICAgCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotICAgICAgICAgICAgY29sb3JzID0gc3dhcChjb2xvcnMpOwotICAgICAgICAgICAgYml0cyA9IHN3YXAoYml0cyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gUmF3IGNvbG9ycwotICAgICAgICAgICAgdWludDE2X3QgY29sb3IwID0gY29sb3JzICYgMHhmZmZmOwotICAgICAgICAgICAgdWludDE2X3QgY29sb3IxID0gY29sb3JzID4+IDE2OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBJZiB0aGUgbmV3IGJsb2NrIGhhcyB0aGUgc2FtZSBiYXNlIGNvbG9ycyBhcyB0aGUKLSAgICAgICAgICAgIC8vIHByZXZpb3VzIG9uZSwgd2UgZG9uJ3QgbmVlZCB0byByZWNvbXB1dGUgdGhlIGNvbG9yCi0gICAgICAgICAgICAvLyB0YWJsZSBjW10KLSAgICAgICAgICAgIGlmIChjb2xvcjAgIT0gcHJldl9jb2xvcjAgfHwgY29sb3IxICE9IHByZXZfY29sb3IxKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RvcmUgcmF3IGNvbG9ycyBmb3IgY29tcGFyaXNvbiB3aXRoIG5leHQgYmxvY2sKLSAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMCA9IGNvbG9yMDsKLSAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMSA9IGNvbG9yMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgcjAgPSAgIHJlZChjb2xvcjApOwotICAgICAgICAgICAgICAgIGludCBnMCA9IGdyZWVuKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgaW50IGIwID0gIGJsdWUoY29sb3IwKTsKLQotICAgICAgICAgICAgICAgIGludCByMSA9ICAgcmVkKGNvbG9yMSk7Ci0gICAgICAgICAgICAgICAgaW50IGcxID0gZ3JlZW4oY29sb3IxKTsKLSAgICAgICAgICAgICAgICBpbnQgYjEgPSAgYmx1ZShjb2xvcjEpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgY1swXSA9IChyMCA8PCAxMSkgfCAoKGcwID4+IDEpIDw8IDYpIHwgKGIwIDw8IDEpIHwgMHgxOwotICAgICAgICAgICAgICAgICAgICBjWzFdID0gKHIxIDw8IDExKSB8ICgoZzEgPj4gMSkgPDwgNikgfCAoYjEgPDwgMSkgfCAweDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY1swXSA9IGNvbG9yMDsKLSAgICAgICAgICAgICAgICAgICAgY1sxXSA9IGNvbG9yMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IHIyLCBnMiwgYjIsIHIzLCBnMywgYjMsIGEzOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBiYml0cyA9IGJpdHMgPj4gMTsKLSAgICAgICAgICAgICAgICBib29sIGhhczIgPSAoKGJiaXRzICYgfmJpdHMpICYgMHg1NTU1NTU1NSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sIGhhczMgPSAoKGJiaXRzICYgIGJpdHMpICYgMHg1NTU1NTU1NSkgIT0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaGFzMiB8fCBoYXMzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvcjAgPiBjb2xvcjEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gYXZnMjMocjAsIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcyID0gYXZnMjMoZzAsIGcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGIyID0gYXZnMjMoYjAsIGIxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSBhdmcyMyhyMSwgcjApOwotICAgICAgICAgICAgICAgICAgICAgICAgZzMgPSBhdmcyMyhnMSwgZzApOwotICAgICAgICAgICAgICAgICAgICAgICAgYjMgPSBhdmcyMyhiMSwgYjApOwotICAgICAgICAgICAgICAgICAgICAgICAgYTMgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjAgKyByMSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGcyID0gKGcwICsgZzEpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiMiA9IChiMCArIGIxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICByMyA9IGczID0gYjMgPSBhMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjWzJdID0gKHIyIDw8IDExKSB8ICgoZzIgPj4gMSkgPDwgNikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiMiA8PCAxKSB8IDB4MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNbM10gPSAocjMgPDwgMTEpIHwgKChnMyA+PiAxKSA8PCA2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIzIDw8IDEpIHwgYTM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjWzJdID0gKHIyIDw8IDExKSB8IChnMiA8PCA1KSB8IGIyOwotICAgICAgICAgICAgICAgICAgICAgICAgY1szXSA9IChyMyA8PCAxMSkgfCAoZzMgPDwgNSkgfCBiMzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdWludDE2X3QqIGJsb2NrUm93UHRyID0gYmxvY2tQdHI7Ci0gICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDQ7IHkrKywgYmxvY2tSb3dQdHIgKz0gc3RyaWRlKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJvY2VzcyByb3dzIHBhc3QgdGhlIGJvdG9tCi0gICAgICAgICAgICAgICAgaWYgKGJhc2VfeSArIHkgPj0gaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgdyA9IG1pbih3aWR0aCAtIGJhc2VfeCwgNCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBiaXRzICYgMHgzOwotICAgICAgICAgICAgICAgICAgICBiaXRzID4+PSAyOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgYmxvY2tSb3dQdHJbeF0gPSBjW2NvZGVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSAgICAKLS8vIE91dHB1dCBkYXRhIGFzIGludGVybmFsZm9ybWF0PUdMX1JHQkEsIHR5cGU9R0xfVU5TSUdORURfQllURQotc3RhdGljIHZvaWQKLWRlY29kZURYVDMoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgIHZvaWQgKnN1cmZhY2UsIGludCBzdHJpZGUpCi0KLXsKLSAgICBpbml0X3RhYmxlcygpOwotICAgIAotICAgIHVpbnQzMl90IGNvbnN0ICpkMzIgPSAodWludDMyX3QgKilkYXRhOwotICAgIAotICAgIC8vIFNwZWNpZmllZCBjb2xvcnMgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2sKLSAgICB1aW50MTZfdCBwcmV2X2NvbG9yMCA9IDB4MDAwMDsKLSAgICB1aW50MTZfdCBwcmV2X2NvbG9yMSA9IDB4MDAwMDsKLQotICAgIC8vIENvbG9yIHRhYmxlIGZvciB0aGUgY3VycmVudCBibG9jawotICAgIHVpbnQzMl90IGNbNF07Ci0gICAgY1swXSA9IGNbMV0gPSBjWzJdID0gY1szXSA9IDA7Ci0KLSAgICB1aW50MzJfdCogcm93UHRyID0gKHVpbnQzMl90KilzdXJmYWNlOwotICAgIGZvciAoaW50IGJhc2VfeSA9IDA7IGJhc2VfeSA8IGhlaWdodDsgYmFzZV95ICs9IDQsIHJvd1B0ciArPSA0KnN0cmlkZSkgewotICAgICAgICB1aW50MzJfdCAqYmxvY2tQdHIgPSByb3dQdHI7Ci0gICAgICAgIGZvciAoaW50IGJhc2VfeCA9IDA7IGJhc2VfeCA8IHdpZHRoOyBiYXNlX3ggKz0gNCwgYmxvY2tQdHIgKz0gNCkgewotICAgICAgICAgICAgCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotICAgICAgICAgICAgdWludDMyX3QgYWxwaGFoaSA9ICpkMzIrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IGFscGhhbG8gPSAqZDMyKys7Ci0gICAgICAgICAgICBhbHBoYWhpID0gc3dhcChhbHBoYWhpKTsKLSAgICAgICAgICAgIGFscGhhbG8gPSBzd2FwKGFscGhhbG8pOwotI2Vsc2UKLSAgICAgICAgICAgIHVpbnQzMl90IGFscGhhbG8gPSAqZDMyKys7Ci0gICAgICAgICAgICB1aW50MzJfdCBhbHBoYWhpID0gKmQzMisrOwotI2VuZGlmCi0KLSAgICAgICAgICAgIHVpbnQzMl90IGNvbG9ycyA9ICpkMzIrKzsKLSAgICAgICAgICAgIHVpbnQzMl90IGJpdHMgPSAqZDMyKys7Ci0gICAgICAgICAgICAKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0gICAgICAgICAgICBjb2xvcnMgPSBzd2FwKGNvbG9ycyk7Ci0gICAgICAgICAgICBiaXRzID0gc3dhcChiaXRzKTsKLSNlbmRpZgotICAgICAgICAgICAgCi0gICAgICAgICAgICB1aW50NjRfdCBhbHBoYSA9ICgodWludDY0X3QpYWxwaGFoaSA8PCAzMikgfCBhbHBoYWxvOwotCi0gICAgICAgICAgICAvLyBSYXcgY29sb3JzCi0gICAgICAgICAgICB1aW50MTZfdCBjb2xvcjAgPSBjb2xvcnMgJiAweGZmZmY7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb2xvcjEgPSBjb2xvcnMgPj4gMTY7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgYmxvY2sgaGFzIHRoZSBzYW1lIGJhc2UgY29sb3JzIGFzIHRoZQotICAgICAgICAgICAgLy8gcHJldmlvdXMgb25lLCB3ZSBkb24ndCBuZWVkIHRvIHJlY29tcHV0ZSB0aGUgY29sb3IKLSAgICAgICAgICAgIC8vIHRhYmxlIGNbXQotICAgICAgICAgICAgaWYgKGNvbG9yMCAhPSBwcmV2X2NvbG9yMCB8fCBjb2xvcjEgIT0gcHJldl9jb2xvcjEpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9yZSByYXcgY29sb3JzIGZvciBjb21wYXJpc29uIHdpdGggbmV4dCBibG9jawotICAgICAgICAgICAgICAgIHByZXZfY29sb3IwID0gY29sb3IwOwotICAgICAgICAgICAgICAgIHByZXZfY29sb3IxID0gY29sb3IxOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCBiYml0cyA9IGJpdHMgPj4gMTsKLSAgICAgICAgICAgICAgICBib29sIGhhczIgPSAoKGJiaXRzICYgfmJpdHMpICYgMHg1NTU1NTU1NSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sIGhhczMgPSAoKGJiaXRzICYgIGJpdHMpICYgMHg1NTU1NTU1NSkgIT0gMDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoaGFzMiB8fCBoYXMzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCByMCA9ICAgcmVkKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnMCA9IGdyZWVuKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiMCA9ICBibHVlKGNvbG9yMCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgcjEgPSAgIHJlZChjb2xvcjEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZzEgPSBncmVlbihjb2xvcjEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgYjEgPSAgYmx1ZShjb2xvcjEpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHIyID0gYXZnMjMocjAsIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcyID0gYXZnMjMoZzAsIGcxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIyID0gYXZnMjMoYjAsIGIxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCByMyA9IGF2ZzIzKHIxLCByMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnMyA9IGF2ZzIzKGcxLCBnMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiMyA9IGF2ZzIzKGIxLCBiMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY1swXSA9IHJnYjU2NVNlcFRvODg4KHIwLCBnMCwgYjApOwotICAgICAgICAgICAgICAgICAgICBjWzFdID0gcmdiNTY1U2VwVG84ODgocjEsIGcxLCBiMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNbMl0gPSByZ2I1NjVTZXBUbzg4OChyMiwgZzIsIGIyKTsKLSAgICAgICAgICAgICAgICAgICAgY1szXSA9IHJnYjU2NVNlcFRvODg4KHIzLCBnMywgYjMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gOCBiaXRzCi0gICAgICAgICAgICAgICAgICAgIGNbMF0gPSByZ2I1NjVUbzg4OChjb2xvcjApOwotICAgICAgICAgICAgICAgICAgICBjWzFdID0gcmdiNTY1VG84ODgoY29sb3IxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90KiBibG9ja1Jvd1B0ciA9IGJsb2NrUHRyOwotICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyssIGJsb2NrUm93UHRyICs9IHN0cmlkZSkgewotICAgICAgICAgICAgICAgIC8vIERvbid0IHByb2Nlc3Mgcm93cyBwYXN0IHRoZSBib3RvbQotICAgICAgICAgICAgICAgIGlmIChiYXNlX3kgKyB5ID49IGhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IHcgPSBtaW4od2lkdGggLSBiYXNlX3gsIDQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBhID0gYWxwaGEgJiAweGY7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhID4+PSA0OwotCi0gICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gYml0cyAmIDB4MzsKLSAgICAgICAgICAgICAgICAgICAgYml0cyA+Pj0gMjsKLQotICAgICAgICAgICAgICAgICAgICBibG9ja1Jvd1B0clt4XSA9IGNbY29kZV0gfCAoYSA8PCAyOCkgfCAoYSA8PCAyNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBPdXRwdXQgZGF0YSBhcyBpbnRlcm5hbGZvcm1hdD1HTF9SR0JBLCB0eXBlPUdMX1VOU0lHTkVEX0JZVEUKLXN0YXRpYyB2b2lkCi1kZWNvZGVEWFQ1KGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlKQotCi17Ci0gICAgaW5pdF90YWJsZXMoKTsKLSAgICAKLSAgICB1aW50MzJfdCBjb25zdCAqZDMyID0gKHVpbnQzMl90ICopZGF0YTsKLSAgICAKLSAgICAvLyBTcGVjaWZpZWQgYWxwaGFzIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrCi0gICAgdWludDhfdCBwcmV2X2FscGhhMCA9IDB4MDA7Ci0gICAgdWludDhfdCBwcmV2X2FscGhhMSA9IDB4MDA7Ci0KLSAgICAvLyBTcGVjaWZpZWQgY29sb3JzIGZyb20gdGhlIHByZXZpb3VzIGJsb2NrCi0gICAgdWludDE2X3QgcHJldl9jb2xvcjAgPSAweDAwMDA7Ci0gICAgIHVpbnQxNl90IHByZXZfY29sb3IxID0gMHgwMDAwOwotCi0gICAgLy8gQWxwaGEgdGFibGUgZm9yIHRoZSBjdXJyZW50IGJsb2NrCi0gICAgdWludDhfdCBhWzhdOwotICAgIGFbMF0gPSBhWzFdID0gYVsyXSA9IGFbM10gPSBhWzRdID0gYVs1XSA9IGFbNl0gPSBhWzddID0gMDsKLQotICAgIC8vIENvbG9yIHRhYmxlIGZvciB0aGUgY3VycmVudCBibG9jawotICAgIHVpbnQzMl90IGNbNF07Ci0gICAgY1swXSA9IGNbMV0gPSBjWzJdID0gY1szXSA9IDA7Ci0KLSAgICBpbnQgZ29vZF9hNSA9IDA7Ci0gICAgaW50IGJhZF9hNSA9IDA7Ci0gICAgaW50IGdvb2RfYTYgPSAwOwotICAgIGludCBiYWRfYTYgPSAwOwotICAgIGludCBnb29kX2E3ID0gMDsKLSAgICBpbnQgYmFkX2E3ID0gMDsKLQotICAgIHVpbnQzMl90KiByb3dQdHIgPSAodWludDMyX3QqKXN1cmZhY2U7Ci0gICAgZm9yIChpbnQgYmFzZV95ID0gMDsgYmFzZV95IDwgaGVpZ2h0OyBiYXNlX3kgKz0gNCwgcm93UHRyICs9IDQqc3RyaWRlKSB7Ci0gICAgICAgIHVpbnQzMl90ICpibG9ja1B0ciA9IHJvd1B0cjsKLSAgICAgICAgZm9yIChpbnQgYmFzZV94ID0gMDsgYmFzZV94IDwgd2lkdGg7IGJhc2VfeCArPSA0LCBibG9ja1B0ciArPSA0KSB7Ci0gICAgICAgICAgICAKLSNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCi0gICAgICAgICAgICB1aW50MzJfdCBhbHBoYWhpID0gKmQzMisrOwotICAgICAgICAgICAgdWludDMyX3QgYWxwaGFsbyA9ICpkMzIrKzsKLSAgICAgICAgICAgIGFscGhhaGkgPSBzd2FwKGFscGhhaGkpOwotICAgICAgICAgICAgYWxwaGFsbyA9IHN3YXAoYWxwaGFsbyk7Ci0jZWxzZQotICAgICAgICAgICAgIHVpbnQzMl90IGFscGhhbG8gPSAqZDMyKys7Ci0gICAgICAgICAgICAgdWludDMyX3QgYWxwaGFoaSA9ICpkMzIrKzsKLSNlbmRpZgotCi0gICAgICAgICAgICB1aW50MzJfdCBjb2xvcnMgPSAqZDMyKys7Ci0gICAgICAgICAgICB1aW50MzJfdCBiaXRzID0gKmQzMisrOwotICAgICAgICAgICAgCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTngKLSAgICAgICAgICAgIGNvbG9ycyA9IHN3YXAoY29sb3JzKTsKLSAgICAgICAgICAgIGJpdHMgPSBzd2FwKGJpdHMpOwotI2VuZGlmCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIHVpbnQ2NF90IGFscGhhID0gKCh1aW50NjRfdClhbHBoYWhpIDw8IDMyKSB8IGFscGhhbG87Ci0gICAgICAgICAgICB1aW50NjRfdCBhbHBoYTAgPSBhbHBoYSAmIDB4ZmY7Ci0gICAgICAgICAgICBhbHBoYSA+Pj0gODsKLSAgICAgICAgICAgIHVpbnQ2NF90IGFscGhhMSA9IGFscGhhICYgMHhmZjsKLSAgICAgICAgICAgIGFscGhhID4+PSA4OwotCi0gICAgICAgICAgICBpZiAoYWxwaGEwICE9IHByZXZfYWxwaGEwIHx8IGFscGhhMSAhPSBwcmV2X2FscGhhMSkgewotICAgICAgICAgICAgICAgIHByZXZfYWxwaGEwID0gYWxwaGEwOwotICAgICAgICAgICAgICAgIHByZXZfYWxwaGExID0gYWxwaGExOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGFbMF0gPSBhbHBoYTA7Ci0gICAgICAgICAgICAgICAgYVsxXSA9IGFscGhhMTsKLSAgICAgICAgICAgICAgICBpbnQgYTAxID0gYWxwaGEwICsgYWxwaGExIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAoYWxwaGEwID4gYWxwaGExKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFbMl0gPSBkaXY3KDYqYWxwaGEwICsgICBhbHBoYTEpOwotICAgICAgICAgICAgICAgICAgICBhWzRdID0gZGl2Nyg0KmFscGhhMCArIDMqYWxwaGExKTsKLSAgICAgICAgICAgICAgICAgICAgYVs2XSA9IGRpdjcoMiphbHBoYTAgKyA1KmFscGhhMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHN5bW1ldHJ5IHRvIGRlcml2ZSBoYWxmIG9mIHRoZSB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgLy8gQSBmZXcgdmFsdWVzIHdpbGwgYmUgb2ZmIGJ5IDEgKH4uNSUpCi0gICAgICAgICAgICAgICAgICAgIC8vIEFsdGVybmF0ZSB3aGljaCB2YWx1ZXMgYXJlIGNvbXB1dGVkIGRpcmVjdGx5Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3aGljaCBhcmUgZGVyaXZlZCB0byB0cnkgdG8gcmVkdWNlIGJpYXMKLSAgICAgICAgICAgICAgICAgICAgYVszXSA9IGEwMSAtIGFbNl07Ci0gICAgICAgICAgICAgICAgICAgIGFbNV0gPSBhMDEgLSBhWzRdOwotICAgICAgICAgICAgICAgICAgICBhWzddID0gYTAxIC0gYVsyXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhWzJdID0gZGl2NSg0KmFscGhhMCArICAgYWxwaGExKTsKLSAgICAgICAgICAgICAgICAgICAgYVs0XSA9IGRpdjUoMiphbHBoYTAgKyAzKmFscGhhMSk7Ci0gICAgICAgICAgICAgICAgICAgIGFbM10gPSBhMDEgLSBhWzRdOwotICAgICAgICAgICAgICAgICAgICBhWzVdID0gYTAxIC0gYVsyXTsKLSAgICAgICAgICAgICAgICAgICAgYVs2XSA9IDB4MDA7Ci0gICAgICAgICAgICAgICAgICAgIGFbN10gPSAweGZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmF3IGNvbG9ycwotICAgICAgICAgICAgdWludDE2X3QgY29sb3IwID0gY29sb3JzICYgMHhmZmZmOwotICAgICAgICAgICAgdWludDE2X3QgY29sb3IxID0gY29sb3JzID4+IDE2OwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgbmV3IGJsb2NrIGhhcyB0aGUgc2FtZSBiYXNlIGNvbG9ycyBhcyB0aGUKLSAgICAgICAgICAgIC8vIHByZXZpb3VzIG9uZSwgd2UgZG9uJ3QgbmVlZCB0byByZWNvbXB1dGUgdGhlIGNvbG9yCi0gICAgICAgICAgICAvLyB0YWJsZSBjW10KLSAgICAgICAgICAgIGlmIChjb2xvcjAgIT0gcHJldl9jb2xvcjAgfHwgY29sb3IxICE9IHByZXZfY29sb3IxKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RvcmUgcmF3IGNvbG9ycyBmb3IgY29tcGFyaXNvbiB3aXRoIG5leHQgYmxvY2sKLSAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMCA9IGNvbG9yMDsKLSAgICAgICAgICAgICAgICBwcmV2X2NvbG9yMSA9IGNvbG9yMTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpbnQgYmJpdHMgPSBiaXRzID4+IDE7Ci0gICAgICAgICAgICAgICAgYm9vbCBoYXMyID0gKChiYml0cyAmIH5iaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7Ci0gICAgICAgICAgICAgICAgYm9vbCBoYXMzID0gKChiYml0cyAmICBiaXRzKSAmIDB4NTU1NTU1NTUpICE9IDA7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGhhczIgfHwgaGFzMykgewotICAgICAgICAgICAgICAgICAgICBpbnQgcjAgPSAgIHJlZChjb2xvcjApOwotICAgICAgICAgICAgICAgICAgICBpbnQgZzAgPSBncmVlbihjb2xvcjApOwotICAgICAgICAgICAgICAgICAgICBpbnQgYjAgPSAgYmx1ZShjb2xvcjApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHIxID0gICByZWQoY29sb3IxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcxID0gZ3JlZW4oY29sb3IxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIxID0gIGJsdWUoY29sb3IxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50IHIyID0gYXZnMjMocjAsIHIxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcyID0gYXZnMjMoZzAsIGcxKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGIyID0gYXZnMjMoYjAsIGIxKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGludCByMyA9IGF2ZzIzKHIxLCByMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnMyA9IGF2ZzIzKGcxLCBnMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiMyA9IGF2ZzIzKGIxLCBiMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY1swXSA9IHJnYjU2NVNlcFRvODg4KHIwLCBnMCwgYjApOwotICAgICAgICAgICAgICAgICAgICBjWzFdID0gcmdiNTY1U2VwVG84ODgocjEsIGcxLCBiMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNbMl0gPSByZ2I1NjVTZXBUbzg4OChyMiwgZzIsIGIyKTsKLSAgICAgICAgICAgICAgICAgICAgY1szXSA9IHJnYjU2NVNlcFRvODg4KHIzLCBnMywgYjMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gOCBiaXRzCi0gICAgICAgICAgICAgICAgICAgIGNbMF0gPSByZ2I1NjVUbzg4OChjb2xvcjApOwotICAgICAgICAgICAgICAgICAgICBjWzFdID0gcmdiNTY1VG84ODgoY29sb3IxKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCogYmxvY2tSb3dQdHIgPSBibG9ja1B0cjsKLSAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgNDsgeSsrLCBibG9ja1Jvd1B0ciArPSBzdHJpZGUpIHsKLSAgICAgICAgICAgICAgICAvLyBEb24ndCBwcm9jZXNzIHJvd3MgcGFzdCB0aGUgYm90b20KLSAgICAgICAgICAgICAgICBpZiAoYmFzZV95ICsgeSA+PSBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGludCB3ID0gbWluKHdpZHRoIC0gYmFzZV94LCA0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgYWNvZGUgPSBhbHBoYSAmIDB4NzsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGEgPj49IDM7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBiaXRzICYgMHgzOwotICAgICAgICAgICAgICAgICAgICBiaXRzID4+PSAyOwotCi0gICAgICAgICAgICAgICAgICAgIGJsb2NrUm93UHRyW3hdID0gY1tjb2RlXSB8IChhW2Fjb2RlXSA8PCAyNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotICAgCi0vKgotICogRGVjb2RlIGEgRFhULWNvbXByZXNzZWQgdGV4dHVyZSBpbnRvIG1lbW9yeS4gIERYVCB0ZXh0dXJlcyBjb25zaXN0IG9mCi0gKiBhIHNlcmllcyBvZiA0eDQgcGl4ZWwgYmxvY2tzIGluIGxlZnQtdG8tcmlnaHQsIHRvcC1kb3duIG9yZGVyLgotICogVGhlIG51bWJlciBvZiBibG9ja3MgaXMgZ2l2ZW4gYnkgY2VpbCh3aWR0aC80KSpjZWlsKGhlaWdodC80KS4KLSAqCi0gKiAnZGF0YScgcG9pbnRzIHRvIHRoZSB0ZXh0dXJlIGRhdGEuICd3aWR0aCcgYW5kICdoZWlnaHQnIGluZGljYXRlIHRoZQotICogZGltZW5zaW9ucyBvZiB0aGUgdGV4dHVyZS4gIFdlIGFzc3VtZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSA+PSAwIGJ1dAotICogZG8gbm90IHJlcXVpcmUgdGhlbSB0byBiZSBwb3dlcnMgb2YgMiBvciBkaXZpc2libGUgYnkgYW55IGZhY3Rvci4KLSAqCi0gKiBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gJ3N1cmZhY2UnIHdpdGggZWFjaCBzY2FubGluZSBzZXBhcmF0ZWQgYnkKLSAqICdzdHJpZGUnIDItIG9yIDQtYnl0ZSB3b3Jkcy4KLSAqCi0gKiAnZm9ybWF0JyBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgY29tcHJlc3Npb24gYW5kIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOgotICogICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYXMgNS82LzUgb3BhcXVlIFJHQiAoMTYgYml0IHdvcmRzKS4KLSAqICAgICAgOCBieXRlcyBhcmUgcmVhZCBmcm9tICdkYXRhJyBmb3IgZWFjaCBibG9jay4KLSAqCi0gKiAgIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUCi0gKiAgICAgIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBhcyA1LzUvNS8xIFJHQkEgKDE2IGJpdCB3b3JkcykKLSAqICAgICAgOCBieXRlcyBhcmUgcmVhZCBmcm9tICdkYXRhJyBmb3IgZWFjaCBibG9jay4KLSAqCi0gKiAgIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUCi0gKiAgIEdMX0NPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUCi0gKiAgICAgIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBhcyA4LzgvOC84IEFSR0IgKDMyIGJpdCB3b3JkcykKLSAqICAgICAgMTYgYnl0ZXMgYXJlIHJlYWQgZnJvbSAnZGF0YScgZm9yIGVhY2ggYmxvY2suCi0gKi8KLXZvaWQKLWRlY29kZURYVChjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlLCBpbnQgZm9ybWF0KQotewotI2lmIFRJTUlORwotICAgIHN0cnVjdCB0aW1ldmFsIHN0YXJ0X3QsIGVuZF90OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICAKLSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0X3QsICZ0eik7Ci0jZW5kaWYKLQotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUOgotICAgICAgICBkZWNvZGVEWFQxKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN1cmZhY2UsIHN0cmlkZSwgZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDoKLSAgICAgICAgZGVjb2RlRFhUMShkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdXJmYWNlLCBzdHJpZGUsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDoKLSAgICAgICAgZGVjb2RlRFhUMyhkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdXJmYWNlLCBzdHJpZGUpOwotICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgY2FzZSBHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQ1X0VYVDoKLSAgICAgICAgZGVjb2RlRFhUNShkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdXJmYWNlLCBzdHJpZGUpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgCi0jaWYgVElNSU5HCi0gICAgZ2V0dGltZW9mZGF5KCZlbmRfdCwgJnR6KTsKLSAgICBsb25nIHVzZWMgPSAoZW5kX3QudHZfc2VjIC0gc3RhcnRfdC50dl9zZWMpKjEwMDAwMDAgKwotICAgICAgICAoZW5kX3QudHZfdXNlYyAtIHN0YXJ0X3QudHZfdXNlYyk7Ci0gICAgCi0gICAgcHJpbnRmKCJMb2FkZWQgdz0lZCBoPSVkIGluICVsZCB1c2VjXG4iLCB3aWR0aCwgaGVpZ2h0LCB1c2VjKTsKLSNlbmRpZgotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2R4dC5oIGIvb3BlbmdsL2xpYmFnbC9keHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1YTM2Yy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL2R4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9keHQuaAotKioKLSoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19URVhUVVJFX0gKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSAgYm9vbCBEWFQxSGFzQWxwaGEoY29uc3QgR0x2b2lkICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICB2b2lkIGRlY29kZURYVChjb25zdCBHTHZvaWQgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgdm9pZCAqc3VyZmFjZSwgaW50IHN0cmlkZSwgaW50IGZvcm1hdCk7Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDMyYTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA3OSArMCwwIEBACi0vKgotKioKLSoqIENvcHlyaWdodCAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dWkvQU5hdGl2ZU9iamVjdEJhc2UuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHBpeGVsZmxpbmdlci9mb3JtYXQuaD4KLSNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvcGl4ZWxmbGluZ2VyLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJ0ZXh0dXJlLmgiCi0jaW5jbHVkZSAibWF0cml4LmgiCi0KLSN1bmRlZiBORUxFTQotI2RlZmluZSBORUxFTSh4KSAoc2l6ZW9mKHgpL3NpemVvZigqKHgpKSkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIEVHTEFQSSBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAotICAgICAgICBFR0xpbnQgbGVmdCwgRUdMaW50IHRvcCwgRUdMaW50IHdpZHRoLCBFR0xpbnQgaGVpZ2h0KTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IHVuc2lnbmVkIGludCBOVU1fRElTUExBWVMgPSAxOwotCi1zdGF0aWMgcHRocmVhZF9tdXRleF90IGdJbml0TXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnRXJyb3JLZXlNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci1zdGF0aWMgcHRocmVhZF9rZXlfdCBnRUdMRXJyb3JLZXkgPSAtMTsKLSNpZm5kZWYgSEFWRV9BTkRST0lEX09TCi1uYW1lc3BhY2UgZ2wgewotcHRocmVhZF9rZXlfdCBnR0xLZXkgPSAtMTsKLX07IC8vIG5hbWVzcGFjZSBnbAotI2VuZGlmCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgVCBzZXRFcnJvcihHTGludCBlcnJvciwgVCByZXR1cm5WYWx1ZSkgewotICAgIGlmIChnZ2xfdW5saWtlbHkoZ0VHTEVycm9yS2V5ID09IC0xKSkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdFcnJvcktleU11dGV4KTsKLSAgICAgICAgaWYgKGdFR0xFcnJvcktleSA9PSAtMSkKLSAgICAgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ0VHTEVycm9yS2V5LCBOVUxMKTsKLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdFcnJvcktleU11dGV4KTsKLSAgICB9Ci0gICAgcHRocmVhZF9zZXRzcGVjaWZpYyhnRUdMRXJyb3JLZXksICh2b2lkKillcnJvcik7Ci0gICAgcmV0dXJuIHJldHVyblZhbHVlOwotfQotCi1zdGF0aWMgR0xpbnQgZ2V0RXJyb3IoKSB7Ci0gICAgaWYgKGdnbF91bmxpa2VseShnRUdMRXJyb3JLZXkgPT0gLTEpKQotICAgICAgICByZXR1cm4gRUdMX1NVQ0NFU1M7Ci0gICAgR0xpbnQgZXJyb3IgPSAoR0xpbnQpcHRocmVhZF9nZXRzcGVjaWZpYyhnRUdMRXJyb3JLZXkpOwotICAgIGlmIChlcnJvciA9PSAwKSB7Ci0gICAgICAgIC8vIFRoZSBUTFMga2V5IGhhcyBiZWVuIGNyZWF0ZWQgYnkgYW5vdGhlciB0aHJlYWQsIGJ1dCB0aGUgdmFsdWUgZm9yCi0gICAgICAgIC8vIHRoaXMgdGhyZWFkIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4KLSAgICAgICAgcmV0dXJuIEVHTF9TVUNDRVNTOwotICAgIH0KLSAgICBwdGhyZWFkX3NldHNwZWNpZmljKGdFR0xFcnJvcktleSwgKHZvaWQqKUVHTF9TVUNDRVNTKTsKLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9kaXNwbGF5X3QKLXsKLSAgICBlZ2xfZGlzcGxheV90KCkgOiB0eXBlKDApLCBpbml0aWFsaXplZCgwKSB7IH0KLQotICAgIHN0YXRpYyBlZ2xfZGlzcGxheV90JiBnZXRfZGlzcGxheShFR0xEaXNwbGF5IGRweSk7Ci0KLSAgICBzdGF0aWMgRUdMQm9vbGVhbiBpc192YWxpZChFR0xEaXNwbGF5IGRweSkgewotICAgICAgICByZXR1cm4gKCh1aW50cHRyX3QoZHB5KS0xVSkgPj0gTlVNX0RJU1BMQVlTKSA/IEVHTF9GQUxTRSA6IEVHTF9UUlVFOwotICAgIH0KLQotICAgIE5hdGl2ZURpc3BsYXlUeXBlICAgdHlwZTsKLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgIGluaXRpYWxpemVkOwotfTsKLQotc3RhdGljIGVnbF9kaXNwbGF5X3QgZ0Rpc3BsYXlzW05VTV9ESVNQTEFZU107Ci0KLWVnbF9kaXNwbGF5X3QmIGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgcmV0dXJuIGdEaXNwbGF5c1t1aW50cHRyX3QoZHB5KS0xVV07Ci19Ci0KLXN0cnVjdCBlZ2xfY29udGV4dF90IHsKLSAgICBlbnVtIHsKLSAgICAgICAgSVNfQ1VSUkVOVCAgICAgID0gICAweDAwMDEwMDAwLAotICAgICAgICBORVZFUl9DVVJSRU5UICAgPSAgIDB4MDAwMjAwMDAKLSAgICB9OwotICAgIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7Ci0gICAgRUdMRGlzcGxheSAgICAgICAgICBkcHk7Ci0gICAgRUdMQ29uZmlnICAgICAgICAgICBjb25maWc7Ci0gICAgRUdMU3VyZmFjZSAgICAgICAgICByZWFkOwotICAgIEVHTFN1cmZhY2UgICAgICAgICAgZHJhdzsKLQotICAgIHN0YXRpYyBpbmxpbmUgZWdsX2NvbnRleHRfdCogY29udGV4dChFR0xDb250ZXh0IGN0eCkgewotICAgICAgICBvZ2xlc19jb250ZXh0X3QqIGNvbnN0IGdsID0gc3RhdGljX2Nhc3Q8b2dsZXNfY29udGV4dF90Kj4oY3R4KTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGVnbF9jb250ZXh0X3QqPihnbC0+cmFzdGVyaXplci5iYXNlKTsKLSAgICB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBlZ2xfc3VyZmFjZV90Ci17Ci0gICAgZW51bSB7Ci0gICAgICAgIFBBR0VfRkxJUCA9IDB4MDAwMDAwMDEsCi0gICAgICAgIE1BR0lDICAgICA9IDB4MzE0MTUyNjUKLSAgICB9OwotCi0gICAgdWludDMyX3QgICAgICAgICAgICBtYWdpYzsKLSAgICBFR0xEaXNwbGF5ICAgICAgICAgIGRweTsKLSAgICBFR0xDb25maWcgICAgICAgICAgIGNvbmZpZzsKLSAgICBFR0xDb250ZXh0ICAgICAgICAgIGN0eDsKLQotICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGludDMyX3QgZGVwdGhGb3JtYXQpOwotICAgIHZpcnR1YWwgICAgIH5lZ2xfc3VyZmFjZV90KCk7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICBpc1ZhbGlkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCAgICAgYm9vbCAgICBpbml0Q2hlY2soKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCkgPSAwOwotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmRSZWFkU3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKSA9IDA7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgY29ubmVjdCgpIHsgcmV0dXJuIEVHTF9UUlVFOyB9Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZGlzY29ubmVjdCgpIHt9Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0V2lkdGgoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SGVpZ2h0KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRWZXJ0aWNhbFJlc29sdXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFN3YXBCZWhhdmlvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIHN3YXBCdWZmZXJzKCk7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgc2V0U3dhcFJlY3RhbmdsZShFR0xpbnQgbCwgRUdMaW50IHQsIEVHTGludCB3LCBFR0xpbnQgaCk7Ci1wcm90ZWN0ZWQ6Ci0gICAgR0dMU3VyZmFjZSAgICAgICAgICAgICAgZGVwdGg7Ci19OwotCi1lZ2xfc3VyZmFjZV90OjplZ2xfc3VyZmFjZV90KEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xDb25maWcgY29uZmlnLAotICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0KQotICAgIDogbWFnaWMoTUFHSUMpLCBkcHkoZHB5KSwgY29uZmlnKGNvbmZpZyksIGN0eCgwKQotewotICAgIGRlcHRoLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgZGVwdGguZGF0YSA9IDA7Ci0gICAgZGVwdGguZm9ybWF0ID0gZGVwdGhGb3JtYXQ7Ci19Ci1lZ2xfc3VyZmFjZV90Ojp+ZWdsX3N1cmZhY2VfdCgpCi17Ci0gICAgbWFnaWMgPSAwOwotICAgIGZyZWUoZGVwdGguZGF0YSk7Ci19Ci1ib29sIGVnbF9zdXJmYWNlX3Q6OmlzVmFsaWQoKSBjb25zdCB7Ci0gICAgQUxPR0VfSUYobWFnaWMgIT0gTUFHSUMsICJpbnZhbGlkIEVHTFN1cmZhY2UgKCVwKSIsIHRoaXMpOwotICAgIHJldHVybiBtYWdpYyA9PSBNQUdJQzsgCi19Ci0KLUVHTEJvb2xlYW4gZWdsX3N1cmZhY2VfdDo6c3dhcEJ1ZmZlcnMoKSB7Ci0gICAgcmV0dXJuIEVHTF9GQUxTRTsKLX0KLUVHTGludCBlZ2xfc3VyZmFjZV90OjpnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gKDAgKiBFR0xfRElTUExBWV9TQ0FMSU5HKSAqICgxLjBmIC8gMjUuNGYpOwotfQotRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gKDAgKiBFR0xfRElTUExBWV9TQ0FMSU5HKSAqICgxLjBmIC8gMjUuNGYpOwotfQotRUdMaW50IGVnbF9zdXJmYWNlX3Q6OmdldFJlZnJlc2hSYXRlKCkgY29uc3QgewotICAgIHJldHVybiAoNjAgKiBFR0xfRElTUExBWV9TQ0FMSU5HKTsKLX0KLUVHTGludCBlZ2xfc3VyZmFjZV90OjpnZXRTd2FwQmVoYXZpb3IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEVHTF9CVUZGRVJfUFJFU0VSVkVEOwotfQotRUdMQm9vbGVhbiBlZ2xfc3VyZmFjZV90OjpzZXRTd2FwUmVjdGFuZ2xlKAotICAgICAgICBFR0xpbnQgbCwgRUdMaW50IHQsIEVHTGludCB3LCBFR0xpbnQgaCkKLXsKLSAgICByZXR1cm4gRUdMX0ZBTFNFOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdCA6IHB1YmxpYyBlZ2xfc3VyZmFjZV90Ci17Ci0gICAgZWdsX3dpbmRvd19zdXJmYWNlX3YyX3QoCi0gICAgICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpOwotCi0gICAgfmVnbF93aW5kb3dfc3VyZmFjZV92Ml90KCk7Ci0KLSAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiB0cnVlOyB9IC8vIFRPRE86IHJlcG9ydCBmYWlsdXJlIGlmIGN0b3IgZmFpbHMKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBzd2FwQnVmZmVycygpOwotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIGJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKTsKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgY29ubmVjdCgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRXaWR0aCgpIGNvbnN0ICAgIHsgcmV0dXJuIHdpZHRoOyAgfQotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gaGVpZ2h0OyB9Ci0gICAgdmlydHVhbCAgICAgRUdMaW50ICAgICAgZ2V0SG9yaXpvbnRhbFJlc29sdXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRWZXJ0aWNhbFJlc29sdXRpb24oKSBjb25zdDsKLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRSZWZyZXNoUmF0ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFN3YXBCZWhhdmlvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgICAgIEVHTEJvb2xlYW4gIHNldFN3YXBSZWN0YW5nbGUoRUdMaW50IGwsIEVHTGludCB0LCBFR0xpbnQgdywgRUdMaW50IGgpOwotICAgIAotcHJpdmF0ZToKLSAgICBzdGF0dXNfdCBsb2NrKEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZiwgaW50IHVzYWdlLCB2b2lkKiogdmFkZHIpOwotICAgIHN0YXR1c190IHVubG9jayhBTmF0aXZlV2luZG93QnVmZmVyKiBidWYpOwotICAgIEFOYXRpdmVXaW5kb3cqICAgbmF0aXZlV2luZG93OwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqICAgYnVmZmVyOwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqICAgcHJldmlvdXNCdWZmZXI7Ci0gICAgZ3JhbGxvY19tb2R1bGVfdCBjb25zdCogICAgbW9kdWxlOwotICAgIGludCB3aWR0aDsKLSAgICBpbnQgaGVpZ2h0OwotICAgIHZvaWQqIGJpdHM7Ci0gICAgR0dMRm9ybWF0IGNvbnN0KiBwaXhlbEZvcm1hdFRhYmxlOwotICAgIAotICAgIHN0cnVjdCBSZWN0IHsKLSAgICAgICAgaW5saW5lIFJlY3QoKSB7IH07Ci0gICAgICAgIGlubGluZSBSZWN0KGludDMyX3QgdywgaW50MzJfdCBoKQotICAgICAgICAgICAgOiBsZWZ0KDApLCB0b3AoMCksIHJpZ2h0KHcpLCBib3R0b20oaCkgeyB9Ci0gICAgICAgIGlubGluZSBSZWN0KGludDMyX3QgbCwgaW50MzJfdCB0LCBpbnQzMl90IHIsIGludDMyX3QgYikKLSAgICAgICAgICAgIDogbGVmdChsKSwgdG9wKHQpLCByaWdodChyKSwgYm90dG9tKGIpIHsgfQotICAgICAgICBSZWN0JiBhbmRTZWxmKGNvbnN0IFJlY3QmIHIpIHsKLSAgICAgICAgICAgIGxlZnQgICA9IG1heChsZWZ0LCByLmxlZnQpOwotICAgICAgICAgICAgdG9wICAgID0gbWF4KHRvcCwgci50b3ApOwotICAgICAgICAgICAgcmlnaHQgID0gbWluKHJpZ2h0LCByLnJpZ2h0KTsKLSAgICAgICAgICAgIGJvdHRvbSA9IG1pbihib3R0b20sIHIuYm90dG9tKTsKLSAgICAgICAgICAgIHJldHVybiAqdGhpczsKLSAgICAgICAgfQotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKGxlZnQ+PXJpZ2h0IHx8IHRvcD49Ym90dG9tKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIGR1bXAoY2hhciBjb25zdCogd2hhdCkgewotICAgICAgICAgICAgQUxPR0QoIiVzIHsgJTVkLCAlNWQsIHc9JTVkLCBoPSU1ZCB9IiwKLSAgICAgICAgICAgICAgICAgICAgd2hhdCwgbGVmdCwgdG9wLCByaWdodC1sZWZ0LCBib3R0b20tdG9wKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50MzJfdCBsZWZ0OwotICAgICAgICBpbnQzMl90IHRvcDsKLSAgICAgICAgaW50MzJfdCByaWdodDsKLSAgICAgICAgaW50MzJfdCBib3R0b207Ci0gICAgfTsKLQotICAgIHN0cnVjdCBSZWdpb24gewotICAgICAgICBpbmxpbmUgUmVnaW9uKCkgOiBjb3VudCgwKSB7IH0KLSAgICAgICAgdHlwZWRlZiBSZWN0IGNvbnN0KiBjb25zdF9pdGVyYXRvcjsKLSAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBzdG9yYWdlOyB9Ci0gICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHN0b3JhZ2UrY291bnQ7IH0KLSAgICAgICAgc3RhdGljIFJlZ2lvbiBzdWJ0cmFjdChjb25zdCBSZWN0JiBsaHMsIGNvbnN0IFJlY3QmIHJocykgewotICAgICAgICAgICAgUmVnaW9uIHJlZzsKLSAgICAgICAgICAgIFJlY3QqIHN0b3JhZ2UgPSByZWcuc3RvcmFnZTsKLSAgICAgICAgICAgIGlmICghbGhzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmIChsaHMudG9wIDwgcmhzLnRvcCkgeyAvLyB0b3AgcmVjdAotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5sZWZ0ICAgPSBsaHMubGVmdDsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+dG9wICAgID0gbGhzLnRvcDsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+cmlnaHQgID0gbGhzLnJpZ2h0OwotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5ib3R0b20gPSByaHMudG9wOwotICAgICAgICAgICAgICAgICAgICBzdG9yYWdlKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdG9wID0gbWF4KGxocy50b3AsIHJocy50b3ApOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYm90ID0gbWluKGxocy5ib3R0b20sIHJocy5ib3R0b20pOwotICAgICAgICAgICAgICAgIGlmICh0b3AgPCBib3QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxocy5sZWZ0IDwgcmhzLmxlZnQpIHsgLy8gbGVmdC1zaWRlIHJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmxlZnQgICA9IGxocy5sZWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+dG9wICAgID0gdG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+cmlnaHQgID0gcmhzLmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlLT5ib3R0b20gPSBib3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxocy5yaWdodCA+IHJocy5yaWdodCkgeyAvLyByaWdodC1zaWRlIHJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmxlZnQgICA9IHJocy5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPnRvcCAgICA9IHRvcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPnJpZ2h0ICA9IGxocy5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPmJvdHRvbSA9IGJvdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGhzLmJvdHRvbSA+IHJocy5ib3R0b20pIHsgLy8gYm90dG9tIHJlY3QKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+bGVmdCAgID0gbGhzLmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPnRvcCAgICA9IHJocy5ib3R0b207Ci0gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UtPnJpZ2h0ICA9IGxocy5yaWdodDsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZS0+Ym90dG9tID0gbGhzLmJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZWcuY291bnQgPSBzdG9yYWdlIC0gcmVnLnN0b3JhZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVnOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiBjb3VudDw9MDsKLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIFJlY3Qgc3RvcmFnZVs0XTsKLSAgICAgICAgc3NpemVfdCBjb3VudDsKLSAgICB9OwotICAgIAotICAgIHZvaWQgY29weUJsdCgKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGRzdCwgdm9pZCogZHN0X3ZhZGRyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogc3JjLCB2b2lkIGNvbnN0KiBzcmNfdmFkZHIsCi0gICAgICAgICAgICBjb25zdCBSZWdpb24mIGNsaXApOwotCi0gICAgUmVjdCBkaXJ0eVJlZ2lvbjsKLSAgICBSZWN0IG9sZERpcnR5UmVnaW9uOwotfTsKLQotZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmVnbF93aW5kb3dfc3VyZmFjZV92Ml90KEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xDb25maWcgY29uZmlnLAotICAgICAgICBpbnQzMl90IGRlcHRoRm9ybWF0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpCi0gICAgOiBlZ2xfc3VyZmFjZV90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCksIAotICAgIG5hdGl2ZVdpbmRvdyh3aW5kb3cpLCBidWZmZXIoMCksIHByZXZpb3VzQnVmZmVyKDApLCBtb2R1bGUoMCksCi0gICAgYml0cyhOVUxMKQotewotICAgIGh3X21vZHVsZV90IGNvbnN0KiBwTW9kdWxlOwotICAgIGh3X2dldF9tb2R1bGUoR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsICZwTW9kdWxlKTsKLSAgICBtb2R1bGUgPSByZWludGVycHJldF9jYXN0PGdyYWxsb2NfbW9kdWxlX3QgY29uc3QqPihwTW9kdWxlKTsKLQotICAgIHBpeGVsRm9ybWF0VGFibGUgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7Ci0gICAgCi0gICAgLy8ga2VlcCBhIHJlZmVyZW5jZSBvbiB0aGUgd2luZG93Ci0gICAgbmF0aXZlV2luZG93LT5jb21tb24uaW5jUmVmKCZuYXRpdmVXaW5kb3ctPmNvbW1vbik7Ci0gICAgbmF0aXZlV2luZG93LT5xdWVyeShuYXRpdmVXaW5kb3csIE5BVElWRV9XSU5ET1dfV0lEVEgsICZ3aWR0aCk7Ci0gICAgbmF0aXZlV2luZG93LT5xdWVyeShuYXRpdmVXaW5kb3csIE5BVElWRV9XSU5ET1dfSEVJR0hULCAmaGVpZ2h0KTsKLX0KLQotZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6On5lZ2xfd2luZG93X3N1cmZhY2VfdjJfdCgpIHsKLSAgICBpZiAoYnVmZmVyKSB7Ci0gICAgICAgIGJ1ZmZlci0+Y29tbW9uLmRlY1JlZigmYnVmZmVyLT5jb21tb24pOwotICAgIH0KLSAgICBpZiAocHJldmlvdXNCdWZmZXIpIHsKLSAgICAgICAgcHJldmlvdXNCdWZmZXItPmNvbW1vbi5kZWNSZWYoJnByZXZpb3VzQnVmZmVyLT5jb21tb24pOyAKLSAgICB9Ci0gICAgbmF0aXZlV2luZG93LT5jb21tb24uZGVjUmVmKCZuYXRpdmVXaW5kb3ctPmNvbW1vbik7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmNvbm5lY3QoKSAKLXsKLSAgICAvLyB3ZSdyZSBpbnRlbmRpbmcgdG8gZG8gc29mdHdhcmUgcmVuZGVyaW5nCi0gICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobmF0aXZlV2luZG93LCAKLSAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4pOwotCi0gICAgLy8gZGVxdWV1ZSBhIGJ1ZmZlcgotICAgIGlmIChuYXRpdmVXaW5kb3ctPmRlcXVldWVCdWZmZXIobmF0aXZlV2luZG93LCAmYnVmZmVyKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICAvLyBhbGxvY2F0ZSBhIGNvcnJlc3BvbmRpbmcgZGVwdGgtYnVmZmVyCi0gICAgd2lkdGggPSBidWZmZXItPndpZHRoOwotICAgIGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OwotICAgIGlmIChkZXB0aC5mb3JtYXQpIHsKLSAgICAgICAgZGVwdGgud2lkdGggICA9IHdpZHRoOwotICAgICAgICBkZXB0aC5oZWlnaHQgID0gaGVpZ2h0OwotICAgICAgICBkZXB0aC5zdHJpZGUgID0gZGVwdGgud2lkdGg7IC8vIHVzZSB0aGUgd2lkdGggaGVyZQotICAgICAgICBkZXB0aC5kYXRhICAgID0gKEdHTHVieXRlKiltYWxsb2MoZGVwdGguc3RyaWRlKmRlcHRoLmhlaWdodCoyKTsKLSAgICAgICAgaWYgKGRlcHRoLmRhdGEgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9GQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSBidWZmZXIKLSAgICBidWZmZXItPmNvbW1vbi5pbmNSZWYoJmJ1ZmZlci0+Y29tbW9uKTsKLQotICAgIC8vIExvY2sgdGhlIGJ1ZmZlcgotICAgIG5hdGl2ZVdpbmRvdy0+bG9ja0J1ZmZlcihuYXRpdmVXaW5kb3csIGJ1ZmZlcik7Ci0gICAgLy8gcGluIHRoZSBidWZmZXIgZG93bgotICAgIGlmIChsb2NrKGJ1ZmZlciwgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmYml0cykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImNvbm5lY3QoKSBmYWlsZWQgdG8gbG9jayBidWZmZXIgJXAgKCV1eCV1KSIsCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCk7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKLSAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBtYWtlIHN1cmUgd2UncmUgbm90IGFjY2Vzc2luZyB0aGUgYnVmZmVyIGFueW1vcmUKLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi12b2lkIGVnbF93aW5kb3dfc3VyZmFjZV92Ml90OjpkaXNjb25uZWN0KCkgCi17Ci0gICAgaWYgKGJ1ZmZlciAmJiBiaXRzKSB7Ci0gICAgICAgIGJpdHMgPSBOVUxMOwotICAgICAgICB1bmxvY2soYnVmZmVyKTsKLSAgICB9Ci0gICAgLy8gZW5xdWV1ZSB0aGUgbGFzdCBmcmFtZQotICAgIG5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobmF0aXZlV2luZG93LCBidWZmZXIpOwotICAgIGlmIChidWZmZXIpIHsKLSAgICAgICAgYnVmZmVyLT5jb21tb24uZGVjUmVmKCZidWZmZXItPmNvbW1vbik7Ci0gICAgICAgIGJ1ZmZlciA9IDA7Ci0gICAgfQotICAgIGlmIChwcmV2aW91c0J1ZmZlcikgewotICAgICAgICBwcmV2aW91c0J1ZmZlci0+Y29tbW9uLmRlY1JlZigmcHJldmlvdXNCdWZmZXItPmNvbW1vbik7IAotICAgICAgICBwcmV2aW91c0J1ZmZlciA9IDA7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6bG9jaygKLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmLCBpbnQgdXNhZ2UsIHZvaWQqKiB2YWRkcikKLXsKLSAgICBpbnQgZXJyOwotCi0gICAgZXJyID0gbW9kdWxlLT5sb2NrKG1vZHVsZSwgYnVmLT5oYW5kbGUsCi0gICAgICAgICAgICB1c2FnZSwgMCwgMCwgYnVmLT53aWR0aCwgYnVmLT5oZWlnaHQsIHZhZGRyKTsKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90Ojp1bmxvY2soQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmKQotewotICAgIGlmICghYnVmKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGludCBlcnIgPSBOT19FUlJPUjsKLQotICAgIGVyciA9IG1vZHVsZS0+dW5sb2NrKG1vZHVsZSwgYnVmLT5oYW5kbGUpOwotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6Y29weUJsdCgKLSAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogZHN0LCB2b2lkKiBkc3RfdmFkZHIsCi0gICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIHNyYywgdm9pZCBjb25zdCogc3JjX3ZhZGRyLAotICAgICAgICBjb25zdCBSZWdpb24mIGNsaXApCi17Ci0gICAgLy8gTk9URTogZHN0IGFuZCBzcmMgbXVzdCBiZSB0aGUgc2FtZSBmb3JtYXQKLSAgICAKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGN1ciA9IGNsaXAuYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGNsaXAuZW5kKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgYnBwID0gcGl4ZWxGb3JtYXRUYWJsZVtzcmMtPmZvcm1hdF0uc2l6ZTsKLSAgICBjb25zdCBzaXplX3QgZGJwciA9IGRzdC0+c3RyaWRlICogYnBwOwotICAgIGNvbnN0IHNpemVfdCBzYnByID0gc3JjLT5zdHJpZGUgKiBicHA7Ci0KLSAgICB1aW50OF90IGNvbnN0ICogY29uc3Qgc3JjX2JpdHMgPSAodWludDhfdCBjb25zdCAqKXNyY192YWRkcjsKLSAgICB1aW50OF90ICAgICAgICogY29uc3QgZHN0X2JpdHMgPSAodWludDhfdCAgICAgICAqKWRzdF92YWRkcjsKLQotICAgIHdoaWxlIChjdXIgIT0gZW5kKSB7Ci0gICAgICAgIGNvbnN0IFJlY3QmIHIoKmN1cisrKTsKLSAgICAgICAgc3NpemVfdCB3ID0gci5yaWdodCAtIHIubGVmdDsKLSAgICAgICAgc3NpemVfdCBoID0gci5ib3R0b20gLSByLnRvcDsKLSAgICAgICAgaWYgKHcgPD0gMCB8fCBoPD0wKSBjb250aW51ZTsKLSAgICAgICAgc2l6ZV90IHNpemUgPSB3ICogYnBwOwotICAgICAgICB1aW50OF90IGNvbnN0ICogcyA9IHNyY19iaXRzICsgKHIubGVmdCArIHNyYy0+c3RyaWRlICogci50b3ApICogYnBwOwotICAgICAgICB1aW50OF90ICAgICAgICogZCA9IGRzdF9iaXRzICsgKHIubGVmdCArIGRzdC0+c3RyaWRlICogci50b3ApICogYnBwOwotICAgICAgICBpZiAoZGJwcj09c2JwciAmJiBzaXplPT1zYnByKSB7Ci0gICAgICAgICAgICBzaXplICo9IGg7Ci0gICAgICAgICAgICBoID0gMTsKLSAgICAgICAgfQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBtZW1jcHkoZCwgcywgc2l6ZSk7Ci0gICAgICAgICAgICBkICs9IGRicHI7Ci0gICAgICAgICAgICBzICs9IHNicHI7Ci0gICAgICAgIH0gd2hpbGUgKC0taCA+IDApOwotICAgIH0KLX0KLQotRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6c3dhcEJ1ZmZlcnMoKQotewotICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FDQ0VTUywgRUdMX0ZBTFNFKTsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBIYW5kbGUgZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQoKQotICAgICAqIFdlIGNvcHliYWNrIGZyb20gdGhlIGZyb250IGJ1ZmZlciAKLSAgICAgKi8KLSAgICBpZiAoIWRpcnR5UmVnaW9uLmlzRW1wdHkoKSkgewotICAgICAgICBkaXJ0eVJlZ2lvbi5hbmRTZWxmKFJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpKTsKLSAgICAgICAgaWYgKHByZXZpb3VzQnVmZmVyKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdhcyBjb25zdCBSZWdpb24gY29weUJhY2ssIGJ1dCB0aGF0IGNhdXNlcyBhbgotICAgICAgICAgICAgLy8gaW50ZXJuYWwgY29tcGlsZSBlcnJvciBvbiBzaW11bGF0b3IgYnVpbGRzCi0gICAgICAgICAgICAvKmNvbnN0Ki8gUmVnaW9uIGNvcHlCYWNrKFJlZ2lvbjo6c3VidHJhY3Qob2xkRGlydHlSZWdpb24sIGRpcnR5UmVnaW9uKSk7Ci0gICAgICAgICAgICBpZiAoIWNvcHlCYWNrLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHZvaWQqIHByZXZCaXRzOwotICAgICAgICAgICAgICAgIGlmIChsb2NrKHByZXZpb3VzQnVmZmVyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiwgJnByZXZCaXRzKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IGZyb20gcHJldmlvdXNCdWZmZXIgdG8gYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgIGNvcHlCbHQoYnVmZmVyLCBiaXRzLCBwcmV2aW91c0J1ZmZlciwgcHJldkJpdHMsIGNvcHlCYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgdW5sb2NrKHByZXZpb3VzQnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb2xkRGlydHlSZWdpb24gPSBkaXJ0eVJlZ2lvbjsKLSAgICB9Ci0KLSAgICBpZiAocHJldmlvdXNCdWZmZXIpIHsKLSAgICAgICAgcHJldmlvdXNCdWZmZXItPmNvbW1vbi5kZWNSZWYoJnByZXZpb3VzQnVmZmVyLT5jb21tb24pOyAKLSAgICAgICAgcHJldmlvdXNCdWZmZXIgPSAwOwotICAgIH0KLSAgICAKLSAgICB1bmxvY2soYnVmZmVyKTsKLSAgICBwcmV2aW91c0J1ZmZlciA9IGJ1ZmZlcjsKLSAgICBuYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG5hdGl2ZVdpbmRvdywgYnVmZmVyKTsKLSAgICBidWZmZXIgPSAwOwotCi0gICAgLy8gZGVxdWV1ZSBhIG5ldyBidWZmZXIKLSAgICBpZiAobmF0aXZlV2luZG93LT5kZXF1ZXVlQnVmZmVyKG5hdGl2ZVdpbmRvdywgJmJ1ZmZlcikgPT0gTk9fRVJST1IpIHsKLQotICAgICAgICAvLyBUT0RPOiBsb2NrQnVmZmVyIHNob3VsZCByYXRoZXIgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgdmVyeSBmaXJzdAotICAgICAgICAvLyBkaXJlY3QgcmVuZGVyaW5nIG9jY3Vycy4KLSAgICAgICAgbmF0aXZlV2luZG93LT5sb2NrQnVmZmVyKG5hdGl2ZVdpbmRvdywgYnVmZmVyKTsKLQotICAgICAgICAvLyByZWFsbG9jYXRlIHRoZSBkZXB0aC1idWZmZXIgaWYgbmVlZGVkCi0gICAgICAgIGlmICgod2lkdGggIT0gYnVmZmVyLT53aWR0aCkgfHwgKGhlaWdodCAhPSBidWZmZXItPmhlaWdodCkpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHdlIHByb2JhYmx5IHNob3VsZCByZXNldCB0aGUgc3dhcCByZWN0IGhlcmUKLSAgICAgICAgICAgIC8vIGlmIHRoZSB3aW5kb3cgc2l6ZSBoYXMgY2hhbmdlZAotICAgICAgICAgICAgd2lkdGggPSBidWZmZXItPndpZHRoOwotICAgICAgICAgICAgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7Ci0gICAgICAgICAgICBpZiAoZGVwdGguZGF0YSkgewotICAgICAgICAgICAgICAgIGZyZWUoZGVwdGguZGF0YSk7Ci0gICAgICAgICAgICAgICAgZGVwdGgud2lkdGggICA9IHdpZHRoOwotICAgICAgICAgICAgICAgIGRlcHRoLmhlaWdodCAgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgZGVwdGguc3RyaWRlICA9IGJ1ZmZlci0+c3RyaWRlOwotICAgICAgICAgICAgICAgIGRlcHRoLmRhdGEgICAgPSAoR0dMdWJ5dGUqKW1hbGxvYyhkZXB0aC5zdHJpZGUqZGVwdGguaGVpZ2h0KjIpOwotICAgICAgICAgICAgICAgIGlmIChkZXB0aC5kYXRhID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX0ZBTFNFKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBrZWVwIGEgcmVmZXJlbmNlIG9uIHRoZSBidWZmZXIKLSAgICAgICAgYnVmZmVyLT5jb21tb24uaW5jUmVmKCZidWZmZXItPmNvbW1vbik7Ci0KLSAgICAgICAgLy8gZmluYWxseSBwaW4gdGhlIGJ1ZmZlciBkb3duCi0gICAgICAgIGlmIChsb2NrKGJ1ZmZlciwgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwKLSAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmYml0cykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlZ2xTd2FwQnVmZmVycygpIGZhaWxlZCB0byBsb2NrIGJ1ZmZlciAlcCAoJXV4JXUpIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCk7Ci0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BQ0NFU1MsIEVHTF9GQUxTRSk7Ci0gICAgICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWNjZXNzaW5nIHRoZSBidWZmZXIgYW55bW9yZQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6c2V0U3dhcFJlY3RhbmdsZSgKLSAgICAgICAgRUdMaW50IGwsIEVHTGludCB0LCBFR0xpbnQgdywgRUdMaW50IGgpCi17Ci0gICAgZGlydHlSZWdpb24gPSBSZWN0KGwsIHQsIGwrdywgdCtoKTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmJpbmREcmF3U3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQotewotICAgIEdHTFN1cmZhY2UgYnVmZmVyOwotICAgIGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgIGJ1ZmZlci53aWR0aCAgID0gdGhpcy0+YnVmZmVyLT53aWR0aDsKLSAgICBidWZmZXIuaGVpZ2h0ICA9IHRoaXMtPmJ1ZmZlci0+aGVpZ2h0OwotICAgIGJ1ZmZlci5zdHJpZGUgID0gdGhpcy0+YnVmZmVyLT5zdHJpZGU7Ci0gICAgYnVmZmVyLmRhdGEgICAgPSAoR0dMdWJ5dGUqKWJpdHM7Ci0gICAgYnVmZmVyLmZvcm1hdCAgPSB0aGlzLT5idWZmZXItPmZvcm1hdDsKLSAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5jb2xvckJ1ZmZlcihnbCwgJmJ1ZmZlcik7Ci0gICAgaWYgKGRlcHRoLmRhdGEgIT0gZ2wtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5kZXB0aC5kYXRhKQotICAgICAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5kZXB0aEJ1ZmZlcihnbCwgJmRlcHRoKTsKLQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLUVHTEJvb2xlYW4gZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmJpbmRSZWFkU3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQotewotICAgIEdHTFN1cmZhY2UgYnVmZmVyOwotICAgIGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgIGJ1ZmZlci53aWR0aCAgID0gdGhpcy0+YnVmZmVyLT53aWR0aDsKLSAgICBidWZmZXIuaGVpZ2h0ICA9IHRoaXMtPmJ1ZmZlci0+aGVpZ2h0OwotICAgIGJ1ZmZlci5zdHJpZGUgID0gdGhpcy0+YnVmZmVyLT5zdHJpZGU7Ci0gICAgYnVmZmVyLmRhdGEgICAgPSAoR0dMdWJ5dGUqKWJpdHM7IC8vIEZJWE1FOiBob3BlZnVsbHkgaXMgaXMgTE9DS0VEISEhCi0gICAgYnVmZmVyLmZvcm1hdCAgPSB0aGlzLT5idWZmZXItPmZvcm1hdDsKLSAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5yZWFkQnVmZmVyKGdsLCAmYnVmZmVyKTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci1FR0xpbnQgZWdsX3dpbmRvd19zdXJmYWNlX3YyX3Q6OmdldEhvcml6b250YWxSZXNvbHV0aW9uKCkgY29uc3QgewotICAgIHJldHVybiAobmF0aXZlV2luZG93LT54ZHBpICogRUdMX0RJU1BMQVlfU0NBTElORykgKiAoMS4wZiAvIDI1LjRmKTsKLX0KLUVHTGludCBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6Z2V0VmVydGljYWxSZXNvbHV0aW9uKCkgY29uc3QgewotICAgIHJldHVybiAobmF0aXZlV2luZG93LT55ZHBpICogRUdMX0RJU1BMQVlfU0NBTElORykgKiAoMS4wZiAvIDI1LjRmKTsKLX0KLUVHTGludCBlZ2xfd2luZG93X3N1cmZhY2VfdjJfdDo6Z2V0UmVmcmVzaFJhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuICg2MCAqIEVHTF9ESVNQTEFZX1NDQUxJTkcpOyAvLyBGSVhNRQotfQotRUdMaW50IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90OjpnZXRTd2FwQmVoYXZpb3IoKSBjb25zdCAKLXsKLSAgICAvKgotICAgICAqIEVHTF9CVUZGRVJfUFJFU0VSVkVEIG1lYW5zIHRoYXQgZWdsU3dhcEJ1ZmZlcnMoKSBjb21wbGV0ZWx5IHByZXNlcnZlcwotICAgICAqIHRoZSBjb250ZW50IG9mIHRoZSBzd2FwcGVkIGJ1ZmZlci4KLSAgICAgKiAKLSAgICAgKiBFR0xfQlVGRkVSX0RFU1RST1lFRCBtZWFucyB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBidWZmZXIgaXMgbG9zdC4KLSAgICAgKiAKLSAgICAgKiBIb3dldmVyIHdoZW4gQU5EUk9JRF9zd2FwX3JldGNhbmdsZSBpcyBzdXBwb3J0ZWQsIEVHTF9CVUZGRVJfREVTVFJPWUVECi0gICAgICogb25seSBhcHBsaWVzIHRvIHRoZSBhcmVhIHNwZWNpZmllZCBieSBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCgpLCB0aGF0Ci0gICAgICogaXMsIGV2ZXJ5dGhpbmcgb3V0c2lkZSBvZiB0aGlzIGFyZWEgaXMgcHJlc2VydmVkLgotICAgICAqIAotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgRUdMIGFzc3VtZXMgdGhlIGxhdGVyIGNhc2UuCi0gICAgICogCi0gICAgICovCi0KLSAgICByZXR1cm4gRUdMX0JVRkZFUl9ERVNUUk9ZRUQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9waXhtYXBfc3VyZmFjZV90IDogcHVibGljIGVnbF9zdXJmYWNlX3QKLXsKLSAgICBlZ2xfcGl4bWFwX3N1cmZhY2VfdCgKLSAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCwKLSAgICAgICAgICAgIGVnbF9uYXRpdmVfcGl4bWFwX3QgY29uc3QgKiBwaXhtYXApOwotCi0gICAgdmlydHVhbCB+ZWdsX3BpeG1hcF9zdXJmYWNlX3QoKSB7IH0KLQotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuICFkZXB0aC5mb3JtYXQgfHwgZGVwdGguZGF0YSE9MDsgfSAKLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpOwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFdpZHRoKCkgY29uc3QgICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLndpZHRoOyAgfQotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldEhlaWdodCgpIGNvbnN0ICAgeyByZXR1cm4gbmF0aXZlUGl4bWFwLmhlaWdodDsgfQotcHJpdmF0ZToKLSAgICBlZ2xfbmF0aXZlX3BpeG1hcF90ICAgICBuYXRpdmVQaXhtYXA7Ci19OwotCi1lZ2xfcGl4bWFwX3N1cmZhY2VfdDo6ZWdsX3BpeG1hcF9zdXJmYWNlX3QoRUdMRGlzcGxheSBkcHksCi0gICAgICAgIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIGludDMyX3QgZGVwdGhGb3JtYXQsCi0gICAgICAgIGVnbF9uYXRpdmVfcGl4bWFwX3QgY29uc3QgKiBwaXhtYXApCi0gICAgOiBlZ2xfc3VyZmFjZV90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCksIG5hdGl2ZVBpeG1hcCgqcGl4bWFwKQotewotICAgIGlmIChkZXB0aEZvcm1hdCkgewotICAgICAgICBkZXB0aC53aWR0aCAgID0gcGl4bWFwLT53aWR0aDsKLSAgICAgICAgZGVwdGguaGVpZ2h0ICA9IHBpeG1hcC0+aGVpZ2h0OwotICAgICAgICBkZXB0aC5zdHJpZGUgID0gZGVwdGgud2lkdGg7IC8vIHVzZSB0aGUgd2lkdGggaGVyZQotICAgICAgICBkZXB0aC5kYXRhICAgID0gKEdHTHVieXRlKiltYWxsb2MoZGVwdGguc3RyaWRlKmRlcHRoLmhlaWdodCoyKTsKLSAgICAgICAgaWYgKGRlcHRoLmRhdGEgPT0gMCkgewotICAgICAgICAgICAgc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX05PX1NVUkZBQ0UpOwotICAgICAgICB9Ci0gICAgfQotfQotRUdMQm9vbGVhbiBlZ2xfcGl4bWFwX3N1cmZhY2VfdDo6YmluZERyYXdTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCi17Ci0gICAgR0dMU3VyZmFjZSBidWZmZXI7Ci0gICAgYnVmZmVyLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7Ci0gICAgYnVmZmVyLndpZHRoICAgPSBuYXRpdmVQaXhtYXAud2lkdGg7Ci0gICAgYnVmZmVyLmhlaWdodCAgPSBuYXRpdmVQaXhtYXAuaGVpZ2h0OwotICAgIGJ1ZmZlci5zdHJpZGUgID0gbmF0aXZlUGl4bWFwLnN0cmlkZTsKLSAgICBidWZmZXIuZGF0YSAgICA9IG5hdGl2ZVBpeG1hcC5kYXRhOwotICAgIGJ1ZmZlci5mb3JtYXQgID0gbmF0aXZlUGl4bWFwLmZvcm1hdDsKLQotICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yQnVmZmVyKGdsLCAmYnVmZmVyKTsKLSAgICBpZiAoZGVwdGguZGF0YSAhPSBnbC0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmRlcHRoLmRhdGEpCi0gICAgICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoQnVmZmVyKGdsLCAmZGVwdGgpOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLUVHTEJvb2xlYW4gZWdsX3BpeG1hcF9zdXJmYWNlX3Q6OmJpbmRSZWFkU3VyZmFjZShvZ2xlc19jb250ZXh0X3QqIGdsKQotewotICAgIEdHTFN1cmZhY2UgYnVmZmVyOwotICAgIGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgIGJ1ZmZlci53aWR0aCAgID0gbmF0aXZlUGl4bWFwLndpZHRoOwotICAgIGJ1ZmZlci5oZWlnaHQgID0gbmF0aXZlUGl4bWFwLmhlaWdodDsKLSAgICBidWZmZXIuc3RyaWRlICA9IG5hdGl2ZVBpeG1hcC5zdHJpZGU7Ci0gICAgYnVmZmVyLmRhdGEgICAgPSBuYXRpdmVQaXhtYXAuZGF0YTsKLSAgICBidWZmZXIuZm9ybWF0ICA9IG5hdGl2ZVBpeG1hcC5mb3JtYXQ7Ci0gICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MucmVhZEJ1ZmZlcihnbCwgJmJ1ZmZlcik7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QgOiBwdWJsaWMgZWdsX3N1cmZhY2VfdAotewotICAgIGVnbF9wYnVmZmVyX3N1cmZhY2VfdCgKLSAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBpbnQzMl90IGRlcHRoRm9ybWF0LAotICAgICAgICAgICAgaW50MzJfdCB3LCBpbnQzMl90IGgsIGludDMyX3QgZik7Ci0KLSAgICB2aXJ0dWFsIH5lZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoKTsKLQotICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGluaXRDaGVjaygpIGNvbnN0ICAgeyByZXR1cm4gcGJ1ZmZlci5kYXRhICE9IDA7IH0KLSAgICB2aXJ0dWFsICAgICBFR0xCb29sZWFuICBiaW5kRHJhd1N1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCk7Ci0gICAgdmlydHVhbCAgICAgRUdMQm9vbGVhbiAgYmluZFJlYWRTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpOwotICAgIHZpcnR1YWwgICAgIEVHTGludCAgICAgIGdldFdpZHRoKCkgY29uc3QgICAgeyByZXR1cm4gcGJ1ZmZlci53aWR0aDsgIH0KLSAgICB2aXJ0dWFsICAgICBFR0xpbnQgICAgICBnZXRIZWlnaHQoKSBjb25zdCAgIHsgcmV0dXJuIHBidWZmZXIuaGVpZ2h0OyB9Ci1wcml2YXRlOgotICAgIEdHTFN1cmZhY2UgIHBidWZmZXI7Ci19OwotCi1lZ2xfcGJ1ZmZlcl9zdXJmYWNlX3Q6OmVnbF9wYnVmZmVyX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywgaW50MzJfdCBkZXB0aEZvcm1hdCwKLSAgICAgICAgaW50MzJfdCB3LCBpbnQzMl90IGgsIGludDMyX3QgZikKLSAgICA6IGVnbF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0KQotewotICAgIHNpemVfdCBzaXplID0gdypoOwotICAgIHN3aXRjaCAoZikgewotICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfQV84OiAgICAgICAgICBzaXplICo9IDE7IGJyZWFrOwotICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTogICAgICBzaXplICo9IDI7IGJyZWFrOwotICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OiAgICBzaXplICo9IDQ7IGJyZWFrOwotICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OiAgICBzaXplICo9IDQ7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImluY29tcGF0aWJsZSBwaXhlbCBmb3JtYXQgZm9yIHBidWZmZXIgKGZvcm1hdD0lZCkiLCBmKTsKLSAgICAgICAgICAgIHBidWZmZXIuZGF0YSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcGJ1ZmZlci52ZXJzaW9uID0gc2l6ZW9mKEdHTFN1cmZhY2UpOwotICAgIHBidWZmZXIud2lkdGggICA9IHc7Ci0gICAgcGJ1ZmZlci5oZWlnaHQgID0gaDsKLSAgICBwYnVmZmVyLnN0cmlkZSAgPSB3OwotICAgIHBidWZmZXIuZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKHNpemUpOwotICAgIHBidWZmZXIuZm9ybWF0ICA9IGY7Ci0KLSAgICBpZiAoZGVwdGhGb3JtYXQpIHsKLSAgICAgICAgZGVwdGgud2lkdGggICA9IHBidWZmZXIud2lkdGg7Ci0gICAgICAgIGRlcHRoLmhlaWdodCAgPSBwYnVmZmVyLmhlaWdodDsKLSAgICAgICAgZGVwdGguc3RyaWRlICA9IGRlcHRoLndpZHRoOyAvLyB1c2UgdGhlIHdpZHRoIGhlcmUKLSAgICAgICAgZGVwdGguZGF0YSAgICA9IChHR0x1Ynl0ZSopbWFsbG9jKGRlcHRoLnN0cmlkZSpkZXB0aC5oZWlnaHQqMik7Ci0gICAgICAgIGlmIChkZXB0aC5kYXRhID09IDApIHsKLSAgICAgICAgICAgIHNldEVycm9yKEVHTF9CQURfQUxMT0MsIEVHTF9OT19TVVJGQUNFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLX0KLWVnbF9wYnVmZmVyX3N1cmZhY2VfdDo6fmVnbF9wYnVmZmVyX3N1cmZhY2VfdCgpIHsKLSAgICBmcmVlKHBidWZmZXIuZGF0YSk7Ci19Ci1FR0xCb29sZWFuIGVnbF9wYnVmZmVyX3N1cmZhY2VfdDo6YmluZERyYXdTdXJmYWNlKG9nbGVzX2NvbnRleHRfdCogZ2wpCi17Ci0gICAgZ2wtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JCdWZmZXIoZ2wsICZwYnVmZmVyKTsKLSAgICBpZiAoZGVwdGguZGF0YSAhPSBnbC0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmRlcHRoLmRhdGEpCi0gICAgICAgIGdsLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoQnVmZmVyKGdsLCAmZGVwdGgpOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLUVHTEJvb2xlYW4gZWdsX3BidWZmZXJfc3VyZmFjZV90OjpiaW5kUmVhZFN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBnbCkKLXsKLSAgICBnbC0+cmFzdGVyaXplci5wcm9jcy5yZWFkQnVmZmVyKGdsLCAmcGJ1ZmZlcik7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBjb25maWdfcGFpcl90IHsKLSAgICBHTGludCBrZXk7Ci0gICAgR0xpbnQgdmFsdWU7Ci19OwotCi1zdHJ1Y3QgY29uZmlnc190IHsKLSAgICBjb25zdCBjb25maWdfcGFpcl90KiBhcnJheTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBzaXplOwotfTsKLQotc3RydWN0IGNvbmZpZ19tYW5hZ2VtZW50X3QgewotICAgIEdMaW50IGtleTsKLSAgICBib29sICgqbWF0Y2gpKEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpOwotICAgIHN0YXRpYyBib29sIGF0TGVhc3QoR0xpbnQgcmVxVmFsdWUsIEdMaW50IGNvbmZWYWx1ZSkgewotICAgICAgICByZXR1cm4gKHJlcVZhbHVlID09IEVHTF9ET05UX0NBUkUpIHx8IChjb25mVmFsdWUgPj0gcmVxVmFsdWUpOwotICAgIH0KLSAgICBzdGF0aWMgYm9vbCBleGFjdChHTGludCByZXFWYWx1ZSwgR0xpbnQgY29uZlZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAocmVxVmFsdWUgPT0gRUdMX0RPTlRfQ0FSRSkgfHwgKGNvbmZWYWx1ZSA9PSByZXFWYWx1ZSk7Ci0gICAgfQotICAgIHN0YXRpYyBib29sIG1hc2soR0xpbnQgcmVxVmFsdWUsIEdMaW50IGNvbmZWYWx1ZSkgewotICAgICAgICByZXR1cm4gKGNvbmZWYWx1ZSAmIHJlcVZhbHVlKSA9PSByZXFWYWx1ZTsKLSAgICB9Ci0gICAgc3RhdGljIGJvb2wgaWdub3JlKEdMaW50IHJlcVZhbHVlLCBHTGludCBjb25mVmFsdWUpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIFZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBWRVJTSU9OX01JTk9SIDIKLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlbmRvclN0cmluZyAgICAgPSAiR29vZ2xlIEluYy4iOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICIxLjIgQW5kcm9pZCBEcml2ZXIgMS4yLjAiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnQ2xpZW50QXBpU3RyaW5nICA9ICJPcGVuR0wgRVMiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnRXh0ZW5zaW9uc1N0cmluZyA9Ci0gICAgICAgICJFR0xfS0hSX2ltYWdlX2Jhc2UgIgotICAgICAgICAvLyAiS0hSX2ltYWdlX3BpeG1hcCAiCi0gICAgICAgICJFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyICIKLSAgICAgICAgIkVHTF9BTkRST0lEX3N3YXBfcmVjdGFuZ2xlICIKLSAgICAgICAgOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBleHRlbnRpb25fbWFwX3QgewotICAgIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lOwotICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgYWRkcmVzczsKLX07Ci0KLXN0YXRpYyBjb25zdCBleHRlbnRpb25fbWFwX3QgZ0V4dGVudGlvbk1hcFtdID0gewotICAgIHsgImdsRHJhd1RleHNPRVMiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsRHJhd1RleHNPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhpT0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbERyYXdUZXhpT0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4Zk9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4Zk9FUyB9LAotICAgIHsgImdsRHJhd1RleHhPRVMiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsRHJhd1RleHhPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhzdk9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4c3ZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhpdk9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4aXZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhmdk9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4ZnZPRVMgfSwKLSAgICB7ICJnbERyYXdUZXh4dk9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEcmF3VGV4eHZPRVMgfSwKLSAgICB7ICJnbFF1ZXJ5TWF0cml4eE9FUyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xRdWVyeU1hdHJpeHhPRVMgfSwKLSAgICB7ICJnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTIH0sCi0gICAgeyAiZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTIH0sCi0gICAgeyAiZ2xDbGlwUGxhbmVmIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbENsaXBQbGFuZWYgfSwKLSAgICB7ICJnbENsaXBQbGFuZXgiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsQ2xpcFBsYW5leCB9LAotICAgIHsgImdsQmluZEJ1ZmZlciIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xCaW5kQnVmZmVyIH0sCi0gICAgeyAiZ2xCdWZmZXJEYXRhIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbEJ1ZmZlckRhdGEgfSwKLSAgICB7ICJnbEJ1ZmZlclN1YkRhdGEiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmdsQnVmZmVyU3ViRGF0YSB9LAotICAgIHsgImdsRGVsZXRlQnVmZmVycyIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZ2xEZWxldGVCdWZmZXJzIH0sCi0gICAgeyAiZ2xHZW5CdWZmZXJzIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZnbEdlbkJ1ZmZlcnMgfSwKLSAgICB7ICJlZ2xDcmVhdGVJbWFnZUtIUiIsICAKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xDcmVhdGVJbWFnZUtIUiB9LCAKLSAgICB7ICJlZ2xEZXN0cm95SW1hZ2VLSFIiLCAKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xEZXN0cm95SW1hZ2VLSFIgfSwgCi0gICAgeyAiZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQiLCAKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCB9LCAKLX07Ci0KLS8qCi0gKiBJbiB0aGUgbGlzdHMgYmVsb3csIGF0dHJpYnV0ZXMgbmFtZXMgTVVTVCBiZSBzb3J0ZWQuCi0gKiBBZGRpdGlvbmFsbHksIGFsbCBjb25maWdzIG11c3QgYmUgc29ydGVkIGFjY29yZGluZyB0bwotICogdGhlIEVHTCBzcGVjaWZpY2F0aW9uLgotICovCi0KLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX1NURU5DSUxfU0laRSwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0NBVkVBVCwgICAgICAgICAgICAgIEVHTF9TTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9MRVZFTCwgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfUElYRUxTLAotICAgICAgICAgICAgICAgIEdHTF9NQVhfVklFV1BPUlRfRElNUypHR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1dJRFRILCAgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1JFTkRFUkFCTEUsICAgICAgICAgIEVHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfVFlQRSwgICAgICAgICBHR0xfUElYRUxfRk9STUFUX1JHQl81NjUgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfU0FNUExFUywgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9TQU1QTEVfQlVGRkVSUywgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX1RZUEUsICAgICAgICAgICBFR0xfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSwgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfQklORF9UT19URVhUVVJFX1JHQkEsICAgICAgIEVHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLCAgICAgICAgRUdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01JTl9TV0FQX0lOVEVSVkFMLCAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1NXQVBfSU5URVJWQUwsICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9MVU1JTkFOQ0VfU0laRSwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX01BU0tfU0laRSwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfQ09MT1JfQlVGRkVSX1RZUEUsICAgICAgICAgIEVHTF9SR0JfQlVGRkVSICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9SRU5ERVJBQkxFX1RZUEUsICAgICAgICAgICAgRUdMX09QRU5HTF9FU19CSVQgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX0NPTkZPUk1BTlQsICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotfTsKLQotLy8gVGhlc2UgY29uZmlncyBjYW4gb3ZlcnJpZGUgdGhlIGJhc2UgYXR0cmlidXRlIGxpc3QKLS8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgY29uZmlnIGhlcmUsIGRvbid0IGZvcmdldCB0byB1cGRhdGUgZWdsQ3JlYXRlKlN1cmZhY2UoKQotCi0vLyA1NjUgY29uZmlncwotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzBfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAxNiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgNiB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCBHR0xfUElYRUxfRk9STUFUX1JHQl81NjUgfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCi19OwotCi1zdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMV9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA2IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAxIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLS8vIFJHQiA4ODggY29uZmlncwotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzJfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNiB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4OCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMzIgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDcgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgR0dMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODggfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCi19OwotCi0vLyA4ODg4IGNvbmZpZ3MKLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMzIgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDIgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODggfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCi19OwotCi1zdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDMyIH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAzIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4IH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAotfTsKLQotLy8gQTggY29uZmlncwotc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzZfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgOCB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgNCB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX0lELCBHR0xfUElYRUxfRk9STUFUX0FfOCB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKLX07Ci0KLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ183X2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgR0dMX1BJWEVMX0ZPUk1BVF9BXzggfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCi19OwotCi1zdGF0aWMgY29uZmlnc190IGNvbnN0IGdDb25maWdzW10gPSB7Ci0gICAgICAgIHsgY29uZmlnXzBfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18wX2F0dHJpYnV0ZV9saXN0KSB9LAotICAgICAgICB7IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMV9hdHRyaWJ1dGVfbGlzdCkgfSwKLSAgICAgICAgeyBjb25maWdfMl9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzJfYXR0cmlidXRlX2xpc3QpIH0sCi0gICAgICAgIHsgY29uZmlnXzNfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18zX2F0dHJpYnV0ZV9saXN0KSB9LAotICAgICAgICB7IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfNF9hdHRyaWJ1dGVfbGlzdCkgfSwKLSAgICAgICAgeyBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzVfYXR0cmlidXRlX2xpc3QpIH0sCi0gICAgICAgIHsgY29uZmlnXzZfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ182X2F0dHJpYnV0ZV9saXN0KSB9LAotICAgICAgICB7IGNvbmZpZ183X2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfN19hdHRyaWJ1dGVfbGlzdCkgfSwKLX07Ci0KLXN0YXRpYyBjb25maWdfbWFuYWdlbWVudF90IGNvbnN0IGdDb25maWdNYW5hZ2VtZW50W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX1NURU5DSUxfU0laRSwgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjphdExlYXN0IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19DQVZFQVQsICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX0xFVkVMLCAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX0hFSUdIVCwgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjppZ25vcmUgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6aWdub3JlICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIGNvbmZpZ19tYW5hZ2VtZW50X3Q6Omlnbm9yZSAgIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9SRU5ERVJBQkxFLCAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjpleGFjdCAgIH0sCi0gICAgICAgIHsgRUdMX05BVElWRV9WSVNVQUxfSUQsICAgICAgICAgICBjb25maWdfbWFuYWdlbWVudF90OjppZ25vcmUgICB9LAotICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX1RZUEUsICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9TQU1QTEVTLCAgICAgICAgICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9TQU1QTEVfQlVGRkVSUywgICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6bWFzayAgICB9LAotICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9UWVBFLCAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLCAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLCAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9NSU5fU1dBUF9JTlRFUlZBTCwgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9NQVhfU1dBUF9JTlRFUlZBTCwgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9MVU1JTkFOQ0VfU0laRSwgICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6YXRMZWFzdCB9LAotICAgICAgICB7IEVHTF9BTFBIQV9NQVNLX1NJWkUsICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6YXRMZWFzdCB9LAotICAgICAgICB7IEVHTF9DT0xPUl9CVUZGRVJfVFlQRSwgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6ZXhhY3QgICB9LAotICAgICAgICB7IEVHTF9SRU5ERVJBQkxFX1RZUEUsICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6bWFzayAgICB9LAotICAgICAgICB7IEVHTF9DT05GT1JNQU5ULCAgICAgICAgICAgICAgICAgY29uZmlnX21hbmFnZW1lbnRfdDo6bWFzayAgICB9Ci19OwotCi0KLXN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ19kZWZhdWx0c1tdID0gewotICAgIC8vIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IHNwZWNpZmllZCBhcmUgc2ltcGx5IGlnbm9yZWQsIGlmIGEgcGFydGljdWxhcgotICAgIC8vIG9uZSBuZWVkcyBub3QgYmUgaWdub3JlZCwgaXQgbXVzdCBiZSBzcGVjaWZpZWQgaGVyZSwgZWc6Ci0gICAgLy8geyBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCB9LAotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgc3RhdHVzX3QgZ2V0Q29uZmlnRm9ybWF0SW5mbyhFR0xpbnQgY29uZmlnSUQsCi0gICAgICAgIGludDMyX3QmIHBpeGVsRm9ybWF0LCBpbnQzMl90JiBkZXB0aEZvcm1hdCkKLXsKLSAgICBzd2l0Y2goY29uZmlnSUQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OwotICAgICAgICBkZXB0aEZvcm1hdCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU7Ci0gICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg7Ci0gICAgICAgIGRlcHRoRm9ybWF0ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OwotICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotICAgICAgICBkZXB0aEZvcm1hdCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKLSAgICAgICAgZGVwdGhGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1pfMTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsKLSAgICAgICAgZGVwdGhGb3JtYXQgPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7Ci0gICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3RhdGljIGludCBiaW5hcnlTZWFyY2goVCBjb25zdCBzb3J0ZWRBcnJheVtdLCBpbnQgZmlyc3QsIGludCBsYXN0LCBFR0xpbnQga2V5KQotewotICAgd2hpbGUgKGZpcnN0IDw9IGxhc3QpIHsKLSAgICAgICBpbnQgbWlkID0gKGZpcnN0ICsgbGFzdCkgLyAyOwotICAgICAgIGlmIChrZXkgPiBzb3J0ZWRBcnJheVttaWRdLmtleSkgewotICAgICAgICAgICBmaXJzdCA9IG1pZCArIDE7Ci0gICAgICAgfSBlbHNlIGlmIChrZXkgPCBzb3J0ZWRBcnJheVttaWRdLmtleSkgewotICAgICAgICAgICBsYXN0ID0gbWlkIC0gMTsKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgICByZXR1cm4gbWlkOwotICAgICAgIH0KLSAgIH0KLSAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBpc0F0dHJpYnV0ZU1hdGNoaW5nKGludCBpLCBFR0xpbnQgYXR0ciwgRUdMaW50IHZhbCkKLXsKLSAgICAvLyBsb29rIGZvciB0aGUgYXR0cmlidXRlIGluIGFsbCBvZiBvdXIgY29uZmlncwotICAgIGNvbmZpZ19wYWlyX3QgY29uc3QqIGNvbmZpZ0ZvdW5kID0gZ0NvbmZpZ3NbaV0uYXJyYXk7Ci0gICAgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAotICAgICAgICAgICAgZ0NvbmZpZ3NbaV0uYXJyYXksCi0gICAgICAgICAgICAwLCBnQ29uZmlnc1tpXS5zaXplLTEsCi0gICAgICAgICAgICBhdHRyKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGNvbmZpZ0ZvdW5kID0gY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3Q7Ci0gICAgICAgIGluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAotICAgICAgICAgICAgICAgIGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0LAotICAgICAgICAgICAgICAgIDAsIE5FTEVNKGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0KS0xLAotICAgICAgICAgICAgICAgIGF0dHIpOwotICAgIH0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBhdHRyaWJ1dGUgZm91bmQsIGNoZWNrIGlmIHRoaXMgY29uZmlnIGNvdWxkIG1hdGNoCi0gICAgICAgIGludCBjZmdNZ3RJbmRleCA9IGJpbmFyeVNlYXJjaDxjb25maWdfbWFuYWdlbWVudF90PigKLSAgICAgICAgICAgICAgICBnQ29uZmlnTWFuYWdlbWVudCwKLSAgICAgICAgICAgICAgICAwLCBORUxFTShnQ29uZmlnTWFuYWdlbWVudCktMSwKLSAgICAgICAgICAgICAgICBhdHRyKTsKLSAgICAgICAgaWYgKGNmZ01ndEluZGV4ID49IDApIHsKLSAgICAgICAgICAgIGJvb2wgbWF0Y2ggPSBnQ29uZmlnTWFuYWdlbWVudFtjZmdNZ3RJbmRleF0ubWF0Y2goCi0gICAgICAgICAgICAgICAgICAgIHZhbCwgY29uZmlnRm91bmRbaW5kZXhdLnZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtYXRjaCkgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgY29uZmlnIG1hdGNoZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBub3QgZm91bmQuIHRoaXMgc2hvdWxkIE5FVkVSIGhhcHBlbi4KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGVycm9yLCB0aGlzIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1ha2VDdXJyZW50KG9nbGVzX2NvbnRleHRfdCogZ2wpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjdXJyZW50ID0gKG9nbGVzX2NvbnRleHRfdCopZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotICAgIGlmIChnbCkgewotICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChnbCk7Ci0gICAgICAgIGlmIChjLT5mbGFncyAmIGVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IGdsKSB7Ci0gICAgICAgICAgICAgICAgLy8gaXQgaXMgYW4gZXJyb3IgdG8gc2V0IGEgY29udGV4dCBjdXJyZW50LCBpZiBpdCdzIGFscmVhZHkKLSAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHRvIGFub3RoZXIgdGhyZWFkCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICAvLyBtYXJrIHRoZSBjdXJyZW50IGNvbnRleHQgYXMgbm90IGN1cnJlbnQsIGFuZCBmbHVzaAotICAgICAgICAgICAgICAgIGdsRmx1c2goKTsKLSAgICAgICAgICAgICAgICBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN1cnJlbnQpLT5mbGFncyAmPSB+ZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIShjLT5mbGFncyAmIGVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgY29udGV4dCBpcyBub3QgY3VycmVudCwgbWFrZSBpdCBjdXJyZW50IQotICAgICAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYyhnbCk7Ci0gICAgICAgICAgICBjLT5mbGFncyB8PSBlZ2xfY29udGV4dF90OjpJU19DVVJSRU5UOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGN1cnJlbnQpIHsKLSAgICAgICAgICAgIC8vIG1hcmsgdGhlIGN1cnJlbnQgY29udGV4dCBhcyBub3QgY3VycmVudCwgYW5kIGZsdXNoCi0gICAgICAgICAgICBnbEZsdXNoKCk7Ci0gICAgICAgICAgICBlZ2xfY29udGV4dF90Ojpjb250ZXh0KGN1cnJlbnQpLT5mbGFncyAmPSB+ZWdsX2NvbnRleHRfdDo6SVNfQ1VSUkVOVDsKLSAgICAgICAgfQotICAgICAgICAvLyB0aGlzIHRocmVhZCBoYXMgbm8gY29udGV4dCBhdHRhY2hlZCB0byBpdAotICAgICAgICBzZXRHbFRocmVhZFNwZWNpZmljKDApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIEVHTEJvb2xlYW4gZ2V0Q29uZmlnQXR0cmliKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKQotewotICAgIHNpemVfdCBudW1Db25maWdzID0gIE5FTEVNKGdDb25maWdzKTsKLSAgICBpbnQgaW5kZXggPSAoaW50KWNvbmZpZzsKLSAgICBpZiAodWludDMyX3QoaW5kZXgpID49IG51bUNvbmZpZ3MpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTkZJRywgRUdMX0ZBTFNFKTsKLQotICAgIGludCBhdHRySW5kZXg7Ci0gICAgYXR0ckluZGV4ID0gYmluYXJ5U2VhcmNoPGNvbmZpZ19wYWlyX3Q+KAotICAgICAgICAgICAgZ0NvbmZpZ3NbaW5kZXhdLmFycmF5LAotICAgICAgICAgICAgMCwgZ0NvbmZpZ3NbaW5kZXhdLnNpemUtMSwKLSAgICAgICAgICAgIGF0dHJpYnV0ZSk7Ci0gICAgaWYgKGF0dHJJbmRleD49MCkgewotICAgICAgICAqdmFsdWUgPSBnQ29uZmlnc1tpbmRleF0uYXJyYXlbYXR0ckluZGV4XS52YWx1ZTsKLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwotICAgIH0KLQotICAgIGF0dHJJbmRleCA9IGJpbmFyeVNlYXJjaDxjb25maWdfcGFpcl90PigKLSAgICAgICAgICAgIGNvbmZpZ19iYXNlX2F0dHJpYnV0ZV9saXN0LAotICAgICAgICAgICAgMCwgTkVMRU0oY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3QpLTEsCi0gICAgICAgICAgICBhdHRyaWJ1dGUpOwotICAgIGlmIChhdHRySW5kZXg+PTApIHsKLSAgICAgICAgKnZhbHVlID0gY29uZmlnX2Jhc2VfYXR0cmlidXRlX2xpc3RbYXR0ckluZGV4XS52YWx1ZTsKLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9GQUxTRSk7Ci19Ci0KLXN0YXRpYyBFR0xTdXJmYWNlIGNyZWF0ZVdpbmRvd1N1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX1NVUkZBQ0UpOwotICAgIGlmICh3aW5kb3cgPT0gMCkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKLQotICAgIEVHTGludCBzdXJmYWNlVHlwZTsKLSAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIGlmICghKHN1cmZhY2VUeXBlICYgRUdMX1dJTkRPV19CSVQpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgaWYgKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPih3aW5kb3cpLT5jb21tb24ubWFnaWMgIT0KLSAgICAgICAgICAgIEFORFJPSURfTkFUSVZFX1dJTkRPV19NQUdJQykgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9OQVRJVkVfV0lORE9XLCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgfQotICAgICAgICAKLSAgICBFR0xpbnQgY29uZmlnSUQ7Ci0gICAgaWYgKGdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX0NPTkZJR19JRCwgJmNvbmZpZ0lEKSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBpbnQzMl90IGRlcHRoRm9ybWF0OwotICAgIGludDMyX3QgcGl4ZWxGb3JtYXQ7Ci0gICAgaWYgKGdldENvbmZpZ0Zvcm1hdEluZm8oY29uZmlnSUQsIHBpeGVsRm9ybWF0LCBkZXB0aEZvcm1hdCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHBpeGVsRm9ybWF0IGhlcmUganVzdCB5ZXQuCi0gICAgLy8gKGl0J3MgcG9zc2libGUgdGhhdCB0aGUgc3VyZmFjZSBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQpCi0gICAgLy8gbWF5YmUgdGhpcyBzaG91bGQgYmUgZG9uZSBhZnRlciB0aGUgcGFnZS1mbGlwCi0gICAgLy9pZiAoRUdMaW50KGluZm8uZm9ybWF0KSAhPSBwaXhlbEZvcm1hdCkKLSAgICAvLyAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZTsKLSAgICBzdXJmYWNlID0gbmV3IGVnbF93aW5kb3dfc3VyZmFjZV92Ml90KGRweSwgY29uZmlnLCBkZXB0aEZvcm1hdCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPih3aW5kb3cpKTsKLQotICAgIGlmICghc3VyZmFjZS0+aW5pdENoZWNrKCkpIHsKLSAgICAgICAgLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgY3RvciwgdGhlIGVycm9yCi0gICAgICAgIC8vIGZsYWcgaGFzIGJlZW4gc2V0LgotICAgICAgICBkZWxldGUgc3VyZmFjZTsKLSAgICAgICAgc3VyZmFjZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzdXJmYWNlOwotfQotCi1zdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVQaXhtYXBTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKLSAgICBpZiAocGl4bWFwID09IDApCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfTk9fU1VSRkFDRSk7Ci0KLSAgICBFR0xpbnQgc3VyZmFjZVR5cGU7Ci0gICAgaWYgKGdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX1NVUkZBQ0VfVFlQRSwgJnN1cmZhY2VUeXBlKSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBpZiAoIShzdXJmYWNlVHlwZSAmIEVHTF9QSVhNQVBfQklUKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKLQotICAgIGlmIChzdGF0aWNfY2FzdDxlZ2xfbmF0aXZlX3BpeG1hcF90Kj4ocGl4bWFwKS0+dmVyc2lvbiAhPSAKLSAgICAgICAgICAgIHNpemVvZihlZ2xfbmF0aXZlX3BpeG1hcF90KSkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9OQVRJVkVfUElYTUFQLCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgfQotICAgIAotICAgIEVHTGludCBjb25maWdJRDsKLSAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7Ci0gICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKLSAgICBpZiAoZ2V0Q29uZmlnRm9ybWF0SW5mbyhjb25maWdJRCwgcGl4ZWxGb3JtYXQsIGRlcHRoRm9ybWF0KSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotICAgIH0KLQotICAgIGlmIChwaXhtYXAtPmZvcm1hdCAhPSBwaXhlbEZvcm1hdCkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKLQotICAgIGVnbF9zdXJmYWNlX3QqIHN1cmZhY2UgPQotICAgICAgICBuZXcgZWdsX3BpeG1hcF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0LAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGVnbF9uYXRpdmVfcGl4bWFwX3QqPihwaXhtYXApKTsKLQotICAgIGlmICghc3VyZmFjZS0+aW5pdENoZWNrKCkpIHsKLSAgICAgICAgLy8gdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiB0aGUgY3RvciwgdGhlIGVycm9yCi0gICAgICAgIC8vIGZsYWcgaGFzIGJlZW4gc2V0LgotICAgICAgICBkZWxldGUgc3VyZmFjZTsKLSAgICAgICAgc3VyZmFjZSA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzdXJmYWNlOwotfQotCi1zdGF0aWMgRUdMU3VyZmFjZSBjcmVhdGVQYnVmZmVyU3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19TVVJGQUNFKTsKLQotICAgIEVHTGludCBzdXJmYWNlVHlwZTsKLSAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfU1VSRkFDRV9UWVBFLCAmc3VyZmFjZVR5cGUpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIGlmICghKHN1cmZhY2VUeXBlICYgRUdMX1BCVUZGRVJfQklUKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKLQotICAgIEVHTGludCBjb25maWdJRDsKLSAgICBpZiAoZ2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfQ09ORklHX0lELCAmY29uZmlnSUQpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIGludDMyX3QgZGVwdGhGb3JtYXQ7Ci0gICAgaW50MzJfdCBwaXhlbEZvcm1hdDsKLSAgICBpZiAoZ2V0Q29uZmlnRm9ybWF0SW5mbyhjb25maWdJRCwgcGl4ZWxGb3JtYXQsIGRlcHRoRm9ybWF0KSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwotICAgIH0KLQotICAgIGludDMyX3QgdyA9IDA7Ci0gICAgaW50MzJfdCBoID0gMDsKLSAgICB3aGlsZSAoYXR0cmliX2xpc3RbMF0pIHsKLSAgICAgICAgaWYgKGF0dHJpYl9saXN0WzBdID09IEVHTF9XSURUSCkgIHcgPSBhdHRyaWJfbGlzdFsxXTsKLSAgICAgICAgaWYgKGF0dHJpYl9saXN0WzBdID09IEVHTF9IRUlHSFQpIGggPSBhdHRyaWJfbGlzdFsxXTsKLSAgICAgICAgYXR0cmliX2xpc3QrPTI7Ci0gICAgfQotCi0gICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSA9Ci0gICAgICAgIG5ldyBlZ2xfcGJ1ZmZlcl9zdXJmYWNlX3QoZHB5LCBjb25maWcsIGRlcHRoRm9ybWF0LCB3LCBoLCBwaXhlbEZvcm1hdCk7Ci0KLSAgICBpZiAoIXN1cmZhY2UtPmluaXRDaGVjaygpKSB7Ci0gICAgICAgIC8vIHRoZXJlIHdhcyBhIHByb2JsZW0gaW4gdGhlIGN0b3IsIHRoZSBlcnJvcgotICAgICAgICAvLyBmbGFnIGhhcyBiZWVuIHNldC4KLSAgICAgICAgZGVsZXRlIHN1cmZhY2U7Ci0gICAgICAgIHN1cmZhY2UgPSAwOwotICAgIH0KLSAgICByZXR1cm4gc3VyZmFjZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEluaXRpYWxpemF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTERpc3BsYXkgZWdsR2V0RGlzcGxheShOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5KQotewotI2lmbmRlZiBIQVZFX0FORFJPSURfT1MKLSAgICAvLyB0aGlzIGp1c3QgbmVlZHMgdG8gYmUgZG9uZSBvbmNlCi0gICAgaWYgKGdHTEtleSA9PSAtMSkgewotICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdJbml0TXV0ZXgpOwotICAgICAgICBpZiAoZ0dMS2V5ID09IC0xKQotICAgICAgICAgICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnR0xLZXksIE5VTEwpOwotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7Ci0gICAgfQotI2VuZGlmCi0gICAgaWYgKGRpc3BsYXkgPT0gRUdMX0RFRkFVTFRfRElTUExBWSkgewotICAgICAgICBFR0xEaXNwbGF5IGRweSA9IChFR0xEaXNwbGF5KTE7Ci0gICAgICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOwotICAgICAgICBkLnR5cGUgPSBkaXNwbGF5OwotICAgICAgICByZXR1cm4gZHB5OwotICAgIH0KLSAgICByZXR1cm4gRUdMX05PX0RJU1BMQVk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsSW5pdGlhbGl6ZShFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcikKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOwotICAgIGVnbF9kaXNwbGF5X3QmIGQgPSBlZ2xfZGlzcGxheV90OjpnZXRfZGlzcGxheShkcHkpOwotCi0gICAgaWYgKGFuZHJvaWRfYXRvbWljX2luYygmZC5pbml0aWFsaXplZCkgPT0gMCkgewotICAgICAgICAvLyBpbml0aWFsaXplIHN0dWZmIGhlcmUgaWYgbmVlZGVkCi0gICAgICAgIC8vcHRocmVhZF9tdXRleF9sb2NrKCZnSW5pdE11dGV4KTsKLSAgICAgICAgLy9wdGhyZWFkX211dGV4X3VubG9jaygmZ0luaXRNdXRleCk7Ci0gICAgfQotCi0gICAgaWYgKHJlcyA9PSBFR0xfVFJVRSkgewotICAgICAgICBpZiAobWFqb3IgIT0gTlVMTCkgKm1ham9yID0gVkVSU0lPTl9NQUpPUjsKLSAgICAgICAgaWYgKG1pbm9yICE9IE5VTEwpICptaW5vciA9IFZFUlNJT05fTUlOT1I7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsVGVybWluYXRlKEVHTERpc3BsYXkgZHB5KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLQotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7Ci0gICAgZWdsX2Rpc3BsYXlfdCYgZCA9IGVnbF9kaXNwbGF5X3Q6OmdldF9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKGFuZHJvaWRfYXRvbWljX2RlYygmZC5pbml0aWFsaXplZCkgPT0gMSkgewotICAgICAgICAvLyBUT0RPOiBkZXN0cm95IGFsbCByZXNvdXJjZXMgKHN1cmZhY2VzLCBjb250ZXh0cywgZXRjLi4uKQotICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7Ci0gICAgICAgIC8vcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb25maWd1cmF0aW9uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gZWdsR2V0Q29uZmlncyggICBFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb25maWcgKmNvbmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgR0xpbnQgbnVtQ29uZmlncyA9IE5FTEVNKGdDb25maWdzKTsKLSAgICBpZiAoIWNvbmZpZ3MpIHsKLSAgICAgICAgKm51bV9jb25maWcgPSBudW1Db25maWdzOwotICAgICAgICByZXR1cm4gRUdMX1RSVUU7Ci0gICAgfQotICAgIEdMaW50IGk7Ci0gICAgZm9yIChpPTAgOyBpPG51bUNvbmZpZ3MgJiYgaTxjb25maWdfc2l6ZSA7IGkrKykgewotICAgICAgICAqY29uZmlncysrID0gKEVHTENvbmZpZylpOwotICAgIH0KLSAgICAqbnVtX2NvbmZpZyA9IGk7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xCb29sZWFuIGVnbENob29zZUNvbmZpZyggRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICpudW1fY29uZmlnKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICAKLSAgICBpZiAoZ2dsX3VubGlrZWx5KG51bV9jb25maWc9PTApKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KGF0dHJpYl9saXN0PT0wKSkgewotICAgICAgICAvKgotICAgICAgICAgKiBBIE5VTEwgYXR0cmliX2xpc3Qgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhvdWdoIGl0IHdhcyBhbiBlbXB0eQotICAgICAgICAgKiBvbmUgKHRlcm1pbmF0ZWQgd2l0aCBFR0xfTk9ORSkgYXMgZGVmaW5lZCBpbgotICAgICAgICAgKiBzZWN0aW9uIDMuNC4xICJRdWVyeWluZyBDb25maWd1cmF0aW9ucyIgaW4gdGhlIEVHTCBzcGVjaWZpY2F0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IEVHTGludCBkdW1teSA9IEVHTF9OT05FOwotICAgICAgICBhdHRyaWJfbGlzdCA9ICZkdW1teTsKLSAgICB9Ci0KLSAgICBpbnQgbnVtQXR0cmlidXRlcyA9IDA7Ci0gICAgaW50IG51bUNvbmZpZ3MgPSAgTkVMRU0oZ0NvbmZpZ3MpOwotICAgIHVpbnQzMl90IHBvc3NpYmxlTWF0Y2ggPSAoMTw8bnVtQ29uZmlncyktMTsKLSAgICB3aGlsZShwb3NzaWJsZU1hdGNoICYmICphdHRyaWJfbGlzdCAhPSBFR0xfTk9ORSkgewotICAgICAgICBudW1BdHRyaWJ1dGVzKys7Ci0gICAgICAgIEVHTGludCBhdHRyID0gKmF0dHJpYl9saXN0Kys7Ci0gICAgICAgIEVHTGludCB2YWwgID0gKmF0dHJpYl9saXN0Kys7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IHBvc3NpYmxlTWF0Y2ggJiYgaTxudW1Db25maWdzIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIShwb3NzaWJsZU1hdGNoICYgKDE8PGkpKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChpc0F0dHJpYnV0ZU1hdGNoaW5nKGksIGF0dHIsIHZhbCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHBvc3NpYmxlTWF0Y2ggJj0gfigxPDxpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIG5vdywgaGFuZGxlIHRoZSBhdHRyaWJ1dGVzIHdoaWNoIGhhdmUgYSB1c2VmdWwgZGVmYXVsdCB2YWx1ZQotICAgIGZvciAoc2l6ZV90IGo9MCA7IHBvc3NpYmxlTWF0Y2ggJiYgajxORUxFTShjb25maWdfZGVmYXVsdHMpIDsgaisrKSB7Ci0gICAgICAgIC8vIHNlZSBpZiB0aGlzIGF0dHJpYnV0ZSB3YXMgc3BlY2lmaWVkLCBpZiBub3QsIGFwcGx5IGl0cwotICAgICAgICAvLyBkZWZhdWx0IHZhbHVlCi0gICAgICAgIGlmIChiaW5hcnlTZWFyY2g8Y29uZmlnX3BhaXJfdD4oCi0gICAgICAgICAgICAgICAgKGNvbmZpZ19wYWlyX3QgY29uc3QqKWF0dHJpYl9saXN0LAotICAgICAgICAgICAgICAgIDAsIG51bUF0dHJpYnV0ZXMtMSwKLSAgICAgICAgICAgICAgICBjb25maWdfZGVmYXVsdHNbal0ua2V5KSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGk9MCA7IHBvc3NpYmxlTWF0Y2ggJiYgaTxudW1Db25maWdzIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEocG9zc2libGVNYXRjaCAmICgxPDxpKSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpc0F0dHJpYnV0ZU1hdGNoaW5nKGksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZGVmYXVsdHNbal0ua2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2RlZmF1bHRzW2pdLnZhbHVlKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zc2libGVNYXRjaCAmPSB+KDE8PGkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHJldHVybiB0aGUgY29uZmlndXJhdGlvbnMgZm91bmQKLSAgICBpbnQgbj0wOwotICAgIGlmIChwb3NzaWJsZU1hdGNoKSB7Ci0gICAgICAgIGlmIChjb25maWdzKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTAgOyBjb25maWdfc2l6ZSAmJiBpPG51bUNvbmZpZ3MgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zc2libGVNYXRjaCAmICgxPDxpKSkgewotICAgICAgICAgICAgICAgICAgICAqY29uZmlncysrID0gKEVHTENvbmZpZylpOwotICAgICAgICAgICAgICAgICAgICBjb25maWdfc2l6ZS0tOwotICAgICAgICAgICAgICAgICAgICBuKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxudW1Db25maWdzIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlTWF0Y2ggJiAoMTw8aSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAqbnVtX2NvbmZpZyA9IG47Ci0gICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xHZXRDb25maWdBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgcmV0dXJuIGdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgYXR0cmlidXRlLCB2YWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHN1cmZhY2VzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTFN1cmZhY2UgZWdsQ3JlYXRlV2luZG93U3VyZmFjZSggIEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlV2luZG93VHlwZSB3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIHJldHVybiBjcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCB3aW5kb3csIGF0dHJpYl9saXN0KTsKLX0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKCAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgcmV0dXJuIGNyZWF0ZVBpeG1hcFN1cmZhY2UoZHB5LCBjb25maWcsIHBpeG1hcCwgYXR0cmliX2xpc3QpOwotfQotCi1FR0xTdXJmYWNlIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKCBFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgcmV0dXJuIGNyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJfbGlzdCk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsRGVzdHJveVN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZWdsU3VyZmFjZSkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0gICAgaWYgKGVnbFN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgZWdsX3N1cmZhY2VfdCogc3VyZmFjZSggc3RhdGljX2Nhc3Q8ZWdsX3N1cmZhY2VfdCo+KGVnbFN1cmZhY2UpICk7Ci0gICAgICAgIGlmICghc3VyZmFjZS0+aXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICAgICAgaWYgKHN1cmZhY2UtPmRweSAhPSBkcHkpCi0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgICAgICBpZiAoc3VyZmFjZS0+Y3R4KSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBzdXJmYWNlIGlzIGN1cnJlbnQgY2hlY2sgd2hhdCB0aGUgc3BlYyBzYXlzCi0gICAgICAgICAgICBzdXJmYWNlLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBzdXJmYWNlLT5jdHggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBzdXJmYWNlOwotICAgIH0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsUXVlcnlTdXJmYWNlKCBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBlZ2xTdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIGVnbF9zdXJmYWNlX3QqIHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxlZ2xfc3VyZmFjZV90Kj4oZWdsU3VyZmFjZSk7Ci0gICAgaWYgKCFzdXJmYWNlLT5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0gICAgaWYgKHN1cmZhY2UtPmRweSAhPSBkcHkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICBFR0xCb29sZWFuIHJldCA9IEVHTF9UUlVFOwotICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7Ci0gICAgICAgIGNhc2UgRUdMX0NPTkZJR19JRDoKLSAgICAgICAgICAgIHJldCA9IGdldENvbmZpZ0F0dHJpYihkcHksIHN1cmZhY2UtPmNvbmZpZywgRUdMX0NPTkZJR19JRCwgdmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX1dJRFRIOgotICAgICAgICAgICAgKnZhbHVlID0gc3VyZmFjZS0+Z2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9IRUlHSFQ6Ci0gICAgICAgICAgICAqdmFsdWUgPSBzdXJmYWNlLT5nZXRIZWlnaHQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9MQVJHRVNUX1BCVUZGRVI6Ci0gICAgICAgICAgICAvLyBub3QgbW9kaWZpZWQgZm9yIGEgd2luZG93IG9yIHBpeG1hcCBzdXJmYWNlCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfVEVYVFVSRV9GT1JNQVQ6Ci0gICAgICAgICAgICAqdmFsdWUgPSBFR0xfTk9fVEVYVFVSRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9URVhUVVJFX1RBUkdFVDoKLSAgICAgICAgICAgICp2YWx1ZSA9IEVHTF9OT19URVhUVVJFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX01JUE1BUF9URVhUVVJFOgotICAgICAgICAgICAgKnZhbHVlID0gRUdMX0ZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUdMX01JUE1BUF9MRVZFTDoKLSAgICAgICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfUkVOREVSX0JVRkZFUjoKLSAgICAgICAgICAgIC8vIFRPRE86IHJldHVybiB0aGUgcmVhbCBSRU5ERVJfQlVGRkVSIGhlcmUKLSAgICAgICAgICAgICp2YWx1ZSA9IEVHTF9CQUNLX0JVRkZFUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9IT1JJWk9OVEFMX1JFU09MVVRJT046Ci0gICAgICAgICAgICAvLyBwaXhlbC9tbSAqIEVHTF9ESVNQTEFZX1NDQUxJTkcKLSAgICAgICAgICAgICp2YWx1ZSA9IHN1cmZhY2UtPmdldEhvcml6b250YWxSZXNvbHV0aW9uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfVkVSVElDQUxfUkVTT0xVVElPTjoKLSAgICAgICAgICAgIC8vIHBpeGVsL21tICogRUdMX0RJU1BMQVlfU0NBTElORwotICAgICAgICAgICAgKnZhbHVlID0gc3VyZmFjZS0+Z2V0VmVydGljYWxSZXNvbHV0aW9uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFR0xfUElYRUxfQVNQRUNUX1JBVElPOiB7Ci0gICAgICAgICAgICAvLyB3L2ggKiBFR0xfRElTUExBWV9TQ0FMSU5HCi0gICAgICAgICAgICBpbnQgd3IgPSBzdXJmYWNlLT5nZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpOwotICAgICAgICAgICAgaW50IGhyID0gc3VyZmFjZS0+Z2V0VmVydGljYWxSZXNvbHV0aW9uKCk7Ci0gICAgICAgICAgICAqdmFsdWUgPSAod3IgKiBFR0xfRElTUExBWV9TQ0FMSU5HKSAvIGhyOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIEVHTF9TV0FQX0JFSEFWSU9SOgotICAgICAgICAgICAgKnZhbHVlID0gc3VyZmFjZS0+Z2V0U3dhcEJlaGF2aW9yKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldCA9IHNldEVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfRkFMU0UpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1FR0xDb250ZXh0IGVnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBzaGFyZV9saXN0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX05PX1NVUkZBQ0UpOwotCi0gICAgb2dsZXNfY29udGV4dF90KiBnbCA9IG9nbGVzX2luaXQoc2l6ZW9mKGVnbF9jb250ZXh0X3QpKTsKLSAgICBpZiAoIWdsKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BTExPQywgRUdMX05PX0NPTlRFWFQpOwotCi0gICAgZWdsX2NvbnRleHRfdCogYyA9IHN0YXRpY19jYXN0PGVnbF9jb250ZXh0X3QqPihnbC0+cmFzdGVyaXplci5iYXNlKTsKLSAgICBjLT5mbGFncyA9IGVnbF9jb250ZXh0X3Q6Ok5FVkVSX0NVUlJFTlQ7Ci0gICAgYy0+ZHB5ID0gZHB5OwotICAgIGMtPmNvbmZpZyA9IGNvbmZpZzsKLSAgICBjLT5yZWFkID0gMDsKLSAgICBjLT5kcmF3ID0gMDsKLSAgICByZXR1cm4gKEVHTENvbnRleHQpZ2w7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsRGVzdHJveUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdHgpOwotICAgIGlmIChjLT5mbGFncyAmIGVnbF9jb250ZXh0X3Q6OklTX0NVUlJFTlQpCi0gICAgICAgIHNldEdsVGhyZWFkU3BlY2lmaWMoMCk7Ci0gICAgb2dsZXNfdW5pbml0KChvZ2xlc19jb250ZXh0X3QqKWN0eCk7Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xCb29sZWFuIGVnbE1ha2VDdXJyZW50KCAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICBpZiAoZHJhdykgewotICAgICAgICBlZ2xfc3VyZmFjZV90KiBzID0gKGVnbF9zdXJmYWNlX3QqKWRyYXc7Ci0gICAgICAgIGlmICghcy0+aXNWYWxpZCgpKQotICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICAgICAgaWYgKHMtPmRweSAhPSBkcHkpCi0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGF0IGRyYXcgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBjb250ZXh0Ci0gICAgfQotICAgIGlmIChyZWFkICYmIHJlYWQhPWRyYXcpIHsKLSAgICAgICAgZWdsX3N1cmZhY2VfdCogcyA9IChlZ2xfc3VyZmFjZV90KilyZWFkOwotICAgICAgICBpZiAoIXMtPmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0gICAgICAgIGlmIChzLT5kcHkgIT0gZHB5KQotICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICAgICAgLy8gVE9ETzogY2hlY2sgdGhhdCByZWFkIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgY29udGV4dAotICAgIH0KLQotICAgIEVHTENvbnRleHQgY3VycmVudF9jdHggPSBFR0xfTk9fQ09OVEVYVDsKLQotICAgIGlmICgocmVhZCA9PSBFR0xfTk9fU1VSRkFDRSAmJiBkcmF3ID09IEVHTF9OT19TVVJGQUNFKSAmJiAoY3R4ICE9IEVHTF9OT19DT05URVhUKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7Ci0KLSAgICBpZiAoKHJlYWQgIT0gRUdMX05PX1NVUkZBQ0UgfHwgZHJhdyAhPSBFR0xfTk9fU1VSRkFDRSkgJiYgKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOwotCi0gICAgaWYgKGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICAvLyBpZiB3ZSdyZSBkZXRhY2hpbmcsIHdlIG5lZWQgdGhlIGN1cnJlbnQgY29udGV4dAotICAgICAgICBjdXJyZW50X2N0eCA9IChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdHgpOwotICAgICAgICBlZ2xfc3VyZmFjZV90KiBkID0gKGVnbF9zdXJmYWNlX3QqKWRyYXc7Ci0gICAgICAgIGVnbF9zdXJmYWNlX3QqIHIgPSAoZWdsX3N1cmZhY2VfdCopcmVhZDsKLSAgICAgICAgaWYgKChkICYmIGQtPmN0eCAmJiBkLT5jdHggIT0gY3R4KSB8fAotICAgICAgICAgICAgKHIgJiYgci0+Y3R4ICYmIHItPmN0eCAhPSBjdHgpKSB7Ci0gICAgICAgICAgICAvLyBvbmUgb2YgdGhlIHN1cmZhY2UgaXMgYm91bmQgdG8gYSBjb250ZXh0IGluIGFub3RoZXIgdGhyZWFkCi0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BQ0NFU1MsIEVHTF9GQUxTRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBvZ2xlc19jb250ZXh0X3QqIGdsID0gKG9nbGVzX2NvbnRleHRfdCopY3R4OwotICAgIGlmIChtYWtlQ3VycmVudChnbCkgPT0gMCkgewotICAgICAgICBpZiAoY3R4KSB7Ci0gICAgICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdHgpOwotICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogZCA9IChlZ2xfc3VyZmFjZV90KilkcmF3OwotICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogciA9IChlZ2xfc3VyZmFjZV90KilyZWFkOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoYy0+ZHJhdykgewotICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSByZWludGVycHJldF9jYXN0PGVnbF9zdXJmYWNlX3QqPihjLT5kcmF3KTsKLSAgICAgICAgICAgICAgICBzLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYy0+cmVhZCkgewotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB1bmxvY2svZGlzY29ubmVjdCB0aGUgcmVhZCBzdXJmYWNlIHRvbyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYy0+ZHJhdyA9IGRyYXc7Ci0gICAgICAgICAgICBjLT5yZWFkID0gcmVhZDsKLQotICAgICAgICAgICAgaWYgKGMtPmZsYWdzICYgZWdsX2NvbnRleHRfdDo6TkVWRVJfQ1VSUkVOVCkgewotICAgICAgICAgICAgICAgIGMtPmZsYWdzICY9IH5lZ2xfY29udGV4dF90OjpORVZFUl9DVVJSRU5UOwotICAgICAgICAgICAgICAgIEdMaW50IHcgPSAwOwotICAgICAgICAgICAgICAgIEdMaW50IGggPSAwOwotICAgICAgICAgICAgICAgIGlmIChkcmF3KSB7Ci0gICAgICAgICAgICAgICAgICAgIHcgPSBkLT5nZXRXaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBoID0gZC0+Z2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9nbGVzX3N1cmZhY2Vwb3J0KGdsLCAwLCAwKTsKLSAgICAgICAgICAgICAgICBvZ2xlc192aWV3cG9ydChnbCwgMCwgMCwgdywgaCk7Ci0gICAgICAgICAgICAgICAgb2dsZXNfc2Npc3NvcihnbCwgMCwgMCwgdywgaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgICAgIGlmIChkLT5jb25uZWN0KCkgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFR0xfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGQtPmN0eCA9IGN0eDsKLSAgICAgICAgICAgICAgICBkLT5iaW5kRHJhd1N1cmZhY2UoZ2wpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHIpIHsKLSAgICAgICAgICAgICAgICAvLyBGSVhNRTogbG9jay9jb25uZWN0IHRoZSByZWFkIHN1cmZhY2UgdG9vIAotICAgICAgICAgICAgICAgIHItPmN0eCA9IGN0eDsKLSAgICAgICAgICAgICAgICByLT5iaW5kUmVhZFN1cmZhY2UoZ2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaWYgc3VyZmFjZXMgd2VyZSBib3VuZCB0byB0aGUgY29udGV4dCBib3VuZCB0byB0aGlzIHRocmVhZAotICAgICAgICAgICAgLy8gbWFyayB0aGVuIGFzIHVuYm91bmQuCi0gICAgICAgICAgICBpZiAoY3VycmVudF9jdHgpIHsKLSAgICAgICAgICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdXJyZW50X2N0eCk7Ci0gICAgICAgICAgICAgICAgZWdsX3N1cmZhY2VfdCogZCA9IChlZ2xfc3VyZmFjZV90KiljLT5kcmF3OwotICAgICAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHIgPSAoZWdsX3N1cmZhY2VfdCopYy0+cmVhZDsKLSAgICAgICAgICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgICAgICAgICBjLT5kcmF3ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZC0+Y3R4ID0gRUdMX05PX0NPTlRFWFQ7Ci0gICAgICAgICAgICAgICAgICAgIGQtPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHIpIHsKLSAgICAgICAgICAgICAgICAgICAgYy0+cmVhZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHItPmN0eCA9IEVHTF9OT19DT05URVhUOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogdW5sb2NrL2Rpc2Nvbm5lY3QgdGhlIHJlYWQgc3VyZmFjZSB0b28gCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBFR0xfVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQUNDRVNTLCBFR0xfRkFMU0UpOwotfQotCi1FR0xDb250ZXh0IGVnbEdldEN1cnJlbnRDb250ZXh0KHZvaWQpCi17Ci0gICAgLy8gZWdsR2V0Q3VycmVudENvbnRleHQgcmV0dXJucyB0aGUgY3VycmVudCBFR0wgcmVuZGVyaW5nIGNvbnRleHQsCi0gICAgLy8gYXMgc3BlY2lmaWVkIGJ5IGVnbE1ha2VDdXJyZW50LiBJZiBubyBjb250ZXh0IGlzIGN1cnJlbnQsCi0gICAgLy8gRUdMX05PX0NPTlRFWFQgaXMgcmV0dXJuZWQuCi0gICAgcmV0dXJuIChFR0xDb250ZXh0KWdldEdsVGhyZWFkU3BlY2lmaWMoKTsKLX0KLQotRUdMU3VyZmFjZSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xpbnQgcmVhZGRyYXcpCi17Ci0gICAgLy8gZWdsR2V0Q3VycmVudFN1cmZhY2UgcmV0dXJucyB0aGUgcmVhZCBvciBkcmF3IHN1cmZhY2UgYXR0YWNoZWQKLSAgICAvLyB0byB0aGUgY3VycmVudCBFR0wgcmVuZGVyaW5nIGNvbnRleHQsIGFzIHNwZWNpZmllZCBieSBlZ2xNYWtlQ3VycmVudC4KLSAgICAvLyBJZiBubyBjb250ZXh0IGlzIGN1cnJlbnQsIEVHTF9OT19TVVJGQUNFIGlzIHJldHVybmVkLgotICAgIEVHTENvbnRleHQgY3R4ID0gKEVHTENvbnRleHQpZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotICAgIGlmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKLSAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdHgpOwotICAgIGlmIChyZWFkZHJhdyA9PSBFR0xfUkVBRCkgewotICAgICAgICByZXR1cm4gYy0+cmVhZDsKLSAgICB9IGVsc2UgaWYgKHJlYWRkcmF3ID09IEVHTF9EUkFXKSB7Ci0gICAgICAgIHJldHVybiBjLT5kcmF3OwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9BVFRSSUJVVEUsIEVHTF9OT19TVVJGQUNFKTsKLX0KLQotRUdMRGlzcGxheSBlZ2xHZXRDdXJyZW50RGlzcGxheSh2b2lkKQotewotICAgIC8vIGVnbEdldEN1cnJlbnREaXNwbGF5IHJldHVybnMgdGhlIGN1cnJlbnQgRUdMIGRpc3BsYXkgY29ubmVjdGlvbgotICAgIC8vIGZvciB0aGUgY3VycmVudCBFR0wgcmVuZGVyaW5nIGNvbnRleHQsIGFzIHNwZWNpZmllZCBieSBlZ2xNYWtlQ3VycmVudC4KLSAgICAvLyBJZiBubyBjb250ZXh0IGlzIGN1cnJlbnQsIEVHTF9OT19ESVNQTEFZIGlzIHJldHVybmVkLgotICAgIEVHTENvbnRleHQgY3R4ID0gKEVHTENvbnRleHQpZ2V0R2xUaHJlYWRTcGVjaWZpYygpOwotICAgIGlmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpIHJldHVybiBFR0xfTk9fRElTUExBWTsKLSAgICBlZ2xfY29udGV4dF90KiBjID0gZWdsX2NvbnRleHRfdDo6Y29udGV4dChjdHgpOwotICAgIHJldHVybiBjLT5kcHk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsUXVlcnlDb250ZXh0KCBFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0gICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoY3R4KTsKLSAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkgewotICAgICAgICBjYXNlIEVHTF9DT05GSUdfSUQ6Ci0gICAgICAgICAgICAvLyBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgRUdMIGZyYW1lIGJ1ZmZlciBjb25maWd1cmF0aW9uIHdpdGgKLSAgICAgICAgICAgIC8vIHJlc3BlY3QgdG8gd2hpY2ggdGhlIGNvbnRleHQgd2FzIGNyZWF0ZWQKLSAgICAgICAgICAgIHJldHVybiBnZXRDb25maWdBdHRyaWIoZHB5LCBjLT5jb25maWcsIEVHTF9DT05GSUdfSUQsIHZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQVRUUklCVVRFLCBFR0xfRkFMU0UpOwotfQotCi1FR0xCb29sZWFuIGVnbFdhaXRHTCh2b2lkKQotewotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xXYWl0TmF0aXZlKEVHTGludCBlbmdpbmUpCi17Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi1FR0xCb29sZWFuIGVnbFN3YXBCdWZmZXJzKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIGRyYXcpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCogZCA9IHN0YXRpY19jYXN0PGVnbF9zdXJmYWNlX3QqPihkcmF3KTsKLSAgICBpZiAoIWQtPmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLSAgICBpZiAoZC0+ZHB5ICE9IGRweSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLQotICAgIC8vIHBvc3QgdGhlIHN1cmZhY2UKLSAgICBkLT5zd2FwQnVmZmVycygpOwotCi0gICAgLy8gaWYgaXQncyBib3VuZCB0byBhIGNvbnRleHQsIHVwZGF0ZSB0aGUgYnVmZmVyCi0gICAgaWYgKGQtPmN0eCAhPSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBkLT5iaW5kRHJhd1N1cmZhY2UoKG9nbGVzX2NvbnRleHRfdCopZC0+Y3R4KTsKLSAgICAgICAgLy8gaWYgdGhpcyBzdXJmYWNlIGlzIGFsc28gdGhlIHJlYWQgc3VyZmFjZSBvZiB0aGUgY29udGV4dAotICAgICAgICAvLyBpdCBpcyBib3VuZCB0bywgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGUgcmVhZCBidWZmZXIgYXMgd2VsbC4KLSAgICAgICAgLy8gVGhlIEVHTCBzcGVjIGlzIGEgbGl0dGxlIHVuY2xlYXIgYWJvdXQgdGhpcy4KLSAgICAgICAgZWdsX2NvbnRleHRfdCogYyA9IGVnbF9jb250ZXh0X3Q6OmNvbnRleHQoZC0+Y3R4KTsKLSAgICAgICAgaWYgKGMtPnJlYWQgPT0gZHJhdykgewotICAgICAgICAgICAgZC0+YmluZFJlYWRTdXJmYWNlKChvZ2xlc19jb250ZXh0X3QqKWQtPmN0eCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsQ29weUJ1ZmZlcnMoICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICAvLyBUT0RPOiBlZ2xDb3B5QnVmZmVycygpCi0gICAgcmV0dXJuIEVHTF9GQUxTRTsKLX0KLQotRUdMaW50IGVnbEdldEVycm9yKHZvaWQpCi17Ci0gICAgcmV0dXJuIGdldEVycm9yKCk7Ci19Ci0KLWNvbnN0IGNoYXIqIGVnbFF1ZXJ5U3RyaW5nKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgbmFtZSkKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIChjb25zdCBjaGFyKikwKTsKLQotICAgIHN3aXRjaCAobmFtZSkgewotICAgICAgICBjYXNlIEVHTF9WRU5ET1I6Ci0gICAgICAgICAgICByZXR1cm4gZ1ZlbmRvclN0cmluZzsKLSAgICAgICAgY2FzZSBFR0xfVkVSU0lPTjoKLSAgICAgICAgICAgIHJldHVybiBnVmVyc2lvblN0cmluZzsKLSAgICAgICAgY2FzZSBFR0xfRVhURU5TSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBnRXh0ZW5zaW9uc1N0cmluZzsKLSAgICAgICAgY2FzZSBFR0xfQ0xJRU5UX0FQSVM6Ci0gICAgICAgICAgICByZXR1cm4gZ0NsaWVudEFwaVN0cmluZzsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCAoY29uc3QgY2hhciAqKTApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFR0wgMS4xCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gZWdsU3VyZmFjZUF0dHJpYigKLSAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50IHZhbHVlKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICAvLyBUT0RPOiBlZ2xTdXJmYWNlQXR0cmliKCkKLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsQmluZFRleEltYWdlKAotICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYnVmZmVyKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICAvLyBUT0RPOiBlZ2xCaW5kVGV4SW1hZ2UoKQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xSZWxlYXNlVGV4SW1hZ2UoCi0gICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotICAgIC8vIFRPRE86IGVnbFJlbGVhc2VUZXhJbWFnZSgpCi0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotfQotCi1FR0xCb29sZWFuIGVnbFN3YXBJbnRlcnZhbChFR0xEaXNwbGF5IGRweSwgRUdMaW50IGludGVydmFsKQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICAvLyBUT0RPOiBlZ2xTd2FwSW50ZXJ2YWwoKQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRUdMIDEuMgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIGVnbEJpbmRBUEkoRUdMZW51bSBhcGkpCi17Ci0gICAgaWYgKGFwaSAhPSBFR0xfT1BFTkdMX0VTX0FQSSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMZW51bSBlZ2xRdWVyeUFQSSh2b2lkKQotewotICAgIHJldHVybiBFR0xfT1BFTkdMX0VTX0FQSTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xXYWl0Q2xpZW50KHZvaWQpCi17Ci0gICAgZ2xGaW5pc2goKTsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsUmVsZWFzZVRocmVhZCh2b2lkKQotewotICAgIC8vIFRPRE86IGVnbFJlbGVhc2VUaHJlYWQoKQotICAgIHJldHVybiBFR0xfVFJVRTsKLX0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcigKLSAgICAgICAgICBFR0xEaXNwbGF5IGRweSwgRUdMZW51bSBidWZ0eXBlLCBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLAotICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgLy8gVE9ETzogZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoKQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX05PX1NVUkZBQ0UpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFR0xfRUdMRVhUX1ZFUlNJT04gMwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkICgqZWdsR2V0UHJvY0FkZHJlc3MgKGNvbnN0IGNoYXIgKnByb2NuYW1lKSkoKQotewotICAgIGV4dGVudGlvbl9tYXBfdCBjb25zdCAqIGNvbnN0IG1hcCA9IGdFeHRlbnRpb25NYXA7Ci0gICAgZm9yICh1aW50MzJfdCBpPTAgOyBpPE5FTEVNKGdFeHRlbnRpb25NYXApIDsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKHByb2NuYW1lLCBtYXBbaV0ubmFtZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBbaV0uYWRkcmVzczsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xMb2NrU3VyZmFjZUtIUihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAotICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gRUdMX0ZBTFNFOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsVW5sb2NrU3VyZmFjZUtIUihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKQotewotICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gRUdMX0ZBTFNFOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVHTEltYWdlS0hSIGVnbENyZWF0ZUltYWdlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMZW51bSB0YXJnZXQsCi0gICAgICAgIEVHTENsaWVudEJ1ZmZlciBidWZmZXIsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgaWYgKGVnbF9kaXNwbGF5X3Q6OmlzX3ZhbGlkKGRweSkgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9OT19JTUFHRV9LSFIpOwotICAgIH0KLSAgICBpZiAoY3R4ICE9IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9OT19JTUFHRV9LSFIpOwotICAgIH0KLSAgICBpZiAodGFyZ2V0ICE9IEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fSU1BR0VfS0hSKTsKLSAgICB9Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVfYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIqKWJ1ZmZlcjsKLQotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24ubWFnaWMgIT0gQU5EUk9JRF9OQVRJVkVfQlVGRkVSX01BR0lDKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19JTUFHRV9LSFIpOwotCi0gICAgaWYgKG5hdGl2ZV9idWZmZXItPmNvbW1vbi52ZXJzaW9uICE9IHNpemVvZihBTmF0aXZlV2luZG93QnVmZmVyKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fSU1BR0VfS0hSKTsKLQotICAgIHN3aXRjaCAobmF0aXZlX2J1ZmZlci0+Zm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg6Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4OgotICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODoKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfNTU1MToKLSAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fSU1BR0VfS0hSKTsKLSAgICB9Ci0KLSAgICBuYXRpdmVfYnVmZmVyLT5jb21tb24uaW5jUmVmKCZuYXRpdmVfYnVmZmVyLT5jb21tb24pOwotICAgIHJldHVybiAoRUdMSW1hZ2VLSFIpbmF0aXZlX2J1ZmZlcjsKLX0KLQotRUdMQm9vbGVhbiBlZ2xEZXN0cm95SW1hZ2VLSFIoRUdMRGlzcGxheSBkcHksIEVHTEltYWdlS0hSIGltZykKLXsKLSAgICBpZiAoZWdsX2Rpc3BsYXlfdDo6aXNfdmFsaWQoZHB5KSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVfYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIqKWltZzsKLQotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24ubWFnaWMgIT0gQU5EUk9JRF9OQVRJVkVfQlVGRkVSX01BR0lDKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0KLSAgICBpZiAobmF0aXZlX2J1ZmZlci0+Y29tbW9uLnZlcnNpb24gIT0gc2l6ZW9mKEFOYXRpdmVXaW5kb3dCdWZmZXIpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0KLSAgICBuYXRpdmVfYnVmZmVyLT5jb21tb24uZGVjUmVmKCZuYXRpdmVfYnVmZmVyLT5jb21tb24pOwotCi0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBTkRST0lEIGV4dGVuc2lvbnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQm9vbGVhbiBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAotICAgICAgICBFR0xpbnQgbGVmdCwgRUdMaW50IHRvcCwgRUdMaW50IHdpZHRoLCBFR0xpbnQgaGVpZ2h0KQotewotICAgIGlmIChlZ2xfZGlzcGxheV90Ojppc192YWxpZChkcHkpID09IEVHTF9GQUxTRSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLQotICAgIGVnbF9zdXJmYWNlX3QqIGQgPSBzdGF0aWNfY2FzdDxlZ2xfc3VyZmFjZV90Kj4oZHJhdyk7Ci0gICAgaWYgKCFkLT5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0gICAgaWYgKGQtPmRweSAhPSBkcHkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0RJU1BMQVksIEVHTF9GQUxTRSk7Ci0KLSAgICAvLyBwb3N0IHRoZSBzdXJmYWNlCi0gICAgZC0+c2V0U3dhcFJlY3RhbmdsZShsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQpOwotCi0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9maXhlZF9hc20uUyBiL29wZW5nbC9saWJhZ2wvZml4ZWRfYXNtLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDQ0ZjIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9maXhlZF9hc20uUworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvZml4ZWRfYXNtLlMKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0KLSAgICAudGV4dAotICAgIC5hbGlnbgotICAgIAotICAgIC5nbG9iYWwgZ2dsRmxvYXRUb0ZpeGVkCi0gICAgLnR5cGUgZ2dsRmxvYXRUb0ZpeGVkLCAlZnVuY3Rpb24KLSAgICAuZ2xvYmFsIGdnbEZsb2F0VG9GaXhlZEZhc3QKLSAgICAudHlwZSBnZ2xGbG9hdFRvRml4ZWRGYXN0LCAlZnVuY3Rpb24KLQotCi0vKgotICogQ29udmVydHMgYSBmbG9hdCB0byBhIHMxNS4xNiBmaXhlZC1wb2ludCBudW1iZXIuCi0gKiB0aGlzIGRvZXNuJ3QgaGFuZGxlIGZsb2F0cyBvdXQgb2YgdGhlIFstMzI3NjgsICszMjc2OFsgcmFuZ2UKLSAqIGFuZCBkb2Vzbid0IHBlcmZvcm1zIHJvdW5kLXRvLW5lYXJlc3QuCi0gKiBob3dldmVyLCBpdCdzIHZlcnkgZmFzdCA6LSkKLSAqLwotCi1nZ2xGbG9hdFRvRml4ZWRGYXN0OgotICAgICAgICBtb3ZzICAgIHIxLCByMCwgbHNsICMxICAgICAgICAgIC8qIHJlbW92ZSBiaXQgc2lnbiAqLwotICAgICAgICBtb3YgICAgIHIyLCAjMHg4RSAgICAgICAgICAgICAgIC8qIDEyNyArIDE1ICovCi0gICAgICAgIHN1YiAgICAgcjEsIHIyLCByMSwgbHNyICMyNCAgICAgLyogY29tcHV0ZSBzaGlmdCAqLwotICAgICAgICBtb3YgICAgIHIyLCByMCwgbHNsICM4ICAgICAgICAgIC8qIG1hbnRpc3NhPDw4ICovCi0gICAgICAgIG9yciAgICAgcjIsIHIyLCAjMHg4MDAwMDAwMCAgICAgLyogYWRkIHRoZSBtaXNzaW5nIDEgKi8KLSAgICAgICAgbW92ICAgICByMCwgcjIsIGxzciByMSAgICAgICAgICAvKiBzY2FsZSB0byAxNi4xNiAqLwotICAgICAgICByc2JjcyAgIHIwLCByMCwgIzAgICAgICAgICAgICAgIC8qIG5lZ2F0ZSBpZiBuZWVkZWQgKi8KLSAgICAgICAgYnggICAgICBscgotCi0vKgotICogdGhpcyB2ZXJzaW9uIHJvdW5kcy10by1uZWFyZXN0IGFuZCBzYXR1cmF0ZXMgbnVtYmVycwotICogb3V0c2lkZSB0aGUgcmFuZ2UgKGJ1dCBub3QgTmFOcykuCi0gKi8KLQotZ2dsRmxvYXRUb0ZpeGVkOgotICAgICAgICBtb3YgICAgIHIxLCByMCwgbHNsICMxICAgICAgICAgIC8qIHJlbW92ZSBiaXQgc2lnbiAqLwotICAgICAgICBtb3YgICAgIHIyLCAjMHg4RSAgICAgICAgICAgICAgIC8qIDEyNyArIDE1ICovCi0gICAgICAgIHN1YnMgICAgcjEsIHIyLCByMSwgbHNyICMyNCAgICAgLyogY29tcHV0ZSBzaGlmdCAqLwotICAgICAgICBibHMgICAgIDBmICAgICAgICAgICAgICAgICAgICAgIC8qIHRvbyBiaWcgKi8KLSAgICAgICAgbW92ICAgICByMiwgcjAsIGxzbCAjOCAgICAgICAgICAvKiBtYW50aXNzYTw8OCAqLwotICAgICAgICBvcnIgICAgIHIyLCByMiwgIzB4ODAwMDAwMDAgICAgIC8qIGFkZCB0aGUgbWlzc2luZyAxICovCi0gICAgICAgIG1vdiAgICAgcjMsIHIwCi0gICAgICAgIG1vdnMgICAgcjAsIHIyLCBsc3IgcjEgICAgICAgICAgLyogc2NhbGUgdG8gMTYuMTYgKi8KLSAgICAgICAgYWRkY3MgICByMCwgcjAsICMxICAgICAgICAgICAgICAvKiByb3VuZC10by1uZWFyZXN0ICovCi0gICAgICAgIHRzdCAgICAgcjMsICMweDgwMDAwMDAwICAgICAgICAgLyogbmVnYXRpdmU/ICovCi0gICAgICAgIHJzYm5lICAgcjAsIHIwLCAjMCAgICAgICAgICAgICAgLyogbmVnYXRlIGlmIG5lZWRlZCAqLwotICAgICAgICBieCAgICAgIGxyIAotIAotMDogICAgICBhbmRzICAgIHIwLCByMCwgIzB4ODAwMDAwMDAgICAgIC8qIGtlZXAgb25seSB0aGUgc2lnbiBiaXQgKi8KLSAgICAgICAgbW92ZXEgICByMCwgIzB4N2ZmZmZmZmYgICAgICAgICAvKiBwb3NpdGl2ZSwgbWF4aW11bSB2YWx1ZSAqLwotICAgICAgICBieCAgICAgIGxyCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvZnAuY3BwIGIvb3BlbmdsL2xpYmFnbC9mcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNWYxZmUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9mcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL2ZwLmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlICJmcC5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAhZGVmaW5lZChfX2FybV9fKQotR0dMZml4ZWQgZ2dsRmxvYXRUb0ZpeGVkKGZsb2F0IHYpIHsgICAKLSAgICByZXR1cm4gR0dMZml4ZWQoZmxvb3JmKHYgKiA2NTUzNi4wZiArIDAuNWYpKTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIGdsIHsKLQotR0xmbG9hdCBmaXhlZFRvRmxvYXQoR0xmaXhlZCB4KQotewotI2lmIERFQlVHX1VTRV9GTE9BVFMKLSAgICByZXR1cm4geCAvIDY1NTM2LjBmOwotI2Vsc2UKLSAgICBpZiAoIXgpIHJldHVybiAwOwotICAgIGNvbnN0IHVpbnQzMl90IHMgPSB4ICYgMHg4MDAwMDAwMDsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHVpbnQzMl90IGk7Ci0gICAgICAgIGZsb2F0IGY7Ci0gICAgfTsKLSAgICBpID0gcyA/IC14IDogeDsKLSAgICBjb25zdCBpbnQgYyA9IGdnbENseihpKSAtIDg7Ci0gICAgaSA9IChjPj0wKSA/IChpPDxjKSA6IChpPj4tYyk7Ci0gICAgY29uc3QgdWludDMyX3QgZSA9IDEzNCAtIGM7Ci0gICAgaSAmPSB+MHg4MDAwMDA7Ci0gICAgaSB8PSBlPDwyMzsKLSAgICBpIHw9IHM7Ci0gICAgcmV0dXJuIGY7Ci0jZW5kaWYKLX0KLQotZmxvYXQgc2luZWYoZmxvYXQgeCkKLXsKLSAgICBjb25zdCBmbG9hdCBBID0gICAxLjBmIC8gKDIuMGYqTV9QSSk7Ci0gICAgY29uc3QgZmxvYXQgQiA9IC0xNi4wZjsKLSAgICBjb25zdCBmbG9hdCBDID0gICA4LjBmOwotCi0gICAgLy8gc2NhbGUgYW5nbGUgZm9yIGVhc3kgYXJndW1lbnQgcmVkdWN0aW9uCi0gICAgeCAqPSBBOwotICAgIAotICAgIGlmIChmYWJzZih4KSA+PSAwLjVmKSB7Ci0gICAgICAgIC8vIEFyZ3VtZW50IHJlZHVjdGlvbgotICAgICAgICB4ID0geCAtIGNlaWxmKHggKyAwLjVmKSArIDEuMGY7IAotICAgIH0KLQotICAgIGNvbnN0IGZsb2F0IHkgPSBCKngqZmFic2YoeCkgKyBDKng7Ci0gICAgcmV0dXJuIDAuMjIxNWYgKiAoeSpmYWJzZih5KSAtIHkpICsgeTsKLX0KLQotZmxvYXQgY29zaW5lZihmbG9hdCB4KQotewotICAgIHJldHVybiBzaW5lZih4ICsgZmxvYXQoTV9QSS8yKSk7Ci19Ci0KLXZvaWQgc2luY29zZihHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0KiBzLCBHTGZsb2F0KiBjKSB7Ci0gICAgKnMgPSBzaW5lZihhbmdsZSk7Ci0gICAgKmMgPSBjb3NpbmVmKGFuZ2xlKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGZwX3V0aWxzCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2ZwLmggYi9vcGVuZ2wvbGliYWdsL2ZwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMGMxODMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9mcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvZnAuaAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9PUEVOR0xFU19GUF9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfRlBfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2RlZmluZSBERUJVR19VU0VfRkxPQVRTICAgICAgMAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVybiAiQyIgR0xmaXhlZCBnZ2xGbG9hdFRvRml4ZWQoZmxvYXQgZikgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgZ2wgewotCi0gICAgICAgIEdMZmxvYXQgZml4ZWRUb0Zsb2F0KEdMZml4ZWQpIENPTlNUOwotCi0gICAgICAgIHZvaWQgICAgc2luY29zZihHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0KiBzLCBHTGZsb2F0KiBjKTsKLSAgICAgICAgZmxvYXQgICBzaW5lZihHTGZsb2F0IHgpIENPTlNUOwotICAgICAgICBmbG9hdCAgIGNvc2luZWYoR0xmbG9hdCB4KSBDT05TVDsKLQotaW5saW5lIGJvb2wgICAgIGNtcGYoR0xmbG9hdCBhLCBHTGZsb2F0IGIpIENPTlNUOwotaW5saW5lIGJvb2wgICAgIGlzWmVyb2YoR0xmbG9hdCkgQ09OU1Q7Ci1pbmxpbmUgYm9vbCAgICAgaXNPbmVmKEdMZmxvYXQpIENPTlNUOwotCi1pbmxpbmUgaW50ICAgICAgaXNaZXJvT3JOZWdhdGl2ZWYoR0xmbG9hdCkgQ09OU1Q7Ci0KLWlubGluZSBpbnQgICAgICBleHBvbmVudChHTGZsb2F0KSBDT05TVDsKLWlubGluZSBpbnQzMl90ICBtYW50aXNzYShHTGZsb2F0KSBDT05TVDsKLWlubGluZSBHTGZsb2F0ICBjbGFtcFRvWmVyb2YoR0xmbG9hdCkgQ09OU1Q7Ci1pbmxpbmUgR0xmbG9hdCAgcmVjaXByb2NhbGYoR0xmbG9hdCkgQ09OU1Q7Ci1pbmxpbmUgR0xmbG9hdCAgcnNxcnRmKEdMZmxvYXQpIENPTlNUOwotaW5saW5lIEdMZmxvYXQgIHNxcmYoR0xmbG9hdCkgQ09OU1Q7Ci1pbmxpbmUgR0xmbG9hdCAgYWRkRXhwZihHTGZsb2F0IHYsIGludCBlKSBDT05TVDsKLWlubGluZSBHTGZsb2F0ICBtdWwyZihHTGZsb2F0IHYpIENPTlNUOwotaW5saW5lIEdMZmxvYXQgIGRpdjJmKEdMZmxvYXQgdikgQ09OU1Q7Ci1pbmxpbmUgR0xmbG9hdCAgYWJzZihHTGZsb2F0IHYpIENPTlNUOwotCi0KLS8qIAotICogZmxvYXQgZmFzdGV4cGYoZmxvYXQpIDogYSBmYXN0IGFwcHJveGltYXRpb24gb2YgZXhwZih4KQotICoJCWdpdmUgc29tZXdoYXQgYWNjdXJhdGUgcmVzdWx0cyBmb3IgLTg4IDw9IHggPD0gODgKLSAqCi0gKiBleHAoeCkgPSAyXih4L2xuKDIpKQotICogd2UgdXNlIHRoZSBwcm9wZXJ0aWVzIG9mIGZsb2F0IGVuY29kaW5nCi0gKiB0byBnZXQgYSBmYXN0IDJeIGFuZCBsaW5lYXIgaW50ZXJwb2xhdGlvbgotICoKLSAqLwotCi1pbmxpbmUgZmxvYXQgZmFzdGV4cGYoZmxvYXQgeSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotaW5saW5lIGZsb2F0IGZhc3RleHBmKGZsb2F0IHkpCi17Ci0JdW5pb24gewotCQlmbG9hdAlyOwotCQlpbnQzMl90CWk7Ci0JfSB1OwkKLQotCS8vIDEyNypsbigyKSA9IDg4Ci0JaWYgKHkgPCAtODguMGYpIHsKLQkJdS5yID0gMC4wZjsKLQl9IGVsc2UgaWYgKHkgPiA4OC4wZikgewotCQl1LnIgPSBJTkZJTklUWTsKLQl9IGVsc2UgewotCQljb25zdCBmbG9hdCBrT25lT3ZlckxvZ1R3byA9ICgxTDw8MjMpIC8gTV9MTjI7Ci0JCWNvbnN0IGludDMyX3Qga0V4cG9uZW50QmlhcyA9IDEyN0w8PDIzOwotCQljb25zdCBpbnQzMl90IGUgPSBpbnQzMl90KHkqa09uZU92ZXJMb2dUd28pOwotCQl1LmkgPSBlICsga0V4cG9uZW50QmlhczsKLQl9Ci0JCi0JcmV0dXJuIHUucjsKLX0KLQotCi1ib29sIGNtcGYoR0xmbG9hdCBhLCBHTGZsb2F0IGIpIHsKLSNpZiBERUJVR19VU0VfRkxPQVRTCi0gICAgcmV0dXJuIGEgPT0gYjsKLSNlbHNlCi0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICAgICBmOwotICAgICAgICB1aW50MzJfdCAgICBpOwotICAgIH0gdWEsIHViOwotICAgIHVhLmYgPSBhOwotICAgIHViLmYgPSBiOwotICAgIHJldHVybiB1YS5pID09IHViLmk7Ci0jZW5kaWYKLX0gCi0KLWJvb2wgaXNaZXJvZihHTGZsb2F0IHYpIHsKLSNpZiBERUJVR19VU0VfRkxPQVRTCi0gICAgcmV0dXJuIHYgPT0gMDsKLSNlbHNlCi0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICAgICBmOwotICAgICAgICBpbnQzMl90ICAgICBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgcmV0dXJuIChpPDwxKSA9PSAwOwotI2VuZGlmCi19Ci0KLWJvb2wgaXNPbmVmKEdMZmxvYXQgdikgewotICAgIHJldHVybiBjbXBmKHYsIDEuMGYpOwotfQotCi1pbnQgaXNaZXJvT3JOZWdhdGl2ZWYoR0xmbG9hdCB2KSB7Ci0jaWYgREVCVUdfVVNFX0ZMT0FUUwotICAgIHJldHVybiB2IDw9IDA7Ci0jZWxzZQotICAgIHVuaW9uIHsKLSAgICAgICAgZmxvYXQgICAgICAgZjsKLSAgICAgICAgaW50MzJfdCAgICAgaTsKLSAgICB9OwotICAgIGYgPSB2OwotICAgIHJldHVybiBpc1plcm9mKHYpIHwgKGk+PjMxKTsKLSNlbmRpZgotfQotCi1pbnQgZXhwb25lbnQoR0xmbG9hdCB2KSB7Ci0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICBmOwotICAgICAgICB1aW50MzJfdCBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgcmV0dXJuICgoaSA8PCAxKSA+PiAyNCkgLSAxMjc7Ci19Ci0KLWludDMyX3QgbWFudGlzc2EoR0xmbG9hdCB2KSB7Ci0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICBmOwotICAgICAgICB1aW50MzJfdCBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgaWYgKCEoaSYweDdGODAwMDAwKSkgcmV0dXJuIDA7Ci0gICAgY29uc3QgaW50IHMgPSBpID4+IDMxOwotICAgIGkgfD0gKDFMPDwyMyk7Ci0gICAgaSAmPSB+MHhGRjAwMDAwMDsKLSAgICByZXR1cm4gcyA/IC1pIDogaTsKLX0KLQotR0xmbG9hdCBjbGFtcFRvWmVyb2YoR0xmbG9hdCB2KSB7Ci0jaWYgREVCVUdfVVNFX0ZMT0FUUwotICAgIHJldHVybiB2PDAgPyAwIDogKHY+MSA/IDEgOiB2KTsKLSNlbHNlCi0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICAgICBmOwotICAgICAgICBpbnQzMl90ICAgICBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgaSAmPSB+KGk+PjMxKTsKLSAgICByZXR1cm4gZjsKLSNlbmRpZgotfQotCi1HTGZsb2F0IHJlY2lwcm9jYWxmKEdMZmxvYXQgdikgewotICAgIC8vIFhYWDogZG8gYmV0dGVyCi0gICAgcmV0dXJuIDEuMGYgLyB2OwotfQotCi1HTGZsb2F0IHJzcXJ0ZihHTGZsb2F0IHYpIHsKLSAgICAvLyBYWFg6IGRvIGJldHRlcgotICAgIHJldHVybiAxLjBmIC8gc3FydGYodik7Ci19Ci0KLUdMZmxvYXQgc3FyZihHTGZsb2F0IHYpIHsKLSAgICAvLyBYWFg6IGRvIGJldHRlcgotICAgIHJldHVybiB2KnY7Ci19Ci0KLUdMZmxvYXQgYWRkRXhwZihHTGZsb2F0IHYsIGludCBlKSB7Ci0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICAgICBmOwotICAgICAgICBpbnQzMl90ICAgICBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgaWYgKGk8PDEpIHsgLy8gWFhYOiBkZWFsIHdpdGggb3Zlci91bmRlcmZsb3cJCi0gICAgICAgIGkgKz0gaW50MzJfdChlKTw8MjM7Ci0gICAgfQotICAgIHJldHVybiBmOwotfQotCi1HTGZsb2F0IG11bDJmKEdMZmxvYXQgdikgewotI2lmIERFQlVHX1VTRV9GTE9BVFMKLSAgICByZXR1cm4gdioyOwotI2Vsc2UKLSAgICByZXR1cm4gYWRkRXhwZih2LCAxKTsKLSNlbmRpZgotfQotCi1HTGZsb2F0IGRpdjJmKEdMZmxvYXQgdikgewotI2lmIERFQlVHX1VTRV9GTE9BVFMKLSAgICByZXR1cm4gdiowLjVmOwotI2Vsc2UKLSAgICByZXR1cm4gYWRkRXhwZih2LCAtMSk7Ci0jZW5kaWYKLX0KLQotR0xmbG9hdCAgYWJzZihHTGZsb2F0IHYpIHsKLSNpZiBERUJVR19VU0VfRkxPQVRTCi0gICAgcmV0dXJuIHY8MCA/IC12IDogdjsKLSNlbHNlCi0gICAgdW5pb24gewotICAgICAgICBmbG9hdCAgICAgICBmOwotICAgICAgICBpbnQzMl90ICAgICBpOwotICAgIH07Ci0gICAgZiA9IHY7Ci0gICAgaSAmPSB+MHg4MDAwMDAwMDsKLSAgICByZXR1cm4gZjsKLSNlbmRpZgotfQotCi19OyAgLy8gbmFtZXNwYWNlIGdsCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX0ZQX0gKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUyBiL29wZW5nbC9saWJhZ2wvaXRlcmF0b3JzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODY0ODIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9pdGVyYXRvcnMuUworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvaXRlcmF0b3JzLlMKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0KLSAgICAudGV4dAotICAgIC5hbGlnbgotICAgIC5hcm0KLSAgICAKLSAgICAuZ2xvYmFsIGl0ZXJhdG9yczAwMzIKLSAgICAudHlwZSBpdGVyYXRvcnMwMDMyLCAlZnVuY3Rpb24KLQotLyoKLSAqIGl0ZXJhdG9yczAwMzIKLSAqCi0gKiBNVVNUIEJFIENBTExFRCBGUk9NIEFSTSBDT0RFCi0gKgotICogcjA6IGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QqICh0aGlzKQotICogICAgICByMCArIDA6IG1fZHgwMSAKLSAqICAgICAgcjAgKyA0OiBtX2R5MTAKLSAqICAgICAgcjAgKyA4OiBtX2R4MjAKLSAqICAgICAgcjAgKzEyOiBtX2R5MDIKLSAqICAgICAgcjAgKzE2OiBtX3gwCi0gKiAgICAgIHIwICsyMDogbV95MAotICogICAgICByMCArMjQ6IG1fYXJlYQotICoJCXIwICsyODogbV9zY2FsZQotICoJCXIwICsyOTogbV9hcmVhX3NjYWxlOwotICogcjE6IGludDMyX3QqIChvdXQpCi0gKiAgICAgIHIxICsgMDogYwotICogICAgICByMSArIDQ6IGRjZHgKLSAqICAgICAgcjEgKyA4OiBkY2R5Ci0gKiAgIHIyOiBjMAotICogICByMzogYzEKLSAqIFtzcF06IGMyCi0gKi8KLSAKLWl0ZXJhdG9yczAwMzI6Ci0gICAgICAgIHN0bWZkCXNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgbHJ9Ci0gICAgICAgIGxkciAgICAgcjQsIFtzcCwgIzQqNl0KLQotICAgICAgICBsZHJiICAgIHIxMiwgW3IwLCAjMjldCi0gICAgICAgIHN1YiAgICAgcjMsIHIzLCByMgotICAgICAgICBzdWIgICAgIHI0LCByNCwgcjIKLSAgICAgICAgc3ViICAgICByMTIsIHIxMiwgIzE2Ci0gICAgICAgIG1vdiAgICAgcjMsIHIzLCBhc3IgcjEyCi0gICAgICAgIG1vdiAgICAgcjQsIHI0LCBhc3IgcjEyCi0gICAgICAgIAotICAgICAgICBsZHIgICAgIHI1LCBbcjAsICMwXQotICAgICAgICBsZHIgICAgIHIxMiwgW3IwLCAjNF0KLSAgICAgICAgc211bGwgICByOCwgbHIsIHI0LCByNQotICAgICAgICBsZHIgICAgIHI1LCBbcjAsICM4XQotICAgICAgICBzbXVsbCAgIHI2LCByNywgcjQsIHIxMgotICAgICAgICBsZHIgICAgIHIxMiwgW3IwLCAjMTJdCi0gICAgICAgIHNtbGFsICAgcjgsIGxyLCByMywgcjUKLSAgICAgICAgc21sYWwgICByNiwgcjcsIHIzLCByMTIKLQotICAgICAgICBsZHIgICAgIHIzLCBbcjAsICMxNl0gICAgICAgIC8vIG1feDAKLSAgICAgICAgbGRyICAgICByNCwgW3IwLCAjMjBdICAgICAgICAvLyBtX3gxCi0gICAgICAgIAotICAgICAgICBzdHIgICAgIHI2LCBbcjEsICM0XQotICAgICAgICBzdHIgICAgIHI4LCBbcjEsICM4XQotCi0gICAgICAgIHVtdWxsICAgcjYsIHI1LCByMywgcjYKLSAgICAgICAgdW11bGwgICByOCwgcjAsIHI0LCByOAotICAgICAgICBtbGEgICAgIHI3LCByMywgcjcsIHI1Ci0gICAgICAgIG1sYSAgICAgbHIsIHI0LCBsciwgcjAKLSAgICAgICAgYWRkcyAgICByNiwgcjYsIHI4Ci0gICAgICAgIGFkYyAgICAgcjcsIHI3LCBscgotCi0gICAgICAgIG1vdnMgICAgcjYsIHI2LCBsc3IgIzQKLSAgICAgICAgYWRjICAgICByNiwgcjYsIHI3LCBsc2wgIzI4Ci0gICAgICAgIHJzYiAgICAgcjYsIHI2LCByMiwgbHNsICMxNgotICAgICAgICBzdHIgICAgIHI2LCBbcjEsICMwXQotCi0gICAgICAgIGxkbWZkCXNwISwge3I0LCByNSwgcjYsIHI3LCByOCwgcGN9Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbGlnaHQuY3BwIGIvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzE1ZGIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NzYgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9saWdodC5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAiZnAuaCIKLSNpbmNsdWRlICJsaWdodC5oIgotI2luY2x1ZGUgInN0YXRlLmgiCi0jaW5jbHVkZSAibWF0cml4LmgiCi0KLQotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgZGVmaW5lZChfX3RodW1iX18pCi0jd2FybmluZyAibGlnaHQuY3BwIHNob3VsZCBub3QgYmUgY29tcGlsZWQgaW4gdGh1bWIgb24gQVJNLiIKLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9saWdodGluZyhvZ2xlc19jb250ZXh0X3QqIGMpOwotc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXhWYWxpZGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KTsKLXN0YXRpYyB2b2lkIGxpZ2h0VmVydGV4Tm9wKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOwotc3RhdGljIHZvaWQgbGlnaHRWZXJ0ZXgob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7Ci1zdGF0aWMgdm9pZCBsaWdodFZlcnRleE1hdGVyaWFsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdnNjYWxlMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMpOwotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCB2bm9ybTMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogYSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2c2EzKEdMZml4ZWQqIGQsCi0gICAgY29uc3QgR0xmaXhlZCogbSwgR0xmaXhlZCBzLCBjb25zdCBHTGZpeGVkKiBhKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCB2c3MzKEdMZml4ZWQqIGQsCi0gICAgY29uc3QgR0xmaXhlZCogbSwgR0xmaXhlZCBzLCBjb25zdCBHTGZpeGVkKiBhKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCB2bWxhMyhHTGZpeGVkKiBkLAotICAgIGNvbnN0IEdMZml4ZWQqIG0wLCBjb25zdCBHTGZpeGVkKiBtMSwgY29uc3QgR0xmaXhlZCogYSk7Ci1zdGF0aWMgaW5saW5lIHZvaWQgdm11bDMoR0xmaXhlZCogZCwKLSAgICBjb25zdCBHTGZpeGVkKiBtMCwgY29uc3QgR0xmaXhlZCogbTEpOwotCi1zdGF0aWMgR0xmaXhlZCBmb2dfbGluZWFyKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KTsKLXN0YXRpYyBHTGZpeGVkIGZvZ19leHAob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopOwotc3RhdGljIEdMZml4ZWQgZm9nX2V4cDIob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopOwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgaW5pdF93aGl0ZSh2ZWM0X3QmIGMpIHsKLSAgICBjLnIgPSBjLmcgPSBjLmIgPSBjLmEgPSAweDEwMDAwOwotfQotCi12b2lkIG9nbGVzX2luaXRfbGlnaHQob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8T0dMRVNfTUFYX0xJR0hUUyA7IGkrKykgewotICAgICAgICBjLT5saWdodGluZy5saWdodHNbaV0uYW1iaWVudC5hID0gMHgxMDAwMDsKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2ldLnBvc2l0aW9uLnogPSAweDEwMDAwOwotICAgICAgICBjLT5saWdodGluZy5saWdodHNbaV0uc3BvdERpci56ID0gLTB4MTAwMDA7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXS5zcG90Q3V0b2ZmID0gZ2dsSW50VG9GaXhlZCgxODApOwotICAgICAgICBjLT5saWdodGluZy5saWdodHNbaV0uYXR0ZW51YXRpb25bMF0gPSAweDEwMDAwOwotICAgIH0KLSAgICBpbml0X3doaXRlKGMtPmxpZ2h0aW5nLmxpZ2h0c1swXS5kaWZmdXNlKTsKLSAgICBpbml0X3doaXRlKGMtPmxpZ2h0aW5nLmxpZ2h0c1swXS5zcGVjdWxhcik7Ci0KLSAgICBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnIgPQotICAgIGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQuZyA9Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC5iID0gZ2dsRmxvYXRUb0ZpeGVkKDAuMmYpOwotICAgIGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQuYSA9IDB4MTAwMDA7Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS5yID0KLSAgICBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLmcgPQotICAgIGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UuYiA9IGdnbEZsb2F0VG9GaXhlZCgwLjhmKTsKLSAgICBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLmEgPSAweDEwMDAwOwotICAgIGMtPmxpZ2h0aW5nLmZyb250LnNwZWN1bGFyLmEgPSAweDEwMDAwOwotICAgIGMtPmxpZ2h0aW5nLmZyb250LmVtaXNzaW9uLmEgPSAweDEwMDAwOwotCi0gICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnIgPQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5nID0KLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuYiA9IGdnbEZsb2F0VG9GaXhlZCgwLjJmKTsKLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuYSA9IDB4MTAwMDA7Ci0KLSAgICBjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmZhY2UgPSBHTF9GUk9OVF9BTkRfQkFDSzsKLSAgICBjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLm1vZGUgPSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOwotCi0gICAgYy0+Zm9nLm1vZGUgPSBHTF9FWFA7Ci0gICAgYy0+Zm9nLmZvZyA9IGZvZ19leHA7Ci0gICAgYy0+Zm9nLmRlbnNpdHkgPSAweDEwMDAwOwotICAgIGMtPmZvZy5lbmQgPSAweDEwMDAwOwotICAgIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0ID0gMHgxMDAwMDsKLQotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci0gICAgICAgCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsIEdMX1NNT09USCk7Ci0gICAgYy0+bGlnaHRpbmcuc2hhZGVNb2RlbCA9IEdMX1NNT09USDsKLX0KLQotdm9pZCBvZ2xlc191bmluaXRfbGlnaHQob2dsZXNfY29udGV4dF90KiBjKQotewotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgY2xhbXBGKEdMZml4ZWQgZikgQ09OU1Q7Ci1pbnQzMl90IGNsYW1wRihHTGZpeGVkIGYpIHsKLSAgICBmID0gKGYgJiB+KGY+PjMxKSk7Ci0gICAgaWYgKGYgPj0gMHgxMDAwMCkKLSAgICAgICAgZiA9IDB4MTAwMDA7Ci0gICAgcmV0dXJuIGY7Ci19Ci0KLXN0YXRpYyBHTGZpeGVkIGZvZ19saW5lYXIob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopIHsKLSAgICByZXR1cm4gY2xhbXBGKGdnbE11bHgoKGMtPmZvZy5lbmQgLSAoKHo8MCk/LXo6eikpLCBjLT5mb2cuaW52RW5kTWludXNTdGFydCkpOwotfQotCi1zdGF0aWMgR0xmaXhlZCBmb2dfZXhwKG9nbGVzX2NvbnRleHRfdCogYywgR0xmaXhlZCB6KSB7Ci0gICAgY29uc3QgZmxvYXQgZSA9IGZpeGVkVG9GbG9hdChnZ2xNdWx4KGMtPmZvZy5kZW5zaXR5LCAoKHo8MCk/LXo6eikpKTsKLSAgICByZXR1cm4gY2xhbXBGKGdnbEZsb2F0VG9GaXhlZChmYXN0ZXhwZigtZSkpKTsKLX0KLQotc3RhdGljIEdMZml4ZWQgZm9nX2V4cDIob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopIHsKLSAgICBjb25zdCBmbG9hdCBlID0gZml4ZWRUb0Zsb2F0KGdnbE11bHgoYy0+Zm9nLmRlbnNpdHksIHopKTsKLSAgICByZXR1cm4gY2xhbXBGKGdnbEZsb2F0VG9GaXhlZChmYXN0ZXhwZigtZSplKSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBtYXRoIGhlbHBlcnMKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lCi12b2lkIHZzY2FsZTMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogbSwgR0xmaXhlZCBzKSB7Ci0gICAgZFswXSA9IGdnbE11bHgobVswXSwgcyk7Ci0gICAgZFsxXSA9IGdnbE11bHgobVsxXSwgcyk7Ci0gICAgZFsyXSA9IGdnbE11bHgobVsyXSwgcyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLXZvaWQgdnNhMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBtLCBHTGZpeGVkIHMsIGNvbnN0IEdMZml4ZWQqIGEpIHsKLSAgICBkWzBdID0gZ2dsTXVsQWRkeChtWzBdLCBzLCBhWzBdKTsKLSAgICBkWzFdID0gZ2dsTXVsQWRkeChtWzFdLCBzLCBhWzFdKTsKLSAgICBkWzJdID0gZ2dsTXVsQWRkeChtWzJdLCBzLCBhWzJdKTsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCB2c3MzKEdMZml4ZWQqIGQsIGNvbnN0IEdMZml4ZWQqIG0sIEdMZml4ZWQgcywgY29uc3QgR0xmaXhlZCogYSkgewotICAgIGRbMF0gPSBnZ2xNdWxTdWJ4KG1bMF0sIHMsIGFbMF0pOwotICAgIGRbMV0gPSBnZ2xNdWxTdWJ4KG1bMV0sIHMsIGFbMV0pOwotICAgIGRbMl0gPSBnZ2xNdWxTdWJ4KG1bMl0sIHMsIGFbMl0pOwotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHZtbGEzKEdMZml4ZWQqIGQsCi0gICAgICAgIGNvbnN0IEdMZml4ZWQqIG0wLCBjb25zdCBHTGZpeGVkKiBtMSwgY29uc3QgR0xmaXhlZCogYSkKLXsKLSAgICBkWzBdID0gZ2dsTXVsQWRkeChtMFswXSwgbTFbMF0sIGFbMF0pOwotICAgIGRbMV0gPSBnZ2xNdWxBZGR4KG0wWzFdLCBtMVsxXSwgYVsxXSk7Ci0gICAgZFsyXSA9IGdnbE11bEFkZHgobTBbMl0sIG0xWzJdLCBhWzJdKTsKLX0KLQotc3RhdGljIGlubGluZQotdm9pZCB2bXVsMyhHTGZpeGVkKiBkLCBjb25zdCBHTGZpeGVkKiBtMCwgY29uc3QgR0xmaXhlZCogbTEpIHsKLSAgICBkWzBdID0gZ2dsTXVseChtMFswXSwgbTFbMF0pOwotICAgIGRbMV0gPSBnZ2xNdWx4KG0wWzFdLCBtMVsxXSk7Ci0gICAgZFsyXSA9IGdnbE11bHgobTBbMl0sIG0xWzJdKTsKLX0KLQotdm9pZCB2bm9ybTMoR0xmaXhlZCogZCwgY29uc3QgR0xmaXhlZCogYSkKLXsKLSAgICAvLyB3ZSBtdXN0IHRha2UgY2FyZSBvZiBvdmVyZmxvd3Mgd2hlbiBub3JtYWxpemluZyBhIHZlY3RvcgotICAgIEdMZml4ZWQgbjsKLSAgICBpbnQzMl90IHggPSBhWzBdOyAgIHggPSB4Pj0wID8geCA6IC14OwotICAgIGludDMyX3QgeSA9IGFbMV07ICAgeSA9IHk+PTAgPyB5IDogLXk7Ci0gICAgaW50MzJfdCB6ID0gYVsyXTsgICB6ID0gej49MCA/IHogOiAtejsKLSAgICBpZiAoZ2dsX2xpa2VseSh4PD0weDY4MDAgJiYgeTw9MHg2ODAwICYmIHo8PSAweDY4MDApKSB7Ci0gICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGlzIHdpbGwgYWxsIGZpdCBvbiAzMiBiaXRzCi0gICAgICAgIG4gPSB4KnggKyB5KnkgKyB6Kno7Ci0gICAgICAgIG4gPSBnZ2xTcXJ0UmVjaXB4KG4pOwotICAgICAgICBuIDw8PSA4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGhlcmUgbm9ybV4yIGlzIGF0IGxlYXN0IDB4N0VDMDAwMDAgKD4+MzIgPT0gMC40OTUxMTcpCi0gICAgICAgIG4gPSB2c3F1YXJlMyh4LCB5LCB6KTsKLSAgICAgICAgbiA9IGdnbFNxcnRSZWNpcHgobik7Ci0gICAgfQotICAgIHZzY2FsZTMoZCwgYSwgbik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIGxpZ2h0aW5nIGVxdWF0aW9ucwotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsaWdodF9waWNrZXIob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGlmIChnZ2xfbGlrZWx5KCFjLT5saWdodGluZy5lbmFibGUpKSB7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4ID0gbGlnaHRWZXJ0ZXhOb3A7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGMtPmxpZ2h0aW5nLmNvbG9yTWF0ZXJpYWwuZW5hYmxlKSB7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4ID0gbGlnaHRWZXJ0ZXhNYXRlcmlhbDsKLSAgICB9IGVsc2UgewotICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleCA9IGxpZ2h0VmVydGV4OwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZhbGlkYXRlX2xpZ2h0X212aShvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgdWludDMyX3QgZW4gPSBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzOwotICAgIC8vIFZlY3RvciBmcm9tIG9iamVjdCB0byB2aWV3ZXIsIGluIGV5ZSBjb29yZGluYXRlcwotICAgIHdoaWxlIChlbikgewotICAgICAgICBjb25zdCBpbnQgaSA9IDMxIC0gZ2dsQ2x6KGVuKTsKLSAgICAgICAgZW4gJj0gfigxPDxpKTsKLSAgICAgICAgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKLSNpZiBPQkpFQ1RfU1BBQ0VfTElHSFRJTkcKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy5tdnVpLnBvaW50NCgmYy0+dHJhbnNmb3Jtcy5tdnVpLAotICAgICAgICAgICAgICAgICZsLm9ialBvc2l0aW9uLCAmbC5wb3NpdGlvbik7Ci0jZWxzZQotICAgICAgICBsLm9ialBvc2l0aW9uID0gbC5wb3NpdGlvbjsKLSNlbmRpZgotICAgICAgICB2bm9ybTMobC5ub3JtYWxpemVkT2JqUG9zaXRpb24udiwgbC5vYmpQb3NpdGlvbi52KTsKLSAgICB9Ci0gICAgY29uc3QgdmVjNF90IGV5ZVZpZXdlciA9IHsgMCwgMCwgMHgxMDAwMCwgMCB9OwotI2lmIE9CSkVDVF9TUEFDRV9MSUdIVElORwotICAgIGMtPnRyYW5zZm9ybXMubXZ1aS5wb2ludDMoJmMtPnRyYW5zZm9ybXMubXZ1aSwKLSAgICAgICAgICAgICZjLT5saWdodGluZy5vYmpWaWV3ZXIsICZleWVWaWV3ZXIpOwotICAgIHZub3JtMyhjLT5saWdodGluZy5vYmpWaWV3ZXIudiwgYy0+bGlnaHRpbmcub2JqVmlld2VyLnYpOwotI2Vsc2UKLSAgICBjLT5saWdodGluZy5vYmpWaWV3ZXIgPSBleWVWaWV3ZXI7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZhbGlkYXRlX2xpZ2h0KG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICAvLyBpZiBjb2xvck1hdGVyaWFsIGlzIGVuYWJsZWQsIHdlIGdldCB0aGUgY29sb3IgZnJvbSB0aGUgdmVydGV4Ci0gICAgaWYgKCFjLT5saWdodGluZy5jb2xvck1hdGVyaWFsLmVuYWJsZSkgewotICAgICAgICBtYXRlcmlhbF90JiBtYXRlcmlhbCA9IGMtPmxpZ2h0aW5nLmZyb250OwotICAgICAgICB1aW50MzJfdCBlbiA9IGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHM7Ci0gICAgICAgIHdoaWxlIChlbikgewotICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7Ci0gICAgICAgICAgICBlbiAmPSB+KDE8PGkpOwotICAgICAgICAgICAgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKLSAgICAgICAgICAgIHZtdWwzKGwuaW1wbGljaXRBbWJpZW50LnYsICBtYXRlcmlhbC5hbWJpZW50LnYsICBsLmFtYmllbnQudik7Ci0gICAgICAgICAgICB2bXVsMyhsLmltcGxpY2l0RGlmZnVzZS52LCAgbWF0ZXJpYWwuZGlmZnVzZS52LCAgbC5kaWZmdXNlLnYpOwotICAgICAgICAgICAgdm11bDMobC5pbXBsaWNpdFNwZWN1bGFyLnYsIG1hdGVyaWFsLnNwZWN1bGFyLnYsIGwuc3BlY3VsYXIudik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoaXMgaXMganVzdCBhIGZsYWcgdG8gdGVsbCBpZiB3ZSBoYXZlIGEgc3BlY3VsYXIgY29tcG9uZW50Ci0gICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIudlszXSA9Ci0gICAgICAgICAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci5yIHwKLSAgICAgICAgICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLmcgfAotICAgICAgICAgICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIuYjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgbC5yQ29uc3RBdHRlbnVhdGlvbiA9IChsLmF0dGVudWF0aW9uWzFdIHwgbC5hdHRlbnVhdGlvblsyXSk9PTA7Ci0gICAgICAgICAgICBpZiAobC5yQ29uc3RBdHRlbnVhdGlvbikKLSAgICAgICAgICAgICAgICBsLnJDb25zdEF0dGVudWF0aW9uID0gZ2dsUmVjaXBGYXN0KGwuYXR0ZW51YXRpb25bMF0pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVtaXNzaW9uIGFuZCBhbWJpZW50IGZvciB0aGUgd2hvbGUgc2NlbmUKLSAgICAgICAgdm1sYTMoICBjLT5saWdodGluZy5pbXBsaWNpdFNjZW5lRW1pc3Npb25BbmRBbWJpZW50LnYsCi0gICAgICAgICAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LnYsCi0gICAgICAgICAgICAgICAgbWF0ZXJpYWwuYW1iaWVudC52LCAKLSAgICAgICAgICAgICAgICBtYXRlcmlhbC5lbWlzc2lvbi52KTsKLSAgICAgICAgYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudC5hID0gbWF0ZXJpYWwuZGlmZnVzZS5hOwotICAgIH0KLSAgICB2YWxpZGF0ZV9saWdodF9tdmkoYyk7Ci19Ci0KLXZvaWQgaW52YWxpZGF0ZV9saWdodGluZyhvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgLy8gVE9ETzogcGljayBsaWdodFZlcnRleFZhbGlkYXRlIG9yIGxpZ2h0VmVydGV4VmFsaWRhdGVNVkkKLSAgICAvLyBpbnN0ZWFkIG9mIHN5c3RlbWF0aWNhbGx5IHRoZSBoZWF2aWVyIGxpZ2h0VmVydGV4VmFsaWRhdGUoKQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4ID0gbGlnaHRWZXJ0ZXhWYWxpZGF0ZTsKLX0KLQotdm9pZCBvZ2xlc19pbnZhbGlkYXRlX2xpZ2h0aW5nX212dWkob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci19Ci0KLXZvaWQgbGlnaHRWZXJ0ZXhOb3Aob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqIHYpCi17Ci0gICAgLy8gd2Ugc2hvdWxkIG5ldmVyIGVuZC11cCBoZXJlCi19Ci0KLXZvaWQgbGlnaHRWZXJ0ZXhWYWxpZGF0ZU1WSShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQotewotICAgIHZhbGlkYXRlX2xpZ2h0X212aShjKTsKLSAgICBsaWdodF9waWNrZXIoYyk7Ci0gICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7Ci19Ci0KLXZvaWQgbGlnaHRWZXJ0ZXhWYWxpZGF0ZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQotewotICAgIHZhbGlkYXRlX2xpZ2h0KGMpOwotICAgIGxpZ2h0X3BpY2tlcihjKTsKLSAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2KTsKLX0KLQotdm9pZCBsaWdodFZlcnRleE1hdGVyaWFsKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgLy8gZmV0Y2ggdGhlIG1hdGVyaWFsIGNvbG9yCi0gICAgY29uc3QgR0x2b2lkKiBjcCA9IGMtPmFycmF5cy5jb2xvci5lbGVtZW50KAotICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYtPmNvbG9yLnYsIGNwKTsKLQotICAgIC8vIGFjcXVpcmUgdGhlIGNvbG9yLW1hdGVyaWFsIGZyb20gdGhlIHZlcnRleAotICAgIG1hdGVyaWFsX3QmIG1hdGVyaWFsID0gYy0+bGlnaHRpbmcuZnJvbnQ7Ci0gICAgbWF0ZXJpYWwuYW1iaWVudCA9Ci0gICAgbWF0ZXJpYWwuZGlmZnVzZSA9IHYtPmNvbG9yOwotICAgIC8vIGltcGxpY2l0IGFyZ3VtZW50cyBuZWVkIHRvIGJlIGNvbXB1dGVkIHBlci92ZXJ0ZXgKLSAgICB1aW50MzJfdCBlbiA9IGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHM7Ci0gICAgd2hpbGUgKGVuKSB7Ci0gICAgICAgIGNvbnN0IGludCBpID0gMzEgLSBnZ2xDbHooZW4pOwotICAgICAgICBlbiAmPSB+KDE8PGkpOwotICAgICAgICBsaWdodF90JiBsID0gYy0+bGlnaHRpbmcubGlnaHRzW2ldOwotICAgICAgICB2bXVsMyhsLmltcGxpY2l0QW1iaWVudC52LCAgbWF0ZXJpYWwuYW1iaWVudC52LCAgbC5hbWJpZW50LnYpOwotICAgICAgICB2bXVsMyhsLmltcGxpY2l0RGlmZnVzZS52LCAgbWF0ZXJpYWwuZGlmZnVzZS52LCAgbC5kaWZmdXNlLnYpOwotICAgICAgICB2bXVsMyhsLmltcGxpY2l0U3BlY3VsYXIudiwgbWF0ZXJpYWwuc3BlY3VsYXIudiwgbC5zcGVjdWxhci52KTsKLSAgICAgICAgLy8gdGhpcyBpcyBqdXN0IGEgZmxhZyB0byB0ZWxsIGlmIHdlIGhhdmUgYSBzcGVjdWxhciBjb21wb25lbnQKLSAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLnZbM10gPQotICAgICAgICAgICAgICAgIGwuaW1wbGljaXRTcGVjdWxhci5yIHwKLSAgICAgICAgICAgICAgICBsLmltcGxpY2l0U3BlY3VsYXIuZyB8Ci0gICAgICAgICAgICAgICAgbC5pbXBsaWNpdFNwZWN1bGFyLmI7Ci0gICAgfQotICAgIC8vIGVtaXNzaW9uIGFuZCBhbWJpZW50IGZvciB0aGUgd2hvbGUgc2NlbmUKLSAgICB2bWxhMyggIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQudiwKLSAgICAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC52LAotICAgICAgICAgICAgbWF0ZXJpYWwuYW1iaWVudC52LCAKLSAgICAgICAgICAgIG1hdGVyaWFsLmVtaXNzaW9uLnYpOwotICAgIGMtPmxpZ2h0aW5nLmltcGxpY2l0U2NlbmVFbWlzc2lvbkFuZEFtYmllbnQuYSA9IG1hdGVyaWFsLmRpZmZ1c2UuYTsKLQotICAgIC8vIG5vdyB3ZSBjYW4gbGlnaHQgb3VyIHZlcnRleCBhcyB1c3VhbAotICAgIGxpZ2h0VmVydGV4KGMsIHYpOwotfQotCi12b2lkIGxpZ2h0VmVydGV4KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgLy8gZW1pc3Npb24gYW5kIGFtYmllbnQgZm9yIHRoZSB3aG9sZSBzY2VuZQotICAgIHZlYzRfdCByID0gYy0+bGlnaHRpbmcuaW1wbGljaXRTY2VuZUVtaXNzaW9uQW5kQW1iaWVudDsKLSAgICBjb25zdCB2ZWM0X3Qgb2JqVmlld2VyID0gYy0+bGlnaHRpbmcub2JqVmlld2VyOwotCi0gICAgdWludDMyX3QgZW4gPSBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzOwotICAgIGlmIChnZ2xfbGlrZWx5KGVuKSkgewotICAgICAgICAvLyBzaW5jZSB3ZSBkbyB0aGUgbGlnaHRpbmcgaW4gb2JqZWN0LXNwYWNlLCB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgIC8vIHRyYW5zZm9ybSBlYWNoIG5vcm1hbC4gSG93ZXZlciwgd2UgbWlnaHQgc3RpbGwgaGF2ZSB0byBub3JtYWxpemUKLSAgICAgICAgLy8gaXQgaWYgR0xfTk9STUFMSVpFIGlzIGVuYWJsZWQuCi0gICAgICAgIHZlYzRfdCBuOwotICAgICAgICBjLT5hcnJheXMubm9ybWFsLmZldGNoKGMsIG4udiwKLSAgICAgICAgICAgIGMtPmFycmF5cy5ub3JtYWwuZWxlbWVudCh2LT5pbmRleCAmIHZlcnRleF9jYWNoZV90OjpJTkRFWF9NQVNLKSk7Ci0KLSNpZiAhT0JKRUNUX1NQQUNFX0xJR0hUSU5HCi0gICAgICAgIGMtPnRyYW5zZm9ybXMubXZ1aS5wb2ludDMoJmMtPnRyYW5zZm9ybXMubXZ1aSwgJm4sICZuKTsKLSNlbmRpZgotCi0gICAgICAgIC8vIFRPRE86IHJpZ2h0IG5vdyB3ZSBoYW5kbGUgR0xfUkVTQ0FMRV9OT1JNQUxTIGFzIGlmIGl0IHdlcmUKLSAgICAgICAgLy8gR0xfTk9STUFMSVpFLiBXZSBjb3VsZCBvcHRpbWl6ZSB0aGlzIGJ5ICBzY2FsaW5nIG12dWkgCi0gICAgICAgIC8vIGFwcHJvcHJpYXRlbHkgaW5zdGVhZC4KLSAgICAgICAgaWYgKGMtPnRyYW5zZm9ybXMucmVzY2FsZU5vcm1hbHMpCi0gICAgICAgICAgICB2bm9ybTMobi52LCBuLnYpOwotCi0gICAgICAgIGNvbnN0IG1hdGVyaWFsX3QmIG1hdGVyaWFsID0gYy0+bGlnaHRpbmcuZnJvbnQ7Ci0gICAgICAgIGNvbnN0IGludCB0d29TaWRlID0gYy0+bGlnaHRpbmcubGlnaHRNb2RlbC50d29TaWRlOwotCi0gICAgICAgIHdoaWxlIChlbikgewotICAgICAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihlbik7Ci0gICAgICAgICAgICBlbiAmPSB+KDE8PGkpOwotICAgICAgICAgICAgY29uc3QgbGlnaHRfdCYgbCA9IGMtPmxpZ2h0aW5nLmxpZ2h0c1tpXTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmVjNF90IGQsIHQ7Ci0gICAgICAgICAgICBHTGZpeGVkIHM7Ci0gICAgICAgICAgICBHTGZpeGVkIHNxRGlzdCA9IDB4MTAwMDA7Ci0KLSAgICAgICAgICAgIC8vIGNvbXB1dGUgdmVydGV4LXRvLWxpZ2h0IHZlY3RvcgotICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShsLnBvc2l0aW9uLncpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbGlnaHRQb3MvMS4wIC0gdmVydGV4L3ZlcnRleC53ID09IGxpZ2h0UG9zKnZlcnRleC53IC0gdmVydGV4Ci0gICAgICAgICAgICAgICAgdnNzMyhkLnYsIGwub2JqUG9zaXRpb24udiwgdi0+b2JqLncsIHYtPm9iai52KTsKLSAgICAgICAgICAgICAgICBzcURpc3QgPSBkb3QzKGQudiwgZC52KTsKLSAgICAgICAgICAgICAgICB2c2NhbGUzKGQudiwgZC52LCBnZ2xTcXJ0UmVjaXB4KHNxRGlzdCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBhdm9pZCBjb3B5IGhlcmUKLSAgICAgICAgICAgICAgICBkID0gbC5ub3JtYWxpemVkT2JqUG9zaXRpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFtYmllbnQgJiBkaWZmdXNlCi0gICAgICAgICAgICBzID0gZG90MyhuLnYsIGQudik7Ci0gICAgICAgICAgICBzID0gKHM8MCkgPyAodHdvU2lkZT8oLXMpOjApIDogczsKLSAgICAgICAgICAgIHZzYTModC52LCBsLmltcGxpY2l0RGlmZnVzZS52LCBzLCBsLmltcGxpY2l0QW1iaWVudC52KTsKLQotICAgICAgICAgICAgLy8gc3BlY3VsYXIKLSAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkocyAmJiBsLmltcGxpY2l0U3BlY3VsYXIudlszXSkpIHsKLSAgICAgICAgICAgICAgICB2ZWM0X3QgaDsKLSAgICAgICAgICAgICAgICBoLnggPSBkLnggKyBvYmpWaWV3ZXIueDsKLSAgICAgICAgICAgICAgICBoLnkgPSBkLnkgKyBvYmpWaWV3ZXIueTsKLSAgICAgICAgICAgICAgICBoLnogPSBkLnogKyBvYmpWaWV3ZXIuejsKLSAgICAgICAgICAgICAgICB2bm9ybTMoaC52LCBoLnYpOwotICAgICAgICAgICAgICAgIHMgPSBkb3QzKG4udiwgaC52KTsKLSAgICAgICAgICAgICAgICBzID0gKHM8MCkgPyAodHdvU2lkZT8oLXMpOjApIDogczsKLSAgICAgICAgICAgICAgICBpZiAocyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcyA9IGdnbFBvd3gocywgbWF0ZXJpYWwuc2hpbmluZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgdnNhMyh0LnYsIGwuaW1wbGljaXRTcGVjdWxhci52LCBzLCB0LnYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc3BvdAotICAgICAgICAgICAgaWYgKGdnbF91bmxpa2VseShsLnNwb3RDdXRvZmYgIT0gZ2dsSW50VG9GaXhlZCgxODApKSkgewotICAgICAgICAgICAgICAgIEdMZml4ZWQgc3BvdEF0dCA9IC1kb3QzKGwubm9ybWFsaXplZFNwb3REaXIudiwgZC52KTsKLSAgICAgICAgICAgICAgICBpZiAoc3BvdEF0dCA+PSBsLnNwb3RDdXRvZmZDb3NpbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdnNjYWxlMyh0LnYsIHQudiwgZ2dsUG93eChzcG90QXR0LCBsLnNwb3RFeHApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF0dGVudWF0aW9uCi0gICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGwucG9zaXRpb24udykpIHsKLSAgICAgICAgICAgICAgICBpZiAobC5yQ29uc3RBdHRlbnVhdGlvbikgewotICAgICAgICAgICAgICAgICAgICBzID0gbC5yQ29uc3RBdHRlbnVhdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzID0gZ2dsTXVsQWRkeChzcURpc3QsIGwuYXR0ZW51YXRpb25bMl0sIGwuYXR0ZW51YXRpb25bMF0pOwotICAgICAgICAgICAgICAgICAgICBpZiAobC5hdHRlbnVhdGlvblsxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBnZ2xNdWxBZGR4KGdnbFNxcnR4KHNxRGlzdCksIGwuYXR0ZW51YXRpb25bMV0sIHMpOwotICAgICAgICAgICAgICAgICAgICBzID0gZ2dsUmVjaXBGYXN0KHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2c2NhbGUzKHQudiwgdC52LCBzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgci5yICs9IHQucjsKLSAgICAgICAgICAgIHIuZyArPSB0Lmc7Ci0gICAgICAgICAgICByLmIgKz0gdC5iOwotICAgICAgICB9Ci0gICAgfQotICAgIHYtPmNvbG9yLnIgPSBnZ2xDbGFtcHgoci5yKTsKLSAgICB2LT5jb2xvci5nID0gZ2dsQ2xhbXB4KHIuZyk7Ci0gICAgdi0+Y29sb3IuYiA9IGdnbENsYW1weChyLmIpOwotICAgIHYtPmNvbG9yLmEgPSBnZ2xDbGFtcHgoci5hKTsKLSAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodE1vZGVseChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KHBuYW1lICE9IEdMX0xJR0hUX01PREVMX1RXT19TSURFKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwudHdvU2lkZSA9IHBhcmFtID8gR0xfVFJVRSA6IEdMX0ZBTFNFOwotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0eChHTGVudW0gaSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtLCBvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChpLUdMX0xJR0hUMCkgPj0gT0dMRVNfTUFYX0xJR0hUUykpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxpZ2h0X3QmIGxpZ2h0ID0gYy0+bGlnaHRpbmcubGlnaHRzW2ktR0xfTElHSFQwXTsKLSAgICBjb25zdCBHTGZpeGVkIGtEZWdUb1JhZCA9IEdMZml4ZWQoKE1fUEkgKiBnZ2xJbnRUb0ZpeGVkKDEpKSAvIDE4MC4wZik7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKLSAgICAgICAgaWYgKEdHTGZpeGVkKHBhcmFtKSA+PSBnZ2xJbnRUb0ZpeGVkKDEyOCkpIHsKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxpZ2h0LnNwb3RFeHAgPSBwYXJhbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TUE9UX0NVVE9GRjoKLSAgICAgICAgaWYgKHBhcmFtIT1nZ2xJbnRUb0ZpeGVkKDE4MCkgJiYgR0dMZml4ZWQocGFyYW0pPj1nZ2xJbnRUb0ZpeGVkKDkwKSkgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGlnaHQuc3BvdEN1dG9mZiA9IHBhcmFtOwotICAgICAgICBsaWdodC5zcG90Q3V0b2ZmQ29zaW5lID0gCi0gICAgICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGNvc2luZWYoKE1fUEkvKDE4MC4wZio2NTUzNi4wZikpKnBhcmFtKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfQ09OU1RBTlRfQVRURU5VQVRJT046Ci0gICAgICAgIGlmIChwYXJhbSA8IDApIHsKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGxpZ2h0LmF0dGVudWF0aW9uWzBdID0gcGFyYW07Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTElORUFSX0FUVEVOVUFUSU9OOgotICAgICAgICBpZiAocGFyYW0gPCAwKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBsaWdodC5hdHRlbnVhdGlvblsxXSA9IHBhcmFtOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTjoKLSAgICAgICAgaWYgKHBhcmFtIDwgMCkgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbGlnaHQuYXR0ZW51YXRpb25bMl0gPSBwYXJhbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotfQotCi1zdGF0aWMgdm9pZCBsaWdodHh2KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcywgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGlmIChnZ2xfdW5saWtlbHkodWludDMyX3QoaS1HTF9MSUdIVDApID49IE9HTEVTX01BWF9MSUdIVFMpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBHTGZpeGVkKiB3aGF0OwotICAgIGxpZ2h0X3QmIGxpZ2h0ID0gYy0+bGlnaHRpbmcubGlnaHRzW2ktR0xfTElHSFQwXTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9BTUJJRU5UOgotICAgICAgICB3aGF0ID0gbGlnaHQuYW1iaWVudC52OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0RJRkZVU0U6Ci0gICAgICAgIHdoYXQgPSBsaWdodC5kaWZmdXNlLnY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU1BFQ1VMQVI6Ci0gICAgICAgIHdoYXQgPSBsaWdodC5zcGVjdWxhci52OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BPU0lUSU9OOiB7Ci0gICAgICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TU9ERUxWSUVXKTsKLSAgICAgICAgdHJhbnNmb3JtX3QmIG12ID0gYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudHJhbnNmb3JtOwotICAgICAgICBtdi5wb2ludDQoJm12LCAmbGlnaHQucG9zaXRpb24sIHJlaW50ZXJwcmV0X2Nhc3Q8dmVjNF90IGNvbnN0Kj4ocGFyYW1zKSk7Ci0gICAgICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBHTF9TUE9UX0RJUkVDVElPTjogewotI2lmIE9CSkVDVF9TUEFDRV9MSUdIVElORwotICAgICAgICBvZ2xlc192YWxpZGF0ZV90cmFuc2Zvcm0oYywgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WVUkpOwotICAgICAgICB0cmFuc2Zvcm1fdCYgbXZ1aSA9IGMtPnRyYW5zZm9ybXMubXZ1aTsKLSAgICAgICAgbXZ1aS5wb2ludDMoJm12dWksICZsaWdodC5zcG90RGlyLCByZWludGVycHJldF9jYXN0PHZlYzRfdCBjb25zdCo+KHBhcmFtcykpOwotI2Vsc2UKLSAgICAgICAgbGlnaHQuc3BvdERpciA9ICpyZWludGVycHJldF9jYXN0PHZlYzRfdCBjb25zdCo+KHBhcmFtcyk7Ci0jZW5kaWYKLSAgICAgICAgdm5vcm0zKGxpZ2h0Lm5vcm1hbGl6ZWRTcG90RGlyLnYsIGxpZ2h0LnNwb3REaXIudik7Ci0gICAgICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgbGlnaHR4KGksIHBuYW1lLCBwYXJhbXNbMF0sIGMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHdoYXRbMF0gPSBwYXJhbXNbMF07Ci0gICAgd2hhdFsxXSA9IHBhcmFtc1sxXTsKLSAgICB3aGF0WzJdID0gcGFyYW1zWzJdOwotICAgIHdoYXRbM10gPSBwYXJhbXNbM107Ci0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLX0KLQotc3RhdGljIHZvaWQgbWF0ZXJpYWx4KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGZhY2UgIT0gR0xfRlJPTlRfQU5EX0JBQ0spKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGdnbF91bmxpa2VseShwbmFtZSAhPSBHTF9TSElOSU5FU1MpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+bGlnaHRpbmcuZnJvbnQuc2hpbmluZXNzID0gcGFyYW07Ci0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLX0KLQotc3RhdGljIHZvaWQgZm9neChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9GT0dfREVOU0lUWToKLSAgICAgICAgaWYgKHBhcmFtID49IDApIHsKLSAgICAgICAgICAgIGMtPmZvZy5kZW5zaXR5ID0gcGFyYW07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9GT0dfU1RBUlQ6Ci0gICAgICAgIGMtPmZvZy5zdGFydCA9IHBhcmFtOwotICAgICAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IGdnbFJlY2lwKGMtPmZvZy5lbmQgLSBjLT5mb2cuc3RhcnQpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX0ZPR19FTkQ6Ci0gICAgICAgIGMtPmZvZy5lbmQgPSBwYXJhbTsKLSAgICAgICAgYy0+Zm9nLmludkVuZE1pbnVzU3RhcnQgPSBnZ2xSZWNpcChjLT5mb2cuZW5kIC0gYy0+Zm9nLnN0YXJ0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9GT0dfTU9ERToKLSAgICAgICAgc3dpdGNoIChwYXJhbSkgewotICAgICAgICBjYXNlIEdMX0xJTkVBUjoKLSAgICAgICAgICAgIGMtPmZvZy5tb2RlID0gcGFyYW07Ci0gICAgICAgICAgICBjLT5mb2cuZm9nID0gZm9nX2xpbmVhcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdMX0VYUDoKLSAgICAgICAgICAgIGMtPmZvZy5tb2RlID0gcGFyYW07Ci0gICAgICAgICAgICBjLT5mb2cuZm9nID0gZm9nX2V4cDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdMX0VYUDI6Ci0gICAgICAgICAgICBjLT5mb2cubW9kZSA9IHBhcmFtOwotICAgICAgICAgICAgYy0+Zm9nLmZvZyA9IGZvZ19leHAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgbGlnaHRpbmcgQVBJcwotI2VuZGlmCi0KLXZvaWQgZ2xTaGFkZU1vZGVsKEdMZW51bSBtb2RlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKGdnbF91bmxpa2VseShtb2RlICE9IEdMX1NNT09USCAmJiBtb2RlICE9IEdMX0ZMQVQpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+bGlnaHRpbmcuc2hhZGVNb2RlbCA9IG1vZGU7Ci19Ci0KLXZvaWQgZ2xMaWdodE1vZGVsZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBsaWdodE1vZGVseChwbmFtZSwgZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtKSwgYyk7Ci19Ci0KLXZvaWQgZ2xMaWdodE1vZGVseChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBsaWdodE1vZGVseChwbmFtZSwgcGFyYW0sIGMpOwotfQotCi12b2lkIGdsTGlnaHRNb2RlbGZ2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHBuYW1lID09IEdMX0xJR0hUX01PREVMX1RXT19TSURFKSB7Ci0gICAgICAgIGxpZ2h0TW9kZWx4KHBuYW1lLCBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKSwgYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KHBuYW1lICE9IEdMX0xJR0hUX01PREVMX0FNQklFTlQpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuciA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOwotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0TW9kZWwuYW1iaWVudC5nID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1sxXSk7Ci0gICAgYy0+bGlnaHRpbmcubGlnaHRNb2RlbC5hbWJpZW50LmIgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuYSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbM10pOwotICAgIGludmFsaWRhdGVfbGlnaHRpbmcoYyk7Ci19Ci0KLXZvaWQgZ2xMaWdodE1vZGVseHYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAocG5hbWUgPT0gR0xfTElHSFRfTU9ERUxfVFdPX1NJREUpIHsKLSAgICAgICAgbGlnaHRNb2RlbHgocG5hbWUsIHBhcmFtc1swXSwgYyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KHBuYW1lICE9IEdMX0xJR0hUX01PREVMX0FNQklFTlQpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuciA9IHBhcmFtc1swXTsKLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuZyA9IHBhcmFtc1sxXTsKLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuYiA9IHBhcmFtc1syXTsKLSAgICBjLT5saWdodGluZy5saWdodE1vZGVsLmFtYmllbnQuYSA9IHBhcmFtc1szXTsKLSAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi12b2lkIGdsTGlnaHRmKEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBsaWdodHgoaSwgcG5hbWUsIGdnbEZsb2F0VG9GaXhlZChwYXJhbSksIGMpOwotfQotCi12b2lkIGdsTGlnaHR4KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBsaWdodHgoaSwgcG5hbWUsIHBhcmFtLCBjKTsKLX0KLQotdm9pZCBnbExpZ2h0ZnYoR0xlbnVtIGksIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNhc2UgR0xfU1BPVF9FWFBPTkVOVDoKLSAgICBjYXNlIEdMX1NQT1RfQ1VUT0ZGOgotICAgIGNhc2UgR0xfQ09OU1RBTlRfQVRURU5VQVRJT046Ci0gICAgY2FzZSBHTF9MSU5FQVJfQVRURU5VQVRJT046Ci0gICAgY2FzZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT046Ci0gICAgICAgIGxpZ2h0eChpLCBwbmFtZSwgZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSksIGMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgR0xmaXhlZCBwYXJhbXN4WzRdOwotICAgIHBhcmFtc3hbMF0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKLSAgICBwYXJhbXN4WzFdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1sxXSk7Ci0gICAgcGFyYW1zeFsyXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMl0pOwotICAgIGlmIChwbmFtZSAhPSBHTF9TUE9UX0RJUkVDVElPTikKLSAgICAgICAgcGFyYW1zeFszXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbM10pOwotCi0gICAgbGlnaHR4dihpLCBwbmFtZSwgcGFyYW1zeCwgYyk7Ci19Ci0KLXZvaWQgZ2xMaWdodHh2KEdMZW51bSBpLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGxpZ2h0eHYoaSwgcG5hbWUsIHBhcmFtcywgYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXZvaWQgZ2xNYXRlcmlhbGYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIG1hdGVyaWFseChmYWNlLCBwbmFtZSwgZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtKSwgYyk7Ci19Ci0KLXZvaWQgZ2xNYXRlcmlhbHgoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIG1hdGVyaWFseChmYWNlLCBwbmFtZSwgcGFyYW0sIGMpOwotfQotCi12b2lkIGdsTWF0ZXJpYWxmdigKLSAgICBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGZhY2UgIT0gR0xfRlJPTlRfQU5EX0JBQ0spKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgR0xmaXhlZCogd2hhdD0wOwotICAgIEdMZml4ZWQqIG90aGVyPTA7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNhc2UgR0xfQU1CSUVOVDogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQudjsgYnJlYWs7Ci0gICAgY2FzZSBHTF9ESUZGVVNFOiAgICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZGlmZnVzZS52OyBicmVhazsKLSAgICBjYXNlIEdMX1NQRUNVTEFSOiAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5zcGVjdWxhci52OyBicmVhazsKLSAgICBjYXNlIEdMX0VNSVNTSU9OOiAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5lbWlzc2lvbi52OyBicmVhazsKLSAgICBjYXNlIEdMX0FNQklFTlRfQU5EX0RJRkZVU0U6Ci0gICAgICAgIHdoYXQgID0gYy0+bGlnaHRpbmcuZnJvbnQuYW1iaWVudC52OwotICAgICAgICBvdGhlciA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9TSElOSU5FU1M6Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmZyb250LnNoaW5pbmVzcyA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOwotICAgICAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotICAgICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3aGF0WzBdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1swXSk7Ci0gICAgd2hhdFsxXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMV0pOwotICAgIHdoYXRbMl0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzJdKTsKLSAgICB3aGF0WzNdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1szXSk7Ci0gICAgaWYgKG90aGVyKSB7Ci0gICAgICAgIG90aGVyWzBdID0gd2hhdFswXTsKLSAgICAgICAgb3RoZXJbMV0gPSB3aGF0WzFdOwotICAgICAgICBvdGhlclsyXSA9IHdoYXRbMl07Ci0gICAgICAgIG90aGVyWzNdID0gd2hhdFszXTsKLSAgICB9Ci0gICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLX0KLQotdm9pZCBnbE1hdGVyaWFseHYoCi0gICAgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKGdnbF91bmxpa2VseShmYWNlICE9IEdMX0ZST05UX0FORF9CQUNLKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEdMZml4ZWQqIHdoYXQ9MDsKLSAgICBHTGZpeGVkKiBvdGhlcj0wOwotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIEdMX0FNQklFTlQ6ICAgIHdoYXQgPSBjLT5saWdodGluZy5mcm9udC5hbWJpZW50LnY7IGJyZWFrOwotICAgIGNhc2UgR0xfRElGRlVTRTogICAgd2hhdCA9IGMtPmxpZ2h0aW5nLmZyb250LmRpZmZ1c2UudjsgYnJlYWs7Ci0gICAgY2FzZSBHTF9TUEVDVUxBUjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuc3BlY3VsYXIudjsgYnJlYWs7Ci0gICAgY2FzZSBHTF9FTUlTU0lPTjogICB3aGF0ID0gYy0+bGlnaHRpbmcuZnJvbnQuZW1pc3Npb24udjsgYnJlYWs7Ci0gICAgY2FzZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFOgotICAgICAgICB3aGF0ICA9IGMtPmxpZ2h0aW5nLmZyb250LmFtYmllbnQudjsKLSAgICAgICAgb3RoZXIgPSBjLT5saWdodGluZy5mcm9udC5kaWZmdXNlLnY7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU0hJTklORVNTOgotICAgICAgICBjLT5saWdodGluZy5mcm9udC5zaGluaW5lc3MgPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKLSAgICAgICAgaW52YWxpZGF0ZV9saWdodGluZyhjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd2hhdFswXSA9IHBhcmFtc1swXTsKLSAgICB3aGF0WzFdID0gcGFyYW1zWzFdOwotICAgIHdoYXRbMl0gPSBwYXJhbXNbMl07Ci0gICAgd2hhdFszXSA9IHBhcmFtc1szXTsKLSAgICBpZiAob3RoZXIpIHsKLSAgICAgICAgb3RoZXJbMF0gPSB3aGF0WzBdOwotICAgICAgICBvdGhlclsxXSA9IHdoYXRbMV07Ci0gICAgICAgIG90aGVyWzJdID0gd2hhdFsyXTsKLSAgICAgICAgb3RoZXJbM10gPSB3aGF0WzNdOwotICAgIH0KLSAgICBpbnZhbGlkYXRlX2xpZ2h0aW5nKGMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBmb2cKLSNlbmRpZgotCi12b2lkIGdsRm9nZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIEdMZml4ZWQgcGFyYW14ID0gKEdMZml4ZWQpcGFyYW07Ci0gICAgaWYgKHBuYW1lICE9IEdMX0ZPR19NT0RFKQotICAgICAgICBwYXJhbXggPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW0pOwotICAgIGZvZ3gocG5hbWUsIHBhcmFteCwgYyk7Ci19Ci0KLXZvaWQgZ2xGb2d4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZm9neChwbmFtZSwgcGFyYW0sIGMpOwotfQotCi12b2lkIGdsRm9nZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAocG5hbWUgIT0gR0xfRk9HX0NPTE9SKSB7Ci0gICAgICAgIEdMZml4ZWQgcGFyYW14ID0gKEdMZml4ZWQpcGFyYW1zWzBdOwotICAgICAgICBpZiAocG5hbWUgIT0gR0xfRk9HX01PREUpCi0gICAgICAgICAgICBwYXJhbXggPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzBdKTsKLSAgICAgICAgZm9neChwbmFtZSwgcGFyYW14LCBjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBHTGZpeGVkIHBhcmFtc3hbNF07Ci0gICAgcGFyYW1zeFswXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbMF0pOwotICAgIHBhcmFtc3hbMV0gPSBnZ2xGbG9hdFRvRml4ZWQocGFyYW1zWzFdKTsKLSAgICBwYXJhbXN4WzJdID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1syXSk7Ci0gICAgcGFyYW1zeFszXSA9IGdnbEZsb2F0VG9GaXhlZChwYXJhbXNbM10pOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZm9nQ29sb3IzeHYoYywgcGFyYW1zeCk7Ci19Ci0KLXZvaWQgZ2xGb2d4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChwbmFtZSAhPSBHTF9GT0dfQ09MT1IpIHsKLSAgICAgICAgZm9neChwbmFtZSwgcGFyYW1zWzBdLCBjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmZvZ0NvbG9yM3h2KGMsIHBhcmFtcyk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmggYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTMzMDkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9saWdodC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9saWdodC5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX0xJR0hUX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19MSUdIVF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi0vLyBTZXQgdG8gMSBmb3Igb2JqZWN0LXNwYWNlIGxpZ2h0aW5nIGV2YWx1YXRpb24uCi0vLyBUaGVyZSBhcmUgc3RpbGwgc29tZSBidWdzIHdpdGggb2JqZWN0LXNwYWNlIGxpZ2h0aW5nLAotLy8gZXNwZWNpYWxseSB2aXNpYmxlIGluIHRoZSBTYW4gQW5nZWxlcyBkZW1vLgotI2RlZmluZSBPQkpFQ1RfU1BBQ0VfTElHSFRJTkcgICAwCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1uYW1lc3BhY2UgZ2wgewotc3RydWN0IG9nbGVzX2NvbnRleHRfdDsKLX07Ci0KLXZvaWQgb2dsZXNfaW5pdF9saWdodChvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc191bmluaXRfbGlnaHQob2dsZXNfY29udGV4dF90KiBjKTsKLXZvaWQgb2dsZXNfaW52YWxpZGF0ZV9saWdodGluZ19tdnVpKG9nbGVzX2NvbnRleHRfdCogYyk7Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX0xJR0hUX0gKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwIGIvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGVjY2IzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMzQgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9tYXRyaXguY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAiZnAuaCIKLSNpbmNsdWRlICJzdGF0ZS5oIgotI2luY2x1ZGUgIm1hdHJpeC5oIgotI2luY2x1ZGUgInZlcnRleC5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0KLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmIGRlZmluZWQoX190aHVtYl9fKQotI3dhcm5pbmcgIm1hdHJpeC5jcHAgc2hvdWxkIG5vdCBiZSBjb21waWxlZCBpbiB0aHVtYiBvbiBBUk0uIgotI2VuZGlmCi0KLSNkZWZpbmUgSShfaSwgX2opICgoX2opKyA0KihfaSkpCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY29uc3QgR0xmbG9hdCBnSWRlbnRpdHlmWzE2XSA9IHsgMSwwLDAsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLDEsMCwwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwxLDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwLDAsMSB9OwotCi1zdGF0aWMgY29uc3QgbWF0cml4eF90IGdJZGVudGl0eXggPSB7IAotICAgICAgICAgICAgeyAgIDB4MTAwMDAsMCwwLDAsCi0gICAgICAgICAgICAgICAgMCwweDEwMDAwLDAsMCwKLSAgICAgICAgICAgICAgICAwLDAsMHgxMDAwMCwwLAotICAgICAgICAgICAgICAgIDAsMCwwLDB4MTAwMDAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotc3RhdGljIHZvaWQgcG9pbnQyX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBwb2ludDNfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogYywgdmVjNF90IGNvbnN0KiBvKTsKLXN0YXRpYyB2b2lkIHBvaW50NF9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBjLCB2ZWM0X3QgY29uc3QqIG8pOwotc3RhdGljIHZvaWQgbm9ybWFsX19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBwb2ludDJfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBwb2ludDNfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBwb2ludDRfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBwb2ludDNfX212dWkodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci1zdGF0aWMgdm9pZCBwb2ludDRfX212dWkodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGMsIHZlYzRfdCBjb25zdCogbyk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXZvaWQgb2dsZXNfaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LmluaXQoT0dMRVNfTU9ERUxWSUVXX1NUQUNLX0RFUFRIKTsKLSAgICBjLT50cmFuc2Zvcm1zLnByb2plY3Rpb24uaW5pdChPR0xFU19QUk9KRUNUSU9OX1NUQUNLX0RFUFRIKTsKLSAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2ldLmluaXQoT0dMRVNfVEVYVFVSRV9TVEFDS19ERVBUSCk7Ci0KLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQgPSAmYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXc7Ci0gICAgYy0+dHJhbnNmb3Jtcy5tYXRyaXhNb2RlID0gR0xfTU9ERUxWSUVXOwotICAgIGMtPnRyYW5zZm9ybXMuZGlydHkgPSAgIHRyYW5zZm9ybV9zdGF0ZV90OjpWSUVXUE9SVCB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlVJIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZJVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1WUDsKLSAgICBjLT50cmFuc2Zvcm1zLm12cC5sb2FkSWRlbnRpdHkoKTsKLSAgICBjLT50cmFuc2Zvcm1zLm12cDQubG9hZElkZW50aXR5KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5tdml0NC5sb2FkSWRlbnRpdHkoKTsKLSAgICBjLT50cmFuc2Zvcm1zLm12dWkubG9hZElkZW50aXR5KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy52cHQubG9hZElkZW50aXR5KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy52cHQuek5lYXIgPSAwLjBmOwotICAgIGMtPnRyYW5zZm9ybXMudnB0LnpGYXIgID0gMS4wZjsKLX0KLQotdm9pZCBvZ2xlc191bmluaXRfbWF0cml4KG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy51bmluaXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLnByb2plY3Rpb24udW5pbml0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspCi0gICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtpXS51bmluaXQoKTsKLX0KLQotc3RhdGljIHZvaWQgdmFsaWRhdGVfcGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IChjLT5jbGlwUGxhbmVzLmVuYWJsZSkgPwotICAgICAgICBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0QgOiBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRDsKLSAgICBpZiAoZW5hYmxlcyAmIChHR0xfRU5BQkxFX0RFUFRIX1RFU1R8R0dMX0VOQUJMRV9GT0cpKSB7Ci0gICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWjsKLSAgICAgICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzJkdHTF9FTkFCTEVfRk9HKSkKLSAgICAgICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFo7Ci0gICAgfQotICAgIGlmICgoYy0+YXJyYXlzLnZlcnRleC5zaXplICE9IDQpICYmCi0gICAgICAgIChjLT50cmFuc2Zvcm1zLm12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikpIHsKLSAgICAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlMkQ7Ci0gICAgfQotICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZShjLCB2KTsKLX0KLQotdm9pZCBvZ2xlc19pbnZhbGlkYXRlX3BlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBjLT5hcnJheXMucGVyc3BlY3RpdmUgPSB2YWxpZGF0ZV9wZXJzcGVjdGl2ZTsKLX0KLQotdm9pZCBvZ2xlc192YWxpZGF0ZV90cmFuc2Zvcm1faW1wbChvZ2xlc19jb250ZXh0X3QqIGMsIHVpbnQzMl90IHdhbnQpCi17Ci0gICAgaW50IGRpcnR5ID0gYy0+dHJhbnNmb3Jtcy5kaXJ0eSAmIHdhbnQ7Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgbW9kZWx2aWV3Ci0gICAgaWYgKGRpcnR5ICYgdHJhbnNmb3JtX3N0YXRlX3Q6Ok1PREVMVklFVykgewotICAgICAgICBjLT50cmFuc2Zvcm1zLm1vZGVsdmlldy52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlIHRoZSBwcm9qZWN0aW9uIHN0YWNrIChpbiBmYWN0LCBpdCdzIG5ldmVyIG5lZWRlZCkKLSAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6UFJPSkVDVElPTikgewotICAgICAgICBjLT50cmFuc2Zvcm1zLnByb2plY3Rpb24udmFsaWRhdGUoKTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgdmlld3BvcnQgdHJhbnNmb3JtYXRpb24KLSAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6VklFV1BPUlQpIHsKLSAgICAgICAgdnBfdHJhbnNmb3JtX3QmIHZwdCA9IGMtPnRyYW5zZm9ybXMudnB0OwotICAgICAgICB2cHQudHJhbnNmb3JtLm1hdHJpeC5sb2FkKHZwdC5tYXRyaXgpOwotICAgICAgICB2cHQudHJhbnNmb3JtLnBpY2tlcigpOwotICAgIH0KLQotICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBtdnAgKHVzZWQgdG8gdHJhbnNmb3JtIGVhY2ggdmVydGV4KQotICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpNVlApIHsKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy51cGRhdGVfbXZwKCk7Ci0gICAgICAgIC8vIGludmFsaWRhdGUgcGVyc3BlY3RpdmUgKGRpdmlkZSBieSBXKSBhbmQgdmlldyB2b2x1bWUgY2xpcHBpbmcKLSAgICAgICAgb2dsZXNfaW52YWxpZGF0ZV9wZXJzcGVjdGl2ZShjKTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgbXZ1aSAoZm9yIG5vcm1hbCB0cmFuc2Zvcm1hdGlvbikKLSAgICBpZiAoZGlydHkgJiB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZVSSkgewotICAgICAgICBjLT50cmFuc2Zvcm1zLnVwZGF0ZV9tdnVpKCk7Ci0gICAgICAgIG9nbGVzX2ludmFsaWRhdGVfbGlnaHRpbmdfbXZ1aShjKTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB0aGUgdGV4dHVyZSBzdGFjawotICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpURVhUVVJFKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKQotICAgICAgICAgICAgYy0+dHJhbnNmb3Jtcy50ZXh0dXJlW2ldLnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgLy8gVmFsaWRhdGUgdGhlIG12aXQ0ICh1c2VyLWNsaXAgcGxhbmVzKQotICAgIGlmIChkaXJ0eSAmIHRyYW5zZm9ybV9zdGF0ZV90OjpNVklUKSB7Ci0gICAgICAgIGMtPnRyYW5zZm9ybXMudXBkYXRlX212aXQoKTsKLSAgICB9Ci0KLSAgICBjLT50cmFuc2Zvcm1zLmRpcnR5ICY9IH53YW50OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayB0cmFuc2Zvcm1fdAotI2VuZGlmCi0KLXZvaWQgdHJhbnNmb3JtX3Q6OmxvYWRJZGVudGl0eSgpIHsKLSAgICBtYXRyaXggPSBnSWRlbnRpdHl4OwotICAgIGZsYWdzID0gMDsKLSAgICBvcHMgPSBPUF9JREVOVElUWTsKLSAgICBwb2ludDIgPSBwb2ludDJfX25vcDsKLSAgICBwb2ludDMgPSBwb2ludDNfX25vcDsKLSAgICBwb2ludDQgPSBwb2ludDRfX25vcDsKLX0KLQotCi1zdGF0aWMgaW5saW5lCi1pbnQgbm90WmVybyhHTGZpeGVkIHYpIHsKLSAgICByZXR1cm4gYWJzKHYpICYgfjB4MzsKLX0KLQotc3RhdGljIGlubGluZQotaW50IG5vdE9uZShHTGZpeGVkIHYpIHsKLSAgICByZXR1cm4gbm90WmVybyh2IC0gMHgxMDAwMCk7Ci19Ci0KLXZvaWQgdHJhbnNmb3JtX3Q6OnBpY2tlcigpCi17Ci0gICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG1hdHJpeC5tOwotCi0gICAgLy8gWFhYOiBwaWNrZXIgbmVlZHMgdG8gYmUgc21hcnRlcgotICAgIGZsYWdzID0gMDsKLSAgICBvcHMgPSBPUF9BTEw7Ci0gICAgcG9pbnQyID0gcG9pbnQyX19nZW5lcmljOwotICAgIHBvaW50MyA9IHBvaW50M19fZ2VuZXJpYzsKLSAgICBwb2ludDQgPSBwb2ludDRfX2dlbmVyaWM7Ci0gICAgCi0gICAgLy8gZmluZCBvdXQgaWYgdGhpcyBpcyBhIDJEIHByb2plY3Rpb24KLSAgICBpZiAoIShub3RaZXJvKG1bM10pIHwgbm90WmVybyhtWzddKSB8IG5vdFplcm8obVsxMV0pIHwgbm90T25lKG1bMTVdKSkpIHsKLSAgICAgICAgZmxhZ3MgfD0gRkxBR1NfMkRfUFJPSkVDVElPTjsKLSAgICB9Ci19Ci0KLXZvaWQgbXZ1aV90cmFuc2Zvcm1fdDo6cGlja2VyKCkKLXsKLSAgICBmbGFncyA9IDA7Ci0gICAgb3BzID0gT1BfQUxMOwotICAgIHBvaW50MyA9IHBvaW50M19fbXZ1aTsKLSAgICBwb2ludDQgPSBwb2ludDRfX212dWk7Ci19Ci0KLXZvaWQgdHJhbnNmb3JtX3Q6OmR1bXAoY29uc3QgY2hhciogd2hhdCkKLXsKLSAgICBHTGZpeGVkIGNvbnN0ICogY29uc3QgbSA9IG1hdHJpeC5tOwotICAgIEFMT0dEKCIlczoiLCB3aGF0KTsKLSAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspCi0gICAgICAgIEFMT0dEKCJbJTA4eCAlMDh4ICUwOHggJTA4eF0gWyVmICVmICVmICVmXVxuIiwKLSAgICAgICAgICAgIG1bSSgwLGkpXSwgbVtJKDEsaSldLCBtW0koMixpKV0sIG1bSSgzLGkpXSwKLSAgICAgICAgICAgIGZpeGVkVG9GbG9hdChtW0koMCxpKV0pLAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KG1bSSgxLGkpXSksIAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KG1bSSgyLGkpXSksCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQobVtJKDMsaSldKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIG1hdHJpeHhfdAotI2VuZGlmCi0KLXZvaWQgbWF0cml4eF90Ojpsb2FkKGNvbnN0IG1hdHJpeGZfdCYgcmhzKSB7Ci0gICAgR0xmaXhlZCogeHAgPSBtOwotICAgIEdMZmxvYXQgY29uc3QqIGZwID0gcmhzLmVsZW1lbnRzKCk7Ci0gICAgdW5zaWduZWQgaW50IGkgPSAxNjsKLSAgICBkbyB7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgZiA9ICpmcCsrOwotICAgICAgICAqeHArKyA9IGlzWmVyb2YoZikgPyAwIDogZ2dsRmxvYXRUb0ZpeGVkKGYpOwotICAgIH0gd2hpbGUgKC0taSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIG1hdHJpeGZfdAotI2VuZGlmCi0KLXZvaWQgbWF0cml4Zl90OjptdWx0aXBseShtYXRyaXhmX3QmIHIsIGNvbnN0IG1hdHJpeGZfdCYgbGhzLCBjb25zdCBtYXRyaXhmX3QmIHJocykKLXsKLSAgICBHTGZsb2F0IGNvbnN0KiBjb25zdCBtID0gbGhzLm07Ci0gICAgZm9yIChpbnQgaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgIHJlZ2lzdGVyIGNvbnN0IGZsb2F0IHJoc19pMCA9IHJocy5tWyBJKGksMCkgXTsKLSAgICAgICAgcmVnaXN0ZXIgZmxvYXQgcmkwID0gbVsgSSgwLDApIF0gKiByaHNfaTA7Ci0gICAgICAgIHJlZ2lzdGVyIGZsb2F0IHJpMSA9IG1bIEkoMCwxKSBdICogcmhzX2kwOwotICAgICAgICByZWdpc3RlciBmbG9hdCByaTIgPSBtWyBJKDAsMikgXSAqIHJoc19pMDsKLSAgICAgICAgcmVnaXN0ZXIgZmxvYXQgcmkzID0gbVsgSSgwLDMpIF0gKiByaHNfaTA7Ci0gICAgICAgIGZvciAoaW50IGo9MSA7IGo8NCA7IGorKykgewotICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgZmxvYXQgcmhzX2lqID0gcmhzLm1bIEkoaSxqKSBdOwotICAgICAgICAgICAgcmkwICs9IG1bIEkoaiwwKSBdICogcmhzX2lqOwotICAgICAgICAgICAgcmkxICs9IG1bIEkoaiwxKSBdICogcmhzX2lqOwotICAgICAgICAgICAgcmkyICs9IG1bIEkoaiwyKSBdICogcmhzX2lqOwotICAgICAgICAgICAgcmkzICs9IG1bIEkoaiwzKSBdICogcmhzX2lqOwotICAgICAgICB9Ci0gICAgICAgIHIubVsgSShpLDApIF0gPSByaTA7Ci0gICAgICAgIHIubVsgSShpLDEpIF0gPSByaTE7Ci0gICAgICAgIHIubVsgSShpLDIpIF0gPSByaTI7Ci0gICAgICAgIHIubVsgSShpLDMpIF0gPSByaTM7Ci0gICAgfQotfQotCi12b2lkIG1hdHJpeGZfdDo6ZHVtcChjb25zdCBjaGFyKiB3aGF0KSB7Ci0gICAgQUxPR0QoIiVzIiwgd2hhdCk7Ci0gICAgQUxPR0QoIlsgJTlmICU5ZiAlOWYgJTlmIF0iLCBtW0koMCwwKV0sIG1bSSgxLDApXSwgbVtJKDIsMCldLCBtW0koMywwKV0pOwotICAgIEFMT0dEKCJbICU5ZiAlOWYgJTlmICU5ZiBdIiwgbVtJKDAsMSldLCBtW0koMSwxKV0sIG1bSSgyLDEpXSwgbVtJKDMsMSldKTsKLSAgICBBTE9HRCgiWyAlOWYgJTlmICU5ZiAlOWYgXSIsIG1bSSgwLDIpXSwgbVtJKDEsMildLCBtW0koMiwyKV0sIG1bSSgzLDIpXSk7Ci0gICAgQUxPR0QoIlsgJTlmICU5ZiAlOWYgJTlmIF0iLCBtW0koMCwzKV0sIG1bSSgxLDMpXSwgbVtJKDIsMyldLCBtW0koMywzKV0pOwotfQotCi12b2lkIG1hdHJpeGZfdDo6bG9hZElkZW50aXR5KCkgewotICAgIG1lbWNweShtLCBnSWRlbnRpdHlmLCBzaXplb2YobSkpOwotfQotCi12b2lkIG1hdHJpeGZfdDo6c2V0KGNvbnN0IEdMZml4ZWQqIHJocykgewotICAgIGxvYWQocmhzKTsKLX0KLQotdm9pZCBtYXRyaXhmX3Q6OnNldChjb25zdCBHTGZsb2F0KiByaHMpIHsKLSAgICBsb2FkKHJocyk7Ci19Ci0KLXZvaWQgbWF0cml4Zl90Ojpsb2FkKGNvbnN0IEdMZml4ZWQqIHJocykgewotICAgIEdMZmxvYXQqIGZwID0gbTsKLSAgICB1bnNpZ25lZCBpbnQgaSA9IDE2OwotICAgIGRvIHsKLSAgICAgICAgKmZwKysgPSBmaXhlZFRvRmxvYXQoKnJocysrKTsKLSAgICB9IHdoaWxlICgtLWkpOwotfQotCi12b2lkIG1hdHJpeGZfdDo6bG9hZChjb25zdCBHTGZsb2F0KiByaHMpIHsKLSAgICBtZW1jcHkobSwgcmhzLCBzaXplb2YobSkpOwotfQotCi12b2lkIG1hdHJpeGZfdDo6bG9hZChjb25zdCBtYXRyaXhmX3QmIHJocykgewotICAgIG9wZXJhdG9yID0gKHJocyk7Ci19Ci0KLXZvaWQgbWF0cml4Zl90OjptdWx0aXBseShjb25zdCBtYXRyaXhmX3QmIHJocykgewotICAgIG1hdHJpeGZfdCByOwotICAgIG11bHRpcGx5KHIsICp0aGlzLCByaHMpOwotICAgIG9wZXJhdG9yID0gKHIpOwotfQotCi12b2lkIG1hdHJpeGZfdDo6dHJhbnNsYXRlKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgbVsxMitpXSArPSBtW2ldKnggKyBtWzQraV0qeSArIG1bOCtpXSp6OwotICAgIH0KLX0KLQotdm9pZCBtYXRyaXhmX3Q6OnNjYWxlKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgbVsgIGldICo9IHg7Ci0gICAgICAgIG1bNCtpXSAqPSB5OwotICAgICAgICBtWzgraV0gKj0gejsKLSAgICB9Ci19Ci0KLXZvaWQgbWF0cml4Zl90Ojpyb3RhdGUoR0xmbG9hdCBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotewotICAgIG1hdHJpeGZfdCByb3RhdGlvbjsKLSAgICBHTGZsb2F0KiByID0gcm90YXRpb24ubTsKLSAgICBHTGZsb2F0IGMsIHM7Ci0gICAgclszXSA9IDA7ICAgcls3XSA9IDA7ICAgclsxMV09IDA7Ci0gICAgclsxMl09IDA7ICAgclsxM109IDA7ICAgclsxNF09IDA7ICAgclsxNV09IDE7Ci0gICAgYSAqPSBHTGZsb2F0KE1fUEkgLyAxODAuMGYpOwotICAgIHNpbmNvc2YoYSwgJnMsICZjKTsKLSAgICBpZiAoaXNPbmVmKHgpICYmIGlzWmVyb2YoeSkgJiYgaXNaZXJvZih6KSkgewotICAgICAgICByWzVdID0gYzsgICByWzEwXT0gYzsKLSAgICAgICAgcls2XSA9IHM7ICAgcls5XSA9IC1zOwotICAgICAgICByWzFdID0gMDsgICByWzJdID0gMDsKLSAgICAgICAgcls0XSA9IDA7ICAgcls4XSA9IDA7Ci0gICAgICAgIHJbMF0gPSAxOwotICAgIH0gZWxzZSBpZiAoaXNaZXJvZih4KSAmJiBpc09uZWYoeSkgJiYgaXNaZXJvZih6KSkgewotICAgICAgICByWzBdID0gYzsgICByWzEwXT0gYzsKLSAgICAgICAgcls4XSA9IHM7ICAgclsyXSA9IC1zOwotICAgICAgICByWzFdID0gMDsgICByWzRdID0gMDsKLSAgICAgICAgcls2XSA9IDA7ICAgcls5XSA9IDA7Ci0gICAgICAgIHJbNV0gPSAxOwotICAgIH0gZWxzZSBpZiAoaXNaZXJvZih4KSAmJiBpc1plcm9mKHkpICYmIGlzT25lZih6KSkgewotICAgICAgICByWzBdID0gYzsgICByWzVdID0gYzsKLSAgICAgICAgclsxXSA9IHM7ICAgcls0XSA9IC1zOwotICAgICAgICByWzJdID0gMDsgICByWzZdID0gMDsKLSAgICAgICAgcls4XSA9IDA7ICAgcls5XSA9IDA7Ci0gICAgICAgIHJbMTBdPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgbGVuID0gc3FydGYoeCp4ICsgeSp5ICsgeip6KTsKLSAgICAgICAgaWYgKCFpc09uZWYobGVuKSkgewotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCByZWNpcExlbiA9IHJlY2lwcm9jYWxmKGxlbik7Ci0gICAgICAgICAgICB4ICo9IHJlY2lwTGVuOwotICAgICAgICAgICAgeSAqPSByZWNpcExlbjsKLSAgICAgICAgICAgIHogKj0gcmVjaXBMZW47Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgR0xmbG9hdCBuYyA9IDEuMGYgLSBjOwotICAgICAgICBjb25zdCBHTGZsb2F0IHh5ID0geCAqIHk7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgeXogPSB5ICogejsKLSAgICAgICAgY29uc3QgR0xmbG9hdCB6eCA9IHogKiB4OwotICAgICAgICBjb25zdCBHTGZsb2F0IHhzID0geCAqIHM7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgeXMgPSB5ICogczsKLSAgICAgICAgY29uc3QgR0xmbG9hdCB6cyA9IHogKiBzOwkJCi0gICAgICAgIHJbIDBdID0geCp4Km5jICsgIGM7ICAgIHJbIDRdID0gIHh5Km5jIC0genM7ICAgIHJbIDhdID0gIHp4Km5jICsgeXM7Ci0gICAgICAgIHJbIDFdID0gIHh5Km5jICsgenM7ICAgIHJbIDVdID0geSp5Km5jICsgIGM7ICAgIHJbIDldID0gIHl6Km5jIC0geHM7Ci0gICAgICAgIHJbIDJdID0gIHp4Km5jIC0geXM7ICAgIHJbIDZdID0gIHl6Km5jICsgeHM7ICAgIHJbMTBdID0geip6Km5jICsgIGM7Ci0gICAgfQotICAgIG11bHRpcGx5KHJvdGF0aW9uKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgbWF0cml4X3N0YWNrX3QKLSNlbmRpZgotCi12b2lkIG1hdHJpeF9zdGFja190Ojppbml0KGludCBkZXB0aCkgewotICAgIHN0YWNrID0gbmV3IG1hdHJpeGZfdFtkZXB0aF07Ci0gICAgb3BzID0gbmV3IHVpbnQ4X3RbZGVwdGhdOwotICAgIG1heERlcHRoID0gZGVwdGg7Ci0gICAgZGVwdGggPSAwOwotICAgIGRpcnR5ID0gMDsKLSAgICBsb2FkSWRlbnRpdHkoKTsKLX0KLQotdm9pZCBtYXRyaXhfc3RhY2tfdDo6dW5pbml0KCkgewotICAgIGRlbGV0ZSBbXSBzdGFjazsKLSAgICBkZWxldGUgW10gb3BzOwotfQotCi12b2lkIG1hdHJpeF9zdGFja190Ojpsb2FkSWRlbnRpdHkoKSB7Ci0gICAgdHJhbnNmb3JtLmxvYWRJZGVudGl0eSgpOwotICAgIHN0YWNrW2RlcHRoXS5sb2FkSWRlbnRpdHkoKTsKLSAgICBvcHNbZGVwdGhdID0gT1BfSURFTlRJVFk7Ci19Ci0KLXZvaWQgbWF0cml4X3N0YWNrX3Q6OmxvYWQoY29uc3QgR0xmaXhlZCogcmhzKQoteyAgIAotICAgIG1lbWNweSh0cmFuc2Zvcm0ubWF0cml4Lm0sIHJocywgc2l6ZW9mKHRyYW5zZm9ybS5tYXRyaXgubSkpOwotICAgIHN0YWNrW2RlcHRoXS5sb2FkKHJocyk7Ci0gICAgb3BzW2RlcHRoXSA9IE9QX0FMTDsgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGxvb2sgYXQgdGhlIG1hdHJpeAotfQotCi12b2lkIG1hdHJpeF9zdGFja190Ojpsb2FkKGNvbnN0IEdMZmxvYXQqIHJocykKLXsKLSAgICBzdGFja1tkZXB0aF0ubG9hZChyaHMpOwotICAgIG9wc1tkZXB0aF0gPSBPUF9BTEw7ICAgIC8vIFRPRE86IHdlIHNob3VsZCBsb29rIGF0IHRoZSBtYXRyaXgKLX0KLQotdm9pZCBtYXRyaXhfc3RhY2tfdDo6bXVsdGlwbHkoY29uc3QgbWF0cml4Zl90JiByaHMpCi17ICAgIAotICAgIHN0YWNrW2RlcHRoXS5tdWx0aXBseShyaHMpOwotICAgIG9wc1tkZXB0aF0gPSBPUF9BTEw7ICAgIC8vIFRPRE86IHdlIHNob3VsZCBsb29rIGF0IHRoZSBtYXRyaXgKLX0KLQotdm9pZCBtYXRyaXhfc3RhY2tfdDo6dHJhbnNsYXRlKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgc3RhY2tbZGVwdGhdLnRyYW5zbGF0ZSh4LHkseik7Ci0gICAgb3BzW2RlcHRoXSB8PSBPUF9UUkFOU0xBVEU7Ci19Ci0KLXZvaWQgbWF0cml4X3N0YWNrX3Q6OnNjYWxlKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgc3RhY2tbZGVwdGhdLnNjYWxlKHgseSx6KTsKLSAgICBpZiAoeD09eSAmJiB5PT16KSB7Ci0gICAgICAgIG9wc1tkZXB0aF0gfD0gT1BfVU5JRk9STV9TQ0FMRTsKLSAgICB9IGVsc2UgewotICAgICAgICBvcHNbZGVwdGhdIHw9IE9QX1NDQUxFOwotICAgIH0KLX0KLQotdm9pZCBtYXRyaXhfc3RhY2tfdDo6cm90YXRlKEdMZmxvYXQgYSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLXsKLSAgICBzdGFja1tkZXB0aF0ucm90YXRlKGEseCx5LHopOwotICAgIG9wc1tkZXB0aF0gfD0gT1BfUk9UQVRFOwotfQotCi12b2lkIG1hdHJpeF9zdGFja190Ojp2YWxpZGF0ZSgpCi17Ci0gICAgaWYgKGRpcnR5ICYgRE9fRkxPQVRfVE9fRklYRUQpIHsKLSAgICAgICAgdHJhbnNmb3JtLm1hdHJpeC5sb2FkKHRvcCgpKTsKLSAgICB9Ci0gICAgaWYgKGRpcnR5ICYgRE9fUElDS0VSKSB7Ci0gICAgICAgIHRyYW5zZm9ybS5waWNrZXIoKTsKLSAgICB9Ci0gICAgZGlydHkgPSAwOwotfQotCi1HTGludCBtYXRyaXhfc3RhY2tfdDo6cHVzaCgpCi17Ci0gICAgaWYgKGRlcHRoID49IChtYXhEZXB0aC0xKSkgewotICAgICAgICByZXR1cm4gR0xfU1RBQ0tfT1ZFUkZMT1c7Ci0gICAgfQotICAgIHN0YWNrW2RlcHRoKzFdID0gc3RhY2tbZGVwdGhdOwotICAgIG9wc1tkZXB0aCsxXSA9IG9wc1tkZXB0aF07Ci0gICAgZGVwdGgrKzsKLSAgICByZXR1cm4gMDsKLX0KLQotR0xpbnQgbWF0cml4X3N0YWNrX3Q6OnBvcCgpCi17Ci0gICAgaWYgKGRlcHRoID09IDApIHsKLSAgICAgICAgcmV0dXJuIEdMX1NUQUNLX1VOREVSRkxPVzsKLSAgICB9Ci0gICAgZGVwdGgtLTsKLSAgICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgdnBfdHJhbnNmb3JtX3QKLSNlbmRpZgotCi12b2lkIHZwX3RyYW5zZm9ybV90Ojpsb2FkSWRlbnRpdHkoKSB7Ci0gICAgdHJhbnNmb3JtLmxvYWRJZGVudGl0eSgpOwotICAgIG1hdHJpeC5sb2FkSWRlbnRpdHkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgdHJhbnNmb3JtX3N0YXRlX3QKLSNlbmRpZgotCi12b2lkIHRyYW5zZm9ybV9zdGF0ZV90OjppbnZhbGlkYXRlKCkKLXsKLSAgICBzd2l0Y2ggKG1hdHJpeE1vZGUpIHsKLSAgICBjYXNlIEdMX01PREVMVklFVzogIGRpcnR5IHw9IE1PREVMVklFVyAgfCBNVlAgfCBNVlVJIHwgTVZJVDsgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9QUk9KRUNUSU9OOiBkaXJ0eSB8PSBQUk9KRUNUSU9OIHwgTVZQOyAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRTogICAgZGlydHkgfD0gVEVYVFVSRSAgICB8IE1WUDsgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY3VycmVudC0+ZGlydHkgPSAgICBtYXRyaXhfc3RhY2tfdDo6RE9fUElDS0VSIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9zdGFja190OjpET19GTE9BVF9UT19GSVhFRDsKLX0KLQotdm9pZCB0cmFuc2Zvcm1fc3RhdGVfdDo6dXBkYXRlX212cCgpCi17Ci0gICAgbWF0cml4Zl90IHRlbXBfbXZwOwotICAgIG1hdHJpeGZfdDo6bXVsdGlwbHkodGVtcF9tdnAsIHByb2plY3Rpb24udG9wKCksIG1vZGVsdmlldy50b3AoKSk7Ci0gICAgbXZwNC5tYXRyaXgubG9hZCh0ZW1wX212cCk7Ci0gICAgbXZwNC5waWNrZXIoKTsKLQotICAgIGlmIChtdnA0LmZsYWdzICYgdHJhbnNmb3JtX3Q6OkZMQUdTXzJEX1BST0pFQ1RJT04pIHsKLSAgICAgICAgLy8gdGhlIG12cCBtYXRyaXggZG9lc24ndCB0cmFuc2Zvcm0gVywgaW4gdGhpcyBjYXNlIHdlIGNhbgotICAgICAgICAvLyBwcmVtdWx0aXBseSBpdCB3aXRoIHRoZSB2aWV3cG9ydCB0cmFuc2Zvcm1hdGlvbi4gSW4gYWRkaXRpb24gdG8KLSAgICAgICAgLy8gYmVpbmcgbW9yZSBlZmZpY2llbnQsIHRoaXMgaXMgYWxzbyBtdWNoIG1vcmUgYWNjdXJhdGUgYW5kIGluIGZhY3QKLSAgICAgICAgLy8gaXMgbmVlZGVkIGZvciAyRCBkcmF3aW5nIHdpdGggYSByZXN1bHRpbmcgMToxIG1hcHBpbmcuCi0gICAgICAgIG1hdHJpeGZfdCBtdnB2OwotICAgICAgICBtYXRyaXhmX3Q6Om11bHRpcGx5KG12cHYsIHZwdC5tYXRyaXgsIHRlbXBfbXZwKTsKLSAgICAgICAgbXZwLm1hdHJpeC5sb2FkKG12cHYpOwotICAgICAgICBtdnAucGlja2VyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXZwID0gbXZwNDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgCi1HTGZsb2F0IGRldDIyKEdMZmxvYXQgYSwgR0xmbG9hdCBiLCBHTGZsb2F0IGMsIEdMZmxvYXQgZCkgewotICAgIHJldHVybiBhKmQgLSBiKmM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLUdMZmxvYXQgbmRldDIyKEdMZmxvYXQgYSwgR0xmbG9hdCBiLCBHTGZsb2F0IGMsIEdMZmxvYXQgZCkgewotICAgIHJldHVybiBiKmMgLSBhKmQ7Ci19Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIGludmVydChHTGZsb2F0KiBpbnZlcnNlLCBjb25zdCBHTGZsb2F0KiBzcmMpCi17Ci0gICAgZG91YmxlIHQ7Ci0gICAgaW50IGksIGosIGssIHN3YXA7Ci0gICAgR0xmbG9hdCB0bXBbNF1bNF07Ci0gICAgCi0gICAgbWVtY3B5KGludmVyc2UsIGdJZGVudGl0eWYsIHNpemVvZihnSWRlbnRpdHlmKSk7Ci0gICAgbWVtY3B5KHRtcCwgc3JjLCBzaXplb2YoR0xmbG9hdCkqMTYpOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgLy8gbG9vayBmb3IgbGFyZ2VzdCBlbGVtZW50IGluIGNvbHVtbgotICAgICAgICBzd2FwID0gaTsKLSAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCA0OyBqKyspIHsKLSAgICAgICAgICAgIGlmIChmYWJzKHRtcFtqXVtpXSkgPiBmYWJzKHRtcFtpXVtpXSkpIHsKLSAgICAgICAgICAgICAgICBzd2FwID0gajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHN3YXAgIT0gaSkgewotICAgICAgICAgICAgLyogc3dhcCByb3dzLiAqLwotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgewotICAgICAgICAgICAgICAgIHQgPSB0bXBbaV1ba107Ci0gICAgICAgICAgICAgICAgdG1wW2ldW2tdID0gdG1wW3N3YXBdW2tdOwotICAgICAgICAgICAgICAgIHRtcFtzd2FwXVtrXSA9IHQ7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdCA9IGludmVyc2VbaSo0K2tdOwotICAgICAgICAgICAgICAgIGludmVyc2VbaSo0K2tdID0gaW52ZXJzZVtzd2FwKjQra107Ci0gICAgICAgICAgICAgICAgaW52ZXJzZVtzd2FwKjQra10gPSB0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB0ID0gMS4wZiAvIHRtcFtpXVtpXTsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgewotICAgICAgICAgICAgdG1wW2ldW2tdICo9IHQ7Ci0gICAgICAgICAgICBpbnZlcnNlW2kqNCtrXSAqPSB0OwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLSAgICAgICAgICAgIGlmIChqICE9IGkpIHsKLSAgICAgICAgICAgICAgICB0ID0gdG1wW2pdW2ldOwotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wW2pdW2tdIC09IHRtcFtpXVtrXSp0OwotICAgICAgICAgICAgICAgICAgICBpbnZlcnNlW2oqNCtrXSAtPSBpbnZlcnNlW2kqNCtrXSp0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCB0cmFuc2Zvcm1fc3RhdGVfdDo6dXBkYXRlX212aXQoKQotewotICAgIEdMZmxvYXQgclsxNl07Ci0gICAgY29uc3QgR0xmbG9hdCogY29uc3QgbXYgPSBtb2RlbHZpZXcudG9wKCkuZWxlbWVudHMoKTsKLSAgICBpbnZlcnQociwgbXYpOwotICAgIC8vIGNvbnZlcnQgdG8gZml4ZWQtcG9pbnQgYW5kIHRyYW5zcG9zZQotICAgIEdMZml4ZWQqIGNvbnN0IHggPSBtdml0NC5tYXRyaXgubTsKLSAgICBmb3IgKGludCBpPTAgOyBpPDQgOyBpKyspCi0gICAgICAgIGZvciAoaW50IGo9MCA7IGo8NCA7IGorKykKLSAgICAgICAgICAgIHhbSShpLGopXSA9IGdnbEZsb2F0VG9GaXhlZChyW0koaixpKV0pOwotICAgIG12aXQ0LnBpY2tlcigpOwotfQotCi12b2lkIHRyYW5zZm9ybV9zdGF0ZV90Ojp1cGRhdGVfbXZ1aSgpCi17Ci0gICAgR0xmbG9hdCByWzE2XTsKLSAgICBjb25zdCBHTGZsb2F0KiBjb25zdCBtdiA9IG1vZGVsdmlldy50b3AoKS5lbGVtZW50cygpOwotICAgIAotICAgIC8qCi0gICAgV2hlbiBldmFsdWF0aW5nIHRoZSBsaWdodGluZyBlcXVhdGlvbiBpbiBleWUtc3BhY2UsIG5vcm1hbHMKLSAgICBhcmUgdHJhbnNmb3JtZWQgYnkgdGhlIHVwcGVyIDN4MyBtb2RlbHZpZXcgaW52ZXJzZS10cmFuc3Bvc2UuCi0gICAgaHR0cDovL3d3dy5vcGVuZ2wub3JnL2RvY3VtZW50YXRpb24vc3BlY3MvdmVyc2lvbjEuMS9nbHNwZWMxLjEvbm9kZTI2Lmh0bWwKLQotICAgIChub3RlIHRoYXQgaW52ZXJzZS10cmFuc3Bvc2UgaXMgZGlzdHJpYnV0aXZlKS4KLSAgICBBbHNvIG5vdGUgdGhhdDoKLSAgICAgICAgbChvYmopID0gaW52KG1vZGVsdmlldykubChleWUpIGZvciBsb2NhbCBsaWdodAotICAgICAgICBsKG9iaikgPSAgdHIobW9kZWx2aWV3KS5sKGV5ZSkgZm9yIGluZmluaXRlIGxpZ2h0Ci0gICAgKi8KLQotICAgIGludmVydChyLCBtdik7Ci0KLSAgICBHTGZpeGVkKiBjb25zdCB4ID0gbXZ1aS5tYXRyaXgubTsKLQotI2lmIE9CSkVDVF9TUEFDRV9MSUdIVElORwotICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajw0IDsgaisrKQotICAgICAgICAgICAgeFtJKGksaildID0gZ2dsRmxvYXRUb0ZpeGVkKHJbSShpLGopXSk7Ci0jZWxzZQotICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajw0IDsgaisrKQotICAgICAgICAgICAgeFtJKGksaildID0gZ2dsRmxvYXRUb0ZpeGVkKHJbSShqLGkpXSk7Ci0jZW5kaWYKLQotICAgIG12dWkucGlja2VyKCk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gdHJhbnNmb3JtYXRpb24gYW5kIG1hdHJpY2VzIEFQSQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgdHJhbnNmb3JtYXRpb24gYW5kIG1hdHJpY2VzIEFQSQotI2VuZGlmCi0KLWludCBvZ2xlc19zdXJmYWNlcG9ydChvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IHgsIEdMaW50IHkpCi17Ci0gICAgYy0+dmlld3BvcnQuc3VyZmFjZXBvcnQueCA9IHg7Ci0gICAgYy0+dmlld3BvcnQuc3VyZmFjZXBvcnQueSA9IHk7Ci0KLSAgICBvZ2xlc192aWV3cG9ydChjLCAKLSAgICAgICAgICAgIGMtPnZpZXdwb3J0LngsCi0gICAgICAgICAgICBjLT52aWV3cG9ydC55LAotICAgICAgICAgICAgYy0+dmlld3BvcnQudywKLSAgICAgICAgICAgIGMtPnZpZXdwb3J0LmgpOwotCi0gICAgb2dsZXNfc2Npc3NvcihjLAotICAgICAgICAgICAgYy0+dmlld3BvcnQuc2Npc3Nvci54LAotICAgICAgICAgICAgYy0+dmlld3BvcnQuc2Npc3Nvci55LAotICAgICAgICAgICAgYy0+dmlld3BvcnQuc2Npc3Nvci53LAotICAgICAgICAgICAgYy0+dmlld3BvcnQuc2Npc3Nvci5oKTsKLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIG9nbGVzX3NjaXNzb3Iob2dsZXNfY29udGV4dF90KiBjLCAKLSAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCi17Ci0gICAgaWYgKCh3fGgpIDwgMCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT52aWV3cG9ydC5zY2lzc29yLnggPSB4OwotICAgIGMtPnZpZXdwb3J0LnNjaXNzb3IueSA9IHk7Ci0gICAgYy0+dmlld3BvcnQuc2Npc3Nvci53ID0gdzsKLSAgICBjLT52aWV3cG9ydC5zY2lzc29yLmggPSBoOwotICAgIAotICAgIHggKz0gYy0+dmlld3BvcnQuc3VyZmFjZXBvcnQueDsKLSAgICB5ICs9IGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0Lnk7Ci0KLSAgICB5ID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLmhlaWdodCAtICh5ICsgaCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5zY2lzc29yKGMsIHgsIHksIHcsIGgpOwotfQotCi12b2lkIG9nbGVzX3ZpZXdwb3J0KG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3LCBHTHNpemVpIGgpCi17Ci0gICAgaWYgKCh3fGgpPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjLT52aWV3cG9ydC54ID0geDsKLSAgICBjLT52aWV3cG9ydC55ID0geTsKLSAgICBjLT52aWV3cG9ydC53ID0gdzsKLSAgICBjLT52aWV3cG9ydC5oID0gaDsKLQotICAgIHggKz0gYy0+dmlld3BvcnQuc3VyZmFjZXBvcnQueDsKLSAgICB5ICs9IGMtPnZpZXdwb3J0LnN1cmZhY2Vwb3J0Lnk7Ci0KLSAgICBHTGludCBIID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLmhlaWdodDsKLSAgICBHTGZsb2F0IHN4ID0gZGl2MmYodyk7Ci0gICAgR0xmbG9hdCBveCA9IHN4ICsgeDsKLSAgICBHTGZsb2F0IHN5ID0gZGl2MmYoaCk7Ci0gICAgR0xmbG9hdCBveSA9IHN5IC0geSArIChIIC0gaCk7Ci0KLSAgICBHTGZsb2F0IG5lYXIgPSBjLT50cmFuc2Zvcm1zLnZwdC56TmVhcjsKLSAgICBHTGZsb2F0IGZhciAgPSBjLT50cmFuc2Zvcm1zLnZwdC56RmFyOwotICAgIEdMZmxvYXQgQSA9IGRpdjJmKGZhciAtIG5lYXIpOwotICAgIEdMZmxvYXQgQiA9IGRpdjJmKGZhciArIG5lYXIpOwotCi0gICAgLy8gY29tcHV0ZSB2aWV3cG9ydCBtYXRyaXgKLSAgICBHTGZsb2F0KiBjb25zdCBmID0gYy0+dHJhbnNmb3Jtcy52cHQubWF0cml4LmVkaXRFbGVtZW50cygpOwotICAgIGZbMF0gPSBzeDsgIGZbNF0gPSAwOyAgIGZbIDhdID0gMDsgIGZbMTJdID0gb3g7Ci0gICAgZlsxXSA9IDA7ICAgZls1XSA9LXN5OyAgZlsgOV0gPSAwOyAgZlsxM10gPSBveTsKLSAgICBmWzJdID0gMDsgICBmWzZdID0gMDsgICBmWzEwXSA9IEE7ICBmWzE0XSA9IEI7Ci0gICAgZlszXSA9IDA7ICAgZls3XSA9IDA7ICAgZlsxMV0gPSAwOyAgZlsxNV0gPSAxOwotICAgIGMtPnRyYW5zZm9ybXMuZGlydHkgfD0gdHJhbnNmb3JtX3N0YXRlX3Q6OlZJRVdQT1JUOwotICAgIGlmIChjLT50cmFuc2Zvcm1zLm12cDQuZmxhZ3MgJiB0cmFuc2Zvcm1fdDo6RkxBR1NfMkRfUFJPSkVDVElPTikKLSAgICAgICAgYy0+dHJhbnNmb3Jtcy5kaXJ0eSB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZQOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBtYXRyaXggKiB2ZXJ0ZXgKLSNlbmRpZgotCi12b2lkIHBvaW50Ml9fZ2VuZXJpYyh0cmFuc2Zvcm1fdCBjb25zdCogbXgsIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgewotICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBteC0+bWF0cml4Lm07Ci0gICAgY29uc3QgR0xmaXhlZCByeCA9IHJocy0+eDsKLSAgICBjb25zdCBHTGZpeGVkIHJ5ID0gcmhzLT55OwotICAgIGxocy0+eCA9IG1sYTJhKHJ4LCBtWyAwXSwgcnksIG1bIDRdLCBtWzEyXSk7IAotICAgIGxocy0+eSA9IG1sYTJhKHJ4LCBtWyAxXSwgcnksIG1bIDVdLCBtWzEzXSk7Ci0gICAgbGhzLT56ID0gbWxhMmEocngsIG1bIDJdLCByeSwgbVsgNl0sIG1bMTRdKTsKLSAgICBsaHMtPncgPSBtbGEyYShyeCwgbVsgM10sIHJ5LCBtWyA3XSwgbVsxNV0pOwotfQotCi12b2lkIHBvaW50M19fZ2VuZXJpYyh0cmFuc2Zvcm1fdCBjb25zdCogbXgsIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgewotICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBteC0+bWF0cml4Lm07Ci0gICAgY29uc3QgR0xmaXhlZCByeCA9IHJocy0+eDsKLSAgICBjb25zdCBHTGZpeGVkIHJ5ID0gcmhzLT55OwotICAgIGNvbnN0IEdMZml4ZWQgcnogPSByaHMtPno7Ci0gICAgbGhzLT54ID0gbWxhM2EocngsIG1bIDBdLCByeSwgbVsgNF0sIHJ6LCBtWyA4XSwgbVsxMl0pOyAKLSAgICBsaHMtPnkgPSBtbGEzYShyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldLCBtWzEzXSk7Ci0gICAgbGhzLT56ID0gbWxhM2EocngsIG1bIDJdLCByeSwgbVsgNl0sIHJ6LCBtWzEwXSwgbVsxNF0pOwotICAgIGxocy0+dyA9IG1sYTNhKHJ4LCBtWyAzXSwgcnksIG1bIDddLCByeiwgbVsxMV0sIG1bMTVdKTsKLX0KLQotdm9pZCBwb2ludDRfX2dlbmVyaWModHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKLSAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOwotICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7Ci0gICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKLSAgICBjb25zdCBHTGZpeGVkIHJ6ID0gcmhzLT56OwotICAgIGNvbnN0IEdMZml4ZWQgcncgPSByaHMtPnc7Ci0gICAgbGhzLT54ID0gbWxhNChyeCwgbVsgMF0sIHJ5LCBtWyA0XSwgcnosIG1bIDhdLCBydywgbVsxMl0pOyAKLSAgICBsaHMtPnkgPSBtbGE0KHJ4LCBtWyAxXSwgcnksIG1bIDVdLCByeiwgbVsgOV0sIHJ3LCBtWzEzXSk7Ci0gICAgbGhzLT56ID0gbWxhNChyeCwgbVsgMl0sIHJ5LCBtWyA2XSwgcnosIG1bMTBdLCBydywgbVsxNF0pOwotICAgIGxocy0+dyA9IG1sYTQocngsIG1bIDNdLCByeSwgbVsgN10sIHJ6LCBtWzExXSwgcncsIG1bMTVdKTsKLX0KLQotdm9pZCBwb2ludDNfX212dWkodHJhbnNmb3JtX3QgY29uc3QqIG14LCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKLSAgICAvLyB0aGlzIGlzIHVzZWQgZm9yIHRyYW5zZm9ybWluZyBsaWdodCBwb3NpdGlvbnMgYmFjayB0byBvYmplY3Qgc3BhY2UuCi0gICAgLy8gdyBpcyB1c2VkIGFzIGEgc3dpdGNoIGZvciBkaXJlY3Rpb25hbCBsaWdodHMsIHNvIHdlIG5lZWQKLSAgICAvLyB0byBwcmVzZXJ2ZSBpdC4KLSAgICBjb25zdCBHTGZpeGVkKiBjb25zdCBtID0gbXgtPm1hdHJpeC5tOwotICAgIGNvbnN0IEdMZml4ZWQgcnggPSByaHMtPng7Ci0gICAgY29uc3QgR0xmaXhlZCByeSA9IHJocy0+eTsKLSAgICBjb25zdCBHTGZpeGVkIHJ6ID0gcmhzLT56OwotICAgIGxocy0+eCA9IG1sYTMocngsIG1bIDBdLCByeSwgbVsgNF0sIHJ6LCBtWyA4XSk7Ci0gICAgbGhzLT55ID0gbWxhMyhyeCwgbVsgMV0sIHJ5LCBtWyA1XSwgcnosIG1bIDldKTsKLSAgICBsaHMtPnogPSBtbGEzKHJ4LCBtWyAyXSwgcnksIG1bIDZdLCByeiwgbVsxMF0pOwotICAgIGxocy0+dyA9IDA7Ci19Ci0KLXZvaWQgcG9pbnQ0X19tdnVpKHRyYW5zZm9ybV90IGNvbnN0KiBteCwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7Ci0gICAgLy8gdGhpcyBpcyB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgbGlnaHQgcG9zaXRpb25zIGJhY2sgdG8gb2JqZWN0IHNwYWNlLgotICAgIC8vIHcgaXMgdXNlZCBhcyBhIHN3aXRjaCBmb3IgZGlyZWN0aW9uYWwgbGlnaHRzLCBzbyB3ZSBuZWVkCi0gICAgLy8gdG8gcHJlc2VydmUgaXQuCi0gICAgY29uc3QgR0xmaXhlZCogY29uc3QgbSA9IG14LT5tYXRyaXgubTsKLSAgICBjb25zdCBHTGZpeGVkIHJ4ID0gcmhzLT54OwotICAgIGNvbnN0IEdMZml4ZWQgcnkgPSByaHMtPnk7Ci0gICAgY29uc3QgR0xmaXhlZCByeiA9IHJocy0+ejsKLSAgICBjb25zdCBHTGZpeGVkIHJ3ID0gcmhzLT53OwotICAgIGxocy0+eCA9IG1sYTQocngsIG1bIDBdLCByeSwgbVsgNF0sIHJ6LCBtWyA4XSwgcncsIG1bMTJdKTsKLSAgICBsaHMtPnkgPSBtbGE0KHJ4LCBtWyAxXSwgcnksIG1bIDVdLCByeiwgbVsgOV0sIHJ3LCBtWzEzXSk7Ci0gICAgbGhzLT56ID0gbWxhNChyeCwgbVsgMl0sIHJ5LCBtWyA2XSwgcnosIG1bMTBdLCBydywgbVsxNF0pOwotICAgIGxocy0+dyA9IHJ3OwotfQotCi12b2lkIHBvaW50Ml9fbm9wKHRyYW5zZm9ybV90IGNvbnN0KiwgdmVjNF90KiBsaHMsIHZlYzRfdCBjb25zdCogcmhzKSB7Ci0gICAgbGhzLT56ID0gMDsKLSAgICBsaHMtPncgPSAweDEwMDAwOwotICAgIGlmIChsaHMgIT0gcmhzKSB7Ci0gICAgICAgIGxocy0+eCA9IHJocy0+eDsKLSAgICAgICAgbGhzLT55ID0gcmhzLT55OwotICAgIH0KLX0KLQotdm9pZCBwb2ludDNfX25vcCh0cmFuc2Zvcm1fdCBjb25zdCosIHZlYzRfdCogbGhzLCB2ZWM0X3QgY29uc3QqIHJocykgewotICAgIGxocy0+dyA9IDB4MTAwMDA7Ci0gICAgaWYgKGxocyAhPSByaHMpIHsKLSAgICAgICAgbGhzLT54ID0gcmhzLT54OwotICAgICAgICBsaHMtPnkgPSByaHMtPnk7Ci0gICAgICAgIGxocy0+eiA9IHJocy0+ejsKLSAgICB9Ci19Ci0KLXZvaWQgcG9pbnQ0X19ub3AodHJhbnNmb3JtX3QgY29uc3QqLCB2ZWM0X3QqIGxocywgdmVjNF90IGNvbnN0KiByaHMpIHsKLSAgICBpZiAobGhzICE9IHJocykKLSAgICAgICAgKmxocyA9ICpyaHM7Ci19Ci0KLQotc3RhdGljIHZvaWQgZnJ1c3R1bWYoCi0gICAgICAgICAgICBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIAotICAgICAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAotICAgICAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyLAotICAgICAgICAgICAgb2dsZXNfY29udGV4dF90KiBjKQotICAgIHsKLSAgICBpZiAoY21wZihsZWZ0LHJpZ2h0KSB8fAotICAgICAgICBjbXBmKHRvcCwgYm90dG9tKSB8fAotICAgICAgICBjbXBmKHpOZWFyLCB6RmFyKSB8fAotICAgICAgICBpc1plcm9Pck5lZ2F0aXZlZih6TmVhcikgfHwKLSAgICAgICAgaXNaZXJvT3JOZWdhdGl2ZWYoekZhcikpCi0gICAgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb25zdCBHTGZsb2F0IHJfd2lkdGggID0gcmVjaXByb2NhbGYocmlnaHQgLSBsZWZ0KTsKLSAgICBjb25zdCBHTGZsb2F0IHJfaGVpZ2h0ID0gcmVjaXByb2NhbGYodG9wIC0gYm90dG9tKTsKLSAgICBjb25zdCBHTGZsb2F0IHJfZGVwdGggID0gcmVjaXByb2NhbGYoek5lYXIgLSB6RmFyKTsKLSAgICBjb25zdCBHTGZsb2F0IHggPSBtdWwyZih6TmVhciAqIHJfd2lkdGgpOwotICAgIGNvbnN0IEdMZmxvYXQgeSA9IG11bDJmKHpOZWFyICogcl9oZWlnaHQpOwotICAgIGNvbnN0IEdMZmxvYXQgQSA9IG11bDJmKChyaWdodCArIGxlZnQpICogcl93aWR0aCk7Ci0gICAgY29uc3QgR0xmbG9hdCBCID0gKHRvcCArIGJvdHRvbSkgKiByX2hlaWdodDsKLSAgICBjb25zdCBHTGZsb2F0IEMgPSAoekZhciArIHpOZWFyKSAqIHJfZGVwdGg7Ci0gICAgY29uc3QgR0xmbG9hdCBEID0gbXVsMmYoekZhciAqIHpOZWFyICogcl9kZXB0aCk7Ci0gICAgR0xmbG9hdCBmWzE2XTsKLSAgICBmWyAwXSA9IHg7Ci0gICAgZlsgNV0gPSB5OwotICAgIGZbIDhdID0gQTsKLSAgICBmWyA5XSA9IEI7Ci0gICAgZlsxMF0gPSBDOwotICAgIGZbMTRdID0gRDsKLSAgICBmWzExXSA9IC0xLjBmOwotICAgIGZbIDFdID0gZlsgMl0gPSBmWyAzXSA9Ci0gICAgZlsgNF0gPSBmWyA2XSA9IGZbIDddID0KLSAgICBmWzEyXSA9IGZbMTNdID0gZlsxNV0gPSAwLjBmOwotCi0gICAgbWF0cml4Zl90IHJoczsKLSAgICByaHMuc2V0KGYpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bXVsdGlwbHkocmhzKTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotc3RhdGljIHZvaWQgb3J0aG9mKCAKLSAgICAgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCAKLSAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAotICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIsCi0gICAgICAgIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBpZiAoY21wZihsZWZ0LHJpZ2h0KSB8fAotICAgICAgICBjbXBmKHRvcCwgYm90dG9tKSB8fAotICAgICAgICBjbXBmKHpOZWFyLCB6RmFyKSkKLSAgICB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNvbnN0IEdMZmxvYXQgcl93aWR0aCAgPSByZWNpcHJvY2FsZihyaWdodCAtIGxlZnQpOwotICAgIGNvbnN0IEdMZmxvYXQgcl9oZWlnaHQgPSByZWNpcHJvY2FsZih0b3AgLSBib3R0b20pOwotICAgIGNvbnN0IEdMZmxvYXQgcl9kZXB0aCAgPSByZWNpcHJvY2FsZih6RmFyIC0gek5lYXIpOwotICAgIGNvbnN0IEdMZmxvYXQgeCA9ICBtdWwyZihyX3dpZHRoKTsKLSAgICBjb25zdCBHTGZsb2F0IHkgPSAgbXVsMmYocl9oZWlnaHQpOwotICAgIGNvbnN0IEdMZmxvYXQgeiA9IC1tdWwyZihyX2RlcHRoKTsKLSAgICBjb25zdCBHTGZsb2F0IHR4ID0gLShyaWdodCArIGxlZnQpICogcl93aWR0aDsKLSAgICBjb25zdCBHTGZsb2F0IHR5ID0gLSh0b3AgKyBib3R0b20pICogcl9oZWlnaHQ7Ci0gICAgY29uc3QgR0xmbG9hdCB0eiA9IC0oekZhciArIHpOZWFyKSAqIHJfZGVwdGg7Ci0gICAgR0xmbG9hdCBmWzE2XTsKLSAgICBmWyAwXSA9IHg7Ci0gICAgZlsgNV0gPSB5OwotICAgIGZbMTBdID0gejsKLSAgICBmWzEyXSA9IHR4OwotICAgIGZbMTNdID0gdHk7Ci0gICAgZlsxNF0gPSB0ejsKLSAgICBmWzE1XSA9IDEuMGY7Ci0gICAgZlsgMV0gPSBmWyAyXSA9IGZbIDNdID0KLSAgICBmWyA0XSA9IGZbIDZdID0gZlsgN10gPQotICAgIGZbIDhdID0gZlsgOV0gPSBmWzExXSA9IDAuMGY7Ci0gICAgbWF0cml4Zl90IHJoczsKLSAgICByaHMuc2V0KGYpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+bXVsdGlwbHkocmhzKTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotc3RhdGljIHZvaWQgZGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIsIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICB6TmVhciA9IGNsYW1wVG9aZXJvZih6TmVhciA+IDEgPyAxIDogek5lYXIpOwotICAgIHpGYXIgID0gY2xhbXBUb1plcm9mKHpGYXIgID4gMSA/IDEgOiB6RmFyKTsKLSAgICBHTGZsb2F0KiBjb25zdCBmID0gYy0+dHJhbnNmb3Jtcy52cHQubWF0cml4LmVkaXRFbGVtZW50cygpOwotICAgIGZbMTBdID0gZGl2MmYoekZhciAtIHpOZWFyKTsKLSAgICBmWzE0XSA9IGRpdjJmKHpGYXIgKyB6TmVhcik7Ci0gICAgYy0+dHJhbnNmb3Jtcy5kaXJ0eSB8PSB0cmFuc2Zvcm1fc3RhdGVfdDo6VklFV1BPUlQ7Ci0gICAgYy0+dHJhbnNmb3Jtcy52cHQuek5lYXIgPSB6TmVhcjsKLSAgICBjLT50cmFuc2Zvcm1zLnZwdC56RmFyICA9IHpGYXI7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLXZvaWQgZ2xNYXRyaXhNb2RlKEdMZW51bSBtb2RlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgbWF0cml4X3N0YWNrX3QqIHN0YWNrID0gMDsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEdMX01PREVMVklFVzoKLSAgICAgICAgc3RhY2sgPSAmYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUFJPSkVDVElPTjoKLSAgICAgICAgc3RhY2sgPSAmYy0+dHJhbnNmb3Jtcy5wcm9qZWN0aW9uOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1RFWFRVUkU6Ci0gICAgICAgIHN0YWNrID0gJmMtPnRyYW5zZm9ybXMudGV4dHVyZVtjLT50ZXh0dXJlcy5hY3RpdmVdOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPnRyYW5zZm9ybXMubWF0cml4TW9kZSA9IG1vZGU7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50ID0gc3RhY2s7Ci19Ci0KLXZvaWQgZ2xMb2FkSWRlbnRpdHkoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5sb2FkSWRlbnRpdHkoKTsgLy8gYWxzbyBsb2FkcyB0aGUgR0xmaXhlZCB0cmFuc2Zvcm0KLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPmRpcnR5ID0gMDsKLX0KLQotdm9pZCBnbExvYWRNYXRyaXhmKGNvbnN0IEdMZmxvYXQqIG0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPmxvYWQobSk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xMb2FkTWF0cml4eChjb25zdCBHTGZpeGVkKiBtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5sb2FkKG0pOyAvLyBhbHNvIGxvYWRzIHRoZSBHTGZpeGVkIHRyYW5zZm9ybQotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+ZGlydHkgJj0gfm1hdHJpeF9zdGFja190OjpET19GTE9BVF9UT19GSVhFRDsKLX0KLQotdm9pZCBnbE11bHRNYXRyaXhmKGNvbnN0IEdMZmxvYXQqIG0pCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBtYXRyaXhmX3QgcmhzOwotICAgIHJocy5zZXQobSk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5tdWx0aXBseShyaHMpOwotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIGdsTXVsdE1hdHJpeHgoY29uc3QgR0xmaXhlZCogbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIG1hdHJpeGZfdCByaHM7Ci0gICAgcmhzLnNldChtKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPm11bHRpcGx5KHJocyk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xQb3BNYXRyaXgoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgR0xpbnQgZXJyID0gYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5wb3AoKTsKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGVycikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbFB1c2hNYXRyaXgoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgR0xpbnQgZXJyID0gYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5wdXNoKCk7Ci0gICAgaWYgKGdnbF91bmxpa2VseShlcnIpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xGcnVzdHVtZigKLSAgICAgICAgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCAKLSAgICAgICAgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLAotICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBmcnVzdHVtZihsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyLCBjKTsKLX0KLQotdm9pZCBnbEZydXN0dW14KCAKLSAgICAgICAgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LAotICAgICAgICBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsCi0gICAgICAgIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGZydXN0dW1mKCBmaXhlZFRvRmxvYXQobGVmdCksIGZpeGVkVG9GbG9hdChyaWdodCksCi0gICAgICAgICAgICAgIGZpeGVkVG9GbG9hdChib3R0b20pLCBmaXhlZFRvRmxvYXQodG9wKSwKLSAgICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KHpOZWFyKSwgZml4ZWRUb0Zsb2F0KHpGYXIpLAotICAgICAgICAgICAgICBjKTsKLX0KLQotdm9pZCBnbE9ydGhvZiggCi0gICAgICAgIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgCi0gICAgICAgIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwKLSAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgb3J0aG9mKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIsIGMpOwotfQotCi12b2lkIGdsT3J0aG94KAotICAgICAgICBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsCi0gICAgICAgIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwKLSAgICAgICAgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgb3J0aG9mKCBmaXhlZFRvRmxvYXQobGVmdCksIGZpeGVkVG9GbG9hdChyaWdodCksCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQoYm90dG9tKSwgZml4ZWRUb0Zsb2F0KHRvcCksCi0gICAgICAgICAgICBmaXhlZFRvRmxvYXQoek5lYXIpLCBmaXhlZFRvRmxvYXQoekZhciksCi0gICAgICAgICAgICBjKTsKLX0KLQotdm9pZCBnbFJvdGF0ZWYoR0xmbG9hdCBhLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5jdXJyZW50LT5yb3RhdGUoYSwgeCwgeSwgeik7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xSb3RhdGV4KEdMZml4ZWQgYSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+cm90YXRlKCAKLSAgICAgICAgICAgIGZpeGVkVG9GbG9hdChhKSwgZml4ZWRUb0Zsb2F0KHgpLAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KHkpLCBmaXhlZFRvRmxvYXQoeikpOwotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIGdsU2NhbGVmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnNjYWxlKHgsIHksIHopOwotICAgIGMtPnRyYW5zZm9ybXMuaW52YWxpZGF0ZSgpOwotfQotCi12b2lkIGdsU2NhbGV4KEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnNjYWxlKAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KHgpLCBmaXhlZFRvRmxvYXQoeSksIGZpeGVkVG9GbG9hdCh6KSk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xUcmFuc2xhdGVmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT50cmFuc2Zvcm1zLmN1cnJlbnQtPnRyYW5zbGF0ZSh4LCB5LCB6KTsKLSAgICBjLT50cmFuc2Zvcm1zLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBnbFRyYW5zbGF0ZXgoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnRyYW5zZm9ybXMuY3VycmVudC0+dHJhbnNsYXRlKAotICAgICAgICAgICAgZml4ZWRUb0Zsb2F0KHgpLCBmaXhlZFRvRmxvYXQoeSksIGZpeGVkVG9GbG9hdCh6KSk7Ci0gICAgYy0+dHJhbnNmb3Jtcy5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgZ2xTY2lzc29yKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgb2dsZXNfc2Npc3NvcihjLCB4LCB5LCB3LCBoKTsKLX0KLQotdm9pZCBnbFZpZXdwb3J0KEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgb2dsZXNfdmlld3BvcnQoYywgeCwgeSwgdywgaCk7Ci19Ci0KLXZvaWQgZ2xEZXB0aFJhbmdlZihHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRlcHRoUmFuZ2VmKHpOZWFyLCB6RmFyLCBjKTsKLX0KLQotdm9pZCBnbERlcHRoUmFuZ2V4KEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZGVwdGhSYW5nZWYoZml4ZWRUb0Zsb2F0KHpOZWFyKSwgZml4ZWRUb0Zsb2F0KHpGYXIpLCBjKTsKLX0KLQotdm9pZCBnbFBvbHlnb25PZmZzZXR4KEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cG9seWdvbk9mZnNldC5mYWN0b3IgPSBmYWN0b3I7Ci0gICAgYy0+cG9seWdvbk9mZnNldC51bml0cyA9IHVuaXRzOwotfQotCi12b2lkIGdsUG9seWdvbk9mZnNldChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnBvbHlnb25PZmZzZXQuZmFjdG9yID0gZ2dsRmxvYXRUb0ZpeGVkKGZhY3Rvcik7Ci0gICAgYy0+cG9seWdvbk9mZnNldC51bml0cyA9IGdnbEZsb2F0VG9GaXhlZCh1bml0cyk7Ci19Ci0KLUdMYml0ZmllbGQgZ2xRdWVyeU1hdHJpeHhPRVMoR0xmaXhlZCogbSwgR0xpbnQqIGUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBHTGJpdGZpZWxkIHN0YXR1cyA9IDA7Ci0gICAgR0xmbG9hdCBjb25zdCogZiA9IGMtPnRyYW5zZm9ybXMuY3VycmVudC0+dG9wKCkuZWxlbWVudHMoKTsKLSAgICBmb3IgIChpbnQgaT0wIDsgaTwxNiA7IGkrKykgewotICAgICAgICBpZiAoaXNuYW4oZltpXSkgfHwgaXNpbmYoZltpXSkpIHsKLSAgICAgICAgICAgIHN0YXR1cyB8PSAxPDxpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZVtpXSA9IGV4cG9uZW50KGZbaV0pIC0gNzsKLSAgICAgICAgbVtpXSA9IG1hbnRpc3NhKGZbaV0pOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguaCBiL29wZW5nbC9saWJhZ2wvbWF0cml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTM4YTkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL21hdHJpeC5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX01BVFJJWF9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfTUFUUklYX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9waXhlbGZsaW5nZXIvZ2dsX2NvbnRleHQuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jb25zdCBpbnQgT0dMRVNfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgPSAxNjsKLWNvbnN0IGludCBPR0xFU19QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICA9ICAyOwotY29uc3QgaW50IE9HTEVTX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgID0gIDI7Ci0KLXZvaWQgb2dsZXNfaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90Kik7Ci12b2lkIG9nbGVzX3VuaW5pdF9tYXRyaXgob2dsZXNfY29udGV4dF90Kik7Ci12b2lkIG9nbGVzX2ludmFsaWRhdGVfcGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjKTsKLXZvaWQgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwob2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KTsKLQotaW50IG9nbGVzX3N1cmZhY2Vwb3J0KG9nbGVzX2NvbnRleHRfdCogYywgR0xpbnQgeCwgR0xpbnQgeSk7Ci0KLXZvaWQgb2dsZXNfc2Npc3NvcihvZ2xlc19jb250ZXh0X3QqIGMsIAotICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCk7Ci0KLXZvaWQgb2dsZXNfdmlld3BvcnQob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHcsIEdMc2l6ZWkgaCk7Ci0KLWlubGluZSB2b2lkIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybSgKLSAgICAgICAgb2dsZXNfY29udGV4dF90KiBjLCB1aW50MzJfdCB3YW50KQotewotICAgIGlmIChjLT50cmFuc2Zvcm1zLmRpcnR5ICYgd2FudCkKLSAgICAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtX2ltcGwoYywgd2FudCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lCi1HTGZpeGVkIHZzcXVhcmUzKEdMZml4ZWQgYSwgR0xmaXhlZCBiLCBHTGZpeGVkIGMpIAotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotCi0gICAgR0xmaXhlZCByOwotICAgIGludDMyX3QgdDsKLSAgICBhc20oCi0gICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMiAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTMsICUzICAgICAgIFxuIgotICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTQgICAgICAgXG4iCi0gICAgICAgICJtb3ZzICAlMCwgJTAsIGxzciAjMTYgICAgICBcbiIKLSAgICAgICAgImFkYyAgICUwLCAlMCwgJTEsIGxzbCAjMTYgIFxuIgotICAgICAgICA6ICAgIj0mciIociksICI9JnIiKHQpIAotICAgICAgICA6ICAgIiVyIihhKSwgInIiKGIpLCAiciIoYykKLSAgICAgICAgOiAgICJjYyIKLSAgICAgICAgKTsgCi0gICAgcmV0dXJuIHI7Ci0KLSNlbHNlCi0KLSAgICByZXR1cm4gKCggICBpbnQ2NF90KGEpKmEgKwotICAgICAgICAgICAgICAgIGludDY0X3QoYikqYiArCi0gICAgICAgICAgICAgICAgaW50NjRfdChjKSpjICsgMHg4MDAwKT4+MTYpOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTJhKCBHTGZpeGVkIGEwLCBHTGZpeGVkIGIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsIEdMZml4ZWQgYjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEdMZml4ZWQgcjsKLSAgICBpbnQzMl90IHQ7Ci0gICAgYXNtKAotICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKLSAgICAgICAgImFkZCAgICUwLCAlNiwgJTAsIGxzciAjMTYgIFxuIgotICAgICAgICAiYWRkICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCi0gICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCi0gICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwgCi0gICAgICAgICAgICAiJXIiKGExKSwgInIiKGIxKSwKLSAgICAgICAgICAgICJyIihjKQotICAgICAgICA6Ci0gICAgICAgICk7IAotICAgIHJldHVybiByOwotICAgIAotI2Vsc2UKLQotICAgIHJldHVybiAoKCAgIGludDY0X3QoYTApKmIwICsKLSAgICAgICAgICAgICAgICBpbnQ2NF90KGExKSpiMSk+PjE2KSArIGM7Ci0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2EoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsIEdMZml4ZWQgYjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIEdMZml4ZWQgYjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYykKLXsKLSNpZiBkZWZpbmVkKF9fYXJtX18pICYmICFkZWZpbmVkKF9fdGh1bWJfXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBHTGZpeGVkIHI7Ci0gICAgaW50MzJfdCB0OwotICAgIGFzbSgKLSAgICAgICAgInNtdWxsICUwLCAlMSwgJTIsICUzICAgICAgIFxuIgotICAgICAgICAic21sYWwgJTAsICUxLCAlNCwgJTUgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU2LCAlNyAgICAgICBcbiIKLSAgICAgICAgImFkZCAgICUwLCAlOCwgJTAsIGxzciAjMTYgIFxuIgotICAgICAgICAiYWRkICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCi0gICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCi0gICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwKLSAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAotICAgICAgICAgICAgIiVyIihhMiksICJyIihiMiksCi0gICAgICAgICAgICAiciIoYykKLSAgICAgICAgOgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLSAgICAKLSNlbHNlCi0KLSAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCi0gICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKwotICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyKT4+MTYpICsgYzsKLQotI2VuZGlmCi19Ci0KLS8vIGIwLCBiMSwgYjIgYXJlIHNpZ25lZCAxNi1iaXQgcXVhbml0aWVzCi0vLyB0aGF0IGhhdmUgYmVlbiBzaGlmdGVkIHJpZ2h0IGJ5ICdzaGlmdCcgYml0cyByZWxhdGl2ZSB0byBub3JtYWwKLS8vIFMxNi4xNiBmaXhlZCBwb2ludAotc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTNhMTYoIEdMZml4ZWQgYTAsIGludDMyX3QgYjFiMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsIGludDMyX3QgYjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEdMZml4ZWQgcjsKLSAgICBhc20oCi0gICAgICAgICJzbXVsd2IgJTAsICUxLCAlMiAgICAgICAgICBcbiIKLSAgICAgICAgInNtbGF3dCAlMCwgJTMsICUyLCAlMCAgICAgIFxuIiAKLSAgICAgICAgInNtbGF3YiAlMCwgJTQsICU1LCAlMCAgICAgIFxuIgotICAgICAgICAiYWRkICAgICUwLCAlNywgJTAsIGxzbCAlNiAgXG4iCi0gICAgICAgIDogICAiPSZyIihyKQotICAgICAgICA6ICAgInIiKGEwKSwgInIiKGIxYjApLAotICAgICAgICAgICAgInIiKGExKSwKLSAgICAgICAgICAgICJyIihhMiksICJyIihiMiksCi0gICAgICAgICAgICAiciIoc2hpZnQpLAotICAgICAgICAgICAgInIiKGMpCi0gICAgICAgIDoKLSAgICAgICAgKTsgCi0gICAgcmV0dXJuIHI7Ci0gICAgCi0jZWxzZQotCi0gICAgaW50MzJfdCBhY2N1bTsKLSAgICBpbnQxNl90IGIwID0gYjFiMCAmIDB4ZmZmZjsKLSAgICBpbnQxNl90IGIxID0gKGIxYjAgPj4gMTYpICYgMHhmZmZmOwotICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OwotICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OwotICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OwotICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7Ci0gICAgcmV0dXJuIGFjY3VtOwotCi0jZW5kaWYKLX0KLQotCi1zdGF0aWMgaW5saW5lIEdMZml4ZWQgbWxhM2ExNl9idGIoIEdMZml4ZWQgYTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYjFiMCwgaW50MzJfdCB4eGIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGludCBzaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBjKQotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEdMZml4ZWQgcjsKLSAgICBhc20oCi0gICAgICAgICJzbXVsd2IgJTAsICUxLCAlNCAgICAgICAgICBcbiIKLSAgICAgICAgInNtbGF3dCAlMCwgJTIsICU0LCAlMCAgICAgIFxuIiAKLSAgICAgICAgInNtbGF3YiAlMCwgJTMsICU1LCAlMCAgICAgIFxuIgotICAgICAgICAiYWRkICAgICUwLCAlNywgJTAsIGxzbCAlNiAgXG4iCi0gICAgICAgIDogICAiPSZyIihyKQotICAgICAgICA6ICAgInIiKGEwKSwKLSAgICAgICAgICAgICJyIihhMSksCi0gICAgICAgICAgICAiciIoYTIpLAotICAgICAgICAgICAgInIiKGIxYjApLCAiciIoeHhiMiksCi0gICAgICAgICAgICAiciIoc2hpZnQpLAotICAgICAgICAgICAgInIiKGMpCi0gICAgICAgIDoKLSAgICAgICAgKTsgCi0gICAgcmV0dXJuIHI7Ci0gICAgCi0jZWxzZQotCi0gICAgaW50MzJfdCBhY2N1bTsKLSAgICBpbnQxNl90IGIwID0gIGIxYjAgICAgICAgICYgMHhmZmZmOwotICAgIGludDE2X3QgYjEgPSAoYjFiMCA+PiAxNikgJiAweGZmZmY7Ci0gICAgaW50MTZfdCBiMiA9ICB4eGIyICAgICAgICAmIDB4ZmZmZjsKLSAgICBhY2N1bSAgPSBpbnQ2NF90KGEwKSppbnQxNl90KGIwKSA+PiAxNjsKLSAgICBhY2N1bSArPSBpbnQ2NF90KGExKSppbnQxNl90KGIxKSA+PiAxNjsKLSAgICBhY2N1bSArPSBpbnQ2NF90KGEyKSppbnQxNl90KGIyKSA+PiAxNjsKLSAgICBhY2N1bSA9IChhY2N1bSA8PCBzaGlmdCkgKyBjOwotICAgIHJldHVybiBhY2N1bTsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgR0xmaXhlZCBtbGEzYTE2X2J0dCggR0xmaXhlZCBhMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiMWIwLCBpbnQzMl90IGIyeHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGMpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgR0xmaXhlZCByOwotICAgIGFzbSgKLSAgICAgICAgInNtdWx3YiAlMCwgJTEsICU0ICAgICAgICAgIFxuIgotICAgICAgICAic21sYXd0ICUwLCAlMiwgJTQsICUwICAgICAgXG4iIAotICAgICAgICAic21sYXd0ICUwLCAlMywgJTUsICUwICAgICAgXG4iCi0gICAgICAgICJhZGQgICAgJTAsICU3LCAlMCwgbHNsICU2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpCi0gICAgICAgIDogICAiciIoYTApLAotICAgICAgICAgICAgInIiKGExKSwKLSAgICAgICAgICAgICJyIihhMiksCi0gICAgICAgICAgICAiciIoYjFiMCksICJyIihiMnh4KSwKLSAgICAgICAgICAgICJyIihzaGlmdCksCi0gICAgICAgICAgICAiciIoYykKLSAgICAgICAgOgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLSAgICAKLSNlbHNlCi0KLSAgICBpbnQzMl90IGFjY3VtOwotICAgIGludDE2X3QgYjAgPSAgYjFiMCAgICAgICAgJiAweGZmZmY7Ci0gICAgaW50MTZfdCBiMSA9IChiMWIwID4+IDE2KSAmIDB4ZmZmZjsKLSAgICBpbnQxNl90IGIyID0gKGIyeHggPj4gMTYpICYgMHhmZmZmOwotICAgIGFjY3VtICA9IGludDY0X3QoYTApKmludDE2X3QoYjApID4+IDE2OwotICAgIGFjY3VtICs9IGludDY0X3QoYTEpKmludDE2X3QoYjEpID4+IDE2OwotICAgIGFjY3VtICs9IGludDY0X3QoYTIpKmludDE2X3QoYjIpID4+IDE2OwotICAgIGFjY3VtID0gKGFjY3VtIDw8IHNoaWZ0KSArIGM7Ci0gICAgcmV0dXJuIGFjY3VtOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTMoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLCBHTGZpeGVkIGIyKQotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIEdMZml4ZWQgcjsKLSAgICBpbnQzMl90IHQ7Ci0gICAgYXNtKAotICAgICAgICAic211bGwgJTAsICUxLCAlMiwgJTMgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU0LCAlNSAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTYsICU3ICAgICAgIFxuIgotICAgICAgICAibW92cyAgJTAsICUwLCBsc3IgIzE2ICAgICAgXG4iCi0gICAgICAgICJhZGMgICAlMCwgJTAsICUxLCBsc2wgIzE2ICBcbiIKLSAgICAgICAgOiAgICI9JnIiKHIpLCAiPSZyIih0KSAKLSAgICAgICAgOiAgICIlciIoYTApLCAiciIoYjApLAotICAgICAgICAgICAgIiVyIihhMSksICJyIihiMSksCi0gICAgICAgICAgICAiJXIiKGEyKSwgInIiKGIyKQotICAgICAgICA6ICAgImNjIgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLSAgICAKLSNlbHNlCi0KLSAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCi0gICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKwotICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyICsgMHg4MDAwKT4+MTYpOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBHTGZpeGVkIG1sYTQoIEdMZml4ZWQgYTAsIEdMZml4ZWQgYjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmaXhlZCBhMSwgR0xmaXhlZCBiMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZpeGVkIGEyLCBHTGZpeGVkIGIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZml4ZWQgYTMsIEdMZml4ZWQgYjMpCi17Ci0jaWYgZGVmaW5lZChfX2FybV9fKSAmJiAhZGVmaW5lZChfX3RodW1iX18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgR0xmaXhlZCByOwotICAgIGludDMyX3QgdDsKLSAgICBhc20oCi0gICAgICAgICJzbXVsbCAlMCwgJTEsICUyLCAlMyAgICAgICBcbiIKLSAgICAgICAgInNtbGFsICUwLCAlMSwgJTQsICU1ICAgICAgIFxuIgotICAgICAgICAic21sYWwgJTAsICUxLCAlNiwgJTcgICAgICAgXG4iCi0gICAgICAgICJzbWxhbCAlMCwgJTEsICU4LCAlOSAgICAgICBcbiIKLSAgICAgICAgIm1vdnMgICUwLCAlMCwgbHNyICMxNiAgICAgIFxuIgotICAgICAgICAiYWRjICAgJTAsICUwLCAlMSwgbHNsICMxNiAgXG4iCi0gICAgICAgIDogICAiPSZyIihyKSwgIj0mciIodCkgCi0gICAgICAgIDogICAiJXIiKGEwKSwgInIiKGIwKSwKLSAgICAgICAgICAgICIlciIoYTEpLCAiciIoYjEpLAotICAgICAgICAgICAgIiVyIihhMiksICJyIihiMiksCi0gICAgICAgICAgICAiJXIiKGEzKSwgInIiKGIzKQotICAgICAgICA6ICAgImNjIgotICAgICAgICApOyAKLSAgICByZXR1cm4gcjsKLSAgICAKLSNlbHNlCi0KLSAgICByZXR1cm4gKCggICBpbnQ2NF90KGEwKSpiMCArCi0gICAgICAgICAgICAgICAgaW50NjRfdChhMSkqYjEgKwotICAgICAgICAgICAgICAgIGludDY0X3QoYTIpKmIyICsKLSAgICAgICAgICAgICAgICBpbnQ2NF90KGEzKSpiMyArIDB4ODAwMCk+PjE2KTsKLQotI2VuZGlmCi19Ci0KLWlubGluZQotR0xmaXhlZCBkb3Q0KGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIAotewotICAgIHJldHVybiBtbGE0KGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0sIGFbMl0sIGJbMl0sIGFbM10sIGJbM10pOwotfQotCi0KLWlubGluZQotR0xmaXhlZCBkb3QzKGNvbnN0IEdMZml4ZWQqIGEsIGNvbnN0IEdMZml4ZWQqIGIpIAotewotICAgIHJldHVybiBtbGEzKGFbMF0sIGJbMF0sIGFbMV0sIGJbMV0sIGFbMl0sIGJbMl0pOwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX01BVFJJWF9ICi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcCBiL29wZW5nbC9saWJhZ2wvbWlwbWFwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE0MmE1OC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL21pcG1hcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9taXBtYXAuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAic3RhdGUuaCIKLSNpbmNsdWRlICJ0ZXh0dXJlLmgiCi0jaW5jbHVkZSAiVGV4dHVyZU9iamVjdE1hbmFnZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IGJ1aWxkQVB5cmFtaWQob2dsZXNfY29udGV4dF90KiBjLCBFR0xUZXh0dXJlT2JqZWN0KiB0ZXgpCi17Ci0gICAgaW50IGxldmVsID0gMDsKLSAgICBjb25zdCBHR0xTdXJmYWNlKiBiYXNlID0gJnRleC0+c3VyZmFjZTsgICAgCi0gICAgY29uc3QgR0dMRm9ybWF0JiBwaXhlbEZvcm1hdChjLT5yYXN0ZXJpemVyLmZvcm1hdHNbYmFzZS0+Zm9ybWF0XSk7Ci0KLSAgICBpbnQgdyA9IGJhc2UtPndpZHRoOwotICAgIGludCBoID0gYmFzZS0+aGVpZ2h0OwotICAgIGlmICgodyZoKSA9PSAxKQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0KLSAgICB3ID0gKHc+PjEpID8gOiAxOwotICAgIGggPSAoaD4+MSkgPyA6IDE7Ci0KLSAgICB3aGlsZSh0cnVlKSB7Ci0gICAgICAgICsrbGV2ZWw7Ci0gICAgICAgIGNvbnN0IGludCBicHIgPSB3ICogcGl4ZWxGb3JtYXQuc2l6ZTsKLSAgICAgICAgaWYgKHRleC0+cmVhbGxvY2F0ZShsZXZlbCwgdywgaCwgdywKLSAgICAgICAgICAgICAgICBiYXNlLT5mb3JtYXQsIGJhc2UtPmNvbXByZXNzZWRGb3JtYXQsIGJwcikgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgaW50IHN0cmlkZSA9IHc7Ci0gICAgICAgIGludCBicyA9IGJhc2UtPnN0cmlkZTsKLSAgICAgICAgR0dMU3VyZmFjZSYgY3VyID0gdGV4LT5lZGl0TWlwKGxldmVsKTsKLQotICAgICAgICBpZiAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSkKLSAgICAgICAgewotICAgICAgICAgICAgdWludDE2X3QgY29uc3QgKiBzcmMgPSAodWludDE2X3QgY29uc3QgKiliYXNlLT5kYXRhOwotICAgICAgICAgICAgdWludDE2X3QqIGRzdCA9ICh1aW50MTZfdCopY3VyLmRhdGE7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gMHgwN0UwRjgxRjsKLSAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbb2Zmc2V0XTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW29mZnNldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW29mZnNldCtic107Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tvZmZzZXQrYnMrMV07Ci0gICAgICAgICAgICAgICAgICAgIHAwMCA9IChwMDAgfCAocDAwIDw8IDE2KSkgJiBtYXNrOwotICAgICAgICAgICAgICAgICAgICBwMDEgPSAocDAxIHwgKHAwMSA8PCAxNikpICYgbWFzazsKLSAgICAgICAgICAgICAgICAgICAgcDEwID0gKHAxMCB8IChwMTAgPDwgMTYpKSAmIG1hc2s7Ci0gICAgICAgICAgICAgICAgICAgIHAxMSA9IChwMTEgfCAocDExIDw8IDE2KSkgJiBtYXNrOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBncmIgPSAoKHAwMCArIHAxMCArIHAwMSArIHAxMSkgPj4gMikgJiBtYXNrOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2IgPSAoZ3JiICYgMHhGRkZGKSB8IChncmIgPj4gMTYpOwotICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXSA9IHJnYjsKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX1JHQkFfNTU1MSkKLSAgICAgICAgewotICAgICAgICAgICAgdWludDE2X3QgY29uc3QgKiBzcmMgPSAodWludDE2X3QgY29uc3QgKiliYXNlLT5kYXRhOwotICAgICAgICAgICAgdWludDE2X3QqIGRzdCA9ICh1aW50MTZfdCopY3VyLmRhdGE7Ci0gICAgICAgICAgICBmb3IgKGludCB5PTAgOyB5PGggOyB5KyspIHsKLSAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gKHkqMikgKiBiczsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHcgOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAwID0gc3JjW29mZnNldF07Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMCA9IHNyY1tvZmZzZXQrMV07Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAwMSA9IHNyY1tvZmZzZXQrYnNdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMTEgPSBzcmNbb2Zmc2V0K2JzKzFdOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByID0gKChwMDA+PjExKSsocDEwPj4xMSkrKHAwMT4+MTEpKyhwMTE+PjExKSsyKT4+MjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZyA9ICgoKHAwMD4+NikrKHAxMD4+NikrKHAwMT4+NikrKHAxMT4+NikrMik+PjIpJjB4M0Y7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGIgPSAoKHAwMCYweDNFKSsocDEwJjB4M0UpKyhwMDEmMHgzRSkrKHAxMSYweDNFKSs0KT4+MzsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYSA9ICgocDAwJjEpKyhwMTAmMSkrKHAwMSYxKSsocDExJjEpKzIpPj4yOwotICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXSA9IChyPDwxMSl8KGc8PDYpfChiPDwxKXxhOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4KQotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjb25zdCAqIHNyYyA9ICh1aW50MzJfdCBjb25zdCAqKWJhc2UtPmRhdGE7Ci0gICAgICAgICAgICB1aW50MzJfdCogZHN0ID0gKHVpbnQzMl90KiljdXIuZGF0YTsKLSAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbb2Zmc2V0XTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW29mZnNldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW29mZnNldCtic107Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tvZmZzZXQrYnMrMV07Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiMDAgPSBwMDAgJiAweDAwRkYwMEZGOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYjAxID0gcDAxICYgMHgwMEZGMDBGRjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmIxMCA9IHAxMCAmIDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiMTEgPSBwMTEgJiAweDAwRkYwMEZGOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnYTAwID0gKHAwMCA+PiA4KSAmIDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdhMDEgPSAocDAxID4+IDgpICYgMHgwMEZGMDBGRjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2ExMCA9IChwMTAgPj4gOCkgJiAweDAwRkYwMEZGOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnYTExID0gKHAxMSA+PiA4KSAmIDB4MDBGRjAwRkY7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiID0gKHJiMDAgKyByYjAxICsgcmIxMCArIHJiMTEpPj4yOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnYSA9IChnYTAwICsgZ2EwMSArIGdhMTAgKyBnYTExKT4+MjsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmdiYSA9IChyYiAmIDB4MDBGRjAwRkYpIHwgKChnYSAmIDB4MDBGRjAwRkYpPDw4KTsKLSAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyB5KnN0cmlkZV0gPSByZ2JhOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX1JHQl84ODgpIHx8Ci0gICAgICAgICAgICAgICAgIChiYXNlLT5mb3JtYXQgPT0gR0dMX1BJWEVMX0ZPUk1BVF9MQV84OCkgfHwKLSAgICAgICAgICAgICAgICAgKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX0FfOCkgfHwKLSAgICAgICAgICAgICAgICAgKGJhc2UtPmZvcm1hdCA9PSBHR0xfUElYRUxfRk9STUFUX0xfOCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBza2lwOwotICAgICAgICAgICAgc3dpdGNoIChiYXNlLT5mb3JtYXQpIHsKLSAgICAgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfODg4OiAgc2tpcCA9IDM7ICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfTEFfODg6ICAgIHNraXAgPSAyOyAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICBza2lwID0gMTsgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQ4X3QgY29uc3QgKiBzcmMgPSAodWludDhfdCBjb25zdCAqKWJhc2UtPmRhdGE7Ci0gICAgICAgICAgICB1aW50OF90KiBkc3QgPSAodWludDhfdCopY3VyLmRhdGE7ICAgICAgICAgICAgCi0gICAgICAgICAgICBicyAqPSBza2lwOwotICAgICAgICAgICAgc3RyaWRlICo9IHNraXA7Ci0gICAgICAgICAgICBmb3IgKGludCB5PTAgOyB5PGggOyB5KyspIHsKLSAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gKHkqMikgKiBiczsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHcgOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYz0wIDsgYzxza2lwIDsgYysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbYytvZmZzZXRdOwotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW2Mrb2Zmc2V0K3NraXBdOwotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW2Mrb2Zmc2V0K2JzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tjK29mZnNldCticytza2lwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgeSpzdHJpZGUgKyBjXSA9IChwMDAgKyBwMTAgKyBwMDEgKyBwMTEpID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDIqc2tpcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYmFzZS0+Zm9ybWF0ID09IEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0KQotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MTZfdCBjb25zdCAqIHNyYyA9ICh1aW50MTZfdCBjb25zdCAqKWJhc2UtPmRhdGE7Ci0gICAgICAgICAgICB1aW50MTZfdCogZHN0ID0gKHVpbnQxNl90KiljdXIuZGF0YTsKLSAgICAgICAgICAgIGZvciAoaW50IHk9MCA7IHk8aCA7IHkrKykgewotICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAoeSoyKSAqIGJzOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8dyA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwMDAgPSBzcmNbb2Zmc2V0XTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDEwID0gc3JjW29mZnNldCsxXTsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcDAxID0gc3JjW29mZnNldCtic107Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHAxMSA9IHNyY1tvZmZzZXQrYnMrMV07Ci0gICAgICAgICAgICAgICAgICAgIHAwMCA9ICgocDAwIDw8IDEyKSAmIDB4MEYwRjAwMDApIHwgKHAwMCAmIDB4MEYwRik7Ci0gICAgICAgICAgICAgICAgICAgIHAxMCA9ICgocDEwIDw8IDEyKSAmIDB4MEYwRjAwMDApIHwgKHAxMCAmIDB4MEYwRik7Ci0gICAgICAgICAgICAgICAgICAgIHAwMSA9ICgocDAxIDw8IDEyKSAmIDB4MEYwRjAwMDApIHwgKHAwMSAmIDB4MEYwRik7Ci0gICAgICAgICAgICAgICAgICAgIHAxMSA9ICgocDExIDw8IDEyKSAmIDB4MEYwRjAwMDApIHwgKHAxMSAmIDB4MEYwRik7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJiZ2EgPSAocDAwICsgcDEwICsgcDAxICsgcDExKSA+PiAyOwotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZ2JhID0gKHJiZ2EgJiAweDBGMEYpIHwgKChyYmdhPj4xMikgJiAweEYwRjApOwotICAgICAgICAgICAgICAgICAgICBkc3RbeCArIHkqc3RyaWRlXSA9IHJnYmE7Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBmb3JtYXQgKCVkKSIsIGJhc2UtPmZvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBleGl0IGNvbmRpdGlvbjogd2UganVzdCBwcm9jZXNzZWQgdGhlIDF4MSBMT0RzCi0gICAgICAgIGlmICgodyZoKSA9PSAxKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgYmFzZSA9ICZjdXI7Ci0gICAgICAgIHcgPSAodz4+MSkgPyA6IDE7Ci0gICAgICAgIGggPSAoaD4+MSkgPyA6IDE7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAgYi9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjllYzQwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTExICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvcHJpbWl0aXZlcy5jcHAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlICJjb250ZXh0LmgiCi0jaW5jbHVkZSAicHJpbWl0aXZlcy5oIgotI2luY2x1ZGUgImxpZ2h0LmgiCi0jaW5jbHVkZSAibWF0cml4LmgiCi0jaW5jbHVkZSAidmVydGV4LmgiCi0jaW5jbHVkZSAiZnAuaCIKLSNpbmNsdWRlICJUZXh0dXJlT2JqZWN0TWFuYWdlci5oIgotCi1leHRlcm4gIkMiIHZvaWQgaXRlcmF0b3JzMDAzMihjb25zdCB2b2lkKiB0aGF0LAotICAgICAgICBpbnQzMl90KiBpdCwgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMik7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBwcmltaXRpdmVfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7Ci1zdGF0aWMgdm9pZCBwcmltaXRpdmVfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKTsKLXN0YXRpYyB2b2lkIHByaW1pdGl2ZV9jbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7Ci0KLXN0YXRpYyB2b2lkIHByaW1pdGl2ZV9ub3BfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdik7Ci1zdGF0aWMgdm9pZCBwcmltaXRpdmVfbm9wX2xpbmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSk7Ci1zdGF0aWMgdm9pZCBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBjdWxsX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7Ci0KLXN0YXRpYyB2b2lkIGxlcnBfdHJpYW5nbGUob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLQotc3RhdGljIHZvaWQgbGVycF90ZXhjb29yZHMob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKTsKLQotc3RhdGljIHZvaWQgbGVycF90ZXhjb29yZHNfdyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOwotCi1zdGF0aWMgdm9pZCB0cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpOwotCi1zdGF0aWMgdm9pZCBjbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2Mik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2xpcF9saW5lKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHMsIHZlcnRleF90KiBwKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGgob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIGlmICghKHYwLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7Ci0gICAgICAgIHYwLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCi0gICAgICAgICAgICAgICAgdjAtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOwotICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdjAtPmNvbG9yLnYsIGNwKTsKLSAgICB9Ci0gICAgaWYgKCEodjEtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdjEtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKLSAgICAgICAgICAgICAgICB2MS0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2MS0+Y29sb3IudiwgY3ApOwotICAgIH0KLSAgICBpZighKHYyLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7Ci0gICAgICAgIHYyLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCi0gICAgICAgICAgICAgICAgdjItPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOwotICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdjItPmNvbG9yLnYsIGNwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgaWYgKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpIHsKLSAgICAgICAgdjItPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIGNvbnN0IEdMdm9pZCogY3AgPSBjLT5hcnJheXMuY29sb3IuZWxlbWVudCgKLSAgICAgICAgICAgICAgICB2Mi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2Mi0+Y29sb3IudiwgY3ApOwotICAgIH0KLSAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZVNtb290aChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgaWYgKCEodjAtPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCi0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYwKTsKLSAgICBpZiAoISh2MS0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdjEpOwotICAgIGlmKCEodjItPmZsYWdzICYgdmVydGV4X3Q6OkxJVCkpCi0gICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYyKTsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZUZsYXQob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICB2ZXJ0ZXhfdCogdjAsIHZlcnRleF90KiB2MSwgdmVydGV4X3QqIHYyKQotewotICAgIGlmICghKHYyLT5mbGFncyAmIHZlcnRleF90OjpMSVQpKQotICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2Mik7Ci0gICAgLy8gY29uZmlndXJlIHRoZSByYXN0ZXJpemVyIGhlcmUsIGJlZm9yZSB3ZSBjbGlwCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2Mi0+Y29sb3Iudik7Ci19Ci0KLS8vIFRoZSBmb2cgdmVyc2lvbnMuLi4KLQotc3RhdGljIGlubGluZQotdm9pZCBsaWdodFZlcnRleERhcmtTbW9vdGhGb2cob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7Ci0gICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwotICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCi0gICAgICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgIGMtPmFycmF5cy5jb2xvci5mZXRjaChjLCB2LT5jb2xvci52LCBjcCk7Ci0gICAgfQotfQotc3RhdGljIGlubGluZQotdm9pZCBsaWdodFZlcnRleERhcmtGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewotICAgICAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6TElUOwotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKLSAgICB9Ci19Ci1zdGF0aWMgaW5saW5lCi12b2lkIGxpZ2h0VmVydGV4U21vb3RoRm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCi17Ci0gICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRWZXJ0ZXgoYywgdik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBsaWdodFRyaWFuZ2xlRGFya1Ntb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYwKTsKLSAgICBsaWdodFZlcnRleERhcmtTbW9vdGhGb2coYywgdjEpOwotICAgIGxpZ2h0VmVydGV4RGFya1Ntb290aEZvZyhjLCB2Mik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgbGlnaHRWZXJ0ZXhEYXJrRmxhdEZvZyhjLCB2MCk7Ci0gICAgbGlnaHRWZXJ0ZXhEYXJrRmxhdEZvZyhjLCB2MSk7Ci0gICAgbGlnaHRWZXJ0ZXhEYXJrU21vb3RoRm9nKGMsIHYyKTsKLSAgICAvLyBjb25maWd1cmUgdGhlIHJhc3Rlcml6ZXIgaGVyZSwgYmVmb3JlIHdlIGNsaXAKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYyLT5jb2xvci52KTsKLX0KLQotc3RhdGljIHZvaWQgbGlnaHRUcmlhbmdsZVNtb290aEZvZyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgbGlnaHRWZXJ0ZXhTbW9vdGhGb2coYywgdjApOwotICAgIGxpZ2h0VmVydGV4U21vb3RoRm9nKGMsIHYxKTsKLSAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2Mik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxpZ2h0VHJpYW5nbGVGbGF0Rm9nKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYwKTsKLSAgICBsaWdodFZlcnRleERhcmtGbGF0Rm9nKGMsIHYxKTsKLSAgICBsaWdodFZlcnRleFNtb290aEZvZyhjLCB2Mik7Ci0gICAgLy8gY29uZmlndXJlIHRoZSByYXN0ZXJpemVyIGhlcmUsIGJlZm9yZSB3ZSBjbGlwCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCB2Mi0+Y29sb3Iudik7Ci19Ci0KLQotCi10eXBlZGVmIHZvaWQgKCpsaWdodF9wcmltaXRpdmVfdCkob2dsZXNfY29udGV4dF90KiwKLSAgICAgICAgdmVydGV4X3QqLCB2ZXJ0ZXhfdCosIHZlcnRleF90Kik7Ci0KLS8vIGZvZyAweDQsIGxpZ2h0IDB4Miwgc21vb3RoIDB4MQotc3RhdGljIGNvbnN0IGxpZ2h0X3ByaW1pdGl2ZV90IGxpZ2h0UHJpbWl0aXZlWzhdID0gewotICAgIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdCwgICAgICAgICAgLy8gbm8gZm9nIHwgZGFyayAgfCBmbGF0Ci0gICAgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGgsICAgICAgICAvLyBubyBmb2cgfCBkYXJrICB8IHNtb290aAotICAgIGxpZ2h0VHJpYW5nbGVGbGF0LCAgICAgICAgICAgICAgLy8gbm8gZm9nIHwgbGlnaHQgfCBmbGF0Ci0gICAgbGlnaHRUcmlhbmdsZVNtb290aCwgICAgICAgICAgICAvLyBubyBmb2cgfCBsaWdodCB8IHNtb290aAotICAgIGxpZ2h0VHJpYW5nbGVEYXJrRmxhdEZvZywgICAgICAgLy8gZm9nICAgIHwgZGFyayAgfCBmbGF0Ci0gICAgbGlnaHRUcmlhbmdsZURhcmtTbW9vdGhGb2csICAgICAvLyBmb2cgICAgfCBkYXJrICB8IHNtb290aAotICAgIGxpZ2h0VHJpYW5nbGVGbGF0Rm9nLCAgICAgICAgICAgLy8gZm9nICAgIHwgbGlnaHQgfCBmbGF0Ci0gICAgbGlnaHRUcmlhbmdsZVNtb290aEZvZyAgICAgICAgICAvLyBmb2cgICAgfCBsaWdodCB8IHNtb290aAotfTsKLQotdm9pZCBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotCi0gICAgLy8gc2V0IHVwIHRoZSBsaWdodGluZy9zaGFkaW5nL3Ntb290aGluZy9mb2dnaW5nIGZ1bmN0aW9uCi0gICAgaW50IGluZGV4ID0gZW5hYmxlcyAmIEdHTF9FTkFCTEVfU01PT1RIID8gMHgxIDogMDsKLSAgICBpbmRleCB8PSBjLT5saWdodGluZy5lbmFibGUgPyAweDIgOiAwOwotICAgIGluZGV4IHw9IGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRyA/IDB4NCA6IDA7Ci0gICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZSA9IGxpZ2h0UHJpbWl0aXZlW2luZGV4XTsKLSAgICAKLSAgICAvLyBzZXQgdXAgdGhlIHByaW1pdGl2ZSByZW5kZXJlcnMKLSAgICBpZiAoZ2dsX2xpa2VseShjLT5hcnJheXMudmVydGV4LmVuYWJsZSkpIHsKLSAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQgICAgPSBwcmltaXRpdmVfcG9pbnQ7Ci0gICAgICAgIGMtPnByaW1zLnJlbmRlckxpbmUgICAgID0gcHJpbWl0aXZlX2xpbmU7Ci0gICAgICAgIGMtPnByaW1zLnJlbmRlclRyaWFuZ2xlID0gcHJpbWl0aXZlX2NsaXBfdHJpYW5nbGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYy0+cHJpbXMucmVuZGVyUG9pbnQgICAgPSBwcmltaXRpdmVfbm9wX3BvaW50OwotICAgICAgICBjLT5wcmltcy5yZW5kZXJMaW5lICAgICA9IHByaW1pdGl2ZV9ub3BfbGluZTsKLSAgICAgICAgYy0+cHJpbXMucmVuZGVyVHJpYW5nbGUgPSBwcmltaXRpdmVfbm9wX3RyaWFuZ2xlOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6OmluaXRUcmlhbmdsZSgKLSAgICAgICAgdmVydGV4X3QgY29uc3QqIHYwLCB2ZXJ0ZXhfdCBjb25zdCogdjEsIHZlcnRleF90IGNvbnN0KiB2MikKLXsKLSAgICBtX2R4MDEgPSB2MS0+d2luZG93LnggLSB2MC0+d2luZG93Lng7Ci0gICAgbV9keTEwID0gdjAtPndpbmRvdy55IC0gdjEtPndpbmRvdy55OwotICAgIG1fZHgyMCA9IHYwLT53aW5kb3cueCAtIHYyLT53aW5kb3cueDsKLSAgICBtX2R5MDIgPSB2Mi0+d2luZG93LnkgLSB2MC0+d2luZG93Lnk7Ci0gICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Ci19Ci0KLXZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExpbmUoCi0gICAgICAgIHZlcnRleF90IGNvbnN0KiB2MCwgdmVydGV4X3QgY29uc3QqIHYxKQotewotICAgIG1fZHgwMSA9IG1fZHkwMiA9IHYxLT53aW5kb3cueCAtIHYwLT53aW5kb3cueDsKLSAgICBtX2R5MTAgPSBtX2R4MjAgPSB2MC0+d2luZG93LnkgLSB2MS0+d2luZG93Lnk7Ci0gICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Ci19Ci0KLXZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExlcnAodmVydGV4X3QgY29uc3QqIHYwLCB1aW50MzJfdCBlbmFibGVzKQotewotICAgIG1feDAgPSB2MC0+d2luZG93Lng7Ci0gICAgbV95MCA9IHYwLT53aW5kb3cueTsKLSAgICBjb25zdCBHR0xjb29yZCBhcmVhID0gKG1fYXJlYSArIFRSSV9IQUxGKSA+PiBUUklfRlJBQ1RJT05fQklUUzsKLSAgICBjb25zdCBHR0xjb29yZCBtaW5BcmVhID0gMjsgLy8gY2Fubm90IGJlIGludmVydGVkCi0gICAgLy8gdHJpYW5nbGVzIHdpdGggYW4gYXJlYSBzbWFsbGVyIHRoYW4gMS4wIGFyZSBub3Qgc21vb3RoLXNoYWRlZAotCi0gICAgaW50IHE9MCwgcz0wLCBkPTA7Ci0gICAgaWYgKGFicyhhcmVhKSA+PSBtaW5BcmVhKSB7Ci0gICAgICAgIC8vIEhlcmUgd2UgZG8gc29tZSB2b29kb28gbWFnaWMsIHRvIGNvbXB1dGUgYSBzdWl0YWJsZSBzY2FsZQotICAgICAgICAvLyBmYWN0b3IgZm9yIGRlbHRhcy9hcmVhOgotCi0gICAgICAgIC8vIEZpcnN0IGNvbXB1dGUgdGhlIDEvYXJlYSB3aXRoIGZ1bGwgMzItYml0cyBwcmVjaXNpb24sCi0gICAgICAgIC8vIGdnbFJlY2lwUU5vcm1hbGl6ZWQgcmV0dXJucyBhIG51bWJlciBbLTAuNSwgMC41WyBhbmQgYW4gZXhwb25lbnQuCi0gICAgICAgIGQgPSBnZ2xSZWNpcFFOb3JtYWxpemVkKGFyZWEsICZxKTsKLQotICAgICAgICAvLyBUaGVuIGNvbXB1dGUgdGhlIG1pbmltdW0gbGVmdC1zaGlmdCB0byBub3Qgb3ZlcmZsb3cgdGhlIG11bHMKLSAgICAgICAgLy8gYmVsb3cuIAotICAgICAgICBzID0gMzIgLSBnZ2xDbHooYWJzKG1fZHkwMil8YWJzKG1fZHkxMCl8YWJzKG1fZHgwMSl8YWJzKG1fZHgyMCkpOwotCi0gICAgICAgIC8vIFdlJ2xsIGtlZXAgMTYtYml0cyBvZiBwcmVjaXNpb24gZm9yIGRlbHRhcy9hcmVhLiBTbyB3ZSBuZWVkCi0gICAgICAgIC8vIHRvIHNoaWZ0IGV2ZXJ5dGhpbmcgbGVmdCBhbiBleHRyYSAxNSBiaXRzLgotICAgICAgICBzICs9IDE1OwotICAgICAgICAKLSAgICAgICAgLy8gbWFrZSBzdXJlIGFsbCBmaW5hbCBzaGlmdHMgYXJlIG5vdCA+IDMyLCBiZWNhdXNlIGdnbE11bHgKLSAgICAgICAgLy8gY2FuJ3QgaGFuZGxlIGl0LgotICAgICAgICBpZiAocyA8IHEpIHMgPSBxOwotICAgICAgICBpZiAocyA+IDMyKSB7Ci0gICAgICAgICAgICBkID4+PSAzMi1zOwotICAgICAgICAgICAgcyA9IDMyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbV9keDAxID0gZ2dsTXVseChtX2R4MDEsIGQsIHMpOwotICAgIG1fZHkxMCA9IGdnbE11bHgobV9keTEwLCBkLCBzKTsKLSAgICBtX2R4MjAgPSBnZ2xNdWx4KG1fZHgyMCwgZCwgcyk7Ci0gICAgbV9keTAyID0gZ2dsTXVseChtX2R5MDIsIGQsIHMpOwotICAgIG1fYXJlYV9zY2FsZSA9IDMyICsgcSAtIHM7Ci0gICAgbV9zY2FsZSA9IDA7Ci0KLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfVE1VUykgewotICAgICAgICBjb25zdCBpbnQgQSA9IGdnbENseihhYnMobV9keTAyKXxhYnMobV9keTEwKXxhYnMobV9keDAxKXxhYnMobV9keDIwKSk7Ci0gICAgICAgIGNvbnN0IGludCBCID0gZ2dsQ2x6KGFicyhtX3gwKXxhYnMobV95MCkpOwotICAgICAgICBtX3NjYWxlID0gbWF4KDAsIDMyIC0gKEEgKyAxNikpICsKLSAgICAgICAgICAgICAgICAgIG1heCgwLCAzMiAtIChCICsgVFJJX0ZSQUNUSU9OX0JJVFMpKSArIDE7Ci0gICAgfQotfQotCi1pbnQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzU2NhbGUoR0dMZml4ZWQqIGl0LAotICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAotewotICAgIGludDMyX3QgZGMwMSA9IGMxIC0gYzA7Ci0gICAgaW50MzJfdCBkYzAyID0gYzIgLSBjMDsKLSAgICBjb25zdCBpbnQgQSA9IGdnbENseihhYnMoYzApKTsKLSAgICBjb25zdCBpbnQgQiA9IGdnbENseihhYnMoZGMwMSl8YWJzKGRjMDIpKTsKLSAgICBjb25zdCBpbnQgc2NhbGUgPSBtaW4oQSwgQiAtIG1fc2NhbGUpIC0gMjsKLSAgICBpZiAoc2NhbGUgPj0gMCkgewotICAgICAgICBjMCAgIDw8PSBzY2FsZTsKLSAgICAgICAgZGMwMSA8PD0gc2NhbGU7Ci0gICAgICAgIGRjMDIgPDw9IHNjYWxlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGMwICAgPj49IC1zY2FsZTsKLSAgICAgICAgZGMwMSA+Pj0gLXNjYWxlOwotICAgICAgICBkYzAyID4+PSAtc2NhbGU7Ci0gICAgfQotICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlOwotICAgIGludDMyX3QgZGNkeCA9IGdnbE11bEFkZHgoZGMwMSwgbV9keTAyLCBnZ2xNdWx4KGRjMDIsIG1fZHkxMCwgcyksIHMpOwotICAgIGludDMyX3QgZGNkeSA9IGdnbE11bEFkZHgoZGMwMiwgbV9keDAxLCBnZ2xNdWx4KGRjMDEsIG1fZHgyMCwgcyksIHMpOwotICAgIGludDMyX3QgYyA9IGMwIC0gKGdnbE11bEFkZHgoZGNkeCwgbV94MCwgCi0gICAgICAgICAgICBnZ2xNdWx4KGRjZHksIG1feTAsIFRSSV9GUkFDVElPTl9CSVRTKSwgVFJJX0ZSQUNUSU9OX0JJVFMpKTsKLSAgICBpdFswXSA9IGM7Ci0gICAgaXRbMV0gPSBkY2R4OwotICAgIGl0WzJdID0gZGNkeTsKLSAgICByZXR1cm4gc2NhbGU7Ci19Ci0KLXZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMTYxNihHR0xmaXhlZCogaXQsCi0gICAgICAgIEdHTGZpeGVkIGMwLCBHR0xmaXhlZCBjMSwgR0dMZml4ZWQgYzIpIGNvbnN0Ci17Ci0gICAgY29uc3QgR0dMZml4ZWQgZGMwMSA9IGMxIC0gYzA7Ci0gICAgY29uc3QgR0dMZml4ZWQgZGMwMiA9IGMyIC0gYzA7Ci0gICAgLy8gMTYuMTYgeCAxNi4xNiA9PSAzMi4zMiAtLT4gMTYuMTYKLSAgICBjb25zdCBpbnQgcyA9IG1fYXJlYV9zY2FsZTsKLSAgICBpbnQzMl90IGRjZHggPSBnZ2xNdWxBZGR4KGRjMDEsIG1fZHkwMiwgZ2dsTXVseChkYzAyLCBtX2R5MTAsIHMpLCBzKTsKLSAgICBpbnQzMl90IGRjZHkgPSBnZ2xNdWxBZGR4KGRjMDIsIG1fZHgwMSwgZ2dsTXVseChkYzAxLCBtX2R4MjAsIHMpLCBzKTsKLSAgICBpbnQzMl90IGMgPSBjMCAtIChnZ2xNdWxBZGR4KGRjZHgsIG1feDAsCi0gICAgICAgICAgICBnZ2xNdWx4KGRjZHksIG1feTAsIFRSSV9GUkFDVElPTl9CSVRTKSwgVFJJX0ZSQUNUSU9OX0JJVFMpKTsKLSAgICBpdFswXSA9IGM7Ci0gICAgaXRbMV0gPSBkY2R4OwotICAgIGl0WzJdID0gZGNkeTsKLX0KLQotdm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDY0X3QqIGl0LAotICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAotewotICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlIC0gMTY7Ci0gICAgaW50MzJfdCBkYzAxID0gKGMxIC0gYzApPj5zOwotICAgIGludDMyX3QgZGMwMiA9IChjMiAtIGMwKT4+czsKLSAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyCi0gICAgaW50NjRfdCBkY2R4ID0gZ2dsTXVsaWkoZGMwMSwgbV9keTAyKSArIGdnbE11bGlpKGRjMDIsIG1fZHkxMCk7Ci0gICAgaW50NjRfdCBkY2R5ID0gZ2dsTXVsaWkoZGMwMiwgbV9keDAxKSArIGdnbE11bGlpKGRjMDEsIG1fZHgyMCk7Ci0gICAgaXRbIDBdID0gKGMwPDwxNikgLSAoKGRjZHgqbV94MCArIGRjZHkqbV95MCk+PjQpOwotICAgIGl0WyAxXSA9IGRjZHg7Ci0gICAgaXRbIDJdID0gZGNkeTsKLX0KLQotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotaW5saW5lIHZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKLSAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKLXsKLSAgICA6Oml0ZXJhdG9yczAwMzIodGhpcywgaXQsIGMwLCBjMSwgYzIpOwotfQotI2Vsc2UKLXZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKLSAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKLXsKLSAgICBpbnQ2NF90IGl0NjRbM107Ci0gICAgaXRlcmF0b3JzMDAzMihpdDY0LCBjMCwgYzEsIGMyKTsKLSAgICBpdFswXSA9IGl0NjRbMF07Ci0gICAgaXRbMV0gPSBpdDY0WzFdOwotICAgIGl0WzJdID0gaXQ2NFsyXTsKLX0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBpbmxpbmUgaW50MzJfdCBjbGFtcFooR0xmaXhlZCB6KSBDT05TVDsKLWludDMyX3QgY2xhbXBaKEdMZml4ZWQgeikgewotICAgIHogPSAoeiAmIH4oej4+MzEpKTsKLSAgICBpZiAoeiA+PSAweDEwMDAwKQotICAgICAgICB6ID0gMHhGRkZGOwotICAgIHJldHVybiB6OwotfQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCBmZXRjaF90ZXhjb29yZF9pbXBsKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICB2ZXJ0ZXhfdCogY29uc3QgdnR4WzNdID0geyB2MCwgdjEsIHYyIH07Ci0gICAgYXJyYXlfdCBjb25zdCAqIGNvbnN0IHRleGNvb3JkQXJyYXkgPSBjLT5hcnJheXMudGV4dHVyZTsKLSAgICAKLSAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgaWYgKCEoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoaW50IGo9MCA7IGo8MyA7IGorKykgewotICAgICAgICAgICAgdmVydGV4X3QqIGNvbnN0IHYgPSB2dHhbal07Ci0gICAgICAgICAgICBpZiAodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6VFQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIC8vIE5PVEU6IGhlcmUgd2UgY291bGQgY29tcHV0ZSBhdXRvbWF0aWMgdGV4Z2VuCi0gICAgICAgICAgICAvLyBzdWNoIGFzIHNwaGVyZS9jdWJlIG1hcHMsIGluc3RlYWQgb2YgZmV0Y2hpbmcgdGhlbQotICAgICAgICAgICAgLy8gZnJvbSB0aGUgdGV4dGNvb3JkIGFycmF5LgotCi0gICAgICAgICAgICB2ZWM0X3QmIGNvb3JkcyA9IHYtPnRleHR1cmVbaV07Ci0gICAgICAgICAgICBjb25zdCBHTHVieXRlKiB0cCA9IHRleGNvb3JkQXJyYXlbaV0uZWxlbWVudCgKLSAgICAgICAgICAgICAgICAgICAgdi0+aW5kZXggJiB2ZXJ0ZXhfY2FjaGVfdDo6SU5ERVhfTUFTSyk7Ci0gICAgICAgICAgICB0ZXhjb29yZEFycmF5W2ldLmZldGNoKGMsIGNvb3Jkcy52LCB0cCk7Ci0KLSAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0ZXh0dXJlIGNvb3JkaW5hdGVzLi4uCi0gICAgICAgICAgICBjb29yZHMuUSA9IDB4MTAwMDA7Ci0gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1fdCYgdHIgPSBjLT50cmFuc2Zvcm1zLnRleHR1cmVbaV0udHJhbnNmb3JtOyAKLSAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkodHIub3BzKSkgewotICAgICAgICAgICAgICAgIGMtPmFycmF5cy50ZXhfdHJhbnNmb3JtW2ldKCZ0ciwgJmNvb3JkcywgJmNvb3Jkcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRpdmlkZSBieSBRCi0gICAgICAgICAgICBjb25zdCBHR0xmaXhlZCBxID0gY29vcmRzLlE7Ci0gICAgICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KHEgIT0gMHgxMDAwMCkpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHFpbnYgPSBnZ2xSZWNpcDI4KHEpOwotICAgICAgICAgICAgICAgIGNvb3Jkcy5TID0gZ2dsTXVseChjb29yZHMuUywgcWludiwgMjgpOwotICAgICAgICAgICAgICAgIGNvb3Jkcy5UID0gZ2dsTXVseChjb29yZHMuVCwgcWludiwgMjgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHYwLT5mbGFncyB8PSB2ZXJ0ZXhfdDo6VFQ7Ci0gICAgdjEtPmZsYWdzIHw9IHZlcnRleF90OjpUVDsKLSAgICB2Mi0+ZmxhZ3MgfD0gdmVydGV4X3Q6OlRUOwotfQotCi1pbmxpbmUgdm9pZCBmZXRjaF90ZXhjb29yZChvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICBpZiAoIShlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gRmV0Y2ggJiB0cmFuc2Zvcm0gdGV4dHVyZSBjb29yZGluYXRlcy4uLgotICAgIGlmIChnZ2xfbGlrZWx5KHYwLT5mbGFncyAmIHYxLT5mbGFncyAmIHYyLT5mbGFncyAmIHZlcnRleF90OjpUVCkpIHsKLSAgICAgICAgLy8gYWxyZWFkeSBkb25lIGZvciBhbGwgdGhyZWUgdmVydGljZXMsIGJhaWwuLi4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmZXRjaF90ZXhjb29yZF9pbXBsKGMsIHYwLCB2MSwgdjIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBQb2ludAotI2VuZGlmCi0KLXZvaWQgcHJpbWl0aXZlX25vcF9wb2ludChvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopIHsKLX0KLQotdm9pZCBwcmltaXRpdmVfcG9pbnQob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdikKLXsKLSAgICAvLyBsaWdodGluZyAmIGNsYW1waW5nLi4uCi0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLQotICAgIGlmIChnZ2xfdW5saWtlbHkoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSkgewotICAgICAgICBpZiAoYy0+bGlnaHRpbmcuZW5hYmxlKSB7Ci0gICAgICAgICAgICBjLT5saWdodGluZy5saWdodFZlcnRleChjLCB2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgICAgICBjb25zdCBHTHZvaWQqIGNwID0gYy0+YXJyYXlzLmNvbG9yLmVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgIHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOwotICAgICAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYtPmNvbG9yLnYsIGNwKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSB7Ci0gICAgICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFhYWDogd2UgZG9uJ3QgbmVlZCB0byBkbyB0aGF0IGVhY2gtdGltZQotICAgIC8vIGlmIGNvbG9yIGFycmF5IGFuZCBsaWdodGluZyBub3QgZW5hYmxlZCAKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNvbG9yNHh2KGMsIHYtPmNvbG9yLnYpOwotCi0gICAgLy8gWFhYOiBsb29rIGludG8gRVMgcG9pbnQtc3ByaXRlIGV4dGVuc2lvbgotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKSB7Ci0gICAgICAgIGZldGNoX3RleGNvb3JkKGMsIHYsdix2KTsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxHR0xfVEVYVFVSRV9VTklUX0NPVU5UIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpIAotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaW50MzJfdCBpdHRbOF07Ci0gICAgICAgICAgICBpdHRbMV0gPSBpdHRbMl0gPSBpdHRbNF0gPSBpdHRbNV0gPSAwOwotICAgICAgICAgICAgaXR0WzZdID0gaXR0WzddID0gMTY7IC8vIFhYWDogY2hlY2sgdGhhdAotICAgICAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5zX3dyYXAgPT0gR0dMX0NMQU1QKSB7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPnN1cmZhY2Uud2lkdGg7Ci0gICAgICAgICAgICAgICAgaXR0WzBdID0gdi0+dGV4dHVyZVtpXS5TICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgaXR0WzZdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV0udF93cmFwID09IEdHTF9DTEFNUCkgewotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+c3VyZmFjZS5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaXR0WzNdID0gdi0+dGV4dHVyZVtpXS5UICogaGVpZ2h0OwotICAgICAgICAgICAgICAgIGl0dFs3XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleENvb3JkR3JhZFNjYWxlOHh2KGMsIGksIGl0dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0RFUFRIX1RFU1QpIHsKLSAgICAgICAgaW50MzJfdCBpdHpbM107Ci0gICAgICAgIGl0elswXSA9IGNsYW1wWih2LT53aW5kb3cueikgKiAweDAwMDEwMDAxOwotICAgICAgICBpdHpbMV0gPSBpdHpbMl0gPSAwOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnpHcmFkM3h2KGMsIGl0eik7Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykgewotICAgICAgICBHTGZpeGVkIGl0ZlszXTsKLSAgICAgICAgaXRmWzBdID0gdi0+Zm9nOwotICAgICAgICBpdGZbMV0gPSBpdGZbMl0gPSAwOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmZvZ0dyYWQzeHYoYywgaXRmKTsKLSAgICB9Ci0KLSAgICAvLyBSZW5kZXIgb3VyIHBvaW50Li4uCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5wb2ludHgoYywgdi0+d2luZG93LnYsIGMtPnBvaW50LnNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBMaW5lCi0jZW5kaWYKLQotdm9pZCBwcmltaXRpdmVfbm9wX2xpbmUob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqLCB2ZXJ0ZXhfdCopIHsKLX0KLQotdm9pZCBwcmltaXRpdmVfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxKQotewotICAgIC8vIGdldCB0ZXh0dXJlIGNvb3JkaW5hdGVzCi0gICAgZmV0Y2hfdGV4Y29vcmQoYywgdjAsIHYxLCB2MSk7Ci0KLSAgICAvLyBsaWdodC9zaGFkZSB0aGUgdmVydGljZXMgZmlyc3QgKHRoZXkncmUgY29waWVkIGJlbG93KQotICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VHJpYW5nbGUoYywgdjAsIHYxLCB2MSk7Ci0KLSAgICAvLyBjbGlwIHRoZSBsaW5lIGlmIG5lZWRlZAotICAgIGlmIChnZ2xfdW5saWtlbHkoKHYwLT5mbGFncyB8IHYxLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEwpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IGNsaXBfbGluZShjLCB2MCwgdjEpOwotICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KGNvdW50ID09IDApKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGNvbXB1dGUgaXRlcmF0b3JzLi4uCi0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gICBHR0xfRU5BQkxFX1RNVVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfU01PT1RIIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX1cgfCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX0ZPRyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9ERVBUSF9URVNUOwotCi0gICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgbWFzaykpIHsKLSAgICAgICAgYy0+bGVycC5pbml0TGluZSh2MCwgdjEpOwotICAgICAgICBsZXJwX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjApOwotICAgIH0KLQotICAgIC8vIHJlbmRlciBvdXIgbGluZQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MubGluZXgoYywgdjAtPndpbmRvdy52LCB2MS0+d2luZG93LnYsIGMtPmxpbmUud2lkdGgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBUcmlhbmdsZQotI2VuZGlmCi0KLXZvaWQgcHJpbWl0aXZlX25vcF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpIHsKLX0KLQotdm9pZCBwcmltaXRpdmVfY2xpcF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgdWludDMyX3QgY2MgPSAodjAtPmZsYWdzIHwgdjEtPmZsYWdzIHwgdjItPmZsYWdzKSAmIHZlcnRleF90OjpDTElQX0FMTDsKLSAgICBpZiAoZ2dsX2xpa2VseSghY2MpKSB7Ci0gICAgICAgIC8vIGNvZGUgYmVsb3cgbXVzdCBiZSBhcyBvcHRpbWl6ZWQgYXMgcG9zc2libGUsIHRoaXMgaXMgdGhlCi0gICAgICAgIC8vIGNvbW1vbiBjb2RlIHBhdGguCi0KLSAgICAgICAgLy8gVGhpcyB0cmlhbmdsZSBpcyBub3QgY2xpcHBlZCwgdGVzdCBpZiBpdCdzIGN1bGxlZAotICAgICAgICAvLyB1bmNsaXBwZWQgdHJpYW5nbGUuLi4KLSAgICAgICAgYy0+bGVycC5pbml0VHJpYW5nbGUodjAsIHYxLCB2Mik7Ci0gICAgICAgIGlmIChjdWxsX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpKQotICAgICAgICAgICAgcmV0dXJuOyAvLyBjdWxsZWQhCi0KLSAgICAgICAgLy8gRmV0Y2ggYWxsIHRleHR1cmUgY29vcmRpbmF0ZXMgaWYgbmVlZGVkCi0gICAgICAgIGZldGNoX3RleGNvb3JkKGMsIHYwLCB2MSwgdjIpOwotCi0gICAgICAgIC8vIGxpZ2h0IChvciBzaGFkZSkgb3VyIHRyaWFuZ2xlIQotICAgICAgICBjLT5saWdodGluZy5saWdodFRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotCi0gICAgICAgIHRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHdlJ3JlIG5vdCBnb2luZyB0byBjbGlwIHZlcnkgb2Z0ZW4sCi0gICAgLy8gYW5kIGV2ZW4gbW9yZSByYXJlbHkgd2lsbCB3ZSBjbGlwIGEgdHJpYW5nbGUgdGhhdCBlbmRzIHVwCi0gICAgLy8gYmVpbmcgY3VsbGVkIG91dC4gU28gaXQncyBva2F5IHRvIGxpZ2h0IHRoZSB2ZXJ0aWNlcyBoZXJlLCBldmVuIHRob3VnaAotICAgIC8vIGluIGEgZmV3IGNhc2VzIHdlIHdvbid0IHJlbmRlciB0aGUgdHJpYW5nbGUgKGlmIGN1bGxlZCkuCi0KLSAgICAvLyBGZXRjaCB0ZXh0dXJlIGNvb3JkaW5hdGVzLi4uCi0gICAgZmV0Y2hfdGV4Y29vcmQoYywgdjAsIHYxLCB2Mik7Ci0KLSAgICAvLyBsaWdodCAob3Igc2hhZGUpIG91ciB0cmlhbmdsZSEKLSAgICBjLT5saWdodGluZy5saWdodFRyaWFuZ2xlKGMsIHYwLCB2MSwgdjIpOwotCi0gICAgY2xpcF90cmlhbmdsZShjLCB2MCwgdjEsIHYyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCB0cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgLy8gY29tcHV0ZSBpdGVyYXRvcnMuLi4KLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSAgIEdHTF9FTkFCTEVfVE1VUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR0dMX0VOQUJMRV9TTU9PVEggfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfVyB8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9FTkFCTEVfRk9HIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX0RFUFRIX1RFU1Q7Ci0KLSAgICBpZiAoZ2dsX2xpa2VseShlbmFibGVzICYgbWFzaykpCi0gICAgICAgIGxlcnBfdHJpYW5nbGUoYywgdjAsIHYxLCB2Mik7Ci0KLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRyaWFuZ2xleChjLCB2MC0+d2luZG93LnYsIHYxLT53aW5kb3cudiwgdjItPndpbmRvdy52KTsKLX0KLQotdm9pZCBsZXJwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBjb25zdCB1aW50MzJfdCBlbmFibGVzID0gYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzOwotICAgIGMtPmxlcnAuaW5pdExlcnAodjAsIGVuYWJsZXMpOwotCi0gICAgLy8gc2V0IHVwIHRleHR1cmUgaXRlcmF0b3JzCi0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1RNVVMpIHsKLSAgICAgICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1cpIHsKLSAgICAgICAgICAgIGxlcnBfdGV4Y29vcmRzX3coYywgdjAsIHYxLCB2Mik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXJwX3RleGNvb3JkcyhjLCB2MCwgdjEsIHYyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHNldCB1cCB0aGUgY29sb3IgaXRlcmF0b3JzCi0gICAgY29uc3QgY29tcHV0ZV9pdGVyYXRvcnNfdCYgbGVycCA9IGMtPmxlcnA7Ci0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX1NNT09USCkgewotICAgICAgICBHTGZpeGVkIGl0Y1sxMl07Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICAgICAgY29uc3QgR0dMY29sb3IgYzAgPSB2MC0+Y29sb3IudltpXSAqIDI1NTsKLSAgICAgICAgICAgIGNvbnN0IEdHTGNvbG9yIGMxID0gdjEtPmNvbG9yLnZbaV0gKiAyNTU7Ci0gICAgICAgICAgICBjb25zdCBHR0xjb2xvciBjMiA9IHYyLT5jb2xvci52W2ldICogMjU1OwotICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMxNjE2KCZpdGNbaSozXSwgYzAsIGMxLCBjMik7Ci0gICAgICAgIH0KLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvckdyYWQxMnh2KGMsIGl0Yyk7Ci0gICAgfQotCi0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0RFUFRIX1RFU1QpIHsKLSAgICAgICAgaW50MzJfdCBpdHpbM107Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdjB6ID0gY2xhbXBaKHYwLT53aW5kb3cueik7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdjF6ID0gY2xhbXBaKHYxLT53aW5kb3cueik7Ci0gICAgICAgIGNvbnN0IGludDMyX3QgdjJ6ID0gY2xhbXBaKHYyLT53aW5kb3cueik7Ci0gICAgICAgIGlmIChnZ2xfdW5saWtlbHkoYy0+cG9seWdvbk9mZnNldC5lbmFibGUpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHVuaXRzID0gKGMtPnBvbHlnb25PZmZzZXQudW5pdHMgPDwgMTYpOwotICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBmYWN0b3IgPSBjLT5wb2x5Z29uT2Zmc2V0LmZhY3RvcjsKLSAgICAgICAgICAgIGlmIChmYWN0b3IpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGl0ejY0WzNdOwotICAgICAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHo2NCwgdjB6LCB2MXosIHYyeik7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBtYXhEZXB0aFNsb3BlID0gbWF4KGl0ejY0WzFdLCBpdHo2NFsyXSk7Ci0gICAgICAgICAgICAgICAgaXR6WzBdID0gdWludDMyX3QoaXR6NjRbMF0pIAotICAgICAgICAgICAgICAgICAgICAgICAgKyB1aW50MzJfdCgobWF4RGVwdGhTbG9wZSpmYWN0b3IpPj4xNikgKyB1bml0czsKLSAgICAgICAgICAgICAgICBpdHpbMV0gPSB1aW50MzJfdChpdHo2NFsxXSk7Ci0gICAgICAgICAgICAgICAgaXR6WzJdID0gdWludDMyX3QoaXR6NjRbMl0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6LCB2MHosIHYxeiwgdjJ6KTsKLSAgICAgICAgICAgICAgICBpdHpbMF0gKz0gdW5pdHM7IAotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7Ci0gICAgICAgIH0KLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdHopOwotICAgIH0gICAgCi0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiBHR0xfRU5BQkxFX0ZPRykpIHsKLSAgICAgICAgR0xmaXhlZCBpdGZbM107Ci0gICAgICAgIGxlcnAuaXRlcmF0b3JzMTYxNihpdGYsIHYwLT5mb2csIHYxLT5mb2csIHYyLT5mb2cpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmZvZ0dyYWQzeHYoYywgaXRmKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGlubGluZQotaW50IGNvbXB1dGVfbG9kKG9nbGVzX2NvbnRleHRfdCogYywgaW50IGksCi0gICAgICAgIGludDMyX3QgczAsIGludDMyX3QgdDAsIGludDMyX3QgczEsIGludDMyX3QgdDEsIGludDMyX3QgczIsIGludDMyX3QgdDIpCi17Ci0gICAgLy8gQ29tcHV0ZSBtaXBtYXAgbGV2ZWwgLyBwcmltaXRpdmUKLSAgICAvLyByaG8gPSBzcXJ0KCB0ZXhlbEFyZWEgLyBhcmVhICkKLSAgICAvLyBsb2QgPSBsb2cyKCByaG8gKQotICAgIC8vIGxvZCA9IGxvZzIoIHRleGVsQXJlYSAvIGFyZWEgKSAvIDIKLSAgICAvLyBsb2QgPSAobG9nMiggdGV4ZWxBcmVhICkgLSBsb2cyKCBhcmVhICkpIC8gMgotICAgIGNvbnN0IGNvbXB1dGVfaXRlcmF0b3JzX3QmIGxlcnAgPSBjLT5sZXJwOwotICAgIGNvbnN0IEdHTGNvb3JkIGFyZWEgPSBhYnMobGVycC5hcmVhKCkpOwotICAgIGNvbnN0IGludCB3ID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPnN1cmZhY2Uud2lkdGg7Ci0gICAgY29uc3QgaW50IGggPSBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+c3VyZmFjZS5oZWlnaHQ7Ci0gICAgY29uc3QgaW50IHNoaWZ0ID0gMTYgKyAoMTYgLSBUUklfRlJBQ1RJT05fQklUUyk7Ci0gICAgaW50MzJfdCB0ZXhlbEFyZWEgPSBhYnMoIGdnbE11bHgoczEtczAsIHQyLXQwLCBzaGlmdCkgLQotICAgICAgICAgICAgZ2dsTXVseChzMi1zMCwgdDEtdDAsIHNoaWZ0KSApKncqaDsKLSAgICBpbnQgbG9nMlRBcmVhID0gKDMyLVRSSV9GUkFDVElPTl9CSVRTICAtMSkgLSBnZ2xDbHoodGV4ZWxBcmVhKTsKLSAgICBpbnQgbG9nMkFyZWEgID0gKDMyLVRSSV9GUkFDVElPTl9CSVRTKjItMSkgLSBnZ2xDbHooYXJlYSk7Ci0gICAgaW50IGxvZCA9IChsb2cyVEFyZWEgLSBsb2cyQXJlYSArIDEpID4+IDE7Ci0gICAgcmV0dXJuIGxvZDsKLX0KLQotdm9pZCBsZXJwX3RleGNvb3JkcyhvZ2xlc19jb250ZXh0X3QqIGMsCi0gICAgICAgIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgY29uc3QgY29tcHV0ZV9pdGVyYXRvcnNfdCYgbGVycCA9IGMtPmxlcnA7Ci0gICAgaW50MzJfdCBpdHRbOF0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxNikpKTsKLSAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgY29uc3QgdGV4dHVyZV90JiB0bXUgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLnRleHR1cmVbaV07Ci0gICAgICAgIGlmICghdG11LmVuYWJsZSkgCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBjb21wdXRlIHRoZSBqYWNvYmlhbnMgdXNpbmcgYmxvY2sgZmxvYXRpbmctcG9pbnQKLSAgICAgICAgaW50MzJfdCBzMCA9IHYwLT50ZXh0dXJlW2ldLlM7Ci0gICAgICAgIGludDMyX3QgdDAgPSB2MC0+dGV4dHVyZVtpXS5UOwotICAgICAgICBpbnQzMl90IHMxID0gdjEtPnRleHR1cmVbaV0uUzsKLSAgICAgICAgaW50MzJfdCB0MSA9IHYxLT50ZXh0dXJlW2ldLlQ7Ci0gICAgICAgIGludDMyX3QgczIgPSB2Mi0+dGV4dHVyZVtpXS5TOwotICAgICAgICBpbnQzMl90IHQyID0gdjItPnRleHR1cmVbaV0uVDsKLQotICAgICAgICBjb25zdCBHTGVudW0gbWluX2ZpbHRlciA9IGMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5taW5fZmlsdGVyOwotICAgICAgICBpZiAoZ2dsX3VubGlrZWx5KG1pbl9maWx0ZXIgPj0gR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCkpIHsKLSAgICAgICAgICAgIGludCBsb2QgPSBjb21wdXRlX2xvZChjLCBpLCBzMCwgdDAsIHMxLCB0MSwgczIsIHQyKTsKLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmVMb2QoYywgaSwKLSAgICAgICAgICAgICAgICAgICAgJmMtPnRleHR1cmVzLnRtdVtpXS50ZXh0dXJlLT5taXAobG9kKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcmVtdWx0aXBseSAocyx0KSB3aGVuIGNsYW1wbGluZwotICAgICAgICBpZiAodG11LnNfd3JhcCA9PSBHR0xfQ0xBTVApIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB3aWR0aCA9IHRtdS5zdXJmYWNlLndpZHRoOwotICAgICAgICAgICAgczAgKj0gd2lkdGg7Ci0gICAgICAgICAgICBzMSAqPSB3aWR0aDsKLSAgICAgICAgICAgIHMyICo9IHdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0bXUudF93cmFwID09IEdHTF9DTEFNUCkgewotICAgICAgICAgICAgY29uc3QgaW50IGhlaWdodCA9IHRtdS5zdXJmYWNlLmhlaWdodDsKLSAgICAgICAgICAgIHQwICo9IGhlaWdodDsKLSAgICAgICAgICAgIHQxICo9IGhlaWdodDsKLSAgICAgICAgICAgIHQyICo9IGhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBpdHRbNl0gPSAtbGVycC5pdGVyYXRvcnNTY2FsZShpdHQrMCwgczAsIHMxLCBzMik7Ci0gICAgICAgIGl0dFs3XSA9IC1sZXJwLml0ZXJhdG9yc1NjYWxlKGl0dCszLCB0MCwgdDEsIHQyKTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCBpdHQpOwotICAgIH0KLX0KLQotdm9pZCBsZXJwX3RleGNvb3Jkc193KG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICBjb25zdCBjb21wdXRlX2l0ZXJhdG9yc190JiBsZXJwID0gYy0+bGVycDsKLSAgICBpbnQzMl90IGl0dFs4XSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDE2KSkpOwotICAgIGludDMyX3QgaXR3WzNdOwotCi0gICAgLy8gY29tcHV0ZSBXJ3Mgc2NhbGUgdG8gMi4zMAotICAgIGludDMyX3QgdzAgPSB2MC0+d2luZG93Lnc7Ci0gICAgaW50MzJfdCB3MSA9IHYxLT53aW5kb3cudzsKLSAgICBpbnQzMl90IHcyID0gdjItPndpbmRvdy53OwotICAgIGludCB3c2NhbGUgPSAzMiAtIGdnbENseih3MHx3MXx3Mik7Ci0KLSAgICAvLyBjb21wdXRlIHRoZSBqYWNvYmlhbiB1c2luZyBibG9jayBmbG9hdGluZy1wb2ludCAgICAKLSAgICBpbnQgc2MgPSBsZXJwLml0ZXJhdG9yc1NjYWxlKGl0dywgdzAsIHcxLCB3Mik7Ci0gICAgc2MgKz0gIHdzY2FsZSAtIDE2OwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3Mud0dyYWQzeHYoYywgaXR3KTsKLQotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBjb25zdCB0ZXh0dXJlX3QmIHRtdSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXTsKLSAgICAgICAgaWYgKCF0bXUuZW5hYmxlKSAKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIGNvbXB1dGUgdGhlIGphY29iaWFucyB1c2luZyBibG9jayBmbG9hdGluZy1wb2ludAotICAgICAgICBpbnQzMl90IHMwID0gdjAtPnRleHR1cmVbaV0uUzsKLSAgICAgICAgaW50MzJfdCB0MCA9IHYwLT50ZXh0dXJlW2ldLlQ7Ci0gICAgICAgIGludDMyX3QgczEgPSB2MS0+dGV4dHVyZVtpXS5TOwotICAgICAgICBpbnQzMl90IHQxID0gdjEtPnRleHR1cmVbaV0uVDsKLSAgICAgICAgaW50MzJfdCBzMiA9IHYyLT50ZXh0dXJlW2ldLlM7Ci0gICAgICAgIGludDMyX3QgdDIgPSB2Mi0+dGV4dHVyZVtpXS5UOwotCi0gICAgICAgIGNvbnN0IEdMZW51bSBtaW5fZmlsdGVyID0gYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPm1pbl9maWx0ZXI7Ci0gICAgICAgIGlmIChnZ2xfdW5saWtlbHkobWluX2ZpbHRlciA+PSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUKSkgewotICAgICAgICAgICAgaW50IGxvZCA9IGNvbXB1dGVfbG9kKGMsIGksIHMwLCB0MCwgczEsIHQxLCBzMiwgdDIpOwotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5iaW5kVGV4dHVyZUxvZChjLCBpLAotICAgICAgICAgICAgICAgICAgICAmYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUtPm1pcChsb2QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHByZW11bHRpcGx5IChzLHQpIHdoZW4gY2xhbXBsaW5nCi0gICAgICAgIGlmICh0bXUuc193cmFwID09IEdHTF9DTEFNUCkgewotICAgICAgICAgICAgY29uc3QgaW50IHdpZHRoID0gdG11LnN1cmZhY2Uud2lkdGg7Ci0gICAgICAgICAgICBzMCAqPSB3aWR0aDsKLSAgICAgICAgICAgIHMxICo9IHdpZHRoOwotICAgICAgICAgICAgczIgKj0gd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRtdS50X3dyYXAgPT0gR0dMX0NMQU1QKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gdG11LnN1cmZhY2UuaGVpZ2h0OwotICAgICAgICAgICAgdDAgKj0gaGVpZ2h0OwotICAgICAgICAgICAgdDEgKj0gaGVpZ2h0OwotICAgICAgICAgICAgdDIgKj0gaGVpZ2h0OwotICAgICAgICB9Ci0KLSAgICAgICAgczAgPSBnZ2xNdWx4KHMwLCB3MCwgd3NjYWxlKTsKLSAgICAgICAgdDAgPSBnZ2xNdWx4KHQwLCB3MCwgd3NjYWxlKTsKLSAgICAgICAgczEgPSBnZ2xNdWx4KHMxLCB3MSwgd3NjYWxlKTsKLSAgICAgICAgdDEgPSBnZ2xNdWx4KHQxLCB3MSwgd3NjYWxlKTsKLSAgICAgICAgczIgPSBnZ2xNdWx4KHMyLCB3Miwgd3NjYWxlKTsKLSAgICAgICAgdDIgPSBnZ2xNdWx4KHQyLCB3Miwgd3NjYWxlKTsKLQotICAgICAgICBpdHRbNl0gPSBzYyAtIGxlcnAuaXRlcmF0b3JzU2NhbGUoaXR0KzAsIHMwLCBzMSwgczIpOwotICAgICAgICBpdHRbN10gPSBzYyAtIGxlcnAuaXRlcmF0b3JzU2NhbGUoaXR0KzMsIHQwLCB0MSwgdDIpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleENvb3JkR3JhZFNjYWxlOHh2KGMsIGksIGl0dCk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbmxpbmUKLWJvb2wgY3VsbF90cmlhbmdsZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2MCwgdmVydGV4X3QqIHYxLCB2ZXJ0ZXhfdCogdjIpCi17Ci0gICAgaWYgKGdnbF9saWtlbHkoYy0+Y3VsbC5lbmFibGUpKSB7Ci0gICAgICAgIGNvbnN0IEdMZW51bSB3aW5kaW5nID0gKGMtPmxlcnAuYXJlYSgpID4gMCkgPyBHTF9DVyA6IEdMX0NDVzsKLSAgICAgICAgY29uc3QgR0xlbnVtIGZhY2UgPSAod2luZGluZyA9PSBjLT5jdWxsLmZyb250RmFjZSkgPyBHTF9GUk9OVCA6IEdMX0JBQ0s7Ci0gICAgICAgIGlmIChmYWNlID09IGMtPmN1bGwuY3VsbEZhY2UpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gY3VsbGVkIQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLUdMZml4ZWQgZnJ1c3R1bVBsYW5lRGlzdChpbnQgcGxhbmUsIGNvbnN0IHZlYzRfdCYgcykKLXsKLSAgICBjb25zdCBHTGZpeGVkIGQgPSBzLnZbIHBsYW5lID4+IDEgXTsKLSAgICByZXR1cm4gICgocGxhbmUgJiAxKSA/IChzLncgLSBkKSA6IChzLncgKyBkKSk7IAotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQzMl90IGNsaXBEaXZpZGUoR0xmaXhlZCBhLCBHTGZpeGVkIGIpIHsKLSAgICAvLyByZXR1cm5zIGEgNC4yOCBmaXhlZC1wb2ludAotICAgIHJldHVybiBnZ2xNdWxEaXZpKDFMVTw8MjgsIGEsIGIpOwotfSAKLQotdm9pZCBjbGlwX3RyaWFuZ2xlKG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEsIHZlcnRleF90KiB2MikKLXsKLSAgICB1aW50MzJfdCBhbGxfY2MgPSAodjAtPmZsYWdzIHwgdjEtPmZsYWdzIHwgdjItPmZsYWdzKSAmIHZlcnRleF90OjpDTElQX0FMTDsKLQotICAgIHZlcnRleF90ICpwMCwgKnAxLCAqcDI7Ci0gICAgY29uc3QgaW50IE1BWF9DTElQUElOR19QTEFORVMgPSA2ICsgT0dMRVNfTUFYX0NMSVBfUExBTkVTOwotICAgIGNvbnN0IGludCBNQVhfVkVSVElDRVMgPSAzOwotCi0gICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB0byBob2xkIHRoZSBuZXcgdmVydGljZXMuIEVhY2ggcGxhbmUgY2FuIGFkZCB1cCB0byAKLSAgICAvLyB0d28gbmV3IHZlcnRpY2VzIChiZWNhdXNlIHRoZSBwb2x5Z29uIGlzIGNvbnZleCkuCi0gICAgLy8gV2UgbmVlZCBvbmUgZXh0cmEgZWxlbWVudCwgdG8gaGFuZGxlIGFuIG92ZXJmbG93IGNhc2Ugd2hlbgotICAgIC8vIHRoZSBwb2x5Z29uIGRlZ2VuZXJhdGVzIGludG8gc29tZXRoaW5nIG5vbiBjb252ZXguCi0gICAgdmVydGV4X3QgYnVmZmVyW01BWF9DTElQUElOR19QTEFORVMgKiAyICsgMV07ICAgLy8gfjNLQgotICAgIHZlcnRleF90KiBidWYgPSBidWZmZXI7Ci0KLSAgICAvLyBvcmlnaW5hbCBsaXN0IG9mIHZlcnRpY2VzIChwb2x5Z29uIHRvIGNsaXAsIGluIGZhY3QgdGhpcwotICAgIC8vIGZ1bmN0aW9uIHdvcmtzIHdpdGggYW4gYXJiaXRyYXJ5IHBvbHlnb24pLgotICAgIHZlcnRleF90KiBpblszXSA9IHsgdjAsIHYxLCB2MiB9OwotICAgIAotICAgIC8vIG91dHB1dCBsaXN0cyAod2UgbmVlZCAyLCB3aGljaCB3ZSB1c2UgYmFjayBhbmQgZm9ydGgpCi0gICAgLy8gKG1heGltdW0gb3V0cG91dCBsaXN0J3Mgc2l6ZSBpcyBNQVhfQ0xJUFBJTkdfUExBTkVTICsgTUFYX1ZFUlRJQ0VTKQotICAgIC8vIDIgbW9yZSBlbGVtZW50cyBmb3Igb3ZlcmZsb3cgd2hlbiBub24gY29udmV4IHBvbHlnb25zLgotICAgIHZlcnRleF90KiBvdXRbMl1bTUFYX0NMSVBQSU5HX1BMQU5FUyArIE1BWF9WRVJUSUNFUyArIDJdOwotICAgIHVuc2lnbmVkIGludCBvdXRpID0gMDsKLSAgICAKLSAgICAvLyBjdXJyZW50IGlucHV0IGxpc3QKLSAgICB2ZXJ0ZXhfdCoqIGl2bCA9IGluOwotCi0gICAgLy8gMyBpbnB1dCB2ZXJ0aWNlcywgMCBpbiB0aGUgb3V0cHV0IGxpc3QsIGZpcnN0IHBsYW5lCi0gICAgdW5zaWduZWQgaW50IGljID0gMzsKLQotICAgIC8vIFVzZXIgY2xpcC1wbGFuZXMgZmlyc3QsIHRoZSBjbGlwcGluZyBpcyBhbHdheXMgZG9uZSBpbiBleWUtY29vcmRpbmF0ZQotICAgIC8vIHRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFsZ29yaXRobSB0aGFuIGZvciB0aGUgdmlldy12b2x1bWUKLSAgICAvLyBjbGlwcGluZywgZXhjZXB0IGZvciB0aGUgY29tcHV0YXRpb24gb2YgdGhlIGRpc3RhbmNlICh2ZXJ0ZXgsIHBsYW5lKQotICAgIC8vIGFuZCB0aGUgZmFjdCB0aGF0IHdlIG5lZWQgdG8gY29tcHV0ZSB0aGUgZXllLWNvb3JkaW5hdGVzIG9mIGVhY2gKLSAgICAvLyBuZXcgdmVydGV4IHdlIGNyZWF0ZS4KLSAgICAKLSAgICBpZiAoZ2dsX3VubGlrZWx5KGFsbF9jYyAmIHZlcnRleF90OjpVU0VSX0NMSVBfQUxMKSkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwbGFuZSA9IDA7Ci0gICAgICAgIHVpbnQzMl90IGNjID0gKGFsbF9jYyAmIHZlcnRleF90OjpVU0VSX0NMSVBfQUxMKSA+PiA4OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoY2MgJiAxKSB7ICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBwb2ludGVycyB0byBvdXIgb3V0cHV0IGxpc3QgKGhlYWQgYW5kIGN1cnJlbnQpCi0gICAgICAgICAgICAgICAgdmVydGV4X3QqKiBjb25zdCBvdmwgPSAmb3V0W291dGldWzBdOwotICAgICAgICAgICAgICAgIHZlcnRleF90Kiogb3V0cHV0ID0gb3ZsOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvYyA9IDA7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNlbnRpbmVsID0gMDsKLSAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0ZXgsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCi0gICAgICAgICAgICAgICAgdmVydGV4X3QqIHMgPSBpdmxbaWMtMV07Ci0gICAgICAgICAgICAgICAgY29uc3QgdmVjNF90JiBlcXVhdGlvbiA9IGMtPmNsaXBQbGFuZXMucGxhbmVbcGxhbmVdLmVxdWF0aW9uOwotICAgICAgICAgICAgICAgIEdMZml4ZWQgc2QgPSBkb3Q0KGVxdWF0aW9uLnYsIHMtPmV5ZS52KTsKLSAgICAgICAgICAgICAgICAvLyBjbGlwIGVhY2ggdmVydGV4IGFnYWluc3QgdGhpcyBwbGFuZS4uLgotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8aWMgOyBpKyspIHsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdmVydGV4X3QqIHAgPSBpdmxbaV07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBkb3Q0KGVxdWF0aW9uLnYsIHAtPmV5ZS52KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBpbnNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgaW5zaWRlLCBwIG91dHNpZGUgKGV4aXRpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShzZCwgc2QtcGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwRXllKGMsIGJ1ZiwgdCwgcCwgcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gYnVmKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZW50aW5lbCA+PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vbi1jb252ZXggcG9seWdvbiEKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBvdXRzaWRlIChlbnRlcmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShwZCwgcGQtc2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcEV5ZShjLCBidWYsIHQsIHMsIHApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBidWYrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2VudGluZWwgPj0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm9uLWNvbnZleCBwb2x5Z29uIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvdXRzaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIHNkID0gcGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG91dHB1dCBsaXN0IGJlY29tZSB0aGUgbmV3IGlucHV0IGxpc3QKLSAgICAgICAgICAgICAgICBpZiAob2M8MykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBsZXNzIHRoYW4gMyB2ZXJ0aWNlcyBsZWZ0PyB3ZSdyZSBkb25lIQotICAgICAgICAgICAgICAgIGl2bCA9IG92bDsKLSAgICAgICAgICAgICAgICBpYyA9IG9jOwotICAgICAgICAgICAgICAgIG91dGkgPSAxLW91dGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYyA+Pj0gMTsKLSAgICAgICAgICAgIHBsYW5lKys7Ci0gICAgICAgIH0gd2hpbGUgKGNjKTsKLSAgICB9Ci0KLSAgICAvLyBmcnVzdHVtIGNsaXAtcGxhbmVzCi0gICAgaWYgKGFsbF9jYyAmIHZlcnRleF90OjpGUlVTVFVNX0NMSVBfQUxMKQotICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50IHBsYW5lID0gMDsKLSAgICAgICAgdWludDMyX3QgY2MgPSBhbGxfY2MgJiB2ZXJ0ZXhfdDo6RlJVU1RVTV9DTElQX0FMTDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaWYgKGNjICYgMSkgeyAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gcG9pbnRlcnMgdG8gb3VyIG91dHB1dCBsaXN0IChoZWFkIGFuZCBjdXJyZW50KQotICAgICAgICAgICAgICAgIHZlcnRleF90KiogY29uc3Qgb3ZsID0gJm91dFtvdXRpXVswXTsKLSAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIG91dHB1dCA9IG92bDsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2MgPSAwOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZW50aW5lbCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGV4LCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQotICAgICAgICAgICAgICAgIHZlcnRleF90KiBzID0gaXZsW2ljLTFdOwotICAgICAgICAgICAgICAgIEdMZml4ZWQgc2QgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBzLT5jbGlwKTsKLSAgICAgICAgICAgICAgICAvLyBjbGlwIGVhY2ggdmVydGV4IGFnYWluc3QgdGhpcyBwbGFuZS4uLgotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8aWMgOyBpKyspIHsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdmVydGV4X3QqIHAgPSBpdmxbaV07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBwLT5jbGlwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBpbnNpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgaW5zaWRlLCBwIG91dHNpZGUgKGV4aXRpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShzZCwgc2QtcGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwVmVydGV4KGMsIGJ1ZiwgdCwgcCwgcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCsrID0gYnVmKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytzZW50aW5lbCA+PSAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vbi1jb252ZXggcG9seWdvbiEKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBvdXRzaWRlIChlbnRlcmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShwZCwgcGQtc2QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcFZlcnRleChjLCBidWYsIHQsIHMsIHApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBidWYrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrc2VudGluZWwgPj0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm9uLWNvbnZleCBwb2x5Z29uIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0KysgPSBwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9jKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvdXRzaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIHNkID0gcGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIG91dHB1dCBsaXN0IGJlY29tZSB0aGUgbmV3IGlucHV0IGxpc3QKLSAgICAgICAgICAgICAgICBpZiAob2M8MykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBsZXNzIHRoYW4gMyB2ZXJ0aWNlcyBsZWZ0PyB3ZSdyZSBkb25lIQotICAgICAgICAgICAgICAgIGl2bCA9IG92bDsKLSAgICAgICAgICAgICAgICBpYyA9IG9jOwotICAgICAgICAgICAgICAgIG91dGkgPSAxLW91dGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYyA+Pj0gMTsKLSAgICAgICAgICAgIHBsYW5lKys7Ci0gICAgICAgIH0gd2hpbGUgKGNjKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZmluYWxseSB3ZSBjYW4gcmVuZGVyIG91ciB0cmlhbmdsZXMuLi4KLSAgICBwMCA9IGl2bFswXTsKLSAgICBwMSA9IGl2bFsxXTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpPTIgOyBpPGljIDsgaSsrKSB7Ci0gICAgICAgIHAyID0gaXZsW2ldOwotICAgICAgICBjLT5sZXJwLmluaXRUcmlhbmdsZShwMCwgcDEsIHAyKTsKLSAgICAgICAgaWYgKGN1bGxfdHJpYW5nbGUoYywgcDAsIHAxLCBwMikpIHsKLSAgICAgICAgICAgIHAxID0gcDI7Ci0gICAgICAgICAgICBjb250aW51ZTsgLy8gY3VsbGVkIQotICAgICAgICB9Ci0gICAgICAgIHRyaWFuZ2xlKGMsIHAwLCBwMSwgcDIpOwotICAgICAgICBwMSA9IHAyOwotICAgIH0KLX0KLQotdW5zaWduZWQgaW50IGNsaXBfbGluZShvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiBzLCB2ZXJ0ZXhfdCogcCkKLXsKLSAgICBjb25zdCB1aW50MzJfdCBhbGxfY2MgPSAocy0+ZmxhZ3MgfCBwLT5mbGFncykgJiB2ZXJ0ZXhfdDo6Q0xJUF9BTEw7Ci0KLSAgICBpZiAoZ2dsX3VubGlrZWx5KGFsbF9jYyAmIHZlcnRleF90OjpVU0VSX0NMSVBfQUxMKSkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwbGFuZSA9IDA7Ci0gICAgICAgIHVpbnQzMl90IGNjID0gKGFsbF9jYyAmIHZlcnRleF90OjpVU0VSX0NMSVBfQUxMKSA+PiA4OwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoY2MgJiAxKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdmVjNF90JiBlcXVhdGlvbiA9IGMtPmNsaXBQbGFuZXMucGxhbmVbcGxhbmVdLmVxdWF0aW9uOwotICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgc2QgPSBkb3Q0KGVxdWF0aW9uLnYsIHMtPmV5ZS52KTsKLSAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHBkID0gZG90NChlcXVhdGlvbi52LCBwLT5leWUudik7Ci0gICAgICAgICAgICAgICAgaWYgKHNkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggaW5zaWRlCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzIGluc2lkZSwgcCBvdXRzaWRlIChleGl0aW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCB0ID0gY2xpcERpdmlkZShzZCwgc2QtcGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBFeWUoYywgcCwgdCwgcCwgcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAocGQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBvdXRzaWRlIChlbnRlcmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUocGQsIHBkLXNkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5hcnJheXMuY2xpcEV5ZShjLCBzLCB0LCBzLCBwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90aCBvdXRzaWRlCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2MgPj49IDE7Ci0gICAgICAgICAgICBwbGFuZSsrOwotICAgICAgICB9IHdoaWxlIChjYyk7Ci0gICAgfQotCi0gICAgLy8gZnJ1c3R1bSBjbGlwLXBsYW5lcwotICAgIGlmIChhbGxfY2MgJiB2ZXJ0ZXhfdDo6RlJVU1RVTV9DTElQX0FMTCkKLSAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwbGFuZSA9IDA7Ci0gICAgICAgIHVpbnQzMl90IGNjID0gYWxsX2NjICYgdmVydGV4X3Q6OkZSVVNUVU1fQ0xJUF9BTEw7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChjYyAmIDEpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHNkID0gZnJ1c3R1bVBsYW5lRGlzdChwbGFuZSwgcy0+Y2xpcCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBwZCA9IGZydXN0dW1QbGFuZURpc3QocGxhbmUsIHAtPmNsaXApOwotICAgICAgICAgICAgICAgIGlmIChzZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGluc2lkZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcyBpbnNpZGUsIHAgb3V0c2lkZSAoZXhpdGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdCA9IGNsaXBEaXZpZGUoc2QsIHNkLXBkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFycmF5cy5jbGlwVmVydGV4KGMsIHAsIHQsIHAsIHMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHMgb3V0c2lkZSAoZW50ZXJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZpeGVkIHQgPSBjbGlwRGl2aWRlKHBkLCBwZC1zZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YXJyYXlzLmNsaXBWZXJ0ZXgoYywgcywgdCwgcywgcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIGJvdGggb3V0c2lkZQotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjID4+PSAxOwotICAgICAgICAgICAgcGxhbmUrKzsKLSAgICAgICAgfSB3aGlsZSAoY2MpOwotICAgIH0KLQotICAgIHJldHVybiAyOwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuaCBiL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVmNjA0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9wcmltaXRpdmVzLmgKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jaWZuZGVmIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfUFJJTUlUSVZFU19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBnbCB7Ci1zdHJ1Y3Qgb2dsZXNfY29udGV4dF90OwotfTsKLQotdm9pZCBvZ2xlc192YWxpZGF0ZV9wcmltaXRpdmVzKG9nbGVzX2NvbnRleHRfdCogYyk7Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX09QRU5HTEVTX1BSSU1JVElWRVNfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmNwcCBiL29wZW5nbC9saWJhZ2wvc3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGU5NjEyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvc3RhdGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTk3ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvc3RhdGUuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJmcC5oIgotI2luY2x1ZGUgInN0YXRlLmgiCi0jaW5jbHVkZSAiYXJyYXkuaCIKLSNpbmNsdWRlICJtYXRyaXguaCIKLSNpbmNsdWRlICJ2ZXJ0ZXguaCIKLSNpbmNsdWRlICJsaWdodC5oIgotI2luY2x1ZGUgInRleHR1cmUuaCIKLSNpbmNsdWRlICJCdWZmZXJPYmplY3RNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiVGV4dHVyZU9iamVjdE1hbmFnZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlbmRvclN0cmluZyAgICAgPSAiQW5kcm9pZCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdSZW5kZXJlclN0cmluZyAgID0gIkFuZHJvaWQgUGl4ZWxGbGluZ2VyIDEuNCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdWZXJzaW9uU3RyaW5nICAgID0gIk9wZW5HTCBFUy1DTSAxLjAiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnRXh0ZW5zaW9uc1N0cmluZyA9Ci0gICAgIkdMX09FU19ieXRlX2Nvb3JkaW5hdGVzICIgICAgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX09FU19maXhlZF9wb2ludCAiICAgICAgICAgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX09FU19zaW5nbGVfcHJlY2lzaW9uICIgICAgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX09FU19yZWFkX2Zvcm1hdCAiICAgICAgICAgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgIiAgIC8vIE9LCi0gICAgIkdMX09FU19kcmF3X3RleHR1cmUgIiAgICAgICAgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX09FU19tYXRyaXhfZ2V0ICIgICAgICAgICAgICAgICAgICAgIC8vIE9LCi0gICAgIkdMX09FU19xdWVyeV9tYXRyaXggIiAgICAgICAgICAgICAgICAgIC8vIE9LCi0gICAgLy8gICAgICAgICJHTF9PRVNfcG9pbnRfc2l6ZV9hcnJheSAiICAgICAgICAgICAgICAvLyBUT0RPCi0gICAgLy8gICAgICAgICJHTF9PRVNfcG9pbnRfc3ByaXRlICIgICAgICAgICAgICAgICAgICAvLyBUT0RPCi0gICAgIkdMX09FU19FR0xfaW1hZ2UgIiAgICAgICAgICAgICAgICAgICAgIC8vIE9LCi0jaWZkZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKLSAgICAiR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUgIiAgLy8gT0sKLSNlbmRpZgotICAgICJHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbiAiICAgICAgICAgICAvLyBPSwotICAgICJHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvICIgICAgICAvLyBPSwotICAgICJHTF9BTkRST0lEX3VzZXJfY2xpcF9wbGFuZSAiICAgICAgICAgICAvLyBPSwotICAgICJHTF9BTkRST0lEX3ZlcnRleF9idWZmZXJfb2JqZWN0ICIgICAgICAvLyBPSwotICAgICJHTF9BTkRST0lEX2dlbmVyYXRlX21pcG1hcCAiICAgICAgICAgICAvLyBPSwotICAgIDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jZW5kaWYKLQotb2dsZXNfY29udGV4dF90ICpvZ2xlc19pbml0KHNpemVfdCBleHRyYSkKLXsKLSAgICB2b2lkKiBjb25zdCBiYXNlID0gbWFsbG9jKGV4dHJhICsgc2l6ZW9mKG9nbGVzX2NvbnRleHRfdCkgKyAzMik7Ci0gICAgaWYgKCFiYXNlKSByZXR1cm4gMDsKLQotICAgIG9nbGVzX2NvbnRleHRfdCAqYyA9Ci0gICAgICAgICAgICAob2dsZXNfY29udGV4dF90ICopKChwdHJkaWZmX3QoYmFzZSkgKyBleHRyYSArIDMxKSAmIH4weDFGTCk7Ci0gICAgbWVtc2V0KGMsIDAsIHNpemVvZihvZ2xlc19jb250ZXh0X3QpKTsKLSAgICBnZ2xfaW5pdF9jb250ZXh0KCYoYy0+cmFzdGVyaXplcikpOwotCi0gICAgLy8gWFhYOiB0aGlzIHNob3VsZCBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQKLSAgICBzcDxFR0xTdXJmYWNlTWFuYWdlcj4gc21ncihuZXcgRUdMU3VyZmFjZU1hbmFnZXIoKSk7Ci0gICAgYy0+c3VyZmFjZU1hbmFnZXIgPSBzbWdyLmdldCgpOwotICAgIGMtPnN1cmZhY2VNYW5hZ2VyLT5pbmNTdHJvbmcoYyk7Ci0KLSAgICBzcDxFR0xCdWZmZXJPYmplY3RNYW5hZ2VyPiBib21ncihuZXcgRUdMQnVmZmVyT2JqZWN0TWFuYWdlcigpKTsKLSAgICBjLT5idWZmZXJPYmplY3RNYW5hZ2VyID0gYm9tZ3IuZ2V0KCk7Ci0gICAgYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+aW5jU3Ryb25nKGMpOwotCi0gICAgb2dsZXNfaW5pdF9hcnJheShjKTsKLSAgICBvZ2xlc19pbml0X21hdHJpeChjKTsKLSAgICBvZ2xlc19pbml0X3ZlcnRleChjKTsKLSAgICBvZ2xlc19pbml0X2xpZ2h0KGMpOwotICAgIG9nbGVzX2luaXRfdGV4dHVyZShjKTsKLQotICAgIGMtPnJhc3Rlcml6ZXIuYmFzZSA9IGJhc2U7Ci0gICAgYy0+cG9pbnQuc2l6ZSA9IFRSSV9PTkU7Ci0gICAgYy0+bGluZS53aWR0aCA9IFRSSV9PTkU7Ci0KLSAgICAvLyBpbiBPcGVuR0wsIHdyaXRpbmcgdG8gdGhlIGRlcHRoIGJ1ZmZlciBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCi0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5kZXB0aE1hc2soYywgMSk7Ci0KLSAgICAvLyBPcGVuR0wgZW5hYmxlcyBkaXRoZXJpbmcgYnkgZGVmYXVsdAotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZW5hYmxlKGMsIEdMX0RJVEhFUik7Ci0KLSAgICByZXR1cm4gYzsKLX0KLQotdm9pZCBvZ2xlc191bmluaXQob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIG9nbGVzX3VuaW5pdF9hcnJheShjKTsKLSAgICBvZ2xlc191bmluaXRfbWF0cml4KGMpOwotICAgIG9nbGVzX3VuaW5pdF92ZXJ0ZXgoYyk7Ci0gICAgb2dsZXNfdW5pbml0X2xpZ2h0KGMpOwotICAgIG9nbGVzX3VuaW5pdF90ZXh0dXJlKGMpOwotICAgIGMtPnN1cmZhY2VNYW5hZ2VyLT5kZWNTdHJvbmcoYyk7Ci0gICAgYy0+YnVmZmVyT2JqZWN0TWFuYWdlci0+ZGVjU3Ryb25nKGMpOwotICAgIGdnbF91bmluaXRfY29udGV4dCgmKGMtPnJhc3Rlcml6ZXIpKTsKLSAgICBmcmVlKGMtPnJhc3Rlcml6ZXIuYmFzZSk7Ci19Ci0KLXZvaWQgX29nbGVzX2Vycm9yKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIGVycm9yKQotewotICAgIGlmIChjLT5lcnJvciA9PSBHTF9OT19FUlJPUikKLSAgICAgICAgYy0+ZXJyb3IgPSBlcnJvcjsKLX0KLQotc3RhdGljIGJvb2wgc3RlbmNpbG9wX3ZhbGlkKEdMZW51bSBvcCkgewotICAgIHN3aXRjaCAob3ApIHsKLSAgICBjYXNlIEdMX0tFRVA6Ci0gICAgY2FzZSBHTF9aRVJPOgotICAgIGNhc2UgR0xfUkVQTEFDRToKLSAgICBjYXNlIEdMX0lOQ1I6Ci0gICAgY2FzZSBHTF9ERUNSOgotICAgIGNhc2UgR0xfSU5WRVJUOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfZGlzYWJsZShvZ2xlc19jb250ZXh0X3QqIGMsIEdMZW51bSBjYXAsIGludCBlbmFibGVkKQotewotICAgIGlmICgoY2FwID49IEdMX0xJR0hUMCkgJiYgKGNhcDxHTF9MSUdIVDArT0dMRVNfTUFYX0xJR0hUUykpIHsKLSAgICAgICAgYy0+bGlnaHRpbmcubGlnaHRzW2NhcC1HTF9MSUdIVDBdLmVuYWJsZSA9IGVuYWJsZWQ7Ci0gICAgICAgIGMtPmxpZ2h0aW5nLmVuYWJsZWRMaWdodHMgJj0gfigxPDwoY2FwLUdMX0xJR0hUMCkpOwotICAgICAgICBjLT5saWdodGluZy5lbmFibGVkTGlnaHRzIHw9IChlbmFibGVkPDwoY2FwLUdMX0xJR0hUMCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoIChjYXApIHsKLSAgICBjYXNlIEdMX1BPSU5UX1NNT09USDoKLSAgICAgICAgYy0+cG9pbnQuc21vb3RoID0gZW5hYmxlZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MSU5FX1NNT09USDoKLSAgICAgICAgYy0+bGluZS5zbW9vdGggPSBlbmFibGVkOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEw6Ci0gICAgICAgIGMtPnBvbHlnb25PZmZzZXQuZW5hYmxlID0gZW5hYmxlZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9DVUxMX0ZBQ0U6Ci0gICAgICAgIGMtPmN1bGwuZW5hYmxlID0gZW5hYmxlZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MSUdIVElORzoKLSAgICAgICAgYy0+bGlnaHRpbmcuZW5hYmxlID0gZW5hYmxlZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9DT0xPUl9NQVRFUklBTDoKLSAgICAgICAgYy0+bGlnaHRpbmcuY29sb3JNYXRlcmlhbC5lbmFibGUgPSBlbmFibGVkOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX05PUk1BTElaRToKLSAgICBjYXNlIEdMX1JFU0NBTEVfTk9STUFMOgotICAgICAgICBjLT50cmFuc2Zvcm1zLnJlc2NhbGVOb3JtYWxzID0gZW5hYmxlZCA/IGNhcCA6IDA7Ci0gICAgICAgIC8vIFhYWDogaW52YWxpZGF0ZSBtdml0Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9DTElQX1BMQU5FMDoKLSAgICBjYXNlIEdMX0NMSVBfUExBTkUxOgotICAgIGNhc2UgR0xfQ0xJUF9QTEFORTI6Ci0gICAgY2FzZSBHTF9DTElQX1BMQU5FMzoKLSAgICBjYXNlIEdMX0NMSVBfUExBTkU0OgotICAgIGNhc2UgR0xfQ0xJUF9QTEFORTU6Ci0gICAgICAgIGMtPmNsaXBQbGFuZXMuZW5hYmxlICY9IH4oMTw8KGNhcC1HTF9DTElQX1BMQU5FMCkpOwotICAgICAgICBjLT5jbGlwUGxhbmVzLmVuYWJsZSB8PSAoZW5hYmxlZDw8KGNhcC1HTF9DTElQX1BMQU5FMCkpOwotICAgICAgICBvZ2xlc19pbnZhbGlkYXRlX3BlcnNwZWN0aXZlKGMpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgR0xfRk9HOgotICAgIGNhc2UgR0xfREVQVEhfVEVTVDoKLSAgICAgICAgb2dsZXNfaW52YWxpZGF0ZV9wZXJzcGVjdGl2ZShjKTsKLSAgICAgICAgLy8gZmFsbC10aHJvdWdoLi4uCi0gICAgY2FzZSBHTF9CTEVORDoKLSAgICBjYXNlIEdMX1NDSVNTT1JfVEVTVDoKLSAgICBjYXNlIEdMX0FMUEhBX1RFU1Q6Ci0gICAgY2FzZSBHTF9DT0xPUl9MT0dJQ19PUDoKLSAgICBjYXNlIEdMX0RJVEhFUjoKLSAgICBjYXNlIEdMX1NURU5DSUxfVEVTVDoKLSAgICBjYXNlIEdMX1RFWFRVUkVfMkQ6Ci0gICAgICAgIC8vIHRoZXNlIG5lZWQgdG8gZmFsbCB0aHJvdWdoIGludG8gdGhlIHJhc3Rlcml6ZXIKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsIGNhcCwgZW5hYmxlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVM6Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuZW5hYmxlRGlzYWJsZShjLCBHTF9URVhUVVJFXzJELCBlbmFibGVkKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdMX01VTFRJU0FNUExFOgotICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFOgotICAgIGNhc2UgR0xfU0FNUExFX0FMUEhBX1RPX09ORToKLSAgICBjYXNlIEdMX1NBTVBMRV9DT1ZFUkFHRToKLSAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uCi0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNlbmRpZgotCi0vLyBUaGVzZSBvbmVzIGFyZSBzdXBlci1lYXN5LCB3ZSdyZSBub3Qgc3VwcG9ydGluZyB0aG9zZSBmZWF0dXJlcyEKLXZvaWQgZ2xTYW1wbGVDb3ZlcmFnZShHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgewotfQotdm9pZCBnbFNhbXBsZUNvdmVyYWdleChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgewotfQotdm9pZCBnbFN0ZW5jaWxGdW5jKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoZnVuYyA8IEdMX05FVkVSIHx8IGZ1bmMgPiBHTF9BTFdBWVMpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBmcm9tIE9wZW5HTHxFUyAxLjAgc2VwY2lmaWNhdGlvbjoKLSAgICAvLyBJZiB0aGVyZSBpcyBubyBzdGVuY2lsIGJ1ZmZlciwgbm8gc3RlbmNpbCBtb2RpZmljYXRpb24gY2FuIG9jY3VyCi0gICAgLy8gYW5kIGl0IGlzIGFzIGlmIHRoZSBzdGVuY2lsIHRlc3QgYWx3YXlzIHBhc3Nlcy4KLX0KLQotdm9pZCBnbFN0ZW5jaWxPcChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICgoc3RlbmNpbG9wX3ZhbGlkKGZhaWwpICYKLSAgICAgICAgIHN0ZW5jaWxvcF92YWxpZCh6ZmFpbCkgJgotICAgICAgICAgc3RlbmNpbG9wX3ZhbGlkKHpwYXNzKSkgPT0gMCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZ2xBbHBoYUZ1bmMoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikKLXsKLSAgICBnbEFscGhhRnVuY3goZnVuYywgZ2dsRmxvYXRUb0ZpeGVkKHJlZikpOwotfQotCi12b2lkIGdsQ3VsbEZhY2UoR0xlbnVtIG1vZGUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICBjYXNlIEdMX0ZST05UOgotICAgIGNhc2UgR0xfQkFDSzoKLSAgICBjYXNlIEdMX0ZST05UX0FORF9CQUNLOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgIH0KLSAgICBjLT5jdWxsLmN1bGxGYWNlID0gbW9kZTsKLX0KLQotdm9pZCBnbEZyb250RmFjZShHTGVudW0gbW9kZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgIGNhc2UgR0xfQ1c6Ci0gICAgY2FzZSBHTF9DQ1c6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+Y3VsbC5mcm9udEZhY2UgPSBtb2RlOwotfQotCi12b2lkIGdsSGludChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIHN3aXRjaCAodGFyZ2V0KSB7Ci0gICAgY2FzZSBHTF9GT0dfSElOVDoKLSAgICBjYXNlIEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UOgotICAgIGNhc2UgR0xfTElORV9TTU9PVEhfSElOVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9QT0lOVF9TTU9PVEhfSElOVDoKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5lbmFibGVEaXNhYmxlKGMsCi0gICAgICAgICAgICAgICAgR0dMX1BPSU5UX1NNT09USF9OSUNFLCBtb2RlPT1HTF9OSUNFU1QpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVDoKLSAgICAgICAgYy0+cGVyc3BlY3RpdmUgPSAobW9kZSA9PSBHTF9OSUNFU1QpID8gMSA6IDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgfQotfQotCi12b2lkIGdsRW5hYmxlKEdMZW51bSBjYXApIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGVuYWJsZV9kaXNhYmxlKGMsIGNhcCwgMSk7Ci19Ci12b2lkIGdsRGlzYWJsZShHTGVudW0gY2FwKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBlbmFibGVfZGlzYWJsZShjLCBjYXAsIDApOwotfQotCi12b2lkIGdsRmluaXNoKCkKLXsgLy8gbm90aGluZyB0byBkbyBmb3Igb3VyIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uCi19Ci0KLXZvaWQgZ2xGbHVzaCgpCi17IC8vIG5vdGhpbmcgdG8gZG8gZm9yIG91ciBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbgotfQotCi1HTGVudW0gZ2xHZXRFcnJvcigpCi17Ci0gICAgLy8gRnJvbSBPcGVuR0x8RVMgMS4wIHNwZWNpZmljYXRpb246Ci0gICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBmbGFnIGhhcyByZWNvcmRlZCBhbiBlcnJvciwgZ2xHZXRFcnJvciByZXR1cm5zCi0gICAgLy8gYW5kIGNsZWFycyBhbiBhcmJpdHJhcnkgZXJyb3IgZmxhZyB2YWx1ZS4gVGh1cywgZ2xHZXRFcnJvciBzaG91bGQKLSAgICAvLyBhbHdheXMgYmUgY2FsbGVkIGluIGEgbG9vcCwgdW50aWwgaXQgcmV0dXJucyBHTF9OT19FUlJPUiwKLSAgICAvLyBpZiBhbGwgZXJyb3IgZmxhZ3MgYXJlIHRvIGJlIHJlc2V0LgotCi0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoYy0+ZXJyb3IpIHsKLSAgICAgICAgY29uc3QgR0xlbnVtIHJldChjLT5lcnJvcik7Ci0gICAgICAgIGMtPmVycm9yID0gMDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpZiAoYy0+cmFzdGVyaXplci5lcnJvcikgewotICAgICAgICBjb25zdCBHTGVudW0gcmV0KGMtPnJhc3Rlcml6ZXIuZXJyb3IpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLmVycm9yID0gMDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gR0xfTk9fRVJST1I7Ci19Ci0KLWNvbnN0IEdMdWJ5dGUqIGdsR2V0U3RyaW5nKEdMZW51bSBzdHJpbmcpCi17Ci0gICAgc3dpdGNoIChzdHJpbmcpIHsKLSAgICBjYXNlIEdMX1ZFTkRPUjogICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopZ1ZlbmRvclN0cmluZzsKLSAgICBjYXNlIEdMX1JFTkRFUkVSOiAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSopZ1JlbmRlcmVyU3RyaW5nOwotICAgIGNhc2UgR0xfVkVSU0lPTjogICAgcmV0dXJuIChjb25zdCBHTHVieXRlKilnVmVyc2lvblN0cmluZzsKLSAgICBjYXNlIEdMX0VYVEVOU0lPTlM6IHJldHVybiAoY29uc3QgR0x1Ynl0ZSopZ0V4dGVuc2lvbnNTdHJpbmc7Ci0gICAgfQotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBnbEdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLXsKLSAgICBpbnQgaTsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRToKLSAgICAgICAgcGFyYW1zWzBdID0gMDsKLSAgICAgICAgcGFyYW1zWzFdID0gR0dMX01BWF9BTElBU0VEX1BPSU5UX1NJWkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFOgotICAgICAgICBwYXJhbXNbMF0gPSAwOwotICAgICAgICBwYXJhbXNbMV0gPSBHR0xfTUFYX0FMSUFTRURfUE9JTlRfU0laRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9BTFBIQV9CSVRTOiB7Ci0gICAgICAgIGludCBpbmRleCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5mb3JtYXQ7Ci0gICAgICAgIEdHTEZvcm1hdCBjb25zdCAqIGZvcm1hdHMgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7Ci0gICAgICAgIHBhcmFtc1swXSA9IGZvcm1hdHNbaW5kZXhdLmFoIC0gZm9ybWF0c1tpbmRleF0uYWw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBHTF9SRURfQklUUzogewotICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OwotICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOwotICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5yaCAtIGZvcm1hdHNbaW5kZXhdLnJsOwotICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgR0xfR1JFRU5fQklUUzogewotICAgICAgICBpbnQgaW5kZXggPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuZm9ybWF0OwotICAgICAgICBHR0xGb3JtYXQgY29uc3QgKiBmb3JtYXRzID0gZ2dsR2V0UGl4ZWxGb3JtYXRUYWJsZSgpOwotICAgICAgICBwYXJhbXNbMF0gPSBmb3JtYXRzW2luZGV4XS5naCAtIGZvcm1hdHNbaW5kZXhdLmdsOwotICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGNhc2UgR0xfQkxVRV9CSVRTOiB7Ci0gICAgICAgIGludCBpbmRleCA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5mb3JtYXQ7Ci0gICAgICAgIEdHTEZvcm1hdCBjb25zdCAqIGZvcm1hdHMgPSBnZ2xHZXRQaXhlbEZvcm1hdFRhYmxlKCk7Ci0gICAgICAgIHBhcmFtc1swXSA9IGZvcm1hdHNbaW5kZXhdLmJoIC0gZm9ybWF0c1tpbmRleF0uYmw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUzoKLSAgICAgICAgcGFyYW1zWyAwXSA9IEdMX1BBTEVUVEU0X1JHQjhfT0VTOwotICAgICAgICBwYXJhbXNbIDFdID0gR0xfUEFMRVRURTRfUkdCQThfT0VTOwotICAgICAgICBwYXJhbXNbIDJdID0gR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTOwotICAgICAgICBwYXJhbXNbIDNdID0gR0xfUEFMRVRURTRfUkdCQTRfT0VTOwotICAgICAgICBwYXJhbXNbIDRdID0gR0xfUEFMRVRURTRfUkdCNV9BMV9PRVM7Ci0gICAgICAgIHBhcmFtc1sgNV0gPSBHTF9QQUxFVFRFOF9SR0I4X09FUzsKLSAgICAgICAgcGFyYW1zWyA2XSA9IEdMX1BBTEVUVEU4X1JHQkE4X09FUzsKLSAgICAgICAgcGFyYW1zWyA3XSA9IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzsKLSAgICAgICAgcGFyYW1zWyA4XSA9IEdMX1BBTEVUVEU4X1JHQkE0X09FUzsKLSAgICAgICAgcGFyYW1zWyA5XSA9IEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOwotICAgICAgICBpID0gMTA7Ci0jaWZkZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKLSAgICAgICAgcGFyYW1zW2krK10gPSBHTF9FVEMxX1JHQjhfT0VTOwotI2VuZGlmCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfREVQVEhfQklUUzoKLSAgICAgICAgcGFyYW1zWzBdID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmRlcHRoLmZvcm1hdCA/IDAgOiAxNjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVM6Ci0gICAgICAgIHBhcmFtc1swXSA9IEdMX1JHQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTOgotICAgICAgICBwYXJhbXNbMF0gPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9NQVhfTElHSFRTOgotICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19NQVhfTElHSFRTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9DTElQX1BMQU5FUzoKLSAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfTUFYX0NMSVBfUExBTkVTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEg6Ci0gICAgICAgIHBhcmFtc1swXSA9IE9HTEVTX01PREVMVklFV19TVEFDS19ERVBUSDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSDoKLSAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfUFJPSkVDVElPTl9TVEFDS19ERVBUSDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSDoKLSAgICAgICAgcGFyYW1zWzBdID0gT0dMRVNfVEVYVFVSRV9TVEFDS19ERVBUSDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9TSVpFOgotICAgICAgICBwYXJhbXNbMF0gPSBHR0xfTUFYX1RFWFRVUkVfU0laRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9NQVhfVEVYVFVSRV9VTklUUzoKLSAgICAgICAgcGFyYW1zWzBdID0gR0dMX1RFWFRVUkVfVU5JVF9DT1VOVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9NQVhfVklFV1BPUlRfRElNUzoKLSAgICAgICAgcGFyYW1zWzBdID0gR0dMX01BWF9WSUVXUE9SVF9ESU1TOwotICAgICAgICBwYXJhbXNbMV0gPSBHR0xfTUFYX1ZJRVdQT1JUX0RJTVM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTOgotICAgICAgICBwYXJhbXNbMF0gPSBPR0xFU19OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFM7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0U6Ci0gICAgICAgIHBhcmFtc1swXSA9IDA7Ci0gICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfU01PT1RIX0xJTkVfV0lEVEg7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0U6Ci0gICAgICAgIHBhcmFtc1swXSA9IDA7Ci0gICAgICAgIHBhcmFtc1sxXSA9IEdHTF9NQVhfU01PT1RIX1BPSU5UX1NJWkU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU1RFTkNJTF9CSVRTOgotICAgICAgICBwYXJhbXNbMF0gPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1NVQlBJWEVMX0JJVFM6Ci0gICAgICAgIHBhcmFtc1swXSA9IEdHTF9TVUJQSVhFTF9CSVRTOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6Ci0gICAgICAgIG1lbWNweSggcGFyYW1zLAotICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMubW9kZWx2aWV3LnRvcCgpLmVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgMTYqc2l6ZW9mKEdMaW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTOgotICAgICAgICBtZW1jcHkoIHBhcmFtcywKLSAgICAgICAgICAgICAgICBjLT50cmFuc2Zvcm1zLnByb2plY3Rpb24udG9wKCkuZWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAxNipzaXplb2YoR0xpbnQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVM6Ci0gICAgICAgIG1lbWNweSggcGFyYW1zLAotICAgICAgICAgICAgICAgIGMtPnRyYW5zZm9ybXMudGV4dHVyZVtjLT50ZXh0dXJlcy5hY3RpdmVdLnRvcCgpLmVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgMTYqc2l6ZW9mKEdMaW50KSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZ2xQb2ludFNpemUoR0xmbG9hdCBzaXplKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHNpemUgPD0gMCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGMtPnBvaW50LnNpemUgPSBUUklfRlJPTV9GSVhFRChnZ2xGbG9hdFRvRml4ZWQoc2l6ZSkpOwotfQotCi12b2lkIGdsUG9pbnRTaXpleChHTGZpeGVkIHNpemUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoc2l6ZSA8PSAwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+cG9pbnQuc2l6ZSA9IFRSSV9GUk9NX0ZJWEVEKHNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZ2xMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh3aWR0aCA8PSAwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+bGluZS53aWR0aCA9IFRSSV9GUk9NX0ZJWEVEKGdnbEZsb2F0VG9GaXhlZCh3aWR0aCkpOwotfQotCi12b2lkIGdsTGluZVdpZHRoeChHTGZpeGVkIHdpZHRoKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHdpZHRoIDw9IDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjLT5saW5lLndpZHRoID0gVFJJX0ZST01fRklYRUQod2lkdGgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZ2xDb2xvck1hc2soR0xib29sZWFuIHIsIEdMYm9vbGVhbiBnLCBHTGJvb2xlYW4gYiwgR0xib29sZWFuIGEpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3JNYXNrKGMsIHIsIGcsIGIsIGEpOwotfQotCi12b2lkIGdsRGVwdGhNYXNrKEdMYm9vbGVhbiBmbGFnKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoTWFzayhjLCBmbGFnKTsKLX0KLQotdm9pZCBnbFN0ZW5jaWxNYXNrKEdMdWludCBtYXNrKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnN0ZW5jaWxNYXNrKGMsIG1hc2spOwotfQotCi12b2lkIGdsRGVwdGhGdW5jKEdMZW51bSBmdW5jKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRlcHRoRnVuYyhjLCBmdW5jKTsKLX0KLQotdm9pZCBnbExvZ2ljT3AoR0xlbnVtIG9wY29kZSkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5sb2dpY09wKGMsIG9wY29kZSk7Ci19Ci0KLXZvaWQgZ2xBbHBoYUZ1bmN4KEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWxwaGFGdW5jeChjLCBmdW5jLCByZWYpOwotfQotCi12b2lkIGdsQmxlbmRGdW5jKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvcikgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5ibGVuZEZ1bmMoYywgc2ZhY3RvciwgZGZhY3Rvcik7Ci19Ci0KLXZvaWQgZ2xDbGVhcihHTGJpdGZpZWxkIG1hc2spIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXIoYywgbWFzayk7Ci19Ci0KLXZvaWQgZ2xDbGVhckNvbG9yeChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckNvbG9yeChjLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQgZ2xDbGVhckNvbG9yKEdMY2xhbXBmIHIsIEdMY2xhbXBmIGcsIEdMY2xhbXBmIGIsIEdMY2xhbXBmIGEpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmNsZWFyQ29sb3J4KGMsCi0gICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChyKSwKLSAgICAgICAgICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGcpLAotICAgICAgICAgICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoYiksCi0gICAgICAgICAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChhKSk7Ci19Ci0KLXZvaWQgZ2xDbGVhckRlcHRoeChHTGNsYW1weCBkZXB0aCkgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhckRlcHRoeChjLCBkZXB0aCk7Ci19Ci0KLXZvaWQgZ2xDbGVhckRlcHRoZihHTGNsYW1wZiBkZXB0aCkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY2xlYXJEZXB0aHgoYywgZ2dsRmxvYXRUb0ZpeGVkKGRlcHRoKSk7Ci19Ci0KLXZvaWQgZ2xDbGVhclN0ZW5jaWwoR0xpbnQgcykgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5jbGVhclN0ZW5jaWwoYywgcyk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3N0YXRlLmggYi9vcGVuZ2wvbGliYWdsL3N0YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTVjY2IuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC9zdGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogbGlicy9vcGVuZ2xlcy9zdGF0ZS5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1NUQVRFX0gKLSNkZWZpbmUgQU5EUk9JRF9PUEVOR0xFU19TVEFURV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvcGl4ZWxmbGluZ2VyL2dnbF9jb250ZXh0Lmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW9nbGVzX2NvbnRleHRfdCAqb2dsZXNfaW5pdChzaXplX3QgZXh0cmEpOwotdm9pZCBvZ2xlc191bmluaXQob2dsZXNfY29udGV4dF90KiBjKTsKLXZvaWQgX29nbGVzX2Vycm9yKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIGVycm9yKTsKLQotI2lmbmRlZiBUUkFDRV9HTF9FUlJPUlMKLSNkZWZpbmUgVFJBQ0VfR0xfRVJST1JTIDAKLSNlbmRpZgotCi0jaWYgVFJBQ0VfR0xfRVJST1JTCi0jZGVmaW5lIG9nbGVzX2Vycm9yKGMsIGVycm9yKSBcCi1kbyB7IFwKLSAgcHJpbnRmKCJvZ2xlc19lcnJvciBhdCBmaWxlICVzIGxpbmUgJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKLSAgX29nbGVzX2Vycm9yKGMsIGVycm9yKTsgXAotfSB3aGlsZSAoMCkKLSNlbHNlIC8qICFUUkFDRV9HTF9FUlJPUlMgKi8KLSNkZWZpbmUgb2dsZXNfZXJyb3IoYywgZXJyb3IpIF9vZ2xlc19lcnJvcigoYyksIChlcnJvcikpCi0jZW5kaWYKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfU1RBVEVfSAotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwIGIvb3BlbmdsL2xpYmFnbC90ZXh0dXJlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MzZkZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL3RleHR1cmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1NiArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL3RleHR1cmUuY3BwCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJmcC5oIgotI2luY2x1ZGUgInN0YXRlLmgiCi0jaW5jbHVkZSAidGV4dHVyZS5oIgotI2luY2x1ZGUgIlRleHR1cmVPYmplY3RNYW5hZ2VyLmgiCi0KLSNpbmNsdWRlIDxFVEMxL2V0YzEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB2b2lkIGJpbmRUZXh0dXJlVG11KAotICAgIG9nbGVzX2NvbnRleHRfdCogYywgaW50IHRtdSwgR0x1aW50IHRleHR1cmUsIGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiB0ZXgpOwotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCBnZW5lcmF0ZU1pcG1hcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGxldmVsKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBJbml0Ci0jZW5kaWYKLQotdm9pZCBvZ2xlc19pbml0X3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGMtPnRleHR1cmVzLnBhY2tBbGlnbm1lbnQgICA9IDQ7Ci0gICAgYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50ID0gNDsKLQotICAgIC8vIGVhY2ggY29udGV4dCBoYXMgYSBkZWZhdWx0IG5hbWVkICgwKSB0ZXh0dXJlIChub3Qgc2hhcmVkKQotICAgIGMtPnRleHR1cmVzLmRlZmF1bHRUZXh0dXJlID0gbmV3IEVHTFRleHR1cmVPYmplY3QoKTsKLSAgICBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZS0+aW5jU3Ryb25nKGMpOwotCi0gICAgLy8gYmluZCB0aGUgZGVmYXVsdCB0ZXh0dXJlIHRvIGVhY2ggdGV4dHVyZSB1bml0Ci0gICAgZm9yIChpbnQgaT0wOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgYmluZFRleHR1cmVUbXUoYywgaSwgMCwgYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUpOwotICAgICAgICBtZW1zZXQoYy0+Y3VycmVudC50ZXh0dXJlW2ldLnYsIDAsIHNpemVvZih2ZWM0X3QpKTsKLSAgICAgICAgYy0+Y3VycmVudC50ZXh0dXJlW2ldLlEgPSAweDEwMDAwOwotICAgIH0KLX0KLQotdm9pZCBvZ2xlc191bmluaXRfdGV4dHVyZShvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgaWYgKGMtPnRleHR1cmVzLmdnbCkKLSAgICAgICAgZ2dsVW5pbml0KGMtPnRleHR1cmVzLmdnbCk7Ci0gICAgYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUtPmRlY1N0cm9uZyhjKTsKLSAgICBmb3IgKGludCBpPTA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoYy0+dGV4dHVyZXMudG11W2ldLnRleHR1cmUpCi0gICAgICAgICAgICBjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZS0+ZGVjU3Ryb25nKGMpOwotICAgIH0KLX0KLQotc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLXZvaWQgdmFsaWRhdGVfdG11KG9nbGVzX2NvbnRleHRfdCogYywgaW50IGkpCi17Ci0gICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W2ldKTsKLSAgICBpZiAodS5kaXJ0eSkgewotICAgICAgICB1LmRpcnR5ID0gMDsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGkpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmJpbmRUZXh0dXJlKGMsICYodS50ZXh0dXJlLT5zdXJmYWNlKSk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4R2VuaShjLCBHR0xfUywKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0dMX0FVVE9NQVRJQyk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4R2VuaShjLCBHR0xfVCwKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9HRU5fTU9ERSwgR0dMX0FVVE9NQVRJQyk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9XUkFQX1MsIHUudGV4dHVyZS0+d3JhcHMpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCi0gICAgICAgICAgICAgICAgR0dMX1RFWFRVUkVfV1JBUF9ULCB1LnRleHR1cmUtPndyYXB0KTsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhQYXJhbWV0ZXJpKGMsIEdHTF9URVhUVVJFXzJELAotICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01JTl9GSUxURVIsIHUudGV4dHVyZS0+bWluX2ZpbHRlcik7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9NQUdfRklMVEVSLCB1LnRleHR1cmUtPm1hZ19maWx0ZXIpOwotCi0gICAgICAgIC8vIGRpc2FibGUgdGhpcyB0ZXh0dXJlIHVuaXQgaWYgaXQncyBub3QgY29tcGxldGUKLSAgICAgICAgaWYgKCF1LnRleHR1cmUtPmlzQ29tcGxldGUoKSkgewotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5kaXNhYmxlKGMsIEdHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBvZ2xlc192YWxpZGF0ZV90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpCi0gICAgICAgICAgICB2YWxpZGF0ZV90bXUoYywgaSk7Ci0gICAgfQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOwotfQotCi1zdGF0aWMKLXZvaWQgaW52YWxpZGF0ZV90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYywgaW50IHRtdSwgdWludDhfdCBmbGFncyA9IDB4RkYpIHsKLSAgICBjLT50ZXh0dXJlcy50bXVbdG11XS5kaXJ0eSA9IGZsYWdzOwotfQotCi0vKgotICogSWYgdGhlIGFjdGl2ZSB0ZXh0dXJlcyBhcmUgRUdMSW1hZ2UsIHRoZXkgbmVlZCB0byBiZSBsb2NrZWQgYmVmb3JlCi0gKiB0aGV5IGNhbiBiZSB1c2VkLgotICoKLSAqIEZJWE1FOiBjb2RlIGJlbG93IGlzIGZhciBmcm9tIGJlaW5nIG9wdGltYWwKLSAqCi0gKi8KLQotdm9pZCBvZ2xlc19sb2NrX3RleHR1cmVzKG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgaWYgKGMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpIHsKLSAgICAgICAgICAgIHRleHR1cmVfdW5pdF90JiB1KGMtPnRleHR1cmVzLnRtdVtpXSk7Ci0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVfYnVmZmVyID0gdS50ZXh0dXJlLT5idWZmZXI7Ci0gICAgICAgICAgICBpZiAobmF0aXZlX2J1ZmZlcikgewotICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBpKTsKLSAgICAgICAgICAgICAgICBod19tb2R1bGVfdCBjb25zdCogcE1vZHVsZTsKLSAgICAgICAgICAgICAgICBpZiAoaHdfZ2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgJnBNb2R1bGUpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGdyYWxsb2NfbW9kdWxlX3QgY29uc3QqIG1vZHVsZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Z3JhbGxvY19tb2R1bGVfdCBjb25zdCo+KHBNb2R1bGUpOwotCi0gICAgICAgICAgICAgICAgdm9pZCogdmFkZHI7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IG1vZHVsZS0+bG9jayhtb2R1bGUsIG5hdGl2ZV9idWZmZXItPmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG5hdGl2ZV9idWZmZXItPndpZHRoLCBuYXRpdmVfYnVmZmVyLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdmFkZHIpOwotCi0gICAgICAgICAgICAgICAgdS50ZXh0dXJlLT5zZXRJbWFnZUJpdHModmFkZHIpOwotICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBvZ2xlc191bmxvY2tfdGV4dHVyZXMob2dsZXNfY29udGV4dF90KiBjKQotewotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoYy0+cmFzdGVyaXplci5zdGF0ZS50ZXh0dXJlW2ldLmVuYWJsZSkgewotICAgICAgICAgICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W2ldKTsKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIG5hdGl2ZV9idWZmZXIgPSB1LnRleHR1cmUtPmJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChuYXRpdmVfYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5hY3RpdmVUZXh0dXJlKGMsIGkpOwotICAgICAgICAgICAgICAgIGh3X21vZHVsZV90IGNvbnN0KiBwTW9kdWxlOwotICAgICAgICAgICAgICAgIGlmIChod19nZXRfbW9kdWxlKEdSQUxMT0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmcE1vZHVsZSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgZ3JhbGxvY19tb2R1bGVfdCBjb25zdCogbW9kdWxlID0KLSAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxncmFsbG9jX21vZHVsZV90IGNvbnN0Kj4ocE1vZHVsZSk7Ci0KLSAgICAgICAgICAgICAgICBtb2R1bGUtPnVubG9jayhtb2R1bGUsIG5hdGl2ZV9idWZmZXItPmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgdS50ZXh0dXJlLT5zZXRJbWFnZUJpdHMoTlVMTCk7Ci0gICAgICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5iaW5kVGV4dHVyZShjLCAmKHUudGV4dHVyZS0+c3VyZmFjZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBGb3JtYXQgY29udmVyc2lvbgotI2VuZGlmCi0KLXN0YXRpYyB1aW50MzJfdCBnbDJmb3JtYXRfdGFibGVbNl1bNF0gPSB7Ci0gICAgLy8gQllURSwgNTY1LCA0NDQ0LCA1NTUxCi0gICAgeyBHR0xfUElYRUxfRk9STUFUX0FfOCwKLSAgICAgIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBHTF9BTFBIQQotICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfODg4LAotICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LAotICAgICAgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMX1JHQgotICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsCi0gICAgICAwLAotICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQsCi0gICAgICBHR0xfUElYRUxfRk9STUFUX1JHQkFfNTU1MSB9LCAgICAgLy8gR0xfUkdCQQotICAgIHsgR0dMX1BJWEVMX0ZPUk1BVF9MXzgsCi0gICAgICAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0xfTFVNSU5BTkNFCi0gICAgeyBHR0xfUElYRUxfRk9STUFUX0xBXzg4LAotICAgICAgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdMX0xVTUlOQU5DRV9BTFBIQQotfTsKLQotc3RhdGljIGludDMyX3QgY29udmVydEdMUGl4ZWxGb3JtYXQoR0xpbnQgZm9ybWF0LCBHTGVudW0gdHlwZSkKLXsKLSAgICBpbnQzMl90IGZpID0gLTE7Ci0gICAgaW50MzJfdCB0aSA9IC0xOwotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgY2FzZSBHTF9BTFBIQTogICAgICAgICAgICAgIGZpID0gMDsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUkdCOiAgICAgICAgICAgICAgICBmaSA9IDE7ICAgICBicmVhazsKLSAgICBjYXNlIEdMX1JHQkE6ICAgICAgICAgICAgICAgZmkgPSAyOyAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9MVU1JTkFOQ0U6ICAgICAgICAgIGZpID0gMzsgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfTFVNSU5BTkNFX0FMUEhBOiAgICBmaSA9IDQ7ICAgICBicmVhazsKLSAgICB9Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOiAgICAgICAgICB0aSA9IDA7IGJyZWFrOwotICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6ICAgdGkgPSAxOyBicmVhazsKLSAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ6IHRpID0gMjsgYnJlYWs7Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOiB0aSA9IDM7IGJyZWFrOwotICAgIH0KLSAgICBpZiAoZmk9PS0xIHx8IHRpPT0tMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGdsMmZvcm1hdF90YWJsZVtmaV1bdGldOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBHTGVudW0gdmFsaWRGb3JtYXRUeXBlKG9nbGVzX2NvbnRleHRfdCogYywgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUpCi17Ci0gICAgR0xlbnVtIGVycm9yID0gMDsKLSAgICBpZiAoZm9ybWF0PEdMX0FMUEhBIHx8IGZvcm1hdD5HTF9MVU1JTkFOQ0VfQUxQSEEpIHsKLSAgICAgICAgZXJyb3IgPSBHTF9JTlZBTElEX0VOVU07Ci0gICAgfQotICAgIGlmICh0eXBlICE9IEdMX1VOU0lHTkVEX0JZVEUgJiYgdHlwZSAhPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80ICYmCi0gICAgICAgIHR5cGUgIT0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAmJiB0eXBlICE9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81KSB7Ci0gICAgICAgIGVycm9yID0gR0xfSU5WQUxJRF9FTlVNOwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAmJiBmb3JtYXQgIT0gR0xfUkdCKSB7Ci0gICAgICAgIGVycm9yID0gR0xfSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGlmICgodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80IHx8Ci0gICAgICAgICB0eXBlID09IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEpICAmJiBmb3JtYXQgIT0gR0xfUkdCQSkgewotICAgICAgICBlcnJvciA9IEdMX0lOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotR0dMQ29udGV4dCogZ2V0UmFzdGVyaXplcihvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgR0dMQ29udGV4dCogZ2dsID0gYy0+dGV4dHVyZXMuZ2dsOwotICAgIGlmIChnZ2xfdW5saWtlbHkoIWdnbCkpIHsKLSAgICAgICAgLy8gdGhpcyBpcyBxdWl0ZSBoZWF2eSB0aGUgZmlyc3QgdGltZS4uLgotICAgICAgICBnZ2xJbml0KCZnZ2wpOwotICAgICAgICBpZiAoIWdnbCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgR0dMZml4ZWQgY29sb3JzWzRdID0geyAwLCAwLCAwLCAweDEwMDAwIH07Ci0gICAgICAgIGMtPnRleHR1cmVzLmdnbCA9IGdnbDsKLSAgICAgICAgZ2dsLT5hY3RpdmVUZXh0dXJlKGdnbCwgMCk7Ci0gICAgICAgIGdnbC0+ZW5hYmxlKGdnbCwgR0dMX1RFWFRVUkVfMkQpOwotICAgICAgICBnZ2wtPnRleEVudmkoZ2dsLCBHR0xfVEVYVFVSRV9FTlYsIEdHTF9URVhUVVJFX0VOVl9NT0RFLCBHR0xfUkVQTEFDRSk7Ci0gICAgICAgIGdnbC0+ZGlzYWJsZShnZ2wsIEdHTF9ESVRIRVIpOwotICAgICAgICBnZ2wtPnNoYWRlTW9kZWwoZ2dsLCBHR0xfRkxBVCk7Ci0gICAgICAgIGdnbC0+Y29sb3I0eHYoZ2dsLCBjb2xvcnMpOwotICAgIH0KLSAgICByZXR1cm4gZ2dsOwotfQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotaW50IGNvcHlQaXhlbHMoCi0gICAgICAgIG9nbGVzX2NvbnRleHRfdCogYywKLSAgICAgICAgY29uc3QgR0dMU3VyZmFjZSYgZHN0LAotICAgICAgICBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LAotICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBzcmMsCi0gICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgdywgR0xzaXplaSBoKQotewotICAgIGlmICgoZHN0LmZvcm1hdCA9PSBzcmMuZm9ybWF0KSAmJgotICAgICAgICAoZHN0LnN0cmlkZSA9PSBzcmMuc3RyaWRlKSAmJgotICAgICAgICAoZHN0LndpZHRoID09IHNyYy53aWR0aCkgJiYKLSAgICAgICAgKGRzdC5oZWlnaHQgPT0gc3JjLmhlaWdodCkgJiYKLSAgICAgICAgKGRzdC5zdHJpZGUgPiAwKSAmJgotICAgICAgICAoKHh8eSkgPT0gMCkgJiYKLSAgICAgICAgKCh4b2Zmc2V0fHlvZmZzZXQpID09IDApKQotICAgIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGNvbW1vbiBjYXNlLi4uCi0gICAgICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW3NyYy5mb3JtYXRdKTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzcmMuaGVpZ2h0ICogc3JjLnN0cmlkZSAqIHBpeGVsRm9ybWF0LnNpemU7Ci0gICAgICAgIG1lbWNweShkc3QuZGF0YSwgc3JjLmRhdGEsIHNpemUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyB1c2UgcGl4ZWwtZmxpbmdlciB0byBoYW5kbGUgYWxsIHRoZSBjb252ZXJzaW9ucwotICAgIEdHTENvbnRleHQqIGdnbCA9IGdldFJhc3Rlcml6ZXIoYyk7Ci0gICAgaWYgKCFnZ2wpIHsKLSAgICAgICAgLy8gdGhlIG9ubHkgcmVhc29uIHRoaXMgd291bGQgZmFpbCBpcyBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgbWVtb3J5Ci0gICAgICAgIHJldHVybiBHTF9PVVRfT0ZfTUVNT1JZOwotICAgIH0KLQotICAgIGdnbC0+Y29sb3JCdWZmZXIoZ2dsLCAmZHN0KTsKLSAgICBnZ2wtPmJpbmRUZXh0dXJlKGdnbCwgJnNyYyk7Ci0gICAgZ2dsLT50ZXhDb29yZDJpKGdnbCwgeC14b2Zmc2V0LCB5LXlvZmZzZXQpOwotICAgIGdnbC0+cmVjdGkoZ2dsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4b2Zmc2V0K3csIHlvZmZzZXQraCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLXNwPEVHTFRleHR1cmVPYmplY3Q+IGdldEFuZEJpbmRBY3RpdmVUZXh0dXJlT2JqZWN0KG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXg7Ci0gICAgY29uc3QgaW50IGFjdGl2ZSA9IGMtPnRleHR1cmVzLmFjdGl2ZTsKLSAgICBjb25zdCBHTHVpbnQgbmFtZSA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLm5hbWU7Ci0KLSAgICAvLyBmcmVlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzbHkgYm91bmQgb2JqZWN0Ci0gICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W2FjdGl2ZV0pOwotICAgIGlmICh1LnRleHR1cmUpCi0gICAgICAgIHUudGV4dHVyZS0+ZGVjU3Ryb25nKGMpOwotCi0gICAgaWYgKG5hbWUgPT0gMCkgewotICAgICAgICAvLyAwIGlzIG91ciBsb2NhbCB0ZXh0dXJlIG9iamVjdCwgbm90IHNoYXJlZCB3aXRoIGFueW9uZS4KLSAgICAgICAgLy8gQnV0IGl0IGFmZmVjdHMgYWxsIGJvdW5kIFRNVXMgaW1tZWRpYXRlbHkuCi0gICAgICAgIC8vICh3ZSBuZWVkIHRvIGludmFsaWRhdGUgYWxsIHVuaXRzIGJvdW5kIHRvIHRoaXMgdGV4dHVyZSBvYmplY3QpCi0gICAgICAgIHRleCA9IGMtPnRleHR1cmVzLmRlZmF1bHRUZXh0dXJlOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPEdHTF9URVhUVVJFX1VOSVRfQ09VTlQgOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjLT50ZXh0dXJlcy50bXVbaV0udGV4dHVyZSA9PSB0ZXguZ2V0KCkpCi0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZV90ZXh0dXJlKGMsIGkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZ2V0IGEgbmV3IHRleHR1cmUgb2JqZWN0IGZvciB0aGF0IG5hbWUKLSAgICAgICAgdGV4ID0gYy0+c3VyZmFjZU1hbmFnZXItPnJlcGxhY2VUZXh0dXJlKG5hbWUpOwotICAgIH0KLQotICAgIC8vIGJpbmQgdGhpcyB0ZXh0dXJlIHRvIHRoZSBjdXJyZW50IGFjdGl2ZSB0ZXh0dXJlIHVuaXQKLSAgICAvLyBhbmQgYWRkIGEgcmVmZXJlbmNlIHRvIHRoaXMgdGV4dHVyZSBvYmplY3QKLSAgICB1LnRleHR1cmUgPSB0ZXguZ2V0KCk7Ci0gICAgdS50ZXh0dXJlLT5pbmNTdHJvbmcoYyk7Ci0gICAgdS5uYW1lID0gbmFtZTsKLSAgICBpbnZhbGlkYXRlX3RleHR1cmUoYywgYWN0aXZlKTsKLSAgICByZXR1cm4gdGV4OwotfQotCi12b2lkIGJpbmRUZXh0dXJlVG11KAotICAgIG9nbGVzX2NvbnRleHRfdCogYywgaW50IHRtdSwgR0x1aW50IHRleHR1cmUsIGNvbnN0IHNwPEVHTFRleHR1cmVPYmplY3Q+JiB0ZXgpCi17Ci0gICAgaWYgKHRleC5nZXQoKSA9PSBjLT50ZXh0dXJlcy50bXVbdG11XS50ZXh0dXJlKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBmcmVlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzbHkgYm91bmQgb2JqZWN0Ci0gICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W3RtdV0pOwotICAgIGlmICh1LnRleHR1cmUpCi0gICAgICAgIHUudGV4dHVyZS0+ZGVjU3Ryb25nKGMpOwotCi0gICAgLy8gYmluZCB0aGlzIHRleHR1cmUgdG8gdGhlIGN1cnJlbnQgYWN0aXZlIHRleHR1cmUgdW5pdAotICAgIC8vIGFuZCBhZGQgYSByZWZlcmVuY2UgdG8gdGhpcyB0ZXh0dXJlIG9iamVjdAotICAgIHUudGV4dHVyZSA9IHRleC5nZXQoKTsKLSAgICB1LnRleHR1cmUtPmluY1N0cm9uZyhjKTsKLSAgICB1Lm5hbWUgPSB0ZXh0dXJlOwotICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCB0bXUpOwotfQotCi1pbnQgY3JlYXRlVGV4dHVyZVN1cmZhY2Uob2dsZXNfY29udGV4dF90KiBjLAotICAgICAgICBHR0xTdXJmYWNlKiogb3V0U3VyZmFjZSwgaW50MzJfdCogb3V0U2l6ZSwgR0xpbnQgbGV2ZWwsCi0gICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwKLSAgICAgICAgR0xlbnVtIGNvbXByZXNzZWRGb3JtYXQgPSAwKQotewotICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRleHR1cmUgaXMgYm91bmQgdG8gdGhlIGN1cnJlbnQgdW5pdAotICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7Ci0gICAgY29uc3QgR0x1aW50IG5hbWUgPSBjLT50ZXh0dXJlcy50bXVbYWN0aXZlXS5uYW1lOwotCi0gICAgLy8gY29udmVydCB0aGUgcGl4ZWxmb3JtYXQgdG8gb25lIHdlIGNhbiBoYW5kbGUKLSAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7Ci0gICAgaWYgKGZvcm1hdElkeCA9PSAwKSB7IC8vIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMKLSAgICAgICAgcmV0dXJuIEdMX0lOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8vIGZpZ3VyZSBvdXQgdGhlIHNpemUgd2UgbmVlZCBhcyB3ZWxsIGFzIHRoZSBzdHJpZGUKLSAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tmb3JtYXRJZHhdKTsKLSAgICBjb25zdCBpbnQzMl90IGFsaWduID0gYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50LTE7Ci0gICAgY29uc3QgaW50MzJfdCBicHIgPSAoKHdpZHRoICogcGl4ZWxGb3JtYXQuc2l6ZSkgKyBhbGlnbikgJiB+YWxpZ247Ci0gICAgY29uc3Qgc2l6ZV90IHNpemUgPSBicHIgKiBoZWlnaHQ7Ci0gICAgY29uc3QgaW50MzJfdCBzdHJpZGUgPSBicHIgLyBwaXhlbEZvcm1hdC5zaXplOwotCi0gICAgaWYgKGxldmVsID4gMCkgewotICAgICAgICBjb25zdCBpbnQgYWN0aXZlID0gYy0+dGV4dHVyZXMuYWN0aXZlOwotICAgICAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXggPSBjLT50ZXh0dXJlcy50bXVbYWN0aXZlXS50ZXh0dXJlOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSB0ZXgtPnJlYWxsb2NhdGUobGV2ZWwsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBmb3JtYXRJZHgsIGNvbXByZXNzZWRGb3JtYXQsIGJwcik7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpCi0gICAgICAgICAgICByZXR1cm4gR0xfT1VUX09GX01FTU9SWTsKLSAgICAgICAgR0dMU3VyZmFjZSYgc3VyZmFjZSA9IHRleC0+ZWRpdE1pcChsZXZlbCk7Ci0gICAgICAgICpvdXRTdXJmYWNlID0gJnN1cmZhY2U7Ci0gICAgICAgICpvdXRTaXplID0gc2l6ZTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc3A8RUdMVGV4dHVyZU9iamVjdD4gdGV4ID0gZ2V0QW5kQmluZEFjdGl2ZVRleHR1cmVPYmplY3QoYyk7Ci0gICAgc3RhdHVzX3QgZXJyID0gdGV4LT5yZWFsbG9jYXRlKGxldmVsLAotICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBmb3JtYXRJZHgsIGNvbXByZXNzZWRGb3JtYXQsIGJwcik7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikKLSAgICAgICAgcmV0dXJuIEdMX09VVF9PRl9NRU1PUlk7Ci0KLSAgICB0ZXgtPmludGVybmFsZm9ybWF0ID0gZm9ybWF0OwotICAgICpvdXRTdXJmYWNlID0gJnRleC0+c3VyZmFjZTsKLSAgICAqb3V0U2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzaXplX3QgZGF0YVNpemVQYWxldHRlNChpbnQgbnVtTGV2ZWxzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQpCi17Ci0gICAgaW50IGluZGV4Qml0cyA9IDg7Ci0gICAgaW50IGVudHJ5U2l6ZSA9IDA7Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjhfT0VTOgotICAgICAgICBpbmRleEJpdHMgPSA0OwotICAgICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6Ci0gICAgICAgIGVudHJ5U2l6ZSA9IDM7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM6Ci0gICAgICAgIGluZGV4Qml0cyA9IDQ7Ci0gICAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6Ci0gICAgICAgIGVudHJ5U2l6ZSA9IDQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzoKLSAgICAgICAgaW5kZXhCaXRzID0gNDsKLSAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE0X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgotICAgICAgICBlbnRyeVNpemUgPSAyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzaXplX3Qgc2l6ZSA9ICgxIDw8IGluZGV4Qml0cykgKiBlbnRyeVNpemU7IC8vIHBhbGV0dGUgc2l6ZQotCi0gICAgZm9yIChpbnQgaT0wIDsgaTwgbnVtTGV2ZWxzIDsgaSsrKSB7Ci0gICAgICAgIGludCB3ID0gKHdpZHRoICA+PiBpKSA/IDogMTsKLSAgICAgICAgaW50IGggPSAoaGVpZ2h0ID4+IGkpID8gOiAxOwotICAgICAgICBpbnQgbGV2ZWxTaXplID0gaCAqICgodyAqIGluZGV4Qml0cykgLyA4KSA/IDogMTsKLSAgICAgICAgc2l6ZSArPSBsZXZlbFNpemU7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY29kZVBhbGV0dGU0KGNvbnN0IEdMdm9pZCAqZGF0YSwgaW50IGxldmVsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpzdXJmYWNlLCBpbnQgc3RyaWRlLCBpbnQgZm9ybWF0KQotCi17Ci0gICAgaW50IGluZGV4Qml0cyA9IDg7Ci0gICAgaW50IGVudHJ5U2l6ZSA9IDA7Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjhfT0VTOgotICAgICAgICBpbmRleEJpdHMgPSA0OwotICAgICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgR0xfUEFMRVRURThfUkdCOF9PRVM6Ci0gICAgICAgIGVudHJ5U2l6ZSA9IDM7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVM6Ci0gICAgICAgIGluZGV4Qml0cyA9IDQ7Ci0gICAgICAgIC8qIEZBTExUSFJPVUdIICovCi0gICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBOF9PRVM6Ci0gICAgICAgIGVudHJ5U2l6ZSA9IDQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUzoKLSAgICAgICAgaW5kZXhCaXRzID0gNDsKLSAgICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE0X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgotICAgICAgICBlbnRyeVNpemUgPSAyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjb25zdCBpbnQgcGFsZXR0ZVNpemUgPSAoMSA8PCBpbmRleEJpdHMpICogZW50cnlTaXplOwotCi0gICAgdWludDhfdCBjb25zdCogcGl4ZWxzID0gKHVpbnQ4X3QgKilkYXRhICsgcGFsZXR0ZVNpemU7Ci0gICAgZm9yIChpbnQgaT0wIDsgaTxsZXZlbCA7IGkrKykgewotICAgICAgICBpbnQgdyA9ICh3aWR0aCAgPj4gaSkgPyA6IDE7Ci0gICAgICAgIGludCBoID0gKGhlaWdodCA+PiBpKSA/IDogMTsKLSAgICAgICAgcGl4ZWxzICs9IGggKiAoKHcgKiBpbmRleEJpdHMpIC8gOCk7Ci0gICAgfQotICAgIHdpZHRoICA9ICh3aWR0aCAgPj4gbGV2ZWwpID8gOiAxOwotICAgIGhlaWdodCA9IChoZWlnaHQgPj4gbGV2ZWwpID8gOiAxOwotCi0gICAgaWYgKGVudHJ5U2l6ZSA9PSAyKSB7Ci0gICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKLSAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjI7Ci0gICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDIgKiAoKnBpeGVscysrKTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAyICogKHYgPj4gNCk7Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAyICogKHYgJiAweEYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVudHJ5U2l6ZSA9PSAzKSB7Ci0gICAgICAgIHVpbnQ4X3QgY29uc3QqIGNvbnN0IHBhbGV0dGUgPSAodWludDhfdCopZGF0YTsKLSAgICAgICAgZm9yIChpbnQgeT0wIDsgeTxoZWlnaHQgOyB5KyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHAgPSAodWludDhfdCopc3VyZmFjZSArIHkqc3RyaWRlKjM7Ci0gICAgICAgICAgICBpZiAoaW5kZXhCaXRzID09IDgpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDMgKiAoKnBpeGVscysrKTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaW50IHg9MCA7IHg8d2lkdGggOyB4Kz0yKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCB2ID0gKnBpeGVscysrOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAzICogKHYgPj4gNCk7Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4KzEgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAzICogKHYgJiAweEYpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAwXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChlbnRyeVNpemUgPT0gNCkgewotICAgICAgICB1aW50OF90IGNvbnN0KiBjb25zdCBwYWxldHRlID0gKHVpbnQ4X3QqKWRhdGE7Ci0gICAgICAgIGZvciAoaW50IHk9MCA7IHk8aGVpZ2h0IDsgeSsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBwID0gKHVpbnQ4X3QqKXN1cmZhY2UgKyB5KnN0cmlkZSo0OwotICAgICAgICAgICAgaWYgKGluZGV4Qml0cyA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDx3aWR0aCA7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSA0ICogKCpwaXhlbHMrKyk7Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMl07Ci0gICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4PTAgOyB4PHdpZHRoIDsgeCs9MikgewotICAgICAgICAgICAgICAgICAgICBpbnQgdiA9ICpwaXhlbHMrKzsKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gNCAqICh2ID4+IDQpOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDBdOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDJdOwotICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDNdOwotICAgICAgICAgICAgICAgICAgICBpZiAoeCsxIDwgd2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gNCAqICh2ICYgMHhGKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gcGFsZXR0ZVtpbmRleCArIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgKnArKyA9IHBhbGV0dGVbaW5kZXggKyAyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwKysgPSBwYWxldHRlW2luZGV4ICsgM107Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotCi1zdGF0aWMgX19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQotdm9pZCBzZXRfZGVwdGhfYW5kX2ZvZyhvZ2xlc19jb250ZXh0X3QqIGMsIEdHTGZpeGVkIHopCi17Ci0gICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICAvLyB3ZSBuZWVkIHRvIGNvbXB1dGUgWncKLSAgICBpbnQzMl90IGl0ZXJhdG9yc1szXTsKLSAgICBpdGVyYXRvcnNbMV0gPSBpdGVyYXRvcnNbMl0gPSAwOwotICAgIEdHTGZpeGVkIFp3OwotICAgIEdHTGZpeGVkIG4gPSBnZ2xGbG9hdFRvRml4ZWQoYy0+dHJhbnNmb3Jtcy52cHQuek5lYXIpOwotICAgIEdHTGZpeGVkIGYgPSBnZ2xGbG9hdFRvRml4ZWQoYy0+dHJhbnNmb3Jtcy52cHQuekZhcik7Ci0gICAgaWYgKHo8PTApICAgICAgICAgICAgICAgWncgPSBuOwotICAgIGVsc2UgaWYgKHo+PTB4MTAwMDApICAgIFp3ID0gZjsKLSAgICBlbHNlICAgICAgICAgICAgWncgPSBnZ2xNdWxBZGR4KHosIChmLW4pLCBuKTsKLSAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSB7Ci0gICAgICAgIC8vIHNldCB1cCBmb2cgaWYgbmVlZGVkLi4uCi0gICAgICAgIGl0ZXJhdG9yc1swXSA9IGMtPmZvZy5mb2coYywgWncpOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmZvZ0dyYWQzeHYoYywgaXRlcmF0b3JzKTsKLSAgICB9Ci0gICAgaWYgKGVuYWJsZXMgJiBHR0xfRU5BQkxFX0RFUFRIX1RFU1QpIHsKLSAgICAgICAgLy8gc2V0IHVwIHotdGVzdCBpZiBuZWVkZWQuLi4KLSAgICAgICAgaW50MzJfdCB6ID0gKFp3ICYgfihadz4+MzEpKTsKLSAgICAgICAgaWYgKHogPj0gMHgxMDAwMCkKLSAgICAgICAgICAgIHogPSAweEZGRkY7Ci0gICAgICAgIGl0ZXJhdG9yc1swXSA9ICh6IDw8IDE2KSB8IHo7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuekdyYWQzeHYoYywgaXRlcmF0b3JzKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI3ByYWdtYSBtYXJrIEdlbmVyYXRlIG1pbWFwcwotI2VuZGlmCi0KLWV4dGVybiBzdGF0dXNfdCBidWlsZEFQeXJhbWlkKG9nbGVzX2NvbnRleHRfdCogYywgRUdMVGV4dHVyZU9iamVjdCogdGV4KTsKLQotdm9pZCBnZW5lcmF0ZU1pcG1hcChvZ2xlc19jb250ZXh0X3QqIGMsIEdMaW50IGxldmVsKQotewotICAgIGlmIChsZXZlbCA9PSAwKSB7Ci0gICAgICAgIGNvbnN0IGludCBhY3RpdmUgPSBjLT50ZXh0dXJlcy5hY3RpdmU7Ci0gICAgICAgIEVHTFRleHR1cmVPYmplY3QqIHRleCA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLnRleHR1cmU7Ci0gICAgICAgIGlmICh0ZXgtPmdlbmVyYXRlX21pcG1hcCkgewotICAgICAgICAgICAgaWYgKGJ1aWxkQVB5cmFtaWQoYywgdGV4KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX09VVF9PRl9NRU1PUlkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZCB0ZXhQYXJhbWV0ZXJ4KAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0sIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQgJiYgdGFyZ2V0ICE9IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXh0dXJlT2JqZWN0ID0gYy0+dGV4dHVyZXMudG11W2MtPnRleHR1cmVzLmFjdGl2ZV0udGV4dHVyZTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBHTF9URVhUVVJFX1dSQVBfUzoKLSAgICAgICAgaWYgKChwYXJhbSA9PSBHTF9SRVBFQVQpIHx8Ci0gICAgICAgICAgICAocGFyYW0gPT0gR0xfQ0xBTVBfVE9fRURHRSkpIHsKLSAgICAgICAgICAgIHRleHR1cmVPYmplY3QtPndyYXBzID0gcGFyYW07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnb3RvIGludmFsaWRfZW51bTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1RFWFRVUkVfV1JBUF9UOgotICAgICAgICBpZiAoKHBhcmFtID09IEdMX1JFUEVBVCkgfHwKLSAgICAgICAgICAgIChwYXJhbSA9PSBHTF9DTEFNUF9UT19FREdFKSkgewotICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+d3JhcHQgPSBwYXJhbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRV9NSU5fRklMVEVSOgotICAgICAgICBpZiAoKHBhcmFtID09IEdMX05FQVJFU1QpIHx8Ci0gICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSKSB8fAotICAgICAgICAgICAgKHBhcmFtID09IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QpIHx8Ci0gICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSX01JUE1BUF9ORUFSRVNUKSB8fAotICAgICAgICAgICAgKHBhcmFtID09IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUikgfHwKLSAgICAgICAgICAgIChwYXJhbSA9PSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUikpIHsKLSAgICAgICAgICAgIHRleHR1cmVPYmplY3QtPm1pbl9maWx0ZXIgPSBwYXJhbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdvdG8gaW52YWxpZF9lbnVtOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfVEVYVFVSRV9NQUdfRklMVEVSOgotICAgICAgICBpZiAoKHBhcmFtID09IEdMX05FQVJFU1QpIHx8Ci0gICAgICAgICAgICAocGFyYW0gPT0gR0xfTElORUFSKSkgewotICAgICAgICAgICAgdGV4dHVyZU9iamVjdC0+bWFnX2ZpbHRlciA9IHBhcmFtOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ290byBpbnZhbGlkX2VudW07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9HRU5FUkFURV9NSVBNQVA6Ci0gICAgICAgIHRleHR1cmVPYmplY3QtPmdlbmVyYXRlX21pcG1hcCA9IHBhcmFtOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotaW52YWxpZF9lbnVtOgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludmFsaWRhdGVfdGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOwotfQotCi0KLQotc3RhdGljIHZvaWQgZHJhd1RleHhPRVNJbXAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3LCBHTGZpeGVkIGgsCi0gICAgICAgIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBvZ2xlc19sb2NrX3RleHR1cmVzKGMpOwotCi0gICAgY29uc3QgR0dMU3VyZmFjZSYgY2JTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLmNvbG9yLnM7Ci0gICAgeSA9IGdnbEludFRvRml4ZWQoY2JTdXJmYWNlLmhlaWdodCkgLSAoeSArIGgpOwotICAgIHcgPj49IEZJWEVEX0JJVFM7Ci0gICAgaCA+Pj0gRklYRURfQklUUzsKLQotICAgIC8vIHNldCB1cCBhbGwgdGV4dHVyZSB1bml0cwotICAgIGZvciAoaW50IGk9MCA7IGk8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IGkrKykgewotICAgICAgICBpZiAoIWMtPnJhc3Rlcml6ZXIuc3RhdGUudGV4dHVyZVtpXS5lbmFibGUpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpbnQzMl90IHRleGNvb3Jkc1s4XTsKLSAgICAgICAgdGV4dHVyZV91bml0X3QmIHUoYy0+dGV4dHVyZXMudG11W2ldKTsKLQotICAgICAgICAvLyB2YWxpZGF0ZSB0aGlzIHRtdSAoYmluZCwgd3JhcCwgZmlsdGVyKQotICAgICAgICB2YWxpZGF0ZV90bXUoYywgaSk7Ci0gICAgICAgIC8vIHdlIENMQU1QIGhlcmUsIHdoaWNoIHdvcmtzIHdpdGggcHJlbXVsdGlwbGllZCAocyx0KQotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV8yRCwgR0dMX1RFWFRVUkVfV1JBUF9TLCBHR0xfQ0xBTVApOwotICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywKLSAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV8yRCwgR0dMX1RFWFRVUkVfV1JBUF9ULCBHR0xfQ0xBTVApOwotICAgICAgICB1LmRpcnR5ID0gMHhGRjsgLy8gWFhYOiBzaG91bGQgYmUgbW9yZSBzdWJ0bGUKLQotICAgICAgICBFR0xUZXh0dXJlT2JqZWN0KiB0ZXh0dXJlT2JqZWN0ID0gdS50ZXh0dXJlOwotICAgICAgICBjb25zdCBHTGludCBVY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbMF0gPDwgMTY7Ci0gICAgICAgIGNvbnN0IEdMaW50IFZjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsxXSA8PCAxNjsKLSAgICAgICAgY29uc3QgR0xpbnQgV2NyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzJdIDw8IDE2OwotICAgICAgICBjb25zdCBHTGludCBIY3IgPSB0ZXh0dXJlT2JqZWN0LT5jcm9wX3JlY3RbM10gPDwgMTY7Ci0KLSAgICAgICAgLy8gY29tcHV0ZXMgdGV4dHVyZSBjb29yZGluYXRlcyAocHJlLW11bHRpcGxpZWQpCi0gICAgICAgIGludDMyX3QgZHNkeCA9IFdjciAvIHc7ICAgLy8gZHNkeCA9ICAoKFdjci93KS9XdCkqV3QKLSAgICAgICAgaW50MzJfdCBkdGR5ID0tSGNyIC8gaDsgICAvLyBkdGR5ID0gLSgoSGNyL2gpL0h0KSpIdAotICAgICAgICBpbnQzMl90IHMwICAgPSBVY3IgICAgICAgLSBnZ2xNdWx4KGRzZHgsIHgpOyAvLyBzMCA9IFVjciAtIHggKiBkc2R4Ci0gICAgICAgIGludDMyX3QgdDAgICA9IChWY3IrSGNyKSAtIGdnbE11bHgoZHRkeSwgeSk7IC8vIHQwID0gKFZjcitIY3IpIC0geSpkdGR5Ci0gICAgICAgIHRleGNvb3Jkc1swXSA9IHMwOwotICAgICAgICB0ZXhjb29yZHNbMV0gPSBkc2R4OwotICAgICAgICB0ZXhjb29yZHNbMl0gPSAwOwotICAgICAgICB0ZXhjb29yZHNbM10gPSB0MDsKLSAgICAgICAgdGV4Y29vcmRzWzRdID0gMDsKLSAgICAgICAgdGV4Y29vcmRzWzVdID0gZHRkeTsKLSAgICAgICAgdGV4Y29vcmRzWzZdID0gMDsKLSAgICAgICAgdGV4Y29vcmRzWzddID0gMDsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhDb29yZEdyYWRTY2FsZTh4dihjLCBpLCB0ZXhjb29yZHMpOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQzMl90IGVuYWJsZXMgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZXM7Ci0gICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgKEdHTF9FTkFCTEVfREVQVEhfVEVTVHxHR0xfRU5BQkxFX0ZPRykpKQotICAgICAgICBzZXRfZGVwdGhfYW5kX2ZvZyhjLCB6KTsKLQotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuY29sb3I0eHYoYywgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC52KTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLmRpc2FibGUoYywgR0dMX1dfTEVSUCk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5kaXNhYmxlKGMsIEdHTF9BQSk7Ci0gICAgYy0+cmFzdGVyaXplci5wcm9jcy5zaGFkZU1vZGVsKGMsIEdMX0ZMQVQpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MucmVjdGkoYywKLSAgICAgICAgICAgIGdnbEZpeGVkVG9JbnRSb3VuZCh4KSwKLSAgICAgICAgICAgIGdnbEZpeGVkVG9JbnRSb3VuZCh5KSwKLSAgICAgICAgICAgIGdnbEZpeGVkVG9JbnRSb3VuZCh4KSt3LAotICAgICAgICAgICAgZ2dsRml4ZWRUb0ludFJvdW5kKHkpK2gpOwotCi0gICAgb2dsZXNfdW5sb2NrX3RleHR1cmVzKGMpOwotfQotCi1zdGF0aWMgdm9pZCBkcmF3VGV4eE9FUyhHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHcsIEdMZml4ZWQgaCwKLSAgICAgICAgb2dsZXNfY29udGV4dF90KiBjKQotewotICAgIC8vIHF1aWNrbHkgcmVqZWN0IGVtcHR5IHJlY3RzCi0gICAgaWYgKCh3fGgpIDw9IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIGRyYXdUZXh4T0VTSW1wKHgsIHksIHosIHcsIGgsIGMpOwotfQotCi1zdGF0aWMgdm9pZCBkcmF3VGV4aU9FUyhHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3LCBHTGludCBoLCBvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci0gICAgLy8gQWxsIGNvb3JkaW5hdGVzIGFyZSBpbnRlZ2VyLCBzbyBpZiB3ZSBoYXZlIG9ubHkgb25lCi0gICAgLy8gdGV4dHVyZSB1bml0IGFjdGl2ZSBhbmQgbm8gc2NhbGluZyBpcyByZXF1aXJlZAotICAgIC8vIFRIRU4sIHdlIGNhbiB1c2Ugb3VyIHNwZWNpYWwgMToxIG1hcHBpbmcKLSAgICAvLyB3aGljaCBpcyBhIGxvdCBmYXN0ZXIuCi0KLSAgICBpZiAoZ2dsX2xpa2VseShjLT5yYXN0ZXJpemVyLnN0YXRlLmVuYWJsZWRfdG11ID09IDEpKSB7Ci0gICAgICAgIGNvbnN0IGludCB0bXUgPSAwOwotICAgICAgICB0ZXh0dXJlX3VuaXRfdCYgdShjLT50ZXh0dXJlcy50bXVbdG11XSk7Ci0gICAgICAgIEVHTFRleHR1cmVPYmplY3QqIHRleHR1cmVPYmplY3QgPSB1LnRleHR1cmU7Ci0gICAgICAgIGNvbnN0IEdMaW50IFdjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsyXTsKLSAgICAgICAgY29uc3QgR0xpbnQgSGNyID0gdGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0WzNdOwotCi0gICAgICAgIGlmICgodyA9PSBXY3IpICYmIChoID09IC1IY3IpKSB7Ci0gICAgICAgICAgICBpZiAoKHd8aCkgPD0gMCkgcmV0dXJuOyAvLyBxdWlja2x5IHJlamVjdCBlbXB0eSByZWN0cwotCi0gICAgICAgICAgICBpZiAodS5kaXJ0eSkgewotICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCB0bXUpOwotICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYmluZFRleHR1cmUoYywgJih1LnRleHR1cmUtPnN1cmZhY2UpKTsKLSAgICAgICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleFBhcmFtZXRlcmkoYywgR0dMX1RFWFRVUkVfMkQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHR0xfVEVYVFVSRV9NSU5fRklMVEVSLCB1LnRleHR1cmUtPm1pbl9maWx0ZXIpOwotICAgICAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4UGFyYW1ldGVyaShjLCBHR0xfVEVYVFVSRV8yRCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX01BR19GSUxURVIsIHUudGV4dHVyZS0+bWFnX2ZpbHRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEdlbmkoYywgR0dMX1MsCi0gICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfT05FX1RPX09ORSk7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEdlbmkoYywgR0dMX1QsCi0gICAgICAgICAgICAgICAgICAgIEdHTF9URVhUVVJFX0dFTl9NT0RFLCBHR0xfT05FX1RPX09ORSk7Ci0gICAgICAgICAgICB1LmRpcnR5ID0gMHhGRjsgLy8gWFhYOiBzaG91bGQgYmUgbW9yZSBzdWJ0bGUKLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOwotCi0gICAgICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBjYlN1cmZhY2UgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuczsKLSAgICAgICAgICAgIHkgPSBjYlN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoKTsKLSAgICAgICAgICAgIGNvbnN0IEdMaW50IFVjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFswXTsKLSAgICAgICAgICAgIGNvbnN0IEdMaW50IFZjciA9IHRleHR1cmVPYmplY3QtPmNyb3BfcmVjdFsxXTsKLSAgICAgICAgICAgIGNvbnN0IEdMaW50IHMwICA9IFVjciAtIHg7Ci0gICAgICAgICAgICBjb25zdCBHTGludCB0MCAgPSAoVmNyICsgSGNyKSAtIHk7Ci0KLSAgICAgICAgICAgIGNvbnN0IEdMdWludCB0dyA9IHRleHR1cmVPYmplY3QtPnN1cmZhY2Uud2lkdGg7Ci0gICAgICAgICAgICBjb25zdCBHTHVpbnQgdGggPSB0ZXh0dXJlT2JqZWN0LT5zdXJmYWNlLmhlaWdodDsKLSAgICAgICAgICAgIGlmICgodWludDMyX3QoczAreCt3KSA+IHR3KSB8fCAodWludDMyX3QodDAreStoKSA+IHRoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBHTCBzcGVjIGlzIHVuY2xlYXIgYWJvdXQgd2hhdCBzaG91bGQgaGFwcGVuCi0gICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlLCBzbyB3ZSBqdXN0IHVzZSB0aGUgc2xvdyBjYXNlLCB3aGljaAotICAgICAgICAgICAgICAgIC8vIGF0IGxlYXN0IHdvbid0IGNyYXNoCi0gICAgICAgICAgICAgICAgZ290byBzbG93X2Nhc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9nbGVzX2xvY2tfdGV4dHVyZXMoYyk7Ci0KLSAgICAgICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4Q29vcmQyaShjLCBzMCwgdDApOwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZW5hYmxlcyA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuZW5hYmxlczsKLSAgICAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkoZW5hYmxlcyAmIChHR0xfRU5BQkxFX0RFUFRIX1RFU1R8R0dMX0VOQUJMRV9GT0cpKSkKLSAgICAgICAgICAgICAgICBzZXRfZGVwdGhfYW5kX2ZvZyhjLCBnZ2xJbnRUb0ZpeGVkKHopKTsKLQotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5jb2xvcjR4dihjLCBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnYpOwotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5kaXNhYmxlKGMsIEdHTF9XX0xFUlApOwotICAgICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy5kaXNhYmxlKGMsIEdHTF9BQSk7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnNoYWRlTW9kZWwoYywgR0xfRkxBVCk7Ci0gICAgICAgICAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnJlY3RpKGMsIHgsIHksIHgrdywgeStoKTsKLQotICAgICAgICAgICAgb2dsZXNfdW5sb2NrX3RleHR1cmVzKGMpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLXNsb3dfY2FzZToKLSAgICBkcmF3VGV4eE9FU0ltcCgKLSAgICAgICAgICAgIGdnbEludFRvRml4ZWQoeCksIGdnbEludFRvRml4ZWQoeSksIGdnbEludFRvRml4ZWQoeiksCi0gICAgICAgICAgICBnZ2xJbnRUb0ZpeGVkKHcpLCBnZ2xJbnRUb0ZpeGVkKGgpLAotICAgICAgICAgICAgYyk7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgVGV4dHVyZSBBUEkKLSNlbmRpZgotCi12b2lkIGdsQWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh1aW50MzJfdCh0ZXh0dXJlLUdMX1RFWFRVUkUwKSA+IHVpbnQzMl90KEdHTF9URVhUVVJFX1VOSVRfQ09VTlQpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYy0+dGV4dHVyZXMuYWN0aXZlID0gdGV4dHVyZSAtIEdMX1RFWFRVUkUwOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MuYWN0aXZlVGV4dHVyZShjLCBjLT50ZXh0dXJlcy5hY3RpdmUpOwotfQotCi12b2lkIGdsQmluZFRleHR1cmUoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQgJiYgdGFyZ2V0ICE9IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBCaW5kIG9yIGNyZWF0ZSBhIHRleHR1cmUKLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXg7Ci0gICAgaWYgKHRleHR1cmUgPT0gMCkgewotICAgICAgICAvLyAwIGlzIG91ciBsb2NhbCB0ZXh0dXJlIG9iamVjdAotICAgICAgICB0ZXggPSBjLT50ZXh0dXJlcy5kZWZhdWx0VGV4dHVyZTsKLSAgICB9IGVsc2UgewotICAgICAgICB0ZXggPSBjLT5zdXJmYWNlTWFuYWdlci0+dGV4dHVyZSh0ZXh0dXJlKTsKLSAgICAgICAgaWYgKGdnbF91bmxpa2VseSh0ZXggPT0gMCkpIHsKLSAgICAgICAgICAgIHRleCA9IGMtPnN1cmZhY2VNYW5hZ2VyLT5jcmVhdGVUZXh0dXJlKHRleHR1cmUpOwotICAgICAgICAgICAgaWYgKHRleCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfT1VUX09GX01FTU9SWSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGJpbmRUZXh0dXJlVG11KGMsIGMtPnRleHR1cmVzLmFjdGl2ZSwgdGV4dHVyZSwgdGV4KTsKLX0KLQotdm9pZCBnbEdlblRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmIChuPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gZ2VuZXJhdGUgdW5pcXVlIChzaGFyZWQpIHRleHR1cmUgbmFtZXMKLSAgICBjLT5zdXJmYWNlTWFuYWdlci0+Z2V0VG9rZW4obiwgdGV4dHVyZXMpOwotfQotCi12b2lkIGdsRGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKG48MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIElmIGRlbGV0aW5nIGEgYm91bmQgdGV4dHVyZSwgYmluZCB0aGlzIHVuaXQgdG8gMAotICAgIGZvciAoaW50IHQ9MCA7IHQ8R0dMX1RFWFRVUkVfVU5JVF9DT1VOVCA7IHQrKykgewotICAgICAgICBpZiAoYy0+dGV4dHVyZXMudG11W3RdLm5hbWUgPT0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPG4gOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0ZXh0dXJlc1tpXSAmJiAodGV4dHVyZXNbaV0gPT0gYy0+dGV4dHVyZXMudG11W3RdLm5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYmluZCB0aGlzIHRtdSB0byB0ZXh0dXJlIDAKLSAgICAgICAgICAgICAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXgoYy0+dGV4dHVyZXMuZGVmYXVsdFRleHR1cmUpOwotICAgICAgICAgICAgICAgIGJpbmRUZXh0dXJlVG11KGMsIHQsIDAsIHRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYy0+c3VyZmFjZU1hbmFnZXItPmRlbGV0ZVRleHR1cmVzKG4sIHRleHR1cmVzKTsKLSAgICBjLT5zdXJmYWNlTWFuYWdlci0+cmVjeWNsZVRva2VucyhuLCB0ZXh0dXJlcyk7Ci19Ci0KLXZvaWQgZ2xNdWx0aVRleENvb3JkNGYoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh1aW50MzJfdCh0YXJnZXQtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb25zdCBpbnQgdG11ID0gdGFyZ2V0LUdMX1RFWFRVUkUwOwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlMgPSBnZ2xGbG9hdFRvRml4ZWQocyk7Ci0gICAgYy0+Y3VycmVudC50ZXh0dXJlW3RtdV0uVCA9IGdnbEZsb2F0VG9GaXhlZCh0KTsKLSAgICBjLT5jdXJyZW50LnRleHR1cmVbdG11XS5SID0gZ2dsRmxvYXRUb0ZpeGVkKHIpOwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlEgPSBnZ2xGbG9hdFRvRml4ZWQocSk7Ci19Ci0KLXZvaWQgZ2xNdWx0aVRleENvb3JkNHgoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh1aW50MzJfdCh0YXJnZXQtR0xfVEVYVFVSRTApID4gdWludDMyX3QoR0dMX1RFWFRVUkVfVU5JVF9DT1VOVCkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjb25zdCBpbnQgdG11ID0gdGFyZ2V0LUdMX1RFWFRVUkUwOwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlMgPSBzOwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlQgPSB0OwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlIgPSByOwotICAgIGMtPmN1cnJlbnQudGV4dHVyZVt0bXVdLlEgPSBxOwotfQotCi12b2lkIGdsUGl4ZWxTdG9yZWkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICgocG5hbWUgIT0gR0xfUEFDS19BTElHTk1FTlQpICYmIChwbmFtZSAhPSBHTF9VTlBBQ0tfQUxJR05NRU5UKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICgocGFyYW08PTAgfHwgcGFyYW0+OCkgfHwgKHBhcmFtICYgKHBhcmFtLTEpKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocG5hbWUgPT0gR0xfUEFDS19BTElHTk1FTlQpCi0gICAgICAgIGMtPnRleHR1cmVzLnBhY2tBbGlnbm1lbnQgPSBwYXJhbTsKLSAgICBpZiAocG5hbWUgPT0gR0xfVU5QQUNLX0FMSUdOTUVOVCkKLSAgICAgICAgYy0+dGV4dHVyZXMudW5wYWNrQWxpZ25tZW50ID0gcGFyYW07Ci19Ci0KLXZvaWQgZ2xUZXhFbnZmKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4RW52aShjLCB0YXJnZXQsIHBuYW1lLCBHTGludChwYXJhbSkpOwotfQotCi12b2lkIGdsVGV4RW52ZnYoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHBuYW1lID09IEdMX1RFWFRVUkVfRU5WX01PREUpIHsKLSAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy50ZXhFbnZpKGMsIHRhcmdldCwgcG5hbWUsIEdMaW50KCpwYXJhbXMpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocG5hbWUgPT0gR0xfVEVYVFVSRV9FTlZfQ09MT1IpIHsKLSAgICAgICAgR0dMZml4ZWQgZml4ZWRbNF07Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8NCA7IGkrKykKLSAgICAgICAgICAgIGZpeGVkW2ldID0gZ2dsRmxvYXRUb0ZpeGVkKHBhcmFtc1tpXSk7Ci0gICAgICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4RW52eHYoYywgdGFyZ2V0LCBwbmFtZSwgZml4ZWQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci19Ci0KLXZvaWQgZ2xUZXhFbnZ4KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPnJhc3Rlcml6ZXIucHJvY3MudGV4RW52aShjLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci0KLXZvaWQgZ2xUZXhFbnZ4digKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBjLT5yYXN0ZXJpemVyLnByb2NzLnRleEVudnh2KGMsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpdigKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCogcGFyYW1zKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEICYmIHRhcmdldCAhPSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUykgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRUdMVGV4dHVyZU9iamVjdCogdGV4dHVyZU9iamVjdCA9IGMtPnRleHR1cmVzLnRtdVtjLT50ZXh0dXJlcy5hY3RpdmVdLnRleHR1cmU7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNhc2UgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTOgotICAgICAgICBtZW1jcHkodGV4dHVyZU9iamVjdC0+Y3JvcF9yZWN0LCBwYXJhbXMsIDQqc2l6ZW9mKEdMaW50KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRleFBhcmFtZXRlcngodGFyZ2V0LCBwbmFtZSwgR0xmaXhlZChwYXJhbXNbMF0pLCBjKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotdm9pZCBnbFRleFBhcmFtZXRlcmYoCi0gICAgICAgIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIHRleFBhcmFtZXRlcngodGFyZ2V0LCBwbmFtZSwgR0xmaXhlZChwYXJhbSksIGMpOwotfQotCi12b2lkIGdsVGV4UGFyYW1ldGVyeCgKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgdGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBwYXJhbSwgYyk7Ci19Ci0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgdGV4UGFyYW1ldGVyeCh0YXJnZXQsIHBuYW1lLCBHTGZpeGVkKHBhcmFtKSwgYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZiAwCi0jcHJhZ21hIG1hcmsgLQotI2VuZGlmCi0KLXZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCgKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKLSAgICAgICAgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwKLSAgICAgICAgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGJvcmRlciE9MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vICJ1bmNvbXByZXNzIiB0aGUgdGV4dHVyZSBzaW5jZSBwaXhlbGZsaW5nZXIgZG9lc24ndCBzdXBwb3J0Ci0gICAgLy8gYW55IGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgbmF0aXZlbHkuCi0gICAgR0xlbnVtIGZvcm1hdDsKLSAgICBHTGVudW0gdHlwZTsKLSAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7Ci0gICAgY2FzZSBHTF9QQUxFVFRFOF9SR0I4X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQjhfT0VTOgotICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQjsKLSAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9CWVRFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQkE4X09FUzoKLSAgICBjYXNlIEdMX1BBTEVUVEU0X1JHQkE4X09FUzoKLSAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0JBOwotICAgICAgICB0eXBlICAgICAgICA9IEdMX1VOU0lHTkVEX0JZVEU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTOgotICAgICAgICBmb3JtYXQgICAgICA9IEdMX1JHQjsKLSAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVM6Ci0gICAgY2FzZSBHTF9QQUxFVFRFNF9SR0JBNF9PRVM6Ci0gICAgICAgIGZvcm1hdCAgICAgID0gR0xfUkdCQTsKLSAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTOgotICAgIGNhc2UgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVM6Ci0gICAgICAgIGZvcm1hdCAgICAgID0gR0xfUkdCQTsKLSAgICAgICAgdHlwZSAgICAgICAgPSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xOwotICAgICAgICBicmVhazsKLSNpZmRlZiBHTF9PRVNfY29tcHJlc3NlZF9FVEMxX1JHQjhfdGV4dHVyZQotICAgIGNhc2UgR0xfRVRDMV9SR0I4X09FUzoKLSAgICAgICAgZm9ybWF0ICAgICAgPSBHTF9SR0I7Ci0gICAgICAgIHR5cGUgICAgICAgID0gR0xfVU5TSUdORURfQllURTsKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFkYXRhIHx8ICF3aWR0aCB8fCAhaGVpZ2h0KSB7Ci0gICAgICAgIC8vIHVuY2xlYXIgaWYgdGhpcyBpcyBhbiBlcnJvciBvciBub3QuLi4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDMyX3Qgc2l6ZTsKLSAgICBHR0xTdXJmYWNlKiBzdXJmYWNlOwotCi0jaWZkZWYgR0xfT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUKLSAgICBpZiAoaW50ZXJuYWxmb3JtYXQgPT0gR0xfRVRDMV9SR0I4X09FUykgewotICAgICAgICBHTHNpemVpIGNvbXByZXNzZWRTaXplID0gZXRjMV9nZXRfZW5jb2RlZF9kYXRhX3NpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChjb21wcmVzc2VkU2l6ZSA+IGltYWdlU2l6ZSkgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGVycm9yID0gY3JlYXRlVGV4dHVyZVN1cmZhY2UoYywgJnN1cmZhY2UsICZzaXplLAotICAgICAgICAgICAgICAgIGxldmVsLCBmb3JtYXQsIHR5cGUsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycm9yKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXRjMV9kZWNvZGVfaW1hZ2UoCi0gICAgICAgICAgICAgICAgKGNvbnN0IGV0YzFfYnl0ZSopZGF0YSwKLSAgICAgICAgICAgICAgICAoZXRjMV9ieXRlKilzdXJmYWNlLT5kYXRhLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIDMsIHN1cmZhY2UtPnN0cmlkZSozKSAhPSAwKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gYWxsIG1pcG1hcCBsZXZlbHMgYXJlIHNwZWNpZmllZCBhdCBvbmNlLgotICAgIGNvbnN0IGludCBudW1MZXZlbHMgPSBsZXZlbDwwID8gLWxldmVsIDogMTsKLQotICAgIGlmIChkYXRhU2l6ZVBhbGV0dGU0KG51bUxldmVscywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KSA+IGltYWdlU2l6ZSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoaW50IGk9MCA7IGk8bnVtTGV2ZWxzIDsgaSsrKSB7Ci0gICAgICAgIGludCBsb2RfdyA9ICh3aWR0aCAgPj4gaSkgPyA6IDE7Ci0gICAgICAgIGludCBsb2RfaCA9IChoZWlnaHQgPj4gaSkgPyA6IDE7Ci0gICAgICAgIGludCBlcnJvciA9IGNyZWF0ZVRleHR1cmVTdXJmYWNlKGMsICZzdXJmYWNlLCAmc2l6ZSwKLSAgICAgICAgICAgICAgICBpLCBmb3JtYXQsIHR5cGUsIGxvZF93LCBsb2RfaCk7Ci0gICAgICAgIGlmIChlcnJvcikgewotICAgICAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGRlY29kZVBhbGV0dGU0KGRhdGEsIGksIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgc3VyZmFjZS0+ZGF0YSwgc3VyZmFjZS0+c3RyaWRlLCBpbnRlcm5hbGZvcm1hdCk7Ci0gICAgfQotfQotCi0KLXZvaWQgZ2xUZXhJbWFnZTJEKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsCi0gICAgICAgIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsCi0gICAgICAgIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGJvcmRlciE9MCB8fCBsZXZlbCA8IDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdCAhPSAoR0xlbnVtKWludGVybmFsZm9ybWF0KSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAodmFsaWRGb3JtYXRUeXBlKGMsIGZvcm1hdCwgdHlwZSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDMyX3Qgc2l6ZSA9IDA7Ci0gICAgR0dMU3VyZmFjZSogc3VyZmFjZSA9IDA7Ci0gICAgaW50IGVycm9yID0gY3JlYXRlVGV4dHVyZVN1cmZhY2UoYywgJnN1cmZhY2UsICZzaXplLAotICAgICAgICAgICAgbGV2ZWwsIGZvcm1hdCwgdHlwZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIGVycm9yKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwaXhlbHMpIHsKLSAgICAgICAgY29uc3QgaW50MzJfdCBmb3JtYXRJZHggPSBjb252ZXJ0R0xQaXhlbEZvcm1hdChmb3JtYXQsIHR5cGUpOwotICAgICAgICBjb25zdCBHR0xGb3JtYXQmIHBpeGVsRm9ybWF0KGMtPnJhc3Rlcml6ZXIuZm9ybWF0c1tmb3JtYXRJZHhdKTsKLSAgICAgICAgY29uc3QgaW50MzJfdCBhbGlnbiA9IGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudC0xOwotICAgICAgICBjb25zdCBpbnQzMl90IGJwciA9ICgod2lkdGggKiBwaXhlbEZvcm1hdC5zaXplKSArIGFsaWduKSAmIH5hbGlnbjsKLSAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBicHIgKiBoZWlnaHQ7Ci0gICAgICAgIGNvbnN0IGludDMyX3Qgc3RyaWRlID0gYnByIC8gcGl4ZWxGb3JtYXQuc2l6ZTsKLQotICAgICAgICBHR0xTdXJmYWNlIHVzZXJTdXJmYWNlOwotICAgICAgICB1c2VyU3VyZmFjZS52ZXJzaW9uID0gc2l6ZW9mKHVzZXJTdXJmYWNlKTsKLSAgICAgICAgdXNlclN1cmZhY2Uud2lkdGggID0gd2lkdGg7Ci0gICAgICAgIHVzZXJTdXJmYWNlLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdXNlclN1cmZhY2Uuc3RyaWRlID0gc3RyaWRlOwotICAgICAgICB1c2VyU3VyZmFjZS5mb3JtYXQgPSBmb3JtYXRJZHg7Ci0gICAgICAgIHVzZXJTdXJmYWNlLmNvbXByZXNzZWRGb3JtYXQgPSAwOwotICAgICAgICB1c2VyU3VyZmFjZS5kYXRhID0gKEdMdWJ5dGUqKXBpeGVsczsKLQotICAgICAgICBpbnQgZXJyID0gY29weVBpeGVscyhjLCAqc3VyZmFjZSwgMCwgMCwgdXNlclN1cmZhY2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoZXJyKSB7Ci0gICAgICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKAotICAgICAgICBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwKLSAgICAgICAgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0gICAgICAgIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLAotICAgICAgICBjb25zdCBHTHZvaWQgKmRhdGEpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotfQotCi12b2lkIGdsVGV4U3ViSW1hZ2UyRCgKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsCi0gICAgICAgIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1RFWFRVUkVfMkQpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoeG9mZnNldDwwIHx8IHlvZmZzZXQ8MCB8fCB3aWR0aDwwIHx8IGhlaWdodDwwIHx8IGxldmVsPDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHZhbGlkRm9ybWF0VHlwZShjLCBmb3JtYXQsIHR5cGUpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBmaW5kIG91dCB3aGljaCB0ZXh0dXJlIGlzIGJvdW5kIHRvIHRoZSBjdXJyZW50IHVuaXQKLSAgICBjb25zdCBpbnQgYWN0aXZlID0gYy0+dGV4dHVyZXMuYWN0aXZlOwotICAgIEVHTFRleHR1cmVPYmplY3QqIHRleCA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLnRleHR1cmU7Ci0gICAgY29uc3QgR0dMU3VyZmFjZSYgc3VyZmFjZSh0ZXgtPm1pcChsZXZlbCkpOwotCi0gICAgaWYgKCF0ZXgtPmludGVybmFsZm9ybWF0IHx8IHRleC0+ZGlyZWN0KSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChmb3JtYXQgIT0gdGV4LT5pbnRlcm5hbGZvcm1hdCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCh4b2Zmc2V0ICsgd2lkdGggID4gR0xzaXplaShzdXJmYWNlLndpZHRoKSkgfHwKLSAgICAgICAgKHlvZmZzZXQgKyBoZWlnaHQgPiBHTHNpemVpKHN1cmZhY2UuaGVpZ2h0KSkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7Ci0gICAgICAgIHJldHVybjsgLy8gb2theSwgYnV0IG5vLW9wLgotICAgIH0KLQotICAgIC8vIGZpZ3VyZSBvdXQgdGhlIHNpemUgd2UgbmVlZCBhcyB3ZWxsIGFzIHRoZSBzdHJpZGUKLSAgICBjb25zdCBpbnQzMl90IGZvcm1hdElkeCA9IGNvbnZlcnRHTFBpeGVsRm9ybWF0KGZvcm1hdCwgdHlwZSk7Ci0gICAgaWYgKGZvcm1hdElkeCA9PSAwKSB7IC8vIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoaXMKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgR0dMRm9ybWF0JiBwaXhlbEZvcm1hdChjLT5yYXN0ZXJpemVyLmZvcm1hdHNbZm9ybWF0SWR4XSk7Ci0gICAgY29uc3QgaW50MzJfdCBhbGlnbiA9IGMtPnRleHR1cmVzLnVucGFja0FsaWdubWVudC0xOwotICAgIGNvbnN0IGludDMyX3QgYnByID0gKCh3aWR0aCAqIHBpeGVsRm9ybWF0LnNpemUpICsgYWxpZ24pICYgfmFsaWduOwotICAgIGNvbnN0IHNpemVfdCBzaXplID0gYnByICogaGVpZ2h0OwotICAgIGNvbnN0IGludDMyX3Qgc3RyaWRlID0gYnByIC8gcGl4ZWxGb3JtYXQuc2l6ZTsKLSAgICBHR0xTdXJmYWNlIHVzZXJTdXJmYWNlOwotICAgIHVzZXJTdXJmYWNlLnZlcnNpb24gPSBzaXplb2YodXNlclN1cmZhY2UpOwotICAgIHVzZXJTdXJmYWNlLndpZHRoICA9IHdpZHRoOwotICAgIHVzZXJTdXJmYWNlLmhlaWdodCA9IGhlaWdodDsKLSAgICB1c2VyU3VyZmFjZS5zdHJpZGUgPSBzdHJpZGU7Ci0gICAgdXNlclN1cmZhY2UuZm9ybWF0ID0gZm9ybWF0SWR4OwotICAgIHVzZXJTdXJmYWNlLmNvbXByZXNzZWRGb3JtYXQgPSAwOwotICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOwotCi0gICAgaW50IGVyciA9IGNvcHlQaXhlbHMoYywKLSAgICAgICAgICAgIHN1cmZhY2UsIHhvZmZzZXQsIHlvZmZzZXQsCi0gICAgICAgICAgICB1c2VyU3VyZmFjZSwgMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZ2VuZXJhdGVNaXBtYXAoYywgbGV2ZWwpOwotCi0gICAgLy8gc2luY2Ugd2Ugb25seSBjaGFuZ2VkIHRoZSBjb250ZW50IG9mIHRoZSB0ZXh0dXJlLCB3ZSBkb24ndCBuZWVkCi0gICAgLy8gdG8gY2FsbCBiaW5kVGV4dHVyZSBvbiB0aGUgbWFpbiByYXN0ZXJpemVyLgotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCgKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwKLSAgICAgICAgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsCi0gICAgICAgIEdMaW50IGJvcmRlcikKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGlmICh0YXJnZXQgIT0gR0xfVEVYVFVSRV8yRCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpbnRlcm5hbGZvcm1hdDxHTF9BTFBIQSB8fCBpbnRlcm5hbGZvcm1hdD5HTF9MVU1JTkFOQ0VfQUxQSEEpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAod2lkdGg8MCB8fCBoZWlnaHQ8MCB8fCBib3JkZXIhPTAgfHwgbGV2ZWw8MCkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEdMZW51bSBmb3JtYXQgPSAwOwotICAgIEdMZW51bSB0eXBlID0gR0xfVU5TSUdORURfQllURTsKLSAgICBjb25zdCBHR0xTdXJmYWNlJiBjYlN1cmZhY2UgPSBjLT5yYXN0ZXJpemVyLnN0YXRlLmJ1ZmZlcnMuY29sb3IuczsKLSAgICBjb25zdCBpbnQgY2JGb3JtYXRJZHggPSBjYlN1cmZhY2UuZm9ybWF0OwotICAgIHN3aXRjaCAoY2JGb3JtYXRJZHgpIHsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKLSAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOgotICAgICAgICB0eXBlID0gR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfNDQ0NDoKLSAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQ7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7Ci0gICAgY2FzZSBHTF9BTFBIQToKLSAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKLSAgICBjYXNlIEdMX0xVTUlOQU5DRToKLSAgICAgICAgdHlwZSA9IEdMX1VOU0lHTkVEX0JZVEU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIGZpZ3VyZSBvdXQgdGhlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBuZXcgdGV4dHVyZQotICAgIHN3aXRjaCAoY2JGb3JtYXRJZHgpIHsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OgotICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9BXzg6Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQkFfNTU1MToKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OgotICAgICAgICBmb3JtYXQgPSBpbnRlcm5hbGZvcm1hdDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQlhfODg4ODoKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfTF84OgotICAgICAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgR0xfTFVNSU5BTkNFOgotICAgICAgICBjYXNlIEdMX1JHQjoKLSAgICAgICAgICAgIGZvcm1hdCA9IGludGVybmFsZm9ybWF0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGZvcm1hdCA9PSAwKSB7Ci0gICAgICAgIC8vIGludmFsaWQgY29tYmluYXRpb24KLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSB0aGUgbmV3IHRleHR1cmUuLi4KLSAgICBpbnQzMl90IHNpemU7Ci0gICAgR0dMU3VyZmFjZSogc3VyZmFjZTsKLSAgICBpbnQgZXJyb3IgPSBjcmVhdGVUZXh0dXJlU3VyZmFjZShjLCAmc3VyZmFjZSwgJnNpemUsCi0gICAgICAgICAgICBsZXZlbCwgZm9ybWF0LCB0eXBlLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyb3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhlIGJvdHRvbSByb3cgaXMgc3RvcmVkIGZpcnN0IGluIHRleHR1cmVzCi0gICAgR0dMU3VyZmFjZSB0eFN1cmZhY2UoKnN1cmZhY2UpOwotICAgIHR4U3VyZmFjZS5zdHJpZGUgPSAtdHhTdXJmYWNlLnN0cmlkZTsKLQotICAgIC8vICh4LHkpIGlzIHRoZSBsb3dlci1sZWZ0IGNvcm5lciBvZiBjb2xvckJ1ZmZlcgotICAgIHkgPSBjYlN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpOwotCi0gICAgLyogVGhlIEdMRVMgc3BlYyBzYXlzOgotICAgICAqIElmIGFueSBvZiB0aGUgcGl4ZWxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBhcmUgb3V0c2lkZQotICAgICAqIHRoZSBmcmFtZWJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGNvbnRleHQsCi0gICAgICogdGhlbiB0aGUgdmFsdWVzIG9idGFpbmVkIGZvciB0aG9zZSBwaXhlbHMgYXJlIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBpZiAoeCt3aWR0aCA+IEdMaW50KGNiU3VyZmFjZS53aWR0aCkpCi0gICAgICAgIHdpZHRoID0gY2JTdXJmYWNlLndpZHRoIC0geDsKLQotICAgIGlmICh5K2hlaWdodCA+IEdMaW50KGNiU3VyZmFjZS5oZWlnaHQpKQotICAgICAgICBoZWlnaHQgPSBjYlN1cmZhY2UuaGVpZ2h0IC0geTsKLQotICAgIGludCBlcnIgPSBjb3B5UGl4ZWxzKGMsCi0gICAgICAgICAgICB0eFN1cmZhY2UsIDAsIDAsCi0gICAgICAgICAgICBjYlN1cmZhY2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZU1pcG1hcChjLCBsZXZlbCk7Ci19Ci0KLXZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCgKLSAgICAgICAgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsCi0gICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHhvZmZzZXQ8MCB8fCB5b2Zmc2V0PDAgfHwgd2lkdGg8MCB8fCBoZWlnaHQ8MCB8fCBsZXZlbDwwKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghd2lkdGggfHwgIWhlaWdodCkgewotICAgICAgICByZXR1cm47IC8vIG9rYXksIGJ1dCBuby1vcC4KLSAgICB9Ci0KLSAgICAvLyBmaW5kIG91dCB3aGljaCB0ZXh0dXJlIGlzIGJvdW5kIHRvIHRoZSBjdXJyZW50IHVuaXQKLSAgICBjb25zdCBpbnQgYWN0aXZlID0gYy0+dGV4dHVyZXMuYWN0aXZlOwotICAgIEVHTFRleHR1cmVPYmplY3QqIHRleCA9IGMtPnRleHR1cmVzLnRtdVthY3RpdmVdLnRleHR1cmU7Ci0gICAgY29uc3QgR0dMU3VyZmFjZSYgc3VyZmFjZSh0ZXgtPm1pcChsZXZlbCkpOwotCi0gICAgaWYgKCF0ZXgtPmludGVybmFsZm9ybWF0KSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKHhvZmZzZXQgKyB3aWR0aCAgPiBHTHNpemVpKHN1cmZhY2Uud2lkdGgpKSB8fAotICAgICAgICAoeW9mZnNldCArIGhlaWdodCA+IEdMc2l6ZWkoc3VyZmFjZS5oZWlnaHQpKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRoZSBib3R0b20gcm93IGlzIHN0b3JlZCBmaXJzdCBpbiB0ZXh0dXJlcwotICAgIEdHTFN1cmZhY2UgdHhTdXJmYWNlKHN1cmZhY2UpOwotICAgIHR4U3VyZmFjZS5zdHJpZGUgPSAtdHhTdXJmYWNlLnN0cmlkZTsKLQotICAgIC8vICh4LHkpIGlzIHRoZSBsb3dlci1sZWZ0IGNvcm5lciBvZiBjb2xvckJ1ZmZlcgotICAgIGNvbnN0IEdHTFN1cmZhY2UmIGNiU3VyZmFjZSA9IGMtPnJhc3Rlcml6ZXIuc3RhdGUuYnVmZmVycy5jb2xvci5zOwotICAgIHkgPSBjYlN1cmZhY2UuaGVpZ2h0IC0gKHkgKyBoZWlnaHQpOwotCi0gICAgLyogVGhlIEdMRVMgc3BlYyBzYXlzOgotICAgICAqIElmIGFueSBvZiB0aGUgcGl4ZWxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJlY3RhbmdsZSBhcmUgb3V0c2lkZQotICAgICAqIHRoZSBmcmFtZWJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGNvbnRleHQsCi0gICAgICogdGhlbiB0aGUgdmFsdWVzIG9idGFpbmVkIGZvciB0aG9zZSBwaXhlbHMgYXJlIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBpZiAoeCt3aWR0aCA+IEdMaW50KGNiU3VyZmFjZS53aWR0aCkpCi0gICAgICAgIHdpZHRoID0gY2JTdXJmYWNlLndpZHRoIC0geDsKLQotICAgIGlmICh5K2hlaWdodCA+IEdMaW50KGNiU3VyZmFjZS5oZWlnaHQpKQotICAgICAgICBoZWlnaHQgPSBjYlN1cmZhY2UuaGVpZ2h0IC0geTsKLQotICAgIGludCBlcnIgPSBjb3B5UGl4ZWxzKGMsCi0gICAgICAgICAgICB0eFN1cmZhY2UsIHhvZmZzZXQsIHlvZmZzZXQsCi0gICAgICAgICAgICBjYlN1cmZhY2UsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdlbmVyYXRlTWlwbWFwKGMsIGxldmVsKTsKLX0KLQotdm9pZCBnbFJlYWRQaXhlbHMoCi0gICAgICAgIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LAotICAgICAgICBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAoKGZvcm1hdCAhPSBHTF9SR0JBKSAmJiAoZm9ybWF0ICE9IEdMX1JHQikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKHR5cGUgIT0gR0xfVU5TSUdORURfQllURSkgJiYgKHR5cGUgIT0gR0xfVU5TSUdORURfU0hPUlRfNV82XzUpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHdpZHRoPDAgfHwgaGVpZ2h0PDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKHg8MCB8fCB5PDApIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGZvcm1hdElkeCA9IEdHTF9QSVhFTF9GT1JNQVRfTk9ORTsKLSAgICBpZiAoKGZvcm1hdCA9PSBHTF9SR0JBKSAmJiAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSkgewotICAgICAgICBmb3JtYXRJZHggPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKLSAgICB9IGVsc2UgaWYgKChmb3JtYXQgPT0gR0xfUkdCKSAmJiAodHlwZSA9PSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSkpIHsKLSAgICAgICAgZm9ybWF0SWR4ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IEdHTFN1cmZhY2UmIHJlYWRTdXJmYWNlID0gYy0+cmFzdGVyaXplci5zdGF0ZS5idWZmZXJzLnJlYWQuczsKLSAgICBpZiAoKHgrd2lkdGggPiBHTGludChyZWFkU3VyZmFjZS53aWR0aCkpIHx8Ci0gICAgICAgICAgICAoeStoZWlnaHQgPiBHTGludChyZWFkU3VyZmFjZS5oZWlnaHQpKSkgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGNvbnN0IEdHTEZvcm1hdCYgcGl4ZWxGb3JtYXQoYy0+cmFzdGVyaXplci5mb3JtYXRzW2Zvcm1hdElkeF0pOwotICAgIGNvbnN0IGludDMyX3QgYWxpZ24gPSBjLT50ZXh0dXJlcy5wYWNrQWxpZ25tZW50LTE7Ci0gICAgY29uc3QgaW50MzJfdCBicHIgPSAoKHdpZHRoICogcGl4ZWxGb3JtYXQuc2l6ZSkgKyBhbGlnbikgJiB+YWxpZ247Ci0gICAgY29uc3QgaW50MzJfdCBzdHJpZGUgPSBicHIgLyBwaXhlbEZvcm1hdC5zaXplOwotCi0gICAgR0dMU3VyZmFjZSB1c2VyU3VyZmFjZTsKLSAgICB1c2VyU3VyZmFjZS52ZXJzaW9uID0gc2l6ZW9mKHVzZXJTdXJmYWNlKTsKLSAgICB1c2VyU3VyZmFjZS53aWR0aCAgPSB3aWR0aDsKLSAgICB1c2VyU3VyZmFjZS5oZWlnaHQgPSBoZWlnaHQ7Ci0gICAgdXNlclN1cmZhY2Uuc3RyaWRlID0gLXN0cmlkZTsgLy8gYm90dG9tIHJvdyBpcyB0cmFuc2ZlcmVkIGZpcnN0Ci0gICAgdXNlclN1cmZhY2UuZm9ybWF0ID0gZm9ybWF0SWR4OwotICAgIHVzZXJTdXJmYWNlLmNvbXByZXNzZWRGb3JtYXQgPSAwOwotICAgIHVzZXJTdXJmYWNlLmRhdGEgPSAoR0x1Ynl0ZSopcGl4ZWxzOwotCi0gICAgLy8gdXNlIHBpeGVsLWZsaW5nZXIgdG8gaGFuZGxlIGFsbCB0aGUgY29udmVyc2lvbnMKLSAgICBHR0xDb250ZXh0KiBnZ2wgPSBnZXRSYXN0ZXJpemVyKGMpOwotICAgIGlmICghZ2dsKSB7Ci0gICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB0aGlzIHdvdWxkIGZhaWwgaXMgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIG1lbW9yeQotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9PVVRfT0ZfTUVNT1JZKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGdnbC0+Y29sb3JCdWZmZXIoZ2dsLCAmdXNlclN1cmZhY2UpOyAgLy8gZGVzdGluYXRpb24gaXMgdXNlciBidWZmZXIKLSAgICBnZ2wtPmJpbmRUZXh0dXJlKGdnbCwgJnJlYWRTdXJmYWNlKTsgIC8vIHNvdXJjZSBpcyByZWFkLWJ1ZmZlcgotICAgIGdnbC0+dGV4Q29vcmQyaShnZ2wsIHgsIHJlYWRTdXJmYWNlLmhlaWdodCAtICh5ICsgaGVpZ2h0KSk7Ci0gICAgZ2dsLT5yZWN0aShnZ2wsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWYgMAotI3ByYWdtYSBtYXJrIC0KLSNwcmFnbWEgbWFyayBEcmF3VGV4dHVyZSBFeHRlbnNpb24KLSNlbmRpZgotCi12b2lkIGdsRHJhd1RleHN2T0VTKGNvbnN0IEdMc2hvcnQqIGNvb3JkcykgewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgZHJhd1RleGlPRVMoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdLCBjb29yZHNbNF0sIGMpOwotfQotdm9pZCBnbERyYXdUZXhpdk9FUyhjb25zdCBHTGludCogY29vcmRzKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkcmF3VGV4aU9FUyhjb29yZHNbMF0sIGNvb3Jkc1sxXSwgY29vcmRzWzJdLCBjb29yZHNbM10sIGNvb3Jkc1s0XSwgYyk7Ci19Ci12b2lkIGdsRHJhd1RleHNPRVMoR0xzaG9ydCB4ICwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgdywgR0xzaG9ydCBoKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkcmF3VGV4aU9FUyh4LCB5LCB6LCB3LCBoLCBjKTsKLX0KLXZvaWQgZ2xEcmF3VGV4aU9FUyhHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3LCBHTGludCBoKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkcmF3VGV4aU9FUyh4LCB5LCB6LCB3LCBoLCBjKTsKLX0KLQotdm9pZCBnbERyYXdUZXhmdk9FUyhjb25zdCBHTGZsb2F0KiBjb29yZHMpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXh4T0VTKAotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGNvb3Jkc1swXSksCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzFdKSwKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChjb29yZHNbMl0pLAotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGNvb3Jkc1szXSksCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoY29vcmRzWzRdKSwKLSAgICAgICAgICAgIGMpOwotfQotdm9pZCBnbERyYXdUZXh4dk9FUyhjb25zdCBHTGZpeGVkKiBjb29yZHMpIHsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGRyYXdUZXh4T0VTKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZHNbMl0sIGNvb3Jkc1szXSwgY29vcmRzWzRdLCBjKTsKLX0KLXZvaWQgZ2xEcmF3VGV4Zk9FUyhHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcsIEdMZmxvYXQgaCl7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkcmF3VGV4eE9FUygKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZCh4KSwgZ2dsRmxvYXRUb0ZpeGVkKHkpLCBnZ2xGbG9hdFRvRml4ZWQoeiksCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQodyksIGdnbEZsb2F0VG9GaXhlZChoKSwKLSAgICAgICAgICAgIGMpOwotfQotdm9pZCBnbERyYXdUZXh4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgdywgR0xmaXhlZCBoKSB7Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBkcmF3VGV4eE9FUyh4LCB5LCB6LCB3LCBoLCBjKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotI2lmIDAKLSNwcmFnbWEgbWFyayAtCi0jcHJhZ21hIG1hcmsgRUdMIEltYWdlIEV4dGVuc2lvbgotI2VuZGlmCi0KLXZvaWQgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgaWYgKHRhcmdldCAhPSBHTF9URVhUVVJFXzJEICYmIHRhcmdldCAhPSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUykgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX0VOVU0pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGltYWdlID09IEVHTF9OT19JTUFHRV9LSFIpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBuYXRpdmVfYnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIqKWltYWdlOwotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24ubWFnaWMgIT0gQU5EUk9JRF9OQVRJVkVfQlVGRkVSX01BR0lDKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChuYXRpdmVfYnVmZmVyLT5jb21tb24udmVyc2lvbiAhPSBzaXplb2YoQU5hdGl2ZVdpbmRvd0J1ZmZlcikpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBiaW5kIGl0IHRvIHRoZSB0ZXh0dXJlIHVuaXQKLSAgICBzcDxFR0xUZXh0dXJlT2JqZWN0PiB0ZXggPSBnZXRBbmRCaW5kQWN0aXZlVGV4dHVyZU9iamVjdChjKTsKLSAgICB0ZXgtPnNldEltYWdlKG5hdGl2ZV9idWZmZXIpOwotfQotCi12b2lkIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpCi17Ci0gICAgb2dsZXNfY29udGV4dF90KiBjID0gb2dsZXNfY29udGV4dF90OjpnZXQoKTsKLSAgICBpZiAodGFyZ2V0ICE9IEdMX1JFTkRFUkJVRkZFUl9PRVMpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChpbWFnZSA9PSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogbmF0aXZlX2J1ZmZlciA9IChBTmF0aXZlV2luZG93QnVmZmVyKilpbWFnZTsKLSAgICBpZiAobmF0aXZlX2J1ZmZlci0+Y29tbW9uLm1hZ2ljICE9IEFORFJPSURfTkFUSVZFX0JVRkZFUl9NQUdJQykgewotICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobmF0aXZlX2J1ZmZlci0+Y29tbW9uLnZlcnNpb24gIT0gc2l6ZW9mKEFOYXRpdmVXaW5kb3dCdWZmZXIpKSB7Ci0gICAgICAgIG9nbGVzX2Vycm9yKGMsIEdMX0lOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gd2VsbCwgd2UncmUgbm90IHN1cHBvcnRpbmcgdGhpcyBleHRlbnNpb24gYW55d2F5cwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC90ZXh0dXJlLmggYi9vcGVuZ2wvbGliYWdsL3RleHR1cmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNzU1MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGliYWdsL3RleHR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvdGV4dHVyZS5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1RFWFRVUkVfSAotI2RlZmluZSBBTkRST0lEX09QRU5HTEVTX1RFWFRVUkVfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxwcml2YXRlL3BpeGVsZmxpbmdlci9nZ2xfY29udGV4dC5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotCi0jaW5jbHVkZSAiY29udGV4dC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXZvaWQgb2dsZXNfaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYyk7Ci12b2lkIG9nbGVzX3VuaW5pdF90ZXh0dXJlKG9nbGVzX2NvbnRleHRfdCogYyk7Ci12b2lkIG9nbGVzX3ZhbGlkYXRlX3RleHR1cmUob2dsZXNfY29udGV4dF90KiBjKTsKLXZvaWQgb2dsZXNfbG9ja190ZXh0dXJlcyhvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc191bmxvY2tfdGV4dHVyZXMob2dsZXNfY29udGV4dF90KiBjKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVEVYVFVSRV9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAgYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDA0ZDYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qIGxpYnMvb3BlbmdsZXMvdmVydGV4LmNwcAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgImNvbnRleHQuaCIKLSNpbmNsdWRlICJmcC5oIgotI2luY2x1ZGUgInZlcnRleC5oIgotI2luY2x1ZGUgInN0YXRlLmgiCi0jaW5jbHVkZSAibWF0cml4LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIG9nbGVzX2luaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBjLT5jdWxsLmVuYWJsZSA9IEdMX0ZBTFNFOwotICAgIGMtPmN1bGwuY3VsbEZhY2UgPSBHTF9CQUNLOwotICAgIGMtPmN1bGwuZnJvbnRGYWNlID0gR0xfQ0NXOwotCi0gICAgYy0+Y3VycmVudC5jb2xvci5yID0gMHgxMDAwMDsKLSAgICBjLT5jdXJyZW50LmNvbG9yLmcgPSAweDEwMDAwOwotICAgIGMtPmN1cnJlbnQuY29sb3IuYiA9IDB4MTAwMDA7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5hID0gMHgxMDAwMDsKLQotICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IDB4MTAwMDA7Ci19Ci0KLXZvaWQgb2dsZXNfdW5pbml0X3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMpCi17Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHZlcnRleCBwcm9jZXNzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERpdmlkZXMgYSB2ZXJ0ZXggY2xpcCBjb29yZGluYXRlcyBieSBXCi1zdGF0aWMgaW5saW5lCi12b2lkIHBlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGVuYWJsZXMpCi17Ci0gICAgLy8gW3gseSx6XXdpbmRvdyA9IHZwdCAqIChbeCx5LHpdY2xpcCAvIGNsaXAudykKLSAgICAvLyBbd113aW5kb3cgPSAxL3cKLQotICAgIC8vIFdpdGggYSByZWd1bGFyIHByb2plY3Rpb24gZ2VuZXJhdGVkIGJ5IGdsRnJ1c3R1bSgpLAotICAgIC8vIHdlIGhhdmUgdz0teiwgdGhlcmVmb3JlLCB3IGlzIGluIFt6TmVhciwgekZhcl0uCi0gICAgLy8gQWxzbywgek5lYXIgYW5kIHpGYXIgYXJlIHN0cmljbHkgcG9zaXRpdmUsCi0gICAgLy8gYW5kIDEvdyAod2luZG93LncpIGlzIGluIFsxL3pGYXIsIDEvek5lYXJdLCB1c3VhbGx5IHRoaXMKLSAgICAvLyBtZWFucyBdMCwgK2luZlsgLS0gaG93ZXZlciwgaXQgaXMgYWx3YXlzIHJlY29tbWVuZGVkCi0gICAgLy8gdG8gdXNlIGFzIGxhcmdlIHZhbHVlcyBhcyBwb3NzaWJsZSBmb3Igek5lYXIuCi0gICAgLy8gQWxsIGluIGFsbCwgdyBpcyB1c3VhbGx5IHNtYWxsZXIgdGhhbiAxLjAgKGFzc3VtaW5nCi0gICAgLy8gek5lYXIgaXMgYXQgbGVhc3QgMS4wKTsgYW5kIGV2ZW4gaWYgek5lYXIgaXMgc21hbGxlciB0aGFuIDEuMAotICAgIC8vIHZhbHVlcyBvZiB3IHdvbid0IGJlIHRvbyBiaWcuCi0KLSAgICBjb25zdCBpbnQzMl90IHJ3ID0gZ2dsUmVjaXAyOCh2LT5jbGlwLncpOwotICAgIGNvbnN0IEdMZml4ZWQqIGNvbnN0IG0gPSBjLT50cmFuc2Zvcm1zLnZwdC50cmFuc2Zvcm0ubWF0cml4Lm07Ci0gICAgdi0+d2luZG93LncgPSBydzsKLSAgICB2LT53aW5kb3cueCA9IGdnbE11bEFkZHgoZ2dsTXVseCh2LT5jbGlwLngsIHJ3LCAxNiksIG1bIDBdLCBtWzEyXSwgMjgpOyAKLSAgICB2LT53aW5kb3cueSA9IGdnbE11bEFkZHgoZ2dsTXVseCh2LT5jbGlwLnksIHJ3LCAxNiksIG1bIDVdLCBtWzEzXSwgMjgpOwotICAgIHYtPndpbmRvdy54ID0gVFJJX0ZST01fRklYRUQodi0+d2luZG93LngpOwotICAgIHYtPndpbmRvdy55ID0gVFJJX0ZST01fRklYRUQodi0+d2luZG93LnkpOwotICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9ERVBUSF9URVNUKSB7Ci0gICAgICAgIHYtPndpbmRvdy56ID0gZ2dsTXVsQWRkeChnZ2xNdWx4KHYtPmNsaXAueiwgcncsIDE2KSwgbVsxMF0sIG1bMTRdLCAyOCk7Ci0gICAgfQotfQotCi0vLyBmcnVzdHVtIGNsaXBwaW5nIGFuZCBXLWRpdmlkZQotc3RhdGljIGlubGluZQotdm9pZCBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYsIHVpbnQzMl90IGVuYWJsZXMpCi17Ci0gICAgLy8gbmRjID0gY2xpcCAvIFcKLSAgICAvLyB3aW5kb3cgPSBuY2QgKiB2aWV3cG9ydAotICAgIAotICAgIC8vIGNsaXAgdG8gdGhlIHZpZXctdm9sdW1lCi0gICAgdWludDMyX3QgY2xpcCA9IHYtPmZsYWdzICYgdmVydGV4X3Q6OkNMSVBfQUxMOwotICAgIGNvbnN0IEdMZml4ZWQgdyA9IHYtPmNsaXAudzsKLSAgICBpZiAodi0+Y2xpcC54IDwgLXcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9MOwotICAgIGlmICh2LT5jbGlwLnggPiAgdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX1I7Ci0gICAgaWYgKHYtPmNsaXAueSA8IC13KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfQjsKLSAgICBpZiAodi0+Y2xpcC55ID4gIHcpICAgY2xpcCB8PSB2ZXJ0ZXhfdDo6Q0xJUF9UOwotICAgIGlmICh2LT5jbGlwLnogPCAtdykgICBjbGlwIHw9IHZlcnRleF90OjpDTElQX047Ci0gICAgaWYgKHYtPmNsaXAueiA+ICB3KSAgIGNsaXAgfD0gdmVydGV4X3Q6OkNMSVBfRjsKLQotICAgIHYtPmZsYWdzIHw9IGNsaXA7Ci0gICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKLQotICAgIGlmIChnZ2xfbGlrZWx5KCFjbGlwKSkgewotICAgICAgICAvLyBpZiB0aGUgdmVydGV4IGlzIGNsaXBwZWQsIHdlIGRvbid0IGRvIHRoZSBwZXJzcGVjdGl2ZQotICAgICAgICAvLyBkaXZpZGUsIHNpbmNlIHdlIGRvbid0IG5lZWQgaXRzIHdpbmRvdyBjb29yZGluYXRlcy4KLSAgICAgICAgcGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7Ci0gICAgfQotfQotCi0vLyBmcnVzdHVtIGNsaXBwaW5nLCB1c2VyIGNsaXBwaW5nIGFuZCBXLWRpdmlkZQotc3RhdGljIGlubGluZQotdm9pZCBjbGlwQWxsUGVyc3BlY3RpdmUob2dsZXNfY29udGV4dF90KiBjLCB2ZXJ0ZXhfdCogdiwgdWludDMyX3QgZW5hYmxlcykKLXsKLSAgICAvLyBjb21wdXRlIGV5ZSBjb29yZGluYXRlcwotICAgIGMtPmFycmF5cy5tdl90cmFuc2Zvcm0oCi0gICAgICAgICAgICAmYy0+dHJhbnNmb3Jtcy5tb2RlbHZpZXcudHJhbnNmb3JtLCAmdi0+ZXllLCAmdi0+b2JqKTsKLSAgICB2LT5mbGFncyB8PSB2ZXJ0ZXhfdDo6RVlFOwotCi0gICAgLy8gY2xpcCB0aGlzIHZlcnRleCBhZ2FpbnN0IGVhY2ggdXNlciBjbGlwIHBsYW5lCi0gICAgdWludDMyX3QgY2xpcCA9IDA7Ci0gICAgaW50IHBsYW5lcyA9IGMtPmNsaXBQbGFuZXMuZW5hYmxlOwotICAgIHdoaWxlIChwbGFuZXMpIHsKLSAgICAgICAgY29uc3QgaW50IGkgPSAzMSAtIGdnbENseihwbGFuZXMpOwotICAgICAgICBwbGFuZXMgJj0gfigxPDxpKTsKLSAgICAgICAgLy8gWFhYOiB3ZSBzaG91bGQgaGF2ZSBhIHNwZWNpYWwgZG90KCkgZm9yIDIsMyw0IGNvb3JkcyB2ZXJ0aWNlcwotICAgICAgICBHTGZpeGVkIGQgPSBkb3Q0KGMtPmNsaXBQbGFuZXMucGxhbmVbaV0uZXF1YXRpb24udiwgdi0+ZXllLnYpOwotICAgICAgICBpZiAoZCA8IDApIHsKLSAgICAgICAgICAgIGNsaXAgfD0gMHgxMDA8PGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdi0+ZmxhZ3MgfD0gY2xpcDsKLQotICAgIGNsaXBGcnVzdHVtUGVyc3BlY3RpdmUoYywgdiwgZW5hYmxlcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBvZ2xlc192ZXJ0ZXhfcHJvamVjdChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KSB7Ci0gICAgcGVyc3BlY3RpdmUoYywgdiwgYy0+cmFzdGVyaXplci5zdGF0ZS5lbmFibGVzKTsKLX0KLQotdm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUyRChvZ2xlc19jb250ZXh0X3QqIGMsIHZlcnRleF90KiB2KQotewotICAgIC8vIGhlcmUgd2UgYXNzdW1lIHc9MS4wIGFuZCB0aGUgdmlld3BvcnQgdHJhbnNmb3JtYXRpb24KLSAgICAvLyBoYXMgYmVlbiBhcHBsaWVkIGFscmVhZHkuCi0gICAgYy0+YXJyYXlzLmN1bGwgPSAwOwotICAgIHYtPndpbmRvdy54ID0gVFJJX0ZST01fRklYRUQodi0+Y2xpcC54KTsKLSAgICB2LT53aW5kb3cueSA9IFRSSV9GUk9NX0ZJWEVEKHYtPmNsaXAueSk7Ci0gICAgdi0+d2luZG93LnogPSB2LT5jbGlwLno7Ci0gICAgdi0+d2luZG93LncgPSB2LT5jbGlwLncgPDwgMTI7Ci19Ci0KLXZvaWQgb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0RaKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKLSAgICBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKGMsIHYsIEdHTF9FTkFCTEVfREVQVEhfVEVTVCk7Ci19Ci12b2lkIG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKLSAgICBjbGlwRnJ1c3R1bVBlcnNwZWN0aXZlKGMsIHYsIDApOwotfQotdm9pZCBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0RaKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKLSAgICBjbGlwQWxsUGVyc3BlY3RpdmUoYywgdiwgR0dMX0VOQUJMRV9ERVBUSF9URVNUKTsKLX0KLXZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpIHsKLSAgICBjbGlwQWxsUGVyc3BlY3RpdmUoYywgdiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsaXBQbGFuZXgoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkKiBlcXUsIG9nbGVzX2NvbnRleHRfdCogYykKLXsKLSAgICBjb25zdCBpbnQgcCA9IHBsYW5lIC0gR0xfQ0xJUF9QTEFORTA7Ci0gICAgaWYgKGdnbF91bmxpa2VseSh1aW50MzJfdChwKSA+IChHTF9DTElQX1BMQU5FNSAtIEdMX0NMSVBfUExBTkUwKSkpIHsKLSAgICAgICAgb2dsZXNfZXJyb3IoYywgR0xfSU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZlYzRfdCYgZXF1YXRpb24gPSBjLT5jbGlwUGxhbmVzLnBsYW5lW3BdLmVxdWF0aW9uOwotICAgIG1lbWNweShlcXVhdGlvbi52LCBlcXUsIHNpemVvZih2ZWM0X3QpKTsKLQotICAgIG9nbGVzX3ZhbGlkYXRlX3RyYW5zZm9ybShjLCB0cmFuc2Zvcm1fc3RhdGVfdDo6TVZJVCk7Ci0gICAgdHJhbnNmb3JtX3QmIG12aXQgPSBjLT50cmFuc2Zvcm1zLm12aXQ0OwotICAgIG12aXQucG9pbnQ0KCZtdml0LCAmZXF1YXRpb24sICZlcXVhdGlvbik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0KLXZvaWQgZ2xDb2xvcjRmKEdMZmxvYXQgciwgR0xmbG9hdCBnLCBHTGZsb2F0IGIsIEdMZmxvYXQgYSkKLXsKLSAgICBvZ2xlc19jb250ZXh0X3QqIGMgPSBvZ2xlc19jb250ZXh0X3Q6OmdldCgpOwotICAgIGMtPmN1cnJlbnQuY29sb3IuciAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChyKTsKLSAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnIgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5yKTsKLSAgICBjLT5jdXJyZW50LmNvbG9yLmcgICAgICAgPSBnZ2xGbG9hdFRvRml4ZWQoZyk7Ci0gICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5nID0gZ2dsQ2xhbXB4KGMtPmN1cnJlbnQuY29sb3IuZyk7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5iICAgICAgID0gZ2dsRmxvYXRUb0ZpeGVkKGIpOwotICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYiA9IGdnbENsYW1weChjLT5jdXJyZW50LmNvbG9yLmIpOwotICAgIGMtPmN1cnJlbnQuY29sb3IuYSAgICAgICA9IGdnbEZsb2F0VG9GaXhlZChhKTsKLSAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmEgPSBnZ2xDbGFtcHgoYy0+Y3VycmVudC5jb2xvci5hKTsKLX0KLQotdm9pZCBnbENvbG9yNHgoR0xmaXhlZCByLCBHTGZpeGVkIGcsIEdMZml4ZWQgYiwgR0xmaXhlZCBhKQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5yID0gcjsKLSAgICBjLT5jdXJyZW50LmNvbG9yLmcgPSBnOwotICAgIGMtPmN1cnJlbnQuY29sb3IuYiA9IGI7Ci0gICAgYy0+Y3VycmVudC5jb2xvci5hID0gYTsKLSAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLnIgPSBnZ2xDbGFtcHgocik7Ci0gICAgYy0+Y3VycmVudENvbG9yQ2xhbXBlZC5nID0gZ2dsQ2xhbXB4KGcpOwotICAgIGMtPmN1cnJlbnRDb2xvckNsYW1wZWQuYiA9IGdnbENsYW1weChiKTsKLSAgICBjLT5jdXJyZW50Q29sb3JDbGFtcGVkLmEgPSBnZ2xDbGFtcHgoYSk7Ci19Ci0KLXZvaWQgZ2xOb3JtYWwzZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+Y3VycmVudE5vcm1hbC54ID0gZ2dsRmxvYXRUb0ZpeGVkKHgpOwotICAgIGMtPmN1cnJlbnROb3JtYWwueSA9IGdnbEZsb2F0VG9GaXhlZCh5KTsKLSAgICBjLT5jdXJyZW50Tm9ybWFsLnogPSBnZ2xGbG9hdFRvRml4ZWQoeik7Ci19Ci0KLXZvaWQgZ2xOb3JtYWwzeChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgYy0+Y3VycmVudE5vcm1hbC54ID0geDsKLSAgICBjLT5jdXJyZW50Tm9ybWFsLnkgPSB5OwotICAgIGMtPmN1cnJlbnROb3JtYWwueiA9IHo7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBnbENsaXBQbGFuZWYoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0KiBlcXUpCi17Ci0gICAgY29uc3QgR0xmaXhlZCBlcXV4WzRdID0gewotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVswXSksCi0gICAgICAgICAgICBnZ2xGbG9hdFRvRml4ZWQoZXF1WzFdKSwKLSAgICAgICAgICAgIGdnbEZsb2F0VG9GaXhlZChlcXVbMl0pLAotICAgICAgICAgICAgZ2dsRmxvYXRUb0ZpeGVkKGVxdVszXSkKLSAgICB9OwotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgY2xpcFBsYW5leChwbGFuZSwgZXF1eCwgYyk7Ci19Ci0KLXZvaWQgZ2xDbGlwUGxhbmV4KEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCogZXF1KQotewotICAgIG9nbGVzX2NvbnRleHRfdCogYyA9IG9nbGVzX2NvbnRleHRfdDo6Z2V0KCk7Ci0gICAgY2xpcFBsYW5leChwbGFuZSwgZXF1LCBjKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmggYi9vcGVuZ2wvbGliYWdsL3ZlcnRleC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWU2MjEzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBsaWJzL29wZW5nbGVzL3ZlcnRleC5oCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2lmbmRlZiBBTkRST0lEX09QRU5HTEVTX1ZFUlRFWF9ICi0jZGVmaW5lIEFORFJPSURfT1BFTkdMRVNfVkVSVEVYX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLW5hbWVzcGFjZSBnbCB7Ci1zdHJ1Y3QgdmVydGV4X3Q7Ci1zdHJ1Y3Qgb2dsZXNfY29udGV4dF90OwotfTsKLQotdm9pZCBvZ2xlc19pbml0X3ZlcnRleChvZ2xlc19jb250ZXh0X3QqIGMpOwotdm9pZCBvZ2xlc191bmluaXRfdmVydGV4KG9nbGVzX2NvbnRleHRfdCogYyk7Ci0KLXZvaWQgb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlMkQob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKLQotdm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRChvZ2xlc19jb250ZXh0X3QqLCB2ZXJ0ZXhfdCopOwotdm9pZCBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRFoob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKLXZvaWQgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEKG9nbGVzX2NvbnRleHRfdCosIHZlcnRleF90Kik7Ci12b2lkIG9nbGVzX3ZlcnRleF9jbGlwQWxsUGVyc3BlY3RpdmUzRFoob2dsZXNfY29udGV4dF90KiwgdmVydGV4X3QqKTsKLQotCi12b2lkIG9nbGVzX3ZlcnRleF9wcm9qZWN0KG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfT1BFTkdMRVNfVkVSVEVYX0gKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvQW5kcm9pZC5tayBiL29wZW5nbC9saWJzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmM2NGQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCBNRVRBIEVHTCBsaWJyYXJ5Ci0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAJICAgICAgIFwKLQlFR0wvZWdsX3Rscy5jcHAgICAgICAgIFwKLQlFR0wvZWdsX2NhY2hlLmNwcCAgICAgIFwKLQlFR0wvZWdsX2Rpc3BsYXkuY3BwICAgIFwKLQlFR0wvZWdsX29iamVjdC5jcHAgICAgIFwKLQlFR0wvZWdsLmNwcCAJICAgICAgIFwKLQlFR0wvZWdsQXBpLmNwcCAJICAgICAgIFwKLQlFR0wvdHJhY2UuY3BwICAgICAgICAgICAgICBcCi0JRUdML2dldFByb2NBZGRyZXNzLmNwcC5hcm0gXAotCUVHTC9Mb2FkZXIuY3BwIAkgICAgICAgXAotIwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJHTEVTX3RyYWNlCi1MT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKLUxPQ0FMX01PRFVMRTo9IGxpYkVHTAotTE9DQUxfTERGTEFHUyArPSAtV2wsLS1leGNsdWRlLWxpYnM9QUxMCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0jIEJpb25pYydzIHByaXZhdGUgVExTIGhlYWRlciByZWxpZXMgb24gdGhlIEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSIHRvCi0jIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgVExTIGNvZGVwYXRoCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICAgIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLSMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgotTE9DQUxfQ19JTkNMVURFUyArPSBiaW9uaWMvbGliYy9wcml2YXRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtRExPR19UQUc9XCJsaWJFR0xcIgotTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLUxPQ0FMX0NGTEFHUyArPSAtREVHTF9UUkFDRT0xCi0KLWlmZXEgKCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSxtc203aykKLUxPQ0FMX0NGTEFHUyArPSAtREFEUkVOTzEzMD0xCi1lbmRpZgotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi0KLWlmbmVxICgkKE1BWF9FR0xfQ0FDSEVfRU5UUllfU0laRSksKQotICBMT0NBTF9DRkxBR1MgKz0gLURNQVhfRUdMX0NBQ0hFX0VOVFJZX1NJWkU9JChNQVhfRUdMX0NBQ0hFX0VOVFJZX1NJWkUpCi1lbmRpZgotCi1pZm5lcSAoJChNQVhfRUdMX0NBQ0hFX1NJWkUpLCkKLSAgTE9DQUxfQ0ZMQUdTICs9IC1ETUFYX0VHTF9DQUNIRV9TSVpFPSQoTUFYX0VHTF9DQUNIRV9TSVpFKQotZW5kaWYKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotaW5zdGFsbGVkX2xpYkVHTCA6PSAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpCi0KLSMgT3BlbkdMIGRyaXZlcnMgY29uZmlnIGZpbGUKLWlmbmVxICgkKEJPQVJEX0VHTF9DRkcpLCkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gZWdsLmNmZwotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVCkvbGliL2VnbAotTE9DQUxfU1JDX0ZJTEVTIDo9IC4uLy4uLy4uLy4uLyQoQk9BUkRfRUdMX0NGRykKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLQotIyBtYWtlIHN1cmUgd2UgZGVwZW5kIG9uIGVnbC5jZmcsIHNvIGl0IGdldHMgaW5zdGFsbGVkCi0kKGluc3RhbGxlZF9saWJFR0wpOiB8IGVnbC5jZmcKLQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCdWlsZCB0aGUgd3JhcHBlciBPcGVuR0wgRVMgMS54IGxpYnJhcnkKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IAkJXAotCUdMRVNfQ00vZ2wuY3BwLmFybSAJXAotIwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJFR0wKLUxPQ0FMX0xETElCUyA6PSAtbHB0aHJlYWQgLWxkbAotTE9DQUxfTU9EVUxFOj0gbGliR0xFU3YxX0NNCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKLSMgd2UgbmVlZCB0byBhY2Nlc3MgdGhlIHByaXZhdGUgQmlvbmljIGhlYWRlciA8YmlvbmljX3Rscy5oPgotaWZlcSAoJChBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUiksdHJ1ZSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi1MT0NBTF9DX0lOQ0xVREVTICs9IGJpb25pYy9saWJjL3ByaXZhdGUKLQotTE9DQUxfQ0ZMQUdTICs9IC1ETE9HX1RBRz1cImxpYkdMRVN2MVwiCi1MT0NBTF9DRkxBR1MgKz0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICBMT0NBTF9DRkxBR1MgKz0gLURIQVZFX0FSTV9UTFNfUkVHSVNURVIKLWVuZGlmCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJ1aWxkIHRoZSB3cmFwcGVyIE9wZW5HTCBFUyAyLnggbGlicmFyeQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gCQlcCi0JR0xFUzIvZ2wyLmNwcC5hcm0gCVwKLSMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGliRUdMCi1MT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKLUxPQ0FMX01PRFVMRTo9IGxpYkdMRVN2MgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmRsCi0jIHdlIG5lZWQgdG8gYWNjZXNzIHRoZSBwcml2YXRlIEJpb25pYyBoZWFkZXIgPGJpb25pY190bHMuaD4KLWlmZXEgKCQoQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIpLHRydWUpCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9BUk1fVExTX1JFR0lTVEVSCi1lbmRpZgotTE9DQUxfQ19JTkNMVURFUyArPSBiaW9uaWMvbGliYy9wcml2YXRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtRExPR19UQUc9XCJsaWJHTEVTdjJcIgotTE9DQUxfQ0ZMQUdTICs9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotaWZlcSAoJChBUkNIX0FSTV9IQVZFX1RMU19SRUdJU1RFUiksdHJ1ZSkKLSAgTE9DQUxfQ0ZMQUdTICs9IC1ESEFWRV9BUk1fVExTX1JFR0lTVEVSCi1lbmRpZgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgdGhlIEVUQzEgaG9zdCBzdGF0aWMgbGlicmFyeQotIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gCQlcCi0JRVRDMS9ldGMxLmNwcCAJXAotIwotCi1MT0NBTF9MRExJQlMgOj0gLWxwdGhyZWFkIC1sZGwKLUxPQ0FMX01PRFVMRTo9IGxpYkVUQzEKLQotaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgdGhlIEVUQzEgZGV2aWNlIGxpYnJhcnkKLSMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IAkJXAotCUVUQzEvZXRjMS5jcHAgCVwKLSMKLQotTE9DQUxfTERMSUJTIDo9IC1scHRocmVhZCAtbGRsCi1MT0NBTF9NT0RVTEU6PSBsaWJFVEMxCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML0xvYWRlci5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvTG9hZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMDE2Yy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvTG9hZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgImVnbGRlZnMuaCIKLSNpbmNsdWRlICJnbGVzdHJhY2UuaCIKLSNpbmNsdWRlICJob29rcy5oIgotI2luY2x1ZGUgIkxvYWRlci5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotLyoKLSAqIEVHTCBkcml2ZXJzIGFyZSBjYWxsZWQKLSAqIAotICogL3N5c3RlbS9saWIvZWdsL2xpYntbRUdMfEdMRVN2MV9DTXxHTEVTdjJdIHwgR0xFU31fJFRBRy5zbyAKLSAqIAotICovCi0KLUFORFJPSURfU0lOR0xFVE9OX1NUQVRJQ19JTlNUQU5DRSggTG9hZGVyICkKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY2hlY2sgd2hldGhlciB3ZSBydW4gaW5zaWRlIHRoZSBlbXVsYXRvciwKLSAqIGFuZCBpZiB0aGlzIGlzIHRoZSBjYXNlIHdoZXRoZXIgR0xFUyBHUFUgZW11bGF0aW9uIGlzIHN1cHBvcnRlZC4KLSAqCi0gKiBSZXR1cm5lZCB2YWx1ZXMgYXJlOgotICogIC0xICAgLT4gbm90IHJ1bm5pbmcgaW5zaWRlIHRoZSBlbXVsYXRvcgotICogICAwICAgLT4gcnVubmluZyBpbnNpZGUgdGhlIGVtdWxhdG9yLCBidXQgR1BVIGVtdWxhdGlvbiBub3Qgc3VwcG9ydGVkCi0gKiAgIDEgICAtPiBydW5uaW5nIGluc2lkZSB0aGUgZW11bGF0b3IsIEdQVSBlbXVsYXRpb24gaXMgc3VwcG9ydGVkCi0gKiAgICAgICAgICB0aHJvdWdoIHRoZSAiZW11bGF0aW9uIiBjb25maWcuCi0gKi8KLXN0YXRpYyBpbnQKLWNoZWNrR2xlc0VtdWxhdGlvblN0YXR1cyh2b2lkKQotewotICAgIC8qIFdlJ3JlIGdvaW5nIHRvIGNoZWNrIGZvciB0aGUgZm9sbG93aW5nIGtlcm5lbCBwYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogICAgcWVtdT0xICAgICAgICAgICAgICAgICAgICAgIC0+IHRlbGxzIHVzIHRoYXQgd2UgcnVuIGluc2lkZSB0aGUgZW11bGF0b3IKLSAgICAgKiAgICBhbmRyb2lkLnFlbXUuZ2xlcz08bnVtYmVyPiAgLT4gdGVsbHMgdXMgdGhlIEdMRVMgR1BVIGVtdWxhdGlvbiBzdGF0dXMKLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB3ZSB3aWxsIHJldHVybiA8bnVtYmVyPiBpZiB3ZSBmaW5kIGl0LiBUaGlzIGxldCB1cyBzdXBwb3J0Ci0gICAgICogbW9yZSBhZGRpdGlvbm5hbCBlbXVsYXRpb24gbW9kZXMgaW4gdGhlIGZ1dHVyZS4KLSAgICAgKi8KLSAgICBjaGFyICBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaW50ICAgcmVzdWx0ID0gLTE7Ci0KLSAgICAvKiBGaXJzdCwgY2hlY2sgZm9yIHFlbXU9MSAqLwotICAgIHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUiLHByb3AsIjAiKTsKLSAgICBpZiAoYXRvaShwcm9wKSAhPSAxKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBXZSBhcmUgaW4gdGhlIGVtdWxhdG9yLCBnZXQgR1BVIHN0YXR1cyB2YWx1ZSAqLwotICAgIHByb3BlcnR5X2dldCgicm8ua2VybmVsLnFlbXUuZ2xlcyIscHJvcCwiMCIpOwotICAgIHJldHVybiBhdG9pKHByb3ApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxvYWRlcjo6ZHJpdmVyX3Q6OmRyaXZlcl90KHZvaWQqIGdsZXMpIAotewotICAgIGRzb1swXSA9IGdsZXM7Ci0gICAgZm9yIChzaXplX3QgaT0xIDsgaTxORUxFTShkc28pIDsgaSsrKQotICAgICAgICBkc29baV0gPSAwOwotfQotCi1Mb2FkZXI6OmRyaXZlcl90Ojp+ZHJpdmVyX3QoKSAKLXsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPE5FTEVNKGRzbykgOyBpKyspIHsKLSAgICAgICAgaWYgKGRzb1tpXSkgewotICAgICAgICAgICAgZGxjbG9zZShkc29baV0pOwotICAgICAgICAgICAgZHNvW2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgTG9hZGVyOjpkcml2ZXJfdDo6c2V0KHZvaWQqIGhuZCwgaW50MzJfdCBhcGkpCi17Ci0gICAgc3dpdGNoIChhcGkpIHsKLSAgICAgICAgY2FzZSBFR0w6Ci0gICAgICAgICAgICBkc29bMF0gPSBobmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHTEVTdjFfQ006Ci0gICAgICAgICAgICBkc29bMV0gPSBobmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHTEVTdjI6Ci0gICAgICAgICAgICBkc29bMl0gPSBobmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBCQURfSU5ERVg7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Mb2FkZXI6OkxvYWRlcigpCi17Ci0gICAgY2hhciBsaW5lWzI1Nl07Ci0gICAgY2hhciB0YWdbMjU2XTsKLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgR0xFUyBlbXVsYXRpb24gKi8KLSAgICBpZiAoY2hlY2tHbGVzRW11bGF0aW9uU3RhdHVzKCkgPT0gMCkgewotICAgICAgICBBTE9HRCgiRW11bGF0b3Igd2l0aG91dCBHUFUgc3VwcG9ydCBkZXRlY3RlZC4gIgotICAgICAgICAgICAgICAiRmFsbGJhY2sgdG8gc29mdHdhcmUgcmVuZGVyZXIuIik7Ci0gICAgICAgIG1Ecml2ZXJUYWcuc2V0VG8oImFuZHJvaWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSwgdXNlIGVnbC5jZmcgKi8KLSAgICBGSUxFKiBjZmcgPSBmb3BlbigiL3N5c3RlbS9saWIvZWdsL2VnbC5jZmciLCAiciIpOwotICAgIGlmIChjZmcgPT0gTlVMTCkgewotICAgICAgICAvLyBkZWZhdWx0IGNvbmZpZwotICAgICAgICBBTE9HRCgiZWdsLmNmZyBub3QgZm91bmQsIHVzaW5nIGRlZmF1bHQgY29uZmlnIik7Ci0gICAgICAgIG1Ecml2ZXJUYWcuc2V0VG8oImFuZHJvaWQiKTsKLSAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAoZmdldHMobGluZSwgMjU2LCBjZmcpKSB7Ci0gICAgICAgICAgICBpbnQgZHB5LCBpbXBsOwotICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJXUgJXUgJXMiLCAmZHB5LCAmaW1wbCwgdGFnKSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HRCgiPj4+ICV1ICV1ICVzIiwgZHB5LCBpbXBsLCB0YWcpOwotICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgbG9hZCB0aGUgaC93IGFjY2VsZXJhdGVkIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKHRhZyAhPSBTdHJpbmc4KCJhbmRyb2lkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbURyaXZlclRhZyA9IHRhZzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmNsb3NlKGNmZyk7Ci0gICAgfQotfQotCi1Mb2FkZXI6On5Mb2FkZXIoKQotewotICAgIEdMVHJhY2Vfc3RvcCgpOwotfQotCi12b2lkKiBMb2FkZXI6Om9wZW4oZWdsX2Nvbm5lY3Rpb25fdCogY254KQotewotICAgIHZvaWQqIGRzbzsKLSAgICBkcml2ZXJfdCogaG5kID0gMDsKLSAgICAKLSAgICBjaGFyIGNvbnN0KiB0YWcgPSBtRHJpdmVyVGFnLnN0cmluZygpOwotICAgIGlmICh0YWcpIHsKLSAgICAgICAgZHNvID0gbG9hZF9kcml2ZXIoIkdMRVMiLCB0YWcsIGNueCwgRUdMIHwgR0xFU3YxX0NNIHwgR0xFU3YyKTsKLSAgICAgICAgaWYgKGRzbykgewotICAgICAgICAgICAgaG5kID0gbmV3IGRyaXZlcl90KGRzbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBBbHdheXMgbG9hZCBFR0wgZmlyc3QKLSAgICAgICAgICAgIGRzbyA9IGxvYWRfZHJpdmVyKCJFR0wiLCB0YWcsIGNueCwgRUdMKTsKLSAgICAgICAgICAgIGlmIChkc28pIHsKLSAgICAgICAgICAgICAgICBobmQgPSBuZXcgZHJpdmVyX3QoZHNvKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgbW9yZSBhdXRvbWF0ZWQKLSAgICAgICAgICAgICAgICBobmQtPnNldCggbG9hZF9kcml2ZXIoIkdMRVN2MV9DTSIsIHRhZywgY254LCBHTEVTdjFfQ00pLCBHTEVTdjFfQ00gKTsKLSAgICAgICAgICAgICAgICBobmQtPnNldCggbG9hZF9kcml2ZXIoIkdMRVN2MiIsICAgIHRhZywgY254LCBHTEVTdjIpLCAgICBHTEVTdjIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIExPR19GQVRBTF9JRighaW5kZXggJiYgIWhuZCwKLSAgICAgICAgICAgICJjb3VsZG4ndCBmaW5kIHRoZSBkZWZhdWx0IE9wZW5HTCBFUyBpbXBsZW1lbnRhdGlvbiAiCi0gICAgICAgICAgICAiZm9yIGRlZmF1bHQgZGlzcGxheSIpOwotICAgIAotICAgIHJldHVybiAodm9pZCopaG5kOwotfQotCi1zdGF0dXNfdCBMb2FkZXI6OmNsb3NlKHZvaWQqIGRyaXZlcikKLXsKLSAgICBkcml2ZXJfdCogaG5kID0gKGRyaXZlcl90Kilkcml2ZXI7Ci0gICAgZGVsZXRlIGhuZDsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgTG9hZGVyOjppbml0X2FwaSh2b2lkKiBkc28sIAotICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgKiBhcGksIAotICAgICAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKiBjdXJyLCAKLSAgICAgICAgZ2V0UHJvY0FkZHJlc3NUeXBlIGdldFByb2NBZGRyZXNzKSAKLXsKLSAgICBjb25zdCBzc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBzY3JhcFtTSVpFXTsKLSAgICB3aGlsZSAoKmFwaSkgewotICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSA9ICphcGk7Ci0gICAgICAgIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgZiA9IAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpZGxzeW0oZHNvLCBuYW1lKTsKLSAgICAgICAgaWYgKGYgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gY291bGRuJ3QgZmluZCB0aGUgZW50cnktcG9pbnQsIHVzZSBlZ2xHZXRQcm9jQWRkcmVzcygpCi0gICAgICAgICAgICBmID0gZ2V0UHJvY0FkZHJlc3MobmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGYgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gVHJ5IHdpdGhvdXQgdGhlIE9FUyBwb3N0Zml4Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gc3NpemVfdChzdHJsZW4obmFtZSkpIC0gMzsKLSAgICAgICAgICAgIGlmICgoaW5kZXg+MCAmJiAoaW5kZXg8U0laRS0xKSkgJiYgKCFzdHJjbXAobmFtZStpbmRleCwgIk9FUyIpKSkgewotICAgICAgICAgICAgICAgIHN0cm5jcHkoc2NyYXAsIG5hbWUsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBzY3JhcFtpbmRleF0gPSAwOwotICAgICAgICAgICAgICAgIGYgPSAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlkbHN5bShkc28sIHNjcmFwKTsKLSAgICAgICAgICAgICAgICAvL0FMT0dEX0lGKGYsICJmb3VuZCA8JXM+IGluc3RlYWQiLCBzY3JhcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGYgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gVHJ5IHdpdGggdGhlIE9FUyBwb3N0Zml4Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gc3NpemVfdChzdHJsZW4obmFtZSkpIC0gMzsKLSAgICAgICAgICAgIGlmIChpbmRleD4wICYmIHN0cmNtcChuYW1lK2luZGV4LCAiT0VTIikpIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihzY3JhcCwgU0laRSwgIiVzT0VTIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWRsc3ltKGRzbywgc2NyYXApOwotICAgICAgICAgICAgICAgIC8vQUxPR0RfSUYoZiwgImZvdW5kIDwlcz4gaW5zdGVhZCIsIHNjcmFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvL0FMT0dEKCIlcyIsIG5hbWUpOwotICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsX3VuaW1wbGVtZW50ZWQ7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBHTF9FWFRfZGVidWdfbGFiZWwgaXMgc3BlY2lhbCwgd2UgYWx3YXlzIHJlcG9ydCBpdCBhcwotICAgICAgICAgICAgICogc3VwcG9ydGVkLCBpdCdzIGhhbmRsZWQgYnkgR0xFU190cmFjZS4gSWYgR0xFU190cmFjZSBpcyBub3QKLSAgICAgICAgICAgICAqIGVuYWJsZWQsIHRoZW4gdGhlc2UgYXJlIG5vLW9wcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQiKSkgewotICAgICAgICAgICAgICAgIGYgPSAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbF9ub29wOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJnbFB1c2hHcm91cE1hcmtlckVYVCIpKSB7Ci0gICAgICAgICAgICAgICAgZiA9IChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKWdsX25vb3A7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImdsUG9wR3JvdXBNYXJrZXJFWFQiKSkgewotICAgICAgICAgICAgICAgIGYgPSAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlnbF9ub29wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICpjdXJyKysgPSBmOwotICAgICAgICBhcGkrKzsKLSAgICB9Ci19Ci0KLXZvaWQgKkxvYWRlcjo6bG9hZF9kcml2ZXIoY29uc3QgY2hhcioga2luZCwgY29uc3QgY2hhciAqdGFnLAotICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjbngsIHVpbnQzMl90IG1hc2spCi17Ci0gICAgY2hhciBkcml2ZXJfYWJzb2x1dGVfcGF0aFtQQVRIX01BWF07Ci0gICAgY29uc3QgY2hhciogY29uc3Qgc2VhcmNoMSA9ICIvdmVuZG9yL2xpYi9lZ2wvbGliJXNfJXMuc28iOwotICAgIGNvbnN0IGNoYXIqIGNvbnN0IHNlYXJjaDIgPSAiL3N5c3RlbS9saWIvZWdsL2xpYiVzXyVzLnNvIjsKLQotICAgIHNucHJpbnRmKGRyaXZlcl9hYnNvbHV0ZV9wYXRoLCBQQVRIX01BWCwgc2VhcmNoMSwga2luZCwgdGFnKTsKLSAgICBpZiAoYWNjZXNzKGRyaXZlcl9hYnNvbHV0ZV9wYXRoLCBSX09LKSkgewotICAgICAgICBzbnByaW50Zihkcml2ZXJfYWJzb2x1dGVfcGF0aCwgUEFUSF9NQVgsIHNlYXJjaDIsIGtpbmQsIHRhZyk7Ci0gICAgICAgIGlmIChhY2Nlc3MoZHJpdmVyX2Fic29sdXRlX3BhdGgsIFJfT0spKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgb2Z0ZW4sIHdlIGRvbid0IHdhbnQgdG8gbG9nIGFuIGVycm9yCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQqIGRzbyA9IGRsb3Blbihkcml2ZXJfYWJzb2x1dGVfcGF0aCwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICBpZiAoZHNvID09IDApIHsKLSAgICAgICAgY29uc3QgY2hhciogZXJyID0gZGxlcnJvcigpOwotICAgICAgICBBTE9HRSgibG9hZF9kcml2ZXIoJXMpOiAlcyIsIGRyaXZlcl9hYnNvbHV0ZV9wYXRoLCBlcnI/ZXJyOiJ1bmtub3duIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEFMT0dEKCJsb2FkZWQgJXMiLCBkcml2ZXJfYWJzb2x1dGVfcGF0aCk7Ci0KLSAgICBpZiAobWFzayAmIEVHTCkgewotICAgICAgICBnZXRQcm9jQWRkcmVzcyA9IChnZXRQcm9jQWRkcmVzc1R5cGUpZGxzeW0oZHNvLCAiZWdsR2V0UHJvY0FkZHJlc3MiKTsKLQotICAgICAgICBBTE9HRV9JRighZ2V0UHJvY0FkZHJlc3MsIAotICAgICAgICAgICAgICAgICJjYW4ndCBmaW5kIGVnbEdldFByb2NBZGRyZXNzKCkgaW4gJXMiLCBkcml2ZXJfYWJzb2x1dGVfcGF0aCk7Ci0KLSAgICAgICAgZWdsX3QqIGVnbCA9ICZjbngtPmVnbDsKLSAgICAgICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSogY3VyciA9Ci0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSopZWdsOwotICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgKiBhcGkgPSBlZ2xfbmFtZXM7Ci0gICAgICAgIHdoaWxlICgqYXBpKSB7Ci0gICAgICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSA9ICphcGk7Ci0gICAgICAgICAgICBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGYgPSAKLSAgICAgICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSlkbHN5bShkc28sIG5hbWUpOwotICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIGNvdWxkbid0IGZpbmQgdGhlIGVudHJ5LXBvaW50LCB1c2UgZWdsR2V0UHJvY0FkZHJlc3MoKQotICAgICAgICAgICAgICAgIGYgPSBnZXRQcm9jQWRkcmVzcyhuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpjdXJyKysgPSBmOwotICAgICAgICAgICAgYXBpKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG1hc2sgJiBHTEVTdjFfQ00pIHsKLSAgICAgICAgaW5pdF9hcGkoZHNvLCBnbF9uYW1lcywKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKikKLSAgICAgICAgICAgICAgICAmY254LT5ob29rc1tlZ2xfY29ubmVjdGlvbl90OjpHTEVTdjFfSU5ERVhdLT5nbCwKLSAgICAgICAgICAgIGdldFByb2NBZGRyZXNzKTsKLSAgICB9Ci0KLSAgICBpZiAobWFzayAmIEdMRVN2MikgewotICAgICAgaW5pdF9hcGkoZHNvLCBnbF9uYW1lcywKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKikKLSAgICAgICAgICAgICAgICAmY254LT5ob29rc1tlZ2xfY29ubmVjdGlvbl90OjpHTEVTdjJfSU5ERVhdLT5nbCwKLSAgICAgICAgICAgIGdldFByb2NBZGRyZXNzKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGRzbzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9Mb2FkZXIuaCBiL29wZW5nbC9saWJzL0VHTC9Mb2FkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NzNjYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvTG9hZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0VHTF9MT0FERVJfSAotI2RlZmluZSBBTkRST0lEX0VHTF9MT0FERVJfSAotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBlZ2xfY29ubmVjdGlvbl90OwotCi1jbGFzcyBMb2FkZXIgOiBwdWJsaWMgU2luZ2xldG9uPExvYWRlcj4KLXsKLSAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPExvYWRlcj47Ci0KLSAgICB0eXBlZGVmIF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUgKCpnZXRQcm9jQWRkcmVzc1R5cGUpKAotICAgICAgICAgICAgY29uc3QgY2hhciopOwotICAgCi0gICAgZW51bSB7Ci0gICAgICAgIEVHTCAgICAgICAgID0gMHgwMSwKLSAgICAgICAgR0xFU3YxX0NNICAgPSAweDAyLAotICAgICAgICBHTEVTdjIgICAgICA9IDB4MDQKLSAgICB9OwotICAgIHN0cnVjdCBkcml2ZXJfdCB7Ci0gICAgICAgIGRyaXZlcl90KHZvaWQqIGdsZXMpOwotICAgICAgICB+ZHJpdmVyX3QoKTsKLSAgICAgICAgc3RhdHVzX3Qgc2V0KHZvaWQqIGhuZCwgaW50MzJfdCBhcGkpOwotICAgICAgICB2b2lkKiBkc29bM107Ci0gICAgfTsKLSAgICAKLSAgICBTdHJpbmc4IG1Ecml2ZXJUYWc7Ci0gICAgZ2V0UHJvY0FkZHJlc3NUeXBlIGdldFByb2NBZGRyZXNzOwotICAgIAotcHVibGljOgotICAgIH5Mb2FkZXIoKTsKLSAgICAKLSAgICB2b2lkKiBvcGVuKGVnbF9jb25uZWN0aW9uX3QqIGNueCk7Ci0gICAgc3RhdHVzX3QgY2xvc2Uodm9pZCogZHJpdmVyKTsKLSAgICAKLXByaXZhdGU6Ci0gICAgTG9hZGVyKCk7Ci0gICAgdm9pZCAqbG9hZF9kcml2ZXIoY29uc3QgY2hhcioga2luZCwgY29uc3QgY2hhciAqdGFnLCBlZ2xfY29ubmVjdGlvbl90KiBjbngsIHVpbnQzMl90IG1hc2spOwotCi0gICAgc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLSAgICB2b2lkIGluaXRfYXBpKHZvaWQqIGRzbywgCi0gICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgKiBhcGksIAotICAgICAgICAgICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSogY3VyciwgCi0gICAgICAgICAgICBnZXRQcm9jQWRkcmVzc1R5cGUgZ2V0UHJvY0FkZHJlc3MpOyAKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvKiBBTkRST0lEX0VHTF9MT0FERVJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbC5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjNWNlMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGN1dGlscy9tZW1vcnkuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgImVnbGRlZnMuaCIKLSNpbmNsdWRlICJlZ2xfaW1wbC5oIgotI2luY2x1ZGUgImVnbF90bHMuaCIKLSNpbmNsdWRlICJnbGVzdHJhY2UuaCIKLSNpbmNsdWRlICJob29rcy5oIgotI2luY2x1ZGUgIkxvYWRlci5oIgotCi0jaW5jbHVkZSAiZWdsX2Rpc3BsYXkuaCIKLSNpbmNsdWRlICJlZ2xfb2JqZWN0LmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZWdsX2Nvbm5lY3Rpb25fdCBnRUdMSW1wbDsKLWdsX2hvb2tzX3QgZ0hvb2tzWzJdOwotZ2xfaG9va3NfdCBnSG9va3NOb0NvbnRleHQ7Ci1wdGhyZWFkX2tleV90IGdHTFdyYXBwZXJLZXkgPSAtMTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgRUdMX1RSQUNFCi0KLUVHTEFQSSBwdGhyZWFkX2tleV90IGdHTFRyYWNlS2V5ID0gLTE7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IGdFR0xEZWJ1Z0xldmVsOwotCi1zdGF0aWMgaW50IHNFR0xUcmFjZUxldmVsOwotc3RhdGljIGludCBzRUdMQXBwbGljYXRpb25UcmFjZUxldmVsOwotCi1leHRlcm4gZ2xfaG9va3NfdCBnSG9va3NUcmFjZTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldEdsVHJhY2VUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgewotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0dMVHJhY2VLZXksIHZhbHVlKTsKLX0KLQotZ2xfaG9va3NfdCBjb25zdCogZ2V0R0xUcmFjZVRocmVhZFNwZWNpZmljKCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxnbF9ob29rc190Kj4ocHRocmVhZF9nZXRzcGVjaWZpYyhnR0xUcmFjZUtleSkpOwotfQotCi12b2lkIGluaXRFZ2xUcmFjZUxldmVsKCkgewotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC50cmFjZSIsIHZhbHVlLCAiMCIpOwotICAgIGludCBwcm9wZXJ0eUxldmVsID0gYXRvaSh2YWx1ZSk7Ci0gICAgaW50IGFwcGxpY2F0aW9uTGV2ZWwgPSBzRUdMQXBwbGljYXRpb25UcmFjZUxldmVsOwotICAgIHNFR0xUcmFjZUxldmVsID0gcHJvcGVydHlMZXZlbCA+IGFwcGxpY2F0aW9uTGV2ZWwgPyBwcm9wZXJ0eUxldmVsIDogYXBwbGljYXRpb25MZXZlbDsKLQotICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLmRlYnVnX3Byb2MiLCB2YWx1ZSwgIiIpOwotICAgIGlmIChzdHJsZW4odmFsdWUpID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIGxvbmcgcGlkID0gZ2V0cGlkKCk7Ci0gICAgY2hhciBwcm9jUGF0aFsxMjhdID0ge307Ci0gICAgc3ByaW50Zihwcm9jUGF0aCwgIi9wcm9jLyVsZC9jbWRsaW5lIiwgcGlkKTsKLSAgICBGSUxFICogZmlsZSA9IGZvcGVuKHByb2NQYXRoLCAiciIpOwotICAgIGlmIChmaWxlKSB7Ci0gICAgICAgIGNoYXIgY21kbGluZVsyNTZdID0ge307Ci0gICAgICAgIGlmIChmZ2V0cyhjbWRsaW5lLCBzaXplb2YoY21kbGluZSkgLSAxLCBmaWxlKSkgewotICAgICAgICAgICAgaWYgKCFzdHJuY21wKHZhbHVlLCBjbWRsaW5lLCBzdHJsZW4odmFsdWUpKSkgewotICAgICAgICAgICAgICAgIC8vIHNldCBFR0wgZGVidWcgaWYgdGhlICJkZWJ1Zy5lZ2wuZGVidWdfcHJvYyIgcHJvcGVydHkKLSAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcmVmaXggb2YgdGhpcyBhcHBsaWNhdGlvbidzIGNvbW1hbmQgbGluZQotICAgICAgICAgICAgICAgIGdFR0xEZWJ1Z0xldmVsID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmY2xvc2UoZmlsZSk7Ci0gICAgfQotCi0gICAgaWYgKGdFR0xEZWJ1Z0xldmVsID4gMCkgewotICAgICAgICBHTFRyYWNlX3N0YXJ0KCk7Ci0gICAgfQotfQotCi12b2lkIHNldEdMSG9va3NUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgewotICAgIGlmIChzRUdMVHJhY2VMZXZlbCA+IDApIHsKLSAgICAgICAgc2V0R2xUcmFjZVRocmVhZFNwZWNpZmljKHZhbHVlKTsKLSAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYygmZ0hvb2tzVHJhY2UpOwotICAgIH0gZWxzZSBpZiAoZ0VHTERlYnVnTGV2ZWwgPiAwICYmIHZhbHVlICE9ICZnSG9va3NOb0NvbnRleHQpIHsKLSAgICAgICAgc2V0R2xUcmFjZVRocmVhZFNwZWNpZmljKHZhbHVlKTsKLSAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYyhHTFRyYWNlX2dldEdMSG9va3MoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0R2xUaHJlYWRTcGVjaWZpYyh2YWx1ZSk7Ci0gICAgfQotfQotCi0vKgotICogR2xvYmFsIGVudHJ5IHBvaW50IHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBtb2RpZnkgdGhlaXIgb3duIHRyYWNlIGxldmVsLgotICogVGhlIGVmZmVjdGl2ZSB0cmFjZSBsZXZlbCBpcyB0aGUgbWF4IG9mIHRoaXMgbGV2ZWwgYW5kIHRoZSB2YWx1ZSBvZiBkZWJ1Zy5lZ2wudHJhY2UuCi0gKi8KLWV4dGVybiAiQyIKLXZvaWQgc2V0R0xUcmFjZUxldmVsKGludCBsZXZlbCkgewotICAgIHNFR0xBcHBsaWNhdGlvblRyYWNlTGV2ZWwgPSBsZXZlbDsKLX0KLQotI2Vsc2UKLQotdm9pZCBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoZ2xfaG9va3NfdCBjb25zdCAqdmFsdWUpIHsKLSAgICBzZXRHbFRocmVhZFNwZWNpZmljKHZhbHVlKTsKLX0KLQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGludCBnbF9ub19jb250ZXh0KCkgewotICAgIGlmIChlZ2xfdGxzX3Q6OmxvZ05vQ29udGV4dENhbGwoKSkgewotICAgICAgICBBTE9HRSgiY2FsbCB0byBPcGVuR0wgRVMgQVBJIHdpdGggbm8gY3VycmVudCBjb250ZXh0ICIKLSAgICAgICAgICAgICAiKGxvZ2dlZCBvbmNlIHBlciB0aHJlYWQpIik7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5lZ2wuY2FsbHN0YWNrIiwgdmFsdWUsICIwIik7Ci0gICAgICAgIGlmIChhdG9pKHZhbHVlKSkgewotICAgICAgICAgICAgQ2FsbFN0YWNrIHN0YWNrOwotICAgICAgICAgICAgc3RhY2sudXBkYXRlKCk7Ci0gICAgICAgICAgICBzdGFjay5kdW1wKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGVhcmx5X2VnbF9pbml0KHZvaWQpIAotewotI2lmICFVU0VfRkFTVF9UTFNfS0VZCi0gICAgcHRocmVhZF9rZXlfY3JlYXRlKCZnR0xXcmFwcGVyS2V5LCBOVUxMKTsKLSNlbmRpZgotI2lmIEVHTF9UUkFDRQotICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmZ0dMVHJhY2VLZXksIE5VTEwpOwotICAgIGluaXRFZ2xUcmFjZUxldmVsKCk7Ci0jZW5kaWYKLSAgICB1aW50MzJfdCBhZGRyID0gKHVpbnQzMl90KSgodm9pZCopZ2xfbm9fY29udGV4dCk7Ci0gICAgYW5kcm9pZF9tZW1zZXQzMigKLSAgICAgICAgICAgICh1aW50MzJfdCopKHZvaWQqKSZnSG9va3NOb0NvbnRleHQsIAotICAgICAgICAgICAgYWRkciwgCi0gICAgICAgICAgICBzaXplb2YoZ0hvb2tzTm9Db250ZXh0KSk7Ci0KLSAgICBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoJmdIb29rc05vQ29udGV4dCk7Ci19Ci0KLXN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlX2NvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKLXN0YXRpYyBpbnQgc0Vhcmx5SW5pdFN0YXRlID0gcHRocmVhZF9vbmNlKCZvbmNlX2NvbnRyb2wsICZlYXJseV9lZ2xfaW5pdCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZWdsX2Rpc3BsYXlfdCogdmFsaWRhdGVfZGlzcGxheShFR0xEaXNwbGF5IGRweSkgewotICAgIGVnbF9kaXNwbGF5X3QgKiBjb25zdCBkcCA9IGdldF9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgKGVnbF9kaXNwbGF5X3QqKU5VTEwpOwotICAgIGlmICghZHAtPmlzUmVhZHkoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9OT1RfSU5JVElBTElaRUQsIChlZ2xfZGlzcGxheV90KilOVUxMKTsKLQotICAgIHJldHVybiBkcDsKLX0KLQotZWdsX2Nvbm5lY3Rpb25fdCogdmFsaWRhdGVfZGlzcGxheV9jb25maWcoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZywKLSAgICAgICAgZWdsX2Rpc3BsYXlfdCBjb25zdComIGRwKSB7Ci0gICAgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkKLSAgICAgICAgcmV0dXJuIChlZ2xfY29ubmVjdGlvbl90KikgTlVMTDsKLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gPT0gMCkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIChlZ2xfY29ubmVjdGlvbl90KilOVUxMKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNueDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBHTHVieXRlICogZWdsX2dldF9zdHJpbmdfZm9yX2N1cnJlbnRfY29udGV4dChHTGVudW0gbmFtZSkgewotICAgIC8vIE5PVEU6IHJldHVybmluZyBOVUxMIGhlcmUgd2lsbCBmYWxsLWJhY2sgdG8gdGhlIGRlZmF1bHQKLSAgICAvLyBpbXBsZW1lbnRhdGlvbi4KLQotICAgIEVHTENvbnRleHQgY29udGV4dCA9IGVnbF90bHNfdDo6Z2V0Q29udGV4dCgpOwotICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY29udGV4dCk7Ci0gICAgaWYgKGMgPT0gTlVMTCkgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBieSBjb25zdHJ1Y3Rpb24KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAobmFtZSAhPSBHTF9FWFRFTlNJT05TKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiAoY29uc3QgR0x1Ynl0ZSAqKWMtPmdsX2V4dGVuc2lvbnMuc3RyaW5nKCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gdGhpcyBtdXRleCBwcm90ZWN0czoKLS8vICAgIGQtPmRpc3BbXQotLy8gICAgZWdsX2luaXRfZHJpdmVyc19sb2NrZWQoKQotLy8KLXN0YXRpYyBFR0xCb29sZWFuIGVnbF9pbml0X2RyaXZlcnNfbG9ja2VkKCkgewotICAgIGlmIChzRWFybHlJbml0U3RhdGUpIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnkgc3RhdGljIGN0b3IuIHNob3VsZCBiZSBzZXQgaGVyZS4KLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBnZXQgb3VyIGRyaXZlciBsb2FkZXIKLSAgICBMb2FkZXImIGxvYWRlcihMb2FkZXI6OmdldEluc3RhbmNlKCkpOwotCi0gICAgLy8gZHluYW1pY2FsbHkgbG9hZCBvdXIgRUdMIGltcGxlbWVudGF0aW9uCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyA9PSAwKSB7Ci0gICAgICAgIGNueC0+aG9va3NbZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YxX0lOREVYXSA9Ci0gICAgICAgICAgICAgICAgJmdIb29rc1tlZ2xfY29ubmVjdGlvbl90OjpHTEVTdjFfSU5ERVhdOwotICAgICAgICBjbngtPmhvb2tzW2VnbF9jb25uZWN0aW9uX3Q6OkdMRVN2Ml9JTkRFWF0gPQotICAgICAgICAgICAgICAgICZnSG9va3NbZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YyX0lOREVYXTsKLSAgICAgICAgY254LT5kc28gPSBsb2FkZXIub3BlbihjbngpOwotICAgIH0KLQotICAgIHJldHVybiBjbngtPmRzbyA/IEVHTF9UUlVFIDogRUdMX0ZBTFNFOwotfQotCi1zdGF0aWMgcHRocmVhZF9tdXRleF90IHNJbml0RHJpdmVyTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCi1FR0xCb29sZWFuIGVnbF9pbml0X2RyaXZlcnMoKSB7Ci0gICAgRUdMQm9vbGVhbiByZXM7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZzSW5pdERyaXZlck11dGV4KTsKLSAgICByZXMgPSBlZ2xfaW5pdF9kcml2ZXJzX2xvY2tlZCgpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzSW5pdERyaXZlck11dGV4KTsKLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIGdsX3VuaW1wbGVtZW50ZWQoKSB7Ci0gICAgQUxPR0UoImNhbGxlZCB1bmltcGxlbWVudGVkIE9wZW5HTCBFUyBBUEkiKTsKLX0KLQotdm9pZCBnbF9ub29wKCkgewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBVU0VfRkFTVF9UTFNfS0VZCi0KLS8vIFdlIGhhdmUgYSBkZWRpY2F0ZWQgVExTIHNsb3QgaW4gYmlvbmljCi1zdGF0aWMgaW5saW5lIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIGdldF90bHNfaG9va3MoKSB7Ci0gICAgdm9sYXRpbGUgdm9pZCAqdGxzX2Jhc2UgPSBfX2dldF90bHMoKTsKLSAgICBnbF9ob29rc190IGNvbnN0ICogdm9sYXRpbGUgKiB0bHNfaG9va3MgPQotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxnbF9ob29rc190IGNvbnN0ICogdm9sYXRpbGUgKj4odGxzX2Jhc2UpOwotICAgIHJldHVybiB0bHNfaG9va3M7Ci19Ci0KLXZvaWQgc2V0R2xUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgewotICAgIGdsX2hvb2tzX3QgY29uc3QgKiB2b2xhdGlsZSAqIHRsc19ob29rcyA9IGdldF90bHNfaG9va3MoKTsKLSAgICB0bHNfaG9va3NbVExTX1NMT1RfT1BFTkdMX0FQSV0gPSB2YWx1ZTsKLX0KLQotZ2xfaG9va3NfdCBjb25zdCogZ2V0R2xUaHJlYWRTcGVjaWZpYygpIHsKLSAgICBnbF9ob29rc190IGNvbnN0ICogdm9sYXRpbGUgKiB0bHNfaG9va3MgPSBnZXRfdGxzX2hvb2tzKCk7Ci0gICAgZ2xfaG9va3NfdCBjb25zdCogaG9va3MgPSB0bHNfaG9va3NbVExTX1NMT1RfT1BFTkdMX0FQSV07Ci0gICAgaWYgKGhvb2tzKSByZXR1cm4gaG9va3M7Ci0gICAgcmV0dXJuICZnSG9va3NOb0NvbnRleHQ7Ci19Ci0KLSNlbHNlCi0KLXZvaWQgc2V0R2xUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSkgewotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoZ0dMV3JhcHBlcktleSwgdmFsdWUpOwotfQotCi1nbF9ob29rc190IGNvbnN0KiBnZXRHbFRocmVhZFNwZWNpZmljKCkgewotICAgIGdsX2hvb2tzX3QgY29uc3QqIGhvb2tzID0gIHN0YXRpY19jYXN0PGdsX2hvb2tzX3QqPihwdGhyZWFkX2dldHNwZWNpZmljKGdHTFdyYXBwZXJLZXkpKTsKLSAgICBpZiAoaG9va3MpIHJldHVybiBob29rczsKLSAgICByZXR1cm4gJmdIb29rc05vQ29udGV4dDsKLX0KLQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEdMIC8gRUdMIGhvb2tzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSN1bmRlZiBHTF9FTlRSWQotI3VuZGVmIEVHTF9FTlRSWQotI2RlZmluZSBHTF9FTlRSWShfciwgX2FwaSwgLi4uKSAjX2FwaSwKLSNkZWZpbmUgRUdMX0VOVFJZKF9yLCBfYXBpLCAuLi4pICNfYXBpLAotCi1jaGFyIGNvbnN0ICogY29uc3QgZ2xfbmFtZXNbXSA9IHsKLSAgICAjaW5jbHVkZSAiZW50cmllcy5pbiIKLSAgICBOVUxMCi19OwotCi1jaGFyIGNvbnN0ICogY29uc3QgZWdsX25hbWVzW10gPSB7Ci0gICAgI2luY2x1ZGUgImVnbF9lbnRyaWVzLmluIgotICAgIE5VTEwKLX07Ci0KLSN1bmRlZiBHTF9FTlRSWQotI3VuZGVmIEVHTF9FTlRSWQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xBcGkuY3BwIGIvb3BlbmdsL2xpYnMvRUdML2VnbEFwaS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYmQ4MmQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbEFwaS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM5ICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21lbW9yeS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgImVnbF9pbXBsLmgiCi0jaW5jbHVkZSAiZWdsX3Rscy5oIgotI2luY2x1ZGUgImdsZXN0cmFjZS5oIgotI2luY2x1ZGUgImhvb2tzLmgiCi0KLSNpbmNsdWRlICJlZ2xfZGlzcGxheS5oIgotI2luY2x1ZGUgImVnbF9pbXBsLmgiCi0jaW5jbHVkZSAiZWdsX29iamVjdC5oIgotI2luY2x1ZGUgImVnbF90bHMuaCIKLSNpbmNsdWRlICJlZ2xkZWZzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgRUdMX1ZFUlNJT05fSFdfQU5EUk9JRCAgMHgzMTQzCi0KLXN0cnVjdCBleHRlbnRpb25fbWFwX3QgewotICAgIGNvbnN0IGNoYXIqIG5hbWU7Ci0gICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBhZGRyZXNzOwotfTsKLQotc3RhdGljIGNvbnN0IGV4dGVudGlvbl9tYXBfdCBzRXh0ZW50aW9uTWFwW10gPSB7Ci0gICAgeyAiZWdsTG9ja1N1cmZhY2VLSFIiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbExvY2tTdXJmYWNlS0hSIH0sCi0gICAgeyAiZWdsVW5sb2NrU3VyZmFjZUtIUiIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZWdsVW5sb2NrU3VyZmFjZUtIUiB9LAotICAgIHsgImVnbENyZWF0ZUltYWdlS0hSIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xDcmVhdGVJbWFnZUtIUiB9LAotICAgIHsgImVnbERlc3Ryb3lJbWFnZUtIUiIsCi0gICAgICAgICAgICAoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSkmZWdsRGVzdHJveUltYWdlS0hSIH0sCi0gICAgeyAiZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WIiwKLSAgICAgICAgICAgIChfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlKSZlZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYgfSwKLSAgICB7ICJlZ2xHZXRTeXN0ZW1UaW1lTlYiLAotICAgICAgICAgICAgKF9fZWdsTXVzdENhc3RUb1Byb3BlckZ1bmN0aW9uUG9pbnRlclR5cGUpJmVnbEdldFN5c3RlbVRpbWVOViB9LAotfTsKLQotLy8gYWNjZXNzZXMgcHJvdGVjdGVkIGJ5IHNFeHRlbnNpb25NYXBNdXRleAotc3RhdGljIERlZmF1bHRLZXllZFZlY3RvcjxTdHJpbmc4LCBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlPiBzR0xFeHRlbnRpb25NYXA7Ci1zdGF0aWMgaW50IHNHTEV4dGVudGlvblNsb3QgPSAwOwotc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzRXh0ZW5zaW9uTWFwTXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCi1zdGF0aWMgdm9pZCgqZmluZFByb2NBZGRyZXNzKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgIGNvbnN0IGV4dGVudGlvbl9tYXBfdCogbWFwLCBzaXplX3QgbikpKCkgewotICAgIGZvciAodWludDMyX3QgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIG1hcFtpXS5uYW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIG1hcFtpXS5hZGRyZXNzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLWV4dGVybiB2b2lkIHNldEdMSG9va3NUaHJlYWRTcGVjaWZpYyhnbF9ob29rc190IGNvbnN0ICp2YWx1ZSk7Ci1leHRlcm4gRUdMQm9vbGVhbiBlZ2xfaW5pdF9kcml2ZXJzKCk7Ci1leHRlcm4gY29uc3QgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBnRXh0ZW5zaW9uRm9yd2FyZGVyc1tNQVhfTlVNQkVSX09GX0dMX0VYVEVOU0lPTlNdOwotZXh0ZXJuIGludCBnRUdMRGVidWdMZXZlbDsKLWV4dGVybiBnbF9ob29rc190IGdIb29rc1RyYWNlOwotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJFcnJvcigpIHsgZWdsX3Rsc190OjpjbGVhckVycm9yKCk7IH0KLXN0YXRpYyBpbmxpbmUgRUdMQ29udGV4dCBnZXRDb250ZXh0KCkgeyByZXR1cm4gZWdsX3Rsc190OjpnZXRDb250ZXh0KCk7IH0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xEaXNwbGF5IGVnbEdldERpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcGxheSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICB1aW50MzJfdCBpbmRleCA9IHVpbnQzMl90KGRpc3BsYXkpOwotICAgIGlmIChpbmRleCA+PSBOVU1fRElTUExBWVMpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fRElTUExBWSk7Ci0gICAgfQotCi0gICAgaWYgKGVnbF9pbml0X2RyaXZlcnMoKSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfTk9fRElTUExBWSk7Ci0gICAgfQotCi0gICAgRUdMRGlzcGxheSBkcHkgPSBlZ2xfZGlzcGxheV90OjpnZXRGcm9tTmF0aXZlRGlzcGxheShkaXNwbGF5KTsKLSAgICByZXR1cm4gZHB5OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbml0aWFsaXphdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIGVnbEluaXRpYWxpemUoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgRUdMQm9vbGVhbiByZXMgPSBkcC0+aW5pdGlhbGl6ZShtYWpvciwgbWlub3IpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotRUdMQm9vbGVhbiBlZ2xUZXJtaW5hdGUoRUdMRGlzcGxheSBkcHkpCi17Ci0gICAgLy8gTk9URTogZG9uJ3QgdW5sb2FkIHRoZSBkcml2ZXJzIGIvYyBzb21lIEFQSXMgY2FuIGJlIGNhbGxlZAotICAgIC8vIGFmdGVyIGVnbFRlcm1pbmF0ZSgpIGhhcyBiZWVuIGNhbGxlZC4gZWdsVGVybWluYXRlKCkgb25seQotICAgIC8vIHRlcm1pbmF0ZXMgYW4gRUdMRGlzcGxheSwgbm90IGEgRUdMIGl0c2VsZi4KLQotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgRUdMQm9vbGVhbiByZXMgPSBkcC0+dGVybWluYXRlKCk7Ci0gICAgCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gY29uZmlndXJhdGlvbgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xCb29sZWFuIGVnbEdldENvbmZpZ3MoICAgRUdMRGlzcGxheSBkcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnICpjb25maWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgaWYgKG51bV9jb25maWc9PTApIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwotICAgICpudW1fY29uZmlnID0gMDsKLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28pIHsKLSAgICAgICAgcmVzID0gY254LT5lZ2wuZWdsR2V0Q29uZmlncygKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCBudW1fY29uZmlnKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1FR0xCb29sZWFuIGVnbENob29zZUNvbmZpZyggRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMaW50ICpudW1fY29uZmlnKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgaWYgKG51bV9jb25maWc9PTApIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwotICAgICpudW1fY29uZmlnID0gMDsKLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28pIHsKLSAgICAgICAgcmVzID0gY254LT5lZ2wuZWdsQ2hvb3NlQ29uZmlnKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCBudW1fY29uZmlnKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotRUdMQm9vbGVhbiBlZ2xHZXRDb25maWdBdHRyaWIoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCk7Ci0gICAgaWYgKCFjbngpIHJldHVybiBFR0xfRkFMU0U7Ci0gICAgCi0gICAgcmV0dXJuIGNueC0+ZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKLSAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc3VyZmFjZXMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKCAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCk7Ci0gICAgaWYgKGNueCkgewotICAgICAgICBFR0xEaXNwbGF5IGlEcHkgPSBkcC0+ZGlzcC5kcHk7Ci0gICAgICAgIEVHTGludCBmb3JtYXQ7Ci0KLSAgICAgICAgaWYgKG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3Qod2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9FR0wpICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRUdMTmF0aXZlV2luZG93VHlwZSAlcCBhbHJlYWR5IGNvbm5lY3RlZCB0byBhbm90aGVyIEFQSSIsCi0gICAgICAgICAgICAgICAgICAgIHdpbmRvdyk7Ci0gICAgICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9OQVRJVkVfV0lORE9XLCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZXQgdGhlIG5hdGl2ZSB3aW5kb3cncyBidWZmZXJzIGZvcm1hdCB0byBtYXRjaCB0aGlzIGNvbmZpZwotICAgICAgICBpZiAoY254LT5lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGlEcHksCi0gICAgICAgICAgICAgICAgY29uZmlnLCBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgJmZvcm1hdCkpIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gMCkgewotICAgICAgICAgICAgICAgIGludCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdCh3aW5kb3csIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciBzZXR0aW5nIG5hdGl2ZSB3aW5kb3cgcGl4ZWwgZm9ybWF0OiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCh3aW5kb3csIE5BVElWRV9XSU5ET1dfQVBJX0VHTCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX05BVElWRV9XSU5ET1csIEVHTF9OT19TVVJGQUNFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGUgRUdMIHNwZWMgcmVxdWlyZXMgdGhhdCBhIG5ldyBFR0xTdXJmYWNlIGRlZmF1bHQgdG8gc3dhcCBpbnRlcnZhbAotICAgICAgICAvLyAxLCBzbyBleHBsaWNpdGx5IHNldCB0aGF0IG9uIHRoZSB3aW5kb3cgaGVyZS4KLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53ID0gcmVpbnRlcnByZXRfY2FzdDxBTmF0aXZlV2luZG93Kj4od2luZG93KTsKLSAgICAgICAgYW53LT5zZXRTd2FwSW50ZXJ2YWwoYW53LCAxKTsKLQotICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjbngtPmVnbC5lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKAotICAgICAgICAgICAgICAgIGlEcHksIGNvbmZpZywgd2luZG93LCBhdHRyaWJfbGlzdCk7Ci0gICAgICAgIGlmIChzdXJmYWNlICE9IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgICAgICBlZ2xfc3VyZmFjZV90KiBzID0gbmV3IGVnbF9zdXJmYWNlX3QoZHB5LCBjb25maWcsIHdpbmRvdywgc3VyZmFjZSwgY254KTsKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRUdMU3VyZmFjZSBjcmVhdGlvbiBmYWlsZWQKLSAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQod2luZG93LCAwKTsKLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCh3aW5kb3csIE5BVElWRV9XSU5ET1dfQVBJX0VHTCk7Ci0gICAgfQotICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKLX0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKCAgRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCogZHAgPSAwOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCk7Ci0gICAgaWYgKGNueCkgewotICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UgPSBjbngtPmVnbC5lZ2xDcmVhdGVQaXhtYXBTdXJmYWNlKAotICAgICAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgY29uZmlnLCBwaXhtYXAsIGF0dHJpYl9saXN0KTsKLSAgICAgICAgaWYgKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSBuZXcgZWdsX3N1cmZhY2VfdChkcHksIGNvbmZpZywgTlVMTCwgc3VyZmFjZSwgY254KTsKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKLX0KLQotRUdMU3VyZmFjZSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSggRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwID0gMDsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHApOwotICAgIGlmIChjbngpIHsKLSAgICAgICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gY254LT5lZ2wuZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKLSAgICAgICAgaWYgKHN1cmZhY2UgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgIGVnbF9zdXJmYWNlX3QqIHMgPSBuZXcgZWdsX3N1cmZhY2VfdChkcHksIGNvbmZpZywgTlVMTCwgc3VyZmFjZSwgY254KTsKLSAgICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBFR0xfTk9fU1VSRkFDRTsKLX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotRUdMQm9vbGVhbiBlZ2xEZXN0cm95U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgU3VyZmFjZVJlZiBfcyhkcCwgc3VyZmFjZSk7Ci0gICAgaWYgKCFfcy5nZXQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLQotICAgIGVnbF9zdXJmYWNlX3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgRUdMQm9vbGVhbiByZXN1bHQgPSBzLT5jbngtPmVnbC5lZ2xEZXN0cm95U3VyZmFjZShkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UpOwotICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKLSAgICAgICAgX3MudGVybWluYXRlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsUXVlcnlTdXJmYWNlKCBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICByZXR1cm4gcy0+Y254LT5lZ2wuZWdsUXVlcnlTdXJmYWNlKAotICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBzLT5zdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKLX0KLQotdm9pZCBFR0xBUEkgZWdsQmVnaW5GcmFtZShFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgU3VyZmFjZVJlZiBfcyhkcCwgc3VyZmFjZSk7Ci0gICAgaWYgKCFfcy5nZXQoKSkgewotICAgICAgICBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAocy0+d2luLmdldCgpLCB0aW1lc3RhbXApOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb250ZXh0cwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xDb250ZXh0IGVnbENyZWF0ZUNvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMQ29udGV4dCBzaGFyZV9saXN0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwID0gMDsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHApOwotICAgIGlmIChjbngpIHsKLSAgICAgICAgaWYgKHNoYXJlX2xpc3QgIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIGVnbF9jb250ZXh0X3QqIGNvbnN0IGMgPSBnZXRfY29udGV4dChzaGFyZV9saXN0KTsKLSAgICAgICAgICAgIHNoYXJlX2xpc3QgPSBjLT5jb250ZXh0OwotICAgICAgICB9Ci0gICAgICAgIEVHTENvbnRleHQgY29udGV4dCA9IGNueC0+ZWdsLmVnbENyZWF0ZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBjb25maWcsIHNoYXJlX2xpc3QsIGF0dHJpYl9saXN0KTsKLSAgICAgICAgaWYgKGNvbnRleHQgIT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgaWYgaXQncyBhIEdMRVN2MSBvciBHTEVTdjIKLSAgICAgICAgICAgIGludCB2ZXJzaW9uID0gMDsKLSAgICAgICAgICAgIGlmIChhdHRyaWJfbGlzdCkgewotICAgICAgICAgICAgICAgIHdoaWxlICgqYXR0cmliX2xpc3QgIT0gRUdMX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgR0xpbnQgYXR0ciA9ICphdHRyaWJfbGlzdCsrOwotICAgICAgICAgICAgICAgICAgICBHTGludCB2YWx1ZSA9ICphdHRyaWJfbGlzdCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciA9PSBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTikgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZWdsX2Nvbm5lY3Rpb25fdDo6R0xFU3YxX0lOREVYOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGVnbF9jb25uZWN0aW9uX3Q6OkdMRVN2Ml9JTkRFWDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZ2xfY29udGV4dF90KiBjID0gbmV3IGVnbF9jb250ZXh0X3QoZHB5LCBjb250ZXh0LCBjb25maWcsIGNueCwgdmVyc2lvbik7Ci0jaWYgRUdMX1RSQUNFCi0gICAgICAgICAgICBpZiAoZ0VHTERlYnVnTGV2ZWwgPiAwKQotICAgICAgICAgICAgICAgIEdMVHJhY2VfZWdsQ3JlYXRlQ29udGV4dCh2ZXJzaW9uLCBjKTsKLSNlbmRpZgotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9OT19DT05URVhUOwotfQotCi1FR0xCb29sZWFuIGVnbERlc3Ryb3lDb250ZXh0KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkKLSAgICAgICAgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIENvbnRleHRSZWYgX2MoZHAsIGN0eCk7Ci0gICAgaWYgKCFfYy5nZXQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKLSAgICAKLSAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7Ci0gICAgRUdMQm9vbGVhbiByZXN1bHQgPSBjLT5jbngtPmVnbC5lZ2xEZXN0cm95Q29udGV4dChkcC0+ZGlzcC5kcHksIGMtPmNvbnRleHQpOwotICAgIGlmIChyZXN1bHQgPT0gRUdMX1RSVUUpIHsKLSAgICAgICAgX2MudGVybWluYXRlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsTWFrZUN1cnJlbnQoICBFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN1cmZhY2UgcmVhZCwgRUdMQ29udGV4dCBjdHgpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gZ2V0X2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotCi0gICAgLy8gSWYgY3R4IGlzIG5vdCBFR0xfTk9fQ09OVEVYVCwgcmVhZCBpcyBub3QgRUdMX05PX1NVUkZBQ0UsIG9yIGRyYXcgaXMgbm90Ci0gICAgLy8gRUdMX05PX1NVUkZBQ0UsIHRoZW4gYW4gRUdMX05PVF9JTklUSUFMSVpFRCBlcnJvciBpcyBnZW5lcmF0ZWQgaWYgZHB5IGlzCi0gICAgLy8gYSB2YWxpZCBidXQgdW5pbml0aWFsaXplZCBkaXNwbGF5LgotICAgIGlmICggKGN0eCAhPSBFR0xfTk9fQ09OVEVYVCkgfHwgKHJlYWQgIT0gRUdMX05PX1NVUkZBQ0UpIHx8Ci0gICAgICAgICAoZHJhdyAhPSBFR0xfTk9fU1VSRkFDRSkgKSB7Ci0gICAgICAgIGlmICghZHAtPmlzUmVhZHkoKSkgcmV0dXJuIHNldEVycm9yKEVHTF9OT1RfSU5JVElBTElaRUQsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgLy8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgcGFzc2VkIGluCi0gICAgQ29udGV4dFJlZiBfYyhkcCwgY3R4KTsKLSAgICBTdXJmYWNlUmVmIF9kKGRwLCBkcmF3KTsKLSAgICBTdXJmYWNlUmVmIF9yKGRwLCByZWFkKTsKLQotICAgIC8vIHZhbGlkYXRlIHRoZSBjb250ZXh0IChpZiBub3QgRUdMX05PX0NPTlRFWFQpCi0gICAgaWYgKChjdHggIT0gRUdMX05PX0NPTlRFWFQpICYmICFfYy5nZXQoKSkgewotICAgICAgICAvLyBFR0xfTk9fQ09OVEVYVCBpcyB2YWxpZAotICAgICAgICByZXR1cm4gRUdMX0ZBTFNFOwotICAgIH0KLQotICAgIC8vIHRoZXNlIGFyZSB0aGUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbidzIG9iamVjdAotICAgIEVHTENvbnRleHQgaW1wbF9jdHggID0gRUdMX05PX0NPTlRFWFQ7Ci0gICAgRUdMU3VyZmFjZSBpbXBsX2RyYXcgPSBFR0xfTk9fU1VSRkFDRTsKLSAgICBFR0xTdXJmYWNlIGltcGxfcmVhZCA9IEVHTF9OT19TVVJGQUNFOwotCi0gICAgLy8gdGhlc2UgYXJlIG91ciBvYmplY3RzIHN0cnVjdHMgcGFzc2VkIGluCi0gICAgZWdsX2NvbnRleHRfdCAgICAgICAqIGMgPSBOVUxMOwotICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBkID0gTlVMTDsKLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogciA9IE5VTEw7Ci0KLSAgICAvLyB0aGVzZSBhcmUgdGhlIGN1cnJlbnQgb2JqZWN0cyBzdHJ1Y3RzCi0gICAgZWdsX2NvbnRleHRfdCAqIGN1cl9jID0gZ2V0X2NvbnRleHQoZ2V0Q29udGV4dCgpKTsKLSAgICAKLSAgICBpZiAoY3R4ICE9IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIGMgPSBnZXRfY29udGV4dChjdHgpOwotICAgICAgICBpbXBsX2N0eCA9IGMtPmNvbnRleHQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbm8gY29udGV4dCBnaXZlbiwgdXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgICAgIGlmIChjdXJfYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBubyBjdXJyZW50IGNvbnRleHQKLSAgICAgICAgICAgIGlmIChkcmF3ICE9IEVHTF9OT19TVVJGQUNFIHx8IHJlYWQgIT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIGVnbE1ha2VDdXJyZW50KCAuLi4sICE9MCwgIT0wLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9GQUxTRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBub3QgYW4gZXJyb3IsIHRoZXJlIGlzIGp1c3Qgbm8gY3VycmVudCBjb250ZXh0LgotICAgICAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24ncyBkcmF3IEVHTFN1cmZhY2UKLSAgICBpZiAoZHJhdyAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBkID0gZ2V0X3N1cmZhY2UoZHJhdyk7Ci0gICAgICAgIGltcGxfZHJhdyA9IGQtPnN1cmZhY2U7Ci0gICAgfQotCi0gICAgLy8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24ncyByZWFkIEVHTFN1cmZhY2UKLSAgICBpZiAocmVhZCAhPSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICByID0gZ2V0X3N1cmZhY2UocmVhZCk7Ci0gICAgICAgIGltcGxfcmVhZCA9IHItPnN1cmZhY2U7Ci0gICAgfQotCi0KLSAgICBFR0xCb29sZWFuIHJlc3VsdCA9IGNvbnN0X2Nhc3Q8ZWdsX2Rpc3BsYXlfdCo+KGRwKS0+bWFrZUN1cnJlbnQoYywgY3VyX2MsCi0gICAgICAgICAgICBkcmF3LCByZWFkLCBjdHgsCi0gICAgICAgICAgICBpbXBsX2RyYXcsIGltcGxfcmVhZCwgaW1wbF9jdHgpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBFR0xfVFJVRSkgewotICAgICAgICBpZiAoYykgewotICAgICAgICAgICAgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKGMtPmNueC0+aG9va3NbYy0+dmVyc2lvbl0pOwotICAgICAgICAgICAgZWdsX3Rsc190OjpzZXRDb250ZXh0KGN0eCk7Ci0jaWYgRUdMX1RSQUNFCi0gICAgICAgICAgICBpZiAoZ0VHTERlYnVnTGV2ZWwgPiAwKQotICAgICAgICAgICAgICAgIEdMVHJhY2VfZWdsTWFrZUN1cnJlbnQoYy0+dmVyc2lvbiwgYy0+Y254LT5ob29rc1tjLT52ZXJzaW9uXSwgY3R4KTsKLSNlbmRpZgotICAgICAgICAgICAgX2MuYWNxdWlyZSgpOwotICAgICAgICAgICAgX3IuYWNxdWlyZSgpOwotICAgICAgICAgICAgX2QuYWNxdWlyZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKCZnSG9va3NOb0NvbnRleHQpOwotICAgICAgICAgICAgZWdsX3Rsc190OjpzZXRDb250ZXh0KEVHTF9OT19DT05URVhUKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHRoaXMgd2lsbCBBTE9HRSB0aGUgZXJyb3IKLSAgICAgICAgcmVzdWx0ID0gc2V0RXJyb3IoYy0+Y254LT5lZ2wuZWdsR2V0RXJyb3IoKSwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1FR0xCb29sZWFuIGVnbFF1ZXJ5Q29udGV4dCggRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBDb250ZXh0UmVmIF9jKGRwLCBjdHgpOwotICAgIGlmICghX2MuZ2V0KCkpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfY29udGV4dF90ICogY29uc3QgYyA9IGdldF9jb250ZXh0KGN0eCk7Ci0gICAgcmV0dXJuIGMtPmNueC0+ZWdsLmVnbFF1ZXJ5Q29udGV4dCgKLSAgICAgICAgICAgIGRwLT5kaXNwLmRweSwgYy0+Y29udGV4dCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0KLX0KLQotRUdMQ29udGV4dCBlZ2xHZXRDdXJyZW50Q29udGV4dCh2b2lkKQotewotICAgIC8vIGNvdWxkIGJlIGNhbGxlZCBiZWZvcmUgZWdsSW5pdGlhbGl6ZSgpLCBidXQgd2Ugd291bGRuJ3QgaGF2ZSBhIGNvbnRleHQKLSAgICAvLyB0aGVuLCBhbmQgdGhpcyBmdW5jdGlvbiB3b3VsZCBjb3JyZWN0bHkgcmV0dXJuIEVHTF9OT19DT05URVhULgotCi0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgRUdMQ29udGV4dCBjdHggPSBnZXRDb250ZXh0KCk7Ci0gICAgcmV0dXJuIGN0eDsKLX0KLQotRUdMU3VyZmFjZSBlZ2xHZXRDdXJyZW50U3VyZmFjZShFR0xpbnQgcmVhZGRyYXcpCi17Ci0gICAgLy8gY291bGQgYmUgY2FsbGVkIGJlZm9yZSBlZ2xJbml0aWFsaXplKCksIGJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGEgY29udGV4dAotICAgIC8vIHRoZW4sIGFuZCB0aGlzIGZ1bmN0aW9uIHdvdWxkIGNvcnJlY3RseSByZXR1cm4gRUdMX05PX1NVUkZBQ0UuCi0KLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBFR0xDb250ZXh0IGN0eCA9IGdldENvbnRleHQoKTsKLSAgICBpZiAoY3R4KSB7Ci0gICAgICAgIGVnbF9jb250ZXh0X3QgY29uc3QgKiBjb25zdCBjID0gZ2V0X2NvbnRleHQoY3R4KTsKLSAgICAgICAgaWYgKCFjKSByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfTk9fU1VSRkFDRSk7Ci0gICAgICAgIHN3aXRjaCAocmVhZGRyYXcpIHsKLSAgICAgICAgICAgIGNhc2UgRUdMX1JFQUQ6IHJldHVybiBjLT5yZWFkOwotICAgICAgICAgICAgY2FzZSBFR0xfRFJBVzogcmV0dXJuIGMtPmRyYXc7ICAgICAgICAgICAgCi0gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9OT19TVVJGQUNFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7Ci19Ci0KLUVHTERpc3BsYXkgZWdsR2V0Q3VycmVudERpc3BsYXkodm9pZCkKLXsKLSAgICAvLyBjb3VsZCBiZSBjYWxsZWQgYmVmb3JlIGVnbEluaXRpYWxpemUoKSwgYnV0IHdlIHdvdWxkbid0IGhhdmUgYSBjb250ZXh0Ci0gICAgLy8gdGhlbiwgYW5kIHRoaXMgZnVuY3Rpb24gd291bGQgY29ycmVjdGx5IHJldHVybiBFR0xfTk9fRElTUExBWS4KLQotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIEVHTENvbnRleHQgY3R4ID0gZ2V0Q29udGV4dCgpOwotICAgIGlmIChjdHgpIHsKLSAgICAgICAgZWdsX2NvbnRleHRfdCBjb25zdCAqIGNvbnN0IGMgPSBnZXRfY29udGV4dChjdHgpOwotICAgICAgICBpZiAoIWMpIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9OT19TVVJGQUNFKTsKLSAgICAgICAgcmV0dXJuIGMtPmRweTsKLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9OT19ESVNQTEFZOwotfQotCi1FR0xCb29sZWFuIGVnbFdhaXRHTCh2b2lkKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoIWNueC0+ZHNvKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05URVhULCBFR0xfRkFMU0UpOwotCi0gICAgcmV0dXJuIGNueC0+ZWdsLmVnbFdhaXRHTCgpOwotfQotCi1FR0xCb29sZWFuIGVnbFdhaXROYXRpdmUoRUdMaW50IGVuZ2luZSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKCFjbngtPmRzbykKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfQ09OVEVYVCwgRUdMX0ZBTFNFKTsKLQotICAgIHJldHVybiBjbngtPmVnbC5lZ2xXYWl0TmF0aXZlKGVuZ2luZSk7Ci19Ci0KLUVHTGludCBlZ2xHZXRFcnJvcih2b2lkKQotewotICAgIEVHTGludCBlcnIgPSBFR0xfU1VDQ0VTUzsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvKSB7Ci0gICAgICAgIGVyciA9IGNueC0+ZWdsLmVnbEdldEVycm9yKCk7Ci0gICAgfQotICAgIGlmIChlcnIgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgZXJyID0gZWdsX3Rsc190OjpnZXRFcnJvcigpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1fX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGVnbEdldFByb2NBZGRyZXNzKGNvbnN0IGNoYXIgKnByb2NuYW1lKQotewotICAgIC8vIGVnbEdldFByb2NBZGRyZXNzKCkgY291bGQgYmUgdGhlIHZlcnkgZmlyc3QgZnVuY3Rpb24gY2FsbGVkCi0gICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSd2ZSBpbml0aWFsaXplZCBvdXJzZWx2ZXMsIHRoaXMKLSAgICAvLyBoYXBwZW5zIHRoZSBmaXJzdCB0aW1lIGVnbF9nZXRfZGlzcGxheSgpIGlzIGNhbGxlZC4KLQotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGlmIChlZ2xfaW5pdF9kcml2ZXJzKCkgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuICBOVUxMOwotICAgIH0KLQotICAgIC8vIFRoZSBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIGV4dGVuc2lvbiBzaG91bGQgbm90IGJlIGV4cG9zZWQgdG8KLSAgICAvLyBhcHBsaWNhdGlvbnMuICBJdCBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFuZHJvaWQgRUdMIGxheWVyLgotICAgIGlmICghc3RyY21wKHByb2NuYW1lLCAiZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIikpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBhZGRyOwotICAgIGFkZHIgPSBmaW5kUHJvY0FkZHJlc3MocHJvY25hbWUsIHNFeHRlbnRpb25NYXAsIE5FTEVNKHNFeHRlbnRpb25NYXApKTsKLSAgICBpZiAoYWRkcikgcmV0dXJuIGFkZHI7Ci0KLQotICAgIC8vIHRoaXMgcHJvdGVjdHMgYWNjZXNzZXMgdG8gc0dMRXh0ZW50aW9uTWFwIGFuZCBzR0xFeHRlbnRpb25TbG90Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZzRXh0ZW5zaW9uTWFwTXV0ZXgpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNpbmNlIGVnbEdldFByb2NBZGRyZXNzKCkgaXMgbm90IGFzc29jaWF0ZWQgdG8gYW55dGhpbmcsIGl0IG5lZWRzCi0gICAgICAgICAqIHRvIHJldHVybiBhIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCAid29ya3MiIHJlZ2FyZGxlc3Mgb2Ygd2hhdAotICAgICAgICAgKiB0aGUgY3VycmVudCBjb250ZXh0IGlzLgotICAgICAgICAgKgotICAgICAgICAgKiBGb3IgdGhpcyByZWFzb24sIHdlIHJldHVybiBhICJmb3J3YXJkZXIiLCBhIHNtYWxsIHN0dWIgdGhhdCB0YWtlcwotICAgICAgICAgKiBjYXJlIG9mIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dAotICAgICAgICAgKiBjdXJyZW50bHkgYm91bmQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFdlIGZpcnN0IGxvb2sgZm9yIGV4dGVuc2lvbnMgd2UndmUgYWxyZWFkeSByZXNvbHZlZCwgaWYgd2UncmUgc2VlaW5nCi0gICAgICAgICAqIHRoaXMgZXh0ZW5zaW9uIGZvciB0aGUgZmlyc3QgdGltZSwgd2UgZ28gdGhyb3VnaCBhbGwgb3VyCi0gICAgICAgICAqIGltcGxlbWVudGF0aW9ucyBhbmQgY2FsbCBlZ2xHZXRQcm9jQWRkcmVzcygpIGFuZCByZWNvcmQgdGhlCi0gICAgICAgICAqIHJlc3VsdCBpbiB0aGUgYXBwcm9wcmlhdGUgaW1wbGVtZW50YXRpb24gaG9va3MgYW5kIHJldHVybiB0aGUKLSAgICAgICAgICogYWRkcmVzcyBvZiB0aGUgZm9yd2FyZGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBob29rIHNldC4KLSAgICAgICAgICoKLSAgICAgICAgICovCi0KLSAgICAgICAgY29uc3QgU3RyaW5nOCBuYW1lKHByb2NuYW1lKTsKLSAgICAgICAgYWRkciA9IHNHTEV4dGVudGlvbk1hcC52YWx1ZUZvcihuYW1lKTsKLSAgICAgICAgY29uc3QgaW50IHNsb3QgPSBzR0xFeHRlbnRpb25TbG90OwotCi0gICAgICAgIEFMT0dFX0lGKHNsb3QgPj0gTUFYX05VTUJFUl9PRl9HTF9FWFRFTlNJT05TLAotICAgICAgICAgICAgICAgICJubyBtb3JlIHNsb3RzIGZvciBlZ2xHZXRQcm9jQWRkcmVzcyhcIiVzXCIpIiwKLSAgICAgICAgICAgICAgICBwcm9jbmFtZSk7Ci0KLSNpZiBFR0xfVFJBQ0UKLSAgICAgICAgZ2xfaG9va3NfdCAqZGVidWdIb29rcyA9IEdMVHJhY2VfZ2V0R0xIb29rcygpOwotI2VuZGlmCi0KLSAgICAgICAgaWYgKCFhZGRyICYmIChzbG90IDwgTUFYX05VTUJFUl9PRl9HTF9FWFRFTlNJT05TKSkgewotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgICAgICAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsR2V0UHJvY0FkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9ucyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGJvdW5kIGNvbnRleHQKLSAgICAgICAgICAgICAgICBjbngtPmhvb2tzW2VnbF9jb25uZWN0aW9uX3Q6OkdMRVN2MV9JTkRFWF0tPmV4dC5leHRlbnNpb25zW3Nsb3RdID0KLSAgICAgICAgICAgICAgICBjbngtPmhvb2tzW2VnbF9jb25uZWN0aW9uX3Q6OkdMRVN2Ml9JTkRFWF0tPmV4dC5leHRlbnNpb25zW3Nsb3RdID0KLSNpZiBFR0xfVFJBQ0UKLSAgICAgICAgICAgICAgICBkZWJ1Z0hvb2tzLT5leHQuZXh0ZW5zaW9uc1tzbG90XSA9Ci0gICAgICAgICAgICAgICAgZ0hvb2tzVHJhY2UuZXh0LmV4dGVuc2lvbnNbc2xvdF0gPQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBjbngtPmVnbC5lZ2xHZXRQcm9jQWRkcmVzcyhwcm9jbmFtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChmb3VuZCkgewotICAgICAgICAgICAgICAgIGFkZHIgPSBnRXh0ZW5zaW9uRm9yd2FyZGVyc1tzbG90XTsKLSAgICAgICAgICAgICAgICBzR0xFeHRlbnRpb25NYXAuYWRkKG5hbWUsIGFkZHIpOwotICAgICAgICAgICAgICAgIHNHTEV4dGVudGlvblNsb3QrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNFeHRlbnNpb25NYXBNdXRleCk7Ci0gICAgcmV0dXJuIGFkZHI7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsU3dhcEJ1ZmZlcnMoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdykKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgU3VyZmFjZVJlZiBfcyhkcCwgZHJhdyk7Ci0gICAgaWYgKCFfcy5nZXQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLQotI2lmIEVHTF9UUkFDRQotICAgIGlmIChnRUdMRGVidWdMZXZlbCA+IDApCi0gICAgICAgIEdMVHJhY2VfZWdsU3dhcEJ1ZmZlcnMoZHB5LCBkcmF3KTsKLSNlbmRpZgotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShkcmF3KTsKLSAgICByZXR1cm4gcy0+Y254LT5lZ2wuZWdsU3dhcEJ1ZmZlcnMoZHAtPmRpc3AuZHB5LCBzLT5zdXJmYWNlKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xDb3B5QnVmZmVycyggIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlUGl4bWFwVHlwZSB0YXJnZXQpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICByZXR1cm4gcy0+Y254LT5lZ2wuZWdsQ29weUJ1ZmZlcnMoZHAtPmRpc3AuZHB5LCBzLT5zdXJmYWNlLCB0YXJnZXQpOwotfQotCi1jb25zdCBjaGFyKiBlZ2xRdWVyeVN0cmluZyhFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiAoY29uc3QgY2hhciAqKSBOVUxMOwotCi0gICAgc3dpdGNoIChuYW1lKSB7Ci0gICAgICAgIGNhc2UgRUdMX1ZFTkRPUjoKLSAgICAgICAgICAgIHJldHVybiBkcC0+Z2V0VmVuZG9yU3RyaW5nKCk7Ci0gICAgICAgIGNhc2UgRUdMX1ZFUlNJT046Ci0gICAgICAgICAgICByZXR1cm4gZHAtPmdldFZlcnNpb25TdHJpbmcoKTsKLSAgICAgICAgY2FzZSBFR0xfRVhURU5TSU9OUzoKLSAgICAgICAgICAgIHJldHVybiBkcC0+Z2V0RXh0ZW5zaW9uU3RyaW5nKCk7Ci0gICAgICAgIGNhc2UgRUdMX0NMSUVOVF9BUElTOgotICAgICAgICAgICAgcmV0dXJuIGRwLT5nZXRDbGllbnRBcGlTdHJpbmcoKTsKLSAgICAgICAgY2FzZSBFR0xfVkVSU0lPTl9IV19BTkRST0lEOgotICAgICAgICAgICAgcmV0dXJuIGRwLT5kaXNwLnF1ZXJ5U3RyaW5nLnZlcnNpb247Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgKGNvbnN0IGNoYXIgKikwKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFR0wgMS4xCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVHTEJvb2xlYW4gZWdsU3VyZmFjZUF0dHJpYigKLSAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50IHZhbHVlKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgU3VyZmFjZVJlZiBfcyhkcCwgc3VyZmFjZSk7Ci0gICAgaWYgKCFfcy5nZXQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLQotICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgaWYgKHMtPmNueC0+ZWdsLmVnbFN1cmZhY2VBdHRyaWIpIHsKLSAgICAgICAgcmV0dXJuIHMtPmNueC0+ZWdsLmVnbFN1cmZhY2VBdHRyaWIoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBzLT5zdXJmYWNlLCBhdHRyaWJ1dGUsIHZhbHVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xCaW5kVGV4SW1hZ2UoCi0gICAgICAgIEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIEVHTGludCBidWZmZXIpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICBpZiAocy0+Y254LT5lZ2wuZWdsQmluZFRleEltYWdlKSB7Ci0gICAgICAgIHJldHVybiBzLT5jbngtPmVnbC5lZ2xCaW5kVGV4SW1hZ2UoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBzLT5zdXJmYWNlLCBidWZmZXIpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotfQotCi1FR0xCb29sZWFuIGVnbFJlbGVhc2VUZXhJbWFnZSgKLSAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGJ1ZmZlcikKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIFN1cmZhY2VSZWYgX3MoZHAsIHN1cmZhY2UpOwotICAgIGlmICghX3MuZ2V0KCkpCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci0KLSAgICBlZ2xfc3VyZmFjZV90IGNvbnN0ICogY29uc3QgcyA9IGdldF9zdXJmYWNlKHN1cmZhY2UpOwotICAgIGlmIChzLT5jbngtPmVnbC5lZ2xSZWxlYXNlVGV4SW1hZ2UpIHsKLSAgICAgICAgcmV0dXJuIHMtPmNueC0+ZWdsLmVnbFJlbGVhc2VUZXhJbWFnZSgKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UsIGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1NVUkZBQ0UsIEVHTF9GQUxTRSk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsU3dhcEludGVydmFsKEVHTERpc3BsYXkgZHB5LCBFR0xpbnQgaW50ZXJ2YWwpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBFR0xCb29sZWFuIHJlcyA9IEVHTF9UUlVFOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsU3dhcEludGVydmFsKSB7Ci0gICAgICAgIHJlcyA9IGNueC0+ZWdsLmVnbFN3YXBJbnRlcnZhbChkcC0+ZGlzcC5kcHksIGludGVydmFsKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVHTCAxLjIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQm9vbGVhbiBlZ2xXYWl0Q2xpZW50KHZvaWQpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmICghY254LT5kc28pCi0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0NPTlRFWFQsIEVHTF9GQUxTRSk7Ci0KLSAgICBFR0xCb29sZWFuIHJlczsKLSAgICBpZiAoY254LT5lZ2wuZWdsV2FpdENsaWVudCkgewotICAgICAgICByZXMgPSBjbngtPmVnbC5lZ2xXYWl0Q2xpZW50KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmVzID0gY254LT5lZ2wuZWdsV2FpdEdMKCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsQmluZEFQSShFR0xlbnVtIGFwaSkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBpZiAoZWdsX2luaXRfZHJpdmVycygpID09IEVHTF9GQUxTRSkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgLy8gYmluZCB0aGlzIEFQSSBvbiBhbGwgRUdMcwotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX1RSVUU7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xCaW5kQVBJKSB7Ci0gICAgICAgIHJlcyA9IGNueC0+ZWdsLmVnbEJpbmRBUEkoYXBpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotRUdMZW51bSBlZ2xRdWVyeUFQSSh2b2lkKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGlmIChlZ2xfaW5pdF9kcml2ZXJzKCkgPT0gRUdMX0ZBTFNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX1BBUkFNRVRFUiwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbFF1ZXJ5QVBJKSB7Ci0gICAgICAgIHJldHVybiBjbngtPmVnbC5lZ2xRdWVyeUFQSSgpOwotICAgIH0KLQotICAgIC8vIG9yLCBpdCBjYW4gb25seSBiZSBPcGVuR0wgRVMKLSAgICByZXR1cm4gRUdMX09QRU5HTF9FU19BUEk7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsUmVsZWFzZVRocmVhZCh2b2lkKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIC8vIElmIHRoZXJlIGlzIGNvbnRleHQgYm91bmQgdG8gdGhlIHRocmVhZCwgcmVsZWFzZSBpdAotICAgIGVnbF9kaXNwbGF5X3Q6Omxvc2VDdXJyZW50KGdldF9jb250ZXh0KGdldENvbnRleHQoKSkpOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xSZWxlYXNlVGhyZWFkKSB7Ci0gICAgICAgIGNueC0+ZWdsLmVnbFJlbGVhc2VUaHJlYWQoKTsKLSAgICB9Ci0KLSAgICBlZ2xfdGxzX3Q6OmNsZWFyVExTKCk7Ci0jaWYgRUdMX1RSQUNFCi0gICAgaWYgKGdFR0xEZWJ1Z0xldmVsID4gMCkKLSAgICAgICAgR0xUcmFjZV9lZ2xSZWxlYXNlVGhyZWFkKCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTFN1cmZhY2UgZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCi0gICAgICAgICAgRUdMRGlzcGxheSBkcHksIEVHTGVudW0gYnVmdHlwZSwgRUdMQ2xpZW50QnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwID0gMDsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjbnggPSB2YWxpZGF0ZV9kaXNwbGF5X2NvbmZpZyhkcHksIGNvbmZpZywgZHApOwotICAgIGlmICghY254KSByZXR1cm4gRUdMX0ZBTFNFOwotICAgIGlmIChjbngtPmVnbC5lZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gY254LT5lZ2wuZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIoCi0gICAgICAgICAgICAgICAgZHAtPmRpc3AuZHB5LCBidWZ0eXBlLCBidWZmZXIsIGNvbmZpZywgYXR0cmliX2xpc3QpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9DT05GSUcsIEVHTF9OT19TVVJGQUNFKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRUdMX0VHTEVYVF9WRVJTSU9OIDMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRUdMQm9vbGVhbiBlZ2xMb2NrU3VyZmFjZUtIUihFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLAotICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgU3VyZmFjZVJlZiBfcyhkcCwgc3VyZmFjZSk7Ci0gICAgaWYgKCFfcy5nZXQoKSkKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfU1VSRkFDRSwgRUdMX0ZBTFNFKTsKLQotICAgIGVnbF9zdXJmYWNlX3QgY29uc3QgKiBjb25zdCBzID0gZ2V0X3N1cmZhY2Uoc3VyZmFjZSk7Ci0gICAgaWYgKHMtPmNueC0+ZWdsLmVnbExvY2tTdXJmYWNlS0hSKSB7Ci0gICAgICAgIHJldHVybiBzLT5jbngtPmVnbC5lZ2xMb2NrU3VyZmFjZUtIUigKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UsIGF0dHJpYl9saXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfRElTUExBWSwgRUdMX0ZBTFNFKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xVbmxvY2tTdXJmYWNlS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBTdXJmYWNlUmVmIF9zKGRwLCBzdXJmYWNlKTsKLSAgICBpZiAoIV9zLmdldCgpKQotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9TVVJGQUNFLCBFR0xfRkFMU0UpOwotCi0gICAgZWdsX3N1cmZhY2VfdCBjb25zdCAqIGNvbnN0IHMgPSBnZXRfc3VyZmFjZShzdXJmYWNlKTsKLSAgICBpZiAocy0+Y254LT5lZ2wuZWdsVW5sb2NrU3VyZmFjZUtIUikgewotICAgICAgICByZXR1cm4gcy0+Y254LT5lZ2wuZWdsVW5sb2NrU3VyZmFjZUtIUihkcC0+ZGlzcC5kcHksIHMtPnN1cmZhY2UpOwotICAgIH0KLSAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9ESVNQTEFZLCBFR0xfRkFMU0UpOwotfQotCi1FR0xJbWFnZUtIUiBlZ2xDcmVhdGVJbWFnZUtIUihFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGVudW0gdGFyZ2V0LAotICAgICAgICBFR0xDbGllbnRCdWZmZXIgYnVmZmVyLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX05PX0lNQUdFX0tIUjsKLQotICAgIENvbnRleHRSZWYgX2MoZHAsIGN0eCk7Ci0gICAgZWdsX2NvbnRleHRfdCAqIGNvbnN0IGMgPSBfYy5nZXQoKTsKLQotICAgIEVHTEltYWdlS0hSIHJlc3VsdCA9IEVHTF9OT19JTUFHRV9LSFI7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xDcmVhdGVJbWFnZUtIUikgewotICAgICAgICByZXN1bHQgPSBjbngtPmVnbC5lZ2xDcmVhdGVJbWFnZUtIUigKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksCi0gICAgICAgICAgICAgICAgYyA/IGMtPmNvbnRleHQgOiBFR0xfTk9fQ09OVEVYVCwKLSAgICAgICAgICAgICAgICB0YXJnZXQsIGJ1ZmZlciwgYXR0cmliX2xpc3QpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FR0xCb29sZWFuIGVnbERlc3Ryb3lJbWFnZUtIUihFR0xEaXNwbGF5IGRweSwgRUdMSW1hZ2VLSFIgaW1nKQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xEZXN0cm95SW1hZ2VLSFIpIHsKLSAgICAgICAgY254LT5lZ2wuZWdsRGVzdHJveUltYWdlS0hSKGRwLT5kaXNwLmRweSwgaW1nKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVHTF9UUlVFOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFR0xfRUdMRVhUX1ZFUlNJT04gNQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUVHTFN5bmNLSFIgZWdsQ3JlYXRlU3luY0tIUihFR0xEaXNwbGF5IGRweSwgRUdMZW51bSB0eXBlLCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX05PX1NZTkNfS0hSOwotCi0gICAgRUdMU3luY0tIUiByZXN1bHQgPSBFR0xfTk9fU1lOQ19LSFI7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xDcmVhdGVTeW5jS0hSKSB7Ci0gICAgICAgIHJlc3VsdCA9IGNueC0+ZWdsLmVnbENyZWF0ZVN5bmNLSFIoZHAtPmRpc3AuZHB5LCB0eXBlLCBhdHRyaWJfbGlzdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsRGVzdHJveVN5bmNLSFIoRUdMRGlzcGxheSBkcHksIEVHTFN5bmNLSFIgc3luYykKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBlZ2xfZGlzcGxheV90IGNvbnN0ICogY29uc3QgZHAgPSB2YWxpZGF0ZV9kaXNwbGF5KGRweSk7Ci0gICAgaWYgKCFkcCkgcmV0dXJuIEVHTF9GQUxTRTsKLQotICAgIEVHTEJvb2xlYW4gcmVzdWx0ID0gRUdMX0ZBTFNFOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsRGVzdHJveVN5bmNLSFIpIHsKLSAgICAgICAgcmVzdWx0ID0gY254LT5lZ2wuZWdsRGVzdHJveVN5bmNLSFIoZHAtPmRpc3AuZHB5LCBzeW5jKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMaW50IGVnbENsaWVudFdhaXRTeW5jS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsCi0gICAgICAgIEVHTGludCBmbGFncywgRUdMVGltZUtIUiB0aW1lb3V0KQotewotICAgIGNsZWFyRXJyb3IoKTsKLQotICAgIGVnbF9kaXNwbGF5X3QgY29uc3QgKiBjb25zdCBkcCA9IHZhbGlkYXRlX2Rpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRwKSByZXR1cm4gRUdMX0ZBTFNFOwotCi0gICAgRUdMQm9vbGVhbiByZXN1bHQgPSBFR0xfRkFMU0U7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPmVnbC5lZ2xDbGllbnRXYWl0U3luY0tIUikgewotICAgICAgICByZXN1bHQgPSBjbngtPmVnbC5lZ2xDbGllbnRXYWl0U3luY0tIUigKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHN5bmMsIGZsYWdzLCB0aW1lb3V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRUdMQm9vbGVhbiBlZ2xHZXRTeW5jQXR0cmliS0hSKEVHTERpc3BsYXkgZHB5LCBFR0xTeW5jS0hSIHN5bmMsCi0gICAgICAgIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgZWdsX2Rpc3BsYXlfdCBjb25zdCAqIGNvbnN0IGRwID0gdmFsaWRhdGVfZGlzcGxheShkcHkpOwotICAgIGlmICghZHApIHJldHVybiBFR0xfRkFMU0U7Ci0KLSAgICBFR0xCb29sZWFuIHJlc3VsdCA9IEVHTF9GQUxTRTsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbEdldFN5bmNBdHRyaWJLSFIpIHsKLSAgICAgICAgcmVzdWx0ID0gY254LT5lZ2wuZWdsR2V0U3luY0F0dHJpYktIUigKLSAgICAgICAgICAgICAgICBkcC0+ZGlzcC5kcHksIHN5bmMsIGF0dHJpYnV0ZSwgdmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBTkRST0lEIGV4dGVuc2lvbnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyogQU5EUk9JRCBleHRlbnNpb25zIGVudHJ5LXBvaW50IGdvIGhlcmUgKi8KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTlZJRElBIGV4dGVuc2lvbnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVHTHVpbnQ2NE5WIGVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOVigpCi17Ci0gICAgY2xlYXJFcnJvcigpOwotCi0gICAgaWYgKGVnbF9pbml0X2RyaXZlcnMoKSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfUEFSQU1FVEVSLCBFR0xfRkFMU0UpOwotICAgIH0KLQotICAgIEVHTHVpbnQ2NE5WIHJldCA9IDA7Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotCi0gICAgaWYgKGNueC0+ZHNvICYmIGNueC0+ZWdsLmVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOVikgewotICAgICAgICByZXR1cm4gY254LT5lZ2wuZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNldEVycm9yUXVpZXQoRUdMX0JBRF9ESVNQTEFZLCAwKTsKLX0KLQotRUdMdWludDY0TlYgZWdsR2V0U3lzdGVtVGltZU5WKCkKLXsKLSAgICBjbGVhckVycm9yKCk7Ci0KLSAgICBpZiAoZWdsX2luaXRfZHJpdmVycygpID09IEVHTF9GQUxTRSkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9QQVJBTUVURVIsIEVHTF9GQUxTRSk7Ci0gICAgfQotCi0gICAgRUdMdWludDY0TlYgcmV0ID0gMDsKLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0KLSAgICBpZiAoY254LT5kc28gJiYgY254LT5lZ2wuZWdsR2V0U3lzdGVtVGltZU5WKSB7Ci0gICAgICAgIHJldHVybiBjbngtPmVnbC5lZ2xHZXRTeXN0ZW1UaW1lTlYoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2V0RXJyb3JRdWlldChFR0xfQkFEX0RJU1BMQVksIDApOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9jYWNoZS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2NhY2hlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5ZmI1Zi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2NhY2hlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImVnbF9jYWNoZS5oIgotI2luY2x1ZGUgImVnbF9kaXNwbGF5LmgiCi0jaW5jbHVkZSAiZWdsX2ltcGwuaCIKLSNpbmNsdWRlICJlZ2xkZWZzLmgiCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2lmbmRlZiBNQVhfRUdMX0NBQ0hFX0VOVFJZX1NJWkUKLSNkZWZpbmUgTUFYX0VHTF9DQUNIRV9FTlRSWV9TSVpFICgxNiAqIDEwMjQpOwotI2VuZGlmCi0KLSNpZm5kZWYgTUFYX0VHTF9DQUNIRV9TSVpFCi0jZGVmaW5lIE1BWF9FR0xfQ0FDSEVfU0laRSAoNjQgKiAxMDI0KTsKLSNlbmRpZgotCi0vLyBDYWNoZSBzaXplIGxpbWl0cy4KLXN0YXRpYyBjb25zdCBzaXplX3QgbWF4S2V5U2l6ZSA9IDEwMjQ7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IG1heFZhbHVlU2l6ZSA9IE1BWF9FR0xfQ0FDSEVfRU5UUllfU0laRTsKLXN0YXRpYyBjb25zdCBzaXplX3QgbWF4VG90YWxTaXplID0gTUFYX0VHTF9DQUNIRV9TSVpFOwotCi0vLyBDYWNoZSBmaWxlIGhlYWRlcgotc3RhdGljIGNvbnN0IGNoYXIqIGNhY2hlRmlsZU1hZ2ljID0gIkVHTCQiOwotc3RhdGljIGNvbnN0IHNpemVfdCBjYWNoZUZpbGVIZWFkZXJTaXplID0gODsKLQotLy8gVGhlIHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzYXZpbmcgbmV3bHkgaW5zZXJ0ZWQgY2FjaGUgZW50cmllcy4KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZGVmZXJyZWRTYXZlRGVsYXkgPSA0OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgQkNfRVhUX1NUUiAiRUdMX0FORFJPSURfYmxvYl9jYWNoZSIKLQotLy8KLS8vIENhbGxiYWNrIGZ1bmN0aW9ucyBwYXNzZWQgdG8gRUdMLgotLy8KLXN0YXRpYyB2b2lkIHNldEJsb2IoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwKLSAgICAgICAgY29uc3Qgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpIHsKLSAgICBlZ2xfY2FjaGVfdDo6Z2V0KCktPnNldEJsb2Ioa2V5LCBrZXlTaXplLCB2YWx1ZSwgdmFsdWVTaXplKTsKLX0KLQotc3RhdGljIEVHTHNpemVpQU5EUk9JRCBnZXRCbG9iKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsCi0gICAgICAgIHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKSB7Ci0gICAgcmV0dXJuIGVnbF9jYWNoZV90OjpnZXQoKS0+Z2V0QmxvYihrZXksIGtleVNpemUsIHZhbHVlLCB2YWx1ZVNpemUpOwotfQotCi0vLwotLy8gZWdsX2NhY2hlX3QgZGVmaW5pdGlvbgotLy8KLWVnbF9jYWNoZV90OjplZ2xfY2FjaGVfdCgpIDoKLSAgICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSwKLSAgICAgICAgbUJsb2JDYWNoZShOVUxMKSB7Ci19Ci0KLWVnbF9jYWNoZV90Ojp+ZWdsX2NhY2hlX3QoKSB7Ci19Ci0KLWVnbF9jYWNoZV90IGVnbF9jYWNoZV90OjpzQ2FjaGU7Ci0KLWVnbF9jYWNoZV90KiBlZ2xfY2FjaGVfdDo6Z2V0KCkgewotICAgIHJldHVybiAmc0NhY2hlOwotfQotCi12b2lkIGVnbF9jYWNoZV90Ojppbml0aWFsaXplKGVnbF9kaXNwbGF5X3QgKmRpc3BsYXkpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBjbngtPm1ham9yID49IDAgJiYgY254LT5taW5vciA+PSAwKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGV4dHMgPSBkaXNwbGF5LT5kaXNwLnF1ZXJ5U3RyaW5nLmV4dGVuc2lvbnM7Ci0gICAgICAgIHNpemVfdCBiY0V4dExlbiA9IHN0cmxlbihCQ19FWFRfU1RSKTsKLSAgICAgICAgc2l6ZV90IGV4dHNMZW4gPSBzdHJsZW4oZXh0cyk7Ci0gICAgICAgIGJvb2wgZXF1YWwgPSAhc3RyY21wKEJDX0VYVF9TVFIsIGV4dHMpOwotICAgICAgICBib29sIGF0U3RhcnQgPSAhc3RybmNtcChCQ19FWFRfU1RSICIgIiwgZXh0cywgYmNFeHRMZW4rMSk7Ci0gICAgICAgIGJvb2wgYXRFbmQgPSAoYmNFeHRMZW4rMSkgPCBleHRzTGVuICYmCi0gICAgICAgICAgICAgICAgIXN0cmNtcCgiICIgQkNfRVhUX1NUUiwgZXh0cyArIGV4dHNMZW4gLSAoYmNFeHRMZW4rMSkpOwotICAgICAgICBib29sIGluTWlkZGxlID0gc3Ryc3RyKGV4dHMsICIgIiBCQ19FWFRfU1RSICIgIik7Ci0gICAgICAgIGlmIChlcXVhbCB8fCBhdFN0YXJ0IHx8IGF0RW5kIHx8IGluTWlkZGxlKSB7Ci0gICAgICAgICAgICBQRk5FR0xTRVRCTE9CQ0FDSEVGVU5DU0FORFJPSURQUk9DIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRDsKLSAgICAgICAgICAgIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCA9Ci0gICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UEZORUdMU0VUQkxPQkNBQ0hFRlVOQ1NBTkRST0lEUFJPQz4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY254LT5lZ2wuZWdsR2V0UHJvY0FkZHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIikpOwotICAgICAgICAgICAgaWYgKGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkVHTF9BTkRST0lEX2Jsb2JfY2FjaGUgYWR2ZXJ0aXNlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB1bmFibGUgdG8gZ2V0IGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEKGRpc3BsYXktPmRpc3AuZHB5LAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpzZXRCbG9iLCBhbmRyb2lkOjpnZXRCbG9iKTsKLSAgICAgICAgICAgIEVHTGludCBlcnIgPSBjbngtPmVnbC5lZ2xHZXRFcnJvcigpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQgcmVzdWx0ZWQgaW4gYW4gZXJyb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICIlI3giLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKLX0KLQotdm9pZCBlZ2xfY2FjaGVfdDo6dGVybWluYXRlKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgaWYgKG1CbG9iQ2FjaGUgIT0gTlVMTCkgewotICAgICAgICBzYXZlQmxvYkNhY2hlTG9ja2VkKCk7Ci0gICAgICAgIG1CbG9iQ2FjaGUgPSBOVUxMOwotICAgIH0KLSAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBlZ2xfY2FjaGVfdDo6c2V0QmxvYihjb25zdCB2b2lkKiBrZXksIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLAotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZSwgRUdMc2l6ZWlBTkRST0lEIHZhbHVlU2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0KLSAgICBpZiAoa2V5U2l6ZSA8IDAgfHwgdmFsdWVTaXplIDwgMCkgewotICAgICAgICBBTE9HVygiRUdMX0FORFJPSURfYmxvYl9jYWNoZSBzZXQ6IG5lZ2F0aXZlIHNpemVzIGFyZSBub3QgYWxsb3dlZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1Jbml0aWFsaXplZCkgewotICAgICAgICBzcDxCbG9iQ2FjaGU+IGJjID0gZ2V0QmxvYkNhY2hlTG9ja2VkKCk7Ci0gICAgICAgIGJjLT5zZXQoa2V5LCBrZXlTaXplLCB2YWx1ZSwgdmFsdWVTaXplKTsKLQotICAgICAgICBpZiAoIW1TYXZlUGVuZGluZykgewotICAgICAgICAgICAgY2xhc3MgRGVmZXJyZWRTYXZlVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICAgICAgRGVmZXJyZWRTYXZlVGhyZWFkKCkgOiBUaHJlYWQoZmFsc2UpIHt9Ci0KLSAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpIHsKLSAgICAgICAgICAgICAgICAgICAgc2xlZXAoZGVmZXJyZWRTYXZlRGVsYXkpOwotICAgICAgICAgICAgICAgICAgICBlZ2xfY2FjaGVfdCogYyA9IGVnbF9jYWNoZV90OjpnZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soYy0+bU11dGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMtPm1Jbml0aWFsaXplZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2F2ZUJsb2JDYWNoZUxvY2tlZCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGMtPm1TYXZlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgLy8gVGhlIHRocmVhZCB3aWxsIGhvbGQgYSBzdHJvbmcgcmVmIHRvIGl0c2VsZiB1bnRpbCBpdCBoYXMgZmluaXNoZWQKLSAgICAgICAgICAgIC8vIHJ1bm5pbmcsIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBrZWVwIGEgcmVmIGFyb3VuZC4KLSAgICAgICAgICAgIHNwPFRocmVhZD4gZGVmZXJyZWRTYXZlVGhyZWFkKG5ldyBEZWZlcnJlZFNhdmVUaHJlYWQoKSk7Ci0gICAgICAgICAgICBtU2F2ZVBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgZGVmZXJyZWRTYXZlVGhyZWFkLT5ydW4oKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotRUdMc2l6ZWlBTkRST0lEIGVnbF9jYWNoZV90OjpnZXRCbG9iKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsCi0gICAgICAgIHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGlmIChrZXlTaXplIDwgMCB8fCB2YWx1ZVNpemUgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIHNldDogbmVnYXRpdmUgc2l6ZXMgYXJlIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgc3A8QmxvYkNhY2hlPiBiYyA9IGdldEJsb2JDYWNoZUxvY2tlZCgpOwotICAgICAgICByZXR1cm4gYmMtPmdldChrZXksIGtleVNpemUsIHZhbHVlLCB2YWx1ZVNpemUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBlZ2xfY2FjaGVfdDo6c2V0Q2FjaGVGaWxlbmFtZShjb25zdCBjaGFyKiBmaWxlbmFtZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbUZpbGVuYW1lID0gZmlsZW5hbWU7Ci19Ci0KLXNwPEJsb2JDYWNoZT4gZWdsX2NhY2hlX3Q6OmdldEJsb2JDYWNoZUxvY2tlZCgpIHsKLSAgICBpZiAobUJsb2JDYWNoZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1CbG9iQ2FjaGUgPSBuZXcgQmxvYkNhY2hlKG1heEtleVNpemUsIG1heFZhbHVlU2l6ZSwgbWF4VG90YWxTaXplKTsKLSAgICAgICAgbG9hZEJsb2JDYWNoZUxvY2tlZCgpOwotICAgIH0KLSAgICByZXR1cm4gbUJsb2JDYWNoZTsKLX0KLQotc3RhdGljIHVpbnQzMl90IGNyYzMyYyhjb25zdCB1aW50OF90KiBidWYsIHNpemVfdCBsZW4pIHsKLSAgICBjb25zdCB1aW50MzJfdCBwb2x5Qml0cyA9IDB4ODJGNjNCNzg7Ci0gICAgdWludDMyX3QgciA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICByIF49IGJ1ZltpXTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA4OyBqKyspIHsKLSAgICAgICAgICAgIGlmIChyICYgMSkgewotICAgICAgICAgICAgICAgIHIgPSAociA+PiAxKSBeIHBvbHlCaXRzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByID4+PSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByOwotfQotCi12b2lkIGVnbF9jYWNoZV90OjpzYXZlQmxvYkNhY2hlTG9ja2VkKCkgewotICAgIGlmIChtRmlsZW5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBjYWNoZVNpemUgPSBtQmxvYkNhY2hlLT5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgICAgIHNpemVfdCBoZWFkZXJTaXplID0gY2FjaGVGaWxlSGVhZGVyU2l6ZTsKLSAgICAgICAgY29uc3QgY2hhciogZm5hbWUgPSBtRmlsZW5hbWUuc3RyaW5nKCk7Ci0KLSAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSB0aGUgZmlsZSB3aXRoIG5vIHBlcm1pc3Npb25zIHNvIHdlIGNhbiB3cml0ZSBpdAotICAgICAgICAvLyB3aXRob3V0IGFueW9uZSB0cnlpbmcgdG8gcmVhZCBpdC4KLSAgICAgICAgaW50IGZkID0gb3BlbihmbmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fUkRXUiwgMCk7Ci0gICAgICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICAgICAgaWYgKGVycm5vID09IEVFWElTVCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlIGV4aXN0cywgZGVsZXRlIGl0IGFuZCB0cnkgYWdhaW4uCi0gICAgICAgICAgICAgICAgaWYgKHVubGluayhmbmFtZSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gcG9pbnQgaW4gcmV0cnlpbmcgaWYgdGhlIHVubGluayBmYWlsZWQuCi0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciB1bmxpbmtpbmcgY2FjaGUgZmlsZSAlczogJXMgKCVkKSIsIGZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFJldHJ5IG5vdyB0aGF0IHdlJ3ZlIHVubGlua2VkIHRoZSBmaWxlLgotICAgICAgICAgICAgICAgIGZkID0gb3BlbihmbmFtZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fUkRXUiwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3IgY3JlYXRpbmcgY2FjaGUgZmlsZSAlczogJXMgKCVkKSIsIGZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGZpbGVTaXplID0gaGVhZGVyU2l6ZSArIGNhY2hlU2l6ZTsKLSAgICAgICAgaWYgKGZ0cnVuY2F0ZShmZCwgZmlsZVNpemUpID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igc2V0dGluZyBjYWNoZSBmaWxlIHNpemU6ICVzICglZCkiLCBzdHJlcnJvcihlcnJubyksCi0gICAgICAgICAgICAgICAgICAgIGVycm5vKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHVubGluayhmbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50OF90KiBidWYgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihtbWFwKE5VTEwsIGZpbGVTaXplLAotICAgICAgICAgICAgICAgIFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGZkLCAwKSk7Ci0gICAgICAgIGlmIChidWYgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIG1tYXBpbmcgY2FjaGUgZmlsZTogJXMgKCVkKSIsIHN0cmVycm9yKGVycm5vKSwKLSAgICAgICAgICAgICAgICAgICAgZXJybm8pOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgdW5saW5rKGZuYW1lKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1CbG9iQ2FjaGUtPmZsYXR0ZW4oYnVmICsgaGVhZGVyU2l6ZSwgY2FjaGVTaXplLCBOVUxMLAotICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3Igd3JpdGluZyBjYWNoZSBjb250ZW50czogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAotICAgICAgICAgICAgICAgICAgICAtZXJyKTsKLSAgICAgICAgICAgIG11bm1hcChidWYsIGZpbGVTaXplKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHVubGluayhmbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXcml0ZSB0aGUgZmlsZSBtYWdpYyBhbmQgQ1JDCi0gICAgICAgIG1lbWNweShidWYsIGNhY2hlRmlsZU1hZ2ljLCA0KTsKLSAgICAgICAgdWludDMyX3QqIGNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihidWYgKyA0KTsKLSAgICAgICAgKmNyYyA9IGNyYzMyYyhidWYgKyBoZWFkZXJTaXplLCBjYWNoZVNpemUpOwotCi0gICAgICAgIG11bm1hcChidWYsIGZpbGVTaXplKTsKLSAgICAgICAgZmNobW9kKGZkLCBTX0lSVVNSKTsKLSAgICAgICAgY2xvc2UoZmQpOwotICAgIH0KLX0KLQotdm9pZCBlZ2xfY2FjaGVfdDo6bG9hZEJsb2JDYWNoZUxvY2tlZCgpIHsKLSAgICBpZiAobUZpbGVuYW1lLmxlbmd0aCgpID4gMCkgewotICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZSA9IGNhY2hlRmlsZUhlYWRlclNpemU7Ci0KLSAgICAgICAgaW50IGZkID0gb3BlbihtRmlsZW5hbWUuc3RyaW5nKCksIE9fUkRPTkxZLCAwKTsKLSAgICAgICAgaWYgKGZkID09IC0xKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gIT0gRU5PRU5UKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImVycm9yIG9wZW5pbmcgY2FjaGUgZmlsZSAlczogJXMgKCVkKSIsIG1GaWxlbmFtZS5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RydWN0IHN0YXQgc3RhdEJ1ZjsKLSAgICAgICAgaWYgKGZzdGF0KGZkLCAmc3RhdEJ1ZikgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBzdGF0J2luZyBjYWNoZSBmaWxlOiAlcyAoJWQpIiwgc3RyZXJyb3IoZXJybm8pLCBlcnJubyk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhlIHNpemUgYmVmb3JlIHRyeWluZyB0byBtbWFwIGl0LgotICAgICAgICBzaXplX3QgZmlsZVNpemUgPSBzdGF0QnVmLnN0X3NpemU7Ci0gICAgICAgIGlmIChmaWxlU2l6ZSA+IG1heFRvdGFsU2l6ZSAqIDIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYWNoZSBmaWxlIGlzIHRvbyBsYXJnZTogJSNsbHgiLCBzdGF0QnVmLnN0X3NpemUpOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDhfdCogYnVmID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4obW1hcChOVUxMLCBmaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCkpOwotICAgICAgICBpZiAoYnVmID09IE1BUF9GQUlMRUQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBtbWFwaW5nIGNhY2hlIGZpbGU6ICVzICglZCkiLCBzdHJlcnJvcihlcnJubyksCi0gICAgICAgICAgICAgICAgICAgIGVycm5vKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlIG1hZ2ljIGFuZCBDUkMKLSAgICAgICAgc2l6ZV90IGNhY2hlU2l6ZSA9IGZpbGVTaXplIC0gaGVhZGVyU2l6ZTsKLSAgICAgICAgaWYgKG1lbWNtcChidWYsIGNhY2hlRmlsZU1hZ2ljLCA0KSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2FjaGUgZmlsZSBoYXMgYmFkIG1vam8iKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCogY3JjID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGJ1ZiArIDQpOwotICAgICAgICBpZiAoY3JjMzJjKGJ1ZiArIGhlYWRlclNpemUsIGNhY2hlU2l6ZSkgIT0gKmNyYykgewotICAgICAgICAgICAgQUxPR0UoImNhY2hlIGZpbGUgZmFpbGVkIENSQyBjaGVjayIpOwotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJsb2JDYWNoZS0+dW5mbGF0dGVuKGJ1ZiArIGhlYWRlclNpemUsIGNhY2hlU2l6ZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHJlYWRpbmcgY2FjaGUgY29udGVudHM6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKLSAgICAgICAgICAgICAgICAgICAgLWVycik7Ci0gICAgICAgICAgICBtdW5tYXAoYnVmLCBmaWxlU2l6ZSk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtdW5tYXAoYnVmLCBmaWxlU2l6ZSk7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2NhY2hlLmggYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2NhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NjAwMDkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9jYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUdMX0NBQ0hFX0gKLSNkZWZpbmUgQU5EUk9JRF9FR0xfQ0FDSEVfSAotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Jsb2JDYWNoZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgZWdsX2Rpc3BsYXlfdDsKLQotY2xhc3MgRUdMQVBJIGVnbF9jYWNoZV90IHsKLXB1YmxpYzoKLQotICAgIC8vIGdldCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc2luZ2xldG9uIGVnbF9jYWNoZV90IG9iamVjdC4gIFRoaXMKLSAgICAvLyBzaW5nbGV0b24gb2JqZWN0IHdpbGwgbmV2ZXIgYmUgZGVzdHJveWVkLgotICAgIHN0YXRpYyBlZ2xfY2FjaGVfdCogZ2V0KCk7Ci0KLSAgICAvLyBpbml0aWFsaXplIHB1dHMgdGhlIGVnbF9jYWNoZV90IGludG8gYW4gaW5pdGlhbGl6ZWQgc3RhdGUsIHN1Y2ggdGhhdCBpdAotICAgIC8vIGlzIGFibGUgdG8gaW5zZXJ0IGFuZCByZXRyaWV2ZSBlbnRyaWVzIGZyb20gdGhlIGNhY2hlLiAgVGhpcyBzaG91bGQgYmUKLSAgICAvLyBjYWxsZWQgd2hlbiBFR0wgaXMgaW5pdGlhbGl6ZWQuICBXaGVuIG5vdCBpbiB0aGUgaW5pdGlhbGl6ZWQgc3RhdGUgdGhlCi0gICAgLy8gZ2V0QmxvYiBhbmQgc2V0QmxvYiBtZXRob2RzIHdpbGwgcmV0dXJuIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgY2FjaGUKLSAgICAvLyBvcGVyYXRpb25zLgotICAgIHZvaWQgaW5pdGlhbGl6ZShlZ2xfZGlzcGxheV90KiBkaXNwbGF5KTsKLQotICAgIC8vIHRlcm1pbmF0ZSBwdXRzIHRoZSBlZ2xfY2FjaGVfdCBiYWNrIGludG8gdGhlIHVuaW5pdGlhbGl6ZWQgc3RhdGUuICBXaGVuCi0gICAgLy8gaW4gdGhpcyBzdGF0ZSB0aGUgZ2V0QmxvYiBhbmQgc2V0QmxvYiBtZXRob2RzIHdpbGwgcmV0dXJuIHdpdGhvdXQKLSAgICAvLyBwZXJmb3JtaW5nIGFueSBjYWNoZSBvcGVyYXRpb25zLgotICAgIHZvaWQgdGVybWluYXRlKCk7Ci0KLSAgICAvLyBzZXRCbG9iIGF0dGVtcHRzIHRvIGluc2VydCBhIG5ldyBrZXkvdmFsdWUgYmxvYiBwYWlyIGludG8gdGhlIGNhY2hlLgotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGhhcmR3YXJlIHZlbmRvcidzIEVHTCBpbXBsZW1lbnRhdGlvbiB2aWEgdGhlCi0gICAgLy8gRUdMX0FORFJPSURfYmxvYl9jYWNoZSBleHRlbnNpb24uCi0gICAgdm9pZCBzZXRCbG9iKGNvbnN0IHZvaWQqIGtleSwgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsIGNvbnN0IHZvaWQqIHZhbHVlLAotICAgICAgICBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKTsKLQotICAgIC8vIGdldEJsb2IgYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGJsb2IgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5Ci0gICAgLy8gYmxvYiBmcm9tIGNhY2hlLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBieSB0aGUgaGFyZHdhcmUgdmVuZG9yJ3MgRUdMCi0gICAgLy8gaW1wbGVtZW50YXRpb24gdmlhIHRoZSBFR0xfQU5EUk9JRF9ibG9iX2NhY2hlIGV4dGVuc2lvbi4KLSAgICBFR0xzaXplaUFORFJPSUQgZ2V0QmxvYihjb25zdCB2b2lkKiBrZXksIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLAotICAgICAgICB2b2lkKiB2YWx1ZSwgRUdMc2l6ZWlBTkRST0lEIHZhbHVlU2l6ZSk7Ci0KLSAgICAvLyBzZXRDYWNoZUZpbGVuYW1lIHNldHMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzdG9yZQotICAgIC8vIGNhY2hlIGNvbnRlbnRzIGZyb20gb25lIHByb2dyYW0gaW52b2NhdGlvbiB0byBhbm90aGVyLgotICAgIHZvaWQgc2V0Q2FjaGVGaWxlbmFtZShjb25zdCBjaGFyKiBmaWxlbmFtZSk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gQ3JlYXRpb24gYW5kICh0aGUgbGFjayBvZikgZGVzdHJ1Y3Rpb24gaXMgaGFuZGxlZCBpbnRlcm5hbGx5LgotICAgIGVnbF9jYWNoZV90KCk7Ci0gICAgfmVnbF9jYWNoZV90KCk7Ci0KLSAgICAvLyBDb3B5aW5nIGlzIGRpc2FsbG93ZWQuCi0gICAgZWdsX2NhY2hlX3QoY29uc3QgZWdsX2NhY2hlX3QmKTsgLy8gbm90IGltcGxlbWVudGVkCi0gICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgZWdsX2NhY2hlX3QmKTsgLy8gbm90IGltcGxlbWVudGVkCi0KLSAgICAvLyBnZXRCbG9iQ2FjaGVMb2NrZWQgcmV0dXJucyB0aGUgQmxvYkNhY2hlIG9iamVjdCBiZWluZyB1c2VkIHRvIHN0b3JlIHRoZQotICAgIC8vIGtleS92YWx1ZSBibG9iIHBhaXJzLiAgSWYgdGhlIEJsb2JDYWNoZSBvYmplY3QgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLAotICAgIC8vIHRoaXMgd2lsbCBkbyBzbywgbG9hZGluZyB0aGUgc2VyaWFsaXplZCBjYWNoZSBjb250ZW50cyBmcm9tIGRpc2sgaWYKLSAgICAvLyBwb3NzaWJsZS4KLSAgICBzcDxCbG9iQ2FjaGU+IGdldEJsb2JDYWNoZUxvY2tlZCgpOwotCi0gICAgLy8gc2F2ZUJsb2JDYWNoZSBhdHRlbXB0cyB0byBzYXZlIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIG1CbG9iQ2FjaGUgdG8KLSAgICAvLyBkaXNrLgotICAgIHZvaWQgc2F2ZUJsb2JDYWNoZUxvY2tlZCgpOwotCi0gICAgLy8gbG9hZEJsb2JDYWNoZSBhdHRlbXB0cyB0byBsb2FkIHRoZSBzYXZlZCBjYWNoZSBjb250ZW50cyBmcm9tIGRpc2sgaW50bwotICAgIC8vIG1CbG9iQ2FjaGUuCi0gICAgdm9pZCBsb2FkQmxvYkNhY2hlTG9ja2VkKCk7Ci0KLSAgICAvLyBtSW5pdGlhbGl6ZWQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVnbF9jYWNoZV90IGlzIGluIHRoZSBpbml0aWFsaXplZAotICAgIC8vIHN0YXRlLiAgSXQgaXMgaW5pdGlhbGl6ZWQgdG8gZmFsc2UgYXQgY29uc3RydWN0aW9uIHRpbWUsIGFuZCBnZXRzIHNldCB0bwotICAgIC8vIHRydWUgd2hlbiBpbml0aWFsaXplIGlzIGNhbGxlZC4gIEl0IGlzIHNldCBiYWNrIHRvIGZhbHNlIHdoZW4gdGVybWluYXRlCi0gICAgLy8gaXMgY2FsbGVkLiAgV2hlbiBpbiB0aGlzIHN0YXRlLCB0aGUgY2FjaGUgYmVoYXZlcyBhcyBub3JtYWwuICBXaGVuIG5vdCwKLSAgICAvLyB0aGUgZ2V0QmxvYiBhbmQgc2V0QmxvYiBtZXRob2RzIHdpbGwgcmV0dXJuIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgY2FjaGUKLSAgICAvLyBvcGVyYXRpb25zLgotICAgIGJvb2wgbUluaXRpYWxpemVkOwotCi0gICAgLy8gbUJsb2JDYWNoZSBpcyB0aGUgY2FjaGUgaW4gd2hpY2ggdGhlIGtleS92YWx1ZSBibG9iIHBhaXJzIGFyZSBzdG9yZWQuICBJdAotICAgIC8vIGlzIGluaXRpYWxseSBOVUxMLCBhbmQgd2lsbCBiZSBpbml0aWFsaXplZCBieSBnZXRCbG9iQ2FjaGVMb2NrZWQgdGhlCi0gICAgLy8gZmlyc3QgdGltZSBpdCdzIG5lZWRlZC4KLSAgICBzcDxCbG9iQ2FjaGU+IG1CbG9iQ2FjaGU7Ci0KLSAgICAvLyBtRmlsZW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZm9yIHN0b3JpbmcgY2FjaGUgY29udGVudHMgaW4gYmV0d2VlbgotICAgIC8vIHByb2dyYW0gaW52b2NhdGlvbnMuICBJdCBpcyBpbml0aWFsaXplZCB0byBhbiBlbXB0eSBzdHJpbmcgYXQKLSAgICAvLyBjb25zdHJ1Y3Rpb24gdGltZSwgYW5kIGNhbiBiZSBzZXQgd2l0aCB0aGUgc2V0Q2FjaGVGaWxlbmFtZSBtZXRob2QuICBBbgotICAgIC8vIGVtcHR5IHN0cmluZyBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgc2hvdWxkIG5vdCBiZSBzYXZlZCB0byBvciByZXN0b3JlZAotICAgIC8vIGZyb20gZGlzay4KLSAgICBTdHJpbmc4IG1GaWxlbmFtZTsKLQotICAgIC8vIG1TYXZlUGVuZGluZyBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBkZWZlcnJlZCBzYXZlIG9wZXJhdGlvbiBpcwotICAgIC8vIHBlbmRpbmcuICBFYWNoIHRpbWUgYSBrZXkvdmFsdWUgcGFpciBpcyBpbnNlcnRlZCBpbnRvIHRoZSBjYWNoZSB2aWEKLSAgICAvLyBzZXRCbG9iLCBhIGRlZmVycmVkIHNhdmUgaXMgaW5pdGlhdGVkIGlmIG9uZSBpcyBub3QgYWxyZWFkeSBwZW5kaW5nLgotICAgIC8vIFRoaXMgd2lsbCB3YWl0IHNvbWUgYW1vdW50IG9mIHRpbWUgYW5kIHRoZW4gdHJpZ2dlciBhIHNhdmUgb2YgdGhlIGNhY2hlCi0gICAgLy8gY29udGVudHMgdG8gZGlzay4KLSAgICBib29sIG1TYXZlUGVuZGluZzsKLQotICAgIC8vIG1NdXRleCBpcyB0aGUgbXV0ZXggdXNlZCB0byBwcmV2ZW50IGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBtZW1iZXIKLSAgICAvLyB2YXJpYWJsZXMuIEl0IG11c3QgYmUgbG9ja2VkIHdoZW5ldmVyIHRoZSBtZW1iZXIgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZC4KLSAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKLQotICAgIC8vIHNDYWNoZSBpcyB0aGUgc2luZ2xldG9uIGVnbF9jYWNoZV90IG9iamVjdC4KLSAgICBzdGF0aWMgZWdsX2NhY2hlX3Qgc0NhY2hlOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfRUdMX0NBQ0hFX0gKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZGlzcGxheS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODViNGNlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZGlzcGxheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTkgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImVnbF9jYWNoZS5oIgotI2luY2x1ZGUgImVnbF9kaXNwbGF5LmgiCi0jaW5jbHVkZSAiZWdsX29iamVjdC5oIgotI2luY2x1ZGUgImVnbF90bHMuaCIKLSNpbmNsdWRlICJlZ2xfaW1wbC5oIgotI2luY2x1ZGUgIkxvYWRlci5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qgc1ZlbmRvclN0cmluZyAgICAgPSAiQW5kcm9pZCI7Ci1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IHNWZXJzaW9uU3RyaW5nICAgID0gIjEuNCBBbmRyb2lkIE1FVEEtRUdMIjsKLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qgc0NsaWVudEFwaVN0cmluZyAgPSAiT3BlbkdMIEVTIjsKLQotLy8gdGhpcyBpcyB0aGUgbGlzdCBvZiBFR0wgZXh0ZW5zaW9ucyB0aGF0IGFyZSBleHBvc2VkIHRvIGFwcGxpY2F0aW9ucwotLy8gc29tZSBvZiB0aGVtIGFyZSBtYW5kYXRvcnkgYmVjYXVzZSB1c2VkIGJ5IHRoZSBBTkRST0lEIHN5c3RlbS4KLS8vCi0vLyBtYW5kYXRvcnkgZXh0ZW5zaW9ucyBhcmUgcmVxdWlyZWQgcGVyIHRoZSBDREQgYW5kIG5vdCBleHBsaWNpdGx5Ci0vLyBjaGVja2VkIGR1cmluZyBFR0wgaW5pdGlhbGl6YXRpb24uIHRoZSBzeXN0ZW0gKmFzc3VtZXMqIHRoZXNlIGV4dGVuc2lvbnMKLS8vIGFyZSBwcmVzZW50LiB0aGUgc3lzdGVtIG1heSBub3QgZnVuY3Rpb24gcHJvcGVybHkgaWYgc29tZSBtYW5kYXRvcnkKLS8vIGV4dGVuc2lvbnMgYXJlIG1pc3NpbmcuCi0vLwotLy8gTk9URTogc0V4dGVuc2lvblN0cmluZyBNVVNUIGJlIGhhdmUgYSBzaW5nbGUgc3BhY2UgYXMgdGhlIGxhc3QgY2hhcmFjdGVyLgotLy8KLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3Qgc0V4dGVuc2lvblN0cmluZyAgPQotICAgICAgICAiRUdMX0tIUl9pbWFnZSAiICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFuZGF0b3J5Ci0gICAgICAgICJFR0xfS0hSX2ltYWdlX2Jhc2UgIiAgICAgICAgICAgICAgICAgICAvLyBtYW5kYXRvcnkKLSAgICAgICAgIkVHTF9LSFJfaW1hZ2VfcGl4bWFwICIKLSAgICAgICAgIkVHTF9LSFJfZ2xfdGV4dHVyZV8yRF9pbWFnZSAiCi0gICAgICAgICJFR0xfS0hSX2dsX3RleHR1cmVfY3ViZW1hcF9pbWFnZSAiCi0gICAgICAgICJFR0xfS0hSX2dsX3JlbmRlcmJ1ZmZlcl9pbWFnZSAiCi0gICAgICAgICJFR0xfS0hSX2ZlbmNlX3N5bmMgIgotICAgICAgICAiRUdMX05WX3N5c3RlbV90aW1lICIKLSAgICAgICAgIkVHTF9BTkRST0lEX2ltYWdlX25hdGl2ZV9idWZmZXIgIiAgICAgIC8vIG1hbmRhdG9yeQotICAgICAgICA7Ci0KLS8vIGV4dGVuc2lvbnMgbm90IGV4cG9zZWQgdG8gYXBwbGljYXRpb25zIGJ1dCB1c2VkIGJ5IHRoZSBBTkRST0lEIHN5c3RlbQotLy8gICAgICAiRUdMX0FORFJPSURfcmVjb3JkYWJsZSAiICAgICAgICAgICAgICAgLy8gbWFuZGF0b3J5Ci0vLyAgICAgICJFR0xfQU5EUk9JRF9ibG9iX2NhY2hlICIgICAgICAgICAgICAgICAvLyBzdHJvbmdseSByZWNvbW1lbmRlZAotCi1leHRlcm4gdm9pZCBpbml0RWdsVHJhY2VMZXZlbCgpOwotZXh0ZXJuIHZvaWQgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKGdsX2hvb2tzX3QgY29uc3QgKnZhbHVlKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lZ2xfZGlzcGxheV90IGVnbF9kaXNwbGF5X3Q6OnNEaXNwbGF5W05VTV9ESVNQTEFZU107Ci0KLWVnbF9kaXNwbGF5X3Q6OmVnbF9kaXNwbGF5X3QoKSA6Ci0gICAgbWFnaWMoJ19kcHknKSwgcmVmcygwKSB7Ci19Ci0KLWVnbF9kaXNwbGF5X3Q6On5lZ2xfZGlzcGxheV90KCkgewotICAgIG1hZ2ljID0gMDsKLSAgICBlZ2xfY2FjaGVfdDo6Z2V0KCktPnRlcm1pbmF0ZSgpOwotfQotCi1lZ2xfZGlzcGxheV90KiBlZ2xfZGlzcGxheV90OjpnZXQoRUdMRGlzcGxheSBkcHkpIHsKLSAgICB1aW50cHRyX3QgaW5kZXggPSB1aW50cHRyX3QoZHB5KS0xVTsKLSAgICByZXR1cm4gKGluZGV4ID49IE5VTV9ESVNQTEFZUykgPyBOVUxMIDogJnNEaXNwbGF5W2luZGV4XTsKLX0KLQotdm9pZCBlZ2xfZGlzcGxheV90OjphZGRPYmplY3QoZWdsX29iamVjdF90KiBvYmplY3QpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgb2JqZWN0cy5hZGQob2JqZWN0KTsKLX0KLQotdm9pZCBlZ2xfZGlzcGxheV90OjpyZW1vdmVPYmplY3QoZWdsX29iamVjdF90KiBvYmplY3QpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgb2JqZWN0cy5yZW1vdmUob2JqZWN0KTsKLX0KLQotYm9vbCBlZ2xfZGlzcGxheV90OjpnZXRPYmplY3QoZWdsX29iamVjdF90KiBvYmplY3QpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgaWYgKG9iamVjdHMuaW5kZXhPZihvYmplY3QpID49IDApIHsKLSAgICAgICAgaWYgKG9iamVjdC0+Z2V0RGlzcGxheSgpID09IHRoaXMpIHsKLSAgICAgICAgICAgIG9iamVjdC0+aW5jUmVmKCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUVHTERpc3BsYXkgZWdsX2Rpc3BsYXlfdDo6Z2V0RnJvbU5hdGl2ZURpc3BsYXkoRUdMTmF0aXZlRGlzcGxheVR5cGUgZGlzcCkgewotICAgIGlmICh1aW50cHRyX3QoZGlzcCkgPj0gTlVNX0RJU1BMQVlTKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiBzRGlzcGxheVt1aW50cHRyX3QoZGlzcCldLmdldERpc3BsYXkoZGlzcCk7Ci19Ci0KLUVHTERpc3BsYXkgZWdsX2Rpc3BsYXlfdDo6Z2V0RGlzcGxheShFR0xOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5KSB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0KLSAgICAvLyBnZXQgb3VyIGRyaXZlciBsb2FkZXIKLSAgICBMb2FkZXImIGxvYWRlcihMb2FkZXI6OmdldEluc3RhbmNlKCkpOwotCi0gICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsOwotICAgIGlmIChjbngtPmRzbyAmJiBkaXNwLmRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBFR0xEaXNwbGF5IGRweSA9IGNueC0+ZWdsLmVnbEdldERpc3BsYXkoZGlzcGxheSk7Ci0gICAgICAgIGRpc3AuZHB5ID0gZHB5OwotICAgICAgICBpZiAoZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgICAgICBsb2FkZXIuY2xvc2UoY254LT5kc28pOwotICAgICAgICAgICAgY254LT5kc28gPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEVHTERpc3BsYXkodWludHB0cl90KGRpc3BsYXkpICsgMVUpOwotfQotCi1FR0xCb29sZWFuIGVnbF9kaXNwbGF5X3Q6OmluaXRpYWxpemUoRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcikgewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGxvY2spOwotCi0gICAgaWYgKHJlZnMgPiAwKSB7Ci0gICAgICAgIGlmIChtYWpvciAhPSBOVUxMKQotICAgICAgICAgICAgKm1ham9yID0gVkVSU0lPTl9NQUpPUjsKLSAgICAgICAgaWYgKG1pbm9yICE9IE5VTEwpCi0gICAgICAgICAgICAqbWlub3IgPSBWRVJTSU9OX01JTk9SOwotICAgICAgICByZWZzKys7Ci0gICAgICAgIHJldHVybiBFR0xfVFJVRTsKLSAgICB9Ci0KLSNpZiBFR0xfVFJBQ0UKLQotICAgIC8vIENhbGxlZCBib3RoIGF0IGVhcmx5X2luaXQgdGltZSBhbmQgYXQgdGhpcyB0aW1lLiAoRWFybHlfaW5pdCBpcyBwcmUtenlnb3RlLCBzbwotICAgIC8vIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoYXQgY2FsbCBtYXkgYmUgc3RhbGUuKQotICAgIGluaXRFZ2xUcmFjZUxldmVsKCk7Ci0KLSNlbmRpZgotCi0gICAgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKCZnSG9va3NOb0NvbnRleHQpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBlYWNoIEVHTCBhbmQKLSAgICAvLyBidWlsZCBvdXIgb3duIGV4dGVuc2lvbiBzdHJpbmcgZmlyc3QsIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gd2Uga25vdwotICAgIC8vIGFuZCB0aGUgZXh0ZW5zaW9uIHN1cHBvcnRlZCBieSBvdXIgY2xpZW50IGltcGxlbWVudGF0aW9uCi0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgY254LT5tYWpvciA9IC0xOwotICAgIGNueC0+bWlub3IgPSAtMTsKLSAgICBpZiAoY254LT5kc28pIHsKLQotI2lmIGRlZmluZWQoQURSRU5PMTMwKQotI3dhcm5pbmcgIkFkcmVuby0xMzAgZWdsSW5pdGlhbGl6ZSgpIHdvcmthcm91bmQiCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRoZSBBRFJFTk8gMTMwIGRyaXZlciByZXR1cm5zIGEgZGlmZmVyZW50IEVHTERpc3BsYXkgZWFjaCB0aW1lCi0gICAgICAgICAqIGVnbEdldERpc3BsYXkoKSBpcyBjYWxsZWQsIGJ1dCBhbHNvIG1ha2VzIHRoZSBFR0xEaXNwbGF5IGludmFsaWQKLSAgICAgICAgICogYWZ0ZXIgZWdsVGVybWluYXRlKCkgaGFzIGJlZW4gY2FsbGVkLCBzbyB0aGF0IGVnbEluaXRpYWxpemUoKQotICAgICAgICAgKiBjYW5ub3QgYmUgY2FsbGVkIGFnYWluLiBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGNhbGwKLSAgICAgICAgICogZWdsR2V0RGlzcGxheSgpIGJlZm9yZSBjYWxsaW5nIGVnbEluaXRpYWxpemUoKTsKLSAgICAgICAgICovCi0gICAgICAgIGlmIChpID09IElNUExfSEFSRFdBUkUpIHsKLSAgICAgICAgICAgIGRpc3BbaV0uZHB5ID0gY254LT5lZ2wuZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgRUdMRGlzcGxheSBpZHB5ID0gZGlzcC5kcHk7Ci0gICAgICAgIGlmIChjbngtPmVnbC5lZ2xJbml0aWFsaXplKGlkcHksICZjbngtPm1ham9yLCAmY254LT5taW5vcikpIHsKLSAgICAgICAgICAgIC8vQUxPR0QoImluaXRpYWxpemVkIGRweT0lcCwgdmVyPSVkLiVkLCBjbng9JXAiLAotICAgICAgICAgICAgLy8gICAgICAgIGlkcHksIGNueC0+bWFqb3IsIGNueC0+bWlub3IsIGNueCk7Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgaXMgbm93IGluaXRpYWxpemVkCi0gICAgICAgICAgICBkaXNwLnN0YXRlID0gZWdsX2Rpc3BsYXlfdDo6SU5JVElBTElaRUQ7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcXVlcnktc3RyaW5ncyBmb3IgdGhpcyBkaXNwbGF5IGZvciBlYWNoIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICBkaXNwLnF1ZXJ5U3RyaW5nLnZlbmRvciA9IGNueC0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGlkcHksCi0gICAgICAgICAgICAgICAgICAgIEVHTF9WRU5ET1IpOwotICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy52ZXJzaW9uID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX1ZFUlNJT04pOwotICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy5leHRlbnNpb25zID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX0VYVEVOU0lPTlMpOwotICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy5jbGllbnRBcGkgPSBjbngtPmVnbC5lZ2xRdWVyeVN0cmluZyhpZHB5LAotICAgICAgICAgICAgICAgICAgICBFR0xfQ0xJRU5UX0FQSVMpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZWdsSW5pdGlhbGl6ZSglcCkgZmFpbGVkICglcykiLCBpZHB5LAotICAgICAgICAgICAgICAgICAgICBlZ2xfdGxzX3Q6OmVnbF9zdHJlcnJvcihjbngtPmVnbC5lZ2xHZXRFcnJvcigpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0aGUgcXVlcnkgc3RyaW5ncyBhcmUgcGVyLWRpc3BsYXkKLSAgICBtVmVuZG9yU3RyaW5nLnNldFRvKHNWZW5kb3JTdHJpbmcpOwotICAgIG1WZXJzaW9uU3RyaW5nLnNldFRvKHNWZXJzaW9uU3RyaW5nKTsKLSAgICBtQ2xpZW50QXBpU3RyaW5nLnNldFRvKHNDbGllbnRBcGlTdHJpbmcpOwotCi0gICAgLy8gd2Ugb25seSBhZGQgZXh0ZW5zaW9ucyB0aGF0IGV4aXN0IGluIHRoZSBpbXBsZW1lbnRhdGlvbgotICAgIGNoYXIgY29uc3QqIHN0YXJ0ID0gc0V4dGVuc2lvblN0cmluZzsKLSAgICBjaGFyIGNvbnN0KiBlbmQ7Ci0gICAgZG8gewotICAgICAgICAvLyBmaW5kIHRoZSBzcGFjZSBzZXBhcmF0aW5nIHRoaXMgZXh0ZW5zaW9uIGZvciB0aGUgbmV4dCBvbmUKLSAgICAgICAgZW5kID0gc3RyY2hyKHN0YXJ0LCAnICcpOwotICAgICAgICBpZiAoZW5kKSB7Ci0gICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIGV4dGVuc2lvbiBzdHJpbmcKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBsZW4gPSBlbmQgLSBzdGFydDsKLSAgICAgICAgICAgIGlmIChsZW4pIHsKLSAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBjb3VsZCBhdm9pZCB0aGUgY29weSBpZiB3ZSBoYWQgc3RybnN0ci4KLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGV4dChzdGFydCwgbGVuKTsKLSAgICAgICAgICAgICAgICAvLyBub3cgbG9vayBmb3IgdGhpcyBleHRlbnNpb24KLSAgICAgICAgICAgICAgICBpZiAoZGlzcC5xdWVyeVN0cmluZy5leHRlbnNpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGZpbmQgaXQsIGFkZCB0aGlzIGV4dGVuc2lvbiBzdHJpbmcgdG8gb3VyIGxpc3QKLSAgICAgICAgICAgICAgICAgICAgLy8gKGFuZCBkb24ndCBmb3JnZXQgdGhlIHNwYWNlKQotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtYXRjaCA9IHN0cnN0cihkaXNwLnF1ZXJ5U3RyaW5nLmV4dGVuc2lvbnMsIGV4dC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiAobWF0Y2hbbGVuXSA9PSAnICcgfHwgbWF0Y2hbbGVuXSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUV4dGVuc2lvblN0cmluZy5hcHBlbmQoc3RhcnQsIGxlbisxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHByb2Nlc3MgdGhlIG5leHQgZXh0ZW5zaW9uIHN0cmluZywgYW5kIHNraXAgdGhlIHNwYWNlLgotICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoZW5kKTsKLQotICAgIGVnbF9jYWNoZV90OjpnZXQoKS0+aW5pdGlhbGl6ZSh0aGlzKTsKLQotICAgIHJlZnMrKzsKLSAgICBpZiAobWFqb3IgIT0gTlVMTCkKLSAgICAgICAgKm1ham9yID0gVkVSU0lPTl9NQUpPUjsKLSAgICBpZiAobWlub3IgIT0gTlVMTCkKLSAgICAgICAgKm1pbm9yID0gVkVSU0lPTl9NSU5PUjsKLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLUVHTEJvb2xlYW4gZWdsX2Rpc3BsYXlfdDo6dGVybWluYXRlKCkgewotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGxvY2spOwotCi0gICAgaWYgKHJlZnMgPT0gMCkgewotICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX05PVF9JTklUSUFMSVpFRCwgRUdMX0ZBTFNFKTsKLSAgICB9Ci0KLSAgICAvLyB0aGlzIGlzIHNwZWNpZmljIHRvIEFuZHJvaWQsIGRpc3BsYXkgdGVybWluYXRpb24gaXMgcmVmLWNvdW50ZWQuCi0gICAgaWYgKHJlZnMgPiAxKSB7Ci0gICAgICAgIHJlZnMtLTsKLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwotICAgIH0KLQotICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gJiYgZGlzcC5zdGF0ZSA9PSBlZ2xfZGlzcGxheV90OjpJTklUSUFMSVpFRCkgewotICAgICAgICBpZiAoY254LT5lZ2wuZWdsVGVybWluYXRlKGRpc3AuZHB5KSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgICAgIEFMT0dXKCJlZ2xUZXJtaW5hdGUoJXApIGZhaWxlZCAoJXMpIiwgZGlzcC5kcHksCi0gICAgICAgICAgICAgICAgICAgIGVnbF90bHNfdDo6ZWdsX3N0cmVycm9yKGNueC0+ZWdsLmVnbEdldEVycm9yKCkpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBSRVZJU0lUOiBpdCdzIHVuY2xlYXIgd2hhdCB0byBkbyBpZiBlZ2xUZXJtaW5hdGUoKSBmYWlscwotICAgICAgICBkaXNwLnN0YXRlID0gZWdsX2Rpc3BsYXlfdDo6VEVSTUlOQVRFRDsKLSAgICAgICAgcmVzID0gRUdMX1RSVUU7Ci0gICAgfQotCi0gICAgLy8gTWFyayBhbGwgb2JqZWN0cyByZW1haW5pbmcgaW4gdGhlIGxpc3QgYXMgdGVybWluYXRlZCwgdW5sZXNzCi0gICAgLy8gdGhlcmUgYXJlIG5vIHJlZmVyZW5jZSB0byB0aGVtLCBpdCB3aGljaCBjYXNlLCB3ZSdyZSBmcmVlIHRvCi0gICAgLy8gZGVsZXRlIHRoZW0uCi0gICAgc2l6ZV90IGNvdW50ID0gb2JqZWN0cy5zaXplKCk7Ci0gICAgQUxPR1dfSUYoY291bnQsICJlZ2xUZXJtaW5hdGUoKSBjYWxsZWQgdy8gJWQgb2JqZWN0cyByZW1haW5pbmciLCBjb3VudCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBlZ2xfb2JqZWN0X3QqIG8gPSBvYmplY3RzLml0ZW1BdChpKTsKLSAgICAgICAgby0+ZGVzdHJveSgpOwotICAgIH0KLQotICAgIC8vIHRoaXMgbWFya3MgYWxsIG9iamVjdCBoYW5kbGVzIGFyZSAidGVybWluYXRlZCIKLSAgICBvYmplY3RzLmNsZWFyKCk7Ci0KLSAgICByZWZzLS07Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotdm9pZCBlZ2xfZGlzcGxheV90Ojpsb3NlQ3VycmVudChlZ2xfY29udGV4dF90ICogY3VyX2MpCi17Ci0gICAgaWYgKGN1cl9jKSB7Ci0gICAgICAgIGVnbF9kaXNwbGF5X3QqIGRpc3BsYXkgPSBjdXJfYy0+Z2V0RGlzcGxheSgpOwotICAgICAgICBpZiAoZGlzcGxheSkgewotICAgICAgICAgICAgZGlzcGxheS0+bG9zZUN1cnJlbnRJbXBsKGN1cl9jKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBlZ2xfZGlzcGxheV90Ojpsb3NlQ3VycmVudEltcGwoZWdsX2NvbnRleHRfdCAqIGN1cl9jKQotewotICAgIC8vIGJ5IGNvbnN0cnVjdGlvbiwgdGhlc2UgYXJlIGVpdGhlciAwIG9yIHZhbGlkIChwb3NzaWJseSB0ZXJtaW5hdGVkKQotICAgIC8vIGl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIGZvciB0aGVzZSB0byBiZSBpbnZhbGlkCi0gICAgQ29udGV4dFJlZiBfY3VyX2MoY3VyX2MpOwotICAgIFN1cmZhY2VSZWYgX2N1cl9yKGN1cl9jID8gZ2V0X3N1cmZhY2UoY3VyX2MtPnJlYWQpIDogTlVMTCk7Ci0gICAgU3VyZmFjZVJlZiBfY3VyX2QoY3VyX2MgPyBnZXRfc3VyZmFjZShjdXJfYy0+ZHJhdykgOiBOVUxMKTsKLQotICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChsb2NrKTsKLSAgICAgICAgY3VyX2MtPm9uTG9vc2VDdXJyZW50KCk7Ci0KLSAgICB9Ci0KLSAgICAvLyBUaGlzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkIGJlY2F1c2UgaXQgbWlnaHQgZW5kLXVwCi0gICAgLy8gY2FsbGluZyBiYWNrIGludG8gRUdMIChpbiBwYXJ0aWN1bGFyIHdoZW4gYSBzdXJmYWNlIGlzIGRlc3Ryb3llZAotICAgIC8vIGl0IGNhbGxzIEFOYXRpdmVXaW5kb3c6OmRpc2Nvbm5lY3QKLSAgICBfY3VyX2MucmVsZWFzZSgpOwotICAgIF9jdXJfci5yZWxlYXNlKCk7Ci0gICAgX2N1cl9kLnJlbGVhc2UoKTsKLX0KLQotRUdMQm9vbGVhbiBlZ2xfZGlzcGxheV90OjptYWtlQ3VycmVudChlZ2xfY29udGV4dF90KiBjLCBlZ2xfY29udGV4dF90KiBjdXJfYywKLSAgICAgICAgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4LAotICAgICAgICBFR0xTdXJmYWNlIGltcGxfZHJhdywgRUdMU3VyZmFjZSBpbXBsX3JlYWQsIEVHTENvbnRleHQgaW1wbF9jdHgpCi17Ci0gICAgRUdMQm9vbGVhbiByZXN1bHQ7Ci0KLSAgICAvLyBieSBjb25zdHJ1Y3Rpb24sIHRoZXNlIGFyZSBlaXRoZXIgMCBvciB2YWxpZCAocG9zc2libHkgdGVybWluYXRlZCkKLSAgICAvLyBpdCBzaG91bGQgYmUgaW1wb3NzaWJsZSBmb3IgdGhlc2UgdG8gYmUgaW52YWxpZAotICAgIENvbnRleHRSZWYgX2N1cl9jKGN1cl9jKTsKLSAgICBTdXJmYWNlUmVmIF9jdXJfcihjdXJfYyA/IGdldF9zdXJmYWNlKGN1cl9jLT5yZWFkKSA6IE5VTEwpOwotICAgIFN1cmZhY2VSZWYgX2N1cl9kKGN1cl9jID8gZ2V0X3N1cmZhY2UoY3VyX2MtPmRyYXcpIDogTlVMTCk7Ci0KLSAgICB7IC8vIHNjb3BlIGZvciB0aGUgbG9jawotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgICAgIGlmIChjKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBjLT5jbngtPmVnbC5lZ2xNYWtlQ3VycmVudCgKLSAgICAgICAgICAgICAgICAgICAgZGlzcC5kcHksIGltcGxfZHJhdywgaW1wbF9yZWFkLCBpbXBsX2N0eCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IEVHTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgYy0+b25NYWtlQ3VycmVudChkcmF3LCByZWFkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGN1cl9jLT5jbngtPmVnbC5lZ2xNYWtlQ3VycmVudCgKLSAgICAgICAgICAgICAgICAgICAgZGlzcC5kcHksIGltcGxfZHJhdywgaW1wbF9yZWFkLCBpbXBsX2N0eCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IEVHTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgY3VyX2MtPm9uTG9vc2VDdXJyZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ID09IEVHTF9UUlVFKSB7Ci0gICAgICAgIC8vIFRoaXMgY2Fubm90IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgYmVjYXVzZSBpdCBtaWdodCBlbmQtdXAKLSAgICAgICAgLy8gY2FsbGluZyBiYWNrIGludG8gRUdMIChpbiBwYXJ0aWN1bGFyIHdoZW4gYSBzdXJmYWNlIGlzIGRlc3Ryb3llZAotICAgICAgICAvLyBpdCBjYWxscyBBTmF0aXZlV2luZG93OjpkaXNjb25uZWN0Ci0gICAgICAgIF9jdXJfYy5yZWxlYXNlKCk7Ci0gICAgICAgIF9jdXJfci5yZWxlYXNlKCk7Ci0gICAgICAgIF9jdXJfZC5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZGlzcGxheS5oIGIvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDgyMjguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FR0xfRElTUExBWV9ICi0jZGVmaW5lIEFORFJPSURfRUdMX0RJU1BMQVlfSAotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgImVnbGRlZnMuaCIKLSNpbmNsdWRlICJob29rcy5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIGVnbF9vYmplY3RfdDsKLWNsYXNzIGVnbF9jb250ZXh0X3Q7Ci1jbGFzcyBlZ2xfY29ubmVjdGlvbl90OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEVHTEFQSSBlZ2xfZGlzcGxheV90IHsgLy8gbWFya2VkIGFzIEVHTEFQSSBmb3IgdGVzdGluZyBwdXJwb3NlcwotICAgIHN0YXRpYyBlZ2xfZGlzcGxheV90IHNEaXNwbGF5W05VTV9ESVNQTEFZU107Ci0gICAgRUdMRGlzcGxheSBnZXREaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpOwotICAgIHZvaWQgbG9zZUN1cnJlbnRJbXBsKGVnbF9jb250ZXh0X3QgKiBjdXJfYyk7Ci0KLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgTk9UX0lOSVRJQUxJWkVEID0gMCwKLSAgICAgICAgSU5JVElBTElaRUQgICAgID0gMSwKLSAgICAgICAgVEVSTUlOQVRFRCAgICAgID0gMgotICAgIH07Ci0KLSAgICBlZ2xfZGlzcGxheV90KCk7Ci0gICAgfmVnbF9kaXNwbGF5X3QoKTsKLQotICAgIEVHTEJvb2xlYW4gaW5pdGlhbGl6ZShFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKTsKLSAgICBFR0xCb29sZWFuIHRlcm1pbmF0ZSgpOwotCi0gICAgLy8gYWRkIG9iamVjdCB0byB0aGlzIGRpc3BsYXkncyBsaXN0Ci0gICAgdm9pZCBhZGRPYmplY3QoZWdsX29iamVjdF90KiBvYmplY3QpOwotICAgIC8vIHJlbW92ZSBvYmplY3QgZnJvbSB0aGlzIGRpc3BsYXkncyBsaXN0Ci0gICAgdm9pZCByZW1vdmVPYmplY3QoZWdsX29iamVjdF90KiBvYmplY3QpOwotICAgIC8vIGFkZCByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QuIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgb2JqZWN0LgotICAgIGJvb2wgZ2V0T2JqZWN0KGVnbF9vYmplY3RfdCogb2JqZWN0KSBjb25zdDsKLQotICAgIHN0YXRpYyBlZ2xfZGlzcGxheV90KiBnZXQoRUdMRGlzcGxheSBkcHkpOwotICAgIHN0YXRpYyBFR0xEaXNwbGF5IGdldEZyb21OYXRpdmVEaXNwbGF5KEVHTE5hdGl2ZURpc3BsYXlUeXBlIGRpc3ApOwotCi0gICAgRUdMQm9vbGVhbiBtYWtlQ3VycmVudChlZ2xfY29udGV4dF90KiBjLCBlZ2xfY29udGV4dF90KiBjdXJfYywKLSAgICAgICAgICAgIEVHTFN1cmZhY2UgZHJhdywgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCwKLSAgICAgICAgICAgIEVHTFN1cmZhY2UgaW1wbF9kcmF3LCBFR0xTdXJmYWNlIGltcGxfcmVhZCwgRUdMQ29udGV4dCBpbXBsX2N0eCk7Ci0gICAgc3RhdGljIHZvaWQgbG9zZUN1cnJlbnQoZWdsX2NvbnRleHRfdCAqIGN1cl9jKTsKLQotICAgIGlubGluZSBib29sIGlzUmVhZHkoKSBjb25zdCB7IHJldHVybiAocmVmcyA+IDApOyB9Ci0gICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1hZ2ljID09ICdfZHB5JzsgfQotICAgIGlubGluZSBib29sIGlzQWxpdmUoKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCk7IH0KLQotICAgIGNoYXIgY29uc3QgKiBnZXRWZW5kb3JTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtVmVuZG9yU3RyaW5nLnN0cmluZygpOyB9Ci0gICAgY2hhciBjb25zdCAqIGdldFZlcnNpb25TdHJpbmcoKSBjb25zdCB7IHJldHVybiBtVmVyc2lvblN0cmluZy5zdHJpbmcoKTsgfQotICAgIGNoYXIgY29uc3QgKiBnZXRDbGllbnRBcGlTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtQ2xpZW50QXBpU3RyaW5nLnN0cmluZygpOyB9Ci0gICAgY2hhciBjb25zdCAqIGdldEV4dGVuc2lvblN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1FeHRlbnNpb25TdHJpbmcuc3RyaW5nKCk7IH0KLQotICAgIGlubGluZSB1aW50MzJfdCBnZXRSZWZzQ291bnQoKSBjb25zdCB7IHJldHVybiByZWZzOyB9Ci0KLSAgICBzdHJ1Y3Qgc3RyaW5nc190IHsKLSAgICAgICAgY2hhciBjb25zdCAqIHZlbmRvcjsKLSAgICAgICAgY2hhciBjb25zdCAqIHZlcnNpb247Ci0gICAgICAgIGNoYXIgY29uc3QgKiBjbGllbnRBcGk7Ci0gICAgICAgIGNoYXIgY29uc3QgKiBleHRlbnNpb25zOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgRGlzcGxheUltcGwgewotICAgICAgICBEaXNwbGF5SW1wbCgpIDogZHB5KEVHTF9OT19ESVNQTEFZKSwgc3RhdGUoTk9UX0lOSVRJQUxJWkVEKSB7IH0KLSAgICAgICAgRUdMRGlzcGxheSAgZHB5OwotICAgICAgICBFR0xpbnQgICAgICBzdGF0ZTsKLSAgICAgICAgc3RyaW5nc190ICAgcXVlcnlTdHJpbmc7Ci0gICAgfTsKLQotcHJpdmF0ZToKLSAgICB1aW50MzJfdCAgICAgICAgbWFnaWM7Ci0KLXB1YmxpYzoKLSAgICBEaXNwbGF5SW1wbCAgICAgZGlzcDsKLQotcHJpdmF0ZToKLSAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICByZWZzOwotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIGxvY2s7Ci0gICAgICAgICAgICBTb3J0ZWRWZWN0b3I8ZWdsX29iamVjdF90Kj4gb2JqZWN0czsKLSAgICAgICAgICAgIFN0cmluZzggbVZlbmRvclN0cmluZzsKLSAgICAgICAgICAgIFN0cmluZzggbVZlcnNpb25TdHJpbmc7Ci0gICAgICAgICAgICBTdHJpbmc4IG1DbGllbnRBcGlTdHJpbmc7Ci0gICAgICAgICAgICBTdHJpbmc4IG1FeHRlbnNpb25TdHJpbmc7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlubGluZSBlZ2xfZGlzcGxheV90KiBnZXRfZGlzcGxheShFR0xEaXNwbGF5IGRweSkgewotICAgIHJldHVybiBlZ2xfZGlzcGxheV90OjpnZXQoZHB5KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lZ2xfZGlzcGxheV90KiB2YWxpZGF0ZV9kaXNwbGF5KEVHTERpc3BsYXkgZHB5KTsKLWVnbF9jb25uZWN0aW9uX3QqIHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xDb25maWcgY29uZmlnLCBlZ2xfZGlzcGxheV90IGNvbnN0KiYgZHApOwotRUdMQm9vbGVhbiB2YWxpZGF0ZV9kaXNwbGF5X2NvbnRleHQoRUdMRGlzcGxheSBkcHksIEVHTENvbnRleHQgY3R4KTsKLUVHTEJvb2xlYW4gdmFsaWRhdGVfZGlzcGxheV9zdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLy8gQU5EUk9JRF9FR0xfRElTUExBWV9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4gYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2VudHJpZXMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDJhN2UuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9lbnRyaWVzLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotRUdMX0VOVFJZKEVHTERpc3BsYXksIGVnbEdldERpc3BsYXksIE5hdGl2ZURpc3BsYXlUeXBlKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEluaXRpYWxpemUsIEVHTERpc3BsYXksIEVHTGludCosIEVHTGludCopCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsVGVybWluYXRlLCBFR0xEaXNwbGF5KQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ3MsIEVHTERpc3BsYXksIEVHTENvbmZpZyosIEVHTGludCwgRUdMaW50KikKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xDaG9vc2VDb25maWcsIEVHTERpc3BsYXksIGNvbnN0IEVHTGludCAqLCBFR0xDb25maWcgKiwgRUdMaW50LCBFR0xpbnQgKikKLQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEdldENvbmZpZ0F0dHJpYiwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBFR0xpbnQsIEVHTGludCAqKQotRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UsIEVHTERpc3BsYXksIEVHTENvbmZpZywgTmF0aXZlV2luZG93VHlwZSwgY29uc3QgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMU3VyZmFjZSwgZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZSwgRUdMRGlzcGxheSwgRUdMQ29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlLCBjb25zdCBFR0xpbnQgKikKLUVHTF9FTlRSWShFR0xTdXJmYWNlLCBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSwgIEVHTERpc3BsYXksIEVHTENvbmZpZywgY29uc3QgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsRGVzdHJveVN1cmZhY2UsIEVHTERpc3BsYXksIEVHTFN1cmZhY2UpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUXVlcnlTdXJmYWNlLCAgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQgKikKLUVHTF9FTlRSWShFR0xDb250ZXh0LCBlZ2xDcmVhdGVDb250ZXh0LCBFR0xEaXNwbGF5LCBFR0xDb25maWcsIEVHTENvbnRleHQsIGNvbnN0IEVHTGludCAqKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbERlc3Ryb3lDb250ZXh0LCBFR0xEaXNwbGF5LCBFR0xDb250ZXh0KQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbE1ha2VDdXJyZW50LCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xTdXJmYWNlLCBFR0xDb250ZXh0KQotRUdMX0VOVFJZKEVHTENvbnRleHQsIGVnbEdldEN1cnJlbnRDb250ZXh0LCB2b2lkKQotRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbEdldEN1cnJlbnRTdXJmYWNlLCBFR0xpbnQpCi1FR0xfRU5UUlkoRUdMRGlzcGxheSwgZWdsR2V0Q3VycmVudERpc3BsYXksIHZvaWQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUXVlcnlDb250ZXh0LCAgRUdMRGlzcGxheSwgRUdMQ29udGV4dCwgRUdMaW50LCBFR0xpbnQgKikKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xXYWl0R0wsIHZvaWQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsV2FpdE5hdGl2ZSwgRUdMaW50KQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbFN3YXBCdWZmZXJzLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbENvcHlCdWZmZXJzLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBOYXRpdmVQaXhtYXBUeXBlKQotRUdMX0VOVFJZKEVHTGludCwgZWdsR2V0RXJyb3IsIHZvaWQpCi1FR0xfRU5UUlkoY29uc3QgY2hhciosIGVnbFF1ZXJ5U3RyaW5nLCBFR0xEaXNwbGF5LCBFR0xpbnQpCi1FR0xfRU5UUlkoX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSwgZWdsR2V0UHJvY0FkZHJlc3MsIGNvbnN0IGNoYXIgKikKLQotLyogRUdMIDEuMSAqLwotCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3VyZmFjZUF0dHJpYiwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsQmluZFRleEltYWdlLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsUmVsZWFzZVRleEltYWdlLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlLCBFR0xpbnQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsU3dhcEludGVydmFsLCBFR0xEaXNwbGF5LCBFR0xpbnQpCi0KLS8qIEVHTCAxLjIgKi8KLQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sIGVnbEJpbmRBUEksIEVHTGVudW0pCi1FR0xfRU5UUlkoRUdMZW51bSwgZWdsUXVlcnlBUEksIHZvaWQpCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgZWdsV2FpdENsaWVudCwgdm9pZCkKLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xSZWxlYXNlVGhyZWFkLCB2b2lkKQotRUdMX0VOVFJZKEVHTFN1cmZhY2UsIGVnbENyZWF0ZVBidWZmZXJGcm9tQ2xpZW50QnVmZmVyLCBFR0xEaXNwbGF5LCBFR0xlbnVtLCBFR0xDbGllbnRCdWZmZXIsIEVHTENvbmZpZywgY29uc3QgRUdMaW50ICopCi0KLS8qIEVHTCAxLjMgKi8KLQotLyogRUdMIDEuNCAqLwotCi0vKiBFR0xfRUdMRVhUX1ZFUlNJT04gMyAqLwotCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgIGVnbExvY2tTdXJmYWNlS0hSLCAgIEVHTERpc3BsYXksIEVHTFN1cmZhY2UsIGNvbnN0IEVHTGludCAqKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sICBlZ2xVbmxvY2tTdXJmYWNlS0hSLCBFR0xEaXNwbGF5LCBFR0xTdXJmYWNlKQotRUdMX0VOVFJZKEVHTEltYWdlS0hSLCBlZ2xDcmVhdGVJbWFnZUtIUiwgICBFR0xEaXNwbGF5LCBFR0xDb250ZXh0LCBFR0xlbnVtLCBFR0xDbGllbnRCdWZmZXIsIGNvbnN0IEVHTGludCAqKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sICBlZ2xEZXN0cm95SW1hZ2VLSFIsICBFR0xEaXNwbGF5LCBFR0xJbWFnZUtIUikKLQotLyogRUdMX0VHTEVYVF9WRVJTSU9OIDUgKi8KLQotRUdMX0VOVFJZKEVHTFN5bmNLSFIsICAgZWdsQ3JlYXRlU3luY0tIUiwgICAgICAgRUdMRGlzcGxheSwgRUdMZW51bSwgY29uc3QgRUdMaW50ICopCi1FR0xfRU5UUlkoRUdMQm9vbGVhbiwgICBlZ2xEZXN0cm95U3luY0tIUiwgICAgICBFR0xEaXNwbGF5LCBFR0xTeW5jS0hSKQotRUdMX0VOVFJZKEVHTGludCwgICAgICAgZWdsQ2xpZW50V2FpdFN5bmNLSFIsICAgRUdMRGlzcGxheSwgRUdMU3luY0tIUiwgRUdMaW50LCBFR0xUaW1lS0hSKQotRUdMX0VOVFJZKEVHTEJvb2xlYW4sICAgZWdsR2V0U3luY0F0dHJpYktIUiwgICAgRUdMRGlzcGxheSwgRUdMU3luY0tIUiwgRUdMaW50LCBFR0xpbnQgKikKLQotLyogQU5EUk9JRCBleHRlbnNpb25zICovCi0KLUVHTF9FTlRSWShFR0xCb29sZWFuLCBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSwgRUdMaW50LCBFR0xpbnQsIEVHTGludCwgRUdMaW50KQotRUdMX0VOVFJZKEVHTENsaWVudEJ1ZmZlciwgZWdsR2V0UmVuZGVyQnVmZmVyQU5EUk9JRCwgRUdMRGlzcGxheSwgRUdMU3VyZmFjZSkKLQotLyogTlZJRElBIGV4dGVuc2lvbnMgKi8KLQotRUdMX0VOVFJZKEVHTHVpbnQ2NE5WLCBlZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlYsIHZvaWQpCi1FR0xfRU5UUlkoRUdMdWludDY0TlYsIGVnbEdldFN5c3RlbVRpbWVOViwgdm9pZCkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfb2JqZWN0LmNwcCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfb2JqZWN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjYmIzMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX29iamVjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSAiZWdsX29iamVjdC5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVnbF9vYmplY3RfdDo6ZWdsX29iamVjdF90KGVnbF9kaXNwbGF5X3QqIGRpc3ApIDoKLSAgICBkaXNwbGF5KGRpc3ApLCBjb3VudCgxKSB7Ci0gICAgLy8gTk9URTogdGhpcyBkb2VzIGFuIGltcGxpY2l0IGluY1JlZgotICAgIGRpc3BsYXktPmFkZE9iamVjdCh0aGlzKTsKLX0KLQotZWdsX29iamVjdF90Ojp+ZWdsX29iamVjdF90KCkgewotfQotCi12b2lkIGVnbF9vYmplY3RfdDo6dGVybWluYXRlKCkgewotICAgIC8vIHRoaXMgbWFya3MgdGhlIG9iamVjdCBhcyAidGVybWluYXRlZCIKLSAgICBkaXNwbGF5LT5yZW1vdmVPYmplY3QodGhpcyk7Ci0gICAgaWYgKGRlY1JlZigpID09IDEpIHsKLSAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGZyb20gTG9jYWxSZWYKLSAgICAgICAgQUxPR0UoImVnbF9vYmplY3RfdDo6dGVybWluYXRlKCkgcmVtb3ZlZCB0aGUgbGFzdCByZWZlcmVuY2UhIik7Ci0gICAgfQotfQotCi12b2lkIGVnbF9vYmplY3RfdDo6ZGVzdHJveSgpIHsKLSAgICBpZiAoZGVjUmVmKCkgPT0gMSkgewotICAgICAgICBkZWxldGUgdGhpczsKLSAgICB9Ci19Ci0KLWJvb2wgZWdsX29iamVjdF90OjpnZXQoZWdsX2Rpc3BsYXlfdCBjb25zdCogZGlzcGxheSwgZWdsX29iamVjdF90KiBvYmplY3QpIHsKLSAgICAvLyB1c2VkIGJ5IExvY2FsUmVmLCB0aGlzIGRvZXMgYW4gaW5jUmVmKCkgYXRvbWljYWxseSB3aXRoCi0gICAgLy8gY2hlY2tpbmcgdGhhdCB0aGUgb2JqZWN0IGlzIHZhbGlkLgotICAgIHJldHVybiBkaXNwbGF5LT5nZXRPYmplY3Qob2JqZWN0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lZ2xfY29udGV4dF90OjplZ2xfY29udGV4dF90KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGNvbnRleHQsIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqIGNueCwgaW50IHZlcnNpb24pIDoKLSAgICBlZ2xfb2JqZWN0X3QoZ2V0X2Rpc3BsYXkoZHB5KSksIGRweShkcHkpLCBjb250ZXh0KGNvbnRleHQpLAotICAgICAgICAgICAgY29uZmlnKGNvbmZpZyksIHJlYWQoMCksIGRyYXcoMCksIGNueChjbngpLAotICAgICAgICAgICAgdmVyc2lvbih2ZXJzaW9uKQotewotfQotCi12b2lkIGVnbF9jb250ZXh0X3Q6Om9uTG9vc2VDdXJyZW50KCkgewotICAgIHJlYWQgPSBOVUxMOwotICAgIGRyYXcgPSBOVUxMOwotfQotCi12b2lkIGVnbF9jb250ZXh0X3Q6Om9uTWFrZUN1cnJlbnQoRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQpIHsKLSAgICB0aGlzLT5yZWFkID0gcmVhZDsKLSAgICB0aGlzLT5kcmF3ID0gZHJhdzsKLQotICAgIC8qCi0gICAgICogSGVyZSB3ZSBjYWNoZSB0aGUgR0xfRVhURU5TSU9OUyBzdHJpbmcgZm9yIHRoaXMgY29udGV4dCBhbmQgd2UKLSAgICAgKiBhZGQgdGhlIGV4dGVuc2lvbnMgYWx3YXlzIGhhbmRsZWQgYnkgdGhlIHdyYXBwZXIKLSAgICAgKi8KLQotICAgIGlmIChnbF9leHRlbnNpb25zLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBjYWxsIHRoZSBpbXBsZW1lbnRhdGlvbidzIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpCi0gICAgICAgIGNvbnN0IGNoYXIqIGV4dHMgPSAoY29uc3QgY2hhciAqKWdFR0xJbXBsLmhvb2tzW3ZlcnNpb25dLT5nbC5nbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKTsKLSAgICAgICAgZ2xfZXh0ZW5zaW9ucy5zZXRUbyhleHRzKTsKLSAgICAgICAgaWYgKGdsX2V4dGVuc2lvbnMuZmluZCgiR0xfRVhUX2RlYnVnX21hcmtlciIpIDwgMCkgewotICAgICAgICAgICAgU3RyaW5nOCB0ZW1wKCJHTF9FWFRfZGVidWdfbWFya2VyICIpOwotICAgICAgICAgICAgdGVtcC5hcHBlbmQoZ2xfZXh0ZW5zaW9ucyk7Ci0gICAgICAgICAgICBnbF9leHRlbnNpb25zLnNldFRvKHRlbXApOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9vYmplY3QuaCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfb2JqZWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTFmNTQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF9vYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKiAKLSAqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0VHTF9PQkpFQ1RfSAotI2RlZmluZSBBTkRST0lEX0VHTF9PQkpFQ1RfSAotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLQotI2luY2x1ZGUgImVnbF9kaXNwbGF5LmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9kaXNwbGF5X3Q7Ci0KLWNsYXNzIGVnbF9vYmplY3RfdCB7Ci0gICAgZWdsX2Rpc3BsYXlfdCAqZGlzcGxheTsKLSAgICBtdXRhYmxlIHZvbGF0aWxlIGludDMyX3QgY291bnQ7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5lZ2xfb2JqZWN0X3QoKTsKLQotcHVibGljOgotICAgIGVnbF9vYmplY3RfdChlZ2xfZGlzcGxheV90KiBkaXNwbGF5KTsKLSAgICB2b2lkIGRlc3Ryb3koKTsKLQotICAgIGlubGluZSBpbnQzMl90IGluY1JlZigpIHsgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2luYygmY291bnQpOyB9Ci0gICAgaW5saW5lIGludDMyX3QgZGVjUmVmKCkgeyByZXR1cm4gYW5kcm9pZF9hdG9taWNfZGVjKCZjb3VudCk7IH0KLSAgICBpbmxpbmUgZWdsX2Rpc3BsYXlfdCogZ2V0RGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIGRpc3BsYXk7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIHRlcm1pbmF0ZSgpOwotICAgIHN0YXRpYyBib29sIGdldChlZ2xfZGlzcGxheV90IGNvbnN0KiBkaXNwbGF5LCBlZ2xfb2JqZWN0X3QqIG9iamVjdCk7Ci0KLXB1YmxpYzoKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTiwgdHlwZW5hbWUgVD4KLSAgICBjbGFzcyBMb2NhbFJlZiB7Ci0gICAgICAgIGVnbF9vYmplY3RfdCogcmVmOwotICAgICAgICBMb2NhbFJlZigpOwotICAgICAgICBMb2NhbFJlZihjb25zdCBMb2NhbFJlZiogcmhzKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIH5Mb2NhbFJlZigpOwotICAgICAgICBleHBsaWNpdCBMb2NhbFJlZihlZ2xfb2JqZWN0X3QqIHJocyk7Ci0gICAgICAgIGV4cGxpY2l0IExvY2FsUmVmKGVnbF9kaXNwbGF5X3QgY29uc3QqIGRpc3BsYXksIFQgbykgOiByZWYoMCkgewotICAgICAgICAgICAgZWdsX29iamVjdF90KiBuYXRpdmUgPSByZWludGVycHJldF9jYXN0PE4qPihvKTsKLSAgICAgICAgICAgIGlmIChvICYmIGVnbF9vYmplY3RfdDo6Z2V0KGRpc3BsYXksIG5hdGl2ZSkpIHsKLSAgICAgICAgICAgICAgICByZWYgPSBuYXRpdmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5saW5lIE4qIGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxOKj4ocmVmKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIGFjcXVpcmUoKSBjb25zdDsKLSAgICAgICAgdm9pZCByZWxlYXNlKCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgdGVybWluYXRlKCk7Ci0gICAgfTsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTiwgdHlwZW5hbWUgVD4KLSAgICBmcmllbmQgY2xhc3MgTG9jYWxSZWY7Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBOLCB0eXBlbmFtZSBUPgotZWdsX29iamVjdF90OjpMb2NhbFJlZjxOLCBUPjo6TG9jYWxSZWYoZWdsX29iamVjdF90KiByaHMpIDogcmVmKHJocykgewotICAgIGlmIChyZWYpIHsKLSAgICAgICAgcmVmLT5pbmNSZWYoKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBOLCB0eXBlbmFtZSBUPgotZWdsX29iamVjdF90OjpMb2NhbFJlZjxOLFQ+Ojp+TG9jYWxSZWYoKSB7Ci0gICAgaWYgKHJlZikgewotICAgICAgICByZWYtPmRlc3Ryb3koKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBOLCB0eXBlbmFtZSBUPgotdm9pZCBlZ2xfb2JqZWN0X3Q6OkxvY2FsUmVmPE4sVD46OmFjcXVpcmUoKSBjb25zdCB7Ci0gICAgaWYgKHJlZikgewotICAgICAgICByZWYtPmluY1JlZigpOwotICAgIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE4sIHR5cGVuYW1lIFQ+Ci12b2lkIGVnbF9vYmplY3RfdDo6TG9jYWxSZWY8TixUPjo6cmVsZWFzZSgpIGNvbnN0IHsKLSAgICBpZiAocmVmKSB7Ci0gICAgICAgIGlmIChyZWYtPmRlY1JlZigpID09IDEpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gYmVjYXVzZSB0aGlzIGlzIGNhbGxlZCBmcm9tIExvY2FsUmVmCi0gICAgICAgICAgICBBTE9HRSgiTG9jYWxSZWY6OnJlbGVhc2UoKSByZW1vdmVkIHRoZSBsYXN0IHJlZmVyZW5jZSEiKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIE4sIHR5cGVuYW1lIFQ+Ci12b2lkIGVnbF9vYmplY3RfdDo6TG9jYWxSZWY8TixUPjo6dGVybWluYXRlKCkgewotICAgIGlmIChyZWYpIHsKLSAgICAgICAgcmVmLT50ZXJtaW5hdGUoKTsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgZWdsX3N1cmZhY2VfdCA6IHB1YmxpYyBlZ2xfb2JqZWN0X3QgewotcHJvdGVjdGVkOgotICAgIH5lZ2xfc3VyZmFjZV90KCkgewotICAgICAgICBBTmF0aXZlV2luZG93KiBjb25zdCB3aW5kb3cgPSB3aW4uZ2V0KCk7Ci0gICAgICAgIGlmICh3aW5kb3cgIT0gTlVMTCkgewotICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQod2luZG93LCAwKTsKLSAgICAgICAgICAgIGlmIChuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KHdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfRUdMKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJFR0xOYXRpdmVXaW5kb3dUeXBlICVwIGRpc2Nvbm5lY3QgZmFpbGVkIiwgd2luZG93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLXB1YmxpYzoKLSAgICB0eXBlZGVmIGVnbF9vYmplY3RfdDo6TG9jYWxSZWY8ZWdsX3N1cmZhY2VfdCwgRUdMU3VyZmFjZT4gUmVmOwotCi0gICAgZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMTmF0aXZlV2luZG93VHlwZSB3aW4sCi0gICAgICAgICAgICBFR0xTdXJmYWNlIHN1cmZhY2UsIGVnbF9jb25uZWN0aW9uX3QgY29uc3QqIGNueCkgOgotICAgICAgICBlZ2xfb2JqZWN0X3QoZ2V0X2Rpc3BsYXkoZHB5KSksIGRweShkcHkpLCBzdXJmYWNlKHN1cmZhY2UpLAotICAgICAgICAgICAgICAgIGNvbmZpZyhjb25maWcpLCB3aW4od2luKSwgY254KGNueCkgewotICAgIH0KLSAgICBFR0xEaXNwbGF5IGRweTsKLSAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBzcDxBTmF0aXZlV2luZG93PiB3aW47Ci0gICAgZWdsX2Nvbm5lY3Rpb25fdCBjb25zdCogY254OwotfTsKLQotY2xhc3MgZWdsX2NvbnRleHRfdDogcHVibGljIGVnbF9vYmplY3RfdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgfmVnbF9jb250ZXh0X3QoKSB7fQotcHVibGljOgotICAgIHR5cGVkZWYgZWdsX29iamVjdF90OjpMb2NhbFJlZjxlZ2xfY29udGV4dF90LCBFR0xDb250ZXh0PiBSZWY7Ci0KLSAgICBlZ2xfY29udGV4dF90KEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGNvbnRleHQsIEVHTENvbmZpZyBjb25maWcsCi0gICAgICAgICAgICBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbngsIGludCB2ZXJzaW9uKTsKLQotICAgIHZvaWQgb25Mb29zZUN1cnJlbnQoKTsKLSAgICB2b2lkIG9uTWFrZUN1cnJlbnQoRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQpOwotCi0gICAgRUdMRGlzcGxheSBkcHk7Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMU3VyZmFjZSByZWFkOwotICAgIEVHTFN1cmZhY2UgZHJhdzsKLSAgICBlZ2xfY29ubmVjdGlvbl90IGNvbnN0KiBjbng7Ci0gICAgaW50IHZlcnNpb247Ci0gICAgU3RyaW5nOCBnbF9leHRlbnNpb25zOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIGVnbF9zdXJmYWNlX3Q6OlJlZiAgU3VyZmFjZVJlZjsKLXR5cGVkZWYgZWdsX2NvbnRleHRfdDo6UmVmICBDb250ZXh0UmVmOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIE5BVElWRSwgdHlwZW5hbWUgRUdMPgotc3RhdGljIGlubGluZSBOQVRJVkUqIGVnbF90b19uYXRpdmVfY2FzdChFR0wgYXJnKSB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TkFUSVZFKj4oYXJnKTsKLX0KLQotc3RhdGljIGlubGluZQotZWdsX3N1cmZhY2VfdCogZ2V0X3N1cmZhY2UoRUdMU3VyZmFjZSBzdXJmYWNlKSB7Ci0gICAgcmV0dXJuIGVnbF90b19uYXRpdmVfY2FzdDxlZ2xfc3VyZmFjZV90PihzdXJmYWNlKTsKLX0KLQotc3RhdGljIGlubGluZQotZWdsX2NvbnRleHRfdCogZ2V0X2NvbnRleHQoRUdMQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgcmV0dXJuIGVnbF90b19uYXRpdmVfY2FzdDxlZ2xfY29udGV4dF90Pihjb250ZXh0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfRUdMX09CSkVDVF9ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsX3Rscy5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsX3Rscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2ZhZTEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF90bHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9DYWxsU3RhY2suaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgImVnbF90bHMuaCIKLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXB0aHJlYWRfa2V5X3QgZWdsX3Rsc190OjpzS2V5ID0gLTE7Ci1wdGhyZWFkX211dGV4X3QgZWdsX3Rsc190OjpzTG9ja0tleSA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7Ci0KLWVnbF90bHNfdDo6ZWdsX3Rsc190KCkKLSAgICA6IGVycm9yKEVHTF9TVUNDRVNTKSwgY3R4KDApLCBsb2dDYWxsV2l0aE5vQ29udGV4dChFR0xfVFJVRSkgewotfQotCi1jb25zdCBjaGFyICplZ2xfdGxzX3Q6OmVnbF9zdHJlcnJvcihFR0xpbnQgZXJyKSB7Ci0gICAgc3dpdGNoIChlcnIpIHsKLSAgICAgICAgY2FzZSBFR0xfU1VDQ0VTUzogICAgICAgICAgICAgICByZXR1cm4gIkVHTF9TVUNDRVNTIjsKLSAgICAgICAgY2FzZSBFR0xfTk9UX0lOSVRJQUxJWkVEOiAgICAgICByZXR1cm4gIkVHTF9OT1RfSU5JVElBTElaRUQiOwotICAgICAgICBjYXNlIEVHTF9CQURfQUNDRVNTOiAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BQ0NFU1MiOwotICAgICAgICBjYXNlIEVHTF9CQURfQUxMT0M6ICAgICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9BTExPQyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6ICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FUVFJJQlVURSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6ICAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0NPTkZJRyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOiAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0NPTlRFWFQiOwotICAgICAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFOiAgIHJldHVybiAiRUdMX0JBRF9DVVJSRU5UX1NVUkZBQ0UiOwotICAgICAgICBjYXNlIEVHTF9CQURfRElTUExBWTogICAgICAgICAgIHJldHVybiAiRUdMX0JBRF9ESVNQTEFZIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX01BVENIOiAgICAgICAgICAgICByZXR1cm4gIkVHTF9CQURfTUFUQ0giOwotICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogICAgIHJldHVybiAiRUdMX0JBRF9OQVRJVkVfUElYTUFQIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX05BVElWRV9XSU5ET1c6ICAgICByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1dJTkRPVyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6ICAgICAgICAgcmV0dXJuICJFR0xfQkFEX1BBUkFNRVRFUiI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiAgICAgICAgICAgcmV0dXJuICJFR0xfQkFEX1NVUkZBQ0UiOwotICAgICAgICBjYXNlIEVHTF9DT05URVhUX0xPU1Q6ICAgICAgICAgIHJldHVybiAiRUdMX0NPTlRFWFRfTE9TVCI7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7Ci0gICAgfQotfQotCi12b2lkIGVnbF90bHNfdDo6dmFsaWRhdGVUTFNLZXkoKQotewotICAgIGlmIChzS2V5ID09IC0xKSB7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc0xvY2tLZXkpOwotICAgICAgICBpZiAoc0tleSA9PSAtMSkKLSAgICAgICAgICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmc0tleSwgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzTG9ja0tleSk7Ci0gICAgfQotfQotCi12b2lkIGVnbF90bHNfdDo6c2V0RXJyb3JFdGNJbXBsKAotICAgICAgICBjb25zdCBjaGFyKiBjYWxsZXIsIGludCBsaW5lLCBFR0xpbnQgZXJyb3IsIGJvb2wgcXVpZXQpIHsKLSAgICB2YWxpZGF0ZVRMU0tleSgpOwotICAgIGVnbF90bHNfdCogdGxzID0gZ2V0VExTKCk7Ci0gICAgaWYgKHRscy0+ZXJyb3IgIT0gZXJyb3IpIHsKLSAgICAgICAgaWYgKCFxdWlldCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiVkIGVycm9yICV4ICglcykiLAotICAgICAgICAgICAgICAgICAgICBjYWxsZXIsIGxpbmUsIGVycm9yLCBlZ2xfc3RyZXJyb3IoZXJyb3IpKTsKLSAgICAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLmNhbGxzdGFjayIsIHZhbHVlLCAiMCIpOwotICAgICAgICAgICAgaWYgKGF0b2kodmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgQ2FsbFN0YWNrIHN0YWNrOwotICAgICAgICAgICAgICAgIHN0YWNrLnVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIHN0YWNrLmR1bXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0bHMtPmVycm9yID0gZXJyb3I7Ci0gICAgfQotfQotCi1ib29sIGVnbF90bHNfdDo6bG9nTm9Db250ZXh0Q2FsbCgpIHsKLSAgICBlZ2xfdGxzX3QqIHRscyA9IGdldFRMUygpOwotICAgIGlmICh0bHMtPmxvZ0NhbGxXaXRoTm9Db250ZXh0ID09IHRydWUpIHsKLSAgICAgICAgdGxzLT5sb2dDYWxsV2l0aE5vQ29udGV4dCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1lZ2xfdGxzX3QqIGVnbF90bHNfdDo6Z2V0VExTKCkgewotICAgIGVnbF90bHNfdCogdGxzID0gKGVnbF90bHNfdCopcHRocmVhZF9nZXRzcGVjaWZpYyhzS2V5KTsKLSAgICBpZiAodGxzID09IDApIHsKLSAgICAgICAgdGxzID0gbmV3IGVnbF90bHNfdDsKLSAgICAgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhzS2V5LCB0bHMpOwotICAgIH0KLSAgICByZXR1cm4gdGxzOwotfQotCi12b2lkIGVnbF90bHNfdDo6Y2xlYXJUTFMoKSB7Ci0gICAgaWYgKHNLZXkgIT0gLTEpIHsKLSAgICAgICAgZWdsX3Rsc190KiB0bHMgPSAoZWdsX3Rsc190KilwdGhyZWFkX2dldHNwZWNpZmljKHNLZXkpOwotICAgICAgICBpZiAodGxzKSB7Ci0gICAgICAgICAgICBkZWxldGUgdGxzOwotICAgICAgICAgICAgcHRocmVhZF9zZXRzcGVjaWZpYyhzS2V5LCAwKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBlZ2xfdGxzX3Q6OmNsZWFyRXJyb3IoKSB7Ci0gICAgLy8gVGhpcyBtdXN0IGNsZWFyIHRoZSBlcnJvciBmcm9tIGFsbCB0aGUgdW5kZXJseWluZyBFR0wgaW1wbGVtZW50YXRpb25zIGFzCi0gICAgLy8gd2VsbCBhcyB0aGUgRUdMIHdyYXBwZXIgbGF5ZXIuCi0gICAgZWdsR2V0RXJyb3IoKTsKLX0KLQotRUdMaW50IGVnbF90bHNfdDo6Z2V0RXJyb3IoKSB7Ci0gICAgaWYgKHNLZXkgPT0gLTEpCi0gICAgICAgIHJldHVybiBFR0xfU1VDQ0VTUzsKLSAgICBlZ2xfdGxzX3QqIHRscyA9IChlZ2xfdGxzX3QqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoc0tleSk7Ci0gICAgaWYgKCF0bHMpIHJldHVybiBFR0xfU1VDQ0VTUzsKLSAgICBFR0xpbnQgZXJyb3IgPSB0bHMtPmVycm9yOwotICAgIHRscy0+ZXJyb3IgPSBFR0xfU1VDQ0VTUzsKLSAgICByZXR1cm4gZXJyb3I7Ci19Ci0KLXZvaWQgZWdsX3Rsc190OjpzZXRDb250ZXh0KEVHTENvbnRleHQgY3R4KSB7Ci0gICAgdmFsaWRhdGVUTFNLZXkoKTsKLSAgICBnZXRUTFMoKS0+Y3R4ID0gY3R4OwotfQotCi1FR0xDb250ZXh0IGVnbF90bHNfdDo6Z2V0Q29udGV4dCgpIHsKLSAgICBpZiAoc0tleSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIEVHTF9OT19DT05URVhUOwotICAgIGVnbF90bHNfdCogdGxzID0gKGVnbF90bHNfdCAqKXB0aHJlYWRfZ2V0c3BlY2lmaWMoc0tleSk7Ci0gICAgaWYgKCF0bHMpIHJldHVybiBFR0xfTk9fQ09OVEVYVDsKLSAgICByZXR1cm4gdGxzLT5jdHg7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF90bHMuaCBiL29wZW5nbC9saWJzL0VHTC9lZ2xfdGxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDJjYTAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2VnbF90bHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUdMX1RMU19ICi0jZGVmaW5lIEFORFJPSURfRUdMX1RMU19ICi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNpbmNsdWRlICJlZ2xkZWZzLmgiCi0jaW5jbHVkZSAiaG9va3MuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBEYmdDb250ZXh0OwotCi1jbGFzcyBlZ2xfdGxzX3QgewotICAgIHN0YXRpYyBwdGhyZWFkX2tleV90IHNLZXk7Ci0gICAgc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBzTG9ja0tleTsKLQotICAgIEVHTGludCAgICAgIGVycm9yOwotICAgIEVHTENvbnRleHQgIGN0eDsKLSAgICBFR0xCb29sZWFuICBsb2dDYWxsV2l0aE5vQ29udGV4dDsKLQotICAgIGVnbF90bHNfdCgpOwotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlVExTS2V5KCk7Ci0gICAgc3RhdGljIHZvaWQgc2V0RXJyb3JFdGNJbXBsKAotICAgICAgICAgICAgY29uc3QgY2hhciogY2FsbGVyLCBpbnQgbGluZSwgRUdMaW50IGVycm9yLCBib29sIHF1aWV0KTsKLQotcHVibGljOgotICAgIHN0YXRpYyBlZ2xfdGxzX3QqIGdldFRMUygpOwotICAgIHN0YXRpYyB2b2lkIGNsZWFyVExTKCk7Ci0gICAgc3RhdGljIHZvaWQgY2xlYXJFcnJvcigpOwotICAgIHN0YXRpYyBFR0xpbnQgZ2V0RXJyb3IoKTsKLSAgICBzdGF0aWMgdm9pZCBzZXRDb250ZXh0KEVHTENvbnRleHQgY3R4KTsKLSAgICBzdGF0aWMgRUdMQ29udGV4dCBnZXRDb250ZXh0KCk7Ci0gICAgc3RhdGljIGJvb2wgbG9nTm9Db250ZXh0Q2FsbCgpOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICplZ2xfc3RyZXJyb3IoRUdMaW50IGVycik7Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXRpYyBUIHNldEVycm9yRXRjKGNvbnN0IGNoYXIqIGNhbGxlciwKLSAgICAgICAgICAgIGludCBsaW5lLCBFR0xpbnQgZXJyb3IsIFQgcmV0dXJuVmFsdWUsIGJvb2wgcXVpZXQgPSBmYWxzZSkgewotICAgICAgICBzZXRFcnJvckV0Y0ltcGwoY2FsbGVyLCBsaW5lLCBlcnJvciwgcXVpZXQpOwotICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7Ci0gICAgfQotfTsKLQotI2RlZmluZSBzZXRFcnJvcihfZSwgX3IpICAgICAgICBcCi0gICAgZWdsX3Rsc190OjpzZXRFcnJvckV0YyhfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBfZSwgX3IpCi0KLSNkZWZpbmUgc2V0RXJyb3JRdWlldChfZSwgX3IpICAgXAotICAgIGVnbF90bHNfdDo6c2V0RXJyb3JFdGMoX19GVU5DVElPTl9fLCBfX0xJTkVfXywgX2UsIF9yLCB0cnVlKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBFR0xfVFJBQ0UKLQotZXh0ZXJuIGdsX2hvb2tzX3QgY29uc3QqIGdldEdMVHJhY2VUaHJlYWRTcGVjaWZpYygpOwotCi0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEFORFJPSURfRUdMX1RMU19ICmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvZWdsZGVmcy5oIGIvb3BlbmdsL2xpYnMvRUdML2VnbGRlZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwMGMxYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsZGVmcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoqCi0gKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoqCi0gKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9FR0xERUZTX0gKLSNkZWZpbmUgQU5EUk9JRF9FR0xERUZTX0gKLQotI2luY2x1ZGUgImhvb2tzLmgiCi0KLSNkZWZpbmUgVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIFZFUlNJT05fTUlOT1IgNAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vICBFR0xEaXNwbGF5IGFyZSBnbG9iYWwsIG5vdCBhdHRhY2hlZCB0byBhIGdpdmVuIHRocmVhZAotY29uc3QgdW5zaWduZWQgaW50IE5VTV9ESVNQTEFZUyA9IDE7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RydWN0IGVnbF9jb25uZWN0aW9uX3QgewotICAgIGVudW0gewotICAgICAgICBHTEVTdjFfSU5ERVggPSAwLAotICAgICAgICBHTEVTdjJfSU5ERVggPSAxCi0gICAgfTsKLQotICAgIGlubGluZSBlZ2xfY29ubmVjdGlvbl90KCkgOiBkc28oMCkgeyB9Ci0gICAgdm9pZCAqICAgICAgICAgICAgICBkc287Ci0gICAgZ2xfaG9va3NfdCAqICAgICAgICBob29rc1syXTsKLSAgICBFR0xpbnQgICAgICAgICAgICAgIG1ham9yOwotICAgIEVHTGludCAgICAgICAgICAgICAgbWlub3I7Ci0gICAgZWdsX3QgICAgICAgICAgICAgICBlZ2w7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVybiBnbF9ob29rc190IGdIb29rc1syXTsKLWV4dGVybiBnbF9ob29rc190IGdIb29rc05vQ29udGV4dDsKLWV4dGVybiBwdGhyZWFkX2tleV90IGdHTFdyYXBwZXJLZXk7Ci1leHRlcm4gIkMiIHZvaWQgZ2xfdW5pbXBsZW1lbnRlZCgpOwotZXh0ZXJuICJDIiB2b2lkIGdsX25vb3AoKTsKLQotZXh0ZXJuIGNoYXIgY29uc3QgKiBjb25zdCBnbF9uYW1lc1tdOwotZXh0ZXJuIGNoYXIgY29uc3QgKiBjb25zdCBlZ2xfbmFtZXNbXTsKLQotZXh0ZXJuIGVnbF9jb25uZWN0aW9uX3QgZ0VHTEltcGw7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvKiBBTkRST0lEX0VHTERFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2dldFByb2NBZGRyZXNzLmNwcCBiL29wZW5nbC9saWJzL0VHTC9nZXRQcm9jQWRkcmVzcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkY2YzOGQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRUdML2dldFByb2NBZGRyZXNzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2luY2x1ZGUgImVnbGRlZnMuaCIKLSNpbmNsdWRlICJob29rcy5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSN1bmRlZiBBUElfRU5UUlkKLSN1bmRlZiBDQUxMX0dMX0VYVEVOU0lPTl9BUEkKLSN1bmRlZiBHTF9FWFRFTlNJT04KLSN1bmRlZiBHTF9FWFRFTlNJT05fTkFNRQotI3VuZGVmIEdMX0VYVEVOU0lPTl9BUlJBWQotI3VuZGVmIEdMX0VYVEVOU0lPTl9MSVNUCi0jdW5kZWYgR0VUX1RMUwotCi0jaWYgVVNFX0ZBU1RfVExTX0tFWQotCi0gICAgI2lmZGVmIEhBVkVfQVJNX1RMU19SRUdJU1RFUgotICAgICAgICAjZGVmaW5lIEdFVF9UTFMocmVnKSBcCi0gICAgICAgICAgICAibXJjIHAxNSwgMCwgIiAjcmVnICIsIGMxMywgYzAsIDMgXG4iCi0gICAgI2Vsc2UKLSAgICAgICAgI2RlZmluZSBHRVRfVExTKHJlZykgXAotICAgICAgICAgICAgIm1vdiAgICIgI3JlZyAiLCAjMHhGRkZGMEZGRiAgICAgIFxuIiAgXAotICAgICAgICAgICAgImxkciAgICIgI3JlZyAiLCBbIiAjcmVnICIsICMtMTVdIFxuIgotICAgICNlbmRpZgotCi0gICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX19hdHRyaWJ1dGVfXygobmFrZWQpKSBfYXBpCi0KLSAgICAjZGVmaW5lIENBTExfR0xfRVhURU5TSU9OX0FQSShfYXBpKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhc20gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgR0VUX1RMUyhyMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJsZHIgICByMTIsIFtyMTIsICVbdGxzXV0gXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiY21wICAgcjEyLCAjMCAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImxkcm5lIHIxMiwgW3IxMiwgJVthcGldXSBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJjbXBuZSByMTIsICMwICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiYnhuZSAgcjEyICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImJ4ICAgIGxyICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6IFt0bHNdICJKIihUTFNfU0xPVF9PUEVOR0xfQVBJKjQpLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBbYXBpXSAiSiIoX19idWlsdGluX29mZnNldG9mKGdsX2hvb2tzX3QsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0LmV4dGVuc2lvbnNbX2FwaV0pKSAgICBcCi0gICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKTsKLQotICAgICNkZWZpbmUgR0xfRVhURU5TSU9OX05BTUUoX24pICAgX19nbEV4dEZ3ZCMjX24KLQotICAgICNkZWZpbmUgR0xfRVhURU5TSU9OKF9uKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHZvaWQgQVBJX0VOVFJZKEdMX0VYVEVOU0lPTl9OQU1FKF9uKSkoKSB7ICAgIFwKLSAgICAgICAgICAgIENBTExfR0xfRVhURU5TSU9OX0FQSShfbik7ICAgICAgICAgICAgICAgXAotICAgICAgICB9Ci0KLQotI2Vsc2UKLQotICAgICNkZWZpbmUgR0xfRVhURU5TSU9OX05BTUUoX24pIE5VTEwKLQotICAgICNkZWZpbmUgR0xfRVhURU5TSU9OKF9uKQotCi0gICAgI3dhcm5pbmcgImVnbEdldFByb2NBZGRyZXNzKCkgcGFydGlhbGx5IHN1cHBvcnRlZCIKLQotI2VuZGlmCi0KLQotI2RlZmluZSBHTF9FWFRFTlNJT05fTElTVChuYW1lKSBcCi0gICAgbmFtZSgwKSAgIG5hbWUoMSkgICBuYW1lKDIpICAgbmFtZSgzKSAgIG5hbWUoNCkgICBuYW1lKDUpICAgbmFtZSg2KSAgIG5hbWUoNykgIFwKLSAgICBuYW1lKDgpICAgbmFtZSg5KSAgIG5hbWUoMTApICBuYW1lKDExKSAgbmFtZSgxMikgIG5hbWUoMTMpICBuYW1lKDE0KSAgbmFtZSgxNSkgXAotICAgIG5hbWUoMTYpICBuYW1lKDE3KSAgbmFtZSgxOCkgIG5hbWUoMTkpICBuYW1lKDIwKSAgbmFtZSgyMSkgIG5hbWUoMjIpICBuYW1lKDIzKSBcCi0gICAgbmFtZSgyNCkgIG5hbWUoMjUpICBuYW1lKDI2KSAgbmFtZSgyNykgIG5hbWUoMjgpICBuYW1lKDI5KSAgbmFtZSgzMCkgIG5hbWUoMzEpIFwKLSAgICBuYW1lKDMyKSAgbmFtZSgzMykgIG5hbWUoMzQpICBuYW1lKDM1KSAgbmFtZSgzNikgIG5hbWUoMzcpICBuYW1lKDM4KSAgbmFtZSgzOSkgXAotICAgIG5hbWUoNDApICBuYW1lKDQxKSAgbmFtZSg0MikgIG5hbWUoNDMpICBuYW1lKDQ0KSAgbmFtZSg0NSkgIG5hbWUoNDYpICBuYW1lKDQ3KSBcCi0gICAgbmFtZSg0OCkgIG5hbWUoNDkpICBuYW1lKDUwKSAgbmFtZSg1MSkgIG5hbWUoNTIpICBuYW1lKDUzKSAgbmFtZSg1NCkgIG5hbWUoNTUpIFwKLSAgICBuYW1lKDU2KSAgbmFtZSg1NykgIG5hbWUoNTgpICBuYW1lKDU5KSAgbmFtZSg2MCkgIG5hbWUoNjEpICBuYW1lKDYyKSAgbmFtZSg2MykgXAotICAgIG5hbWUoNjQpICBuYW1lKDY1KSAgbmFtZSg2NikgIG5hbWUoNjcpICBuYW1lKDY4KSAgbmFtZSg2OSkgIG5hbWUoNzApICBuYW1lKDcxKSBcCi0gICAgbmFtZSg3MikgIG5hbWUoNzMpICBuYW1lKDc0KSAgbmFtZSg3NSkgIG5hbWUoNzYpICBuYW1lKDc3KSAgbmFtZSg3OCkgIG5hbWUoNzkpIFwKLSAgICBuYW1lKDgwKSAgbmFtZSg4MSkgIG5hbWUoODIpICBuYW1lKDgzKSAgbmFtZSg4NCkgIG5hbWUoODUpICBuYW1lKDg2KSAgbmFtZSg4NykgXAotICAgIG5hbWUoODgpICBuYW1lKDg5KSAgbmFtZSg5MCkgIG5hbWUoOTEpICBuYW1lKDkyKSAgbmFtZSg5MykgIG5hbWUoOTQpICBuYW1lKDk1KSBcCi0gICAgbmFtZSg5NikgIG5hbWUoOTcpICBuYW1lKDk4KSAgbmFtZSg5OSkgIFwKLSAgICBuYW1lKDEwMCkgbmFtZSgxMDEpIG5hbWUoMTAyKSBuYW1lKDEwMykgbmFtZSgxMDQpIG5hbWUoMTA1KSBuYW1lKDEwNikgbmFtZSgxMDcpIFwKLSAgICBuYW1lKDEwOCkgbmFtZSgxMDkpIG5hbWUoMTEwKSBuYW1lKDExMSkgbmFtZSgxMTIpIG5hbWUoMTEzKSBuYW1lKDExNCkgbmFtZSgxMTUpIFwKLSAgICBuYW1lKDExNikgbmFtZSgxMTcpIG5hbWUoMTE4KSBuYW1lKDExOSkgbmFtZSgxMjApIG5hbWUoMTIxKSBuYW1lKDEyMikgbmFtZSgxMjMpIFwKLSAgICBuYW1lKDEyNCkgbmFtZSgxMjUpIG5hbWUoMTI2KSBuYW1lKDEyNykgbmFtZSgxMjgpIG5hbWUoMTI5KSBuYW1lKDEzMCkgbmFtZSgxMzEpIFwKLSAgICBuYW1lKDEzMikgbmFtZSgxMzMpIG5hbWUoMTM0KSBuYW1lKDEzNSkgbmFtZSgxMzYpIG5hbWUoMTM3KSBuYW1lKDEzOCkgbmFtZSgxMzkpIFwKLSAgICBuYW1lKDE0MCkgbmFtZSgxNDEpIG5hbWUoMTQyKSBuYW1lKDE0MykgbmFtZSgxNDQpIG5hbWUoMTQ1KSBuYW1lKDE0NikgbmFtZSgxNDcpIFwKLSAgICBuYW1lKDE0OCkgbmFtZSgxNDkpIG5hbWUoMTUwKSBuYW1lKDE1MSkgbmFtZSgxNTIpIG5hbWUoMTUzKSBuYW1lKDE1NCkgbmFtZSgxNTUpIFwKLSAgICBuYW1lKDE1NikgbmFtZSgxNTcpIG5hbWUoMTU4KSBuYW1lKDE1OSkgbmFtZSgxNjApIG5hbWUoMTYxKSBuYW1lKDE2MikgbmFtZSgxNjMpIFwKLSAgICBuYW1lKDE2NCkgbmFtZSgxNjUpIG5hbWUoMTY2KSBuYW1lKDE2NykgbmFtZSgxNjgpIG5hbWUoMTY5KSBuYW1lKDE3MCkgbmFtZSgxNzEpIFwKLSAgICBuYW1lKDE3MikgbmFtZSgxNzMpIG5hbWUoMTc0KSBuYW1lKDE3NSkgbmFtZSgxNzYpIG5hbWUoMTc3KSBuYW1lKDE3OCkgbmFtZSgxNzkpIFwKLSAgICBuYW1lKDE4MCkgbmFtZSgxODEpIG5hbWUoMTgyKSBuYW1lKDE4MykgbmFtZSgxODQpIG5hbWUoMTg1KSBuYW1lKDE4NikgbmFtZSgxODcpIFwKLSAgICBuYW1lKDE4OCkgbmFtZSgxODkpIG5hbWUoMTkwKSBuYW1lKDE5MSkgbmFtZSgxOTIpIG5hbWUoMTkzKSBuYW1lKDE5NCkgbmFtZSgxOTUpIFwKLSAgICBuYW1lKDE5NikgbmFtZSgxOTcpIG5hbWUoMTk4KSBuYW1lKDE5OSkgXAotICAgIG5hbWUoMjAwKSBuYW1lKDIwMSkgbmFtZSgyMDIpIG5hbWUoMjAzKSBuYW1lKDIwNCkgbmFtZSgyMDUpIG5hbWUoMjA2KSBuYW1lKDIwNykgXAotICAgIG5hbWUoMjA4KSBuYW1lKDIwOSkgbmFtZSgyMTApIG5hbWUoMjExKSBuYW1lKDIxMikgbmFtZSgyMTMpIG5hbWUoMjE0KSBuYW1lKDIxNSkgXAotICAgIG5hbWUoMjE2KSBuYW1lKDIxNykgbmFtZSgyMTgpIG5hbWUoMjE5KSBuYW1lKDIyMCkgbmFtZSgyMjEpIG5hbWUoMjIyKSBuYW1lKDIyMykgXAotICAgIG5hbWUoMjI0KSBuYW1lKDIyNSkgbmFtZSgyMjYpIG5hbWUoMjI3KSBuYW1lKDIyOCkgbmFtZSgyMjkpIG5hbWUoMjMwKSBuYW1lKDIzMSkgXAotICAgIG5hbWUoMjMyKSBuYW1lKDIzMykgbmFtZSgyMzQpIG5hbWUoMjM1KSBuYW1lKDIzNikgbmFtZSgyMzcpIG5hbWUoMjM4KSBuYW1lKDIzOSkgXAotICAgIG5hbWUoMjQwKSBuYW1lKDI0MSkgbmFtZSgyNDIpIG5hbWUoMjQzKSBuYW1lKDI0NCkgbmFtZSgyNDUpIG5hbWUoMjQ2KSBuYW1lKDI0NykgXAotICAgIG5hbWUoMjQ4KSBuYW1lKDI0OSkgbmFtZSgyNTApIG5hbWUoMjUxKSBuYW1lKDI1MikgbmFtZSgyNTMpIG5hbWUoMjU0KSBuYW1lKDI1NSkKLQotCi1HTF9FWFRFTlNJT05fTElTVCggR0xfRVhURU5TSU9OICkKLQotI2RlZmluZSBHTF9FWFRFTlNJT05fQVJSQVkoX24pICBHTF9FWFRFTlNJT05fTkFNRShfbiksCi0KLWV4dGVybiBjb25zdCBfX2VnbE11c3RDYXN0VG9Qcm9wZXJGdW5jdGlvblBvaW50ZXJUeXBlIGdFeHRlbnNpb25Gb3J3YXJkZXJzW01BWF9OVU1CRVJfT0ZfR0xfRVhURU5TSU9OU10gPSB7Ci0gICAgICAgIEdMX0VYVEVOU0lPTl9MSVNUKCBHTF9FWFRFTlNJT05fQVJSQVkgKQotIH07Ci0KLSN1bmRlZiBHRVRfVExTCi0jdW5kZWYgR0xfRVhURU5TSU9OX0xJU1QKLSN1bmRlZiBHTF9FWFRFTlNJT05fQVJSQVkKLSN1bmRlZiBHTF9FWFRFTlNJT05fTkFNRQotI3VuZGVmIEdMX0VYVEVOU0lPTgotI3VuZGVmIEFQSV9FTlRSWQotI3VuZGVmIENBTExfR0xfRVhURU5TSU9OX0FQSQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9FR0wvdHJhY2UuY3BwIGIvb3BlbmdsL2xpYnMvRUdML3RyYWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI5MDdjMS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvdHJhY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqKgotICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWYgRUdMX1RSQUNFCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotI2luY2x1ZGUgImVnbF90bHMuaCIKLSNpbmNsdWRlICJob29rcy5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBHTGVudW1TdHJpbmcgewotICAgIEdMZW51bSBlOwotICAgIGNvbnN0IGNoYXIqIHM7Ci19OwotCi0jdW5kZWYgR0xfRU5VTQotI2RlZmluZSBHTF9FTlVNKFZBTCxOQU1FKSB7VkFMLCAjTkFNRX0sCi0KLXN0YXRpYyBHTGVudW1TdHJpbmcgZ19lbnVtbmFtZXNbXSA9IHsKLSNpbmNsdWRlICJlbnVtcy5pbiIKLX07Ci0jdW5kZWYgR0xfRU5VTQotCi1zdGF0aWMgaW50IGNvbXBhcmVHTEVudW0oY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCogYikgewotICAgIHJldHVybiAoKGNvbnN0IEdMZW51bVN0cmluZyopIGEpLT5lIC0gKChjb25zdCBHTGVudW1TdHJpbmcqKSBiKS0+ZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIEdMRW51bVRvU3RyaW5nKEdMZW51bSBlKSB7Ci0gICAgR0xlbnVtU3RyaW5nIGtleSA9IHtlLCAiIn07Ci0gICAgY29uc3QgR0xlbnVtU3RyaW5nKiByZXN1bHQgPSAoY29uc3QgR0xlbnVtU3RyaW5nKikgYnNlYXJjaCgKLSAgICAgICAgJmtleSwgZ19lbnVtbmFtZXMsCi0gICAgICAgIHNpemVvZihnX2VudW1uYW1lcykgLyBzaXplb2YoZ19lbnVtbmFtZXNbMF0pLAotICAgICAgICBzaXplb2YoZ19lbnVtbmFtZXNbMF0pLCBjb21wYXJlR0xFbnVtKTsKLSAgICBpZiAocmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQtPnM7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciogR0xib29sZWFuVG9TdHJpbmcoR0xib29sZWFuIGFyZykgewotICAgIHJldHVybiBhcmcgPyAiR0xfVFJVRSIgOiAiR0xfRkFMU0UiOwotfQotCi1zdGF0aWMgR0xlbnVtU3RyaW5nIGdfYml0ZmllbGROYW1lc1tdID0gewotICAgIHsweDAwMDA0MDAwLCAiR0xfQ09MT1JfQlVGRkVSX0JJVCJ9LAotICAgIHsweDAwMDAwNDAwLCAiR0xfU1RFTkNJTF9CVUZGRVJfQklUIn0sCi0gICAgezB4MDAwMDAxMDAsICJHTF9ERVBUSF9CVUZGRVJfQklUIn0KLX07Ci0KLWNsYXNzIFN0cmluZ0J1aWxkZXIgewotICAgIHN0YXRpYyBjb25zdCBpbnQgbGluZVNpemUgPSA1MDA7Ci0gICAgY2hhciBsaW5lW2xpbmVTaXplXTsKLSAgICBpbnQgbGluZV9pbmRleDsKLXB1YmxpYzoKLSAgICBTdHJpbmdCdWlsZGVyKCkgewotICAgICAgICBsaW5lX2luZGV4ID0gMDsKLSAgICAgICAgbGluZVswXSA9ICdcMCc7Ci0gICAgfQotICAgIHZvaWQgYXBwZW5kKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gICAgICAgIHZhX2xpc3QgYXJncDsKLSAgICAgICAgdmFfc3RhcnQoYXJncCwgZm10KTsKLSAgICAgICAgbGluZV9pbmRleCArPSB2c25wcmludGYobGluZSArIGxpbmVfaW5kZXgsIGxpbmVTaXplLWxpbmVfaW5kZXgsIGZtdCwgYXJncCk7Ci0gICAgICAgIHZhX2VuZChhcmdwKTsKLSAgICB9Ci0gICAgY29uc3QgY2hhciogZ2V0U3RyaW5nKCkgewotICAgICAgICBsaW5lX2luZGV4ID0gMDsKLSAgICAgICAgbGluZVtsaW5lU2l6ZS0xXSA9ICdcMCc7Ci0gICAgICAgIHJldHVybiBsaW5lOwotICAgIH0KLX07Ci0KLQotc3RhdGljIHZvaWQgVHJhY2VHTFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LAotICAgIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkgewotICAgIEFMT0dEKCJjb25zdCBjaGFyKiBzaGFkZXJTcmNbXSA9IHsiKTsKLSAgICBmb3IgKEdMc2l6ZWkgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGNvbW1hID0gaSA8IGNvdW50LTEgPyAiLCIgOiAiIjsKLSAgICAgICAgY29uc3QgR0xjaGFyKiBzID0gc3RyaW5nW2ldOwotICAgICAgICBpZiAobGVuZ3RoKSB7Ci0gICAgICAgICAgICBHTGludCBsZW4gPSBsZW5ndGhbaV07Ci0gICAgICAgICAgICBBTE9HRCgiICAgIFwiJSpzXCIlcyIsIGxlbiwgcywgY29tbWEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0QoIiAgICBcIiVzXCIlcyIsIHMsIGNvbW1hKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HRCgifTsiKTsKLSAgICBpZiAobGVuZ3RoKSB7Ci0gICAgICAgIEFMT0dEKCJjb25zdCBHTGludCogc2hhZGVyTGVuZ3RoW10gPSB7Iik7Ci0gICAgICAgIGZvciAoR0xzaXplaSBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1hID0gaSA8IGNvdW50LTEgPyAiLCIgOiAiIjsKLSAgICAgICAgICAgIEdMaW50IGxlbiA9IGxlbmd0aFtpXTsKLSAgICAgICAgICAgIEFMT0dEKCIgICAgXCIlZFwiJXMiLCBsZW4sIGNvbW1hKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HRCgifTsiKTsKLSAgICAgICAgQUxPR0QoImdsU2hhZGVyU291cmNlKCV1LCAldSwgc2hhZGVyU3JjLCBzaGFkZXJMZW5ndGgpOyIsCi0gICAgICAgICAgICBzaGFkZXIsIGNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiZ2xTaGFkZXJTb3VyY2UoJXUsICV1LCBzaGFkZXJTcmMsIChjb25zdCBHTGludCopIDApOyIsCi0gICAgICAgICAgICBzaGFkZXIsIGNvdW50KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYWNlVmFsdWUoaW50IGVsZW1lbnRDb3VudCwgY2hhciB0eXBlLAotICAgICAgICBHTHNpemVpIGNodW5rQ291bnQsIEdMc2l6ZWkgY2h1bmtTaXplLCBjb25zdCB2b2lkKiB2YWx1ZSkgewotICAgIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlcjsKLSAgICBHTHNpemVpIGNvdW50ID0gY2h1bmtDb3VudCAqIGNodW5rU2l6ZTsKLSAgICBib29sIGlzRmxvYXQgPSB0eXBlID09ICdmJzsKLSAgICBjb25zdCBjaGFyKiB0eXBlU3RyaW5nID0gaXNGbG9hdCA/ICJHTGZsb2F0IiA6ICJHTGludCI7Ci0gICAgQUxPR0QoImNvbnN0ICVzIHZhbHVlW10gPSB7IiwgdHlwZVN0cmluZyk7Ci0gICAgZm9yIChHTHNpemVpIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgIGZvciAoaW50IGUgPSAwOyBlIDwgZWxlbWVudENvdW50OyBlKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbW1hID0gIiwgIjsKLSAgICAgICAgICAgIGlmIChlID09IGVsZW1lbnRDb3VudC0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gY291bnQgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hID0gIiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWEgPSAiLCI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlzRmxvYXQpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJWclcyIsICogKEdMZmxvYXQqKSB2YWx1ZSwgY29tbWEpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gKHZvaWQqKSAoKChHTGZsb2F0KikgdmFsdWUpICsgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIlZCVzIiwgKiAoR0xpbnQqKSB2YWx1ZSwgY29tbWEpOwotICAgICAgICAgICAgICAgIHZhbHVlID0gKHZvaWQqKSAoKChHTGludCopIHZhbHVlKSArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dEKCIlcyIsIGJ1aWxkZXIuZ2V0U3RyaW5nKCkpOwotICAgICAgICBpZiAoY2h1bmtTaXplID4gMSAmJiBpIDwgY291bnQtMQotICAgICAgICAgICAgICAgICYmIChpICUgY2h1bmtTaXplKSA9PSAoY2h1bmtTaXplLTEpKSB7Ci0gICAgICAgICAgICBBTE9HRCgiJXMiLCAiIik7IC8vIFByaW50IGEgYmxhbmsgbGluZS4KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HRCgifTsiKTsKLX0KLQotc3RhdGljIHZvaWQgVHJhY2VVbmlmb3JtdihpbnQgZWxlbWVudENvdW50LCBjaGFyIHR5cGUsCi0gICAgICAgIEdMdWludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3Qgdm9pZCogdmFsdWUpIHsKLSAgICBUcmFjZVZhbHVlKGVsZW1lbnRDb3VudCwgdHlwZSwgY291bnQsIDEsIHZhbHVlKTsKLSAgICBBTE9HRCgiZ2xVbmlmb3JtJWQlYygldSwgJXUsIHZhbHVlKTsiLCBlbGVtZW50Q291bnQsIHR5cGUsIGxvY2F0aW9uLCBjb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYWNlVW5pZm9ybU1hdHJpeChpbnQgbWF0cml4U2lkZUxlbmd0aCwKLSAgICAgICAgR0x1aW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCB2b2lkKiB2YWx1ZSkgewotICAgIFRyYWNlVmFsdWUobWF0cml4U2lkZUxlbmd0aCwgJ2YnLCBjb3VudCwgbWF0cml4U2lkZUxlbmd0aCwgdmFsdWUpOwotICAgIEFMT0dEKCJnbFVuaWZvcm1NYXRyaXglZGZ2KCV1LCAldSwgJXMsIHZhbHVlKTsiLCBtYXRyaXhTaWRlTGVuZ3RoLCBsb2NhdGlvbiwgY291bnQsCi0gICAgICAgICAgICBHTGJvb2xlYW5Ub1N0cmluZyh0cmFuc3Bvc2UpKTsKLX0KLQotc3RhdGljIHZvaWQgVHJhY2VHTChjb25zdCBjaGFyKiBuYW1lLCBpbnQgbnVtQXJncywgLi4uKSB7Ci0gICAgdmFfbGlzdCBhcmdwOwotICAgIHZhX3N0YXJ0KGFyZ3AsIG51bUFyZ3MpOwotICAgIGludCBuYW1lTGVuID0gc3RybGVuKG5hbWUpOwotCi0gICAgLy8gZ2xTaGFkZXJTb3VyY2UKLSAgICBpZiAobmFtZUxlbiA9PSAxNCAmJiBzdHJjbXAobmFtZSwgImdsU2hhZGVyU291cmNlIikgPT0gMCkgewotICAgICAgICB2YV9hcmcoYXJncCwgY29uc3QgY2hhciopOwotICAgICAgICBHTHVpbnQgc2hhZGVyID0gdmFfYXJnKGFyZ3AsIEdMdWludCk7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIEdMc2l6ZWkgY291bnQgPSB2YV9hcmcoYXJncCwgR0xzaXplaSk7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIGNvbnN0IEdMY2hhcioqIHN0cmluZyA9IChjb25zdCBHTGNoYXIqKikgdmFfYXJnKGFyZ3AsIHZvaWQqKTsKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgY29uc3QgR0xpbnQqIGxlbmd0aCA9IChjb25zdCBHTGludCopIHZhX2FyZyhhcmdwLCB2b2lkKik7Ci0gICAgICAgIHZhX2VuZChhcmdwKTsKLSAgICAgICAgVHJhY2VHTFNoYWRlclNvdXJjZShzaGFkZXIsIGNvdW50LCBzdHJpbmcsIGxlbmd0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBnbFVuaWZvcm1YWHYKLQotICAgIGlmIChuYW1lTGVuID09IDEyICYmIHN0cm5jbXAobmFtZSwgImdsVW5pZm9ybSIsIDkpID09IDAgJiYgbmFtZVsxMV0gPT0gJ3YnKSB7Ci0gICAgICAgIGludCBlbGVtZW50Q291bnQgPSBuYW1lWzldIC0gJzAnOyAvLyAxLi40Ci0gICAgICAgIGNoYXIgdHlwZSA9IG5hbWVbMTBdOyAvLyAnZicgb3IgJ2knCi0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIEdMdWludCBsb2NhdGlvbiA9IHZhX2FyZyhhcmdwLCBHTHVpbnQpOwotICAgICAgICB2YV9hcmcoYXJncCwgY29uc3QgY2hhciopOwotICAgICAgICBHTHNpemVpIGNvdW50ID0gdmFfYXJnKGFyZ3AsIEdMc2l6ZWkpOwotICAgICAgICB2YV9hcmcoYXJncCwgY29uc3QgY2hhciopOwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZSA9IChjb25zdCB2b2lkKikgdmFfYXJnKGFyZ3AsIHZvaWQqKTsKLSAgICAgICAgdmFfZW5kKGFyZ3ApOwotICAgICAgICBUcmFjZVVuaWZvcm12KGVsZW1lbnRDb3VudCwgdHlwZSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBnbFVuaWZvcm1NYXRyaXhYZnYKLQotICAgIGlmIChuYW1lTGVuID09IDE4ICYmIHN0cm5jbXAobmFtZSwgImdsVW5pZm9ybU1hdHJpeCIsIDE1KSA9PSAwCi0gICAgICAgICAgICAmJiBuYW1lWzE2XSA9PSAnZicgJiYgbmFtZVsxN10gPT0gJ3YnKSB7Ci0gICAgICAgIGludCBtYXRyaXhTaWRlTGVuZ3RoID0gbmFtZVsxNV0gLSAnMCc7IC8vIDIuLjQKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgR0x1aW50IGxvY2F0aW9uID0gdmFfYXJnKGFyZ3AsIEdMdWludCk7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIEdMc2l6ZWkgY291bnQgPSB2YV9hcmcoYXJncCwgR0xzaXplaSk7Ci0gICAgICAgIHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIEdMYm9vbGVhbiB0cmFuc3Bvc2UgPSAoR0xib29sZWFuKSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgdmFfYXJnKGFyZ3AsIGNvbnN0IGNoYXIqKTsKLSAgICAgICAgY29uc3Qgdm9pZCogdmFsdWUgPSAoY29uc3Qgdm9pZCopIHZhX2FyZyhhcmdwLCB2b2lkKik7Ci0gICAgICAgIHZhX2VuZChhcmdwKTsKLSAgICAgICAgVHJhY2VVbmlmb3JtTWF0cml4KG1hdHJpeFNpZGVMZW5ndGgsIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXI7Ci0gICAgYnVpbGRlci5hcHBlbmQoIiVzKCIsIG5hbWUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3QgY2hhciogdHlwZSA9IHZhX2FyZyhhcmdwLCBjb25zdCBjaGFyKik7Ci0gICAgICAgIGJvb2wgaXNQdHIgPSB0eXBlW3N0cmxlbih0eXBlKS0xXSA9PSAnKicKLSAgICAgICAgICAgIHx8IHN0cmNtcCh0eXBlLCAiR0xlZ2xJbWFnZU9FUyIpID09IDA7Ci0gICAgICAgIGlmIChpc1B0cikgewotICAgICAgICAgICAgY29uc3Qgdm9pZCogYXJnID0gdmFfYXJnKGFyZ3AsIGNvbnN0IHZvaWQqKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIoJXMpIDB4JTA4eCIsIHR5cGUsIChzaXplX3QpIGFyZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTGJpdGZpZWxkIikgPT0gMCkgewotICAgICAgICAgICAgc2l6ZV90IGFyZyA9IHZhX2FyZyhhcmdwLCBzaXplX3QpOwotICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihnX2JpdGZpZWxkTmFtZXMpIC8gc2l6ZW9mKGdfYml0ZmllbGROYW1lc1swXSk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IEdMZW51bVN0cmluZyogYiA9ICZnX2JpdGZpZWxkTmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGItPmUgJiBhcmcpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiB8ICIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIlcyIsIGItPnMpOwotICAgICAgICAgICAgICAgICAgICBhcmcgJj0gfmItPmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0IHx8IGFyZyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiIHwgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIweCUwOHgiLCBhcmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiR0xib29sZWFuIikgPT0gMCkgewotICAgICAgICAgICAgR0xib29sZWFuIGFyZyA9IHZhX2FyZyhhcmdwLCBpbnQpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVzIiwgR0xib29sZWFuVG9TdHJpbmcoYXJnKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTGNsYW1wZiIpID09IDApIHsKLSAgICAgICAgICAgIGRvdWJsZSBhcmcgPSB2YV9hcmcoYXJncCwgZG91YmxlKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIlZyIsIGFyZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTGVudW0iKSA9PSAwKSB7Ci0gICAgICAgICAgICBHTGVudW0gYXJnID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBzID0gR0xFbnVtVG9TdHJpbmcoYXJnKTsKLSAgICAgICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVzIiwgcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIweCV4IiwgYXJnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMZml4ZWQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnQgYXJnID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiMHglMDh4IiwgYXJnKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMZmxvYXQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBkb3VibGUgYXJnID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJWciLCBhcmcpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiR0xpbnQiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnQgYXJnID0gdmFfYXJnKGFyZ3AsIGludCk7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBzID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgImdsVGV4UGFyYW1ldGVyaSIpID09IDApIHsKLSAgICAgICAgICAgICAgICBzID0gR0xFbnVtVG9TdHJpbmcoYXJnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiVzIiwgcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIlZCIsIGFyZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTGludHB0ciIpID09IDApIHsKLSAgICAgICAgICAgIGludCBhcmcgPSB2YV9hcmcoYXJncCwgdW5zaWduZWQgaW50KTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIldSIsIGFyZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHR5cGUsICJHTHNpemVpIikgPT0gMCkgewotICAgICAgICAgICAgaW50IGFyZyA9IHZhX2FyZyhhcmdwLCBzaXplX3QpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiV1IiwgYXJnKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAodHlwZSwgIkdMc2l6ZWlwdHIiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpbnQgYXJnID0gdmFfYXJnKGFyZ3AsIHNpemVfdCk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiJXUiLCBhcmcpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCh0eXBlLCAiR0x1aW50IikgPT0gMCkgewotICAgICAgICAgICAgaW50IGFyZyA9IHZhX2FyZyhhcmdwLCB1bnNpZ25lZCBpbnQpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiV1IiwgYXJnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIvKiA/Pz8gJXMgKi8iLCB0eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGJ1aWxkZXIuYXBwZW5kKCIpOyIpOwotICAgIEFMT0dEKCIlcyIsIGJ1aWxkZXIuZ2V0U3RyaW5nKCkpOwotICAgIHZhX2VuZChhcmdwKTsKLX0KLQotI3VuZGVmIFRSQUNFX0dMX1ZPSUQKLSN1bmRlZiBUUkFDRV9HTAotCi0jZGVmaW5lIFRSQUNFX0dMX1ZPSUQoX2FwaSwgX2FyZ3MsIF9hcmdMaXN0LCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIFRyYWNpbmdfICMjIF9hcGkgX2FyZ3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRyYWNlR0woI19hcGksIF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdMVHJhY2VUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICBfYy0+X2FwaSBfYXJnTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIFRSQUNFX0dMKF90eXBlLCBfYXBpLCBfYXJncywgX2FyZ0xpc3QsIC4uLikgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBfdHlwZSBUcmFjaW5nXyAjIyBfYXBpIF9hcmdzIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRyYWNlR0woI19hcGksIF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHTFRyYWNlVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgcmV0dXJuIF9jLT5fYXBpIF9hcmdMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiLi4vdHJhY2UuaW4iCi19Ci0KLSN1bmRlZiBUUkFDRV9HTF9WT0lECi0jdW5kZWYgVFJBQ0VfR0wKLQotI2RlZmluZSBHTF9FTlRSWShfciwgX2FwaSwgLi4uKSBUcmFjaW5nXyAjIyBfYXBpLAotRUdMQVBJIGdsX2hvb2tzX3QgZ0hvb2tzVHJhY2UgPSB7Ci0gICAgewotICAgICAgICAjaW5jbHVkZSAiZW50cmllcy5pbiIKLSAgICB9LAotICAgIHsKLSAgICAgICAgezB9Ci0gICAgfQotfTsKLSN1bmRlZiBHTF9FTlRSWQotCi0KLSN1bmRlZiBUUkFDRV9HTF9WT0lECi0jdW5kZWYgVFJBQ0VfR0wKLQotLy8gZGVmaW5lIHRoZSBFUyAxLjAgRGVidWdfZ2wqIGZ1bmN0aW9ucyBhcyBUcmFjaW5nX2dsIGZ1bmN0aW9ucwotI2RlZmluZSBUUkFDRV9HTF9WT0lEKF9hcGksIF9hcmdzLCBfYXJnTGlzdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBEZWJ1Z18gIyMgX2FwaSBfYXJncyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVHJhY2VHTCgjX2FwaSwgX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R0xUcmFjZVRocmVhZFNwZWNpZmljKCktPmdsOyAgXAotICAgIF9jLT5fYXBpIF9hcmdMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgVFJBQ0VfR0woX3R5cGUsIF9hcGksIF9hcmdzLCBfYXJnTGlzdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIF90eXBlIERlYnVnXyAjIyBfYXBpIF9hcmdzIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRyYWNlR0woI19hcGksIF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHTFRyYWNlVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgcmV0dXJuIF9jLT5fYXBpIF9hcmdMaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiLi4vZGVidWcuaW4iCi19Ci0KLSN1bmRlZiBUUkFDRV9HTF9WT0lECi0jdW5kZWYgVFJBQ0VfR0wKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8vIEVHTF9UUkFDRQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRVRDMS9ldGMxLmNwcCBiL29wZW5nbC9saWJzL0VUQzEvZXRjMS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZDEwODUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvRVRDMS9ldGMxLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSA8RVRDMS9ldGMxLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyogRnJvbSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L2dsZXMvZXh0ZW5zaW9ucy9PRVMvT0VTX2NvbXByZXNzZWRfRVRDMV9SR0I4X3RleHR1cmUudHh0Ci0KLSBUaGUgbnVtYmVyIG9mIGJpdHMgdGhhdCByZXByZXNlbnQgYSA0eDQgdGV4ZWwgYmxvY2sgaXMgNjQgYml0cyBpZgotIDxpbnRlcm5hbGZvcm1hdD4gaXMgZ2l2ZW4gYnkgRVRDMV9SR0I4X09FUy4KLQotIFRoZSBkYXRhIGZvciBhIGJsb2NrIGlzIGEgbnVtYmVyIG9mIGJ5dGVzLAotCi0ge3EwLCBxMSwgcTIsIHEzLCBxNCwgcTUsIHE2LCBxN30KLQotIHdoZXJlIGJ5dGUgcTAgaXMgbG9jYXRlZCBhdCB0aGUgbG93ZXN0IG1lbW9yeSBhZGRyZXNzIGFuZCBxNyBhdAotIHRoZSBoaWdoZXN0LiBUaGUgNjQgYml0cyBzcGVjaWZ5aW5nIHRoZSBibG9jayBpcyB0aGVuIHJlcHJlc2VudGVkCi0gYnkgdGhlIGZvbGxvd2luZyA2NCBiaXQgaW50ZWdlcjoKLQotIGludDY0Yml0ID0gMjU2KigyNTYqKDI1NiooMjU2KigyNTYqKDI1NiooMjU2KnEwK3ExKStxMikrcTMpK3E0KStxNSkrcTYpK3E3OwotCi0gRVRDMV9SR0I4X09FUzoKLQotIGEpIGJpdCBsYXlvdXQgaW4gYml0cyA2MyB0aHJvdWdoIDMyIGlmIGRpZmZiaXQgPSAwCi0KLSA2MyA2MiA2MSA2MCA1OSA1OCA1NyA1NiA1NSA1NCA1MyA1MiA1MSA1MCA0OSA0OAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBiYXNlIGNvbDEgfCBiYXNlIGNvbDIgfCBiYXNlIGNvbDEgfCBiYXNlIGNvbDIgfAotIHwgUjEgKDRiaXRzKXwgUjIgKDRiaXRzKXwgRzEgKDRiaXRzKXwgRzIgKDRiaXRzKXwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gNDcgNDYgNDUgNDQgNDMgNDIgNDEgNDAgMzkgMzggMzcgMzYgMzUgMzQgIDMzICAzMgotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgYmFzZSBjb2wxIHwgYmFzZSBjb2wyIHwgdGFibGUgIHwgdGFibGUgIHxkaWZmfGZsaXB8Ci0gfCBCMSAoNGJpdHMpfCBCMiAoNGJpdHMpfCBjdyAxICAgfCBjdyAyICAgfGJpdCB8Yml0IHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gYikgYml0IGxheW91dCBpbiBiaXRzIDYzIHRocm91Z2ggMzIgaWYgZGlmZmJpdCA9IDEKLQotIDYzIDYyIDYxIDYwIDU5IDU4IDU3IDU2IDU1IDU0IDUzIDUyIDUxIDUwIDQ5IDQ4Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IGJhc2UgY29sMSAgICB8IGRjb2wgMiB8IGJhc2UgY29sMSAgICB8IGRjb2wgMiB8Ci0gfCBSMScgKDUgYml0cykgfCBkUjIgICAgfCBHMScgKDUgYml0cykgfCBkRzIgICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSA0NyA0NiA0NSA0NCA0MyA0MiA0MSA0MCAzOSAzOCAzNyAzNiAzNSAzNCAgMzMgIDMyCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBiYXNlIGNvbCAxICAgfCBkY29sIDIgfCB0YWJsZSAgfCB0YWJsZSAgfGRpZmZ8ZmxpcHwKLSB8IEIxJyAoNSBiaXRzKSB8IGRCMiAgICB8IGN3IDEgICB8IGN3IDIgICB8Yml0IHxiaXQgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLSBjKSBiaXQgbGF5b3V0IGluIGJpdHMgMzEgdGhyb3VnaCAwIChpbiBib3RoIGNhc2VzKQotCi0gMzEgMzAgMjkgMjggMjcgMjYgMjUgMjQgMjMgMjIgMjEgMjAgMTkgMTggMTcgMTYKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgICAgICAgbW9zdCBzaWduaWZpY2FudCBwaXhlbCBpbmRleCBiaXRzICAgICAgIHwKLSB8IHB8IG98IG58IG18IGx8IGt8IGp8IGl8IGh8IGd8IGZ8IGV8IGR8IGN8IGJ8IGF8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIDE1IDE0IDEzIDEyIDExIDEwICA5ICA4ICA3ICA2ICA1ICA0ICAzICAgMiAgIDEgIDAKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgICAgICAgICBsZWFzdCBzaWduaWZpY2FudCBwaXhlbCBpbmRleCBiaXRzICAgICAgIHwKLSB8IHB8IG98IG58IG18IGx8IGt8IGp8IGl8IGh8IGd8IGZ8IGV8IGR8IGMgfCBiIHwgYSB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gQWRkIHRhYmxlIDMuMTcuMjogSW50ZW5zaXR5IG1vZGlmaWVyIHNldHMgZm9yIEVUQzEgY29tcHJlc3NlZCB0ZXh0dXJlczoKLQotIHRhYmxlIGNvZGV3b3JkICAgICAgICAgICAgICAgIG1vZGlmaWVyIHRhYmxlCi0gLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gMCAgICAgICAgICAgICAgICAgICAgIC04ICAtMiAgMiAgIDgKLSAxICAgICAgICAgICAgICAgICAgICAtMTcgIC01ICA1ICAxNwotIDIgICAgICAgICAgICAgICAgICAgIC0yOSAgLTkgIDkgIDI5Ci0gMyAgICAgICAgICAgICAgICAgICAgLTQyIC0xMyAxMyAgNDIKLSA0ICAgICAgICAgICAgICAgICAgICAtNjAgLTE4IDE4ICA2MAotIDUgICAgICAgICAgICAgICAgICAgIC04MCAtMjQgMjQgIDgwCi0gNiAgICAgICAgICAgICAgICAgICAtMTA2IC0zMyAzMyAxMDYKLSA3ICAgICAgICAgICAgICAgICAgIC0xODMgLTQ3IDQ3IDE4MwotCi0KLSBBZGQgdGFibGUgMy4xNy4zIE1hcHBpbmcgZnJvbSBwaXhlbCBpbmRleCB2YWx1ZXMgdG8gbW9kaWZpZXIgdmFsdWVzIGZvcgotIEVUQzEgY29tcHJlc3NlZCB0ZXh0dXJlczoKLQotIHBpeGVsIGluZGV4IHZhbHVlCi0gLS0tLS0tLS0tLS0tLS0tCi0gbXNiICAgICBsc2IgICAgICAgICAgIHJlc3VsdGluZyBtb2RpZmllciB2YWx1ZQotIC0tLS0tICAgLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIDEgICAgICAgMSAgICAgICAgICAgIC1iIChsYXJnZSBuZWdhdGl2ZSB2YWx1ZSkKLSAxICAgICAgIDAgICAgICAgICAgICAtYSAoc21hbGwgbmVnYXRpdmUgdmFsdWUpCi0gMCAgICAgICAwICAgICAgICAgICAgIGEgKHNtYWxsIHBvc2l0aXZlIHZhbHVlKQotIDAgICAgICAgMSAgICAgICAgICAgICBiIChsYXJnZSBwb3NpdGl2ZSB2YWx1ZSkKLQotCi0gKi8KLQotc3RhdGljIGNvbnN0IGludCBrTW9kaWZpZXJUYWJsZVtdID0gewotLyogMCAqLzIsIDgsIC0yLCAtOCwKLS8qIDEgKi81LCAxNywgLTUsIC0xNywKLS8qIDIgKi85LCAyOSwgLTksIC0yOSwKLS8qIDMgKi8xMywgNDIsIC0xMywgLTQyLAotLyogNCAqLzE4LCA2MCwgLTE4LCAtNjAsCi0vKiA1ICovMjQsIDgwLCAtMjQsIC04MCwKLS8qIDYgKi8zMywgMTA2LCAtMzMsIC0xMDYsCi0vKiA3ICovNDcsIDE4MywgLTQ3LCAtMTgzIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQga0xvb2t1cFs4XSA9IHsgMCwgMSwgMiwgMywgLTQsIC0zLCAtMiwgLTEgfTsKLQotc3RhdGljIGlubGluZSBldGMxX2J5dGUgY2xhbXAoaW50IHgpIHsKLSAgICByZXR1cm4gKGV0YzFfYnl0ZSkgKHggPj0gMCA/ICh4IDwgMjU1ID8geCA6IDI1NSkgOiAwKTsKLX0KLQotc3RhdGljCi1pbmxpbmUgaW50IGNvbnZlcnQ0VG84KGludCBiKSB7Ci0gICAgaW50IGMgPSBiICYgMHhmOwotICAgIHJldHVybiAoYyA8PCA0KSB8IGM7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBjb252ZXJ0NVRvOChpbnQgYikgewotICAgIGludCBjID0gYiAmIDB4MWY7Ci0gICAgcmV0dXJuIChjIDw8IDMpIHwgKGMgPj4gMik7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBjb252ZXJ0NlRvOChpbnQgYikgewotICAgIGludCBjID0gYiAmIDB4M2Y7Ci0gICAgcmV0dXJuIChjIDw8IDIpIHwgKGMgPj4gNCk7Ci19Ci0KLXN0YXRpYwotaW5saW5lIGludCBkaXZpZGVCeTI1NShpbnQgZCkgewotICAgIHJldHVybiAoZCArIDEyOCArIChkID4+IDgpKSA+PiA4OwotfQotCi1zdGF0aWMKLWlubGluZSBpbnQgY29udmVydDhUbzQoaW50IGIpIHsKLSAgICBpbnQgYyA9IGIgJiAweGZmOwotICAgIHJldHVybiBkaXZpZGVCeTI1NShjICogMTUpOwotfQotCi1zdGF0aWMKLWlubGluZSBpbnQgY29udmVydDhUbzUoaW50IGIpIHsKLSAgICBpbnQgYyA9IGIgJiAweGZmOwotICAgIHJldHVybiBkaXZpZGVCeTI1NShjICogMzEpOwotfQotCi1zdGF0aWMKLWlubGluZSBpbnQgY29udmVydERpZmYoaW50IGJhc2UsIGludCBkaWZmKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnQ1VG84KCgweDFmICYgYmFzZSkgKyBrTG9va3VwWzB4NyAmIGRpZmZdKTsKLX0KLQotc3RhdGljCi12b2lkIGRlY29kZV9zdWJibG9jayhldGMxX2J5dGUqIHBPdXQsIGludCByLCBpbnQgZywgaW50IGIsIGNvbnN0IGludCogdGFibGUsCi0gICAgICAgIGV0YzFfdWludDMyIGxvdywgYm9vbCBzZWNvbmQsIGJvb2wgZmxpcHBlZCkgewotICAgIGludCBiYXNlWCA9IDA7Ci0gICAgaW50IGJhc2VZID0gMDsKLSAgICBpZiAoc2Vjb25kKSB7Ci0gICAgICAgIGlmIChmbGlwcGVkKSB7Ci0gICAgICAgICAgICBiYXNlWSA9IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYXNlWCA9IDI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgaW50IHgsIHk7Ci0gICAgICAgIGlmIChmbGlwcGVkKSB7Ci0gICAgICAgICAgICB4ID0gYmFzZVggKyAoaSA+PiAxKTsKLSAgICAgICAgICAgIHkgPSBiYXNlWSArIChpICYgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB4ID0gYmFzZVggKyAoaSA+PiAyKTsKLSAgICAgICAgICAgIHkgPSBiYXNlWSArIChpICYgMyk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGsgPSB5ICsgKHggKiA0KTsKLSAgICAgICAgaW50IG9mZnNldCA9ICgobG93ID4+IGspICYgMSkgfCAoKGxvdyA+PiAoayArIDE1KSkgJiAyKTsKLSAgICAgICAgaW50IGRlbHRhID0gdGFibGVbb2Zmc2V0XTsKLSAgICAgICAgZXRjMV9ieXRlKiBxID0gcE91dCArIDMgKiAoeCArIDQgKiB5KTsKLSAgICAgICAgKnErKyA9IGNsYW1wKHIgKyBkZWx0YSk7Ci0gICAgICAgICpxKysgPSBjbGFtcChnICsgZGVsdGEpOwotICAgICAgICAqcSsrID0gY2xhbXAoYiArIGRlbHRhKTsKLSAgICB9Ci19Ci0KLS8vIElucHV0IGlzIGFuIEVUQzEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhLgotLy8gT3V0cHV0IGlzIGEgNCB4IDQgc3F1YXJlIG9mIDMtYnl0ZSBwaXhlbHMgaW4gZm9ybSBSLCBHLCBCCi0KLXZvaWQgZXRjMV9kZWNvZGVfYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfYnl0ZSogcE91dCkgewotICAgIGV0YzFfdWludDMyIGhpZ2ggPSAocEluWzBdIDw8IDI0KSB8IChwSW5bMV0gPDwgMTYpIHwgKHBJblsyXSA8PCA4KSB8IHBJblszXTsKLSAgICBldGMxX3VpbnQzMiBsb3cgPSAocEluWzRdIDw8IDI0KSB8IChwSW5bNV0gPDwgMTYpIHwgKHBJbls2XSA8PCA4KSB8IHBJbls3XTsKLSAgICBpbnQgcjEsIHIyLCBnMSwgZzIsIGIxLCBiMjsKLSAgICBpZiAoaGlnaCAmIDIpIHsKLSAgICAgICAgLy8gZGlmZmVyZW50aWFsCi0gICAgICAgIGludCByQmFzZSA9IGhpZ2ggPj4gMjc7Ci0gICAgICAgIGludCBnQmFzZSA9IGhpZ2ggPj4gMTk7Ci0gICAgICAgIGludCBiQmFzZSA9IGhpZ2ggPj4gMTE7Ci0gICAgICAgIHIxID0gY29udmVydDVUbzgockJhc2UpOwotICAgICAgICByMiA9IGNvbnZlcnREaWZmKHJCYXNlLCBoaWdoID4+IDI0KTsKLSAgICAgICAgZzEgPSBjb252ZXJ0NVRvOChnQmFzZSk7Ci0gICAgICAgIGcyID0gY29udmVydERpZmYoZ0Jhc2UsIGhpZ2ggPj4gMTYpOwotICAgICAgICBiMSA9IGNvbnZlcnQ1VG84KGJCYXNlKTsKLSAgICAgICAgYjIgPSBjb252ZXJ0RGlmZihiQmFzZSwgaGlnaCA+PiA4KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBub3QgZGlmZmVyZW50aWFsCi0gICAgICAgIHIxID0gY29udmVydDRUbzgoaGlnaCA+PiAyOCk7Ci0gICAgICAgIHIyID0gY29udmVydDRUbzgoaGlnaCA+PiAyNCk7Ci0gICAgICAgIGcxID0gY29udmVydDRUbzgoaGlnaCA+PiAyMCk7Ci0gICAgICAgIGcyID0gY29udmVydDRUbzgoaGlnaCA+PiAxNik7Ci0gICAgICAgIGIxID0gY29udmVydDRUbzgoaGlnaCA+PiAxMik7Ci0gICAgICAgIGIyID0gY29udmVydDRUbzgoaGlnaCA+PiA4KTsKLSAgICB9Ci0gICAgaW50IHRhYmxlSW5kZXhBID0gNyAmIChoaWdoID4+IDUpOwotICAgIGludCB0YWJsZUluZGV4QiA9IDcgJiAoaGlnaCA+PiAyKTsKLSAgICBjb25zdCBpbnQqIHRhYmxlQSA9IGtNb2RpZmllclRhYmxlICsgdGFibGVJbmRleEEgKiA0OwotICAgIGNvbnN0IGludCogdGFibGVCID0ga01vZGlmaWVyVGFibGUgKyB0YWJsZUluZGV4QiAqIDQ7Ci0gICAgYm9vbCBmbGlwcGVkID0gKGhpZ2ggJiAxKSAhPSAwOwotICAgIGRlY29kZV9zdWJibG9jayhwT3V0LCByMSwgZzEsIGIxLCB0YWJsZUEsIGxvdywgZmFsc2UsIGZsaXBwZWQpOwotICAgIGRlY29kZV9zdWJibG9jayhwT3V0LCByMiwgZzIsIGIyLCB0YWJsZUIsIGxvdywgdHJ1ZSwgZmxpcHBlZCk7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBldGMxX3VpbnQzMiBoaWdoOwotICAgIGV0YzFfdWludDMyIGxvdzsKLSAgICBldGMxX3VpbnQzMiBzY29yZTsgLy8gTG93ZXIgaXMgbW9yZSBhY2N1cmF0ZQotfSBldGNfY29tcHJlc3NlZDsKLQotc3RhdGljCi1pbmxpbmUgdm9pZCB0YWtlX2Jlc3QoZXRjX2NvbXByZXNzZWQqIGEsIGNvbnN0IGV0Y19jb21wcmVzc2VkKiBiKSB7Ci0gICAgaWYgKGEtPnNjb3JlID4gYi0+c2NvcmUpIHsKLSAgICAgICAgKmEgPSAqYjsKLSAgICB9Ci19Ci0KLXN0YXRpYwotdm9pZCBldGNfYXZlcmFnZV9jb2xvcnNfc3ViYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIGluTWFzaywKLSAgICAgICAgZXRjMV9ieXRlKiBwQ29sb3JzLCBib29sIGZsaXBwZWQsIGJvb2wgc2Vjb25kKSB7Ci0gICAgaW50IHIgPSAwOwotICAgIGludCBnID0gMDsKLSAgICBpbnQgYiA9IDA7Ci0KLSAgICBpZiAoZmxpcHBlZCkgewotICAgICAgICBpbnQgYnkgPSAwOwotICAgICAgICBpZiAoc2Vjb25kKSB7Ci0gICAgICAgICAgICBieSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAyOyB5KyspIHsKLSAgICAgICAgICAgIGludCB5eSA9IGJ5ICsgeTsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSB4ICsgNCAqIHl5OwotICAgICAgICAgICAgICAgIGlmIChpbk1hc2sgJiAoMSA8PCBpKSkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBldGMxX2J5dGUqIHAgPSBwSW4gKyBpICogMzsKLSAgICAgICAgICAgICAgICAgICAgciArPSAqKHArKyk7Ci0gICAgICAgICAgICAgICAgICAgIGcgKz0gKihwKyspOwotICAgICAgICAgICAgICAgICAgICBiICs9ICoocCsrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgYnggPSAwOwotICAgICAgICBpZiAoc2Vjb25kKSB7Ci0gICAgICAgICAgICBieCA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHh4ID0gYnggKyB4OwotICAgICAgICAgICAgICAgIGludCBpID0geHggKyA0ICogeTsKLSAgICAgICAgICAgICAgICBpZiAoaW5NYXNrICYgKDEgPDwgaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwID0gcEluICsgaSAqIDM7Ci0gICAgICAgICAgICAgICAgICAgIHIgKz0gKihwKyspOwotICAgICAgICAgICAgICAgICAgICBnICs9ICoocCsrKTsKLSAgICAgICAgICAgICAgICAgICAgYiArPSAqKHArKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBDb2xvcnNbMF0gPSAoZXRjMV9ieXRlKSgociArIDQpID4+IDMpOwotICAgIHBDb2xvcnNbMV0gPSAoZXRjMV9ieXRlKSgoZyArIDQpID4+IDMpOwotICAgIHBDb2xvcnNbMl0gPSAoZXRjMV9ieXRlKSgoYiArIDQpID4+IDMpOwotfQotCi1zdGF0aWMKLWlubGluZSBpbnQgc3F1YXJlKGludCB4KSB7Ci0gICAgcmV0dXJuIHggKiB4OwotfQotCi1zdGF0aWMgZXRjMV91aW50MzIgY2hvb3NlTW9kaWZpZXIoY29uc3QgZXRjMV9ieXRlKiBwQmFzZUNvbG9ycywKLSAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyICpwTG93LCBpbnQgYml0SW5kZXgsCi0gICAgICAgIGNvbnN0IGludCogcE1vZGlmaWVyVGFibGUpIHsKLSAgICBldGMxX3VpbnQzMiBiZXN0U2NvcmUgPSB+MDsKLSAgICBpbnQgYmVzdEluZGV4ID0gMDsKLSAgICBpbnQgcGl4ZWxSID0gcEluWzBdOwotICAgIGludCBwaXhlbEcgPSBwSW5bMV07Ci0gICAgaW50IHBpeGVsQiA9IHBJblsyXTsKLSAgICBpbnQgciA9IHBCYXNlQ29sb3JzWzBdOwotICAgIGludCBnID0gcEJhc2VDb2xvcnNbMV07Ci0gICAgaW50IGIgPSBwQmFzZUNvbG9yc1syXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICBpbnQgbW9kaWZpZXIgPSBwTW9kaWZpZXJUYWJsZVtpXTsKLSAgICAgICAgaW50IGRlY29kZWRHID0gY2xhbXAoZyArIG1vZGlmaWVyKTsKLSAgICAgICAgZXRjMV91aW50MzIgc2NvcmUgPSAoZXRjMV91aW50MzIpICg2ICogc3F1YXJlKGRlY29kZWRHIC0gcGl4ZWxHKSk7Ci0gICAgICAgIGlmIChzY29yZSA+PSBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBkZWNvZGVkUiA9IGNsYW1wKHIgKyBtb2RpZmllcik7Ci0gICAgICAgIHNjb3JlICs9IChldGMxX3VpbnQzMikgKDMgKiBzcXVhcmUoZGVjb2RlZFIgLSBwaXhlbFIpKTsKLSAgICAgICAgaWYgKHNjb3JlID49IGJlc3RTY29yZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRlY29kZWRCID0gY2xhbXAoYiArIG1vZGlmaWVyKTsKLSAgICAgICAgc2NvcmUgKz0gKGV0YzFfdWludDMyKSBzcXVhcmUoZGVjb2RlZEIgLSBwaXhlbEIpOwotICAgICAgICBpZiAoc2NvcmUgPCBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgYmVzdEluZGV4ID0gaTsKLSAgICAgICAgfQotICAgIH0KLSAgICBldGMxX3VpbnQzMiBsb3dNYXNrID0gKCgoYmVzdEluZGV4ID4+IDEpIDw8IDE2KSB8IChiZXN0SW5kZXggJiAxKSkKLSAgICAgICAgICAgIDw8IGJpdEluZGV4OwotICAgICpwTG93IHw9IGxvd01hc2s7Ci0gICAgcmV0dXJuIGJlc3RTY29yZTsKLX0KLQotc3RhdGljCi12b2lkIGV0Y19lbmNvZGVfc3ViYmxvY2tfaGVscGVyKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiBpbk1hc2ssCi0gICAgICAgIGV0Y19jb21wcmVzc2VkKiBwQ29tcHJlc3NlZCwgYm9vbCBmbGlwcGVkLCBib29sIHNlY29uZCwKLSAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwQmFzZUNvbG9ycywgY29uc3QgaW50KiBwTW9kaWZpZXJUYWJsZSkgewotICAgIGludCBzY29yZSA9IHBDb21wcmVzc2VkLT5zY29yZTsKLSAgICBpZiAoZmxpcHBlZCkgewotICAgICAgICBpbnQgYnkgPSAwOwotICAgICAgICBpZiAoc2Vjb25kKSB7Ci0gICAgICAgICAgICBieSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAyOyB5KyspIHsKLSAgICAgICAgICAgIGludCB5eSA9IGJ5ICsgeTsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGkgPSB4ICsgNCAqIHl5OwotICAgICAgICAgICAgICAgIGlmIChpbk1hc2sgJiAoMSA8PCBpKSkgewotICAgICAgICAgICAgICAgICAgICBzY29yZSArPSBjaG9vc2VNb2RpZmllcihwQmFzZUNvbG9ycywgcEluICsgaSAqIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21wcmVzc2VkLT5sb3csIHl5ICsgeCAqIDQsIHBNb2RpZmllclRhYmxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgYnggPSAwOwotICAgICAgICBpZiAoc2Vjb25kKSB7Ci0gICAgICAgICAgICBieCA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA0OyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgMjsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHh4ID0gYnggKyB4OwotICAgICAgICAgICAgICAgIGludCBpID0geHggKyA0ICogeTsKLSAgICAgICAgICAgICAgICBpZiAoaW5NYXNrICYgKDEgPDwgaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gY2hvb3NlTW9kaWZpZXIocEJhc2VDb2xvcnMsIHBJbiArIGkgKiAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29tcHJlc3NlZC0+bG93LCB5ICsgeHggKiA0LCBwTW9kaWZpZXJUYWJsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBDb21wcmVzc2VkLT5zY29yZSA9IHNjb3JlOwotfQotCi1zdGF0aWMgYm9vbCBpblJhbmdlNGJpdFNpZ25lZChpbnQgY29sb3IpIHsKLSAgICByZXR1cm4gY29sb3IgPj0gLTQgJiYgY29sb3IgPD0gMzsKLX0KLQotc3RhdGljIHZvaWQgZXRjX2VuY29kZUJhc2VDb2xvcnMoZXRjMV9ieXRlKiBwQmFzZUNvbG9ycywKLSAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwQ29sb3JzLCBldGNfY29tcHJlc3NlZCogcENvbXByZXNzZWQpIHsKLSAgICBpbnQgcjEsIGcxLCBiMSwgcjIsIGcyLCBiMjsgLy8gOCBiaXQgYmFzZSBjb2xvcnMgZm9yIHN1Yi1ibG9ja3MKLSAgICBib29sIGRpZmZlcmVudGlhbDsKLSAgICB7Ci0gICAgICAgIGludCByNTEgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzBdKTsKLSAgICAgICAgaW50IGc1MSA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbMV0pOwotICAgICAgICBpbnQgYjUxID0gY29udmVydDhUbzUocENvbG9yc1syXSk7Ci0gICAgICAgIGludCByNTIgPSBjb252ZXJ0OFRvNShwQ29sb3JzWzNdKTsKLSAgICAgICAgaW50IGc1MiA9IGNvbnZlcnQ4VG81KHBDb2xvcnNbNF0pOwotICAgICAgICBpbnQgYjUyID0gY29udmVydDhUbzUocENvbG9yc1s1XSk7Ci0KLSAgICAgICAgcjEgPSBjb252ZXJ0NVRvOChyNTEpOwotICAgICAgICBnMSA9IGNvbnZlcnQ1VG84KGc1MSk7Ci0gICAgICAgIGIxID0gY29udmVydDVUbzgoYjUxKTsKLQotICAgICAgICBpbnQgZHIgPSByNTIgLSByNTE7Ci0gICAgICAgIGludCBkZyA9IGc1MiAtIGc1MTsKLSAgICAgICAgaW50IGRiID0gYjUyIC0gYjUxOwotCi0gICAgICAgIGRpZmZlcmVudGlhbCA9IGluUmFuZ2U0Yml0U2lnbmVkKGRyKSAmJiBpblJhbmdlNGJpdFNpZ25lZChkZykKLSAgICAgICAgICAgICAgICAmJiBpblJhbmdlNGJpdFNpZ25lZChkYik7Ci0gICAgICAgIGlmIChkaWZmZXJlbnRpYWwpIHsKLSAgICAgICAgICAgIHIyID0gY29udmVydDVUbzgocjUxICsgZHIpOwotICAgICAgICAgICAgZzIgPSBjb252ZXJ0NVRvOChnNTEgKyBkZyk7Ci0gICAgICAgICAgICBiMiA9IGNvbnZlcnQ1VG84KGI1MSArIGRiKTsKLSAgICAgICAgICAgIHBDb21wcmVzc2VkLT5oaWdoIHw9IChyNTEgPDwgMjcpIHwgKCg3ICYgZHIpIDw8IDI0KSB8IChnNTEgPDwgMTkpCi0gICAgICAgICAgICAgICAgICAgIHwgKCg3ICYgZGcpIDw8IDE2KSB8IChiNTEgPDwgMTEpIHwgKCg3ICYgZGIpIDw8IDgpIHwgMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghZGlmZmVyZW50aWFsKSB7Ci0gICAgICAgIGludCByNDEgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzBdKTsKLSAgICAgICAgaW50IGc0MSA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbMV0pOwotICAgICAgICBpbnQgYjQxID0gY29udmVydDhUbzQocENvbG9yc1syXSk7Ci0gICAgICAgIGludCByNDIgPSBjb252ZXJ0OFRvNChwQ29sb3JzWzNdKTsKLSAgICAgICAgaW50IGc0MiA9IGNvbnZlcnQ4VG80KHBDb2xvcnNbNF0pOwotICAgICAgICBpbnQgYjQyID0gY29udmVydDhUbzQocENvbG9yc1s1XSk7Ci0gICAgICAgIHIxID0gY29udmVydDRUbzgocjQxKTsKLSAgICAgICAgZzEgPSBjb252ZXJ0NFRvOChnNDEpOwotICAgICAgICBiMSA9IGNvbnZlcnQ0VG84KGI0MSk7Ci0gICAgICAgIHIyID0gY29udmVydDRUbzgocjQyKTsKLSAgICAgICAgZzIgPSBjb252ZXJ0NFRvOChnNDIpOwotICAgICAgICBiMiA9IGNvbnZlcnQ0VG84KGI0Mik7Ci0gICAgICAgIHBDb21wcmVzc2VkLT5oaWdoIHw9IChyNDEgPDwgMjgpIHwgKHI0MiA8PCAyNCkgfCAoZzQxIDw8IDIwKSB8IChnNDIKLSAgICAgICAgICAgICAgICA8PCAxNikgfCAoYjQxIDw8IDEyKSB8IChiNDIgPDwgOCk7Ci0gICAgfQotICAgIHBCYXNlQ29sb3JzWzBdID0gcjE7Ci0gICAgcEJhc2VDb2xvcnNbMV0gPSBnMTsKLSAgICBwQmFzZUNvbG9yc1syXSA9IGIxOwotICAgIHBCYXNlQ29sb3JzWzNdID0gcjI7Ci0gICAgcEJhc2VDb2xvcnNbNF0gPSBnMjsKLSAgICBwQmFzZUNvbG9yc1s1XSA9IGIyOwotfQotCi1zdGF0aWMKLXZvaWQgZXRjX2VuY29kZV9ibG9ja19oZWxwZXIoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIGluTWFzaywKLSAgICAgICAgY29uc3QgZXRjMV9ieXRlKiBwQ29sb3JzLCBldGNfY29tcHJlc3NlZCogcENvbXByZXNzZWQsIGJvb2wgZmxpcHBlZCkgewotICAgIHBDb21wcmVzc2VkLT5zY29yZSA9IH4wOwotICAgIHBDb21wcmVzc2VkLT5oaWdoID0gKGZsaXBwZWQgPyAxIDogMCk7Ci0gICAgcENvbXByZXNzZWQtPmxvdyA9IDA7Ci0KLSAgICBldGMxX2J5dGUgcEJhc2VDb2xvcnNbNl07Ci0KLSAgICBldGNfZW5jb2RlQmFzZUNvbG9ycyhwQmFzZUNvbG9ycywgcENvbG9ycywgcENvbXByZXNzZWQpOwotCi0gICAgaW50IG9yaWdpbmFsSGlnaCA9IHBDb21wcmVzc2VkLT5oaWdoOwotCi0gICAgY29uc3QgaW50KiBwTW9kaWZpZXJUYWJsZSA9IGtNb2RpZmllclRhYmxlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrLCBwTW9kaWZpZXJUYWJsZSArPSA0KSB7Ci0gICAgICAgIGV0Y19jb21wcmVzc2VkIHRlbXA7Ci0gICAgICAgIHRlbXAuc2NvcmUgPSAwOwotICAgICAgICB0ZW1wLmhpZ2ggPSBvcmlnaW5hbEhpZ2ggfCAoaSA8PCA1KTsKLSAgICAgICAgdGVtcC5sb3cgPSAwOwotICAgICAgICBldGNfZW5jb2RlX3N1YmJsb2NrX2hlbHBlcihwSW4sIGluTWFzaywgJnRlbXAsIGZsaXBwZWQsIGZhbHNlLAotICAgICAgICAgICAgICAgIHBCYXNlQ29sb3JzLCBwTW9kaWZpZXJUYWJsZSk7Ci0gICAgICAgIHRha2VfYmVzdChwQ29tcHJlc3NlZCwgJnRlbXApOwotICAgIH0KLSAgICBwTW9kaWZpZXJUYWJsZSA9IGtNb2RpZmllclRhYmxlOwotICAgIGV0Y19jb21wcmVzc2VkIGZpcnN0SGFsZiA9ICpwQ29tcHJlc3NlZDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKywgcE1vZGlmaWVyVGFibGUgKz0gNCkgewotICAgICAgICBldGNfY29tcHJlc3NlZCB0ZW1wOwotICAgICAgICB0ZW1wLnNjb3JlID0gZmlyc3RIYWxmLnNjb3JlOwotICAgICAgICB0ZW1wLmhpZ2ggPSBmaXJzdEhhbGYuaGlnaCB8IChpIDw8IDIpOwotICAgICAgICB0ZW1wLmxvdyA9IGZpcnN0SGFsZi5sb3c7Ci0gICAgICAgIGV0Y19lbmNvZGVfc3ViYmxvY2tfaGVscGVyKHBJbiwgaW5NYXNrLCAmdGVtcCwgZmxpcHBlZCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICBwQmFzZUNvbG9ycyArIDMsIHBNb2RpZmllclRhYmxlKTsKLSAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgKnBDb21wcmVzc2VkID0gdGVtcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRha2VfYmVzdChwQ29tcHJlc3NlZCwgJnRlbXApOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUJpZ0VuZGlhbihldGMxX2J5dGUqIHBPdXQsIGV0YzFfdWludDMyIGQpIHsKLSAgICBwT3V0WzBdID0gKGV0YzFfYnl0ZSkoZCA+PiAyNCk7Ci0gICAgcE91dFsxXSA9IChldGMxX2J5dGUpKGQgPj4gMTYpOwotICAgIHBPdXRbMl0gPSAoZXRjMV9ieXRlKShkID4+IDgpOwotICAgIHBPdXRbM10gPSAoZXRjMV9ieXRlKSBkOwotfQotCi0vLyBJbnB1dCBpcyBhIDQgeCA0IHNxdWFyZSBvZiAzLWJ5dGUgcGl4ZWxzIGluIGZvcm0gUiwgRywgQgotLy8gaW5tYXNrIGlzIGEgMTYtYml0IG1hc2sgd2hlcmUgYml0ICgxIDw8ICh4ICsgeSAqIDQpKSB0ZWxscyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nICh4LHkpCi0vLyBwaXhlbCBpcyB2YWxpZCBvciBub3QuIEludmFsaWQgcGl4ZWwgY29sb3IgdmFsdWVzIGFyZSBpZ25vcmVkIHdoZW4gY29tcHJlc3NpbmcuCi0vLyBPdXRwdXQgaXMgYW4gRVRDMSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIGRhdGEuCi0KLXZvaWQgZXRjMV9lbmNvZGVfYmxvY2soY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfdWludDMyIGluTWFzaywKLSAgICAgICAgZXRjMV9ieXRlKiBwT3V0KSB7Ci0gICAgZXRjMV9ieXRlIGNvbG9yc1s2XTsKLSAgICBldGMxX2J5dGUgZmxpcHBlZENvbG9yc1s2XTsKLSAgICBldGNfYXZlcmFnZV9jb2xvcnNfc3ViYmxvY2socEluLCBpbk1hc2ssIGNvbG9ycywgZmFsc2UsIGZhbHNlKTsKLSAgICBldGNfYXZlcmFnZV9jb2xvcnNfc3ViYmxvY2socEluLCBpbk1hc2ssIGNvbG9ycyArIDMsIGZhbHNlLCB0cnVlKTsKLSAgICBldGNfYXZlcmFnZV9jb2xvcnNfc3ViYmxvY2socEluLCBpbk1hc2ssIGZsaXBwZWRDb2xvcnMsIHRydWUsIGZhbHNlKTsKLSAgICBldGNfYXZlcmFnZV9jb2xvcnNfc3ViYmxvY2socEluLCBpbk1hc2ssIGZsaXBwZWRDb2xvcnMgKyAzLCB0cnVlLCB0cnVlKTsKLQotICAgIGV0Y19jb21wcmVzc2VkIGEsIGI7Ci0gICAgZXRjX2VuY29kZV9ibG9ja19oZWxwZXIocEluLCBpbk1hc2ssIGNvbG9ycywgJmEsIGZhbHNlKTsKLSAgICBldGNfZW5jb2RlX2Jsb2NrX2hlbHBlcihwSW4sIGluTWFzaywgZmxpcHBlZENvbG9ycywgJmIsIHRydWUpOwotICAgIHRha2VfYmVzdCgmYSwgJmIpOwotICAgIHdyaXRlQmlnRW5kaWFuKHBPdXQsIGEuaGlnaCk7Ci0gICAgd3JpdGVCaWdFbmRpYW4ocE91dCArIDQsIGEubG93KTsKLX0KLQotLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBlbmNvZGVkIGltYWdlIGRhdGEgKGRvZXMgbm90IGluY2x1ZGUgc2l6ZSBvZiBQS00gaGVhZGVyKS4KLQotZXRjMV91aW50MzIgZXRjMV9nZXRfZW5jb2RlZF9kYXRhX3NpemUoZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCkgewotICAgIHJldHVybiAoKCh3aWR0aCArIDMpICYgfjMpICogKChoZWlnaHQgKyAzKSAmIH4zKSkgPj4gMTsKLX0KLQotLy8gRW5jb2RlIGFuIGVudGlyZSBpbWFnZS4KLS8vIHBJbiAtIHBvaW50ZXIgdG8gdGhlIGltYWdlIGRhdGEuIEZvcm1hdHRlZCBzdWNoIHRoYXQgdGhlIFJlZCBjb21wb25lbnQgb2YKLS8vICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5ICsgcmVkT2Zmc2V0OwotLy8gcE91dCAtIHBvaW50ZXIgdG8gZW5jb2RlZCBkYXRhLiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBzdG9yZSBlbnRpcmUgZW5jb2RlZCBpbWFnZS4KLQotaW50IGV0YzFfZW5jb2RlX2ltYWdlKGNvbnN0IGV0YzFfYnl0ZSogcEluLCBldGMxX3VpbnQzMiB3aWR0aCwgZXRjMV91aW50MzIgaGVpZ2h0LAotICAgICAgICBldGMxX3VpbnQzMiBwaXhlbFNpemUsIGV0YzFfdWludDMyIHN0cmlkZSwgZXRjMV9ieXRlKiBwT3V0KSB7Ci0gICAgaWYgKHBpeGVsU2l6ZSA8IDIgfHwgcGl4ZWxTaXplID4gMykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBrWU1hc2tbXSA9IHsgMHgwLCAweGYsIDB4ZmYsIDB4ZmZmLCAweGZmZmYgfTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQga1hNYXNrW10gPSB7IDB4MCwgMHgxMTExLCAweDMzMzMsIDB4Nzc3NywKLSAgICAgICAgICAgIDB4ZmZmZiB9OwotICAgIGV0YzFfYnl0ZSBibG9ja1tFVEMxX0RFQ09ERURfQkxPQ0tfU0laRV07Ci0gICAgZXRjMV9ieXRlIGVuY29kZWRbRVRDMV9FTkNPREVEX0JMT0NLX1NJWkVdOwotCi0gICAgZXRjMV91aW50MzIgZW5jb2RlZFdpZHRoID0gKHdpZHRoICsgMykgJiB+MzsKLSAgICBldGMxX3VpbnQzMiBlbmNvZGVkSGVpZ2h0ID0gKGhlaWdodCArIDMpICYgfjM7Ci0KLSAgICBmb3IgKGV0YzFfdWludDMyIHkgPSAwOyB5IDwgZW5jb2RlZEhlaWdodDsgeSArPSA0KSB7Ci0gICAgICAgIGV0YzFfdWludDMyIHlFbmQgPSBoZWlnaHQgLSB5OwotICAgICAgICBpZiAoeUVuZCA+IDQpIHsKLSAgICAgICAgICAgIHlFbmQgPSA0OwotICAgICAgICB9Ci0gICAgICAgIGludCB5bWFzayA9IGtZTWFza1t5RW5kXTsKLSAgICAgICAgZm9yIChldGMxX3VpbnQzMiB4ID0gMDsgeCA8IGVuY29kZWRXaWR0aDsgeCArPSA0KSB7Ci0gICAgICAgICAgICBldGMxX3VpbnQzMiB4RW5kID0gd2lkdGggLSB4OwotICAgICAgICAgICAgaWYgKHhFbmQgPiA0KSB7Ci0gICAgICAgICAgICAgICAgeEVuZCA9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbWFzayA9IHltYXNrICYga1hNYXNrW3hFbmRdOwotICAgICAgICAgICAgZm9yIChldGMxX3VpbnQzMiBjeSA9IDA7IGN5IDwgeUVuZDsgY3krKykgewotICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSogcSA9IGJsb2NrICsgKGN5ICogNCkgKiAzOwotICAgICAgICAgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcCA9IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiAoeSArIGN5KTsKLSAgICAgICAgICAgICAgICBpZiAocGl4ZWxTaXplID09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHEsIHAsIHhFbmQgKiAzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGV0YzFfdWludDMyIGN4ID0gMDsgY3ggPCB4RW5kOyBjeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWwgPSAocFsxXSA8PCA4KSB8IHBbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gY29udmVydDVUbzgocGl4ZWwgPj4gMTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNvbnZlcnQ2VG84KHBpeGVsID4+IDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IGNvbnZlcnQ1VG84KHBpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gcGl4ZWxTaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZXRjMV9lbmNvZGVfYmxvY2soYmxvY2ssIG1hc2ssIGVuY29kZWQpOwotICAgICAgICAgICAgbWVtY3B5KHBPdXQsIGVuY29kZWQsIHNpemVvZihlbmNvZGVkKSk7Ci0gICAgICAgICAgICBwT3V0ICs9IHNpemVvZihlbmNvZGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLy8gRGVjb2RlIGFuIGVudGlyZSBpbWFnZS4KLS8vIHBJbiAtIHBvaW50ZXIgdG8gZW5jb2RlZCBkYXRhLgotLy8gcE91dCAtIHBvaW50ZXIgdG8gdGhlIGltYWdlIGRhdGEuIFdpbGwgYmUgd3JpdHRlbiBzdWNoIHRoYXQgdGhlIFJlZCBjb21wb25lbnQgb2YKLS8vICAgICAgIHBpeGVsICh4LHkpIGlzIGF0IHBJbiArIHBpeGVsU2l6ZSAqIHggKyBzdHJpZGUgKiB5ICsgcmVkT2Zmc2V0LiBNdXN0IGJlCi0vLyAgICAgICAgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIGVudGlyZSBpbWFnZS4KLQotCi1pbnQgZXRjMV9kZWNvZGVfaW1hZ2UoY29uc3QgZXRjMV9ieXRlKiBwSW4sIGV0YzFfYnl0ZSogcE91dCwKLSAgICAgICAgZXRjMV91aW50MzIgd2lkdGgsIGV0YzFfdWludDMyIGhlaWdodCwKLSAgICAgICAgZXRjMV91aW50MzIgcGl4ZWxTaXplLCBldGMxX3VpbnQzMiBzdHJpZGUpIHsKLSAgICBpZiAocGl4ZWxTaXplIDwgMiB8fCBwaXhlbFNpemUgPiAzKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgZXRjMV9ieXRlIGJsb2NrW0VUQzFfREVDT0RFRF9CTE9DS19TSVpFXTsKLQotICAgIGV0YzFfdWludDMyIGVuY29kZWRXaWR0aCA9ICh3aWR0aCArIDMpICYgfjM7Ci0gICAgZXRjMV91aW50MzIgZW5jb2RlZEhlaWdodCA9IChoZWlnaHQgKyAzKSAmIH4zOwotCi0gICAgZm9yIChldGMxX3VpbnQzMiB5ID0gMDsgeSA8IGVuY29kZWRIZWlnaHQ7IHkgKz0gNCkgewotICAgICAgICBldGMxX3VpbnQzMiB5RW5kID0gaGVpZ2h0IC0geTsKLSAgICAgICAgaWYgKHlFbmQgPiA0KSB7Ci0gICAgICAgICAgICB5RW5kID0gNDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGV0YzFfdWludDMyIHggPSAwOyB4IDwgZW5jb2RlZFdpZHRoOyB4ICs9IDQpIHsKLSAgICAgICAgICAgIGV0YzFfdWludDMyIHhFbmQgPSB3aWR0aCAtIHg7Ci0gICAgICAgICAgICBpZiAoeEVuZCA+IDQpIHsKLSAgICAgICAgICAgICAgICB4RW5kID0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV0YzFfZGVjb2RlX2Jsb2NrKHBJbiwgYmxvY2spOwotICAgICAgICAgICAgcEluICs9IEVUQzFfRU5DT0RFRF9CTE9DS19TSVpFOwotICAgICAgICAgICAgZm9yIChldGMxX3VpbnQzMiBjeSA9IDA7IGN5IDwgeUVuZDsgY3krKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGV0YzFfYnl0ZSogcSA9IGJsb2NrICsgKGN5ICogNCkgKiAzOwotICAgICAgICAgICAgICAgIGV0YzFfYnl0ZSogcCA9IHBPdXQgKyBwaXhlbFNpemUgKiB4ICsgc3RyaWRlICogKHkgKyBjeSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBpeGVsU2l6ZSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShwLCBxLCB4RW5kICogMyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChldGMxX3VpbnQzMiBjeCA9IDA7IGN4IDwgeEVuZDsgY3grKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZXRjMV9ieXRlIHIgPSAqcSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZXRjMV9ieXRlIGcgPSAqcSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZXRjMV9ieXRlIGIgPSAqcSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZXRjMV91aW50MzIgcGl4ZWwgPSAoKHIgPj4gMykgPDwgMTEpIHwgKChnID4+IDIpIDw8IDUpIHwgKGIgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGV0YzFfYnl0ZSkgcGl4ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGV0YzFfYnl0ZSkgKHBpeGVsID4+IDgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciBrTWFnaWNbXSA9IHsgJ1AnLCAnSycsICdNJywgJyAnLCAnMScsICcwJyB9OwotCi1zdGF0aWMgY29uc3QgZXRjMV91aW50MzIgRVRDMV9QS01fRk9STUFUX09GRlNFVCA9IDY7Ci1zdGF0aWMgY29uc3QgZXRjMV91aW50MzIgRVRDMV9QS01fRU5DT0RFRF9XSURUSF9PRkZTRVQgPSA4Owotc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX0VOQ09ERURfSEVJR0hUX09GRlNFVCA9IDEwOwotc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX1dJRFRIX09GRlNFVCA9IDEyOwotc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUEtNX0hFSUdIVF9PRkZTRVQgPSAxNDsKLQotc3RhdGljIGNvbnN0IGV0YzFfdWludDMyIEVUQzFfUkdCX05PX01JUE1BUFMgPSAwOwotCi1zdGF0aWMgdm9pZCB3cml0ZUJFVWludDE2KGV0YzFfYnl0ZSogcE91dCwgZXRjMV91aW50MzIgZGF0YSkgewotICAgIHBPdXRbMF0gPSAoZXRjMV9ieXRlKSAoZGF0YSA+PiA4KTsKLSAgICBwT3V0WzFdID0gKGV0YzFfYnl0ZSkgZGF0YTsKLX0KLQotc3RhdGljIGV0YzFfdWludDMyIHJlYWRCRVVpbnQxNihjb25zdCBldGMxX2J5dGUqIHBJbikgewotICAgIHJldHVybiAocEluWzBdIDw8IDgpIHwgcEluWzFdOwotfQotCi0vLyBGb3JtYXQgYSBQS00gaGVhZGVyCi0KLXZvaWQgZXRjMV9wa21fZm9ybWF0X2hlYWRlcihldGMxX2J5dGUqIHBIZWFkZXIsIGV0YzFfdWludDMyIHdpZHRoLCBldGMxX3VpbnQzMiBoZWlnaHQpIHsKLSAgICBtZW1jcHkocEhlYWRlciwga01hZ2ljLCBzaXplb2Yoa01hZ2ljKSk7Ci0gICAgZXRjMV91aW50MzIgZW5jb2RlZFdpZHRoID0gKHdpZHRoICsgMykgJiB+MzsKLSAgICBldGMxX3VpbnQzMiBlbmNvZGVkSGVpZ2h0ID0gKGhlaWdodCArIDMpICYgfjM7Ci0gICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fRk9STUFUX09GRlNFVCwgRVRDMV9SR0JfTk9fTUlQTUFQUyk7Ci0gICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fRU5DT0RFRF9XSURUSF9PRkZTRVQsIGVuY29kZWRXaWR0aCk7Ci0gICAgd3JpdGVCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fRU5DT0RFRF9IRUlHSFRfT0ZGU0VULCBlbmNvZGVkSGVpZ2h0KTsKLSAgICB3cml0ZUJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9XSURUSF9PRkZTRVQsIHdpZHRoKTsKLSAgICB3cml0ZUJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9IRUlHSFRfT0ZGU0VULCBoZWlnaHQpOwotfQotCi0vLyBDaGVjayBpZiBhIFBLTSBoZWFkZXIgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4KLQotZXRjMV9ib29sIGV0YzFfcGttX2lzX3ZhbGlkKGNvbnN0IGV0YzFfYnl0ZSogcEhlYWRlcikgewotICAgIGlmIChtZW1jbXAocEhlYWRlciwga01hZ2ljLCBzaXplb2Yoa01hZ2ljKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBldGMxX3VpbnQzMiBmb3JtYXQgPSByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0ZPUk1BVF9PRkZTRVQpOwotICAgIGV0YzFfdWludDMyIGVuY29kZWRXaWR0aCA9IHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fRU5DT0RFRF9XSURUSF9PRkZTRVQpOwotICAgIGV0YzFfdWludDMyIGVuY29kZWRIZWlnaHQgPSByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX0VOQ09ERURfSEVJR0hUX09GRlNFVCk7Ci0gICAgZXRjMV91aW50MzIgd2lkdGggPSByZWFkQkVVaW50MTYocEhlYWRlciArIEVUQzFfUEtNX1dJRFRIX09GRlNFVCk7Ci0gICAgZXRjMV91aW50MzIgaGVpZ2h0ID0gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9IRUlHSFRfT0ZGU0VUKTsKLSAgICByZXR1cm4gZm9ybWF0ID09IEVUQzFfUkdCX05PX01JUE1BUFMgJiYKLSAgICAgICAgICAgIGVuY29kZWRXaWR0aCA+PSB3aWR0aCAmJiBlbmNvZGVkV2lkdGggLSB3aWR0aCA8IDQgJiYKLSAgICAgICAgICAgIGVuY29kZWRIZWlnaHQgPj0gaGVpZ2h0ICYmIGVuY29kZWRIZWlnaHQgLSBoZWlnaHQgPCA0OwotfQotCi0vLyBSZWFkIHRoZSBpbWFnZSB3aWR0aCBmcm9tIGEgUEtNIGhlYWRlcgotCi1ldGMxX3VpbnQzMiBldGMxX3BrbV9nZXRfd2lkdGgoY29uc3QgZXRjMV9ieXRlKiBwSGVhZGVyKSB7Ci0gICAgcmV0dXJuIHJlYWRCRVVpbnQxNihwSGVhZGVyICsgRVRDMV9QS01fV0lEVEhfT0ZGU0VUKTsKLX0KLQotLy8gUmVhZCB0aGUgaW1hZ2UgaGVpZ2h0IGZyb20gYSBQS00gaGVhZGVyCi0KLWV0YzFfdWludDMyIGV0YzFfcGttX2dldF9oZWlnaHQoY29uc3QgZXRjMV9ieXRlKiBwSGVhZGVyKXsKLSAgICByZXR1cm4gcmVhZEJFVWludDE2KHBIZWFkZXIgKyBFVEMxX1BLTV9IRUlHSFRfT0ZGU0VUKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTMi9nbDIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzQ1YzJiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVMyL2dsMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyogCi0gKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLQotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlICJob29rcy5oIgotI2luY2x1ZGUgImVnbF9pbXBsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBY3R1YWwgR0wgZW50cnktcG9pbnRzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSN1bmRlZiBBUElfRU5UUlkKLSN1bmRlZiBDQUxMX0dMX0FQSQotI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgotCi0jZGVmaW5lIERFQlVHX0NBTExfR0xfQVBJIDAKLQotI2lmIFVTRV9GQVNUX1RMU19LRVkKLQotICAgICNpZmRlZiBIQVZFX0FSTV9UTFNfUkVHSVNURVIKLSAgICAgICAgI2RlZmluZSBHRVRfVExTKHJlZykgXAotICAgICAgICAgICAgIm1yYyBwMTUsIDAsICIgI3JlZyAiLCBjMTMsIGMwLCAzIFxuIgotICAgICNlbHNlCi0gICAgICAgICNkZWZpbmUgR0VUX1RMUyhyZWcpIFwKLSAgICAgICAgICAgICJtb3YgICAiICNyZWcgIiwgIzB4RkZGRjBGRkYgICAgICBcbiIgIFwKLSAgICAgICAgICAgICJsZHIgICAiICNyZWcgIiwgWyIgI3JlZyAiLCAjLTE1XSBcbiIKLSAgICAjZW5kaWYKLQotICAgICNkZWZpbmUgQVBJX0VOVFJZKF9hcGkpIF9fYXR0cmlidXRlX18oKG5ha2VkKSkgX2FwaQotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgYXNtIHZvbGF0aWxlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEdFVF9UTFMocjEyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAibGRyICAgcjEyLCBbcjEyLCAlW3Rsc11dIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImNtcCAgIHIxMiwgIzAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJsZHJuZSBwYywgIFtyMTIsICVbYXBpXV0gXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAibW92ICAgcjAsICMwICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImJ4ICAgIGxyICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6IFt0bHNdICJKIihUTFNfU0xPVF9PUEVOR0xfQVBJKjQpLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBbYXBpXSAiSiIoX19idWlsdGluX29mZnNldG9mKGdsX2hvb2tzX3QsIGdsLl9hcGkpKSAgICBcCi0gICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKTsKLQotICAgICNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF9hcGksIC4uLikgXAotICAgICAgICBDQUxMX0dMX0FQSShfYXBpLCBfX1ZBX0FSR1NfXykgXAotICAgICAgICByZXR1cm4gMDsgLy8gcGxhY2F0ZSBnY2MncyB3YXJuaW5ncy4gbmV2ZXIgcmVhY2hlZC4KLQotI2Vsc2UKLQotICAgICNkZWZpbmUgQVBJX0VOVFJZKF9hcGkpIF9hcGkKLQotI2lmIERFQlVHX0NBTExfR0xfQVBJCi0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyAgXAotICAgICAgICBfYy0+X2FwaShfX1ZBX0FSR1NfXyk7IFwKLSAgICAgICAgR0xlbnVtIHN0YXR1cyA9IEdMX05PX0VSUk9SOyBcCi0gICAgICAgIHdoaWxlICgoc3RhdHVzID0gZ2xHZXRFcnJvcigpKSAhPSBHTF9OT19FUlJPUikgeyBcCi0gICAgICAgICAgICBBTE9HRCgiWyIgI19hcGkgIl0gMHgleCIsIHN0YXR1cyk7IFwKLSAgICAgICAgfQotCi0jZWxzZQotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnbF9ob29rc190OjpnbF90IGNvbnN0ICogY29uc3QgX2MgPSAmZ2V0R2xUaHJlYWRTcGVjaWZpYygpLT5nbDsgIFwKLSAgICAgICAgX2MtPl9hcGkoX19WQV9BUkdTX18pOwotCi0jZW5kaWYKLQotICAgICNkZWZpbmUgQ0FMTF9HTF9BUElfUkVUVVJOKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ2xfaG9va3NfdDo6Z2xfdCBjb25zdCAqIGNvbnN0IF9jID0gJmdldEdsVGhyZWFkU3BlY2lmaWMoKS0+Z2w7ICBcCi0gICAgICAgIHJldHVybiBfYy0+X2FwaShfX1ZBX0FSR1NfXykKLQotI2VuZGlmCi0KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiZ2wyX2FwaS5pbiIKLSNpbmNsdWRlICJnbDJleHRfYXBpLmluIgotfQotCi0jdW5kZWYgQVBJX0VOVFJZCi0jdW5kZWYgQ0FMTF9HTF9BUEkKLSN1bmRlZiBDQUxMX0dMX0FQSV9SRVRVUk4KLQotLyoKLSAqIGdsR2V0U3RyaW5nKCkgaXMgc3BlY2lhbCBiZWNhdXNlIHdlIGV4cG9zZSBzb21lIGV4dGVuc2lvbnMgaW4gdGhlIHdyYXBwZXIKLSAqLwotCi1leHRlcm4gIkMiIGNvbnN0IEdMdWJ5dGUgKiBfX2dsR2V0U3RyaW5nKEdMZW51bSBuYW1lKTsKLQotY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nKEdMZW51bSBuYW1lKQotewotICAgIGNvbnN0IEdMdWJ5dGUgKiByZXQgPSBlZ2xfZ2V0X3N0cmluZ19mb3JfY3VycmVudF9jb250ZXh0KG5hbWUpOwotICAgIGlmIChyZXQgPT0gTlVMTCkgewotICAgICAgICByZXQgPSBfX2dsR2V0U3RyaW5nKG5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyX2FwaS5pbiBiL29wZW5nbC9saWJzL0dMRVMyL2dsMl9hcGkuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhODlhNTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyX2FwaS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi12b2lkIEFQSV9FTlRSWShnbEFjdGl2ZVRleHR1cmUpKEdMZW51bSB0ZXh0dXJlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xBY3RpdmVUZXh0dXJlLCB0ZXh0dXJlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQXR0YWNoU2hhZGVyKShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcikgewotICAgIENBTExfR0xfQVBJKGdsQXR0YWNoU2hhZGVyLCBwcm9ncmFtLCBzaGFkZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kQXR0cmliTG9jYXRpb24pKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSkgewotICAgIENBTExfR0xfQVBJKGdsQmluZEF0dHJpYkxvY2F0aW9uLCBwcm9ncmFtLCBpbmRleCwgbmFtZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRCdWZmZXIpKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRCdWZmZXIsIHRhcmdldCwgYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZEZyYW1lYnVmZmVyKShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRGcmFtZWJ1ZmZlciwgdGFyZ2V0LCBmcmFtZWJ1ZmZlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRSZW5kZXJidWZmZXIpKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRSZW5kZXJidWZmZXIsIHRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFRleHR1cmUpKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kVGV4dHVyZSwgdGFyZ2V0LCB0ZXh0dXJlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRDb2xvcikoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJsZW5kQ29sb3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRFcXVhdGlvbikoIEdMZW51bSBtb2RlICkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRFcXVhdGlvbiwgbW9kZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSkoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSwgbW9kZVJHQiwgbW9kZUFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRGdW5jKShHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJsZW5kRnVuYywgc2ZhY3RvciwgZGZhY3Rvcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJsZW5kRnVuY1NlcGFyYXRlKShHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRGdW5jU2VwYXJhdGUsIHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCdWZmZXJEYXRhKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCdWZmZXJEYXRhLCB0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQnVmZmVyU3ViRGF0YSkoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsQnVmZmVyU3ViRGF0YSwgdGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwotfQotR0xlbnVtIEFQSV9FTlRSWShnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMpKEdMZW51bSB0YXJnZXQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzLCB0YXJnZXQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhcikoR0xiaXRmaWVsZCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhciwgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyQ29sb3IpKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckNvbG9yLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyRGVwdGhmKShHTGNsYW1wZiBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJEZXB0aGYsIGRlcHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJTdGVuY2lsKShHTGludCBzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhclN0ZW5jaWwsIHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb2xvck1hc2spKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ29sb3JNYXNrLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbXBpbGVTaGFkZXIpKEdMdWludCBzaGFkZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbXBpbGVTaGFkZXIsIHNoYWRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbXByZXNzZWRUZXhJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29weVRleEltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvcHlUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29weVRleFN1YkltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsQ29weVRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotR0x1aW50IEFQSV9FTlRSWShnbENyZWF0ZVByb2dyYW0pKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xDcmVhdGVQcm9ncmFtKTsKLX0KLUdMdWludCBBUElfRU5UUlkoZ2xDcmVhdGVTaGFkZXIpKEdMZW51bSB0eXBlKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsQ3JlYXRlU2hhZGVyLCB0eXBlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ3VsbEZhY2UpKEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDdWxsRmFjZSwgbW9kZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZUJ1ZmZlcnMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVCdWZmZXJzLCBuLCBidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlRnJhbWVidWZmZXJzKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVGcmFtZWJ1ZmZlcnMsIG4sIGZyYW1lYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVByb2dyYW0pKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVQcm9ncmFtLCBwcm9ncmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlUmVuZGVyYnVmZmVycykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMsIG4sIHJlbmRlcmJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVTaGFkZXIpKEdMdWludCBzaGFkZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVNoYWRlciwgc2hhZGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlVGV4dHVyZXMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiB0ZXh0dXJlcykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlVGV4dHVyZXMsIG4sIHRleHR1cmVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVwdGhGdW5jKShHTGVudW0gZnVuYykgewotICAgIENBTExfR0xfQVBJKGdsRGVwdGhGdW5jLCBmdW5jKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVwdGhNYXNrKShHTGJvb2xlYW4gZmxhZykgewotICAgIENBTExfR0xfQVBJKGdsRGVwdGhNYXNrLCBmbGFnKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVwdGhSYW5nZWYpKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aFJhbmdlZiwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXRhY2hTaGFkZXIpKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXRhY2hTaGFkZXIsIHByb2dyYW0sIHNoYWRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERpc2FibGUpKEdMZW51bSBjYXApIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2FibGUsIGNhcCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSkoR0x1aW50IGluZGV4KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXksIGluZGV4KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd0FycmF5cykoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3QXJyYXlzLCBtb2RlLCBmaXJzdCwgY291bnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3RWxlbWVudHMpKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBpbmRpY2VzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3RWxlbWVudHMsIG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5hYmxlKShHTGVudW0gY2FwKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFbmFibGUsIGNhcCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KShHTHVpbnQgaW5kZXgpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBpbmRleCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZpbmlzaCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsRmluaXNoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRmx1c2gpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZsdXNoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgdGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCwgdGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJvbnRGYWNlKShHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsRnJvbnRGYWNlLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuQnVmZmVycykoR0xzaXplaSBuLCBHTHVpbnQqIGJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlbkJ1ZmZlcnMsIG4sIGJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5lcmF0ZU1pcG1hcCkoR0xlbnVtIHRhcmdldCkgewotICAgIENBTExfR0xfQVBJKGdsR2VuZXJhdGVNaXBtYXAsIHRhcmdldCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlbkZyYW1lYnVmZmVycykoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsR2VuRnJhbWVidWZmZXJzLCBuLCBmcmFtZWJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5SZW5kZXJidWZmZXJzKShHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsR2VuUmVuZGVyYnVmZmVycywgbiwgcmVuZGVyYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblRleHR1cmVzKShHTHNpemVpIG4sIEdMdWludCogdGV4dHVyZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlblRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEFjdGl2ZUF0dHJpYikoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0QWN0aXZlQXR0cmliLCBwcm9ncmFtLCBpbmRleCwgYnVmc2l6ZSwgbGVuZ3RoLCBzaXplLCB0eXBlLCBuYW1lKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0QWN0aXZlVW5pZm9ybSkoR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0QWN0aXZlVW5pZm9ybSwgcHJvZ3JhbSwgaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEF0dGFjaGVkU2hhZGVycykoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEF0dGFjaGVkU2hhZGVycywgcHJvZ3JhbSwgbWF4Y291bnQsIGNvdW50LCBzaGFkZXJzKTsKLX0KLWludCBBUElfRU5UUlkoZ2xHZXRBdHRyaWJMb2NhdGlvbikoR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldEF0dHJpYkxvY2F0aW9uLCBwcm9ncmFtLCBuYW1lKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Qm9vbGVhbnYpKEdMZW51bSBwbmFtZSwgR0xib29sZWFuKiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEJvb2xlYW52LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci1HTGVudW0gQVBJX0VOVFJZKGdsR2V0RXJyb3IpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRFcnJvcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZsb2F0dikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZsb2F0diwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0SW50ZWdlcnYpKEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0SW50ZWdlcnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQcm9ncmFtaXYpKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFByb2dyYW1pdiwgcHJvZ3JhbSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFByb2dyYW1JbmZvTG9nKShHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UHJvZ3JhbUluZm9Mb2csIHByb2dyYW0sIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRTaGFkZXJpdikoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRTaGFkZXJpdiwgc2hhZGVyLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0U2hhZGVySW5mb0xvZykoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykgewotICAgIENBTExfR0xfQVBJKGdsR2V0U2hhZGVySW5mb0xvZywgc2hhZGVyLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQpKEdMZW51bSBzaGFkZXJ0eXBlLCBHTGVudW0gcHJlY2lzaW9udHlwZSwgR0xpbnQqIHJhbmdlLCBHTGludCogcHJlY2lzaW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQsIHNoYWRlcnR5cGUsIHByZWNpc2lvbnR5cGUsIHJhbmdlLCBwcmVjaXNpb24pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRTaGFkZXJTb3VyY2UpKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIHNvdXJjZSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0U2hhZGVyU291cmNlLCBzaGFkZXIsIGJ1ZnNpemUsIGxlbmd0aCwgc291cmNlKTsKLX0KLWNvbnN0IEdMdWJ5dGUqIEFQSV9FTlRSWShfX2dsR2V0U3RyaW5nKShHTGVudW0gbmFtZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEdldFN0cmluZywgbmFtZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleFBhcmFtZXRlcml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRVbmlmb3JtZnYpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRVbmlmb3JtZnYsIHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRVbmlmb3JtaXYpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VW5pZm9ybWl2LCBwcm9ncmFtLCBsb2NhdGlvbiwgcGFyYW1zKTsKLX0KLWludCBBUElfRU5UUlkoZ2xHZXRVbmlmb3JtTG9jYXRpb24pKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRVbmlmb3JtTG9jYXRpb24sIHByb2dyYW0sIG5hbWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRWZXJ0ZXhBdHRyaWJmdikoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VmVydGV4QXR0cmliZnYsIGluZGV4LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VmVydGV4QXR0cmliaXYpKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRWZXJ0ZXhBdHRyaWJpdiwgaW5kZXgsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydikoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2LCBpbmRleCwgcG5hbWUsIHBvaW50ZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xIaW50KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsSGludCwgdGFyZ2V0LCBtb2RlKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc0J1ZmZlcikoR0x1aW50IGJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzQnVmZmVyLCBidWZmZXIpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzRW5hYmxlZCkoR0xlbnVtIGNhcCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzRW5hYmxlZCwgY2FwKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc0ZyYW1lYnVmZmVyKShHTHVpbnQgZnJhbWVidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc0ZyYW1lYnVmZmVyLCBmcmFtZWJ1ZmZlcik7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNQcm9ncmFtKShHTHVpbnQgcHJvZ3JhbSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzUHJvZ3JhbSwgcHJvZ3JhbSk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNSZW5kZXJidWZmZXIpKEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1JlbmRlcmJ1ZmZlciwgcmVuZGVyYnVmZmVyKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1NoYWRlcikoR0x1aW50IHNoYWRlcikgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzU2hhZGVyLCBzaGFkZXIpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzVGV4dHVyZSkoR0x1aW50IHRleHR1cmUpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1RleHR1cmUsIHRleHR1cmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGgpKEdMZmxvYXQgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpbmVXaWR0aCwgd2lkdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaW5rUHJvZ3JhbSkoR0x1aW50IHByb2dyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExpbmtQcm9ncmFtLCBwcm9ncmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUGl4ZWxTdG9yZWkpKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFBpeGVsU3RvcmVpLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2x5Z29uT2Zmc2V0KShHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykgewotICAgIENBTExfR0xfQVBJKGdsUG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlYWRQaXhlbHMpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkKiBwaXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlYWRQaXhlbHMsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKSh2b2lkKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlLCB0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2UpKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZSwgdmFsdWUsIGludmVydCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNjaXNzb3IpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTY2lzc29yLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2hhZGVyQmluYXJ5KShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTaGFkZXJCaW5hcnksIG4sIHNoYWRlcnMsIGJpbmFyeWZvcm1hdCwgYmluYXJ5LCBsZW5ndGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTaGFkZXJTb3VyY2UpKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkgewotICAgIENBTExfR0xfQVBJKGdsU2hhZGVyU291cmNlLCBzaGFkZXIsIGNvdW50LCBzdHJpbmcsIGxlbmd0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxGdW5jKShHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbEZ1bmMsIGZ1bmMsIHJlZiwgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxGdW5jU2VwYXJhdGUpKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSwgZmFjZSwgZnVuYywgcmVmLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RlbmNpbE1hc2spKEdMdWludCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsTWFzaywgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxNYXNrU2VwYXJhdGUpKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSwgZmFjZSwgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxPcCkoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsT3AsIGZhaWwsIHpmYWlsLCB6cGFzcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxPcFNlcGFyYXRlKShHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTdGVuY2lsT3BTZXBhcmF0ZSwgZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4SW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyZikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJmLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmkpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcmksIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFN1YkltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhTdWJJbWFnZTJELCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0xZikoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCkgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybTFmLCBsb2NhdGlvbiwgeCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0xZnYpKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMWZ2LCBsb2NhdGlvbiwgY291bnQsIHYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtMWkpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMWksIGxvY2F0aW9uLCB4KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTFpdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMWl2LCBsb2NhdGlvbiwgY291bnQsIHYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtMmYpKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybTJmLCBsb2NhdGlvbiwgeCwgeSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0yZnYpKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMmZ2LCBsb2NhdGlvbiwgY291bnQsIHYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtMmkpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMmksIGxvY2F0aW9uLCB4LCB5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTJpdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtMml2LCBsb2NhdGlvbiwgY291bnQsIHYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtM2YpKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtM2YsIGxvY2F0aW9uLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTNmdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0zZnYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm0zaSkoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0zaSwgbG9jYXRpb24sIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtM2l2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm0zaXYsIGxvY2F0aW9uLCBjb3VudCwgdik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm00ZikoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdykgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybTRmLCBsb2NhdGlvbiwgeCwgeSwgeiwgdyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm00ZnYpKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtNGZ2LCBsb2NhdGlvbiwgY291bnQsIHYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtNGkpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtNGksIGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybTRpdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtNGl2LCBsb2NhdGlvbiwgY291bnQsIHYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVbmlmb3JtTWF0cml4MmZ2KShHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFVuaWZvcm1NYXRyaXgyZnYsIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVuaWZvcm1NYXRyaXgzZnYpKEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsVW5pZm9ybU1hdHJpeDNmdiwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVW5pZm9ybU1hdHJpeDRmdikoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVbmlmb3JtTWF0cml4NGZ2LCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xVc2VQcm9ncmFtKShHTHVpbnQgcHJvZ3JhbSkgewotICAgIENBTExfR0xfQVBJKGdsVXNlUHJvZ3JhbSwgcHJvZ3JhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZhbGlkYXRlUHJvZ3JhbSkoR0x1aW50IHByb2dyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFZhbGlkYXRlUHJvZ3JhbSwgcHJvZ3JhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjFmKShHTHVpbnQgaW5keCwgR0xmbG9hdCB4KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWIxZiwgaW5keCwgeCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjFmdikoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykgewotICAgIENBTExfR0xfQVBJKGdsVmVydGV4QXR0cmliMWZ2LCBpbmR4LCB2YWx1ZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWZXJ0ZXhBdHRyaWIyZikoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWIyZiwgaW5keCwgeCwgeSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjJmdikoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykgewotICAgIENBTExfR0xfQVBJKGdsVmVydGV4QXR0cmliMmZ2LCBpbmR4LCB2YWx1ZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWZXJ0ZXhBdHRyaWIzZikoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleEF0dHJpYjNmLCBpbmR4LCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmVydGV4QXR0cmliM2Z2KShHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWIzZnYsIGluZHgsIHZhbHVlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjRmKShHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhBdHRyaWI0ZiwgaW5keCwgeCwgeSwgeiwgdyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleEF0dHJpYjRmdikoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykgewotICAgIENBTExfR0xfQVBJKGdsVmVydGV4QXR0cmliNGZ2LCBpbmR4LCB2YWx1ZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKShHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZlcnRleEF0dHJpYlBvaW50ZXIsIGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcHRyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmlld3BvcnQpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWaWV3cG9ydCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDJleHRfYXBpLmluIGIvb3BlbmdsL2xpYnMvR0xFUzIvZ2wyZXh0X2FwaS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MTA3NS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTMi9nbDJleHRfYXBpLmluCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLXZvaWQgQVBJX0VOVFJZKGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMpKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCB0YXJnZXQsIGltYWdlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKShHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIHRhcmdldCwgaW1hZ2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQcm9ncmFtQmluYXJ5T0VTKShHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0UHJvZ3JhbUJpbmFyeU9FUywgcHJvZ3JhbSwgYnVmU2l6ZSwgbGVuZ3RoLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1CaW5hcnlPRVMpKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xpbnQgbGVuZ3RoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtQmluYXJ5T0VTLCBwcm9ncmFtLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSwgbGVuZ3RoKTsKLX0KLXZvaWQqIEFQSV9FTlRSWShnbE1hcEJ1ZmZlck9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcykgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbE1hcEJ1ZmZlck9FUywgdGFyZ2V0LCBhY2Nlc3MpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbFVubWFwQnVmZmVyT0VTKShHTGVudW0gdGFyZ2V0KSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsVW5tYXBCdWZmZXJPRVMsIHRhcmdldCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0QnVmZmVyUG9pbnRlcnZPRVMsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEltYWdlM0RPRVMpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIENBTExfR0xfQVBJKGdsVGV4SW1hZ2UzRE9FUywgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3ViSW1hZ2UzRE9FUykoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlM0RPRVMsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvcHlUZXhTdWJJbWFnZTNET0VTKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvcHlUZXhTdWJJbWFnZTNET0VTLCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleEltYWdlM0RPRVMpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTLCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCB6b2Zmc2V0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUywgdGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCB6b2Zmc2V0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFZlcnRleEFycmF5T0VTKShHTHVpbnQgYXJyYXkpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRWZXJ0ZXhBcnJheU9FUywgYXJyYXkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMpKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZVZlcnRleEFycmF5c09FUywgbiwgYXJyYXlzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuVmVydGV4QXJyYXlzT0VTKShHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5WZXJ0ZXhBcnJheXNPRVMsIG4sIGFycmF5cyk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNWZXJ0ZXhBcnJheU9FUykoR0x1aW50IGFycmF5KSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNWZXJ0ZXhBcnJheU9FUywgYXJyYXkpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCkoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3VwcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQsIG51bUdyb3VwcywgZ3JvdXBzU2l6ZSwgZ3JvdXBzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCkoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCwgZ3JvdXAsIG51bUNvdW50ZXJzLCBtYXhBY3RpdmVDb3VudGVycywgY291bnRlclNpemUsIGNvdW50ZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCkoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZykgewotICAgIENBTExfR0xfQVBJKGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCwgZ3JvdXAsIGJ1ZlNpemUsIGxlbmd0aCwgZ3JvdXBTdHJpbmcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQpKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCwgZ3JvdXAsIGNvdW50ZXIsIGJ1ZlNpemUsIGxlbmd0aCwgY291bnRlclN0cmluZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQpKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1ELCBncm91cCwgY291bnRlciwgcG5hbWUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5QZXJmTW9uaXRvcnNBTUQpKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycykgewotICAgIENBTExfR0xfQVBJKGdsR2VuUGVyZk1vbml0b3JzQU1ELCBuLCBtb25pdG9ycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCkoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQsIG4sIG1vbml0b3JzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCkoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCBtb25pdG9yLCBlbmFibGUsIGdyb3VwLCBudW1Db3VudGVycywgY291bnRlcnNMaXN0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmVnaW5QZXJmTW9uaXRvckFNRCkoR0x1aW50IG1vbml0b3IpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJlZ2luUGVyZk1vbml0b3JBTUQsIG1vbml0b3IpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFbmRQZXJmTW9uaXRvckFNRCkoR0x1aW50IG1vbml0b3IpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuZFBlcmZNb25pdG9yQU1ELCBtb25pdG9yKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCkoR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1ELCBtb25pdG9yLCBwbmFtZSwgZGF0YVNpemUsIGRhdGEsIGJ5dGVzV3JpdHRlbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFKShHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcikgewotICAgIENBTExfR0xfQVBJKGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUsIHNyY1gwLCBzcmNZMCwgc3JjWDEsIHNyY1kxLCBkc3RYMCwgZHN0WTAsIGRzdFgxLCBkc3RZMSwgbWFzaywgZmlsdGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUsIHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSwgdGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMYWJlbE9iamVjdEVYVCkoR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKmxhYmVsKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMYWJlbE9iamVjdEVYVCwgdHlwZSwgb2JqZWN0LCBsZW5ndGgsIGxhYmVsKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0T2JqZWN0TGFiZWxFWFQpKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpsYWJlbCkgewotICAgIENBTExfR0xfQVBJKGdsR2V0T2JqZWN0TGFiZWxFWFQsIHR5cGUsIG9iamVjdCwgYnVmU2l6ZSwgbGVuZ3RoLCBsYWJlbCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEluc2VydEV2ZW50TWFya2VyRVhUKShHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEluc2VydEV2ZW50TWFya2VyRVhULCBsZW5ndGgsIG1hcmtlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFB1c2hHcm91cE1hcmtlckVYVCkoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQdXNoR3JvdXBNYXJrZXJFWFQsIGxlbmd0aCwgbWFya2VyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9wR3JvdXBNYXJrZXJFWFQpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvcEdyb3VwTWFya2VyRVhUKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQsIHRhcmdldCwgbnVtQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCwgdGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykgewotICAgIENBTExfR0xfQVBJKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCwgdGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCBzYW1wbGVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdGlEcmF3QXJyYXlzRVhUKShHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpRHJhd0FycmF5c0VYVCwgbW9kZSwgZmlyc3QsIGNvdW50LCBwcmltY291bnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNdWx0aURyYXdFbGVtZW50c0VYVCkoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpRHJhd0VsZW1lbnRzRVhULCBtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcywgcHJpbWNvdW50KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuUXVlcmllc0VYVCkoR0xzaXplaSBuLCBHTHVpbnQgKmlkcykgewotICAgIENBTExfR0xfQVBJKGdsR2VuUXVlcmllc0VYVCwgbiwgaWRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlUXVlcmllc0VYVCkoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlUXVlcmllc0VYVCwgbiwgaWRzKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc1F1ZXJ5RVhUKShHTHVpbnQgaWQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1F1ZXJ5RVhULCBpZCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJlZ2luUXVlcnlFWFQpKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkgewotICAgIENBTExfR0xfQVBJKGdsQmVnaW5RdWVyeUVYVCwgdGFyZ2V0LCBpZCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuZFF1ZXJ5RVhUKShHTGVudW0gdGFyZ2V0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFbmRRdWVyeUVYVCwgdGFyZ2V0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UXVlcnlpdkVYVCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRRdWVyeWl2RVhULCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRRdWVyeU9iamVjdHVpdkVYVCkoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRRdWVyeU9iamVjdHVpdkVYVCwgaWQsIHBuYW1lLCBwYXJhbXMpOwotfQotR0xlbnVtIEFQSV9FTlRSWShnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVhZG5QaXhlbHNFWFQpKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZWFkblBpeGVsc0VYVCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBidWZTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0blVuaWZvcm1mdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldG5Vbmlmb3JtZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRuVW5pZm9ybWl2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0blVuaWZvcm1pdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGJ1ZlNpemUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFVzZVByb2dyYW1TdGFnZXNFWFQpKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xVc2VQcm9ncmFtU3RhZ2VzRVhULCBwaXBlbGluZSwgc3RhZ2VzLCBwcm9ncmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCkoR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSkgewotICAgIENBTExfR0xfQVBJKGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCwgcGlwZWxpbmUsIHByb2dyYW0pOwotfQotR0x1aW50IEFQSV9FTlRSWShnbENyZWF0ZVNoYWRlclByb2dyYW12RVhUKShHTGVudW0gdHlwZSwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqc3RyaW5ncykgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbENyZWF0ZVNoYWRlclByb2dyYW12RVhULCB0eXBlLCBjb3VudCwgc3RyaW5ncyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQpKEdMdWludCBwaXBlbGluZSkgewotICAgIENBTExfR0xfQVBJKGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCwgcGlwZWxpbmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhULCBuLCBwaXBlbGluZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUKShHTHNpemVpIG4sIEdMdWludCAqcGlwZWxpbmVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhULCBuLCBwaXBlbGluZXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzUHJvZ3JhbVBpcGVsaW5lRVhUKShHTHVpbnQgcGlwZWxpbmUpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1Byb2dyYW1QaXBlbGluZUVYVCwgcGlwZWxpbmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCkoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1QYXJhbWV0ZXJpRVhULCBwcm9ncmFtLCBwbmFtZSwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVCkoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFByb2dyYW1QaXBlbGluZWl2RVhULCBwaXBlbGluZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtMWlFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIHgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTJpRVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtMmlFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTNpRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtNGlFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdykgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm00aUVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHosIHcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTFmRVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0xZkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIHgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTJmRVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTJmRVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtM2ZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTRmRVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdykgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm00ZkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHosIHcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtMWl2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtM2l2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm0zaXZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtNGl2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtMWZ2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0yZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtMmZ2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm0zZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtM2Z2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtNGZ2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIENBTExfR0xfQVBJKGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUKShHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVCwgcHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQpKEdMdWludCBwaXBlbGluZSkgewotICAgIENBTExfR0xfQVBJKGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQsIHBpcGVsaW5lKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCkoR0x1aW50IHBpcGVsaW5lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhULCBwaXBlbGluZSwgYnVmU2l6ZSwgbGVuZ3RoLCBpbmZvTG9nKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3RvcmFnZTFERVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhTdG9yYWdlMURFWFQsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhTdG9yYWdlMkRFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhTdG9yYWdlMkRFWFQsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFN0b3JhZ2UzREVYVCkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN0b3JhZ2UzREVYVCwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleHR1cmVTdG9yYWdlMURFWFQpKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXh0dXJlU3RvcmFnZTFERVhULCB0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4dHVyZVN0b3JhZ2UyREVYVCkoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXh0dXJlU3RvcmFnZTJERVhULCB0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXh0dXJlU3RvcmFnZTNERVhUKShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleHR1cmVTdG9yYWdlM0RFWFQsIHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HLCB0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHNhbXBsZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb3ZlcmFnZU1hc2tOVikoR0xib29sZWFuIG1hc2spIHsKLSAgICBDQUxMX0dMX0FQSShnbENvdmVyYWdlTWFza05WLCBtYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ292ZXJhZ2VPcGVyYXRpb25OVikoR0xlbnVtIG9wZXJhdGlvbikgewotICAgIENBTExfR0xfQVBJKGdsQ292ZXJhZ2VPcGVyYXRpb25OViwgb3BlcmF0aW9uKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd0J1ZmZlcnNOVikoR0xzaXplaSBuLCBjb25zdCBHTGVudW0gKmJ1ZnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdCdWZmZXJzTlYsIG4sIGJ1ZnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVGZW5jZXNOVikoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlRmVuY2VzTlYsIG4sIGZlbmNlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlbkZlbmNlc05WKShHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5GZW5jZXNOViwgbiwgZmVuY2VzKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xJc0ZlbmNlTlYpKEdMdWludCBmZW5jZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzRmVuY2VOViwgZmVuY2UpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbFRlc3RGZW5jZU5WKShHTHVpbnQgZmVuY2UpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xUZXN0RmVuY2VOViwgZmVuY2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRGZW5jZWl2TlYpKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRGZW5jZWl2TlYsIGZlbmNlLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRmluaXNoRmVuY2VOVikoR0x1aW50IGZlbmNlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGaW5pc2hGZW5jZU5WLCBmZW5jZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNldEZlbmNlTlYpKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbikgewotICAgIENBTExfR0xfQVBJKGdsU2V0RmVuY2VOViwgZmVuY2UsIGNvbmRpdGlvbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlYWRCdWZmZXJOVikoR0xlbnVtIG1vZGUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlYWRCdWZmZXJOViwgbW9kZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEFscGhhRnVuY1FDT00pKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpIHsKLSAgICBDQUxMX0dMX0FQSShnbEFscGhhRnVuY1FDT00sIGZ1bmMsIHJlZik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldERyaXZlckNvbnRyb2xzUUNPTSkoR0xpbnQgKm51bSwgR0xzaXplaSBzaXplLCBHTHVpbnQgKmRyaXZlckNvbnRyb2xzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXREcml2ZXJDb250cm9sc1FDT00sIG51bSwgc2l6ZSwgZHJpdmVyQ29udHJvbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTSkoR0x1aW50IGRyaXZlckNvbnRyb2wsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmRyaXZlckNvbnRyb2xTdHJpbmcpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NLCBkcml2ZXJDb250cm9sLCBidWZTaXplLCBsZW5ndGgsIGRyaXZlckNvbnRyb2xTdHJpbmcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSkoR0x1aW50IGRyaXZlckNvbnRyb2wpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NLCBkcml2ZXJDb250cm9sKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NKShHTHVpbnQgZHJpdmVyQ29udHJvbCkgewotICAgIENBTExfR0xfQVBJKGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NLCBkcml2ZXJDb250cm9sKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0VGV4dHVyZXNRQ09NKShHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRUZXh0dXJlc1FDT00sIHRleHR1cmVzLCBtYXhUZXh0dXJlcywgbnVtVGV4dHVyZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRCdWZmZXJzUUNPTSkoR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0QnVmZmVyc1FDT00sIGJ1ZmZlcnMsIG1heEJ1ZmZlcnMsIG51bUJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSkoR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00sIHJlbmRlcmJ1ZmZlcnMsIG1heFJlbmRlcmJ1ZmZlcnMsIG51bVJlbmRlcmJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NKShHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NLCBmcmFtZWJ1ZmZlcnMsIG1heEZyYW1lYnVmZmVycywgbnVtRnJhbWVidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00pKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00sIHRleHR1cmUsIGZhY2UsIGxldmVsLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00sIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NLCB0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlLCB0ZXhlbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00pKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NLCB0YXJnZXQsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFNoYWRlcnNRQ09NKShHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRTaGFkZXJzUUNPTSwgc2hhZGVycywgbWF4U2hhZGVycywgbnVtU2hhZGVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFByb2dyYW1zUUNPTSkoR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcykgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0UHJvZ3JhbXNRQ09NLCBwcm9ncmFtcywgbWF4UHJvZ3JhbXMsIG51bVByb2dyYW1zKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NKShHTHVpbnQgcHJvZ3JhbSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00sIHByb2dyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSkoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGNoYXIgKnNvdXJjZSwgR0xpbnQgKmxlbmd0aCkgewotICAgIENBTExfR0xfQVBJKGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00sIHByb2dyYW0sIHNoYWRlcnR5cGUsIHNvdXJjZSwgbGVuZ3RoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU3RhcnRUaWxpbmdRQ09NKShHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spIHsKLSAgICBDQUxMX0dMX0FQSShnbFN0YXJ0VGlsaW5nUUNPTSwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcHJlc2VydmVNYXNrKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5kVGlsaW5nUUNPTSkoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuZFRpbGluZ1FDT00sIHByZXNlcnZlTWFzayk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsLmNwcCBiL29wZW5nbC9saWJzL0dMRVNfQ00vZ2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNiNjBkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfQ00vZ2wuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlICJob29rcy5oIgotI2luY2x1ZGUgImVnbF9pbXBsLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0vLyBzZXQgdGhpcyB0byAxIGZvciBjcnVkZSBHTCBkZWJ1Z2dpbmcKLSNkZWZpbmUgQ0hFQ0tfRk9SX0dMX0VSUk9SUyAgICAgMAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBleHRlbnNpb25zIGZvciB0aGUgZnJhbWV3b3JrCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVybiAiQyIgewotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xDb2xvclBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE5vcm1hbFBvaW50ZXJCb3VuZHMoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplUG9pbnRlck9FU0JvdW5kcyhHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdHJpeEluZGV4UG9pbnRlck9FU0JvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFdlaWdodFBvaW50ZXJPRVNCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotfQotCi12b2lkIGdsQ29sb3JQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwdHIsIEdMc2l6ZWkgY291bnQpIHsKLSAgICBnbENvbG9yUG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIHB0cik7Ci19Ci12b2lkIGdsTm9ybWFsUG9pbnRlckJvdW5kcyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsTm9ybWFsUG9pbnRlcih0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotdm9pZCBnbFRleENvb3JkUG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsVGV4Q29vcmRQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci12b2lkIGdsVmVydGV4UG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsVmVydGV4UG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotCi12b2lkIEdMX0FQSUVOVFJZIGdsUG9pbnRTaXplUG9pbnRlck9FU0JvdW5kcyhHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsUG9pbnRTaXplUG9pbnRlck9FUyh0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotCi1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbE1hdHJpeEluZGV4UG9pbnRlck9FU0JvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci0KLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlck9FU0JvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsV2VpZ2h0UG9pbnRlck9FUyhzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBY3R1YWwgR0wgZW50cnktcG9pbnRzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSN1bmRlZiBBUElfRU5UUlkKLSN1bmRlZiBDQUxMX0dMX0FQSQotI3VuZGVmIENBTExfR0xfQVBJX1JFVFVSTgotCi0jaWYgVVNFX0ZBU1RfVExTX0tFWSAmJiAhQ0hFQ0tfRk9SX0dMX0VSUk9SUwotCi0gICAgI2lmZGVmIEhBVkVfQVJNX1RMU19SRUdJU1RFUgotICAgICAgICAjZGVmaW5lIEdFVF9UTFMocmVnKSBcCi0gICAgICAgICAgICAibXJjIHAxNSwgMCwgIiAjcmVnICIsIGMxMywgYzAsIDMgXG4iCi0gICAgI2Vsc2UKLSAgICAgICAgI2RlZmluZSBHRVRfVExTKHJlZykgXAotICAgICAgICAgICAgIm1vdiAgICIgI3JlZyAiLCAjMHhGRkZGMEZGRiAgICAgIFxuIiAgXAotICAgICAgICAgICAgImxkciAgICIgI3JlZyAiLCBbIiAjcmVnICIsICMtMTVdIFxuIgotICAgICNlbmRpZgotCi0gICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX19hdHRyaWJ1dGVfXygobmFrZWQpKSBfYXBpCi0KLSAgICAjZGVmaW5lIENBTExfR0xfQVBJKF9hcGksIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICBhc20gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgR0VUX1RMUyhyMTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJsZHIgICByMTIsIFtyMTIsICVbdGxzXV0gXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiY21wICAgcjEyLCAjMCAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgImxkcm5lIHBjLCAgW3IxMiwgJVthcGldXSBcbiIgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJtb3YgICByMCwgIzAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiYnggICAgbHIgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3Rsc10gIkoiKFRMU19TTE9UX09QRU5HTF9BUEkqNCksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIFthcGldICJKIihfX2J1aWx0aW5fb2Zmc2V0b2YoZ2xfaG9va3NfdCwgZ2wuX2FwaSkpICAgIFwKLSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICApOwotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSV9SRVRVUk4oX2FwaSwgLi4uKSBcCi0gICAgICAgIENBTExfR0xfQVBJKF9hcGksIF9fVkFfQVJHU19fKSBcCi0gICAgICAgIHJldHVybiAwOyAvLyBwbGFjYXRlIGdjYydzIHdhcm5pbmdzLiBuZXZlciByZWFjaGVkLgotCi0jZWxzZQotCi0gICAgI2lmIENIRUNLX0ZPUl9HTF9FUlJPUlMKLSAgICAKLSAgICAgICAgI2RlZmluZSBDSEVDS19HTF9FUlJPUlMoX2FwaSkgXAotICAgICAgICAgICAgZG8geyBHTGludCBlcnIgPSBnbEdldEVycm9yKCk7IFwKLSAgICAgICAgICAgICAgICBBTE9HRV9JRihlcnIgIT0gR0xfTk9fRVJST1IsICIlcyBmYWlsZWQgKDB4JTA0WCkiLCAjX2FwaSwgZXJyKTsgXAotICAgICAgICAgICAgfSB3aGlsZShmYWxzZSk7Ci0KLSAgICAjZWxzZQotCi0gICAgICAgICNkZWZpbmUgQ0hFQ0tfR0xfRVJST1JTKF9hcGkpIGRvIHsgfSB3aGlsZShmYWxzZSk7Ci0KLSAgICAjZW5kaWYKLQotCi0gICAgI2RlZmluZSBBUElfRU5UUlkoX2FwaSkgX2FwaQotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSShfYXBpLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyBcCi0gICAgICAgIF9jLT5fYXBpKF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENIRUNLX0dMX0VSUk9SUyhfYXBpKQotCi0gICAgI2RlZmluZSBDQUxMX0dMX0FQSV9SRVRVUk4oX2FwaSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdsX2hvb2tzX3Q6OmdsX3QgY29uc3QgKiBjb25zdCBfYyA9ICZnZXRHbFRocmVhZFNwZWNpZmljKCktPmdsOyBcCi0gICAgICAgIHJldHVybiBfYy0+X2FwaShfX1ZBX0FSR1NfXykKLQotI2VuZGlmCi0KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiZ2xfYXBpLmluIgotI2luY2x1ZGUgImdsZXh0X2FwaS5pbiIKLX0KLQotI3VuZGVmIEFQSV9FTlRSWQotI3VuZGVmIENBTExfR0xfQVBJCi0jdW5kZWYgQ0FMTF9HTF9BUElfUkVUVVJOCi0KLS8qCi0gKiBnbEdldFN0cmluZygpIGlzIHNwZWNpYWwgYmVjYXVzZSB3ZSBleHBvc2Ugc29tZSBleHRlbnNpb25zIGluIHRoZSB3cmFwcGVyCi0gKi8KLQotZXh0ZXJuICJDIiBjb25zdCBHTHVieXRlICogX19nbEdldFN0cmluZyhHTGVudW0gbmFtZSk7Ci0KLWNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyhHTGVudW0gbmFtZSkKLXsKLSAgICBjb25zdCBHTHVieXRlICogcmV0ID0gZWdsX2dldF9zdHJpbmdfZm9yX2N1cnJlbnRfY29udGV4dChuYW1lKTsKLSAgICBpZiAocmV0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0ID0gX19nbEdldFN0cmluZyhuYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfQ00vZ2xfYXBpLmluIGIvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZjZiMGMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU19DTS9nbF9hcGkuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotdm9pZCBBUElfRU5UUlkoZ2xBbHBoYUZ1bmMpKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpIHsKLSAgICBDQUxMX0dMX0FQSShnbEFscGhhRnVuYywgZnVuYywgcmVmKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJDb2xvcikoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3IsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJEZXB0aGYpKEdMY2xhbXBmIGRlcHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckRlcHRoZiwgZGVwdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGlwUGxhbmVmKShHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGlwUGxhbmVmLCBwbGFuZSwgZXF1YXRpb24pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb2xvcjRmKShHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb2xvcjRmLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlcHRoUmFuZ2VmKShHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsRGVwdGhSYW5nZWYsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRm9nZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGb2dmLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGb2dmdikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZvZ2Z2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJ1c3R1bWYpKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZydXN0dW1mLCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Q2xpcFBsYW5lZikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IGVxbls0XSkgewotICAgIENBTExfR0xfQVBJKGdsR2V0Q2xpcFBsYW5lZiwgcG5hbWUsIGVxbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZsb2F0dikoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZsb2F0diwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldExpZ2h0ZnYpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldExpZ2h0ZnYsIGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0TWF0ZXJpYWxmdikoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRNYXRlcmlhbGZ2LCBmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52ZnYpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhFbnZmdiwgZW52LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyZnYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhQYXJhbWV0ZXJmdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbGYpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbGYsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWxmdikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWxmdiwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0ZikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0ZiwgbGlnaHQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0ZnYpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0ZnYsIGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGluZVdpZHRoKShHTGZsb2F0IHdpZHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGgsIHdpZHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeGYpKGNvbnN0IEdMZmxvYXQgKm0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXhmLCBtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWxmKShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbGYsIGZhY2UsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFsZnYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWxmdiwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE11bHRNYXRyaXhmKShjb25zdCBHTGZsb2F0ICptKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNdWx0TWF0cml4ZiwgbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE11bHRpVGV4Q29vcmQ0ZikoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNdWx0aVRleENvb3JkNGYsIHRhcmdldCwgcywgdCwgciwgcSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE5vcm1hbDNmKShHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xOb3JtYWwzZiwgbngsIG55LCBueik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE9ydGhvZikoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsT3J0aG9mLCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9pbnRQYXJhbWV0ZXJmKShHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvaW50UGFyYW1ldGVyZiwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9pbnRQYXJhbWV0ZXJmdikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvaW50UGFyYW1ldGVyZnYsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFNpemUpKEdMZmxvYXQgc2l6ZSkgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXplLCBzaXplKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9seWdvbk9mZnNldCkoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSb3RhdGVmKShHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSb3RhdGVmLCBhbmdsZSwgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNjYWxlZikoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIENBTExfR0xfQVBJKGdsU2NhbGVmLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4RW52ZikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZmLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEVudmZ2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4RW52ZnYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcmYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyZiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJmdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcmZ2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUcmFuc2xhdGVmKShHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUcmFuc2xhdGVmLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEFjdGl2ZVRleHR1cmUsIHRleHR1cmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xBbHBoYUZ1bmN4KShHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xBbHBoYUZ1bmN4LCBmdW5jLCByZWYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCaW5kQnVmZmVyKShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kQnVmZmVyLCB0YXJnZXQsIGJ1ZmZlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRUZXh0dXJlKShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSkgewotICAgIENBTExfR0xfQVBJKGdsQmluZFRleHR1cmUsIHRhcmdldCwgdGV4dHVyZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJsZW5kRnVuYykoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCbGVuZEZ1bmMsIHNmYWN0b3IsIGRmYWN0b3IpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCdWZmZXJEYXRhKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCdWZmZXJEYXRhLCB0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQnVmZmVyU3ViRGF0YSkoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsQnVmZmVyU3ViRGF0YSwgdGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhcikoR0xiaXRmaWVsZCBtYXNrKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhciwgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyQ29sb3J4KShHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJDb2xvcngsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xlYXJEZXB0aHgpKEdMY2xhbXB4IGRlcHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGVhckRlcHRoeCwgZGVwdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhclN0ZW5jaWwpKEdMaW50IHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyU3RlbmNpbCwgcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsaWVudEFjdGl2ZVRleHR1cmUpKEdMZW51bSB0ZXh0dXJlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCB0ZXh0dXJlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5leCkoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikgewotICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5leCwgcGxhbmUsIGVxdWF0aW9uKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0dWIpKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbG9yNHViLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbG9yNHgpKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbG9yNHgsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29sb3JNYXNrKShHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvbG9yTWFzaywgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDb2xvclBvaW50ZXIpKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb2xvclBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENvbXByZXNzZWRUZXhJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29weVRleEltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbENvcHlUZXhJbWFnZTJELCB0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29weVRleFN1YkltYWdlMkQpKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsQ29weVRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDdWxsRmFjZSkoR0xlbnVtIG1vZGUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEN1bGxGYWNlLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlQnVmZmVycykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlbGV0ZUJ1ZmZlcnMsIG4sIGJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVUZXh0dXJlcykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVUZXh0dXJlcywgbiwgdGV4dHVyZXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aEZ1bmMpKEdMZW51bSBmdW5jKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aEZ1bmMsIGZ1bmMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aE1hc2spKEdMYm9vbGVhbiBmbGFnKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aE1hc2ssIGZsYWcpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdleCkoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2V4LCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERpc2FibGUpKEdMZW51bSBjYXApIHsKLSAgICBDQUxMX0dMX0FQSShnbERpc2FibGUsIGNhcCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERpc2FibGVDbGllbnRTdGF0ZSkoR0xlbnVtIGFycmF5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEaXNhYmxlQ2xpZW50U3RhdGUsIGFycmF5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd0FycmF5cykoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3QXJyYXlzLCBtb2RlLCBmaXJzdCwgY291bnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3RWxlbWVudHMpKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3RWxlbWVudHMsIG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRW5hYmxlKShHTGVudW0gY2FwKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFbmFibGUsIGNhcCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuYWJsZUNsaWVudFN0YXRlKShHTGVudW0gYXJyYXkpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVuYWJsZUNsaWVudFN0YXRlLCBhcnJheSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZpbmlzaCkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsRmluaXNoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRmx1c2gpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZsdXNoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRm9neCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGb2d4LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGb2d4dikoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZvZ3h2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJvbnRGYWNlKShHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsRnJvbnRGYWNlLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJ1c3R1bXgpKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZydXN0dW14LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0Qm9vbGVhbnYpKEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEJvb2xlYW52LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldENsaXBQbGFuZXgpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldENsaXBQbGFuZXgsIHBuYW1lLCBlcW4pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5CdWZmZXJzKShHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsR2VuQnVmZmVycywgbiwgYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblRleHR1cmVzKShHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlblRleHR1cmVzLCBuLCB0ZXh0dXJlcyk7Ci19Ci1HTGVudW0gQVBJX0VOVFJZKGdsR2V0RXJyb3IpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRFcnJvcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZpeGVkdikoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZpeGVkdiwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEludGVnZXJ2KShHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEludGVnZXJ2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0TGlnaHR4dikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0TGlnaHR4diwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRNYXRlcmlhbHh2KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldE1hdGVyaWFseHYsIGZhY2UsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRQb2ludGVydikoR0xlbnVtIHBuYW1lLCBHTHZvaWQgKipwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFBvaW50ZXJ2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLWNvbnN0IEdMdWJ5dGUgKiBBUElfRU5UUlkoX19nbEdldFN0cmluZykoR0xlbnVtIG5hbWUpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xHZXRTdHJpbmcsIG5hbWUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRUZXhFbnZpdikoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhFbnZpdiwgZW52LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4RW52eHYpKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRUZXhFbnZ4diwgZW52LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4UGFyYW1ldGVyaXYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyaXYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcnh2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyeHYsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEhpbnQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xIaW50LCB0YXJnZXQsIG1vZGUpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzQnVmZmVyKShHTHVpbnQgYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNCdWZmZXIsIGJ1ZmZlcik7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNFbmFibGVkKShHTGVudW0gY2FwKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNFbmFibGVkLCBjYXApOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzVGV4dHVyZSkoR0x1aW50IHRleHR1cmUpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1RleHR1cmUsIHRleHR1cmUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVseCkoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVseCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHRNb2RlbHh2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHRNb2RlbHh2LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHR4KShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHR4LCBsaWdodCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTGlnaHR4dikoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTGlnaHR4diwgbGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaW5lV2lkdGh4KShHTGZpeGVkIHdpZHRoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaW5lV2lkdGh4LCB3aWR0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExvYWRJZGVudGl0eSkodm9pZCkgewotICAgIENBTExfR0xfQVBJKGdsTG9hZElkZW50aXR5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXh4LCBtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTG9naWNPcCkoR0xlbnVtIG9wY29kZSkgewotICAgIENBTExfR0xfQVBJKGdsTG9naWNPcCwgb3Bjb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4KShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHgsIGZhY2UsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFseHYpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWx4diwgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE1hdHJpeE1vZGUpKEdMZW51bSBtb2RlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRyaXhNb2RlLCBtb2RlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdE1hdHJpeHgpKGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRNYXRyaXh4LCBtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdGlUZXhDb29yZDR4KShHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpVGV4Q29vcmQ0eCwgdGFyZ2V0LCBzLCB0LCByLCBxKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsM3gpKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopIHsKLSAgICBDQUxMX0dMX0FQSShnbE5vcm1hbDN4LCBueCwgbnksIG56KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTm9ybWFsUG9pbnRlcikoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbE5vcm1hbFBvaW50ZXIsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE9ydGhveCkoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsT3J0aG94LCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUGl4ZWxTdG9yZWkpKEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFBpeGVsU3RvcmVpLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcngpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJ4LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFBhcmFtZXRlcnh2KShHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRQYXJhbWV0ZXJ4diwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvaW50U2l6ZXgpKEdMZml4ZWQgc2l6ZSkgewotICAgIENBTExfR0xfQVBJKGdsUG9pbnRTaXpleCwgc2l6ZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFBvbHlnb25PZmZzZXR4KShHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykgewotICAgIENBTExfR0xfQVBJKGdsUG9seWdvbk9mZnNldHgsIGZhY3RvciwgdW5pdHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb3BNYXRyaXgpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvcE1hdHJpeCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFB1c2hNYXRyaXgpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFB1c2hNYXRyaXgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZWFkUGl4ZWxzKShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZWFkUGl4ZWxzLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJvdGF0ZXgpKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFJvdGF0ZXgsIGFuZ2xlLCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2FtcGxlQ292ZXJhZ2UpKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZSwgdmFsdWUsIGludmVydCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNhbXBsZUNvdmVyYWdleCkoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNhbXBsZUNvdmVyYWdleCwgdmFsdWUsIGludmVydCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFNjYWxleCkoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIENBTExfR0xfQVBJKGdsU2NhbGV4LCB4LCB5LCB6KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2Npc3NvcikoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFNjaXNzb3IsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTaGFkZU1vZGVsKShHTGVudW0gbW9kZSkgewotICAgIENBTExfR0xfQVBJKGdsU2hhZGVNb2RlbCwgbW9kZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxGdW5jKShHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbEZ1bmMsIGZ1bmMsIHJlZiwgbWFzayk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFN0ZW5jaWxNYXNrKShHTHVpbnQgbWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbE1hc2ssIG1hc2spOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTdGVuY2lsT3ApKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcykgewotICAgIENBTExfR0xfQVBJKGdsU3RlbmNpbE9wLCBmYWlsLCB6ZmFpbCwgenBhc3MpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhDb29yZFBvaW50ZXIpKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhDb29yZFBvaW50ZXIsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEVudmkpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEVudmksIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4RW52eCkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhFbnZ4LCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEVudml2KShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEVudml2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4dikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEVudnh2LCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhJbWFnZTJEKShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykgewotICAgIENBTExfR0xfQVBJKGdsVGV4SW1hZ2UyRCwgdGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpLCB0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFBhcmFtZXRlcngpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4UGFyYW1ldGVyeCwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJpdikoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJpdiwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyeHYpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJ4diwgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN1YkltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRleCkoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRleCwgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFZlcnRleFBvaW50ZXIpKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xWZXJ0ZXhQb2ludGVyLCBzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xWaWV3cG9ydCkoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFZpZXdwb3J0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9pbnRTaXplUG9pbnRlck9FUykoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvaW50U2l6ZVBvaW50ZXJPRVMsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX0NNL2dsZXh0X2FwaS5pbiBiL29wZW5nbC9saWJzL0dMRVNfQ00vZ2xleHRfYXBpLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Q2Y2I1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfQ00vZ2xleHRfYXBpLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTKShHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTLCBtb2RlUkdCLCBtb2RlQWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUykoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJsZW5kRnVuY1NlcGFyYXRlT0VTLCBzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmxlbmRFcXVhdGlvbk9FUykoR0xlbnVtIG1vZGUpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJsZW5kRXF1YXRpb25PRVMsIG1vZGUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4c09FUykoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhzT0VTLCB4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGlPRVMpKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhpT0VTLCB4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleHhPRVMpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4eE9FUywgeCwgeSwgeiwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdUZXhzdk9FUykoY29uc3QgR0xzaG9ydCAqY29vcmRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEcmF3VGV4c3ZPRVMsIGNvb3Jkcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERyYXdUZXhpdk9FUykoY29uc3QgR0xpbnQgKmNvb3JkcykgewotICAgIENBTExfR0xfQVBJKGdsRHJhd1RleGl2T0VTLCBjb29yZHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4eHZPRVMpKGNvbnN0IEdMZml4ZWQgKmNvb3JkcykgewotICAgIENBTExfR0xfQVBJKGdsRHJhd1RleHh2T0VTLCBjb29yZHMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEcmF3VGV4Zk9FUykoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhmT0VTLCB4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRHJhd1RleGZ2T0VTKShjb25zdCBHTGZsb2F0ICpjb29yZHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbERyYXdUZXhmdk9FUywgY29vcmRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMpKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCB0YXJnZXQsIGltYWdlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKShHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIHRhcmdldCwgaW1hZ2UpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xBbHBoYUZ1bmN4T0VTKShHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xBbHBoYUZ1bmN4T0VTLCBmdW5jLCByZWYpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhckNvbG9yeE9FUykoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyQ29sb3J4T0VTLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsZWFyRGVwdGh4T0VTKShHTGNsYW1weCBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsQ2xlYXJEZXB0aHhPRVMsIGRlcHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ2xpcFBsYW5leE9FUykoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbikgewotICAgIENBTExfR0xfQVBJKGdsQ2xpcFBsYW5leE9FUywgcGxhbmUsIGVxdWF0aW9uKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ29sb3I0eE9FUykoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSkgewotICAgIENBTExfR0xfQVBJKGdsQ29sb3I0eE9FUywgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZXB0aFJhbmdleE9FUykoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbERlcHRoUmFuZ2V4T0VTLCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZvZ3hPRVMpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsRm9neE9FUywgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRm9neHZPRVMpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGb2d4dk9FUywgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZydXN0dW14T0VTKShHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcnVzdHVteE9FUywgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldENsaXBQbGFuZXhPRVMpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldENsaXBQbGFuZXhPRVMsIHBuYW1lLCBlcW4pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRGaXhlZHZPRVMpKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRGaXhlZHZPRVMsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRMaWdodHh2T0VTKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRMaWdodHh2T0VTLCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldE1hdGVyaWFseHZPRVMpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0TWF0ZXJpYWx4dk9FUywgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleEVudnh2T0VTKShHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4RW52eHZPRVMsIGVudiwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleFBhcmFtZXRlcnh2T0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4UGFyYW1ldGVyeHZPRVMsIHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpZ2h0TW9kZWx4T0VTKShHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExpZ2h0TW9kZWx4T0VTLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodE1vZGVseHZPRVMpKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodE1vZGVseHZPRVMsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodHhPRVMpKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHhPRVMsIGxpZ2h0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMaWdodHh2T0VTKShHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xMaWdodHh2T0VTLCBsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbExpbmVXaWR0aHhPRVMpKEdMZml4ZWQgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbExpbmVXaWR0aHhPRVMsIHdpZHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTG9hZE1hdHJpeHhPRVMpKGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBDQUxMX0dMX0FQSShnbExvYWRNYXRyaXh4T0VTLCBtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTWF0ZXJpYWx4T0VTKShHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNYXRlcmlhbHhPRVMsIGZhY2UsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE1hdGVyaWFseHZPRVMpKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsTWF0ZXJpYWx4dk9FUywgZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE11bHRNYXRyaXh4T0VTKShjb25zdCBHTGZpeGVkICptKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNdWx0TWF0cml4eE9FUywgbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE11bHRpVGV4Q29vcmQ0eE9FUykoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xNdWx0aVRleENvb3JkNHhPRVMsIHRhcmdldCwgcywgdCwgciwgcSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE5vcm1hbDN4T0VTKShHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xOb3JtYWwzeE9FUywgbngsIG55LCBueik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE9ydGhveE9FUykoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsT3J0aG94T0VTLCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9pbnRQYXJhbWV0ZXJ4T0VTKShHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvaW50UGFyYW1ldGVyeE9FUywgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUG9pbnRQYXJhbWV0ZXJ4dk9FUykoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvaW50UGFyYW1ldGVyeHZPRVMsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2ludFNpemV4T0VTKShHTGZpeGVkIHNpemUpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvaW50U2l6ZXhPRVMsIHNpemUpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xQb2x5Z29uT2Zmc2V0eE9FUykoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFBvbHlnb25PZmZzZXR4T0VTLCBmYWN0b3IsIHVuaXRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUm90YXRleE9FUykoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIENBTExfR0xfQVBJKGdsUm90YXRleE9FUywgYW5nbGUsIHgsIHksIHopOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTYW1wbGVDb3ZlcmFnZXhPRVMpKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTYW1wbGVDb3ZlcmFnZXhPRVMsIHZhbHVlLCBpbnZlcnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTY2FsZXhPRVMpKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKLSAgICBDQUxMX0dMX0FQSShnbFNjYWxleE9FUywgeCwgeSwgeik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEVudnhPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4RW52eE9FUywgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhFbnZ4dk9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEVudnh2T0VTLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhQYXJhbWV0ZXJ4T0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFBhcmFtZXRlcnhPRVMsIHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4UGFyYW1ldGVyeHZPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhQYXJhbWV0ZXJ4dk9FUywgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVHJhbnNsYXRleE9FUykoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIENBTExfR0xfQVBJKGdsVHJhbnNsYXRleE9FUywgeCwgeSwgeik7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsSXNSZW5kZXJidWZmZXJPRVMpKEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xJc1JlbmRlcmJ1ZmZlck9FUywgcmVuZGVyYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZFJlbmRlcmJ1ZmZlck9FUykoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJKGdsQmluZFJlbmRlcmJ1ZmZlck9FUywgdGFyZ2V0LCByZW5kZXJidWZmZXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUywgbiwgcmVuZGVyYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblJlbmRlcmJ1ZmZlcnNPRVMpKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZW5SZW5kZXJidWZmZXJzT0VTLCBuLCByZW5kZXJidWZmZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgdGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTLCB0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzRnJhbWVidWZmZXJPRVMpKEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzRnJhbWVidWZmZXJPRVMsIGZyYW1lYnVmZmVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQmluZEZyYW1lYnVmZmVyT0VTKShHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbEJpbmRGcmFtZWJ1ZmZlck9FUywgdGFyZ2V0LCBmcmFtZWJ1ZmZlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZUZyYW1lYnVmZmVyc09FUykoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycykgewotICAgIENBTExfR0xfQVBJKGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTLCBuLCBmcmFtZWJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMpKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlbkZyYW1lYnVmZmVyc09FUywgbiwgZnJhbWVidWZmZXJzKTsKLX0KLUdMZW51bSBBUElfRU5UUlkoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKShHTGVudW0gdGFyZ2V0KSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUywgdGFyZ2V0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUywgdGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUywgdGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTLCB0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZW5lcmF0ZU1pcG1hcE9FUykoR0xlbnVtIHRhcmdldCkgewotICAgIENBTExfR0xfQVBJKGdsR2VuZXJhdGVNaXBtYXBPRVMsIHRhcmdldCk7Ci19Ci12b2lkKiBBUElfRU5UUlkoZ2xNYXBCdWZmZXJPRVMpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpIHsKLSAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xNYXBCdWZmZXJPRVMsIHRhcmdldCwgYWNjZXNzKTsKLX0KLUdMYm9vbGVhbiBBUElfRU5UUlkoZ2xVbm1hcEJ1ZmZlck9FUykoR0xlbnVtIHRhcmdldCkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbFVubWFwQnVmZmVyT0VTLCB0YXJnZXQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xHZXRCdWZmZXJQb2ludGVydk9FUykoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKiogcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRCdWZmZXJQb2ludGVydk9FUywgdGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMpKEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpIHsKLSAgICBDQUxMX0dMX0FQSShnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTLCBtYXRyaXhwYWxldHRlaW5kZXgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMpKHZvaWQpIHsKLSAgICBDQUxMX0dMX0FQSShnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbE1hdHJpeEluZGV4UG9pbnRlck9FUykoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbE1hdHJpeEluZGV4UG9pbnRlck9FUywgc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsV2VpZ2h0UG9pbnRlck9FUykoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbFdlaWdodFBvaW50ZXJPRVMsIHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci19Ci1HTGJpdGZpZWxkIEFQSV9FTlRSWShnbFF1ZXJ5TWF0cml4eE9FUykoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbFF1ZXJ5TWF0cml4eE9FUywgbWFudGlzc2EsIGV4cG9uZW50KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVwdGhSYW5nZWZPRVMpKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZXB0aFJhbmdlZk9FUywgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcnVzdHVtZk9FUykoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIENBTExfR0xfQVBJKGdsRnJ1c3R1bWZPRVMsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xPcnRob2ZPRVMpKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKLSAgICBDQUxMX0dMX0FQSShnbE9ydGhvZk9FUywgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsaXBQbGFuZWZPRVMpKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pIHsKLSAgICBDQUxMX0dMX0FQSShnbENsaXBQbGFuZWZPRVMsIHBsYW5lLCBlcXVhdGlvbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldENsaXBQbGFuZWZPRVMpKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldENsaXBQbGFuZWZPRVMsIHBuYW1lLCBlcW4pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xDbGVhckRlcHRoZk9FUykoR0xjbGFtcGYgZGVwdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbENsZWFyRGVwdGhmT0VTLCBkZXB0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEdlbmZPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xUZXhHZW5mT0VTLCBjb29yZCwgcG5hbWUsIHBhcmFtKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4R2VuZnZPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEdlbmZ2T0VTLCBjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEdlbmlPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSkgewotICAgIENBTExfR0xfQVBJKGdsVGV4R2VuaU9FUywgY29vcmQsIHBuYW1lLCBwYXJhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleEdlbml2T0VTKShHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4R2VuaXZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4R2VueE9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleEdlbnhPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhHZW54dk9FUykoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsVGV4R2VueHZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4R2VuZnZPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleEdlbmZ2T0VTLCBjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldFRleEdlbml2T0VTKShHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIENBTExfR0xfQVBJKGdsR2V0VGV4R2VuaXZPRVMsIGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0VGV4R2VueHZPRVMpKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldFRleEdlbnh2T0VTLCBjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEJpbmRWZXJ0ZXhBcnJheU9FUykoR0x1aW50IGFycmF5KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xCaW5kVmVydGV4QXJyYXlPRVMsIGFycmF5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYXJyYXlzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMsIG4sIGFycmF5cyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdlblZlcnRleEFycmF5c09FUykoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cykgewotICAgIENBTExfR0xfQVBJKGdsR2VuVmVydGV4QXJyYXlzT0VTLCBuLCBhcnJheXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzVmVydGV4QXJyYXlPRVMpKEdMdWludCBhcnJheSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbElzVmVydGV4QXJyYXlPRVMsIGFycmF5KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIENBTExfR0xfQVBJKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUsIHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFKSh2b2lkKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQsIHRhcmdldCwgbnVtQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCwgdGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykgewotICAgIENBTExfR0xfQVBJKGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCwgdGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCBzYW1wbGVzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsTXVsdGlEcmF3QXJyYXlzRVhUKShHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpRHJhd0FycmF5c0VYVCwgbW9kZSwgZmlyc3QsIGNvdW50LCBwcmltY291bnQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xNdWx0aURyYXdFbGVtZW50c0VYVCkoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpIHsKLSAgICBDQUxMX0dMX0FQSShnbE11bHRpRHJhd0VsZW1lbnRzRVhULCBtb2RlLCBjb3VudCwgdHlwZSwgaW5kaWNlcywgcHJpbWNvdW50KTsKLX0KLUdMZW51bSBBUElfRU5UUlkoZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUKSh2b2lkKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlYWRuUGl4ZWxzRVhUKShHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSkgewotICAgIENBTExfR0xfQVBJKGdsUmVhZG5QaXhlbHNFWFQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgYnVmU2l6ZSwgZGF0YSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldG5Vbmlmb3JtZnZFWFQpKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBidWZTaXplLCBmbG9hdCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xHZXRuVW5pZm9ybWZ2RVhULCBwcm9ncmFtLCBsb2NhdGlvbiwgYnVmU2l6ZSwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0blVuaWZvcm1pdkVYVCkoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldG5Vbmlmb3JtaXZFWFQsIHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXhTdG9yYWdlMURFWFQpKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN0b3JhZ2UxREVYVCwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleFN0b3JhZ2UyREVYVCkoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleFN0b3JhZ2UyREVYVCwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4U3RvcmFnZTNERVhUKShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4U3RvcmFnZTNERVhULCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsVGV4dHVyZVN0b3JhZ2UxREVYVCkoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleHR1cmVTdG9yYWdlMURFWFQsIHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xUZXh0dXJlU3RvcmFnZTJERVhUKShHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBDQUxMX0dMX0FQSShnbFRleHR1cmVTdG9yYWdlMkRFWFQsIHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFRleHR1cmVTdG9yYWdlM0RFWFQpKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCkgewotICAgIENBTExfR0xfQVBJKGdsVGV4dHVyZVN0b3JhZ2UzREVYVCwgdGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsaXBQbGFuZWZJTUcpKEdMZW51bSBwLCBjb25zdCBHTGZsb2F0ICplcW4pIHsKLSAgICBDQUxMX0dMX0FQSShnbENsaXBQbGFuZWZJTUcsIHAsIGVxbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbENsaXBQbGFuZXhJTUcpKEdMZW51bSBwLCBjb25zdCBHTGZpeGVkICplcW4pIHsKLSAgICBDQUxMX0dMX0FQSShnbENsaXBQbGFuZXhJTUcsIHAsIGVxbik7Ci19Ci12b2lkIEFQSV9FTlRSWShnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRykoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcsIHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HKShHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcsIHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbERlbGV0ZUZlbmNlc05WKShHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEZWxldGVGZW5jZXNOViwgbiwgZmVuY2VzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2VuRmVuY2VzTlYpKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdlbkZlbmNlc05WLCBuLCBmZW5jZXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbElzRmVuY2VOVikoR0x1aW50IGZlbmNlKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsSXNGZW5jZU5WLCBmZW5jZSk7Ci19Ci1HTGJvb2xlYW4gQVBJX0VOVFJZKGdsVGVzdEZlbmNlTlYpKEdMdWludCBmZW5jZSkgewotICAgIENBTExfR0xfQVBJX1JFVFVSTihnbFRlc3RGZW5jZU5WLCBmZW5jZSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldEZlbmNlaXZOVikoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldEZlbmNlaXZOViwgZmVuY2UsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xGaW5pc2hGZW5jZU5WKShHTHVpbnQgZmVuY2UpIHsKLSAgICBDQUxMX0dMX0FQSShnbEZpbmlzaEZlbmNlTlYsIGZlbmNlKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsU2V0RmVuY2VOVikoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xTZXRGZW5jZU5WLCBmZW5jZSwgY29uZGl0aW9uKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NKShHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEdldERyaXZlckNvbnRyb2xzUUNPTSwgbnVtLCBzaXplLCBkcml2ZXJDb250cm9scyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NKShHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZykgewotICAgIENBTExfR0xfQVBJKGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIGRyaXZlckNvbnRyb2wsIGJ1ZlNpemUsIGxlbmd0aCwgZHJpdmVyQ29udHJvbFN0cmluZyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NKShHTHVpbnQgZHJpdmVyQ29udHJvbCkgewotICAgIENBTExfR0xfQVBJKGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00sIGRyaXZlckNvbnRyb2wpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00pKEdMdWludCBkcml2ZXJDb250cm9sKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00sIGRyaXZlckNvbnRyb2wpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRUZXh0dXJlc1FDT00pKEdMdWludCAqdGV4dHVyZXMsIEdMaW50IG1heFRleHR1cmVzLCBHTGludCAqbnVtVGV4dHVyZXMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFRleHR1cmVzUUNPTSwgdGV4dHVyZXMsIG1heFRleHR1cmVzLCBudW1UZXh0dXJlcyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldEJ1ZmZlcnNRQ09NKShHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRCdWZmZXJzUUNPTSwgYnVmZmVycywgbWF4QnVmZmVycywgbnVtQnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NKShHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSwgcmVuZGVyYnVmZmVycywgbWF4UmVuZGVyYnVmZmVycywgbnVtUmVuZGVyYnVmZmVycyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00pKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00sIGZyYW1lYnVmZmVycywgbWF4RnJhbWVidWZmZXJzLCBudW1GcmFtZWJ1ZmZlcnMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSkoR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSwgdGV4dHVyZSwgZmFjZSwgbGV2ZWwsIHBuYW1lLCBwYXJhbXMpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00pKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSwgdGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00pKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00sIHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIHRleGVscyk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSkoR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00sIHRhcmdldCwgcGFyYW1zKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0U2hhZGVyc1FDT00pKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpIHsKLSAgICBDQUxMX0dMX0FQSShnbEV4dEdldFNoYWRlcnNRQ09NLCBzaGFkZXJzLCBtYXhTaGFkZXJzLCBudW1TaGFkZXJzKTsKLX0KLXZvaWQgQVBJX0VOVFJZKGdsRXh0R2V0UHJvZ3JhbXNRQ09NKShHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRQcm9ncmFtc1FDT00sIHByb2dyYW1zLCBtYXhQcm9ncmFtcywgbnVtUHJvZ3JhbXMpOwotfQotR0xib29sZWFuIEFQSV9FTlRSWShnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00pKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgQ0FMTF9HTF9BUElfUkVUVVJOKGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgcHJvZ3JhbSk7Ci19Ci12b2lkIEFQSV9FTlRSWShnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKShHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKSB7Ci0gICAgQ0FMTF9HTF9BUEkoZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSwgcHJvZ3JhbSwgc2hhZGVydHlwZSwgc291cmNlLCBsZW5ndGgpOwotfQotdm9pZCBBUElfRU5UUlkoZ2xTdGFydFRpbGluZ1FDT00pKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykgewotICAgIENBTExfR0xfQVBJKGdsU3RhcnRUaWxpbmdRQ09NLCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVzZXJ2ZU1hc2spOwotfQotdm9pZCBBUElfRU5UUlkoZ2xFbmRUaWxpbmdRQ09NKShHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykgewotICAgIENBTExfR0xfQVBJKGdsRW5kVGlsaW5nUUNPTSwgcHJlc2VydmVNYXNrKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvLmdpdGlnbm9yZSBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmODI1ZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWphdmEKLSoucHljCi0qLnN3cAotcHlyYXRlbXAucHkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvQW5kcm9pZC5tayBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1YjZiMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3JjL2dsdHJhY2VfYXBpLmNwcCBcCi0gICAgc3JjL2dsdHJhY2VfY29udGV4dC5jcHAgXAotICAgIHNyYy9nbHRyYWNlX2VnbC5jcHAgXAotICAgIHNyYy9nbHRyYWNlX2VnbGFwaS5jcHAgXAotICAgIHNyYy9nbHRyYWNlX2ZpeHVwLmNwcCBcCi0gICAgc3JjL2dsdHJhY2VfaG9va3MuY3BwIFwKLSAgICBzcmMvZ2x0cmFjZS5wYi5jcHAgXAotICAgIHNyYy9nbHRyYWNlX3RyYW5zcG9ydC5jcHAKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChMT0NBTF9QQVRIKSBcCi0gICAgJChMT0NBTF9QQVRIKS8uLi8gXAotICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCi0gICAgZXh0ZXJuYWwvcHJvdG9idWYvc3JjIFwKLSAgICBleHRlcm5hbCBcCi0gICAgYmlvbmljCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdPT0dMRV9QUk9UT0JVRl9OT19SVFRJCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnByb3RvYnVmLWNwcC0yLjMuMC1saXRlIGxpYmx6ZgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjdXRpbHMgbGlidXRpbHMgbGlic3RscG9ydAotCi1pZmVxICgkKEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSKSx0cnVlKQotICAgIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLQotTE9DQUxfQ0ZMQUdTICs9IC1ETE9HX1RBRz1cImxpYkdMRVNfdHJhY2VcIgotCi0jIHdlIG5lZWQgdG8gYWNjZXNzIHRoZSBwcml2YXRlIEJpb25pYyBoZWFkZXIgPGJpb25pY190bHMuaD4KLSMgb24gQVJNIHBsYXRmb3Jtcywgd2UgbmVlZCB0byBtaXJyb3IgdGhlIEFSQ0hfQVJNX0hBVkVfVExTX1JFR0lTVEVSCi0jIGJlaGF2aW9yIGZyb20gdGhlIGJpb25pYyBBbmRyb2lkLm1rIGZpbGUKLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLSQoQVJDSF9BUk1fSEFWRV9UTFNfUkVHSVNURVIpLGFybS10cnVlKQotICAgIExPQ0FMX0NGTEFHUyArPSAtREhBVkVfQVJNX1RMU19SRUdJU1RFUgotZW5kaWYKLUxPQ0FMX0NfSU5DTFVERVMgKz0gYmlvbmljL2xpYmMvcHJpdmF0ZQotCi1MT0NBTF9NT0RVTEU6PSBsaWJHTEVTX3RyYWNlCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL0RFU0lHTi50eHQgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL0RFU0lHTi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODllMWQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9ERVNJR04udHh0CisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotRGVzaWduIG9mIHRoZSBHTEVTIFRyYWNpbmcgTGlicmFyeQotCi1Db2RlIFJ1bnRpbWUgQmVoYXZpb3I6Ci0KLSAgICBJbml0aWFsaXphdGlvbjoKLSAgICAKLSAgICBlZ2xfZGlzcGxheV90Ojppbml0aWFsaXplKCkgY2FsbHMgaW5pdEVnbFRyYWNlTGV2ZWwoKSB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdHJhY2luZyBzaG91bGQgYmUKLSAgICBlbmFibGVkLiBDdXJyZW50bHksIHRoZSBzaGVsbCBwcm9wZXJ0aWVzICJkZWJ1Zy5lZ2wudHJhY2UiIGFuZCAiZGVidWcuZWdsLmRlYnVnX3Byb2MiIHRvZ2V0aGVyCi0gICAgY29udHJvbCB3aGV0aGVyIHRyYWNpbmcgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIGEgY2VydGFpbiBwcm9jZXNzLiBJZiB0cmFjaW5nIGlzIGVuYWJsZWQsIHRoaXMKLSAgICBjYWxscyBHTFRyYWNlX3N0YXJ0KCkgdG8gc3RhcnQgdGhlIHRyYWNlIHNlcnZlci4KLSAgICAKLSAgICBOb3RlIHRoYXQgaW5pdEVnbFRyYWNlTGV2ZWwoKSBpcyBhbHNvIGNhbGxlZCBmcm9tIGVhcmx5X2VnbF9pbml0KCksIGJ1dCB0aGF0IGhhcHBlbnMgaW4gdGhlCi0gICAgY29udGV4dCBvZiB0aGUgenlnb3RlLCBzbyB0aGF0IGludm9jYXRpb24gaGFzIG5vIGVmZmVjdC4KLSAgICAKLSAgICBlZ2xfZGlzcGxheV90Ojppbml0aWFsaXplKCkgdGhlbiBjYWxscyBzZXRHTEhvb2tzVGhyZWFkU3BlY2lmaWMoKSB3aGVyZSB3ZSBzZXQgdGhlIHRocmVhZAotICAgIHNwZWNpZmljIGdsX2hvb2tzIHN0cnVjdHVyZSB0byBwb2ludCB0byB0aGUgdHJhY2UgaW1wbGVtZW50YXRpb24uIEZyb20gdGhpcyBwb2ludCBvbiwgZXZlcnkKLSAgICBHTEVTIGNhbGwgaXMgcmVkaXJlY3RlZCB0byB0aGUgdHJhY2UgaW1wbGVtZW50YXRpb24uCi0gICAgCi0gICAgQXBwbGljYXRpb24gcnVudGltZToKLQotICAgIFdoaWxlIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLCBhbGwgaXRzIEdMRVMgY2FsbHMgYXJlIGRpcmVjdGx5IHJvdXRlZCB0byB0aGVpciBjb3JyZXNwb25kaW5nCi0gICAgdHJhY2UgaW1wbGVtZW50YXRpb24uCi0KLSAgICBGb3IgRUdMIGNhbGxzLCB0aGUgdHJhY2UgbGlicmFyeSBwcm92aWRlcyBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyB0aGF0IG11c3QgYmUgZXhwbGljaXRseSBjYWxsZWQKLSAgICBmcm9tIHRoZSBFR0wgbGlicmFyeS4gVGhlc2UgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBpbiBnbGVzdHJhY2UuaAotCi0gICAgQXBwbGljYXRpb24gc2h1dGRvd246Ci0KLSAgICBDdXJyZW50bHksIHRoZSBhcHBsaWNhdGlvbiBpcyBraWxsZWQgd2hlbiB0aGUgdXNlciBzdG9wcyB0cmFjaW5nIGZyb20gdGhlIGZyb250ZW5kIEdVSS4gV2UgbmVlZAotICAgIHRvIGV4cGxvcmUgaWYgYSBtb3JlIGdyYWNlZnVsIG1ldGhvZCBvZiBzdG9wcGluZyB0aGUgYXBwbGljYXRpb24sIG9yIGRldGFjaGluZyB0cmFjaW5nIGZyb20gdGhlCi0gICAgYXBwbGljYXRpb24gaXMgcmVxdWlyZWQuCi0KLUNvZGUgU3RydWN0dXJlOgotCi0gICAgZ2xlc3RyYWNlLmggZGVjbGFyZXMgYWxsIHRoZSBob29rcyBleHBvc2VkIGJ5IGxpYmdsZXN0cmFjZS4gVGhlc2UgYXJlIHVzZWQgYnkgRUdML2VnbC5jcHAgYW5kCi0gICAgRUdML2VnbEFwaS5jcHAgdG8gaW5pdGlhbGl6ZSB0aGUgdHJhY2UgbGlicmFyeSwgYW5kIHRvIGluZm9ybSB0aGUgbGlicmFyeSBvZiBFR0wgY2FsbHMuCi0KLSAgICBBbGwgR0wgY2FsbHMgYXJlIHByZXNlbnQgaW4gR0xFU19UcmFjZS9zcmMvZ2x0cmFjZV9hcGkuY3BwLiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZQotICAgIEdMRVNfVHJhY2Uvc3JjL2dlbmFwaS5weSBzY3JpcHQuIFRoZSBzdHJ1Y3R1cmUgb2YgYWxsIHRoZSBmdW5jdGlvbnMgbG9va3MgbGlrZSB0aGlzOgotCi0gICAgICAgICAgICB2b2lkIEdMVHJhY2VfZ2xGdW5jdGlvbihhcmdzKSB7Ci0gICAgICAgICAgICAgICAgLy8gZGVjbGFyZSBhIHByb3RvYnVmCi0gICAgICAgICAgICAgICAgLy8gY29weSBhcmd1bWVudHMgaW50byB0aGUgcHJvdG9idWYKLSAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBvcmlnaW5hbCBHTEVTIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSByZXR1cm4gdmFsdWUsIHNhdmUgaXQgaW50byB0aGUgcHJvdG9idWYKLSAgICAgICAgICAgICAgICAvLyBmaXh1cCB0aGUgcHJvdG9idWYgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAgICAgLy8gdHJhbnNwb3J0IHRoZSBwcm90b2J1ZiB0byB0aGUgaG9zdAotICAgICAgICAgICAgfQotCi0gICAgVGhlIGZpeHVwR0xNZXNzYWdlKCkgY2FsbCBkb2VzIGFueSBjdXN0b20gcHJvY2Vzc2luZyBvZiB0aGUgcHJvdG9idWYgYmFzZWQgb24gdGhlIEdMRVMgY2FsbC4KLSAgICBUaGlzIHR5cGljYWxseSBhbW91bnRzIHRvIGNvcHlpbmcgdGhlIGRhdGEgY29ycmVzcG9uZGluZyB0byBpbnB1dCBvciBvdXRwdXQgcG9pbnRlcnMuCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL2Rldi5tYWtlIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9kZXYubWFrZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2MjYwYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL2Rldi5tYWtlCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMgTk9URQotIyMgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIGRldmVsb3BtZW50IHB1cnBvc2VzIG9ubHkuIEl0IGlzIG5vdCB1c2VkIGJ5IHRoZSBidWlsZCBzeXN0ZW0uCi0KLSMgZ2VuZXJhdGUgcHJvdG9jb2wgYnVmZmVyIGZpbGVzCi1nZW5wcm90bzogZ2x0cmFjZS5wcm90bwotCWFwcm90b2MgLS1jcHBfb3V0PXNyYyAtLWphdmFfb3V0PWphdmEgZ2x0cmFjZS5wcm90bwotCW12IHNyYy9nbHRyYWNlLnBiLmNjIHNyYy9nbHRyYWNlLnBiLmNwcAotCi1zeW5jOgotCWFkYiByb290Ci0JYWRiIHJlbW91bnQKLQlhZGIgc2hlbGwgc3RvcAotCWFkYiBzeW5jCi0JYWRiIHNoZWxsIHN0YXJ0CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL2dsdHJhY2UucHJvdG8gYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL2dsdHJhY2UucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjM1NTQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9nbHRyYWNlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuZ2x0cmFjZTsKLQotb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uYW5kcm9pZC5pZGUuZWNsaXBzZS5nbHRyYWNlIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJHTFByb3RvQnVmIjsKLQotbWVzc2FnZSBHTE1lc3NhZ2UgewotICAgIGVudW0gRnVuY3Rpb24gewotICAgICAgICBnbEFjdGl2ZVRleHR1cmUgPSAwOwotICAgICAgICBnbEFscGhhRnVuYyA9IDE7Ci0gICAgICAgIGdsQWxwaGFGdW5jeCA9IDI7Ci0gICAgICAgIGdsQWxwaGFGdW5jeE9FUyA9IDM7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyID0gNDsKLSAgICAgICAgZ2xCZWdpblBlcmZNb25pdG9yQU1EID0gNTsKLSAgICAgICAgZ2xCaW5kQXR0cmliTG9jYXRpb24gPSA2OwotICAgICAgICBnbEJpbmRCdWZmZXIgPSA3OwotICAgICAgICBnbEJpbmRGcmFtZWJ1ZmZlciA9IDg7Ci0gICAgICAgIGdsQmluZEZyYW1lYnVmZmVyT0VTID0gOTsKLSAgICAgICAgZ2xCaW5kUmVuZGVyYnVmZmVyID0gMTA7Ci0gICAgICAgIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyA9IDExOwotICAgICAgICBnbEJpbmRUZXh0dXJlID0gMTI7Ci0gICAgICAgIGdsQmluZFZlcnRleEFycmF5T0VTID0gMTM7Ci0gICAgICAgIGdsQmxlbmRDb2xvciA9IDE0OwotICAgICAgICBnbEJsZW5kRXF1YXRpb24gPSAxNTsKLSAgICAgICAgZ2xCbGVuZEVxdWF0aW9uT0VTID0gMTY7Ci0gICAgICAgIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlID0gMTc7Ci0gICAgICAgIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTID0gMTg7Ci0gICAgICAgIGdsQmxlbmRGdW5jID0gMTk7Ci0gICAgICAgIGdsQmxlbmRGdW5jU2VwYXJhdGUgPSAyMDsKLSAgICAgICAgZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyA9IDIxOwotICAgICAgICBnbEJ1ZmZlckRhdGEgPSAyMjsKLSAgICAgICAgZ2xCdWZmZXJTdWJEYXRhID0gMjM7Ci0gICAgICAgIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyA9IDI0OwotICAgICAgICBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgPSAyNTsKLSAgICAgICAgZ2xDbGVhckNvbG9yID0gMjY7Ci0gICAgICAgIGdsQ2xlYXJDb2xvcnggPSAyNzsKLSAgICAgICAgZ2xDbGVhckNvbG9yeE9FUyA9IDI4OwotICAgICAgICBnbENsZWFyRGVwdGhmID0gMjk7Ci0gICAgICAgIGdsQ2xlYXJEZXB0aGZPRVMgPSAzMDsKLSAgICAgICAgZ2xDbGVhckRlcHRoeCA9IDMxOwotICAgICAgICBnbENsZWFyRGVwdGh4T0VTID0gMzI7Ci0gICAgICAgIGdsQ2xlYXIgPSAzMzsKLSAgICAgICAgZ2xDbGVhclN0ZW5jaWwgPSAzNDsKLSAgICAgICAgZ2xDbGllbnRBY3RpdmVUZXh0dXJlID0gMzU7Ci0gICAgICAgIGdsQ2xpcFBsYW5lZiA9IDM2OwotICAgICAgICBnbENsaXBQbGFuZWZJTUcgPSAzNzsKLSAgICAgICAgZ2xDbGlwUGxhbmVmT0VTID0gMzg7Ci0gICAgICAgIGdsQ2xpcFBsYW5leCA9IDM5OwotICAgICAgICBnbENsaXBQbGFuZXhJTUcgPSA0MDsKLSAgICAgICAgZ2xDbGlwUGxhbmV4T0VTID0gNDE7Ci0gICAgICAgIGdsQ29sb3I0ZiA9IDQyOwotICAgICAgICBnbENvbG9yNHViID0gNDM7Ci0gICAgICAgIGdsQ29sb3I0eCA9IDQ0OwotICAgICAgICBnbENvbG9yNHhPRVMgPSA0NTsKLSAgICAgICAgZ2xDb2xvck1hc2sgPSA0NjsKLSAgICAgICAgZ2xDb2xvclBvaW50ZXIgPSA0NzsKLSAgICAgICAgZ2xDb21waWxlU2hhZGVyID0gNDg7Ci0gICAgICAgIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgPSA0OTsKLSAgICAgICAgZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRE9FUyA9IDUwOwotICAgICAgICBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEID0gNTE7Ci0gICAgICAgIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMgPSA1MjsKLSAgICAgICAgZ2xDb3B5VGV4SW1hZ2UyRCA9IDUzOwotICAgICAgICBnbENvcHlUZXhTdWJJbWFnZTJEID0gNTQ7Ci0gICAgICAgIGdsQ29weVRleFN1YkltYWdlM0RPRVMgPSA1NTsKLSAgICAgICAgZ2xDb3ZlcmFnZU1hc2tOViA9IDU2OwotICAgICAgICBnbENvdmVyYWdlT3BlcmF0aW9uTlYgPSA1NzsKLSAgICAgICAgZ2xDcmVhdGVQcm9ncmFtID0gNTg7Ci0gICAgICAgIGdsQ3JlYXRlU2hhZGVyID0gNTk7Ci0gICAgICAgIGdsQ3VsbEZhY2UgPSA2MDsKLSAgICAgICAgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyA9IDYxOwotICAgICAgICBnbERlbGV0ZUJ1ZmZlcnMgPSA2MjsKLSAgICAgICAgZ2xEZWxldGVGZW5jZXNOViA9IDYzOwotICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVycyA9IDY0OwotICAgICAgICBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyA9IDY1OwotICAgICAgICBnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCA9IDY2OwotICAgICAgICBnbERlbGV0ZVByb2dyYW0gPSA2NzsKLSAgICAgICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzID0gNjg7Ci0gICAgICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyA9IDY5OwotICAgICAgICBnbERlbGV0ZVNoYWRlciA9IDcwOwotICAgICAgICBnbERlbGV0ZVRleHR1cmVzID0gNzE7Ci0gICAgICAgIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTID0gNzI7Ci0gICAgICAgIGdsRGVwdGhGdW5jID0gNzM7Ci0gICAgICAgIGdsRGVwdGhNYXNrID0gNzQ7Ci0gICAgICAgIGdsRGVwdGhSYW5nZWYgPSA3NTsKLSAgICAgICAgZ2xEZXB0aFJhbmdlZk9FUyA9IDc2OwotICAgICAgICBnbERlcHRoUmFuZ2V4ID0gNzc7Ci0gICAgICAgIGdsRGVwdGhSYW5nZXhPRVMgPSA3ODsKLSAgICAgICAgZ2xEZXRhY2hTaGFkZXIgPSA3OTsKLSAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgPSA4MDsKLSAgICAgICAgZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00gPSA4MTsKLSAgICAgICAgZ2xEaXNhYmxlID0gODI7Ci0gICAgICAgIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5ID0gODM7Ci0gICAgICAgIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUID0gODQ7Ci0gICAgICAgIGdsRHJhd0FycmF5cyA9IDg1OwotICAgICAgICBnbERyYXdFbGVtZW50cyA9IDg2OwotICAgICAgICBnbERyYXdUZXhmT0VTID0gODc7Ci0gICAgICAgIGdsRHJhd1RleGZ2T0VTID0gODg7Ci0gICAgICAgIGdsRHJhd1RleGlPRVMgPSA4OTsKLSAgICAgICAgZ2xEcmF3VGV4aXZPRVMgPSA5MDsKLSAgICAgICAgZ2xEcmF3VGV4c09FUyA9IDkxOwotICAgICAgICBnbERyYXdUZXhzdk9FUyA9IDkyOwotICAgICAgICBnbERyYXdUZXh4T0VTID0gOTM7Ci0gICAgICAgIGdsRHJhd1RleHh2T0VTID0gOTQ7Ci0gICAgICAgIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTID0gOTU7Ci0gICAgICAgIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgPSA5NjsKLSAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZSA9IDk3OwotICAgICAgICBnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NID0gOTg7Ci0gICAgICAgIGdsRW5hYmxlID0gOTk7Ci0gICAgICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgPSAxMDA7Ci0gICAgICAgIGdsRW5kUGVyZk1vbml0b3JBTUQgPSAxMDE7Ci0gICAgICAgIGdsRW5kVGlsaW5nUUNPTSA9IDEwMjsKLSAgICAgICAgZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00gPSAxMDM7Ci0gICAgICAgIGdsRXh0R2V0QnVmZmVyc1FDT00gPSAxMDQ7Ci0gICAgICAgIGdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSA9IDEwNTsKLSAgICAgICAgZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSA9IDEwNjsKLSAgICAgICAgZ2xFeHRHZXRQcm9ncmFtc1FDT00gPSAxMDc7Ci0gICAgICAgIGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00gPSAxMDg7Ci0gICAgICAgIGdsRXh0R2V0U2hhZGVyc1FDT00gPSAxMDk7Ci0gICAgICAgIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00gPSAxMTA7Ci0gICAgICAgIGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NID0gMTExOwotICAgICAgICBnbEV4dEdldFRleHR1cmVzUUNPTSA9IDExMjsKLSAgICAgICAgZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NID0gMTEzOwotICAgICAgICBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSA9IDExNDsKLSAgICAgICAgZ2xGaW5pc2hGZW5jZU5WID0gMTE1OwotICAgICAgICBnbEZpbmlzaCA9IDExNjsKLSAgICAgICAgZ2xGbHVzaCA9IDExNzsKLSAgICAgICAgZ2xGb2dmID0gMTE4OwotICAgICAgICBnbEZvZ2Z2ID0gMTE5OwotICAgICAgICBnbEZvZ3ggPSAxMjA7Ci0gICAgICAgIGdsRm9neE9FUyA9IDEyMTsKLSAgICAgICAgZ2xGb2d4diA9IDEyMjsKLSAgICAgICAgZ2xGb2d4dk9FUyA9IDEyMzsKLSAgICAgICAgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciA9IDEyNDsKLSAgICAgICAgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyA9IDEyNTsKLSAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCA9IDEyNjsKLSAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HID0gMTI3OwotICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTID0gMTI4OwotICAgICAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTID0gMTI5OwotICAgICAgICBnbEZyb250RmFjZSA9IDEzMDsKLSAgICAgICAgZ2xGcnVzdHVtZiA9IDEzMTsKLSAgICAgICAgZ2xGcnVzdHVtZk9FUyA9IDEzMjsKLSAgICAgICAgZ2xGcnVzdHVteCA9IDEzMzsKLSAgICAgICAgZ2xGcnVzdHVteE9FUyA9IDEzNDsKLSAgICAgICAgZ2xHZW5CdWZmZXJzID0gMTM1OwotICAgICAgICBnbEdlbmVyYXRlTWlwbWFwID0gMTM2OwotICAgICAgICBnbEdlbmVyYXRlTWlwbWFwT0VTID0gMTM3OwotICAgICAgICBnbEdlbkZlbmNlc05WID0gMTM4OwotICAgICAgICBnbEdlbkZyYW1lYnVmZmVycyA9IDEzOTsKLSAgICAgICAgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgPSAxNDA7Ci0gICAgICAgIGdsR2VuUGVyZk1vbml0b3JzQU1EID0gMTQxOwotICAgICAgICBnbEdlblJlbmRlcmJ1ZmZlcnMgPSAxNDI7Ci0gICAgICAgIGdsR2VuUmVuZGVyYnVmZmVyc09FUyA9IDE0MzsKLSAgICAgICAgZ2xHZW5UZXh0dXJlcyA9IDE0NDsKLSAgICAgICAgZ2xHZW5WZXJ0ZXhBcnJheXNPRVMgPSAxNDU7Ci0gICAgICAgIGdsR2V0QWN0aXZlQXR0cmliID0gMTQ2OwotICAgICAgICBnbEdldEFjdGl2ZVVuaWZvcm0gPSAxNDc7Ci0gICAgICAgIGdsR2V0QXR0YWNoZWRTaGFkZXJzID0gMTQ4OwotICAgICAgICBnbEdldEF0dHJpYkxvY2F0aW9uID0gMTQ5OwotICAgICAgICBnbEdldEJvb2xlYW52ID0gMTUwOwotICAgICAgICBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ID0gMTUxOwotICAgICAgICBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTID0gMTUyOwotICAgICAgICBnbEdldENsaXBQbGFuZWYgPSAxNTM7Ci0gICAgICAgIGdsR2V0Q2xpcFBsYW5lZk9FUyA9IDE1NDsKLSAgICAgICAgZ2xHZXRDbGlwUGxhbmV4ID0gMTU1OwotICAgICAgICBnbEdldENsaXBQbGFuZXhPRVMgPSAxNTY7Ci0gICAgICAgIGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NID0gMTU3OwotICAgICAgICBnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NID0gMTU4OwotICAgICAgICBnbEdldEVycm9yID0gMTU5OwotICAgICAgICBnbEdldEZlbmNlaXZOViA9IDE2MDsKLSAgICAgICAgZ2xHZXRGaXhlZHYgPSAxNjE7Ci0gICAgICAgIGdsR2V0Rml4ZWR2T0VTID0gMTYyOwotICAgICAgICBnbEdldEZsb2F0diA9IDE2MzsKLSAgICAgICAgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdiA9IDE2NDsKLSAgICAgICAgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyA9IDE2NTsKLSAgICAgICAgZ2xHZXRJbnRlZ2VydiA9IDE2NjsKLSAgICAgICAgZ2xHZXRMaWdodGZ2ID0gMTY3OwotICAgICAgICBnbEdldExpZ2h0eHYgPSAxNjg7Ci0gICAgICAgIGdsR2V0TGlnaHR4dk9FUyA9IDE2OTsKLSAgICAgICAgZ2xHZXRNYXRlcmlhbGZ2ID0gMTcwOwotICAgICAgICBnbEdldE1hdGVyaWFseHYgPSAxNzE7Ci0gICAgICAgIGdsR2V0TWF0ZXJpYWx4dk9FUyA9IDE3MjsKLSAgICAgICAgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EID0gMTczOwotICAgICAgICBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQgPSAxNzQ7Ci0gICAgICAgIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCA9IDE3NTsKLSAgICAgICAgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQgPSAxNzY7Ci0gICAgICAgIGdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQgPSAxNzc7Ci0gICAgICAgIGdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRCA9IDE3ODsKLSAgICAgICAgZ2xHZXRQb2ludGVydiA9IDE3OTsKLSAgICAgICAgZ2xHZXRQcm9ncmFtQmluYXJ5T0VTID0gMTgwOwotICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nID0gMTgxOwotICAgICAgICBnbEdldFByb2dyYW1pdiA9IDE4MjsKLSAgICAgICAgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiA9IDE4MzsKLSAgICAgICAgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyA9IDE4NDsKLSAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nID0gMTg1OwotICAgICAgICBnbEdldFNoYWRlcml2ID0gMTg2OwotICAgICAgICBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IDE4NzsKLSAgICAgICAgZ2xHZXRTaGFkZXJTb3VyY2UgPSAxODg7Ci0gICAgICAgIGdsR2V0U3RyaW5nID0gMTg5OwotICAgICAgICBnbEdldFRleEVudmZ2ID0gMTkwOwotICAgICAgICBnbEdldFRleEVudml2ID0gMTkxOwotICAgICAgICBnbEdldFRleEVudnh2ID0gMTkyOwotICAgICAgICBnbEdldFRleEVudnh2T0VTID0gMTkzOwotICAgICAgICBnbEdldFRleEdlbmZ2T0VTID0gMTk0OwotICAgICAgICBnbEdldFRleEdlbml2T0VTID0gMTk1OwotICAgICAgICBnbEdldFRleEdlbnh2T0VTID0gMTk2OwotICAgICAgICBnbEdldFRleFBhcmFtZXRlcmZ2ID0gMTk3OwotICAgICAgICBnbEdldFRleFBhcmFtZXRlcml2ID0gMTk4OwotICAgICAgICBnbEdldFRleFBhcmFtZXRlcnh2ID0gMTk5OwotICAgICAgICBnbEdldFRleFBhcmFtZXRlcnh2T0VTID0gMjAwOwotICAgICAgICBnbEdldFVuaWZvcm1mdiA9IDIwMTsKLSAgICAgICAgZ2xHZXRVbmlmb3JtaXYgPSAyMDI7Ci0gICAgICAgIGdsR2V0VW5pZm9ybUxvY2F0aW9uID0gMjAzOwotICAgICAgICBnbEdldFZlcnRleEF0dHJpYmZ2ID0gMjA0OwotICAgICAgICBnbEdldFZlcnRleEF0dHJpYml2ID0gMjA1OwotICAgICAgICBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2ID0gMjA2OwotICAgICAgICBnbEhpbnQgPSAyMDc7Ci0gICAgICAgIGdsSXNCdWZmZXIgPSAyMDg7Ci0gICAgICAgIGdsSXNFbmFibGVkID0gMjA5OwotICAgICAgICBnbElzRmVuY2VOViA9IDIxMDsKLSAgICAgICAgZ2xJc0ZyYW1lYnVmZmVyID0gMjExOwotICAgICAgICBnbElzRnJhbWVidWZmZXJPRVMgPSAyMTI7Ci0gICAgICAgIGdsSXNQcm9ncmFtID0gMjEzOwotICAgICAgICBnbElzUmVuZGVyYnVmZmVyID0gMjE0OwotICAgICAgICBnbElzUmVuZGVyYnVmZmVyT0VTID0gMjE1OwotICAgICAgICBnbElzU2hhZGVyID0gMjE2OwotICAgICAgICBnbElzVGV4dHVyZSA9IDIxNzsKLSAgICAgICAgZ2xJc1ZlcnRleEFycmF5T0VTID0gMjE4OwotICAgICAgICBnbExpZ2h0ZiA9IDIxOTsKLSAgICAgICAgZ2xMaWdodGZ2ID0gMjIwOwotICAgICAgICBnbExpZ2h0TW9kZWxmID0gMjIxOwotICAgICAgICBnbExpZ2h0TW9kZWxmdiA9IDIyMjsKLSAgICAgICAgZ2xMaWdodE1vZGVseCA9IDIyMzsKLSAgICAgICAgZ2xMaWdodE1vZGVseE9FUyA9IDIyNDsKLSAgICAgICAgZ2xMaWdodE1vZGVseHYgPSAyMjU7Ci0gICAgICAgIGdsTGlnaHRNb2RlbHh2T0VTID0gMjI2OwotICAgICAgICBnbExpZ2h0eCA9IDIyNzsKLSAgICAgICAgZ2xMaWdodHhPRVMgPSAyMjg7Ci0gICAgICAgIGdsTGlnaHR4diA9IDIyOTsKLSAgICAgICAgZ2xMaWdodHh2T0VTID0gMjMwOwotICAgICAgICBnbExpbmVXaWR0aCA9IDIzMTsKLSAgICAgICAgZ2xMaW5lV2lkdGh4ID0gMjMyOwotICAgICAgICBnbExpbmVXaWR0aHhPRVMgPSAyMzM7Ci0gICAgICAgIGdsTGlua1Byb2dyYW0gPSAyMzQ7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5ID0gMjM1OwotICAgICAgICBnbExvYWRNYXRyaXhmID0gMjM2OwotICAgICAgICBnbExvYWRNYXRyaXh4ID0gMjM3OwotICAgICAgICBnbExvYWRNYXRyaXh4T0VTID0gMjM4OwotICAgICAgICBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyA9IDIzOTsKLSAgICAgICAgZ2xMb2dpY09wID0gMjQwOwotICAgICAgICBnbE1hcEJ1ZmZlck9FUyA9IDI0MTsKLSAgICAgICAgZ2xNYXRlcmlhbGYgPSAyNDI7Ci0gICAgICAgIGdsTWF0ZXJpYWxmdiA9IDI0MzsKLSAgICAgICAgZ2xNYXRlcmlhbHggPSAyNDQ7Ci0gICAgICAgIGdsTWF0ZXJpYWx4T0VTID0gMjQ1OwotICAgICAgICBnbE1hdGVyaWFseHYgPSAyNDY7Ci0gICAgICAgIGdsTWF0ZXJpYWx4dk9FUyA9IDI0NzsKLSAgICAgICAgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgPSAyNDg7Ci0gICAgICAgIGdsTWF0cml4TW9kZSA9IDI0OTsKLSAgICAgICAgZ2xNdWx0aURyYXdBcnJheXNFWFQgPSAyNTA7Ci0gICAgICAgIGdsTXVsdGlEcmF3RWxlbWVudHNFWFQgPSAyNTE7Ci0gICAgICAgIGdsTXVsdGlUZXhDb29yZDRmID0gMjUyOwotICAgICAgICBnbE11bHRpVGV4Q29vcmQ0eCA9IDI1MzsKLSAgICAgICAgZ2xNdWx0aVRleENvb3JkNHhPRVMgPSAyNTQ7Ci0gICAgICAgIGdsTXVsdE1hdHJpeGYgPSAyNTU7Ci0gICAgICAgIGdsTXVsdE1hdHJpeHggPSAyNTY7Ci0gICAgICAgIGdsTXVsdE1hdHJpeHhPRVMgPSAyNTc7Ci0gICAgICAgIGdsTm9ybWFsM2YgPSAyNTg7Ci0gICAgICAgIGdsTm9ybWFsM3ggPSAyNTk7Ci0gICAgICAgIGdsTm9ybWFsM3hPRVMgPSAyNjA7Ci0gICAgICAgIGdsTm9ybWFsUG9pbnRlciA9IDI2MTsKLSAgICAgICAgZ2xPcnRob2YgPSAyNjI7Ci0gICAgICAgIGdsT3J0aG9mT0VTID0gMjYzOwotICAgICAgICBnbE9ydGhveCA9IDI2NDsKLSAgICAgICAgZ2xPcnRob3hPRVMgPSAyNjU7Ci0gICAgICAgIGdsUGl4ZWxTdG9yZWkgPSAyNjY7Ci0gICAgICAgIGdsUG9pbnRQYXJhbWV0ZXJmID0gMjY3OwotICAgICAgICBnbFBvaW50UGFyYW1ldGVyZnYgPSAyNjg7Ci0gICAgICAgIGdsUG9pbnRQYXJhbWV0ZXJ4ID0gMjY5OwotICAgICAgICBnbFBvaW50UGFyYW1ldGVyeE9FUyA9IDI3MDsKLSAgICAgICAgZ2xQb2ludFBhcmFtZXRlcnh2ID0gMjcxOwotICAgICAgICBnbFBvaW50UGFyYW1ldGVyeHZPRVMgPSAyNzI7Ci0gICAgICAgIGdsUG9pbnRTaXplID0gMjczOwotICAgICAgICBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgPSAyNzQ7Ci0gICAgICAgIGdsUG9pbnRTaXpleCA9IDI3NTsKLSAgICAgICAgZ2xQb2ludFNpemV4T0VTID0gMjc2OwotICAgICAgICBnbFBvbHlnb25PZmZzZXQgPSAyNzc7Ci0gICAgICAgIGdsUG9seWdvbk9mZnNldHggPSAyNzg7Ci0gICAgICAgIGdsUG9seWdvbk9mZnNldHhPRVMgPSAyNzk7Ci0gICAgICAgIGdsUG9wTWF0cml4ID0gMjgwOwotICAgICAgICBnbFByb2dyYW1CaW5hcnlPRVMgPSAyODE7Ci0gICAgICAgIGdsUHVzaE1hdHJpeCA9IDI4MjsKLSAgICAgICAgZ2xRdWVyeU1hdHJpeHhPRVMgPSAyODM7Ci0gICAgICAgIGdsUmVhZFBpeGVscyA9IDI4NDsKLSAgICAgICAgZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgPSAyODU7Ci0gICAgICAgIGdsUmVuZGVyYnVmZmVyU3RvcmFnZSA9IDI4NjsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcgPSAyODc7Ci0gICAgICAgIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyA9IDI4ODsKLSAgICAgICAgZ2xSb3RhdGVmID0gMjg5OwotICAgICAgICBnbFJvdGF0ZXggPSAyOTA7Ci0gICAgICAgIGdsUm90YXRleE9FUyA9IDI5MTsKLSAgICAgICAgZ2xTYW1wbGVDb3ZlcmFnZSA9IDI5MjsKLSAgICAgICAgZ2xTYW1wbGVDb3ZlcmFnZXggPSAyOTM7Ci0gICAgICAgIGdsU2FtcGxlQ292ZXJhZ2V4T0VTID0gMjk0OwotICAgICAgICBnbFNjYWxlZiA9IDI5NTsKLSAgICAgICAgZ2xTY2FsZXggPSAyOTY7Ci0gICAgICAgIGdsU2NhbGV4T0VTID0gMjk3OwotICAgICAgICBnbFNjaXNzb3IgPSAyOTg7Ci0gICAgICAgIGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCA9IDI5OTsKLSAgICAgICAgZ2xTZXRGZW5jZU5WID0gMzAwOwotICAgICAgICBnbFNoYWRlTW9kZWwgPSAzMDE7Ci0gICAgICAgIGdsU2hhZGVyQmluYXJ5ID0gMzAyOwotICAgICAgICBnbFNoYWRlclNvdXJjZSA9IDMwMzsKLSAgICAgICAgZ2xTdGFydFRpbGluZ1FDT00gPSAzMDQ7Ci0gICAgICAgIGdsU3RlbmNpbEZ1bmMgPSAzMDU7Ci0gICAgICAgIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSA9IDMwNjsKLSAgICAgICAgZ2xTdGVuY2lsTWFzayA9IDMwNzsKLSAgICAgICAgZ2xTdGVuY2lsTWFza1NlcGFyYXRlID0gMzA4OwotICAgICAgICBnbFN0ZW5jaWxPcCA9IDMwOTsKLSAgICAgICAgZ2xTdGVuY2lsT3BTZXBhcmF0ZSA9IDMxMDsKLSAgICAgICAgZ2xUZXN0RmVuY2VOViA9IDMxMTsKLSAgICAgICAgZ2xUZXhDb29yZFBvaW50ZXIgPSAzMTI7Ci0gICAgICAgIGdsVGV4RW52ZiA9IDMxMzsKLSAgICAgICAgZ2xUZXhFbnZmdiA9IDMxNDsKLSAgICAgICAgZ2xUZXhFbnZpID0gMzE1OwotICAgICAgICBnbFRleEVudml2ID0gMzE2OwotICAgICAgICBnbFRleEVudnggPSAzMTc7Ci0gICAgICAgIGdsVGV4RW52eE9FUyA9IDMxODsKLSAgICAgICAgZ2xUZXhFbnZ4diA9IDMxOTsKLSAgICAgICAgZ2xUZXhFbnZ4dk9FUyA9IDMyMDsKLSAgICAgICAgZ2xUZXhHZW5mT0VTID0gMzIxOwotICAgICAgICBnbFRleEdlbmZ2T0VTID0gMzIyOwotICAgICAgICBnbFRleEdlbmlPRVMgPSAzMjM7Ci0gICAgICAgIGdsVGV4R2VuaXZPRVMgPSAzMjQ7Ci0gICAgICAgIGdsVGV4R2VueE9FUyA9IDMyNTsKLSAgICAgICAgZ2xUZXhHZW54dk9FUyA9IDMyNjsKLSAgICAgICAgZ2xUZXhJbWFnZTJEID0gMzI3OwotICAgICAgICBnbFRleEltYWdlM0RPRVMgPSAzMjg7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyZiA9IDMyOTsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJmdiA9IDMzMDsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpID0gMzMxOwotICAgICAgICBnbFRleFBhcmFtZXRlcml2ID0gMzMyOwotICAgICAgICBnbFRleFBhcmFtZXRlcnggPSAzMzM7Ci0gICAgICAgIGdsVGV4UGFyYW1ldGVyeE9FUyA9IDMzNDsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4diA9IDMzNTsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4dk9FUyA9IDMzNjsKLSAgICAgICAgZ2xUZXhTdWJJbWFnZTJEID0gMzM3OwotICAgICAgICBnbFRleFN1YkltYWdlM0RPRVMgPSAzMzg7Ci0gICAgICAgIGdsVHJhbnNsYXRlZiA9IDMzOTsKLSAgICAgICAgZ2xUcmFuc2xhdGV4ID0gMzQwOwotICAgICAgICBnbFRyYW5zbGF0ZXhPRVMgPSAzNDE7Ci0gICAgICAgIGdsVW5pZm9ybTFmID0gMzQyOwotICAgICAgICBnbFVuaWZvcm0xZnYgPSAzNDM7Ci0gICAgICAgIGdsVW5pZm9ybTFpID0gMzQ0OwotICAgICAgICBnbFVuaWZvcm0xaXYgPSAzNDU7Ci0gICAgICAgIGdsVW5pZm9ybTJmID0gMzQ2OwotICAgICAgICBnbFVuaWZvcm0yZnYgPSAzNDc7Ci0gICAgICAgIGdsVW5pZm9ybTJpID0gMzQ4OwotICAgICAgICBnbFVuaWZvcm0yaXYgPSAzNDk7Ci0gICAgICAgIGdsVW5pZm9ybTNmID0gMzUwOwotICAgICAgICBnbFVuaWZvcm0zZnYgPSAzNTE7Ci0gICAgICAgIGdsVW5pZm9ybTNpID0gMzUyOwotICAgICAgICBnbFVuaWZvcm0zaXYgPSAzNTM7Ci0gICAgICAgIGdsVW5pZm9ybTRmID0gMzU0OwotICAgICAgICBnbFVuaWZvcm00ZnYgPSAzNTU7Ci0gICAgICAgIGdsVW5pZm9ybTRpID0gMzU2OwotICAgICAgICBnbFVuaWZvcm00aXYgPSAzNTc7Ci0gICAgICAgIGdsVW5pZm9ybU1hdHJpeDJmdiA9IDM1ODsKLSAgICAgICAgZ2xVbmlmb3JtTWF0cml4M2Z2ID0gMzU5OwotICAgICAgICBnbFVuaWZvcm1NYXRyaXg0ZnYgPSAzNjA7Ci0gICAgICAgIGdsVW5tYXBCdWZmZXJPRVMgPSAzNjE7Ci0gICAgICAgIGdsVXNlUHJvZ3JhbSA9IDM2MjsKLSAgICAgICAgZ2xWYWxpZGF0ZVByb2dyYW0gPSAzNjM7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliMWYgPSAzNjQ7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliMWZ2ID0gMzY1OwotICAgICAgICBnbFZlcnRleEF0dHJpYjJmID0gMzY2OwotICAgICAgICBnbFZlcnRleEF0dHJpYjJmdiA9IDM2NzsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWIzZiA9IDM2ODsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWIzZnYgPSAzNjk7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliNGYgPSAzNzA7Ci0gICAgICAgIGdsVmVydGV4QXR0cmliNGZ2ID0gMzcxOwotICAgICAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIgPSAzNzI7Ci0gICAgICAgIGdsVmVydGV4UG9pbnRlciA9IDM3MzsKLSAgICAgICAgZ2xWaWV3cG9ydCA9IDM3NDsKLSAgICAgICAgZ2xXZWlnaHRQb2ludGVyT0VTID0gMzc1OwotCi0gICAgICAgIGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCA9IDUwMjsKLSAgICAgICAgZ2xBbHBoYUZ1bmNRQ09NID0gNTAzOwotICAgICAgICBnbEJlZ2luUXVlcnlFWFQgPSA1MDQ7Ci0gICAgICAgIGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCA9IDUwNTsKLSAgICAgICAgZ2xCbGl0RnJhbWVidWZmZXJBTkdMRSA9IDUwNjsKLSAgICAgICAgZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVCA9IDUwNzsKLSAgICAgICAgZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUID0gNTA4OwotICAgICAgICBnbERlbGV0ZVF1ZXJpZXNFWFQgPSA1MDk7Ci0gICAgICAgIGdsRHJhd0J1ZmZlcnNOViA9IDUxMDsKLSAgICAgICAgZ2xFbmRRdWVyeUVYVCA9IDUxMTsKLSAgICAgICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUID0gNTEyOwotICAgICAgICBnbEdlblByb2dyYW1QaXBlbGluZXNFWFQgPSA1MTM7Ci0gICAgICAgIGdsR2VuUXVlcmllc0VYVCA9IDUxNDsKLSAgICAgICAgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUID0gNTE1OwotICAgICAgICBnbEdldE9iamVjdExhYmVsRVhUID0gNTE2OwotICAgICAgICBnbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQgPSA1MTc7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQgPSA1MTg7Ci0gICAgICAgIGdsR2V0UXVlcnlPYmplY3R1aXZFWFQgPSA1MTk7Ci0gICAgICAgIGdsR2V0UXVlcnlpdkVYVCA9IDUyMDsKLSAgICAgICAgZ2xHZXRuVW5pZm9ybWZ2RVhUID0gNTIxOwotICAgICAgICBnbEdldG5Vbmlmb3JtaXZFWFQgPSA1MjE7Ci0gICAgICAgIGdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQgPSA1MjI7Ci0gICAgICAgIGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQgPSA1MjM7Ci0gICAgICAgIGdsSXNRdWVyeUVYVCA9IDUyNDsKLSAgICAgICAgZ2xMYWJlbE9iamVjdEVYVCA9IDUyNTsKLSAgICAgICAgZ2xQb3BHcm91cE1hcmtlckVYVCA9IDUyNjsKLSAgICAgICAgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCA9IDUyNzsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTFmRVhUID0gNTI4OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtMWZ2RVhUID0gNTI5OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtMWlFWFQgPSA1MzA7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0xaXZFWFQgPSA1MzE7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0yZkVYVCA9IDUzMjsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVCA9IDUzMzsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTJpRVhUID0gNTM0OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtMml2RVhUID0gNTM1OwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtM2ZFWFQgPSA1MzY7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0zZnZFWFQgPSA1Mzc7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCA9IDUzODsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCA9IDUzOTsKLSAgICAgICAgZ2xQcm9ncmFtVW5pZm9ybTRmRVhUID0gNTQwOwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtNGZ2RVhUID0gNTQxOwotICAgICAgICBnbFByb2dyYW1Vbmlmb3JtNGlFWFQgPSA1NDI7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm00aXZFWFQgPSA1NDM7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQgPSA1NDQ7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQgPSA1NDU7Ci0gICAgICAgIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQgPSA1NDY7Ci0gICAgICAgIGdsUHVzaEdyb3VwTWFya2VyRVhUID0gNTQ3OwotICAgICAgICBnbFJlYWRCdWZmZXJOViA9IDU0ODsKLSAgICAgICAgZ2xSZWFkblBpeGVsc0VYVCA9IDU0OTsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSA9IDU1MDsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSA9IDU1MTsKLSAgICAgICAgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQgPSA1NTI7Ci0gICAgICAgIGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSA9IDU1MzsKLSAgICAgICAgZ2xUZXhTdG9yYWdlMURFWFQgPSA1NTQ7Ci0gICAgICAgIGdsVGV4U3RvcmFnZTJERVhUID0gNTU1OwotICAgICAgICBnbFRleFN0b3JhZ2UzREVYVCA9IDU1NjsKLSAgICAgICAgZ2xUZXh0dXJlU3RvcmFnZTFERVhUID0gNTU3OwotICAgICAgICBnbFRleHR1cmVTdG9yYWdlMkRFWFQgPSA1NTg7Ci0gICAgICAgIGdsVGV4dHVyZVN0b3JhZ2UzREVYVCA9IDU1OTsKLSAgICAgICAgZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUID0gNTYwOwotICAgICAgICBnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUID0gNTYxOwotCi0gICAgICAgIGVnbEdldERpc3BsYXkgPSAyMDAwOwotICAgICAgICBlZ2xJbml0aWFsaXplID0gMjAwMTsKLSAgICAgICAgZWdsVGVybWluYXRlID0gMjAwMjsKLSAgICAgICAgZWdsR2V0Q29uZmlncyA9IDIwMDM7Ci0gICAgICAgIGVnbENob29zZUNvbmZpZyA9IDIwMDQ7Ci0gICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYiA9IDIwMDU7Ci0gICAgICAgIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgPSAyMDA2OwotICAgICAgICBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlID0gMjAwNzsKLSAgICAgICAgZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgPSAyMDA4OwotICAgICAgICBlZ2xEZXN0cm95U3VyZmFjZSA9IDIwMDk7Ci0gICAgICAgIGVnbFF1ZXJ5U3VyZmFjZSA9IDIwMTA7Ci0gICAgICAgIGVnbENyZWF0ZUNvbnRleHQgPSAyMDExOwotICAgICAgICBlZ2xEZXN0cm95Q29udGV4dCA9IDIwMTI7Ci0gICAgICAgIGVnbE1ha2VDdXJyZW50ID0gMjAxMzsKLSAgICAgICAgZWdsR2V0Q3VycmVudENvbnRleHQgPSAyMDE0OwotICAgICAgICBlZ2xHZXRDdXJyZW50U3VyZmFjZSA9IDIwMTU7Ci0gICAgICAgIGVnbEdldEN1cnJlbnREaXNwbGF5ID0gMjAxNjsKLSAgICAgICAgZWdsUXVlcnlDb250ZXh0ID0gMjAxNzsKLSAgICAgICAgZWdsV2FpdEdMID0gMjAxODsKLSAgICAgICAgZWdsV2FpdE5hdGl2ZSA9IDIwMTk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzID0gMjAyMDsKLSAgICAgICAgZWdsQ29weUJ1ZmZlcnMgPSAyMDIxOwotICAgICAgICBlZ2xHZXRFcnJvciA9IDIwMjI7Ci0gICAgICAgIGVnbFF1ZXJ5U3RyaW5nID0gMjAyMzsKLSAgICAgICAgZWdsR2V0UHJvY0FkZHJlc3MgPSAyMDI0OwotICAgICAgICBlZ2xTdXJmYWNlQXR0cmliID0gMjAyNTsKLSAgICAgICAgZWdsQmluZFRleEltYWdlID0gMjAyNjsKLSAgICAgICAgZWdsUmVsZWFzZVRleEltYWdlID0gMjAyNzsKLSAgICAgICAgZWdsU3dhcEludGVydmFsID0gMjAyODsKLSAgICAgICAgZWdsQmluZEFQSSA9IDIwMjk7Ci0gICAgICAgIGVnbFF1ZXJ5QVBJID0gMjAzMDsKLSAgICAgICAgZWdsV2FpdENsaWVudCA9IDIwMzE7Ci0gICAgICAgIGVnbFJlbGVhc2VUaHJlYWQgPSAyMDMyOwotICAgICAgICBlZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlciA9IDIwMzM7Ci0gICAgICAgIGVnbExvY2tTdXJmYWNlS0hSID0gMjAzNDsKLSAgICAgICAgZWdsVW5sb2NrU3VyZmFjZUtIUiA9IDIwMzU7Ci0gICAgICAgIGVnbENyZWF0ZUltYWdlS0hSID0gMjAzNjsKLSAgICAgICAgZWdsRGVzdHJveUltYWdlS0hSID0gMjAzNzsKLSAgICAgICAgZWdsQ3JlYXRlU3luY0tIUiA9IDIwMzg7Ci0gICAgICAgIGVnbERlc3Ryb3lTeW5jS0hSID0gMjAzOTsKLSAgICAgICAgZWdsQ2xpZW50V2FpdFN5bmNLSFIgPSAyMDQwOwotICAgICAgICBlZ2xHZXRTeW5jQXR0cmliS0hSID0gMjA0MTsKLSAgICAgICAgZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQgPSAyMDQyOwotICAgICAgICBlZ2xHZXRSZW5kZXJCdWZmZXJBTkRST0lEID0gMjA0MzsKLSAgICAgICAgZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WID0gMjA0NDsKLSAgICAgICAgZWdsR2V0U3lzdGVtVGltZU5WID0gMjA0NTsKLQotICAgICAgICBpbnZhbGlkID0gMzAwMDsKLSAgICAgICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YSA9IDMwMDE7Ci0gICAgfQotCi0gICAgLy8gQSBHTCBjYWxsJ3MgcmV0dXJuIGRhdGEgYW5kIGFyZ3VtZW50cyBhcmUgZm9ybWF0dGVkIGludG8gdGhpcyBEYXRhVHlwZQotICAgIG1lc3NhZ2UgRGF0YVR5cGUgewotICAgICAgICBlbnVtIFR5cGUgewotICAgICAgICAgICAgVk9JRCA9IDE7ICAgICAgIC8vIEdMdm9pZAotICAgICAgICAgICAgQ0hBUiA9IDI7ICAgICAgIC8vIEdMY2hhcgotICAgICAgICAgICAgQllURSA9IDM7ICAgICAgIC8vIEdMYnl0ZSwgR0x1Ynl0ZQotICAgICAgICAgICAgSU5UID0gNDsgICAgICAgIC8vIEdMYml0ZmllbGQsIEdMc2hvcnQsIEdMaW50LCBHTHNpemVpLCBHTHVzaG9ydCwgR0x1aW50LCBHTGZpeGVkCi0gICAgICAgICAgICBGTE9BVCA9IDU7ICAgICAgLy8gR0xmbG9hdCwgR0xjbGFtcGYKLSAgICAgICAgICAgIEJPT0wgPSA2OyAgICAgICAvLyBHTGJvb2xlYW4KLSAgICAgICAgICAgIEVOVU0gPSA3OyAgICAgICAvLyBHTGVudW0KLSAgICAgICAgfTsKLQotICAgICAgICByZXF1aXJlZCBUeXBlICAgdHlwZSA9IDEgW2RlZmF1bHQgPSBWT0lEXTsKLSAgICAgICAgcmVxdWlyZWQgYm9vbCAgIGlzQXJyYXkgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotCi0gICAgICAgIHJlcGVhdGVkIGludDMyICBpbnRWYWx1ZSA9IDM7Ci0gICAgICAgIHJlcGVhdGVkIGZsb2F0ICBmbG9hdFZhbHVlID0gNDsKLSAgICAgICAgcmVwZWF0ZWQgYnl0ZXMgIGNoYXJWYWx1ZSA9IDU7Ci0gICAgICAgIHJlcGVhdGVkIGJ5dGVzICByYXdCeXRlcyA9IDY7Ci0gICAgICAgIHJlcGVhdGVkIGJvb2wgICBib29sVmFsdWUgPSA3OwotICAgIH0KLQotICAgIG1lc3NhZ2UgRnJhbWVCdWZmZXIgewotICAgICAgICByZXF1aXJlZCBpbnQzMiAgd2lkdGggPSAxOwotICAgICAgICByZXF1aXJlZCBpbnQzMiAgaGVpZ2h0ID0gMjsKLSAgICAgICAgcmVwZWF0ZWQgYnl0ZXMgIGNvbnRlbnRzID0gMzsKLSAgICB9Ci0KLSAgICByZXF1aXJlZCBpbnQzMiAgICAgIGNvbnRleHRfaWQgPSAxOyAgICAgICAgICAgICAgICAgICAgIC8vIEdMIGNvbnRleHQgSUQKLSAgICByZXF1aXJlZCBpbnQ2NCAgICAgIHN0YXJ0X3RpbWUgPSAyOyAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgd2hlbiBjYWxsIHdhcyBpbnZva2VkCi0gICAgcmVxdWlyZWQgaW50MzIgICAgICBkdXJhdGlvbiA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiBvZiB0aGUgY2FsbCAoTU9OT1RPTklDIFRJTUUpCi0KLSAgICByZXF1aXJlZCBGdW5jdGlvbiAgIGZ1bmN0aW9uID0gNCBbZGVmYXVsdCA9IGludmFsaWRdOyAgIC8vIEdMIGZ1bmN0aW9uIGNhbGxlZAotICAgIHJlcGVhdGVkIERhdGFUeXBlICAgYXJncyA9IDU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0wgZnVuY3Rpb24ncyBhcmd1bWVudHMKLSAgICBvcHRpb25hbCBEYXRhVHlwZSAgIHJldHVyblZhbHVlID0gNjsgICAgICAgICAgICAgICAgICAgIC8vIEdMIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlCi0KLSAgICBvcHRpb25hbCBGcmFtZUJ1ZmZlciBmYiA9IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRlbnRzIG9mIHRoZSBmcmFtZWJ1ZmZlcgotCi0gICAgb3B0aW9uYWwgaW50MzIgICAgICB0aHJlYWR0aW1lID0gODsgICAgICAgICAgICAgICAgICAgICAvLyBkdXJhdGlvbiBvZiB0aGUgY2FsbCAoVEhSRUFEIFRJTUUpCi19OwpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZS5wYi5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlLnBiLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4N2M0OS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlLnBiLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwODEgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLQotI2RlZmluZSBJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTgotI2luY2x1ZGUgImdsdHJhY2UucGIuaCIKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi12b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nbHRyYWNlXzJlcHJvdG8oKSB7Ci0gIGRlbGV0ZSBHTE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6ZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLXZvaWQgcHJvdG9idWZfQWRkRGVzY19nbHRyYWNlXzJlcHJvdG8oKSB7Ci0gIHN0YXRpYyBib29sIGFscmVhZHlfaGVyZSA9IGZhbHNlOwotICBpZiAoYWxyZWFkeV9oZXJlKSByZXR1cm47Ci0gIGFscmVhZHlfaGVyZSA9IHRydWU7Ci0gIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjsKLQotICBHTE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEdMTWVzc2FnZSgpOwotICBHTE1lc3NhZ2VfRGF0YVR5cGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEdMTWVzc2FnZV9EYXRhVHlwZSgpOwotICBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcigpOwotICBHTE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgR0xNZXNzYWdlX0RhdGFUeXBlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpPblNodXRkb3duKCZwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ2x0cmFjZV8yZXByb3RvKTsKLX0KLQotLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuCi1zdHJ1Y3QgU3RhdGljRGVzY3JpcHRvckluaXRpYWxpemVyX2dsdHJhY2VfMmVwcm90byB7Ci0gIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nbHRyYWNlXzJlcHJvdG8oKSB7Ci0gICAgcHJvdG9idWZfQWRkRGVzY19nbHRyYWNlXzJlcHJvdG8oKTsKLSAgfQotfSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl9nbHRyYWNlXzJlcHJvdG9fOwotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotYm9vbCBHTE1lc3NhZ2VfRnVuY3Rpb25fSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgc3dpdGNoKHZhbHVlKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNDoKLSAgICBjYXNlIDU6Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICBjYXNlIDg6Ci0gICAgY2FzZSA5OgotICAgIGNhc2UgMTA6Ci0gICAgY2FzZSAxMToKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTM6Ci0gICAgY2FzZSAxNDoKLSAgICBjYXNlIDE1OgotICAgIGNhc2UgMTY6Ci0gICAgY2FzZSAxNzoKLSAgICBjYXNlIDE4OgotICAgIGNhc2UgMTk6Ci0gICAgY2FzZSAyMDoKLSAgICBjYXNlIDIxOgotICAgIGNhc2UgMjI6Ci0gICAgY2FzZSAyMzoKLSAgICBjYXNlIDI0OgotICAgIGNhc2UgMjU6Ci0gICAgY2FzZSAyNjoKLSAgICBjYXNlIDI3OgotICAgIGNhc2UgMjg6Ci0gICAgY2FzZSAyOToKLSAgICBjYXNlIDMwOgotICAgIGNhc2UgMzE6Ci0gICAgY2FzZSAzMjoKLSAgICBjYXNlIDMzOgotICAgIGNhc2UgMzQ6Ci0gICAgY2FzZSAzNToKLSAgICBjYXNlIDM2OgotICAgIGNhc2UgMzc6Ci0gICAgY2FzZSAzODoKLSAgICBjYXNlIDM5OgotICAgIGNhc2UgNDA6Ci0gICAgY2FzZSA0MToKLSAgICBjYXNlIDQyOgotICAgIGNhc2UgNDM6Ci0gICAgY2FzZSA0NDoKLSAgICBjYXNlIDQ1OgotICAgIGNhc2UgNDY6Ci0gICAgY2FzZSA0NzoKLSAgICBjYXNlIDQ4OgotICAgIGNhc2UgNDk6Ci0gICAgY2FzZSA1MDoKLSAgICBjYXNlIDUxOgotICAgIGNhc2UgNTI6Ci0gICAgY2FzZSA1MzoKLSAgICBjYXNlIDU0OgotICAgIGNhc2UgNTU6Ci0gICAgY2FzZSA1NjoKLSAgICBjYXNlIDU3OgotICAgIGNhc2UgNTg6Ci0gICAgY2FzZSA1OToKLSAgICBjYXNlIDYwOgotICAgIGNhc2UgNjE6Ci0gICAgY2FzZSA2MjoKLSAgICBjYXNlIDYzOgotICAgIGNhc2UgNjQ6Ci0gICAgY2FzZSA2NToKLSAgICBjYXNlIDY2OgotICAgIGNhc2UgNjc6Ci0gICAgY2FzZSA2ODoKLSAgICBjYXNlIDY5OgotICAgIGNhc2UgNzA6Ci0gICAgY2FzZSA3MToKLSAgICBjYXNlIDcyOgotICAgIGNhc2UgNzM6Ci0gICAgY2FzZSA3NDoKLSAgICBjYXNlIDc1OgotICAgIGNhc2UgNzY6Ci0gICAgY2FzZSA3NzoKLSAgICBjYXNlIDc4OgotICAgIGNhc2UgNzk6Ci0gICAgY2FzZSA4MDoKLSAgICBjYXNlIDgxOgotICAgIGNhc2UgODI6Ci0gICAgY2FzZSA4MzoKLSAgICBjYXNlIDg0OgotICAgIGNhc2UgODU6Ci0gICAgY2FzZSA4NjoKLSAgICBjYXNlIDg3OgotICAgIGNhc2UgODg6Ci0gICAgY2FzZSA4OToKLSAgICBjYXNlIDkwOgotICAgIGNhc2UgOTE6Ci0gICAgY2FzZSA5MjoKLSAgICBjYXNlIDkzOgotICAgIGNhc2UgOTQ6Ci0gICAgY2FzZSA5NToKLSAgICBjYXNlIDk2OgotICAgIGNhc2UgOTc6Ci0gICAgY2FzZSA5ODoKLSAgICBjYXNlIDk5OgotICAgIGNhc2UgMTAwOgotICAgIGNhc2UgMTAxOgotICAgIGNhc2UgMTAyOgotICAgIGNhc2UgMTAzOgotICAgIGNhc2UgMTA0OgotICAgIGNhc2UgMTA1OgotICAgIGNhc2UgMTA2OgotICAgIGNhc2UgMTA3OgotICAgIGNhc2UgMTA4OgotICAgIGNhc2UgMTA5OgotICAgIGNhc2UgMTEwOgotICAgIGNhc2UgMTExOgotICAgIGNhc2UgMTEyOgotICAgIGNhc2UgMTEzOgotICAgIGNhc2UgMTE0OgotICAgIGNhc2UgMTE1OgotICAgIGNhc2UgMTE2OgotICAgIGNhc2UgMTE3OgotICAgIGNhc2UgMTE4OgotICAgIGNhc2UgMTE5OgotICAgIGNhc2UgMTIwOgotICAgIGNhc2UgMTIxOgotICAgIGNhc2UgMTIyOgotICAgIGNhc2UgMTIzOgotICAgIGNhc2UgMTI0OgotICAgIGNhc2UgMTI1OgotICAgIGNhc2UgMTI2OgotICAgIGNhc2UgMTI3OgotICAgIGNhc2UgMTI4OgotICAgIGNhc2UgMTI5OgotICAgIGNhc2UgMTMwOgotICAgIGNhc2UgMTMxOgotICAgIGNhc2UgMTMyOgotICAgIGNhc2UgMTMzOgotICAgIGNhc2UgMTM0OgotICAgIGNhc2UgMTM1OgotICAgIGNhc2UgMTM2OgotICAgIGNhc2UgMTM3OgotICAgIGNhc2UgMTM4OgotICAgIGNhc2UgMTM5OgotICAgIGNhc2UgMTQwOgotICAgIGNhc2UgMTQxOgotICAgIGNhc2UgMTQyOgotICAgIGNhc2UgMTQzOgotICAgIGNhc2UgMTQ0OgotICAgIGNhc2UgMTQ1OgotICAgIGNhc2UgMTQ2OgotICAgIGNhc2UgMTQ3OgotICAgIGNhc2UgMTQ4OgotICAgIGNhc2UgMTQ5OgotICAgIGNhc2UgMTUwOgotICAgIGNhc2UgMTUxOgotICAgIGNhc2UgMTUyOgotICAgIGNhc2UgMTUzOgotICAgIGNhc2UgMTU0OgotICAgIGNhc2UgMTU1OgotICAgIGNhc2UgMTU2OgotICAgIGNhc2UgMTU3OgotICAgIGNhc2UgMTU4OgotICAgIGNhc2UgMTU5OgotICAgIGNhc2UgMTYwOgotICAgIGNhc2UgMTYxOgotICAgIGNhc2UgMTYyOgotICAgIGNhc2UgMTYzOgotICAgIGNhc2UgMTY0OgotICAgIGNhc2UgMTY1OgotICAgIGNhc2UgMTY2OgotICAgIGNhc2UgMTY3OgotICAgIGNhc2UgMTY4OgotICAgIGNhc2UgMTY5OgotICAgIGNhc2UgMTcwOgotICAgIGNhc2UgMTcxOgotICAgIGNhc2UgMTcyOgotICAgIGNhc2UgMTczOgotICAgIGNhc2UgMTc0OgotICAgIGNhc2UgMTc1OgotICAgIGNhc2UgMTc2OgotICAgIGNhc2UgMTc3OgotICAgIGNhc2UgMTc4OgotICAgIGNhc2UgMTc5OgotICAgIGNhc2UgMTgwOgotICAgIGNhc2UgMTgxOgotICAgIGNhc2UgMTgyOgotICAgIGNhc2UgMTgzOgotICAgIGNhc2UgMTg0OgotICAgIGNhc2UgMTg1OgotICAgIGNhc2UgMTg2OgotICAgIGNhc2UgMTg3OgotICAgIGNhc2UgMTg4OgotICAgIGNhc2UgMTg5OgotICAgIGNhc2UgMTkwOgotICAgIGNhc2UgMTkxOgotICAgIGNhc2UgMTkyOgotICAgIGNhc2UgMTkzOgotICAgIGNhc2UgMTk0OgotICAgIGNhc2UgMTk1OgotICAgIGNhc2UgMTk2OgotICAgIGNhc2UgMTk3OgotICAgIGNhc2UgMTk4OgotICAgIGNhc2UgMTk5OgotICAgIGNhc2UgMjAwOgotICAgIGNhc2UgMjAxOgotICAgIGNhc2UgMjAyOgotICAgIGNhc2UgMjAzOgotICAgIGNhc2UgMjA0OgotICAgIGNhc2UgMjA1OgotICAgIGNhc2UgMjA2OgotICAgIGNhc2UgMjA3OgotICAgIGNhc2UgMjA4OgotICAgIGNhc2UgMjA5OgotICAgIGNhc2UgMjEwOgotICAgIGNhc2UgMjExOgotICAgIGNhc2UgMjEyOgotICAgIGNhc2UgMjEzOgotICAgIGNhc2UgMjE0OgotICAgIGNhc2UgMjE1OgotICAgIGNhc2UgMjE2OgotICAgIGNhc2UgMjE3OgotICAgIGNhc2UgMjE4OgotICAgIGNhc2UgMjE5OgotICAgIGNhc2UgMjIwOgotICAgIGNhc2UgMjIxOgotICAgIGNhc2UgMjIyOgotICAgIGNhc2UgMjIzOgotICAgIGNhc2UgMjI0OgotICAgIGNhc2UgMjI1OgotICAgIGNhc2UgMjI2OgotICAgIGNhc2UgMjI3OgotICAgIGNhc2UgMjI4OgotICAgIGNhc2UgMjI5OgotICAgIGNhc2UgMjMwOgotICAgIGNhc2UgMjMxOgotICAgIGNhc2UgMjMyOgotICAgIGNhc2UgMjMzOgotICAgIGNhc2UgMjM0OgotICAgIGNhc2UgMjM1OgotICAgIGNhc2UgMjM2OgotICAgIGNhc2UgMjM3OgotICAgIGNhc2UgMjM4OgotICAgIGNhc2UgMjM5OgotICAgIGNhc2UgMjQwOgotICAgIGNhc2UgMjQxOgotICAgIGNhc2UgMjQyOgotICAgIGNhc2UgMjQzOgotICAgIGNhc2UgMjQ0OgotICAgIGNhc2UgMjQ1OgotICAgIGNhc2UgMjQ2OgotICAgIGNhc2UgMjQ3OgotICAgIGNhc2UgMjQ4OgotICAgIGNhc2UgMjQ5OgotICAgIGNhc2UgMjUwOgotICAgIGNhc2UgMjUxOgotICAgIGNhc2UgMjUyOgotICAgIGNhc2UgMjUzOgotICAgIGNhc2UgMjU0OgotICAgIGNhc2UgMjU1OgotICAgIGNhc2UgMjU2OgotICAgIGNhc2UgMjU3OgotICAgIGNhc2UgMjU4OgotICAgIGNhc2UgMjU5OgotICAgIGNhc2UgMjYwOgotICAgIGNhc2UgMjYxOgotICAgIGNhc2UgMjYyOgotICAgIGNhc2UgMjYzOgotICAgIGNhc2UgMjY0OgotICAgIGNhc2UgMjY1OgotICAgIGNhc2UgMjY2OgotICAgIGNhc2UgMjY3OgotICAgIGNhc2UgMjY4OgotICAgIGNhc2UgMjY5OgotICAgIGNhc2UgMjcwOgotICAgIGNhc2UgMjcxOgotICAgIGNhc2UgMjcyOgotICAgIGNhc2UgMjczOgotICAgIGNhc2UgMjc0OgotICAgIGNhc2UgMjc1OgotICAgIGNhc2UgMjc2OgotICAgIGNhc2UgMjc3OgotICAgIGNhc2UgMjc4OgotICAgIGNhc2UgMjc5OgotICAgIGNhc2UgMjgwOgotICAgIGNhc2UgMjgxOgotICAgIGNhc2UgMjgyOgotICAgIGNhc2UgMjgzOgotICAgIGNhc2UgMjg0OgotICAgIGNhc2UgMjg1OgotICAgIGNhc2UgMjg2OgotICAgIGNhc2UgMjg3OgotICAgIGNhc2UgMjg4OgotICAgIGNhc2UgMjg5OgotICAgIGNhc2UgMjkwOgotICAgIGNhc2UgMjkxOgotICAgIGNhc2UgMjkyOgotICAgIGNhc2UgMjkzOgotICAgIGNhc2UgMjk0OgotICAgIGNhc2UgMjk1OgotICAgIGNhc2UgMjk2OgotICAgIGNhc2UgMjk3OgotICAgIGNhc2UgMjk4OgotICAgIGNhc2UgMjk5OgotICAgIGNhc2UgMzAwOgotICAgIGNhc2UgMzAxOgotICAgIGNhc2UgMzAyOgotICAgIGNhc2UgMzAzOgotICAgIGNhc2UgMzA0OgotICAgIGNhc2UgMzA1OgotICAgIGNhc2UgMzA2OgotICAgIGNhc2UgMzA3OgotICAgIGNhc2UgMzA4OgotICAgIGNhc2UgMzA5OgotICAgIGNhc2UgMzEwOgotICAgIGNhc2UgMzExOgotICAgIGNhc2UgMzEyOgotICAgIGNhc2UgMzEzOgotICAgIGNhc2UgMzE0OgotICAgIGNhc2UgMzE1OgotICAgIGNhc2UgMzE2OgotICAgIGNhc2UgMzE3OgotICAgIGNhc2UgMzE4OgotICAgIGNhc2UgMzE5OgotICAgIGNhc2UgMzIwOgotICAgIGNhc2UgMzIxOgotICAgIGNhc2UgMzIyOgotICAgIGNhc2UgMzIzOgotICAgIGNhc2UgMzI0OgotICAgIGNhc2UgMzI1OgotICAgIGNhc2UgMzI2OgotICAgIGNhc2UgMzI3OgotICAgIGNhc2UgMzI4OgotICAgIGNhc2UgMzI5OgotICAgIGNhc2UgMzMwOgotICAgIGNhc2UgMzMxOgotICAgIGNhc2UgMzMyOgotICAgIGNhc2UgMzMzOgotICAgIGNhc2UgMzM0OgotICAgIGNhc2UgMzM1OgotICAgIGNhc2UgMzM2OgotICAgIGNhc2UgMzM3OgotICAgIGNhc2UgMzM4OgotICAgIGNhc2UgMzM5OgotICAgIGNhc2UgMzQwOgotICAgIGNhc2UgMzQxOgotICAgIGNhc2UgMzQyOgotICAgIGNhc2UgMzQzOgotICAgIGNhc2UgMzQ0OgotICAgIGNhc2UgMzQ1OgotICAgIGNhc2UgMzQ2OgotICAgIGNhc2UgMzQ3OgotICAgIGNhc2UgMzQ4OgotICAgIGNhc2UgMzQ5OgotICAgIGNhc2UgMzUwOgotICAgIGNhc2UgMzUxOgotICAgIGNhc2UgMzUyOgotICAgIGNhc2UgMzUzOgotICAgIGNhc2UgMzU0OgotICAgIGNhc2UgMzU1OgotICAgIGNhc2UgMzU2OgotICAgIGNhc2UgMzU3OgotICAgIGNhc2UgMzU4OgotICAgIGNhc2UgMzU5OgotICAgIGNhc2UgMzYwOgotICAgIGNhc2UgMzYxOgotICAgIGNhc2UgMzYyOgotICAgIGNhc2UgMzYzOgotICAgIGNhc2UgMzY0OgotICAgIGNhc2UgMzY1OgotICAgIGNhc2UgMzY2OgotICAgIGNhc2UgMzY3OgotICAgIGNhc2UgMzY4OgotICAgIGNhc2UgMzY5OgotICAgIGNhc2UgMzcwOgotICAgIGNhc2UgMzcxOgotICAgIGNhc2UgMzcyOgotICAgIGNhc2UgMzczOgotICAgIGNhc2UgMzc0OgotICAgIGNhc2UgMzc1OgotICAgIGNhc2UgNTAyOgotICAgIGNhc2UgNTAzOgotICAgIGNhc2UgNTA0OgotICAgIGNhc2UgNTA1OgotICAgIGNhc2UgNTA2OgotICAgIGNhc2UgNTA3OgotICAgIGNhc2UgNTA4OgotICAgIGNhc2UgNTA5OgotICAgIGNhc2UgNTEwOgotICAgIGNhc2UgNTExOgotICAgIGNhc2UgNTEyOgotICAgIGNhc2UgNTEzOgotICAgIGNhc2UgNTE0OgotICAgIGNhc2UgNTE1OgotICAgIGNhc2UgNTE2OgotICAgIGNhc2UgNTE3OgotICAgIGNhc2UgNTE4OgotICAgIGNhc2UgNTE5OgotICAgIGNhc2UgNTIwOgotICAgIGNhc2UgNTIxOgotICAgIGNhc2UgNTIyOgotICAgIGNhc2UgNTIzOgotICAgIGNhc2UgNTI0OgotICAgIGNhc2UgNTI1OgotICAgIGNhc2UgNTI2OgotICAgIGNhc2UgNTI3OgotICAgIGNhc2UgNTI4OgotICAgIGNhc2UgNTI5OgotICAgIGNhc2UgNTMwOgotICAgIGNhc2UgNTMxOgotICAgIGNhc2UgNTMyOgotICAgIGNhc2UgNTMzOgotICAgIGNhc2UgNTM0OgotICAgIGNhc2UgNTM1OgotICAgIGNhc2UgNTM2OgotICAgIGNhc2UgNTM3OgotICAgIGNhc2UgNTM4OgotICAgIGNhc2UgNTM5OgotICAgIGNhc2UgNTQwOgotICAgIGNhc2UgNTQxOgotICAgIGNhc2UgNTQyOgotICAgIGNhc2UgNTQzOgotICAgIGNhc2UgNTQ0OgotICAgIGNhc2UgNTQ1OgotICAgIGNhc2UgNTQ2OgotICAgIGNhc2UgNTQ3OgotICAgIGNhc2UgNTQ4OgotICAgIGNhc2UgNTQ5OgotICAgIGNhc2UgNTUwOgotICAgIGNhc2UgNTUxOgotICAgIGNhc2UgNTUyOgotICAgIGNhc2UgNTUzOgotICAgIGNhc2UgNTU0OgotICAgIGNhc2UgNTU1OgotICAgIGNhc2UgNTU2OgotICAgIGNhc2UgNTU3OgotICAgIGNhc2UgNTU4OgotICAgIGNhc2UgNTU5OgotICAgIGNhc2UgNTYwOgotICAgIGNhc2UgNTYxOgotICAgIGNhc2UgMjAwMDoKLSAgICBjYXNlIDIwMDE6Ci0gICAgY2FzZSAyMDAyOgotICAgIGNhc2UgMjAwMzoKLSAgICBjYXNlIDIwMDQ6Ci0gICAgY2FzZSAyMDA1OgotICAgIGNhc2UgMjAwNjoKLSAgICBjYXNlIDIwMDc6Ci0gICAgY2FzZSAyMDA4OgotICAgIGNhc2UgMjAwOToKLSAgICBjYXNlIDIwMTA6Ci0gICAgY2FzZSAyMDExOgotICAgIGNhc2UgMjAxMjoKLSAgICBjYXNlIDIwMTM6Ci0gICAgY2FzZSAyMDE0OgotICAgIGNhc2UgMjAxNToKLSAgICBjYXNlIDIwMTY6Ci0gICAgY2FzZSAyMDE3OgotICAgIGNhc2UgMjAxODoKLSAgICBjYXNlIDIwMTk6Ci0gICAgY2FzZSAyMDIwOgotICAgIGNhc2UgMjAyMToKLSAgICBjYXNlIDIwMjI6Ci0gICAgY2FzZSAyMDIzOgotICAgIGNhc2UgMjAyNDoKLSAgICBjYXNlIDIwMjU6Ci0gICAgY2FzZSAyMDI2OgotICAgIGNhc2UgMjAyNzoKLSAgICBjYXNlIDIwMjg6Ci0gICAgY2FzZSAyMDI5OgotICAgIGNhc2UgMjAzMDoKLSAgICBjYXNlIDIwMzE6Ci0gICAgY2FzZSAyMDMyOgotICAgIGNhc2UgMjAzMzoKLSAgICBjYXNlIDIwMzQ6Ci0gICAgY2FzZSAyMDM1OgotICAgIGNhc2UgMjAzNjoKLSAgICBjYXNlIDIwMzc6Ci0gICAgY2FzZSAyMDM4OgotICAgIGNhc2UgMjAzOToKLSAgICBjYXNlIDIwNDA6Ci0gICAgY2FzZSAyMDQxOgotICAgIGNhc2UgMjA0MjoKLSAgICBjYXNlIDIwNDM6Ci0gICAgY2FzZSAyMDQ0OgotICAgIGNhc2UgMjA0NToKLSAgICBjYXNlIDMwMDA6Ci0gICAgY2FzZSAzMDAxOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEFjdGl2ZVRleHR1cmU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEFscGhhRnVuYzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQWxwaGFGdW5jeDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQWxwaGFGdW5jeE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQXR0YWNoU2hhZGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCZWdpblBlcmZNb25pdG9yQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCaW5kQXR0cmliTG9jYXRpb247Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRCdWZmZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRGcmFtZWJ1ZmZlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmluZEZyYW1lYnVmZmVyT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCaW5kUmVuZGVyYnVmZmVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCaW5kUmVuZGVyYnVmZmVyT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCaW5kVGV4dHVyZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmluZFZlcnRleEFycmF5T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZENvbG9yOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZEVxdWF0aW9uOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZEVxdWF0aW9uT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZEVxdWF0aW9uU2VwYXJhdGU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmxlbmRGdW5jOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQmxlbmRGdW5jU2VwYXJhdGVPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJ1ZmZlckRhdGE7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJ1ZmZlclN1YkRhdGE7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyQ29sb3I7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyQ29sb3J4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDbGVhckNvbG9yeE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xlYXJEZXB0aGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyRGVwdGhmT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDbGVhckRlcHRoeDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ2xlYXJEZXB0aHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsZWFyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDbGVhclN0ZW5jaWw7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaWVudEFjdGl2ZVRleHR1cmU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaXBQbGFuZWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaXBQbGFuZWZJTUc7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaXBQbGFuZWZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaXBQbGFuZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaXBQbGFuZXhJTUc7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENsaXBQbGFuZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbG9yNGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbG9yNHViOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb2xvcjR4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb2xvcjR4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb2xvck1hc2s7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbG9yUG9pbnRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29tcGlsZVNoYWRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29tcHJlc3NlZFRleEltYWdlMkQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvcHlUZXhJbWFnZTJEOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb3B5VGV4U3ViSW1hZ2UyRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsQ29weVRleFN1YkltYWdlM0RPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbENvdmVyYWdlTWFza05WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDb3ZlcmFnZU9wZXJhdGlvbk5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDcmVhdGVQcm9ncmFtOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDcmVhdGVTaGFkZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEN1bGxGYWNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlQnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlRmVuY2VzTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZUZyYW1lYnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlRnJhbWVidWZmZXJzT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZWxldGVQZXJmTW9uaXRvcnNBTUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZVByb2dyYW07Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZVNoYWRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlVGV4dHVyZXM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlbGV0ZVZlcnRleEFycmF5c09FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVwdGhGdW5jOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZXB0aE1hc2s7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlcHRoUmFuZ2VmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZXB0aFJhbmdlZk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVwdGhSYW5nZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERlcHRoUmFuZ2V4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEZXRhY2hTaGFkZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERpc2FibGVDbGllbnRTdGF0ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEaXNhYmxlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd0FycmF5czsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd0VsZW1lbnRzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4Zk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd1RleGZ2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4aU9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd1RleGl2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4c09FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd1RleHN2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xEcmF3VGV4eE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd1RleHh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFbmFibGVDbGllbnRTdGF0ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEVuYWJsZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEVuZFBlcmZNb25pdG9yQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFbmRUaWxpbmdRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldEJ1ZmZlcnNRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0R2V0UHJvZ3JhbXNRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0R2V0U2hhZGVyc1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xFeHRHZXRUZXhTdWJJbWFnZVFDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEV4dEdldFRleHR1cmVzUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGaW5pc2hGZW5jZU5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGaW5pc2g7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZsdXNoOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGb2dmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGb2dmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRm9neDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRm9neE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRm9neHY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZvZ3h2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJEOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZyb250RmFjZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJ1c3R1bWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZydXN0dW1mT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xGcnVzdHVteDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRnJ1c3R1bXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlbkJ1ZmZlcnM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlbmVyYXRlTWlwbWFwOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZW5lcmF0ZU1pcG1hcE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuRmVuY2VzTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlbkZyYW1lYnVmZmVyczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2VuRnJhbWVidWZmZXJzT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZW5QZXJmTW9uaXRvcnNBTUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblJlbmRlcmJ1ZmZlcnM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblJlbmRlcmJ1ZmZlcnNPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblRleHR1cmVzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZW5WZXJ0ZXhBcnJheXNPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEFjdGl2ZUF0dHJpYjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlVW5pZm9ybTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0QXR0YWNoZWRTaGFkZXJzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRBdHRyaWJMb2NhdGlvbjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0Qm9vbGVhbnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEJ1ZmZlclBhcmFtZXRlcml2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRCdWZmZXJQb2ludGVydk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5lZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5lZk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5leDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5leE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0RHJpdmVyQ29udHJvbHNRQ09NOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXREcml2ZXJDb250cm9sU3RyaW5nUUNPTTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0RXJyb3I7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEZlbmNlaXZOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0Rml4ZWR2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRGaXhlZHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEZsb2F0djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRJbnRlZ2VydjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0TGlnaHRmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0TGlnaHR4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0TGlnaHR4dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0TWF0ZXJpYWxmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0TWF0ZXJpYWx4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0TWF0ZXJpYWx4dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UG9pbnRlcnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFByb2dyYW1CaW5hcnlPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFByb2dyYW1JbmZvTG9nOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0U2hhZGVySW5mb0xvZzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyU291cmNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRTdHJpbmc7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleEVudmZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhFbnZpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4RW52eHY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleEVudnh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhHZW5mdk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4R2VuaXZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleEdlbnh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhQYXJhbWV0ZXJmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VGV4UGFyYW1ldGVyaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFRleFBhcmFtZXRlcnh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VW5pZm9ybWZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRVbmlmb3JtaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFVuaWZvcm1Mb2NhdGlvbjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0VmVydGV4QXR0cmliZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFZlcnRleEF0dHJpYml2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSGludDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNCdWZmZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzRW5hYmxlZDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNGZW5jZU5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc0ZyYW1lYnVmZmVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc0ZyYW1lYnVmZmVyT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc1Byb2dyYW07Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzUmVuZGVyYnVmZmVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc1JlbmRlcmJ1ZmZlck9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNTaGFkZXI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbElzVGV4dHVyZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNWZXJ0ZXhBcnJheU9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHRmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVsZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWx4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbHh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaWdodHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExpZ2h0eE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHR4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGlnaHR4dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGluZVdpZHRoOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaW5lV2lkdGh4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaW5lV2lkdGh4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMaW5rUHJvZ3JhbTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTG9hZElkZW50aXR5OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMb2FkTWF0cml4ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTG9hZE1hdHJpeHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExvYWRNYXRyaXh4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbExvZ2ljT3A7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE1hcEJ1ZmZlck9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTWF0ZXJpYWxmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRlcmlhbGZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRlcmlhbHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE1hdGVyaWFseE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTWF0ZXJpYWx4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTWF0ZXJpYWx4dk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTWF0cml4SW5kZXhQb2ludGVyT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNYXRyaXhNb2RlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNdWx0aURyYXdBcnJheXNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE11bHRpRHJhd0VsZW1lbnRzRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNdWx0aVRleENvb3JkNGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE11bHRpVGV4Q29vcmQ0eDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTXVsdGlUZXhDb29yZDR4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xNdWx0TWF0cml4ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTXVsdE1hdHJpeHg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE11bHRNYXRyaXh4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xOb3JtYWwzZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTm9ybWFsM3g7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE5vcm1hbDN4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xOb3JtYWxQb2ludGVyOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xPcnRob2Y7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbE9ydGhvZk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsT3J0aG94OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xPcnRob3hPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBpeGVsU3RvcmVpOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcmY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyeDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJ4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcnh2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcnh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb2ludFNpemU7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50U2l6ZVBvaW50ZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50U2l6ZXg7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvaW50U2l6ZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvbHlnb25PZmZzZXQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvbHlnb25PZmZzZXR4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQb2x5Z29uT2Zmc2V0eE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUG9wTWF0cml4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtQmluYXJ5T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQdXNoTWF0cml4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xRdWVyeU1hdHJpeHhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlYWRQaXhlbHM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSb3RhdGVmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSb3RhdGV4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSb3RhdGV4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTYW1wbGVDb3ZlcmFnZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2FtcGxlQ292ZXJhZ2V4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTYW1wbGVDb3ZlcmFnZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNjYWxlZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2NhbGV4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTY2FsZXhPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNjaXNzb3I7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNldEZlbmNlTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNoYWRlTW9kZWw7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFNoYWRlckJpbmFyeTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU2hhZGVyU291cmNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTdGFydFRpbGluZ1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFN0ZW5jaWxGdW5jOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTdGVuY2lsRnVuY1NlcGFyYXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTdGVuY2lsTWFzazsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU3RlbmNpbE1hc2tTZXBhcmF0ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsU3RlbmNpbE9wOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xTdGVuY2lsT3BTZXBhcmF0ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGVzdEZlbmNlTlY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleENvb3JkUG9pbnRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4RW52ZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4RW52ZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEVudmk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEVudml2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhFbnZ4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhFbnZ4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhFbnZ4djsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4RW52eHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEdlbmZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEdlbmZ2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhHZW5pT0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhHZW5pdk9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4R2VueE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4R2VueHZPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEltYWdlMkQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleEltYWdlM0RPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcmY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcmZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJpOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyeDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyeE9FUzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyeHY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcnh2T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhTdWJJbWFnZTJEOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhTdWJJbWFnZTNET0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUcmFuc2xhdGVmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUcmFuc2xhdGV4OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUcmFuc2xhdGV4T0VTOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0xZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0xaTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTFpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTJmOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmZ2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0yaXY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm0zZjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTNmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTNpOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2l2OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVbmlmb3JtNGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm00ZnY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVuaWZvcm00aTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybTRpdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDJmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDNmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDRmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVW5tYXBCdWZmZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFVzZVByb2dyYW07Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFZhbGlkYXRlUHJvZ3JhbTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliMWY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjFmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliMmY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjJmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliM2Y7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjNmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliNGY7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjRmdjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliUG9pbnRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4UG9pbnRlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmlld3BvcnQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFdlaWdodFBvaW50ZXJPRVM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEFscGhhRnVuY1FDT007Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJlZ2luUXVlcnlFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRGVsZXRlUXVlcmllc0VYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRHJhd0J1ZmZlcnNOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsRW5kUXVlcnlFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblByb2dyYW1QaXBlbGluZXNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdlblF1ZXJpZXNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldE9iamVjdExhYmVsRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsR2V0UXVlcnlPYmplY3R1aXZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldFF1ZXJ5aXZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldG5Vbmlmb3JtZnZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEdldG5Vbmlmb3JtaXZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbEluc2VydEV2ZW50TWFya2VyRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xJc1Byb2dyYW1QaXBlbGluZUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsSXNRdWVyeUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsTGFiZWxPYmplY3RFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFBvcEdyb3VwTWFya2VyRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtUGFyYW1ldGVyaUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0xZkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMWlFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMWl2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJmRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJmdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0yaUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2ZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTNpRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTNpdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm00ZkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtNGlFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtNGl2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xQdXNoR3JvdXBNYXJrZXJFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlYWRCdWZmZXJOVjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVhZG5QaXhlbHNFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXhTdG9yYWdlMURFWFQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpnbFRleFN0b3JhZ2UyREVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVGV4U3RvcmFnZTNERVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXh0dXJlU3RvcmFnZTFERVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXh0dXJlU3RvcmFnZTJERVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xUZXh0dXJlU3RvcmFnZTNERVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xVc2VQcm9ncmFtU3RhZ2VzRVhUOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6Z2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldERpc3BsYXk7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xJbml0aWFsaXplOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsVGVybWluYXRlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0Q29uZmlnczsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbENob29zZUNvbmZpZzsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldENvbmZpZ0F0dHJpYjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbENyZWF0ZVdpbmRvd1N1cmZhY2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xDcmVhdGVQaXhtYXBTdXJmYWNlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2U7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xEZXN0cm95U3VyZmFjZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbFF1ZXJ5U3VyZmFjZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbENyZWF0ZUNvbnRleHQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xEZXN0cm95Q29udGV4dDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbE1ha2VDdXJyZW50OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0Q3VycmVudENvbnRleHQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRDdXJyZW50U3VyZmFjZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbEdldEN1cnJlbnREaXNwbGF5OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsUXVlcnlDb250ZXh0OwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsV2FpdEdMOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsV2FpdE5hdGl2ZTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbFN3YXBCdWZmZXJzOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ29weUJ1ZmZlcnM7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRFcnJvcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbFF1ZXJ5U3RyaW5nOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0UHJvY0FkZHJlc3M7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xTdXJmYWNlQXR0cmliOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQmluZFRleEltYWdlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsUmVsZWFzZVRleEltYWdlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsU3dhcEludGVydmFsOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQmluZEFQSTsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbFF1ZXJ5QVBJOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsV2FpdENsaWVudDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbFJlbGVhc2VUaHJlYWQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xDcmVhdGVQYnVmZmVyRnJvbUNsaWVudEJ1ZmZlcjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbExvY2tTdXJmYWNlS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsVW5sb2NrU3VyZmFjZUtIUjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbENyZWF0ZUltYWdlS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsRGVzdHJveUltYWdlS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ3JlYXRlU3luY0tIUjsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmVnbERlc3Ryb3lTeW5jS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsQ2xpZW50V2FpdFN5bmNLSFI7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRTeW5jQXR0cmliS0hSOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsU2V0U3dhcFJlY3RhbmdsZUFORFJPSUQ7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjplZ2xHZXRSZW5kZXJCdWZmZXJBTkRST0lEOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6ZWdsR2V0U3lzdGVtVGltZU5WOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZTo6aW52YWxpZDsKLWNvbnN0IEdMTWVzc2FnZV9GdW5jdGlvbiBHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliUG9pbnRlckRhdGE7Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpGdW5jdGlvbl9NSU47Ci1jb25zdCBHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpGdW5jdGlvbl9NQVg7Ci1jb25zdCBpbnQgR0xNZXNzYWdlOjpGdW5jdGlvbl9BUlJBWVNJWkU7Ci0jZW5kaWYgIC8vIF9NU0NfVkVSCi1ib29sIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNDoKLSAgICBjYXNlIDU6Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotI2lmbmRlZiBfTVNDX1ZFUgotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpWT0lEOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpDSEFSOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpCWVRFOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpJTlQ7Ci1jb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZSBHTE1lc3NhZ2VfRGF0YVR5cGU6OkZMT0FUOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpCT09MOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpFTlVNOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlOjpUeXBlX01JTjsKLWNvbnN0IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlIEdMTWVzc2FnZV9EYXRhVHlwZTo6VHlwZV9NQVg7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjpUeXBlX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gX01TQ19WRVIKLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmtUeXBlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjprSXNBcnJheUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6a0ludFZhbHVlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjprRmxvYXRWYWx1ZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6a0NoYXJWYWx1ZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6a1Jhd0J5dGVzRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjprQm9vbFZhbHVlRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1HTE1lc3NhZ2VfRGF0YVR5cGU6OkdMTWVzc2FnZV9EYXRhVHlwZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1HTE1lc3NhZ2VfRGF0YVR5cGU6OkdMTWVzc2FnZV9EYXRhVHlwZShjb25zdCBHTE1lc3NhZ2VfRGF0YVR5cGUmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgdHlwZV8gPSAxOwotICBpc2FycmF5XyA9IGZhbHNlOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1HTE1lc3NhZ2VfRGF0YVR5cGU6On5HTE1lc3NhZ2VfRGF0YVR5cGUoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBHTE1lc3NhZ2VfRGF0YVR5cGU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotR0xNZXNzYWdlX0RhdGFUeXBlKiBHTE1lc3NhZ2VfRGF0YVR5cGU6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotR0xNZXNzYWdlX0RhdGFUeXBlKiBHTE1lc3NhZ2VfRGF0YVR5cGU6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBHTE1lc3NhZ2VfRGF0YVR5cGU7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICB0eXBlXyA9IDE7Ci0gICAgaXNhcnJheV8gPSBmYWxzZTsKLSAgfQotICBpbnR2YWx1ZV8uQ2xlYXIoKTsKLSAgZmxvYXR2YWx1ZV8uQ2xlYXIoKTsKLSAgY2hhcnZhbHVlXy5DbGVhcigpOwotICByYXdieXRlc18uQ2xlYXIoKTsKLSAgYm9vbHZhbHVlXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1ib29sIEdMTWVzc2FnZV9EYXRhVHlwZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVxdWlyZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUuVHlwZSB0eXBlID0gMSBbZGVmYXVsdCA9IFZPSURdOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7Ci0gICAgICAgICAgaWYgKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF90eXBlKHN0YXRpY19jYXN0PCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlID4odmFsdWUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfaXNBcnJheTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIHJlcXVpcmVkIGJvb2wgaXNBcnJheSA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9pc0FycmF5OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmaXNhcnJheV8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfaW50VmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCBpbnQzMiBpbnRWYWx1ZSA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9pbnRWYWx1ZToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICAxLCAyNCwgaW5wdXQsIHRoaXMtPm11dGFibGVfaW50dmFsdWUoKSkpKTsKLSAgICAgICAgfSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKQotICAgICAgICAgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgICAgICAgICAgICAgICAgICBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZU5vSW5saW5lPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfaW50dmFsdWUoKSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9pbnRWYWx1ZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzcpKSBnb3RvIHBhcnNlX2Zsb2F0VmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCBmbG9hdCBmbG9hdFZhbHVlID0gNDsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSB7Ci0gICAgICAgICBwYXJzZV9mbG9hdFZhbHVlOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBmbG9hdCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRkxPQVQ+KAotICAgICAgICAgICAgICAgICAxLCAzNywgaW5wdXQsIHRoaXMtPm11dGFibGVfZmxvYXR2YWx1ZSgpKSkpOwotICAgICAgICB9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpCi0gICAgICAgICAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgICAgICAgICAgICAgICAgIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmU8Ci0gICAgICAgICAgICAgICAgICAgZmxvYXQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0ZMT0FUPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZmxvYXR2YWx1ZSgpKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzcpKSBnb3RvIHBhcnNlX2Zsb2F0VmFsdWU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9jaGFyVmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCBieXRlcyBjaGFyVmFsdWUgPSA1OwotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2NoYXJWYWx1ZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX2NoYXJ2YWx1ZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MikpIGdvdG8gcGFyc2VfY2hhclZhbHVlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1MCkpIGdvdG8gcGFyc2VfcmF3Qnl0ZXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCBieXRlcyByYXdCeXRlcyA9IDY7Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfcmF3Qnl0ZXM6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPmFkZF9yYXdieXRlcygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1MCkpIGdvdG8gcGFyc2VfcmF3Qnl0ZXM7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU2KSkgZ290byBwYXJzZV9ib29sVmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCBib29sIGJvb2xWYWx1ZSA9IDc7Ci0gICAgICBjYXNlIDc6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9ib29sVmFsdWU6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICAxLCA1NiwgaW5wdXQsIHRoaXMtPm11dGFibGVfYm9vbHZhbHVlKCkpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykKLSAgICAgICAgICAgICAgICAgICA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgICAgICAgICAgICAgICAgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfYm9vbHZhbHVlKCkpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1NikpIGdvdG8gcGFyc2VfYm9vbFZhbHVlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUuVHlwZSB0eXBlID0gMSBbZGVmYXVsdCA9IFZPSURdOwotICBpZiAoX2hhc19iaXQoMCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgMSwgdGhpcy0+dHlwZSgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXF1aXJlZCBib29sIGlzQXJyYXkgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoX2hhc19iaXQoMSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPmlzYXJyYXkoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgaW50MzIgaW50VmFsdWUgPSAzOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmludHZhbHVlX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoCi0gICAgICAzLCB0aGlzLT5pbnR2YWx1ZShpKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgZmxvYXQgZmxvYXRWYWx1ZSA9IDQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmxvYXR2YWx1ZV9zaXplKCk7IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0KAotICAgICAgNCwgdGhpcy0+ZmxvYXR2YWx1ZShpKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgYnl0ZXMgY2hhclZhbHVlID0gNTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5jaGFydmFsdWVfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlcygKLSAgICAgIDUsIHRoaXMtPmNoYXJ2YWx1ZShpKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgYnl0ZXMgcmF3Qnl0ZXMgPSA2OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnJhd2J5dGVzX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoCi0gICAgICA2LCB0aGlzLT5yYXdieXRlcyhpKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgYm9vbCBib29sVmFsdWUgPSA3OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmJvb2x2YWx1ZV9zaXplKCk7IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woCi0gICAgICA3LCB0aGlzLT5ib29sdmFsdWUoaSksIG91dHB1dCk7Ci0gIH0KLSAgCi19Ci0KLWludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OkJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIC8vIHJlcXVpcmVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlLlR5cGUgdHlwZSA9IDEgW2RlZmF1bHQgPSBWT0lEXTsKLSAgICBpZiAoaGFzX3R5cGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPnR5cGUoKSk7Ci0gICAgfQotICAgIAotICAgIC8vIHJlcXVpcmVkIGJvb2wgaXNBcnJheSA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19pc2FycmF5KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotICAgIAotICB9Ci0gIC8vIHJlcGVhdGVkIGludDMyIGludFZhbHVlID0gMzsKLSAgewotICAgIGludCBkYXRhX3NpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+aW50dmFsdWVfc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRhdGFfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgIEludDMyU2l6ZSh0aGlzLT5pbnR2YWx1ZShpKSk7Ci0gICAgfQotICAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmludHZhbHVlX3NpemUoKSArIGRhdGFfc2l6ZTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgZmxvYXQgZmxvYXRWYWx1ZSA9IDQ7Ci0gIHsKLSAgICBpbnQgZGF0YV9zaXplID0gMDsKLSAgICBkYXRhX3NpemUgPSA0ICogdGhpcy0+ZmxvYXR2YWx1ZV9zaXplKCk7Ci0gICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZmxvYXR2YWx1ZV9zaXplKCkgKyBkYXRhX3NpemU7Ci0gIH0KLSAgCi0gIC8vIHJlcGVhdGVkIGJ5dGVzIGNoYXJWYWx1ZSA9IDU7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmNoYXJ2YWx1ZV9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+Y2hhcnZhbHVlX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Qnl0ZXNTaXplKAotICAgICAgdGhpcy0+Y2hhcnZhbHVlKGkpKTsKLSAgfQotICAKLSAgLy8gcmVwZWF0ZWQgYnl0ZXMgcmF3Qnl0ZXMgPSA2OwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5yYXdieXRlc19zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cmF3Ynl0ZXNfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoCi0gICAgICB0aGlzLT5yYXdieXRlcyhpKSk7Ci0gIH0KLSAgCi0gIC8vIHJlcGVhdGVkIGJvb2wgYm9vbFZhbHVlID0gNzsKLSAgewotICAgIGludCBkYXRhX3NpemUgPSAwOwotICAgIGRhdGFfc2l6ZSA9IDEgKiB0aGlzLT5ib29sdmFsdWVfc2l6ZSgpOwotICAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmJvb2x2YWx1ZV9zaXplKCkgKyBkYXRhX3NpemU7Ci0gIH0KLSAgCi0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpDaGVja1R5cGVBbmRNZXJnZUZyb20oCi0gICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkgewotICBNZXJnZUZyb20oKjo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PGNvbnN0IEdMTWVzc2FnZV9EYXRhVHlwZSo+KCZmcm9tKSk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpNZXJnZUZyb20oY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGludHZhbHVlXy5NZXJnZUZyb20oZnJvbS5pbnR2YWx1ZV8pOwotICBmbG9hdHZhbHVlXy5NZXJnZUZyb20oZnJvbS5mbG9hdHZhbHVlXyk7Ci0gIGNoYXJ2YWx1ZV8uTWVyZ2VGcm9tKGZyb20uY2hhcnZhbHVlXyk7Ci0gIHJhd2J5dGVzXy5NZXJnZUZyb20oZnJvbS5yYXdieXRlc18pOwotICBib29sdmFsdWVfLk1lcmdlRnJvbShmcm9tLmJvb2x2YWx1ZV8pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMCkpIHsKLSAgICAgIHNldF90eXBlKGZyb20udHlwZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMSkpIHsKLSAgICAgIHNldF9pc2FycmF5KGZyb20uaXNhcnJheSgpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OkNvcHlGcm9tKGNvbnN0IEdMTWVzc2FnZV9EYXRhVHlwZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICBpZiAoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAzKSAhPSAweDAwMDAwMDAzKSByZXR1cm4gZmFsc2U7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OlN3YXAoR0xNZXNzYWdlX0RhdGFUeXBlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcCh0eXBlXywgb3RoZXItPnR5cGVfKTsKLSAgICBzdGQ6OnN3YXAoaXNhcnJheV8sIG90aGVyLT5pc2FycmF5Xyk7Ci0gICAgaW50dmFsdWVfLlN3YXAoJm90aGVyLT5pbnR2YWx1ZV8pOwotICAgIGZsb2F0dmFsdWVfLlN3YXAoJm90aGVyLT5mbG9hdHZhbHVlXyk7Ci0gICAgY2hhcnZhbHVlXy5Td2FwKCZvdGhlci0+Y2hhcnZhbHVlXyk7Ci0gICAgcmF3Ynl0ZXNfLlN3YXAoJm90aGVyLT5yYXdieXRlc18pOwotICAgIGJvb2x2YWx1ZV8uU3dhcCgmb3RoZXItPmJvb2x2YWx1ZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQotfQotCi06OnN0ZDo6c3RyaW5nIEdMTWVzc2FnZV9EYXRhVHlwZTo6R2V0VHlwZU5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAiYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSI7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZuZGVmIF9NU0NfVkVSCi1jb25zdCBpbnQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjprV2lkdGhGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmtIZWlnaHRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmtDb250ZW50c0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXIoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXIoY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHdpZHRoXyA9IDA7Ci0gIGhlaWdodF8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1HTE1lc3NhZ2VfRnJhbWVCdWZmZXI6On5HTE1lc3NhZ2VfRnJhbWVCdWZmZXIoKSB7Ci0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICB3aWR0aF8gPSAwOwotICAgIGhlaWdodF8gPSAwOwotICB9Ci0gIGNvbnRlbnRzXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1ib29sIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVxdWlyZWQgaW50MzIgd2lkdGggPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJndpZHRoXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9oZWlnaHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXF1aXJlZCBpbnQzMiBoZWlnaHQgPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfaGVpZ2h0OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmhlaWdodF8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfY29udGVudHM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCBieXRlcyBjb250ZW50cyA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfY29udGVudHM6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPmFkZF9jb250ZW50cygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfY29udGVudHM7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyByZXF1aXJlZCBpbnQzMiB3aWR0aCA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPndpZHRoKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGhlaWdodCA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDIsIHRoaXMtPmhlaWdodCgpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXBlYXRlZCBieXRlcyBjb250ZW50cyA9IDM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+Y29udGVudHNfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlcygKLSAgICAgIDMsIHRoaXMtPmNvbnRlbnRzKGkpLCBvdXRwdXQpOwotICB9Ci0gIAotfQotCi1pbnQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICAvLyByZXF1aXJlZCBpbnQzMiB3aWR0aCA9IDE7Ci0gICAgaWYgKGhhc193aWR0aCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPndpZHRoKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCBpbnQzMiBoZWlnaHQgPSAyOwotICAgIGlmIChoYXNfaGVpZ2h0KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+aGVpZ2h0KCkpOwotICAgIH0KLSAgICAKLSAgfQotICAvLyByZXBlYXRlZCBieXRlcyBjb250ZW50cyA9IDM7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmNvbnRlbnRzX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5jb250ZW50c19zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkJ5dGVzU2l6ZSgKLSAgICAgIHRoaXMtPmNvbnRlbnRzKGkpKTsKLSAgfQotICAKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKLSAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlJiBmcm9tKSB7Ci0gIE1lcmdlRnJvbSgqOjpnb29nbGU6OnByb3RvYnVmOjpkb3duX2Nhc3Q8Y29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKj4oJmZyb20pKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6Ok1lcmdlRnJvbShjb25zdCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXImIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29udGVudHNfLk1lcmdlRnJvbShmcm9tLmNvbnRlbnRzXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5faGFzX2JpdCgwKSkgewotICAgICAgc2V0X3dpZHRoKGZyb20ud2lkdGgoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDEpKSB7Ci0gICAgICBzZXRfaGVpZ2h0KGZyb20uaGVpZ2h0KCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Q29weUZyb20oY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmcm9tKSB7Ci0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDMpICE9IDB4MDAwMDAwMDMpIHJldHVybiBmYWxzZTsKLSAgCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6U3dhcChHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKHdpZHRoXywgb3RoZXItPndpZHRoXyk7Ci0gICAgc3RkOjpzd2FwKGhlaWdodF8sIG90aGVyLT5oZWlnaHRfKTsKLSAgICBjb250ZW50c18uU3dhcCgmb3RoZXItPmNvbnRlbnRzXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6c3RkOjpzdHJpbmcgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJhbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkZyYW1lQnVmZmVyIjsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZm5kZWYgX01TQ19WRVIKLWNvbnN0IGludCBHTE1lc3NhZ2U6OmtDb250ZXh0SWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2U6OmtTdGFydFRpbWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2U6OmtEdXJhdGlvbkZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZTo6a0Z1bmN0aW9uRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlOjprQXJnc0ZpZWxkTnVtYmVyOwotY29uc3QgaW50IEdMTWVzc2FnZTo6a1JldHVyblZhbHVlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR0xNZXNzYWdlOjprRmJGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHTE1lc3NhZ2U6OmtUaHJlYWR0aW1lRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgotCi1HTE1lc3NhZ2U6OkdMTWVzc2FnZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIEdMTWVzc2FnZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICByZXR1cm52YWx1ZV8gPSBjb25zdF9jYXN0PCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSo+KCY6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgZmJfID0gY29uc3RfY2FzdDwgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXIqPigmOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLUdMTWVzc2FnZTo6R0xNZXNzYWdlKGNvbnN0IEdMTWVzc2FnZSYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBHTE1lc3NhZ2U6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBjb250ZXh0X2lkXyA9IDA7Ci0gIHN0YXJ0X3RpbWVfID0gR09PR0xFX0xPTkdMT05HKDApOwotICBkdXJhdGlvbl8gPSAwOwotICBmdW5jdGlvbl8gPSAzMDAwOwotICByZXR1cm52YWx1ZV8gPSBOVUxMOwotICBmYl8gPSBOVUxMOwotICB0aHJlYWR0aW1lXyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUdMTWVzc2FnZTo6fkdMTWVzc2FnZSgpIHsKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIEdMTWVzc2FnZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgICBkZWxldGUgcmV0dXJudmFsdWVfOwotICAgIGRlbGV0ZSBmYl87Ci0gIH0KLX0KLQotdm9pZCBHTE1lc3NhZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgR0xNZXNzYWdlJiBHTE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotR0xNZXNzYWdlKiBHTE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotR0xNZXNzYWdlKiBHTE1lc3NhZ2U6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBHTE1lc3NhZ2U7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlOjpDbGVhcigpIHsKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBjb250ZXh0X2lkXyA9IDA7Ci0gICAgc3RhcnRfdGltZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7Ci0gICAgZHVyYXRpb25fID0gMDsKLSAgICBmdW5jdGlvbl8gPSAzMDAwOwotICAgIGlmIChfaGFzX2JpdCg1KSkgewotICAgICAgaWYgKHJldHVybnZhbHVlXyAhPSBOVUxMKSByZXR1cm52YWx1ZV8tPjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlOjpDbGVhcigpOwotICAgIH0KLSAgICBpZiAoX2hhc19iaXQoNikpIHsKLSAgICAgIGlmIChmYl8gIT0gTlVMTCkgZmJfLT46OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Q2xlYXIoKTsKLSAgICB9Ci0gICAgdGhyZWFkdGltZV8gPSAwOwotICB9Ci0gIGFyZ3NfLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLWJvb2wgR0xNZXNzYWdlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBpbnQzMiBjb250ZXh0X2lkID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZjb250ZXh0X2lkXykpKTsKLSAgICAgICAgICBfc2V0X2JpdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9zdGFydF90aW1lOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gcmVxdWlyZWQgaW50NjQgc3RhcnRfdGltZSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9zdGFydF90aW1lOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UNjQ+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnN0YXJ0X3RpbWVfKSkpOwotICAgICAgICAgIF9zZXRfYml0KDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjQpKSBnb3RvIHBhcnNlX2R1cmF0aW9uOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gcmVxdWlyZWQgaW50MzIgZHVyYXRpb24gPSAzOwotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgewotICAgICAgICAgcGFyc2VfZHVyYXRpb246Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZHVyYXRpb25fKSkpOwotICAgICAgICAgIF9zZXRfYml0KDIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzIpKSBnb3RvIHBhcnNlX2Z1bmN0aW9uOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLy8gcmVxdWlyZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnVuY3Rpb24gZnVuY3Rpb24gPSA0IFtkZWZhdWx0ID0gaW52YWxpZF07Ci0gICAgICBjYXNlIDQ6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9mdW5jdGlvbjoKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmICg6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GdW5jdGlvbl9Jc1ZhbGlkKHZhbHVlKSkgewotICAgICAgICAgICAgc2V0X2Z1bmN0aW9uKHN0YXRpY19jYXN0PCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GdW5jdGlvbiA+KHZhbHVlKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2FyZ3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyByZXBlYXRlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSBhcmdzID0gNTsKLSAgICAgIGNhc2UgNTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9hcmdzOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9hcmdzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9hcmdzOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1MCkpIGdvdG8gcGFyc2VfcmV0dXJuVmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSByZXR1cm5WYWx1ZSA9IDY7Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfcmV0dXJuVmFsdWU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKLSAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX3JldHVybnZhbHVlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9mYjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIG9wdGlvbmFsIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkZyYW1lQnVmZmVyIGZiID0gNzsKLSAgICAgIGNhc2UgNzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9mYjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfZmIoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjQpKSBnb3RvIHBhcnNlX3RocmVhZHRpbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCBpbnQzMiB0aHJlYWR0aW1lID0gODsKLSAgICAgIGNhc2UgODogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKLSAgICAgICAgIHBhcnNlX3RocmVhZHRpbWU6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdGhyZWFkdGltZV8pKSk7Ci0gICAgICAgICAgX3NldF9iaXQoNyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotI3VuZGVmIERPXwotfQotCi12b2lkIEdMTWVzc2FnZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gcmVxdWlyZWQgaW50MzIgY29udGV4dF9pZCA9IDE7Ci0gIGlmIChfaGFzX2JpdCgwKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPmNvbnRleHRfaWQoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVxdWlyZWQgaW50NjQgc3RhcnRfdGltZSA9IDI7Ci0gIGlmIChfaGFzX2JpdCgxKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0KDIsIHRoaXMtPnN0YXJ0X3RpbWUoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gcmVxdWlyZWQgaW50MzIgZHVyYXRpb24gPSAzOwotICBpZiAoX2hhc19iaXQoMikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigzLCB0aGlzLT5kdXJhdGlvbigpLCBvdXRwdXQpOwotICB9Ci0gIAotICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GdW5jdGlvbiBmdW5jdGlvbiA9IDQgW2RlZmF1bHQgPSBpbnZhbGlkXTsKLSAgaWYgKF9oYXNfYml0KDMpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDQsIHRoaXMtPmZ1bmN0aW9uKCksIG91dHB1dCk7Ci0gIH0KLSAgCi0gIC8vIHJlcGVhdGVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIGFyZ3MgPSA1OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmFyZ3Nfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKAotICAgICAgNSwgdGhpcy0+YXJncyhpKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUgcmV0dXJuVmFsdWUgPSA2OwotICBpZiAoX2hhc19iaXQoNSkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKAotICAgICAgNiwgdGhpcy0+cmV0dXJudmFsdWUoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIgZmIgPSA3OwotICBpZiAoX2hhc19iaXQoNikpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKAotICAgICAgNywgdGhpcy0+ZmIoKSwgb3V0cHV0KTsKLSAgfQotICAKLSAgLy8gb3B0aW9uYWwgaW50MzIgdGhyZWFkdGltZSA9IDg7Ci0gIGlmIChfaGFzX2JpdCg3KSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDgsIHRoaXMtPnRocmVhZHRpbWUoKSwgb3V0cHV0KTsKLSAgfQotICAKLX0KLQotaW50IEdMTWVzc2FnZTo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gcmVxdWlyZWQgaW50MzIgY29udGV4dF9pZCA9IDE7Ci0gICAgaWYgKGhhc19jb250ZXh0X2lkKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+Y29udGV4dF9pZCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgaW50NjQgc3RhcnRfdGltZSA9IDI7Ci0gICAgaWYgKGhhc19zdGFydF90aW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQ2NFNpemUoCi0gICAgICAgICAgdGhpcy0+c3RhcnRfdGltZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgaW50MzIgZHVyYXRpb24gPSAzOwotICAgIGlmIChoYXNfZHVyYXRpb24oKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5kdXJhdGlvbigpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gcmVxdWlyZWQgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnVuY3Rpb24gZnVuY3Rpb24gPSA0IFtkZWZhdWx0ID0gaW52YWxpZF07Ci0gICAgaWYgKGhhc19mdW5jdGlvbigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+ZnVuY3Rpb24oKSk7Ci0gICAgfQotICAgIAotICAgIC8vIG9wdGlvbmFsIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIHJldHVyblZhbHVlID0gNjsKLSAgICBpZiAoaGFzX3JldHVybnZhbHVlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT5yZXR1cm52YWx1ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIgZmIgPSA3OwotICAgIGlmIChoYXNfZmIoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPmZiKCkpOwotICAgIH0KLSAgICAKLSAgICAvLyBvcHRpb25hbCBpbnQzMiB0aHJlYWR0aW1lID0gODsKLSAgICBpZiAoaGFzX3RocmVhZHRpbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT50aHJlYWR0aW1lKCkpOwotICAgIH0KLSAgICAKLSAgfQotICAvLyByZXBlYXRlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSBhcmdzID0gNTsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+YXJnc19zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+YXJnc19zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+YXJncyhpKSk7Ci0gIH0KLSAgCi0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlOjpDaGVja1R5cGVBbmRNZXJnZUZyb20oCi0gICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkgewotICBNZXJnZUZyb20oKjo6Z29vZ2xlOjpwcm90b2J1Zjo6ZG93bl9jYXN0PGNvbnN0IEdMTWVzc2FnZSo+KCZmcm9tKSk7Ci19Ci0KLXZvaWQgR0xNZXNzYWdlOjpNZXJnZUZyb20oY29uc3QgR0xNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGFyZ3NfLk1lcmdlRnJvbShmcm9tLmFyZ3NfKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLl9oYXNfYml0KDApKSB7Ci0gICAgICBzZXRfY29udGV4dF9pZChmcm9tLmNvbnRleHRfaWQoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDEpKSB7Ci0gICAgICBzZXRfc3RhcnRfdGltZShmcm9tLnN0YXJ0X3RpbWUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDIpKSB7Ci0gICAgICBzZXRfZHVyYXRpb24oZnJvbS5kdXJhdGlvbigpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoMykpIHsKLSAgICAgIHNldF9mdW5jdGlvbihmcm9tLmZ1bmN0aW9uKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5faGFzX2JpdCg1KSkgewotICAgICAgbXV0YWJsZV9yZXR1cm52YWx1ZSgpLT46OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZTo6TWVyZ2VGcm9tKGZyb20ucmV0dXJudmFsdWUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLl9oYXNfYml0KDYpKSB7Ci0gICAgICBtdXRhYmxlX2ZiKCktPjo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpNZXJnZUZyb20oZnJvbS5mYigpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uX2hhc19iaXQoNykpIHsKLSAgICAgIHNldF90aHJlYWR0aW1lKGZyb20udGhyZWFkdGltZSgpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBHTE1lc3NhZ2U6OkNvcHlGcm9tKGNvbnN0IEdMTWVzc2FnZSYgZnJvbSkgewotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgR0xNZXNzYWdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICBpZiAoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDBmKSAhPSAweDAwMDAwMDBmKSByZXR1cm4gZmFsc2U7Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Nfc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIXRoaXMtPmFyZ3MoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGhhc19yZXR1cm52YWx1ZSgpKSB7Ci0gICAgaWYgKCF0aGlzLT5yZXR1cm52YWx1ZSgpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChoYXNfZmIoKSkgewotICAgIGlmICghdGhpcy0+ZmIoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHTE1lc3NhZ2U6OlN3YXAoR0xNZXNzYWdlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChjb250ZXh0X2lkXywgb3RoZXItPmNvbnRleHRfaWRfKTsKLSAgICBzdGQ6OnN3YXAoc3RhcnRfdGltZV8sIG90aGVyLT5zdGFydF90aW1lXyk7Ci0gICAgc3RkOjpzd2FwKGR1cmF0aW9uXywgb3RoZXItPmR1cmF0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKGZ1bmN0aW9uXywgb3RoZXItPmZ1bmN0aW9uXyk7Ci0gICAgYXJnc18uU3dhcCgmb3RoZXItPmFyZ3NfKTsKLSAgICBzdGQ6OnN3YXAocmV0dXJudmFsdWVfLCBvdGhlci0+cmV0dXJudmFsdWVfKTsKLSAgICBzdGQ6OnN3YXAoZmJfLCBvdGhlci0+ZmJfKTsKLSAgICBzdGQ6OnN3YXAodGhyZWFkdGltZV8sIG90aGVyLT50aHJlYWR0aW1lXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9Ci19Ci0KLTo6c3RkOjpzdHJpbmcgR0xNZXNzYWdlOjpHZXRUeXBlTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJhbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlIjsKLX0KLQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQotCi19ICAvLyBuYW1lc3BhY2UgZ2x0cmFjZQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2UucGIuaCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2UucGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkwMWJlNy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlLnBiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODk1ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdsdHJhY2UucHJvdG8KLQotI2lmbmRlZiBQUk9UT0JVRl9nbHRyYWNlXzJlcHJvdG9fX0lOQ0xVREVECi0jZGVmaW5lIFBST1RPQlVGX2dsdHJhY2VfMmVwcm90b19fSU5DTFVERUQKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMjAwMzAwMAotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKLSNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQotI2Vycm9yIHlvdXIgaGVhZGVycy4KLSNlbmRpZgotI2lmIDIwMDMwMDAgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKLSNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCi0jZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIC0tIGRvIG5vdCBjYWxsIHRoZXNlLgotdm9pZCAgcHJvdG9idWZfQWRkRGVzY19nbHRyYWNlXzJlcHJvdG8oKTsKLXZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nbHRyYWNlXzJlcHJvdG8oKTsKLXZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dsdHJhY2VfMmVwcm90bygpOwotCi1jbGFzcyBHTE1lc3NhZ2U7Ci1jbGFzcyBHTE1lc3NhZ2VfRGF0YVR5cGU7Ci1jbGFzcyBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI7Ci0KLWVudW0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgewotICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9WT0lEID0gMSwKLSAgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfQ0hBUiA9IDIsCi0gIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0JZVEUgPSAzLAotICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9JTlQgPSA0LAotICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9GTE9BVCA9IDUsCi0gIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0JPT0wgPSA2LAotICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9FTlVNID0gNwotfTsKLWJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfVHlwZV9NSU4gPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9WT0lEOwotY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfVHlwZV9NQVggPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9FTlVNOwotY29uc3QgaW50IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1R5cGVfQVJSQVlTSVpFID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfVHlwZV9NQVggKyAxOwotCi1lbnVtIEdMTWVzc2FnZV9GdW5jdGlvbiB7Ci0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFjdGl2ZVRleHR1cmUgPSAwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBbHBoYUZ1bmMgPSAxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBbHBoYUZ1bmN4ID0gMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQWxwaGFGdW5jeE9FUyA9IDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEF0dGFjaFNoYWRlciA9IDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJlZ2luUGVyZk1vbml0b3JBTUQgPSA1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kQXR0cmliTG9jYXRpb24gPSA2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kQnVmZmVyID0gNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZEZyYW1lYnVmZmVyID0gOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZEZyYW1lYnVmZmVyT0VTID0gOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmluZFJlbmRlcmJ1ZmZlciA9IDEwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kUmVuZGVyYnVmZmVyT0VTID0gMTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRUZXh0dXJlID0gMTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRWZXJ0ZXhBcnJheU9FUyA9IDEzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZENvbG9yID0gMTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRXF1YXRpb24gPSAxNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvbk9FUyA9IDE2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUgPSAxNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTID0gMTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRnVuYyA9IDE5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEZ1bmNTZXBhcmF0ZSA9IDIwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyA9IDIxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCdWZmZXJEYXRhID0gMjIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJ1ZmZlclN1YkRhdGEgPSAyMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyA9IDI0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTID0gMjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsZWFyQ29sb3IgPSAyNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJDb2xvcnggPSAyNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJDb2xvcnhPRVMgPSAyOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJEZXB0aGYgPSAyOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJEZXB0aGZPRVMgPSAzMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJEZXB0aHggPSAzMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJEZXB0aHhPRVMgPSAzMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXIgPSAzMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJTdGVuY2lsID0gMzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaWVudEFjdGl2ZVRleHR1cmUgPSAzNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5lZiA9IDM2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmVmSU1HID0gMzcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZWZPRVMgPSAzOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5leCA9IDM5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmV4SU1HID0gNDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZXhPRVMgPSA0MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3I0ZiA9IDQyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvcjR1YiA9IDQzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvcjR4ID0gNDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yNHhPRVMgPSA0NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3JNYXNrID0gNDYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yUG9pbnRlciA9IDQ3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb21waWxlU2hhZGVyID0gNDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhJbWFnZTJEID0gNDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhJbWFnZTNET0VTID0gNTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEID0gNTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTID0gNTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvcHlUZXhJbWFnZTJEID0gNTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvcHlUZXhTdWJJbWFnZTJEID0gNTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvcHlUZXhTdWJJbWFnZTNET0VTID0gNTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvdmVyYWdlTWFza05WID0gNTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvdmVyYWdlT3BlcmF0aW9uTlYgPSA1NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3JlYXRlUHJvZ3JhbSA9IDU4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDcmVhdGVTaGFkZXIgPSA1OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3VsbEZhY2UgPSA2MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgPSA2MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlQnVmZmVycyA9IDYyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVGZW5jZXNOViA9IDYzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVGcmFtZWJ1ZmZlcnMgPSA2NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlRnJhbWVidWZmZXJzT0VTID0gNjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVBlcmZNb25pdG9yc0FNRCA9IDY2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVQcm9ncmFtID0gNjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVJlbmRlcmJ1ZmZlcnMgPSA2OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyA9IDY5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVTaGFkZXIgPSA3MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlVGV4dHVyZXMgPSA3MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlVmVydGV4QXJyYXlzT0VTID0gNzIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoRnVuYyA9IDczLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aE1hc2sgPSA3NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVwdGhSYW5nZWYgPSA3NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVwdGhSYW5nZWZPRVMgPSA3NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVwdGhSYW5nZXggPSA3NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVwdGhSYW5nZXhPRVMgPSA3OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGV0YWNoU2hhZGVyID0gNzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGVDbGllbnRTdGF0ZSA9IDgwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00gPSA4MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzYWJsZSA9IDgyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgPSA4MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzY2FyZEZyYW1lYnVmZmVyRVhUID0gODQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdBcnJheXMgPSA4NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd0VsZW1lbnRzID0gODYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhmT0VTID0gODcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhmdk9FUyA9IDg4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4aU9FUyA9IDg5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4aXZPRVMgPSA5MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleHNPRVMgPSA5MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleHN2T0VTID0gOTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXh4T0VTID0gOTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXh4dk9FUyA9IDk0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgPSA5NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgPSA5NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5hYmxlQ2xpZW50U3RhdGUgPSA5NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gPSA5OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5hYmxlID0gOTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5ID0gMTAwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmRQZXJmTW9uaXRvckFNRCA9IDEwMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5kVGlsaW5nUUNPTSA9IDEwMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NID0gMTAzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRCdWZmZXJzUUNPTSA9IDEwNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSA9IDEwNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00gPSAxMDYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFByb2dyYW1zUUNPTSA9IDEwNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00gPSAxMDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFNoYWRlcnNRQ09NID0gMTA5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSA9IDExMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NID0gMTExLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRUZXh0dXJlc1FDT00gPSAxMTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00gPSAxMTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSA9IDExNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRmluaXNoRmVuY2VOViA9IDExNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRmluaXNoID0gMTE2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGbHVzaCA9IDExNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9nZiA9IDExOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9nZnYgPSAxMTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3ggPSAxMjAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3hPRVMgPSAxMjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ3h2ID0gMTIyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2d4dk9FUyA9IDEyMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIgPSAxMjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTID0gMTI1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCA9IDEyNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRyA9IDEyNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgPSAxMjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTID0gMTI5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcm9udEZhY2UgPSAxMzAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW1mID0gMTMxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcnVzdHVtZk9FUyA9IDEzMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJ1c3R1bXggPSAxMzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZydXN0dW14T0VTID0gMTM0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5CdWZmZXJzID0gMTM1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5lcmF0ZU1pcG1hcCA9IDEzNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuZXJhdGVNaXBtYXBPRVMgPSAxMzcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbkZlbmNlc05WID0gMTM4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5GcmFtZWJ1ZmZlcnMgPSAxMzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbkZyYW1lYnVmZmVyc09FUyA9IDE0MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuUGVyZk1vbml0b3JzQU1EID0gMTQxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5SZW5kZXJidWZmZXJzID0gMTQyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5SZW5kZXJidWZmZXJzT0VTID0gMTQzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5UZXh0dXJlcyA9IDE0NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuVmVydGV4QXJyYXlzT0VTID0gMTQ1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRBY3RpdmVBdHRyaWIgPSAxNDYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEFjdGl2ZVVuaWZvcm0gPSAxNDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEF0dGFjaGVkU2hhZGVycyA9IDE0OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QXR0cmliTG9jYXRpb24gPSAxNDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEJvb2xlYW52ID0gMTUwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiA9IDE1MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QnVmZmVyUG9pbnRlcnZPRVMgPSAxNTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZWYgPSAxNTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZWZPRVMgPSAxNTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZXggPSAxNTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZXhPRVMgPSAxNTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldERyaXZlckNvbnRyb2xzUUNPTSA9IDE1NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00gPSAxNTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEVycm9yID0gMTU5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGZW5jZWl2TlYgPSAxNjAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZpeGVkdiA9IDE2MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Rml4ZWR2T0VTID0gMTYyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGbG9hdHYgPSAxNjMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2ID0gMTY0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyA9IDE2NSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0SW50ZWdlcnYgPSAxNjYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldExpZ2h0ZnYgPSAxNjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldExpZ2h0eHYgPSAxNjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldExpZ2h0eHZPRVMgPSAxNjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE1hdGVyaWFsZnYgPSAxNzAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE1hdGVyaWFseHYgPSAxNzEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE1hdGVyaWFseHZPRVMgPSAxNzIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQgPSAxNzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQgPSAxNzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQgPSAxNzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCA9IDE3NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQgPSAxNzcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQgPSAxNzgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBvaW50ZXJ2ID0gMTc5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtQmluYXJ5T0VTID0gMTgwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQcm9ncmFtSW5mb0xvZyA9IDE4MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbWl2ID0gMTgyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiA9IDE4MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgPSAxODQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFNoYWRlckluZm9Mb2cgPSAxODUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFNoYWRlcml2ID0gMTg2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSAxODcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFNoYWRlclNvdXJjZSA9IDE4OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U3RyaW5nID0gMTg5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZmdiA9IDE5MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4RW52aXYgPSAxOTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleEVudnh2ID0gMTkyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhFbnZ4dk9FUyA9IDE5MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4R2VuZnZPRVMgPSAxOTQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleEdlbml2T0VTID0gMTk1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhHZW54dk9FUyA9IDE5NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyZnYgPSAxOTcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFRleFBhcmFtZXRlcml2ID0gMTk4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRUZXhQYXJhbWV0ZXJ4diA9IDE5OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyeHZPRVMgPSAyMDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFVuaWZvcm1mdiA9IDIwMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VW5pZm9ybWl2ID0gMjAyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRVbmlmb3JtTG9jYXRpb24gPSAyMDMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFZlcnRleEF0dHJpYmZ2ID0gMjA0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRWZXJ0ZXhBdHRyaWJpdiA9IDIwNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYgPSAyMDYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEhpbnQgPSAyMDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzQnVmZmVyID0gMjA4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc0VuYWJsZWQgPSAyMDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzRmVuY2VOViA9IDIxMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNGcmFtZWJ1ZmZlciA9IDIxMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNGcmFtZWJ1ZmZlck9FUyA9IDIxMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNQcm9ncmFtID0gMjEzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1JlbmRlcmJ1ZmZlciA9IDIxNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNSZW5kZXJidWZmZXJPRVMgPSAyMTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzU2hhZGVyID0gMjE2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1RleHR1cmUgPSAyMTcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzVmVydGV4QXJyYXlPRVMgPSAyMTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0ZiA9IDIxOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRmdiA9IDIyMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbGYgPSAyMjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWxmdiA9IDIyMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbHggPSAyMjMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWx4T0VTID0gMjI0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVseHYgPSAyMjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWx4dk9FUyA9IDIyNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4ID0gMjI3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodHhPRVMgPSAyMjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0eHYgPSAyMjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0eHZPRVMgPSAyMzAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpbmVXaWR0aCA9IDIzMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGluZVdpZHRoeCA9IDIzMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGluZVdpZHRoeE9FUyA9IDIzMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlua1Byb2dyYW0gPSAyMzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvYWRJZGVudGl0eSA9IDIzNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZE1hdHJpeGYgPSAyMzYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvYWRNYXRyaXh4ID0gMjM3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkTWF0cml4eE9FUyA9IDIzOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTID0gMjM5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2dpY09wID0gMjQwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXBCdWZmZXJPRVMgPSAyNDEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdGVyaWFsZiA9IDI0MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWxmdiA9IDI0MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWx4ID0gMjQ0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbHhPRVMgPSAyNDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdGVyaWFseHYgPSAyNDYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdGVyaWFseHZPRVMgPSAyNDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hdHJpeEluZGV4UG9pbnRlck9FUyA9IDI0OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0cml4TW9kZSA9IDI0OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlEcmF3QXJyYXlzRVhUID0gMjUwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aURyYXdFbGVtZW50c0VYVCA9IDI1MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlUZXhDb29yZDRmID0gMjUyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aVRleENvb3JkNHggPSAyNTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRpVGV4Q29vcmQ0eE9FUyA9IDI1NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdE1hdHJpeGYgPSAyNTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRNYXRyaXh4ID0gMjU2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0TWF0cml4eE9FUyA9IDI1NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsM2YgPSAyNTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE5vcm1hbDN4ID0gMjU5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xOb3JtYWwzeE9FUyA9IDI2MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsUG9pbnRlciA9IDI2MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsT3J0aG9mID0gMjYyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xPcnRob2ZPRVMgPSAyNjMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbE9ydGhveCA9IDI2NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsT3J0aG94T0VTID0gMjY1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQaXhlbFN0b3JlaSA9IDI2NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRQYXJhbWV0ZXJmID0gMjY3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcmZ2ID0gMjY4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcnggPSAyNjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyeE9FUyA9IDI3MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRQYXJhbWV0ZXJ4diA9IDI3MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRQYXJhbWV0ZXJ4dk9FUyA9IDI3MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRTaXplID0gMjczLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemVQb2ludGVyT0VTID0gMjc0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemV4ID0gMjc1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemV4T0VTID0gMjc2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2x5Z29uT2Zmc2V0ID0gMjc3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2x5Z29uT2Zmc2V0eCA9IDI3OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9seWdvbk9mZnNldHhPRVMgPSAyNzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvcE1hdHJpeCA9IDI4MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbUJpbmFyeU9FUyA9IDI4MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHVzaE1hdHJpeCA9IDI4MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUXVlcnlNYXRyaXh4T0VTID0gMjgzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZWFkUGl4ZWxzID0gMjg0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIgPSAyODUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2UgPSAyODYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUlNRyA9IDI4NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyA9IDI4OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUm90YXRlZiA9IDI4OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUm90YXRleCA9IDI5MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUm90YXRleE9FUyA9IDI5MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2FtcGxlQ292ZXJhZ2UgPSAyOTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNhbXBsZUNvdmVyYWdleCA9IDI5MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2FtcGxlQ292ZXJhZ2V4T0VTID0gMjk0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTY2FsZWYgPSAyOTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNjYWxleCA9IDI5NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2NhbGV4T0VTID0gMjk3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTY2lzc29yID0gMjk4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EID0gMjk5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTZXRGZW5jZU5WID0gMzAwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTaGFkZU1vZGVsID0gMzAxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTaGFkZXJCaW5hcnkgPSAzMDIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNoYWRlclNvdXJjZSA9IDMwMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RhcnRUaWxpbmdRQ09NID0gMzA0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsRnVuYyA9IDMwNSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbEZ1bmNTZXBhcmF0ZSA9IDMwNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbE1hc2sgPSAzMDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxNYXNrU2VwYXJhdGUgPSAzMDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxPcCA9IDMwOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbE9wU2VwYXJhdGUgPSAzMTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRlc3RGZW5jZU5WID0gMzExLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhDb29yZFBvaW50ZXIgPSAzMTIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudmYgPSAzMTMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudmZ2ID0gMzE0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZpID0gMzE1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZpdiA9IDMxNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52eCA9IDMxNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52eE9FUyA9IDMxOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52eHYgPSAzMTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudnh2T0VTID0gMzIwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW5mT0VTID0gMzIxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW5mdk9FUyA9IDMyMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VuaU9FUyA9IDMyMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VuaXZPRVMgPSAzMjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbnhPRVMgPSAzMjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbnh2T0VTID0gMzI2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhJbWFnZTJEID0gMzI3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhJbWFnZTNET0VTID0gMzI4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJmID0gMzI5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJmdiA9IDMzMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyaSA9IDMzMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyaXYgPSAzMzIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcnggPSAzMzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcnhPRVMgPSAzMzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcnh2ID0gMzM1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJ4dk9FUyA9IDMzNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3ViSW1hZ2UyRCA9IDMzNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3ViSW1hZ2UzRE9FUyA9IDMzOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVHJhbnNsYXRlZiA9IDMzOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVHJhbnNsYXRleCA9IDM0MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVHJhbnNsYXRleE9FUyA9IDM0MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTFmID0gMzQyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWZ2ID0gMzQzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWkgPSAzNDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0xaXYgPSAzNDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0yZiA9IDM0NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTJmdiA9IDM0NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTJpID0gMzQ4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMml2ID0gMzQ5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtM2YgPSAzNTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zZnYgPSAzNTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm0zaSA9IDM1MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTNpdiA9IDM1MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybTRmID0gMzU0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGZ2ID0gMzU1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGkgPSAzNTYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm00aXYgPSAzNTcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm1NYXRyaXgyZnYgPSAzNTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm1NYXRyaXgzZnYgPSAzNTksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm1NYXRyaXg0ZnYgPSAzNjAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVubWFwQnVmZmVyT0VTID0gMzYxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVc2VQcm9ncmFtID0gMzYyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWYWxpZGF0ZVByb2dyYW0gPSAzNjMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjFmID0gMzY0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIxZnYgPSAzNjUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjJmID0gMzY2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIyZnYgPSAzNjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjNmID0gMzY4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIzZnYgPSAzNjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjRmID0gMzcwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWI0ZnYgPSAzNzEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYlBvaW50ZXIgPSAzNzIsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleFBvaW50ZXIgPSAzNzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZpZXdwb3J0ID0gMzc0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xXZWlnaHRQb2ludGVyT0VTID0gMzc1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUID0gNTAyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBbHBoYUZ1bmNRQ09NID0gNTAzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCZWdpblF1ZXJ5RVhUID0gNTA0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUID0gNTA1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGl0RnJhbWVidWZmZXJBTkdMRSA9IDUwNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQgPSA1MDcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQgPSA1MDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVF1ZXJpZXNFWFQgPSA1MDksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdCdWZmZXJzTlYgPSA1MTAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuZFF1ZXJ5RVhUID0gNTExLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUID0gNTEyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUID0gNTEzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5RdWVyaWVzRVhUID0gNTE0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUID0gNTE1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRPYmplY3RMYWJlbEVYVCA9IDUxNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCA9IDUxNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQgPSA1MTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFF1ZXJ5T2JqZWN0dWl2RVhUID0gNTE5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRRdWVyeWl2RVhUID0gNTIwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRuVW5pZm9ybWZ2RVhUID0gNTIxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRuVW5pZm9ybWl2RVhUID0gNTIxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJbnNlcnRFdmVudE1hcmtlckVYVCA9IDUyMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNQcm9ncmFtUGlwZWxpbmVFWFQgPSA1MjMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzUXVlcnlFWFQgPSA1MjQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbExhYmVsT2JqZWN0RVhUID0gNTI1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb3BHcm91cE1hcmtlckVYVCA9IDUyNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVBhcmFtZXRlcmlFWFQgPSA1MjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMWZFWFQgPSA1MjgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMWZ2RVhUID0gNTI5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTFpRVhUID0gNTMwLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVCA9IDUzMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0yZkVYVCA9IDUzMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0yZnZFWFQgPSA1MzMsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMmlFWFQgPSA1MzQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMml2RVhUID0gNTM1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTNmRVhUID0gNTM2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVCA9IDUzNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0zaUVYVCA9IDUzOCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0zaXZFWFQgPSA1MzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtNGZFWFQgPSA1NDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtNGZ2RVhUID0gNTQxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTRpRVhUID0gNTQyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVCA9IDU0MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQgPSA1NDQsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUID0gNTQ1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVCA9IDU0NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHVzaEdyb3VwTWFya2VyRVhUID0gNTQ3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZWFkQnVmZmVyTlYgPSA1NDgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlYWRuUGl4ZWxzRVhUID0gNTQ5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSA9IDU1MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUgPSA1NTEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVCA9IDU1MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSA9IDU1MywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3RvcmFnZTFERVhUID0gNTU0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdG9yYWdlMkRFWFQgPSA1NTUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFN0b3JhZ2UzREVYVCA9IDU1NiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4dHVyZVN0b3JhZ2UxREVYVCA9IDU1NywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4dHVyZVN0b3JhZ2UyREVYVCA9IDU1OCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4dHVyZVN0b3JhZ2UzREVYVCA9IDU1OSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVXNlUHJvZ3JhbVN0YWdlc0VYVCA9IDU2MCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQgPSA1NjEsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXREaXNwbGF5ID0gMjAwMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEluaXRpYWxpemUgPSAyMDAxLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsVGVybWluYXRlID0gMjAwMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldENvbmZpZ3MgPSAyMDAzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ2hvb3NlQ29uZmlnID0gMjAwNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldENvbmZpZ0F0dHJpYiA9IDIwMDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVXaW5kb3dTdXJmYWNlID0gMjAwNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZVBpeG1hcFN1cmZhY2UgPSAyMDA3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlUGJ1ZmZlclN1cmZhY2UgPSAyMDA4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsRGVzdHJveVN1cmZhY2UgPSAyMDA5LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUXVlcnlTdXJmYWNlID0gMjAxMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZUNvbnRleHQgPSAyMDExLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsRGVzdHJveUNvbnRleHQgPSAyMDEyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsTWFrZUN1cnJlbnQgPSAyMDEzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q3VycmVudENvbnRleHQgPSAyMDE0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q3VycmVudFN1cmZhY2UgPSAyMDE1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q3VycmVudERpc3BsYXkgPSAyMDE2LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUXVlcnlDb250ZXh0ID0gMjAxNywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFdhaXRHTCA9IDIwMTgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xXYWl0TmF0aXZlID0gMjAxOSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFN3YXBCdWZmZXJzID0gMjAyMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENvcHlCdWZmZXJzID0gMjAyMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldEVycm9yID0gMjAyMiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFF1ZXJ5U3RyaW5nID0gMjAyMywKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFByb2NBZGRyZXNzID0gMjAyNCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFN1cmZhY2VBdHRyaWIgPSAyMDI1LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQmluZFRleEltYWdlID0gMjAyNiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFJlbGVhc2VUZXhJbWFnZSA9IDIwMjcsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xTd2FwSW50ZXJ2YWwgPSAyMDI4LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQmluZEFQSSA9IDIwMjksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xRdWVyeUFQSSA9IDIwMzAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xXYWl0Q2xpZW50ID0gMjAzMSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFJlbGVhc2VUaHJlYWQgPSAyMDMyLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIgPSAyMDMzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsTG9ja1N1cmZhY2VLSFIgPSAyMDM0LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsVW5sb2NrU3VyZmFjZUtIUiA9IDIwMzUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVJbWFnZUtIUiA9IDIwMzYsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xEZXN0cm95SW1hZ2VLSFIgPSAyMDM3LAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlU3luY0tIUiA9IDIwMzgsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xEZXN0cm95U3luY0tIUiA9IDIwMzksCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDbGllbnRXYWl0U3luY0tIUiA9IDIwNDAsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRTeW5jQXR0cmliS0hSID0gMjA0MSwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFNldFN3YXBSZWN0YW5nbGVBTkRST0lEID0gMjA0MiwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFJlbmRlckJ1ZmZlckFORFJPSUQgPSAyMDQzLAotICBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0U3lzdGVtVGltZUZyZXF1ZW5jeU5WID0gMjA0NCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFN5c3RlbVRpbWVOViA9IDIwNDUsCi0gIEdMTWVzc2FnZV9GdW5jdGlvbl9pbnZhbGlkID0gMzAwMCwKLSAgR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliUG9pbnRlckRhdGEgPSAzMDAxCi19OwotYm9vbCBHTE1lc3NhZ2VfRnVuY3Rpb25fSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZV9GdW5jdGlvbl9GdW5jdGlvbl9NSU4gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBY3RpdmVUZXh0dXJlOwotY29uc3QgR0xNZXNzYWdlX0Z1bmN0aW9uIEdMTWVzc2FnZV9GdW5jdGlvbl9GdW5jdGlvbl9NQVggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YTsKLWNvbnN0IGludCBHTE1lc3NhZ2VfRnVuY3Rpb25fRnVuY3Rpb25fQVJSQVlTSVpFID0gR0xNZXNzYWdlX0Z1bmN0aW9uX0Z1bmN0aW9uX01BWCArIDE7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgR0xNZXNzYWdlX0RhdGFUeXBlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUgewotIHB1YmxpYzoKLSAgR0xNZXNzYWdlX0RhdGFUeXBlKCk7Ci0gIHZpcnR1YWwgfkdMTWVzc2FnZV9EYXRhVHlwZSgpOwotICAKLSAgR0xNZXNzYWdlX0RhdGFUeXBlKGNvbnN0IEdMTWVzc2FnZV9EYXRhVHlwZSYgZnJvbSk7Ci0gIAotICBpbmxpbmUgR0xNZXNzYWdlX0RhdGFUeXBlJiBvcGVyYXRvcj0oY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoR0xNZXNzYWdlX0RhdGFUeXBlKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgR0xNZXNzYWdlX0RhdGFUeXBlKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgR0xNZXNzYWdlX0RhdGFUeXBlJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIHR5cGVkZWYgR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgVHlwZTsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVk9JRCA9IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1ZPSUQ7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIENIQVIgPSBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9DSEFSOwotICBzdGF0aWMgY29uc3QgVHlwZSBCWVRFID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfQllURTsKLSAgc3RhdGljIGNvbnN0IFR5cGUgSU5UID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfSU5UOwotICBzdGF0aWMgY29uc3QgVHlwZSBGTE9BVCA9IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0ZMT0FUOwotICBzdGF0aWMgY29uc3QgVHlwZSBCT09MID0gR0xNZXNzYWdlX0RhdGFUeXBlX1R5cGVfQk9PTDsKLSAgc3RhdGljIGNvbnN0IFR5cGUgRU5VTSA9IEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0VOVU07Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX0lzVmFsaWQodmFsdWUpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFR5cGVfTUlOID0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9UeXBlX01JTjsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVHlwZV9NQVggPQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlX1R5cGVfTUFYOwotICBzdGF0aWMgY29uc3QgaW50IFR5cGVfQVJSQVlTSVpFID0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9UeXBlX0FSUkFZU0laRTsKLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZS5UeXBlIHR5cGUgPSAxIFtkZWZhdWx0ID0gVk9JRF07Ci0gIGlubGluZSBib29sIGhhc190eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3R5cGUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVHlwZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlX1R5cGUgdHlwZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfdHlwZSg6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlIHZhbHVlKTsKLSAgCi0gIC8vIHJlcXVpcmVkIGJvb2wgaXNBcnJheSA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlubGluZSBib29sIGhhc19pc2FycmF5KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2lzYXJyYXkoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSXNBcnJheUZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIGJvb2wgaXNhcnJheSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaXNhcnJheShib29sIHZhbHVlKTsKLSAgCi0gIC8vIHJlcGVhdGVkIGludDMyIGludFZhbHVlID0gMzsKLSAgaW5saW5lIGludCBpbnR2YWx1ZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2ludHZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0ludFZhbHVlRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBpbnR2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaW50dmFsdWUoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2ludHZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi0gICAgICBpbnR2YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi0gICAgICBtdXRhYmxlX2ludHZhbHVlKCk7Ci0gIAotICAvLyByZXBlYXRlZCBmbG9hdCBmbG9hdFZhbHVlID0gNDsKLSAgaW5saW5lIGludCBmbG9hdHZhbHVlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZmxvYXR2YWx1ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtGbG9hdFZhbHVlRmllbGROdW1iZXIgPSA0OwotICBpbmxpbmUgZmxvYXQgZmxvYXR2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfZmxvYXR2YWx1ZShpbnQgaW5kZXgsIGZsb2F0IHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2Zsb2F0dmFsdWUoZmxvYXQgdmFsdWUpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBmbG9hdCA+JgotICAgICAgZmxvYXR2YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBmbG9hdCA+KgotICAgICAgbXV0YWJsZV9mbG9hdHZhbHVlKCk7Ci0gIAotICAvLyByZXBlYXRlZCBieXRlcyBjaGFyVmFsdWUgPSA1OwotICBpbmxpbmUgaW50IGNoYXJ2YWx1ZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NoYXJ2YWx1ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtDaGFyVmFsdWVGaWVsZE51bWJlciA9IDU7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBjaGFydmFsdWUoaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfY2hhcnZhbHVlKGludCBpbmRleCk7Ci0gIGlubGluZSB2b2lkIHNldF9jaGFydmFsdWUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9jaGFydmFsdWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9jaGFydmFsdWUoaW50IGluZGV4LCBjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogYWRkX2NoYXJ2YWx1ZSgpOwotICBpbmxpbmUgdm9pZCBhZGRfY2hhcnZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2NoYXJ2YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9jaGFydmFsdWUoY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGNoYXJ2YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9jaGFydmFsdWUoKTsKLSAgCi0gIC8vIHJlcGVhdGVkIGJ5dGVzIHJhd0J5dGVzID0gNjsKLSAgaW5saW5lIGludCByYXdieXRlc19zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3Jhd2J5dGVzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Jhd0J5dGVzRmllbGROdW1iZXIgPSA2OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgcmF3Ynl0ZXMoaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcmF3Ynl0ZXMoaW50IGluZGV4KTsKLSAgaW5saW5lIHZvaWQgc2V0X3Jhd2J5dGVzKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfcmF3Ynl0ZXMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9yYXdieXRlcyhpbnQgaW5kZXgsIGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfcmF3Ynl0ZXMoKTsKLSAgaW5saW5lIHZvaWQgYWRkX3Jhd2J5dGVzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX3Jhd2J5dGVzKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX3Jhd2J5dGVzKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiByYXdieXRlcygpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9yYXdieXRlcygpOwotICAKLSAgLy8gcmVwZWF0ZWQgYm9vbCBib29sVmFsdWUgPSA3OwotICBpbmxpbmUgaW50IGJvb2x2YWx1ZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2Jvb2x2YWx1ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtCb29sVmFsdWVGaWVsZE51bWJlciA9IDc7Ci0gIGlubGluZSBib29sIGJvb2x2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfYm9vbHZhbHVlKGludCBpbmRleCwgYm9vbCB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9ib29sdmFsdWUoYm9vbCB2YWx1ZSk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGJvb2wgPiYKLSAgICAgIGJvb2x2YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBib29sID4qCi0gICAgICBtdXRhYmxlX2Jvb2x2YWx1ZSgpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUpCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIGludCB0eXBlXzsKLSAgYm9vbCBpc2FycmF5XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gaW50dmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IGZsb2F0ID4gZmxvYXR2YWx1ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4gY2hhcnZhbHVlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiByYXdieXRlc187Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgYm9vbCA+IGJvb2x2YWx1ZV87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg3ICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBHTE1lc3NhZ2VfRGF0YVR5cGUqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUgewotIHB1YmxpYzoKLSAgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKCk7Ci0gIHZpcnR1YWwgfkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcigpOwotICAKLSAgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKGNvbnN0IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlciYgZnJvbSk7Ci0gIAotICBpbmxpbmUgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBvcGVyYXRvcj0oY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIAotICBzdGF0aWMgY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBvdGhlcik7Ci0gIAotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBOZXcoKSBjb25zdDsKLSAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgcHVibGljOgotICAKLSAgOjpzdGQ6OnN0cmluZyBHZXRUeXBlTmFtZSgpIGNvbnN0OwotICAKLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICAvLyByZXF1aXJlZCBpbnQzMiB3aWR0aCA9IDE7Ci0gIGlubGluZSBib29sIGhhc193aWR0aCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl93aWR0aCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtXaWR0aEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgd2lkdGgoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3dpZHRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gcmVxdWlyZWQgaW50MzIgaGVpZ2h0ID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX2hlaWdodCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9oZWlnaHQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSGVpZ2h0RmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBoZWlnaHQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2hlaWdodCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIHJlcGVhdGVkIGJ5dGVzIGNvbnRlbnRzID0gMzsKLSAgaW5saW5lIGludCBjb250ZW50c19zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NvbnRlbnRzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NvbnRlbnRzRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgY29udGVudHMoaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfY29udGVudHMoaW50IGluZGV4KTsKLSAgaW5saW5lIHZvaWQgc2V0X2NvbnRlbnRzKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfY29udGVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9jb250ZW50cyhpbnQgaW5kZXgsIGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfY29udGVudHMoKTsKLSAgaW5saW5lIHZvaWQgYWRkX2NvbnRlbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2NvbnRlbnRzKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2NvbnRlbnRzKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiBjb250ZW50cygpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9jb250ZW50cygpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIpCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgd2lkdGhfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGhlaWdodF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4gY29udGVudHNfOwotICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19nbHRyYWNlXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nbHRyYWNlXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dsdHJhY2VfMmVwcm90bygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKLSAgCi0gIC8vIFdIWSBET0VTICYgSEFWRSBMT1dFUiBQUkVDRURFTkNFIFRIQU4gIT0gIT8KLSAgaW5saW5lIGJvb2wgX2hhc19iaXQoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChfaGFzX2JpdHNfW2luZGV4IC8gMzJdICYgKDF1IDw8IChpbmRleCAlIDMyKSkpICE9IDA7Ci0gIH0KLSAgaW5saW5lIHZvaWQgX3NldF9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSB8PSAoMXUgPDwgKGluZGV4ICUgMzIpKTsKLSAgfQotICBpbmxpbmUgdm9pZCBfY2xlYXJfYml0KGludCBpbmRleCkgewotICAgIF9oYXNfYml0c19baW5kZXggLyAzMl0gJj0gfigxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIAotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEdMTWVzc2FnZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIHsKLSBwdWJsaWM6Ci0gIEdMTWVzc2FnZSgpOwotICB2aXJ0dWFsIH5HTE1lc3NhZ2UoKTsKLSAgCi0gIEdMTWVzc2FnZShjb25zdCBHTE1lc3NhZ2UmIGZyb20pOwotICAKLSAgaW5saW5lIEdMTWVzc2FnZSYgb3BlcmF0b3I9KGNvbnN0IEdMTWVzc2FnZSYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICAKLSAgc3RhdGljIGNvbnN0IEdMTWVzc2FnZSYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKEdMTWVzc2FnZSogb3RoZXIpOwotICAKLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIEdMTWVzc2FnZSogTmV3KCkgY29uc3Q7Ci0gIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEdMTWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEdMTWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHB1YmxpYzoKLSAgCi0gIDo6c3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKLSAgCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICB0eXBlZGVmIEdMTWVzc2FnZV9EYXRhVHlwZSBEYXRhVHlwZTsKLSAgdHlwZWRlZiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXIgRnJhbWVCdWZmZXI7Ci0gIAotICB0eXBlZGVmIEdMTWVzc2FnZV9GdW5jdGlvbiBGdW5jdGlvbjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQWN0aXZlVGV4dHVyZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFjdGl2ZVRleHR1cmU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEFscGhhRnVuYyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFscGhhRnVuYzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQWxwaGFGdW5jeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEFscGhhRnVuY3g7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEFscGhhRnVuY3hPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBbHBoYUZ1bmN4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xBdHRhY2hTaGFkZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBdHRhY2hTaGFkZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJlZ2luUGVyZk1vbml0b3JBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCZWdpblBlcmZNb25pdG9yQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCaW5kQXR0cmliTG9jYXRpb24gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kQXR0cmliTG9jYXRpb247Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRCdWZmZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kQnVmZmVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCaW5kRnJhbWVidWZmZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kRnJhbWVidWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRGcmFtZWJ1ZmZlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRGcmFtZWJ1ZmZlck9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmluZFJlbmRlcmJ1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRSZW5kZXJidWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRSZW5kZXJidWZmZXJPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kUmVuZGVyYnVmZmVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCaW5kVGV4dHVyZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJpbmRUZXh0dXJlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCaW5kVmVydGV4QXJyYXlPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kVmVydGV4QXJyYXlPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsZW5kQ29sb3IgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZENvbG9yOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCbGVuZEVxdWF0aW9uID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvbjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmxlbmRFcXVhdGlvbk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRXF1YXRpb25PRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCbGVuZEZ1bmMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCbGVuZEZ1bmM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsZW5kRnVuY1NlcGFyYXRlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRGdW5jU2VwYXJhdGU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQmxlbmRGdW5jU2VwYXJhdGVPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJ1ZmZlckRhdGEgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCdWZmZXJEYXRhOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCdWZmZXJTdWJEYXRhID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQnVmZmVyU3ViRGF0YTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENoZWNrRnJhbWVidWZmZXJTdGF0dXM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGVhckNvbG9yID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJDb2xvcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJDb2xvcnggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckNvbG9yeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJDb2xvcnhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckNvbG9yeE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJEZXB0aGYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJEZXB0aGZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJEZXB0aHggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJEZXB0aHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhckRlcHRoeE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGVhcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xlYXJTdGVuY2lsID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xlYXJTdGVuY2lsOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGllbnRBY3RpdmVUZXh0dXJlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpZW50QWN0aXZlVGV4dHVyZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xpcFBsYW5lZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZWY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENsaXBQbGFuZWZJTUcgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmVmSU1HOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGlwUGxhbmVmT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5lZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ2xpcFBsYW5leCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENsaXBQbGFuZXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENsaXBQbGFuZXhJTUcgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDbGlwUGxhbmV4SU1HOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDbGlwUGxhbmV4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ2xpcFBsYW5leE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ29sb3I0ZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbG9yNGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbG9yNHViID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3I0dWI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbG9yNHggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvcjR4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb2xvcjR4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3I0eE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ29sb3JNYXNrID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ29sb3JNYXNrOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb2xvclBvaW50ZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb2xvclBvaW50ZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENvbXBpbGVTaGFkZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDb21waWxlU2hhZGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhJbWFnZTJEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhJbWFnZTNET0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb3B5VGV4SW1hZ2UyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvcHlUZXhJbWFnZTJEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb3B5VGV4U3ViSW1hZ2UyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvcHlUZXhTdWJJbWFnZTJEOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvcHlUZXhTdWJJbWFnZTNET0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb3ZlcmFnZU1hc2tOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENvdmVyYWdlTWFza05WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQ292ZXJhZ2VPcGVyYXRpb25OVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ3JlYXRlUHJvZ3JhbSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENyZWF0ZVByb2dyYW07Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbENyZWF0ZVNoYWRlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENyZWF0ZVNoYWRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ3VsbEZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDdWxsRmFjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlQnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZUJ1ZmZlcnM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZUZlbmNlc05WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlRmVuY2VzTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZUZyYW1lYnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZUZyYW1lYnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlRnJhbWVidWZmZXJzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZVByb2dyYW0gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVQcm9ncmFtOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVSZW5kZXJidWZmZXJzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUmVuZGVyYnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlbGV0ZVNoYWRlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVNoYWRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlVGV4dHVyZXMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZWxldGVUZXh0dXJlczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlVmVydGV4QXJyYXlzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZXB0aEZ1bmMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aEZ1bmM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERlcHRoTWFzayA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlcHRoTWFzazsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVwdGhSYW5nZWYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdlZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVwdGhSYW5nZWZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdlZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVwdGhSYW5nZXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdleDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVwdGhSYW5nZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEZXB0aFJhbmdleE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGV0YWNoU2hhZGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGV0YWNoU2hhZGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEaXNhYmxlQ2xpZW50U3RhdGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEaXNhYmxlQ2xpZW50U3RhdGU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERpc2FibGVEcml2ZXJDb250cm9sUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGVEcml2ZXJDb250cm9sUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGlzYWJsZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGlzY2FyZEZyYW1lYnVmZmVyRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3QXJyYXlzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd0FycmF5czsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRHJhd0VsZW1lbnRzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd0VsZW1lbnRzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3VGV4Zk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhmT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3VGV4ZnZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4ZnZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdUZXhpT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleGlPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdUZXhpdk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXhpdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRHJhd1RleHNPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4c09FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRHJhd1RleHN2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRHJhd1RleHN2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3VGV4eE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERyYXdUZXh4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEcmF3VGV4eHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3VGV4eHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRW5hYmxlQ2xpZW50U3RhdGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmFibGVDbGllbnRTdGF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRW5hYmxlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5hYmxlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmRQZXJmTW9uaXRvckFNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuZFBlcmZNb25pdG9yQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmRUaWxpbmdRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRW5kVGlsaW5nUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRCdWZmZXJzUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldEJ1ZmZlcnNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0RnJhbWVidWZmZXJzUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRXh0R2V0UHJvZ3JhbXNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRXh0R2V0UHJvZ3JhbXNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRTaGFkZXJzUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFNoYWRlcnNRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFRleExldmVsUGFyYW1ldGVyaXZRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dEdldFRleHR1cmVzUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dEdldFRleHR1cmVzUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dElzUHJvZ3JhbUJpbmFyeVFDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRmluaXNoRmVuY2VOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZpbmlzaEZlbmNlTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZpbmlzaCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZpbmlzaDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRmx1c2ggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGbHVzaDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRm9nZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZvZ2Y7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZvZ2Z2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9nZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZvZ3ggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2d4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGb2d4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRm9neE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRm9neHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2d4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRm9neHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGb2d4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEZyb250RmFjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEZyb250RmFjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJ1c3R1bWYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcnVzdHVtZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJ1c3R1bWZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcnVzdHVtZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJ1c3R1bXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcnVzdHVteDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRnJ1c3R1bXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xGcnVzdHVteE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuQnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbkJ1ZmZlcnM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlbmVyYXRlTWlwbWFwID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuZXJhdGVNaXBtYXA7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlbmVyYXRlTWlwbWFwT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuZXJhdGVNaXBtYXBPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlbkZlbmNlc05WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuRmVuY2VzTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlbkZyYW1lYnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlbkZyYW1lYnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuRnJhbWVidWZmZXJzT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuRnJhbWVidWZmZXJzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5QZXJmTW9uaXRvcnNBTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5QZXJmTW9uaXRvcnNBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlblJlbmRlcmJ1ZmZlcnMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5SZW5kZXJidWZmZXJzOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZW5SZW5kZXJidWZmZXJzT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuUmVuZGVyYnVmZmVyc09FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuVGV4dHVyZXMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5UZXh0dXJlczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuVmVydGV4QXJyYXlzT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2VuVmVydGV4QXJyYXlzT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRBY3RpdmVBdHRyaWIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRBY3RpdmVBdHRyaWI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEFjdGl2ZVVuaWZvcm0gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRBY3RpdmVVbmlmb3JtOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRBdHRhY2hlZFNoYWRlcnMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRBdHRhY2hlZFNoYWRlcnM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEF0dHJpYkxvY2F0aW9uID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QXR0cmliTG9jYXRpb247Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEJvb2xlYW52ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Qm9vbGVhbnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QnVmZmVyUGFyYW1ldGVyaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0QnVmZmVyUG9pbnRlcnZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldENsaXBQbGFuZWYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRDbGlwUGxhbmVmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRDbGlwUGxhbmVmT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Q2xpcFBsYW5lZk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0Q2xpcFBsYW5leCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldENsaXBQbGFuZXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldENsaXBQbGFuZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRDbGlwUGxhbmV4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXREcml2ZXJDb250cm9sc1FDT00gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXREcml2ZXJDb250cm9sc1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT007Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEVycm9yID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0RXJyb3I7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEZlbmNlaXZOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZlbmNlaXZOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0Rml4ZWR2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0Rml4ZWR2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRGaXhlZHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGaXhlZHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldEZsb2F0diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldEZsb2F0djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0SW50ZWdlcnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRJbnRlZ2VydjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0TGlnaHRmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldExpZ2h0ZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldExpZ2h0eHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRMaWdodHh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRMaWdodHh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TGlnaHR4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0TWF0ZXJpYWxmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldE1hdGVyaWFsZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldE1hdGVyaWFseHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRNYXRlcmlhbHh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRNYXRlcmlhbHh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0TWF0ZXJpYWx4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UG9pbnRlcnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRQb2ludGVydjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UHJvZ3JhbUJpbmFyeU9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFByb2dyYW1CaW5hcnlPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFByb2dyYW1JbmZvTG9nID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbUluZm9Mb2c7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFByb2dyYW1pdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFByb2dyYW1pdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0U2hhZGVySW5mb0xvZyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFNoYWRlckluZm9Mb2c7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFNoYWRlcml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVyaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0U2hhZGVyU291cmNlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0U2hhZGVyU291cmNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRTdHJpbmcgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRTdHJpbmc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEVudmZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4RW52ZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEVudml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4RW52aXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEVudnh2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4RW52eHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEVudnh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4RW52eHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEdlbmZ2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4R2VuZnZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEdlbml2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4R2VuaXZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleEdlbnh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4R2VueHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleFBhcmFtZXRlcmZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleFBhcmFtZXRlcml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleFBhcmFtZXRlcnh2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyeHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFRleFBhcmFtZXRlcnh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VGV4UGFyYW1ldGVyeHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFVuaWZvcm1mdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFVuaWZvcm1mdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0VW5pZm9ybWl2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VW5pZm9ybWl2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRVbmlmb3JtTG9jYXRpb24gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRVbmlmb3JtTG9jYXRpb247Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFZlcnRleEF0dHJpYmZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VmVydGV4QXR0cmliZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFZlcnRleEF0dHJpYml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VmVydGV4QXR0cmliaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0VmVydGV4QXR0cmliUG9pbnRlcnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEhpbnQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xIaW50OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xJc0J1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzQnVmZmVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xJc0VuYWJsZWQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc0VuYWJsZWQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzRmVuY2VOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzRmVuY2VOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNGcmFtZWJ1ZmZlciA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzRnJhbWVidWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzRnJhbWVidWZmZXJPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc0ZyYW1lYnVmZmVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xJc1Byb2dyYW0gPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1Byb2dyYW07Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzUmVuZGVyYnVmZmVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNSZW5kZXJidWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzUmVuZGVyYnVmZmVyT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNSZW5kZXJidWZmZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzU2hhZGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNTaGFkZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzVGV4dHVyZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzVGV4dHVyZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsSXNWZXJ0ZXhBcnJheU9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbElzVmVydGV4QXJyYXlPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpZ2h0ZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0ZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0ZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpZ2h0TW9kZWxmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpZ2h0TW9kZWxmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0TW9kZWxmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRNb2RlbHggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVseDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRNb2RlbHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVseE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHRNb2RlbHh2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHRNb2RlbHh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodE1vZGVseHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaWdodE1vZGVseHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpZ2h0eCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0eDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHR4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaWdodHh2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTGlnaHR4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGlnaHR4dk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpZ2h0eHZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpbmVXaWR0aCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpbmVXaWR0aDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTGluZVdpZHRoeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpbmVXaWR0aHg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExpbmVXaWR0aHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMaW5lV2lkdGh4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMaW5rUHJvZ3JhbSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExpbmtQcm9ncmFtOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMb2FkSWRlbnRpdHkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xMb2FkSWRlbnRpdHk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExvYWRNYXRyaXhmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZE1hdHJpeGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExvYWRNYXRyaXh4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZE1hdHJpeHg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExvYWRNYXRyaXh4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTG9hZE1hdHJpeHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTG9naWNPcCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExvZ2ljT3A7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE1hcEJ1ZmZlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE1hcEJ1ZmZlck9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTWF0ZXJpYWxmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWxmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRlcmlhbGZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWxmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTWF0ZXJpYWx4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWx4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRlcmlhbHhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbHhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE1hdGVyaWFseHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNYXRlcmlhbHh2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRlcmlhbHh2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0ZXJpYWx4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0cml4SW5kZXhQb2ludGVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNYXRyaXhNb2RlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTWF0cml4TW9kZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTXVsdGlEcmF3QXJyYXlzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlEcmF3QXJyYXlzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0aURyYXdFbGVtZW50c0VYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRpRHJhd0VsZW1lbnRzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0aVRleENvb3JkNGYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xNdWx0aVRleENvb3JkNGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE11bHRpVGV4Q29vcmQ0eCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRpVGV4Q29vcmQ0eDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsTXVsdGlUZXhDb29yZDR4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTXVsdGlUZXhDb29yZDR4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0TWF0cml4ZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRNYXRyaXhmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0TWF0cml4eCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRNYXRyaXh4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xNdWx0TWF0cml4eE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE11bHRNYXRyaXh4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xOb3JtYWwzZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE5vcm1hbDNmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xOb3JtYWwzeCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE5vcm1hbDN4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xOb3JtYWwzeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE5vcm1hbDN4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xOb3JtYWxQb2ludGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsTm9ybWFsUG9pbnRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsT3J0aG9mID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsT3J0aG9mOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xPcnRob2ZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xPcnRob2ZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbE9ydGhveCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbE9ydGhveDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsT3J0aG94T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsT3J0aG94T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQaXhlbFN0b3JlaSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBpeGVsU3RvcmVpOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2ludFBhcmFtZXRlcmYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcmY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50UGFyYW1ldGVyZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcmZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2ludFBhcmFtZXRlcnggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcng7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50UGFyYW1ldGVyeE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyeE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9pbnRQYXJhbWV0ZXJ4diA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50UGFyYW1ldGVyeHY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50UGFyYW1ldGVyeHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFBhcmFtZXRlcnh2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2ludFNpemUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvaW50U2l6ZVBvaW50ZXJPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2ludFNpemVQb2ludGVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2ludFNpemV4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUG9pbnRTaXpleDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUG9pbnRTaXpleE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvaW50U2l6ZXhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFBvbHlnb25PZmZzZXQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb2x5Z29uT2Zmc2V0OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2x5Z29uT2Zmc2V0eCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvbHlnb25PZmZzZXR4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb2x5Z29uT2Zmc2V0eE9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvbHlnb25PZmZzZXR4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb3BNYXRyaXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQb3BNYXRyaXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1CaW5hcnlPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtQmluYXJ5T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQdXNoTWF0cml4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHVzaE1hdHJpeDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUXVlcnlNYXRyaXh4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUXVlcnlNYXRyaXh4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZWFkUGl4ZWxzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVhZFBpeGVsczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVsZWFzZVNoYWRlckNvbXBpbGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZW5kZXJidWZmZXJTdG9yYWdlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUm90YXRlZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJvdGF0ZWY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJvdGF0ZXggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSb3RhdGV4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSb3RhdGV4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUm90YXRleE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2FtcGxlQ292ZXJhZ2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTYW1wbGVDb3ZlcmFnZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2FtcGxlQ292ZXJhZ2V4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2FtcGxlQ292ZXJhZ2V4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTYW1wbGVDb3ZlcmFnZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTYW1wbGVDb3ZlcmFnZXhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNjYWxlZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNjYWxlZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2NhbGV4ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2NhbGV4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTY2FsZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTY2FsZXhPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNjaXNzb3IgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTY2lzc29yOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU2V0RmVuY2VOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNldEZlbmNlTlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNoYWRlTW9kZWwgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTaGFkZU1vZGVsOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTaGFkZXJCaW5hcnkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTaGFkZXJCaW5hcnk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFNoYWRlclNvdXJjZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFNoYWRlclNvdXJjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU3RhcnRUaWxpbmdRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RhcnRUaWxpbmdRQ09NOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTdGVuY2lsRnVuYyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxGdW5jOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xTdGVuY2lsRnVuY1NlcGFyYXRlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsU3RlbmNpbEZ1bmNTZXBhcmF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU3RlbmNpbE1hc2sgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsTWFzazsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxNYXNrU2VwYXJhdGU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFN0ZW5jaWxPcCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFN0ZW5jaWxPcDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsU3RlbmNpbE9wU2VwYXJhdGUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xTdGVuY2lsT3BTZXBhcmF0ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGVzdEZlbmNlTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXN0RmVuY2VOVjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4Q29vcmRQb2ludGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4Q29vcmRQb2ludGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhFbnZmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52ZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4RW52ZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4RW52aSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEVudmk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEVudml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52aXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEVudnggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhFbnZ4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4RW52eE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4RW52eHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4RW52eHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhFbnZ4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4R2VuZk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbmZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEdlbmZ2T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VuZnZPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEdlbmlPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW5pT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhHZW5pdk9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEdlbml2T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhHZW54T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4R2VueE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4R2VueHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhHZW54dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4SW1hZ2UyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleEltYWdlMkQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleEltYWdlM0RPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhJbWFnZTNET0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhQYXJhbWV0ZXJmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4UGFyYW1ldGVyZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4UGFyYW1ldGVyaSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFBhcmFtZXRlcmk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFBhcmFtZXRlcml2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyaXY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFBhcmFtZXRlcnggPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJ4OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhQYXJhbWV0ZXJ4T0VTID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4UGFyYW1ldGVyeE9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4UGFyYW1ldGVyeHYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJ4djsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4UGFyYW1ldGVyeHZPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhQYXJhbWV0ZXJ4dk9FUzsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4U3ViSW1hZ2UyRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFN1YkltYWdlMkQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFN1YkltYWdlM0RPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdWJJbWFnZTNET0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUcmFuc2xhdGVmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVHJhbnNsYXRlZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVHJhbnNsYXRleCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRyYW5zbGF0ZXg7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRyYW5zbGF0ZXhPRVMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUcmFuc2xhdGV4T0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtMWYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0xZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtMWkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0xaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMWl2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtMmYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMmY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0yZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMmZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtMmkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMmk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0yaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtMml2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtM2YgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtM2Y7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0zZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtM2Z2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtM2kgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtM2k7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm0zaXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtM2l2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtNGYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm00ZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtNGkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGk7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm00aXYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtNGl2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbmlmb3JtTWF0cml4MmZ2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVW5pZm9ybU1hdHJpeDJmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVW5pZm9ybU1hdHJpeDNmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVuaWZvcm1NYXRyaXgzZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFVuaWZvcm1NYXRyaXg0ZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xVbmlmb3JtTWF0cml4NGZ2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVbm1hcEJ1ZmZlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFVubWFwQnVmZmVyT0VTOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVc2VQcm9ncmFtID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVXNlUHJvZ3JhbTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmFsaWRhdGVQcm9ncmFtID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmFsaWRhdGVQcm9ncmFtOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWIxZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjFmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWIxZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIxZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYjJmID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliMmY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYjJmdiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjJmdjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmVydGV4QXR0cmliM2YgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWIzZjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmVydGV4QXR0cmliM2Z2ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4QXR0cmliM2Z2OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWI0ZiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYjRmOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWI0ZnYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWI0ZnY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFZlcnRleEF0dHJpYlBvaW50ZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhQb2ludGVyID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVmVydGV4UG9pbnRlcjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmlld3BvcnQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWaWV3cG9ydDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsV2VpZ2h0UG9pbnRlck9FUyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFdlaWdodFBvaW50ZXJPRVM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xBbHBoYUZ1bmNRQ09NID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsQWxwaGFGdW5jUUNPTTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsQmVnaW5RdWVyeUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJlZ2luUXVlcnlFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xCbGl0RnJhbWVidWZmZXJBTkdMRSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEJsaXRGcmFtZWJ1ZmZlckFOR0xFOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbENyZWF0ZVNoYWRlclByb2dyYW12RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsRGVsZXRlUXVlcmllc0VYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbERlbGV0ZVF1ZXJpZXNFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbERyYXdCdWZmZXJzTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xEcmF3QnVmZmVyc05WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xFbmRRdWVyeUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEVuZFF1ZXJ5RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdlblByb2dyYW1QaXBlbGluZXNFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdlblF1ZXJpZXNFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZW5RdWVyaWVzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0T2JqZWN0TGFiZWxFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRPYmplY3RMYWJlbEVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFByb2dyYW1QaXBlbGluZWl2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFF1ZXJ5T2JqZWN0dWl2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0UXVlcnlPYmplY3R1aXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEdldFF1ZXJ5aXZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xHZXRRdWVyeWl2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xHZXRuVW5pZm9ybWZ2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsR2V0blVuaWZvcm1mdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsR2V0blVuaWZvcm1pdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbEdldG5Vbmlmb3JtaXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbEluc2VydEV2ZW50TWFya2VyRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSW5zZXJ0RXZlbnRNYXJrZXJFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzUHJvZ3JhbVBpcGVsaW5lRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsSXNQcm9ncmFtUGlwZWxpbmVFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbElzUXVlcnlFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xJc1F1ZXJ5RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xMYWJlbE9iamVjdEVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbExhYmVsT2JqZWN0RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQb3BHcm91cE1hcmtlckVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFBvcEdyb3VwTWFya2VyRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1QYXJhbWV0ZXJpRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTFmRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0xZkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0xZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMWlFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtMWl2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0xaXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtMmZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTJmRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtMmZ2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTJpRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0yaUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtM2ZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtM2Z2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm0zZnZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtM2lFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTNpRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtM2l2RVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xQcm9ncmFtVW5pZm9ybTRmRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm00ZkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm00ZnZFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUHJvZ3JhbVVuaWZvcm00aUVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFByb2dyYW1Vbmlmb3JtNGlFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtNGl2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm00aXZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFB1c2hHcm91cE1hcmtlckVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFB1c2hHcm91cE1hcmtlckVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsUmVhZEJ1ZmZlck5WID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsUmVhZEJ1ZmZlck5WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZWFkblBpeGVsc0VYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlYWRuUGl4ZWxzRVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXhTdG9yYWdlMURFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXhTdG9yYWdlMURFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleFN0b3JhZ2UyREVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleFN0b3JhZ2UyREVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4U3RvcmFnZTNERVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4U3RvcmFnZTNERVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xUZXh0dXJlU3RvcmFnZTFERVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVGV4dHVyZVN0b3JhZ2UxREVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVGV4dHVyZVN0b3JhZ2UyREVYVCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFRleHR1cmVTdG9yYWdlMkRFWFQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBnbFRleHR1cmVTdG9yYWdlM0RFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xUZXh0dXJlU3RvcmFnZTNERVhUOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2dsVXNlUHJvZ3JhbVN0YWdlc0VYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldERpc3BsYXkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0RGlzcGxheTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEluaXRpYWxpemUgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsSW5pdGlhbGl6ZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFRlcm1pbmF0ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xUZXJtaW5hdGU7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRDb25maWdzID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldENvbmZpZ3M7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xDaG9vc2VDb25maWcgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ2hvb3NlQ29uZmlnOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0Q29uZmlnQXR0cmliID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldENvbmZpZ0F0dHJpYjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlV2luZG93U3VyZmFjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlUGl4bWFwU3VyZmFjZTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZVBidWZmZXJTdXJmYWNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsRGVzdHJveVN1cmZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsRGVzdHJveVN1cmZhY2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xRdWVyeVN1cmZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUXVlcnlTdXJmYWNlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlQ29udGV4dCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDcmVhdGVDb250ZXh0OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsRGVzdHJveUNvbnRleHQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsRGVzdHJveUNvbnRleHQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xNYWtlQ3VycmVudCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xNYWtlQ3VycmVudDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldEN1cnJlbnRDb250ZXh0ID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldEN1cnJlbnRDb250ZXh0OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsR2V0Q3VycmVudFN1cmZhY2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0Q3VycmVudFN1cmZhY2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRDdXJyZW50RGlzcGxheSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRDdXJyZW50RGlzcGxheTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFF1ZXJ5Q29udGV4dCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xRdWVyeUNvbnRleHQ7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xXYWl0R0wgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsV2FpdEdMOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsV2FpdE5hdGl2ZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xXYWl0TmF0aXZlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsU3dhcEJ1ZmZlcnMgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsU3dhcEJ1ZmZlcnM7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xDb3B5QnVmZmVycyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xDb3B5QnVmZmVyczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldEVycm9yID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldEVycm9yOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsUXVlcnlTdHJpbmcgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUXVlcnlTdHJpbmc7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRQcm9jQWRkcmVzcyA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRQcm9jQWRkcmVzczsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFN1cmZhY2VBdHRyaWIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsU3VyZmFjZUF0dHJpYjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEJpbmRUZXhJbWFnZSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xCaW5kVGV4SW1hZ2U7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xSZWxlYXNlVGV4SW1hZ2UgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsUmVsZWFzZVRleEltYWdlOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsU3dhcEludGVydmFsID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFN3YXBJbnRlcnZhbDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEJpbmRBUEkgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQmluZEFQSTsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFF1ZXJ5QVBJID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbFF1ZXJ5QVBJOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsV2FpdENsaWVudCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xXYWl0Q2xpZW50OwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsUmVsZWFzZVRocmVhZCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xSZWxlYXNlVGhyZWFkOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlUGJ1ZmZlckZyb21DbGllbnRCdWZmZXI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xMb2NrU3VyZmFjZUtIUiA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xMb2NrU3VyZmFjZUtIUjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbFVubG9ja1N1cmZhY2VLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsVW5sb2NrU3VyZmFjZUtIUjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENyZWF0ZUltYWdlS0hSID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbENyZWF0ZUltYWdlS0hSOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsRGVzdHJveUltYWdlS0hSID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbERlc3Ryb3lJbWFnZUtIUjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbENyZWF0ZVN5bmNLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ3JlYXRlU3luY0tIUjsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbERlc3Ryb3lTeW5jS0hSID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbERlc3Ryb3lTeW5jS0hSOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZWdsQ2xpZW50V2FpdFN5bmNLSFIgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsQ2xpZW50V2FpdFN5bmNLSFI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRTeW5jQXR0cmliS0hSID0gR0xNZXNzYWdlX0Z1bmN0aW9uX2VnbEdldFN5bmNBdHRyaWJLSFI7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldFJlbmRlckJ1ZmZlckFORFJPSUQgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0UmVuZGVyQnVmZmVyQU5EUk9JRDsKLSAgc3RhdGljIGNvbnN0IEZ1bmN0aW9uIGVnbEdldFN5c3RlbVRpbWVGcmVxdWVuY3lOViA9IEdMTWVzc2FnZV9GdW5jdGlvbl9lZ2xHZXRTeXN0ZW1UaW1lRnJlcXVlbmN5TlY7Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBlZ2xHZXRTeXN0ZW1UaW1lTlYgPSBHTE1lc3NhZ2VfRnVuY3Rpb25fZWdsR2V0U3lzdGVtVGltZU5WOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gaW52YWxpZCA9IEdMTWVzc2FnZV9GdW5jdGlvbl9pbnZhbGlkOwotICBzdGF0aWMgY29uc3QgRnVuY3Rpb24gZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YSA9IEdMTWVzc2FnZV9GdW5jdGlvbl9nbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhOwotICBzdGF0aWMgaW5saW5lIGJvb2wgRnVuY3Rpb25fSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gR0xNZXNzYWdlX0Z1bmN0aW9uX0lzVmFsaWQodmFsdWUpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBGdW5jdGlvbl9NSU4gPQotICAgIEdMTWVzc2FnZV9GdW5jdGlvbl9GdW5jdGlvbl9NSU47Ci0gIHN0YXRpYyBjb25zdCBGdW5jdGlvbiBGdW5jdGlvbl9NQVggPQotICAgIEdMTWVzc2FnZV9GdW5jdGlvbl9GdW5jdGlvbl9NQVg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRnVuY3Rpb25fQVJSQVlTSVpFID0KLSAgICBHTE1lc3NhZ2VfRnVuY3Rpb25fRnVuY3Rpb25fQVJSQVlTSVpFOwotICAKLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGNvbnRleHRfaWQgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfY29udGV4dF9pZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9jb250ZXh0X2lkKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NvbnRleHRJZEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgY29udGV4dF9pZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfY29udGV4dF9pZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCi0gIC8vIHJlcXVpcmVkIGludDY0IHN0YXJ0X3RpbWUgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfc3RhcnRfdGltZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zdGFydF90aW1lKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1N0YXJ0VGltZUZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgc3RhcnRfdGltZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfc3RhcnRfdGltZSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKTsKLSAgCi0gIC8vIHJlcXVpcmVkIGludDMyIGR1cmF0aW9uID0gMzsKLSAgaW5saW5lIGJvb2wgaGFzX2R1cmF0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2R1cmF0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0R1cmF0aW9uRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBkdXJhdGlvbigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfZHVyYXRpb24oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAotICAvLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5GdW5jdGlvbiBmdW5jdGlvbiA9IDQgW2RlZmF1bHQgPSBpbnZhbGlkXTsKLSAgaW5saW5lIGJvb2wgaGFzX2Z1bmN0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2Z1bmN0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0Z1bmN0aW9uRmllbGROdW1iZXIgPSA0OwotICBpbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnVuY3Rpb24gZnVuY3Rpb24oKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2Z1bmN0aW9uKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0Z1bmN0aW9uIHZhbHVlKTsKLSAgCi0gIC8vIHJlcGVhdGVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIGFyZ3MgPSA1OwotICBpbmxpbmUgaW50IGFyZ3Nfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9hcmdzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0FyZ3NGaWVsZE51bWJlciA9IDU7Ci0gIGlubGluZSBjb25zdCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSYgYXJncyhpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUqIG11dGFibGVfYXJncyhpbnQgaW5kZXgpOwotICBpbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUqIGFkZF9hcmdzKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlID4mCi0gICAgICBhcmdzKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlID4qCi0gICAgICBtdXRhYmxlX2FyZ3MoKTsKLSAgCi0gIC8vIG9wdGlvbmFsIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkRhdGFUeXBlIHJldHVyblZhbHVlID0gNjsKLSAgaW5saW5lIGJvb2wgaGFzX3JldHVybnZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3JldHVybnZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1JldHVyblZhbHVlRmllbGROdW1iZXIgPSA2OwotICBpbmxpbmUgY29uc3QgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUmIHJldHVybnZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSogbXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAKLSAgLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIgZmIgPSA3OwotICBpbmxpbmUgYm9vbCBoYXNfZmIoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZmIoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRmJGaWVsZE51bWJlciA9IDc7Ci0gIGlubGluZSBjb25zdCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlciYgZmIoKSBjb25zdDsKLSAgaW5saW5lIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBtdXRhYmxlX2ZiKCk7Ci0gIAotICAvLyBvcHRpb25hbCBpbnQzMiB0aHJlYWR0aW1lID0gODsKLSAgaW5saW5lIGJvb2wgaGFzX3RocmVhZHRpbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdGhyZWFkdGltZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtUaHJlYWR0aW1lRmllbGROdW1iZXIgPSA4OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB0aHJlYWR0aW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF90aHJlYWR0aW1lKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UpCi0gcHJpdmF0ZToKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgY29udGV4dF9pZF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgc3RhcnRfdGltZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZHVyYXRpb25fOwotICBpbnQgZnVuY3Rpb25fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlID4gYXJnc187Ci0gIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlKiByZXR1cm52YWx1ZV87Ci0gIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBmYl87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdGhyZWFkdGltZV87Ci0gIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dsdHJhY2VfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ2x0cmFjZV8yZXByb3RvKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg4ICsgMzEpIC8gMzJdOwotICAKLSAgLy8gV0hZIERPRVMgJiBIQVZFIExPV0VSIFBSRUNFREVOQ0UgVEhBTiAhPSAhPwotICBpbmxpbmUgYm9vbCBfaGFzX2JpdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKF9oYXNfYml0c19baW5kZXggLyAzMl0gJiAoMXUgPDwgKGluZGV4ICUgMzIpKSkgIT0gMDsKLSAgfQotICBpbmxpbmUgdm9pZCBfc2V0X2JpdChpbnQgaW5kZXgpIHsKLSAgICBfaGFzX2JpdHNfW2luZGV4IC8gMzJdIHw9ICgxdSA8PCAoaW5kZXggJSAzMikpOwotICB9Ci0gIGlubGluZSB2b2lkIF9jbGVhcl9iaXQoaW50IGluZGV4KSB7Ci0gICAgX2hhc19iaXRzX1tpbmRleCAvIDMyXSAmPSB+KDF1IDw8IChpbmRleCAlIDMyKSk7Ci0gIH0KLSAgCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBHTE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIEdMTWVzc2FnZV9EYXRhVHlwZQotCi0vLyByZXF1aXJlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZS5UeXBlIHR5cGUgPSAxIFtkZWZhdWx0ID0gVk9JRF07Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2VfRGF0YVR5cGU6Omhhc190eXBlKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmNsZWFyX3R5cGUoKSB7Ci0gIHR5cGVfID0gMTsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlIEdMTWVzc2FnZV9EYXRhVHlwZTo6dHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlID4odHlwZV8pOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpzZXRfdHlwZSg6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZV9UeXBlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGVfVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIF9zZXRfYml0KDApOwotICB0eXBlXyA9IHZhbHVlOwotfQotCi0vLyByZXF1aXJlZCBib29sIGlzQXJyYXkgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlOjpoYXNfaXNhcnJheSgpIGNvbnN0IHsKLSAgcmV0dXJuIF9oYXNfYml0KDEpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpjbGVhcl9pc2FycmF5KCkgewotICBpc2FycmF5XyA9IGZhbHNlOwotICBfY2xlYXJfYml0KDEpOwotfQotaW5saW5lIGJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlOjppc2FycmF5KCkgY29uc3QgewotICByZXR1cm4gaXNhcnJheV87Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9pc2FycmF5KGJvb2wgdmFsdWUpIHsKLSAgX3NldF9iaXQoMSk7Ci0gIGlzYXJyYXlfID0gdmFsdWU7Ci19Ci0KLS8vIHJlcGVhdGVkIGludDMyIGludFZhbHVlID0gMzsKLWlubGluZSBpbnQgR0xNZXNzYWdlX0RhdGFUeXBlOjppbnR2YWx1ZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gaW50dmFsdWVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6Y2xlYXJfaW50dmFsdWUoKSB7Ci0gIGludHZhbHVlXy5DbGVhcigpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR0xNZXNzYWdlX0RhdGFUeXBlOjppbnR2YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGludHZhbHVlXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpzZXRfaW50dmFsdWUoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIGludHZhbHVlXy5TZXQoaW5kZXgsIHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX2ludHZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgaW50dmFsdWVfLkFkZCh2YWx1ZSk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi1HTE1lc3NhZ2VfRGF0YVR5cGU6OmludHZhbHVlKCkgY29uc3QgewotICByZXR1cm4gaW50dmFsdWVfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgotR0xNZXNzYWdlX0RhdGFUeXBlOjptdXRhYmxlX2ludHZhbHVlKCkgewotICByZXR1cm4gJmludHZhbHVlXzsKLX0KLQotLy8gcmVwZWF0ZWQgZmxvYXQgZmxvYXRWYWx1ZSA9IDQ7Ci1pbmxpbmUgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6ZmxvYXR2YWx1ZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gZmxvYXR2YWx1ZV8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpjbGVhcl9mbG9hdHZhbHVlKCkgewotICBmbG9hdHZhbHVlXy5DbGVhcigpOwotfQotaW5saW5lIGZsb2F0IEdMTWVzc2FnZV9EYXRhVHlwZTo6ZmxvYXR2YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGZsb2F0dmFsdWVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9mbG9hdHZhbHVlKGludCBpbmRleCwgZmxvYXQgdmFsdWUpIHsKLSAgZmxvYXR2YWx1ZV8uU2V0KGluZGV4LCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9mbG9hdHZhbHVlKGZsb2F0IHZhbHVlKSB7Ci0gIGZsb2F0dmFsdWVfLkFkZCh2YWx1ZSk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBmbG9hdCA+JgotR0xNZXNzYWdlX0RhdGFUeXBlOjpmbG9hdHZhbHVlKCkgY29uc3QgewotICByZXR1cm4gZmxvYXR2YWx1ZV87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBmbG9hdCA+KgotR0xNZXNzYWdlX0RhdGFUeXBlOjptdXRhYmxlX2Zsb2F0dmFsdWUoKSB7Ci0gIHJldHVybiAmZmxvYXR2YWx1ZV87Ci19Ci0KLS8vIHJlcGVhdGVkIGJ5dGVzIGNoYXJWYWx1ZSA9IDU7Ci1pbmxpbmUgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6Y2hhcnZhbHVlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBjaGFydmFsdWVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6Y2xlYXJfY2hhcnZhbHVlKCkgewotICBjaGFydmFsdWVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgR0xNZXNzYWdlX0RhdGFUeXBlOjpjaGFydmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBjaGFydmFsdWVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogR0xNZXNzYWdlX0RhdGFUeXBlOjptdXRhYmxlX2NoYXJ2YWx1ZShpbnQgaW5kZXgpIHsKLSAgcmV0dXJuIGNoYXJ2YWx1ZV8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9jaGFydmFsdWUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBjaGFydmFsdWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpzZXRfY2hhcnZhbHVlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgY2hhcnZhbHVlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X2NoYXJ2YWx1ZShpbnQgaW5kZXgsIGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBjaGFydmFsdWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCi0gICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9jaGFydmFsdWUoKSB7Ci0gIHJldHVybiBjaGFydmFsdWVfLkFkZCgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjphZGRfY2hhcnZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGNoYXJ2YWx1ZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9jaGFydmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgY2hhcnZhbHVlXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6YWRkX2NoYXJ2YWx1ZShjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgY2hhcnZhbHVlXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKLUdMTWVzc2FnZV9EYXRhVHlwZTo6Y2hhcnZhbHVlKCkgY29uc3QgewotICByZXR1cm4gY2hhcnZhbHVlXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgotR0xNZXNzYWdlX0RhdGFUeXBlOjptdXRhYmxlX2NoYXJ2YWx1ZSgpIHsKLSAgcmV0dXJuICZjaGFydmFsdWVfOwotfQotCi0vLyByZXBlYXRlZCBieXRlcyByYXdCeXRlcyA9IDY7Ci1pbmxpbmUgaW50IEdMTWVzc2FnZV9EYXRhVHlwZTo6cmF3Ynl0ZXNfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHJhd2J5dGVzXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmNsZWFyX3Jhd2J5dGVzKCkgewotICByYXdieXRlc18uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBHTE1lc3NhZ2VfRGF0YVR5cGU6OnJhd2J5dGVzKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gcmF3Ynl0ZXNfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogR0xNZXNzYWdlX0RhdGFUeXBlOjptdXRhYmxlX3Jhd2J5dGVzKGludCBpbmRleCkgewotICByZXR1cm4gcmF3Ynl0ZXNfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0RhdGFUeXBlOjpzZXRfcmF3Ynl0ZXMoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICByYXdieXRlc18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9yYXdieXRlcyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHJhd2J5dGVzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9EYXRhVHlwZTo6c2V0X3Jhd2J5dGVzKGludCBpbmRleCwgY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHJhd2J5dGVzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogR0xNZXNzYWdlX0RhdGFUeXBlOjphZGRfcmF3Ynl0ZXMoKSB7Ci0gIHJldHVybiByYXdieXRlc18uQWRkKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9yYXdieXRlcyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICByYXdieXRlc18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9yYXdieXRlcyhjb25zdCBjaGFyKiB2YWx1ZSkgewotICByYXdieXRlc18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9yYXdieXRlcyhjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgcmF3Ynl0ZXNfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgotR0xNZXNzYWdlX0RhdGFUeXBlOjpyYXdieXRlcygpIGNvbnN0IHsKLSAgcmV0dXJuIHJhd2J5dGVzXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgotR0xNZXNzYWdlX0RhdGFUeXBlOjptdXRhYmxlX3Jhd2J5dGVzKCkgewotICByZXR1cm4gJnJhd2J5dGVzXzsKLX0KLQotLy8gcmVwZWF0ZWQgYm9vbCBib29sVmFsdWUgPSA3OwotaW5saW5lIGludCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmJvb2x2YWx1ZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gYm9vbHZhbHVlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmNsZWFyX2Jvb2x2YWx1ZSgpIHsKLSAgYm9vbHZhbHVlXy5DbGVhcigpOwotfQotaW5saW5lIGJvb2wgR0xNZXNzYWdlX0RhdGFUeXBlOjpib29sdmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBib29sdmFsdWVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OnNldF9ib29sdmFsdWUoaW50IGluZGV4LCBib29sIHZhbHVlKSB7Ci0gIGJvb2x2YWx1ZV8uU2V0KGluZGV4LCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRGF0YVR5cGU6OmFkZF9ib29sdmFsdWUoYm9vbCB2YWx1ZSkgewotICBib29sdmFsdWVfLkFkZCh2YWx1ZSk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBib29sID4mCi1HTE1lc3NhZ2VfRGF0YVR5cGU6OmJvb2x2YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGJvb2x2YWx1ZV87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCBib29sID4qCi1HTE1lc3NhZ2VfRGF0YVR5cGU6Om11dGFibGVfYm9vbHZhbHVlKCkgewotICByZXR1cm4gJmJvb2x2YWx1ZV87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gR0xNZXNzYWdlX0ZyYW1lQnVmZmVyCi0KLS8vIHJlcXVpcmVkIGludDMyIHdpZHRoID0gMTsKLWlubGluZSBib29sIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6aGFzX3dpZHRoKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmNsZWFyX3dpZHRoKCkgewotICB3aWR0aF8gPSAwOwotICBfY2xlYXJfYml0KDApOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjp3aWR0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIHdpZHRoXzsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6c2V0X3dpZHRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgX3NldF9iaXQoMCk7Ci0gIHdpZHRoXyA9IHZhbHVlOwotfQotCi0vLyByZXF1aXJlZCBpbnQzMiBoZWlnaHQgPSAyOwotaW5saW5lIGJvb2wgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpoYXNfaGVpZ2h0KCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmNsZWFyX2hlaWdodCgpIHsKLSAgaGVpZ2h0XyA9IDA7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmhlaWdodCgpIGNvbnN0IHsKLSAgcmV0dXJuIGhlaWdodF87Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OnNldF9oZWlnaHQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgaGVpZ2h0XyA9IHZhbHVlOwotfQotCi0vLyByZXBlYXRlZCBieXRlcyBjb250ZW50cyA9IDM7Ci1pbmxpbmUgaW50IEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Y29udGVudHNfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnRlbnRzXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmNsZWFyX2NvbnRlbnRzKCkgewotICBjb250ZW50c18uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmNvbnRlbnRzKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gY29udGVudHNfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjptdXRhYmxlX2NvbnRlbnRzKGludCBpbmRleCkgewotICByZXR1cm4gY29udGVudHNfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpzZXRfY29udGVudHMoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBjb250ZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OnNldF9jb250ZW50cyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIGNvbnRlbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6c2V0X2NvbnRlbnRzKGludCBpbmRleCwgY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIGNvbnRlbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjphZGRfY29udGVudHMoKSB7Ci0gIHJldHVybiBjb250ZW50c18uQWRkKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmFkZF9jb250ZW50cyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBjb250ZW50c18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmFkZF9jb250ZW50cyhjb25zdCBjaGFyKiB2YWx1ZSkgewotICBjb250ZW50c18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2VfRnJhbWVCdWZmZXI6OmFkZF9jb250ZW50cyhjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgY29udGVudHNfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgotR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjpjb250ZW50cygpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnRlbnRzXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgotR0xNZXNzYWdlX0ZyYW1lQnVmZmVyOjptdXRhYmxlX2NvbnRlbnRzKCkgewotICByZXR1cm4gJmNvbnRlbnRzXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHTE1lc3NhZ2UKLQotLy8gcmVxdWlyZWQgaW50MzIgY29udGV4dF9pZCA9IDE7Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2U6Omhhc19jb250ZXh0X2lkKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoMCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OmNsZWFyX2NvbnRleHRfaWQoKSB7Ci0gIGNvbnRleHRfaWRfID0gMDsKLSAgX2NsZWFyX2JpdCgwKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEdMTWVzc2FnZTo6Y29udGV4dF9pZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnRleHRfaWRfOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpzZXRfY29udGV4dF9pZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDApOwotICBjb250ZXh0X2lkXyA9IHZhbHVlOwotfQotCi0vLyByZXF1aXJlZCBpbnQ2NCBzdGFydF90aW1lID0gMjsKLWlubGluZSBib29sIEdMTWVzc2FnZTo6aGFzX3N0YXJ0X3RpbWUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgxKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfc3RhcnRfdGltZSgpIHsKLSAgc3RhcnRfdGltZV8gPSBHT09HTEVfTE9OR0xPTkcoMCk7Ci0gIF9jbGVhcl9iaXQoMSk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBHTE1lc3NhZ2U6OnN0YXJ0X3RpbWUoKSBjb25zdCB7Ci0gIHJldHVybiBzdGFydF90aW1lXzsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6c2V0X3N0YXJ0X3RpbWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCB2YWx1ZSkgewotICBfc2V0X2JpdCgxKTsKLSAgc3RhcnRfdGltZV8gPSB2YWx1ZTsKLX0KLQotLy8gcmVxdWlyZWQgaW50MzIgZHVyYXRpb24gPSAzOwotaW5saW5lIGJvb2wgR0xNZXNzYWdlOjpoYXNfZHVyYXRpb24oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgyKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfZHVyYXRpb24oKSB7Ci0gIGR1cmF0aW9uXyA9IDA7Ci0gIF9jbGVhcl9iaXQoMik7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHTE1lc3NhZ2U6OmR1cmF0aW9uKCkgY29uc3QgewotICByZXR1cm4gZHVyYXRpb25fOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpzZXRfZHVyYXRpb24oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBfc2V0X2JpdCgyKTsKLSAgZHVyYXRpb25fID0gdmFsdWU7Ci19Ci0KLS8vIHJlcXVpcmVkIC5hbmRyb2lkLmdsdHJhY2UuR0xNZXNzYWdlLkZ1bmN0aW9uIGZ1bmN0aW9uID0gNCBbZGVmYXVsdCA9IGludmFsaWRdOwotaW5saW5lIGJvb2wgR0xNZXNzYWdlOjpoYXNfZnVuY3Rpb24oKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCgzKTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfZnVuY3Rpb24oKSB7Ci0gIGZ1bmN0aW9uXyA9IDMwMDA7Ci0gIF9jbGVhcl9iaXQoMyk7Ci19Ci1pbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRnVuY3Rpb24gR0xNZXNzYWdlOjpmdW5jdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GdW5jdGlvbiA+KGZ1bmN0aW9uXyk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OnNldF9mdW5jdGlvbig6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GdW5jdGlvbiB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0Z1bmN0aW9uX0lzVmFsaWQodmFsdWUpKTsKLSAgX3NldF9iaXQoMyk7Ci0gIGZ1bmN0aW9uXyA9IHZhbHVlOwotfQotCi0vLyByZXBlYXRlZCAuYW5kcm9pZC5nbHRyYWNlLkdMTWVzc2FnZS5EYXRhVHlwZSBhcmdzID0gNTsKLWlubGluZSBpbnQgR0xNZXNzYWdlOjphcmdzX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBhcmdzXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OmNsZWFyX2FyZ3MoKSB7Ci0gIGFyZ3NfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUmIEdMTWVzc2FnZTo6YXJncyhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGFyZ3NfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUqIEdMTWVzc2FnZTo6bXV0YWJsZV9hcmdzKGludCBpbmRleCkgewotICByZXR1cm4gYXJnc18uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjphbmRyb2lkOjpnbHRyYWNlOjpHTE1lc3NhZ2VfRGF0YVR5cGUqIEdMTWVzc2FnZTo6YWRkX2FyZ3MoKSB7Ci0gIHJldHVybiBhcmdzXy5BZGQoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlID4mCi1HTE1lc3NhZ2U6OmFyZ3MoKSBjb25zdCB7Ci0gIHJldHVybiBhcmdzXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlID4qCi1HTE1lc3NhZ2U6Om11dGFibGVfYXJncygpIHsKLSAgcmV0dXJuICZhcmdzXzsKLX0KLQotLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRGF0YVR5cGUgcmV0dXJuVmFsdWUgPSA2OwotaW5saW5lIGJvb2wgR0xNZXNzYWdlOjpoYXNfcmV0dXJudmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCg1KTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfcmV0dXJudmFsdWUoKSB7Ci0gIGlmIChyZXR1cm52YWx1ZV8gIT0gTlVMTCkgcmV0dXJudmFsdWVfLT46OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZTo6Q2xlYXIoKTsKLSAgX2NsZWFyX2JpdCg1KTsKLX0KLWlubGluZSBjb25zdCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZSYgR0xNZXNzYWdlOjpyZXR1cm52YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHJldHVybnZhbHVlXyAhPSBOVUxMID8gKnJldHVybnZhbHVlXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+cmV0dXJudmFsdWVfOwotfQotaW5saW5lIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0RhdGFUeXBlKiBHTE1lc3NhZ2U6Om11dGFibGVfcmV0dXJudmFsdWUoKSB7Ci0gIF9zZXRfYml0KDUpOwotICBpZiAocmV0dXJudmFsdWVfID09IE5VTEwpIHJldHVybnZhbHVlXyA9IG5ldyA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9EYXRhVHlwZTsKLSAgcmV0dXJuIHJldHVybnZhbHVlXzsKLX0KLQotLy8gb3B0aW9uYWwgLmFuZHJvaWQuZ2x0cmFjZS5HTE1lc3NhZ2UuRnJhbWVCdWZmZXIgZmIgPSA3OwotaW5saW5lIGJvb2wgR0xNZXNzYWdlOjpoYXNfZmIoKSBjb25zdCB7Ci0gIHJldHVybiBfaGFzX2JpdCg2KTsKLX0KLWlubGluZSB2b2lkIEdMTWVzc2FnZTo6Y2xlYXJfZmIoKSB7Ci0gIGlmIChmYl8gIT0gTlVMTCkgZmJfLT46OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjo6Q2xlYXIoKTsKLSAgX2NsZWFyX2JpdCg2KTsKLX0KLWlubGluZSBjb25zdCA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlciYgR0xNZXNzYWdlOjpmYigpIGNvbnN0IHsKLSAgcmV0dXJuIGZiXyAhPSBOVUxMID8gKmZiXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+ZmJfOwotfQotaW5saW5lIDo6YW5kcm9pZDo6Z2x0cmFjZTo6R0xNZXNzYWdlX0ZyYW1lQnVmZmVyKiBHTE1lc3NhZ2U6Om11dGFibGVfZmIoKSB7Ci0gIF9zZXRfYml0KDYpOwotICBpZiAoZmJfID09IE5VTEwpIGZiXyA9IG5ldyA6OmFuZHJvaWQ6OmdsdHJhY2U6OkdMTWVzc2FnZV9GcmFtZUJ1ZmZlcjsKLSAgcmV0dXJuIGZiXzsKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgdGhyZWFkdGltZSA9IDg7Ci1pbmxpbmUgYm9vbCBHTE1lc3NhZ2U6Omhhc190aHJlYWR0aW1lKCkgY29uc3QgewotICByZXR1cm4gX2hhc19iaXQoNyk7Ci19Ci1pbmxpbmUgdm9pZCBHTE1lc3NhZ2U6OmNsZWFyX3RocmVhZHRpbWUoKSB7Ci0gIHRocmVhZHRpbWVfID0gMDsKLSAgX2NsZWFyX2JpdCg3KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEdMTWVzc2FnZTo6dGhyZWFkdGltZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHRocmVhZHRpbWVfOwotfQotaW5saW5lIHZvaWQgR0xNZXNzYWdlOjpzZXRfdGhyZWFkdGltZSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIF9zZXRfYml0KDcpOwotICB0aHJlYWR0aW1lXyA9IHZhbHVlOwotfQotCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCi0KLX0gIC8vIG5hbWVzcGFjZSBnbHRyYWNlCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX2dsdHJhY2VfMmVwcm90b19fSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfYXBpLmNwcCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfYXBpLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmNmNiYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2FwaS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzg2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIEdFTkVSQVRFRCBCWSBBIFNDUklQVC4gRE8gTk9UIEVESVQuCi0gKi8KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLQotI2luY2x1ZGUgImdsdHJhY2UucGIuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2NvbnRleHQuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2ZpeHVwLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV90cmFuc3BvcnQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi0vLyBEZWZpbml0aW9ucyBmb3IgR0wyIEFQSXMKLQotdm9pZCBHTFRyYWNlX2dsQWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQWN0aXZlVGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKChpbnQpdGV4dHVyZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEF0dGFjaFNoYWRlcihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQXR0YWNoU2hhZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVyLT5hZGRfaW50dmFsdWUoc2hhZGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgc2hhZGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJpbmRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRBdHRyaWJMb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZGV4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5kZXggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmRleC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmRleC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5kZXgtPmFkZF9pbnR2YWx1ZShpbmRleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uYW1lLT5hZGRfaW50dmFsdWUoKGludCluYW1lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kQXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgaW5kZXgsIG5hbWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbmFtZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmluZEJ1ZmZlcihHTGVudW0gdGFyZ2V0LCBHTHVpbnQgYnVmZmVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kQnVmZmVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmZmVyLT5hZGRfaW50dmFsdWUoYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kQnVmZmVyKHRhcmdldCwgYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJpbmRGcmFtZWJ1ZmZlcihHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJpbmRGcmFtZWJ1ZmZlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPmFkZF9pbnR2YWx1ZShmcmFtZWJ1ZmZlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmluZEZyYW1lYnVmZmVyKHRhcmdldCwgZnJhbWVidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmluZFJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kUmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5hZGRfaW50dmFsdWUocmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kUmVuZGVyYnVmZmVyKHRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJpbmRUZXh0dXJlKEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kVGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUodGV4dHVyZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmluZFRleHR1cmUodGFyZ2V0LCB0ZXh0dXJlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kQ29sb3IoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJsZW5kQ29sb3IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3JlZC0+YWRkX2Zsb2F0dmFsdWUocmVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JlZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncmVlbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfZmxvYXR2YWx1ZShncmVlbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ibHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ibHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2JsdWUtPmFkZF9mbG9hdHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9mbG9hdHZhbHVlKGFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCbGVuZENvbG9yKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kRXF1YXRpb24oR0xlbnVtIG1vZGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJsZW5kRXF1YXRpb24obW9kZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGVSR0IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlUkdCID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZVJHQi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlUkdCLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZVJHQi0+YWRkX2ludHZhbHVlKChpbnQpbW9kZVJHQik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGVBbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGVBbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGVBbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlQWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlQWxwaGEtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGVBbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1vZGVSR0IsIG1vZGVBbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCbGVuZEZ1bmMoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCbGVuZEZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzZmFjdG9yCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2ZhY3RvciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NmYWN0b3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2ZhY3Rvci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3NmYWN0b3ItPmFkZF9pbnR2YWx1ZSgoaW50KXNmYWN0b3IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZmFjdG9yCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGZhY3RvciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RmYWN0b3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGZhY3Rvci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2RmYWN0b3ItPmFkZF9pbnR2YWx1ZSgoaW50KWRmYWN0b3IpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJsZW5kRnVuY1NlcGFyYXRlKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY1JHQgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY1JHQiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NyY1JHQi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNSR0ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19zcmNSR0ItPmFkZF9pbnR2YWx1ZSgoaW50KXNyY1JHQik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdFJHQgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdFJHQiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RzdFJHQi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RSR0ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19kc3RSR0ItPmFkZF9pbnR2YWx1ZSgoaW50KWRzdFJHQik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNyY0FscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3JjQWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNBbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zcmNBbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3NyY0FscGhhLT5hZGRfaW50dmFsdWUoKGludClzcmNBbHBoYSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRzdEFscGhhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHN0QWxwaGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RBbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kc3RBbHBoYS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2RzdEFscGhhLT5hZGRfaW50dmFsdWUoKGludClkc3RBbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCdWZmZXJEYXRhKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhLCBHTGVudW0gdXNhZ2UpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJ1ZmZlckRhdGEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkYXRhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YS0+YWRkX2ludHZhbHVlKChpbnQpZGF0YSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHVzYWdlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdXNhZ2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ191c2FnZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ191c2FnZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3VzYWdlLT5hZGRfaW50dmFsdWUoKGludCl1c2FnZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGRhdGEsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEJ1ZmZlclN1YkRhdGEoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQnVmZmVyU3ViRGF0YSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX29mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX29mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19vZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX29mZnNldC0+YWRkX2ludHZhbHVlKG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCdWZmZXJTdWJEYXRhKHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGRhdGEsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMZW51bSBHTFRyYWNlX2dsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhHTGVudW0gdGFyZ2V0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xlbnVtIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHRhcmdldCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBydC0+YWRkX2ludHZhbHVlKChpbnQpcmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xlYXIoR0xiaXRmaWVsZCBtYXNrKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hc2sKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXNrID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXNrLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXNrLT5hZGRfaW50dmFsdWUobWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xlYXIobWFzayk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhckNvbG9yKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhckNvbG9yKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yZWQtPmFkZF9mbG9hdHZhbHVlKHJlZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyZWVuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JlZW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncmVlbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncmVlbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ncmVlbi0+YWRkX2Zsb2F0dmFsdWUoZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ibHVlLT5hZGRfZmxvYXR2YWx1ZShibHVlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYWxwaGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FscGhhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2FscGhhLT5hZGRfZmxvYXR2YWx1ZShhbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xlYXJDb2xvcihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoZihHTGNsYW1wZiBkZXB0aCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xlYXJEZXB0aGYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9mbG9hdHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhckRlcHRoZihkZXB0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhclN0ZW5jaWwoR0xpbnQgcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xlYXJTdGVuY2lsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3MtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3MtPmFkZF9pbnR2YWx1ZShzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhclN0ZW5jaWwocyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb2xvck1hc2soR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb2xvck1hc2spOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfcmVkLT5hZGRfYm9vbHZhbHVlKHJlZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyZWVuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JlZW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncmVlbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncmVlbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfYm9vbHZhbHVlKGdyZWVuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ibHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19ibHVlLT5hZGRfYm9vbHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19hbHBoYS0+YWRkX2Jvb2x2YWx1ZShhbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbXBpbGVTaGFkZXIoR0x1aW50IHNoYWRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29tcGlsZVNoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlci0+YWRkX2ludHZhbHVlKHNoYWRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29tcHJlc3NlZFRleEltYWdlMkQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3JkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3JkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3JkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm9yZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ib3JkZXItPmFkZF9pbnR2YWx1ZShib3JkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbWFnZVNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbWFnZVNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbWFnZVNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbWFnZVNpemUtPmFkZF9pbnR2YWx1ZShpbWFnZVNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkYXRhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YS0+YWRkX2ludHZhbHVlKChpbnQpZGF0YSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29tcHJlc3NlZFRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgaW1hZ2VTaXplLCBkYXRhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGRhdGEsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeG9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeG9mZnNldC0+YWRkX2ludHZhbHVlKHhvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeW9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeW9mZnNldC0+YWRkX2ludHZhbHVlKHlvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbWFnZVNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbWFnZVNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbWFnZVNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbWFnZVNpemUtPmFkZF9pbnR2YWx1ZShpbWFnZVNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkYXRhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YS0+YWRkX2ludHZhbHVlKChpbnQpZGF0YSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29weVRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ29weVRleEltYWdlMkQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3JkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3JkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3JkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm9yZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ib3JkZXItPmFkZF9pbnR2YWx1ZShib3JkZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvcHlUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29weVRleFN1YkltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb3B5VGV4U3ViSW1hZ2UyRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHhvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194b2Zmc2V0LT5hZGRfaW50dmFsdWUoeG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHlvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195b2Zmc2V0LT5hZGRfaW50dmFsdWUoeW9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29weVRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTHVpbnQgR0xUcmFjZV9nbENyZWF0ZVByb2dyYW0odm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ3JlYXRlUHJvZ3JhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMdWludCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBydC0+YWRkX2ludHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLUdMdWludCBHTFRyYWNlX2dsQ3JlYXRlU2hhZGVyKEdMZW51bSB0eXBlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDcmVhdGVTaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTHVpbnQgcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENyZWF0ZVNoYWRlcih0eXBlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDdWxsRmFjZShHTGVudW0gbW9kZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ3VsbEZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEN1bGxGYWNlKG1vZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlQnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVCdWZmZXJzKG4sIGJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZUZyYW1lYnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpZnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVGcmFtZWJ1ZmZlcnMobiwgZnJhbWVidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGZyYW1lYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlUHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVJlbmRlcmJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpcmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlUmVuZGVyYnVmZmVycyhuLCByZW5kZXJidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHJlbmRlcmJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVNoYWRlcihHTHVpbnQgc2hhZGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVTaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXItPmFkZF9pbnR2YWx1ZShzaGFkZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHRleHR1cmVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVUZXh0dXJlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZXMtPmFkZF9pbnR2YWx1ZSgoaW50KXRleHR1cmVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVUZXh0dXJlcyhuLCB0ZXh0dXJlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB0ZXh0dXJlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVwdGhGdW5jKEdMZW51bSBmdW5jKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZXB0aEZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmdW5jCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnVuYyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Z1bmMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnVuYy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Z1bmMtPmFkZF9pbnR2YWx1ZSgoaW50KWZ1bmMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlcHRoRnVuYyhmdW5jKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlcHRoTWFzayhHTGJvb2xlYW4gZmxhZykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVwdGhNYXNrKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmxhZwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZsYWcgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mbGFnLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZsYWctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19mbGFnLT5hZGRfYm9vbHZhbHVlKGZsYWcpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlcHRoTWFzayhmbGFnKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlcHRoUmFuZ2VmKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZXB0aFJhbmdlZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196TmVhci0+YWRkX2Zsb2F0dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196RmFyLT5hZGRfZmxvYXR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZXB0aFJhbmdlZih6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZXRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERldGFjaFNoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlci0+YWRkX2ludHZhbHVlKHNoYWRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGV0YWNoU2hhZGVyKHByb2dyYW0sIHNoYWRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEaXNhYmxlKEdMZW51bSBjYXApIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERpc2FibGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjYXAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jYXAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jYXAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY2FwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY2FwLT5hZGRfaW50dmFsdWUoKGludCljYXApOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERpc2FibGUoY2FwKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShHTHVpbnQgaW5kZXgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZGV4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5kZXggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmRleC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmRleC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5kZXgtPmFkZF9pbnR2YWx1ZShpbmRleCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3QXJyYXlzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmlyc3QKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19maXJzdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZpcnN0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZpcnN0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19maXJzdC0+YWRkX2ludHZhbHVlKGZpcnN0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdFbGVtZW50cyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZGljZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRpY2VzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5kaWNlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmRpY2VzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRpY2VzLT5hZGRfaW50dmFsdWUoKGludClpbmRpY2VzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgaW5kaWNlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRW5hYmxlKEdMZW51bSBjYXApIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVuYWJsZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNhcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NhcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NhcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jYXAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jYXAtPmFkZF9pbnR2YWx1ZSgoaW50KWNhcCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRW5hYmxlKGNhcCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShHTHVpbnQgaW5kZXgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGaW5pc2godm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRmluaXNoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGaW5pc2goKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZsdXNoKHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZsdXNoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGbHVzaCgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVydGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVydGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVydGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnRhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnRhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpcmVuZGVyYnVmZmVydGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5hZGRfaW50dmFsdWUocmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RleHRhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGV4dGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJvbnRGYWNlKEdMZW51bSBtb2RlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcm9udEZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtb2RlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9kZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbW9kZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX21vZGUtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZyb250RmFjZShtb2RlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlbkJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQqIGJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlbkJ1ZmZlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuQnVmZmVycyhuLCBidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlbmVyYXRlTWlwbWFwKEdMZW51bSB0YXJnZXQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlbmVyYXRlTWlwbWFwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5lcmF0ZU1pcG1hcCh0YXJnZXQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlbkZyYW1lYnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpZnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5GcmFtZWJ1ZmZlcnMobiwgZnJhbWVidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGZyYW1lYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuUmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClyZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5SZW5kZXJidWZmZXJzKG4sIHJlbmRlcmJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcmVuZGVyYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuVGV4dHVyZXMoR0xzaXplaSBuLCBHTHVpbnQqIHRleHR1cmVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5UZXh0dXJlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZXMtPmFkZF9pbnR2YWx1ZSgoaW50KXRleHR1cmVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5UZXh0dXJlcyhuLCB0ZXh0dXJlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB0ZXh0dXJlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0QWN0aXZlQXR0cmliKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEFjdGl2ZUF0dHJpYik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZGV4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5kZXggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmRleC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmRleC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5kZXgtPmFkZF9pbnR2YWx1ZShpbmRleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZnNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZzaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZzaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZzaXplLT5hZGRfaW50dmFsdWUoYnVmc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKChpbnQpbGVuZ3RoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NpemUtPmFkZF9pbnR2YWx1ZSgoaW50KXNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uYW1lLT5hZGRfaW50dmFsdWUoKGludCluYW1lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIHNpemUsCi0gICAgICAgICh2b2lkICopIHR5cGUsCi0gICAgICAgICh2b2lkICopIG5hbWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEFjdGl2ZVVuaWZvcm0oR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlVW5pZm9ybSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZGV4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5kZXggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmRleC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmRleC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5kZXgtPmFkZF9pbnR2YWx1ZShpbmRleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZnNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZzaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZzaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZzaXplLT5hZGRfaW50dmFsdWUoYnVmc2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKChpbnQpbGVuZ3RoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NpemUtPmFkZF9pbnR2YWx1ZSgoaW50KXNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uYW1lLT5hZGRfaW50dmFsdWUoKGludCluYW1lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRBY3RpdmVVbmlmb3JtKHByb2dyYW0sIGluZGV4LCBidWZzaXplLCBsZW5ndGgsIHNpemUsIHR5cGUsIG5hbWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgICAgICAodm9pZCAqKSBzaXplLAotICAgICAgICAodm9pZCAqKSB0eXBlLAotICAgICAgICAodm9pZCAqKSBuYW1lLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRBdHRhY2hlZFNoYWRlcnMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEF0dGFjaGVkU2hhZGVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1heGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4Y291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXhjb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXhjb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4Y291bnQtPmFkZF9pbnR2YWx1ZShtYXhjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KXNoYWRlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtLCBtYXhjb3VudCwgY291bnQsIHNoYWRlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgY291bnQsCi0gICAgICAgICh2b2lkICopIHNoYWRlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLWludCBHTFRyYWNlX2dsR2V0QXR0cmliTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0QXR0cmliTG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX25hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpbmFtZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGludCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIHJ0LT5hZGRfaW50dmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbmFtZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0Qm9vbGVhbnYoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0Qm9vbGVhbnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0Qm9vbGVhbnYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEJ1ZmZlclBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xlbnVtIEdMVHJhY2VfZ2xHZXRFcnJvcih2b2lkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRFcnJvcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMZW51bSByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0RXJyb3IoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIHJ0LT5hZGRfaW50dmFsdWUoKGludClyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRGbG9hdHYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEZsb2F0dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRGbG9hdHYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0SW50ZWdlcnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0SW50ZWdlcnYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1pdihHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQcm9ncmFtSW5mb0xvZyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UHJvZ3JhbUluZm9Mb2cpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmc2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZnNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZm9sb2cKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmZvbG9nID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5mb2xvZy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmZvbG9nLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmZvbG9nLT5hZGRfaW50dmFsdWUoKGludClpbmZvbG9nKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgICAgICAodm9pZCAqKSBpbmZvbG9nLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFNoYWRlcml2KEdMdWludCBzaGFkZXIsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXItPmFkZF9pbnR2YWx1ZShzaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0U2hhZGVyaXYoc2hhZGVyLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVySW5mb0xvZyhHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRTaGFkZXJJbmZvTG9nKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVyLT5hZGRfaW50dmFsdWUoc2hhZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZnNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZzaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZnNpemUtPmFkZF9pbnR2YWx1ZShidWZzaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmZvbG9nCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5mb2xvZyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZm9sb2ctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5mb2xvZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5mb2xvZy0+YWRkX2ludHZhbHVlKChpbnQpaW5mb2xvZyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGJ1ZnNpemUsIGxlbmd0aCwgaW5mb2xvZyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIGluZm9sb2csCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFNoYWRlclByZWNpc2lvbkZvcm1hdChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVydHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlcnR5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXJ0eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlcnR5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19zaGFkZXJ0eXBlLT5hZGRfaW50dmFsdWUoKGludClzaGFkZXJ0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJlY2lzaW9udHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ByZWNpc2lvbnR5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcmVjaXNpb250eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ByZWNpc2lvbnR5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wcmVjaXNpb250eXBlLT5hZGRfaW50dmFsdWUoKGludClwcmVjaXNpb250eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmFuZ2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yYW5nZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JhbmdlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JhbmdlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yYW5nZS0+YWRkX2ludHZhbHVlKChpbnQpcmFuZ2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcmVjaXNpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcmVjaXNpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcmVjaXNpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJlY2lzaW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcmVjaXNpb24tPmFkZF9pbnR2YWx1ZSgoaW50KXByZWNpc2lvbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KHNoYWRlcnR5cGUsIHByZWNpc2lvbnR5cGUsIHJhbmdlLCBwcmVjaXNpb24pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcmFuZ2UsCi0gICAgICAgICh2b2lkICopIHByZWNpc2lvbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIHNvdXJjZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0U2hhZGVyU291cmNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVyLT5hZGRfaW50dmFsdWUoc2hhZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZnNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZzaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZnNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZnNpemUtPmFkZF9pbnR2YWx1ZShidWZzaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzb3VyY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zb3VyY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zb3VyY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc291cmNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zb3VyY2UtPmFkZF9pbnR2YWx1ZSgoaW50KXNvdXJjZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0U2hhZGVyU291cmNlKHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBzb3VyY2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgICAgICAodm9pZCAqKSBzb3VyY2UsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLWNvbnN0IEdMdWJ5dGUqIEdMVHJhY2VfZ2xHZXRTdHJpbmcoR0xlbnVtIG5hbWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFN0cmluZyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpbmFtZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGNvbnN0IEdMdWJ5dGUqIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRTdHJpbmcobmFtZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIHJ0LT5hZGRfaW50dmFsdWUoKGludClyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSByZXRWYWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VGV4UGFyYW1ldGVyZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFRleFBhcmFtZXRlcmZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFRleFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4UGFyYW1ldGVyaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VW5pZm9ybWZ2KEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRVbmlmb3JtZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VW5pZm9ybWZ2KHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRVbmlmb3JtaXYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRVbmlmb3JtaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VW5pZm9ybWl2KHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1pbnQgR0xUcmFjZV9nbEdldFVuaWZvcm1Mb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRVbmlmb3JtTG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX25hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpbmFtZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGludCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIG5hbWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBydC0+YWRkX2ludHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIG5hbWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFZlcnRleEF0dHJpYmZ2KEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFZlcnRleEF0dHJpYmZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFZlcnRleEF0dHJpYmZ2KGluZGV4LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VmVydGV4QXR0cmliaXYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFZlcnRleEF0dHJpYml2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGV4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZGV4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmRleC0+YWRkX2ludHZhbHVlKGluZGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG9pbnRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BvaW50ZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BvaW50ZXItPmFkZF9pbnR2YWx1ZSgoaW50KXBvaW50ZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xIaW50KEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xIaW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xIaW50KHRhcmdldCwgbW9kZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzQnVmZmVyKEdMdWludCBidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzQnVmZmVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmZmVyLT5hZGRfaW50dmFsdWUoYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc0J1ZmZlcihidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc0VuYWJsZWQoR0xlbnVtIGNhcCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNFbmFibGVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY2FwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY2FwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY2FwLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NhcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2NhcC0+YWRkX2ludHZhbHVlKChpbnQpY2FwKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc0VuYWJsZWQoY2FwKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNGcmFtZWJ1ZmZlcihHTHVpbnQgZnJhbWVidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzRnJhbWVidWZmZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmcmFtZWJ1ZmZlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVyLT5hZGRfaW50dmFsdWUoZnJhbWVidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzRnJhbWVidWZmZXIoZnJhbWVidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1Byb2dyYW0oR0x1aW50IHByb2dyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzUHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNQcm9ncmFtKHByb2dyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1JlbmRlcmJ1ZmZlcihHTHVpbnQgcmVuZGVyYnVmZmVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc1JlbmRlcmJ1ZmZlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlbmRlcmJ1ZmZlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlbmRlcmJ1ZmZlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZW5kZXJidWZmZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+YWRkX2ludHZhbHVlKHJlbmRlcmJ1ZmZlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNSZW5kZXJidWZmZXIocmVuZGVyYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNTaGFkZXIoR0x1aW50IHNoYWRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNTaGFkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaGFkZXItPmFkZF9pbnR2YWx1ZShzaGFkZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzU2hhZGVyKHNoYWRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzVGV4dHVyZShHTHVpbnQgdGV4dHVyZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNUZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc1RleHR1cmUodGV4dHVyZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaW5lV2lkdGgoR0xmbG9hdCB3aWR0aCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGluZVdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfZmxvYXR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGluZVdpZHRoKHdpZHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpbmtQcm9ncmFtKEdMdWludCBwcm9ncmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaW5rUHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQaXhlbFN0b3JlaShHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQaXhlbFN0b3JlaSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvbHlnb25PZmZzZXQoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvbHlnb25PZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWN0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWN0b3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWN0b3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2ZhY3Rvci0+YWRkX2Zsb2F0dmFsdWUoZmFjdG9yKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdW5pdHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ191bml0cyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3VuaXRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3VuaXRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3VuaXRzLT5hZGRfZmxvYXR2YWx1ZSh1bml0cyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9seWdvbk9mZnNldChmYWN0b3IsIHVuaXRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlYWRQaXhlbHMoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQqIHBpeGVscykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVhZFBpeGVscyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpeGVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpeGVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXhlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpeGVscy0+YWRkX2ludHZhbHVlKChpbnQpcGl4ZWxzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBpeGVscywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVsZWFzZVNoYWRlckNvbXBpbGVyKHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2UodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTYW1wbGVDb3ZlcmFnZShHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2FtcGxlQ292ZXJhZ2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9mbG9hdHZhbHVlKHZhbHVlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW52ZXJ0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW52ZXJ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW52ZXJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludmVydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2ludmVydC0+YWRkX2Jvb2x2YWx1ZShpbnZlcnQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNhbXBsZUNvdmVyYWdlKHZhbHVlLCBpbnZlcnQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2Npc3NvcihHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2Npc3Nvcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNoYWRlckJpbmFyeShHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTaGFkZXJCaW5hcnkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaGFkZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2hhZGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2hhZGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2hhZGVycy0+YWRkX2ludHZhbHVlKChpbnQpc2hhZGVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJpbmFyeWZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JpbmFyeWZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JpbmFyeWZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19iaW5hcnlmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19iaW5hcnlmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWJpbmFyeWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJpbmFyeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JpbmFyeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JpbmFyeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19iaW5hcnktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JpbmFyeS0+YWRkX2ludHZhbHVlKChpbnQpYmluYXJ5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUobGVuZ3RoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTaGFkZXJCaW5hcnkobiwgc2hhZGVycywgYmluYXJ5Zm9ybWF0LCBiaW5hcnksIGxlbmd0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBzaGFkZXJzLAotICAgICAgICAodm9pZCAqKSBiaW5hcnksCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNoYWRlclNvdXJjZShHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIqKiBzdHJpbmcsIGNvbnN0IEdMaW50KiBsZW5ndGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNoYWRlclNvdXJjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NoYWRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlci0+YWRkX2ludHZhbHVlKHNoYWRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmluZwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmluZyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmluZy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpbmctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmluZy0+YWRkX2ludHZhbHVlKChpbnQpc3RyaW5nKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNoYWRlclNvdXJjZShzaGFkZXIsIGNvdW50LCBzdHJpbmcsIGxlbmd0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBzdHJpbmcsCi0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbEZ1bmMoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFN0ZW5jaWxGdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnVuYwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Z1bmMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mdW5jLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Z1bmMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mdW5jLT5hZGRfaW50dmFsdWUoKGludClmdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVmCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVmID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVmLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVmLT5hZGRfaW50dmFsdWUocmVmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hc2sgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXNrLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hc2stPmFkZF9pbnR2YWx1ZShtYXNrKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbEZ1bmNTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmdW5jCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnVuYyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Z1bmMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnVuYy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Z1bmMtPmFkZF9pbnR2YWx1ZSgoaW50KWZ1bmMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWYgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWYtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVmLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWYtPmFkZF9pbnR2YWx1ZShyZWYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXNrCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWFzayA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hc2stPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFzay0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWFzay0+YWRkX2ludHZhbHVlKG1hc2spOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSwgZnVuYywgcmVmLCBtYXNrKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxNYXNrKEdMdWludCBtYXNrKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTdGVuY2lsTWFzayk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hc2sKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXNrID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXNrLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXNrLT5hZGRfaW50dmFsdWUobWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU3RlbmNpbE1hc2sobWFzayk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTdGVuY2lsTWFza1NlcGFyYXRlKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU3RlbmNpbE1hc2tTZXBhcmF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hc2sKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXNrID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXNrLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXNrLT5hZGRfaW50dmFsdWUobWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU3RlbmNpbE1hc2tTZXBhcmF0ZShmYWNlLCBtYXNrKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxPcChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFN0ZW5jaWxPcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhaWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWlsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFpbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWlsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFpbC0+YWRkX2ludHZhbHVlKChpbnQpZmFpbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpmYWlsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfemZhaWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196ZmFpbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196ZmFpbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3pmYWlsLT5hZGRfaW50dmFsdWUoKGludCl6ZmFpbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpwYXNzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfenBhc3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196cGFzcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196cGFzcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3pwYXNzLT5hZGRfaW50dmFsdWUoKGludCl6cGFzcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU3RlbmNpbE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTdGVuY2lsT3BTZXBhcmF0ZShHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTdGVuY2lsT3BTZXBhcmF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhaWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWlsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFpbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWlsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFpbC0+YWRkX2ludHZhbHVlKChpbnQpZmFpbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpmYWlsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfemZhaWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196ZmFpbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196ZmFpbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3pmYWlsLT5hZGRfaW50dmFsdWUoKGludCl6ZmFpbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpwYXNzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfenBhc3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196cGFzcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196cGFzcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3pwYXNzLT5hZGRfaW50dmFsdWUoKGludCl6cGFzcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEltYWdlMkQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3JkZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3JkZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3JkZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm9yZGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ib3JkZXItPmFkZF9pbnR2YWx1ZShib3JkZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXhlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXhlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXhlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGl4ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXhlbHMtPmFkZF9pbnR2YWx1ZSgoaW50KXBpeGVscyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwaXhlbHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcmYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfZmxvYXR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4UGFyYW1ldGVyZih0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJmdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyaShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJpKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4UGFyYW1ldGVyaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4U3ViSW1hZ2UyRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHhvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194b2Zmc2V0LT5hZGRfaW50dmFsdWUoeG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHlvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195b2Zmc2V0LT5hZGRfaW50dmFsdWUoeW9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpeGVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpeGVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXhlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpeGVscy0+YWRkX2ludHZhbHVlKChpbnQpcGl4ZWxzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBpeGVscywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTFmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0xZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0xZihsb2NhdGlvbiwgeCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtMWZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3YgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3YtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3YtPmFkZF9pbnR2YWx1ZSgoaW50KXYpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0xZnYobG9jYXRpb24sIGNvdW50LCB2KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHYsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0xaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTFpKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtMWkobG9jYXRpb24sIHgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTFpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0xaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTFpdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTJmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTJmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0yZihsb2NhdGlvbiwgeCwgeSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtMmZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3YgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3YtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3YtPmFkZF9pbnR2YWx1ZSgoaW50KXYpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0yZnYobG9jYXRpb24sIGNvdW50LCB2KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHYsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0yaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTJpKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtMmkobG9jYXRpb24sIHgsIHkpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTJpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0yaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTNmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2YpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ194LT5hZGRfZmxvYXR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeS0+YWRkX2Zsb2F0dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3otPmFkZF9mbG9hdHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0zZihsb2NhdGlvbiwgeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtM2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2Z2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3YgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3YtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3YtPmFkZF9pbnR2YWx1ZSgoaW50KXYpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm0zZnYobG9jYXRpb24sIGNvdW50LCB2KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHYsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0zaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTNpKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtM2kobG9jYXRpb24sIHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTNpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm0zaXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTNpdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTRmKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm00Zik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHcKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ctPmFkZF9mbG9hdHZhbHVlKHcpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm00Zihsb2NhdGlvbiwgeCwgeSwgeiwgdyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtNGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbmlmb3JtNGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3YgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3YtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3YtPmFkZF9pbnR2YWx1ZSgoaW50KXYpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFVuaWZvcm00ZnYobG9jYXRpb24sIGNvdW50LCB2KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHYsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm00aShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVW5pZm9ybTRpKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3cgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ctPmFkZF9pbnR2YWx1ZSh3KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtNGkobG9jYXRpb24sIHgsIHksIHosIHcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTRpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm00aXYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3YtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdi0+YWRkX2ludHZhbHVlKChpbnQpdik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5pZm9ybTRpdihsb2NhdGlvbiwgY291bnQsIHYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybU1hdHJpeDJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm1NYXRyaXgyZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0cmFuc3Bvc2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190cmFuc3Bvc2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5hZGRfYm9vbHZhbHVlKHRyYW5zcG9zZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybU1hdHJpeDNmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm1NYXRyaXgzZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0cmFuc3Bvc2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190cmFuc3Bvc2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5hZGRfYm9vbHZhbHVlKHRyYW5zcG9zZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybU1hdHJpeDRmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFVuaWZvcm1NYXRyaXg0ZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0cmFuc3Bvc2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190cmFuc3Bvc2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5hZGRfYm9vbHZhbHVlKHRyYW5zcG9zZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVbmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVXNlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVXNlUHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVXNlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZhbGlkYXRlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmFsaWRhdGVQcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWYWxpZGF0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIxZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIxZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYjFmKGluZHgsIHgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliMWZ2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjFmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlcy0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhBdHRyaWIxZnYoaW5keCwgdmFsdWVzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliMmYoR0x1aW50IGluZHgsIEdMZmxvYXQgeCwgR0xmbG9hdCB5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIyZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhBdHRyaWIyZihpbmR4LCB4LCB5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjJmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIyZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmR4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5keCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZHgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5keC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5keC0+YWRkX2ludHZhbHVlKGluZHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZXMtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVmVydGV4QXR0cmliMmZ2KGluZHgsIHZhbHVlcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjNmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWIzZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVmVydGV4QXR0cmliM2YoaW5keCwgeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIzZnYoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliM2Z2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5keAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZHggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmR4LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZHgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZHgtPmFkZF9pbnR2YWx1ZShpbmR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWVzLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYjNmdihpbmR4LCB2YWx1ZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWI0ZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xWZXJ0ZXhBdHRyaWI0Zik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHcKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ctPmFkZF9mbG9hdHZhbHVlKHcpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFZlcnRleEF0dHJpYjRmKGluZHgsIHgsIHksIHosIHcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliNGZ2KEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYjRmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGluZHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbmR4ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW5keC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbmR4LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbmR4LT5hZGRfaW50dmFsdWUoaW5keCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlcy0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWVzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwgdmFsdWVzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmVydGV4QXR0cmliUG9pbnRlcihHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleEF0dHJpYlBvaW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmR4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5keCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZHgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5keC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5keC0+YWRkX2ludHZhbHVlKGluZHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBub3JtYWxpemVkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbm9ybWFsaXplZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX25vcm1hbGl6ZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbm9ybWFsaXplZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX25vcm1hbGl6ZWQtPmFkZF9ib29sdmFsdWUobm9ybWFsaXplZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHB0cgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3B0ciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3B0ci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wdHItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3B0ci0+YWRkX2ludHZhbHVlKChpbnQpcHRyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcHRyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHB0ciwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVmlld3BvcnQoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZpZXdwb3J0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWaWV3cG9ydCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLQotLy8gRGVmaW5pdGlvbnMgZm9yIEdMMkV4dCBBUElzCi0KLXZvaWQgR0xUcmFjZV9nbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW1hZ2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbWFnZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ltYWdlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ltYWdlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pbWFnZS0+YWRkX2ludHZhbHVlKChpbnQpaW1hZ2UpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTKHRhcmdldCwgaW1hZ2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgaW1hZ2UsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyhHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbWFnZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ltYWdlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW1hZ2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW1hZ2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ltYWdlLT5hZGRfaW50dmFsdWUoKGludClpbWFnZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTKHRhcmdldCwgaW1hZ2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgaW1hZ2UsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1CaW5hcnlPRVMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFByb2dyYW1CaW5hcnlPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZSgoaW50KWxlbmd0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJpbmFyeUZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JpbmFyeUZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JpbmFyeUZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19iaW5hcnlGb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JpbmFyeUZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpYmluYXJ5Rm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmluYXJ5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmluYXJ5ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmluYXJ5LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JpbmFyeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmluYXJ5LT5hZGRfaW50dmFsdWUoKGludCliaW5hcnkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFByb2dyYW1CaW5hcnlPRVMocHJvZ3JhbSwgYnVmU2l6ZSwgbGVuZ3RoLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIGJpbmFyeUZvcm1hdCwKLSAgICAgICAgKHZvaWQgKikgYmluYXJ5LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtQmluYXJ5T0VTKEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xpbnQgbGVuZ3RoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtQmluYXJ5T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmluYXJ5Rm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmluYXJ5Rm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmluYXJ5Rm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JpbmFyeUZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2JpbmFyeUZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpYmluYXJ5Rm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmluYXJ5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmluYXJ5ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmluYXJ5LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JpbmFyeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmluYXJ5LT5hZGRfaW50dmFsdWUoKGludCliaW5hcnkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZShsZW5ndGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1CaW5hcnlPRVMocHJvZ3JhbSwgYmluYXJ5Rm9ybWF0LCBiaW5hcnksIGxlbmd0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBiaW5hcnksCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQqIEdMVHJhY2VfZ2xNYXBCdWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTWFwQnVmZmVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYWNjZXNzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYWNjZXNzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWNjZXNzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FjY2Vzcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2FjY2Vzcy0+YWRkX2ludHZhbHVlKChpbnQpYWNjZXNzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgdm9pZCogcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE1hcEJ1ZmZlck9FUyh0YXJnZXQsIGFjY2Vzcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIHJ0LT5hZGRfaW50dmFsdWUoKGludClyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSByZXRWYWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xVbm1hcEJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVbm1hcEJ1ZmZlck9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVW5tYXBCdWZmZXJPRVModGFyZ2V0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldEJ1ZmZlclBvaW50ZXJ2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRCdWZmZXJQb2ludGVydk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRCdWZmZXJQb2ludGVydk9FUyh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4SW1hZ2UzRE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9pbnR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvcmRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvcmRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvcmRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3JkZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JvcmRlci0+YWRkX2ludHZhbHVlKGJvcmRlcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpeGVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpeGVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpeGVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXhlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpeGVscy0+YWRkX2ludHZhbHVlKChpbnQpcGl4ZWxzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhJbWFnZTNET0VTKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwaXhlbHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFN1YkltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFN1YkltYWdlM0RPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeG9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeG9mZnNldC0+YWRkX2ludHZhbHVlKHhvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeW9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeW9mZnNldC0+YWRkX2ludHZhbHVlKHlvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfem9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfem9mZnNldC0+YWRkX2ludHZhbHVlKHpvZmZzZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RlcHRoLT5hZGRfaW50dmFsdWUoZGVwdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXhlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXhlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXhlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGl4ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXhlbHMtPmFkZF9pbnR2YWx1ZSgoaW50KXBpeGVscyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4U3ViSW1hZ2UzRE9FUyh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGl4ZWxzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvcHlUZXhTdWJJbWFnZTNET0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeG9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3hvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3hvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3hvZmZzZXQtPmFkZF9pbnR2YWx1ZSh4b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeW9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3lvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3lvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3lvZmZzZXQtPmFkZF9pbnR2YWx1ZSh5b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgem9mZnNldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pvZmZzZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pvZmZzZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pvZmZzZXQtPmFkZF9pbnR2YWx1ZSh6b2Zmc2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUyh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbXByZXNzZWRUZXhJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm9yZGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm9yZGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm9yZGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvcmRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYm9yZGVyLT5hZGRfaW50dmFsdWUoYm9yZGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW1hZ2VTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW1hZ2VTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW1hZ2VTaXplLT5hZGRfaW50dmFsdWUoaW1hZ2VTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGF0YQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RhdGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RhdGEtPmFkZF9pbnR2YWx1ZSgoaW50KWRhdGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvbXByZXNzZWRUZXhJbWFnZTNET0VTKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHhvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194b2Zmc2V0LT5hZGRfaW50dmFsdWUoeG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHlvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195b2Zmc2V0LT5hZGRfaW50dmFsdWUoeW9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196b2Zmc2V0LT5hZGRfaW50dmFsdWUoem9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9pbnR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGltYWdlU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ltYWdlU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbWFnZVNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ltYWdlU2l6ZS0+YWRkX2ludHZhbHVlKGltYWdlU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUyh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xpbnQgem9mZnNldCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlM0RPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0ZXh0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xldmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xldmVsLT5hZGRfaW50dmFsdWUobGV2ZWwpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6b2Zmc2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfem9mZnNldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pvZmZzZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfem9mZnNldC0+YWRkX2ludHZhbHVlKHpvZmZzZXQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgem9mZnNldCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCaW5kVmVydGV4QXJyYXlPRVMoR0x1aW50IGFycmF5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kVmVydGV4QXJyYXlPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhcnJheQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FycmF5ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXJyYXktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXJyYXktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FycmF5LT5hZGRfaW50dmFsdWUoYXJyYXkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJpbmRWZXJ0ZXhBcnJheU9FUyhhcnJheSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVsZXRlVmVydGV4QXJyYXlzT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXJyYXlzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXJyYXlzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXJyYXlzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FycmF5cy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYXJyYXlzLT5hZGRfaW50dmFsdWUoKGludClhcnJheXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZVZlcnRleEFycmF5c09FUyhuLCBhcnJheXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgYXJyYXlzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5WZXJ0ZXhBcnJheXNPRVMoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuVmVydGV4QXJyYXlzT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXJyYXlzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXJyYXlzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXJyYXlzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FycmF5cy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYXJyYXlzLT5hZGRfaW50dmFsdWUoKGludClhcnJheXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlblZlcnRleEFycmF5c09FUyhuLCBhcnJheXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgYXJyYXlzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzVmVydGV4QXJyYXlPRVMoR0x1aW50IGFycmF5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xJc1ZlcnRleEFycmF5T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXJyYXkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hcnJheSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FycmF5LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FycmF5LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19hcnJheS0+YWRkX2ludHZhbHVlKGFycmF5KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc1ZlcnRleEFycmF5T0VTKGFycmF5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtR3JvdXBzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtR3JvdXBzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtR3JvdXBzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bUdyb3Vwcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtR3JvdXBzLT5hZGRfaW50dmFsdWUoKGludCludW1Hcm91cHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cHNTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JvdXBzU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyb3Vwc1NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXBzU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JvdXBzU2l6ZS0+YWRkX2ludHZhbHVlKGdyb3Vwc1NpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncm91cHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncm91cHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXBzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncm91cHMtPmFkZF9pbnR2YWx1ZSgoaW50KWdyb3Vwcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UGVyZk1vbml0b3JHcm91cHNBTUQobnVtR3JvdXBzLCBncm91cHNTaXplLCBncm91cHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbnVtR3JvdXBzLAotICAgICAgICAodm9pZCAqKSBncm91cHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGdyb3VwCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZ3JvdXAgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ncm91cC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ncm91cC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZ3JvdXAtPmFkZF9pbnR2YWx1ZShncm91cCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG51bUNvdW50ZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtQ291bnRlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1Db3VudGVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19udW1Db3VudGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtQ291bnRlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bUNvdW50ZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF4QWN0aXZlQ291bnRlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXhBY3RpdmVDb3VudGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21heEFjdGl2ZUNvdW50ZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21heEFjdGl2ZUNvdW50ZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXhBY3RpdmVDb3VudGVycy0+YWRkX2ludHZhbHVlKChpbnQpbWF4QWN0aXZlQ291bnRlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudGVyU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ZXJTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnRlclNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnRlclNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50ZXJTaXplLT5hZGRfaW50dmFsdWUoY291bnRlclNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudGVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnRlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50ZXJzLT5hZGRfaW50dmFsdWUoKGludCljb3VudGVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRChncm91cCwgbnVtQ291bnRlcnMsIG1heEFjdGl2ZUNvdW50ZXJzLCBjb3VudGVyU2l6ZSwgY291bnRlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbnVtQ291bnRlcnMsCi0gICAgICAgICh2b2lkICopIG1heEFjdGl2ZUNvdW50ZXJzLAotICAgICAgICAodm9pZCAqKSBjb3VudGVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JvdXAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncm91cCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncm91cC0+YWRkX2ludHZhbHVlKGdyb3VwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZlNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZlNpemUtPmFkZF9pbnR2YWx1ZShidWZTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cFN0cmluZwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyb3VwU3RyaW5nID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JvdXBTdHJpbmctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXBTdHJpbmctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyb3VwU3RyaW5nLT5hZGRfaW50dmFsdWUoKGludClncm91cFN0cmluZyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UGVyZk1vbml0b3JHcm91cFN0cmluZ0FNRChncm91cCwgYnVmU2l6ZSwgbGVuZ3RoLCBncm91cFN0cmluZyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIGdyb3VwU3RyaW5nLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JvdXAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncm91cCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncm91cC0+YWRkX2ludHZhbHVlKGdyb3VwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50ZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50ZXItPmFkZF9pbnR2YWx1ZShjb3VudGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZlNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZlNpemUtPmFkZF9pbnR2YWx1ZShidWZTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudGVyU3RyaW5nCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnRlclN0cmluZyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50ZXJTdHJpbmctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnRlclN0cmluZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnRlclN0cmluZy0+YWRkX2ludHZhbHVlKChpbnQpY291bnRlclN0cmluZyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UGVyZk1vbml0b3JDb3VudGVyU3RyaW5nQU1EKGdyb3VwLCBjb3VudGVyLCBidWZTaXplLCBsZW5ndGgsIGNvdW50ZXJTdHJpbmcpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgICAgICAodm9pZCAqKSBjb3VudGVyU3RyaW5nLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JvdXAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncm91cCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyb3VwLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncm91cC0+YWRkX2ludHZhbHVlKGdyb3VwKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50ZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50ZXItPmFkZF9pbnR2YWx1ZShjb3VudGVyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGF0YQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGEgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RhdGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RhdGEtPmFkZF9pbnR2YWx1ZSgoaW50KWRhdGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQoZ3JvdXAsIGNvdW50ZXIsIHBuYW1lLCBkYXRhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGRhdGEsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlblBlcmZNb25pdG9yc0FNRChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlblBlcmZNb25pdG9yc0FNRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vbml0b3JzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9uaXRvcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb25pdG9ycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb25pdG9ycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbW9uaXRvcnMtPmFkZF9pbnR2YWx1ZSgoaW50KW1vbml0b3JzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5QZXJmTW9uaXRvcnNBTUQobiwgbW9uaXRvcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbW9uaXRvcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVBlcmZNb25pdG9yc0FNRChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vbml0b3JzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbW9uaXRvcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb25pdG9ycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb25pdG9ycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbW9uaXRvcnMtPmFkZF9pbnR2YWx1ZSgoaW50KW1vbml0b3JzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQobiwgbW9uaXRvcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbW9uaXRvcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9uaXRvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vbml0b3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vbml0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21vbml0b3ItPmFkZF9pbnR2YWx1ZShtb25pdG9yKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZW5hYmxlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZW5hYmxlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZW5hYmxlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2VuYWJsZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX2VuYWJsZS0+YWRkX2Jvb2x2YWx1ZShlbmFibGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncm91cAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyb3VwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JvdXAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JvdXAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyb3VwLT5hZGRfaW50dmFsdWUoZ3JvdXApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1Db3VudGVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX251bUNvdW50ZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtQ291bnRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtQ291bnRlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX251bUNvdW50ZXJzLT5hZGRfaW50dmFsdWUobnVtQ291bnRlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudGVyc0xpc3QKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudGVyc0xpc3QgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudGVyc0xpc3QtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnRlcnNMaXN0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudGVyc0xpc3QtPmFkZF9pbnR2YWx1ZSgoaW50KWNvdW50ZXJzTGlzdCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRChtb25pdG9yLCBlbmFibGUsIGdyb3VwLCBudW1Db3VudGVycywgY291bnRlcnNMaXN0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGNvdW50ZXJzTGlzdCwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmVnaW5QZXJmTW9uaXRvckFNRChHTHVpbnQgbW9uaXRvcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmVnaW5QZXJmTW9uaXRvckFNRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vbml0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb25pdG9yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9uaXRvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tb25pdG9yLT5hZGRfaW50dmFsdWUobW9uaXRvcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmVnaW5QZXJmTW9uaXRvckFNRChtb25pdG9yKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEVuZFBlcmZNb25pdG9yQU1EKEdMdWludCBtb25pdG9yKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFbmRQZXJmTW9uaXRvckFNRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vbml0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb25pdG9yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9uaXRvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tb25pdG9yLT5hZGRfaW50dmFsdWUobW9uaXRvcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRW5kUGVyZk1vbml0b3JBTUQobW9uaXRvcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1EKEdMdWludCBtb25pdG9yLCBHTGVudW0gcG5hbWUsIEdMc2l6ZWkgZGF0YVNpemUsIEdMdWludCAqZGF0YSwgR0xpbnQgKmJ5dGVzV3JpdHRlbikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UGVyZk1vbml0b3JDb3VudGVyRGF0YUFNRCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vbml0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb25pdG9yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9uaXRvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb25pdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tb25pdG9yLT5hZGRfaW50dmFsdWUobW9uaXRvcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGFTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YVNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kYXRhU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YVNpemUtPmFkZF9pbnR2YWx1ZShkYXRhU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRhdGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGF0YS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kYXRhLT5hZGRfaW50dmFsdWUoKGludClkYXRhKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnl0ZXNXcml0dGVuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnl0ZXNXcml0dGVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnl0ZXNXcml0dGVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J5dGVzV3JpdHRlbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnl0ZXNXcml0dGVuLT5hZGRfaW50dmFsdWUoKGludClieXRlc1dyaXR0ZW4pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQobW9uaXRvciwgcG5hbWUsIGRhdGFTaXplLCBkYXRhLCBieXRlc1dyaXR0ZW4pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZGF0YSwKLSAgICAgICAgKHZvaWQgKikgYnl0ZXNXcml0dGVuLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCbGl0RnJhbWVidWZmZXJBTkdMRShHTGludCBzcmNYMCwgR0xpbnQgc3JjWTAsIEdMaW50IHNyY1gxLCBHTGludCBzcmNZMSwgR0xpbnQgZHN0WDAsIEdMaW50IGRzdFkwLCBHTGludCBkc3RYMSwgR0xpbnQgZHN0WTEsIEdMYml0ZmllbGQgbWFzaywgR0xlbnVtIGZpbHRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxpdEZyYW1lYnVmZmVyQU5HTEUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzcmNYMAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY1gwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3JjWDAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3JjWDAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NyY1gwLT5hZGRfaW50dmFsdWUoc3JjWDApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzcmNZMAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY1kwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3JjWTAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3JjWTAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NyY1kwLT5hZGRfaW50dmFsdWUoc3JjWTApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzcmNYMQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY1gxID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3JjWDEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3JjWDEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NyY1gxLT5hZGRfaW50dmFsdWUoc3JjWDEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzcmNZMQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY1kxID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3JjWTEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3JjWTEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NyY1kxLT5hZGRfaW50dmFsdWUoc3JjWTEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkc3RYMAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdFgwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHN0WDAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHN0WDAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RzdFgwLT5hZGRfaW50dmFsdWUoZHN0WDApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkc3RZMAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdFkwID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHN0WTAtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHN0WTAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RzdFkwLT5hZGRfaW50dmFsdWUoZHN0WTApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkc3RYMQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdFgxID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHN0WDEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHN0WDEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RzdFgxLT5hZGRfaW50dmFsdWUoZHN0WDEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkc3RZMQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdFkxID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHN0WTEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHN0WTEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RzdFkxLT5hZGRfaW50dmFsdWUoZHN0WTEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXNrCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWFzayA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hc2stPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFzay0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWFzay0+YWRkX2ludHZhbHVlKG1hc2spOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmaWx0ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19maWx0ZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19maWx0ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmlsdGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmlsdGVyLT5hZGRfaW50dmFsdWUoKGludClmaWx0ZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJsaXRGcmFtZWJ1ZmZlckFOR0xFKHNyY1gwLCBzcmNZMCwgc3JjWDEsIHNyY1kxLCBkc3RYMCwgZHN0WTAsIGRzdFgxLCBkc3RZMSwgbWFzaywgZmlsdGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQU5HTEUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzYW1wbGVzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2FtcGxlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2FtcGxlcy0+YWRkX2ludHZhbHVlKHNhbXBsZXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFKHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNhbXBsZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zYW1wbGVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zYW1wbGVzLT5hZGRfaW50dmFsdWUoc2FtcGxlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlQVBQTEUodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZXNvbHZlTXVsdGlzYW1wbGVGcmFtZWJ1ZmZlckFQUExFKHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExhYmVsT2JqZWN0RVhUKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGFiZWxPYmplY3RFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBvYmplY3QKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19vYmplY3QgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19vYmplY3QtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfb2JqZWN0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19vYmplY3QtPmFkZF9pbnR2YWx1ZShvYmplY3QpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZShsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsYWJlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xhYmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGFiZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGFiZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xhYmVsLT5hZGRfaW50dmFsdWUoKGludClsYWJlbCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGFiZWxPYmplY3RFWFQodHlwZSwgb2JqZWN0LCBsZW5ndGgsIGxhYmVsKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxhYmVsLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRPYmplY3RMYWJlbEVYVChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldE9iamVjdExhYmVsRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgb2JqZWN0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfb2JqZWN0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfb2JqZWN0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX29iamVjdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfb2JqZWN0LT5hZGRfaW50dmFsdWUob2JqZWN0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZlNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZlNpemUtPmFkZF9pbnR2YWx1ZShidWZTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsYWJlbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xhYmVsID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGFiZWwtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGFiZWwtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xhYmVsLT5hZGRfaW50dmFsdWUoKGludClsYWJlbCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0T2JqZWN0TGFiZWxFWFQodHlwZSwgb2JqZWN0LCBidWZTaXplLCBsZW5ndGgsIGxhYmVsKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgbGFiZWwsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEluc2VydEV2ZW50TWFya2VyRVhUKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZShsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXJrZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXJrZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXJrZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFya2VyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXJrZXItPmFkZF9pbnR2YWx1ZSgoaW50KW1hcmtlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSW5zZXJ0RXZlbnRNYXJrZXJFWFQobGVuZ3RoLCBtYXJrZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbWFya2VyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQdXNoR3JvdXBNYXJrZXJFWFQoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQdXNoR3JvdXBNYXJrZXJFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZW5ndGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZW5ndGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZW5ndGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZW5ndGgtPmFkZF9pbnR2YWx1ZShsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXJrZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXJrZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXJrZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFya2VyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXJrZXItPmFkZF9pbnR2YWx1ZSgoaW50KW1hcmtlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHVzaEdyb3VwTWFya2VyRVhUKGxlbmd0aCwgbWFya2VyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIG1hcmtlciwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9wR3JvdXBNYXJrZXJFWFQodm9pZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9wR3JvdXBNYXJrZXJFWFQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvcEdyb3VwTWFya2VyRVhUKCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGlzY2FyZEZyYW1lYnVmZmVyRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtQXR0YWNobWVudHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW1BdHRhY2htZW50cyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX251bUF0dGFjaG1lbnRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bUF0dGFjaG1lbnRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW1BdHRhY2htZW50cy0+YWRkX2ludHZhbHVlKG51bUF0dGFjaG1lbnRzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hdHRhY2htZW50cyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19hdHRhY2htZW50cy0+YWRkX2ludHZhbHVlKChpbnQpYXR0YWNobWVudHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCh0YXJnZXQsIG51bUF0dGFjaG1lbnRzLCBhdHRhY2htZW50cyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBhdHRhY2htZW50cywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2FtcGxlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NhbXBsZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NhbXBsZXMtPmFkZF9pbnR2YWx1ZShzYW1wbGVzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGF0dGFjaG1lbnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hdHRhY2htZW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYXR0YWNobWVudC0+YWRkX2ludHZhbHVlKChpbnQpYXR0YWNobWVudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHRhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190ZXh0YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRleHRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUodGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNhbXBsZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zYW1wbGVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zYW1wbGVzLT5hZGRfaW50dmFsdWUoc2FtcGxlcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHNhbXBsZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdGlEcmF3QXJyYXlzRVhUKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdGlEcmF3QXJyYXlzRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmlyc3QKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19maXJzdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZpcnN0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZpcnN0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19maXJzdC0+YWRkX2ludHZhbHVlKChpbnQpZmlyc3QpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoKGludCljb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByaW1jb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ByaW1jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ByaW1jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcmltY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ByaW1jb3VudC0+YWRkX2ludHZhbHVlKHByaW1jb3VudCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTXVsdGlEcmF3QXJyYXlzRVhUKG1vZGUsIGZpcnN0LCBjb3VudCwgcHJpbWNvdW50KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGZpcnN0LAotICAgICAgICAodm9pZCAqKSBjb3VudCwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdGlEcmF3RWxlbWVudHNFWFQoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE11bHRpRHJhd0VsZW1lbnRzRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKChpbnQpY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmRpY2VzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5kaWNlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZGljZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5kaWNlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5kaWNlcy0+YWRkX2ludHZhbHVlKChpbnQpaW5kaWNlcyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByaW1jb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ByaW1jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ByaW1jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcmltY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ByaW1jb3VudC0+YWRkX2ludHZhbHVlKHByaW1jb3VudCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTXVsdGlEcmF3RWxlbWVudHNFWFQobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMsIHByaW1jb3VudCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBjb3VudCwKLSAgICAgICAgKHZvaWQgKikgaW5kaWNlcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuUXVlcmllc0VYVChHTHNpemVpIG4sIEdMdWludCAqaWRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5RdWVyaWVzRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaWRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaWRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaWRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2lkcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaWRzLT5hZGRfaW50dmFsdWUoKGludClpZHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlblF1ZXJpZXNFWFQobiwgaWRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGlkcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUXVlcmllc0VYVChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVRdWVyaWVzRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaWRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaWRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaWRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2lkcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaWRzLT5hZGRfaW50dmFsdWUoKGludClpZHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlbGV0ZVF1ZXJpZXNFWFQobiwgaWRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGlkcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1F1ZXJ5RVhUKEdMdWludCBpZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNRdWVyeUVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGlkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaWQtPmFkZF9pbnR2YWx1ZShpZCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNRdWVyeUVYVChpZCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCZWdpblF1ZXJ5RVhUKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmVnaW5RdWVyeUVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGlkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaWQtPmFkZF9pbnR2YWx1ZShpZCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmVnaW5RdWVyeUVYVCh0YXJnZXQsIGlkKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEVuZFF1ZXJ5RVhUKEdMZW51bSB0YXJnZXQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVuZFF1ZXJ5RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFbmRRdWVyeUVYVCh0YXJnZXQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UXVlcnlpdkVYVChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFF1ZXJ5aXZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UXVlcnlpdkVYVCh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRRdWVyeU9iamVjdHVpdkVYVChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFF1ZXJ5T2JqZWN0dWl2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2lkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2lkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19pZC0+YWRkX2ludHZhbHVlKGlkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFF1ZXJ5T2JqZWN0dWl2RVhUKGlkLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xlbnVtIEdMVHJhY2VfZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhUKHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGVudW0gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldEdyYXBoaWNzUmVzZXRTdGF0dXNFWFQoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIHJ0LT5hZGRfaW50dmFsdWUoKGludClyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZWFkblBpeGVsc0VYVChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVhZG5QaXhlbHNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkYXRhCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGF0YSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RhdGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGF0YS0+YWRkX2ludHZhbHVlKChpbnQpZGF0YSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVhZG5QaXhlbHNFWFQoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBidWZTaXplLCBkYXRhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGRhdGEsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldG5Vbmlmb3JtZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldG5Vbmlmb3JtZnZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBidWZTaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYnVmU2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYnVmU2l6ZS0+YWRkX2ludHZhbHVlKGJ1ZlNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0blVuaWZvcm1mdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgYnVmU2l6ZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0blVuaWZvcm1pdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0blVuaWZvcm1pdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZlNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZTaXplLT5hZGRfaW50dmFsdWUoYnVmU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRuVW5pZm9ybWl2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBidWZTaXplLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xVc2VQcm9ncmFtU3RhZ2VzRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGlwZWxpbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZS0+YWRkX2ludHZhbHVlKHBpcGVsaW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RhZ2VzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RhZ2VzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3RhZ2VzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0YWdlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RhZ2VzLT5hZGRfaW50dmFsdWUoc3RhZ2VzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUKHBpcGVsaW5lLCBzdGFnZXMsIHByb2dyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVChHTHVpbnQgcGlwZWxpbmUsIEdMdWludCBwcm9ncmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGlwZWxpbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZS0+YWRkX2ludHZhbHVlKHBpcGVsaW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xBY3RpdmVTaGFkZXJQcm9ncmFtRVhUKHBpcGVsaW5lLCBwcm9ncmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMdWludCBHTFRyYWNlX2dsQ3JlYXRlU2hhZGVyUHJvZ3JhbXZFWFQoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqKnN0cmluZ3MpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENyZWF0ZVNoYWRlclByb2dyYW12RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RyaW5ncwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmluZ3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpbmdzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0cmluZ3MtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmluZ3MtPmFkZF9pbnR2YWx1ZSgoaW50KXN0cmluZ3MpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTHVpbnQgcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENyZWF0ZVNoYWRlclByb2dyYW12RVhUKHR5cGUsIGNvdW50LCBzdHJpbmdzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgcnQtPmFkZF9pbnR2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBzdHJpbmdzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCaW5kUHJvZ3JhbVBpcGVsaW5lRVhUKEdMdWludCBwaXBlbGluZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmluZFByb2dyYW1QaXBlbGluZUVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpcGVsaW5lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGlwZWxpbmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGlwZWxpbmUtPmFkZF9pbnR2YWx1ZShwaXBlbGluZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmluZFByb2dyYW1QaXBlbGluZUVYVChwaXBlbGluZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVQcm9ncmFtUGlwZWxpbmVzRVhUKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpwaXBlbGluZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXBlbGluZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXBlbGluZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGlwZWxpbmVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBpcGVsaW5lcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVChuLCBwaXBlbGluZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGlwZWxpbmVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUKEdMc2l6ZWkgbiwgR0x1aW50ICpwaXBlbGluZXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlblByb2dyYW1QaXBlbGluZXNFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXBlbGluZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXBlbGluZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGlwZWxpbmVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBpcGVsaW5lcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVChuLCBwaXBlbGluZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGlwZWxpbmVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUHJvZ3JhbVBpcGVsaW5lRVhUKEdMdWludCBwaXBlbGluZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNQcm9ncmFtUGlwZWxpbmVFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwaXBlbGluZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BpcGVsaW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGlwZWxpbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5hZGRfaW50dmFsdWUocGlwZWxpbmUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbElzUHJvZ3JhbVBpcGVsaW5lRVhUKHBpcGVsaW5lKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1QYXJhbWV0ZXJpRVhUKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtUGFyYW1ldGVyaUVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSh2YWx1ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHJvZ3JhbVBhcmFtZXRlcmlFWFQocHJvZ3JhbSwgcG5hbWUsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1QaXBlbGluZWl2RVhUKEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpcGVsaW5lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGlwZWxpbmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGlwZWxpbmUtPmFkZF9pbnR2YWx1ZShwaXBlbGluZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVChwaXBlbGluZSwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMWlFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTFpRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTFpRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMmlFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJpRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTJpRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtM2lFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTNpRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTNpRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtNGlFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTRpRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3cgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ctPmFkZF9pbnR2YWx1ZSh3KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTRpRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMWZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtMWZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ194LT5hZGRfZmxvYXR2YWx1ZSh4KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTFmRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMmZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0yZkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTJmRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtM2ZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTNmRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTNmRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtNGZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtNGZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ194LT5hZGRfZmxvYXR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeS0+YWRkX2Zsb2F0dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3otPmFkZF9mbG9hdHZhbHVlKHopOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ193LT5hZGRfZmxvYXR2YWx1ZSh3KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTRmRVhUKHByb2dyYW0sIGxvY2F0aW9uLCB4LCB5LCB6LCB3KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMWl2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTFpdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHJvZ3JhbVVuaWZvcm0yaXZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0zaXZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtM2l2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtM2l2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtNGl2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTRpdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTFmdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTJmdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTJmdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTNmdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybTRmdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQcm9ncmFtVW5pZm9ybU1hdHJpeDJmdkVYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxvY2F0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbG9jYXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sb2NhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbG9jYXRpb24tPmFkZF9pbnR2YWx1ZShsb2NhdGlvbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvdW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY291bnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb3VudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb3VudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY291bnQtPmFkZF9pbnR2YWx1ZShjb3VudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRyYW5zcG9zZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RyYW5zcG9zZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ190cmFuc3Bvc2UtPmFkZF9ib29sdmFsdWUodHJhbnNwb3NlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ192YWx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZhbHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ192YWx1ZS0+YWRkX2ludHZhbHVlKChpbnQpdmFsdWUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSB2YWx1ZSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsb2NhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbG9jYXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5hZGRfaW50dmFsdWUobG9jYXRpb24pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb3VudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvdW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY291bnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY291bnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvdW50LT5hZGRfaW50dmFsdWUoY291bnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0cmFuc3Bvc2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190cmFuc3Bvc2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190cmFuc3Bvc2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5hZGRfYm9vbHZhbHVlKHRyYW5zcG9zZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSgoaW50KXZhbHVlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdmFsdWUsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFByb2dyYW1Vbmlmb3JtTWF0cml4NGZ2RVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3Byb2dyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3Byb2dyYW0tPmFkZF9pbnR2YWx1ZShwcm9ncmFtKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbG9jYXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sb2NhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY291bnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb3VudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2NvdW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvdW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb3VudC0+YWRkX2ludHZhbHVlKGNvdW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHJhbnNwb3NlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHJhbnNwb3NlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHJhbnNwb3NlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX3RyYW5zcG9zZS0+YWRkX2Jvb2x2YWx1ZSh0cmFuc3Bvc2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlLT5hZGRfaW50dmFsdWUoKGludCl2YWx1ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHZhbHVlLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVChHTHVpbnQgcGlwZWxpbmUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGlwZWxpbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19waXBlbGluZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BpcGVsaW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19waXBlbGluZS0+YWRkX2ludHZhbHVlKHBpcGVsaW5lKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xWYWxpZGF0ZVByb2dyYW1QaXBlbGluZUVYVChwaXBlbGluZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUKEdMdWludCBwaXBlbGluZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UHJvZ3JhbVBpcGVsaW5lSW5mb0xvZ0VYVCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBpcGVsaW5lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGlwZWxpbmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19waXBlbGluZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGlwZWxpbmUtPmFkZF9pbnR2YWx1ZShwaXBlbGluZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZlNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZTaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmU2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZTaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZTaXplLT5hZGRfaW50dmFsdWUoYnVmU2l6ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlbmd0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlbmd0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZW5ndGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlbmd0aC0+YWRkX2ludHZhbHVlKChpbnQpbGVuZ3RoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW5mb0xvZwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZm9Mb2cgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbmZvTG9nLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2luZm9Mb2ctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2luZm9Mb2ctPmFkZF9pbnR2YWx1ZSgoaW50KWluZm9Mb2cpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQocGlwZWxpbmUsIGJ1ZlNpemUsIGxlbmd0aCwgaW5mb0xvZyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBsZW5ndGgsCi0gICAgICAgICh2b2lkICopIGluZm9Mb2csCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFN0b3JhZ2UxREVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhTdG9yYWdlMURFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbHMtPmFkZF9pbnR2YWx1ZShsZXZlbHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFN0b3JhZ2UxREVYVCh0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFN0b3JhZ2UyREVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4U3RvcmFnZTJERVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWxzLT5hZGRfaW50dmFsdWUobGV2ZWxzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhTdG9yYWdlMkRFWFQodGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFN0b3JhZ2UzREVYVChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4U3RvcmFnZTNERVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWxzLT5hZGRfaW50dmFsdWUobGV2ZWxzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhTdG9yYWdlM0RFWFQodGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXh0dXJlU3RvcmFnZTFERVhUKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXh0dXJlU3RvcmFnZTFERVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWxzLT5hZGRfaW50dmFsdWUobGV2ZWxzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXh0dXJlU3RvcmFnZTFERVhUKHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4dHVyZVN0b3JhZ2UyREVYVChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleHR1cmVTdG9yYWdlMkRFWFQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdGV4dHVyZS0+YWRkX2ludHZhbHVlKHRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZXZlbHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbHMtPmFkZF9pbnR2YWx1ZShsZXZlbHMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnRlcm5hbGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludGVybmFsZm9ybWF0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+YWRkX2ludHZhbHVlKChpbnQpaW50ZXJuYWxmb3JtYXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleHR1cmVTdG9yYWdlMkRFWFQodGV4dHVyZSwgdGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleHR1cmVTdG9yYWdlM0RFWFQoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXh0dXJlU3RvcmFnZTNERVhUKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWxzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWxzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGV2ZWxzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVscy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWxzLT5hZGRfaW50dmFsdWUobGV2ZWxzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19kZXB0aC0+YWRkX2ludHZhbHVlKGRlcHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXh0dXJlU3RvcmFnZTNERVhUKHRleHR1cmUsIHRhcmdldCwgbGV2ZWxzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2FtcGxlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NhbXBsZXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NhbXBsZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NhbXBsZXMtPmFkZF9pbnR2YWx1ZShzYW1wbGVzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaW50ZXJuYWxmb3JtYXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnRlcm5hbGZvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfaW50ZXJuYWxmb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWludGVybmFsZm9ybWF0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgaGVpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaGVpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaGVpZ2h0LT5hZGRfaW50dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVJTUcodGFyZ2V0LCBzYW1wbGVzLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGF0dGFjaG1lbnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hdHRhY2htZW50ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfYXR0YWNobWVudC0+YWRkX2ludHZhbHVlKChpbnQpYXR0YWNobWVudCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHRhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190ZXh0YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRleHRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUodGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNhbXBsZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zYW1wbGVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2FtcGxlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zYW1wbGVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zYW1wbGVzLT5hZGRfaW50dmFsdWUoc2FtcGxlcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUlNRyh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwsIHNhbXBsZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ292ZXJhZ2VNYXNrTlYoR0xib29sZWFuIG1hc2spIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvdmVyYWdlTWFza05WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hc2sgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXNrLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19tYXNrLT5hZGRfYm9vbHZhbHVlKG1hc2spOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvdmVyYWdlTWFza05WKG1hc2spOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ292ZXJhZ2VPcGVyYXRpb25OVihHTGVudW0gb3BlcmF0aW9uKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb3ZlcmFnZU9wZXJhdGlvbk5WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgb3BlcmF0aW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfb3BlcmF0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfb3BlcmF0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX29wZXJhdGlvbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX29wZXJhdGlvbi0+YWRkX2ludHZhbHVlKChpbnQpb3BlcmF0aW9uKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WKG9wZXJhdGlvbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3QnVmZmVyc05WKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3QnVmZmVyc05WKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX24tPmFkZF9pbnR2YWx1ZShuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZnMtPmFkZF9pbnR2YWx1ZSgoaW50KWJ1ZnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdCdWZmZXJzTlYobiwgYnVmcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBidWZzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZWxldGVGZW5jZXNOVihHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVGZW5jZXNOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZlbmNlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZlbmNlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZlbmNlcy0+YWRkX2ludHZhbHVlKChpbnQpZmVuY2VzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZWxldGVGZW5jZXNOVihuLCBmZW5jZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZmVuY2VzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZW5GZW5jZXNOVihHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5GZW5jZXNOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uLT5hZGRfaW50dmFsdWUobik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZlbmNlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZlbmNlcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZlbmNlcy0+YWRkX2ludHZhbHVlKChpbnQpZmVuY2VzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZW5GZW5jZXNOVihuLCBmZW5jZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZmVuY2VzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRmVuY2VOVihHTHVpbnQgZmVuY2UpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzRmVuY2VOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mZW5jZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2UtPmFkZF9pbnR2YWx1ZShmZW5jZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNGZW5jZU5WKGZlbmNlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIC8vIHNldCByZXR1cm4gdmFsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKnJ0ID0gZ2xtc2cubXV0YWJsZV9yZXR1cm52YWx1ZSgpOwotICAgIHJ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIHJ0LT5hZGRfYm9vbHZhbHVlKHJldFZhbHVlKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci0KLSAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLUdMYm9vbGVhbiBHTFRyYWNlX2dsVGVzdEZlbmNlTlYoR0x1aW50IGZlbmNlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXN0RmVuY2VOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZlbmNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmVuY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mZW5jZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mZW5jZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZmVuY2UtPmFkZF9pbnR2YWx1ZShmZW5jZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGVzdEZlbmNlTlYoZmVuY2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0RmVuY2Vpdk5WKEdMdWludCBmZW5jZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRGZW5jZWl2TlYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmZW5jZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZlbmNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmVuY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmVuY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZlbmNlLT5hZGRfaW50dmFsdWUoZmVuY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0RmVuY2Vpdk5WKGZlbmNlLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRmluaXNoRmVuY2VOVihHTHVpbnQgZmVuY2UpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZpbmlzaEZlbmNlTlYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmZW5jZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZlbmNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmVuY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmVuY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZlbmNlLT5hZGRfaW50dmFsdWUoZmVuY2UpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZpbmlzaEZlbmNlTlYoZmVuY2UpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2V0RmVuY2VOVihHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNldEZlbmNlTlYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmZW5jZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZlbmNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmVuY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmVuY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZlbmNlLT5hZGRfaW50dmFsdWUoZmVuY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb25kaXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb25kaXRpb24gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb25kaXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29uZGl0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29uZGl0aW9uLT5hZGRfaW50dmFsdWUoKGludCljb25kaXRpb24pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFNldEZlbmNlTlYoZmVuY2UsIGNvbmRpdGlvbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSZWFkQnVmZmVyTlYoR0xlbnVtIG1vZGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJlYWRCdWZmZXJOVik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVhZEJ1ZmZlck5WKG1vZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQWxwaGFGdW5jUUNPTShHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xBbHBoYUZ1bmNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnVuYwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Z1bmMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mdW5jLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Z1bmMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mdW5jLT5hZGRfaW50dmFsdWUoKGludClmdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVmCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVmID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVmLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yZWYtPmFkZF9mbG9hdHZhbHVlKHJlZik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQWxwaGFGdW5jUUNPTShmdW5jLCByZWYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0RHJpdmVyQ29udHJvbHNRQ09NKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0RHJpdmVyQ29udHJvbHNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtLT5hZGRfaW50dmFsdWUoKGludCludW0pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkcml2ZXJDb250cm9scwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RyaXZlckNvbnRyb2xzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2xzLT5hZGRfaW50dmFsdWUoKGludClkcml2ZXJDb250cm9scyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0RHJpdmVyQ29udHJvbHNRQ09NKG51bSwgc2l6ZSwgZHJpdmVyQ29udHJvbHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbnVtLAotICAgICAgICAodm9pZCAqKSBkcml2ZXJDb250cm9scywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00oR0x1aW50IGRyaXZlckNvbnRyb2wsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmRyaXZlckNvbnRyb2xTdHJpbmcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZHJpdmVyQ29udHJvbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RyaXZlckNvbnRyb2wgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kcml2ZXJDb250cm9sLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPmFkZF9pbnR2YWx1ZShkcml2ZXJDb250cm9sKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYnVmU2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2J1ZlNpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19idWZTaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2J1ZlNpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2J1ZlNpemUtPmFkZF9pbnR2YWx1ZShidWZTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkcml2ZXJDb250cm9sU3RyaW5nCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZHJpdmVyQ29udHJvbFN0cmluZyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2xTdHJpbmctPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbFN0cmluZy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZHJpdmVyQ29udHJvbFN0cmluZy0+YWRkX2ludHZhbHVlKChpbnQpZHJpdmVyQ29udHJvbFN0cmluZyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00oZHJpdmVyQ29udHJvbCwgYnVmU2l6ZSwgbGVuZ3RoLCBkcml2ZXJDb250cm9sU3RyaW5nKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGxlbmd0aCwKLSAgICAgICAgKHZvaWQgKikgZHJpdmVyQ29udHJvbFN0cmluZywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00oR0x1aW50IGRyaXZlckNvbnRyb2wpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZHJpdmVyQ29udHJvbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RyaXZlckNvbnRyb2wgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kcml2ZXJDb250cm9sLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPmFkZF9pbnR2YWx1ZShkcml2ZXJDb250cm9sKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTShkcml2ZXJDb250cm9sKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERpc2FibGVEcml2ZXJDb250cm9sUUNPTShHTHVpbnQgZHJpdmVyQ29udHJvbCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZHJpdmVyQ29udHJvbAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RyaXZlckNvbnRyb2wgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kcml2ZXJDb250cm9sLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RyaXZlckNvbnRyb2wtPmFkZF9pbnR2YWx1ZShkcml2ZXJDb250cm9sKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEaXNhYmxlRHJpdmVyQ29udHJvbFFDT00oZHJpdmVyQ29udHJvbCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRUZXh0dXJlc1FDT00oR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0VGV4dHVyZXNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmVzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmVzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlcy0+YWRkX2ludHZhbHVlKChpbnQpdGV4dHVyZXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXhUZXh0dXJlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21heFRleHR1cmVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4VGV4dHVyZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWF4VGV4dHVyZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21heFRleHR1cmVzLT5hZGRfaW50dmFsdWUobWF4VGV4dHVyZXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1UZXh0dXJlcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX251bVRleHR1cmVzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtVGV4dHVyZXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtVGV4dHVyZXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX251bVRleHR1cmVzLT5hZGRfaW50dmFsdWUoKGludCludW1UZXh0dXJlcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0VGV4dHVyZXNRQ09NKHRleHR1cmVzLCBtYXhUZXh0dXJlcywgbnVtVGV4dHVyZXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgdGV4dHVyZXMsCi0gICAgICAgICh2b2lkICopIG51bVRleHR1cmVzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRCdWZmZXJzUUNPTShHTHVpbnQgKmJ1ZmZlcnMsIEdMaW50IG1heEJ1ZmZlcnMsIEdMaW50ICpudW1CdWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRCdWZmZXJzUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19idWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19idWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19idWZmZXJzLT5hZGRfaW50dmFsdWUoKGludClidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF4QnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21heEJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tYXhCdWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21heEJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21heEJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZShtYXhCdWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtQnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX251bUJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19udW1CdWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bUJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX251bUJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KW51bUJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldEJ1ZmZlcnNRQ09NKGJ1ZmZlcnMsIG1heEJ1ZmZlcnMsIG51bUJ1ZmZlcnMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgYnVmZmVycywKLSAgICAgICAgKHZvaWQgKikgbnVtQnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00oR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpcmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1heFJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tYXhSZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4UmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXhSZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tYXhSZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUobWF4UmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG51bVJlbmRlcmJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19udW1SZW5kZXJidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtUmVuZGVyYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19udW1SZW5kZXJidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19udW1SZW5kZXJidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludCludW1SZW5kZXJidWZmZXJzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTShyZW5kZXJidWZmZXJzLCBtYXhSZW5kZXJidWZmZXJzLCBudW1SZW5kZXJidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHJlbmRlcmJ1ZmZlcnMsCi0gICAgICAgICh2b2lkICopIG51bVJlbmRlcmJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldEZyYW1lYnVmZmVyc1FDT00oR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0RnJhbWVidWZmZXJzUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpZnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbWF4RnJhbWVidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4RnJhbWVidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4RnJhbWVidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21heEZyYW1lYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4RnJhbWVidWZmZXJzLT5hZGRfaW50dmFsdWUobWF4RnJhbWVidWZmZXJzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnVtRnJhbWVidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtRnJhbWVidWZmZXJzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtRnJhbWVidWZmZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX251bUZyYW1lYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtRnJhbWVidWZmZXJzLT5hZGRfaW50dmFsdWUoKGludCludW1GcmFtZWJ1ZmZlcnMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldEZyYW1lYnVmZmVyc1FDT00oZnJhbWVidWZmZXJzLCBtYXhGcmFtZWJ1ZmZlcnMsIG51bUZyYW1lYnVmZmVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBmcmFtZWJ1ZmZlcnMsCi0gICAgICAgICh2b2lkICopIG51bUZyYW1lYnVmZmVycywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00oR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleHR1cmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ZXh0dXJlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190ZXh0dXJlLT5hZGRfaW50dmFsdWUodGV4dHVyZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSh0ZXh0dXJlLCBmYWNlLCBsZXZlbCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTSh0YXJnZXQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00oR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dEdldFRleFN1YkltYWdlUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxldmVsCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGV2ZWwgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZXZlbC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZXZlbC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGV2ZWwtPmFkZF9pbnR2YWx1ZShsZXZlbCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHhvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeG9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194b2Zmc2V0LT5hZGRfaW50dmFsdWUoeG9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHlvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeW9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195b2Zmc2V0LT5hZGRfaW50dmFsdWUoeW9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpvZmZzZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196b2Zmc2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfem9mZnNldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196b2Zmc2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196b2Zmc2V0LT5hZGRfaW50dmFsdWUoem9mZnNldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9pbnR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZvcm1hdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zvcm1hdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Zvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mb3JtYXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mb3JtYXQtPmFkZF9pbnR2YWx1ZSgoaW50KWZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRleGVscwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleGVscyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleGVscy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190ZXhlbHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleGVscy0+YWRkX2ludHZhbHVlKChpbnQpdGV4ZWxzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xFeHRHZXRUZXhTdWJJbWFnZVFDT00odGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgdGV4ZWxzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHRleGVscywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NKEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldEJ1ZmZlclBvaW50ZXJ2UUNPTSh0YXJnZXQsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEV4dEdldFNoYWRlcnNRQ09NKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dEdldFNoYWRlcnNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2hhZGVycwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NoYWRlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaGFkZXJzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NoYWRlcnMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NoYWRlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KXNoYWRlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXhTaGFkZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbWF4U2hhZGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21heFNoYWRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWF4U2hhZGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbWF4U2hhZGVycy0+YWRkX2ludHZhbHVlKG1heFNoYWRlcnMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1TaGFkZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnVtU2hhZGVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX251bVNoYWRlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtU2hhZGVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnVtU2hhZGVycy0+YWRkX2ludHZhbHVlKChpbnQpbnVtU2hhZGVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0U2hhZGVyc1FDT00oc2hhZGVycywgbWF4U2hhZGVycywgbnVtU2hhZGVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBzaGFkZXJzLAotICAgICAgICAodm9pZCAqKSBudW1TaGFkZXJzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRQcm9ncmFtc1FDT00oR0x1aW50ICpwcm9ncmFtcywgR0xpbnQgbWF4UHJvZ3JhbXMsIEdMaW50ICpudW1Qcm9ncmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRXh0R2V0UHJvZ3JhbXNRQ09NKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcHJvZ3JhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3Byb2dyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcHJvZ3JhbXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYXhQcm9ncmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21heFByb2dyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWF4UHJvZ3JhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWF4UHJvZ3JhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21heFByb2dyYW1zLT5hZGRfaW50dmFsdWUobWF4UHJvZ3JhbXMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBudW1Qcm9ncmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX251bVByb2dyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnVtUHJvZ3JhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnVtUHJvZ3JhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX251bVByb2dyYW1zLT5hZGRfaW50dmFsdWUoKGludCludW1Qcm9ncmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRXh0R2V0UHJvZ3JhbXNRQ09NKHByb2dyYW1zLCBtYXhQcm9ncmFtcywgbnVtUHJvZ3JhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcHJvZ3JhbXMsCi0gICAgICAgICh2b2lkICopIG51bVByb2dyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00oR0x1aW50IHByb2dyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcm9ncmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcHJvZ3JhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3Byb2dyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcHJvZ3JhbS0+YWRkX2ludHZhbHVlKHByb2dyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBHTGJvb2xlYW4gcmV0VmFsdWUgPSBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00ocHJvZ3JhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTShHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xFeHRHZXRQcm9ncmFtQmluYXJ5U291cmNlUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByb2dyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcm9ncmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcHJvZ3JhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcm9ncmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcm9ncmFtLT5hZGRfaW50dmFsdWUocHJvZ3JhbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNoYWRlcnR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaGFkZXJ0eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2hhZGVydHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaGFkZXJ0eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfc2hhZGVydHlwZS0+YWRkX2ludHZhbHVlKChpbnQpc2hhZGVydHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNvdXJjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NvdXJjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NvdXJjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zb3VyY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NvdXJjZS0+YWRkX2ludHZhbHVlKChpbnQpc291cmNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVuZ3RoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVuZ3RoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVuZ3RoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlbmd0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbGVuZ3RoLT5hZGRfaW50dmFsdWUoKGludClsZW5ndGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKHByb2dyYW0sIHNoYWRlcnR5cGUsIHNvdXJjZSwgbGVuZ3RoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHNvdXJjZSwKLSAgICAgICAgKHZvaWQgKikgbGVuZ3RoLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTdGFydFRpbGluZ1FDT00oR0x1aW50IHgsIEdMdWludCB5LCBHTHVpbnQgd2lkdGgsIEdMdWludCBoZWlnaHQsIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTdGFydFRpbGluZ1FDT00pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwcmVzZXJ2ZU1hc2sKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wcmVzZXJ2ZU1hc2sgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wcmVzZXJ2ZU1hc2stPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcHJlc2VydmVNYXNrLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wcmVzZXJ2ZU1hc2stPmFkZF9pbnR2YWx1ZShwcmVzZXJ2ZU1hc2spOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFN0YXJ0VGlsaW5nUUNPTSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVzZXJ2ZU1hc2spOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRW5kVGlsaW5nUUNPTShHTGJpdGZpZWxkIHByZXNlcnZlTWFzaykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRW5kVGlsaW5nUUNPTSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHByZXNlcnZlTWFzawotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ByZXNlcnZlTWFzayA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ByZXNlcnZlTWFzay0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wcmVzZXJ2ZU1hc2stPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ByZXNlcnZlTWFzay0+YWRkX2ludHZhbHVlKHByZXNlcnZlTWFzayk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRW5kVGlsaW5nUUNPTShwcmVzZXJ2ZU1hc2spOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotCi0vLyBEZWZpbml0aW9ucyBmb3IgR0wxIEFQSXMKLQotdm9pZCBHTFRyYWNlX2dsQWxwaGFGdW5jKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEFscGhhRnVuYyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZ1bmMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mdW5jID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnVuYy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mdW5jLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZnVuYy0+YWRkX2ludHZhbHVlKChpbnQpZnVuYyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWYtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcmVmLT5hZGRfZmxvYXR2YWx1ZShyZWYpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEFscGhhRnVuYyhmdW5jLCByZWYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5lZihHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGlwUGxhbmVmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGxhbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbGFuZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BsYW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BsYW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcGxhbmUtPmFkZF9pbnR2YWx1ZSgoaW50KXBsYW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXF1YXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lcXVhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2VxdWF0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19lcXVhdGlvbi0+YWRkX2ludHZhbHVlKChpbnQpZXF1YXRpb24pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsaXBQbGFuZWYocGxhbmUsIGVxdWF0aW9uKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxdWF0aW9uLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb2xvcjRmKEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbG9yNGYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3JlZC0+YWRkX2Zsb2F0dmFsdWUocmVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JlZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncmVlbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfZmxvYXR2YWx1ZShncmVlbik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJsdWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ibHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYmx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ibHVlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2JsdWUtPmFkZF9mbG9hdHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9mbG9hdHZhbHVlKGFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb2xvcjRmKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZvZ2YoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGb2dmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfZmxvYXR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRm9nZihwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRm9nZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZvZ2Z2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZvZ2Z2KHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcnVzdHVtZihHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcnVzdHVtZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlZnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZWZ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVmdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZWZ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9mbG9hdHZhbHVlKGxlZnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcmlnaHQtPmFkZF9mbG9hdHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ib3R0b20tPmFkZF9mbG9hdHZhbHVlKGJvdHRvbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRvcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RvcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RvcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190b3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdG9wLT5hZGRfZmxvYXR2YWx1ZSh0b3ApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfek5lYXItPmFkZF9mbG9hdHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfekZhci0+YWRkX2Zsb2F0dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJ1c3R1bWYobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRDbGlwUGxhbmVmKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldENsaXBQbGFuZWYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lcW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lcW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXFuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19lcW4tPmFkZF9pbnR2YWx1ZSgoaW50KWVxbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0Q2xpcFBsYW5lZihwbmFtZSwgZXFuKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0TGlnaHRmdihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRMaWdodGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19saWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbGlnaHQtPmFkZF9pbnR2YWx1ZSgoaW50KWxpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldExpZ2h0ZnYobGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRNYXRlcmlhbGZ2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0TWF0ZXJpYWxmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRNYXRlcmlhbGZ2KGZhY2UsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhFbnZmdihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4RW52ZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlbnYKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lbnYgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lbnYtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZW52LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZW52LT5hZGRfaW50dmFsdWUoKGludCllbnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4RW52ZnYoZW52LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbGYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVsZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2Zsb2F0dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0TW9kZWxmKHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVsZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExpZ2h0TW9kZWxmdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaWdodE1vZGVsZnYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpZ2h0ZihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGlnaHRmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19saWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbGlnaHQtPmFkZF9pbnR2YWx1ZSgoaW50KWxpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfZmxvYXR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRmKGxpZ2h0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRmdihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19saWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbGlnaHQtPmFkZF9pbnR2YWx1ZSgoaW50KWxpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0ZnYobGlnaHQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMb2FkTWF0cml4Zihjb25zdCBHTGZsb2F0ICptKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMb2FkTWF0cml4Zik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tLT5hZGRfaW50dmFsdWUoKGludCltKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMb2FkTWF0cml4ZihtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIG0sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFsZihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXRlcmlhbGYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9mbG9hdHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNYXRlcmlhbGYoZmFjZSwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFsZnYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXRlcmlhbGZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE1hdGVyaWFsZnYoZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE11bHRNYXRyaXhmKGNvbnN0IEdMZmxvYXQgKm0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE11bHRNYXRyaXhmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX20tPmFkZF9pbnR2YWx1ZSgoaW50KW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE11bHRNYXRyaXhmKG0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdGlUZXhDb29yZDRmKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdGlUZXhDb29yZDRmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3MtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcy0+YWRkX2Zsb2F0dmFsdWUocyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3QtPmFkZF9mbG9hdHZhbHVlKHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yLT5hZGRfZmxvYXR2YWx1ZShyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3EgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19xLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3EtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcS0+YWRkX2Zsb2F0dmFsdWUocSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTXVsdGlUZXhDb29yZDRmKHRhcmdldCwgcywgdCwgciwgcSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xOb3JtYWwzZihHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xOb3JtYWwzZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG54Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ueC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ueC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ueC0+YWRkX2Zsb2F0dmFsdWUobngpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBueQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX255ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbnktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbnktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfbnktPmFkZF9mbG9hdHZhbHVlKG55KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX256LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX256LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX256LT5hZGRfZmxvYXR2YWx1ZShueik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTm9ybWFsM2YobngsIG55LCBueik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xPcnRob2YoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsT3J0aG9mKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfbGVmdC0+YWRkX2Zsb2F0dmFsdWUobGVmdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19yaWdodC0+YWRkX2Zsb2F0dmFsdWUocmlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBib3R0b20KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ib3R0b20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ib3R0b20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2JvdHRvbS0+YWRkX2Zsb2F0dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ190b3AtPmFkZF9mbG9hdHZhbHVlKHRvcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196TmVhci0+YWRkX2Zsb2F0dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196RmFyLT5hZGRfZmxvYXR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xPcnRob2YobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcmYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcmYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9mbG9hdHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFBhcmFtZXRlcmYocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyZnYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9pbnRQYXJhbWV0ZXJmdihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXplKEdMZmxvYXQgc2l6ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRTaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2Zsb2F0dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9pbnRTaXplKHNpemUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUm90YXRlZihHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xSb3RhdGVmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYW5nbGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hbmdsZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FuZ2xlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FuZ2xlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2FuZ2xlLT5hZGRfZmxvYXR2YWx1ZShhbmdsZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUm90YXRlZihhbmdsZSwgeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTY2FsZWYoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2NhbGVmKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfeC0+YWRkX2Zsb2F0dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3ktPmFkZF9mbG9hdHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ196LT5hZGRfZmxvYXR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTY2FsZWYoeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZmKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52Zik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2Zsb2F0dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudmYodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4RW52ZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEVudmZ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudmZ2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRyYW5zbGF0ZWYoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVHJhbnNsYXRlZik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVHJhbnNsYXRlZih4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEFscGhhRnVuY3goR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQWxwaGFGdW5jeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZ1bmMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mdW5jID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnVuYy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mdW5jLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZnVuYy0+YWRkX2ludHZhbHVlKChpbnQpZnVuYyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJlZgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JlZiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlZi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yZWYtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3JlZi0+YWRkX2ludHZhbHVlKHJlZik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQWxwaGFGdW5jeChmdW5jLCByZWYpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xlYXJDb2xvcngoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsZWFyQ29sb3J4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVkLT5hZGRfaW50dmFsdWUocmVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JlZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncmVlbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ncmVlbi0+YWRkX2ludHZhbHVlKGdyZWVuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ibHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JsdWUtPmFkZF9pbnR2YWx1ZShibHVlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYWxwaGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FscGhhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19hbHBoYS0+YWRkX2ludHZhbHVlKGFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGVhckNvbG9yeChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoeChHTGNsYW1weCBkZXB0aCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xlYXJEZXB0aHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkZXB0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RlcHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZGVwdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZGVwdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2RlcHRoLT5hZGRfaW50dmFsdWUoZGVwdGgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsZWFyRGVwdGh4KGRlcHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsaWVudEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsaWVudEFjdGl2ZVRleHR1cmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0ZXh0dXJlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dHVyZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGV4dHVyZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSgoaW50KXRleHR1cmUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsaWVudEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmV4KEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsaXBQbGFuZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbGFuZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BsYW5lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGxhbmUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGxhbmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbGFuZS0+YWRkX2ludHZhbHVlKChpbnQpcGxhbmUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcXVhdGlvbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxdWF0aW9uID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXF1YXRpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5hZGRfaW50dmFsdWUoKGludCllcXVhdGlvbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xpcFBsYW5leChwbGFuZSwgZXF1YXRpb24pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXF1YXRpb24sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENvbG9yNHViKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbG9yNHViKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6QllURSk7Ci0gICAgYXJnX3JlZC0+YWRkX2ludHZhbHVlKChpbnQpcmVkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZ3JlZW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ncmVlbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2dyZWVuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCWVRFKTsKLSAgICBhcmdfZ3JlZW4tPmFkZF9pbnR2YWx1ZSgoaW50KWdyZWVuKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYmx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ibHVlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJZVEUpOwotICAgIGFyZ19ibHVlLT5hZGRfaW50dmFsdWUoKGludClibHVlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYWxwaGEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19hbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2FscGhhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2FscGhhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCWVRFKTsKLSAgICBhcmdfYWxwaGEtPmFkZF9pbnR2YWx1ZSgoaW50KWFscGhhKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDb2xvcjR1YihyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb2xvcjR4KEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbG9yNHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWQtPmFkZF9pbnR2YWx1ZShyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfaW50dmFsdWUoZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmx1ZS0+YWRkX2ludHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FscGhhLT5hZGRfaW50dmFsdWUoYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvbG9yNHgocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ29sb3JQb2ludGVyKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDb2xvclBvaW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJpZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdHJpZGUtPmFkZF9pbnR2YWx1ZShzdHJpZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ29sb3JQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdleChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVwdGhSYW5nZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfaW50dmFsdWUoek5lYXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6RmFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfekZhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pGYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfekZhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfekZhci0+YWRkX2ludHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERlcHRoUmFuZ2V4KHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERpc2FibGVDbGllbnRTdGF0ZShHTGVudW0gYXJyYXkpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERpc2FibGVDbGllbnRTdGF0ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFycmF5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXJyYXkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hcnJheS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hcnJheS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2FycmF5LT5hZGRfaW50dmFsdWUoKGludClhcnJheSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGlzYWJsZUNsaWVudFN0YXRlKGFycmF5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEVuYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRW5hYmxlQ2xpZW50U3RhdGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhcnJheQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FycmF5ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYXJyYXktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXJyYXktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hcnJheS0+YWRkX2ludHZhbHVlKChpbnQpYXJyYXkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEVuYWJsZUNsaWVudFN0YXRlKGFycmF5KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZvZ3goR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGb2d4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGb2d4KHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGb2d4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRm9neHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRm9neHYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZydXN0dW14KEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZydXN0dW14KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9pbnR2YWx1ZShsZWZ0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yaWdodC0+YWRkX2ludHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYm90dG9tLT5hZGRfaW50dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdG9wLT5hZGRfaW50dmFsdWUodG9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196TmVhci0+YWRkX2ludHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9pbnR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcnVzdHVteChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZXgoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0Q2xpcFBsYW5leCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vxbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Vxbi0+YWRkX2ludHZhbHVlKChpbnQpZXFuKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRDbGlwUGxhbmV4KHBuYW1lLCBlcW4pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgZXFuLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRGaXhlZHYoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldEZpeGVkdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRGaXhlZHYocG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldExpZ2h0eHYoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0TGlnaHR4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19saWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19saWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2xpZ2h0LT5hZGRfaW50dmFsdWUoKGludClsaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRMaWdodHh2KGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0TWF0ZXJpYWx4dihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldE1hdGVyaWFseHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0TWF0ZXJpYWx4dihmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0UG9pbnRlcnYoR0xlbnVtIHBuYW1lLCBHTHZvaWQgKipwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFBvaW50ZXJ2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFBvaW50ZXJ2KHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhFbnZpdihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldFRleEVudml2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZW52Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZW52ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZW52LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Vudi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Vudi0+YWRkX2ludHZhbHVlKChpbnQpZW52KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldFRleEVudml2KGVudiwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudnh2KEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhFbnZ4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVudgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VudiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vudi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lbnYtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19lbnYtPmFkZF9pbnR2YWx1ZSgoaW50KWVudik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhFbnZ4dihlbnYsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhQYXJhbWV0ZXJ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4UGFyYW1ldGVyeHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4UGFyYW1ldGVyeHYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHgoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRNb2RlbHgocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWx4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbHh2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0TW9kZWx4dihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHR4KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19saWdodC0+YWRkX2ludHZhbHVlKChpbnQpbGlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0eChsaWdodCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpZ2h0eHYoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGlnaHR4dik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19saWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19saWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2xpZ2h0LT5hZGRfaW50dmFsdWUoKGludClsaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaWdodHh2KGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGluZVdpZHRoeChHTGZpeGVkIHdpZHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaW5lV2lkdGh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaW5lV2lkdGh4KHdpZHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExvYWRJZGVudGl0eSh2b2lkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMb2FkSWRlbnRpdHkpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExvYWRJZGVudGl0eSgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTG9hZE1hdHJpeHgoY29uc3QgR0xmaXhlZCAqbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTG9hZE1hdHJpeHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX20tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbS0+YWRkX2ludHZhbHVlKChpbnQpbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTG9hZE1hdHJpeHgobSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBtLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xMb2dpY09wKEdMZW51bSBvcGNvZGUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExvZ2ljT3ApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBvcGNvZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19vcGNvZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19vcGNvZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfb3Bjb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfb3Bjb2RlLT5hZGRfaW50dmFsdWUoKGludClvcGNvZGUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExvZ2ljT3Aob3Bjb2RlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE1hdGVyaWFseChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXRlcmlhbHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE1hdGVyaWFseChmYWNlLCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0ZXJpYWx4dihHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE1hdGVyaWFseHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWNlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZmFjZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY2UtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ZhY2UtPmFkZF9pbnR2YWx1ZSgoaW50KWZhY2UpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWF0ZXJpYWx4dihmYWNlLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0cml4TW9kZShHTGVudW0gbW9kZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTWF0cml4TW9kZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWF0cml4TW9kZShtb2RlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE11bHRNYXRyaXh4KGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE11bHRNYXRyaXh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX20tPmFkZF9pbnR2YWx1ZSgoaW50KW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbE11bHRNYXRyaXh4KG0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTXVsdGlUZXhDb29yZDR4KEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTXVsdGlUZXhDb29yZDR4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3MgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3MtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3MtPmFkZF9pbnR2YWx1ZShzKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3QgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3QtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3QtPmFkZF9pbnR2YWx1ZSh0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ItPmFkZF9pbnR2YWx1ZShyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3EgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19xLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3EtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3EtPmFkZF9pbnR2YWx1ZShxKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNdWx0aVRleENvb3JkNHgodGFyZ2V0LCBzLCB0LCByLCBxKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE5vcm1hbDN4KEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE5vcm1hbDN4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbngKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX254LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX254LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ueC0+YWRkX2ludHZhbHVlKG54KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX255LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX255LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19ueS0+YWRkX2ludHZhbHVlKG55KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbnoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19ueiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX256LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX256LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19uei0+YWRkX2ludHZhbHVlKG56KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xOb3JtYWwzeChueCwgbnksIG56KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE5vcm1hbFBvaW50ZXIoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE5vcm1hbFBvaW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJpZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdHJpZGUtPmFkZF9pbnR2YWx1ZShzdHJpZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTm9ybWFsUG9pbnRlcih0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcG9pbnRlciwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsT3J0aG94KEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE9ydGhveCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlZnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZWZ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVmdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZWZ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZWZ0LT5hZGRfaW50dmFsdWUobGVmdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmlnaHQtPmFkZF9pbnR2YWx1ZShyaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvdHRvbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvdHRvbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3R0b20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JvdHRvbS0+YWRkX2ludHZhbHVlKGJvdHRvbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRvcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RvcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RvcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190b3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RvcC0+YWRkX2ludHZhbHVlKHRvcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfek5lYXItPmFkZF9pbnR2YWx1ZSh6TmVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpGYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196RmFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfekZhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196RmFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196RmFyLT5hZGRfaW50dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsT3J0aG94KGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJ4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJ4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFBhcmFtZXRlcngocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyeHYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvaW50UGFyYW1ldGVyeHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9pbnRQYXJhbWV0ZXJ4dihwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXpleChHTGZpeGVkIHNpemUpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvaW50U2l6ZXgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvaW50U2l6ZXgoc2l6ZSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2x5Z29uT2Zmc2V0eChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9seWdvbk9mZnNldHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmYWN0b3IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWN0b3IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWN0b3ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZmFjdG9yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mYWN0b3ItPmFkZF9pbnR2YWx1ZShmYWN0b3IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB1bml0cwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3VuaXRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdW5pdHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdW5pdHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3VuaXRzLT5hZGRfaW50dmFsdWUodW5pdHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvbHlnb25PZmZzZXR4KGZhY3RvciwgdW5pdHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9wTWF0cml4KHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFBvcE1hdHJpeCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9wTWF0cml4KCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQdXNoTWF0cml4KHZvaWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFB1c2hNYXRyaXgpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFB1c2hNYXRyaXgoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJvdGF0ZXgoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUm90YXRleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGFuZ2xlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYW5nbGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hbmdsZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19hbmdsZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYW5nbGUtPmFkZF9pbnR2YWx1ZShhbmdsZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUm90YXRleChhbmdsZSwgeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTYW1wbGVDb3ZlcmFnZXgoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNhbXBsZUNvdmVyYWdleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmFsdWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ192YWx1ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ192YWx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdmFsdWUtPmFkZF9pbnR2YWx1ZSh2YWx1ZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludmVydAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ludmVydCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ludmVydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnZlcnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkJPT0wpOwotICAgIGFyZ19pbnZlcnQtPmFkZF9ib29sdmFsdWUoaW52ZXJ0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTYW1wbGVDb3ZlcmFnZXgodmFsdWUsIGludmVydCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTY2FsZXgoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsU2NhbGV4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ194LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3gtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3gtPmFkZF9pbnR2YWx1ZSh4KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgeQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3kgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ195LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ktPmFkZF9pbnR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3otPmFkZF9pbnR2YWx1ZSh6KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTY2FsZXgoeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xTaGFkZU1vZGVsKEdMZW51bSBtb2RlKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTaGFkZU1vZGVsKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbW9kZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tb2RlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX21vZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlLT5hZGRfaW50dmFsdWUoKGludCltb2RlKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xTaGFkZU1vZGVsKG1vZGUpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4Q29vcmRQb2ludGVyKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhDb29yZFBvaW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJpZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdHJpZGUtPmFkZF9pbnR2YWx1ZShzdHJpZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4Q29vcmRQb2ludGVyKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZpKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEVudmkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudmkodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4RW52eChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEVudngpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudngodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4RW52aXYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhFbnZpdik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhFbnZpdih0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4dihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4RW52eHYpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4RW52eHYodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyeChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcngpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFBhcmFtZXRlcngodGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyeHYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleFBhcmFtZXRlcnh2KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleFBhcmFtZXRlcnh2KHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRyYW5zbGF0ZXgoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVHJhbnNsYXRleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVHJhbnNsYXRleCh4LCB5LCB6KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFZlcnRleFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFZlcnRleFBvaW50ZXIpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJpZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdHJpZGUtPmFkZF9pbnR2YWx1ZShzdHJpZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVmVydGV4UG9pbnRlcihzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcG9pbnRlciwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXplUG9pbnRlck9FUyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRTaXplUG9pbnRlck9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHR5cGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190eXBlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdHlwZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190eXBlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdHlwZS0+YWRkX2ludHZhbHVlKChpbnQpdHlwZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBvaW50ZXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wb2ludGVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wb2ludGVyLT5hZGRfaW50dmFsdWUoKGludClwb2ludGVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFNpemVQb2ludGVyT0VTKHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi0KLS8vIERlZmluaXRpb25zIGZvciBHTDFFeHQgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMoR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGVSR0IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlUkdCID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZVJHQi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlUkdCLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZVJHQi0+YWRkX2ludHZhbHVlKChpbnQpbW9kZVJHQik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGVBbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21vZGVBbHBoYSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21vZGVBbHBoYS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlQWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19tb2RlQWxwaGEtPmFkZF9pbnR2YWx1ZSgoaW50KW1vZGVBbHBoYSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTKG1vZGVSR0IsIG1vZGVBbHBoYSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyhHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxlbmRGdW5jU2VwYXJhdGVPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzcmNSR0IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zcmNSR0IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zcmNSR0ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3JjUkdCLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfc3JjUkdCLT5hZGRfaW50dmFsdWUoKGludClzcmNSR0IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkc3RSR0IKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kc3RSR0IgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kc3RSR0ItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHN0UkdCLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZHN0UkdCLT5hZGRfaW50dmFsdWUoKGludClkc3RSR0IpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzcmNBbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NyY0FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3JjQWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3JjQWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19zcmNBbHBoYS0+YWRkX2ludHZhbHVlKChpbnQpc3JjQWxwaGEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBkc3RBbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RzdEFscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZHN0QWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZHN0QWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19kc3RBbHBoYS0+YWRkX2ludHZhbHVlKChpbnQpZHN0QWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJsZW5kRnVuY1NlcGFyYXRlT0VTKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmxlbmRFcXVhdGlvbk9FUyhHTGVudW0gbW9kZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQmxlbmRFcXVhdGlvbk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1vZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tb2RlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbW9kZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tb2RlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfbW9kZS0+YWRkX2ludHZhbHVlKChpbnQpbW9kZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQmxlbmRFcXVhdGlvbk9FUyhtb2RlKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhzT0VTKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4c09FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd1RleHNPRVMoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4aU9FUyhHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4aU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd1RleGlPRVMoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4eE9FUyhHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRHJhd1RleHhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB3aWR0aAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3dpZHRoID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfd2lkdGgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfd2lkdGgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3dpZHRoLT5hZGRfaW50dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19oZWlnaHQtPmFkZF9pbnR2YWx1ZShoZWlnaHQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdUZXh4T0VTKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRHJhd1RleHN2T0VTKGNvbnN0IEdMc2hvcnQgKmNvb3JkcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRHJhd1RleHN2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3Jkcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY29vcmRzLT5hZGRfaW50dmFsdWUoKGludCljb29yZHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdUZXhzdk9FUyhjb29yZHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgY29vcmRzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4aXZPRVMoY29uc3QgR0xpbnQgKmNvb3JkcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRHJhd1RleGl2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmRzID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmRzLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3Jkcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfY29vcmRzLT5hZGRfaW50dmFsdWUoKGludCljb29yZHMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbERyYXdUZXhpdk9FUyhjb29yZHMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgY29vcmRzLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4eHZPRVMoY29uc3QgR0xmaXhlZCAqY29vcmRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4eHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZHMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmRzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb29yZHMtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3Jkcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRHJhd1RleHh2T0VTKGNvb3Jkcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBjb29yZHMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhmT0VTKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEcmF3VGV4Zk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3gtPmFkZF9mbG9hdHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ195LT5hZGRfZmxvYXR2YWx1ZSh5KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgegotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3otPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfei0+YWRkX2Zsb2F0dmFsdWUoeik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ193aWR0aC0+YWRkX2Zsb2F0dmFsdWUod2lkdGgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBoZWlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19oZWlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19oZWlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaGVpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2Zsb2F0dmFsdWUoaGVpZ2h0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3VGV4Zk9FUyh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhmdk9FUyhjb25zdCBHTGZsb2F0ICpjb29yZHMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERyYXdUZXhmdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3Jkcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZHMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Nvb3Jkcy0+YWRkX2ludHZhbHVlKChpbnQpY29vcmRzKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEcmF3VGV4ZnZPRVMoY29vcmRzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGNvb3JkcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQWxwaGFGdW5jeE9FUyhHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xBbHBoYUZ1bmN4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZnVuYwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Z1bmMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mdW5jLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Z1bmMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mdW5jLT5hZGRfaW50dmFsdWUoKGludClmdW5jKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVmCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVmID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVmLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlZi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVmLT5hZGRfaW50dmFsdWUocmVmKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xBbHBoYUZ1bmN4T0VTKGZ1bmMsIHJlZik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDbGVhckNvbG9yeE9FUyhHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xlYXJDb2xvcnhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWQtPmFkZF9pbnR2YWx1ZShyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfaW50dmFsdWUoZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmx1ZS0+YWRkX2ludHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FscGhhLT5hZGRfaW50dmFsdWUoYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsZWFyQ29sb3J4T0VTKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsZWFyRGVwdGh4T0VTKEdMY2xhbXB4IGRlcHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGVhckRlcHRoeE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGRlcHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZGVwdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19kZXB0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19kZXB0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZGVwdGgtPmFkZF9pbnR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xlYXJEZXB0aHhPRVMoZGVwdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5leE9FUyhHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGlwUGxhbmV4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGxhbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbGFuZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BsYW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BsYW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcGxhbmUtPmFkZF9pbnR2YWx1ZSgoaW50KXBsYW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXF1YXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lcXVhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2VxdWF0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19lcXVhdGlvbi0+YWRkX2ludHZhbHVlKChpbnQpZXF1YXRpb24pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsaXBQbGFuZXhPRVMocGxhbmUsIGVxdWF0aW9uKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxdWF0aW9uLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDb2xvcjR4T0VTKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENvbG9yNHhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZWQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yZWQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yZWQtPmFkZF9pbnR2YWx1ZShyZWQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBncmVlbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2dyZWVuID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZ3JlZW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZ3JlZW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2dyZWVuLT5hZGRfaW50dmFsdWUoZ3JlZW4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBibHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYmx1ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYmx1ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYmx1ZS0+YWRkX2ludHZhbHVlKGJsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbHBoYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FscGhhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYWxwaGEtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYWxwaGEtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FscGhhLT5hZGRfaW50dmFsdWUoYWxwaGEpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENvbG9yNHhPRVMocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRGVwdGhSYW5nZXhPRVMoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlcHRoUmFuZ2V4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196TmVhci0+YWRkX2ludHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9pbnR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xEZXB0aFJhbmdleE9FUyh6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGb2d4T0VTKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRm9neE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRm9neE9FUyhwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRm9neHZPRVMoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZvZ3h2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZvZ3h2T0VTKHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xGcnVzdHVteE9FUyhHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xGcnVzdHVteE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlZnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZWZ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVmdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZWZ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZWZ0LT5hZGRfaW50dmFsdWUobGVmdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHJpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19yaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yaWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmlnaHQtPmFkZF9pbnR2YWx1ZShyaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvdHRvbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvdHRvbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3R0b20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2JvdHRvbS0+YWRkX2ludHZhbHVlKGJvdHRvbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRvcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RvcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RvcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190b3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RvcC0+YWRkX2ludHZhbHVlKHRvcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpOZWFyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfek5lYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196TmVhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196TmVhci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfek5lYXItPmFkZF9pbnR2YWx1ZSh6TmVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpGYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196RmFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfekZhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196RmFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196RmFyLT5hZGRfaW50dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRnJ1c3R1bXhPRVMobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRDbGlwUGxhbmV4T0VTKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldENsaXBQbGFuZXhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lcW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lcW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXFuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19lcW4tPmFkZF9pbnR2YWx1ZSgoaW50KWVxbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0Q2xpcFBsYW5leE9FUyhwbmFtZSwgZXFuKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0Rml4ZWR2T0VTKEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRGaXhlZHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0Rml4ZWR2T0VTKHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRMaWdodHh2T0VTKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldExpZ2h0eHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19saWdodC0+YWRkX2ludHZhbHVlKChpbnQpbGlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0TGlnaHR4dk9FUyhsaWdodCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldE1hdGVyaWFseHZPRVMoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRNYXRlcmlhbHh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZmFjZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY2UgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mYWNlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2ZhY2UtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19mYWNlLT5hZGRfaW50dmFsdWUoKGludClmYWNlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdldE1hdGVyaWFseHZPRVMoZmFjZSwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudnh2T0VTKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhFbnZ4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVudgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VudiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vudi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lbnYtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19lbnYtPmFkZF9pbnR2YWx1ZSgoaW50KWVudik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhFbnZ4dk9FUyhlbnYsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4UGFyYW1ldGVyeHZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4UGFyYW1ldGVyeHZPRVModGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHhPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodE1vZGVseE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTGlnaHRNb2RlbHhPRVMocG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWx4dk9FUyhHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGlnaHRNb2RlbHh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0TW9kZWx4dk9FUyhwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGlnaHR4T0VTKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaWdodHhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19saWdodC0+YWRkX2ludHZhbHVlKChpbnQpbGlnaHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExpZ2h0eE9FUyhsaWdodCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExpZ2h0eHZPRVMoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTGlnaHR4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxpZ2h0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGlnaHQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19saWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19saWdodC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2xpZ2h0LT5hZGRfaW50dmFsdWUoKGludClsaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaWdodHh2T0VTKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTGluZVdpZHRoeE9FUyhHTGZpeGVkIHdpZHRoKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMaW5lV2lkdGh4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgd2lkdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ193aWR0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3dpZHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ193aWR0aC0+YWRkX2ludHZhbHVlKHdpZHRoKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xMaW5lV2lkdGh4T0VTKHdpZHRoKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExvYWRNYXRyaXh4T0VTKGNvbnN0IEdMZml4ZWQgKm0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbExvYWRNYXRyaXh4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX20gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX20tPmFkZF9pbnR2YWx1ZSgoaW50KW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExvYWRNYXRyaXh4T0VTKG0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbSwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0ZXJpYWx4T0VTKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE1hdGVyaWFseE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWF0ZXJpYWx4T0VTKGZhY2UsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHh2T0VTKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsTWF0ZXJpYWx4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY2UKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mYWNlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZmFjZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWNlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfZmFjZS0+YWRkX2ludHZhbHVlKChpbnQpZmFjZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNYXRlcmlhbHh2T0VTKGZhY2UsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xNdWx0TWF0cml4eE9FUyhjb25zdCBHTGZpeGVkICptKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNdWx0TWF0cml4eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19tLT5hZGRfaW50dmFsdWUoKGludCltKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xNdWx0TWF0cml4eE9FUyhtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIG0sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbE11bHRpVGV4Q29vcmQ0eE9FUyhHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE11bHRpVGV4Q29vcmQ0eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zLT5hZGRfaW50dmFsdWUocyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ190LT5hZGRfaW50dmFsdWUodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19yLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yLT5hZGRfaW50dmFsdWUocik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHEKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19xID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19xLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19xLT5hZGRfaW50dmFsdWUocSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTXVsdGlUZXhDb29yZDR4T0VTKHRhcmdldCwgcywgdCwgciwgcSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xOb3JtYWwzeE9FUyhHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xOb3JtYWwzeE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG54Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ueC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ueC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbngtPmFkZF9pbnR2YWx1ZShueCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG55Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnkgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19ueS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ueS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnktPmFkZF9pbnR2YWx1ZShueSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG56Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbnogPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19uei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19uei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbnotPmFkZF9pbnR2YWx1ZShueik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTm9ybWFsM3hPRVMobngsIG55LCBueik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xPcnRob3hPRVMoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsT3J0aG94T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGVmdAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xlZnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19sZWZ0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xlZnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9pbnR2YWx1ZShsZWZ0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19yaWdodC0+YWRkX2ludHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfYm90dG9tLT5hZGRfaW50dmFsdWUoYm90dG9tKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdG9wCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdG9wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdG9wLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RvcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdG9wLT5hZGRfaW50dmFsdWUodG9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196TmVhci0+YWRkX2ludHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9pbnR2YWx1ZSh6RmFyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xPcnRob3hPRVMobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcnhPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2ludFBhcmFtZXRlcnhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFBvaW50UGFyYW1ldGVyeE9FUyhwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJ4dk9FUyhHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRQYXJhbWV0ZXJ4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xQb2ludFBhcmFtZXRlcnh2T0VTKHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xQb2ludFNpemV4T0VTKEdMZml4ZWQgc2l6ZSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUG9pbnRTaXpleE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHNpemUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zaXplID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc2l6ZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zaXplLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zaXplLT5hZGRfaW50dmFsdWUoc2l6ZSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9pbnRTaXpleE9FUyhzaXplKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFBvbHlnb25PZmZzZXR4T0VTKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xQb2x5Z29uT2Zmc2V0eE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZhY3RvcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZhY3RvciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2ZhY3Rvci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mYWN0b3ItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZhY3Rvci0+YWRkX2ludHZhbHVlKGZhY3Rvcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHVuaXRzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdW5pdHMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ191bml0cy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ191bml0cy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfdW5pdHMtPmFkZF9pbnR2YWx1ZSh1bml0cyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUG9seWdvbk9mZnNldHhPRVMoZmFjdG9yLCB1bml0cyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xSb3RhdGV4T0VTKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFJvdGF0ZXhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhbmdsZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2FuZ2xlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYW5nbGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYW5nbGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2FuZ2xlLT5hZGRfaW50dmFsdWUoYW5nbGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFJvdGF0ZXhPRVMoYW5nbGUsIHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2FtcGxlQ292ZXJhZ2V4T0VTKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xTYW1wbGVDb3ZlcmFnZXhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3ZhbHVlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdmFsdWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdmFsdWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZhbHVlLT5hZGRfaW50dmFsdWUodmFsdWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbnZlcnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19pbnZlcnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnZlcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW52ZXJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBhcmdfaW52ZXJ0LT5hZGRfYm9vbHZhbHVlKGludmVydCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2FtcGxlQ292ZXJhZ2V4T0VTKHZhbHVlLCBpbnZlcnQpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsU2NhbGV4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFNjYWxleE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ194ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ194LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ194LT5hZGRfaW50dmFsdWUoeCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHkKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ195ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfeS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ195LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ195LT5hZGRfaW50dmFsdWUoeSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHoKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfei0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ196LT5hZGRfaW50dmFsdWUoeik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsU2NhbGV4T0VTKHgsIHksIHopOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4RW52eE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEVudnhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW0tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW0tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtLT5hZGRfaW50dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudnhPRVModGFyZ2V0LCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4RW52eHZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEVudnh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEVudnh2T0VTKHRhcmdldCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcnhPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJ4T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhQYXJhbWV0ZXJ4T0VTKHRhcmdldCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcnh2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhQYXJhbWV0ZXJ4dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhQYXJhbWV0ZXJ4dk9FUyh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUcmFuc2xhdGV4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRyYW5zbGF0ZXhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3gtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeC0+YWRkX2ludHZhbHVlKHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB5Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3ktPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfeS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfeS0+YWRkX2ludHZhbHVlKHkpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfeiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3otPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfei0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfei0+YWRkX2ludHZhbHVlKHopOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRyYW5zbGF0ZXhPRVMoeCwgeSwgeik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUmVuZGVyYnVmZmVyT0VTKEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbElzUmVuZGVyYnVmZmVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5hZGRfaW50dmFsdWUocmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xib29sZWFuIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xJc1JlbmRlcmJ1ZmZlck9FUyhyZW5kZXJidWZmZXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgLy8gc2V0IHJldHVybiB2YWx1ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcnQgPSBnbG1zZy5tdXRhYmxlX3JldHVybnZhbHVlKCk7Ci0gICAgcnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBydC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgcnQtPmFkZF9ib29sdmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQmluZFJlbmRlcmJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kUmVuZGVyYnVmZmVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5hZGRfaW50dmFsdWUocmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xCaW5kUmVuZGVyYnVmZmVyT0VTKHRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpcmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyhuLCByZW5kZXJidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHJlbmRlcmJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlblJlbmRlcmJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdlblJlbmRlcmJ1ZmZlcnNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByZW5kZXJidWZmZXJzCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVycyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVycy0+YWRkX2ludHZhbHVlKChpbnQpcmVuZGVyYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuUmVuZGVyYnVmZmVyc09FUyhuLCByZW5kZXJidWZmZXJzKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHJlbmRlcmJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRhcmdldAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RhcmdldCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190YXJnZXQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190YXJnZXQtPmFkZF9pbnR2YWx1ZSgoaW50KXRhcmdldCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGludGVybmFsZm9ybWF0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50ZXJuYWxmb3JtYXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19pbnRlcm5hbGZvcm1hdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2ludGVybmFsZm9ybWF0LT5hZGRfaW50dmFsdWUoKGludClpbnRlcm5hbGZvcm1hdCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHdpZHRoCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfd2lkdGggPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ193aWR0aC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ193aWR0aC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfd2lkdGgtPmFkZF9pbnR2YWx1ZSh3aWR0aCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGhlaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2hlaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2hlaWdodC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19oZWlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2hlaWdodC0+YWRkX2ludHZhbHVlKGhlaWdodCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVModGFyZ2V0LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotR0xib29sZWFuIEdMVHJhY2VfZ2xJc0ZyYW1lYnVmZmVyT0VTKEdMdWludCBmcmFtZWJ1ZmZlcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsSXNGcmFtZWJ1ZmZlck9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGZyYW1lYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZnJhbWVidWZmZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19mcmFtZWJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPmFkZF9pbnR2YWx1ZShmcmFtZWJ1ZmZlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIEdMYm9vbGVhbiByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsSXNGcmFtZWJ1ZmZlck9FUyhmcmFtZWJ1ZmZlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpCT09MKTsKLSAgICBydC0+YWRkX2Jvb2x2YWx1ZShyZXRWYWx1ZSk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xCaW5kRnJhbWVidWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xCaW5kRnJhbWVidWZmZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmcmFtZWJ1ZmZlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2ZyYW1lYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnJhbWVidWZmZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2ZyYW1lYnVmZmVyLT5hZGRfaW50dmFsdWUoZnJhbWVidWZmZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEJpbmRGcmFtZWJ1ZmZlck9FUyh0YXJnZXQsIGZyYW1lYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbERlbGV0ZUZyYW1lYnVmZmVyc09FUyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmcmFtZWJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mcmFtZWJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KWZyYW1lYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKG4sIGZyYW1lYnVmZmVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBmcmFtZWJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEdlbkZyYW1lYnVmZmVyc09FUyhHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZW5GcmFtZWJ1ZmZlcnNPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBuCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX24tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbi0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfbi0+YWRkX2ludHZhbHVlKG4pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBmcmFtZWJ1ZmZlcnMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19mcmFtZWJ1ZmZlcnMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZnJhbWVidWZmZXJzLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19mcmFtZWJ1ZmZlcnMtPmFkZF9pbnR2YWx1ZSgoaW50KWZyYW1lYnVmZmVycyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2VuRnJhbWVidWZmZXJzT0VTKG4sIGZyYW1lYnVmZmVycyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBmcmFtZWJ1ZmZlcnMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMZW51bSBHTFRyYWNlX2dsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyhHTGVudW0gdGFyZ2V0KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xlbnVtIHJldFZhbHVlID0gZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKHRhcmdldCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBydC0+YWRkX2ludHZhbHVlKChpbnQpcmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLQotICAgIHJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVydGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVydGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVydGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnRhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlcnRhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpcmVuZGVyYnVmZmVydGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmVuZGVyYnVmZmVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcmVuZGVyYnVmZmVyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JlbmRlcmJ1ZmZlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcmVuZGVyYnVmZmVyLT5hZGRfaW50dmFsdWUocmVuZGVyYnVmZmVyKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyh0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYXR0YWNobWVudAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2F0dGFjaG1lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19hdHRhY2htZW50LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19hdHRhY2htZW50LT5hZGRfaW50dmFsdWUoKGludClhdHRhY2htZW50KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dGFyZ2V0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdGV4dGFyZ2V0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfdGV4dGFyZ2V0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHRhcmdldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3RleHRhcmdldC0+YWRkX2ludHZhbHVlKChpbnQpdGV4dGFyZ2V0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdGV4dHVyZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RleHR1cmUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190ZXh0dXJlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3RleHR1cmUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3RleHR1cmUtPmFkZF9pbnR2YWx1ZSh0ZXh0dXJlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgbGV2ZWwKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZXZlbCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xldmVsLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xldmVsLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sZXZlbC0+YWRkX2ludHZhbHVlKGxldmVsKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgdGV4dHVyZSwgbGV2ZWwpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBhdHRhY2htZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYXR0YWNobWVudCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfYXR0YWNobWVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2F0dGFjaG1lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWF0dGFjaG1lbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVModGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2VuZXJhdGVNaXBtYXBPRVMoR0xlbnVtIHRhcmdldCkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2VuZXJhdGVNaXBtYXBPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0YXJnZXQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190YXJnZXQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190YXJnZXQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdGFyZ2V0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfdGFyZ2V0LT5hZGRfaW50dmFsdWUoKGludCl0YXJnZXQpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEdlbmVyYXRlTWlwbWFwT0VTKHRhcmdldCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyhHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1hdHJpeHBhbGV0dGVpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hdHJpeHBhbGV0dGVpbmRleCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21hdHJpeHBhbGV0dGVpbmRleC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXRyaXhwYWxldHRlaW5kZXgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hdHJpeHBhbGV0dGVpbmRleC0+YWRkX2ludHZhbHVlKG1hdHJpeHBhbGV0dGVpbmRleCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMobWF0cml4cGFsZXR0ZWluZGV4KTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyh2b2lkKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUygpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsTWF0cml4SW5kZXhQb2ludGVyT0VTKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xNYXRyaXhJbmRleFBvaW50ZXJPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzdHJpZGUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19zdHJpZGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zdHJpZGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19zdHJpZGUtPmFkZF9pbnR2YWx1ZShzdHJpZGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwb2ludGVyCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG9pbnRlciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG9pbnRlci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcG9pbnRlci0+YWRkX2ludHZhbHVlKChpbnQpcG9pbnRlcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsTWF0cml4SW5kZXhQb2ludGVyT0VTKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlcik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwb2ludGVyLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xXZWlnaHRQb2ludGVyT0VTKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xXZWlnaHRQb2ludGVyT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc2l6ZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3NpemUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19zaXplLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3NpemUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3NpemUtPmFkZF9pbnR2YWx1ZShzaXplKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgdHlwZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3R5cGUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190eXBlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3R5cGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ190eXBlLT5hZGRfaW50dmFsdWUoKGludCl0eXBlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgc3RyaWRlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RyaWRlID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfc3RyaWRlLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc3RyaWRlLT5hZGRfaW50dmFsdWUoc3RyaWRlKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG9pbnRlcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BvaW50ZXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wb2ludGVyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BvaW50ZXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BvaW50ZXItPmFkZF9pbnR2YWx1ZSgoaW50KXBvaW50ZXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFdlaWdodFBvaW50ZXJPRVMoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBvaW50ZXIsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLUdMYml0ZmllbGQgR0xUcmFjZV9nbFF1ZXJ5TWF0cml4eE9FUyhHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xRdWVyeU1hdHJpeHhPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtYW50aXNzYQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21hbnRpc3NhID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbWFudGlzc2EtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWFudGlzc2EtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21hbnRpc3NhLT5hZGRfaW50dmFsdWUoKGludCltYW50aXNzYSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGV4cG9uZW50Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfZXhwb25lbnQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19leHBvbmVudC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19leHBvbmVudC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfZXhwb25lbnQtPmFkZF9pbnR2YWx1ZSgoaW50KWV4cG9uZW50KTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgR0xiaXRmaWVsZCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLmdsUXVlcnlNYXRyaXh4T0VTKG1hbnRpc3NhLCBleHBvbmVudCk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIHJ0LT5hZGRfaW50dmFsdWUocmV0VmFsdWUpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgbWFudGlzc2EsCi0gICAgICAgICh2b2lkICopIGV4cG9uZW50LAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotfQotCi12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdlZk9FUyhHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRGVwdGhSYW5nZWZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfek5lYXItPmFkZF9mbG9hdHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfekZhci0+YWRkX2Zsb2F0dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsRGVwdGhSYW5nZWZPRVMoek5lYXIsIHpGYXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsRnJ1c3R1bWZPRVMoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsRnJ1c3R1bWZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBsZWZ0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbGVmdCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xlZnQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbGVmdC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19sZWZ0LT5hZGRfZmxvYXR2YWx1ZShsZWZ0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcmlnaHQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19yaWdodCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3JpZ2h0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3JpZ2h0LT5hZGRfZmxvYXR2YWx1ZShyaWdodCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGJvdHRvbQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2JvdHRvbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19ib3R0b20tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfYm90dG9tLT5hZGRfZmxvYXR2YWx1ZShib3R0b20pOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0b3AKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ190b3AgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ190b3AtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdG9wLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3RvcC0+YWRkX2Zsb2F0dmFsdWUodG9wKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgek5lYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196TmVhciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pOZWFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3pOZWFyLT5hZGRfZmxvYXR2YWx1ZSh6TmVhcik7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHpGYXIKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ196RmFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfekZhci0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ196RmFyLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3pGYXItPmFkZF9mbG9hdHZhbHVlKHpGYXIpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbEZydXN0dW1mT0VTKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsT3J0aG9mT0VTKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbE9ydGhvZk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGxlZnQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19sZWZ0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfbGVmdC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19sZWZ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2xlZnQtPmFkZF9mbG9hdHZhbHVlKGxlZnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCByaWdodAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3JpZ2h0ID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcmlnaHQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcmlnaHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfcmlnaHQtPmFkZF9mbG9hdHZhbHVlKHJpZ2h0KTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgYm90dG9tCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfYm90dG9tID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfYm90dG9tLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2JvdHRvbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19ib3R0b20tPmFkZF9mbG9hdHZhbHVlKGJvdHRvbSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHRvcAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3RvcCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3RvcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ190b3AtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfdG9wLT5hZGRfZmxvYXR2YWx1ZSh0b3ApOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB6TmVhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pOZWFyID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfek5lYXItPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfek5lYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfek5lYXItPmFkZF9mbG9hdHZhbHVlKHpOZWFyKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgekZhcgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3pGYXIgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ196RmFyLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3pGYXItPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfekZhci0+YWRkX2Zsb2F0dmFsdWUoekZhcik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsT3J0aG9mT0VTKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5lZk9FUyhHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xDbGlwUGxhbmVmT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGxhbmUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbGFuZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BsYW5lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BsYW5lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcGxhbmUtPmFkZF9pbnR2YWx1ZSgoaW50KXBsYW5lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZXF1YXRpb24KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lcXVhdGlvbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2VxdWF0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2VxdWF0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19lcXVhdGlvbi0+YWRkX2ludHZhbHVlKChpbnQpZXF1YXRpb24pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbENsaXBQbGFuZWZPRVMocGxhbmUsIGVxdWF0aW9uKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxdWF0aW9uLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRDbGlwUGxhbmVmT0VTKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbEdldENsaXBQbGFuZWZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBlcW4KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19lcW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19lcW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfZXFuLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19lcW4tPmFkZF9pbnR2YWx1ZSgoaW50KWVxbik7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0Q2xpcFBsYW5lZk9FUyhwbmFtZSwgZXFuKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIGVxbiwKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsQ2xlYXJEZXB0aGZPRVMoR0xjbGFtcGYgZGVwdGgpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbENsZWFyRGVwdGhmT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgZGVwdGgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kZXB0aCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2RlcHRoLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX2RlcHRoLT5hZGRfZmxvYXR2YWx1ZShkZXB0aCk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsQ2xlYXJEZXB0aGZPRVMoZGVwdGgpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4R2VuZk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4R2VuZk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Nvb3JkLT5hZGRfaW50dmFsdWUoKGludCljb29yZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RkxPQVQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2Zsb2F0dmFsdWUocGFyYW0pOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEdlbmZPRVMoY29vcmQsIHBuYW1lLCBwYXJhbSk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xUZXhHZW5mdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhHZW5mdk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Nvb3JkLT5hZGRfaW50dmFsdWUoKGludCljb29yZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhHZW5mdk9FUyhjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEdlbmlPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xUZXhHZW5pT0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW0KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbS0+YWRkX2ludHZhbHVlKHBhcmFtKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xUZXhHZW5pT0VTKGNvb3JkLCBwbmFtZSwgcGFyYW0pOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4R2VuaXZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEdlbml2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEdlbml2T0VTKGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsVGV4R2VueE9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVGV4R2VueE9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Nvb3JkLT5hZGRfaW50dmFsdWUoKGludCljb29yZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW0gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW0tPmFkZF9pbnR2YWx1ZShwYXJhbSk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsVGV4R2VueE9FUyhjb29yZCwgcG5hbWUsIHBhcmFtKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbFRleEdlbnh2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjpnbFRleEdlbnh2T0VTKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29vcmQKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19jb29yZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2Nvb3JkLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfY29vcmQtPmFkZF9pbnR2YWx1ZSgoaW50KWNvb3JkKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcG5hbWUKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wbmFtZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BuYW1lLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcG5hbWUtPmFkZF9pbnR2YWx1ZSgoaW50KXBuYW1lKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgcGFyYW1zCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcGFyYW1zID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfcGFyYW1zLT5hZGRfaW50dmFsdWUoKGludClwYXJhbXMpOwotCi0gICAgLy8gY2FsbCBmdW5jdGlvbgotICAgIG5zZWNzX3Qgd2FsbFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBuc2Vjc190IHRocmVhZFN0YXJ0VGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC5nbFRleEdlbnh2T0VTKGNvb3JkLCBwbmFtZSwgcGFyYW1zKTsKLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci0gICAgICAgICh2b2lkICopIHBhcmFtcywKLSAgICB9OwotCi0gICAgZml4dXBHTE1lc3NhZ2UoZ2xDb250ZXh0LCB3YWxsU3RhcnRUaW1lLCB3YWxsRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFN0YXJ0VGltZSwgdGhyZWFkRW5kVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG1zZywgcG9pbnRlckFyZ3MpOwotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBHTFRyYWNlX2dsR2V0VGV4R2VuZnZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4R2VuZnZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jb29yZC0+YWRkX2ludHZhbHVlKChpbnQpY29vcmQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4R2VuZnZPRVMoY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhHZW5pdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsR2V0VGV4R2VuaXZPRVMpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb29yZAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Nvb3JkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29vcmQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfY29vcmQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19jb29yZC0+YWRkX2ludHZhbHVlKChpbnQpY29vcmQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwbmFtZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BuYW1lID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcG5hbWUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcG5hbWUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotICAgIGFyZ19wbmFtZS0+YWRkX2ludHZhbHVlKChpbnQpcG5hbWUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBwYXJhbXMKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wYXJhbXMgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wYXJhbXMtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9pbnR2YWx1ZSgoaW50KXBhcmFtcyk7Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIGdsQ29udGV4dC0+aG9va3MtPmdsLmdsR2V0VGV4R2VuaXZPRVMoY29vcmQsIHBuYW1lLCBwYXJhbXMpOwotICAgIG5zZWNzX3QgdGhyZWFkRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfVEhSRUFEKTsKLSAgICBuc2Vjc190IHdhbGxFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotCi0gICAgdm9pZCAqcG9pbnRlckFyZ3NbXSA9IHsKLSAgICAgICAgKHZvaWQgKikgcGFyYW1zLAotICAgIH07Ci0KLSAgICBmaXh1cEdMTWVzc2FnZShnbENvbnRleHQsIHdhbGxTdGFydFRpbWUsIHdhbGxFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkU3RhcnRUaW1lLCB0aHJlYWRFbmRUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsbXNnLCBwb2ludGVyQXJncyk7Ci0gICAgZ2xDb250ZXh0LT50cmFjZUdMTWVzc2FnZSgmZ2xtc2cpOwotfQotCi12b2lkIEdMVHJhY2VfZ2xHZXRUZXhHZW54dk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSB7Ci0gICAgR0xNZXNzYWdlIGdsbXNnOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtc2cuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6Z2xHZXRUZXhHZW54dk9FUyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGNvb3JkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29vcmQgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19jb29yZC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb29yZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX2Nvb3JkLT5hZGRfaW50dmFsdWUoKGludCljb29yZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBuYW1lCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfcG5hbWUgPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19wbmFtZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wbmFtZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3BuYW1lLT5hZGRfaW50dmFsdWUoKGludClwbmFtZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHBhcmFtcwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wYXJhbXMtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2ludHZhbHVlKChpbnQpcGFyYW1zKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRUZXhHZW54dk9FUyhjb29yZCwgcG5hbWUsIHBhcmFtcyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBwYXJhbXMsCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZWZJTUcoR0xlbnVtIHAsIGNvbnN0IEdMZmxvYXQgKmVxbikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5lZklNRyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcC0+YWRkX2ludHZhbHVlKChpbnQpcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vxbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Vxbi0+YWRkX2ludHZhbHVlKChpbnQpZXFuKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGlwUGxhbmVmSU1HKHAsIGVxbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBlcW4sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZXhJTUcoR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbikgewotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsQ2xpcFBsYW5leElNRyk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHAKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19wID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfcC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19wLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpFTlVNKTsKLSAgICBhcmdfcC0+YWRkX2ludHZhbHVlKChpbnQpcCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IGVxbgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VxbiA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2Vxbi0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19lcW4tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2Vxbi0+YWRkX2ludHZhbHVlKChpbnQpZXFuKTsKLQotICAgIC8vIGNhbGwgZnVuY3Rpb24KLSAgICBuc2Vjc190IHdhbGxTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCB0aHJlYWRTdGFydFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgZ2xDb250ZXh0LT5ob29rcy0+Z2wuZ2xDbGlwUGxhbmV4SU1HKHAsIGVxbik7Ci0gICAgbnNlY3NfdCB0aHJlYWRFbmRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotICAgIG5zZWNzX3Qgd2FsbEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7Ci0KLSAgICB2b2lkICpwb2ludGVyQXJnc1tdID0gewotICAgICAgICAodm9pZCAqKSBlcW4sCi0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci19Ci0KLQotfTsgLy8gbmFtZXNwYWNlIGdsdHJhY2UKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2FwaS5oIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9hcGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGViY2FjMC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2FwaS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFRISVMgRklMRSBXQVMgR0VORVJBVEVEIEJZIEEgU0NSSVBULiBETyBOT1QgRURJVC4KLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLS8vIERlY2xhcmF0aW9ucyBmb3IgR0wyIEFQSXMKLQotdm9pZCBHTFRyYWNlX2dsQWN0aXZlVGV4dHVyZShHTGVudW0gdGV4dHVyZSk7Ci12b2lkIEdMVHJhY2VfZ2xBdHRhY2hTaGFkZXIoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpOwotdm9pZCBHTFRyYWNlX2dsQmluZEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSk7Ci12b2lkIEdMVHJhY2VfZ2xCaW5kQnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpOwotdm9pZCBHTFRyYWNlX2dsQmluZEZyYW1lYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xCaW5kUmVuZGVyYnVmZmVyKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwotdm9pZCBHTFRyYWNlX2dsQmluZFRleHR1cmUoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOwotdm9pZCBHTFRyYWNlX2dsQmxlbmRDb2xvcihHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xCbGVuZEVxdWF0aW9uKEdMZW51bSBtb2RlKTsKLXZvaWQgR0xUcmFjZV9nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xCbGVuZEZ1bmMoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKLXZvaWQgR0xUcmFjZV9nbEJsZW5kRnVuY1NlcGFyYXRlKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEsIEdMZW51bSB1c2FnZSk7Ci12b2lkIEdMVHJhY2VfZ2xCdWZmZXJTdWJEYXRhKEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotR0xlbnVtIEdMVHJhY2VfZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzKEdMZW51bSB0YXJnZXQpOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXIoR0xiaXRmaWVsZCBtYXNrKTsKLXZvaWQgR0xUcmFjZV9nbENsZWFyQ29sb3IoR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXJEZXB0aGYoR0xjbGFtcGYgZGVwdGgpOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXJTdGVuY2lsKEdMaW50IHMpOwotdm9pZCBHTFRyYWNlX2dsQ29sb3JNYXNrKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xDb21waWxlU2hhZGVyKEdMdWludCBzaGFkZXIpOwotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSk7Ci12b2lkIEdMVHJhY2VfZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotdm9pZCBHTFRyYWNlX2dsQ29weVRleEltYWdlMkQoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7Ci12b2lkIEdMVHJhY2VfZ2xDb3B5VGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotR0x1aW50IEdMVHJhY2VfZ2xDcmVhdGVQcm9ncmFtKHZvaWQpOwotR0x1aW50IEdMVHJhY2VfZ2xDcmVhdGVTaGFkZXIoR0xlbnVtIHR5cGUpOwotdm9pZCBHTFRyYWNlX2dsQ3VsbEZhY2UoR0xlbnVtIG1vZGUpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlQnVmZmVycyhHTHNpemVpIG4sIGNvbnN0IEdMdWludCogYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVGcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIGZyYW1lYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVJlbmRlcmJ1ZmZlcnMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlU2hhZGVyKEdMdWludCBzaGFkZXIpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlVGV4dHVyZXMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHRleHR1cmVzKTsKLXZvaWQgR0xUcmFjZV9nbERlcHRoRnVuYyhHTGVudW0gZnVuYyk7Ci12b2lkIEdMVHJhY2VfZ2xEZXB0aE1hc2soR0xib29sZWFuIGZsYWcpOwotdm9pZCBHTFRyYWNlX2dsRGVwdGhSYW5nZWYoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsRGV0YWNoU2hhZGVyKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKTsKLXZvaWQgR0xUcmFjZV9nbERpc2FibGUoR0xlbnVtIGNhcCk7Ci12b2lkIEdMVHJhY2VfZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoR0x1aW50IGluZGV4KTsKLXZvaWQgR0xUcmFjZV9nbERyYXdBcnJheXMoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKLXZvaWQgR0xUcmFjZV9nbERyYXdFbGVtZW50cyhHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogaW5kaWNlcyk7Ci12b2lkIEdMVHJhY2VfZ2xFbmFibGUoR0xlbnVtIGNhcCk7Ci12b2lkIEdMVHJhY2VfZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShHTHVpbnQgaW5kZXgpOwotdm9pZCBHTFRyYWNlX2dsRmluaXNoKHZvaWQpOwotdm9pZCBHTFRyYWNlX2dsRmx1c2godm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKTsKLXZvaWQgR0xUcmFjZV9nbEZyb250RmFjZShHTGVudW0gbW9kZSk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBidWZmZXJzKTsKLXZvaWQgR0xUcmFjZV9nbEdlbmVyYXRlTWlwbWFwKEdMZW51bSB0YXJnZXQpOwotdm9pZCBHTFRyYWNlX2dsR2VuRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsR2VuUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5UZXh0dXJlcyhHTHNpemVpIG4sIEdMdWludCogdGV4dHVyZXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0QWN0aXZlQXR0cmliKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOwotdm9pZCBHTFRyYWNlX2dsR2V0QWN0aXZlVW5pZm9ybShHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xpbnQqIHNpemUsIEdMZW51bSogdHlwZSwgR0xjaGFyKiBuYW1lKTsKLXZvaWQgR0xUcmFjZV9nbEdldEF0dGFjaGVkU2hhZGVycyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhjb3VudCwgR0xzaXplaSogY291bnQsIEdMdWludCogc2hhZGVycyk7Ci1pbnQgR0xUcmFjZV9nbEdldEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBHTGNoYXIqIG5hbWUpOwotdm9pZCBHTFRyYWNlX2dsR2V0Qm9vbGVhbnYoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4qIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotR0xlbnVtIEdMVHJhY2VfZ2xHZXRFcnJvcih2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbEdldEZsb2F0dihHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQcm9ncmFtaXYoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQcm9ncmFtSW5mb0xvZyhHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVyaXYoR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFNoYWRlckluZm9Mb2coR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCogcmFuZ2UsIEdMaW50KiBwcmVjaXNpb24pOwotdm9pZCBHTFRyYWNlX2dsR2V0U2hhZGVyU291cmNlKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIHNvdXJjZSk7Ci1jb25zdCBHTHVieXRlKiBHTFRyYWNlX2dsR2V0U3RyaW5nKEdMZW51bSBuYW1lKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleFBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleFBhcmFtZXRlcml2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRVbmlmb3JtZnYoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VW5pZm9ybWl2KEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQqIHBhcmFtcyk7Ci1pbnQgR0xUcmFjZV9nbEdldFVuaWZvcm1Mb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKTsKLXZvaWQgR0xUcmFjZV9nbEdldFZlcnRleEF0dHJpYmZ2KEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VmVydGV4QXR0cmliaXYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMdm9pZCoqIHBvaW50ZXIpOwotdm9pZCBHTFRyYWNlX2dsSGludChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzQnVmZmVyKEdMdWludCBidWZmZXIpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc0VuYWJsZWQoR0xlbnVtIGNhcCk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRnJhbWVidWZmZXIoR0x1aW50IGZyYW1lYnVmZmVyKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsSXNSZW5kZXJidWZmZXIoR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzU2hhZGVyKEdMdWludCBzaGFkZXIpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1RleHR1cmUoR0x1aW50IHRleHR1cmUpOwotdm9pZCBHTFRyYWNlX2dsTGluZVdpZHRoKEdMZmxvYXQgd2lkdGgpOwotdm9pZCBHTFRyYWNlX2dsTGlua1Byb2dyYW0oR0x1aW50IHByb2dyYW0pOwotdm9pZCBHTFRyYWNlX2dsUGl4ZWxTdG9yZWkoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xQb2x5Z29uT2Zmc2V0KEdMZmxvYXQgZmFjdG9yLCBHTGZsb2F0IHVuaXRzKTsKLXZvaWQgR0xUcmFjZV9nbFJlYWRQaXhlbHMoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQqIHBpeGVscyk7Ci12b2lkIEdMVHJhY2VfZ2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIodm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsU2FtcGxlQ292ZXJhZ2UoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotdm9pZCBHTFRyYWNlX2dsU2Npc3NvcihHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xTaGFkZXJCaW5hcnkoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHNoYWRlcnMsIEdMZW51bSBiaW5hcnlmb3JtYXQsIGNvbnN0IEdMdm9pZCogYmluYXJ5LCBHTHNpemVpIGxlbmd0aCk7Ci12b2lkIEdMVHJhY2VfZ2xTaGFkZXJTb3VyY2UoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoKTsKLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxGdW5jKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxGdW5jU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxNYXNrKEdMdWludCBtYXNrKTsKLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxNYXNrU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMdWludCBtYXNrKTsKLXZvaWQgR0xUcmFjZV9nbFN0ZW5jaWxPcChHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpOwotdm9pZCBHTFRyYWNlX2dsU3RlbmNpbE9wU2VwYXJhdGUoR0xlbnVtIGZhY2UsIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhJbWFnZTJEKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcmYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcmZ2KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFRleFBhcmFtZXRlcmkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50KiBwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4U3ViSW1hZ2UyRChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMWYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMWZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0xaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtMmYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0yZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpOwotdm9pZCBHTFRyYWNlX2dsVW5pZm9ybTJpKEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0yaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0zZihHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtM2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm0zaShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeik7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtM2l2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtNGYoR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtNGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0KiB2KTsKLXZvaWQgR0xUcmFjZV9nbFVuaWZvcm00aShHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdik7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtTWF0cml4MmZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtTWF0cml4M2Z2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xVbmlmb3JtTWF0cml4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xVc2VQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsKLXZvaWQgR0xUcmFjZV9nbFZhbGlkYXRlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7Ci12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIxZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4KTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjFmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjJmKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSk7Ci12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIyZnYoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7Ci12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIzZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWIzZnYoR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcyk7Ci12b2lkIEdMVHJhY2VfZ2xWZXJ0ZXhBdHRyaWI0ZihHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYjRmdihHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleEF0dHJpYlBvaW50ZXIoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcHRyKTsKLXZvaWQgR0xUcmFjZV9nbFZpZXdwb3J0KEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLQotLy8gRGVjbGFyYXRpb25zIGZvciBHTDJFeHQgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKLXZvaWQgR0xUcmFjZV9nbEVHTEltYWdlVGFyZ2V0UmVuZGVyYnVmZmVyU3RvcmFnZU9FUyhHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKTsKLXZvaWQgR0xUcmFjZV9nbEdldFByb2dyYW1CaW5hcnlPRVMoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGVudW0gKmJpbmFyeUZvcm1hdCwgR0x2b2lkICpiaW5hcnkpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbUJpbmFyeU9FUyhHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCk7Ci12b2lkKiBHTFRyYWNlX2dsTWFwQnVmZmVyT0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xVbm1hcEJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0KTsKLXZvaWQgR0xUcmFjZV9nbEdldEJ1ZmZlclBvaW50ZXJ2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkKiogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFRleEltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKTsKLXZvaWQgR0xUcmFjZV9nbFRleFN1YkltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpOwotdm9pZCBHTFRyYWNlX2dsQ29weVRleFN1YkltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbENvbXByZXNzZWRUZXhJbWFnZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpOwotdm9pZCBHTFRyYWNlX2dsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKTsKLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpOwotdm9pZCBHTFRyYWNlX2dsQmluZFZlcnRleEFycmF5T0VTKEdMdWludCBhcnJheSk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVWZXJ0ZXhBcnJheXNPRVMoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5WZXJ0ZXhBcnJheXNPRVMoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzVmVydGV4QXJyYXlPRVMoR0x1aW50IGFycmF5KTsKLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yR3JvdXBzQU1EKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpOwotdm9pZCBHTFRyYWNlX2dsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRChHTHVpbnQgZ3JvdXAsIEdMaW50ICpudW1Db3VudGVycywgR0xpbnQgKm1heEFjdGl2ZUNvdW50ZXJzLCBHTHNpemVpIGNvdW50ZXJTaXplLCBHTHVpbnQgKmNvdW50ZXJzKTsKLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqY291bnRlclN0cmluZyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1EKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKTsKLXZvaWQgR0xUcmFjZV9nbEdlblBlcmZNb25pdG9yc0FNRChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlUGVyZk1vbml0b3JzQU1EKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyk7Ci12b2lkIEdMVHJhY2VfZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1EKEdMdWludCBtb25pdG9yLCBHTGJvb2xlYW4gZW5hYmxlLCBHTHVpbnQgZ3JvdXAsIEdMaW50IG51bUNvdW50ZXJzLCBHTHVpbnQgKmNvdW50ZXJzTGlzdCk7Ci12b2lkIEdMVHJhY2VfZ2xCZWdpblBlcmZNb25pdG9yQU1EKEdMdWludCBtb25pdG9yKTsKLXZvaWQgR0xUcmFjZV9nbEVuZFBlcmZNb25pdG9yQU1EKEdMdWludCBtb25pdG9yKTsKLXZvaWQgR0xUcmFjZV9nbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQoR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKTsKLXZvaWQgR0xUcmFjZV9nbEJsaXRGcmFtZWJ1ZmZlckFOR0xFKEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKTsKLXZvaWQgR0xUcmFjZV9nbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFOR0xFKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRShHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbExhYmVsT2JqZWN0RVhUKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICpsYWJlbCk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRPYmplY3RMYWJlbEVYVChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqbGFiZWwpOwotdm9pZCBHTFRyYWNlX2dsSW5zZXJ0RXZlbnRNYXJrZXJFWFQoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKTsKLXZvaWQgR0xUcmFjZV9nbFB1c2hHcm91cE1hcmtlckVYVChHTHNpemVpIGxlbmd0aCwgY29uc3QgR0xjaGFyICptYXJrZXIpOwotdm9pZCBHTFRyYWNlX2dsUG9wR3JvdXBNYXJrZXJFWFQodm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cyk7Ci12b2lkIEdMVHJhY2VfZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKTsKLXZvaWQgR0xUcmFjZV9nbE11bHRpRHJhd0FycmF5c0VYVChHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpOwotdm9pZCBHTFRyYWNlX2dsTXVsdGlEcmF3RWxlbWVudHNFWFQoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpOwotdm9pZCBHTFRyYWNlX2dsR2VuUXVlcmllc0VYVChHTHNpemVpIG4sIEdMdWludCAqaWRzKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVF1ZXJpZXNFWFQoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzUXVlcnlFWFQoR0x1aW50IGlkKTsKLXZvaWQgR0xUcmFjZV9nbEJlZ2luUXVlcnlFWFQoR0xlbnVtIHRhcmdldCwgR0x1aW50IGlkKTsKLXZvaWQgR0xUcmFjZV9nbEVuZFF1ZXJ5RVhUKEdMZW51bSB0YXJnZXQpOwotdm9pZCBHTFRyYWNlX2dsR2V0UXVlcnlpdkVYVChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0UXVlcnlPYmplY3R1aXZFWFQoR0x1aW50IGlkLCBHTGVudW0gcG5hbWUsIEdMdWludCAqcGFyYW1zKTsKLUdMZW51bSBHTFRyYWNlX2dsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbFJlYWRuUGl4ZWxzRVhUKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0xzaXplaSBidWZTaXplLCB2b2lkICpkYXRhKTsKLXZvaWQgR0xUcmFjZV9nbEdldG5Vbmlmb3JtZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0blVuaWZvcm1pdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xVc2VQcm9ncmFtU3RhZ2VzRVhUKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKTsKLXZvaWQgR0xUcmFjZV9nbEFjdGl2ZVNoYWRlclByb2dyYW1FWFQoR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSk7Ci1HTHVpbnQgR0xUcmFjZV9nbENyZWF0ZVNoYWRlclByb2dyYW12RVhUKEdMZW51bSB0eXBlLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKipzdHJpbmdzKTsKLXZvaWQgR0xUcmFjZV9nbEJpbmRQcm9ncmFtUGlwZWxpbmVFWFQoR0x1aW50IHBpcGVsaW5lKTsKLXZvaWQgR0xUcmFjZV9nbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnBpcGVsaW5lcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZW5Qcm9ncmFtUGlwZWxpbmVzRVhUKEdMc2l6ZWkgbiwgR0x1aW50ICpwaXBlbGluZXMpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1Byb2dyYW1QaXBlbGluZUVYVChHTHVpbnQgcGlwZWxpbmUpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVBhcmFtZXRlcmlFWFQoR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpOwotdm9pZCBHTFRyYWNlX2dsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQoR0x1aW50IHBpcGVsaW5lLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0xaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0yaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0zaUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm00aUVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0xZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTJmRVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0zZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm00ZkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtMmZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm0zZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhUKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpOwotdm9pZCBHTFRyYWNlX2dsUHJvZ3JhbVVuaWZvcm1NYXRyaXgzZnZFWFQoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSk7Ci12b2lkIEdMVHJhY2VfZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsKLXZvaWQgR0xUcmFjZV9nbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhUKEdMdWludCBwaXBlbGluZSk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhUKEdMdWludCBwaXBlbGluZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZyk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhTdG9yYWdlMURFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhTdG9yYWdlMkRFWFQoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsVGV4U3RvcmFnZTNERVhUKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKTsKLXZvaWQgR0xUcmFjZV9nbFRleHR1cmVTdG9yYWdlMURFWFQoR0x1aW50IHRleHR1cmUsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpOwotdm9pZCBHTFRyYWNlX2dsVGV4dHVyZVN0b3JhZ2UyREVYVChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsVGV4dHVyZVN0b3JhZ2UzREVYVChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpOwotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcyk7Ci12b2lkIEdMVHJhY2VfZ2xDb3ZlcmFnZU1hc2tOVihHTGJvb2xlYW4gbWFzayk7Ci12b2lkIEdMVHJhY2VfZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WKEdMZW51bSBvcGVyYXRpb24pOwotdm9pZCBHTFRyYWNlX2dsRHJhd0J1ZmZlcnNOVihHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcyk7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVGZW5jZXNOVihHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKTsKLXZvaWQgR0xUcmFjZV9nbEdlbkZlbmNlc05WKEdMc2l6ZWkgbiwgR0x1aW50ICpmZW5jZXMpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc0ZlbmNlTlYoR0x1aW50IGZlbmNlKTsKLUdMYm9vbGVhbiBHTFRyYWNlX2dsVGVzdEZlbmNlTlYoR0x1aW50IGZlbmNlKTsKLXZvaWQgR0xUcmFjZV9nbEdldEZlbmNlaXZOVihHTHVpbnQgZmVuY2UsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xGaW5pc2hGZW5jZU5WKEdMdWludCBmZW5jZSk7Ci12b2lkIEdMVHJhY2VfZ2xTZXRGZW5jZU5WKEdMdWludCBmZW5jZSwgR0xlbnVtIGNvbmRpdGlvbik7Ci12b2lkIEdMVHJhY2VfZ2xSZWFkQnVmZmVyTlYoR0xlbnVtIG1vZGUpOwotdm9pZCBHTFRyYWNlX2dsQWxwaGFGdW5jUUNPTShHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKLXZvaWQgR0xUcmFjZV9nbEdldERyaXZlckNvbnRyb2xzUUNPTShHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpOwotdm9pZCBHTFRyYWNlX2dsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00oR0x1aW50IGRyaXZlckNvbnRyb2wsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmRyaXZlckNvbnRyb2xTdHJpbmcpOwotdm9pZCBHTFRyYWNlX2dsRW5hYmxlRHJpdmVyQ29udHJvbFFDT00oR0x1aW50IGRyaXZlckNvbnRyb2wpOwotdm9pZCBHTFRyYWNlX2dsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NKEdMdWludCBkcml2ZXJDb250cm9sKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldFRleHR1cmVzUUNPTShHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldEJ1ZmZlcnNRQ09NKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00oR0x1aW50ICpyZW5kZXJidWZmZXJzLCBHTGludCBtYXhSZW5kZXJidWZmZXJzLCBHTGludCAqbnVtUmVuZGVyYnVmZmVycyk7Ci12b2lkIEdMVHJhY2VfZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NKEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00oR0x1aW50IHRleHR1cmUsIEdMZW51bSBmYWNlLCBHTGludCBsZXZlbCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEV4dFRleE9iamVjdFN0YXRlT3ZlcnJpZGVpUUNPTShHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldFRleFN1YkltYWdlUUNPTShHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscyk7Ci12b2lkIEdMVHJhY2VfZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00oR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldFNoYWRlcnNRQ09NKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpOwotdm9pZCBHTFRyYWNlX2dsRXh0R2V0UHJvZ3JhbXNRQ09NKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpOwotR0xib29sZWFuIEdMVHJhY2VfZ2xFeHRJc1Byb2dyYW1CaW5hcnlRQ09NKEdMdWludCBwcm9ncmFtKTsKLXZvaWQgR0xUcmFjZV9nbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NKEdMdWludCBwcm9ncmFtLCBHTGVudW0gc2hhZGVydHlwZSwgR0xjaGFyICpzb3VyY2UsIEdMaW50ICpsZW5ndGgpOwotdm9pZCBHTFRyYWNlX2dsU3RhcnRUaWxpbmdRQ09NKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayk7Ci12b2lkIEdMVHJhY2VfZ2xFbmRUaWxpbmdRQ09NKEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKTsKLQotLy8gRGVjbGFyYXRpb25zIGZvciBHTDEgQVBJcwotCi12b2lkIEdMVHJhY2VfZ2xBbHBoYUZ1bmMoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZik7Ci12b2lkIEdMVHJhY2VfZ2xDbGlwUGxhbmVmKEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pOwotdm9pZCBHTFRyYWNlX2dsQ29sb3I0ZihHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbEZvZ2YoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbEZvZ2Z2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEZydXN0dW1mKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsR2V0Q2xpcFBsYW5lZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgZXFuWzRdKTsKLXZvaWQgR0xUcmFjZV9nbEdldExpZ2h0ZnYoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRNYXRlcmlhbGZ2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRUZXhFbnZmdihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVsZihHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbGZ2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0ZihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodGZ2KEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsTG9hZE1hdHJpeGYoY29uc3QgR0xmbG9hdCAqbSk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbGYoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbGZ2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xNdWx0TWF0cml4Zihjb25zdCBHTGZsb2F0ICptKTsKLXZvaWQgR0xUcmFjZV9nbE11bHRpVGV4Q29vcmQ0ZihHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEpOwotdm9pZCBHTFRyYWNlX2dsTm9ybWFsM2YoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueik7Ci12b2lkIEdMVHJhY2VfZ2xPcnRob2YoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcmYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyZnYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXplKEdMZmxvYXQgc2l6ZSk7Ci12b2lkIEdMVHJhY2VfZ2xSb3RhdGVmKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdm9pZCBHTFRyYWNlX2dsU2NhbGVmKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOwotdm9pZCBHTFRyYWNlX2dsVGV4RW52ZihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsVGV4RW52ZnYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVHJhbnNsYXRlZihHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLXZvaWQgR0xUcmFjZV9nbEFscGhhRnVuY3goR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZik7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhckNvbG9yeChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xDbGVhckRlcHRoeChHTGNsYW1weCBkZXB0aCk7Ci12b2lkIEdMVHJhY2VfZ2xDbGllbnRBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlKTsKLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZXgoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbik7Ci12b2lkIEdMVHJhY2VfZ2xDb2xvcjR1YihHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbENvbG9yNHgoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xDb2xvclBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdm9pZCBHTFRyYWNlX2dsRGVwdGhSYW5nZXgoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsRGlzYWJsZUNsaWVudFN0YXRlKEdMZW51bSBhcnJheSk7Ci12b2lkIEdMVHJhY2VfZ2xFbmFibGVDbGllbnRTdGF0ZShHTGVudW0gYXJyYXkpOwotdm9pZCBHTFRyYWNlX2dsRm9neChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsRm9neHYoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsRnJ1c3R1bXgoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xHZXRDbGlwUGxhbmV4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pOwotdm9pZCBHTFRyYWNlX2dsR2V0Rml4ZWR2KEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldExpZ2h0eHYoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRNYXRlcmlhbHh2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRQb2ludGVydihHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRUZXhFbnZpdihHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4RW52eHYoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0VGV4UGFyYW1ldGVyeHYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsTGlnaHRNb2RlbHgoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWx4dihHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodHgoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsTGlnaHR4dihHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbExpbmVXaWR0aHgoR0xmaXhlZCB3aWR0aCk7Ci12b2lkIEdMVHJhY2VfZ2xMb2FkSWRlbnRpdHkodm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xMb2FkTWF0cml4eChjb25zdCBHTGZpeGVkICptKTsKLXZvaWQgR0xUcmFjZV9nbExvZ2ljT3AoR0xlbnVtIG9wY29kZSk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHgoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHh2KEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRyaXhNb2RlKEdMZW51bSBtb2RlKTsKLXZvaWQgR0xUcmFjZV9nbE11bHRNYXRyaXh4KGNvbnN0IEdMZml4ZWQgKm0pOwotdm9pZCBHTFRyYWNlX2dsTXVsdGlUZXhDb29yZDR4KEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7Ci12b2lkIEdMVHJhY2VfZ2xOb3JtYWwzeChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKLXZvaWQgR0xUcmFjZV9nbE5vcm1hbFBvaW50ZXIoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdm9pZCBHTFRyYWNlX2dsT3J0aG94KEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRQYXJhbWV0ZXJ4KEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcnh2KEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFBvaW50U2l6ZXgoR0xmaXhlZCBzaXplKTsKLXZvaWQgR0xUcmFjZV9nbFBvbHlnb25PZmZzZXR4KEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKLXZvaWQgR0xUcmFjZV9nbFBvcE1hdHJpeCh2b2lkKTsKLXZvaWQgR0xUcmFjZV9nbFB1c2hNYXRyaXgodm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xSb3RhdGV4KEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotdm9pZCBHTFRyYWNlX2dsU2FtcGxlQ292ZXJhZ2V4KEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KTsKLXZvaWQgR0xUcmFjZV9nbFNjYWxleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLXZvaWQgR0xUcmFjZV9nbFNoYWRlTW9kZWwoR0xlbnVtIG1vZGUpOwotdm9pZCBHTFRyYWNlX2dsVGV4Q29vcmRQb2ludGVyKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKLXZvaWQgR0xUcmFjZV9nbFRleEVudmkoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4KEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4RW52eHYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyeChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsVGV4UGFyYW1ldGVyeHYoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsVHJhbnNsYXRleChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLXZvaWQgR0xUcmFjZV9nbFZlcnRleFBvaW50ZXIoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXplUG9pbnRlck9FUyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci0KLS8vIERlY2xhcmF0aW9ucyBmb3IgR0wxRXh0IEFQSXMKLQotdm9pZCBHTFRyYWNlX2dsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbEJsZW5kRnVuY1NlcGFyYXRlT0VTKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKTsKLXZvaWQgR0xUcmFjZV9nbEJsZW5kRXF1YXRpb25PRVMoR0xlbnVtIG1vZGUpOwotdm9pZCBHTFRyYWNlX2dsRHJhd1RleHNPRVMoR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsRHJhd1RleGlPRVMoR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4eE9FUyhHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCk7Ci12b2lkIEdMVHJhY2VfZ2xEcmF3VGV4c3ZPRVMoY29uc3QgR0xzaG9ydCAqY29vcmRzKTsKLXZvaWQgR0xUcmFjZV9nbERyYXdUZXhpdk9FUyhjb25zdCBHTGludCAqY29vcmRzKTsKLXZvaWQgR0xUcmFjZV9nbERyYXdUZXh4dk9FUyhjb25zdCBHTGZpeGVkICpjb29yZHMpOwotdm9pZCBHTFRyYWNlX2dsRHJhd1RleGZPRVMoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQpOwotdm9pZCBHTFRyYWNlX2dsRHJhd1RleGZ2T0VTKGNvbnN0IEdMZmxvYXQgKmNvb3Jkcyk7Ci12b2lkIEdMVHJhY2VfZ2xBbHBoYUZ1bmN4T0VTKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXJDb2xvcnhPRVMoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXJEZXB0aHhPRVMoR0xjbGFtcHggZGVwdGgpOwotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5leE9FUyhHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKTsKLXZvaWQgR0xUcmFjZV9nbENvbG9yNHhPRVMoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7Ci12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdleE9FUyhHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xGb2d4T0VTKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xGb2d4dk9FUyhHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xGcnVzdHVteE9FUyhHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbEdldENsaXBQbGFuZXhPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIGVxbls0XSk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRGaXhlZHZPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsR2V0TGlnaHR4dk9FUyhHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldE1hdGVyaWFseHZPRVMoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleEVudnh2T0VTKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleFBhcmFtZXRlcnh2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0TW9kZWx4T0VTKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xMaWdodE1vZGVseHZPRVMoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsTGlnaHR4T0VTKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbExpZ2h0eHZPRVMoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xMaW5lV2lkdGh4T0VTKEdMZml4ZWQgd2lkdGgpOwotdm9pZCBHTFRyYWNlX2dsTG9hZE1hdHJpeHhPRVMoY29uc3QgR0xmaXhlZCAqbSk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHhPRVMoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRlcmlhbHh2T0VTKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xNdWx0TWF0cml4eE9FUyhjb25zdCBHTGZpeGVkICptKTsKLXZvaWQgR0xUcmFjZV9nbE11bHRpVGV4Q29vcmQ0eE9FUyhHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOwotdm9pZCBHTFRyYWNlX2dsTm9ybWFsM3hPRVMoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7Ci12b2lkIEdMVHJhY2VfZ2xPcnRob3hPRVMoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xQb2ludFBhcmFtZXRlcnhPRVMoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFBvaW50UGFyYW1ldGVyeHZPRVMoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsUG9pbnRTaXpleE9FUyhHTGZpeGVkIHNpemUpOwotdm9pZCBHTFRyYWNlX2dsUG9seWdvbk9mZnNldHhPRVMoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpOwotdm9pZCBHTFRyYWNlX2dsUm90YXRleE9FUyhHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLXZvaWQgR0xUcmFjZV9nbFNhbXBsZUNvdmVyYWdleE9FUyhHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7Ci12b2lkIEdMVHJhY2VfZ2xTY2FsZXhPRVMoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeik7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhFbnZ4dk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJ4T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhQYXJhbWV0ZXJ4dk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xUcmFuc2xhdGV4T0VTKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOwotR0xib29sZWFuIEdMVHJhY2VfZ2xJc1JlbmRlcmJ1ZmZlck9FUyhHTHVpbnQgcmVuZGVyYnVmZmVyKTsKLXZvaWQgR0xUcmFjZV9nbEJpbmRSZW5kZXJidWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlcik7Ci12b2lkIEdMVHJhY2VfZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKTsKLXZvaWQgR0xUcmFjZV9nbEdlblJlbmRlcmJ1ZmZlcnNPRVMoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLXZvaWQgR0xUcmFjZV9nbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyk7Ci1HTGJvb2xlYW4gR0xUcmFjZV9nbElzRnJhbWVidWZmZXJPRVMoR0x1aW50IGZyYW1lYnVmZmVyKTsKLXZvaWQgR0xUcmFjZV9nbEJpbmRGcmFtZWJ1ZmZlck9FUyhHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIpOwotdm9pZCBHTFRyYWNlX2dsRGVsZXRlRnJhbWVidWZmZXJzT0VTKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotdm9pZCBHTFRyYWNlX2dsR2VuRnJhbWVidWZmZXJzT0VTKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpOwotR0xlbnVtIEdMVHJhY2VfZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTKEdMZW51bSB0YXJnZXQpOwotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpOwotdm9pZCBHTFRyYWNlX2dsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyhHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdlbmVyYXRlTWlwbWFwT0VTKEdMZW51bSB0YXJnZXQpOwotdm9pZCBHTFRyYWNlX2dsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMoR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCk7Ci12b2lkIEdMVHJhY2VfZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVModm9pZCk7Ci12b2lkIEdMVHJhY2VfZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotdm9pZCBHTFRyYWNlX2dsV2VpZ2h0UG9pbnRlck9FUyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTGJpdGZpZWxkIEdMVHJhY2VfZ2xRdWVyeU1hdHJpeHhPRVMoR0xmaXhlZCBtYW50aXNzYVsxNl0sIEdMaW50IGV4cG9uZW50WzE2XSk7Ci12b2lkIEdMVHJhY2VfZ2xEZXB0aFJhbmdlZk9FUyhHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7Ci12b2lkIEdMVHJhY2VfZ2xGcnVzdHVtZk9FUyhHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbE9ydGhvZk9FUyhHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZWZPRVMoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbik7Ci12b2lkIEdMVHJhY2VfZ2xHZXRDbGlwUGxhbmVmT0VTKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pOwotdm9pZCBHTFRyYWNlX2dsQ2xlYXJEZXB0aGZPRVMoR0xjbGFtcGYgZGVwdGgpOwotdm9pZCBHTFRyYWNlX2dsVGV4R2VuZk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci12b2lkIEdMVHJhY2VfZ2xUZXhHZW5mdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFRleEdlbmlPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKLXZvaWQgR0xUcmFjZV9nbFRleEdlbml2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbFRleEdlbnhPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotdm9pZCBHTFRyYWNlX2dsVGV4R2VueHZPRVMoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci12b2lkIEdMVHJhY2VfZ2xHZXRUZXhHZW5mdk9FUyhHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleEdlbml2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKLXZvaWQgR0xUcmFjZV9nbEdldFRleEdlbnh2T0VTKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpOwotdm9pZCBHTFRyYWNlX2dsQ2xpcFBsYW5lZklNRyhHTGVudW0gcCwgY29uc3QgR0xmbG9hdCAqZXFuKTsKLXZvaWQgR0xUcmFjZV9nbENsaXBQbGFuZXhJTUcoR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbik7Ci0KLX07IC8vIG5hbWVzcGFjZSBnbHRyYWNlCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9jb250ZXh0LmNwcCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfY29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZGJiNDMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9jb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAibGlibHpmL2x6Zi5oIgotfQotCi0jaW5jbHVkZSAiZ2x0cmFjZV9jb250ZXh0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdXNpbmcgOjphbmRyb2lkOjpnbF9ob29rc190OwotCi1zdGF0aWMgcHRocmVhZF9rZXlfdCBzVExTS2V5ID0gLTE7Ci1zdGF0aWMgcHRocmVhZF9vbmNlX3Qgc1B0aHJlYWRPbmNlS2V5ID0gUFRIUkVBRF9PTkNFX0lOSVQ7Ci0KLXZvaWQgY3JlYXRlVExTS2V5KCkgewotICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmc1RMU0tleSwgTlVMTCk7Ci19Ci0KLUdMVHJhY2VDb250ZXh0ICpnZXRHTFRyYWNlQ29udGV4dCgpIHsKLSAgICByZXR1cm4gKEdMVHJhY2VDb250ZXh0KikgcHRocmVhZF9nZXRzcGVjaWZpYyhzVExTS2V5KTsKLX0KLQotdm9pZCBzZXRHTFRyYWNlQ29udGV4dChHTFRyYWNlQ29udGV4dCAqYykgewotICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoc1RMU0tleSwgYyk7Ci19Ci0KLXZvaWQgc2V0dXBUcmFjZUNvbnRleHRUaHJlYWRTcGVjaWZpYyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCkgewotICAgIHB0aHJlYWRfb25jZSgmc1B0aHJlYWRPbmNlS2V5LCBjcmVhdGVUTFNLZXkpOwotICAgIHNldEdMVHJhY2VDb250ZXh0KGNvbnRleHQpOwotfQotCi12b2lkIHJlbGVhc2VDb250ZXh0KCkgewotICAgIEdMVHJhY2VDb250ZXh0ICpjID0gZ2V0R0xUcmFjZUNvbnRleHQoKTsKLSAgICBpZiAoYyAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBjOwotICAgICAgICBzZXRHTFRyYWNlQ29udGV4dChOVUxMKTsKLSAgICB9Ci19Ci0KLUdMVHJhY2VTdGF0ZTo6R0xUcmFjZVN0YXRlKFRDUFN0cmVhbSAqc3RyZWFtKSB7Ci0gICAgbVRyYWNlQ29udGV4dElkcyA9IDA7Ci0gICAgbVN0cmVhbSA9IHN0cmVhbTsKLQotICAgIG1Db2xsZWN0RmJPbkVnbFN3YXAgPSBmYWxzZTsKLSAgICBtQ29sbGVjdEZiT25HbERyYXcgPSBmYWxzZTsKLSAgICBtQ29sbGVjdFRleHR1cmVEYXRhT25HbFRleEltYWdlID0gZmFsc2U7Ci0gICAgcHRocmVhZF9yd2xvY2tfaW5pdCgmbVRyYWNlT3B0aW9uc1J3TG9jaywgTlVMTCk7Ci19Ci0KLUdMVHJhY2VTdGF0ZTo6fkdMVHJhY2VTdGF0ZSgpIHsKLSAgICBpZiAobVN0cmVhbSkgewotICAgICAgICBtU3RyZWFtLT5jbG9zZVN0cmVhbSgpOwotICAgICAgICBtU3RyZWFtID0gTlVMTDsKLSAgICB9Ci19Ci0KLVRDUFN0cmVhbSAqR0xUcmFjZVN0YXRlOjpnZXRTdHJlYW0oKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW07Ci19Ci0KLXZvaWQgR0xUcmFjZVN0YXRlOjpzYWZlU2V0VmFsdWUoYm9vbCAqcHRyLCBib29sIHZhbHVlLCBwdGhyZWFkX3J3bG9ja190ICpsb2NrKSB7Ci0gICAgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKGxvY2spOwotICAgICpwdHIgPSB2YWx1ZTsKLSAgICBwdGhyZWFkX3J3bG9ja191bmxvY2sobG9jayk7Ci19Ci0KLWJvb2wgR0xUcmFjZVN0YXRlOjpzYWZlR2V0VmFsdWUoYm9vbCAqcHRyLCBwdGhyZWFkX3J3bG9ja190ICpsb2NrKSB7Ci0gICAgcHRocmVhZF9yd2xvY2tfcmRsb2NrKGxvY2spOwotICAgIGJvb2wgdmFsdWUgPSAqcHRyOwotICAgIHB0aHJlYWRfcndsb2NrX3VubG9jayhsb2NrKTsKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXZvaWQgR0xUcmFjZVN0YXRlOjpzZXRDb2xsZWN0RmJPbkVnbFN3YXAoYm9vbCBlbikgewotICAgIHNhZmVTZXRWYWx1ZSgmbUNvbGxlY3RGYk9uRWdsU3dhcCwgZW4sICZtVHJhY2VPcHRpb25zUndMb2NrKTsKLX0KLQotdm9pZCBHTFRyYWNlU3RhdGU6OnNldENvbGxlY3RGYk9uR2xEcmF3KGJvb2wgZW4pIHsKLSAgICBzYWZlU2V0VmFsdWUoJm1Db2xsZWN0RmJPbkdsRHJhdywgZW4sICZtVHJhY2VPcHRpb25zUndMb2NrKTsKLX0KLQotdm9pZCBHTFRyYWNlU3RhdGU6OnNldENvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZShib29sIGVuKSB7Ci0gICAgc2FmZVNldFZhbHVlKCZtQ29sbGVjdFRleHR1cmVEYXRhT25HbFRleEltYWdlLCBlbiwgJm1UcmFjZU9wdGlvbnNSd0xvY2spOwotfQotCi1ib29sIEdMVHJhY2VTdGF0ZTo6c2hvdWxkQ29sbGVjdEZiT25FZ2xTd2FwKCkgewotICAgIHJldHVybiBzYWZlR2V0VmFsdWUoJm1Db2xsZWN0RmJPbkVnbFN3YXAsICZtVHJhY2VPcHRpb25zUndMb2NrKTsKLX0KLQotYm9vbCBHTFRyYWNlU3RhdGU6OnNob3VsZENvbGxlY3RGYk9uR2xEcmF3KCkgewotICAgIHJldHVybiBzYWZlR2V0VmFsdWUoJm1Db2xsZWN0RmJPbkdsRHJhdywgJm1UcmFjZU9wdGlvbnNSd0xvY2spOwotfQotCi1ib29sIEdMVHJhY2VTdGF0ZTo6c2hvdWxkQ29sbGVjdFRleHR1cmVEYXRhT25HbFRleEltYWdlKCkgewotICAgIHJldHVybiBzYWZlR2V0VmFsdWUoJm1Db2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UsICZtVHJhY2VPcHRpb25zUndMb2NrKTsKLX0KLQotR0xUcmFjZUNvbnRleHQgKkdMVHJhY2VTdGF0ZTo6Y3JlYXRlVHJhY2VDb250ZXh0KGludCB2ZXJzaW9uLCBFR0xDb250ZXh0IGVnbENvbnRleHQpIHsKLSAgICBpbnQgaWQgPSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbVRyYWNlQ29udGV4dElkcywgMSk7Ci0KLSAgICBjb25zdCBzaXplX3QgREVGQVVMVF9CVUZGRVJfU0laRSA9IDgxOTI7Ci0gICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShtU3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLSAgICBHTFRyYWNlQ29udGV4dCAqdHJhY2VDb250ZXh0ID0gbmV3IEdMVHJhY2VDb250ZXh0KGlkLCB0aGlzLCBzdHJlYW0pOwotICAgIG1QZXJDb250ZXh0U3RhdGVbZWdsQ29udGV4dF0gPSB0cmFjZUNvbnRleHQ7Ci0KLSAgICByZXR1cm4gdHJhY2VDb250ZXh0OwotfQotCi1HTFRyYWNlQ29udGV4dCAqR0xUcmFjZVN0YXRlOjpnZXRUcmFjZUNvbnRleHQoRUdMQ29udGV4dCBjKSB7Ci0gICAgcmV0dXJuIG1QZXJDb250ZXh0U3RhdGVbY107Ci19Ci0KLUdMVHJhY2VDb250ZXh0OjpHTFRyYWNlQ29udGV4dChpbnQgaWQsIEdMVHJhY2VTdGF0ZSAqc3RhdGUsIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtICpzdHJlYW0pIDoKLSAgICBtSWQoaWQpLAotICAgIG1TdGF0ZShzdGF0ZSksCi0gICAgbUJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHN0cmVhbSksCi0gICAgbUVsZW1lbnRBcnJheUJ1ZmZlcnMoRGVmYXVsdEtleWVkVmVjdG9yPEdMdWludCwgRWxlbWVudEFycmF5QnVmZmVyKj4oTlVMTCkpCi17Ci0gICAgZmJjb250ZW50cyA9IGZiY29tcHJlc3NlZCA9IE5VTEw7Ci0gICAgZmJjb250ZW50c1NpemUgPSAwOwotfQotCi1pbnQgR0xUcmFjZUNvbnRleHQ6OmdldElkKCkgewotICAgIHJldHVybiBtSWQ7Ci19Ci0KLUdMVHJhY2VTdGF0ZSAqR0xUcmFjZUNvbnRleHQ6OmdldEdsb2JhbFRyYWNlU3RhdGUoKSB7Ci0gICAgcmV0dXJuIG1TdGF0ZTsKLX0KLQotdm9pZCBHTFRyYWNlQ29udGV4dDo6cmVzaXplRkJNZW1vcnkodW5zaWduZWQgbWluU2l6ZSkgewotICAgIGlmIChmYmNvbnRlbnRzU2l6ZSA+PSBtaW5TaXplKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZmJjb250ZW50cyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUoZmJjb250ZW50cyk7Ci0gICAgICAgIGZyZWUoZmJjb21wcmVzc2VkKTsKLSAgICB9Ci0KLSAgICBmYmNvbnRlbnRzID0gbWFsbG9jKG1pblNpemUpOwotICAgIGZiY29tcHJlc3NlZCA9IG1hbGxvYyhtaW5TaXplKTsKLQotICAgIGZiY29udGVudHNTaXplID0gbWluU2l6ZTsKLX0KLQotLyoqIG9idGFpbiBhIHBvaW50ZXIgdG8gdGhlIGNvbXByZXNzZWQgZnJhbWVidWZmZXIgaW1hZ2UgKi8KLXZvaWQgR0xUcmFjZUNvbnRleHQ6OmdldENvbXByZXNzZWRGQih2b2lkICoqZmIsIHVuc2lnbmVkICpmYnNpemUsIHVuc2lnbmVkICpmYndpZHRoLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqZmJoZWlnaHQsIEZCQmluZGluZyBmYlRvUmVhZCkgewotICAgIGludCB2aWV3cG9ydFs0XSA9IHt9OwotICAgIGhvb2tzLT5nbC5nbEdldEludGVnZXJ2KEdMX1ZJRVdQT1JULCB2aWV3cG9ydCk7Ci0gICAgdW5zaWduZWQgZmJDb250ZW50c1NpemUgPSB2aWV3cG9ydFsyXSAqIHZpZXdwb3J0WzNdICogNDsKLQotICAgIHJlc2l6ZUZCTWVtb3J5KGZiQ29udGVudHNTaXplKTsKLQotICAgIC8vIHN3aXRjaCBjdXJyZW50IGZyYW1lYnVmZmVyIGJpbmRpbmcgaWYgbmVjZXNzYXJ5Ci0gICAgR0xpbnQgY3VycmVudEZiID0gLTE7Ci0gICAgYm9vbCBmYlN3aXRjaGVkID0gZmFsc2U7Ci0gICAgaWYgKGZiVG9SZWFkICE9IENVUlJFTlRMWV9CT1VORF9GQikgewotICAgICAgICBob29rcy0+Z2wuZ2xHZXRJbnRlZ2VydihHTF9GUkFNRUJVRkZFUl9CSU5ESU5HLCAmY3VycmVudEZiKTsKLQotICAgICAgICBpZiAoY3VycmVudEZiICE9IDApIHsKLSAgICAgICAgICAgIGhvb2tzLT5nbC5nbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgMCk7Ci0gICAgICAgICAgICBmYlN3aXRjaGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGhvb2tzLT5nbC5nbFJlYWRQaXhlbHModmlld3BvcnRbMF0sIHZpZXdwb3J0WzFdLCB2aWV3cG9ydFsyXSwgdmlld3BvcnRbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgZmJjb250ZW50cyk7Ci0KLSAgICAvLyBzd2l0Y2ggYmFjayB0byBwcmV2aW91c2x5IGJvdW5kIGJ1ZmZlciBpZiBuZWNlc3NhcnkKLSAgICBpZiAoZmJTd2l0Y2hlZCkgewotICAgICAgICBob29rcy0+Z2wuZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGN1cnJlbnRGYik7Ci0gICAgfQotCi0gICAgKmZic2l6ZSA9IGx6Zl9jb21wcmVzcyhmYmNvbnRlbnRzLCBmYkNvbnRlbnRzU2l6ZSwgZmJjb21wcmVzc2VkLCBmYkNvbnRlbnRzU2l6ZSk7Ci0gICAgKmZiID0gZmJjb21wcmVzc2VkOwotICAgICpmYndpZHRoID0gdmlld3BvcnRbMl07Ci0gICAgKmZiaGVpZ2h0ID0gdmlld3BvcnRbM107Ci19Ci0KLXZvaWQgR0xUcmFjZUNvbnRleHQ6OnRyYWNlR0xNZXNzYWdlKEdMTWVzc2FnZSAqbXNnKSB7Ci0gICAgbUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLT5zZW5kKG1zZyk7Ci0KLSAgICBHTE1lc3NhZ2VfRnVuY3Rpb24gZnVuYyA9IG1zZy0+ZnVuY3Rpb24oKTsKLSAgICBpZiAoZnVuYyA9PSBHTE1lc3NhZ2U6OmVnbFN3YXBCdWZmZXJzCi0gICAgICAgIHx8IGZ1bmMgPT0gR0xNZXNzYWdlOjpnbERyYXdBcnJheXMKLSAgICAgICAgfHwgZnVuYyA9PSBHTE1lc3NhZ2U6OmdsRHJhd0VsZW1lbnRzKSB7Ci0gICAgICAgIG1CdWZmZXJlZE91dHB1dFN0cmVhbS0+Zmx1c2goKTsKLSAgICB9Ci19Ci0KLXZvaWQgR0xUcmFjZUNvbnRleHQ6OmJpbmRCdWZmZXIoR0x1aW50IGJ1ZmZlcklkLCBHTHZvaWQgKmRhdGEsIEdMc2l6ZWlwdHIgc2l6ZSkgewotICAgIC8vIGZyZWUgcHJldmlvdXNseSBib3VuZCBidWZmZXIgaWYgYW55Ci0gICAgRWxlbWVudEFycmF5QnVmZmVyICpvbGRCdWZmZXIgPSBtRWxlbWVudEFycmF5QnVmZmVycy52YWx1ZUZvcihidWZmZXJJZCk7Ci0gICAgaWYgKG9sZEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBvbGRCdWZmZXI7Ci0gICAgfQotCi0gICAgbUVsZW1lbnRBcnJheUJ1ZmZlcnMuYWRkKGJ1ZmZlcklkLCBuZXcgRWxlbWVudEFycmF5QnVmZmVyKGRhdGEsIHNpemUpKTsKLX0KLQotdm9pZCBHTFRyYWNlQ29udGV4dDo6Z2V0QnVmZmVyKEdMdWludCBidWZmZXJJZCwgR0x2b2lkICoqZGF0YSwgR0xzaXplaXB0ciAqc2l6ZSkgewotICAgIEVsZW1lbnRBcnJheUJ1ZmZlciAqYnVmZmVyID0gbUVsZW1lbnRBcnJheUJ1ZmZlcnMudmFsdWVGb3IoYnVmZmVySWQpOwotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICAqZGF0YSA9IE5VTEw7Ci0gICAgICAgICpzaXplID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICAqZGF0YSA9IGJ1ZmZlci0+Z2V0QnVmZmVyKCk7Ci0gICAgICAgICpzaXplID0gYnVmZmVyLT5nZXRTaXplKCk7Ci0gICAgfQotfQotCi12b2lkIEdMVHJhY2VDb250ZXh0Ojp1cGRhdGVCdWZmZXJTdWJEYXRhKEdMdWludCBidWZmZXJJZCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpcHRyIHNpemUpIHsKLSAgICBFbGVtZW50QXJyYXlCdWZmZXIgKmJ1ZmZlciA9IG1FbGVtZW50QXJyYXlCdWZmZXJzLnZhbHVlRm9yKGJ1ZmZlcklkKTsKLSAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgYnVmZmVyLT51cGRhdGVTdWJCdWZmZXIob2Zmc2V0LCBkYXRhLCBzaXplKTsKLSAgICB9Ci19Ci0KLXZvaWQgR0xUcmFjZUNvbnRleHQ6OmRlbGV0ZUJ1ZmZlcihHTHVpbnQgYnVmZmVySWQpIHsKLSAgICBFbGVtZW50QXJyYXlCdWZmZXIgKmJ1ZmZlciA9IG1FbGVtZW50QXJyYXlCdWZmZXJzLnZhbHVlRm9yKGJ1ZmZlcklkKTsKLSAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKLSAgICAgICAgbUVsZW1lbnRBcnJheUJ1ZmZlcnMucmVtb3ZlSXRlbShidWZmZXJJZCk7Ci0gICAgfQotfQotCi1FbGVtZW50QXJyYXlCdWZmZXI6OkVsZW1lbnRBcnJheUJ1ZmZlcihHTHZvaWQgKmJ1ZiwgR0xzaXplaXB0ciBzaXplKSB7Ci0gICAgbUJ1ZiA9IG1hbGxvYyhzaXplKTsKLSAgICBtU2l6ZSA9IHNpemU7Ci0KLSAgICBpZiAoYnVmICE9IE5VTEwpIHsKLSAgICAgICAgbWVtY3B5KG1CdWYsIGJ1Ziwgc2l6ZSk7Ci0gICAgfQotfQotCi1FbGVtZW50QXJyYXlCdWZmZXI6On5FbGVtZW50QXJyYXlCdWZmZXIoKSB7Ci0gICAgaWYgKG1CdWYgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1CdWYpOwotICAgICAgICBtU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgbUJ1ZiA9IE5VTEw7Ci19Ci0KLXZvaWQgRWxlbWVudEFycmF5QnVmZmVyOjp1cGRhdGVTdWJCdWZmZXIoR0xpbnRwdHIgb2Zmc2V0LCBjb25zdCBHTHZvaWQqIGRhdGEsIEdMc2l6ZWlwdHIgc2l6ZSkgewotICAgIGlmIChvZmZzZXQgKyBzaXplIDw9IG1TaXplKSB7Ci0gICAgICAgIG1lbWNweSgoY2hhciopbUJ1ZiArIG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotfQotCi1HTHZvaWQgKkVsZW1lbnRBcnJheUJ1ZmZlcjo6Z2V0QnVmZmVyKCkgewotICAgIHJldHVybiBtQnVmOwotfQotCi1HTHNpemVpcHRyIEVsZW1lbnRBcnJheUJ1ZmZlcjo6Z2V0U2l6ZSgpIHsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBnbHRyYWNlCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9jb250ZXh0LmggYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzY2ZkYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fR0xUUkFDRV9DT05URVhUX0hfCi0jZGVmaW5lIF9fR0xUUkFDRV9DT05URVhUX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLSNpbmNsdWRlICJob29rcy5oIgotI2luY2x1ZGUgImdsdHJhY2VfdHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdXNpbmcgOjphbmRyb2lkOjpnbF9ob29rc190OwotCi1lbnVtIEZCQmluZGluZyB7Q1VSUkVOVExZX0JPVU5EX0ZCLCBGQjB9OwotCi1jbGFzcyBHTFRyYWNlU3RhdGU7Ci0KLWNsYXNzIEVsZW1lbnRBcnJheUJ1ZmZlciB7Ci0gICAgR0x2b2lkICptQnVmOwotICAgIEdMc2l6ZWlwdHIgbVNpemU7Ci0KLXB1YmxpYzoKLSAgICBFbGVtZW50QXJyYXlCdWZmZXIoKTptQnVmKE5VTEwpLCBtU2l6ZSgwKSB7fQotICAgIEVsZW1lbnRBcnJheUJ1ZmZlcihHTHZvaWQgKmJ1ZiwgR0xzaXplaXB0ciBzaXplKTsKLSAgICB+RWxlbWVudEFycmF5QnVmZmVyKCk7Ci0KLSAgICB2b2lkIHVwZGF0ZVN1YkJ1ZmZlcihHTGludHB0ciBvZmZzZXQsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xzaXplaXB0ciBzaXplKTsKLSAgICBHTHZvaWQgKmdldEJ1ZmZlcigpOwotICAgIEdMc2l6ZWlwdHIgZ2V0U2l6ZSgpOwotfTsKLQotLyoqIEdMIFRyYWNlIENvbnRleHQgaW5mbyBhc3NvY2lhdGVkIHdpdGggZWFjaCBFR0xDb250ZXh0ICovCi1jbGFzcyBHTFRyYWNlQ29udGV4dCB7Ci0gICAgaW50IG1JZDsgICAgICAgICAgICAgICAgICAgIC8qIHVuaXF1ZSBjb250ZXh0IGlkICovCi0gICAgR0xUcmFjZVN0YXRlICptU3RhdGU7ICAgICAgIC8qIHBhcmVudCBHTCBUcmFjZSBzdGF0ZSAoZm9yIHBlciBwcm9jZXNzIEdMIFRyYWNlIFN0YXRlIEluZm8pICovCi0KLSAgICB2b2lkICpmYmNvbnRlbnRzOyAgICAgICAgICAgLyogbWVtb3J5IGFyZWEgdG8gcmVhZCBmcmFtZWJ1ZmZlciBjb250ZW50cyAqLwotICAgIHZvaWQgKmZiY29tcHJlc3NlZDsgICAgICAgICAvKiBkZXN0aW5hdGlvbiBmb3IgbHpmIGNvbXByZXNzZWQgZnJhbWVidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBmYmNvbnRlbnRzU2l6ZTsgICAgLyogc2l6ZSBvZiBmYmNvbnRlbnRzICYgZmJjb21wcmVzc2VkIGJ1ZmZlcnMgKi8KLQotICAgIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtICptQnVmZmVyZWRPdXRwdXRTdHJlYW07IC8qIHN0cmVhbSB3aGVyZSB0cmFjZSBpbmZvIGlzIHNlbnQgKi8KLQotICAgIC8qIGxpc3Qgb2YgZWxlbWVudCBhcnJheSBidWZmZXJzIGluIHVzZS4gKi8KLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8R0x1aW50LCBFbGVtZW50QXJyYXlCdWZmZXIqPiBtRWxlbWVudEFycmF5QnVmZmVyczsKLQotICAgIHZvaWQgcmVzaXplRkJNZW1vcnkodW5zaWduZWQgbWluU2l6ZSk7Ci1wdWJsaWM6Ci0gICAgZ2xfaG9va3NfdCAqaG9va3M7Ci0KLSAgICBHTFRyYWNlQ29udGV4dChpbnQgaWQsIEdMVHJhY2VTdGF0ZSAqc3RhdGUsIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtICpzdHJlYW0pOwotICAgIGludCBnZXRJZCgpOwotICAgIEdMVHJhY2VTdGF0ZSAqZ2V0R2xvYmFsVHJhY2VTdGF0ZSgpOwotICAgIHZvaWQgZ2V0Q29tcHJlc3NlZEZCKHZvaWQgKipmYiwgdW5zaWduZWQgKmZic2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqZmJ3aWR0aCwgdW5zaWduZWQgKmZiaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCQmluZGluZyBmYlRvUmVhZCk7Ci0KLSAgICAvLyBNZXRob2RzIHRvIHdvcmsgd2l0aCBlbGVtZW50IGFycmF5IGJ1ZmZlcnMKLSAgICB2b2lkIGJpbmRCdWZmZXIoR0x1aW50IGJ1ZmZlcklkLCBHTHZvaWQgKmRhdGEsIEdMc2l6ZWlwdHIgc2l6ZSk7Ci0gICAgdm9pZCBnZXRCdWZmZXIoR0x1aW50IGJ1ZmZlcklkLCBHTHZvaWQgKipkYXRhLCBHTHNpemVpcHRyICpzaXplKTsKLSAgICB2b2lkIHVwZGF0ZUJ1ZmZlclN1YkRhdGEoR0x1aW50IGJ1ZmZlcklkLCBHTGludHB0ciBvZmZzZXQsIEdMdm9pZCAqZGF0YSwgR0xzaXplaXB0ciBzaXplKTsKLSAgICB2b2lkIGRlbGV0ZUJ1ZmZlcihHTHVpbnQgYnVmZmVySWQpOwotCi0gICAgdm9pZCB0cmFjZUdMTWVzc2FnZShHTE1lc3NhZ2UgKm1zZyk7Ci19OwotCi0vKiogUGVyIHByb2Nlc3MgdHJhY2Ugc3RhdGUuICovCi1jbGFzcyBHTFRyYWNlU3RhdGUgewotICAgIGludCBtVHJhY2VDb250ZXh0SWRzOwotICAgIFRDUFN0cmVhbSAqbVN0cmVhbTsKLSAgICBzdGQ6Om1hcDxFR0xDb250ZXh0LCBHTFRyYWNlQ29udGV4dCo+IG1QZXJDb250ZXh0U3RhdGU7Ci0KLSAgICAvKiBPcHRpb25zIGNvbnRyb2xsaW5nIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBjb2xsZWN0ZWQgb24KLSAgICAgICBjZXJ0YWluIHRyYWNlIGNhbGxzLiAqLwotICAgIGJvb2wgbUNvbGxlY3RGYk9uRWdsU3dhcDsKLSAgICBib29sIG1Db2xsZWN0RmJPbkdsRHJhdzsKLSAgICBib29sIG1Db2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2U7Ci0gICAgcHRocmVhZF9yd2xvY2tfdCBtVHJhY2VPcHRpb25zUndMb2NrOwotCi0gICAgLyogaGVscGVyIG1ldGhvZHMgdG8gZ2V0L3NldCB2YWx1ZXMgdXNpbmcgcHJvdmlkZWQgbG9jayBmb3IgbXV0dWFsIGV4Y2x1c2lvbi4gKi8KLSAgICB2b2lkIHNhZmVTZXRWYWx1ZShib29sICpwdHIsIGJvb2wgdmFsdWUsIHB0aHJlYWRfcndsb2NrX3QgKmxvY2spOwotICAgIGJvb2wgc2FmZUdldFZhbHVlKGJvb2wgKnB0ciwgcHRocmVhZF9yd2xvY2tfdCAqbG9jayk7Ci1wdWJsaWM6Ci0gICAgR0xUcmFjZVN0YXRlKFRDUFN0cmVhbSAqc3RyZWFtKTsKLSAgICB+R0xUcmFjZVN0YXRlKCk7Ci0KLSAgICBHTFRyYWNlQ29udGV4dCAqY3JlYXRlVHJhY2VDb250ZXh0KGludCB2ZXJzaW9uLCBFR0xDb250ZXh0IGMpOwotICAgIEdMVHJhY2VDb250ZXh0ICpnZXRUcmFjZUNvbnRleHQoRUdMQ29udGV4dCBjKTsKLQotICAgIFRDUFN0cmVhbSAqZ2V0U3RyZWFtKCk7Ci0KLSAgICAvKiBNZXRob2RzIHRvIHNldCB0cmFjZSBvcHRpb25zLiAqLwotICAgIHZvaWQgc2V0Q29sbGVjdEZiT25FZ2xTd2FwKGJvb2wgZW4pOwotICAgIHZvaWQgc2V0Q29sbGVjdEZiT25HbERyYXcoYm9vbCBlbik7Ci0gICAgdm9pZCBzZXRDb2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UoYm9vbCBlbik7Ci0KLSAgICAvKiBNZXRob2RzIHRvIHJldHJpZXZlIHRyYWNlIG9wdGlvbnMuICovCi0gICAgYm9vbCBzaG91bGRDb2xsZWN0RmJPbkVnbFN3YXAoKTsKLSAgICBib29sIHNob3VsZENvbGxlY3RGYk9uR2xEcmF3KCk7Ci0gICAgYm9vbCBzaG91bGRDb2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UoKTsKLX07Ci0KLXZvaWQgc2V0dXBUcmFjZUNvbnRleHRUaHJlYWRTcGVjaWZpYyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCk7Ci1HTFRyYWNlQ29udGV4dCAqZ2V0R0xUcmFjZUNvbnRleHQoKTsKLXZvaWQgcmVsZWFzZUNvbnRleHQoKTsKLQotfTsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9lZ2wuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9lZ2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDE2ODJhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZWdsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlICJnbHRyYWNlLnBiLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9jb250ZXh0LmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9maXh1cC5oIgotI2luY2x1ZGUgImdsdHJhY2VfdHJhbnNwb3J0LmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotdm9pZCBHTFRyYWNlX2VnbENyZWF0ZUNvbnRleHQoaW50IHZlcnNpb24sIGludCBjb250ZXh0SWQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtZXNzYWdlOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtZXNzYWdlLnNldF9jb250ZXh0X2lkKGNvbnRleHRJZCk7Ci0gICAgZ2xtZXNzYWdlLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmVnbENyZWF0ZUNvbnRleHQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB2ZXJzaW9uCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdmVyc2lvbiA9IGdsbWVzc2FnZS5hZGRfYXJncygpOwotICAgIGFyZ192ZXJzaW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX3ZlcnNpb24tPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3ZlcnNpb24tPmFkZF9pbnR2YWx1ZSh2ZXJzaW9uKTsKLQotICAgIC8vIGNvcHkgYXJndW1lbnQgY29udGV4dAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2NvbnRleHQgPSBnbG1lc3NhZ2UuYWRkX2FyZ3MoKTsKLSAgICBhcmdfY29udGV4dC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19jb250ZXh0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19jb250ZXh0LT5hZGRfaW50dmFsdWUoY29udGV4dElkKTsKLQotICAgIC8vIHNldCBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbgotICAgIGdsbWVzc2FnZS5zZXRfc3RhcnRfdGltZShzeXN0ZW1UaW1lKCkpOwotICAgIGdsbWVzc2FnZS5zZXRfZHVyYXRpb24oMCk7Ci0KLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1lc3NhZ2UpOwotfQotCi12b2lkIEdMVHJhY2VfZWdsTWFrZUN1cnJlbnQoaW50IGNvbnRleHRJZCkgewotICAgIEdMTWVzc2FnZSBnbG1lc3NhZ2U7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1lc3NhZ2Uuc2V0X2NvbnRleHRfaWQoY29udGV4dElkKTsKLSAgICBnbG1lc3NhZ2Uuc2V0X2Z1bmN0aW9uKEdMTWVzc2FnZTo6ZWdsTWFrZUN1cnJlbnQpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBjb250ZXh0Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfY29udGV4dCA9IGdsbWVzc2FnZS5hZGRfYXJncygpOwotICAgIGFyZ19jb250ZXh0LT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2NvbnRleHQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX2NvbnRleHQtPmFkZF9pbnR2YWx1ZShjb250ZXh0SWQpOwotCi0gICAgLy8gc2V0IHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uCi0gICAgZ2xtZXNzYWdlLnNldF9zdGFydF90aW1lKHN5c3RlbVRpbWUoKSk7Ci0gICAgZ2xtZXNzYWdlLnNldF9kdXJhdGlvbigwKTsKLQotICAgIGdsQ29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbWVzc2FnZSk7Ci19Ci0KLXZvaWQgR0xUcmFjZV9lZ2xTd2FwQnVmZmVycyh2b2lkICpkcHksIHZvaWQgKmRyYXcpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtZXNzYWdlOwotICAgIEdMVHJhY2VDb250ZXh0ICpnbENvbnRleHQgPSBnZXRHTFRyYWNlQ29udGV4dCgpOwotCi0gICAgZ2xtZXNzYWdlLnNldF9jb250ZXh0X2lkKGdsQ29udGV4dC0+Z2V0SWQoKSk7Ci0gICAgZ2xtZXNzYWdlLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmVnbFN3YXBCdWZmZXJzKTsKLQotICAgIGlmIChnbENvbnRleHQtPmdldEdsb2JhbFRyYWNlU3RhdGUoKS0+c2hvdWxkQ29sbGVjdEZiT25FZ2xTd2FwKCkpIHsKLSAgICAgICAgLy8gcmVhZCBGQjAgc2luY2UgdGhhdCBpcyB3aGF0IGlzIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuCi0gICAgICAgIGZpeHVwX2FkZEZCQ29udGVudHMoZ2xDb250ZXh0LCAmZ2xtZXNzYWdlLCBGQjApOwotICAgIH0KLQotICAgIC8vIHNldCBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbgotICAgIGdsbWVzc2FnZS5zZXRfc3RhcnRfdGltZShzeXN0ZW1UaW1lKCkpOwotICAgIGdsbWVzc2FnZS5zZXRfZHVyYXRpb24oMCk7Ci0KLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1lc3NhZ2UpOwotfQotCi19OwotfTsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZWdsLmggYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2VnbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY4NGM1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fR0xUUkFDRV9FR0xfSF8KLSNkZWZpbmUgX19HTFRSQUNFX0VHTF9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLXZvaWQgR0xUcmFjZV9lZ2xDcmVhdGVDb250ZXh0KGludCB2ZXJzaW9uLCBpbnQgY29udGV4dElkKTsKLXZvaWQgR0xUcmFjZV9lZ2xNYWtlQ3VycmVudChpbnQgY29udGV4dElkKTsKLXZvaWQgR0xUcmFjZV9lZ2xTd2FwQnVmZmVycyh2b2lkICpkcHksIHZvaWQgKmRyYXcpOwotCi19OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2VnbGFwaS5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2VnbGFwaS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NDIxNTMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9lZ2xhcGkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgImhvb2tzLmgiCi0jaW5jbHVkZSAiZ2xlc3RyYWNlLmgiCi0KLSNpbmNsdWRlICJnbHRyYWNlX2NvbnRleHQuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2VnbC5oIgotI2luY2x1ZGUgImdsdHJhY2VfaG9va3MuaCIKLSNpbmNsdWRlICJnbHRyYWNlX3RyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIGdsdHJhY2U6OkdMVHJhY2VTdGF0ZTsKLXVzaW5nIGdsdHJhY2U6OkdMVHJhY2VDb250ZXh0OwotdXNpbmcgZ2x0cmFjZTo6VENQU3RyZWFtOwotCi1zdGF0aWMgR0xUcmFjZVN0YXRlICpzR0xUcmFjZVN0YXRlOwotc3RhdGljIHB0aHJlYWRfdCBzUmVjZWl2ZVRocmVhZElkOwotCi0vKioKLSAqIFRhc2sgdGhhdCBtb25pdG9ycyB0aGUgY29udHJvbCBzdHJlYW0gZnJvbSB0aGUgaG9zdCBhbmQgdXBkYXRlcwotICogdGhlIHRyYWNlIHN0YXR1cyBhY2NvcmRpbmcgdG8gY29tbWFuZHMgcmVjZWl2ZWQgZnJvbSB0aGUgaG9zdC4KLSAqLwotc3RhdGljIHZvaWQgKmNvbW1hbmRSZWNlaXZlVGFzayh2b2lkICphcmcpIHsKLSAgICBHTFRyYWNlU3RhdGUgKnN0YXRlID0gKEdMVHJhY2VTdGF0ZSAqKWFyZzsKLSAgICBUQ1BTdHJlYW0gKnN0cmVhbSA9IHN0YXRlLT5nZXRTdHJlYW0oKTsKLQotICAgIC8vIEN1cnJlbnRseSwgdGhlcmUgYXJlIHZlcnkgZmV3IHVzZXIgY29uZmlndXJhYmxlIHNldHRpbmdzLgotICAgIC8vIEFzIGEgcmVzdWx0LCB0aGV5IGNhbiBiZSBlbmNvZGVkIGluIGEgc2luZ2xlIGludGVnZXIuCi0gICAgaW50IGNtZDsKLSAgICBlbnVtIFRyYWNlU2V0dGluZ3NNYXNrcyB7Ci0gICAgICAgIFJFQURfRkJfT05fRUdMU1dBUF9NQVNLID0gMSA8PCAwLAotICAgICAgICBSRUFEX0ZCX09OX0dMRFJBV19NQVNLID0gMSA8PCAxLAotICAgICAgICBSRUFEX1RFWFRVUkVfREFUQV9PTl9HTFRFWElNQUdFX01BU0sgPSAxIDw8IDIsCi0gICAgfTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCBuID0gc3RyZWFtLT5yZWNlaXZlKCZjbWQsIDQpOwotICAgICAgICBpZiAobiAhPSA0KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNtZCA9IG50b2hsKGNtZCk7Ci0KLSAgICAgICAgYm9vbCBjb2xsZWN0RmJPbkVnbFN3YXAgPSAoY21kICYgUkVBRF9GQl9PTl9FR0xTV0FQX01BU0spICE9IDA7Ci0gICAgICAgIGJvb2wgY29sbGVjdEZiT25HbERyYXcgPSAoY21kICYgUkVBRF9GQl9PTl9HTERSQVdfTUFTSykgIT0gMDsKLSAgICAgICAgYm9vbCBjb2xsZWN0VGV4dHVyZURhdGEgPSAoY21kICYgUkVBRF9URVhUVVJFX0RBVEFfT05fR0xURVhJTUFHRV9NQVNLKSAhPSAwOwotCi0gICAgICAgIHN0YXRlLT5zZXRDb2xsZWN0RmJPbkVnbFN3YXAoY29sbGVjdEZiT25FZ2xTd2FwKTsKLSAgICAgICAgc3RhdGUtPnNldENvbGxlY3RGYk9uR2xEcmF3KGNvbGxlY3RGYk9uR2xEcmF3KTsKLSAgICAgICAgc3RhdGUtPnNldENvbGxlY3RUZXh0dXJlRGF0YU9uR2xUZXhJbWFnZShjb2xsZWN0VGV4dHVyZURhdGEpOwotCi0gICAgICAgIEFMT0dEKCJ0cmFjZSBvcHRpb25zOiBlZ2xzd2FwOiAlZCwgZ2xkcmF3OiAlZCwgdGV4SW1hZ2U6ICVkIiwKLSAgICAgICAgICAgIGNvbGxlY3RGYk9uRWdsU3dhcCwgY29sbGVjdEZiT25HbERyYXcsIGNvbGxlY3RUZXh0dXJlRGF0YSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgR0xUcmFjZV9zdGFydCgpIHsKLSAgICBjaGFyIHVkc05hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLQotICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLmRlYnVnX3BvcnRuYW1lIiwgdWRzTmFtZSwgImdsdHJhY2UiKTsKLSAgICBpbnQgY2xpZW50U29ja2V0ID0gZ2x0cmFjZTo6YWNjZXB0Q2xpZW50Q29ubmVjdGlvbih1ZHNOYW1lKTsKLSAgICBpZiAoY2xpZW50U29ja2V0IDwgMCkgewotICAgICAgICBBTE9HRSgiRXJyb3IgY3JlYXRpbmcgR0xUcmFjZSBzZXJ2ZXIgc29ja2V0LiBRdWl0dGluZyBhcHBsaWNhdGlvbi4iKTsKLSAgICAgICAgZXhpdCgtMSk7Ci0gICAgfQotCi0gICAgLy8gY3JlYXRlIGNvbW11bmljYXRpb24gY2hhbm5lbCB0byB0aGUgaG9zdAotICAgIFRDUFN0cmVhbSAqc3RyZWFtID0gbmV3IFRDUFN0cmVhbShjbGllbnRTb2NrZXQpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSB0cmFjaW5nIHN0YXRlCi0gICAgc0dMVHJhY2VTdGF0ZSA9IG5ldyBHTFRyYWNlU3RhdGUoc3RyZWFtKTsKLQotICAgIHB0aHJlYWRfY3JlYXRlKCZzUmVjZWl2ZVRocmVhZElkLCBOVUxMLCBjb21tYW5kUmVjZWl2ZVRhc2ssIHNHTFRyYWNlU3RhdGUpOwotfQotCi12b2lkIEdMVHJhY2Vfc3RvcCgpIHsKLSAgICBkZWxldGUgc0dMVHJhY2VTdGF0ZTsKLSAgICBzR0xUcmFjZVN0YXRlID0gTlVMTDsKLX0KLQotdm9pZCBHTFRyYWNlX2VnbENyZWF0ZUNvbnRleHQoaW50IHZlcnNpb24sIEVHTENvbnRleHQgYykgewotICAgIC8vIHVwZGF0ZSB0cmFjZSBzdGF0ZSBmb3IgbmV3IEVHTCBjb250ZXh0Ci0gICAgR0xUcmFjZUNvbnRleHQgKnRyYWNlQ29udGV4dCA9IHNHTFRyYWNlU3RhdGUtPmNyZWF0ZVRyYWNlQ29udGV4dCh2ZXJzaW9uLCBjKTsKLSAgICBnbHRyYWNlOjpzZXR1cFRyYWNlQ29udGV4dFRocmVhZFNwZWNpZmljKHRyYWNlQ29udGV4dCk7Ci0KLSAgICAvLyB0cmFjZSBjb21tYW5kIHRocm91Z2ggdG8gdGhlIGhvc3QKLSAgICBnbHRyYWNlOjpHTFRyYWNlX2VnbENyZWF0ZUNvbnRleHQodmVyc2lvbiwgdHJhY2VDb250ZXh0LT5nZXRJZCgpKTsKLX0KLQotdm9pZCBHTFRyYWNlX2VnbE1ha2VDdXJyZW50KGNvbnN0IHVuc2lnbmVkIHZlcnNpb24sIGdsX2hvb2tzX3QgKmhvb2tzLCBFR0xDb250ZXh0IGMpIHsKLSAgICAvLyBzZXR1cCBwZXIgY29udGV4dCBzdGF0ZQotICAgIEdMVHJhY2VDb250ZXh0ICp0cmFjZUNvbnRleHQgPSBzR0xUcmFjZVN0YXRlLT5nZXRUcmFjZUNvbnRleHQoYyk7Ci0gICAgdHJhY2VDb250ZXh0LT5ob29rcyA9IGhvb2tzOwotICAgIGdsdHJhY2U6OnNldHVwVHJhY2VDb250ZXh0VGhyZWFkU3BlY2lmaWModHJhY2VDb250ZXh0KTsKLQotICAgIC8vIHRyYWNlIGNvbW1hbmQgdGhyb3VnaCB0byB0aGUgaG9zdAotICAgIGdsdHJhY2U6OkdMVHJhY2VfZWdsTWFrZUN1cnJlbnQodHJhY2VDb250ZXh0LT5nZXRJZCgpKTsKLX0KLQotdm9pZCBHTFRyYWNlX2VnbFJlbGVhc2VUaHJlYWQoKSB7Ci0gICAgZ2x0cmFjZTo6cmVsZWFzZUNvbnRleHQoKTsKLX0KLQotdm9pZCBHTFRyYWNlX2VnbFN3YXBCdWZmZXJzKHZvaWQgKmRweSwgdm9pZCAqZHJhdykgewotICAgIGdsdHJhY2U6OkdMVHJhY2VfZWdsU3dhcEJ1ZmZlcnMoZHB5LCBkcmF3KTsKLX0KLQotZ2xfaG9va3NfdCAqR0xUcmFjZV9nZXRHTEhvb2tzKCkgewotICAgIHJldHVybiBnbHRyYWNlOjpnZXRHTEhvb2tzKCk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZml4dXAuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9maXh1cC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTdiMjYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9maXh1cC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDExLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSAiZ2x0cmFjZS5wYi5oIgotI2luY2x1ZGUgImdsdHJhY2VfYXBpLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9jb250ZXh0LmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9maXh1cC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLXVuc2lnbmVkIGdldEJ5dGVzUGVyVGV4ZWwoY29uc3QgR0xlbnVtIGZvcm1hdCwgY29uc3QgR0xlbnVtIHR5cGUpIHsKLSAgICAvKgotICAgIERlc2NyaXB0aW9uIGZyb20gZ2xUZXhJbWFnZTJEIHNwZWM6Ci0KLSAgICBEYXRhIGlzIHJlYWQgZnJvbSBkYXRhIGFzIGEgc2VxdWVuY2Ugb2YgdW5zaWduZWQgYnl0ZXMgb3Igc2hvcnRzLCBkZXBlbmRpbmcgb24gdHlwZS4KLSAgICBXaGVuIHR5cGUgaXMgR0xfVU5TSUdORURfQllURSwgZWFjaCBvZiB0aGUgYnl0ZXMgaXMgaW50ZXJwcmV0ZWQgYXMgb25lIGNvbG9yIGNvbXBvbmVudC4KLSAgICBXaGVuIHR5cGUgaXMgb25lIG9mIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCBvcgotICAgIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIGVhY2ggdW5zaWduZWQgc2hvcnQgdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgY29udGFpbmluZyBhbGwKLSAgICB0aGUgY29tcG9uZW50cyBmb3IgYSBzaW5nbGUgdGV4ZWwsIHdpdGggdGhlIGNvbG9yIGNvbXBvbmVudHMgYXJyYW5nZWQgYWNjb3JkaW5nIHRvCi0gICAgZm9ybWF0LiBDb2xvciBjb21wb25lbnRzIGFyZSB0cmVhdGVkIGFzIGdyb3VwcyBvZiBvbmUsIHR3bywgdGhyZWUsIG9yIGZvdXIgdmFsdWVzLAotICAgIGFnYWluIGJhc2VkIG9uIGZvcm1hdC4gR3JvdXBzIG9mIGNvbXBvbmVudHMgYXJlIHJlZmVycmVkIHRvIGFzIHRleGVscy4KLQotICAgIHdpZHRoIMOXIGhlaWdodCB0ZXhlbHMgYXJlIHJlYWQgZnJvbSBtZW1vcnksIHN0YXJ0aW5nIGF0IGxvY2F0aW9uIGRhdGEuIEJ5IGRlZmF1bHQsCi0gICAgdGhlc2UgdGV4ZWxzIGFyZSB0YWtlbiBmcm9tIGFkamFjZW50IG1lbW9yeSBsb2NhdGlvbnMsIGV4Y2VwdCB0aGF0IGFmdGVyIGFsbCB3aWR0aAotICAgIHRleGVscyBhcmUgcmVhZCwgdGhlIHJlYWQgcG9pbnRlciBpcyBhZHZhbmNlZCB0byB0aGUgbmV4dCBmb3VyLWJ5dGUgYm91bmRhcnkuCi0gICAgVGhlIGZvdXItYnl0ZSByb3cgYWxpZ25tZW50IGlzIHNwZWNpZmllZCBieSBnbFBpeGVsU3RvcmVpIHdpdGggYXJndW1lbnQKLSAgICBHTF9VTlBBQ0tfQUxJR05NRU5ULCBhbmQgaXQgY2FuIGJlIHNldCB0byBvbmUsIHR3bywgZm91ciwgb3IgZWlnaHQgYnl0ZXMuCi0gICAgKi8KLQotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV82XzU6Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80OgotICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMToKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiR2V0Qnl0ZXNQZXJQaXhlbDogdW5rbm93biB0eXBlICV4IiwgdHlwZSk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEdMX0FMUEhBOgotICAgIGNhc2UgR0xfTFVNSU5BTkNFOgotICAgICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEdMX0xVTUlOQU5DRV9BTFBIQToKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBHTF9SR0I6Ci0gICAgICAgIHJldHVybiAzOwotICAgIGNhc2UgR0xfUkdCQToKLSAgICBjYXNlIDB4ODBFMTogLy8gR0xfQkdSQV9FWFQKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkdldEJ5dGVzUGVyUGl4ZWw6IHVua25vd24gZm9ybWF0ICV4IiwgZm9ybWF0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsgICAvLyBpbiBkb3VidC4uLgotfQotCi12b2lkIGZpeHVwX0dlbmVyaWNGbG9hdEFycmF5KGludCBhcmdJbmRleCwgaW50IG5GbG9hdHMsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnNyYykgewotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2Zsb2F0YXJyYXkgPSBnbG1zZy0+bXV0YWJsZV9hcmdzKGFyZ0luZGV4KTsKLSAgICBHTGZsb2F0ICpmbG9hdHAgPSAoR0xmbG9hdCAqKXNyYzsKLQotICAgIGlmIChmbG9hdHAgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXJnX2Zsb2F0YXJyYXktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkZMT0FUKTsKLSAgICBhcmdfZmxvYXRhcnJheS0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnX2Zsb2F0YXJyYXktPmNsZWFyX2Zsb2F0dmFsdWUoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkZsb2F0czsgaSsrLCBmbG9hdHArKykgewotICAgICAgICBhcmdfZmxvYXRhcnJheS0+YWRkX2Zsb2F0dmFsdWUoKmZsb2F0cCk7Ci0gICAgfQotfQotCi12b2lkIGZpeHVwX0dlbmVyaWNJbnRBcnJheShpbnQgYXJnSW5kZXgsIGludCBuSW50cywgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqc3JjKSB7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW50YXJyYXkgPSBnbG1zZy0+bXV0YWJsZV9hcmdzKGFyZ0luZGV4KTsKLSAgICBHTGludCAqaW50cCA9IChHTGludCAqKXNyYzsKLQotICAgIGlmIChpbnRwID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGFyZ19pbnRhcnJheS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW50YXJyYXktPnNldF9pc2FycmF5KHRydWUpOwotICAgIGFyZ19pbnRhcnJheS0+Y2xlYXJfaW50dmFsdWUoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkludHM7IGkrKywgaW50cCsrKSB7Ci0gICAgICAgIGFyZ19pbnRhcnJheS0+YWRkX2ludHZhbHVlKCppbnRwKTsKLSAgICB9Ci19Ci0KLXZvaWQgZml4dXBfR2VuZXJpY0VudW1BcnJheShpbnQgYXJnSW5kZXgsIGludCBuRW51bXMsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnNyYykgewotICAgIC8vIGZpeHVwIGFzIGlmIHRoZXkgd2VyZSBpbnRzCi0gICAgZml4dXBfR2VuZXJpY0ludEFycmF5KGFyZ0luZGV4LCBuRW51bXMsIGdsbXNnLCBzcmMpOwotCi0gICAgLy8gYW5kIHRoZW4gc2V0IHRoZSBkYXRhIHR5cGUgdG8gYmUgZW51bQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2VudW1hcnJheSA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoYXJnSW5kZXgpOwotICAgIGFyZ19lbnVtYXJyYXktPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkVOVU0pOwotfQotCi0vKiogR2VuZXJpYyBoZWxwZXIgZnVuY3Rpb246IGV4dHJhY3QgcG9pbnRlciBhdCBhcmdJbmRleCBhbmQKLSAgICByZXBsYWNlIGl0IHdpdGggdGhlIEMgc3R5bGUgc3RyaW5nIGF0ICpwb2ludGVyICovCi12b2lkIGZpeHVwX0NTdHJpbmdQdHIoaW50IGFyZ0luZGV4LCBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpzcmMpIHsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZyA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoYXJnSW5kZXgpOwotICAgIEdMY2hhciAqcHRyID0gKEdMY2hhciAqKSBzcmM7Ci0KLSAgICBhcmctPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkNIQVIpOwotICAgIGFyZy0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnLT5hZGRfY2hhcnZhbHVlKHB0cik7Ci19Ci0KLXZvaWQgZml4dXBfZ2xHZXRTdHJpbmcoR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiBjb25zdCBHTHVieXRlKiBHTFRyYWNlX2dsR2V0U3RyaW5nKEdMZW51bSBuYW1lKSAqLwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqcmV0ID0gZ2xtc2ctPm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBHTGNoYXIgKnB0ciA9IChHTGNoYXIgKikgcG9pbnRlcnNUb0ZpeHVwWzBdOwotCi0gICAgaWYgKHB0ciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Q0hBUik7Ci0gICAgICAgIHJldC0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgICAgIHJldC0+YWRkX2NoYXJ2YWx1ZShwdHIpOwotICAgIH0KLX0KLQotLyogQWRkIHRoZSBjb250ZW50cyBvZiB0aGUgZnJhbWVidWZmZXIgdG8gdGhlIHByb3RvYnVmIG1lc3NhZ2UgKi8KLXZvaWQgZml4dXBfYWRkRkJDb250ZW50cyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCwgR0xNZXNzYWdlICpnbG1zZywgRkJCaW5kaW5nIGZiVG9SZWFkKSB7Ci0gICAgdm9pZCAqZmJjb250ZW50czsKLSAgICB1bnNpZ25lZCBmYnNpemUsIGZid2lkdGgsIGZiaGVpZ2h0OwotICAgIGNvbnRleHQtPmdldENvbXByZXNzZWRGQigmZmJjb250ZW50cywgJmZic2l6ZSwgJmZid2lkdGgsICZmYmhlaWdodCwgZmJUb1JlYWQpOwotCi0gICAgR0xNZXNzYWdlX0ZyYW1lQnVmZmVyICpmYiA9IGdsbXNnLT5tdXRhYmxlX2ZiKCk7Ci0gICAgZmItPnNldF93aWR0aChmYndpZHRoKTsKLSAgICBmYi0+c2V0X2hlaWdodChmYmhlaWdodCk7Ci0gICAgZmItPmFkZF9jb250ZW50cyhmYmNvbnRlbnRzLCBmYnNpemUpOwotfQotCi0vKiogQ29tbW9uIGZpeHVwIHJvdXRpbmcgZm9yIGdsVGV4SW1hZ2UyRCAmIGdsVGV4U3ViSW1hZ2UyRC4gKi8KLXZvaWQgZml4dXBfZ2xUZXhJbWFnZShpbnQgd2lkdGhJbmRleCwgaW50IGhlaWdodEluZGV4LCBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpkYXRhU3JjKSB7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlIGFyZ193aWR0aCAgPSBnbG1zZy0+YXJncyh3aWR0aEluZGV4KTsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgYXJnX2hlaWdodCA9IGdsbXNnLT5hcmdzKGhlaWdodEluZGV4KTsKLQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSBhcmdfZm9ybWF0ID0gZ2xtc2ctPmFyZ3MoNik7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlIGFyZ190eXBlICAgPSBnbG1zZy0+YXJncyg3KTsKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19kYXRhICA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoOCk7Ci0KLSAgICBHTHNpemVpIHdpZHRoICA9IGFyZ193aWR0aC5pbnR2YWx1ZSgwKTsKLSAgICBHTHNpemVpIGhlaWdodCA9IGFyZ19oZWlnaHQuaW50dmFsdWUoMCk7Ci0gICAgR0xlbnVtIGZvcm1hdCAgPSBhcmdfZm9ybWF0LmludHZhbHVlKDApOwotICAgIEdMZW51bSB0eXBlICAgID0gYXJnX3R5cGUuaW50dmFsdWUoMCk7Ci0gICAgdm9pZCAqZGF0YSAgICAgPSAodm9pZCAqKSBkYXRhU3JjOwotCi0gICAgaW50IGJ5dGVzUGVyVGV4ZWwgPSBnZXRCeXRlc1BlclRleGVsKGZvcm1hdCwgdHlwZSk7Ci0KLSAgICBhcmdfZGF0YS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6QllURSk7Ci0gICAgYXJnX2RhdGEtPmNsZWFyX3Jhd2J5dGVzKCk7Ci0KLSAgICBpZiAoZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICAgICAgYXJnX2RhdGEtPmFkZF9yYXdieXRlcyhkYXRhLCBieXRlc1BlclRleGVsICogd2lkdGggKiBoZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFyZ19kYXRhLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgICAgIGFyZ19kYXRhLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpWT0lEKTsKLSAgICB9Ci19Ci0KLQotdm9pZCBmaXh1cF9nbFRleEltYWdlMkQoR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsVGV4SW1hZ2UyRChHTGVudW0gdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgR0xpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTGludCBpbnRlcm5hbGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTHNpemVpIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMdm9pZCAqZGF0YSk7Ci0gICAgKi8KLSAgICBpbnQgd2lkdGhJbmRleCA9IDM7Ci0gICAgaW50IGhlaWdodEluZGV4ID0gNDsKLSAgICBmaXh1cF9nbFRleEltYWdlKHdpZHRoSW5kZXgsIGhlaWdodEluZGV4LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLX0KLQotdm9pZCBmaXh1cF9nbFRleFN1YkltYWdlMkQoR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKgotICAgIHZvaWQgZ2xUZXhTdWJJbWFnZTJEKEdMZW51bSB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMaW50IHhvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBHTGludCB5b2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgR0xzaXplaSB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMc2l6ZWkgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0x2b2lkICogZGF0YSk7Ci0gICAgKi8KLSAgICBpbnQgd2lkdGhJbmRleCA9IDQ7Ci0gICAgaW50IGhlaWdodEluZGV4ID0gNTsKLSAgICBmaXh1cF9nbFRleEltYWdlKHdpZHRoSW5kZXgsIGhlaWdodEluZGV4LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLX0KLQotdm9pZCBmaXh1cF9nbFNoYWRlclNvdXJjZShHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qIHZvaWQgZ2xTaGFkZXJTb3VyY2UoR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyKiogc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xpbnQqIGxlbmd0aCkgKi8KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgYXJnX2NvdW50ICA9IGdsbXNnLT5hcmdzKDEpOwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSBhcmdfbGVucCAgID0gZ2xtc2ctPmFyZ3MoMyk7Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc3RycHAgPSBnbG1zZy0+bXV0YWJsZV9hcmdzKDIpOwotCi0gICAgR0xzaXplaSBjb3VudCA9IGFyZ19jb3VudC5pbnR2YWx1ZSgwKTsKLSAgICBHTGNoYXIgKipzdHJpbmdwcCA9IChHTGNoYXIgKiopIHBvaW50ZXJzVG9GaXh1cFswXTsKLSAgICBHTGludCAqbGVuZ3RocCA9IChHTGludCAqKSBwb2ludGVyc1RvRml4dXBbMV07Ci0KLSAgICBhcmdfc3RycHAtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OkNIQVIpOwotICAgIGFyZ19zdHJwcC0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnX3N0cnBwLT5jbGVhcl9jaGFydmFsdWUoKTsKLQotICAgIDo6c3RkOjpzdHJpbmcgc3JjID0gIiI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChsZW5ndGhwICE9IE5VTEwpCi0gICAgICAgICAgICBzcmMuYXBwZW5kKCpzdHJpbmdwcCwgKmxlbmd0aHApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzcmMuYXBwZW5kKCpzdHJpbmdwcCk7ICAvLyBhc3N1bWUgbnVsbCB0ZXJtaW5hdGVkCi0gICAgICAgIHN0cmluZ3BwKys7Ci0gICAgICAgIGxlbmd0aHArKzsKLSAgICB9Ci0KLSAgICBhcmdfc3RycHAtPmFkZF9jaGFydmFsdWUoc3JjKTsKLX0KLQotdm9pZCBmaXh1cF9nbFVuaWZvcm1HZW5lcmljSW50ZWdlcihpbnQgYXJnSW5kZXgsIGludCBuSW50ZWdlcnMsIEdMTWVzc2FnZSAqZ2xtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbFVuaWZvcm0/aXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7ICovCi0gICAgZml4dXBfR2VuZXJpY0ludEFycmF5KGFyZ0luZGV4LCBuSW50ZWdlcnMsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMF0pOwotfQotCi12b2lkIGZpeHVwX2dsVW5pZm9ybUdlbmVyaWMoaW50IGFyZ0luZGV4LCBpbnQgbkZsb2F0cywgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqc3JjKSB7Ci0gICAgZml4dXBfR2VuZXJpY0Zsb2F0QXJyYXkoYXJnSW5kZXgsIG5GbG9hdHMsIGdsbXNnLCBzcmMpOwotfQotCi12b2lkIGZpeHVwX2dsVW5pZm9ybU1hdHJpeEdlbmVyaWMoaW50IG1hdHJpeFNpemUsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbFVuaWZvcm1NYXRyaXg/ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdmFsdWUpICovCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlIGFyZ19jb3VudCAgPSBnbG1zZy0+YXJncygxKTsKLSAgICBpbnQgbl9tYXRyaWNlcyA9IGFyZ19jb3VudC5pbnR2YWx1ZSgwKTsKLSAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljKDMsIG1hdHJpeFNpemUgKiBtYXRyaXhTaXplICogbl9tYXRyaWNlcywgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cFswXSk7Ci19Ci0KLXZvaWQgZml4dXBfZ2xHZW5HZW5lcmljKEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbEdlbiooR0xzaXplaSBuLCBHTHVpbnQgKiBidWZmZXJzKTsgKi8KLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgYXJnX24gID0gZ2xtc2ctPmFyZ3MoMCk7Ci0gICAgR0xzaXplaSBuID0gYXJnX24uaW50dmFsdWUoMCk7Ci0KLSAgICBmaXh1cF9HZW5lcmljSW50QXJyYXkoMSwgbiwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cFswXSk7Ci19Ci0KLXZvaWQgZml4dXBfZ2xEZWxldGVHZW5lcmljKEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbERlbGV0ZSooR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOyAqLwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSBhcmdfbiAgPSBnbG1zZy0+YXJncygwKTsKLSAgICBHTHNpemVpIG4gPSBhcmdfbi5pbnR2YWx1ZSgwKTsKLQotICAgIGZpeHVwX0dlbmVyaWNJbnRBcnJheSgxLCBuLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLX0KLQotdm9pZCBmaXh1cF9nbEdldEJvb2xlYW52KEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbEdldEJvb2xlYW52KEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpOyAqLwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoMSk7Ci0gICAgR0xib29sZWFuICpzcmMgPSAoR0xib29sZWFuKikgcG9pbnRlcnNUb0ZpeHVwWzBdOwotCi0gICAgYXJnX3BhcmFtcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnX3BhcmFtcy0+Y2xlYXJfYm9vbHZhbHVlKCk7Ci0gICAgYXJnX3BhcmFtcy0+YWRkX2Jvb2x2YWx1ZSgqc3JjKTsKLX0KLQotdm9pZCBmaXh1cF9nbEdldEZsb2F0dihHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qIHZvaWQgZ2xHZXRGbG9hdHYoR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpOyAqLwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3BhcmFtcyA9IGdsbXNnLT5tdXRhYmxlX2FyZ3MoMSk7Ci0gICAgR0xmbG9hdCAqc3JjID0gKEdMZmxvYXQqKSBwb2ludGVyc1RvRml4dXBbMF07Ci0KLSAgICBhcmdfcGFyYW1zLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpGTE9BVCk7Ci0gICAgYXJnX3BhcmFtcy0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnX3BhcmFtcy0+Y2xlYXJfZmxvYXR2YWx1ZSgpOwotICAgIGFyZ19wYXJhbXMtPmFkZF9mbG9hdHZhbHVlKCpzcmMpOwotfQotCi12b2lkIGZpeHVwX2dsTGlua1Byb2dyYW0oR0xNZXNzYWdlICpnbG1zZykgewotICAgIC8qIHZvaWQgZ2xMaW5rUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7ICovCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbG1zZy0+YXJncygwKS5pbnR2YWx1ZSgwKTsKLQotICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gZml4dXAgdGhpcyBjYWxsLCBidXQgYXMgc29vbiBhcyBhIHByb2dyYW0gaXMgbGlua2VkLAotICAgICAgIHdlIG9idGFpbiBpbmZvcm1hdGlvbiBhYm91dCBhbGwgYWN0aXZlIGF0dHJpYnV0ZXMgYW5kIHVuaWZvcm1zIHRvCi0gICAgICAgcGFzcyBvbiB0byB0aGUgZGVidWdnZXIuIE5vdGUgdGhhdCBpbiBvcmRlciB0byBwYXNzIHRoaXMgaW5mbyB0bwotICAgICAgIHRoZSBkZWJ1Z2dlciwgYWxsIHdlIG5lZWQgdG8gZG8gaXMgY2FsbCB0aGUgdHJhY2UgdmVyc2lvbnMgb2YgdGhlCi0gICAgICAgbmVjZXNzYXJ5IGNhbGxzLiAqLwotCi0gICAgR0xpbnQgbiwgbWF4TmFtZUxlbmd0aDsKLSAgICBHTGNoYXIgKm5hbWU7Ci0gICAgR0xpbnQgc2l6ZTsKLSAgICBHTGVudW0gdHlwZTsKLQotICAgIC8vIG9idGFpbiBpbmZvIHJlZ2FyZGluZyBhY3RpdmUgYXR0cmlidXRlcwotICAgIEdMVHJhY2VfZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfQUNUSVZFX0FUVFJJQlVURVMsICZuKTsKLSAgICBHTFRyYWNlX2dsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCwgJm1heE5hbWVMZW5ndGgpOwotCi0gICAgbmFtZSA9IChHTGNoYXIgKikgbWFsbG9jKG1heE5hbWVMZW5ndGgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIEdMVHJhY2VfZ2xHZXRBY3RpdmVBdHRyaWIocHJvZ3JhbSwgaSwgbWF4TmFtZUxlbmd0aCwgTlVMTCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKLSAgICB9Ci0gICAgZnJlZShuYW1lKTsKLQotICAgIC8vIG9idGFpbiBpbmZvIHJlZ2FyZGluZyBhY3RpdmUgdW5pZm9ybXMKLSAgICBHTFRyYWNlX2dsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0FDVElWRV9VTklGT1JNUywgJm4pOwotICAgIEdMVHJhY2VfZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCwgJm1heE5hbWVMZW5ndGgpOwotCi0gICAgbmFtZSA9IChHTGNoYXIgKikgbWFsbG9jKG1heE5hbWVMZW5ndGgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIEdMVHJhY2VfZ2xHZXRBY3RpdmVVbmlmb3JtKHByb2dyYW0sIGksIG1heE5hbWVMZW5ndGgsIE5VTEwsICZzaXplLCAmdHlwZSwgbmFtZSk7Ci0gICAgfQotICAgIGZyZWUobmFtZSk7Ci19Ci0KLS8qKiBHaXZlbiBhIGdsR2V0QWN0aXZlW1VuaWZvcm18QXR0cmliXSBjYWxsLCBvYnRhaW4gdGhlIGxvY2F0aW9uCi0gKiAgb2YgdGhlIHZhcmlhYmxlIG9mIGdpdmVuIG5hbWUgaW4gdGhlIGNhbGwuCi0gKi8KLWludCBnZXRTaGFkZXJWYXJpYWJsZUxvY2F0aW9uKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTE1lc3NhZ2UgKmdsbXNnLCBHTGNoYXIgKm5hbWUpIHsKLSAgICBHTE1lc3NhZ2VfRnVuY3Rpb24gZnVuYyA9IGdsbXNnLT5mdW5jdGlvbigpOwotICAgIGlmIChmdW5jICE9IEdMTWVzc2FnZTo6Z2xHZXRBY3RpdmVBdHRyaWIgJiYgZnVuYyAhPSBHTE1lc3NhZ2U6OmdsR2V0QWN0aXZlVW5pZm9ybSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50IHByb2dyYW0gPSBnbG1zZy0+YXJncygwKS5pbnR2YWx1ZSgwKTsKLQotICAgIGlmIChmdW5jID09IEdMTWVzc2FnZTo6Z2xHZXRBY3RpdmVBdHRyaWIpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQtPmhvb2tzLT5nbC5nbEdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgbmFtZSk7Ci0gICAgfQotfQotCi12b2lkIGZpeHVwX2dsR2V0QWN0aXZlQXR0cmliT3JVbmlmb3JtKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTE1lc3NhZ2UgKmdsbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbEdldEFjdGl2ZUF0dHJpYihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsCi0gICAgICAgICAgICAgICAgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpOyAqLwotICAgIC8qIHZvaWQgZ2xHZXRBY3RpdmVVbmlmb3JtKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwKLSAgICAgICAgICAgICAgICBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkgKi8KLQotICAgIGZpeHVwX0dlbmVyaWNJbnRBcnJheSgzLCAxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsgICAgIC8vIGxlbmd0aAotICAgIGZpeHVwX0dlbmVyaWNJbnRBcnJheSg0LCAxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzFdKTsgICAgIC8vIHNpemUKLSAgICBmaXh1cF9HZW5lcmljRW51bUFycmF5KDUsIDEsIGdsbXNnLCBwb2ludGVyc1RvRml4dXBbMl0pOyAgICAvLyB0eXBlCi0gICAgZml4dXBfQ1N0cmluZ1B0cig2LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzNdKTsgICAgICAgICAgICAgLy8gbmFtZQotCi0gICAgLy8gVGhlIGluZGV4IGFyZ3VtZW50IGluIHRoZSBnbEdldEFjdGl2ZVtBdHRyaWJ8VW5pZm9ybV0gZnVuY3Rpb25zCi0gICAgLy8gZG9lcyBub3QgY29ycmVzcG9uZCB0byB0aGUgYWN0dWFsIGxvY2F0aW9uIGluZGV4IGFzIHVzZWQgaW4KLSAgICAvLyBnbFVuaWZvcm0qKCkgb3IgZ2xWZXJ0ZXhBdHRyaWIqKCkgdG8gYWN0dWFsbHkgdXBsb2FkIHRoZSBkYXRhLgotICAgIC8vIEluIG9yZGVyIHRvIG1ha2UgdGhpbmdzIHNpbXBsZXIgZm9yIHRoZSBkZWJ1Z2dlciwgd2UgYWxzbyBwYXNzCi0gICAgLy8gYSBoaWRkZW4gbG9jYXRpb24gYXJndW1lbnQgdGhhdCBzdG9yZXMgdGhlIGFjdHVhbCBsb2NhdGlvbi4KLSAgICAvLyBhcHBlbmQgdGhlIGxvY2F0aW9uIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50IGxpc3QKLSAgICBpbnQgbG9jYXRpb24gPSBnZXRTaGFkZXJWYXJpYWJsZUxvY2F0aW9uKGNvbnRleHQsIGdsbXNnLCAoR0xjaGFyKilwb2ludGVyc1RvRml4dXBbM10pOwotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2xvY2F0aW9uID0gZ2xtc2ctPmFkZF9hcmdzKCk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfaXNhcnJheShmYWxzZSk7Ci0gICAgYXJnX2xvY2F0aW9uLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19sb2NhdGlvbi0+YWRkX2ludHZhbHVlKGxvY2F0aW9uKTsKLX0KLQotR0xpbnQgZ2xHZXRJbnRlZ2VyKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTGVudW0gcGFyYW0pIHsKLSAgICBHTGludCB4OwotICAgIGNvbnRleHQtPmhvb2tzLT5nbC5nbEdldEludGVnZXJ2KHBhcmFtLCAmeCk7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLUdMaW50IGdsR2V0VmVydGV4QXR0cmliKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSkgewotICAgIEdMaW50IHg7Ci0gICAgY29udGV4dC0+aG9va3MtPmdsLmdsR2V0VmVydGV4QXR0cmliaXYoaW5kZXgsIHBuYW1lLCAmeCk7Ci0gICAgcmV0dXJuIHg7Ci19Ci0KLWJvb2wgaXNVc2luZ0FycmF5QnVmZmVycyhHTFRyYWNlQ29udGV4dCAqY29udGV4dCkgewotICAgIHJldHVybiBnbEdldEludGVnZXIoY29udGV4dCwgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcpICE9IDA7Ci19Ci0KLWJvb2wgaXNVc2luZ0VsZW1lbnRBcnJheUJ1ZmZlcnMoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQpIHsKLSAgICByZXR1cm4gZ2xHZXRJbnRlZ2VyKGNvbnRleHQsIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcpICE9IDA7Ci19Ci0KLS8qKiBDb3B5IEBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIEBzcmMgaW50byB0aGUgQGRhdGFJbmRleCd0aCBhcmd1bWVudCBvZiB0aGUgbWVzc2FnZS4gKi8KLXZvaWQgYWRkR2xCdWZmZXJEYXRhKEdMTWVzc2FnZSAqZ2xtc2csIGludCBkYXRhSW5kZXgsIEdMdm9pZCAqc3JjLCBHTHNpemVpcHRyIGxlbikgewotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2RhdGFwID0gZ2xtc2ctPm11dGFibGVfYXJncyhkYXRhSW5kZXgpOwotICAgIGFyZ19kYXRhcC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Vk9JRCk7Ci0gICAgYXJnX2RhdGFwLT5zZXRfaXNhcnJheSh0cnVlKTsKLSAgICBhcmdfZGF0YXAtPmNsZWFyX2ludHZhbHVlKCk7Ci0gICAgYXJnX2RhdGFwLT5hZGRfcmF3Ynl0ZXMoc3JjLCBsZW4pOwotfQotCi12b2lkIGZpeHVwX2dsQnVmZmVyRGF0YShHTFRyYWNlQ29udGV4dCAqY29udGV4dCwgR0xNZXNzYWdlICpnbG1zZywgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pIHsKLSAgICAvKiB2b2lkIGdsQnVmZmVyRGF0YShHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSwgR0xlbnVtIHVzYWdlKSAqLwotICAgIEdMc2l6ZWlwdHIgc2l6ZSA9IGdsbXNnLT5hcmdzKDEpLmludHZhbHVlKDApOwotICAgIEdMdm9pZCAqZGF0YXAgPSAoR0x2b2lkICopIHBvaW50ZXJzVG9GaXh1cFswXTsKLQotICAgIC8vIFNhdmUgZWxlbWVudCBhcnJheSBidWZmZXJzIGZvciBmdXR1cmUgdXNlIHRvIGZpeHVwIGdsVmVydGV4QXR0cmliUG9pbnRlcnMKLSAgICAvLyB3aGVuIGEgZ2xEcmF3RWxlbWVudHMoKSBjYWxsIGlzIHBlcmZvcm1lZC4KLSAgICBHTGVudW0gdGFyZ2V0ID0gZ2xtc2ctPmFyZ3MoMCkuaW50dmFsdWUoMCk7Ci0gICAgaWYgKHRhcmdldCA9PSBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUikgewotICAgICAgICBHTGludCBidWZmZXJJZCA9IGdsR2V0SW50ZWdlcihjb250ZXh0LCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HKTsKLSAgICAgICAgY29udGV4dC0+YmluZEJ1ZmZlcihidWZmZXJJZCwgZGF0YXAsIHNpemUpOwotICAgIH0KLQotICAgIC8vIGFkZCBidWZmZXIgZGF0YSB0byB0aGUgcHJvdG9idWYgbWVzc2FnZQotICAgIGlmIChkYXRhcCAhPSBOVUxMKSB7Ci0gICAgICAgIGFkZEdsQnVmZmVyRGF0YShnbG1zZywgMiwgZGF0YXAsIHNpemUpOwotICAgIH0KLX0KLQotdm9pZCBmaXh1cF9nbEJ1ZmZlclN1YkRhdGEoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2csIHZvaWQgKnBvaW50ZXJzVG9GaXh1cFtdKSB7Ci0gICAgLyogdm9pZCBnbEJ1ZmZlclN1YkRhdGEoR0xlbnVtIHRhcmdldCwgR0xpbnRwdHIgb2Zmc2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCogZGF0YSkgKi8KLSAgICBHTGVudW0gdGFyZ2V0ID0gZ2xtc2ctPmFyZ3MoMCkuaW50dmFsdWUoMCk7Ci0gICAgR0xpbnRwdHIgb2Zmc2V0ID0gZ2xtc2ctPmFyZ3MoMSkuaW50dmFsdWUoMCk7Ci0gICAgR0xzaXplaXB0ciBzaXplID0gZ2xtc2ctPmFyZ3MoMikuaW50dmFsdWUoMCk7Ci0gICAgR0x2b2lkICpkYXRhcCA9IChHTHZvaWQgKikgcG9pbnRlcnNUb0ZpeHVwWzBdOwotICAgIGlmICh0YXJnZXQgPT0gR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAgICAgICAgR0xpbnQgYnVmZmVySWQgPSBnbEdldEludGVnZXIoY29udGV4dCwgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyk7Ci0gICAgICAgIGNvbnRleHQtPnVwZGF0ZUJ1ZmZlclN1YkRhdGEoYnVmZmVySWQsIG9mZnNldCwgZGF0YXAsIHNpemUpOwotICAgIH0KLQotICAgIC8vIGFkZCBidWZmZXIgZGF0YSB0byB0aGUgcHJvdG9idWYgbWVzc2FnZQotICAgIGFkZEdsQnVmZmVyRGF0YShnbG1zZywgMywgZGF0YXAsIHNpemUpOwotfQotCi0vKiogT2J0YWluIHRoZSBzaXplIG9mIGVhY2ggdmVydGV4IGF0dHJpYnV0ZS4gKi8KLWludCB2ZXJ0ZXhBdHRyaWJTaXplKEdMZW51bSB0eXBlLCBHTHNpemVpIG51bUNvbXBvbmVudHMpIHsKLSAgICBpbnQgc2l6ZVBlckNvbXBvbmVudDsKLQotICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgY2FzZSBHTF9CWVRFOgotICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKLSAgICAgICAgc2l6ZVBlckNvbXBvbmVudCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfU0hPUlQ6Ci0gICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKLSAgICAgICAgc2l6ZVBlckNvbXBvbmVudCA9IDI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xfRklYRUQ6Ci0gICAgY2FzZSBHTF9GTE9BVDoKLSAgICBkZWZhdWx0OgotICAgICAgICBzaXplUGVyQ29tcG9uZW50ID0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNpemVQZXJDb21wb25lbnQgKiBudW1Db21wb25lbnRzOwotfQotCi0vKiogQ3JlYXRlIGFuZCBzZW5kIGEgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YSB0cmFjZSBtZXNzYWdlIHRvIHRoZSBob3N0LiAqLwotdm9pZCB0cmFjZV9nbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgIEdMdWludCBtaW5JbmRleCwgR0x1aW50IG1heEluZGV4LCBuc2Vjc190IHN0YXJ0VGltZSkgewotICAgIC8qIHZvaWQgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YShHTHVpbnQgaW5keCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIEdMYm9vbGVhbiBub3JtYWxpemVkLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgIGludCBtaW5JbmRleCwgaW50IG1heEluZGV4KSAqLwotICAgIEdMTWVzc2FnZSBnbG1zZzsKLSAgICBHTFRyYWNlQ29udGV4dCAqZ2xDb250ZXh0ID0gY29udGV4dDsKLQotICAgIGdsbXNnLnNldF9mdW5jdGlvbihHTE1lc3NhZ2U6OmdsVmVydGV4QXR0cmliUG9pbnRlckRhdGEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBpbmR4Ci0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfaW5keCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX2luZHgtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfaW5keC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfaW5keC0+YWRkX2ludHZhbHVlKGluZHgpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBzaXplCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfc2l6ZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3NpemUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfc2l6ZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICBhcmdfc2l6ZS0+YWRkX2ludHZhbHVlKHNpemUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCB0eXBlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfdHlwZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3R5cGUtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfdHlwZS0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6RU5VTSk7Ci0gICAgYXJnX3R5cGUtPmFkZF9pbnR2YWx1ZSgoaW50KXR5cGUpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBub3JtYWxpemVkCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICphcmdfbm9ybWFsaXplZCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX25vcm1hbGl6ZWQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbm9ybWFsaXplZC0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6Qk9PTCk7Ci0gICAgYXJnX25vcm1hbGl6ZWQtPmFkZF9ib29sdmFsdWUobm9ybWFsaXplZCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHN0cmlkZQotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3N0cmlkZSA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3N0cmlkZS0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19zdHJpZGUtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX3N0cmlkZS0+YWRkX2ludHZhbHVlKHN0cmlkZSk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IHB0cgotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX3B0ciA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX3B0ci0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgYXJnX3B0ci0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6QllURSk7Ci0gICAgaW50IHBlclZlcnRleFNpemUgPSB2ZXJ0ZXhBdHRyaWJTaXplKHR5cGUsIHNpemUpOwotICAgIEdMY2hhciAqcCA9IChHTGNoYXIqKSBwdHI7Ci0gICAgc3RkOjpzdHJpbmcgZGF0YTsKLSAgICBmb3IgKEdMdWludCBpID0gbWluSW5kZXg7IGkgPCBtYXhJbmRleDsgaSsrKSB7Ci0gICAgICAgIGRhdGEuYXBwZW5kKHAsIHBlclZlcnRleFNpemUpOwotICAgICAgICBwICs9IHN0cmlkZSA9PSAwID8gcGVyVmVydGV4U2l6ZSA6IHN0cmlkZTsKLSAgICB9Ci0gICAgYXJnX3B0ci0+YWRkX3Jhd2J5dGVzKGRhdGEpOwotCi0gICAgLy8gY29weSBhcmd1bWVudCBtaW4gaW5kZXgKLSAgICBHTE1lc3NhZ2VfRGF0YVR5cGUgKmFyZ19taW4gPSBnbG1zZy5hZGRfYXJncygpOwotICAgIGFyZ19taW4tPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfbWluLT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjpJTlQpOwotICAgIGFyZ19taW4tPmFkZF9pbnR2YWx1ZShtaW5JbmRleCk7Ci0KLSAgICAvLyBjb3B5IGFyZ3VtZW50IG1heCBpbmRleAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX21heCA9IGdsbXNnLmFkZF9hcmdzKCk7Ci0gICAgYXJnX21heC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIGFyZ19tYXgtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OklOVCk7Ci0gICAgYXJnX21heC0+YWRkX2ludHZhbHVlKG1heEluZGV4KTsKLQotICAgIGdsbXNnLnNldF9jb250ZXh0X2lkKGNvbnRleHQtPmdldElkKCkpOwotICAgIGdsbXNnLnNldF9zdGFydF90aW1lKHN0YXJ0VGltZSk7Ci0gICAgZ2xtc2cuc2V0X3RocmVhZHRpbWUoMCk7Ci0gICAgZ2xtc2cuc2V0X2R1cmF0aW9uKDApOwotCi0gICAgY29udGV4dC0+dHJhY2VHTE1lc3NhZ2UoJmdsbXNnKTsKLX0KLQotdm9pZCBmaW5kTWluQW5kTWF4SW5kaWNlcyhHTHZvaWQgKmluZGljZXMsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCAqbWluSW5kZXgsIEdMdWludCAqbWF4SW5kZXgpIHsKLSAgICBHTHVpbnQgaW5kZXg7Ci0gICAgKm1pbkluZGV4ID0gVUlOVF9NQVg7Ci0gICAgKm1heEluZGV4ID0gMDsKLQotICAgIGlmIChpbmRpY2VzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZvciAoR0xzaXplaSBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkgewotICAgICAgICAgICAgaW5kZXggPSAqKChHTHVieXRlKikgaW5kaWNlcyArIGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5kZXggPSAqKChHTHVzaG9ydCopIGluZGljZXMgKyBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmRleCA8ICptaW5JbmRleCkgKm1pbkluZGV4ID0gaW5kZXg7Ci0gICAgICAgIGlmIChpbmRleCA+ICptYXhJbmRleCkgKm1heEluZGV4ID0gaW5kZXg7Ci0gICAgfQotfQotCi12b2lkIHRyYWNlX1ZlcnRleEF0dHJpYlBvaW50ZXJEYXRhKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdWludCBtaW5JbmRleCwgR0x1aW50IG1heEluZGV4LCBuc2Vjc190IHRpbWUpIHsKLSAgICBHTHVpbnQgbWF4QXR0cmlicyA9IGdsR2V0SW50ZWdlcihjb250ZXh0LCBHTF9NQVhfVkVSVEVYX0FUVFJJQlMpOwotICAgIGZvciAoR0x1aW50IGluZGV4ID0gMDsgaW5kZXggPCBtYXhBdHRyaWJzOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmICghZ2xHZXRWZXJ0ZXhBdHRyaWIoY29udGV4dCwgaW5kZXgsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCkpIHsKLSAgICAgICAgICAgIC8vIHZlcnRleCBhcnJheSBkaXNhYmxlZAotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2xHZXRWZXJ0ZXhBdHRyaWIoY29udGV4dCwgaW5kZXgsIEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkcpKSB7Ci0gICAgICAgICAgICAvLyB2Ym8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgR0xpbnQgc2l6ZSA9IGdsR2V0VmVydGV4QXR0cmliKGNvbnRleHQsIGluZGV4LCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUpOwotICAgICAgICBHTGVudW0gdHlwZSA9IGdsR2V0VmVydGV4QXR0cmliKGNvbnRleHQsIGluZGV4LCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1RZUEUpOwotICAgICAgICBHTGJvb2xlYW4gbm9ybSA9IGdsR2V0VmVydGV4QXR0cmliKGNvbnRleHQsIGluZGV4LCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQpOwotICAgICAgICBHTHNpemVpIHN0cmlkZSA9IGdsR2V0VmVydGV4QXR0cmliKGNvbnRleHQsIGluZGV4LCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSk7Ci0gICAgICAgIEdMdm9pZCogcHRyOwotICAgICAgICBjb250ZXh0LT5ob29rcy0+Z2wuZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRleCwgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSLCAmcHRyKTsKLQotICAgICAgICB0cmFjZV9nbFZlcnRleEF0dHJpYlBvaW50ZXJEYXRhKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplLCB0eXBlLCBub3JtLCBzdHJpZGUsIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgbWluSW5kZXgsIG1heEluZGV4LCB0aW1lKTsKLSAgICB9Ci19Ci0KLXZvaWQgdHJhY2VfVmVydGV4QXR0cmliUG9pbnRlckRhdGFGb3JHbERyYXdBcnJheXMoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2cpIHsKLSAgICAvKiB2b2lkIGdsRHJhd0FycmF5cyhHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQpICovCi0gICAgR0xzaXplaSBjb3VudCA9IGdsbXNnLT5hcmdzKDIpLmludHZhbHVlKDApOwotCi0gICAgLy8gVmVydGV4IGF0dHJpYiBwb2ludGVyIGRhdGEgcGF0Y2h1cCBjYWxscyBzaG91bGQgYXBwZWFyIGFzIGlmCi0gICAgLy8gdGhleSBvY2N1cnJlZCByaWdodCBiZWZvcmUgdGhlIGRyYXcgY2FsbC4KLSAgICBuc2Vjc190IHRpbWUgPSBnbG1zZy0+c3RhcnRfdGltZSgpIC0gMTsKLQotICAgIHRyYWNlX1ZlcnRleEF0dHJpYlBvaW50ZXJEYXRhKGNvbnRleHQsIDAsIGNvdW50LCB0aW1lKTsKLX0KLQotdm9pZCB0cmFjZV9WZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YUZvckdsRHJhd0VsZW1lbnRzKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTE1lc3NhZ2UgKmdsbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMdm9pZCAqaW5kaWNlcykgewotICAgIC8qIHZvaWQgZ2xEcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMpICovCi0gICAgR0xzaXplaSBjb3VudCA9IGdsbXNnLT5hcmdzKDEpLmludHZhbHVlKDApOwotICAgIEdMZW51bSB0eXBlID0gZ2xtc2ctPmFyZ3MoMikuaW50dmFsdWUoMCk7Ci0gICAgR0x1aW50IGluZGV4OwotCi0gICAgR0x1aW50IG1pbkluZGV4LCBtYXhJbmRleDsKLQotICAgIC8vIFRoZSBpbmRleCBidWZmZXIgaXMgZWl0aGVyIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgZ2xEcmF3RWxlbWVudHMoKSBjYWxsLAotICAgIC8vIG9yIGl0IGlzIHN0b3JlZCBpbiB0aGUgY3VycmVudCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUi4KLSAgICBHTHZvaWQgKmluZGV4QnVmZmVyOwotICAgIGlmIChpc1VzaW5nRWxlbWVudEFycmF5QnVmZmVycyhjb250ZXh0KSkgewotICAgICAgICBHTHNpemVpcHRyIGVhQnVmZmVyU2l6ZTsKLSAgICAgICAgR0x1aW50IGJ1ZmZlcklkID0gZ2xHZXRJbnRlZ2VyKGNvbnRleHQsIEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcpOwotICAgICAgICBjb250ZXh0LT5nZXRCdWZmZXIoYnVmZmVySWQsICZpbmRleEJ1ZmZlciwgJmVhQnVmZmVyU2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXhCdWZmZXIgPSBpbmRpY2VzOwotICAgIH0KLQotICAgIC8vIFJhdGhlciB0aGFuIHNlbmRpbmcgdmVydGV4IGF0dHJpYnV0ZSBkYXRhIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGluZGljZXMKLSAgICAvLyBiZWluZyBkcmF3biwgd2Ugc2VuZCB0aGUgdmVydGV4IGF0dHJpYnV0ZSBkYXRhIGZvciB0aGUgZW50aXJlIHJhbmdlIG9mCi0gICAgLy8gaW5kaWNlcyBiZWluZyBkcmF3biwgaW5jbHVkaW5nIHRoZSBvbmVzIG5vdCBkcmF3bi4gVGhlIG1pbiAmIG1heCBpbmRpY2VzCi0gICAgLy8gcHJvdmlkZSB0aGUgcmFuZ2Ugb2YgaW5kaWNlcyBiZWluZyBkcmF3bi4KLSAgICBmaW5kTWluQW5kTWF4SW5kaWNlcyhpbmRleEJ1ZmZlciwgY291bnQsIHR5cGUsICZtaW5JbmRleCwgJm1heEluZGV4KTsKLQotICAgIC8vIFZlcnRleCBhdHRyaWIgcG9pbnRlciBkYXRhIHBhdGNodXAgY2FsbHMgc2hvdWxkIGFwcGVhciBhcyBpZgotICAgIC8vIHRoZXkgb2NjdXJyZWQgcmlnaHQgYmVmb3JlIHRoZSBkcmF3IGNhbGwuCi0gICAgbnNlY3NfdCB0aW1lID0gZ2xtc2ctPnN0YXJ0X3RpbWUoKSAtIDE7Ci0KLSAgICB0cmFjZV9WZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YShjb250ZXh0LCBtaW5JbmRleCwgbWF4SW5kZXggKyAxLCB0aW1lKTsKLX0KLQotdm9pZCBmaXh1cF9nbERyYXdBcnJheXMoR0xUcmFjZUNvbnRleHQgKmNvbnRleHQsIEdMTWVzc2FnZSAqZ2xtc2cpIHsKLSAgICAvLyBUcmFjZSBhbGwgdmVydGV4IGF0dHJpYnV0ZSBkYXRhIHN0b3JlZCBpbiBjbGllbnQgc3BhY2UuCi0gICAgdHJhY2VfVmVydGV4QXR0cmliUG9pbnRlckRhdGFGb3JHbERyYXdBcnJheXMoY29udGV4dCwgZ2xtc2cpOwotCi0gICAgLy8gQXR0YWNoIHRoZSBGQiBpZiByZXF1ZXN0ZWQKLSAgICBpZiAoY29udGV4dC0+Z2V0R2xvYmFsVHJhY2VTdGF0ZSgpLT5zaG91bGRDb2xsZWN0RmJPbkdsRHJhdygpKSB7Ci0gICAgICAgIGZpeHVwX2FkZEZCQ29udGVudHMoY29udGV4dCwgZ2xtc2csIENVUlJFTlRMWV9CT1VORF9GQik7Ci0gICAgfQotfQotCi12b2lkIGZpeHVwX2dsRHJhd0VsZW1lbnRzKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8qIHZvaWQgZ2xEcmF3RWxlbWVudHMoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIGluZGljZXMpICovCi0gICAgR0x2b2lkICppbmRpY2VzID0gcG9pbnRlcnNUb0ZpeHVwWzBdOwotICAgIEdMZW51bSB0eXBlID0gZ2xtc2ctPmFyZ3MoMikuaW50dmFsdWUoMCk7Ci0gICAgR0xzaXplaSBjb3VudCA9IGdsbXNnLT5hcmdzKDEpLmludHZhbHVlKDApOwotICAgIEdMdWludCBpbmRleDsKLQotICAgIC8vIFRyYWNlIGFsbCB2ZXJ0ZXggYXR0cmlidXRlIGRhdGEgc3RvcmVkIGluIGNsaWVudCBzcGFjZS4KLSAgICB0cmFjZV9WZXJ0ZXhBdHRyaWJQb2ludGVyRGF0YUZvckdsRHJhd0VsZW1lbnRzKGNvbnRleHQsIGdsbXNnLCBpbmRpY2VzKTsKLQotICAgIC8vIEZpeHVwIGluZGljZXMgYXJndW1lbnQKLSAgICBpZiAoIWlzVXNpbmdFbGVtZW50QXJyYXlCdWZmZXJzKGNvbnRleHQpKSB7Ci0gICAgICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnX2luZGljZXMgPSBnbG1zZy0+bXV0YWJsZV9hcmdzKDMpOwotICAgICAgICBhcmdfaW5kaWNlcy0+c2V0X2lzYXJyYXkodHJ1ZSk7Ci0gICAgICAgIGFyZ19pbmRpY2VzLT5jbGVhcl9pbnR2YWx1ZSgpOwotICAgICAgICBhcmdfaW5kaWNlcy0+c2V0X3R5cGUoR0xNZXNzYWdlOjpEYXRhVHlwZTo6SU5UKTsKLSAgICAgICAgZm9yIChHTHNpemVpIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gKigoR0x1Ynl0ZSopIGluZGljZXMgKyBpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAqKChHTHVzaG9ydCopIGluZGljZXMgKyBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ19pbmRpY2VzLT5hZGRfaW50dmFsdWUoaW5kZXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQXR0YWNoIHRoZSBGQiBpZiByZXF1ZXN0ZWQKLSAgICBpZiAoY29udGV4dC0+Z2V0R2xvYmFsVHJhY2VTdGF0ZSgpLT5zaG91bGRDb2xsZWN0RmJPbkdsRHJhdygpKSB7Ci0gICAgICAgIGZpeHVwX2FkZEZCQ29udGVudHMoY29udGV4dCwgZ2xtc2csIENVUlJFTlRMWV9CT1VORF9GQik7Ci0gICAgfQotfQotCi12b2lkIGZpeHVwR0xNZXNzYWdlKEdMVHJhY2VDb250ZXh0ICpjb250ZXh0LCBuc2Vjc190IHdhbGxTdGFydCwgbnNlY3NfdCB3YWxsRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aHJlYWRTdGFydCwgbnNlY3NfdCB0aHJlYWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE1lc3NhZ2UgKmdsbXNnLCB2b2lkICpwb2ludGVyc1RvRml4dXBbXSkgewotICAgIC8vIGZvciBhbGwgbWVzc2FnZXMsIHNldCB0aGUgY3VycmVudCBjb250ZXh0IGlkCi0gICAgZ2xtc2ctPnNldF9jb250ZXh0X2lkKGNvbnRleHQtPmdldElkKCkpOwotCi0gICAgLy8gc2V0IHN0YXJ0IHRpbWUgYW5kIGR1cmF0aW9uCi0gICAgZ2xtc2ctPnNldF9zdGFydF90aW1lKHdhbGxTdGFydCk7Ci0gICAgZ2xtc2ctPnNldF9kdXJhdGlvbigodW5zaWduZWQpKHdhbGxFbmQgLSB3YWxsU3RhcnQpKTsKLSAgICBnbG1zZy0+c2V0X3RocmVhZHRpbWUoKHVuc2lnbmVkKSh0aHJlYWRFbmQgLSB0aHJlYWRTdGFydCkpOwotCi0gICAgLy8gZG8gYW55IGN1c3RvbSBtZXNzYWdlIGRlcGVuZGVudCBwcm9jZXNzaW5nCi0gICAgc3dpdGNoIChnbG1zZy0+ZnVuY3Rpb24oKSkgewotICAgIGNhc2UgR0xNZXNzYWdlOjpnbERlbGV0ZUJ1ZmZlcnM6ICAgICAgLyogZ2xEZWxldGVCdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsgKi8KLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xEZWxldGVGcmFtZWJ1ZmZlcnM6IC8qIGdsRGVsZXRlRnJhbWVidWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsgKi8KLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xEZWxldGVSZW5kZXJidWZmZXJzOi8qIGdsRGVsZXRlUmVuZGVyYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7ICovCi0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsRGVsZXRlVGV4dHVyZXM6ICAgICAvKiBnbERlbGV0ZVRleHR1cmVzKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7ICovCi0gICAgICAgIGZpeHVwX2dsRGVsZXRlR2VuZXJpYyhnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2VuQnVmZmVyczogICAgICAgIC8qIHZvaWQgZ2xHZW5CdWZmZXJzKEdMc2l6ZWkgbiwgR0x1aW50ICpidWZmZXJzKTsgKi8KLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xHZW5GcmFtZWJ1ZmZlcnM6ICAgLyogdm9pZCBnbEdlbkZyYW1lYnVmZmVycyhHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyk7ICovCi0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2VuUmVuZGVyYnVmZmVyczogIC8qIHZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnMoR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpOyAqLwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdlblRleHR1cmVzOiAgICAgICAvKiB2b2lkIGdsR2VuVGV4dHVyZXMoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsgKi8KLSAgICAgICAgZml4dXBfZ2xHZW5HZW5lcmljKGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xMaW5rUHJvZ3JhbTogICAgICAgLyogdm9pZCBnbExpbmtQcm9ncmFtKEdMdWludCBwcm9ncmFtKTsgKi8KLSAgICAgICAgZml4dXBfZ2xMaW5rUHJvZ3JhbShnbG1zZyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdldEFjdGl2ZUF0dHJpYjoKLSAgICAgICAgZml4dXBfZ2xHZXRBY3RpdmVBdHRyaWJPclVuaWZvcm0oY29udGV4dCwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdldEFjdGl2ZVVuaWZvcm06Ci0gICAgICAgIGZpeHVwX2dsR2V0QWN0aXZlQXR0cmliT3JVbmlmb3JtKGNvbnRleHQsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xCaW5kQXR0cmliTG9jYXRpb246Ci0gICAgICAgIC8qIHZvaWQgZ2xCaW5kQXR0cmliTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgY29uc3QgR0xjaGFyKiBuYW1lKTsgKi8KLSAgICAgICAgZml4dXBfQ1N0cmluZ1B0cigyLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0QXR0cmliTG9jYXRpb246Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0VW5pZm9ybUxvY2F0aW9uOgotICAgICAgICAvKiBpbnQgZ2xHZXRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSAqLwotICAgICAgICAvKiBpbnQgZ2xHZXRVbmlmb3JtTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkgKi8KLSAgICAgICAgZml4dXBfQ1N0cmluZ1B0cigxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0Qm9vbGVhbnY6Ci0gICAgICAgIGZpeHVwX2dsR2V0Qm9vbGVhbnYoZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdldEZsb2F0djoKLSAgICAgICAgZml4dXBfZ2xHZXRGbG9hdHYoZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdldEludGVnZXJ2OiAgICAgICAgLyogdm9pZCBnbEdldEludGVnZXJ2KEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7ICovCi0gICAgICAgIGZpeHVwX0dlbmVyaWNJbnRBcnJheSgxLCAxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0UHJvZ3JhbWl2OgotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2OgotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEdldFNoYWRlcml2OgotICAgICAgICAvKiB2b2lkIGdsR2V0UHJvZ3JhbWl2KEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpICovCi0gICAgICAgIC8qIHZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdihHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpICovCi0gICAgICAgIC8qIHZvaWQgZ2xHZXRTaGFkZXJpdihHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpICovCi0gICAgICAgIGZpeHVwX0dlbmVyaWNJbnRBcnJheSgyLCAxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsR2V0U3RyaW5nOgotICAgICAgICBmaXh1cF9nbEdldFN0cmluZyhnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVGV4SW1hZ2UyRDoKLSAgICAgICAgaWYgKGNvbnRleHQtPmdldEdsb2JhbFRyYWNlU3RhdGUoKS0+c2hvdWxkQ29sbGVjdFRleHR1cmVEYXRhT25HbFRleEltYWdlKCkpIHsKLSAgICAgICAgICAgIGZpeHVwX2dsVGV4SW1hZ2UyRChnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xUZXhTdWJJbWFnZTJEOgotICAgICAgICBpZiAoY29udGV4dC0+Z2V0R2xvYmFsVHJhY2VTdGF0ZSgpLT5zaG91bGRDb2xsZWN0VGV4dHVyZURhdGFPbkdsVGV4SW1hZ2UoKSkgewotICAgICAgICAgICAgZml4dXBfZ2xUZXhTdWJJbWFnZTJEKGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFNoYWRlclNvdXJjZToKLSAgICAgICAgZml4dXBfZ2xTaGFkZXJTb3VyY2UoZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFVuaWZvcm0xaXY6Ci0gICAgICAgIC8qIHZvaWQgZ2xVbmlmb3JtMWl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljSW50ZWdlcigyLCAxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTJpdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm0yaXYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSk7ICovCi0gICAgICAgIGZpeHVwX2dsVW5pZm9ybUdlbmVyaWNJbnRlZ2VyKDIsIDIsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtM2l2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybTNpdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKTsgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtR2VuZXJpY0ludGVnZXIoMiwgMywgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFVuaWZvcm00aXY6Ci0gICAgICAgIC8qIHZvaWQgZ2xVbmlmb3JtNGl2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpOyAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1HZW5lcmljSW50ZWdlcigyLCA0LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTFmdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm0xZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtR2VuZXJpYygyLCAxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTJmdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm0yZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtR2VuZXJpYygyLCAyLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTNmdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm0zZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtR2VuZXJpYygyLCAzLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybTRmdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm00ZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKTsgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtR2VuZXJpYygyLCA0LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsVW5pZm9ybU1hdHJpeDJmdjoKLSAgICAgICAgLyogdm9pZCBnbFVuaWZvcm1NYXRyaXgyZnYoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQqIHZhbHVlKSAqLwotICAgICAgICBmaXh1cF9nbFVuaWZvcm1NYXRyaXhHZW5lcmljKDIsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xVbmlmb3JtTWF0cml4M2Z2OgotICAgICAgICAvKiB2b2lkIGdsVW5pZm9ybU1hdHJpeDJmdihHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0xmbG9hdCogdmFsdWUpICovCi0gICAgICAgIGZpeHVwX2dsVW5pZm9ybU1hdHJpeEdlbmVyaWMoMywgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbFVuaWZvcm1NYXRyaXg0ZnY6Ci0gICAgICAgIC8qIHZvaWQgZ2xVbmlmb3JtTWF0cml4NGZ2KEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHTGZsb2F0KiB2YWx1ZSkgKi8KLSAgICAgICAgZml4dXBfZ2xVbmlmb3JtTWF0cml4R2VuZXJpYyg0LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsQnVmZmVyRGF0YToKLSAgICAgICAgLyogdm9pZCBnbEJ1ZmZlckRhdGEoR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQqIGRhdGEsIEdMZW51bSB1c2FnZSkgKi8KLSAgICAgICAgZml4dXBfZ2xCdWZmZXJEYXRhKGNvbnRleHQsIGdsbXNnLCBwb2ludGVyc1RvRml4dXApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdMTWVzc2FnZTo6Z2xCdWZmZXJTdWJEYXRhOgotICAgICAgICAvKiB2b2lkIGdsQnVmZmVyU3ViRGF0YShHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSAqLwotICAgICAgICBmaXh1cF9nbEJ1ZmZlclN1YkRhdGEoY29udGV4dCwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbERyYXdBcnJheXM6Ci0gICAgICAgIC8qIHZvaWQgZ2xEcmF3QXJyYXlzKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCkgKi8KLSAgICAgICAgZml4dXBfZ2xEcmF3QXJyYXlzKGNvbnRleHQsIGdsbXNnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsRHJhd0VsZW1lbnRzOgotICAgICAgICAvKiB2b2lkIGdsRHJhd0VsZW1lbnRzKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBpbmRpY2VzKSAqLwotICAgICAgICBmaXh1cF9nbERyYXdFbGVtZW50cyhjb250ZXh0LCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHTE1lc3NhZ2U6OmdsUHVzaEdyb3VwTWFya2VyRVhUOgotICAgICAgICAvKiB2b2lkIFB1c2hHcm91cE1hcmtlckVYVChzaXplaSBsZW5ndGgsIGNvbnN0IGNoYXIgKm1hcmtlcik7ICovCi0gICAgICAgIGZpeHVwX0NTdHJpbmdQdHIoMSwgZ2xtc2csIHBvaW50ZXJzVG9GaXh1cFswXSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgR0xNZXNzYWdlOjpnbEluc2VydEV2ZW50TWFya2VyRVhUOgotICAgICAgICAvKiB2b2lkIEluc2VydEV2ZW50TWFya2VyRVhUKHNpemVpIGxlbmd0aCwgY29uc3QgY2hhciAqbWFya2VyKTsgKi8KLSAgICAgICAgZml4dXBfQ1N0cmluZ1B0cigxLCBnbG1zZywgcG9pbnRlcnNUb0ZpeHVwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi19OwotfTsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZml4dXAuaCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfZml4dXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzMDEyNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2ZpeHVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fR0xUUkFDRV9GSVhVUF9IXwotI2RlZmluZSBfX0dMVFJBQ0VfRklYVVBfSF8KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSAiZ2x0cmFjZS5wYi5oIgotI2luY2x1ZGUgImdsdHJhY2VfY29udGV4dC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLXZvaWQgZml4dXBHTE1lc3NhZ2UoR0xUcmFjZUNvbnRleHQgKmN1ckNvbnRleHQsIG5zZWNzX3Qgd2FsbFN0YXJ0LCBuc2Vjc190IHdhbGxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRocmVhZFN0YXJ0LCBuc2Vjc190IHRocmVhZEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMTWVzc2FnZSAqbWVzc2FnZSwgdm9pZCAqcG9pbnRlcnNUb0ZpeHVwW10pOwotdm9pZCBmaXh1cF9hZGRGQkNvbnRlbnRzKEdMVHJhY2VDb250ZXh0ICpjdXJDb250ZXh0LCBHTE1lc3NhZ2UgKm1lc3NhZ2UsIEZCQmluZGluZyBmYlRvUmVhZCk7Ci0KLX07Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfaG9va3MuY3BwIGIvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9ob29rcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGQ0NjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV9ob29rcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiaG9va3MuaCIKLSNpbmNsdWRlICJnbHRyYWNlX2FwaS5oIgotI2luY2x1ZGUgImdsdHJhY2VfaG9va3MuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotCi0vLyBIb29rIHVwIGFsbCB0aGUgR0xUcmFjZSBmdW5jdGlvbnMKLSNkZWZpbmUgR0xfRU5UUlkoX3IsIF9hcGksIC4uLikgR0xUcmFjZV8gIyMgX2FwaSwKLUVHTEFQSSBnbF9ob29rc190IGdIb29rc0RlYnVnID0gewotICAgIHsKLSAgICAgICAgI2luY2x1ZGUgImVudHJpZXMuaW4iCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIHswfQotICAgIH0KLX07Ci0jdW5kZWYgR0xfRU5UUlkKLQotZ2xfaG9va3NfdCAqZ2V0R0xIb29rcygpIHsKLSAgICByZXR1cm4gJmdIb29rc0RlYnVnOwotfQotCi19OwotfTsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfaG9va3MuaCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfaG9va3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0NmEwOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX2hvb2tzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9fR0xEX0hPT0tTX0hfCi0jZGVmaW5lIF9fR0xEX0hPT0tTX0hfCi0KLSNpbmNsdWRlICJob29rcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6Z2xfaG9va3NfdDsKLQotZ2xfaG9va3NfdCAqZ2V0R0xIb29rcygpOwotCi19OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX3RyYW5zcG9ydC5jcHAgYi9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3NyYy9nbHRyYWNlX3RyYW5zcG9ydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTFiMTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV90cmFuc3BvcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxzeXMvdW4uaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0KLSNpbmNsdWRlICJnbHRyYWNlX3RyYW5zcG9ydC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgZ2x0cmFjZSB7Ci0KLWludCBhY2NlcHRDbGllbnRDb25uZWN0aW9uKGNoYXIgKnNvY2tuYW1lKSB7Ci0gICAgaW50IHNlcnZlclNvY2tldCA9IHNvY2tldChBRl9MT0NBTCwgU09DS19TVFJFQU0sIDApOwotICAgIGlmIChzZXJ2ZXJTb2NrZXQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJFcnJvciAoJWQpIHdoaWxlIGNyZWF0aW5nIHNvY2tldC4gQ2hlY2sgaWYgYXBwIGhhcyBuZXR3b3JrIHBlcm1pc3Npb25zLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU29ja2V0KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHN0cnVjdCBzb2NrYWRkcl91biBzZXJ2ZXIsIGNsaWVudDsKLQotICAgIG1lbXNldCgmc2VydmVyLCAwLCBzaXplb2Ygc2VydmVyKTsKLSAgICBzZXJ2ZXIuc3VuX2ZhbWlseSA9IEFGX1VOSVg7Ci0gICAgLy8gdGhlIGZpcnN0IGJ5dGUgb2Ygc3VuX3BhdGggc2hvdWxkIGJlICdcMCcgZm9yIGFic3RyYWN0IG5hbWVzcGFjZQotICAgIHN0cmNweShzZXJ2ZXIuc3VuX3BhdGggKyAxLCBzb2NrbmFtZSk7Ci0KLSAgICAvLyBub3RlIHRoYXQgc29ja2FkZHJfbGVuIHNob3VsZCBiZSBzZXQgdG8gdGhlIGV4YWN0IHNpemUgb2YgdGhlIGJ1ZmZlciB0aGF0IGlzIHVzZWQuCi0gICAgc29ja2xlbl90IHNvY2thZGRyX2xlbiA9IHNpemVvZihzZXJ2ZXIuc3VuX2ZhbWlseSkgKyBzdHJsZW4oc29ja25hbWUpICsgMTsKLSAgICBpZiAoYmluZChzZXJ2ZXJTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNlcnZlciwgc29ja2FkZHJfbGVuKSA8IDApIHsKLSAgICAgICAgY2xvc2Uoc2VydmVyU29ja2V0KTsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBiaW5kIHRoZSBzZXJ2ZXIgc29ja2V0Iik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAobGlzdGVuKHNlcnZlclNvY2tldCwgMSkgPCAwKSB7Ci0gICAgICAgIGNsb3NlKHNlcnZlclNvY2tldCk7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbGlzdGVuIG9uIHNlcnZlciBzb2NrZXQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIEFMT0dEKCJnbHRyYWNlOjp3YWl0Rm9yQ2xpZW50Q29ubmVjdGlvbjogc2VydmVyIGxpc3RlbmluZyBAIHBhdGggJXMiLCBzb2NrbmFtZSk7Ci0KLSAgICBpbnQgY2xpZW50U29ja2V0ID0gYWNjZXB0KHNlcnZlclNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbGllbnQsICZzb2NrYWRkcl9sZW4pOwotICAgIGlmIChjbGllbnRTb2NrZXQgPCAwKSB7Ci0gICAgICAgIGNsb3NlKHNlcnZlclNvY2tldCk7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9uIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBBTE9HRCgiZ2x0cmFjZTo6d2FpdEZvckNsaWVudENvbm5lY3Rpb246IGNsaWVudCBjb25uZWN0ZWQuIik7Ci0KLSAgICAvLyBkbyBub3QgYWNjZXB0IGFueSBtb3JlIGluY29taW5nIGNvbm5lY3Rpb25zCi0gICAgY2xvc2Uoc2VydmVyU29ja2V0KTsKLQotICAgIHJldHVybiBjbGllbnRTb2NrZXQ7Ci19Ci0KLVRDUFN0cmVhbTo6VENQU3RyZWFtKGludCBzb2NrZXQpIHsKLSAgICBtU29ja2V0ID0gc29ja2V0OwotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbVNvY2tldFdyaXRlTXV0ZXgsIE5VTEwpOwotfQotCi1UQ1BTdHJlYW06On5UQ1BTdHJlYW0oKSB7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtU29ja2V0V3JpdGVNdXRleCk7Ci19Ci0KLXZvaWQgVENQU3RyZWFtOjpjbG9zZVN0cmVhbSgpIHsKLSAgICBpZiAobVNvY2tldCA+IDApIHsKLSAgICAgICAgY2xvc2UobVNvY2tldCk7Ci0gICAgICAgIG1Tb2NrZXQgPSAwOwotICAgIH0KLX0KLQotaW50IFRDUFN0cmVhbTo6c2VuZCh2b2lkICpidWYsIHNpemVfdCBsZW4pIHsKLSAgICBpZiAobVNvY2tldCA8PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Tb2NrZXRXcml0ZU11dGV4KTsKLSAgICBpbnQgbiA9IHdyaXRlKG1Tb2NrZXQsIGJ1ZiwgbGVuKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbVNvY2tldFdyaXRlTXV0ZXgpOwotCi0gICAgcmV0dXJuIG47Ci19Ci0KLWludCBUQ1BTdHJlYW06OnJlY2VpdmUodm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewotICAgIGlmIChtU29ja2V0IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiByZWFkKG1Tb2NrZXQsIGRhdGEsIGxlbik7Ci19Ci0KLUJ1ZmZlcmVkT3V0cHV0U3RyZWFtOjpCdWZmZXJlZE91dHB1dFN0cmVhbShUQ1BTdHJlYW0gKnN0cmVhbSwgc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBtU3RyZWFtID0gc3RyZWFtOwotCi0gICAgbUJ1ZmZlclNpemUgPSBidWZmZXJTaXplOwotICAgIG1TdHJpbmdCdWZmZXIgPSAiIjsKLSAgICBtU3RyaW5nQnVmZmVyLnJlc2VydmUoYnVmZmVyU2l6ZSk7Ci19Ci0KLWludCBCdWZmZXJlZE91dHB1dFN0cmVhbTo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJpbmdCdWZmZXIuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW50IG4gPSBtU3RyZWFtLT5zZW5kKCh2b2lkICopbVN0cmluZ0J1ZmZlci5kYXRhKCksIG1TdHJpbmdCdWZmZXIuc2l6ZSgpKTsKLSAgICBtU3RyaW5nQnVmZmVyLmNsZWFyKCk7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgQnVmZmVyZWRPdXRwdXRTdHJlYW06OmVucXVldWVNZXNzYWdlKEdMTWVzc2FnZSAqbXNnKSB7Ci0gICAgY29uc3QgdWludDMyX3QgbGVuID0gbXNnLT5CeXRlU2l6ZSgpOwotCi0gICAgbVN0cmluZ0J1ZmZlci5hcHBlbmQoKGNvbnN0IGNoYXIgKikmbGVuLCBzaXplb2YobGVuKSk7ICAgIC8vIGFwcGVuZCBoZWFkZXIKLSAgICBtc2ctPkFwcGVuZFRvU3RyaW5nKCZtU3RyaW5nQnVmZmVyKTsgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIG1lc3NhZ2UKLX0KLQotaW50IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtOjpzZW5kKEdMTWVzc2FnZSAqbXNnKSB7Ci0gICAgZW5xdWV1ZU1lc3NhZ2UobXNnKTsKLQotICAgIGlmIChtU3RyaW5nQnVmZmVyLnNpemUoKSA+IG1CdWZmZXJTaXplKSB7Ci0gICAgICAgIHJldHVybiBmbHVzaCgpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi19OyAgLy8gbmFtZXNwYWNlIGdsdHJhY2UKLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV90cmFuc3BvcnQuaCBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2Uvc3JjL2dsdHJhY2VfdHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjUwMzUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvR0xFU190cmFjZS9zcmMvZ2x0cmFjZV90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX19HTFRSQUNFX1RSQU5TUE9SVF9IXwotI2RlZmluZSBfX0dMVFJBQ0VfVFJBTlNQT1JUX0hfCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJnbHRyYWNlLnBiLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBnbHRyYWNlIHsKLQotLyoqCi0gKiBUQ1BTdHJlYW0gcHJvdmlkZXMgYSBUQ1AgYmFzZWQgY29tbXVuaWNhdGlvbiBjaGFubmVsIGZyb20gdGhlIGRldmljZSB0bwotICogdGhlIGhvc3QgZm9yIHRyYW5zZmVycmluZyBHTE1lc3NhZ2VzLgotICovCi1jbGFzcyBUQ1BTdHJlYW0gewotICAgIGludCBtU29ja2V0OwotICAgIHB0aHJlYWRfbXV0ZXhfdCBtU29ja2V0V3JpdGVNdXRleDsKLXB1YmxpYzoKLSAgICAvKiogQ3JlYXRlIGEgVENQIGJhc2VkIGNvbW11bmljYXRpb24gY2hhbm5lbCBvdmVyIEBzb2NrZXQgKi8KLSAgICBUQ1BTdHJlYW0oaW50IHNvY2tldCk7Ci0gICAgflRDUFN0cmVhbSgpOwotCi0gICAgLyoqIENsb3NlIHRoZSBjaGFubmVsLiAqLwotICAgIHZvaWQgY2xvc2VTdHJlYW0oKTsKLQotICAgIC8qKiBTZW5kIEBkYXRhIG9mIHNpemUgQGxlbiB0byBob3N0LiAuIFJldHVybnMgLTEgb24gZXJyb3IsIDAgb24gc3VjY2Vzcy4gKi8KLSAgICBpbnQgc2VuZCh2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKLQotICAgIC8qKiBSZWNlaXZlIGRhdGEgaW50byBAYnVmIGZyb20gdGhlIHJlbW90ZSBlbmQuIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAqLwotICAgIGludCByZWNlaXZlKHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOwotfTsKLQotLyoqCi0gKiBCdWZmZXJlZE91dHB1dFN0cmVhbSBwcm92aWRlcyBidWZmZXJpbmcgb2YgZGF0YSBzZW50IHRvIHRoZSB1bmRlcmx5aW5nCi0gKiB1bmJ1ZmZlcmVkIGNoYW5uZWwuCi0gKi8KLWNsYXNzIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHsKLSAgICBUQ1BTdHJlYW0gKm1TdHJlYW07Ci0KLSAgICBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgc3RkOjpzdHJpbmcgbVN0cmluZ0J1ZmZlcjsKLQotICAgIC8qKiBFbnF1ZXVlIG1lc3NhZ2UgaW50byBpbnRlcm5hbCBidWZmZXIuICovCi0gICAgdm9pZCBlbnF1ZXVlTWVzc2FnZShHTE1lc3NhZ2UgKm1zZyk7Ci1wdWJsaWM6Ci0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgQnVmZmVyZWQgc3RyZWFtIG9mIHNpemUgQGJ1ZmZlclNpemUsIHVzaW5nIEBzdHJlYW0gYXMKLSAgICAgKiBpdHMgdW5kZXJseWluZyBjaGFubmVsIGZvciB0cmFuc3BvcnQuCi0gICAgICovCi0gICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0oVENQU3RyZWFtICpzdHJlYW0sIHNpemVfdCBidWZmZXJTaXplKTsKLQotICAgIC8qKgotICAgICAqIFNlbmQgQG1zZy4gVGhlIG1lc3NhZ2UgY291bGQgYmUgYnVmZmVyZWQgYW5kIHNlbnQgbGF0ZXIgd2l0aCBhCi0gICAgICogc3Vic2VxdWVudCBtZXNzYWdlLiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MuCi0gICAgICovCi0gICAgaW50IHNlbmQoR0xNZXNzYWdlICptc2cpOwotCi0gICAgLyoqIFNlbmQgYW55IGJ1ZmZlcmVkIG1lc3NhZ2VzLCByZXR1cm5zIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MuICovCi0gICAgaW50IGZsdXNoKCk7Ci19OwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kOiBzdGFydCBhIHNlcnZlciBsaXN0ZW5pbmcgYXQgQHNvY2tOYW1lICh1bml4IGRvbWFpbiBzb2NrZXQsCi0gKiBhYnN0cmFjdCBuYW1lc3BhY2UgcGF0aCksIGFuZCB3YWl0IGZvciBhIGNsaWVudCBjb25uZWN0aW9uLgotICogUmV0dXJucyB0aGUgY29ubmVjdGVkIGNsaWVudCBzb2NrZXQgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4KLSAqLwotaW50IGFjY2VwdENsaWVudENvbm5lY3Rpb24oY2hhciAqc29ja05hbWUpOwotCi19OwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3Rvb2xzL2dlbmFwaS5weSBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvdG9vbHMvZ2VuYXBpLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDAzNGMxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvdG9vbHMvZ2VuYXBpLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0jIEFCT1VUCi0jICAgVGhpcyBzY3JpcHQgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdHJhY2UgaW1wbGVtZW50YXRpb25zIG9mIGFsbAotIyAgIE9wZW5HTCBjYWxscy4gV2hlbiBleGVjdXRlZCwgaXQgcmVhZHMgdGhlIHNwZWNzIGZvciB0aGUgT3BlbkdMIGNhbGxzCi0jICAgZnJvbSB0aGUgZmlsZXMgR0xFUzIvZ2wyX2FwaS5pbiwgR0xFUzIvZ2wyZXh0X2FwaS5pbiwgR0xFU19DTS9nbF9hcGkuaW4sCi0jICAgYW5kIEdMRVNfQ00vZ2xleHRfYXBpLmluLCBhbmQgZ2VuZXJhdGVzIHRyYWNlIHZlcnNpb25zIGZvciBhbGwgdGhlIAotIyAgIGRlZmluZWQgZnVuY3Rpb25zLgotIwotIyBQUkVSRVFVSVNJVEVTCi0jICAgVG8gZ2VuZXJhdGUgQysrIGZpbGVzLCB0aGlzIHNjcmlwdCB1c2VzIHRoZSAncHlyYXRlbXAnIHRlbXBsYXRlCi0jICAgbW9kdWxlLiBUaGUgb25seSByZWFzb24gdG8gdXNlIHB5cmF0ZW1wIGlzIHRoYXQgaXQgaXMgZXh0cmVtbHkKLSMgICBzaW1wbGUgdG8gaW5zdGFsbDoKLSMgICAkIHdnZXQgaHR0cDovL3d3dy5zaW1wbGUtaXMtYmV0dGVyLm9yZy90ZW1wbGF0ZS9weXJhdGVtcC1jdXJyZW50L3B5cmF0ZW1wLnB5Ci0jICAgUHV0IHRoZSBmaWxlIGluIHRoZSBHTEVTX3RyYWNlL3Rvb2xzIGZvbGRlciwgb3IgdXBkYXRlIFBZVEhPTlBBVEgKLSMgICB0byBwb2ludCB0byB3aGVyZXZlciBpdCB3YXMgZG93bmxvYWRlZC4KLSMKLSMgVVNBR0UKLSMgICAkIGNkIEdMRVNfdHJhY2UgICAgICAgLSBydW4gdGhlIHByb2dyYW0gZnJvbSBHTEVTMl90cmFjZSBmb2xkZXIKLSMgICAkIC4vdG9vbHMvZ2VuYXBpLnB5ICAgLSBnZW5lcmF0ZXMgYSAuY3BwIGFuZCAuaCBmaWxlCi0jICAgJCBtdiAqLmNwcCAqLmggc3JjLyAgIC0gbW92ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIGludG8gdGhlIHNyYyBmb2xkZXIKLQotaW1wb3J0IHN5cwotaW1wb3J0IHJlCi1pbXBvcnQgcHlyYXRlbXAKLQotIyBDb25zdGFudHMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdG9idWYgRGF0YVR5cGUuVHlwZQotY2xhc3MgRGF0YVR5cGU6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0KLSAgICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi5uYW1lID09ICJwb2ludGVyIjogICMgcG9pbnRlcnMgbWFwIHRvIHRoZSBJTlQgRGF0YVR5cGUKLSAgICAgICAgICAgIHJldHVybiAiSU5UIgotICAgICAgICByZXR1cm4gc2VsZi5uYW1lLnVwcGVyKCkKLQotICAgIGRlZiBnZXRQcm90b2J1ZkNhbGwoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYubmFtZSA9PSAidm9pZCI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBdHRlbXB0IHRvIHNldCB2b2lkIHZhbHVlIikKLSAgICAgICAgZWxpZiBzZWxmLm5hbWUgPT0gImNoYXIiIG9yIHNlbGYubmFtZSA9PSAiYnl0ZSIgXAotICAgICAgICAgICAgICAgIG9yIHNlbGYubmFtZSA9PSAicG9pbnRlciIgb3Igc2VsZi5uYW1lID09ICJlbnVtIjoKLSAgICAgICAgICAgIHJldHVybiAiYWRkX2ludHZhbHVlKChpbnQpIgotICAgICAgICBlbGlmIHNlbGYubmFtZSA9PSAiaW50IjoKLSAgICAgICAgICAgIHJldHVybiAiYWRkX2ludHZhbHVlKCIKLSAgICAgICAgZWxpZiBzZWxmLm5hbWUgPT0gImZsb2F0IjoKLSAgICAgICAgICAgIHJldHVybiAiYWRkX2Zsb2F0dmFsdWUoIgotICAgICAgICBlbGlmIHNlbGYubmFtZSA9PSAiYm9vbCI6Ci0gICAgICAgICAgICByZXR1cm4gImFkZF9ib29sdmFsdWUoIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biB2YWx1ZSB0eXBlICVzIiAlIHNlbGYubmFtZSkKLQotRGF0YVR5cGUuVk9JRCA9IERhdGFUeXBlKCJ2b2lkIikKLURhdGFUeXBlLkNIQVIgPSBEYXRhVHlwZSgiY2hhciIpCi1EYXRhVHlwZS5CWVRFID0gRGF0YVR5cGUoImJ5dGUiKQotRGF0YVR5cGUuRU5VTSA9IERhdGFUeXBlKCJlbnVtIikKLURhdGFUeXBlLkJPT0wgPSBEYXRhVHlwZSgiYm9vbCIpCi1EYXRhVHlwZS5JTlQgPSBEYXRhVHlwZSgiaW50IikKLURhdGFUeXBlLkZMT0FUID0gRGF0YVR5cGUoImZsb2F0IikKLURhdGFUeXBlLlBPSU5URVIgPSBEYXRhVHlwZSgicG9pbnRlciIpCi0KLSMgbWFwcGluZyBvZiBHTCB0eXBlcyB0byBwcm90b2J1ZiBEYXRhVHlwZQotR0wyUFJPVE9CVUZfVFlQRV9NQVAgPSB7Ci0gICAgIkdMdm9pZCI6RGF0YVR5cGUuVk9JRCwKLSAgICAidm9pZCI6RGF0YVR5cGUuVk9JRCwKLSAgICAiR0xjaGFyIjpEYXRhVHlwZS5DSEFSLAotICAgICJHTGVudW0iOkRhdGFUeXBlLkVOVU0sCi0gICAgIkdMYm9vbGVhbiI6RGF0YVR5cGUuQk9PTCwKLSAgICAiR0xiaXRmaWVsZCI6RGF0YVR5cGUuSU5ULAotICAgICJHTGJ5dGUiOkRhdGFUeXBlLkJZVEUsCi0gICAgIkdMc2hvcnQiOkRhdGFUeXBlLklOVCwKLSAgICAiR0xpbnQiOkRhdGFUeXBlLklOVCwKLSAgICAiaW50IjpEYXRhVHlwZS5JTlQsCi0gICAgIkdMc2l6ZWkiOkRhdGFUeXBlLklOVCwKLSAgICAiR0x1Ynl0ZSI6RGF0YVR5cGUuQllURSwKLSAgICAiR0x1c2hvcnQiOkRhdGFUeXBlLklOVCwKLSAgICAiR0x1aW50IjpEYXRhVHlwZS5JTlQsCi0gICAgIkdMZmxvYXQiOkRhdGFUeXBlLkZMT0FULAotICAgICJHTGNsYW1wZiI6RGF0YVR5cGUuRkxPQVQsCi0gICAgIkdMZml4ZWQiOkRhdGFUeXBlLklOVCwKLSAgICAiR0xjbGFtcHgiOkRhdGFUeXBlLklOVCwKLSAgICAiR0xzaXplaXB0ciI6RGF0YVR5cGUuSU5ULAotICAgICJHTGludHB0ciI6RGF0YVR5cGUuSU5ULAotICAgICJHTGVnbEltYWdlT0VTIjpEYXRhVHlwZS5QT0lOVEVSLAotfQotCi1BUElfU1BFQ1MgPSBbCi0gICAgKCdHTDInLCcuLi9HTEVTMi9nbDJfYXBpLmluJyksCi0gICAgKCdHTDJFeHQnLCcuLi9HTEVTMi9nbDJleHRfYXBpLmluJyksCi0gICAgKCdHTDEnLCcuLi9HTEVTX0NNL2dsX2FwaS5pbicpLAotICAgICgnR0wxRXh0JywnLi4vR0xFU19DTS9nbGV4dF9hcGkuaW4nKSwKLV0KLQotSEVBREVSX0xJQ0VOU0UgPSAiIiIvKgotICogQ29weXJpZ2h0IDIwMTEsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBUSElTIEZJTEUgV0FTIEdFTkVSQVRFRCBCWSBBIFNDUklQVC4gRE8gTk9UIEVESVQuCi0gKi8KLSIiIgotCi1IRUFERVJfSU5DTFVERVMgPSAiIiIKLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0KLSNpbmNsdWRlICJnbHRyYWNlLnBiLmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9jb250ZXh0LmgiCi0jaW5jbHVkZSAiZ2x0cmFjZV9maXh1cC5oIgotI2luY2x1ZGUgImdsdHJhY2VfdHJhbnNwb3J0LmgiCi0iIiIKLQotSEVBREVSX05BTUVTUEFDRV9TVEFSVCA9ICIiIgotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGdsdHJhY2UgewotIiIiCi0KLUZPT1RFUl9URVhUID0gIiIiCi19OyAvLyBuYW1lc3BhY2UgZ2x0cmFjZQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLSIiIgotCi1UUkFDRV9DQUxMX1RFTVBMQVRFID0gcHlyYXRlbXAuVGVtcGxhdGUoCi0iIiIkIXJldFR5cGUhJCBHTFRyYWNlXyQhZnVuYyEkKCQhaW5wdXRBcmdMaXN0ISQpIHsKLSAgICBHTE1lc3NhZ2UgZ2xtc2c7Ci0gICAgR0xUcmFjZUNvbnRleHQgKmdsQ29udGV4dCA9IGdldEdMVHJhY2VDb250ZXh0KCk7Ci0KLSAgICBnbG1zZy5zZXRfZnVuY3Rpb24oR0xNZXNzYWdlOjokIWZ1bmMhJCk7Ci08IS0tKGlmIGxlbihwYXJzZWRBcmdzKSA+IDApLS0+Ci0gICAgPCEtLShmb3IgYXJnbmFtZSwgYXJndHlwZSBpbiBwYXJzZWRBcmdzKS0tPgotCi0gICAgLy8gY29weSBhcmd1bWVudCAkIWFyZ25hbWUhJAotICAgIEdMTWVzc2FnZV9EYXRhVHlwZSAqYXJnXyQhYXJnbmFtZSEkID0gZ2xtc2cuYWRkX2FyZ3MoKTsKLSAgICBhcmdfJCFhcmduYW1lISQtPnNldF9pc2FycmF5KGZhbHNlKTsKLSAgICBhcmdfJCFhcmduYW1lISQtPnNldF90eXBlKEdMTWVzc2FnZTo6RGF0YVR5cGU6OiQhYXJndHlwZSEkKTsKLSAgICBhcmdfJCFhcmduYW1lISQtPiQhYXJndHlwZS5nZXRQcm90b2J1ZkNhbGwoKSEkJCFhcmduYW1lISQpOwotICAgIDwhLS0oZW5kKS0tPgotPCEtLShlbmQpLS0+Ci0KLSAgICAvLyBjYWxsIGZ1bmN0aW9uCi0gICAgbnNlY3NfdCB3YWxsU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgIG5zZWNzX3QgdGhyZWFkU3RhcnRUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9USFJFQUQpOwotPCEtLShpZiByZXRUeXBlICE9ICJ2b2lkIiktLT4KLSAgICAkIXJldFR5cGUhJCByZXRWYWx1ZSA9IGdsQ29udGV4dC0+aG9va3MtPmdsLiQhY2FsbHNpdGUhJDsKLTwhLS0oZWxzZSktLT4KLSAgICBnbENvbnRleHQtPmhvb2tzLT5nbC4kIWNhbGxzaXRlISQ7Ci08IS0tKGVuZCktLT4KLSAgICBuc2Vjc190IHRocmVhZEVuZFRpbWUgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX1RIUkVBRCk7Ci0gICAgbnNlY3NfdCB3YWxsRW5kVGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLTwhLS0oaWYgcmV0VHlwZSAhPSAidm9pZCIpLS0+Ci0KLSAgICAvLyBzZXQgcmV0dXJuIHZhbHVlCi0gICAgR0xNZXNzYWdlX0RhdGFUeXBlICpydCA9IGdsbXNnLm11dGFibGVfcmV0dXJudmFsdWUoKTsKLSAgICBydC0+c2V0X2lzYXJyYXkoZmFsc2UpOwotICAgIHJ0LT5zZXRfdHlwZShHTE1lc3NhZ2U6OkRhdGFUeXBlOjokIXJldERhdGFUeXBlISQpOwotICAgIHJ0LT4kIXJldERhdGFUeXBlLmdldFByb3RvYnVmQ2FsbCgpISRyZXRWYWx1ZSk7Ci08IS0tKGVuZCktLT4KLQotICAgIHZvaWQgKnBvaW50ZXJBcmdzW10gPSB7Ci08IS0tKGZvciBhcmduYW1lLCBhcmd0eXBlIGluIHBhcnNlZEFyZ3MpLS0+Ci0gICAgPCEtLShpZiBhcmd0eXBlID09IERhdGFUeXBlLlBPSU5URVIpLS0+Ci0gICAgICAgICh2b2lkICopICQhYXJnbmFtZSEkLAotICAgIDwhLS0oZW5kKS0tPgotPCEtLShlbmQpLS0+Ci08IS0tKGlmIHJldERhdGFUeXBlID09IERhdGFUeXBlLlBPSU5URVIpLS0+Ci0gICAgICAgICh2b2lkICopIHJldFZhbHVlLAotPCEtLShlbmQpLS0+Ci0gICAgfTsKLQotICAgIGZpeHVwR0xNZXNzYWdlKGdsQ29udGV4dCwgd2FsbFN0YXJ0VGltZSwgd2FsbEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTdGFydFRpbWUsIHRocmVhZEVuZFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xtc2csIHBvaW50ZXJBcmdzKTsKLSAgICBnbENvbnRleHQtPnRyYWNlR0xNZXNzYWdlKCZnbG1zZyk7Ci08IS0tKGlmIHJldFR5cGUgIT0gInZvaWQiKS0tPgotCi0gICAgcmV0dXJuIHJldFZhbHVlOwotPCEtLShlbmQpLS0+Ci19Ci0iIiIpCi0KLWRlZiBnZXREYXRhVHlwZUZyb21Ldyhrdyk6Ci0gICAgIiIiIEdldCB0aGUgZGF0YSB0eXBlIGdpdmVuIGRlY2xhcmF0aW9uLgotICAgIEFsbCBwb2ludGVyIGRlY2xhcmF0aW9ucyBhcmUgb2YgdHlwZSBEYXRhVHlwZS5QT0lOVEVSCi0KLSAgICBlLmcuOiBHTHZvaWQgLT4gRGF0YVR5cGUuVk9JRCIiIgotCi0gICAgaWYga3cuY291bnQoJyonKSA+IDA6Ci0gICAgICAgIHJldHVybiBEYXRhVHlwZS5QT0lOVEVSCi0gICAgcmV0dXJuIEdMMlBST1RPQlVGX1RZUEVfTUFQLmdldChrdykKLQotZGVmIGdldE5hbWVUeXBlUGFpcihkZWNsKToKLSAgICAiIiIgU3BsaXQgZGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZSB0byBhIHR1cGxlIG9mICh2YXJpYWJsZSBuYW1lLCBEYXRhVHlwZSkuCi0gICAgZS5nLiAiY29uc3QgR0xDaGFyKiB2YXJOYW1lIiAtPiAodmFyTmFtZSwgUE9JTlRFUikgIiIiCi0gICAgZWxlbWVudHMgPSBkZWNsLnN0cmlwKCkuc3BsaXQoJyAnKQotICAgIG5hbWUgPSBOb25lCi0gICAgaWYgbGVuKGVsZW1lbnRzKSA+IDE6Ci0gICAgICAgIG5hbWUgPSAiICIuam9pbihlbGVtZW50c1stMTpdKS5zdHJpcCgpICAgICAgIyBsYXN0IGVsZW1lbnQgaXMgdGhlIG5hbWUKLSAgICAgICAgZGF0YVR5cGUgPSAiICIuam9pbihlbGVtZW50c1s6LTFdKS5zdHJpcCgpICAjIGV2ZXJ5dGhpbmcgZWxzZSBpcyB0aGUgZGF0YSB0eXBlCi0KLSAgICAgICAgIyBpZiBuYW1lIGlzIGEgcG9pbnRlciAoZS5nLiAiKnB0ciIpLCB0aGVuIHJlbW92ZSB0aGUgIioiIGZyb20gdGhlIG5hbWUKLSAgICAgICAgIyBhbmQgYWRkIGl0IHRvIHRoZSBkYXRhIHR5cGUKLSAgICAgICAgcG9pbnRlcnNJbk5hbWUgPSBuYW1lLmNvdW50KCIqIikgICAgICAgICAgICAKLSAgICAgICAgaWYgcG9pbnRlcnNJbk5hbWUgPiAwOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgiKiIsICIiKQotICAgICAgICAgICAgZGF0YVR5cGUgKz0gIioiICogcG9pbnRlcnNJbk5hbWUKLQotICAgICAgICAjIGlmIG5hbWUgaXMgYW4gYXJyYXkgKGUuZy4gImFycmF5WzEwXSIpLCB0aGVuIHJlbW92ZSB0aGUgIltYXSIgZnJvbSB0aGUgbmFtZQotICAgICAgICAjIGFuZCBtYWtlIHRoZSBkYXRhdHlwZSB0byBiZSBhIHBvaW50ZXIKLSAgICAgICAgYXJyYXlzSW5OYW1lID0gbmFtZS5jb3VudCgiWyIpCi0gICAgICAgIGlmIGFycmF5c0luTmFtZSA+IDA6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnWycpWzBdCi0gICAgICAgICAgICBkYXRhVHlwZSArPSAiKiIKLSAgICBlbHNlOgotICAgICAgICBkYXRhVHlwZSA9IGVsZW1lbnRzWzBdCi0gICAgcmV0dXJuIChuYW1lLCBnZXREYXRhVHlwZUZyb21LdyhkYXRhVHlwZSkpCi0KLWRlZiBwYXJzZUFyZ3MoYXJnbGlzdCk6Ci0gICAgIiIiIFBhcnNlIHRoZSBhcmd1bWVudCBsaXN0IGludG8gYSBsaXN0IG9mICh2YXIgbmFtZSwgRGF0YVR5cGUpIHR1cGxlcyAiIiIKLSAgICBhcmdzID0gYXJnbGlzdC5zcGxpdCgnLCcpCi0gICAgYXJncyA9IG1hcChsYW1iZGEgeDogeC5zdHJpcCgpLCBhcmdzKSAgICAjIHJlbW92ZSB1bm5lY2Vzc2FyeSB3aGl0ZXNwYWNlcwotICAgIGFyZ3R5cGVsaXN0ID0gbWFwKGdldE5hbWVUeXBlUGFpciwgYXJncykgIyBzcGxpdCBhcmcgaW50byBhcmcgdHlwZSBhbmQgYXJnIG5hbWUKLSAgICBpZiBsZW4oYXJndHlwZWxpc3QpID09IDE6Ci0gICAgICAgIChuYW1lLCBhcmd0eXBlKSA9IGFyZ3R5cGVsaXN0WzBdCi0gICAgICAgIGlmIGFyZ3R5cGUgPT0gRGF0YVR5cGUuVk9JRDoKLSAgICAgICAgICAgIHJldHVybiBbXQotCi0gICAgcmV0dXJuIGFyZ3R5cGVsaXN0Ci0KLWNsYXNzIEFwaUNhbGwob2JqZWN0KToKLSAgICAiIiJBbiBBcGlDYWxsIG1vZGVscyBhbGwgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgT3BlbkdMIEFQSSIiIgotCi0gICAgIyBSZWdleCB0byBtYXRjaCBBUElfRU5UUlkgc3BlY2lmaWNhdGlvbjoKLSAgICAjICAgICAgIGUuZy4gdm9pZCBBUElfRU5UUlkoZ2xBY3RpdmVUZXh0dXJlKShHTGVudW0gdGV4dHVyZSkgewotICAgICMgdGhlIHJlZ2V4IHVzZXMgYSBub24gZ3JlZWR5IG1hdGNoICg/KSB0byBtYXRjaCB0aGUgZmlyc3QgY2xvc2luZyBwYXJlbgotICAgIEFQSV9FTlRSWV9SRUdFWCA9ICIoLiopQVBJX0VOVFJZXCguKj9cKVwoKC4qPylcKSIKLQotICAgICMgUmVnZXggdG8gbWF0Y2ggQ0FMTF9HTF9BUEkgc3BlY2lmaWNhdGlvbjoKLSAgICAjICAgICAgIGUuZy4gQ0FMTF9HTF9BUEkoZ2xDdWxsRmFjZSwgbW9kZSk7IAotICAgICMgICAgICAgICAgICBDQUxMX0dMX0FQSV9SRVRVUk4oZ2xDcmVhdGVQcm9ncmFtKTsKLSAgICBDQUxMX0dMX0FQSV9SRUdFWCA9ICJDQUxMX0dMX0FQSShfUkVUVVJOKT9cKCguKilcKTsiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgcHJlZml4LCBhcGllbnRyeSwgY2FsbHNpdGUpOgotICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gQXBpQ2FsbCBmcm9tIGl0cyBzcGVjaWZpY2F0aW9uLgotCi0gICAgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGlzIHByb3ZpZGVkIGJ5IHRoZSB0d28gYXJndW1lbnRzOgotICAgICAgICBwcmVmaXg6IHByZWZpeCB0byB1c2UgZm9yIGZ1bmN0aW9uIG5hbWVzCi0gICAgICAgIGRlZm46IHNwZWNpZmljYXRpb24gbGluZSBjb250YWluaW5nIEFQSV9FTlRSWSBtYWNybwotICAgICAgICAgICAgICBlLmc6IHZvaWQgQVBJX0VOVFJZKGdsQWN0aXZlVGV4dHVyZSkoR0xlbnVtIHRleHR1cmUpIHsKLSAgICAgICAgY2FsbHNpdGU6IHNwZWNpZmljYXRpb24gbGluZSBjb250YWluaW5nIENBTExfR0xfQVBJIG1hY3JvCi0gICAgICAgICAgICAgIGUuZzogQ0FMTF9HTF9BUEkoZ2xBY3RpdmVUZXh0dXJlLCB0ZXh0dXJlKTsgICAgICAgIAotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5wcmVmaXggPSBwcmVmaXgKLSAgICAgICAgc2VsZi5yZXQgPSBzZWxmLmdldFJldHVyblR5cGUoYXBpZW50cnkpCi0gICAgICAgIHNlbGYuYXJnbGlzdCA9IHNlbGYuZ2V0QXJnTGlzdChhcGllbnRyeSkKLQotICAgICAgICAjIHNvbWUgZnVuY3Rpb25zIChlLmcuIF9fZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMpLCBkZWZpbmUgdGhlaXIKLSAgICAgICAgIyBuYW1lcyBvbmUgd2F5IGluIHRoZSBBUElfRU5UUlkgYW5kIGFub3RoZXIgd2F5IGluIHRoZSBDQUxMX0dMX0FQSSBtYWNyb3MuCi0gICAgICAgICMgc28gc2VsZi5mdW5jIGlzIHJlYXNzaWduZWQgYmFzZWQgb24gd2hhdCBpcyB0aGVyZSBpbiB0aGUgY2FsbCBzaXRlCi0gICAgICAgIHNlbGYuZnVuYyA9IHNlbGYuZ2V0RnVuYyhjYWxsc2l0ZSkKLSAgICAgICAgc2VsZi5jYWxsc2l0ZSA9IHNlbGYuZ2V0Q2FsbFNpdGUoY2FsbHNpdGUpCi0KLSAgICBkZWYgZ2V0UmV0dXJuVHlwZShzZWxmLCBhcGllbnRyeSk6Ci0gICAgICAgICcnJ0V4dHJhY3QgdGhlIHJldHVybiB0eXBlIGZyb20gdGhlIEFQSV9FTlRSWSBzcGVjaWZpY2F0aW9uJycnCi0gICAgICAgIG0gPSByZS5zZWFyY2goc2VsZi5BUElfRU5UUllfUkVHRVgsIGFwaWVudHJ5KQotICAgICAgICBpZiBub3QgbToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzIGRvZXMgbm90IG1hdGNoIEFQSV9FTlRSWSBzcGVjaWZpY2F0aW9uICVzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoYXBpZW50cnksIHNlbGYuQVBJX0VOVFJZX1JFR0VYKSkKLQotICAgICAgICByZXR1cm4gbS5ncm91cCgxKS5zdHJpcCgpCi0KLSAgICBkZWYgZ2V0QXJnTGlzdChzZWxmLCBhcGllbnRyeSk6Ci0gICAgICAgICcnJ0V4dHJhY3QgdGhlIGFyZ3VtZW50IGxpc3QgZnJvbSB0aGUgQVBJX0VOVFJZIHNwZWNpZmljYXRpb24nJycKLSAgICAgICAgbSA9IHJlLnNlYXJjaChzZWxmLkFQSV9FTlRSWV9SRUdFWCwgYXBpZW50cnkpCi0gICAgICAgIGlmIG5vdCBtOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMgZG9lcyBub3QgbWF0Y2ggQVBJX0VOVFJZIHNwZWNpZmljYXRpb24gJXMiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChhcGllbnRyeSwgc2VsZi5BUElfRU5UUllfUkVHRVgpKQotCi0gICAgICAgIHJldHVybiBtLmdyb3VwKDIpLnN0cmlwKCkKLQotICAgIGRlZiBwYXJzZUNhbGxTaXRlKHNlbGYsIGNhbGxzaXRlKToKLSAgICAgICAgbSA9IHJlLnNlYXJjaChzZWxmLkNBTExfR0xfQVBJX1JFR0VYLCBjYWxsc2l0ZSkKLSAgICAgICAgaWYgbm90IG06Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIlcyBkb2VzIG5vdCBtYXRjaCBDQUxMX0dMX0FQSSBzcGVjaWZpY2F0aW9uICglcykiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNhbGxzaXRlLCBzZWxmLkNBTExfR0xfQVBJX1JFR0VYKSkKLQotICAgICAgICBhcmdsaXN0ID0gbS5ncm91cCgyKQotICAgICAgICBhcmdzID0gYXJnbGlzdC5zcGxpdCgnLCcpCi0gICAgICAgIGFyZ3MgPSBtYXAobGFtYmRhIHg6IHguc3RyaXAoKSwgYXJncykKLQotICAgICAgICByZXR1cm4gYXJncwotCi0gICAgZGVmIGdldENhbGxTaXRlKHNlbGYsIGNhbGxzaXRlKToKLSAgICAgICAgJycnRXh0cmFjdCB0aGUgY2FsbHNpdGUgZnJvbSB0aGUgQ0FMTF9HTF9BUEkgc3BlY2lmaWNhdGlvbicnJwotICAgICAgICBhcmdzID0gc2VsZi5wYXJzZUNhbGxTaXRlKGNhbGxzaXRlKQotICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoYXJnc1swXSwgIiwgIi5qb2luKGFyZ3NbMTpdKSkKLQotICAgIGRlZiBnZXRGdW5jKHNlbGYsIGNhbGxzaXRlKToKLSAgICAgICAgJycnRXh0cmFjdCB0aGUgZnVuY3Rpb24gbmFtZSBmcm9tIHRoZSBDQUxMX0dMX0FQSSBzcGVjaWZpY2F0aW9uJycnCi0gICAgICAgIGFyZ3MgPSBzZWxmLnBhcnNlQ2FsbFNpdGUoY2FsbHNpdGUpCi0gICAgICAgIHJldHVybiBhcmdzWzBdCi0KLSAgICBkZWYgZ2VuRGVjbGFyYXRpb24oc2VsZik6Ci0gICAgICAgIHJldHVybiAiJXMgR0xUcmFjZV8lcyglcyk7IiAlIChzZWxmLnJldCwgc2VsZi5mdW5jLCBzZWxmLmFyZ2xpc3QpCi0KLSAgICBkZWYgZ2VuQ29kZShzZWxmKToKLSAgICAgICAgcmV0dXJuIFRSQUNFX0NBTExfVEVNUExBVEUoZnVuYyA9IHNlbGYuZnVuYywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFR5cGUgPSBzZWxmLnJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0RGF0YVR5cGUgPSBnZXREYXRhVHlwZUZyb21LdyhzZWxmLnJldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QXJnTGlzdCA9IHNlbGYuYXJnbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbHNpdGUgPSBzZWxmLmNhbGxzaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRBcmdzID0gcGFyc2VBcmdzKHNlbGYuYXJnbGlzdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlPURhdGFUeXBlKQotCi1kZWYgZ2V0QXBpcyhhcGlFbnRyeUZpbGUsIHByZWZpeCk6Ci0gICAgJycnR2V0IGEgbGlzdCBvZiBhbGwgQXBpQ2FsbHMgaW4gcHJvdmlkZWQgc3BlY2lmaWNhdGlvbiBmaWxlJycnCi0gICAgbGluZXMgPSBvcGVuKGFwaUVudHJ5RmlsZSkucmVhZGxpbmVzKCkKLQotICAgIGFwaXMgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihsaW5lcykvMyk6Ci0gICAgICAgIGFwaXMuYXBwZW5kKEFwaUNhbGwocHJlZml4LCBsaW5lc1tpKjNdLCBsaW5lc1tpKjMrMV0pKQotCi0gICAgcmV0dXJuIGFwaXMKLQotZGVmIHBhcnNlQWxsU3BlY3Moc3BlY3MpOgotICAgIGFwaXMgPSBbXQotICAgIGZvciBuYW1lLCBzcGVjZmlsZSBpbiBzcGVjczoKLSAgICAgICAgYSA9IGdldEFwaXMoc3BlY2ZpbGUsIG5hbWUpCi0gICAgICAgIHByaW50ICdQYXJzZWQgJXMgQVBJcyBmcm9tICVzLCAjIG9mIGVudHJpZXMgPSAlZCcgJSAobmFtZSwgc3BlY2ZpbGUsIGxlbihhKSkKLSAgICAgICAgYXBpcy5leHRlbmQoYSkKLSAgICByZXR1cm4gYXBpcwotCi1kZWYgcmVtb3ZlRHVwbGljYXRlcyhhcGlzKToKLSAgICAnJydSZW1vdmUgYWxsIGR1cGxpY2F0ZSBmdW5jdGlvbiBlbnRyaWVzLgotCi0gICAgVGhlIGlucHV0IGxpc3QgY29udGFpbnMgZnVuY3Rpb25zIGRlY2xhcmVkIGluIEdMMSBhbmQgR0wyIEFQSXMuCi0gICAgVGhpcyB3aWxsIHJldHVybiBhIGxpc3QgdGhhdCBjb250YWlucyBvbmx5IHRoZSBmaXJzdCBmdW5jdGlvbiBpZiB0aGVyZSBhcmUKLSAgICBtdWx0aXBsZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLicnJwotICAgIHVuaXFzID0gW10KLSAgICBmdW5jcyA9IHNldCgpCi0gICAgZm9yIGFwaSBpbiBhcGlzOgotICAgICAgICBpZiBhcGkuZnVuYyBub3QgaW4gZnVuY3M6Ci0gICAgICAgICAgICB1bmlxcy5hcHBlbmQoYXBpKQotICAgICAgICAgICAgZnVuY3MuYWRkKGFwaS5mdW5jKQotCi0gICAgcmV0dXJuIHVuaXFzCi0KLWRlZiBnZW5IZWFkZXJzKGFwaXMsIGZuYW1lKToKLSAgICBsaW5lcyA9IFtdCi0gICAgbGluZXMuYXBwZW5kKEhFQURFUl9MSUNFTlNFKQotICAgIGxpbmVzLmFwcGVuZChIRUFERVJfTkFNRVNQQUNFX1NUQVJUKQotICAgIHByZWZpeCA9ICIiCi0gICAgZm9yIGFwaSBpbiBhcGlzOgotICAgICAgICBpZiBwcmVmaXggIT0gYXBpLnByZWZpeDoKLSAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiXG4vLyBEZWNsYXJhdGlvbnMgZm9yICVzIEFQSXNcblxuIiAlIGFwaS5wcmVmaXgpCi0gICAgICAgICAgICBwcmVmaXggPSBhcGkucHJlZml4Ci0gICAgICAgIGxpbmVzLmFwcGVuZChhcGkuZ2VuRGVjbGFyYXRpb24oKSkKLSAgICAgICAgbGluZXMuYXBwZW5kKCJcbiIpCi0gICAgbGluZXMuYXBwZW5kKEZPT1RFUl9URVhUKQotCi0gICAgd2l0aCBvcGVuKGZuYW1lLCAidyIpIGFzIGY6Ci0gICAgICAgIGYud3JpdGVsaW5lcyhsaW5lcykKLQotZGVmIGdlblNyY3MoYXBpcywgZm5hbWUpOgotICAgIGxpbmVzID0gW10KLSAgICBsaW5lcy5hcHBlbmQoSEVBREVSX0xJQ0VOU0UpCi0gICAgbGluZXMuYXBwZW5kKEhFQURFUl9JTkNMVURFUykKLSAgICBsaW5lcy5hcHBlbmQoSEVBREVSX05BTUVTUEFDRV9TVEFSVCkKLSAgICBwcmVmaXggPSAiIgotICAgIGZvciBhcGkgaW4gYXBpczoKLSAgICAgICAgaWYgcHJlZml4ICE9IGFwaS5wcmVmaXg6Ci0gICAgICAgICAgICBsaW5lcy5hcHBlbmQoIlxuLy8gRGVmaW5pdGlvbnMgZm9yICVzIEFQSXNcblxuIiAlIGFwaS5wcmVmaXgpCi0gICAgICAgICAgICBwcmVmaXggPSBhcGkucHJlZml4Ci0gICAgICAgIGxpbmVzLmFwcGVuZChhcGkuZ2VuQ29kZSgpKQotICAgICAgICBsaW5lcy5hcHBlbmQoIlxuIikKLSAgICBsaW5lcy5hcHBlbmQoRk9PVEVSX1RFWFQpCi0KLSAgICB3aXRoIG9wZW4oZm5hbWUsICJ3IikgYXMgZjoKLSAgICAgICAgZi53cml0ZWxpbmVzKGxpbmVzKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGFwaXMgPSBwYXJzZUFsbFNwZWNzKEFQSV9TUEVDUykgICAgICMgcmVhZCBpbiBhbGwgdGhlIHNwZWNmaWxlcwotICAgIGFwaXMgPSByZW1vdmVEdXBsaWNhdGVzKGFwaXMpICAgICAgICMgcmVtb3ZlIGR1cGxpY2F0aW9uIG9mIGZ1bmN0aW9ucyBjb21tb24gdG8gR0wxIGFuZCBHTDIKLSAgICBnZW5IZWFkZXJzKGFwaXMsICdnbHRyYWNlX2FwaS5oJykgICMgZ2VuZXJhdGUgaGVhZGVyIGZpbGUKLSAgICBnZW5TcmNzKGFwaXMsICdnbHRyYWNlX2FwaS5jcHAnKSAgICMgZ2VuZXJhdGUgc291cmNlIGZpbGUKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvdG9vbHMvdGVzdGdlbmFwaS5weSBiL29wZW5nbC9saWJzL0dMRVNfdHJhY2UvdG9vbHMvdGVzdGdlbmFwaS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxNDk1NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9HTEVTX3RyYWNlL3Rvb2xzL3Rlc3RnZW5hcGkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMKLSMgQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCi0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyBVU0FHRQotIyAgICQgY2QgR0xFU190cmFjZS90b29scwotIyAgICQgcHl0aG9uIHRlc3RnZW5hcGkucHkKLQotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGdlbmFwaSBpbXBvcnQgRGF0YVR5cGUsIEFwaUNhbGwsIGdldEFwaXMsIHBhcnNlQXJncwotCi1jbGFzcyBUZXN0QXBpQ2FsbCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHRlc3RfcGFyc2luZyhzZWxmKToKLSAgICAgICAgYXBpZW50cnkgPSAndm9pZCBBUElfRU5UUlkoZ2xDb3B5VGV4U3ViSW1hZ2UyRCkoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsICcgXAotICAgICAgICAgICAgICAgICAgICdHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCAnIFwKLSAgICAgICAgICAgICAgICAgICAnR0xzaXplaSBoZWlnaHQpIHsnCi0gICAgICAgIGNhbGxzaXRlID0gJ0NBTExfR0xfQVBJKGdsQ29weVRleEltYWdlMkQsIHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCcgXAotICAgICAgICAgICAgICAgICAgICd3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOycKLQotICAgICAgICBhcGkgPSBBcGlDYWxsKCJHTCIsIGFwaWVudHJ5LCBjYWxsc2l0ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcGkuZnVuYywgImdsQ29weVRleEltYWdlMkQiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFwaS5jYWxsc2l0ZSwgJ2dsQ29weVRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsICcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcGkucmV0LCAndm9pZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXBpLmFyZ2xpc3QsICdHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgJyBcCi0gICAgICAgICAgICAgICAgICAgJ0dMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsICcgXAotICAgICAgICAgICAgICAgICAgICdHTHNpemVpIGhlaWdodCcpCi0KLSAgICBkZWYgdGVzdF9udW1fZnVuY3Rpb25zX3BhcnNlZChzZWxmKToKLSAgICAgICAgZ2wyX2FwaXMgPSBnZXRBcGlzKCcuLi8uLi9HTEVTMi9nbDJfYXBpLmluJywgJ0dMMicpCi0gICAgICAgIGdsMmV4dF9hcGlzID0gZ2V0QXBpcygnLi4vLi4vR0xFUzIvZ2wyZXh0X2FwaS5pbicsICdHTDJFeHQnKQotICAgICAgICBnbF9hcGlzID0gZ2V0QXBpcygnLi4vLi4vR0xFU19DTS9nbF9hcGkuaW4nLCAiR0wxIikKLSAgICAgICAgZ2xleHRfYXBpcyA9IGdldEFwaXMoJy4uLy4uL0dMRVNfQ00vZ2xleHRfYXBpLmluJywgJ0dMMUV4dCcpCi0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2wyX2FwaXMpLCAxNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdsMmV4dF9hcGlzKSwgMTIxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnbF9hcGlzKSwgMTQ1KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnbGV4dF9hcGlzKSwgMTQwKQotCi0gICAgZGVmIHRlc3RfcGFyc2VBcmdzKHNlbGYpOgotICAgICAgICBhcmdzID0gcGFyc2VBcmdzKCJ2b2lkIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXJncyksIDApCi0KLSAgICAgICAgYXJncyA9IHBhcnNlQXJncygiR0xjaGFyIGEiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsoImEiLCBEYXRhVHlwZS5DSEFSKV0pCi0KLSAgICAgICAgYXJncyA9IHBhcnNlQXJncygiR0xjaGFyICphIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbKCJhIiwgRGF0YVR5cGUuUE9JTlRFUildKQotCi0gICAgICAgIGFyZ3MgPSBwYXJzZUFyZ3MoIkdMaW50IGV4cG9uZW50WzE2XSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWygiZXhwb25lbnQiLCBEYXRhVHlwZS5QT0lOVEVSKV0pCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9kZWJ1Zy5pbiBiL29wZW5nbC9saWJzL2RlYnVnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJiMmRhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL2RlYnVnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8vIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBub3QgZGVmaW5lZCBpbiBHTEVTdjJfZGJnCi1UUkFDRV9HTF9WT0lEKGdsQWxwaGFGdW5jLCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZiksIChmdW5jLCByZWYpLCAyLCAiR0xlbnVtIiwgZnVuYywgIkdMY2xhbXBmIiwgcmVmKQotVFJBQ0VfR0xfVk9JRChnbEFscGhhRnVuY3gsIChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKSwgKGZ1bmMsIHJlZiksIDIsICJHTGVudW0iLCBmdW5jLCAiR0xjbGFtcHgiLCByZWYpCi1UUkFDRV9HTF9WT0lEKGdsQWxwaGFGdW5jeE9FUywgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpLCAoZnVuYywgcmVmKSwgMiwgIkdMZW51bSIsIGZ1bmMsICJHTGNsYW1weCIsIHJlZikKLVRSQUNFX0dMX1ZPSUQoZ2xCZWdpblBlcmZNb25pdG9yQU1ELCAoR0x1aW50IG1vbml0b3IpLCAobW9uaXRvciksIDEsICJHTHVpbnQiLCBtb25pdG9yKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRGcmFtZWJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlciksICh0YXJnZXQsIGZyYW1lYnVmZmVyKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdWludCIsIGZyYW1lYnVmZmVyKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRSZW5kZXJidWZmZXJPRVMsIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgcmVuZGVyYnVmZmVyKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kVmVydGV4QXJyYXlPRVMsIChHTHVpbnQgYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0x1aW50IiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsQmxlbmRFcXVhdGlvbk9FUywgKEdMZW51bSBtb2RlKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xCbGVuZEVxdWF0aW9uU2VwYXJhdGVPRVMsIChHTGVudW0gbW9kZVJHQiwgR0xlbnVtIG1vZGVBbHBoYSksIChtb2RlUkdCLCBtb2RlQWxwaGEpLCAyLCAiR0xlbnVtIiwgbW9kZVJHQiwgIkdMZW51bSIsIG1vZGVBbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUywgKEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhKSwgKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpLCA0LCAiR0xlbnVtIiwgc3JjUkdCLCAiR0xlbnVtIiwgZHN0UkdCLCAiR0xlbnVtIiwgc3JjQWxwaGEsICJHTGVudW0iLCBkc3RBbHBoYSkKLVRSQUNFX0dMKEdMZW51bSwgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbENsZWFyQ29sb3J4LCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xjbGFtcHgiLCByZWQsICJHTGNsYW1weCIsIGdyZWVuLCAiR0xjbGFtcHgiLCBibHVlLCAiR0xjbGFtcHgiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckNvbG9yeE9FUywgKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMY2xhbXB4IiwgcmVkLCAiR0xjbGFtcHgiLCBncmVlbiwgIkdMY2xhbXB4IiwgYmx1ZSwgIkdMY2xhbXB4IiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJEZXB0aGZPRVMsIChHTGNsYW1wZiBkZXB0aCksIChkZXB0aCksIDEsICJHTGNsYW1wZiIsIGRlcHRoKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyRGVwdGh4LCAoR0xjbGFtcHggZGVwdGgpLCAoZGVwdGgpLCAxLCAiR0xjbGFtcHgiLCBkZXB0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckRlcHRoeE9FUywgKEdMY2xhbXB4IGRlcHRoKSwgKGRlcHRoKSwgMSwgIkdMY2xhbXB4IiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsQ2xpZW50QWN0aXZlVGV4dHVyZSwgKEdMZW51bSB0ZXh0dXJlKSwgKHRleHR1cmUpLCAxLCAiR0xlbnVtIiwgdGV4dHVyZSkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGlwUGxhbmVmLCAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiksIChwbGFuZSwgZXF1YXRpb24pLCAyLCAiR0xlbnVtIiwgcGxhbmUsICJjb25zdCBHTGZsb2F0ICoiLCBlcXVhdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xDbGlwUGxhbmVmSU1HLCAoR0xlbnVtIHAsIGNvbnN0IEdMZmxvYXQgKmVxbiksIChwLCBlcW4pLCAyLCAiR0xlbnVtIiwgcCwgImNvbnN0IEdMZmxvYXQgKiIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xDbGlwUGxhbmVmT0VTLCAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiksIChwbGFuZSwgZXF1YXRpb24pLCAyLCAiR0xlbnVtIiwgcGxhbmUsICJjb25zdCBHTGZsb2F0ICoiLCBlcXVhdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xDbGlwUGxhbmV4LCAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbiksIChwbGFuZSwgZXF1YXRpb24pLCAyLCAiR0xlbnVtIiwgcGxhbmUsICJjb25zdCBHTGZpeGVkICoiLCBlcXVhdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xDbGlwUGxhbmV4SU1HLCAoR0xlbnVtIHAsIGNvbnN0IEdMZml4ZWQgKmVxbiksIChwLCBlcW4pLCAyLCAiR0xlbnVtIiwgcCwgImNvbnN0IEdMZml4ZWQgKiIsIGVxbikKLVRSQUNFX0dMX1ZPSUQoZ2xDbGlwUGxhbmV4T0VTLCAoR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbiksIChwbGFuZSwgZXF1YXRpb24pLCAyLCAiR0xlbnVtIiwgcGxhbmUsICJjb25zdCBHTGZpeGVkICoiLCBlcXVhdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvcjRmLCAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGZsb2F0IiwgcmVkLCAiR0xmbG9hdCIsIGdyZWVuLCAiR0xmbG9hdCIsIGJsdWUsICJHTGZsb2F0IiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3I0dWIsIChHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMdWJ5dGUiLCByZWQsICJHTHVieXRlIiwgZ3JlZW4sICJHTHVieXRlIiwgYmx1ZSwgIkdMdWJ5dGUiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvcjR4LCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGZpeGVkIiwgcmVkLCAiR0xmaXhlZCIsIGdyZWVuLCAiR0xmaXhlZCIsIGJsdWUsICJHTGZpeGVkIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3I0eE9FUywgKEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xmaXhlZCIsIHJlZCwgIkdMZml4ZWQiLCBncmVlbiwgIkdMZml4ZWQiLCBibHVlLCAiR0xmaXhlZCIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yUG9pbnRlciwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIsIGltYWdlU2l6ZSwgZGF0YSksIDksICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xpbnQiLCBib3JkZXIsICJHTHNpemVpIiwgaW1hZ2VTaXplLCAiY29uc3QgR0x2b2lkKiIsIGRhdGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlM0RPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgaW1hZ2VTaXplLCBkYXRhKSwgMTEsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB6b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMc2l6ZWkiLCBpbWFnZVNpemUsICJjb25zdCBHTHZvaWQqIiwgZGF0YSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb3B5VGV4U3ViSW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgOSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTGludCIsIHpvZmZzZXQsICJHTGludCIsIHgsICJHTGludCIsIHksICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbENvdmVyYWdlTWFza05WLCAoR0xib29sZWFuIG1hc2spLCAobWFzayksIDEsICJHTGJvb2xlYW4iLCBtYXNrKQotVFJBQ0VfR0xfVk9JRChnbENvdmVyYWdlT3BlcmF0aW9uTlYsIChHTGVudW0gb3BlcmF0aW9uKSwgKG9wZXJhdGlvbiksIDEsICJHTGVudW0iLCBvcGVyYXRpb24pCi1UUkFDRV9HTF9WT0lEKGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMsIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KSwgKG1hdHJpeHBhbGV0dGVpbmRleCksIDEsICJHTHVpbnQiLCBtYXRyaXhwYWxldHRlaW5kZXgpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlRmVuY2VzTlYsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKSwgKG4sIGZlbmNlcyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgZmVuY2VzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZUZyYW1lYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50KiIsIGZyYW1lYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVQZXJmTW9uaXRvcnNBTUQsIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpLCAobiwgbW9uaXRvcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIG1vbml0b3JzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyksIChuLCByZW5kZXJidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50KiIsIHJlbmRlcmJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlVmVydGV4QXJyYXlzT0VTLCAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cyksIChuLCBhcnJheXMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQgKiIsIGFycmF5cykKLVRSQUNFX0dMX1ZPSUQoZ2xEZXB0aFJhbmdlZk9FUywgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSwgKHpOZWFyLCB6RmFyKSwgMiwgIkdMY2xhbXBmIiwgek5lYXIsICJHTGNsYW1wZiIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRGVwdGhSYW5nZXgsIChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciksICh6TmVhciwgekZhciksIDIsICJHTGNsYW1weCIsIHpOZWFyLCAiR0xjbGFtcHgiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbERlcHRoUmFuZ2V4T0VTLCAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpLCAoek5lYXIsIHpGYXIpLCAyLCAiR0xjbGFtcHgiLCB6TmVhciwgIkdMY2xhbXB4IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xEaXNhYmxlQ2xpZW50U3RhdGUsIChHTGVudW0gYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0xlbnVtIiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NLCAoR0x1aW50IGRyaXZlckNvbnRyb2wpLCAoZHJpdmVyQ29udHJvbCksIDEsICJHTHVpbnQiLCBkcml2ZXJDb250cm9sKQotVFJBQ0VfR0xfVk9JRChnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCwgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbnVtQXR0YWNobWVudHMsIGNvbnN0IEdMZW51bSAqYXR0YWNobWVudHMpLCAodGFyZ2V0LCBudW1BdHRhY2htZW50cywgYXR0YWNobWVudHMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIG51bUF0dGFjaG1lbnRzLCAiY29uc3QgR0xlbnVtICoiLCBhdHRhY2htZW50cykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4Zk9FUywgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6LCAiR0xmbG9hdCIsIHdpZHRoLCAiR0xmbG9hdCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4ZnZPRVMsIChjb25zdCBHTGZsb2F0ICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMZmxvYXQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4aU9FUywgKEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpLCAoeCwgeSwgeiwgd2lkdGgsIGhlaWdodCksIDUsICJHTGludCIsIHgsICJHTGludCIsIHksICJHTGludCIsIHosICJHTGludCIsIHdpZHRoLCAiR0xpbnQiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleGl2T0VTLCAoY29uc3QgR0xpbnQgKmNvb3JkcyksIChjb29yZHMpLCAxLCAiY29uc3QgR0xpbnQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4c09FUywgKEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xzaG9ydCIsIHgsICJHTHNob3J0IiwgeSwgIkdMc2hvcnQiLCB6LCAiR0xzaG9ydCIsIHdpZHRoLCAiR0xzaG9ydCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4c3ZPRVMsIChjb25zdCBHTHNob3J0ICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMc2hvcnQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4eE9FUywgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6LCAiR0xmaXhlZCIsIHdpZHRoLCAiR0xmaXhlZCIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xEcmF3VGV4eHZPRVMsIChjb25zdCBHTGZpeGVkICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIGNvb3JkcykKLVRSQUNFX0dMX1ZPSUQoZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKSwgKHRhcmdldCwgaW1hZ2UpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlZ2xJbWFnZU9FUyIsIGltYWdlKQotVFJBQ0VfR0xfVk9JRChnbEVHTEltYWdlVGFyZ2V0VGV4dHVyZTJET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSksICh0YXJnZXQsIGltYWdlKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZWdsSW1hZ2VPRVMiLCBpbWFnZSkKLVRSQUNFX0dMX1ZPSUQoZ2xFbmFibGVDbGllbnRTdGF0ZSwgKEdMZW51bSBhcnJheSksIChhcnJheSksIDEsICJHTGVudW0iLCBhcnJheSkKLVRSQUNFX0dMX1ZPSUQoZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSwgKEdMdWludCBkcml2ZXJDb250cm9sKSwgKGRyaXZlckNvbnRyb2wpLCAxLCAiR0x1aW50IiwgZHJpdmVyQ29udHJvbCkKLVRSQUNFX0dMX1ZPSUQoZ2xFbmRQZXJmTW9uaXRvckFNRCwgKEdMdWludCBtb25pdG9yKSwgKG1vbml0b3IpLCAxLCAiR0x1aW50IiwgbW9uaXRvcikKLVRSQUNFX0dMX1ZPSUQoZ2xFbmRUaWxpbmdRQ09NLCAoR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spLCAocHJlc2VydmVNYXNrKSwgMSwgIkdMYml0ZmllbGQiLCBwcmVzZXJ2ZU1hc2spCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0QnVmZmVyUG9pbnRlcnZRQ09NLCAoR0xlbnVtIHRhcmdldCwgR0x2b2lkICoqcGFyYW1zKSwgKHRhcmdldCwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdm9pZCAqKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRCdWZmZXJzUUNPTSwgKEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpLCAoYnVmZmVycywgbWF4QnVmZmVycywgbnVtQnVmZmVycyksIDMsICJHTHVpbnQgKiIsIGJ1ZmZlcnMsICJHTGludCIsIG1heEJ1ZmZlcnMsICJHTGludCAqIiwgbnVtQnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRGcmFtZWJ1ZmZlcnNRQ09NLCAoR0x1aW50ICpmcmFtZWJ1ZmZlcnMsIEdMaW50IG1heEZyYW1lYnVmZmVycywgR0xpbnQgKm51bUZyYW1lYnVmZmVycyksIChmcmFtZWJ1ZmZlcnMsIG1heEZyYW1lYnVmZmVycywgbnVtRnJhbWVidWZmZXJzKSwgMywgIkdMdWludCAqIiwgZnJhbWVidWZmZXJzLCAiR0xpbnQiLCBtYXhGcmFtZWJ1ZmZlcnMsICJHTGludCAqIiwgbnVtRnJhbWVidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NLCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBzaGFkZXJ0eXBlLCBHTGNoYXIgKnNvdXJjZSwgR0xpbnQgKmxlbmd0aCksIChwcm9ncmFtLCBzaGFkZXJ0eXBlLCBzb3VyY2UsIGxlbmd0aCksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xlbnVtIiwgc2hhZGVydHlwZSwgIkdMY2hhciAqIiwgc291cmNlLCAiR0xpbnQgKiIsIGxlbmd0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRQcm9ncmFtc1FDT00sIChHTHVpbnQgKnByb2dyYW1zLCBHTGludCBtYXhQcm9ncmFtcywgR0xpbnQgKm51bVByb2dyYW1zKSwgKHByb2dyYW1zLCBtYXhQcm9ncmFtcywgbnVtUHJvZ3JhbXMpLCAzLCAiR0x1aW50ICoiLCBwcm9ncmFtcywgIkdMaW50IiwgbWF4UHJvZ3JhbXMsICJHTGludCAqIiwgbnVtUHJvZ3JhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0UmVuZGVyYnVmZmVyc1FDT00sIChHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKSwgKHJlbmRlcmJ1ZmZlcnMsIG1heFJlbmRlcmJ1ZmZlcnMsIG51bVJlbmRlcmJ1ZmZlcnMpLCAzLCAiR0x1aW50ICoiLCByZW5kZXJidWZmZXJzLCAiR0xpbnQiLCBtYXhSZW5kZXJidWZmZXJzLCAiR0xpbnQgKiIsIG51bVJlbmRlcmJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0U2hhZGVyc1FDT00sIChHTHVpbnQgKnNoYWRlcnMsIEdMaW50IG1heFNoYWRlcnMsIEdMaW50ICpudW1TaGFkZXJzKSwgKHNoYWRlcnMsIG1heFNoYWRlcnMsIG51bVNoYWRlcnMpLCAzLCAiR0x1aW50ICoiLCBzaGFkZXJzLCAiR0xpbnQiLCBtYXhTaGFkZXJzLCAiR0xpbnQgKiIsIG51bVNoYWRlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00sIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIGZhY2UsIEdMaW50IGxldmVsLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAodGV4dHVyZSwgZmFjZSwgbGV2ZWwsIHBuYW1lLCBwYXJhbXMpLCA1LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMZW51bSIsIGZhY2UsICJHTGludCIsIGxldmVsLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFRleFN1YkltYWdlUUNPTSwgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqdGV4ZWxzKSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIHR5cGUsIHRleGVscyksIDExLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgeG9mZnNldCwgIkdMaW50IiwgeW9mZnNldCwgIkdMaW50Iiwgem9mZnNldCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgsICJHTGVudW0iLCBmb3JtYXQsICJHTGVudW0iLCB0eXBlLCAiR0x2b2lkICoiLCB0ZXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0VGV4dHVyZXNRQ09NLCAoR0x1aW50ICp0ZXh0dXJlcywgR0xpbnQgbWF4VGV4dHVyZXMsIEdMaW50ICpudW1UZXh0dXJlcyksICh0ZXh0dXJlcywgbWF4VGV4dHVyZXMsIG51bVRleHR1cmVzKSwgMywgIkdMdWludCAqIiwgdGV4dHVyZXMsICJHTGludCIsIG1heFRleHR1cmVzLCAiR0xpbnQgKiIsIG51bVRleHR1cmVzKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSwgMSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRXh0VGV4T2JqZWN0U3RhdGVPdmVycmlkZWlRQ09NLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRmluaXNoRmVuY2VOViwgKEdMdWludCBmZW5jZSksIChmZW5jZSksIDEsICJHTHVpbnQiLCBmZW5jZSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2dmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2dmdiwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRm9neCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRm9neE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRm9neHYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEZvZ3h2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpLCA0LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSwgKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyksIDYsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgdGV4dGFyZ2V0LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMaW50IiwgbGV2ZWwsICJHTHNpemVpIiwgc2FtcGxlcykKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCkKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCB6b2Zmc2V0KSwgNiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50Iiwgem9mZnNldCkKLVRSQUNFX0dMX1ZPSUQoZ2xGcnVzdHVtZiwgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZsb2F0IiwgbGVmdCwgIkdMZmxvYXQiLCByaWdodCwgIkdMZmxvYXQiLCBib3R0b20sICJHTGZsb2F0IiwgdG9wLCAiR0xmbG9hdCIsIHpOZWFyLCAiR0xmbG9hdCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRnJ1c3R1bWZPRVMsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmbG9hdCIsIGxlZnQsICJHTGZsb2F0IiwgcmlnaHQsICJHTGZsb2F0IiwgYm90dG9tLCAiR0xmbG9hdCIsIHRvcCwgIkdMZmxvYXQiLCB6TmVhciwgIkdMZmxvYXQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbEZydXN0dW14LCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZml4ZWQiLCBsZWZ0LCAiR0xmaXhlZCIsIHJpZ2h0LCAiR0xmaXhlZCIsIGJvdHRvbSwgIkdMZml4ZWQiLCB0b3AsICJHTGZpeGVkIiwgek5lYXIsICJHTGZpeGVkIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcnVzdHVteE9FUywgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZpeGVkIiwgbGVmdCwgIkdMZml4ZWQiLCByaWdodCwgIkdMZml4ZWQiLCBib3R0b20sICJHTGZpeGVkIiwgdG9wLCAiR0xmaXhlZCIsIHpOZWFyLCAiR0xmaXhlZCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsR2VuRmVuY2VzTlYsIChHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKSwgKG4sIGZlbmNlcyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgZmVuY2VzKQotVFJBQ0VfR0xfVk9JRChnbEdlbkZyYW1lYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50KiIsIGZyYW1lYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5QZXJmTW9uaXRvcnNBTUQsIChHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpLCAobiwgbW9uaXRvcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIG1vbml0b3JzKQotVFJBQ0VfR0xfVk9JRChnbEdlblJlbmRlcmJ1ZmZlcnNPRVMsIChHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycyksIChuLCByZW5kZXJidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50KiIsIHJlbmRlcmJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuVmVydGV4QXJyYXlzT0VTLCAoR0xzaXplaSBuLCBHTHVpbnQgKmFycmF5cyksIChuLCBhcnJheXMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIGFycmF5cykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5lcmF0ZU1pcG1hcE9FUywgKEdMZW51bSB0YXJnZXQpLCAodGFyZ2V0KSwgMSwgIkdMZW51bSIsIHRhcmdldCkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRCdWZmZXJQb2ludGVydk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICoqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTHZvaWQgKioiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5lZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5lZk9FUywgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5leCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5leE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyksIChkcml2ZXJDb250cm9sLCBidWZTaXplLCBsZW5ndGgsIGRyaXZlckNvbnRyb2xTdHJpbmcpLCA0LCAiR0x1aW50IiwgZHJpdmVyQ29udHJvbCwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xjaGFyICoiLCBkcml2ZXJDb250cm9sU3RyaW5nKQotVFJBQ0VfR0xfVk9JRChnbEdldERyaXZlckNvbnRyb2xzUUNPTSwgKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyksIChudW0sIHNpemUsIGRyaXZlckNvbnRyb2xzKSwgMywgIkdMaW50ICoiLCBudW0sICJHTHNpemVpIiwgc2l6ZSwgIkdMdWludCAqIiwgZHJpdmVyQ29udHJvbHMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RmVuY2Vpdk5WLCAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAoZmVuY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0x1aW50IiwgZmVuY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0Rml4ZWR2LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGaXhlZHZPRVMsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCBwYXJhbXMpLCA0LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldExpZ2h0ZnYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TGlnaHR4diwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRMaWdodHh2T0VTLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldE1hdGVyaWFsZnYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TWF0ZXJpYWx4diwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRNYXRlcmlhbHh2T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yQ291bnRlckRhdGFBTUQsIChHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pLCAobW9uaXRvciwgcG5hbWUsIGRhdGFTaXplLCBkYXRhLCBieXRlc1dyaXR0ZW4pLCA1LCAiR0x1aW50IiwgbW9uaXRvciwgIkdMZW51bSIsIHBuYW1lLCAiR0xzaXplaSIsIGRhdGFTaXplLCAiR0x1aW50ICoiLCBkYXRhLCAiR0xpbnQgKiIsIGJ5dGVzV3JpdHRlbikKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJJbmZvQU1ELCAoR0x1aW50IGdyb3VwLCBHTHVpbnQgY291bnRlciwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKmRhdGEpLCAoZ3JvdXAsIGNvdW50ZXIsIHBuYW1lLCBkYXRhKSwgNCwgIkdMdWludCIsIGdyb3VwLCAiR0x1aW50IiwgY291bnRlciwgIkdMZW51bSIsIHBuYW1lLCAiR0x2b2lkICoiLCBkYXRhKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yQ291bnRlclN0cmluZ0FNRCwgKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpLCAoZ3JvdXAsIGNvdW50ZXIsIGJ1ZlNpemUsIGxlbmd0aCwgY291bnRlclN0cmluZyksIDUsICJHTHVpbnQiLCBncm91cCwgIkdMdWludCIsIGNvdW50ZXIsICJHTHNpemVpIiwgYnVmU2l6ZSwgIkdMc2l6ZWkgKiIsIGxlbmd0aCwgIkdMY2hhciAqIiwgY291bnRlclN0cmluZykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCAoR0x1aW50IGdyb3VwLCBHTGludCAqbnVtQ291bnRlcnMsIEdMaW50ICptYXhBY3RpdmVDb3VudGVycywgR0xzaXplaSBjb3VudGVyU2l6ZSwgR0x1aW50ICpjb3VudGVycyksIChncm91cCwgbnVtQ291bnRlcnMsIG1heEFjdGl2ZUNvdW50ZXJzLCBjb3VudGVyU2l6ZSwgY291bnRlcnMpLCA1LCAiR0x1aW50IiwgZ3JvdXAsICJHTGludCAqIiwgbnVtQ291bnRlcnMsICJHTGludCAqIiwgbWF4QWN0aXZlQ291bnRlcnMsICJHTHNpemVpIiwgY291bnRlclNpemUsICJHTHVpbnQgKiIsIGNvdW50ZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQsIChHTHVpbnQgZ3JvdXAsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmdyb3VwU3RyaW5nKSwgKGdyb3VwLCBidWZTaXplLCBsZW5ndGgsIGdyb3VwU3RyaW5nKSwgNCwgIkdMdWludCIsIGdyb3VwLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGNoYXIgKiIsIGdyb3VwU3RyaW5nKQotVFJBQ0VfR0xfVk9JRChnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1ELCAoR0xpbnQgKm51bUdyb3VwcywgR0xzaXplaSBncm91cHNTaXplLCBHTHVpbnQgKmdyb3VwcyksIChudW1Hcm91cHMsIGdyb3Vwc1NpemUsIGdyb3VwcyksIDMsICJHTGludCAqIiwgbnVtR3JvdXBzLCAiR0xzaXplaSIsIGdyb3Vwc1NpemUsICJHTHVpbnQgKiIsIGdyb3VwcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQb2ludGVydiwgKEdMZW51bSBwbmFtZSwgR0x2b2lkICoqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTHZvaWQgKioiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UHJvZ3JhbUJpbmFyeU9FUywgKEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xlbnVtICpiaW5hcnlGb3JtYXQsIEdMdm9pZCAqYmluYXJ5KSwgKHByb2dyYW0sIGJ1ZlNpemUsIGxlbmd0aCwgYmluYXJ5Rm9ybWF0LCBiaW5hcnkpLCA1LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xlbnVtICoiLCBiaW5hcnlGb3JtYXQsICJHTHZvaWQgKiIsIGJpbmFyeSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4RW52ZnYsIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyksIChlbnYsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZW52LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4RW52aXYsIChHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGVudiwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhFbnZ4diwgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBlbnYsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhFbnZ4dk9FUywgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBlbnYsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhHZW5mdk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhHZW5pdk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEdlbnh2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleFBhcmFtZXRlcnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleFBhcmFtZXRlcnh2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzRmVuY2VOViwgKEdMdWludCBmZW5jZSksIChmZW5jZSksIDEsICJHTHVpbnQiLCBmZW5jZSkKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc0ZyYW1lYnVmZmVyT0VTLCAoR0x1aW50IGZyYW1lYnVmZmVyKSwgKGZyYW1lYnVmZmVyKSwgMSwgIkdMdWludCIsIGZyYW1lYnVmZmVyKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzUmVuZGVyYnVmZmVyT0VTLCAoR0x1aW50IHJlbmRlcmJ1ZmZlciksIChyZW5kZXJidWZmZXIpLCAxLCAiR0x1aW50IiwgcmVuZGVyYnVmZmVyKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzVmVydGV4QXJyYXlPRVMsIChHTHVpbnQgYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0x1aW50IiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbGYsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWxmdiwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbHgsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWx4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVseHYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWx4dk9FUywgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRmLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAobGlnaHQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0ZnYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHR4LCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAobGlnaHQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0eE9FUywgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodHh2LCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0eHZPRVMsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGluZVdpZHRoeCwgKEdMZml4ZWQgd2lkdGgpLCAod2lkdGgpLCAxLCAiR0xmaXhlZCIsIHdpZHRoKQotVFJBQ0VfR0xfVk9JRChnbExpbmVXaWR0aHhPRVMsIChHTGZpeGVkIHdpZHRoKSwgKHdpZHRoKSwgMSwgIkdMZml4ZWQiLCB3aWR0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkSWRlbnRpdHksICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsTG9hZE1hdHJpeGYsIChjb25zdCBHTGZsb2F0ICptKSwgKG0pLCAxLCAiY29uc3QgR0xmbG9hdCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkTWF0cml4eCwgKGNvbnN0IEdMZml4ZWQgKm0pLCAobSksIDEsICJjb25zdCBHTGZpeGVkICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbExvYWRNYXRyaXh4T0VTLCAoY29uc3QgR0xmaXhlZCAqbSksIChtKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTLCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbExvZ2ljT3AsIChHTGVudW0gb3Bjb2RlKSwgKG9wY29kZSksIDEsICJHTGVudW0iLCBvcGNvZGUpCi1UUkFDRV9HTCh2b2lkKiwgZ2xNYXBCdWZmZXJPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYWNjZXNzKSwgKHRhcmdldCwgYWNjZXNzKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGFjY2VzcykKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbGYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKGZhY2UsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWxmdiwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbHgsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGZhY2UsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWx4T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChmYWNlLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFseHYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWx4dk9FUywgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCA0LCAiR0xpbnQiLCBzaXplLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsTWF0cml4TW9kZSwgKEdMZW51bSBtb2RlKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0TWF0cml4ZiwgKGNvbnN0IEdMZmxvYXQgKm0pLCAobSksIDEsICJjb25zdCBHTGZsb2F0ICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbE11bHRNYXRyaXh4LCAoY29uc3QgR0xmaXhlZCAqbSksIChtKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTXVsdE1hdHJpeHhPRVMsIChjb25zdCBHTGZpeGVkICptKSwgKG0pLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0aURyYXdBcnJheXNFWFQsIChHTGVudW0gbW9kZSwgR0xpbnQgKmZpcnN0LCBHTHNpemVpICpjb3VudCwgR0xzaXplaSBwcmltY291bnQpLCAobW9kZSwgZmlyc3QsIGNvdW50LCBwcmltY291bnQpLCA0LCAiR0xlbnVtIiwgbW9kZSwgIkdMaW50ICoiLCBmaXJzdCwgIkdMc2l6ZWkgKiIsIGNvdW50LCAiR0xzaXplaSIsIHByaW1jb3VudCkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0aURyYXdFbGVtZW50c0VYVCwgKEdMZW51bSBtb2RlLCBjb25zdCBHTHNpemVpICpjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogKmluZGljZXMsIEdMc2l6ZWkgcHJpbWNvdW50KSwgKG1vZGUsIGNvdW50LCB0eXBlLCBpbmRpY2VzLCBwcmltY291bnQpLCA1LCAiR0xlbnVtIiwgbW9kZSwgImNvbnN0IEdMc2l6ZWkgKiIsIGNvdW50LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCogKiIsIGluZGljZXMsICJHTHNpemVpIiwgcHJpbWNvdW50KQotVFJBQ0VfR0xfVk9JRChnbE11bHRpVGV4Q29vcmQ0ZiwgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSksICh0YXJnZXQsIHMsIHQsIHIsIHEpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xmbG9hdCIsIHMsICJHTGZsb2F0IiwgdCwgIkdMZmxvYXQiLCByLCAiR0xmbG9hdCIsIHEpCi1UUkFDRV9HTF9WT0lEKGdsTXVsdGlUZXhDb29yZDR4LCAoR0xlbnVtIHRhcmdldCwgR0xmaXhlZCBzLCBHTGZpeGVkIHQsIEdMZml4ZWQgciwgR0xmaXhlZCBxKSwgKHRhcmdldCwgcywgdCwgciwgcSksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTGZpeGVkIiwgcywgIkdMZml4ZWQiLCB0LCAiR0xmaXhlZCIsIHIsICJHTGZpeGVkIiwgcSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0aVRleENvb3JkNHhPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpLCAodGFyZ2V0LCBzLCB0LCByLCBxKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZml4ZWQiLCBzLCAiR0xmaXhlZCIsIHQsICJHTGZpeGVkIiwgciwgIkdMZml4ZWQiLCBxKQotVFJBQ0VfR0xfVk9JRChnbE5vcm1hbDNmLCAoR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiksIChueCwgbnksIG56KSwgMywgIkdMZmxvYXQiLCBueCwgIkdMZmxvYXQiLCBueSwgIkdMZmxvYXQiLCBueikKLVRSQUNFX0dMX1ZPSUQoZ2xOb3JtYWwzeCwgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopLCAobngsIG55LCBueiksIDMsICJHTGZpeGVkIiwgbngsICJHTGZpeGVkIiwgbnksICJHTGZpeGVkIiwgbnopCi1UUkFDRV9HTF9WT0lEKGdsTm9ybWFsM3hPRVMsIChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KSwgKG54LCBueSwgbnopLCAzLCAiR0xmaXhlZCIsIG54LCAiR0xmaXhlZCIsIG55LCAiR0xmaXhlZCIsIG56KQotVFJBQ0VfR0xfVk9JRChnbE5vcm1hbFBvaW50ZXIsIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksICh0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCAzLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsT3J0aG9mLCAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZmxvYXQiLCBsZWZ0LCAiR0xmbG9hdCIsIHJpZ2h0LCAiR0xmbG9hdCIsIGJvdHRvbSwgIkdMZmxvYXQiLCB0b3AsICJHTGZsb2F0Iiwgek5lYXIsICJHTGZsb2F0IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xPcnRob2ZPRVMsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmbG9hdCIsIGxlZnQsICJHTGZsb2F0IiwgcmlnaHQsICJHTGZsb2F0IiwgYm90dG9tLCAiR0xmbG9hdCIsIHRvcCwgIkdMZmxvYXQiLCB6TmVhciwgIkdMZmxvYXQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbE9ydGhveCwgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZpeGVkIiwgbGVmdCwgIkdMZml4ZWQiLCByaWdodCwgIkdMZml4ZWQiLCBib3R0b20sICJHTGZpeGVkIiwgdG9wLCAiR0xmaXhlZCIsIHpOZWFyLCAiR0xmaXhlZCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsT3J0aG94T0VTLCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZml4ZWQiLCBsZWZ0LCAiR0xmaXhlZCIsIHJpZ2h0LCAiR0xmaXhlZCIsIGJvdHRvbSwgIkdMZml4ZWQiLCB0b3AsICJHTGZpeGVkIiwgek5lYXIsICJHTGZpeGVkIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcmYsIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyZnYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyeCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJ4T0VTLCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcnh2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcnh2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFNpemUsIChHTGZsb2F0IHNpemUpLCAoc2l6ZSksIDEsICJHTGZsb2F0Iiwgc2l6ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFNpemVQb2ludGVyT0VTLCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAodHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgMywgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZXgsIChHTGZpeGVkIHNpemUpLCAoc2l6ZSksIDEsICJHTGZpeGVkIiwgc2l6ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFNpemV4T0VTLCAoR0xmaXhlZCBzaXplKSwgKHNpemUpLCAxLCAiR0xmaXhlZCIsIHNpemUpCi1UUkFDRV9HTF9WT0lEKGdsUG9seWdvbk9mZnNldHgsIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyksIChmYWN0b3IsIHVuaXRzKSwgMiwgIkdMZml4ZWQiLCBmYWN0b3IsICJHTGZpeGVkIiwgdW5pdHMpCi1UUkFDRV9HTF9WT0lEKGdsUG9seWdvbk9mZnNldHhPRVMsIChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyksIChmYWN0b3IsIHVuaXRzKSwgMiwgIkdMZml4ZWQiLCBmYWN0b3IsICJHTGZpeGVkIiwgdW5pdHMpCi1UUkFDRV9HTF9WT0lEKGdsUG9wTWF0cml4LCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1CaW5hcnlPRVMsIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIGJpbmFyeUZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMaW50IGxlbmd0aCksIChwcm9ncmFtLCBiaW5hcnlGb3JtYXQsIGJpbmFyeSwgbGVuZ3RoKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGVudW0iLCBiaW5hcnlGb3JtYXQsICJjb25zdCBHTHZvaWQgKiIsIGJpbmFyeSwgIkdMaW50IiwgbGVuZ3RoKQotVFJBQ0VfR0xfVk9JRChnbFB1c2hNYXRyaXgsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTChHTGJpdGZpZWxkLCBnbFF1ZXJ5TWF0cml4eE9FUywgKEdMZml4ZWQgbWFudGlzc2FbMTZdLCBHTGludCBleHBvbmVudFsxNl0pLCAobWFudGlzc2EsIGV4cG9uZW50KSwgMiwgIkdMZml4ZWQiLCBtYW50aXNzYSwgIkdMaW50IiwgZXhwb25lbnQpCi1UUkFDRV9HTF9WT0lEKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HLCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIHNhbXBsZXMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUm90YXRlZiwgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoYW5nbGUsIHgsIHksIHopLCA0LCAiR0xmbG9hdCIsIGFuZ2xlLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFJvdGF0ZXgsIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKGFuZ2xlLCB4LCB5LCB6KSwgNCwgIkdMZml4ZWQiLCBhbmdsZSwgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xSb3RhdGV4T0VTLCAoR0xmaXhlZCBhbmdsZSwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksIChhbmdsZSwgeCwgeSwgeiksIDQsICJHTGZpeGVkIiwgYW5nbGUsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsU2FtcGxlQ292ZXJhZ2V4LCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpLCAodmFsdWUsIGludmVydCksIDIsICJHTGNsYW1weCIsIHZhbHVlLCAiR0xib29sZWFuIiwgaW52ZXJ0KQotVFJBQ0VfR0xfVk9JRChnbFNhbXBsZUNvdmVyYWdleE9FUywgKEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSwgKHZhbHVlLCBpbnZlcnQpLCAyLCAiR0xjbGFtcHgiLCB2YWx1ZSwgIkdMYm9vbGVhbiIsIGludmVydCkKLVRSQUNFX0dMX1ZPSUQoZ2xTY2FsZWYsIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKHgsIHksIHopLCAzLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFNjYWxleCwgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeiksIDMsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsU2NhbGV4T0VTLCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSwgMywgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xTZWxlY3RQZXJmTW9uaXRvckNvdW50ZXJzQU1ELCAoR0x1aW50IG1vbml0b3IsIEdMYm9vbGVhbiBlbmFibGUsIEdMdWludCBncm91cCwgR0xpbnQgbnVtQ291bnRlcnMsIEdMdWludCAqY291bnRlcnNMaXN0KSwgKG1vbml0b3IsIGVuYWJsZSwgZ3JvdXAsIG51bUNvdW50ZXJzLCBjb3VudGVyc0xpc3QpLCA1LCAiR0x1aW50IiwgbW9uaXRvciwgIkdMYm9vbGVhbiIsIGVuYWJsZSwgIkdMdWludCIsIGdyb3VwLCAiR0xpbnQiLCBudW1Db3VudGVycywgIkdMdWludCAqIiwgY291bnRlcnNMaXN0KQotVFJBQ0VfR0xfVk9JRChnbFNldEZlbmNlTlYsIChHTHVpbnQgZmVuY2UsIEdMZW51bSBjb25kaXRpb24pLCAoZmVuY2UsIGNvbmRpdGlvbiksIDIsICJHTHVpbnQiLCBmZW5jZSwgIkdMZW51bSIsIGNvbmRpdGlvbikKLVRSQUNFX0dMX1ZPSUQoZ2xTaGFkZU1vZGVsLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbFN0YXJ0VGlsaW5nUUNPTSwgKEdMdWludCB4LCBHTHVpbnQgeSwgR0x1aW50IHdpZHRoLCBHTHVpbnQgaGVpZ2h0LCBHTGJpdGZpZWxkIHByZXNlcnZlTWFzayksICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVzZXJ2ZU1hc2spLCA1LCAiR0x1aW50IiwgeCwgIkdMdWludCIsIHksICJHTHVpbnQiLCB3aWR0aCwgIkdMdWludCIsIGhlaWdodCwgIkdMYml0ZmllbGQiLCBwcmVzZXJ2ZU1hc2spCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsVGVzdEZlbmNlTlYsIChHTHVpbnQgZmVuY2UpLCAoZmVuY2UpLCAxLCAiR0x1aW50IiwgZmVuY2UpCi1UUkFDRV9HTF9WT0lEKGdsVGV4Q29vcmRQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudmYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52ZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52aSwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudml2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52eCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZ4T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudnh2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleEdlbmZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChjb29yZCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuZnZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuaU9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksIChjb29yZCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEdlbml2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VueE9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW54dk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCogcGl4ZWxzKSwgKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyksIDEwLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMaW50IiwgYm9yZGVyLCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCoiLCBwaXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyeCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhQYXJhbWV0ZXJ4T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcnh2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleFN1YkltYWdlM0RPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB6b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpLCAxMSwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGludCIsIHhvZmZzZXQsICJHTGludCIsIHlvZmZzZXQsICJHTGludCIsIHpvZmZzZXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgImNvbnN0IEdMdm9pZCoiLCBwaXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsVHJhbnNsYXRlZiwgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoeCwgeSwgeiksIDMsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVHJhbnNsYXRleCwgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeiksIDMsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsVHJhbnNsYXRleE9FUywgKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoeCwgeSwgeiksIDMsICJHTGZpeGVkIiwgeCwgIkdMZml4ZWQiLCB5LCAiR0xmaXhlZCIsIHopCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsVW5tYXBCdWZmZXJPRVMsIChHTGVudW0gdGFyZ2V0KSwgKHRhcmdldCksIDEsICJHTGVudW0iLCB0YXJnZXQpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4UG9pbnRlciwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xXZWlnaHRQb2ludGVyT0VTLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZWdsX2ltcGwuaCBiL29wZW5nbC9saWJzL2VnbF9pbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGU5MDguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvZWdsX2ltcGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRUdMX0lNUExfSAotI2RlZmluZSBBTkRST0lEX0VHTF9JTVBMX0gKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xwbGF0Zm9ybS5oPgotCi0jaW5jbHVkZSAiaG9va3MuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FR0xBUEkgY29uc3QgR0x1Ynl0ZSAqIGVnbF9nZXRfc3RyaW5nX2Zvcl9jdXJyZW50X2NvbnRleHQoR0xlbnVtIG5hbWUpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLyogQU5EUk9JRF9FR0xfSU1QTF9IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9lbnRyaWVzLmluIGIvb3BlbmdsL2xpYnMvZW50cmllcy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxNmQ3OC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9lbnRyaWVzLmluCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLUdMX0VOVFJZKHZvaWQsIGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCwgR0x1aW50IHBpcGVsaW5lLCBHTHVpbnQgcHJvZ3JhbSkKLUdMX0VOVFJZKHZvaWQsIGdsQWN0aXZlVGV4dHVyZSwgR0xlbnVtIHRleHR1cmUpCi1HTF9FTlRSWSh2b2lkLCBnbEFscGhhRnVuYywgR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikKLUdMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jUUNPTSwgR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZikKLUdMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jeCwgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikKLUdMX0VOVFJZKHZvaWQsIGdsQWxwaGFGdW5jeE9FUywgR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZikKLUdMX0VOVFJZKHZvaWQsIGdsQXR0YWNoU2hhZGVyLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlcikKLUdMX0VOVFJZKHZvaWQsIGdsQmVnaW5QZXJmTW9uaXRvckFNRCwgR0x1aW50IG1vbml0b3IpCi1HTF9FTlRSWSh2b2lkLCBnbEJlZ2luUXVlcnlFWFQsIEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCkKLUdMX0VOVFJZKHZvaWQsIGdsQmluZEF0dHJpYkxvY2F0aW9uLCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBjb25zdCBHTGNoYXIqIG5hbWUpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRCdWZmZXIsIEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRGcmFtZWJ1ZmZlciwgR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKQotR0xfRU5UUlkodm9pZCwgZ2xCaW5kRnJhbWVidWZmZXJPRVMsIEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlcikKLUdMX0VOVFJZKHZvaWQsIGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCwgR0x1aW50IHBpcGVsaW5lKQotR0xfRU5UUlkodm9pZCwgZ2xCaW5kUmVuZGVyYnVmZmVyLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKQotR0xfRU5UUlkodm9pZCwgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKQotR0xfRU5UUlkodm9pZCwgZ2xCaW5kVGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpCi1HTF9FTlRSWSh2b2lkLCBnbEJpbmRWZXJ0ZXhBcnJheU9FUywgR0x1aW50IGFycmF5KQotR0xfRU5UUlkodm9pZCwgZ2xCbGVuZENvbG9yLCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQmxlbmRFcXVhdGlvbiwgIEdMZW51bSBtb2RlICkKLUdMX0VOVFJZKHZvaWQsIGdsQmxlbmRFcXVhdGlvbk9FUywgR0xlbnVtIG1vZGUpCi1HTF9FTlRSWSh2b2lkLCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSwgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUywgR0xlbnVtIG1vZGVSR0IsIEdMZW51bSBtb2RlQWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbEJsZW5kRnVuYywgR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKQotR0xfRU5UUlkodm9pZCwgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSwgR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbEJsZW5kRnVuY1NlcGFyYXRlT0VTLCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQmxpdEZyYW1lYnVmZmVyQU5HTEUsIEdMaW50IHNyY1gwLCBHTGludCBzcmNZMCwgR0xpbnQgc3JjWDEsIEdMaW50IHNyY1kxLCBHTGludCBkc3RYMCwgR0xpbnQgZHN0WTAsIEdMaW50IGRzdFgxLCBHTGludCBkc3RZMSwgR0xiaXRmaWVsZCBtYXNrLCBHTGVudW0gZmlsdGVyKQotR0xfRU5UUlkodm9pZCwgZ2xCdWZmZXJEYXRhLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlKQotR0xfRU5UUlkodm9pZCwgZ2xCdWZmZXJTdWJEYXRhLCBHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKQotR0xfRU5UUlkoR0xlbnVtLCBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMsIEdMZW51bSB0YXJnZXQpCi1HTF9FTlRSWShHTGVudW0sIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUywgR0xlbnVtIHRhcmdldCkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXIsIEdMYml0ZmllbGQgbWFzaykKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvciwgR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbENsZWFyQ29sb3J4LCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXJDb2xvcnhPRVMsIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xDbGVhckRlcHRoZiwgR0xjbGFtcGYgZGVwdGgpCi1HTF9FTlRSWSh2b2lkLCBnbENsZWFyRGVwdGhmT0VTLCBHTGNsYW1wZiBkZXB0aCkKLUdMX0VOVFJZKHZvaWQsIGdsQ2xlYXJEZXB0aHgsIEdMY2xhbXB4IGRlcHRoKQotR0xfRU5UUlkodm9pZCwgZ2xDbGVhckRlcHRoeE9FUywgR0xjbGFtcHggZGVwdGgpCi1HTF9FTlRSWSh2b2lkLCBnbENsZWFyU3RlbmNpbCwgR0xpbnQgcykKLUdMX0VOVFJZKHZvaWQsIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSwgR0xlbnVtIHRleHR1cmUpCi1HTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWYsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCi1HTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWZJTUcsIEdMZW51bSBwLCBjb25zdCBHTGZsb2F0ICplcW4pCi1HTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZWZPRVMsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24pCi1HTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZXgsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pCi1HTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZXhJTUcsIEdMZW51bSBwLCBjb25zdCBHTGZpeGVkICplcW4pCi1HTF9FTlRSWSh2b2lkLCBnbENsaXBQbGFuZXhPRVMsIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24pCi1HTF9FTlRSWSh2b2lkLCBnbENvbG9yNGYsIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbG9yNHViLCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xDb2xvcjR4LCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xDb2xvcjR4T0VTLCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKQotR0xfRU5UUlkodm9pZCwgZ2xDb2xvck1hc2ssIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSkKLUdMX0VOVFJZKHZvaWQsIGdsQ29sb3JQb2ludGVyLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLUdMX0VOVFJZKHZvaWQsIGdsQ29tcGlsZVNoYWRlciwgR0x1aW50IHNoYWRlcikKLUdMX0VOVFJZKHZvaWQsIGdsQ29tcHJlc3NlZFRleEltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpCi1HTF9FTlRSWSh2b2lkLCBnbENvbXByZXNzZWRUZXhJbWFnZTNET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKQotR0xfRU5UUlkodm9pZCwgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKQotR0xfRU5UUlkodm9pZCwgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKQotR0xfRU5UUlkodm9pZCwgZ2xDb3B5VGV4SW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcikKLUdMX0VOVFJZKHZvaWQsIGdsQ29weVRleFN1YkltYWdlMkQsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsQ29weVRleFN1YkltYWdlM0RPRVMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB6b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsQ292ZXJhZ2VNYXNrTlYsIEdMYm9vbGVhbiBtYXNrKQotR0xfRU5UUlkodm9pZCwgZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WLCBHTGVudW0gb3BlcmF0aW9uKQotR0xfRU5UUlkoR0x1aW50LCBnbENyZWF0ZVByb2dyYW0sIHZvaWQpCi1HTF9FTlRSWShHTHVpbnQsIGdsQ3JlYXRlU2hhZGVyLCBHTGVudW0gdHlwZSkKLUdMX0VOVFJZKEdMdWludCwgZ2xDcmVhdGVTaGFkZXJQcm9ncmFtdkVYVCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqKnN0cmluZ3MpCi1HTF9FTlRSWSh2b2lkLCBnbEN1bGxGYWNlLCBHTGVudW0gbW9kZSkKLUdMX0VOVFJZKHZvaWQsIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMsIEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXgpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZUJ1ZmZlcnMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVGZW5jZXNOViwgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmZlbmNlcykKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlRnJhbWVidWZmZXJzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVBlcmZNb25pdG9yc0FNRCwgR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUHJvZ3JhbVBpcGVsaW5lc0VYVCwgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnBpcGVsaW5lcykKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUXVlcmllc0VYVCwgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmlkcykKLUdMX0VOVFJZKHZvaWQsIGdsRGVsZXRlUmVuZGVyYnVmZmVycywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMsIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xEZWxldGVTaGFkZXIsIEdMdWludCBzaGFkZXIpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVRleHR1cmVzLCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpCi1HTF9FTlRSWSh2b2lkLCBnbERlbGV0ZVZlcnRleEFycmF5c09FUywgR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmFycmF5cykKLUdMX0VOVFJZKHZvaWQsIGdsRGVwdGhGdW5jLCBHTGVudW0gZnVuYykKLUdMX0VOVFJZKHZvaWQsIGdsRGVwdGhNYXNrLCBHTGJvb2xlYW4gZmxhZykKLUdMX0VOVFJZKHZvaWQsIGdsRGVwdGhSYW5nZWYsIEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xEZXB0aFJhbmdlZk9FUywgR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbERlcHRoUmFuZ2V4LCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsRGVwdGhSYW5nZXhPRVMsIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xEZXRhY2hTaGFkZXIsIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKQotR0xfRU5UUlkodm9pZCwgZ2xEaXNhYmxlLCBHTGVudW0gY2FwKQotR0xfRU5UUlkodm9pZCwgZ2xEaXNhYmxlQ2xpZW50U3RhdGUsIEdMZW51bSBhcnJheSkKLUdMX0VOVFJZKHZvaWQsIGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NLCBHTHVpbnQgZHJpdmVyQ29udHJvbCkKLUdMX0VOVFJZKHZvaWQsIGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5LCBHTHVpbnQgaW5kZXgpCi1HTF9FTlRSWSh2b2lkLCBnbERpc2NhcmRGcmFtZWJ1ZmZlckVYVCwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBudW1BdHRhY2htZW50cywgY29uc3QgR0xlbnVtICphdHRhY2htZW50cykKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd0FycmF5cywgR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3QnVmZmVyc05WLCBHTHNpemVpIG4sIGNvbnN0IEdMZW51bSAqYnVmcykKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd0VsZW1lbnRzLCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcykKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGZPRVMsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgd2lkdGgsIEdMZmxvYXQgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4ZnZPRVMsIGNvbnN0IEdMZmxvYXQgKmNvb3JkcykKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd1RleGlPRVMsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbERyYXdUZXhpdk9FUywgY29uc3QgR0xpbnQgKmNvb3JkcykKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHNPRVMsIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4c3ZPRVMsIGNvbnN0IEdMc2hvcnQgKmNvb3JkcykKLUdMX0VOVFJZKHZvaWQsIGdsRHJhd1RleHhPRVMsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHosIEdMZml4ZWQgd2lkdGgsIEdMZml4ZWQgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xEcmF3VGV4eHZPRVMsIGNvbnN0IEdMZml4ZWQgKmNvb3JkcykKLUdMX0VOVFJZKHZvaWQsIGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlKQotR0xfRU5UUlkodm9pZCwgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUywgR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSkKLUdMX0VOVFJZKHZvaWQsIGdsRW5hYmxlLCBHTGVudW0gY2FwKQotR0xfRU5UUlkodm9pZCwgZ2xFbmFibGVDbGllbnRTdGF0ZSwgR0xlbnVtIGFycmF5KQotR0xfRU5UUlkodm9pZCwgZ2xFbmFibGVEcml2ZXJDb250cm9sUUNPTSwgR0x1aW50IGRyaXZlckNvbnRyb2wpCi1HTF9FTlRSWSh2b2lkLCBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCBHTHVpbnQgaW5kZXgpCi1HTF9FTlRSWSh2b2lkLCBnbEVuZFBlcmZNb25pdG9yQU1ELCBHTHVpbnQgbW9uaXRvcikKLUdMX0VOVFJZKHZvaWQsIGdsRW5kUXVlcnlFWFQsIEdMZW51bSB0YXJnZXQpCi1HTF9FTlRSWSh2b2lkLCBnbEVuZFRpbGluZ1FDT00sIEdMYml0ZmllbGQgcHJlc2VydmVNYXNrKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00sIEdMZW51bSB0YXJnZXQsIEdMdm9pZCAqKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0QnVmZmVyc1FDT00sIEdMdWludCAqYnVmZmVycywgR0xpbnQgbWF4QnVmZmVycywgR0xpbnQgKm51bUJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00sIEdMdWludCAqZnJhbWVidWZmZXJzLCBHTGludCBtYXhGcmFtZWJ1ZmZlcnMsIEdMaW50ICpudW1GcmFtZWJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEV4dEdldFByb2dyYW1CaW5hcnlTb3VyY2VRQ09NLCBHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRQcm9ncmFtc1FDT00sIEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEV4dEdldFJlbmRlcmJ1ZmZlcnNRQ09NLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMsIEdMaW50IG1heFJlbmRlcmJ1ZmZlcnMsIEdMaW50ICpudW1SZW5kZXJidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRHZXRTaGFkZXJzUUNPTSwgR0x1aW50ICpzaGFkZXJzLCBHTGludCBtYXhTaGFkZXJzLCBHTGludCAqbnVtU2hhZGVycykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0VGV4TGV2ZWxQYXJhbWV0ZXJpdlFDT00sIEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NLCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnRleGVscykKLUdMX0VOVFJZKHZvaWQsIGdsRXh0R2V0VGV4dHVyZXNRQ09NLCBHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbEV4dElzUHJvZ3JhbUJpbmFyeVFDT00sIEdMdWludCBwcm9ncmFtKQotR0xfRU5UUlkodm9pZCwgZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00sIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbEZpbmlzaCwgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsRmluaXNoRmVuY2VOViwgR0x1aW50IGZlbmNlKQotR0xfRU5UUlkodm9pZCwgZ2xGbHVzaCwgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsRm9nZiwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xGb2dmdiwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEZvZ3gsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsRm9neE9FUywgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xGb2d4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEZvZ3h2T0VTLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKQotR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpCi1HTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJELCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsKQotR0xfRU5UUlkodm9pZCwgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhULCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTHNpemVpIHNhbXBsZXMpCi1HTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVJTUcsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMc2l6ZWkgc2FtcGxlcykKLUdMX0VOVFJZKHZvaWQsIGdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpCi1HTF9FTlRSWSh2b2lkLCBnbEZyYW1lYnVmZmVyVGV4dHVyZTNET0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsLCBHTGludCB6b2Zmc2V0KQotR0xfRU5UUlkodm9pZCwgZ2xGcm9udEZhY2UsIEdMZW51bSBtb2RlKQotR0xfRU5UUlkodm9pZCwgZ2xGcnVzdHVtZiwgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsRnJ1c3R1bWZPRVMsIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbEZydXN0dW14LCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xGcnVzdHVteE9FUywgR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsR2VuQnVmZmVycywgR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlbkZlbmNlc05WLCBHTHNpemVpIG4sIEdMdWludCAqZmVuY2VzKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5GcmFtZWJ1ZmZlcnMsIEdMc2l6ZWkgbiwgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlbkZyYW1lYnVmZmVyc09FUywgR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuUGVyZk1vbml0b3JzQU1ELCBHTHNpemVpIG4sIEdMdWludCAqbW9uaXRvcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlblByb2dyYW1QaXBlbGluZXNFWFQsIEdMc2l6ZWkgbiwgR0x1aW50ICpwaXBlbGluZXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlblF1ZXJpZXNFWFQsIEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpCi1HTF9FTlRSWSh2b2lkLCBnbEdlblJlbmRlcmJ1ZmZlcnMsIEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5SZW5kZXJidWZmZXJzT0VTLCBHTHNpemVpIG4sIEdMdWludCogcmVuZGVyYnVmZmVycykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuVGV4dHVyZXMsIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcykKLUdMX0VOVFJZKHZvaWQsIGdsR2VuVmVydGV4QXJyYXlzT0VTLCBHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKQotR0xfRU5UUlkodm9pZCwgZ2xHZW5lcmF0ZU1pcG1hcCwgR0xlbnVtIHRhcmdldCkKLUdMX0VOVFJZKHZvaWQsIGdsR2VuZXJhdGVNaXBtYXBPRVMsIEdMZW51bSB0YXJnZXQpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEFjdGl2ZUF0dHJpYiwgR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0QWN0aXZlVW5pZm9ybSwgR0x1aW50IHByb2dyYW0sIEdMdWludCBpbmRleCwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMaW50KiBzaXplLCBHTGVudW0qIHR5cGUsIEdMY2hhciogbmFtZSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0QXR0YWNoZWRTaGFkZXJzLCBHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBtYXhjb3VudCwgR0xzaXplaSogY291bnQsIEdMdWludCogc2hhZGVycykKLUdMX0VOVFJZKGludCwgZ2xHZXRBdHRyaWJMb2NhdGlvbiwgR0x1aW50IHByb2dyYW0sIGNvbnN0IEdMY2hhciogbmFtZSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0Qm9vbGVhbnYsIEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMdm9pZCAqKiBwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldENsaXBQbGFuZWYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pCi1HTF9FTlRSWSh2b2lkLCBnbEdldENsaXBQbGFuZWZPRVMsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pCi1HTF9FTlRSWSh2b2lkLCBnbEdldENsaXBQbGFuZXgsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pCi1HTF9FTlRSWSh2b2lkLCBnbEdldENsaXBQbGFuZXhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pCi1HTF9FTlRSWSh2b2lkLCBnbEdldERyaXZlckNvbnRyb2xTdHJpbmdRQ09NLCBHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0RHJpdmVyQ29udHJvbHNRQ09NLCBHTGludCAqbnVtLCBHTHNpemVpIHNpemUsIEdMdWludCAqZHJpdmVyQ29udHJvbHMpCi1HTF9FTlRSWShHTGVudW0sIGdsR2V0RXJyb3IsIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEZlbmNlaXZOViwgR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEZpeGVkdiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEZpeGVkdk9FUywgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEZsb2F0diwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKLUdMX0VOVFJZKEdMZW51bSwgZ2xHZXRHcmFwaGljc1Jlc2V0U3RhdHVzRVhULCB2b2lkKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRJbnRlZ2VydiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRMaWdodGZ2LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRMaWdodHh2LCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRMaWdodHh2T0VTLCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRNYXRlcmlhbGZ2LCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldE1hdGVyaWFseHYsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0TWF0ZXJpYWx4dk9FUywgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRPYmplY3RMYWJlbEVYVCwgR0xlbnVtIHR5cGUsIEdMdWludCBvYmplY3QsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmxhYmVsKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1ELCBHTHVpbnQgbW9uaXRvciwgR0xlbnVtIHBuYW1lLCBHTHNpemVpIGRhdGFTaXplLCBHTHVpbnQgKmRhdGEsIEdMaW50ICpieXRlc1dyaXR0ZW4pCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yQ291bnRlckluZm9BTUQsIEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQsIEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMc2l6ZWkgYnVmU2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBHTGNoYXIgKmNvdW50ZXJTdHJpbmcpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yQ291bnRlcnNBTUQsIEdMdWludCBncm91cCwgR0xpbnQgKm51bUNvdW50ZXJzLCBHTGludCAqbWF4QWN0aXZlQ291bnRlcnMsIEdMc2l6ZWkgY291bnRlclNpemUsIEdMdWludCAqY291bnRlcnMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yR3JvdXBTdHJpbmdBTUQsIEdMdWludCBncm91cCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZ3JvdXBTdHJpbmcpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFBlcmZNb25pdG9yR3JvdXBzQU1ELCBHTGludCAqbnVtR3JvdXBzLCBHTHNpemVpIGdyb3Vwc1NpemUsIEdMdWludCAqZ3JvdXBzKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRQb2ludGVydiwgR0xlbnVtIHBuYW1lLCBHTHZvaWQgKipwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFByb2dyYW1CaW5hcnlPRVMsIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xlbnVtICpiaW5hcnlGb3JtYXQsIEdMdm9pZCAqYmluYXJ5KQotR0xfRU5UUlkodm9pZCwgZ2xHZXRQcm9ncmFtSW5mb0xvZywgR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGNoYXIqIGluZm9sb2cpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFByb2dyYW1QaXBlbGluZUluZm9Mb2dFWFQsIEdMdWludCBwaXBlbGluZSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqaW5mb0xvZykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UHJvZ3JhbVBpcGVsaW5laXZFWFQsIEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRQcm9ncmFtaXYsIEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFF1ZXJ5T2JqZWN0dWl2RVhULCBHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFF1ZXJ5aXZFWFQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0U2hhZGVySW5mb0xvZywgR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0LCBHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbikKLUdMX0VOVFJZKHZvaWQsIGdsR2V0U2hhZGVyU291cmNlLCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBzb3VyY2UpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFNoYWRlcml2LCBHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpCi1HTF9FTlRSWShjb25zdCBHTHVieXRlICosIGdsR2V0U3RyaW5nLCBHTGVudW0gbmFtZSkKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4RW52ZnYsIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZpdiwgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhFbnZ4diwgR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFRleEVudnh2T0VTLCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4R2VuZnZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFRleEdlbml2T0VTLCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4R2VueHZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEdldFRleFBhcmFtZXRlcmZ2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyaXYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VGV4UGFyYW1ldGVyeHYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWShpbnQsIGdsR2V0VW5pZm9ybUxvY2F0aW9uLCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRVbmlmb3JtZnYsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRVbmlmb3JtaXYsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQqIHBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwb2ludGVyKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRWZXJ0ZXhBdHRyaWJmdiwgR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0VmVydGV4QXR0cmliaXYsIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xHZXRuVW5pZm9ybWZ2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsR2V0blVuaWZvcm1pdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGJ1ZlNpemUsIEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbEhpbnQsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKQotR0xfRU5UUlkodm9pZCwgZ2xJbnNlcnRFdmVudE1hcmtlckVYVCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzQnVmZmVyLCBHTHVpbnQgYnVmZmVyKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzRW5hYmxlZCwgR0xlbnVtIGNhcCkKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0ZlbmNlTlYsIEdMdWludCBmZW5jZSkKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc0ZyYW1lYnVmZmVyLCBHTHVpbnQgZnJhbWVidWZmZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNGcmFtZWJ1ZmZlck9FUywgR0x1aW50IGZyYW1lYnVmZmVyKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbElzUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNQcm9ncmFtUGlwZWxpbmVFWFQsIEdMdWludCBwaXBlbGluZSkKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1F1ZXJ5RVhULCBHTHVpbnQgaWQpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNSZW5kZXJidWZmZXIsIEdMdWludCByZW5kZXJidWZmZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNSZW5kZXJidWZmZXJPRVMsIEdMdWludCByZW5kZXJidWZmZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNTaGFkZXIsIEdMdWludCBzaGFkZXIpCi1HTF9FTlRSWShHTGJvb2xlYW4sIGdsSXNUZXh0dXJlLCBHTHVpbnQgdGV4dHVyZSkKLUdMX0VOVFJZKEdMYm9vbGVhbiwgZ2xJc1ZlcnRleEFycmF5T0VTLCBHTHVpbnQgYXJyYXkpCi1HTF9FTlRSWSh2b2lkLCBnbExhYmVsT2JqZWN0RVhULCBHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWxmLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWxmdiwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4T0VTLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0TW9kZWx4dk9FUywgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0ZiwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0ZnYsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0eCwgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0eE9FUywgR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0eHYsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbExpZ2h0eHZPRVMsIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbExpbmVXaWR0aCwgR0xmbG9hdCB3aWR0aCkKLUdMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoeCwgR0xmaXhlZCB3aWR0aCkKLUdMX0VOVFJZKHZvaWQsIGdsTGluZVdpZHRoeE9FUywgR0xmaXhlZCB3aWR0aCkKLUdMX0VOVFJZKHZvaWQsIGdsTGlua1Byb2dyYW0sIEdMdWludCBwcm9ncmFtKQotR0xfRU5UUlkodm9pZCwgZ2xMb2FkSWRlbnRpdHksIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbExvYWRNYXRyaXhmLCBjb25zdCBHTGZsb2F0ICptKQotR0xfRU5UUlkodm9pZCwgZ2xMb2FkTWF0cml4eCwgY29uc3QgR0xmaXhlZCAqbSkKLUdMX0VOVFJZKHZvaWQsIGdsTG9hZE1hdHJpeHhPRVMsIGNvbnN0IEdMZml4ZWQgKm0pCi1HTF9FTlRSWSh2b2lkLCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUywgdm9pZCkKLUdMX0VOVFJZKHZvaWQsIGdsTG9naWNPcCwgR0xlbnVtIG9wY29kZSkKLUdMX0VOVFJZKHZvaWQqLCBnbE1hcEJ1ZmZlck9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcykKLUdMX0VOVFJZKHZvaWQsIGdsTWF0ZXJpYWxmLCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xNYXRlcmlhbGZ2LCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseCwgR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsTWF0ZXJpYWx4T0VTLCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xNYXRlcmlhbHh2LCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbE1hdGVyaWFseHZPRVMsIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTLCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcikKLUdMX0VOVFJZKHZvaWQsIGdsTWF0cml4TW9kZSwgR0xlbnVtIG1vZGUpCi1HTF9FTlRSWSh2b2lkLCBnbE11bHRNYXRyaXhmLCBjb25zdCBHTGZsb2F0ICptKQotR0xfRU5UUlkodm9pZCwgZ2xNdWx0TWF0cml4eCwgY29uc3QgR0xmaXhlZCAqbSkKLUdMX0VOVFJZKHZvaWQsIGdsTXVsdE1hdHJpeHhPRVMsIGNvbnN0IEdMZml4ZWQgKm0pCi1HTF9FTlRSWSh2b2lkLCBnbE11bHRpRHJhd0FycmF5c0VYVCwgR0xlbnVtIG1vZGUsIEdMaW50ICpmaXJzdCwgR0xzaXplaSAqY291bnQsIEdMc2l6ZWkgcHJpbWNvdW50KQotR0xfRU5UUlkodm9pZCwgZ2xNdWx0aURyYXdFbGVtZW50c0VYVCwgR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpCi1HTF9FTlRSWSh2b2lkLCBnbE11bHRpVGV4Q29vcmQ0ZiwgR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKQotR0xfRU5UUlkodm9pZCwgZ2xNdWx0aVRleENvb3JkNHgsIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSkKLUdMX0VOVFJZKHZvaWQsIGdsTXVsdGlUZXhDb29yZDR4T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpCi1HTF9FTlRSWSh2b2lkLCBnbE5vcm1hbDNmLCBHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KQotR0xfRU5UUlkodm9pZCwgZ2xOb3JtYWwzeCwgR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueikKLUdMX0VOVFJZKHZvaWQsIGdsTm9ybWFsM3hPRVMsIEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopCi1HTF9FTlRSWSh2b2lkLCBnbE5vcm1hbFBvaW50ZXIsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKQotR0xfRU5UUlkodm9pZCwgZ2xPcnRob2YsIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbE9ydGhvZk9FUywgR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcikKLUdMX0VOVFJZKHZvaWQsIGdsT3J0aG94LCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKQotR0xfRU5UUlkodm9pZCwgZ2xPcnRob3hPRVMsIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpCi1HTF9FTlRSWSh2b2lkLCBnbFBpeGVsU3RvcmVpLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcmYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJmdiwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFBhcmFtZXRlcnhPRVMsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRQYXJhbWV0ZXJ4diwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFBvaW50UGFyYW1ldGVyeHZPRVMsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xQb2ludFNpemUsIEdMZmxvYXQgc2l6ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXplUG9pbnRlck9FUywgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi1HTF9FTlRSWSh2b2lkLCBnbFBvaW50U2l6ZXgsIEdMZml4ZWQgc2l6ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUG9pbnRTaXpleE9FUywgR0xmaXhlZCBzaXplKQotR0xfRU5UUlkodm9pZCwgZ2xQb2x5Z29uT2Zmc2V0LCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cykKLUdMX0VOVFJZKHZvaWQsIGdsUG9seWdvbk9mZnNldHgsIEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKQotR0xfRU5UUlkodm9pZCwgZ2xQb2x5Z29uT2Zmc2V0eE9FUywgR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpCi1HTF9FTlRSWSh2b2lkLCBnbFBvcEdyb3VwTWFya2VyRVhULCB2b2lkKQotR0xfRU5UUlkodm9pZCwgZ2xQb3BNYXRyaXgsIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1CaW5hcnlPRVMsIEdMdWludCBwcm9ncmFtLCBHTGVudW0gYmluYXJ5Rm9ybWF0LCBjb25zdCBHTHZvaWQgKmJpbmFyeSwgR0xpbnQgbGVuZ3RoKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCwgR0x1aW50IHByb2dyYW0sIEdMZW51bSBwbmFtZSwgR0xpbnQgdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMWZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTFmdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4KQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMmZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMmZ2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTJpRVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtMml2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm0zaUVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6KQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTNpdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtNGZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTRmdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm00aUVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3KQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCAqdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFByb2dyYW1Vbmlmb3JtTWF0cml4MmZ2RVhULCBHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKQotR0xfRU5UUlkodm9pZCwgZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDNmdkVYVCwgR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXg0ZnZFWFQsIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFB1c2hHcm91cE1hcmtlckVYVCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKQotR0xfRU5UUlkodm9pZCwgZ2xQdXNoTWF0cml4LCB2b2lkKQotR0xfRU5UUlkoR0xiaXRmaWVsZCwgZ2xRdWVyeU1hdHJpeHhPRVMsIEdMZml4ZWQgbWFudGlzc2FbMTZdLCBHTGludCBleHBvbmVudFsxNl0pCi1HTF9FTlRSWSh2b2lkLCBnbFJlYWRCdWZmZXJOViwgR0xlbnVtIG1vZGUpCi1HTF9FTlRSWSh2b2lkLCBnbFJlYWRQaXhlbHMsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpCi1HTF9FTlRSWSh2b2lkLCBnbFJlYWRuUGl4ZWxzRVhULCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgYnVmU2l6ZSwgdm9pZCAqZGF0YSkKLUdMX0VOVFJZKHZvaWQsIGdsUmVsZWFzZVNoYWRlckNvbXBpbGVyLCB2b2lkKQotR0xfRU5UUlkodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBUFBMRSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIHNhbXBsZXMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFJlc29sdmVNdWx0aXNhbXBsZUZyYW1lYnVmZmVyQVBQTEUsIHZvaWQpCi1HTF9FTlRSWSh2b2lkLCBnbFJvdGF0ZWYsIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopCi1HTF9FTlRSWSh2b2lkLCBnbFJvdGF0ZXgsIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCi1HTF9FTlRSWSh2b2lkLCBnbFJvdGF0ZXhPRVMsIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCi1HTF9FTlRSWSh2b2lkLCBnbFNhbXBsZUNvdmVyYWdlLCBHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCkKLUdMX0VOVFJZKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2V4LCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkKLUdMX0VOVFJZKHZvaWQsIGdsU2FtcGxlQ292ZXJhZ2V4T0VTLCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCkKLUdMX0VOVFJZKHZvaWQsIGdsU2NhbGVmLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotR0xfRU5UUlkodm9pZCwgZ2xTY2FsZXgsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopCi1HTF9FTlRSWSh2b2lkLCBnbFNjYWxleE9FUywgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLUdMX0VOVFJZKHZvaWQsIGdsU2Npc3NvciwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFNlbGVjdFBlcmZNb25pdG9yQ291bnRlcnNBTUQsIEdMdWludCBtb25pdG9yLCBHTGJvb2xlYW4gZW5hYmxlLCBHTHVpbnQgZ3JvdXAsIEdMaW50IG51bUNvdW50ZXJzLCBHTHVpbnQgKmNvdW50ZXJzTGlzdCkKLUdMX0VOVFJZKHZvaWQsIGdsU2V0RmVuY2VOViwgR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKQotR0xfRU5UUlkodm9pZCwgZ2xTaGFkZU1vZGVsLCBHTGVudW0gbW9kZSkKLUdMX0VOVFJZKHZvaWQsIGdsU2hhZGVyQmluYXJ5LCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKQotR0xfRU5UUlkodm9pZCwgZ2xTaGFkZXJTb3VyY2UsIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCkKLUdMX0VOVFJZKHZvaWQsIGdsU3RhcnRUaWxpbmdRQ09NLCBHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spCi1HTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxGdW5jLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzaykKLUdMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSwgR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKQotR0xfRU5UUlkodm9pZCwgZ2xTdGVuY2lsTWFzaywgR0x1aW50IG1hc2spCi1HTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUsIEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzaykKLUdMX0VOVFJZKHZvaWQsIGdsU3RlbmNpbE9wLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MpCi1HTF9FTlRSWSh2b2lkLCBnbFN0ZW5jaWxPcFNlcGFyYXRlLCBHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbFRlc3RGZW5jZU5WLCBHTHVpbnQgZmVuY2UpCi1HTF9FTlRSWSh2b2lkLCBnbFRleENvb3JkUG9pbnRlciwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEVudmYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4RW52ZnYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZpLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZpdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleEVudnhPRVMsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4RW52eHYsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhFbnZ4dk9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEdlbmZPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhHZW5mdk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4R2VuaU9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhHZW5pdk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEdlbnhPRVMsIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhHZW54dk9FUywgR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4SW1hZ2UyRCwgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleEltYWdlM0RPRVMsIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyZiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJmdiwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcmksIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcml2LCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcngsIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVGV4UGFyYW1ldGVyeE9FUywgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhQYXJhbWV0ZXJ4diwgR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleFBhcmFtZXRlcnh2T0VTLCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4U3RvcmFnZTFERVhULCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhTdG9yYWdlMkRFWFQsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KQotR0xfRU5UUlkodm9pZCwgZ2xUZXhTdG9yYWdlM0RFWFQsIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoKQotR0xfRU5UUlkodm9pZCwgZ2xUZXhTdWJJbWFnZTJELCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscykKLUdMX0VOVFJZKHZvaWQsIGdsVGV4U3ViSW1hZ2UzRE9FUywgR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpCi1HTF9FTlRSWSh2b2lkLCBnbFRleHR1cmVTdG9yYWdlMURFWFQsIEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoKQotR0xfRU5UUlkodm9pZCwgZ2xUZXh0dXJlU3RvcmFnZTJERVhULCBHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpCi1HTF9FTlRSWSh2b2lkLCBnbFRleHR1cmVTdG9yYWdlM0RFWFQsIEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCkKLUdMX0VOVFJZKHZvaWQsIGdsVHJhbnNsYXRlZiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLUdMX0VOVFJZKHZvaWQsIGdsVHJhbnNsYXRleCwgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLUdMX0VOVFJZKHZvaWQsIGdsVHJhbnNsYXRleE9FUywgR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTFmLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMWZ2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTFpLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCkKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTFpdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtMmYsIEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSkKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTJmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0yaSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0yaXYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTNmLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTNmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0zaSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm0zaXYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGludCogdikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTRmLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtNGZ2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdikKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTRpLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdykKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybTRpdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KQotR0xfRU5UUlkodm9pZCwgZ2xVbmlmb3JtTWF0cml4MmZ2LCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpCi1HTF9FTlRSWSh2b2lkLCBnbFVuaWZvcm1NYXRyaXgzZnYsIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0KiB2YWx1ZSkKLUdMX0VOVFJZKHZvaWQsIGdsVW5pZm9ybU1hdHJpeDRmdiwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQqIHZhbHVlKQotR0xfRU5UUlkoR0xib29sZWFuLCBnbFVubWFwQnVmZmVyT0VTLCBHTGVudW0gdGFyZ2V0KQotR0xfRU5UUlkodm9pZCwgZ2xVc2VQcm9ncmFtLCBHTHVpbnQgcHJvZ3JhbSkKLUdMX0VOVFJZKHZvaWQsIGdsVXNlUHJvZ3JhbVN0YWdlc0VYVCwgR0x1aW50IHBpcGVsaW5lLCBHTGJpdGZpZWxkIHN0YWdlcywgR0x1aW50IHByb2dyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFZhbGlkYXRlUHJvZ3JhbSwgR0x1aW50IHByb2dyYW0pCi1HTF9FTlRSWSh2b2lkLCBnbFZhbGlkYXRlUHJvZ3JhbVBpcGVsaW5lRVhULCBHTHVpbnQgcGlwZWxpbmUpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjFmLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4KQotR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIxZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjJmLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjJmdiwgR0x1aW50IGluZHgsIGNvbnN0IEdMZmxvYXQqIHZhbHVlcykKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4QXR0cmliM2YsIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KQotR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWIzZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYjRmLCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KQotR0xfRU5UUlkodm9pZCwgZ2xWZXJ0ZXhBdHRyaWI0ZnYsIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpCi1HTF9FTlRSWSh2b2lkLCBnbFZlcnRleEF0dHJpYlBvaW50ZXIsIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQqIHB0cikKLUdMX0VOVFJZKHZvaWQsIGdsVmVydGV4UG9pbnRlciwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCi1HTF9FTlRSWSh2b2lkLCBnbFZpZXdwb3J0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCkKLUdMX0VOVFJZKHZvaWQsIGdsV2VpZ2h0UG9pbnRlck9FUywgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy9lbnVtcy5pbiBiL29wZW5nbC9saWJzL2VudW1zLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJjODY2Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL2VudW1zLmluCisrKyAvZGV2L251bGwKQEAgLTEsNzAyICswLDAgQEAKLUdMX0VOVU0oMHgwMDAwLEdMX1BPSU5UUykKLUdMX0VOVU0oMHgwMDAwMDAwMSxHTF9WRVJURVhfU0hBREVSX0JJVF9FWFQpCi1HTF9FTlVNKDB4MDAwMDAwMDIsR0xfRlJBR01FTlRfU0hBREVSX0JJVF9FWFQpCi1HTF9FTlVNKDB4MDAwMSxHTF9MSU5FUykKLUdMX0VOVU0oMHgwMDAyLEdMX0xJTkVfTE9PUCkKLUdMX0VOVU0oMHgwMDAzLEdMX0xJTkVfU1RSSVApCi1HTF9FTlVNKDB4MDAwNCxHTF9UUklBTkdMRVMpCi1HTF9FTlVNKDB4MDAwNSxHTF9UUklBTkdMRV9TVFJJUCkKLUdMX0VOVU0oMHgwMDA2LEdMX1RSSUFOR0xFX0ZBTikKLUdMX0VOVU0oMHgwMTA0LEdMX0FERCkKLUdMX0VOVU0oMHgwMjAwLEdMX05FVkVSKQotR0xfRU5VTSgweDAyMDEsR0xfTEVTUykKLUdMX0VOVU0oMHgwMjAyLEdMX0VRVUFMKQotR0xfRU5VTSgweDAyMDMsR0xfTEVRVUFMKQotR0xfRU5VTSgweDAyMDQsR0xfR1JFQVRFUikKLUdMX0VOVU0oMHgwMjA1LEdMX05PVEVRVUFMKQotR0xfRU5VTSgweDAyMDYsR0xfR0VRVUFMKQotR0xfRU5VTSgweDAyMDcsR0xfQUxXQVlTKQotR0xfRU5VTSgweDAzMDAsR0xfU1JDX0NPTE9SKQotR0xfRU5VTSgweDAzMDEsR0xfT05FX01JTlVTX1NSQ19DT0xPUikKLUdMX0VOVU0oMHgwMzAyLEdMX1NSQ19BTFBIQSkKLUdMX0VOVU0oMHgwMzAzLEdMX09ORV9NSU5VU19TUkNfQUxQSEEpCi1HTF9FTlVNKDB4MDMwNCxHTF9EU1RfQUxQSEEpCi1HTF9FTlVNKDB4MDMwNSxHTF9PTkVfTUlOVVNfRFNUX0FMUEhBKQotR0xfRU5VTSgweDAzMDYsR0xfRFNUX0NPTE9SKQotR0xfRU5VTSgweDAzMDcsR0xfT05FX01JTlVTX0RTVF9DT0xPUikKLUdMX0VOVU0oMHgwMzA4LEdMX1NSQ19BTFBIQV9TQVRVUkFURSkKLUdMX0VOVU0oMHgwNDA0LEdMX0ZST05UKQotR0xfRU5VTSgweDA0MDUsR0xfQkFDSykKLUdMX0VOVU0oMHgwNDA4LEdMX0ZST05UX0FORF9CQUNLKQotR0xfRU5VTSgweDA1MDAsR0xfSU5WQUxJRF9FTlVNKQotR0xfRU5VTSgweDA1MDEsR0xfSU5WQUxJRF9WQUxVRSkKLUdMX0VOVU0oMHgwNTAyLEdMX0lOVkFMSURfT1BFUkFUSU9OKQotR0xfRU5VTSgweDA1MDMsR0xfU1RBQ0tfT1ZFUkZMT1cpCi1HTF9FTlVNKDB4MDUwNCxHTF9TVEFDS19VTkRFUkZMT1cpCi1HTF9FTlVNKDB4MDUwNSxHTF9PVVRfT0ZfTUVNT1JZKQotR0xfRU5VTSgweDA1MDYsR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTKQotR0xfRU5VTSgweDA4MDAsR0xfRVhQKQotR0xfRU5VTSgweDA4MDEsR0xfRVhQMikKLUdMX0VOVU0oMHgwOTAwLEdMX0NXKQotR0xfRU5VTSgweDA5MDEsR0xfQ0NXKQotR0xfRU5VTSgweDBCMDAsR0xfQ1VSUkVOVF9DT0xPUikKLUdMX0VOVU0oMHgwQjAyLEdMX0NVUlJFTlRfTk9STUFMKQotR0xfRU5VTSgweDBCMDMsR0xfQ1VSUkVOVF9URVhUVVJFX0NPT1JEUykKLUdMX0VOVU0oMHgwQjEwLEdMX1BPSU5UX1NNT09USCkKLUdMX0VOVU0oMHgwQjExLEdMX1BPSU5UX1NJWkUpCi1HTF9FTlVNKDB4MEIxMixHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSkKLUdMX0VOVU0oMHgwQjIwLEdMX0xJTkVfU01PT1RIKQotR0xfRU5VTSgweDBCMjEsR0xfTElORV9XSURUSCkKLUdMX0VOVU0oMHgwQjIyLEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFKQotR0xfRU5VTSgweDBCNDQsR0xfQ1VMTF9GQUNFKQotR0xfRU5VTSgweDBCNDUsR0xfQ1VMTF9GQUNFX01PREUpCi1HTF9FTlVNKDB4MEI0NixHTF9GUk9OVF9GQUNFKQotR0xfRU5VTSgweDBCNTAsR0xfTElHSFRJTkcpCi1HTF9FTlVNKDB4MEI1MixHTF9MSUdIVF9NT0RFTF9UV09fU0lERSkKLUdMX0VOVU0oMHgwQjUzLEdMX0xJR0hUX01PREVMX0FNQklFTlQpCi1HTF9FTlVNKDB4MEI1NCxHTF9TSEFERV9NT0RFTCkKLUdMX0VOVU0oMHgwQjU3LEdMX0NPTE9SX01BVEVSSUFMKQotR0xfRU5VTSgweDBCNjAsR0xfRk9HKQotR0xfRU5VTSgweDBCNjIsR0xfRk9HX0RFTlNJVFkpCi1HTF9FTlVNKDB4MEI2MyxHTF9GT0dfU1RBUlQpCi1HTF9FTlVNKDB4MEI2NCxHTF9GT0dfRU5EKQotR0xfRU5VTSgweDBCNjUsR0xfRk9HX01PREUpCi1HTF9FTlVNKDB4MEI2NixHTF9GT0dfQ09MT1IpCi1HTF9FTlVNKDB4MEI3MCxHTF9ERVBUSF9SQU5HRSkKLUdMX0VOVU0oMHgwQjcxLEdMX0RFUFRIX1RFU1QpCi1HTF9FTlVNKDB4MEI3MixHTF9ERVBUSF9XUklURU1BU0spCi1HTF9FTlVNKDB4MEI3MyxHTF9ERVBUSF9DTEVBUl9WQUxVRSkKLUdMX0VOVU0oMHgwQjc0LEdMX0RFUFRIX0ZVTkMpCi1HTF9FTlVNKDB4MEI5MCxHTF9TVEVOQ0lMX1RFU1QpCi1HTF9FTlVNKDB4MEI5MSxHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFKQotR0xfRU5VTSgweDBCOTIsR0xfU1RFTkNJTF9GVU5DKQotR0xfRU5VTSgweDBCOTMsR0xfU1RFTkNJTF9WQUxVRV9NQVNLKQotR0xfRU5VTSgweDBCOTQsR0xfU1RFTkNJTF9GQUlMKQotR0xfRU5VTSgweDBCOTUsR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwpCi1HTF9FTlVNKDB4MEI5NixHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUykKLUdMX0VOVU0oMHgwQjk3LEdMX1NURU5DSUxfUkVGKQotR0xfRU5VTSgweDBCOTgsR0xfU1RFTkNJTF9XUklURU1BU0spCi1HTF9FTlVNKDB4MEJBMCxHTF9NQVRSSVhfTU9ERSkKLUdMX0VOVU0oMHgwQkExLEdMX05PUk1BTElaRSkKLUdMX0VOVU0oMHgwQkEyLEdMX1ZJRVdQT1JUKQotR0xfRU5VTSgweDBCQTMsR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIKQotR0xfRU5VTSgweDBCQTQsR0xfUFJPSkVDVElPTl9TVEFDS19ERVBUSCkKLUdMX0VOVU0oMHgwQkE1LEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgpCi1HTF9FTlVNKDB4MEJBNixHTF9NT0RFTFZJRVdfTUFUUklYKQotR0xfRU5VTSgweDBCQTcsR0xfUFJPSkVDVElPTl9NQVRSSVgpCi1HTF9FTlVNKDB4MEJBOCxHTF9URVhUVVJFX01BVFJJWCkKLUdMX0VOVU0oMHgwQkMwLEdMX0FMUEhBX1RFU1QpCi1HTF9FTlVNKDB4MEJDMSxHTF9BTFBIQV9URVNUX0ZVTkMpCi1HTF9FTlVNKDB4MEJDMixHTF9BTFBIQV9URVNUX1JFRikKLUdMX0VOVU0oMHgwQkQwLEdMX0RJVEhFUikKLUdMX0VOVU0oMHgwQkUwLEdMX0JMRU5EX0RTVCkKLUdMX0VOVU0oMHgwQkUxLEdMX0JMRU5EX1NSQykKLUdMX0VOVU0oMHgwQkUyLEdMX0JMRU5EKQotR0xfRU5VTSgweDBCRjAsR0xfTE9HSUNfT1BfTU9ERSkKLUdMX0VOVU0oMHgwQkYyLEdMX0NPTE9SX0xPR0lDX09QKQotR0xfRU5VTSgweDBDMDIsR0xfUkVBRF9CVUZGRVJfTlYpCi1HTF9FTlVNKDB4MEMxMCxHTF9TQ0lTU09SX0JPWCkKLUdMX0VOVU0oMHgwQzExLEdMX1NDSVNTT1JfVEVTVCkKLUdMX0VOVU0oMHgwQzIyLEdMX0NPTE9SX0NMRUFSX1ZBTFVFKQotR0xfRU5VTSgweDBDMjMsR0xfQ09MT1JfV1JJVEVNQVNLKQotR0xfRU5VTSgweDBDNTAsR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UKQotR0xfRU5VTSgweDBDNTEsR0xfUE9JTlRfU01PT1RIX0hJTlQpCi1HTF9FTlVNKDB4MEM1MixHTF9MSU5FX1NNT09USF9ISU5UKQotR0xfRU5VTSgweDBDNTQsR0xfRk9HX0hJTlQpCi1HTF9FTlVNKDB4MENGMixHTF9VTlBBQ0tfUk9XX0xFTkdUSCkKLUdMX0VOVU0oMHgwQ0YzLEdMX1VOUEFDS19TS0lQX1JPV1MpCi1HTF9FTlVNKDB4MENGNCxHTF9VTlBBQ0tfU0tJUF9QSVhFTFMpCi1HTF9FTlVNKDB4MENGNSxHTF9VTlBBQ0tfQUxJR05NRU5UKQotR0xfRU5VTSgweDBEMDUsR0xfUEFDS19BTElHTk1FTlQpCi1HTF9FTlVNKDB4MEQxQyxHTF9BTFBIQV9TQ0FMRSkKLUdMX0VOVU0oMHgwRDMxLEdMX01BWF9MSUdIVFMpCi1HTF9FTlVNKDB4MEQzMixHTF9NQVhfQ0xJUF9QTEFORVMpCi1HTF9FTlVNKDB4MEQzMyxHTF9NQVhfVEVYVFVSRV9TSVpFKQotR0xfRU5VTSgweDBEMzYsR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCkKLUdMX0VOVU0oMHgwRDM4LEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIKQotR0xfRU5VTSgweDBEMzksR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEgpCi1HTF9FTlVNKDB4MEQzQSxHTF9NQVhfVklFV1BPUlRfRElNUykKLUdMX0VOVU0oMHgwRDUwLEdMX1NVQlBJWEVMX0JJVFMpCi1HTF9FTlVNKDB4MEQ1MixHTF9SRURfQklUUykKLUdMX0VOVU0oMHgwRDUzLEdMX0dSRUVOX0JJVFMpCi1HTF9FTlVNKDB4MEQ1NCxHTF9CTFVFX0JJVFMpCi1HTF9FTlVNKDB4MEQ1NSxHTF9BTFBIQV9CSVRTKQotR0xfRU5VTSgweDBENTYsR0xfREVQVEhfQklUUykKLUdMX0VOVU0oMHgwRDU3LEdMX1NURU5DSUxfQklUUykKLUdMX0VOVU0oMHgwREUxLEdMX1RFWFRVUkVfMkQpCi1HTF9FTlVNKDB4MTEwMCxHTF9ET05UX0NBUkUpCi1HTF9FTlVNKDB4MTEwMSxHTF9GQVNURVNUKQotR0xfRU5VTSgweDExMDIsR0xfTklDRVNUKQotR0xfRU5VTSgweDEyMDAsR0xfQU1CSUVOVCkKLUdMX0VOVU0oMHgxMjAxLEdMX0RJRkZVU0UpCi1HTF9FTlVNKDB4MTIwMixHTF9TUEVDVUxBUikKLUdMX0VOVU0oMHgxMjAzLEdMX1BPU0lUSU9OKQotR0xfRU5VTSgweDEyMDQsR0xfU1BPVF9ESVJFQ1RJT04pCi1HTF9FTlVNKDB4MTIwNSxHTF9TUE9UX0VYUE9ORU5UKQotR0xfRU5VTSgweDEyMDYsR0xfU1BPVF9DVVRPRkYpCi1HTF9FTlVNKDB4MTIwNyxHTF9DT05TVEFOVF9BVFRFTlVBVElPTikKLUdMX0VOVU0oMHgxMjA4LEdMX0xJTkVBUl9BVFRFTlVBVElPTikKLUdMX0VOVU0oMHgxMjA5LEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTikKLUdMX0VOVU0oMHgxNDAwLEdMX0JZVEUpCi1HTF9FTlVNKDB4MTQwMSxHTF9VTlNJR05FRF9CWVRFKQotR0xfRU5VTSgweDE0MDIsR0xfU0hPUlQpCi1HTF9FTlVNKDB4MTQwMyxHTF9VTlNJR05FRF9TSE9SVCkKLUdMX0VOVU0oMHgxNDA0LEdMX0lOVCkKLUdMX0VOVU0oMHgxNDA1LEdMX1VOU0lHTkVEX0lOVCkKLUdMX0VOVU0oMHgxNDA2LEdMX0ZMT0FUKQotR0xfRU5VTSgweDE0MEMsR0xfRklYRUQpCi1HTF9FTlVNKDB4MTUwMCxHTF9DTEVBUikKLUdMX0VOVU0oMHgxNTAxLEdMX0FORCkKLUdMX0VOVU0oMHgxNTAyLEdMX0FORF9SRVZFUlNFKQotR0xfRU5VTSgweDE1MDMsR0xfQ09QWSkKLUdMX0VOVU0oMHgxNTA0LEdMX0FORF9JTlZFUlRFRCkKLUdMX0VOVU0oMHgxNTA1LEdMX05PT1ApCi1HTF9FTlVNKDB4MTUwNixHTF9YT1IpCi1HTF9FTlVNKDB4MTUwNyxHTF9PUikKLUdMX0VOVU0oMHgxNTA4LEdMX05PUikKLUdMX0VOVU0oMHgxNTA5LEdMX0VRVUlWKQotR0xfRU5VTSgweDE1MEEsR0xfSU5WRVJUKQotR0xfRU5VTSgweDE1MEIsR0xfT1JfUkVWRVJTRSkKLUdMX0VOVU0oMHgxNTBDLEdMX0NPUFlfSU5WRVJURUQpCi1HTF9FTlVNKDB4MTUwRCxHTF9PUl9JTlZFUlRFRCkKLUdMX0VOVU0oMHgxNTBFLEdMX05BTkQpCi1HTF9FTlVNKDB4MTUwRixHTF9TRVQpCi1HTF9FTlVNKDB4MTYwMCxHTF9FTUlTU0lPTikKLUdMX0VOVU0oMHgxNjAxLEdMX1NISU5JTkVTUykKLUdMX0VOVU0oMHgxNjAyLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UpCi1HTF9FTlVNKDB4MTcwMCxHTF9NT0RFTFZJRVcpCi1HTF9FTlVNKDB4MTcwMSxHTF9QUk9KRUNUSU9OKQotR0xfRU5VTSgweDE3MDIsR0xfVEVYVFVSRSkKLUdMX0VOVU0oMHgxODAwLEdMX0NPTE9SX0VYVCkKLUdMX0VOVU0oMHgxODAxLEdMX0RFUFRIX0VYVCkKLUdMX0VOVU0oMHgxODAyLEdMX1NURU5DSUxfRVhUKQotR0xfRU5VTSgweDE5MDEsR0xfU1RFTkNJTF9JTkRFWCkKLUdMX0VOVU0oMHgxOTAyLEdMX0RFUFRIX0NPTVBPTkVOVCkKLUdMX0VOVU0oMHgxOTAzLEdMX1JFRF9FWFQpCi1HTF9FTlVNKDB4MTkwNixHTF9BTFBIQSkKLUdMX0VOVU0oMHgxOTA3LEdMX1JHQikKLUdMX0VOVU0oMHgxOTA4LEdMX1JHQkEpCi1HTF9FTlVNKDB4MTkwOSxHTF9MVU1JTkFOQ0UpCi1HTF9FTlVNKDB4MTkwQSxHTF9MVU1JTkFOQ0VfQUxQSEEpCi1HTF9FTlVNKDB4MUQwMCxHTF9GTEFUKQotR0xfRU5VTSgweDFEMDEsR0xfU01PT1RIKQotR0xfRU5VTSgweDFFMDAsR0xfS0VFUCkKLUdMX0VOVU0oMHgxRTAxLEdMX1JFUExBQ0UpCi1HTF9FTlVNKDB4MUUwMixHTF9JTkNSKQotR0xfRU5VTSgweDFFMDMsR0xfREVDUikKLUdMX0VOVU0oMHgxRjAwLEdMX1ZFTkRPUikKLUdMX0VOVU0oMHgxRjAxLEdMX1JFTkRFUkVSKQotR0xfRU5VTSgweDFGMDIsR0xfVkVSU0lPTikKLUdMX0VOVU0oMHgxRjAzLEdMX0VYVEVOU0lPTlMpCi1HTF9FTlVNKDB4MjEwMCxHTF9NT0RVTEFURSkKLUdMX0VOVU0oMHgyMTAxLEdMX0RFQ0FMKQotR0xfRU5VTSgweDIyMDAsR0xfVEVYVFVSRV9FTlZfTU9ERSkKLUdMX0VOVU0oMHgyMjAxLEdMX1RFWFRVUkVfRU5WX0NPTE9SKQotR0xfRU5VTSgweDIzMDAsR0xfVEVYVFVSRV9FTlYpCi1HTF9FTlVNKDB4MjUwMCxHTF9URVhUVVJFX0dFTl9NT0RFX09FUykKLUdMX0VOVU0oMHgyNjAwLEdMX05FQVJFU1QpCi1HTF9FTlVNKDB4MjYwMSxHTF9MSU5FQVIpCi1HTF9FTlVNKDB4MjcwMCxHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUKQotR0xfRU5VTSgweDI3MDEsR0xfTElORUFSX01JUE1BUF9ORUFSRVNUKQotR0xfRU5VTSgweDI3MDIsR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSKQotR0xfRU5VTSgweDI3MDMsR0xfTElORUFSX01JUE1BUF9MSU5FQVIpCi1HTF9FTlVNKDB4MjgwMCxHTF9URVhUVVJFX01BR19GSUxURVIpCi1HTF9FTlVNKDB4MjgwMSxHTF9URVhUVVJFX01JTl9GSUxURVIpCi1HTF9FTlVNKDB4MjgwMixHTF9URVhUVVJFX1dSQVBfUykKLUdMX0VOVU0oMHgyODAzLEdMX1RFWFRVUkVfV1JBUF9UKQotR0xfRU5VTSgweDI5MDEsR0xfUkVQRUFUKQotR0xfRU5VTSgweDJBMDAsR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMpCi1HTF9FTlVNKDB4MzAwMCxHTF9DTElQX1BMQU5FMCkKLUdMX0VOVU0oMHgzMDAxLEdMX0NMSVBfUExBTkUxKQotR0xfRU5VTSgweDMwMDIsR0xfQ0xJUF9QTEFORTIpCi1HTF9FTlVNKDB4MzAwMyxHTF9DTElQX1BMQU5FMykKLUdMX0VOVU0oMHgzMDA0LEdMX0NMSVBfUExBTkU0KQotR0xfRU5VTSgweDMwMDUsR0xfQ0xJUF9QTEFORTUpCi1HTF9FTlVNKDB4NDAwMCxHTF9MSUdIVDApCi1HTF9FTlVNKDB4NDAwMSxHTF9MSUdIVDEpCi1HTF9FTlVNKDB4NDAwMixHTF9MSUdIVDIpCi1HTF9FTlVNKDB4NDAwMyxHTF9MSUdIVDMpCi1HTF9FTlVNKDB4NDAwNCxHTF9MSUdIVDQpCi1HTF9FTlVNKDB4NDAwNSxHTF9MSUdIVDUpCi1HTF9FTlVNKDB4NDAwNixHTF9MSUdIVDYpCi1HTF9FTlVNKDB4NDAwNyxHTF9MSUdIVDcpCi1HTF9FTlVNKDB4ODAwMCxHTF9DT1ZFUkFHRV9CVUZGRVJfQklUX05WKQotR0xfRU5VTSgweDgwMDEsR0xfQ09OU1RBTlRfQ09MT1IpCi1HTF9FTlVNKDB4ODAwMixHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IpCi1HTF9FTlVNKDB4ODAwMyxHTF9DT05TVEFOVF9BTFBIQSkKLUdMX0VOVU0oMHg4MDA0LEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSkKLUdMX0VOVU0oMHg4MDA1LEdMX0JMRU5EX0NPTE9SKQotR0xfRU5VTSgweDgwMDYsR0xfRlVOQ19BRERfT0VTKQotR0xfRU5VTSgweDgwMDcsR0xfTUlOX0VYVCkKLUdMX0VOVU0oMHg4MDA4LEdMX01BWF9FWFQpCi1HTF9FTlVNKDB4ODAwOSxHTF9CTEVORF9FUVVBVElPTl9SR0JfT0VTKQotR0xfRU5VTSgweDgwMEEsR0xfRlVOQ19TVUJUUkFDVF9PRVMpCi1HTF9FTlVNKDB4ODAwQixHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1RfT0VTKQotR0xfRU5VTSgweDgwMzMsR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCkKLUdMX0VOVU0oMHg4MDM0LEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEpCi1HTF9FTlVNKDB4ODAzNyxHTF9QT0xZR09OX09GRlNFVF9GSUxMKQotR0xfRU5VTSgweDgwMzgsR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SKQotR0xfRU5VTSgweDgwM0EsR0xfUkVTQ0FMRV9OT1JNQUwpCi1HTF9FTlVNKDB4ODAzQyxHTF9BTFBIQThfRVhUKQotR0xfRU5VTSgweDgwNDAsR0xfTFVNSU5BTkNFOF9FWFQpCi1HTF9FTlVNKDB4ODA0NSxHTF9MVU1JTkFOQ0U4X0FMUEhBOF9FWFQpCi1HTF9FTlVNKDB4ODA1MSxHTF9SR0I4X09FUykKLUdMX0VOVU0oMHg4MDUyLEdMX1JHQjEwX0VYVCkKLUdMX0VOVU0oMHg4MDU2LEdMX1JHQkE0X09FUykKLUdMX0VOVU0oMHg4MDU3LEdMX1JHQjVfQTFfT0VTKQotR0xfRU5VTSgweDgwNTgsR0xfUkdCQThfT0VTKQotR0xfRU5VTSgweDgwNTksR0xfUkdCMTBfQTJfRVhUKQotR0xfRU5VTSgweDgwNjksR0xfVEVYVFVSRV9CSU5ESU5HXzJEKQotR0xfRU5VTSgweDgwNkEsR0xfVEVYVFVSRV9CSU5ESU5HXzNEX09FUykKLUdMX0VOVU0oMHg4MDZGLEdMX1RFWFRVUkVfM0RfT0VTKQotR0xfRU5VTSgweDgwNzIsR0xfVEVYVFVSRV9XUkFQX1JfT0VTKQotR0xfRU5VTSgweDgwNzMsR0xfTUFYXzNEX1RFWFRVUkVfU0laRV9PRVMpCi1HTF9FTlVNKDB4ODA3NCxHTF9WRVJURVhfQVJSQVkpCi1HTF9FTlVNKDB4ODA3NSxHTF9OT1JNQUxfQVJSQVkpCi1HTF9FTlVNKDB4ODA3NixHTF9DT0xPUl9BUlJBWSkKLUdMX0VOVU0oMHg4MDc4LEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpCi1HTF9FTlVNKDB4ODA3QSxHTF9WRVJURVhfQVJSQVlfU0laRSkKLUdMX0VOVU0oMHg4MDdCLEdMX1ZFUlRFWF9BUlJBWV9UWVBFKQotR0xfRU5VTSgweDgwN0MsR0xfVkVSVEVYX0FSUkFZX1NUUklERSkKLUdMX0VOVU0oMHg4MDdFLEdMX05PUk1BTF9BUlJBWV9UWVBFKQotR0xfRU5VTSgweDgwN0YsR0xfTk9STUFMX0FSUkFZX1NUUklERSkKLUdMX0VOVU0oMHg4MDgxLEdMX0NPTE9SX0FSUkFZX1NJWkUpCi1HTF9FTlVNKDB4ODA4MixHTF9DT0xPUl9BUlJBWV9UWVBFKQotR0xfRU5VTSgweDgwODMsR0xfQ09MT1JfQVJSQVlfU1RSSURFKQotR0xfRU5VTSgweDgwODgsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFKQotR0xfRU5VTSgweDgwODksR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFKQotR0xfRU5VTSgweDgwOEEsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUpCi1HTF9FTlVNKDB4ODA4RSxHTF9WRVJURVhfQVJSQVlfUE9JTlRFUikKLUdMX0VOVU0oMHg4MDhGLEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSKQotR0xfRU5VTSgweDgwOTAsR0xfQ09MT1JfQVJSQVlfUE9JTlRFUikKLUdMX0VOVU0oMHg4MDkyLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUikKLUdMX0VOVU0oMHg4MDlELEdMX01VTFRJU0FNUExFKQotR0xfRU5VTSgweDgwOUUsR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFKQotR0xfRU5VTSgweDgwOUYsR0xfU0FNUExFX0FMUEhBX1RPX09ORSkKLUdMX0VOVU0oMHg4MEEwLEdMX1NBTVBMRV9DT1ZFUkFHRSkKLUdMX0VOVU0oMHg4MEE4LEdMX1NBTVBMRV9CVUZGRVJTKQotR0xfRU5VTSgweDgwQTksR0xfU0FNUExFUykKLUdMX0VOVU0oMHg4MEFBLEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSkKLUdMX0VOVU0oMHg4MEFCLEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQpCi1HTF9FTlVNKDB4ODBDOCxHTF9CTEVORF9EU1RfUkdCX09FUykKLUdMX0VOVU0oMHg4MEM5LEdMX0JMRU5EX1NSQ19SR0JfT0VTKQotR0xfRU5VTSgweDgwQ0EsR0xfQkxFTkRfRFNUX0FMUEhBX09FUykKLUdMX0VOVU0oMHg4MENCLEdMX0JMRU5EX1NSQ19BTFBIQV9PRVMpCi1HTF9FTlVNKDB4ODBFMSxHTF9CR1JBX0VYVCkKLUdMX0VOVU0oMHg4MTI2LEdMX1BPSU5UX1NJWkVfTUlOKQotR0xfRU5VTSgweDgxMjcsR0xfUE9JTlRfU0laRV9NQVgpCi1HTF9FTlVNKDB4ODEyOCxHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFKQotR0xfRU5VTSgweDgxMjksR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04pCi1HTF9FTlVNKDB4ODEyRixHTF9DTEFNUF9UT19FREdFKQotR0xfRU5VTSgweDgxM0QsR0xfVEVYVFVSRV9NQVhfTEVWRUxfQVBQTEUpCi1HTF9FTlVNKDB4ODE5MSxHTF9HRU5FUkFURV9NSVBNQVApCi1HTF9FTlVNKDB4ODE5MixHTF9HRU5FUkFURV9NSVBNQVBfSElOVCkKLUdMX0VOVU0oMHg4MUE1LEdMX0RFUFRIX0NPTVBPTkVOVDE2X09FUykKLUdMX0VOVU0oMHg4MUE2LEdMX0RFUFRIX0NPTVBPTkVOVDI0X09FUykKLUdMX0VOVU0oMHg4MUE3LEdMX0RFUFRIX0NPTVBPTkVOVDMyX09FUykKLUdMX0VOVU0oMHg4MjEwLEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfQ09MT1JfRU5DT0RJTkdfRVhUKQotR0xfRU5VTSgweDgyMTEsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9DT01QT05FTlRfVFlQRV9FWFQpCi1HTF9FTlVNKDB4ODIyNyxHTF9SR19FWFQpCi1HTF9FTlVNKDB4ODIyOSxHTF9SOF9FWFQpCi1HTF9FTlVNKDB4ODIyQixHTF9SRzhfRVhUKQotR0xfRU5VTSgweDgyMkQsR0xfUjE2Rl9FWFQpCi1HTF9FTlVNKDB4ODIyRixHTF9SRzE2Rl9FWFQpCi1HTF9FTlVNKDB4ODI1MixHTF9MT1NFX0NPTlRFWFRfT05fUkVTRVRfRVhUKQotR0xfRU5VTSgweDgyNTMsR0xfR1VJTFRZX0NPTlRFWFRfUkVTRVRfRVhUKQotR0xfRU5VTSgweDgyNTQsR0xfSU5OT0NFTlRfQ09OVEVYVF9SRVNFVF9FWFQpCi1HTF9FTlVNKDB4ODI1NSxHTF9VTktOT1dOX0NPTlRFWFRfUkVTRVRfRVhUKQotR0xfRU5VTSgweDgyNTYsR0xfUkVTRVRfTk9USUZJQ0FUSU9OX1NUUkFURUdZX0VYVCkKLUdMX0VOVU0oMHg4MjU4LEdMX1BST0dSQU1fU0VQQVJBQkxFX0VYVCkKLUdMX0VOVU0oMHg4MjU5LEdMX0FDVElWRV9QUk9HUkFNX0VYVCkKLUdMX0VOVU0oMHg4MjVBLEdMX1BST0dSQU1fUElQRUxJTkVfQklORElOR19FWFQpCi1HTF9FTlVNKDB4ODI2MSxHTF9OT19SRVNFVF9OT1RJRklDQVRJT05fRVhUKQotR0xfRU5VTSgweDgzNjMsR0xfVU5TSUdORURfU0hPUlRfNV82XzUpCi1HTF9FTlVNKDB4ODM2NSxHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80X1JFVl9FWFQpCi1HTF9FTlVNKDB4ODM2NixHTF9VTlNJR05FRF9TSE9SVF8xXzVfNV81X1JFVl9FWFQpCi1HTF9FTlVNKDB4ODM2OCxHTF9VTlNJR05FRF9JTlRfMl8xMF8xMF8xMF9SRVZfRVhUKQotR0xfRU5VTSgweDgzNzAsR0xfTUlSUk9SRURfUkVQRUFUX09FUykKLUdMX0VOVU0oMHg4M0YwLEdMX0NPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQpCi1HTF9FTlVNKDB4ODNGMSxHTF9DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVCkKLUdMX0VOVU0oMHg4NDZELEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSkKLUdMX0VOVU0oMHg4NDZFLEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSkKLUdMX0VOVU0oMHg4NEMwLEdMX1RFWFRVUkUwKQotR0xfRU5VTSgweDg0QzEsR0xfVEVYVFVSRTEpCi1HTF9FTlVNKDB4ODRDMixHTF9URVhUVVJFMikKLUdMX0VOVU0oMHg4NEMzLEdMX1RFWFRVUkUzKQotR0xfRU5VTSgweDg0QzQsR0xfVEVYVFVSRTQpCi1HTF9FTlVNKDB4ODRDNSxHTF9URVhUVVJFNSkKLUdMX0VOVU0oMHg4NEM2LEdMX1RFWFRVUkU2KQotR0xfRU5VTSgweDg0QzcsR0xfVEVYVFVSRTcpCi1HTF9FTlVNKDB4ODRDOCxHTF9URVhUVVJFOCkKLUdMX0VOVU0oMHg4NEM5LEdMX1RFWFRVUkU5KQotR0xfRU5VTSgweDg0Q0EsR0xfVEVYVFVSRTEwKQotR0xfRU5VTSgweDg0Q0IsR0xfVEVYVFVSRTExKQotR0xfRU5VTSgweDg0Q0MsR0xfVEVYVFVSRTEyKQotR0xfRU5VTSgweDg0Q0QsR0xfVEVYVFVSRTEzKQotR0xfRU5VTSgweDg0Q0UsR0xfVEVYVFVSRTE0KQotR0xfRU5VTSgweDg0Q0YsR0xfVEVYVFVSRTE1KQotR0xfRU5VTSgweDg0RDAsR0xfVEVYVFVSRTE2KQotR0xfRU5VTSgweDg0RDEsR0xfVEVYVFVSRTE3KQotR0xfRU5VTSgweDg0RDIsR0xfVEVYVFVSRTE4KQotR0xfRU5VTSgweDg0RDMsR0xfVEVYVFVSRTE5KQotR0xfRU5VTSgweDg0RDQsR0xfVEVYVFVSRTIwKQotR0xfRU5VTSgweDg0RDUsR0xfVEVYVFVSRTIxKQotR0xfRU5VTSgweDg0RDYsR0xfVEVYVFVSRTIyKQotR0xfRU5VTSgweDg0RDcsR0xfVEVYVFVSRTIzKQotR0xfRU5VTSgweDg0RDgsR0xfVEVYVFVSRTI0KQotR0xfRU5VTSgweDg0RDksR0xfVEVYVFVSRTI1KQotR0xfRU5VTSgweDg0REEsR0xfVEVYVFVSRTI2KQotR0xfRU5VTSgweDg0REIsR0xfVEVYVFVSRTI3KQotR0xfRU5VTSgweDg0REMsR0xfVEVYVFVSRTI4KQotR0xfRU5VTSgweDg0REQsR0xfVEVYVFVSRTI5KQotR0xfRU5VTSgweDg0REUsR0xfVEVYVFVSRTMwKQotR0xfRU5VTSgweDg0REYsR0xfVEVYVFVSRTMxKQotR0xfRU5VTSgweDg0RTAsR0xfQUNUSVZFX1RFWFRVUkUpCi1HTF9FTlVNKDB4ODRFMSxHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUpCi1HTF9FTlVNKDB4ODRFMixHTF9NQVhfVEVYVFVSRV9VTklUUykKLUdMX0VOVU0oMHg4NEU3LEdMX1NVQlRSQUNUKQotR0xfRU5VTSgweDg0RTgsR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUykKLUdMX0VOVU0oMHg4NEYyLEdMX0FMTF9DT01QTEVURURfTlYpCi1HTF9FTlVNKDB4ODRGMyxHTF9GRU5DRV9TVEFUVVNfTlYpCi1HTF9FTlVNKDB4ODRGNCxHTF9GRU5DRV9DT05ESVRJT05fTlYpCi1HTF9FTlVNKDB4ODRGOSxHTF9ERVBUSF9TVEVOQ0lMX09FUykKLUdMX0VOVU0oMHg4NEZBLEdMX1VOU0lHTkVEX0lOVF8yNF84X09FUykKLUdMX0VOVU0oMHg4NEZELEdMX01BWF9URVhUVVJFX0xPRF9CSUFTX0VYVCkKLUdMX0VOVU0oMHg4NEZFLEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKQotR0xfRU5VTSgweDg0RkYsR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKQotR0xfRU5VTSgweDg1MDAsR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTF9FWFQpCi1HTF9FTlVNKDB4ODUwMSxHTF9URVhUVVJFX0xPRF9CSUFTX0VYVCkKLUdMX0VOVU0oMHg4NTA3LEdMX0lOQ1JfV1JBUF9PRVMpCi1HTF9FTlVNKDB4ODUwOCxHTF9ERUNSX1dSQVBfT0VTKQotR0xfRU5VTSgweDg1MTEsR0xfTk9STUFMX01BUF9PRVMpCi1HTF9FTlVNKDB4ODUxMixHTF9SRUZMRUNUSU9OX01BUF9PRVMpCi1HTF9FTlVNKDB4ODUxMyxHTF9URVhUVVJFX0NVQkVfTUFQX09FUykKLUdMX0VOVU0oMHg4NTE0LEdMX1RFWFRVUkVfQklORElOR19DVUJFX01BUF9PRVMpCi1HTF9FTlVNKDB4ODUxNSxHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1hfT0VTKQotR0xfRU5VTSgweDg1MTYsR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX09FUykKLUdMX0VOVU0oMHg4NTE3LEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWV9PRVMpCi1HTF9FTlVNKDB4ODUxOCxHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1lfT0VTKQotR0xfRU5VTSgweDg1MTksR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX09FUykKLUdMX0VOVU0oMHg4NTFBLEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWl9PRVMpCi1HTF9FTlVNKDB4ODUxQyxHTF9NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFX09FUykKLUdMX0VOVU0oMHg4NTcwLEdMX0NPTUJJTkUpCi1HTF9FTlVNKDB4ODU3MSxHTF9DT01CSU5FX1JHQikKLUdMX0VOVU0oMHg4NTcyLEdMX0NPTUJJTkVfQUxQSEEpCi1HTF9FTlVNKDB4ODU3MyxHTF9SR0JfU0NBTEUpCi1HTF9FTlVNKDB4ODU3NCxHTF9BRERfU0lHTkVEKQotR0xfRU5VTSgweDg1NzUsR0xfSU5URVJQT0xBVEUpCi1HTF9FTlVNKDB4ODU3NixHTF9DT05TVEFOVCkKLUdMX0VOVU0oMHg4NTc3LEdMX1BSSU1BUllfQ09MT1IpCi1HTF9FTlVNKDB4ODU3OCxHTF9QUkVWSU9VUykKLUdMX0VOVU0oMHg4NTgwLEdMX1NSQzBfUkdCKQotR0xfRU5VTSgweDg1ODEsR0xfU1JDMV9SR0IpCi1HTF9FTlVNKDB4ODU4MixHTF9TUkMyX1JHQikKLUdMX0VOVU0oMHg4NTg4LEdMX1NSQzBfQUxQSEEpCi1HTF9FTlVNKDB4ODU4OSxHTF9TUkMxX0FMUEhBKQotR0xfRU5VTSgweDg1OEEsR0xfU1JDMl9BTFBIQSkKLUdMX0VOVU0oMHg4NTkwLEdMX09QRVJBTkQwX1JHQikKLUdMX0VOVU0oMHg4NTkxLEdMX09QRVJBTkQxX1JHQikKLUdMX0VOVU0oMHg4NTkyLEdMX09QRVJBTkQyX1JHQikKLUdMX0VOVU0oMHg4NTk4LEdMX09QRVJBTkQwX0FMUEhBKQotR0xfRU5VTSgweDg1OTksR0xfT1BFUkFORDFfQUxQSEEpCi1HTF9FTlVNKDB4ODU5QSxHTF9PUEVSQU5EMl9BTFBIQSkKLUdMX0VOVU0oMHg4NUI1LEdMX1ZFUlRFWF9BUlJBWV9CSU5ESU5HX09FUykKLUdMX0VOVU0oMHg4NUJBLEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9BUFBMRSkKLUdMX0VOVU0oMHg4NUJCLEdMX1VOU0lHTkVEX1NIT1JUXzhfOF9SRVZfQVBQTEUpCi1HTF9FTlVNKDB4ODYyMixHTF9WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQpCi1HTF9FTlVNKDB4ODYyMyxHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUpCi1HTF9FTlVNKDB4ODYyNCxHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NUUklERSkKLUdMX0VOVU0oMHg4NjI1LEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfVFlQRSkKLUdMX0VOVU0oMHg4NjI2LEdMX0NVUlJFTlRfVkVSVEVYX0FUVFJJQikKLUdMX0VOVU0oMHg4NjQ1LEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUikKLUdMX0VOVU0oMHg4NkEyLEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUykKLUdMX0VOVU0oMHg4NkEzLEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTKQotR0xfRU5VTSgweDg2QTQsR0xfTUFYX1ZFUlRFWF9VTklUU19PRVMpCi1HTF9FTlVNKDB4ODZBOSxHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMpCi1HTF9FTlVNKDB4ODZBQSxHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUykKLUdMX0VOVU0oMHg4NkFCLEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUykKLUdMX0VOVU0oMHg4NkFDLEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX09FUykKLUdMX0VOVU0oMHg4NkFELEdMX1dFSUdIVF9BUlJBWV9PRVMpCi1HTF9FTlVNKDB4ODZBRSxHTF9ET1QzX1JHQikKLUdMX0VOVU0oMHg4NkFGLEdMX0RPVDNfUkdCQSkKLUdMX0VOVU0oMHg4NzQwLEdMX1o0MDBfQklOQVJZX0FNRCkKLUdMX0VOVU0oMHg4NzQxLEdMX1BST0dSQU1fQklOQVJZX0xFTkdUSF9PRVMpCi1HTF9FTlVNKDB4ODc2NCxHTF9CVUZGRVJfU0laRSkKLUdMX0VOVU0oMHg4NzY1LEdMX0JVRkZFUl9VU0FHRSkKLUdMX0VOVU0oMHg4N0VFLEdMX0FUQ19SR0JBX0lOVEVSUE9MQVRFRF9BTFBIQV9BTUQpCi1HTF9FTlVNKDB4ODdGOSxHTF8zRENfWF9BTUQpCi1HTF9FTlVNKDB4ODdGQSxHTF8zRENfWFlfQU1EKQotR0xfRU5VTSgweDg3RkUsR0xfTlVNX1BST0dSQU1fQklOQVJZX0ZPUk1BVFNfT0VTKQotR0xfRU5VTSgweDg3RkYsR0xfUFJPR1JBTV9CSU5BUllfRk9STUFUU19PRVMpCi1HTF9FTlVNKDB4ODgwMCxHTF9TVEVOQ0lMX0JBQ0tfRlVOQykKLUdMX0VOVU0oMHg4ODAxLEdMX1NURU5DSUxfQkFDS19GQUlMKQotR0xfRU5VTSgweDg4MDIsR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfRkFJTCkKLUdMX0VOVU0oMHg4ODAzLEdMX1NURU5DSUxfQkFDS19QQVNTX0RFUFRIX1BBU1MpCi1HTF9FTlVNKDB4ODgxNCxHTF9SR0JBMzJGX0VYVCkKLUdMX0VOVU0oMHg4ODE1LEdMX1JHQjMyRl9FWFQpCi1HTF9FTlVNKDB4ODgxNixHTF9BTFBIQTMyRl9FWFQpCi1HTF9FTlVNKDB4ODgxOCxHTF9MVU1JTkFOQ0UzMkZfRVhUKQotR0xfRU5VTSgweDg4MTksR0xfTFVNSU5BTkNFX0FMUEhBMzJGX0VYVCkKLUdMX0VOVU0oMHg4ODFBLEdMX1JHQkExNkZfRVhUKQotR0xfRU5VTSgweDg4MUIsR0xfUkdCMTZGX0VYVCkKLUdMX0VOVU0oMHg4ODFDLEdMX0FMUEhBMTZGX0VYVCkKLUdMX0VOVU0oMHg4ODFFLEdMX0xVTUlOQU5DRTE2Rl9FWFQpCi1HTF9FTlVNKDB4ODgxRixHTF9MVU1JTkFOQ0VfQUxQSEExNkZfRVhUKQotR0xfRU5VTSgweDg4MjMsR0xfV1JJVEVPTkxZX1JFTkRFUklOR19RQ09NKQotR0xfRU5VTSgweDg4MjQsR0xfTUFYX0RSQVdfQlVGRkVSU19OVikKLUdMX0VOVU0oMHg4ODI1LEdMX0RSQVdfQlVGRkVSMF9OVikKLUdMX0VOVU0oMHg4ODI2LEdMX0RSQVdfQlVGRkVSMV9OVikKLUdMX0VOVU0oMHg4ODI3LEdMX0RSQVdfQlVGRkVSMl9OVikKLUdMX0VOVU0oMHg4ODI4LEdMX0RSQVdfQlVGRkVSM19OVikKLUdMX0VOVU0oMHg4ODI5LEdMX0RSQVdfQlVGRkVSNF9OVikKLUdMX0VOVU0oMHg4ODJBLEdMX0RSQVdfQlVGRkVSNV9OVikKLUdMX0VOVU0oMHg4ODJCLEdMX0RSQVdfQlVGRkVSNl9OVikKLUdMX0VOVU0oMHg4ODJDLEdMX0RSQVdfQlVGRkVSN19OVikKLUdMX0VOVU0oMHg4ODJELEdMX0RSQVdfQlVGRkVSOF9OVikKLUdMX0VOVU0oMHg4ODJFLEdMX0RSQVdfQlVGRkVSOV9OVikKLUdMX0VOVU0oMHg4ODJGLEdMX0RSQVdfQlVGRkVSMTBfTlYpCi1HTF9FTlVNKDB4ODgzMCxHTF9EUkFXX0JVRkZFUjExX05WKQotR0xfRU5VTSgweDg4MzEsR0xfRFJBV19CVUZGRVIxMl9OVikKLUdMX0VOVU0oMHg4ODMyLEdMX0RSQVdfQlVGRkVSMTNfTlYpCi1HTF9FTlVNKDB4ODgzMyxHTF9EUkFXX0JVRkZFUjE0X05WKQotR0xfRU5VTSgweDg4MzQsR0xfRFJBV19CVUZGRVIxNV9OVikKLUdMX0VOVU0oMHg4ODNELEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBX09FUykKLUdMX0VOVU0oMHg4ODQwLEdMX01BVFJJWF9QQUxFVFRFX09FUykKLUdMX0VOVU0oMHg4ODQyLEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUykKLUdMX0VOVU0oMHg4ODQzLEdMX0NVUlJFTlRfUEFMRVRURV9NQVRSSVhfT0VTKQotR0xfRU5VTSgweDg4NDQsR0xfTUFUUklYX0lOREVYX0FSUkFZX09FUykKLUdMX0VOVU0oMHg4ODQ2LEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUykKLUdMX0VOVU0oMHg4ODQ3LEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUykKLUdMX0VOVU0oMHg4ODQ4LEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTKQotR0xfRU5VTSgweDg4NDksR0xfTUFUUklYX0lOREVYX0FSUkFZX1BPSU5URVJfT0VTKQotR0xfRU5VTSgweDg4NEMsR0xfVEVYVFVSRV9DT01QQVJFX01PREVfRVhUKQotR0xfRU5VTSgweDg4NEQsR0xfVEVYVFVSRV9DT01QQVJFX0ZVTkNfRVhUKQotR0xfRU5VTSgweDg4NEUsR0xfQ09NUEFSRV9SRUZfVE9fVEVYVFVSRV9FWFQpCi1HTF9FTlVNKDB4ODg2MSxHTF9QT0lOVF9TUFJJVEVfT0VTKQotR0xfRU5VTSgweDg4NjIsR0xfQ09PUkRfUkVQTEFDRV9PRVMpCi1HTF9FTlVNKDB4ODg2NSxHTF9DVVJSRU5UX1FVRVJZX0VYVCkKLUdMX0VOVU0oMHg4ODY2LEdMX1FVRVJZX1JFU1VMVF9FWFQpCi1HTF9FTlVNKDB4ODg2NyxHTF9RVUVSWV9SRVNVTFRfQVZBSUxBQkxFX0VYVCkKLUdMX0VOVU0oMHg4ODY5LEdMX01BWF9WRVJURVhfQVRUUklCUykKLUdMX0VOVU0oMHg4ODZBLEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfTk9STUFMSVpFRCkKLUdMX0VOVU0oMHg4ODcyLEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTKQotR0xfRU5VTSgweDg4OTIsR0xfQVJSQVlfQlVGRkVSKQotR0xfRU5VTSgweDg4OTMsR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIpCi1HTF9FTlVNKDB4ODg5NCxHTF9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4ODk1LEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcpCi1HTF9FTlVNKDB4ODg5NixHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcpCi1HTF9FTlVNKDB4ODg5NyxHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcpCi1HTF9FTlVNKDB4ODg5OCxHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4ODlBLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcpCi1HTF9FTlVNKDB4ODg5RSxHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTKQotR0xfRU5VTSgweDg4OUYsR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORykKLUdMX0VOVU0oMHg4OEI5LEdMX1dSSVRFX09OTFlfT0VTKQotR0xfRU5VTSgweDg4QkIsR0xfQlVGRkVSX0FDQ0VTU19PRVMpCi1HTF9FTlVNKDB4ODhCQyxHTF9CVUZGRVJfTUFQUEVEX09FUykKLUdMX0VOVU0oMHg4OEJELEdMX0JVRkZFUl9NQVBfUE9JTlRFUl9PRVMpCi1HTF9FTlVNKDB4ODhFMCxHTF9TVFJFQU1fRFJBVykKLUdMX0VOVU0oMHg4OEU0LEdMX1NUQVRJQ19EUkFXKQotR0xfRU5VTSgweDg4RTgsR0xfRFlOQU1JQ19EUkFXKQotR0xfRU5VTSgweDg4RjAsR0xfREVQVEgyNF9TVEVOQ0lMOF9PRVMpCi1HTF9FTlVNKDB4ODk4QSxHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTKQotR0xfRU5VTSgweDg5OEIsR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTKQotR0xfRU5VTSgweDg5OEMsR0xfUE9JTlRfU0laRV9BUlJBWV9QT0lOVEVSX09FUykKLUdMX0VOVU0oMHg4OThELEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTKQotR0xfRU5VTSgweDg5OEUsR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTKQotR0xfRU5VTSgweDg5OEYsR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTKQotR0xfRU5VTSgweDhBMUYsR0xfUkdCXzQyMl9BUFBMRSkKLUdMX0VOVU0oMHg4QTRGLEdMX1BST0dSQU1fUElQRUxJTkVfT0JKRUNUX0VYVCkKLUdMX0VOVU0oMHg4QjMwLEdMX0ZSQUdNRU5UX1NIQURFUikKLUdMX0VOVU0oMHg4QjMxLEdMX1ZFUlRFWF9TSEFERVIpCi1HTF9FTlVNKDB4OEI0MCxHTF9QUk9HUkFNX09CSkVDVF9FWFQpCi1HTF9FTlVNKDB4OEI0OCxHTF9TSEFERVJfT0JKRUNUX0VYVCkKLUdMX0VOVU0oMHg4QjRDLEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUykKLUdMX0VOVU0oMHg4QjRELEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKQotR0xfRU5VTSgweDhCNEYsR0xfU0hBREVSX1RZUEUpCi1HTF9FTlVNKDB4OEI1MCxHTF9GTE9BVF9WRUMyKQotR0xfRU5VTSgweDhCNTEsR0xfRkxPQVRfVkVDMykKLUdMX0VOVU0oMHg4QjUyLEdMX0ZMT0FUX1ZFQzQpCi1HTF9FTlVNKDB4OEI1MyxHTF9JTlRfVkVDMikKLUdMX0VOVU0oMHg4QjU0LEdMX0lOVF9WRUMzKQotR0xfRU5VTSgweDhCNTUsR0xfSU5UX1ZFQzQpCi1HTF9FTlVNKDB4OEI1NixHTF9CT09MKQotR0xfRU5VTSgweDhCNTcsR0xfQk9PTF9WRUMyKQotR0xfRU5VTSgweDhCNTgsR0xfQk9PTF9WRUMzKQotR0xfRU5VTSgweDhCNTksR0xfQk9PTF9WRUM0KQotR0xfRU5VTSgweDhCNUEsR0xfRkxPQVRfTUFUMikKLUdMX0VOVU0oMHg4QjVCLEdMX0ZMT0FUX01BVDMpCi1HTF9FTlVNKDB4OEI1QyxHTF9GTE9BVF9NQVQ0KQotR0xfRU5VTSgweDhCNUUsR0xfU0FNUExFUl8yRCkKLUdMX0VOVU0oMHg4QjVGLEdMX1NBTVBMRVJfM0RfT0VTKQotR0xfRU5VTSgweDhCNjAsR0xfU0FNUExFUl9DVUJFKQotR0xfRU5VTSgweDhCNjIsR0xfU0FNUExFUl8yRF9TSEFET1dfRVhUKQotR0xfRU5VTSgweDhCODAsR0xfREVMRVRFX1NUQVRVUykKLUdMX0VOVU0oMHg4QjgxLEdMX0NPTVBJTEVfU1RBVFVTKQotR0xfRU5VTSgweDhCODIsR0xfTElOS19TVEFUVVMpCi1HTF9FTlVNKDB4OEI4MyxHTF9WQUxJREFURV9TVEFUVVMpCi1HTF9FTlVNKDB4OEI4NCxHTF9JTkZPX0xPR19MRU5HVEgpCi1HTF9FTlVNKDB4OEI4NSxHTF9BVFRBQ0hFRF9TSEFERVJTKQotR0xfRU5VTSgweDhCODYsR0xfQUNUSVZFX1VOSUZPUk1TKQotR0xfRU5VTSgweDhCODcsR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCkKLUdMX0VOVU0oMHg4Qjg4LEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIKQotR0xfRU5VTSgweDhCODksR0xfQUNUSVZFX0FUVFJJQlVURVMpCi1HTF9FTlVNKDB4OEI4QSxHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEgpCi1HTF9FTlVNKDB4OEI4QixHTF9GUkFHTUVOVF9TSEFERVJfREVSSVZBVElWRV9ISU5UX09FUykKLUdMX0VOVU0oMHg4QjhDLEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTikKLUdMX0VOVU0oMHg4QjhELEdMX0NVUlJFTlRfUFJPR1JBTSkKLUdMX0VOVU0oMHg4QjkwLEdMX1BBTEVUVEU0X1JHQjhfT0VTKQotR0xfRU5VTSgweDhCOTEsR0xfUEFMRVRURTRfUkdCQThfT0VTKQotR0xfRU5VTSgweDhCOTIsR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTKQotR0xfRU5VTSgweDhCOTMsR0xfUEFMRVRURTRfUkdCQTRfT0VTKQotR0xfRU5VTSgweDhCOTQsR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMpCi1HTF9FTlVNKDB4OEI5NSxHTF9QQUxFVFRFOF9SR0I4X09FUykKLUdMX0VOVU0oMHg4Qjk2LEdMX1BBTEVUVEU4X1JHQkE4X09FUykKLUdMX0VOVU0oMHg4Qjk3LEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUykKLUdMX0VOVU0oMHg4Qjk4LEdMX1BBTEVUVEU4X1JHQkE0X09FUykKLUdMX0VOVU0oMHg4Qjk5LEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTKQotR0xfRU5VTSgweDhCOUEsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUykKLUdMX0VOVU0oMHg4QjlCLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUykKLUdMX0VOVU0oMHg4QjlDLEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTKQotR0xfRU5VTSgweDhCOUQsR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTKQotR0xfRU5VTSgweDhCOUUsR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUykKLUdMX0VOVU0oMHg4QjlGLEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTKQotR0xfRU5VTSgweDhCQzAsR0xfQ09VTlRFUl9UWVBFX0FNRCkKLUdMX0VOVU0oMHg4QkMxLEdMX0NPVU5URVJfUkFOR0VfQU1EKQotR0xfRU5VTSgweDhCQzIsR0xfVU5TSUdORURfSU5UNjRfQU1EKQotR0xfRU5VTSgweDhCQzMsR0xfUEVSQ0VOVEFHRV9BTUQpCi1HTF9FTlVNKDB4OEJDNCxHTF9QRVJGTU9OX1JFU1VMVF9BVkFJTEFCTEVfQU1EKQotR0xfRU5VTSgweDhCQzUsR0xfUEVSRk1PTl9SRVNVTFRfU0laRV9BTUQpCi1HTF9FTlVNKDB4OEJDNixHTF9QRVJGTU9OX1JFU1VMVF9BTUQpCi1HTF9FTlVNKDB4OEJEMixHTF9URVhUVVJFX1dJRFRIX1FDT00pCi1HTF9FTlVNKDB4OEJEMyxHTF9URVhUVVJFX0hFSUdIVF9RQ09NKQotR0xfRU5VTSgweDhCRDQsR0xfVEVYVFVSRV9ERVBUSF9RQ09NKQotR0xfRU5VTSgweDhCRDUsR0xfVEVYVFVSRV9JTlRFUk5BTF9GT1JNQVRfUUNPTSkKLUdMX0VOVU0oMHg4QkQ2LEdMX1RFWFRVUkVfRk9STUFUX1FDT00pCi1HTF9FTlVNKDB4OEJENyxHTF9URVhUVVJFX1RZUEVfUUNPTSkKLUdMX0VOVU0oMHg4QkQ4LEdMX1RFWFRVUkVfSU1BR0VfVkFMSURfUUNPTSkKLUdMX0VOVU0oMHg4QkQ5LEdMX1RFWFRVUkVfTlVNX0xFVkVMU19RQ09NKQotR0xfRU5VTSgweDhCREEsR0xfVEVYVFVSRV9UQVJHRVRfUUNPTSkKLUdMX0VOVU0oMHg4QkRCLEdMX1RFWFRVUkVfT0JKRUNUX1ZBTElEX1FDT00pCi1HTF9FTlVNKDB4OEJEQyxHTF9TVEFURV9SRVNUT1JFKQotR0xfRU5VTSgweDhDMDAsR0xfQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRykKLUdMX0VOVU0oMHg4QzAxLEdMX0NPTVBSRVNTRURfUkdCX1BWUlRDXzJCUFBWMV9JTUcpCi1HTF9FTlVNKDB4OEMwMixHTF9DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRykKLUdMX0VOVU0oMHg4QzAzLEdMX0NPTVBSRVNTRURfUkdCQV9QVlJUQ18yQlBQVjFfSU1HKQotR0xfRU5VTSgweDhDMDQsR0xfTU9EVUxBVEVfQ09MT1JfSU1HKQotR0xfRU5VTSgweDhDMDUsR0xfUkVDSVBfQUREX1NJR05FRF9BTFBIQV9JTUcpCi1HTF9FTlVNKDB4OEMwNixHTF9URVhUVVJFX0FMUEhBX01PRFVMQVRFX0lNRykKLUdMX0VOVU0oMHg4QzA3LEdMX0ZBQ1RPUl9BTFBIQV9NT0RVTEFURV9JTUcpCi1HTF9FTlVNKDB4OEMwOCxHTF9GUkFHTUVOVF9BTFBIQV9NT0RVTEFURV9JTUcpCi1HTF9FTlVNKDB4OEMwOSxHTF9BRERfQkxFTkRfSU1HKQotR0xfRU5VTSgweDhDMEEsR0xfU0dYX0JJTkFSWV9JTUcpCi1HTF9FTlVNKDB4OEMxNyxHTF9VTlNJR05FRF9OT1JNQUxJWkVEX0VYVCkKLUdMX0VOVU0oMHg4QzJGLEdMX0FOWV9TQU1QTEVTX1BBU1NFRF9FWFQpCi1HTF9FTlVNKDB4OEM0MCxHTF9TUkdCX0VYVCkKLUdMX0VOVU0oMHg4QzQyLEdMX1NSR0JfQUxQSEFfRVhUKQotR0xfRU5VTSgweDhDNDMsR0xfU1JHQjhfQUxQSEE4X0VYVCkKLUdMX0VOVU0oMHg4QzkyLEdMX0FUQ19SR0JfQU1EKQotR0xfRU5VTSgweDhDOTMsR0xfQVRDX1JHQkFfRVhQTElDSVRfQUxQSEFfQU1EKQotR0xfRU5VTSgweDhDQTMsR0xfU1RFTkNJTF9CQUNLX1JFRikKLUdMX0VOVU0oMHg4Q0E0LEdMX1NURU5DSUxfQkFDS19WQUxVRV9NQVNLKQotR0xfRU5VTSgweDhDQTUsR0xfU1RFTkNJTF9CQUNLX1dSSVRFTUFTSykKLUdMX0VOVU0oMHg4Q0E2LEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfT0VTKQotR0xfRU5VTSgweDhDQTcsR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfT0VTKQotR0xfRU5VTSgweDhDQTgsR0xfUkVBRF9GUkFNRUJVRkZFUl9BUFBMRSkKLUdMX0VOVU0oMHg4Q0E5LEdMX0RSQVdfRlJBTUVCVUZGRVJfQVBQTEUpCi1HTF9FTlVNKDB4OENBQSxHTF9SRUFEX0ZSQU1FQlVGRkVSX0JJTkRJTkdfQVBQTEUpCi1HTF9FTlVNKDB4OENBQixHTF9SRU5ERVJCVUZGRVJfU0FNUExFU19BUFBMRSkKLUdMX0VOVU0oMHg4Q0QwLEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfT0VTKQotR0xfRU5VTSgweDhDRDEsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMpCi1HTF9FTlVNKDB4OENEMixHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTKQotR0xfRU5VTSgweDhDRDMsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfT0VTKQotR0xfRU5VTSgweDhDRDQsR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFXzNEX1pPRkZTRVRfT0VTKQotR0xfRU5VTSgweDhDRDUsR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTKQotR0xfRU5VTSgweDhDRDYsR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUykKLUdMX0VOVU0oMHg4Q0Q3LEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UX09FUykKLUdMX0VOVU0oMHg4Q0Q5LEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19PRVMpCi1HTF9FTlVNKDB4OENEQSxHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTKQotR0xfRU5VTSgweDhDREQsR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURURfT0VTKQotR0xfRU5VTSgweDhDREYsR0xfTUFYX0NPTE9SX0FUVEFDSE1FTlRTX05WKQotR0xfRU5VTSgweDhDRTAsR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTKQotR0xfRU5VTSgweDhDRTEsR0xfQ09MT1JfQVRUQUNITUVOVDFfTlYpCi1HTF9FTlVNKDB4OENFMixHTF9DT0xPUl9BVFRBQ0hNRU5UMl9OVikKLUdMX0VOVU0oMHg4Q0UzLEdMX0NPTE9SX0FUVEFDSE1FTlQzX05WKQotR0xfRU5VTSgweDhDRTQsR0xfQ09MT1JfQVRUQUNITUVOVDRfTlYpCi1HTF9FTlVNKDB4OENFNSxHTF9DT0xPUl9BVFRBQ0hNRU5UNV9OVikKLUdMX0VOVU0oMHg4Q0U2LEdMX0NPTE9SX0FUVEFDSE1FTlQ2X05WKQotR0xfRU5VTSgweDhDRTcsR0xfQ09MT1JfQVRUQUNITUVOVDdfTlYpCi1HTF9FTlVNKDB4OENFOCxHTF9DT0xPUl9BVFRBQ0hNRU5UOF9OVikKLUdMX0VOVU0oMHg4Q0U5LEdMX0NPTE9SX0FUVEFDSE1FTlQ5X05WKQotR0xfRU5VTSgweDhDRUEsR0xfQ09MT1JfQVRUQUNITUVOVDEwX05WKQotR0xfRU5VTSgweDhDRUIsR0xfQ09MT1JfQVRUQUNITUVOVDExX05WKQotR0xfRU5VTSgweDhDRUMsR0xfQ09MT1JfQVRUQUNITUVOVDEyX05WKQotR0xfRU5VTSgweDhDRUQsR0xfQ09MT1JfQVRUQUNITUVOVDEzX05WKQotR0xfRU5VTSgweDhDRUUsR0xfQ09MT1JfQVRUQUNITUVOVDE0X05WKQotR0xfRU5VTSgweDhDRUYsR0xfQ09MT1JfQVRUQUNITUVOVDE1X05WKQotR0xfRU5VTSgweDhEMDAsR0xfREVQVEhfQVRUQUNITUVOVF9PRVMpCi1HTF9FTlVNKDB4OEQyMCxHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfT0VTKQotR0xfRU5VTSgweDhENDAsR0xfRlJBTUVCVUZGRVJfT0VTKQotR0xfRU5VTSgweDhENDEsR0xfUkVOREVSQlVGRkVSX09FUykKLUdMX0VOVU0oMHg4RDQyLEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMpCi1HTF9FTlVNKDB4OEQ0MyxHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUykKLUdMX0VOVU0oMHg4RDQ0LEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfT0VTKQotR0xfRU5VTSgweDhENDYsR0xfU1RFTkNJTF9JTkRFWDFfT0VTKQotR0xfRU5VTSgweDhENDcsR0xfU1RFTkNJTF9JTkRFWDRfT0VTKQotR0xfRU5VTSgweDhENDgsR0xfU1RFTkNJTF9JTkRFWDhfT0VTKQotR0xfRU5VTSgweDhENTAsR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUykKLUdMX0VOVU0oMHg4RDUxLEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUykKLUdMX0VOVU0oMHg4RDUyLEdMX1JFTkRFUkJVRkZFUl9CTFVFX1NJWkVfT0VTKQotR0xfRU5VTSgweDhENTMsR0xfUkVOREVSQlVGRkVSX0FMUEhBX1NJWkVfT0VTKQotR0xfRU5VTSgweDhENTQsR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfT0VTKQotR0xfRU5VTSgweDhENTUsR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRV9PRVMpCi1HTF9FTlVNKDB4OEQ1NixHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01VTFRJU0FNUExFX0FQUExFKQotR0xfRU5VTSgweDhENTcsR0xfTUFYX1NBTVBMRVNfQVBQTEUpCi1HTF9FTlVNKDB4OEQ2MCxHTF9URVhUVVJFX0dFTl9TVFJfT0VTKQotR0xfRU5VTSgweDhENjEsR0xfSEFMRl9GTE9BVF9PRVMpCi1HTF9FTlVNKDB4OEQ2MixHTF9SR0I1NjVfT0VTKQotR0xfRU5VTSgweDhENjQsR0xfRVRDMV9SR0I4X09FUykKLUdMX0VOVU0oMHg4RDY1LEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKQotR0xfRU5VTSgweDhENjYsR0xfU0FNUExFUl9FWFRFUk5BTF9PRVMpCi1HTF9FTlVNKDB4OEQ2NyxHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTKQotR0xfRU5VTSgweDhENjgsR0xfUkVRVUlSRURfVEVYVFVSRV9JTUFHRV9VTklUU19PRVMpCi1HTF9FTlVNKDB4OEQ2QSxHTF9BTllfU0FNUExFU19QQVNTRURfQ09OU0VSVkFUSVZFX0VYVCkKLUdMX0VOVU0oMHg4RDZDLEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9TQU1QTEVTX0VYVCkKLUdMX0VOVU0oMHg4REYwLEdMX0xPV19GTE9BVCkKLUdMX0VOVU0oMHg4REYxLEdMX01FRElVTV9GTE9BVCkKLUdMX0VOVU0oMHg4REYyLEdMX0hJR0hfRkxPQVQpCi1HTF9FTlVNKDB4OERGMyxHTF9MT1dfSU5UKQotR0xfRU5VTSgweDhERjQsR0xfTUVESVVNX0lOVCkKLUdMX0VOVU0oMHg4REY1LEdMX0hJR0hfSU5UKQotR0xfRU5VTSgweDhERjYsR0xfVU5TSUdORURfSU5UXzEwXzEwXzEwXzJfT0VTKQotR0xfRU5VTSgweDhERjcsR0xfSU5UXzEwXzEwXzEwXzJfT0VTKQotR0xfRU5VTSgweDhERjgsR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTKQotR0xfRU5VTSgweDhERjksR0xfTlVNX1NIQURFUl9CSU5BUllfRk9STUFUUykKLUdMX0VOVU0oMHg4REZBLEdMX1NIQURFUl9DT01QSUxFUikKLUdMX0VOVU0oMHg4REZCLEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTKQotR0xfRU5VTSgweDhERkMsR0xfTUFYX1ZBUllJTkdfVkVDVE9SUykKLUdMX0VOVU0oMHg4REZELEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMpCi1HTF9FTlVNKDB4OEUyQyxHTF9ERVBUSF9DT01QT05FTlQxNl9OT05MSU5FQVJfTlYpCi1HTF9FTlVNKDB4OEVEMCxHTF9DT1ZFUkFHRV9DT01QT05FTlRfTlYpCi1HTF9FTlVNKDB4OEVEMSxHTF9DT1ZFUkFHRV9DT01QT05FTlQ0X05WKQotR0xfRU5VTSgweDhFRDIsR0xfQ09WRVJBR0VfQVRUQUNITUVOVF9OVikKLUdMX0VOVU0oMHg4RUQzLEdMX0NPVkVSQUdFX0JVRkZFUlNfTlYpCi1HTF9FTlVNKDB4OEVENCxHTF9DT1ZFUkFHRV9TQU1QTEVTX05WKQotR0xfRU5VTSgweDhFRDUsR0xfQ09WRVJBR0VfQUxMX0ZSQUdNRU5UU19OVikKLUdMX0VOVU0oMHg4RUQ2LEdMX0NPVkVSQUdFX0VER0VfRlJBR01FTlRTX05WKQotR0xfRU5VTSgweDhFRDcsR0xfQ09WRVJBR0VfQVVUT01BVElDX05WKQotR0xfRU5VTSgweDhGNjAsR0xfTUFMSV9TSEFERVJfQklOQVJZX0FSTSkKLUdMX0VOVU0oMHg4RkEwLEdMX1BFUkZNT05fR0xPQkFMX01PREVfUUNPTSkKLUdMX0VOVU0oMHg4RkM0LEdMX1NIQURFUl9CSU5BUllfVklWKQotR0xfRU5VTSgweDkwRjMsR0xfQ09OVEVYVF9ST0JVU1RfQUNDRVNTX0VYVCkKLUdMX0VOVU0oMHg5MTJGLEdMX1RFWFRVUkVfSU1NVVRBQkxFX0ZPUk1BVF9FWFQpCi1HTF9FTlVNKDB4OTEzMCxHTF9TR1hfUFJPR1JBTV9CSU5BUllfSU1HKQotR0xfRU5VTSgweDkxMzMsR0xfUkVOREVSQlVGRkVSX1NBTVBMRVNfRVhUKQotR0xfRU5VTSgweDkxMzQsR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NVUxUSVNBTVBMRV9FWFQpCi1HTF9FTlVNKDB4OTEzNSxHTF9NQVhfU0FNUExFU19FWFQpCi1HTF9FTlVNKDB4OTEzNixHTF9URVhUVVJFX1NBTVBMRVNfSU1HKQotR0xfRU5VTSgweDkxNTEsR0xfQlVGRkVSX09CSkVDVF9FWFQpCi1HTF9FTlVNKDB4OTE1MyxHTF9RVUVSWV9PQkpFQ1RfRVhUKQotR0xfRU5VTSgweDkxNTQsR0xfVkVSVEVYX0FSUkFZX09CSkVDVF9FWFQpCi1HTF9FTlVNKDB4OTI1MCxHTF9TSEFERVJfQklOQVJZX0RNUCkKLUdMX0VOVU0oMHg5M0ExLEdMX0JHUkE4X0VYVCkKLUdMX0VOVU0oMHhGRkZGRkZGRixHTF9BTExfU0hBREVSX0JJVFNfRVhUKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvZ2xlc3RyYWNlLmggYi9vcGVuZ2wvbGlicy9nbGVzdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4Zjk3Yi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy9nbGVzdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQVBJIHByb3ZpZGVkIGJ5IHRoZSBnbGVzdHJhY2UgbGlicmFyeS4KLSAqLwotCi0jaWZuZGVmIF9HTEVTX1RSQUNFX0hfCi0jZGVmaW5lIF9HTEVTX1RSQUNFX0hfCi0KLSNpbmNsdWRlICJob29rcy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIEhvb2tzIHRvIGJlIGNhbGxlZCBieSAiaW50ZXJlc3RpbmciIEVHTCBmdW5jdGlvbnMuICovCi12b2lkIEdMVHJhY2VfZWdsQ3JlYXRlQ29udGV4dChpbnQgdmVyc2lvbiwgRUdMQ29udGV4dCBjKTsKLXZvaWQgR0xUcmFjZV9lZ2xNYWtlQ3VycmVudCh1bnNpZ25lZCB2ZXJzaW9uLCBnbF9ob29rc190ICpob29rcywgRUdMQ29udGV4dCBjKTsKLXZvaWQgR0xUcmFjZV9lZ2xSZWxlYXNlVGhyZWFkKCk7Ci12b2lkIEdMVHJhY2VfZWdsU3dhcEJ1ZmZlcnModm9pZCosIHZvaWQqKTsKLQotLyogU3RhcnQgYW5kIHN0b3AgR0wgVHJhY2luZy4gKi8KLXZvaWQgR0xUcmFjZV9zdGFydCgpOwotdm9pZCBHTFRyYWNlX3N0b3AoKTsKLQotLyogT2J0YWluIHRoZSBnbF9ob29rcyBzdHJ1Y3R1cmUgZmlsbGVkIHdpdGggdGhlIHRyYWNlIGltcGxlbWVudGF0aW9uIGZvciBhbGwgR0wgZnVuY3Rpb25zLiAqLwotZ2xfaG9va3NfdCAqR0xUcmFjZV9nZXRHTEhvb2tzKCk7Ci0KLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvaG9va3MuaCBiL29wZW5nbC9saWJzL2hvb2tzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWIzODkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvaG9va3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qIAotICoqIENvcHlyaWdodCAyMDA3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0gKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSAqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotICoqCi0gKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0gKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSAqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfR0xFU19DTV9IT09LU19ICi0jZGVmaW5lIEFORFJPSURfR0xFU19DTV9IT09LU19ICi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpZiAhZGVmaW5lZChfX2FybV9fKQotI2RlZmluZSBVU0VfU0xPV19CSU5ESU5HICAgICAgICAgICAgMQotI2Vsc2UKLSNkZWZpbmUgVVNFX1NMT1dfQklORElORyAgICAgICAgICAgIDAKLSNlbmRpZgotI3VuZGVmIE5FTEVNCi0jZGVmaW5lIE5FTEVNKHgpICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHgpL3NpemVvZigqKHgpKSkKLQotLy8gbWF4aW11bSBudW1iZXIgb2YgR0wgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IGluCi0vLyBhIGdpdmVuIHByb2Nlc3MuIHRoaXMgbGltaXRhdGlvbiBleGlzdHMgYmVjYXVzZSB3ZSBuZWVkIHRvIGhhdmUKLS8vIGEgc3RhdGljIGZ1bmN0aW9uIGZvciBlYWNoIGV4dGVuc2lvbiBhbmQgY3VycmVudGx5IHRoZXNlIHN0YXRpYyBmdW5jdGlvbnMKLS8vIGFyZSBnZW5lcmF0ZWQgYXQgY29tcGlsZSB0aW1lLgotI2RlZmluZSBNQVhfTlVNQkVSX09GX0dMX0VYVEVOU0lPTlMgMjU2Ci0KLQotI2lmIGRlZmluZWQoSEFWRV9BTkRST0lEX09TKSAmJiAhVVNFX1NMT1dfQklORElORyAmJiBfX09QVElNSVpFX18KLSNkZWZpbmUgVVNFX0ZBU1RfVExTX0tFWSAgICAgICAgICAgIDEKLSNlbHNlCi0jZGVmaW5lIFVTRV9GQVNUX1RMU19LRVkgICAgICAgICAgICAwCi0jZW5kaWYKLQotI2lmIFVTRV9GQVNUX1RMU19LRVkKLSMgICBpbmNsdWRlIDxiaW9uaWNfdGxzLmg+ICAvKiBzcGVjaWFsIHByaXZhdGUgQyBsaWJyYXJ5IGhlYWRlciAqLwotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gR0wgLyBFR0wgaG9va3MKLQotI3VuZGVmIEdMX0VOVFJZCi0jdW5kZWYgRUdMX0VOVFJZCi0jZGVmaW5lIEdMX0VOVFJZKF9yLCBfYXBpLCAuLi4pIF9yICgqX2FwaSkoX19WQV9BUkdTX18pOwotI2RlZmluZSBFR0xfRU5UUlkoX3IsIF9hcGksIC4uLikgX3IgKCpfYXBpKShfX1ZBX0FSR1NfXyk7Ci0KLXN0cnVjdCBlZ2xfdCB7Ci0gICAgI2luY2x1ZGUgIkVHTC9lZ2xfZW50cmllcy5pbiIKLX07Ci0KLXN0cnVjdCBnbF9ob29rc190IHsKLSAgICBzdHJ1Y3QgZ2xfdCB7Ci0gICAgICAgICNpbmNsdWRlICJlbnRyaWVzLmluIgotICAgIH0gZ2w7Ci0gICAgc3RydWN0IGdsX2V4dF90IHsKLSAgICAgICAgX19lZ2xNdXN0Q2FzdFRvUHJvcGVyRnVuY3Rpb25Qb2ludGVyVHlwZSBleHRlbnNpb25zW01BWF9OVU1CRVJfT0ZfR0xfRVhURU5TSU9OU107Ci0gICAgfSBleHQ7Ci19OwotI3VuZGVmIEdMX0VOVFJZCi0jdW5kZWYgRUdMX0VOVFJZCi0KLUVHTEFQSSB2b2lkIHNldEdsVGhyZWFkU3BlY2lmaWMoZ2xfaG9va3NfdCBjb25zdCAqdmFsdWUpOwotRUdMQVBJIGdsX2hvb2tzX3QgY29uc3QqIGdldEdsVGhyZWFkU3BlY2lmaWMoKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8qIEFORFJPSURfR0xFU19DTV9IT09LU19IICovCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy90b29scy9nZW5maWxlcyBiL29wZW5nbC9saWJzL3Rvb2xzL2dlbmZpbGVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1MGJiZjA4Li4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL3Rvb2xzL2dlbmZpbGVzCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS4vZ2xhcGlnZW4gLi4vLi4vaW5jbHVkZS9HTEVTL2dsLmggICAgICA+IC4uL0dMRVNfQ00vZ2xfYXBpLmluCi0uL2dsYXBpZ2VuIC4uLy4uL2luY2x1ZGUvR0xFUy9nbGV4dC5oICAgPiAuLi9HTEVTX0NNL2dsZXh0X2FwaS5pbgotLi9nbGFwaWdlbiAuLi8uLi9pbmNsdWRlL0dMRVMyL2dsMi5oICAgID4gLi4vR0xFUzIvZ2wyX2FwaS5pbgotLi9nbGFwaWdlbiAuLi8uLi9pbmNsdWRlL0dMRVMyL2dsMmV4dC5oID4gLi4vR0xFUzIvZ2wyZXh0X2FwaS5pbgotCi0uL2dsZW50cnlnZW4gLi4vLi4vaW5jbHVkZS9HTEVTL2dsLmggICAgICA+IC90bXAvZ2xfZW50cmllcy5pbgotLi9nbGVudHJ5Z2VuIC4uLy4uL2luY2x1ZGUvR0xFUy9nbGV4dC5oICAgPiAvdG1wL2dsZXh0X2VudHJpZXMuaW4KLS4vZ2xlbnRyeWdlbiAuLi8uLi9pbmNsdWRlL0dMRVMyL2dsMi5oICAgID4gL3RtcC9nbDJfZW50cmllcy5pbgotLi9nbGVudHJ5Z2VuIC4uLy4uL2luY2x1ZGUvR0xFUzIvZ2wyZXh0LmggPiAvdG1wL2dsMmV4dF9lbnRyaWVzLmluCi0KLWNhdCAvdG1wL2dsX2VudHJpZXMuaW4gXAotICAgIC90bXAvZ2xleHRfZW50cmllcy5pbiBcCi0gICAgL3RtcC9nbDJfZW50cmllcy5pbiBcCi0gICAgL3RtcC9nbDJleHRfZW50cmllcy5pbiBcCi0gICAgICAgIHwgc29ydCAtdCwgLWsyIFwKLSAgICAgICAgfCBhd2sgLUYsICchX1skMl0rKycgXAotICAgICAgICAgICAgPiAuLi9lbnRyaWVzLmluCi0KLS4vZ2x0cmFjZWdlbiAuLi9lbnRyaWVzLmluID4uLi90cmFjZS5pbgotCi1jYXQgLi4vLi4vaW5jbHVkZS9HTEVTL2dsLmggXAotICAgIC4uLy4uL2luY2x1ZGUvR0xFUy9nbGV4dC5oIFwKLSAgICAuLi8uLi9pbmNsdWRlL0dMRVMyL2dsMi5oIFwKLSAgICAuLi8uLi9pbmNsdWRlL0dMRVMyL2dsMmV4dC5oIFwKLSAgICAgICAgfCAuL2dsZW51bXNnZW4gXAotICAgICAgICB8IHNvcnQgXAotICAgICAgICA+IC4uL2VudW1zLmluCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2dsYXBpZ2VuIGIvb3BlbmdsL2xpYnMvdG9vbHMvZ2xhcGlnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkODMzNGYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL2xpYnMvdG9vbHMvZ2xhcGlnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jISAvdXNyL2Jpbi9wZXJsCi0jCi0jIENvcHlyaWdodCAoQykgMjAwOCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotdXNlIHN0cmljdDsKLQotc3ViIHJ0cmltKCQpCi17Ci0gICAgbXkgJHN0cmluZyA9IHNoaWZ0OwotICAgICRzdHJpbmcgPX4gcy9ccyskLy87Ci0gICAgcmV0dXJuICRzdHJpbmc7Ci19Ci0KLXdoaWxlIChteSAkbGluZSA9IDw+KSB7Ci0gIG5leHQgaWYgJGxpbmUgPX4gL15cLy87Ci0gIG5leHQgaWYgJGxpbmUgPX4gL14jLzsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXlxzKiQvOwotICBpZiAoJGxpbmUgIX4gL15HTF9BUEkoQ0FMTCk/XHMrKC4rKVxzK0dMX0FQSUVOVFJZXHMrKFtcd10rKVxzKlwoKFteXCldKylcKTsvKSB7Ci0gICAgbmV4dDsKLSAgfQotICBteSAkdHlwZSA9IHJ0cmltKCQyKTsKLSAgbXkgJG5hbWUgPSAkMzsKLSAgbXkgJGFyZ3MgPSAkNDsKLQotICAjcHJpbnRmKCIlcyIsICRsaW5lKTsKLSAgCi0gIG15ICRwcmVmaXggPSAiIjsKLSAgaWYgKCRuYW1lIGVxICJnbEdldFN0cmluZyIpIHsKLSAgICAkcHJlZml4ID0gIl9fIjsKLSAgfQotICAKLSAgcHJpbnRmKCIlcyBBUElfRU5UUlkoJXMlcykoJXMpIiwgJHR5cGUsICRwcmVmaXgsICRuYW1lLCAkYXJncyk7Ci0gIAotICBwcmludGYoIiB7XG4iKTsKLSAgaWYgKCR0eXBlIGVxICJ2b2lkIikgewotICAgIHByaW50ZigiICAgIENBTExfR0xfQVBJKCVzIiwgJG5hbWUpOwotICB9IGVsc2UgewotICAgIHByaW50ZigiICAgIENBTExfR0xfQVBJX1JFVFVSTiglcyIsICRuYW1lKTsKLSAgfQotICBteSBAYXJncyA9IHNwbGl0ICcsJywgJGFyZ3M7Ci0gIG15ICRsZW4gPSBzY2FsYXIoQGFyZ3MpOwotICBmb3IgKG15ICRudW0gPSAwOyAkbnVtIDwgJGxlbjsgJG51bSsrKSB7Ci0gICAgaWYgKCRhcmdzWyRudW1dIG5lICJ2b2lkIikgewotICAgICAgcHJpbnQgIiwgIjsKLSAgICAgICMKLSAgICAgICMgZXh0cmFjdCB0aGUgbmFtZSBmcm9tIHRoZSBwYXJhbWV0ZXIKLSAgICAgICMgdHlwZSBuYW1lCi0gICAgICAjIGNvbnN0IHR5cGUgKm5hbWUKLSAgICAgICMgdHlwZSAqbmFtZQotICAgICAgIyB0eXBlIG5hbWVbNF0KLSAgICAgICMKLSAgICAgIGlmICgkYXJnc1skbnVtXSA9fiAvKFxTK1xzKStcKipccyooW1x3XSspLykgewotICAgICAgICBwcmludGYoIiVzIiwgJDIpOwotICAgICAgfQotICAgIH0KLSAgfQotICBwcmludGYoIik7XG4iKTsKLSAgcHJpbnRmKCJ9XG4iKTsKLX0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy90b29scy9nbGVudHJ5Z2VuIGIvb3BlbmdsL2xpYnMvdG9vbHMvZ2xlbnRyeWdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTcwZjA0MS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy90b29scy9nbGVudHJ5Z2VuCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMDggR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXVzZSBzdHJpY3Q7Ci0KLXN1YiBydHJpbSgkKQotewotICAgIG15ICRzdHJpbmcgPSBzaGlmdDsKLSAgICAkc3RyaW5nID1+IHMvXHMrJC8vOwotICAgIHJldHVybiAkc3RyaW5nOwotfQotCi13aGlsZSAobXkgJGxpbmUgPSA8PikgewotICBuZXh0IGlmICRsaW5lID1+IC9eXC8vOwotICBuZXh0IGlmICRsaW5lID1+IC9eIy87Ci0gIG5leHQgaWYgJGxpbmUgPX4gL15ccyokLzsKLSAgaWYgKCRsaW5lICF+IC9eR0xfQVBJKENBTEwpP1xzKyguKylccytHTF9BUElFTlRSWVxzKyhbXHddKylccypcKChbXlwpXSspXCk7LykgewotICAgIG5leHQ7Ci0gIH0KLSAgbXkgJHR5cGUgPSBydHJpbSgkMik7Ci0gIG15ICRuYW1lID0gJDM7Ci0gIG15ICRhcmdzID0gJDQ7Ci0KLSAgcHJpbnRmKCJHTF9FTlRSWSglcywgJXMsICVzKVxuIiwgJHR5cGUsICRuYW1lLCAkYXJncyk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGlicy90b29scy9nbGVudW1zZ2VuIGIvb3BlbmdsL2xpYnMvdG9vbHMvZ2xlbnVtc2dlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmFlNWZiZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy90b29scy9nbGVudW1zZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyEgL3Vzci9iaW4vcGVybAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXVzZSBzdHJpY3Q7Ci0KLW15ICVlbnVtSGFzaCA9ICgpOwotCi13aGlsZSAobXkgJGxpbmUgPSA8U1RESU4+KSB7Ci0gIG5leHQgaWYgJGxpbmUgPX4gL15cLy87Ci0gICMgU2tpcCBiaXRmaWVsZCBkZWZpbml0aW9ucy4KLSAgbmV4dCBpZiAkbGluZSA9fiAvX0JJVChcZCtffFxzKykvOwotICBpZiAoJGxpbmUgIX4gL14jZGVmaW5lXHMrKFxTKylccysoMHhcUyspLykgewotICAgIG5leHQ7Ci0gIH0KLSAgbXkgJGVudW1OYW1lID0gJDE7Ci0gIG15ICRlbnVtVmFsdWUgPSAkMjsKLSAgbmV4dCBpZiBleGlzdHMoJGVudW1IYXNoIHsgJGVudW1WYWx1ZSB9KTsKLSAgJGVudW1IYXNoIHsgJGVudW1WYWx1ZSB9ID0gJGVudW1OYW1lOwotICBwcmludGYoIkdMX0VOVU0oJXMsJXMpXG4iLCAkZW51bVZhbHVlLCAkZW51bU5hbWUpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL3Rvb2xzL2dsdHJhY2VnZW4gYi9vcGVuZ2wvbGlicy90b29scy9nbHRyYWNlZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTQyNjUzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC9saWJzL3Rvb2xzL2dsdHJhY2VnZW4KKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0jISAvdXNyL2Jpbi9wZXJsCi0jCi0jIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotdXNlIHN0cmljdDsKLQotc3ViIHJ0cmltKCQpCi17Ci0gICAgbXkgJHN0cmluZyA9IHNoaWZ0OwotICAgICRzdHJpbmcgPX4gcy9ccyskLy87Ci0gICAgcmV0dXJuICRzdHJpbmc7Ci19Ci0KLXdoaWxlIChteSAkbGluZSA9IDw+KSB7Ci0gIG5leHQgaWYgJGxpbmUgPX4gL15cLy87Ci0gIG5leHQgaWYgJGxpbmUgPX4gL14jLzsKLSAgbmV4dCBpZiAkbGluZSA9fiAvXlxzKiQvOwotICBpZiAoJGxpbmUgIX4gL15HTF9FTlRSWVwoKFteLF0rKSwgKFteLF0rKSwgKFteXCldKylcKS8pIHsKLSAgICBuZXh0OwotICB9Ci0gIG15ICR0eXBlID0gJDE7Ci0gIG15ICRuYW1lID0gJDI7Ci0gIG15ICRhcmdzID0gJDM7Ci0gIAotICBteSBAYXJncyA9IHNwbGl0ICcsJywgJGFyZ3M7Ci0gIG15ICRsZW4gPSBzY2FsYXIoQGFyZ3MpOwotICBteSAkbm9uVm9pZEFyZ0xlbiA9IDA7Ci0gIGZvciAobXkgJG51bSA9IDA7ICRudW0gPCAkbGVuOyAkbnVtKyspIHsKLSAgICBpZiAoJGFyZ3NbJG51bV0gbmUgInZvaWQiKSB7Ci0gICAgICAkbm9uVm9pZEFyZ0xlbisrOwotICAgIH0KLSAgfQotICBpZiAoJHR5cGUgZXEgInZvaWQiKSB7Ci0gICAgcHJpbnRmKCJUUkFDRV9HTF9WT0lEKCIpOwotICB9IGVsc2UgewotICAgIHByaW50ZigiVFJBQ0VfR0woJXMsICIsICR0eXBlKTsKLSAgfQotICAKLSAgcHJpbnRmKCIlcywgKCVzKSwgKCIsICRuYW1lLCAkYXJncyk7Ci0gICAgZm9yIChteSAkbnVtID0gMDsgJG51bSA8ICRsZW47ICRudW0rKykgewotICAgIGlmICgkYXJnc1skbnVtXSBuZSAidm9pZCIpIHsKLSAgICAgIGlmICgkbnVtID4gMCkgewotICAgICAgICBwcmludCAiLCAiOwotICAgICAgfQotICAgICAgIwotICAgICAgIyBleHRyYWN0IHRoZSBuYW1lIGZyb20gdGhlIHBhcmFtZXRlcgotICAgICAgIyB0eXBlIG5hbWUKLSAgICAgICMgY29uc3QgdHlwZSAqbmFtZQotICAgICAgIyB0eXBlICpuYW1lCi0gICAgICAjIHR5cGUgbmFtZVs0XQotICAgICAgIwotICAgICAgaWYgKCRhcmdzWyRudW1dID1+IC8oXFMrXHMpK1wqKlxzKihbXHddKykvKSB7Ci0gICAgICAgIHByaW50ZigiJXMiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHByaW50ZigiKSwgJWQiLCAkbm9uVm9pZEFyZ0xlbik7Ci0gIGZvciAobXkgJG51bSA9IDA7ICRudW0gPCAkbGVuOyAkbnVtKyspIHsKLSAgICBpZiAoJGFyZ3NbJG51bV0gbmUgInZvaWQiKSB7Ci0gICAgICAjCi0gICAgICAjIGV4dHJhY3QgdGhlIG5hbWUgZnJvbSB0aGUgcGFyYW1ldGVyCi0gICAgICAjIHR5cGUgbmFtZQotICAgICAgIyBjb25zdCB0eXBlICpuYW1lCi0gICAgICAjIHR5cGUgKm5hbWUKLSAgICAgICMgdHlwZSBuYW1lWzRdCi0gICAgICAjCi0gICAgICBteSAkYXJnID0gJGFyZ3NbJG51bV07Ci0gICAgICBpZiAoJGFyZyA9fiAvKFxTK1xzKStcKipccyooW1x3XSspLykgewotICAgICAgICBteSAkbmFtZSA9ICQyOwotICAgICAgICBpZiAoJGFyZyA9fiAvKChjb25zdCApKihcUytccykrXCoqKVxzKihbXHddKykvKSB7Ci0gICAgICAgICAgbXkgJHR5cGUgPSBydHJpbSgkMSk7Ci0gICAgICAgICAgcHJpbnRmKCIsIFwiJXNcIiwgJXMiLCAkdHlwZSwgJG5hbWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHByaW50ZigiKVxuIik7Ci19Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvdHJhY2UuaW4gYi9vcGVuZ2wvbGlicy90cmFjZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjNWM4NC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvbGlicy90cmFjZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi1UUkFDRV9HTF9WT0lEKGdsQWN0aXZlU2hhZGVyUHJvZ3JhbUVYVCwgKEdMdWludCBwaXBlbGluZSwgR0x1aW50IHByb2dyYW0pLCAocGlwZWxpbmUsIHByb2dyYW0pLCAyLCAiR0x1aW50IiwgcGlwZWxpbmUsICJHTHVpbnQiLCBwcm9ncmFtKQotVFJBQ0VfR0xfVk9JRChnbEFjdGl2ZVRleHR1cmUsIChHTGVudW0gdGV4dHVyZSksICh0ZXh0dXJlKSwgMSwgIkdMZW51bSIsIHRleHR1cmUpCi1UUkFDRV9HTF9WT0lEKGdsQWxwaGFGdW5jLCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZiksIChmdW5jLCByZWYpLCAyLCAiR0xlbnVtIiwgZnVuYywgIkdMY2xhbXBmIiwgcmVmKQotVFJBQ0VfR0xfVk9JRChnbEFscGhhRnVuY1FDT00sIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKSwgKGZ1bmMsIHJlZiksIDIsICJHTGVudW0iLCBmdW5jLCAiR0xjbGFtcGYiLCByZWYpCi1UUkFDRV9HTF9WT0lEKGdsQWxwaGFGdW5jeCwgKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpLCAoZnVuYywgcmVmKSwgMiwgIkdMZW51bSIsIGZ1bmMsICJHTGNsYW1weCIsIHJlZikKLVRSQUNFX0dMX1ZPSUQoZ2xBbHBoYUZ1bmN4T0VTLCAoR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiksIChmdW5jLCByZWYpLCAyLCAiR0xlbnVtIiwgZnVuYywgIkdMY2xhbXB4IiwgcmVmKQotVFJBQ0VfR0xfVk9JRChnbEF0dGFjaFNoYWRlciwgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyKSwgKHByb2dyYW0sIHNoYWRlciksIDIsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0x1aW50Iiwgc2hhZGVyKQotVFJBQ0VfR0xfVk9JRChnbEJlZ2luUGVyZk1vbml0b3JBTUQsIChHTHVpbnQgbW9uaXRvciksIChtb25pdG9yKSwgMSwgIkdMdWludCIsIG1vbml0b3IpCi1UUkFDRV9HTF9WT0lEKGdsQmVnaW5RdWVyeUVYVCwgKEdMZW51bSB0YXJnZXQsIEdMdWludCBpZCksICh0YXJnZXQsIGlkKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdWludCIsIGlkKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRBdHRyaWJMb2NhdGlvbiwgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IEdMY2hhciogbmFtZSksIChwcm9ncmFtLCBpbmRleCwgbmFtZSksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0x1aW50IiwgaW5kZXgsICJjb25zdCBHTGNoYXIqIiwgbmFtZSkKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kQnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciksICh0YXJnZXQsIGJ1ZmZlciksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTHVpbnQiLCBidWZmZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmluZEZyYW1lYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSwgKHRhcmdldCwgZnJhbWVidWZmZXIpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgZnJhbWVidWZmZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmluZEZyYW1lYnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IGZyYW1lYnVmZmVyKSwgKHRhcmdldCwgZnJhbWVidWZmZXIpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgZnJhbWVidWZmZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmluZFByb2dyYW1QaXBlbGluZUVYVCwgKEdMdWludCBwaXBlbGluZSksIChwaXBlbGluZSksIDEsICJHTHVpbnQiLCBwaXBlbGluZSkKLVRSQUNFX0dMX1ZPSUQoZ2xCaW5kUmVuZGVyYnVmZmVyLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlciksICh0YXJnZXQsIHJlbmRlcmJ1ZmZlciksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTHVpbnQiLCByZW5kZXJidWZmZXIpCi1UUkFDRV9HTF9WT0lEKGdsQmluZFJlbmRlcmJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIpLCAodGFyZ2V0LCByZW5kZXJidWZmZXIpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x1aW50IiwgcmVuZGVyYnVmZmVyKQotVFJBQ0VfR0xfVk9JRChnbEJpbmRUZXh0dXJlLCAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpLCAodGFyZ2V0LCB0ZXh0dXJlKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMdWludCIsIHRleHR1cmUpCi1UUkFDRV9HTF9WT0lEKGdsQmluZFZlcnRleEFycmF5T0VTLCAoR0x1aW50IGFycmF5KSwgKGFycmF5KSwgMSwgIkdMdWludCIsIGFycmF5KQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kQ29sb3IsIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGNsYW1wZiIsIHJlZCwgIkdMY2xhbXBmIiwgZ3JlZW4sICJHTGNsYW1wZiIsIGJsdWUsICJHTGNsYW1wZiIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRXF1YXRpb24sICggR0xlbnVtIG1vZGUgKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xCbGVuZEVxdWF0aW9uT0VTLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSwgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKSwgKG1vZGVSR0IsIG1vZGVBbHBoYSksIDIsICJHTGVudW0iLCBtb2RlUkdCLCAiR0xlbnVtIiwgbW9kZUFscGhhKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUywgKEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhKSwgKG1vZGVSR0IsIG1vZGVBbHBoYSksIDIsICJHTGVudW0iLCBtb2RlUkdCLCAiR0xlbnVtIiwgbW9kZUFscGhhKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRnVuYywgKEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvciksIChzZmFjdG9yLCBkZmFjdG9yKSwgMiwgIkdMZW51bSIsIHNmYWN0b3IsICJHTGVudW0iLCBkZmFjdG9yKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRnVuY1NlcGFyYXRlLCAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpLCAoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSksIDQsICJHTGVudW0iLCBzcmNSR0IsICJHTGVudW0iLCBkc3RSR0IsICJHTGVudW0iLCBzcmNBbHBoYSwgIkdMZW51bSIsIGRzdEFscGhhKQotVFJBQ0VfR0xfVk9JRChnbEJsZW5kRnVuY1NlcGFyYXRlT0VTLCAoR0xlbnVtIHNyY1JHQiwgR0xlbnVtIGRzdFJHQiwgR0xlbnVtIHNyY0FscGhhLCBHTGVudW0gZHN0QWxwaGEpLCAoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSksIDQsICJHTGVudW0iLCBzcmNSR0IsICJHTGVudW0iLCBkc3RSR0IsICJHTGVudW0iLCBzcmNBbHBoYSwgIkdMZW51bSIsIGRzdEFscGhhKQotVFJBQ0VfR0xfVk9JRChnbEJsaXRGcmFtZWJ1ZmZlckFOR0xFLCAoR0xpbnQgc3JjWDAsIEdMaW50IHNyY1kwLCBHTGludCBzcmNYMSwgR0xpbnQgc3JjWTEsIEdMaW50IGRzdFgwLCBHTGludCBkc3RZMCwgR0xpbnQgZHN0WDEsIEdMaW50IGRzdFkxLCBHTGJpdGZpZWxkIG1hc2ssIEdMZW51bSBmaWx0ZXIpLCAoc3JjWDAsIHNyY1kwLCBzcmNYMSwgc3JjWTEsIGRzdFgwLCBkc3RZMCwgZHN0WDEsIGRzdFkxLCBtYXNrLCBmaWx0ZXIpLCAxMCwgIkdMaW50Iiwgc3JjWDAsICJHTGludCIsIHNyY1kwLCAiR0xpbnQiLCBzcmNYMSwgIkdMaW50Iiwgc3JjWTEsICJHTGludCIsIGRzdFgwLCAiR0xpbnQiLCBkc3RZMCwgIkdMaW50IiwgZHN0WDEsICJHTGludCIsIGRzdFkxLCAiR0xiaXRmaWVsZCIsIG1hc2ssICJHTGVudW0iLCBmaWx0ZXIpCi1UUkFDRV9HTF9WT0lEKGdsQnVmZmVyRGF0YSwgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UpLCAodGFyZ2V0LCBzaXplLCBkYXRhLCB1c2FnZSksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpcHRyIiwgc2l6ZSwgImNvbnN0IEdMdm9pZCAqIiwgZGF0YSwgIkdMZW51bSIsIHVzYWdlKQotVFJBQ0VfR0xfVk9JRChnbEJ1ZmZlclN1YkRhdGEsIChHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKSwgKHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50cHRyIiwgb2Zmc2V0LCAiR0xzaXplaXB0ciIsIHNpemUsICJjb25zdCBHTHZvaWQgKiIsIGRhdGEpCi1UUkFDRV9HTChHTGVudW0sIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1cywgKEdMZW51bSB0YXJnZXQpLCAodGFyZ2V0KSwgMSwgIkdMZW51bSIsIHRhcmdldCkKLVRSQUNFX0dMKEdMZW51bSwgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbENsZWFyLCAoR0xiaXRmaWVsZCBtYXNrKSwgKG1hc2spLCAxLCAiR0xiaXRmaWVsZCIsIG1hc2spCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJDb2xvciwgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMY2xhbXBmIiwgcmVkLCAiR0xjbGFtcGYiLCBncmVlbiwgIkdMY2xhbXBmIiwgYmx1ZSwgIkdMY2xhbXBmIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJDb2xvcngsIChHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGNsYW1weCIsIHJlZCwgIkdMY2xhbXB4IiwgZ3JlZW4sICJHTGNsYW1weCIsIGJsdWUsICJHTGNsYW1weCIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyQ29sb3J4T0VTLCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0xjbGFtcHgiLCByZWQsICJHTGNsYW1weCIsIGdyZWVuLCAiR0xjbGFtcHgiLCBibHVlLCAiR0xjbGFtcHgiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckRlcHRoZiwgKEdMY2xhbXBmIGRlcHRoKSwgKGRlcHRoKSwgMSwgIkdMY2xhbXBmIiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJEZXB0aGZPRVMsIChHTGNsYW1wZiBkZXB0aCksIChkZXB0aCksIDEsICJHTGNsYW1wZiIsIGRlcHRoKQotVFJBQ0VfR0xfVk9JRChnbENsZWFyRGVwdGh4LCAoR0xjbGFtcHggZGVwdGgpLCAoZGVwdGgpLCAxLCAiR0xjbGFtcHgiLCBkZXB0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xDbGVhckRlcHRoeE9FUywgKEdMY2xhbXB4IGRlcHRoKSwgKGRlcHRoKSwgMSwgIkdMY2xhbXB4IiwgZGVwdGgpCi1UUkFDRV9HTF9WT0lEKGdsQ2xlYXJTdGVuY2lsLCAoR0xpbnQgcyksIChzKSwgMSwgIkdMaW50IiwgcykKLVRSQUNFX0dMX1ZPSUQoZ2xDbGllbnRBY3RpdmVUZXh0dXJlLCAoR0xlbnVtIHRleHR1cmUpLCAodGV4dHVyZSksIDEsICJHTGVudW0iLCB0ZXh0dXJlKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZWYsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZmxvYXQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZWZJTUcsIChHTGVudW0gcCwgY29uc3QgR0xmbG9hdCAqZXFuKSwgKHAsIGVxbiksIDIsICJHTGVudW0iLCBwLCAiY29uc3QgR0xmbG9hdCAqIiwgZXFuKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZWZPRVMsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZmxvYXQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZXgsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZml4ZWQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZXhJTUcsIChHTGVudW0gcCwgY29uc3QgR0xmaXhlZCAqZXFuKSwgKHAsIGVxbiksIDIsICJHTGVudW0iLCBwLCAiY29uc3QgR0xmaXhlZCAqIiwgZXFuKQotVFJBQ0VfR0xfVk9JRChnbENsaXBQbGFuZXhPRVMsIChHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uKSwgKHBsYW5lLCBlcXVhdGlvbiksIDIsICJHTGVudW0iLCBwbGFuZSwgImNvbnN0IEdMZml4ZWQgKiIsIGVxdWF0aW9uKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yNGYsIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMZmxvYXQiLCByZWQsICJHTGZsb2F0IiwgZ3JlZW4sICJHTGZsb2F0IiwgYmx1ZSwgIkdMZmxvYXQiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvcjR1YiwgKEdMdWJ5dGUgcmVkLCBHTHVieXRlIGdyZWVuLCBHTHVieXRlIGJsdWUsIEdMdWJ5dGUgYWxwaGEpLCAocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpLCA0LCAiR0x1Ynl0ZSIsIHJlZCwgIkdMdWJ5dGUiLCBncmVlbiwgIkdMdWJ5dGUiLCBibHVlLCAiR0x1Ynl0ZSIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yNHgsIChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMZml4ZWQiLCByZWQsICJHTGZpeGVkIiwgZ3JlZW4sICJHTGZpeGVkIiwgYmx1ZSwgIkdMZml4ZWQiLCBhbHBoYSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb2xvcjR4T0VTLCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSksIChyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSksIDQsICJHTGZpeGVkIiwgcmVkLCAiR0xmaXhlZCIsIGdyZWVuLCAiR0xmaXhlZCIsIGJsdWUsICJHTGZpeGVkIiwgYWxwaGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29sb3JNYXNrLCAoR0xib29sZWFuIHJlZCwgR0xib29sZWFuIGdyZWVuLCBHTGJvb2xlYW4gYmx1ZSwgR0xib29sZWFuIGFscGhhKSwgKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSwgNCwgIkdMYm9vbGVhbiIsIHJlZCwgIkdMYm9vbGVhbiIsIGdyZWVuLCAiR0xib29sZWFuIiwgYmx1ZSwgIkdMYm9vbGVhbiIsIGFscGhhKQotVFJBQ0VfR0xfVk9JRChnbENvbG9yUG9pbnRlciwgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xDb21waWxlU2hhZGVyLCAoR0x1aW50IHNoYWRlciksIChzaGFkZXIpLCAxLCAiR0x1aW50Iiwgc2hhZGVyKQotVFJBQ0VfR0xfVk9JRChnbENvbXByZXNzZWRUZXhJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSksICh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBpbWFnZVNpemUsIGRhdGEpLCA4LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMaW50IiwgYm9yZGVyLCAiR0xzaXplaSIsIGltYWdlU2l6ZSwgImNvbnN0IEdMdm9pZCAqIiwgZGF0YSkKLVRSQUNFX0dMX1ZPSUQoZ2xDb21wcmVzc2VkVGV4SW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQqIGRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBib3JkZXIsIGltYWdlU2l6ZSwgZGF0YSksIDksICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoLCAiR0xpbnQiLCBib3JkZXIsICJHTHNpemVpIiwgaW1hZ2VTaXplLCAiY29uc3QgR0x2b2lkKiIsIGRhdGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBpbWFnZVNpemUsIGRhdGEpLCA5LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgeG9mZnNldCwgIkdMaW50IiwgeW9mZnNldCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTGVudW0iLCBmb3JtYXQsICJHTHNpemVpIiwgaW1hZ2VTaXplLCAiY29uc3QgR0x2b2lkICoiLCBkYXRhKQotVFJBQ0VfR0xfVk9JRChnbENvbXByZXNzZWRUZXhTdWJJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkKiBkYXRhKSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHpvZmZzZXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQsIGltYWdlU2l6ZSwgZGF0YSksIDExLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgeG9mZnNldCwgIkdMaW50IiwgeW9mZnNldCwgIkdMaW50Iiwgem9mZnNldCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgsICJHTGVudW0iLCBmb3JtYXQsICJHTHNpemVpIiwgaW1hZ2VTaXplLCAiY29uc3QgR0x2b2lkKiIsIGRhdGEpCi1UUkFDRV9HTF9WT0lEKGdsQ29weVRleEltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKSwgKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpLCA4LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMaW50IiwgYm9yZGVyKQotVFJBQ0VfR0xfVk9JRChnbENvcHlUZXhTdWJJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpLCA4LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgeG9mZnNldCwgIkdMaW50IiwgeW9mZnNldCwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsQ29weVRleFN1YkltYWdlM0RPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgem9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCksIDksICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB6b2Zmc2V0LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xDb3ZlcmFnZU1hc2tOViwgKEdMYm9vbGVhbiBtYXNrKSwgKG1hc2spLCAxLCAiR0xib29sZWFuIiwgbWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xDb3ZlcmFnZU9wZXJhdGlvbk5WLCAoR0xlbnVtIG9wZXJhdGlvbiksIChvcGVyYXRpb24pLCAxLCAiR0xlbnVtIiwgb3BlcmF0aW9uKQotVFJBQ0VfR0woR0x1aW50LCBnbENyZWF0ZVByb2dyYW0sICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTChHTHVpbnQsIGdsQ3JlYXRlU2hhZGVyLCAoR0xlbnVtIHR5cGUpLCAodHlwZSksIDEsICJHTGVudW0iLCB0eXBlKQotVFJBQ0VfR0woR0x1aW50LCBnbENyZWF0ZVNoYWRlclByb2dyYW12RVhULCAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhciAqKnN0cmluZ3MpLCAodHlwZSwgY291bnQsIHN0cmluZ3MpLCAzLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMY2hhciAqKiIsIHN0cmluZ3MpCi1UUkFDRV9HTF9WT0lEKGdsQ3VsbEZhY2UsIChHTGVudW0gbW9kZSksIChtb2RlKSwgMSwgIkdMZW51bSIsIG1vZGUpCi1UUkFDRV9HTF9WT0lEKGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMsIChHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4KSwgKG1hdHJpeHBhbGV0dGVpbmRleCksIDEsICJHTHVpbnQiLCBtYXRyaXhwYWxldHRlaW5kZXgpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlQnVmZmVycywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzKSwgKG4sIGJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQgKiIsIGJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlRmVuY2VzTlYsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqZmVuY2VzKSwgKG4sIGZlbmNlcyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgZmVuY2VzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZUZyYW1lYnVmZmVycywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiBmcmFtZWJ1ZmZlcnMpLCAobiwgZnJhbWVidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50KiIsIGZyYW1lYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogZnJhbWVidWZmZXJzKSwgKG4sIGZyYW1lYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCoiLCBmcmFtZWJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlUGVyZk1vbml0b3JzQU1ELCAoR0xzaXplaSBuLCBHTHVpbnQgKm1vbml0b3JzKSwgKG4sIG1vbml0b3JzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBtb25pdG9ycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVQcm9ncmFtLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSksIDEsICJHTHVpbnQiLCBwcm9ncmFtKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVByb2dyYW1QaXBlbGluZXNFWFQsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqcGlwZWxpbmVzKSwgKG4sIHBpcGVsaW5lcyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgcGlwZWxpbmVzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVF1ZXJpZXNFWFQsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqaWRzKSwgKG4sIGlkcyksIDIsICJHTHNpemVpIiwgbiwgImNvbnN0IEdMdWludCAqIiwgaWRzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogcmVuZGVyYnVmZmVycyksIChuLCByZW5kZXJidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50KiIsIHJlbmRlcmJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQqIiwgcmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xEZWxldGVTaGFkZXIsIChHTHVpbnQgc2hhZGVyKSwgKHNoYWRlciksIDEsICJHTHVpbnQiLCBzaGFkZXIpCi1UUkFDRV9HTF9WT0lEKGdsRGVsZXRlVGV4dHVyZXMsIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpLCAobiwgdGV4dHVyZXMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQgKiIsIHRleHR1cmVzKQotVFJBQ0VfR0xfVk9JRChnbERlbGV0ZVZlcnRleEFycmF5c09FUywgKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICphcnJheXMpLCAobiwgYXJyYXlzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiY29uc3QgR0x1aW50ICoiLCBhcnJheXMpCi1UUkFDRV9HTF9WT0lEKGdsRGVwdGhGdW5jLCAoR0xlbnVtIGZ1bmMpLCAoZnVuYyksIDEsICJHTGVudW0iLCBmdW5jKQotVFJBQ0VfR0xfVk9JRChnbERlcHRoTWFzaywgKEdMYm9vbGVhbiBmbGFnKSwgKGZsYWcpLCAxLCAiR0xib29sZWFuIiwgZmxhZykKLVRSQUNFX0dMX1ZPSUQoZ2xEZXB0aFJhbmdlZiwgKEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyKSwgKHpOZWFyLCB6RmFyKSwgMiwgIkdMY2xhbXBmIiwgek5lYXIsICJHTGNsYW1wZiIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRGVwdGhSYW5nZWZPRVMsIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhciksICh6TmVhciwgekZhciksIDIsICJHTGNsYW1wZiIsIHpOZWFyLCAiR0xjbGFtcGYiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbERlcHRoUmFuZ2V4LCAoR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIpLCAoek5lYXIsIHpGYXIpLCAyLCAiR0xjbGFtcHgiLCB6TmVhciwgIkdMY2xhbXB4IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xEZXB0aFJhbmdleE9FUywgKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKSwgKHpOZWFyLCB6RmFyKSwgMiwgIkdMY2xhbXB4Iiwgek5lYXIsICJHTGNsYW1weCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRGV0YWNoU2hhZGVyLCAoR0x1aW50IHByb2dyYW0sIEdMdWludCBzaGFkZXIpLCAocHJvZ3JhbSwgc2hhZGVyKSwgMiwgIkdMdWludCIsIHByb2dyYW0sICJHTHVpbnQiLCBzaGFkZXIpCi1UUkFDRV9HTF9WT0lEKGdsRGlzYWJsZSwgKEdMZW51bSBjYXApLCAoY2FwKSwgMSwgIkdMZW51bSIsIGNhcCkKLVRSQUNFX0dMX1ZPSUQoZ2xEaXNhYmxlQ2xpZW50U3RhdGUsIChHTGVudW0gYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0xlbnVtIiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsRGlzYWJsZURyaXZlckNvbnRyb2xRQ09NLCAoR0x1aW50IGRyaXZlckNvbnRyb2wpLCAoZHJpdmVyQ29udHJvbCksIDEsICJHTHVpbnQiLCBkcml2ZXJDb250cm9sKQotVFJBQ0VfR0xfVk9JRChnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSwgKEdMdWludCBpbmRleCksIChpbmRleCksIDEsICJHTHVpbnQiLCBpbmRleCkKLVRSQUNFX0dMX1ZPSUQoZ2xEaXNjYXJkRnJhbWVidWZmZXJFWFQsIChHTGVudW0gdGFyZ2V0LCBHTHNpemVpIG51bUF0dGFjaG1lbnRzLCBjb25zdCBHTGVudW0gKmF0dGFjaG1lbnRzKSwgKHRhcmdldCwgbnVtQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBudW1BdHRhY2htZW50cywgImNvbnN0IEdMZW51bSAqIiwgYXR0YWNobWVudHMpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd0FycmF5cywgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCksIChtb2RlLCBmaXJzdCwgY291bnQpLCAzLCAiR0xlbnVtIiwgbW9kZSwgIkdMaW50IiwgZmlyc3QsICJHTHNpemVpIiwgY291bnQpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd0J1ZmZlcnNOViwgKEdMc2l6ZWkgbiwgY29uc3QgR0xlbnVtICpidWZzKSwgKG4sIGJ1ZnMpLCAyLCAiR0xzaXplaSIsIG4sICJjb25zdCBHTGVudW0gKiIsIGJ1ZnMpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd0VsZW1lbnRzLCAoR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKmluZGljZXMpLCAobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMpLCA0LCAiR0xlbnVtIiwgbW9kZSwgIkdMc2l6ZWkiLCBjb3VudCwgIkdMZW51bSIsIHR5cGUsICJjb25zdCBHTHZvaWQgKiIsIGluZGljZXMpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleGZPRVMsIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCksICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSwgNSwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeiwgIkdMZmxvYXQiLCB3aWR0aCwgIkdMZmxvYXQiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleGZ2T0VTLCAoY29uc3QgR0xmbG9hdCAqY29vcmRzKSwgKGNvb3JkcyksIDEsICJjb25zdCBHTGZsb2F0ICoiLCBjb29yZHMpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleGlPRVMsIChHTGludCB4LCBHTGludCB5LCBHTGludCB6LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0KSwgKHgsIHksIHosIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xpbnQiLCB6LCAiR0xpbnQiLCB3aWR0aCwgIkdMaW50IiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbERyYXdUZXhpdk9FUywgKGNvbnN0IEdMaW50ICpjb29yZHMpLCAoY29vcmRzKSwgMSwgImNvbnN0IEdMaW50ICoiLCBjb29yZHMpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleHNPRVMsIChHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCksICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSwgNSwgIkdMc2hvcnQiLCB4LCAiR0xzaG9ydCIsIHksICJHTHNob3J0IiwgeiwgIkdMc2hvcnQiLCB3aWR0aCwgIkdMc2hvcnQiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleHN2T0VTLCAoY29uc3QgR0xzaG9ydCAqY29vcmRzKSwgKGNvb3JkcyksIDEsICJjb25zdCBHTHNob3J0ICoiLCBjb29yZHMpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleHhPRVMsIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCksICh4LCB5LCB6LCB3aWR0aCwgaGVpZ2h0KSwgNSwgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeiwgIkdMZml4ZWQiLCB3aWR0aCwgIkdMZml4ZWQiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsRHJhd1RleHh2T0VTLCAoY29uc3QgR0xmaXhlZCAqY29vcmRzKSwgKGNvb3JkcyksIDEsICJjb25zdCBHTGZpeGVkICoiLCBjb29yZHMpCi1UUkFDRV9HTF9WT0lEKGdsRUdMSW1hZ2VUYXJnZXRSZW5kZXJidWZmZXJTdG9yYWdlT0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlZ2xJbWFnZU9FUyBpbWFnZSksICh0YXJnZXQsIGltYWdlKSwgMiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZWdsSW1hZ2VPRVMiLCBpbWFnZSkKLVRSQUNFX0dMX1ZPSUQoZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZWdsSW1hZ2VPRVMgaW1hZ2UpLCAodGFyZ2V0LCBpbWFnZSksIDIsICJHTGVudW0iLCB0YXJnZXQsICJHTGVnbEltYWdlT0VTIiwgaW1hZ2UpCi1UUkFDRV9HTF9WT0lEKGdsRW5hYmxlLCAoR0xlbnVtIGNhcCksIChjYXApLCAxLCAiR0xlbnVtIiwgY2FwKQotVFJBQ0VfR0xfVk9JRChnbEVuYWJsZUNsaWVudFN0YXRlLCAoR0xlbnVtIGFycmF5KSwgKGFycmF5KSwgMSwgIkdMZW51bSIsIGFycmF5KQotVFJBQ0VfR0xfVk9JRChnbEVuYWJsZURyaXZlckNvbnRyb2xRQ09NLCAoR0x1aW50IGRyaXZlckNvbnRyb2wpLCAoZHJpdmVyQ29udHJvbCksIDEsICJHTHVpbnQiLCBkcml2ZXJDb250cm9sKQotVFJBQ0VfR0xfVk9JRChnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5LCAoR0x1aW50IGluZGV4KSwgKGluZGV4KSwgMSwgIkdMdWludCIsIGluZGV4KQotVFJBQ0VfR0xfVk9JRChnbEVuZFBlcmZNb25pdG9yQU1ELCAoR0x1aW50IG1vbml0b3IpLCAobW9uaXRvciksIDEsICJHTHVpbnQiLCBtb25pdG9yKQotVFJBQ0VfR0xfVk9JRChnbEVuZFF1ZXJ5RVhULCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbEVuZFRpbGluZ1FDT00sIChHTGJpdGZpZWxkIHByZXNlcnZlTWFzayksIChwcmVzZXJ2ZU1hc2spLCAxLCAiR0xiaXRmaWVsZCIsIHByZXNlcnZlTWFzaykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRCdWZmZXJQb2ludGVydlFDT00sIChHTGVudW0gdGFyZ2V0LCBHTHZvaWQgKipwYXJhbXMpLCAodGFyZ2V0LCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0x2b2lkICoqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldEJ1ZmZlcnNRQ09NLCAoR0x1aW50ICpidWZmZXJzLCBHTGludCBtYXhCdWZmZXJzLCBHTGludCAqbnVtQnVmZmVycyksIChidWZmZXJzLCBtYXhCdWZmZXJzLCBudW1CdWZmZXJzKSwgMywgIkdMdWludCAqIiwgYnVmZmVycywgIkdMaW50IiwgbWF4QnVmZmVycywgIkdMaW50ICoiLCBudW1CdWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldEZyYW1lYnVmZmVyc1FDT00sIChHTHVpbnQgKmZyYW1lYnVmZmVycywgR0xpbnQgbWF4RnJhbWVidWZmZXJzLCBHTGludCAqbnVtRnJhbWVidWZmZXJzKSwgKGZyYW1lYnVmZmVycywgbWF4RnJhbWVidWZmZXJzLCBudW1GcmFtZWJ1ZmZlcnMpLCAzLCAiR0x1aW50ICoiLCBmcmFtZWJ1ZmZlcnMsICJHTGludCIsIG1heEZyYW1lYnVmZmVycywgIkdMaW50ICoiLCBudW1GcmFtZWJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0UHJvZ3JhbUJpbmFyeVNvdXJjZVFDT00sIChHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHNoYWRlcnR5cGUsIEdMY2hhciAqc291cmNlLCBHTGludCAqbGVuZ3RoKSwgKHByb2dyYW0sIHNoYWRlcnR5cGUsIHNvdXJjZSwgbGVuZ3RoKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGVudW0iLCBzaGFkZXJ0eXBlLCAiR0xjaGFyICoiLCBzb3VyY2UsICJHTGludCAqIiwgbGVuZ3RoKQotVFJBQ0VfR0xfVk9JRChnbEV4dEdldFByb2dyYW1zUUNPTSwgKEdMdWludCAqcHJvZ3JhbXMsIEdMaW50IG1heFByb2dyYW1zLCBHTGludCAqbnVtUHJvZ3JhbXMpLCAocHJvZ3JhbXMsIG1heFByb2dyYW1zLCBudW1Qcm9ncmFtcyksIDMsICJHTHVpbnQgKiIsIHByb2dyYW1zLCAiR0xpbnQiLCBtYXhQcm9ncmFtcywgIkdMaW50ICoiLCBudW1Qcm9ncmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRSZW5kZXJidWZmZXJzUUNPTSwgKEdMdWludCAqcmVuZGVyYnVmZmVycywgR0xpbnQgbWF4UmVuZGVyYnVmZmVycywgR0xpbnQgKm51bVJlbmRlcmJ1ZmZlcnMpLCAocmVuZGVyYnVmZmVycywgbWF4UmVuZGVyYnVmZmVycywgbnVtUmVuZGVyYnVmZmVycyksIDMsICJHTHVpbnQgKiIsIHJlbmRlcmJ1ZmZlcnMsICJHTGludCIsIG1heFJlbmRlcmJ1ZmZlcnMsICJHTGludCAqIiwgbnVtUmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRTaGFkZXJzUUNPTSwgKEdMdWludCAqc2hhZGVycywgR0xpbnQgbWF4U2hhZGVycywgR0xpbnQgKm51bVNoYWRlcnMpLCAoc2hhZGVycywgbWF4U2hhZGVycywgbnVtU2hhZGVycyksIDMsICJHTHVpbnQgKiIsIHNoYWRlcnMsICJHTGludCIsIG1heFNoYWRlcnMsICJHTGludCAqIiwgbnVtU2hhZGVycykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRUZXhMZXZlbFBhcmFtZXRlcml2UUNPTSwgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gZmFjZSwgR0xpbnQgbGV2ZWwsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksICh0ZXh0dXJlLCBmYWNlLCBsZXZlbCwgcG5hbWUsIHBhcmFtcyksIDUsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xlbnVtIiwgZmFjZSwgIkdMaW50IiwgbGV2ZWwsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRXh0R2V0VGV4U3ViSW1hZ2VRQ09NLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICp0ZXhlbHMpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgdGV4ZWxzKSwgMTEsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB6b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJHTHZvaWQgKiIsIHRleGVscykKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRHZXRUZXh0dXJlc1FDT00sIChHTHVpbnQgKnRleHR1cmVzLCBHTGludCBtYXhUZXh0dXJlcywgR0xpbnQgKm51bVRleHR1cmVzKSwgKHRleHR1cmVzLCBtYXhUZXh0dXJlcywgbnVtVGV4dHVyZXMpLCAzLCAiR0x1aW50ICoiLCB0ZXh0dXJlcywgIkdMaW50IiwgbWF4VGV4dHVyZXMsICJHTGludCAqIiwgbnVtVGV4dHVyZXMpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsRXh0SXNQcm9ncmFtQmluYXJ5UUNPTSwgKEdMdWludCBwcm9ncmFtKSwgKHByb2dyYW0pLCAxLCAiR0x1aW50IiwgcHJvZ3JhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xFeHRUZXhPYmplY3RTdGF0ZU92ZXJyaWRlaVFDT00sIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGaW5pc2gsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsRmluaXNoRmVuY2VOViwgKEdMdWludCBmZW5jZSksIChmZW5jZSksIDEsICJHTHVpbnQiLCBmZW5jZSkKLVRSQUNFX0dMX1ZPSUQoZ2xGbHVzaCwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2dmLCAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xGb2dmdiwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsRm9neCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRm9neE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsRm9neHYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEZvZ3h2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpLCA0LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpLCA0LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYXR0YWNobWVudCwgIkdMZW51bSIsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgIkdMdWludCIsIHJlbmRlcmJ1ZmZlcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCkKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhULCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSwgKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyksIDYsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgdGV4dGFyZ2V0LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMaW50IiwgbGV2ZWwsICJHTHNpemVpIiwgc2FtcGxlcykKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlSU1HLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCwgR0xzaXplaSBzYW1wbGVzKSwgKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCB0ZXh0dXJlLCBsZXZlbCwgc2FtcGxlcyksIDYsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgdGV4dGFyZ2V0LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMaW50IiwgbGV2ZWwsICJHTHNpemVpIiwgc2FtcGxlcykKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCkKLVRSQUNFX0dMX1ZPSUQoZ2xGcmFtZWJ1ZmZlclRleHR1cmUzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gdGV4dGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSwgR0xpbnQgbGV2ZWwsIEdMaW50IHpvZmZzZXQpLCAodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIHRleHR1cmUsIGxldmVsLCB6b2Zmc2V0KSwgNiwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGF0dGFjaG1lbnQsICJHTGVudW0iLCB0ZXh0YXJnZXQsICJHTHVpbnQiLCB0ZXh0dXJlLCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50Iiwgem9mZnNldCkKLVRSQUNFX0dMX1ZPSUQoZ2xGcm9udEZhY2UsIChHTGVudW0gbW9kZSksIChtb2RlKSwgMSwgIkdMZW51bSIsIG1vZGUpCi1UUkFDRV9HTF9WT0lEKGdsRnJ1c3R1bWYsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmbG9hdCIsIGxlZnQsICJHTGZsb2F0IiwgcmlnaHQsICJHTGZsb2F0IiwgYm90dG9tLCAiR0xmbG9hdCIsIHRvcCwgIkdMZmxvYXQiLCB6TmVhciwgIkdMZmxvYXQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbEZydXN0dW1mT0VTLCAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZmxvYXQiLCBsZWZ0LCAiR0xmbG9hdCIsIHJpZ2h0LCAiR0xmbG9hdCIsIGJvdHRvbSwgIkdMZmxvYXQiLCB0b3AsICJHTGZsb2F0Iiwgek5lYXIsICJHTGZsb2F0IiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xGcnVzdHVteCwgKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZpeGVkIiwgbGVmdCwgIkdMZml4ZWQiLCByaWdodCwgIkdMZml4ZWQiLCBib3R0b20sICJHTGZpeGVkIiwgdG9wLCAiR0xmaXhlZCIsIHpOZWFyLCAiR0xmaXhlZCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsRnJ1c3R1bXhPRVMsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmaXhlZCIsIGxlZnQsICJHTGZpeGVkIiwgcmlnaHQsICJHTGZpeGVkIiwgYm90dG9tLCAiR0xmaXhlZCIsIHRvcCwgIkdMZml4ZWQiLCB6TmVhciwgIkdMZml4ZWQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbEdlbkJ1ZmZlcnMsIChHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyksIChuLCBidWZmZXJzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdlbkZlbmNlc05WLCAoR0xzaXplaSBuLCBHTHVpbnQgKmZlbmNlcyksIChuLCBmZW5jZXMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQgKiIsIGZlbmNlcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5GcmFtZWJ1ZmZlcnMsIChHTHNpemVpIG4sIEdMdWludCogZnJhbWVidWZmZXJzKSwgKG4sIGZyYW1lYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCoiLCBmcmFtZWJ1ZmZlcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuRnJhbWVidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBHTHVpbnQqIGZyYW1lYnVmZmVycyksIChuLCBmcmFtZWJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQqIiwgZnJhbWVidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdlblBlcmZNb25pdG9yc0FNRCwgKEdMc2l6ZWkgbiwgR0x1aW50ICptb25pdG9ycyksIChuLCBtb25pdG9ycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgbW9uaXRvcnMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuUHJvZ3JhbVBpcGVsaW5lc0VYVCwgKEdMc2l6ZWkgbiwgR0x1aW50ICpwaXBlbGluZXMpLCAobiwgcGlwZWxpbmVzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBwaXBlbGluZXMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuUXVlcmllc0VYVCwgKEdMc2l6ZWkgbiwgR0x1aW50ICppZHMpLCAobiwgaWRzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCBpZHMpCi1UUkFDRV9HTF9WT0lEKGdsR2VuUmVuZGVyYnVmZmVycywgKEdMc2l6ZWkgbiwgR0x1aW50KiByZW5kZXJidWZmZXJzKSwgKG4sIHJlbmRlcmJ1ZmZlcnMpLCAyLCAiR0xzaXplaSIsIG4sICJHTHVpbnQqIiwgcmVuZGVyYnVmZmVycykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5SZW5kZXJidWZmZXJzT0VTLCAoR0xzaXplaSBuLCBHTHVpbnQqIHJlbmRlcmJ1ZmZlcnMpLCAobiwgcmVuZGVyYnVmZmVycyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCoiLCByZW5kZXJidWZmZXJzKQotVFJBQ0VfR0xfVk9JRChnbEdlblRleHR1cmVzLCAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKSwgKG4sIHRleHR1cmVzKSwgMiwgIkdMc2l6ZWkiLCBuLCAiR0x1aW50ICoiLCB0ZXh0dXJlcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZW5WZXJ0ZXhBcnJheXNPRVMsIChHTHNpemVpIG4sIEdMdWludCAqYXJyYXlzKSwgKG4sIGFycmF5cyksIDIsICJHTHNpemVpIiwgbiwgIkdMdWludCAqIiwgYXJyYXlzKQotVFJBQ0VfR0xfVk9JRChnbEdlbmVyYXRlTWlwbWFwLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbEdlbmVyYXRlTWlwbWFwT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbEdldEFjdGl2ZUF0dHJpYiwgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpLCAocHJvZ3JhbSwgaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSksIDcsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0x1aW50IiwgaW5kZXgsICJHTHNpemVpIiwgYnVmc2l6ZSwgIkdMc2l6ZWkqIiwgbGVuZ3RoLCAiR0xpbnQqIiwgc2l6ZSwgIkdMZW51bSoiLCB0eXBlLCAiR0xjaGFyKiIsIG5hbWUpCi1UUkFDRV9HTF9WT0lEKGdsR2V0QWN0aXZlVW5pZm9ybSwgKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSogbGVuZ3RoLCBHTGludCogc2l6ZSwgR0xlbnVtKiB0eXBlLCBHTGNoYXIqIG5hbWUpLCAocHJvZ3JhbSwgaW5kZXgsIGJ1ZnNpemUsIGxlbmd0aCwgc2l6ZSwgdHlwZSwgbmFtZSksIDcsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0x1aW50IiwgaW5kZXgsICJHTHNpemVpIiwgYnVmc2l6ZSwgIkdMc2l6ZWkqIiwgbGVuZ3RoLCAiR0xpbnQqIiwgc2l6ZSwgIkdMZW51bSoiLCB0eXBlLCAiR0xjaGFyKiIsIG5hbWUpCi1UUkFDRV9HTF9WT0lEKGdsR2V0QXR0YWNoZWRTaGFkZXJzLCAoR0x1aW50IHByb2dyYW0sIEdMc2l6ZWkgbWF4Y291bnQsIEdMc2l6ZWkqIGNvdW50LCBHTHVpbnQqIHNoYWRlcnMpLCAocHJvZ3JhbSwgbWF4Y291bnQsIGNvdW50LCBzaGFkZXJzKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTHNpemVpIiwgbWF4Y291bnQsICJHTHNpemVpKiIsIGNvdW50LCAiR0x1aW50KiIsIHNoYWRlcnMpCi1UUkFDRV9HTChpbnQsIGdsR2V0QXR0cmliTG9jYXRpb24sIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSwgKHByb2dyYW0sIG5hbWUpLCAyLCAiR0x1aW50IiwgcHJvZ3JhbSwgImNvbnN0IEdMY2hhcioiLCBuYW1lKQotVFJBQ0VfR0xfVk9JRChnbEdldEJvb2xlYW52LCAoR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xib29sZWFuICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRCdWZmZXJQb2ludGVydk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0x2b2lkICoqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTHZvaWQgKioiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5lZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5lZk9FUywgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5leCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0Q2xpcFBsYW5leE9FUywgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBlcW5bNF0pLCAocG5hbWUsIGVxbiksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBlcW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0RHJpdmVyQ29udHJvbFN0cmluZ1FDT00sIChHTHVpbnQgZHJpdmVyQ29udHJvbCwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMY2hhciAqZHJpdmVyQ29udHJvbFN0cmluZyksIChkcml2ZXJDb250cm9sLCBidWZTaXplLCBsZW5ndGgsIGRyaXZlckNvbnRyb2xTdHJpbmcpLCA0LCAiR0x1aW50IiwgZHJpdmVyQ29udHJvbCwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xjaGFyICoiLCBkcml2ZXJDb250cm9sU3RyaW5nKQotVFJBQ0VfR0xfVk9JRChnbEdldERyaXZlckNvbnRyb2xzUUNPTSwgKEdMaW50ICpudW0sIEdMc2l6ZWkgc2l6ZSwgR0x1aW50ICpkcml2ZXJDb250cm9scyksIChudW0sIHNpemUsIGRyaXZlckNvbnRyb2xzKSwgMywgIkdMaW50ICoiLCBudW0sICJHTHNpemVpIiwgc2l6ZSwgIkdMdWludCAqIiwgZHJpdmVyQ29udHJvbHMpCi1UUkFDRV9HTChHTGVudW0sIGdsR2V0RXJyb3IsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsR2V0RmVuY2Vpdk5WLCAoR0x1aW50IGZlbmNlLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAoZmVuY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0x1aW50IiwgZmVuY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0Rml4ZWR2LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRGaXhlZHZPRVMsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldEZsb2F0diwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcyksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCogcGFyYW1zKSwgKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHBhcmFtcyksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBhdHRhY2htZW50LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTChHTGVudW0sIGdsR2V0R3JhcGhpY3NSZXNldFN0YXR1c0VYVCwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRJbnRlZ2VydiwgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRMaWdodGZ2LCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyksIChsaWdodCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldExpZ2h0eHYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TGlnaHR4dk9FUywgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRNYXRlcmlhbGZ2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldE1hdGVyaWFseHYsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoZmFjZSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0TWF0ZXJpYWx4dk9FUywgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRPYmplY3RMYWJlbEVYVCwgKEdMZW51bSB0eXBlLCBHTHVpbnQgb2JqZWN0LCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpsYWJlbCksICh0eXBlLCBvYmplY3QsIGJ1ZlNpemUsIGxlbmd0aCwgbGFiZWwpLCA1LCAiR0xlbnVtIiwgdHlwZSwgIkdMdWludCIsIG9iamVjdCwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xjaGFyICoiLCBsYWJlbCkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJEYXRhQU1ELCAoR0x1aW50IG1vbml0b3IsIEdMZW51bSBwbmFtZSwgR0xzaXplaSBkYXRhU2l6ZSwgR0x1aW50ICpkYXRhLCBHTGludCAqYnl0ZXNXcml0dGVuKSwgKG1vbml0b3IsIHBuYW1lLCBkYXRhU2l6ZSwgZGF0YSwgYnl0ZXNXcml0dGVuKSwgNSwgIkdMdWludCIsIG1vbml0b3IsICJHTGVudW0iLCBwbmFtZSwgIkdMc2l6ZWkiLCBkYXRhU2l6ZSwgIkdMdWludCAqIiwgZGF0YSwgIkdMaW50ICoiLCBieXRlc1dyaXR0ZW4pCi1UUkFDRV9HTF9WT0lEKGdsR2V0UGVyZk1vbml0b3JDb3VudGVySW5mb0FNRCwgKEdMdWludCBncm91cCwgR0x1aW50IGNvdW50ZXIsIEdMZW51bSBwbmFtZSwgR0x2b2lkICpkYXRhKSwgKGdyb3VwLCBjb3VudGVyLCBwbmFtZSwgZGF0YSksIDQsICJHTHVpbnQiLCBncm91cCwgIkdMdWludCIsIGNvdW50ZXIsICJHTGVudW0iLCBwbmFtZSwgIkdMdm9pZCAqIiwgZGF0YSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckNvdW50ZXJTdHJpbmdBTUQsIChHTHVpbnQgZ3JvdXAsIEdMdWludCBjb3VudGVyLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpjb3VudGVyU3RyaW5nKSwgKGdyb3VwLCBjb3VudGVyLCBidWZTaXplLCBsZW5ndGgsIGNvdW50ZXJTdHJpbmcpLCA1LCAiR0x1aW50IiwgZ3JvdXAsICJHTHVpbnQiLCBjb3VudGVyLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTHNpemVpICoiLCBsZW5ndGgsICJHTGNoYXIgKiIsIGNvdW50ZXJTdHJpbmcpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UGVyZk1vbml0b3JDb3VudGVyc0FNRCwgKEdMdWludCBncm91cCwgR0xpbnQgKm51bUNvdW50ZXJzLCBHTGludCAqbWF4QWN0aXZlQ291bnRlcnMsIEdMc2l6ZWkgY291bnRlclNpemUsIEdMdWludCAqY291bnRlcnMpLCAoZ3JvdXAsIG51bUNvdW50ZXJzLCBtYXhBY3RpdmVDb3VudGVycywgY291bnRlclNpemUsIGNvdW50ZXJzKSwgNSwgIkdMdWludCIsIGdyb3VwLCAiR0xpbnQgKiIsIG51bUNvdW50ZXJzLCAiR0xpbnQgKiIsIG1heEFjdGl2ZUNvdW50ZXJzLCAiR0xzaXplaSIsIGNvdW50ZXJTaXplLCAiR0x1aW50ICoiLCBjb3VudGVycykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckdyb3VwU3RyaW5nQU1ELCAoR0x1aW50IGdyb3VwLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICpncm91cFN0cmluZyksIChncm91cCwgYnVmU2l6ZSwgbGVuZ3RoLCBncm91cFN0cmluZyksIDQsICJHTHVpbnQiLCBncm91cCwgIkdMc2l6ZWkiLCBidWZTaXplLCAiR0xzaXplaSAqIiwgbGVuZ3RoLCAiR0xjaGFyICoiLCBncm91cFN0cmluZykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQZXJmTW9uaXRvckdyb3Vwc0FNRCwgKEdMaW50ICpudW1Hcm91cHMsIEdMc2l6ZWkgZ3JvdXBzU2l6ZSwgR0x1aW50ICpncm91cHMpLCAobnVtR3JvdXBzLCBncm91cHNTaXplLCBncm91cHMpLCAzLCAiR0xpbnQgKiIsIG51bUdyb3VwcywgIkdMc2l6ZWkiLCBncm91cHNTaXplLCAiR0x1aW50ICoiLCBncm91cHMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UG9pbnRlcnYsIChHTGVudW0gcG5hbWUsIEdMdm9pZCAqKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0x2b2lkICoqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFByb2dyYW1CaW5hcnlPRVMsIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZTaXplLCBHTHNpemVpICpsZW5ndGgsIEdMZW51bSAqYmluYXJ5Rm9ybWF0LCBHTHZvaWQgKmJpbmFyeSksIChwcm9ncmFtLCBidWZTaXplLCBsZW5ndGgsIGJpbmFyeUZvcm1hdCwgYmluYXJ5KSwgNSwgIkdMdWludCIsIHByb2dyYW0sICJHTHNpemVpIiwgYnVmU2l6ZSwgIkdMc2l6ZWkgKiIsIGxlbmd0aCwgIkdMZW51bSAqIiwgYmluYXJ5Rm9ybWF0LCAiR0x2b2lkICoiLCBiaW5hcnkpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UHJvZ3JhbUluZm9Mb2csIChHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb2xvZyksIChwcm9ncmFtLCBidWZzaXplLCBsZW5ndGgsIGluZm9sb2cpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMc2l6ZWkiLCBidWZzaXplLCAiR0xzaXplaSoiLCBsZW5ndGgsICJHTGNoYXIqIiwgaW5mb2xvZykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQcm9ncmFtUGlwZWxpbmVJbmZvTG9nRVhULCAoR0x1aW50IHBpcGVsaW5lLCBHTHNpemVpIGJ1ZlNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xjaGFyICppbmZvTG9nKSwgKHBpcGVsaW5lLCBidWZTaXplLCBsZW5ndGgsIGluZm9Mb2cpLCA0LCAiR0x1aW50IiwgcGlwZWxpbmUsICJHTHNpemVpIiwgYnVmU2l6ZSwgIkdMc2l6ZWkgKiIsIGxlbmd0aCwgIkdMY2hhciAqIiwgaW5mb0xvZykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRQcm9ncmFtUGlwZWxpbmVpdkVYVCwgKEdMdWludCBwaXBlbGluZSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKSwgKHBpcGVsaW5lLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMdWludCIsIHBpcGVsaW5lLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFByb2dyYW1pdiwgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAocHJvZ3JhbSwgcG5hbWUsIHBhcmFtcyksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UXVlcnlPYmplY3R1aXZFWFQsIChHTHVpbnQgaWQsIEdMZW51bSBwbmFtZSwgR0x1aW50ICpwYXJhbXMpLCAoaWQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0x1aW50IiwgaWQsICJHTGVudW0iLCBwbmFtZSwgIkdMdWludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFF1ZXJ5aXZFWFQsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZPRVMsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFNoYWRlckluZm9Mb2csIChHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvbG9nKSwgKHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBpbmZvbG9nKSwgNCwgIkdMdWludCIsIHNoYWRlciwgIkdMc2l6ZWkiLCBidWZzaXplLCAiR0xzaXplaSoiLCBsZW5ndGgsICJHTGNoYXIqIiwgaW5mb2xvZykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQsIChHTGVudW0gc2hhZGVydHlwZSwgR0xlbnVtIHByZWNpc2lvbnR5cGUsIEdMaW50KiByYW5nZSwgR0xpbnQqIHByZWNpc2lvbiksIChzaGFkZXJ0eXBlLCBwcmVjaXNpb250eXBlLCByYW5nZSwgcHJlY2lzaW9uKSwgNCwgIkdMZW51bSIsIHNoYWRlcnR5cGUsICJHTGVudW0iLCBwcmVjaXNpb250eXBlLCAiR0xpbnQqIiwgcmFuZ2UsICJHTGludCoiLCBwcmVjaXNpb24pCi1UUkFDRV9HTF9WT0lEKGdsR2V0U2hhZGVyU291cmNlLCAoR0x1aW50IHNoYWRlciwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogc291cmNlKSwgKHNoYWRlciwgYnVmc2l6ZSwgbGVuZ3RoLCBzb3VyY2UpLCA0LCAiR0x1aW50Iiwgc2hhZGVyLCAiR0xzaXplaSIsIGJ1ZnNpemUsICJHTHNpemVpKiIsIGxlbmd0aCwgIkdMY2hhcioiLCBzb3VyY2UpCi1UUkFDRV9HTF9WT0lEKGdsR2V0U2hhZGVyaXYsIChHTHVpbnQgc2hhZGVyLCBHTGVudW0gcG5hbWUsIEdMaW50KiBwYXJhbXMpLCAoc2hhZGVyLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMdWludCIsIHNoYWRlciwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQqIiwgcGFyYW1zKQotVFJBQ0VfR0woY29uc3QgR0x1Ynl0ZSAqLCBnbEdldFN0cmluZywgKEdMZW51bSBuYW1lKSwgKG5hbWUpLCAxLCAiR0xlbnVtIiwgbmFtZSkKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhFbnZmdiwgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zKSwgKGVudiwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBlbnYsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhFbnZpdiwgKEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyksIChlbnYsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZW52LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEVudnh2LCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGVudiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEVudnh2T0VTLCAoR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMpLCAoZW52LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGVudiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEdlbmZ2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyksIChjb29yZCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCBjb29yZCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldFRleEdlbml2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4R2VueHZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4UGFyYW1ldGVyZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VGV4UGFyYW1ldGVyaXYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhQYXJhbWV0ZXJ4diwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMKGludCwgZ2xHZXRVbmlmb3JtTG9jYXRpb24sIChHTHVpbnQgcHJvZ3JhbSwgY29uc3QgR0xjaGFyKiBuYW1lKSwgKHByb2dyYW0sIG5hbWUpLCAyLCAiR0x1aW50IiwgcHJvZ3JhbSwgImNvbnN0IEdMY2hhcioiLCBuYW1lKQotVFJBQ0VfR0xfVk9JRChnbEdldFVuaWZvcm1mdiwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCogcGFyYW1zKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBwYXJhbXMpLCAzLCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTGZsb2F0KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRVbmlmb3JtaXYsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50KiBwYXJhbXMpLCAocHJvZ3JhbSwgbG9jYXRpb24sIHBhcmFtcyksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMaW50KiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiwgKEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCBHTHZvaWQqKiBwb2ludGVyKSwgKGluZGV4LCBwbmFtZSwgcG9pbnRlciksIDMsICJHTHVpbnQiLCBpbmRleCwgIkdMZW51bSIsIHBuYW1lLCAiR0x2b2lkKioiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbEdldFZlcnRleEF0dHJpYmZ2LCAoR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQqIHBhcmFtcyksIChpbmRleCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTHVpbnQiLCBpbmRleCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmbG9hdCoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsR2V0VmVydGV4QXR0cmliaXYsIChHTHVpbnQgaW5kZXgsIEdMZW51bSBwbmFtZSwgR0xpbnQqIHBhcmFtcyksIChpbmRleCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTHVpbnQiLCBpbmRleCwgIkdMZW51bSIsIHBuYW1lLCAiR0xpbnQqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldG5Vbmlmb3JtZnZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgZmxvYXQgKnBhcmFtcyksIChwcm9ncmFtLCBsb2NhdGlvbiwgYnVmU2l6ZSwgcGFyYW1zKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEdldG5Vbmlmb3JtaXZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgYnVmU2l6ZSwgR0xpbnQgKnBhcmFtcyksIChwcm9ncmFtLCBsb2NhdGlvbiwgYnVmU2l6ZSwgcGFyYW1zKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJHTGludCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbEhpbnQsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSksICh0YXJnZXQsIG1vZGUpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xJbnNlcnRFdmVudE1hcmtlckVYVCwgKEdMc2l6ZWkgbGVuZ3RoLCBjb25zdCBHTGNoYXIgKm1hcmtlciksIChsZW5ndGgsIG1hcmtlciksIDIsICJHTHNpemVpIiwgbGVuZ3RoLCAiY29uc3QgR0xjaGFyICoiLCBtYXJrZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNCdWZmZXIsIChHTHVpbnQgYnVmZmVyKSwgKGJ1ZmZlciksIDEsICJHTHVpbnQiLCBidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNFbmFibGVkLCAoR0xlbnVtIGNhcCksIChjYXApLCAxLCAiR0xlbnVtIiwgY2FwKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzRmVuY2VOViwgKEdMdWludCBmZW5jZSksIChmZW5jZSksIDEsICJHTHVpbnQiLCBmZW5jZSkKLVRSQUNFX0dMKEdMYm9vbGVhbiwgZ2xJc0ZyYW1lYnVmZmVyLCAoR0x1aW50IGZyYW1lYnVmZmVyKSwgKGZyYW1lYnVmZmVyKSwgMSwgIkdMdWludCIsIGZyYW1lYnVmZmVyKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzRnJhbWVidWZmZXJPRVMsIChHTHVpbnQgZnJhbWVidWZmZXIpLCAoZnJhbWVidWZmZXIpLCAxLCAiR0x1aW50IiwgZnJhbWVidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNQcm9ncmFtLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSksIDEsICJHTHVpbnQiLCBwcm9ncmFtKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzUHJvZ3JhbVBpcGVsaW5lRVhULCAoR0x1aW50IHBpcGVsaW5lKSwgKHBpcGVsaW5lKSwgMSwgIkdMdWludCIsIHBpcGVsaW5lKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzUXVlcnlFWFQsIChHTHVpbnQgaWQpLCAoaWQpLCAxLCAiR0x1aW50IiwgaWQpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNSZW5kZXJidWZmZXIsIChHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHJlbmRlcmJ1ZmZlciksIDEsICJHTHVpbnQiLCByZW5kZXJidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNSZW5kZXJidWZmZXJPRVMsIChHTHVpbnQgcmVuZGVyYnVmZmVyKSwgKHJlbmRlcmJ1ZmZlciksIDEsICJHTHVpbnQiLCByZW5kZXJidWZmZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNTaGFkZXIsIChHTHVpbnQgc2hhZGVyKSwgKHNoYWRlciksIDEsICJHTHVpbnQiLCBzaGFkZXIpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsSXNUZXh0dXJlLCAoR0x1aW50IHRleHR1cmUpLCAodGV4dHVyZSksIDEsICJHTHVpbnQiLCB0ZXh0dXJlKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbElzVmVydGV4QXJyYXlPRVMsIChHTHVpbnQgYXJyYXkpLCAoYXJyYXkpLCAxLCAiR0x1aW50IiwgYXJyYXkpCi1UUkFDRV9HTF9WT0lEKGdsTGFiZWxPYmplY3RFWFQsIChHTGVudW0gdHlwZSwgR0x1aW50IG9iamVjdCwgR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbGFiZWwpLCAodHlwZSwgb2JqZWN0LCBsZW5ndGgsIGxhYmVsKSwgNCwgIkdMZW51bSIsIHR5cGUsICJHTHVpbnQiLCBvYmplY3QsICJHTHNpemVpIiwgbGVuZ3RoLCAiY29uc3QgR0xjaGFyICoiLCBsYWJlbCkKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVsZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbGZ2LCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodE1vZGVseCwgKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbHhPRVMsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0TW9kZWx4diwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRNb2RlbHh2T0VTLCAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAocG5hbWUsIHBhcmFtcyksIDIsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodGYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChsaWdodCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHRmdiwgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZmxvYXQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaWdodHgsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksIChsaWdodCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHR4T0VTLCAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAobGlnaHQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBsaWdodCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbExpZ2h0eHYsIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKGxpZ2h0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGxpZ2h0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZpeGVkICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsTGlnaHR4dk9FUywgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAobGlnaHQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgbGlnaHQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xMaW5lV2lkdGgsIChHTGZsb2F0IHdpZHRoKSwgKHdpZHRoKSwgMSwgIkdMZmxvYXQiLCB3aWR0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xMaW5lV2lkdGh4LCAoR0xmaXhlZCB3aWR0aCksICh3aWR0aCksIDEsICJHTGZpeGVkIiwgd2lkdGgpCi1UUkFDRV9HTF9WT0lEKGdsTGluZVdpZHRoeE9FUywgKEdMZml4ZWQgd2lkdGgpLCAod2lkdGgpLCAxLCAiR0xmaXhlZCIsIHdpZHRoKQotVFJBQ0VfR0xfVk9JRChnbExpbmtQcm9ncmFtLCAoR0x1aW50IHByb2dyYW0pLCAocHJvZ3JhbSksIDEsICJHTHVpbnQiLCBwcm9ncmFtKQotVFJBQ0VfR0xfVk9JRChnbExvYWRJZGVudGl0eSwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkTWF0cml4ZiwgKGNvbnN0IEdMZmxvYXQgKm0pLCAobSksIDEsICJjb25zdCBHTGZsb2F0ICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbExvYWRNYXRyaXh4LCAoY29uc3QgR0xmaXhlZCAqbSksIChtKSwgMSwgImNvbnN0IEdMZml4ZWQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTG9hZE1hdHJpeHhPRVMsIChjb25zdCBHTGZpeGVkICptKSwgKG0pLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMsICh2b2lkKSwgKCksIDApCi1UUkFDRV9HTF9WT0lEKGdsTG9naWNPcCwgKEdMZW51bSBvcGNvZGUpLCAob3Bjb2RlKSwgMSwgIkdMZW51bSIsIG9wY29kZSkKLVRSQUNFX0dMKHZvaWQqLCBnbE1hcEJ1ZmZlck9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBhY2Nlc3MpLCAodGFyZ2V0LCBhY2Nlc3MpLCAyLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgYWNjZXNzKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFsZiwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAoZmFjZSwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZmxvYXQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbGZ2LCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmbG9hdCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbE1hdGVyaWFseCwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAoZmFjZSwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbHhPRVMsIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGZhY2UsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZpeGVkIiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsTWF0ZXJpYWx4diwgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChmYWNlLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGZhY2UsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRlcmlhbHh2T0VTLCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKSwgKGZhY2UsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbE1hdHJpeEluZGV4UG9pbnRlck9FUywgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xNYXRyaXhNb2RlLCAoR0xlbnVtIG1vZGUpLCAobW9kZSksIDEsICJHTGVudW0iLCBtb2RlKQotVFJBQ0VfR0xfVk9JRChnbE11bHRNYXRyaXhmLCAoY29uc3QgR0xmbG9hdCAqbSksIChtKSwgMSwgImNvbnN0IEdMZmxvYXQgKiIsIG0pCi1UUkFDRV9HTF9WT0lEKGdsTXVsdE1hdHJpeHgsIChjb25zdCBHTGZpeGVkICptKSwgKG0pLCAxLCAiY29uc3QgR0xmaXhlZCAqIiwgbSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0TWF0cml4eE9FUywgKGNvbnN0IEdMZml4ZWQgKm0pLCAobSksIDEsICJjb25zdCBHTGZpeGVkICoiLCBtKQotVFJBQ0VfR0xfVk9JRChnbE11bHRpRHJhd0FycmF5c0VYVCwgKEdMZW51bSBtb2RlLCBHTGludCAqZmlyc3QsIEdMc2l6ZWkgKmNvdW50LCBHTHNpemVpIHByaW1jb3VudCksIChtb2RlLCBmaXJzdCwgY291bnQsIHByaW1jb3VudCksIDQsICJHTGVudW0iLCBtb2RlLCAiR0xpbnQgKiIsIGZpcnN0LCAiR0xzaXplaSAqIiwgY291bnQsICJHTHNpemVpIiwgcHJpbWNvdW50KQotVFJBQ0VfR0xfVk9JRChnbE11bHRpRHJhd0VsZW1lbnRzRVhULCAoR0xlbnVtIG1vZGUsIGNvbnN0IEdMc2l6ZWkgKmNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiAqaW5kaWNlcywgR0xzaXplaSBwcmltY291bnQpLCAobW9kZSwgY291bnQsIHR5cGUsIGluZGljZXMsIHByaW1jb3VudCksIDUsICJHTGVudW0iLCBtb2RlLCAiY29uc3QgR0xzaXplaSAqIiwgY291bnQsICJHTGVudW0iLCB0eXBlLCAiY29uc3QgR0x2b2lkKiAqIiwgaW5kaWNlcywgIkdMc2l6ZWkiLCBwcmltY291bnQpCi1UUkFDRV9HTF9WT0lEKGdsTXVsdGlUZXhDb29yZDRmLCAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKSwgKHRhcmdldCwgcywgdCwgciwgcSksIDUsICJHTGVudW0iLCB0YXJnZXQsICJHTGZsb2F0IiwgcywgIkdMZmxvYXQiLCB0LCAiR0xmbG9hdCIsIHIsICJHTGZsb2F0IiwgcSkKLVRSQUNFX0dMX1ZPSUQoZ2xNdWx0aVRleENvb3JkNHgsIChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpLCAodGFyZ2V0LCBzLCB0LCByLCBxKSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMZml4ZWQiLCBzLCAiR0xmaXhlZCIsIHQsICJHTGZpeGVkIiwgciwgIkdMZml4ZWQiLCBxKQotVFJBQ0VfR0xfVk9JRChnbE11bHRpVGV4Q29vcmQ0eE9FUywgKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSksICh0YXJnZXQsIHMsIHQsIHIsIHEpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xmaXhlZCIsIHMsICJHTGZpeGVkIiwgdCwgIkdMZml4ZWQiLCByLCAiR0xmaXhlZCIsIHEpCi1UUkFDRV9HTF9WT0lEKGdsTm9ybWFsM2YsIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KSwgKG54LCBueSwgbnopLCAzLCAiR0xmbG9hdCIsIG54LCAiR0xmbG9hdCIsIG55LCAiR0xmbG9hdCIsIG56KQotVFJBQ0VfR0xfVk9JRChnbE5vcm1hbDN4LCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueiksIChueCwgbnksIG56KSwgMywgIkdMZml4ZWQiLCBueCwgIkdMZml4ZWQiLCBueSwgIkdMZml4ZWQiLCBueikKLVRSQUNFX0dMX1ZPSUQoZ2xOb3JtYWwzeE9FUywgKEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnopLCAobngsIG55LCBueiksIDMsICJHTGZpeGVkIiwgbngsICJHTGZpeGVkIiwgbnksICJHTGZpeGVkIiwgbnopCi1UUkFDRV9HTF9WT0lEKGdsTm9ybWFsUG9pbnRlciwgKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDMsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKLVRSQUNFX0dMX1ZPSUQoZ2xPcnRob2YsIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmbG9hdCIsIGxlZnQsICJHTGZsb2F0IiwgcmlnaHQsICJHTGZsb2F0IiwgYm90dG9tLCAiR0xmbG9hdCIsIHRvcCwgIkdMZmxvYXQiLCB6TmVhciwgIkdMZmxvYXQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbE9ydGhvZk9FUywgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpLCAobGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCB6TmVhciwgekZhciksIDYsICJHTGZsb2F0IiwgbGVmdCwgIkdMZmxvYXQiLCByaWdodCwgIkdMZmxvYXQiLCBib3R0b20sICJHTGZsb2F0IiwgdG9wLCAiR0xmbG9hdCIsIHpOZWFyLCAiR0xmbG9hdCIsIHpGYXIpCi1UUkFDRV9HTF9WT0lEKGdsT3J0aG94LCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciksIChsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIHpOZWFyLCB6RmFyKSwgNiwgIkdMZml4ZWQiLCBsZWZ0LCAiR0xmaXhlZCIsIHJpZ2h0LCAiR0xmaXhlZCIsIGJvdHRvbSwgIkdMZml4ZWQiLCB0b3AsICJHTGZpeGVkIiwgek5lYXIsICJHTGZpeGVkIiwgekZhcikKLVRSQUNFX0dMX1ZPSUQoZ2xPcnRob3hPRVMsIChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKSwgKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgek5lYXIsIHpGYXIpLCA2LCAiR0xmaXhlZCIsIGxlZnQsICJHTGZpeGVkIiwgcmlnaHQsICJHTGZpeGVkIiwgYm90dG9tLCAiR0xmaXhlZCIsIHRvcCwgIkdMZml4ZWQiLCB6TmVhciwgIkdMZml4ZWQiLCB6RmFyKQotVFJBQ0VfR0xfVk9JRChnbFBpeGVsU3RvcmVpLCAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyZiwgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChwbmFtZSwgcGFyYW0pLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJmdiwgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKHBuYW1lLCBwYXJhbXMpLCAyLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRQYXJhbWV0ZXJ4LCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHBuYW1lLCBwYXJhbSksIDIsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2ludFBhcmFtZXRlcnhPRVMsIChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pLCAocG5hbWUsIHBhcmFtKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyeHYsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50UGFyYW1ldGVyeHZPRVMsIChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyksIChwbmFtZSwgcGFyYW1zKSwgMiwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZSwgKEdMZmxvYXQgc2l6ZSksIChzaXplKSwgMSwgIkdMZmxvYXQiLCBzaXplKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZVBvaW50ZXJPRVMsIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksICh0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCAzLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsUG9pbnRTaXpleCwgKEdMZml4ZWQgc2l6ZSksIChzaXplKSwgMSwgIkdMZml4ZWQiLCBzaXplKQotVFJBQ0VfR0xfVk9JRChnbFBvaW50U2l6ZXhPRVMsIChHTGZpeGVkIHNpemUpLCAoc2l6ZSksIDEsICJHTGZpeGVkIiwgc2l6ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQb2x5Z29uT2Zmc2V0LCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpLCAoZmFjdG9yLCB1bml0cyksIDIsICJHTGZsb2F0IiwgZmFjdG9yLCAiR0xmbG9hdCIsIHVuaXRzKQotVFJBQ0VfR0xfVk9JRChnbFBvbHlnb25PZmZzZXR4LCAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpLCAoZmFjdG9yLCB1bml0cyksIDIsICJHTGZpeGVkIiwgZmFjdG9yLCAiR0xmaXhlZCIsIHVuaXRzKQotVFJBQ0VfR0xfVk9JRChnbFBvbHlnb25PZmZzZXR4T0VTLCAoR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMpLCAoZmFjdG9yLCB1bml0cyksIDIsICJHTGZpeGVkIiwgZmFjdG9yLCAiR0xmaXhlZCIsIHVuaXRzKQotVFJBQ0VfR0xfVk9JRChnbFBvcEdyb3VwTWFya2VyRVhULCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0xfVk9JRChnbFBvcE1hdHJpeCwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtQmluYXJ5T0VTLCAoR0x1aW50IHByb2dyYW0sIEdMZW51bSBiaW5hcnlGb3JtYXQsIGNvbnN0IEdMdm9pZCAqYmluYXJ5LCBHTGludCBsZW5ndGgpLCAocHJvZ3JhbSwgYmluYXJ5Rm9ybWF0LCBiaW5hcnksIGxlbmd0aCksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xlbnVtIiwgYmluYXJ5Rm9ybWF0LCAiY29uc3QgR0x2b2lkICoiLCBiaW5hcnksICJHTGludCIsIGxlbmd0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtUGFyYW1ldGVyaUVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGVudW0gcG5hbWUsIEdMaW50IHZhbHVlKSwgKHByb2dyYW0sIHBuYW1lLCB2YWx1ZSksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtMWZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQiLCB4KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtMWZ2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0xaUVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCksIDMsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMaW50IiwgeCkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTFpdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0yZkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHkpLCAocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHkpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtMmZ2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0yaUVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTJpdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0zZkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeiksIDUsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTNmdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCAqdmFsdWUpLCAocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB2YWx1ZSksIDQsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMZmxvYXQgKiIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtM2lFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHopLCAocHJvZ3JhbSwgbG9jYXRpb24sIHgsIHksIHopLCA1LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTGludCIsIHgsICJHTGludCIsIHksICJHTGludCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm0zaXZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xpbnQgKiIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtNGZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHosIEdMZmxvYXQgdyksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeiwgdyksIDYsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeiwgIkdMZmxvYXQiLCB3KQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtNGZ2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHZhbHVlKSwgNCwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xmbG9hdCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm00aUVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyksIChwcm9ncmFtLCBsb2NhdGlvbiwgeCwgeSwgeiwgdyksIDYsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMaW50IiwgeiwgIkdMaW50IiwgdykKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybTRpdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdmFsdWUpLCA0LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHJvZ3JhbVVuaWZvcm1NYXRyaXgyZnZFWFQsIChHTHVpbnQgcHJvZ3JhbSwgR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlKSwgKHByb2dyYW0sIGxvY2F0aW9uLCBjb3VudCwgdHJhbnNwb3NlLCB2YWx1ZSksIDUsICJHTHVpbnQiLCBwcm9ncmFtLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgIkdMYm9vbGVhbiIsIHRyYW5zcG9zZSwgImNvbnN0IEdMZmxvYXQgKiIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFByb2dyYW1Vbmlmb3JtTWF0cml4M2Z2RVhULCAoR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSksIChwcm9ncmFtLCBsb2NhdGlvbiwgY291bnQsIHRyYW5zcG9zZSwgdmFsdWUpLCA1LCAiR0x1aW50IiwgcHJvZ3JhbSwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJHTGJvb2xlYW4iLCB0cmFuc3Bvc2UsICJjb25zdCBHTGZsb2F0ICoiLCB2YWx1ZSkKLVRSQUNFX0dMX1ZPSUQoZ2xQcm9ncmFtVW5pZm9ybU1hdHJpeDRmdkVYVCwgKEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUpLCAocHJvZ3JhbSwgbG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSwgNSwgIkdMdWludCIsIHByb2dyYW0sICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiR0xib29sZWFuIiwgdHJhbnNwb3NlLCAiY29uc3QgR0xmbG9hdCAqIiwgdmFsdWUpCi1UUkFDRV9HTF9WT0lEKGdsUHVzaEdyb3VwTWFya2VyRVhULCAoR0xzaXplaSBsZW5ndGgsIGNvbnN0IEdMY2hhciAqbWFya2VyKSwgKGxlbmd0aCwgbWFya2VyKSwgMiwgIkdMc2l6ZWkiLCBsZW5ndGgsICJjb25zdCBHTGNoYXIgKiIsIG1hcmtlcikKLVRSQUNFX0dMX1ZPSUQoZ2xQdXNoTWF0cml4LCAodm9pZCksICgpLCAwKQotVFJBQ0VfR0woR0xiaXRmaWVsZCwgZ2xRdWVyeU1hdHJpeHhPRVMsIChHTGZpeGVkIG1hbnRpc3NhWzE2XSwgR0xpbnQgZXhwb25lbnRbMTZdKSwgKG1hbnRpc3NhLCBleHBvbmVudCksIDIsICJHTGZpeGVkIiwgbWFudGlzc2EsICJHTGludCIsIGV4cG9uZW50KQotVFJBQ0VfR0xfVk9JRChnbFJlYWRCdWZmZXJOViwgKEdMZW51bSBtb2RlKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xSZWFkUGl4ZWxzLCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyksICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyksIDcsICJHTGludCIsIHgsICJHTGludCIsIHksICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xlbnVtIiwgZm9ybWF0LCAiR0xlbnVtIiwgdHlwZSwgIkdMdm9pZCAqIiwgcGl4ZWxzKQotVFJBQ0VfR0xfVk9JRChnbFJlYWRuUGl4ZWxzRVhULCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHNpemVpIGJ1ZlNpemUsIHZvaWQgKmRhdGEpLCAoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBidWZTaXplLCBkYXRhKSwgOCwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTGVudW0iLCBmb3JtYXQsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIGJ1ZlNpemUsICJ2b2lkICoiLCBkYXRhKQotVFJBQ0VfR0xfVk9JRChnbFJlbGVhc2VTaGFkZXJDb21waWxlciwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSwgNCwgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIGludGVybmFsZm9ybWF0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCkKLVRSQUNFX0dMX1ZPSUQoZ2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVBTkdMRSwgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgc2FtcGxlcywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0YXJnZXQsIHNhbXBsZXMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBzYW1wbGVzLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0KQotVFJBQ0VfR0xfVk9JRChnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUFQUExFLCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIHNhbXBsZXMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhULCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIHNhbXBsZXMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlSU1HLCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBzYW1wbGVzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KSwgKHRhcmdldCwgc2FtcGxlcywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA1LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xzaXplaSIsIHNhbXBsZXMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUywgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsUmVzb2x2ZU11bHRpc2FtcGxlRnJhbWVidWZmZXJBUFBMRSwgKHZvaWQpLCAoKSwgMCkKLVRSQUNFX0dMX1ZPSUQoZ2xSb3RhdGVmLCAoR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksIChhbmdsZSwgeCwgeSwgeiksIDQsICJHTGZsb2F0IiwgYW5nbGUsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsUm90YXRleCwgKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopLCAoYW5nbGUsIHgsIHksIHopLCA0LCAiR0xmaXhlZCIsIGFuZ2xlLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFJvdGF0ZXhPRVMsIChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKGFuZ2xlLCB4LCB5LCB6KSwgNCwgIkdMZml4ZWQiLCBhbmdsZSwgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xTYW1wbGVDb3ZlcmFnZSwgKEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0KSwgKHZhbHVlLCBpbnZlcnQpLCAyLCAiR0xjbGFtcGYiLCB2YWx1ZSwgIkdMYm9vbGVhbiIsIGludmVydCkKLVRSQUNFX0dMX1ZPSUQoZ2xTYW1wbGVDb3ZlcmFnZXgsIChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCksICh2YWx1ZSwgaW52ZXJ0KSwgMiwgIkdMY2xhbXB4IiwgdmFsdWUsICJHTGJvb2xlYW4iLCBpbnZlcnQpCi1UUkFDRV9HTF9WT0lEKGdsU2FtcGxlQ292ZXJhZ2V4T0VTLCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpLCAodmFsdWUsIGludmVydCksIDIsICJHTGNsYW1weCIsIHZhbHVlLCAiR0xib29sZWFuIiwgaW52ZXJ0KQotVFJBQ0VfR0xfVk9JRChnbFNjYWxlZiwgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopLCAoeCwgeSwgeiksIDMsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5LCAiR0xmbG9hdCIsIHopCi1UUkFDRV9HTF9WT0lEKGdsU2NhbGV4LCAoR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiksICh4LCB5LCB6KSwgMywgIkdMZml4ZWQiLCB4LCAiR0xmaXhlZCIsIHksICJHTGZpeGVkIiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xTY2FsZXhPRVMsIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKHgsIHksIHopLCAzLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFNjaXNzb3IsIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgNCwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsU2VsZWN0UGVyZk1vbml0b3JDb3VudGVyc0FNRCwgKEdMdWludCBtb25pdG9yLCBHTGJvb2xlYW4gZW5hYmxlLCBHTHVpbnQgZ3JvdXAsIEdMaW50IG51bUNvdW50ZXJzLCBHTHVpbnQgKmNvdW50ZXJzTGlzdCksIChtb25pdG9yLCBlbmFibGUsIGdyb3VwLCBudW1Db3VudGVycywgY291bnRlcnNMaXN0KSwgNSwgIkdMdWludCIsIG1vbml0b3IsICJHTGJvb2xlYW4iLCBlbmFibGUsICJHTHVpbnQiLCBncm91cCwgIkdMaW50IiwgbnVtQ291bnRlcnMsICJHTHVpbnQgKiIsIGNvdW50ZXJzTGlzdCkKLVRSQUNFX0dMX1ZPSUQoZ2xTZXRGZW5jZU5WLCAoR0x1aW50IGZlbmNlLCBHTGVudW0gY29uZGl0aW9uKSwgKGZlbmNlLCBjb25kaXRpb24pLCAyLCAiR0x1aW50IiwgZmVuY2UsICJHTGVudW0iLCBjb25kaXRpb24pCi1UUkFDRV9HTF9WT0lEKGdsU2hhZGVNb2RlbCwgKEdMZW51bSBtb2RlKSwgKG1vZGUpLCAxLCAiR0xlbnVtIiwgbW9kZSkKLVRSQUNFX0dMX1ZPSUQoZ2xTaGFkZXJCaW5hcnksIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCogc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkKiBiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoKSwgKG4sIHNoYWRlcnMsIGJpbmFyeWZvcm1hdCwgYmluYXJ5LCBsZW5ndGgpLCA1LCAiR0xzaXplaSIsIG4sICJjb25zdCBHTHVpbnQqIiwgc2hhZGVycywgIkdMZW51bSIsIGJpbmFyeWZvcm1hdCwgImNvbnN0IEdMdm9pZCoiLCBiaW5hcnksICJHTHNpemVpIiwgbGVuZ3RoKQotVFJBQ0VfR0xfVk9JRChnbFNoYWRlclNvdXJjZSwgKEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMY2hhcioqIHN0cmluZywgY29uc3QgR0xpbnQqIGxlbmd0aCksIChzaGFkZXIsIGNvdW50LCBzdHJpbmcsIGxlbmd0aCksIDQsICJHTHVpbnQiLCBzaGFkZXIsICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGNoYXIqKiIsIHN0cmluZywgImNvbnN0IEdMaW50KiIsIGxlbmd0aCkKLVRSQUNFX0dMX1ZPSUQoZ2xTdGFydFRpbGluZ1FDT00sIChHTHVpbnQgeCwgR0x1aW50IHksIEdMdWludCB3aWR0aCwgR0x1aW50IGhlaWdodCwgR0xiaXRmaWVsZCBwcmVzZXJ2ZU1hc2spLCAoeCwgeSwgd2lkdGgsIGhlaWdodCwgcHJlc2VydmVNYXNrKSwgNSwgIkdMdWludCIsIHgsICJHTHVpbnQiLCB5LCAiR0x1aW50Iiwgd2lkdGgsICJHTHVpbnQiLCBoZWlnaHQsICJHTGJpdGZpZWxkIiwgcHJlc2VydmVNYXNrKQotVFJBQ0VfR0xfVk9JRChnbFN0ZW5jaWxGdW5jLCAoR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2spLCAoZnVuYywgcmVmLCBtYXNrKSwgMywgIkdMZW51bSIsIGZ1bmMsICJHTGludCIsIHJlZiwgIkdMdWludCIsIG1hc2spCi1UUkFDRV9HTF9WT0lEKGdsU3RlbmNpbEZ1bmNTZXBhcmF0ZSwgKEdMZW51bSBmYWNlLCBHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayksIChmYWNlLCBmdW5jLCByZWYsIG1hc2spLCA0LCAiR0xlbnVtIiwgZmFjZSwgIkdMZW51bSIsIGZ1bmMsICJHTGludCIsIHJlZiwgIkdMdWludCIsIG1hc2spCi1UUkFDRV9HTF9WT0lEKGdsU3RlbmNpbE1hc2ssIChHTHVpbnQgbWFzayksIChtYXNrKSwgMSwgIkdMdWludCIsIG1hc2spCi1UUkFDRV9HTF9WT0lEKGdsU3RlbmNpbE1hc2tTZXBhcmF0ZSwgKEdMZW51bSBmYWNlLCBHTHVpbnQgbWFzayksIChmYWNlLCBtYXNrKSwgMiwgIkdMZW51bSIsIGZhY2UsICJHTHVpbnQiLCBtYXNrKQotVFJBQ0VfR0xfVk9JRChnbFN0ZW5jaWxPcCwgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyksIChmYWlsLCB6ZmFpbCwgenBhc3MpLCAzLCAiR0xlbnVtIiwgZmFpbCwgIkdMZW51bSIsIHpmYWlsLCAiR0xlbnVtIiwgenBhc3MpCi1UUkFDRV9HTF9WT0lEKGdsU3RlbmNpbE9wU2VwYXJhdGUsIChHTGVudW0gZmFjZSwgR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKSwgKGZhY2UsIGZhaWwsIHpmYWlsLCB6cGFzcyksIDQsICJHTGVudW0iLCBmYWNlLCAiR0xlbnVtIiwgZmFpbCwgIkdMZW51bSIsIHpmYWlsLCAiR0xlbnVtIiwgenBhc3MpCi1UUkFDRV9HTChHTGJvb2xlYW4sIGdsVGVzdEZlbmNlTlYsIChHTHVpbnQgZmVuY2UpLCAoZmVuY2UpLCAxLCAiR0x1aW50IiwgZmVuY2UpCi1UUkFDRV9HTF9WT0lEKGdsVGV4Q29vcmRQb2ludGVyLCAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpLCAoc2l6ZSwgdHlwZSwgc3RyaWRlLCBwb2ludGVyKSwgNCwgIkdMaW50Iiwgc2l6ZSwgIkdMZW51bSIsIHR5cGUsICJHTHNpemVpIiwgc3RyaWRlLCAiY29uc3QgR0x2b2lkICoiLCBwb2ludGVyKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudmYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52ZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52aSwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudml2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4RW52eCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhFbnZ4T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleEVudnh2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleEdlbmZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSksIChjb29yZCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuZnZPRVMsIChHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VuaU9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSksIChjb29yZCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIGNvb3JkLCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleEdlbml2T0VTLCAoR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4R2VueE9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKGNvb3JkLCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhHZW54dk9FUywgKEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAoY29vcmQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgY29vcmQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMZml4ZWQgKiIsIHBhcmFtcykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhJbWFnZTJELCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpLCAodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpLCA5LCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xpbnQiLCBsZXZlbCwgIkdMaW50IiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xpbnQiLCBib3JkZXIsICJHTGVudW0iLCBmb3JtYXQsICJHTGVudW0iLCB0eXBlLCAiY29uc3QgR0x2b2lkICoiLCBwaXhlbHMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4SW1hZ2UzRE9FUywgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQqIHBpeGVscyksICh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpLCAxMCwgIkdMZW51bSIsIHRhcmdldCwgIkdMaW50IiwgbGV2ZWwsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQsICJHTHNpemVpIiwgZGVwdGgsICJHTGludCIsIGJvcmRlciwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJjb25zdCBHTHZvaWQqIiwgcGl4ZWxzKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcmYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGZsb2F0IiwgcGFyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyZnYsIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyksICh0YXJnZXQsIHBuYW1lLCBwYXJhbXMpLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJjb25zdCBHTGZsb2F0ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyaSwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0pLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW0pLCAzLCAiR0xlbnVtIiwgdGFyZ2V0LCAiR0xlbnVtIiwgcG5hbWUsICJHTGludCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcml2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtcyksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgImNvbnN0IEdMaW50ICoiLCBwYXJhbXMpCi1UUkFDRV9HTF9WT0lEKGdsVGV4UGFyYW1ldGVyeCwgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSksICh0YXJnZXQsIHBuYW1lLCBwYXJhbSksIDMsICJHTGVudW0iLCB0YXJnZXQsICJHTGVudW0iLCBwbmFtZSwgIkdMZml4ZWQiLCBwYXJhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhQYXJhbWV0ZXJ4T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKSwgKHRhcmdldCwgcG5hbWUsIHBhcmFtKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiR0xmaXhlZCIsIHBhcmFtKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcnh2LCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleFBhcmFtZXRlcnh2T0VTLCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpLCAodGFyZ2V0LCBwbmFtZSwgcGFyYW1zKSwgMywgIkdMZW51bSIsIHRhcmdldCwgIkdMZW51bSIsIHBuYW1lLCAiY29uc3QgR0xmaXhlZCAqIiwgcGFyYW1zKQotVFJBQ0VfR0xfVk9JRChnbFRleFN0b3JhZ2UxREVYVCwgKEdMZW51bSB0YXJnZXQsIEdMc2l6ZWkgbGV2ZWxzLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgpLCAodGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCksIDQsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgbGV2ZWxzLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgpCi1UUkFDRV9HTF9WT0lEKGdsVGV4U3RvcmFnZTJERVhULCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpLCAodGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KSwgNSwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBsZXZlbHMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsVGV4U3RvcmFnZTNERVhULCAoR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMc2l6ZWkgZGVwdGgpLCAodGFyZ2V0LCBsZXZlbHMsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCksIDYsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgbGV2ZWxzLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoKQotVFJBQ0VfR0xfVk9JRChnbFRleFN1YkltYWdlMkQsIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyksICh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyksIDksICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJjb25zdCBHTHZvaWQgKiIsIHBpeGVscykKLVRSQUNFX0dMX1ZPSUQoZ2xUZXhTdWJJbWFnZTNET0VTLCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHpvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTHNpemVpIGRlcHRoLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkKiBwaXhlbHMpLCAodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNldCwgem9mZnNldCwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKSwgMTEsICJHTGVudW0iLCB0YXJnZXQsICJHTGludCIsIGxldmVsLCAiR0xpbnQiLCB4b2Zmc2V0LCAiR0xpbnQiLCB5b2Zmc2V0LCAiR0xpbnQiLCB6b2Zmc2V0LCAiR0xzaXplaSIsIHdpZHRoLCAiR0xzaXplaSIsIGhlaWdodCwgIkdMc2l6ZWkiLCBkZXB0aCwgIkdMZW51bSIsIGZvcm1hdCwgIkdMZW51bSIsIHR5cGUsICJjb25zdCBHTHZvaWQqIiwgcGl4ZWxzKQotVFJBQ0VfR0xfVk9JRChnbFRleHR1cmVTdG9yYWdlMURFWFQsIChHTHVpbnQgdGV4dHVyZSwgR0xlbnVtIHRhcmdldCwgR0xzaXplaSBsZXZlbHMsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCksICh0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoKSwgNSwgIkdMdWludCIsIHRleHR1cmUsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgbGV2ZWxzLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgpCi1UUkFDRV9HTF9WT0lEKGdsVGV4dHVyZVN0b3JhZ2UyREVYVCwgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpLCA2LCAiR0x1aW50IiwgdGV4dHVyZSwgIkdMZW51bSIsIHRhcmdldCwgIkdMc2l6ZWkiLCBsZXZlbHMsICJHTGVudW0iLCBpbnRlcm5hbGZvcm1hdCwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsVGV4dHVyZVN0b3JhZ2UzREVYVCwgKEdMdWludCB0ZXh0dXJlLCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpIGxldmVscywgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xzaXplaSBkZXB0aCksICh0ZXh0dXJlLCB0YXJnZXQsIGxldmVscywgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGRlcHRoKSwgNywgIkdMdWludCIsIHRleHR1cmUsICJHTGVudW0iLCB0YXJnZXQsICJHTHNpemVpIiwgbGV2ZWxzLCAiR0xlbnVtIiwgaW50ZXJuYWxmb3JtYXQsICJHTHNpemVpIiwgd2lkdGgsICJHTHNpemVpIiwgaGVpZ2h0LCAiR0xzaXplaSIsIGRlcHRoKQotVFJBQ0VfR0xfVk9JRChnbFRyYW5zbGF0ZWYsIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKHgsIHksIHopLCAzLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFRyYW5zbGF0ZXgsIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKHgsIHksIHopLCAzLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFRyYW5zbGF0ZXhPRVMsIChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KSwgKHgsIHksIHopLCAzLCAiR0xmaXhlZCIsIHgsICJHTGZpeGVkIiwgeSwgIkdMZml4ZWQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0xZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgpLCAobG9jYXRpb24sIHgpLCAyLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQiLCB4KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0xZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMZmxvYXQqIiwgdikKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtMWksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCksIChsb2NhdGlvbiwgeCksIDIsICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0xaXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSwgMywgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0yZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSksIChsb2NhdGlvbiwgeCwgeSksIDMsICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSkKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtMmZ2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSwgMywgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGZsb2F0KiIsIHYpCi1UUkFDRV9HTF9WT0lEKGdsVW5pZm9ybTJpLCAoR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkpLCAobG9jYXRpb24sIHgsIHkpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSkKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtMml2LCAoR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50KiB2KSwgKGxvY2F0aW9uLCBjb3VudCwgdiksIDMsICJHTGludCIsIGxvY2F0aW9uLCAiR0xzaXplaSIsIGNvdW50LCAiY29uc3QgR0xpbnQqIiwgdikKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtM2YsIChHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiksIChsb2NhdGlvbiwgeCwgeSwgeiksIDQsICJHTGludCIsIGxvY2F0aW9uLCAiR0xmbG9hdCIsIHgsICJHTGZsb2F0IiwgeSwgIkdMZmxvYXQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0zZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMZmxvYXQqIiwgdikKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtM2ksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiksIChsb2NhdGlvbiwgeCwgeSwgeiksIDQsICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xpbnQiLCB6KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm0zaXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSwgMywgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm00ZiwgKEdMaW50IGxvY2F0aW9uLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcpLCAobG9jYXRpb24sIHgsIHksIHosIHcpLCA1LCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeiwgIkdMZmxvYXQiLCB3KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm00ZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xmbG9hdCogdiksIChsb2NhdGlvbiwgY291bnQsIHYpLCAzLCAiR0xpbnQiLCBsb2NhdGlvbiwgIkdMc2l6ZWkiLCBjb3VudCwgImNvbnN0IEdMZmxvYXQqIiwgdikKLVRSQUNFX0dMX1ZPSUQoZ2xVbmlmb3JtNGksIChHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgdyksIChsb2NhdGlvbiwgeCwgeSwgeiwgdyksIDUsICJHTGludCIsIGxvY2F0aW9uLCAiR0xpbnQiLCB4LCAiR0xpbnQiLCB5LCAiR0xpbnQiLCB6LCAiR0xpbnQiLCB3KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm00aXYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQqIHYpLCAobG9jYXRpb24sIGNvdW50LCB2KSwgMywgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJjb25zdCBHTGludCoiLCB2KQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm1NYXRyaXgyZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpLCAobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSwgNCwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJHTGJvb2xlYW4iLCB0cmFuc3Bvc2UsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm1NYXRyaXgzZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpLCAobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSwgNCwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJHTGJvb2xlYW4iLCB0cmFuc3Bvc2UsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlKQotVFJBQ0VfR0xfVk9JRChnbFVuaWZvcm1NYXRyaXg0ZnYsIChHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCogdmFsdWUpLCAobG9jYXRpb24sIGNvdW50LCB0cmFuc3Bvc2UsIHZhbHVlKSwgNCwgIkdMaW50IiwgbG9jYXRpb24sICJHTHNpemVpIiwgY291bnQsICJHTGJvb2xlYW4iLCB0cmFuc3Bvc2UsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlKQotVFJBQ0VfR0woR0xib29sZWFuLCBnbFVubWFwQnVmZmVyT0VTLCAoR0xlbnVtIHRhcmdldCksICh0YXJnZXQpLCAxLCAiR0xlbnVtIiwgdGFyZ2V0KQotVFJBQ0VfR0xfVk9JRChnbFVzZVByb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSwgMSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVXNlUHJvZ3JhbVN0YWdlc0VYVCwgKEdMdWludCBwaXBlbGluZSwgR0xiaXRmaWVsZCBzdGFnZXMsIEdMdWludCBwcm9ncmFtKSwgKHBpcGVsaW5lLCBzdGFnZXMsIHByb2dyYW0pLCAzLCAiR0x1aW50IiwgcGlwZWxpbmUsICJHTGJpdGZpZWxkIiwgc3RhZ2VzLCAiR0x1aW50IiwgcHJvZ3JhbSkKLVRSQUNFX0dMX1ZPSUQoZ2xWYWxpZGF0ZVByb2dyYW0sIChHTHVpbnQgcHJvZ3JhbSksIChwcm9ncmFtKSwgMSwgIkdMdWludCIsIHByb2dyYW0pCi1UUkFDRV9HTF9WT0lEKGdsVmFsaWRhdGVQcm9ncmFtUGlwZWxpbmVFWFQsIChHTHVpbnQgcGlwZWxpbmUpLCAocGlwZWxpbmUpLCAxLCAiR0x1aW50IiwgcGlwZWxpbmUpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4QXR0cmliMWYsIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4KSwgKGluZHgsIHgpLCAyLCAiR0x1aW50IiwgaW5keCwgIkdMZmxvYXQiLCB4KQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYjFmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSwgMiwgIkdMdWludCIsIGluZHgsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlcykKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhBdHRyaWIyZiwgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSksIChpbmR4LCB4LCB5KSwgMywgIkdMdWludCIsIGluZHgsICJHTGZsb2F0IiwgeCwgIkdMZmxvYXQiLCB5KQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYjJmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSwgMiwgIkdMdWludCIsIGluZHgsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlcykKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhBdHRyaWIzZiwgKEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KSwgKGluZHgsIHgsIHksIHopLCA0LCAiR0x1aW50IiwgaW5keCwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeikKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhBdHRyaWIzZnYsIChHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCogdmFsdWVzKSwgKGluZHgsIHZhbHVlcyksIDIsICJHTHVpbnQiLCBpbmR4LCAiY29uc3QgR0xmbG9hdCoiLCB2YWx1ZXMpCi1UUkFDRV9HTF9WT0lEKGdsVmVydGV4QXR0cmliNGYsIChHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3KSwgKGluZHgsIHgsIHksIHosIHcpLCA1LCAiR0x1aW50IiwgaW5keCwgIkdMZmxvYXQiLCB4LCAiR0xmbG9hdCIsIHksICJHTGZsb2F0IiwgeiwgIkdMZmxvYXQiLCB3KQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleEF0dHJpYjRmdiwgKEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0KiB2YWx1ZXMpLCAoaW5keCwgdmFsdWVzKSwgMiwgIkdMdWludCIsIGluZHgsICJjb25zdCBHTGZsb2F0KiIsIHZhbHVlcykKLVRSQUNFX0dMX1ZPSUQoZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyLCAoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCogcHRyKSwgKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcHRyKSwgNiwgIkdMdWludCIsIGluZHgsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xib29sZWFuIiwgbm9ybWFsaXplZCwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQqIiwgcHRyKQotVFJBQ0VfR0xfVk9JRChnbFZlcnRleFBvaW50ZXIsIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciksIChzaXplLCB0eXBlLCBzdHJpZGUsIHBvaW50ZXIpLCA0LCAiR0xpbnQiLCBzaXplLCAiR0xlbnVtIiwgdHlwZSwgIkdMc2l6ZWkiLCBzdHJpZGUsICJjb25zdCBHTHZvaWQgKiIsIHBvaW50ZXIpCi1UUkFDRV9HTF9WT0lEKGdsVmlld3BvcnQsIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCksICh4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgNCwgIkdMaW50IiwgeCwgIkdMaW50IiwgeSwgIkdMc2l6ZWkiLCB3aWR0aCwgIkdMc2l6ZWkiLCBoZWlnaHQpCi1UUkFDRV9HTF9WT0lEKGdsV2VpZ2h0UG9pbnRlck9FUywgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKSwgKHNpemUsIHR5cGUsIHN0cmlkZSwgcG9pbnRlciksIDQsICJHTGludCIsIHNpemUsICJHTGVudW0iLCB0eXBlLCAiR0xzaXplaSIsIHN0cmlkZSwgImNvbnN0IEdMdm9pZCAqIiwgcG9pbnRlcikKZGlmZiAtLWdpdCBhL29wZW5nbC9zcGVjcy9FR0xfQU5EUk9JRF9ibG9iX2NhY2hlLnR4dCBiL29wZW5nbC9zcGVjcy9FR0xfQU5EUk9JRF9ibG9iX2NhY2hlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmNDVkMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvc3BlY3MvRUdMX0FORFJPSURfYmxvYl9jYWNoZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotTmFtZQotCi0gICAgQU5EUk9JRF9ibG9iX2NhY2hlCi0KLU5hbWUgU3RyaW5ncwotCi0gICAgRUdMX0FORFJPSURfYmxvYl9jYWNoZQotCi1Db250cmlidXRvcnMKLQotICAgIEphbWllIEdlbm5pcwotCi1Db250YWN0Ci0KLSAgICBKYW1pZSBHZW5uaXMsIEdvb2dsZSBJbmMuIChqZ2VubmlzICdhdCcgZ29vZ2xlLmNvbSkKLQotU3RhdHVzCi0KLSAgICBEcmFmdC4KLQotVmVyc2lvbgotCi0gICAgVmVyc2lvbiAxLCBBcHJpbCAyMiwgMjAxMQotCi1OdW1iZXIKLQotICAgIEVHTCBFeHRlbnNpb24gI1hYWAotCi1EZXBlbmRlbmNpZXMKLQotICAgIFJlcXVpcmVzIEVHTCAxLjAKLQotICAgIFRoaXMgZXh0ZW5zaW9uIGlzIHdyaXR0ZW4gYWdhaW5zdCB0aGUgd29yZGluZyBvZiB0aGUgRUdMIDEuNCBTcGVjaWZpY2F0aW9uCi0KLU92ZXJ2aWV3Ci0KLSAgICBTaGFkZXIgY29tcGlsYXRpb24gYW5kIG9wdGltaXphdGlvbiBoYXMgYmVlbiBhIHRyb3VibGVzb21lIGFzcGVjdCBvZiBPcGVuR0wKLSAgICBwcm9ncmFtbWluZyBmb3IgYSBsb25nIHRpbWUuICBJdCBjYW4gY29uc3VtZSBzZWNvbmRzIG9mIENQVSBjeWNsZXMgZHVyaW5nCi0gICAgYXBwbGljYXRpb24gc3RhcnQtdXAuICBBZGRpdGlvbmFsbHksIHN0YXRlLWJhc2VkIHJlLWNvbXBpbGVzIGRvbmUKLSAgICBpbnRlcm5hbGx5IGJ5IHRoZSBkcml2ZXJzIGFkZCBhbiB1bnByZWRpY3RhYmxlIGVsZW1lbnQgdG8gYXBwbGljYXRpb24KLSAgICBwZXJmb3JtYW5jZSB0dW5pbmcsIG9mdGVuIGxlYWRpbmcgdG8gb2NjYXNpb25hbCBwYXVzZXMgaW4gb3RoZXJ3aXNlIHNtb290aAotICAgIGFuaW1hdGlvbnMuCi0KLSAgICBUaGlzIGV4dGVuc2lvbiBwcm92aWRlcyBhIG1lY2hhbmlzbSB0aHJvdWdoIHdoaWNoIGNsaWVudCBBUEkKLSAgICBpbXBsZW1lbnRhdGlvbnMgbWF5IGNhY2hlIHNoYWRlciBiaW5hcmllcyBhZnRlciB0aGV5IGFyZSBjb21waWxlZC4gIEl0IG1heQotICAgIHRoZW4gcmV0cmlldmUgdGhvc2UgY2FjaGVkIHNoYWRlcnMgZHVyaW5nIHN1YnNlcXVlbnQgZXhlY3V0aW9ucyBvZiB0aGUgc2FtZQotICAgIHByb2dyYW0uICBUaGUgbWFuYWdlbWVudCBvZiB0aGUgY2FjaGUgaXMgaGFuZGxlZCBieSB0aGUgYXBwbGljYXRpb24gKG9yCi0gICAgbWlkZGxld2FyZSksIGFsbG93aW5nIGl0IHRvIGJlIHR1bmVkIHRvIGEgcGFydGljdWxhciBwbGF0Zm9ybSBvcgotICAgIGVudmlyb25tZW50LgotCi0gICAgV2hpbGUgdGhlIGZvY3VzIG9mIHRoaXMgZXh0ZW5zaW9uIGlzIG9uIHByb3ZpZGluZyBhIHBlcnNpc3RlbnQgY2FjaGUgZm9yCi0gICAgc2hhZGVyIGJpbmFyaWVzLCBpdCBtYXkgYWxzbyBiZSB1c2VmdWwgZm9yIGNhY2hpbmcgb3RoZXIgZGF0YS4gIFRoaXMgaXMKLSAgICBwZXJmZWN0bHkgYWNjZXB0YWJsZSwgYnV0IHRoZSBndWFyYW50ZWVzIHByb3ZpZGVkIChvciBsYWNrIHRoZXJlb2YpIHdlcmUKLSAgICBkZXNpZ25lZCBhcm91bmQgdGhlIHNoYWRlciB1c2UgY2FzZS4KLQotICAgIE5vdGUgdGhhdCBhbHRob3VnaCB0aGlzIGV4dGVuc2lvbiBpcyB3cml0dGVuIGFzIGlmIHRoZSBhcHBsaWNhdGlvbgotICAgIGltcGxlbWVudHMgdGhlIGNhY2hpbmcgZnVuY3Rpb25hbGl0eSwgb24gdGhlIEFuZHJvaWQgT1MgaXQgaXMgaW1wbGVtZW50ZWQKLSAgICBhcyBwYXJ0IG9mIHRoZSBBbmRyb2lkIEVHTCBtb2R1bGUuICBUaGlzIGV4dGVuc2lvbiBpcyBub3QgZXhwb3NlZCB0bwotICAgIGFwcGxpY2F0aW9ucyBvbiBBbmRyb2lkLCBidXQgd2lsbCBiZSB1c2VkIGF1dG9tYXRpY2FsbHkgaW4gZXZlcnkKLSAgICBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgRUdMIGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgdW5kZXJseWluZwotICAgIGRldmljZS1zcGVjaWZpYyBFR0wgaW1wbGVtZW50YXRpb24uCi0KLU5ldyBUeXBlcwotCi0gICAgLyoKLSAgICAgKiBFR0xzaXplaUFORFJPSUQgaXMgYSBzaWduZWQgaW50ZWdlciB0eXBlIGZvciByZXByZXNlbnRpbmcgdGhlIHNpemUgb2YgYQotICAgICAqIG1lbW9yeSBidWZmZXIuCi0gICAgICovCi0gICAgI2luY2x1ZGUgPGtocnBsYXRmb3JtLmg+Ci0gICAgdHlwZWRlZiBraHJvbm9zX3NzaXplX3QgRUdMc2l6ZWlBTkRST0lEOwotCi0gICAgLyoKLSAgICAgKiBFR0xTZXRCbG9iRnVuYyBpcyBhIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24tcHJvdmlkZWQgZnVuY3Rpb24gdGhhdCBhCi0gICAgICogY2xpZW50IEFQSSBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIHRvIGluc2VydCBhIGtleS92YWx1ZSBwYWlyIGludG8gdGhlCi0gICAgICogY2FjaGUuCi0gICAgICovCi0gICAgdHlwZWRlZiB2b2lkICgqRUdMU2V0QmxvYkZ1bmNBTkRST0lEKSAoY29uc3Qgdm9pZCoga2V5LAotICAgICAgICBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwgY29uc3Qgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpCi0KLSAgICAvKgotICAgICAqIEVHTEdldEJsb2JGdW5jIGlzIGEgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBmdW5jdGlvbiB0aGF0IGEKLSAgICAgKiBjbGllbnQgQVBJIGltcGxlbWVudGF0aW9uIG1heSB1c2UgdG8gcmV0cmlldmUgYSBjYWNoZWQgdmFsdWUgZnJvbSB0aGUKLSAgICAgKiBjYWNoZS4KLSAgICAgKi8KLSAgICB0eXBlZGVmIEVHTHNpemVpQU5EUk9JRCAoKkVHTEdldEJsb2JGdW5jQU5EUk9JRCkgKGNvbnN0IHZvaWQqIGtleSwKLSAgICAgICAgRUdMc2l6ZWlBTkRST0lEIGtleVNpemUsIHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKQotCi1OZXcgUHJvY2VkdXJlcyBhbmQgRnVuY3Rpb25zCi0KLSAgICB2b2lkIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRChFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xTZXRCbG9iRnVuYyBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMR2V0QmxvYkZ1bmMgZ2V0KTsKLQotTmV3IFRva2VucwotCi0gICAgTm9uZS4KLQotQ2hhbmdlcyB0byBDaGFwdGVyIDMgb2YgdGhlIEVHTCAxLjQgU3BlY2lmaWNhdGlvbiAoRUdMIEZ1bmN0aW9ucyBhbmQgRXJyb3JzKQotCi0gICAgQWRkIGEgbmV3IHN1YnNlY3Rpb24gYWZ0ZXIgU2VjdGlvbiAzLjgsIHBhZ2UgNTAKLSAgICAoU3luY2hyb25pemF0aW9uIFByaW1pdGl2ZXMpCi0KLSAgICAiMy45IFBlcnNpc3RlbnQgQ2FjaGluZwotCi0gICAgSW4gb3JkZXIgdG8gZmFjaWxpdGF0ZSBwZXJzaXN0ZW50IGNhY2hpbmcgb2YgaW50ZXJuYWwgY2xpZW50IEFQSSBzdGF0ZSB0aGF0Ci0gICAgaXMgc2xvdyB0byBjb21wdXRlIG9yIGNvbGxlY3QsIHRoZSBhcHBsaWNhdGlvbiBtYXkgc3BlY2lmeSBjYWxsYmFjawotICAgIGZ1bmN0aW9uIHBvaW50ZXJzIHRocm91Z2ggd2hpY2ggdGhlIGNsaWVudCBBUElzIGNhbiByZXF1ZXN0IGRhdGEgYmUgY2FjaGVkCi0gICAgYW5kIHJldHJpZXZlZC4gIFRoZSBjb21tYW5kCi0KLSAgICAgICAgdm9pZCBlZ2xTZXRCbG9iQ2FjaGVGdW5jc0FORFJPSUQoRUdMRGlzcGxheSBkcHksCi0gICAgICAgICAgICBFR0xTZXRCbG9iRnVuY0FORFJPSUQgc2V0LCBFR0xHZXRCbG9iRnVuY0FORFJPSUQgZ2V0KTsKLQotICAgIHNldHMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgY2xpZW50IEFQSXMgYXNzb2NpYXRlZCB3aXRoCi0gICAgZGlzcGxheSA8ZHB5PiBjYW4gdXNlIHRvIGludGVyYWN0IHdpdGggY2FjaGluZyBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5Ci0gICAgdGhlIGFwcGxpY2F0aW9uLiAgPHNldD4gcG9pbnRzIHRvIGEgZnVuY3Rpb24gdGhhdCBpbnNlcnRzIGEgbmV3IHZhbHVlIGludG8KLSAgICB0aGUgY2FjaGUgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCB0aGUgZ2l2ZW4ga2V5LiAgPGdldD4gcG9pbnRzIHRvIGEgZnVuY3Rpb24KLSAgICB0aGF0IHJldHJpZXZlcyBmcm9tIHRoZSBjYWNoZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LiAgVGhlCi0gICAgc2VtYW50aWNzIG9mIHRoZXNlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcmUgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy45LjEgKENhY2hlCi0gICAgT3BlcmF0aW9ucykuCi0KLSAgICBDYWNoZSBmdW5jdGlvbnMgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIG9uY2UgZHVyaW5nIHRoZSBsaWZldGltZSBvZiBhbgotICAgIEVHTERpc3BsYXkuICBUaGUgPHNldD4gYW5kIDxnZXQ+IGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFuZAotICAgIGZyb20gYW55IHRocmVhZCBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCBpcwotICAgIGNhbGxlZCB1bnRpbCB0aGUgdGltZSB0aGF0IHRoZSBsYXN0IHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCA8ZHB5PiBpcwotICAgIGRlbGV0ZWQgYW5kIDxkcHk+IGl0c2VsZiBpcyB0ZXJtaW5hdGVkLiAgQ29uY3VycmVudCBjYWxscyB0byB0aGVzZQotICAgIGZ1bmN0aW9ucyBmcm9tIGRpZmZlcmVudCB0aHJlYWRzIGlzIGFsc28gYWxsb3dlZC4KLQotICAgIElmIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCBnZW5lcmF0ZXMgYW4gZXJyb3IgdGhlbiBhbGwgY2xpZW50IEFQSXMgbXVzdAotICAgIGJlaGF2ZSBhcyB0aG91Z2ggZWdsU2V0QmxvYkNhY2hlRnVuY3NBTkRST0lEIHdhcyBub3QgY2FsbGVkIGZvciB0aGUgZGlzcGxheQotICAgIDxkcHk+LiAgSWYgPHNldD4gb3IgPGdldD4gaXMgTlVMTCB0aGVuIGFuIEVHTF9CQURfUEFSQU1FVEVSIGVycm9yIGlzCi0gICAgZ2VuZXJhdGVkLiAgSWYgYSBzdWNjZXNzZnVsIGVnbFNldEJsb2JDYWNoZUZ1bmNzQU5EUk9JRCBjYWxsIHdhcyBhbHJlYWR5Ci0gICAgbWFkZSBmb3IgPGRweT4gYW5kIHRoZSBkaXNwbGF5IGhhcyBub3Qgc2luY2UgYmVlbiB0ZXJtaW5hdGVkIHRoZW4gYW4KLSAgICBFR0xfQkFEX1BBUkFNRVRFUiBlcnJvciBpcyBnZW5lcmF0ZWQuCi0KLSAgICAzLjkuMSBDYWNoZSBPcGVyYXRpb25zCi0KLSAgICBUbyBpbnNlcnQgYSBuZXcgYmluYXJ5IHZhbHVlIGludG8gdGhlIGNhY2hlIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBhIGdpdmVuCi0gICAga2V5LCBhIGNsaWVudCBBUEkgaW1wbGVtZW50YXRpb24gY2FuIGNhbGwgdGhlIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGNhbGxiYWNrCi0gICAgZnVuY3Rpb24KLQotICAgICAgICB2b2lkICgqc2V0KSAoY29uc3Qgdm9pZCoga2V5LCBFR0xzaXplaUFORFJPSUQga2V5U2l6ZSwKLSAgICAgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlLCBFR0xzaXplaUFORFJPSUQgdmFsdWVTaXplKQotCi0gICAgPGtleT4gYW5kIDx2YWx1ZT4gYXJlIHBvaW50ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGtleSBhbmQgdmFsdWUsCi0gICAgcmVzcGVjdGl2ZWx5LCB0aGF0IGFyZSB0byBiZSBpbnNlcnRlZC4gIDxrZXlTaXplPiBhbmQgPHZhbHVlU2l6ZT4gc3BlY2lmeQotICAgIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHBvaW50ZWQgdG8gYnkgPGtleT4gYW5kIDx2YWx1ZT4sCi0gICAgcmVzcGVjdGl2ZWx5LgotCi0gICAgTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhcyB0byB3aGV0aGVyIGEgZ2l2ZW4ga2V5L3ZhbHVlIHBhaXIgaXMgcHJlc2VudCBpbgotICAgIHRoZSBjYWNoZSBhZnRlciB0aGUgc2V0IGNhbGwuICBJZiBhIGRpZmZlcmVudCB2YWx1ZSBoYXMgYmVlbiBhc3NvY2lhdGVkCi0gICAgd2l0aCB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBwYXN0IHRoZW4gaXQgaXMgdW5kZWZpbmVkIHdoaWNoIHZhbHVlLCBpZiBhbnksIGlzCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgYWZ0ZXIgdGhlIHNldCBjYWxsLiAgTm90ZSB0aGF0IHdoaWxlIHRoZXJlIGFyZSBubwotICAgIGd1YXJhbnRlZXMsIHRoZSBjYWNoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYXR0ZW1wdCB0byBjYWNoZSB0aGUgbW9zdAotICAgIHJlY2VudGx5IHNldCB2YWx1ZSBmb3IgYSBnaXZlbiBrZXkuCi0KLSAgICBUbyByZXRyaWV2ZSB0aGUgYmluYXJ5IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleSBmcm9tIHRoZSBjYWNoZSwgYQotICAgIGNsaWVudCBBUEkgaW1wbGVtZW50YXRpb24gY2FuIGNhbGwgdGhlIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGNhbGxiYWNrCi0gICAgZnVuY3Rpb24KLQotICAgICAgICBFR0xzaXplaUFORFJPSUQgKCpnZXQpIChjb25zdCB2b2lkKiBrZXksIEVHTHNpemVpQU5EUk9JRCBrZXlTaXplLAotICAgICAgICAgICAgdm9pZCogdmFsdWUsIEVHTHNpemVpQU5EUk9JRCB2YWx1ZVNpemUpCi0KLSAgICA8a2V5PiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5LiAgPGtleVNpemU+IHNwZWNpZmllcyB0aGUKLSAgICBzaXplIGluIGJ5dGVzIG9mIHRoZSBiaW5hcnkga2V5IHBvaW50ZWQgdG8gYnkgPGtleT4uICBJZiB0aGUgY2FjaGUgY29udGFpbnMKLSAgICBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5IHRoZW4gdGhlIHNpemUgb2YgdGhhdCBiaW5hcnkgdmFsdWUgaW4KLSAgICBieXRlcyBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSAwIGlzIHJldHVybmVkLgotCi0gICAgSWYgdGhlIGNhY2hlIGNvbnRhaW5zIGEgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgYW5kIGl0cyBzaXplIGluIGJ5dGVzIGlzCi0gICAgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDx2YWx1ZVNpemU+IHRoZW4gdGhlIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhlIG1lbW9yeQotICAgIHBvaW50ZWQgdG8gYnkgPHZhbHVlPi4gIE90aGVyd2lzZSBub3RoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIG1lbW9yeSBwb2ludGVkCi0gICAgdG8gYnkgPHZhbHVlPi4KLQotSXNzdWVzCi0KLSAgICAxLiBIb3cgc2hvdWxkIGVycm9ycyBiZSBoYW5kbGVkIGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbnM/Ci0KLSAgICBSRVNPTFZFRDogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB0aGUgcHJlc2VuY2Ugb2YgdmFsdWVzIGluIHRoZSBjYWNoZSwKLSAgICBzbyB0aGVyZSBzaG91bGQgbm90IGJlIGEgbmVlZCB0byByZXR1cm4gZXJyb3IgaW5mb3JtYXRpb24gdG8gdGhlIGNsaWVudCBBUEkKLSAgICBpbXBsZW1lbnRhdGlvbi4gIFRoZSBjYWNoZSBpbXBsZW1lbnRhdGlvbiBjYW4gc2ltcGx5IGRyb3AgYSB2YWx1ZSBpZiBpdAotICAgIGVuY291bnRlcnMgYW4gZXJyb3IgZHVyaW5nIHRoZSAnc2V0JyBjYWxsYmFjay4gIFNpbWlsYXJseSwgaXQgY2FuIHNpbXBseQotICAgIHJldHVybiAwIGlmIGl0IGVuY291dGVycyBhbiBlcnJvciBpbiBhICdnZXQnIGNhbGxiYWNrLgotCi0gICAgMi4gV2hlbiBhIGNsaWVudCBBUEkgZHJpdmVyIGdldHMgdXBkYXRlZCwgdGhhdCBtYXkgbmVlZCB0byBpbnZhbGlkYXRlCi0gICAgcHJldmlvdXNseSBjYWNoZWQgZW50cmllcy4gIEhvdyBjYW4gdGhlIGRyaXZlciBoYW5kbGUgdGhpcyBzaXR1YXRpb24/Ci0KLSAgICBSRVNQT05TRTogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHdheXMgdGhlIGRyaXZlciBjYW4gaGFuZGxlIHRoaXMgc2l0dWF0aW9uLgotICAgIFRoZSByZWNvbW1lbmRlZCB3YXkgaXMgdG8gaW5jbHVkZSB0aGUgZHJpdmVyIHZlcnNpb24gaW4gYWxsIGNhY2hlIGtleXMuCi0gICAgVGhhdCB3YXkgZWFjaCBkcml2ZXIgdmVyc2lvbiB3aWxsIHVzZSBhIHNldCBvZiBjYWNoZSBrZXlzIHRoYXQgYXJlIHVuaXF1ZQotICAgIHRvIHRoYXQgdmVyc2lvbiwgYW5kIGNvbmZsaWN0cyBzaG91bGQgbmV2ZXIgb2NjdXIuICBVcGRhdGluZyB0aGUgZHJpdmVyCi0gICAgY291bGQgdGhlbiBsZWF2ZSBhIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIGNhY2hlIHRoYXQgd2lsbCBuZXZlciBiZQotICAgIHJlcXVlc3RlZCBhZ2Fpbi4gIElmIG5lZWRlZCwgdGhlIGNhY2hlIGltcGxlbWVudGF0aW9uIGNhbiBoYW5kbGUgdGhvc2UKLSAgICB2YWx1ZXMgaW4gc29tZSB3YXksIGJ1dCB0aGUgZHJpdmVyIGRvZXMgbm90IG5lZWQgdG8gdGFrZSBhbnkgc3BlY2lhbAotICAgIGFjdGlvbi4KLQotICAgIDMuIEhvdyBtdWNoIGRhdGEgY2FuIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGU/Ci0KLSAgICBSRVNQT05TRTogVGhpcyBpcyBlbnRpcmVseSBkZXBlbmRlbnQgdXBvbiB0aGUgY2FjaGUgaW1wbGVtZW50YXRpb24uCi0gICAgUHJlc3VtYWJseSBpdCB3aWxsIGJlIHR1bmVkIHRvIHN0b3JlIGVub3VnaCBkYXRhIHRvIGJlIHVzZWZ1bCwgYnV0IG5vdAotICAgIGVub3VnaCB0byBiZWNvbWUgcHJvYmxlbWF0aWMuIDopCi0KLVJldmlzaW9uIEhpc3RvcnkKLQotIzIgKEphbWllIEdlbm5pcywgQXByaWwgMjUsIDIwMTEpCi0gICAgLSBTd2FwcGVkIHRoZSBvcmRlciBvZiB0aGUgc2l6ZSBhbmQgcG9pbnRlciBhcmd1bWVudHMgdG8gdGhlIGdldCBhbmQgc2V0Ci0gICAgICBmdW5jdGlvbnMuCi0KLSMxIChKYW1pZSBHZW5uaXMsIEFwcmlsIDIyLCAyMDExKQotICAgIC0gSW5pdGlhbCBkcmFmdC4KZGlmZiAtLWdpdCBhL29wZW5nbC9zcGVjcy9FR0xfQU5EUk9JRF9yZWNvcmRhYmxlLnR4dCBiL29wZW5nbC9zcGVjcy9FR0xfQU5EUk9JRF9yZWNvcmRhYmxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiZDI2Zi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvc3BlY3MvRUdMX0FORFJPSURfcmVjb3JkYWJsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotTmFtZQotCi0gICAgQU5EUk9JRF9yZWNvcmRhYmxlCi0KLU5hbWUgU3RyaW5ncwotCi0gICAgRUdMX0FORFJPSURfcmVjb3JkYWJsZQotCi1Db250cmlidXRvcnMKLQotICAgIEphbWllIEdlbm5pcwotCi1Db250YWN0Ci0KLSAgICBKYW1pZSBHZW5uaXMsIEdvb2dsZSBJbmMuIChqZ2VubmlzICdhdCcgZ29vZ2xlLmNvbSkKLQotU3RhdHVzCi0KLSAgICBEcmFmdC4KLQotVmVyc2lvbgotCi0gICAgVmVyc2lvbiAxLCBKdWx5IDgsIDIwMTEKLQotTnVtYmVyCi0KLSAgICBFR0wgRXh0ZW5zaW9uICNYWFgKLQotRGVwZW5kZW5jaWVzCi0KLSAgICBSZXF1aXJlcyBFR0wgMS4wCi0KLSAgICBUaGlzIGV4dGVuc2lvbiBpcyB3cml0dGVuIGFnYWluc3QgdGhlIHdvcmRpbmcgb2YgdGhlIEVHTCAxLjQgU3BlY2lmaWNhdGlvbgotCi1PdmVydmlldwotCi0gICAgQW5kcm9pZCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgQU5hdGl2ZVdpbmRvdyBpbXBsZW1lbnRhdGlvbnMgdGhhdAotICAgIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBFR0xTdXJmYWNlLiAgT25lIGltcGxlbWVudGF0aW9uLCB3aGljaCByZWNvcmRzIHRoZQotICAgIHJlbmRlcmVkIGltYWdlIGFzIGEgdmlkZW8gZWFjaCB0aW1lIGVnbFN3YXBCdWZmZXJzIGdldHMgY2FsbGVkLCBtYXkgaGF2ZQotICAgIHNvbWUgZGV2aWNlLXNwZWNpZmljIHJlc3RyaWN0aW9ucy4gIEJlY2F1c2Ugb2YgdGhpcywgc29tZSBFR0xDb25maWdzIG1heSBiZQotICAgIGluY29tcGF0aWJsZSB3aXRoIHRoZXNlIEFOYXRpdmVXaW5kb3dzLiAgVGhpcyBleHRlbnNpb24gaW50cm9kdWNlcyBhIG5ldwotICAgIGJvb2xlYW4gRUdMQ29uZmlnIGF0dHJpYnV0ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBFR0xDb25maWcgc3VwcG9ydHMKLSAgICByZW5kZXJpbmcgdG8gYW4gQU5hdGl2ZVdpbmRvdyB0aGF0IHJlY29yZHMgaW1hZ2VzIHRvIGEgdmlkZW8uCi0KLU5ldyBUeXBlcwotCi0gICAgTm9uZS4KLQotTmV3IFByb2NlZHVyZXMgYW5kIEZ1bmN0aW9ucwotCi0gICAgTm9uZS4KLQotTmV3IFRva2VucwotCi0gICAgQWNjZXB0ZWQgYnkgdGhlIDxhdHRyaWJ1dGU+IHBhcmFtZXRlciBvZiBlZ2xHZXRDb25maWdBdHRyaWIgYW5kCi0gICAgdGhlIDxhdHRyaWJfbGlzdD4gcGFyYW1ldGVyIG9mIGVnbENob29zZUNvbmZpZzoKLQotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lEICAgICAgICAgICAgICAgICAgICAgIDB4MzE0MgotCi1DaGFuZ2VzIHRvIENoYXB0ZXIgMyBvZiB0aGUgRUdMIDEuNCBTcGVjaWZpY2F0aW9uIChFR0wgRnVuY3Rpb25zIGFuZCBFcnJvcnMpCi0KLSAgICBTZWN0aW9uIDMuNCwgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50LCBhZGQgYSByb3cgdG8gVGFibGUgMy4xLgotICAgIAotICAgICAgICAgICAgICBBdHRyaWJ1dGUgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgTm90ZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgRUdMX1JFQ09SREFCTEVfQU5EUk9JRCAgICAgYm9vbGVhbiAgICAgd2hldGhlciB2aWRlbyByZWNvcmRpbmcgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkCi0KLSAgICBTZWN0aW9uIDMuNCwgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50LCBhZGQgYSByb3cgdG8gVGFibGUgMy40LgotCi0gICAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgIERlZmF1bHQgICAgIFNlbGVjdGlvbiAgU29ydCAgIFNvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JpdGVyaWEgICBPcmRlciAgUHJpb3JpdHkKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tICAtLS0tLSAgLS0tLS0tLS0KLSAgICAgICAgRUdMX1JFQ09SREFCTEVfQU5EUk9JRCAgRUdMX0RPTlRfQ0FSRSAgICBFeGFjdCAgICBOb25lCi0KLSAgICBTZWN0aW9uIDMuNCwgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50LCBhZGQgYSBwYXJhZ3JhcGggYXQgdGhlIGVuZCBvZiB0aGUKLSAgICBzdWJzZWN0aW9uIHRpdGxlZCBPdGhlciBFR0xDb25maWcgQXR0cmlidXRlIERlc2NyaXB0aW9ucy4KLQotICAgICAgICBFR0xfUkVDT1JEQUJMRV9BTkRST0lEIGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvbmZpZyBtYXkKLSAgICAgICAgYmUgdXNlZCB0byBjcmVhdGUgYW4gRUdMU3VyZmFjZSBmcm9tIGFuIEFOYXRpdmVXaW5kb3cgdGhhdCBpcyBhIHZpZGVvCi0gICAgICAgIHJlY29yZGVyIGFzIGluZGljYXRlZCBieSB0aGUgTkFUSVZFX1dJTkRPV19JU19WSURFT19SRUNPUkRFUiBxdWVyeSBvbgotICAgICAgICB0aGUgQU5hdGl2ZVdpbmRvdy4KLQotICAgIFNlY3Rpb24gMy40LjEsIFF1ZXJ5aW5nIENvbmZpZ3VyYXRpb25zLCBjaGFuZ2UgdGhlIGxhc3QgcGFyYWdyYXBoIGFzIGZvbGxvdwotCi0gICAgICAgIEVHTENvbmZpZ3MgYXJlIG5vdCBzb3J0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLCBFR0xfQklORF9UT19URVhUVVJFX1JHQkEsIEVHTF9DT05GT1JNQU5ULAotICAgICAgICBFR0xfTEVWRUwsIEVHTF9OQVRJVkVfUkVOREVSQUJMRSwgRUdMX01BWF9TV0FQX0lOVEVSVkFMLAotICAgICAgICBFR0xfTUlOX1NXQVBfSU5URVJWQUwsIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9TVVJGQUNFX1RZUEUsCi0gICAgICAgIEVHTF9UUkFOU1BBUkVOVF9UWVBFLCBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLAotICAgICAgICBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLCBhbmQKLSAgICAgICAgRUdMX1JFQ09SREFCTEVfQU5EUk9JRC4KLQotSXNzdWVzCi0KLSAgICAxLiBTaG91bGQgdGhpcyBmdW5jdGlvbmFsaXR5IGJlIGV4cG9zZWQgYXMgYSBuZXcgYXR0cmlidXRlIG9yIGFzIGEgYml0IGluCi0gICAgdGhlIEVHTF9TVVJGQUNFX1RZUEUgYml0ZmllbGQ/Ci0KLSAgICBSRVNPTFZFRDogSXQgc2hvdWxkIGJlIGEgbmV3IGF0dHJpYnV0ZS4gIEl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gdXNlIHVwIGEKLSAgICBiaXQgaW4gdGhlIGxpbWl0LXNpemUgYml0ZmllbGQgZm9yIGEgcGxhdGZvcm0tc3BlY2lmaWMgZXh0ZW5zaW9uLgotCi0gICAgMi4gSG93IHNob3VsZCB0aGUgbmV3IGF0dHJpYnV0ZSBhZmZlY3QgdGhlIHNvcnRpbmcgb2YgRUdMQ29uZmlncz8KLQotICAgIFJFU09MVkVEOiBJdCBzaG91bGQgbm90IGFmZmVjdCBzb3J0aW5nLiAgU29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBoYXZlCi0gICAgYW55IGRyYXdiYWNrIGFzc29jaWF0ZWQgd2l0aCB1c2luZyBhIHJlY29yZGFibGUgRUdMQ29uZmlnLiAgU3VjaAotICAgIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IGhhdmUgdG8gZG91YmxlLXVwIHNvbWUgb2YgdGhlaXIgY29uZmlncyB0byAgb25lCi0gICAgc29ydCBlYXJsaWVyIHRoYW4gLiAgSW1wbGVtZW50YXRpb25zIHRoYXQgZG8gaGF2ZSBkcmF3YmFja3MgY2FuIHVzZSB0aGUKLSAgICBleGlzdGluZyBjYXZlYXQgbWVjaGFuaXNtIHRvIHJlcG9ydCB0aGlzIGRyYXdiYWNrIHRvIHRoZSBjbGllbnQuCi0KLSAgICAzLiBIb3cgaXMgdGhpcyBleHRlbnNpb24gZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQ/Ci0KLSAgICBSRVNQT05TRTogVGhlcmUgYXJlIHR3byBiYXNpYyBhcHByb2FjaGVzIHRvIGltcGxlbWVudGluZyB0aGlzIGV4dGVuc2lvbgotICAgIHRoYXQgd2VyZSBjb25zaWRlcmVkIGR1cmluZyBpdHMgZGVzaWduLiAgSW4gYm90aCBjYXNlcyBpdCBpcyBhc3N1bWVkIHRoYXQgYQotICAgIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbXVzdCBiZSBwZXJmb3JtZWQgYXQgc29tZSBwb2ludCBiZWNhdXNlIG1vc3QgdmlkZW8KLSAgICBlbmNvZGluZyBmb3JtYXRzIHVzZSBhIFlVViBjb2xvciBzcGFjZS4gIFRoZSB0d28gYXBwcm9hY2hlcyBhcmUKLSAgICBkaXN0aW5ndWlzaGVkIGJ5IHRoZSBwb2ludCBhdCB3aGljaCB0aGlzIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gaXMKLSAgICBwZXJmb3JtZWQuCi0KLSAgICBPbmUgYXBwcm9hY2ggaW52b2x2ZXMgcGVyZm9ybWluZyB0aGUgY29sb3Igc3BhY2UgY29udmVyc2lvbiBhcyBwYXJ0IG9mIHRoZQotICAgIGVnbFN3YXBCdWZmZXJzIGNhbGwgYmVmb3JlIHF1ZXVpbmcgdGhlIHJlbmRlcmVkIGltYWdlIHRvIHRoZSBBTmF0aXZlV2luZG93LgotICAgIEluIHRoaXMgY2FzZSwgdGhlIFZpc3VhbElEIG9mIHRoZSBFR0xDb25maWcgd291bGQgY29ycmVzcG9uZCB0byBhIFlVVgotICAgIEFuZHJvaWQgSEFMIHBpeGVsIGZvcm1hdCBmcm9tIHdoaWNoIHRoZSB2aWRlbyBlbmNvZGVyIGNhbiByZWFkLiAgVGhlCi0gICAgRUdMQ29uZmlnIHdvdWxkIGxpa2VseSBoYXZlIHRoZSBFR0xfU0xPV19DT05GSUcgY2F2ZWF0IGJlY2F1c2UgdXNpbmcgdGhhdAotICAgIGNvbmZpZyB0byByZW5kZXIgbm9ybWFsIHdpbmRvdyBjb250ZW50cyB3b3VsZCByZXN1bHQgaW4gYW4gUkdCIC0+IFlVViBjb2xvcgotICAgIHNwYWNlIGNvbnZlcnNpb24gd2hlbiByZW5kZXJpbmcgdGhlIGZyYW1lIGFzIHdlbGwgYXMgYSBZVVYgLT4gUkdCCi0gICAgY29udmVyc2lvbiB3aGVuIGNvbXBvc2l0aW5nIHRoZSB3aW5kb3cuCi0KLSAgICBUaGUgb3RoZXIgYXBwcm9hY2ggaW52b2x2ZXMgcGVyZm9ybWluZyB0aGUgY29sb3Igc3BhY2UgY29udmVyc2lvbiBpbiB0aGUKLSAgICB2aWRlbyBlbmNvZGVyLiAgSW4gdGhpcyBjYXNlLCB0aGUgVmlzdWFsSUQgb2YgdGhlIEVHTENvbmZpZyB3b3VsZAotICAgIGNvcnJlc3BvbmQgdG8gYW4gUkdCIEhBTCBwaXhlbCBmb3JtYXQgZnJvbSB3aGljaCB0aGUgdmlkZW8gZW5jb2RlciBjYW4KLSAgICByZWFkLiAgVGhlIEVHTENvbmZpZyB3b3VsZCBsaWtlbHkgbm90IG5lZWQgdG8gaGF2ZSBhbnkgY2F2ZWF0IHNldCwgYXMgdXNpbmcKLSAgICB0aGlzIGNvbmZpZyBmb3Igbm9ybWFsIHdpbmRvdyByZW5kZXJpbmcgd291bGQgbm90IGhhdmUgYW55IGFkZGVkIGNvc3QuCi0KLVJldmlzaW9uIEhpc3RvcnkKLQotIzIgKEphbWllIEdlbm5pcywgSnVseSAxNSwgMjAxMSkKLSAgICAtIEFkZGVkIGlzc3VlIDMuCi0KLSMxIChKYW1pZSBHZW5uaXMsIEp1bHkgOCwgMjAxMSkKLSAgICAtIEluaXRpYWwgZHJhZnQuCmRpZmYgLS1naXQgYS9vcGVuZ2wvc3BlY3MvUkVBRE1FIGIvb3BlbmdsL3NwZWNzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiMjc4Zi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvc3BlY3MvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgT3BlbkdMIEVTIGFuZCBFR0wgZXh0ZW5zaW9uIHNwZWNpZmljYXRpb25zIHRoYXQgaGF2ZQotYmVlbiBvciBhcmUgYmVpbmcgZGVmaW5lZCBmb3IgQW5kcm9pZC4gIAotCi1UaGUgdGFibGUgYmVsb3cgdHJhY2tzIHVzYWdlIG9mIEVHTCBlbnVtZXJhbnQgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHJlc2VydmVkCi1mb3IgdXNlIGJ5IEFuZHJvaWQgZXh0ZW5zaW9ucy4KLQotICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uCi0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0weDMxNDAgICAgICAgICAgICAgICBFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyCi0weDMxNDEgICAgICAgICAgICAgICAodW51c2VkKQotMHgzMTQyICAgICAgICAgICAgICAgRUdMX0FORFJPSURfcmVjb3JkYWJsZQotMHgzMTQzICAgICAgICAgICAgICAgRUdMX1ZFUlNJT05fSFdfQU5EUk9JRCAoaW50ZXJuYWwgdXNlKQotMHgzMTQ0IC0gMHgzMTRGICAgICAgKHVudXNlZCkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTNlN2QuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvRUdMVGVzdC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDEwNGQxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IEVHTF90ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgZWdsX2NhY2hlX3Rlc3QuY3BwIFwKLSAgICBFR0xfdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJFR0wgXAotCWxpYmN1dGlscyBcCi0JbGlic3RscG9ydCBcCi0JbGlidXRpbHMgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLQlsaWJndGVzdCBcCi0JbGliZ3Rlc3RfbWFpbiBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYmMvcHJpdmF0ZSBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAotICAgIGZyYW1ld29ya3MvYmFzZS9vcGVuZ2wvbGlicyBcCi0gICAgZnJhbWV3b3Jrcy9iYXNlL29wZW5nbC9saWJzL0VHTCBcCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi0jIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKLSMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KLWlmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKLWluY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L0VHTF90ZXN0LmNwcCBiL29wZW5nbC90ZXN0cy9FR0xUZXN0L0VHTF90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3YWQzMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvRUdMVGVzdC9FR0xfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVHTFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICBFR0xEaXNwbGF5IG1FZ2xEaXNwbGF5OwotCi1wcm90ZWN0ZWQ6Ci0gICAgRUdMVGVzdCgpIDoKLSAgICAgICAgICAgIG1FZ2xEaXNwbGF5KEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgICAgICBtRWdsRGlzcGxheSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgICAgIEFTU0VSVF9ORShFR0xfTk9fRElTUExBWSwgbUVnbERpc3BsYXkpOwotICAgICAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgICAgIEVHTGludCBtYWpvclZlcnNpb247Ci0gICAgICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgICAgIEVYUEVDVF9UUlVFKGVnbEluaXRpYWxpemUobUVnbERpc3BsYXksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICAgICAgUmVjb3JkUHJvcGVydHkoIkVnbFZlcnNpb25NYWpvciIsIG1ham9yVmVyc2lvbik7Ci0gICAgICAgIFJlY29yZFByb3BlcnR5KCJFZ2xWZXJzaW9uTWFqb3IiLCBtaW5vclZlcnNpb24pOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgRUdMQm9vbGVhbiBzdWNjZXNzID0gZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICAgICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICB9Ci19OwotCi1URVNUX0YoRUdMVGVzdCwgRElTQUJMRURfRUdMQ29uZmlnRWlnaHRCaXRGaXJzdCkgewotCi0gICAgRUdMaW50IG51bUNvbmZpZ3M7Ci0gICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICBFR0xCb29sZWFuIHN1Y2Nlc3M7Ci0gICAgRUdMaW50IGF0dHJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsICAgIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FCi0gICAgfTsKLQotICAgIHN1Y2Nlc3MgPSBlZ2xDaG9vc2VDb25maWcobUVnbERpc3BsYXksIGF0dHJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIEFTU0VSVF9HRShudW1Db25maWdzLCAxKTsKLQotICAgIEVHTGludCBjb21wb25lbnRzWzNdOwotCi0gICAgc3VjY2VzcyA9IGVnbEdldENvbmZpZ0F0dHJpYihtRWdsRGlzcGxheSwgY29uZmlnLCBFR0xfUkVEX1NJWkUsICZjb21wb25lbnRzWzBdKTsKLSAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgc3VjY2VzcyA9IGVnbEdldENvbmZpZ0F0dHJpYihtRWdsRGlzcGxheSwgY29uZmlnLCBFR0xfR1JFRU5fU0laRSwgJmNvbXBvbmVudHNbMV0pOwotICAgIEFTU0VSVF9FUShFR0xfVFJVRSwgc3VjY2Vzcyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9CTFVFX1NJWkUsICZjb21wb25lbnRzWzJdKTsKLSAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0KLSAgICBFWFBFQ1RfR0UoY29tcG9uZW50c1swXSwgOCk7Ci0gICAgRVhQRUNUX0dFKGNvbXBvbmVudHNbMV0sIDgpOwotICAgIEVYUEVDVF9HRShjb21wb25lbnRzWzJdLCA4KTsKLX0KLQotVEVTVF9GKEVHTFRlc3QsIEVHTENvbmZpZ1JHQkE4ODg4Rmlyc3QpIHsKLQotICAgIEVHTGludCBudW1Db25maWdzOwotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMQm9vbGVhbiBzdWNjZXNzOwotICAgIEVHTGludCBhdHRyc1tdID0gewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCAgICBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgICAgICA4LAotICAgICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgOCwKLSAgICAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgICAgIDgsCi0gICAgICAgICAgICBFR0xfQUxQSEFfU0laRSwgICAgICAgICA4LAotICAgICAgICAgICAgRUdMX05PTkUKLSAgICB9OwotCi0gICAgc3VjY2VzcyA9IGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgYXR0cnMsICZjb25maWcsIDEsICZudW1Db25maWdzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1RSVUUsIHN1Y2Nlc3MpOwotICAgIEFTU0VSVF9FUShFR0xfU1VDQ0VTUywgZWdsR2V0RXJyb3IoKSk7Ci0gICAgQVNTRVJUX0dFKG51bUNvbmZpZ3MsIDEpOwotCi0gICAgRUdMaW50IGNvbXBvbmVudHNbNF07Ci0KLSAgICBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9SRURfU0laRSwgJmNvbXBvbmVudHNbMF0pOwotICAgIEFTU0VSVF9FUShFR0xfVFJVRSwgc3VjY2Vzcyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9HUkVFTl9TSVpFLCAmY29tcG9uZW50c1sxXSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotICAgIHN1Y2Nlc3MgPSBlZ2xHZXRDb25maWdBdHRyaWIobUVnbERpc3BsYXksIGNvbmZpZywgRUdMX0JMVUVfU0laRSwgJmNvbXBvbmVudHNbMl0pOwotICAgIEFTU0VSVF9FUShFR0xfVFJVRSwgc3VjY2Vzcyk7Ci0gICAgQVNTRVJUX0VRKEVHTF9TVUNDRVNTLCBlZ2xHZXRFcnJvcigpKTsKLSAgICBzdWNjZXNzID0gZWdsR2V0Q29uZmlnQXR0cmliKG1FZ2xEaXNwbGF5LCBjb25maWcsIEVHTF9BTFBIQV9TSVpFLCAmY29tcG9uZW50c1szXSk7Ci0gICAgQVNTRVJUX0VRKEVHTF9UUlVFLCBzdWNjZXNzKTsKLSAgICBBU1NFUlRfRVEoRUdMX1NVQ0NFU1MsIGVnbEdldEVycm9yKCkpOwotCi0gICAgRVhQRUNUX0dFKGNvbXBvbmVudHNbMF0sIDgpOwotICAgIEVYUEVDVF9HRShjb21wb25lbnRzWzFdLCA4KTsKLSAgICBFWFBFQ1RfR0UoY29tcG9uZW50c1syXSwgOCk7Ci0gICAgRVhQRUNUX0dFKGNvbXBvbmVudHNbM10sIDgpOwotfQotCi0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L2VnbF9jYWNoZV90ZXN0LmNwcCBiL29wZW5nbC90ZXN0cy9FR0xUZXN0L2VnbF9jYWNoZV90ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkOWUzZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvRUdMVGVzdC9lZ2xfY2FjaGVfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRUdMX3Rlc3QiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJlZ2xfY2FjaGUuaCIKLSNpbmNsdWRlICJlZ2xfZGlzcGxheS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVHTENhY2hlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAgICAgbUNhY2hlID0gZWdsX2NhY2hlX3Q6OmdldCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICAgICAgbUNhY2hlLT5zZXRDYWNoZUZpbGVuYW1lKCIiKTsKLSAgICAgICAgbUNhY2hlLT50ZXJtaW5hdGUoKTsKLSAgICB9Ci0KLSAgICBlZ2xfY2FjaGVfdCogbUNhY2hlOwotfTsKLQotVEVTVF9GKEVHTENhY2hlVGVzdCwgVW5pbml0aWFsaXplZENhY2hlQWx3YXlzTWlzc2VzKSB7Ci0gICAgY2hhciBidWZbNF0gPSB7IDB4ZWUsIDB4ZWUsIDB4ZWUsIDB4ZWUgfTsKLSAgICBtQ2FjaGUtPnNldEJsb2IoImFiY2QiLCA0LCAiZWZnaCIsIDQpOwotICAgIEFTU0VSVF9FUSgwLCBtQ2FjaGUtPmdldEJsb2IoImFiY2QiLCA0LCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzNdKTsKLX0KLQotVEVTVF9GKEVHTENhY2hlVGVzdCwgSW5pdGlhbGl6ZWRDYWNoZUFsd2F5c0hpdHMpIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1DYWNoZS0+aW5pdGlhbGl6ZShlZ2xfZGlzcGxheV90OjpnZXQoRUdMX0RFRkFVTFRfRElTUExBWSkpOwotICAgIG1DYWNoZS0+c2V0QmxvYigiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgQVNTRVJUX0VRKDQsIG1DYWNoZS0+Z2V0QmxvYigiYWJjZCIsIDQsIGJ1ZiwgNCkpOwotICAgIEFTU0VSVF9FUSgnZScsIGJ1ZlswXSk7Ci0gICAgQVNTRVJUX0VRKCdmJywgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoJ2cnLCBidWZbMl0pOwotICAgIEFTU0VSVF9FUSgnaCcsIGJ1ZlszXSk7Ci19Ci0KLVRFU1RfRihFR0xDYWNoZVRlc3QsIFRlcm1pbmF0ZWRDYWNoZUFsd2F5c01pc3NlcykgewotICAgIGNoYXIgYnVmWzRdID0geyAweGVlLCAweGVlLCAweGVlLCAweGVlIH07Ci0gICAgbUNhY2hlLT5pbml0aWFsaXplKGVnbF9kaXNwbGF5X3Q6OmdldChFR0xfREVGQVVMVF9ESVNQTEFZKSk7Ci0gICAgbUNhY2hlLT5zZXRCbG9iKCJhYmNkIiwgNCwgImVmZ2giLCA0KTsKLSAgICBtQ2FjaGUtPnRlcm1pbmF0ZSgpOwotICAgIEFTU0VSVF9FUSgwLCBtQ2FjaGUtPmdldEJsb2IoImFiY2QiLCA0LCBidWYsIDQpKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzFdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzJdKTsKLSAgICBBU1NFUlRfRVEoMHhlZSwgYnVmWzNdKTsKLX0KLQotY2xhc3MgRUdMQ2FjaGVTZXJpYWxpemF0aW9uVGVzdCA6IHB1YmxpYyBFR0xDYWNoZVRlc3QgewotCi1wcm90ZWN0ZWQ6Ci0KLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIEVHTENhY2hlVGVzdDo6U2V0VXAoKTsKLQotICAgICAgICBjaGFyKiB0biA9IHRlbXBuYW0oIi9zZGNhcmQiLCAiRUdMX3Rlc3QtY2FjaGUtIik7Ci0gICAgICAgIG1GaWxlbmFtZSA9IHRuOwotICAgICAgICBmcmVlKHRuKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgICAgIHVubGluayhtRmlsZW5hbWUuc3RyaW5nKCkpOwotICAgICAgICBFR0xDYWNoZVRlc3Q6OlRlYXJEb3duKCk7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBtRmlsZW5hbWU7Ci19OwotCi1URVNUX0YoRUdMQ2FjaGVTZXJpYWxpemF0aW9uVGVzdCwgUmVpbml0aWFsaXplZENhY2hlQ29udGFpbnNWYWx1ZXMpIHsKLSAgICBjaGFyIGJ1Zls0XSA9IHsgMHhlZSwgMHhlZSwgMHhlZSwgMHhlZSB9OwotICAgIG1DYWNoZS0+c2V0Q2FjaGVGaWxlbmFtZShtRmlsZW5hbWUpOwotICAgIG1DYWNoZS0+aW5pdGlhbGl6ZShlZ2xfZGlzcGxheV90OjpnZXQoRUdMX0RFRkFVTFRfRElTUExBWSkpOwotICAgIG1DYWNoZS0+c2V0QmxvYigiYWJjZCIsIDQsICJlZmdoIiwgNCk7Ci0gICAgbUNhY2hlLT50ZXJtaW5hdGUoKTsKLSAgICBtQ2FjaGUtPmluaXRpYWxpemUoZWdsX2Rpc3BsYXlfdDo6Z2V0KEVHTF9ERUZBVUxUX0RJU1BMQVkpKTsKLSAgICBBU1NFUlRfRVEoNCwgbUNhY2hlLT5nZXRCbG9iKCJhYmNkIiwgNCwgYnVmLCA0KSk7Ci0gICAgQVNTRVJUX0VRKCdlJywgYnVmWzBdKTsKLSAgICBBU1NFUlRfRVEoJ2YnLCBidWZbMV0pOwotICAgIEFTU0VSVF9FUSgnZycsIGJ1ZlsyXSk7Ci0gICAgQVNTRVJUX0VRKCdoJywgYnVmWzNdKTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNGY3NmQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTOj0gYXBwLWxpbnV4LmNwcCBkZW1vLmMuYXJtCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkVHTCBsaWJHTEVTdjFfQ00gbGlidWkKLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLUxPQ0FMX01PRFVMRTo9IGFuZ2VsZXMKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YjhhNGEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCi1Db3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQotV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLw0KLVNlZSBmaWxlIGxpY2Vuc2UudHh0IGZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24uDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotVGhpcyBpcyBhbiBPcGVuR0wgRVMgcG9ydCBvZiB0aGUgc21hbGwgc2VsZi1ydW5uaW5nIGRlbW9uc3RyYXRpb24NCi1jYWxsZWQgIlNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIiwgd2hpY2ggd2FzIGZpcnN0IHByZXNlbnRlZCBpbiB0aGUNCi1Bc3NlbWJseScyMDA0IGV2ZW50LiBJdCB3b24gdGhlIGZpcnN0IHBsYWNlIGluIHRoZSA0IEtCIGludHJvDQotY29tcGV0aXRpb24gY2F0ZWdvcnkuDQotDQotVGhlIGRlbW9uc3RyYXRpb24gZmVhdHVyZXMgYSBzaWdodHNlZWluZyBvZiBhIGZ1dHVyaXN0aWMgY2l0eQ0KLWhhdmluZyBtYW55IGRpZmZlcmVudCBraW5kIG9mIGJ1aWxkaW5ncyBhbmQgaXRlbXMuIEV2ZXJ5dGhpbmcgaXMNCi1mbGF0IHNoYWRlZCB3aXRoIHRocmVlIGRpZmZlcmVudCBsaWdodHMuDQotDQotVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG1hZGUgZm9yIGRlc2t0b3Agd2l0aCBPcGVuR0wuIEl0IHdhcw0KLW5hdHVyYWxseSBoZWF2aWx5IHNpemUgb3B0aW1pemVkIGluIG9yZGVyIHRvIGZpdCBpdCBpbiB0aGUgc2l6ZQ0KLWxpbWl0LiBGb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIG11Y2ggb2YgdGhlIGNvZGUgaXMNCi1jbGVhbmVkIHVwIGFuZCB0aGUgc291bmQgaXMgcmVtb3ZlZC4gQWxzbyBkZXRhaWwgbGV2ZWwgaXMgbG93ZXJlZCwNCi1hbHRob3VnaCBpdCBzdGlsbCBjb250YWlucyBvdmVyIDYwMDAwIGZhY2VzLg0KLQ0KLVRoZSBXaW4zMiAoMjAwMC9YUCkgYmluYXJ5IHBhY2thZ2Ugb2Ygb3JpZ2luYWwgdmVyc2lvbiBpcw0KLWF2YWlsYWJsZSBmcm9tIHRoaXMgYWRkcmVzczogaHR0cDovL2pldC5yby9maWxlcy9hbmdlbGVzLnppcA0KLQ0KLUZpcnN0IHZlcnNpb24gb2YgdGhpcyBPcGVuR0wgRVMgcG9ydCB3YXMgc3VibWl0dGVkIHRvIHRoZSBLaHJvbm9zDQotT3BlbkdMIEVTIENvZGluZyBDaGFsbGVuZ2UgaGVsZCBpbiAyMDA0LTIwMDUuDQotDQotQXMgYSBjb2RlIGV4YW1wbGUsIHRoaXMgc291cmNlIHNob3dzIHRoZSBmb2xsb3dpbmc6DQotICAqIEhvdyB0byBjcmVhdGUgYSBtaW5pbWFsIGFuZCBwb3J0YWJsZSBhZCBob2MgZnJhbWV3b3JrDQotICAgIGZvciBzbWFsbCB0ZXN0aW5nL2RlbW9uc3RyYXRpb24gcHJvZ3JhbXMuIFRoaXMgZnJhbWV3b3JrDQotICAgIGNvbXBpbGVzIGZvciBib3RoIGRlc2t0b3AgYW5kIFBvY2tldFBDIFdpbjMyIGVudmlyb25tZW50LA0KLSAgICBhbmQgYSBzZXBhcmF0ZSBzb3VyY2UgaXMgaW5jbHVkZWQgZm9yIExpbnV4IHdpdGggWDExLg0KLSAgKiBIb3cgdG8gZHluYW1pY2FsbHkgZmluZCBhbmQgdXNlIHRoZSBPcGVuR0wgRVMgRExMIG9yDQotICAgIHNoYXJlZCBvYmplY3QsIHNvIHRoYXQgdGhlIGxpYnJhcnkgaXMgbm90IG5lZWRlZCBhdA0KLSAgICB0aGUgY29tcGlsZS9saW5rIHN0YWdlLg0KLSAgKiBIb3cgdG8gdXNlIHRoZSBiYXNpYyBmZWF0dXJlcyBvZiBPcGVuR0wgRVMgMS4wLzEuMQ0KLSAgICBDb21tb24gTGl0ZSwgc3VjaCBhcyB2ZXJ0ZXggYXJyYXlzLCBjb2xvciBhcnJheXMgYW5kDQotICAgIGxpZ2h0aW5nLg0KLSAgKiBIb3cgdG8gY3JlYXRlIGEgc2VsZiBjb250YWluZWQgc21hbGwgZGVtb25zdHJhdGlvbg0KLSAgICBhcHBsaWNhdGlvbiB3aXRoIG9iamVjdHMgZ2VuZXJhdGVkIHVzaW5nIHByb2NlZHVyYWwNCi0gICAgYWxnb3JpdGhtcy4NCi0NCi1BcyB0aGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgb3B0aW1pemVkIGZvciBzaXplIGluc3RlYWQgb2YNCi1wZXJmb3JtYW5jZSwgdGhhdCBob2xkcyB0cnVlIGZvciB0aGlzIE9wZW5HTCBFUyB2ZXJzaW9uIGFzDQotd2VsbC4gVGh1cyB0aGUgcGVyZm9ybWFuY2UgY291bGQgYmUgc2lnbmlmaWNhbnRseSBpbmNyZWFzZWQsDQotZm9yIGV4YW1wbGUgYnkgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIGdsRHJhd0VsZW1lbnRzDQotaW5zdGVhZCBvZiBnbERyYXdBcnJheXMuIFRoZSBjb2RlIHVzZXMgb25seSBPcGVuR0wgRVMgMS4wDQotQ29tbW9uIExpdGUgLWxldmVsIGZ1bmN0aW9uIGNhbGxzIHdpdGhvdXQgYW55IGV4dGVuc2lvbnMuDQotDQotVGhlIHJlZmVyZW5jZSBPcGVuR0wgRVMgaW1wbGVtZW50YXRpb25zIHVzZWQgZm9yIHRoaXMgYXBwbGljYXRpb246DQotICAqIEh5YnJpZCdzIE9wZW5HTCBFUyBBUEkgSW1wbGVtZW50YXRpb24gKEdlcmJlcmEpIHZlcnNpb24gMi4wLjQNCi0gICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtR2VyYmVyYS5leGUNCi0gICogUG93ZXJWUiBNQlggU0RLLCBPcGVuR0wgRVMgV2luZG93cyBQQyBFbXVsYXRpb24gdmVyc2lvbiAxLjA0LjE0LjAxNzANCi0gICAgUHJlYnVpbHQgV2luMzIgUEMgZXhlY3V0YWJsZTogU2FuT0dMRVMtUFZSU0RLLmV4ZQ0KLQ0KLU5vdGUgdGhhdCBESVNBQkxFX0lNUE9SVEdMIHByZXByb2Nlc3NvciBtYWNybyBjYW4gYmUgdXNlZA0KLXRvIHNwZWNpZnkgbm90IHRvIHVzZSBkeW5hbWljIHJ1bnRpbWUgYmluZGluZyBvZiB0aGUgbGlicmFyeS4NCi1Zb3UgYWxzbyBuZWVkIHRvIGRlZmluZSBwcmVwcm9jZXNzb3IgbWFjcm8gUFZSU0RLIHRvIGNvbXBpbGUNCi10aGUgc291cmNlIHdpdGggUG93ZXJWUiBPcGVuR0wgRVMgU0RLLg0KLQ0KLVRoZSBkZW1vIGFwcGxpY2F0aW9uIGlzIGJyaWVmbHkgdGVzdGVkIHdpdGggYSBmZXcgb3RoZXIgT3BlbkdMIEVTDQotaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgKGUuZy4gVmluY2VudCwgR0xFU29uR0wgb24gTGludXgsIERlbGwNCi1BeGltIFg1MHYpLiBNb3N0IG9mIHRoZXNlIG90aGVyIGltcGxlbWVudGF0aW9ucyByZW5kZXJlZCB0aGUgZGVtbw0KLWVycm9uZW91c2x5IGluIHNvbWUgYXNwZWN0LiBUaGlzIG1heSBpbmRpY2F0ZSB0aGF0IHRoZSBkZW1vIHNvdXJjZQ0KLWNvdWxkIHN0aWxsIGhhdmUgc29tZSB3b3JrIHRvIGRvIHdpdGggY29tcGF0aWJpbGl0eSBhbmQgY29ycmVjdA0KLUFQSSB1c2FnZSwgYWx0aG91Z2ggdGhlIG5vbi1jb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBhcmUgbW9zdA0KLXByb2JhYmx5IHVuZmluaXNoZWQgYXMgd2VsbC4NCi0NCi1UaGFua3MgYW5kIEFja25vd2xlZGdlbWVudHM6DQotDQotKiBUb25pIEz2bm5iZXJnICghQ3ViZSkgY3JlYXRlZCB0aGUgbXVzaWMgZm9yIG9yaWdpbmFsIHZlcnNpb24sIHdoaWNoDQotICBpcyBub3QgZmVhdHVyZWQgaW4gdGhpcyBPcGVuR0wgRVMgcG9ydC4NCi0qIFNhcmEgS2FwbGkgKHN0IFJhbmEpIGZvciBhZGRpdGlvbmFsIGNhbWVyYSB3b3JrLg0KLSogUGF1bCBCb3Vya2UgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdXBlcnNoYXBlcy4NCi0NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguY3BwIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNjhhMi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKLSAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgotICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQotICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgotICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgotICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgotICoKLSAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCi0gKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAkSWQ6IGFwcC1saW51eC5jLHYgMS40IDIwMDUvMDIvMDggMTg6NDI6NDggdG9uaWMgRXhwICQKLSAqICRSZXZpc2lvbjogMS40ICQKLSAqCi0gKiBQYXJ0cyBvZiB0aGlzIHNvdXJjZSBmaWxlIGlzIGJhc2VkIG9uIHRlc3QvZXhhbXBsZSBjb2RlIGZyb20KLSAqIEdMRVNvbkdMIGltcGxlbWVudGF0aW9uIGJ5IERhdmlkIEJseXRoZS4gSGVyZSBpcyBjb3B5IG9mIHRoZQotICogbGljZW5zZSBub3RpY2UgZnJvbSB0aGF0IHNvdXJjZToKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkIEJseXRoZSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBEQVZJRCBCTFlUSEUgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLSNpbmNsdWRlICJhcHAuaCIKLQotCi1pbnQgZ0FwcEFsaXZlID0gMTsKLQotc3RhdGljIGNvbnN0IGNoYXIgc0FwcE5hbWVbXSA9Ci0gICAgICAgICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIChMaW51eCkiOwotCi1zdGF0aWMgaW50IHNXaW5kb3dXaWR0aCA9IFdJTkRPV19ERUZBVUxUX1dJRFRIOwotc3RhdGljIGludCBzV2luZG93SGVpZ2h0ID0gV0lORE9XX0RFRkFVTFRfSEVJR0hUOwotc3RhdGljIEVHTERpc3BsYXkgc0VnbERpc3BsYXkgPSBFR0xfTk9fRElTUExBWTsKLXN0YXRpYyBFR0xDb250ZXh0IHNFZ2xDb250ZXh0ID0gRUdMX05PX0NPTlRFWFQ7Ci1zdGF0aWMgRUdMU3VyZmFjZSBzRWdsU3VyZmFjZSA9IEVHTF9OT19TVVJGQUNFOwotCi1jb25zdCBjaGFyICplZ2xfc3RyZXJyb3IodW5zaWduZWQgZXJyKQotewotICAgIHN3aXRjaChlcnIpewotICAgICAgICBjYXNlIEVHTF9TVUNDRVNTOiByZXR1cm4gIlNVQ0NFU1MiOwotICAgICAgICBjYXNlIEVHTF9OT1RfSU5JVElBTElaRUQ6IHJldHVybiAiTk9UIElOSVRJQUxJWkVEIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0FDQ0VTUzogcmV0dXJuICJCQUQgQUNDRVNTIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0FMTE9DOiByZXR1cm4gIkJBRCBBTExPQyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BVFRSSUJVVEU6IHJldHVybiAiQkFEX0FUVFJJQlVURSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6IHJldHVybiAiQkFEIENPTkZJRyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOiByZXR1cm4gIkJBRCBDT05URVhUIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogcmV0dXJuICJCQUQgQ1VSUkVOVCBTVVJGQUNFIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6IHJldHVybiAiQkFEIERJU1BMQVkiOwotICAgICAgICBjYXNlIEVHTF9CQURfTUFUQ0g6IHJldHVybiAiQkFEIE1BVENIIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX05BVElWRV9QSVhNQVA6IHJldHVybiAiQkFEIE5BVElWRSBQSVhNQVAiOwotICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogcmV0dXJuICJCQUQgTkFUSVZFIFdJTkRPVyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6IHJldHVybiAiQkFEIFBBUkFNRVRFUiI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiByZXR1cm4gIkJBRF9TVVJGQUNFIjsKLSAgICAgICAgLy8gICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiByZXR1cm4gIkNPTlRFWFQgTE9TVCI7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiAiVU5LTk9XTiI7Ci0gICAgfQotfQotCi12b2lkIGVnbF9lcnJvcihjb25zdCBjaGFyICpuYW1lKQotewotICAgIHVuc2lnbmVkIGVyciA9IGVnbEdldEVycm9yKCk7Ci0gICAgaWYoZXJyICE9IEVHTF9TVUNDRVNTKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCIlcygpOiBlZ2wgZXJyb3IgMHgleCAoJXMpXG4iLCAKLSAgICAgICAgICAgICAgICBuYW1lLCBlcnIsIGVnbF9zdHJlcnJvcihlcnIpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR0xFcnJvcnMoKQotewotICAgIEdMZW51bSBlcnJvciA9IGdsR2V0RXJyb3IoKTsKLSAgICBpZiAoZXJyb3IgIT0gR0xfTk9fRVJST1IpCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiR0wgRXJyb3I6IDB4JTA0eFxuIiwgKGludCllcnJvcik7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2hlY2tFR0xFcnJvcnMoKQotewotICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgLy8gR0xFU29uR0wgc2VlbXMgdG8gYmUgcmV0dXJuaW5nIDAgd2hlbiB0aGVyZSBpcyBubyBlcnJvcnM/Ci0gICAgaWYgKGVycm9yICYmIGVycm9yICE9IEVHTF9TVUNDRVNTKQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKLX0KLQotc3RhdGljIGludCBpbml0R3JhcGhpY3ModW5zaWduZWQgc2FtcGxlcykKLXsKLSAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX0RFUFRIX1NJWkUsIDE2LAotICAgICAgICAgICAgRUdMX1NBTVBMRV9CVUZGRVJTLCBzYW1wbGVzID8gMSA6IDAsCi0gICAgICAgICAgICAgICAgICAgIEVHTF9TQU1QTEVTLCBzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0KLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMU3VyZmFjZSBzdXJmYWNlOwotICAgIEVHTGludCB3LCBoOwotICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7Ci0KLSAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLQotICAgIHN0YXR1c190IGVyciA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICBkcHksIGNvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJmNvbmZpZyk7Ci0gICAgaWYgKGVycikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGZpbmQgYW4gRUdMQ29uZmlnIG1hdGNoaW5nIHRoZSBzY3JlZW4gZm9ybWF0XG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgZWdsX2Vycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwic3VyZmFjZSA9ICVwXG4iLCBzdXJmYWNlKTsKLQotICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKLSAgICBlZ2xfZXJyb3IoImVnbENyZWF0ZUNvbnRleHQiKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwiY29udGV4dCA9ICVwXG4iLCBjb250ZXh0KTsKLQotICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0gICAgZWdsX2Vycm9yKCJlZ2xNYWtlQ3VycmVudCIpOwotCi0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmc1dpbmRvd1dpZHRoKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmc1dpbmRvd0hlaWdodCk7Ci0KLSAgICBzRWdsRGlzcGxheSA9IGRweTsKLSAgICBzRWdsU3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgc0VnbENvbnRleHQgPSBjb250ZXh0OwotCi0gICAgaWYgKHNhbXBsZXMgPT0gMCkgewotICAgICAgICAvLyBHTF9NVUxUSVNBTVBMRSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQKLSAgICAgICAgZ2xEaXNhYmxlKEdMX01VTFRJU0FNUExFKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRUdMX1RSVUU7Ci19Ci0KLQotc3RhdGljIHZvaWQgZGVpbml0R3JhcGhpY3MoKQotewotICAgIGVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICBlZ2xEZXN0cm95Q29udGV4dChzRWdsRGlzcGxheSwgc0VnbENvbnRleHQpOwotICAgIGVnbERlc3Ryb3lTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7Ci0gICAgZWdsVGVybWluYXRlKHNFZ2xEaXNwbGF5KTsKLX0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIHVuc2lnbmVkIHNhbXBsZXMgPSAwOwotICAgIHByaW50ZigidXNhZ2U6ICVzIFtzYW1wbGVzXVxuIiwgYXJndlswXSk7Ci0gICAgaWYgKGFyZ2MgPT0gMikgewotICAgICAgICBzYW1wbGVzID0gYXRvaSggYXJndlsxXSApOwotICAgICAgICBwcmludGYoIk11bHRpc2FtcGxlIGVuYWJsZWQ6IEdMX1NBTVBMRVMgPSAldVxuIiwgc2FtcGxlcyk7Ci0gICAgfQotCi0gICAgaWYgKCFpbml0R3JhcGhpY3Moc2FtcGxlcykpCi0gICAgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkdyYXBoaWNzIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwotICAgIH0KLQotICAgIGFwcEluaXQoKTsKLQotICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVUZW1wOwotICAgIGludCBmcmFtZUNvdW50ID0gMDsKLSAgICBnZXR0aW1lb2ZkYXkoJnRpbWVUZW1wLCBOVUxMKTsKLSAgICBkb3VibGUgdG90YWxUaW1lID0gdGltZVRlbXAudHZfdXNlYy8xMDAwMDAwLjAgKyB0aW1lVGVtcC50dl9zZWM7Ci0KLSAgICB3aGlsZSAoZ0FwcEFsaXZlKQotICAgIHsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdGltZU5vdzsKLQotICAgICAgICBnZXR0aW1lb2ZkYXkoJnRpbWVOb3csIE5VTEwpOwotICAgICAgICBhcHBSZW5kZXIodGltZU5vdy50dl9zZWMgKiAxMDAwICsgdGltZU5vdy50dl91c2VjIC8gMTAwMCwKLSAgICAgICAgICAgICAgICBzV2luZG93V2lkdGgsIHNXaW5kb3dIZWlnaHQpOwotICAgICAgICBjaGVja0dMRXJyb3JzKCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7Ci0gICAgICAgIGNoZWNrRUdMRXJyb3JzKCk7Ci0gICAgICAgIGZyYW1lQ291bnQrKzsKLSAgICB9Ci0KLSAgICBnZXR0aW1lb2ZkYXkoJnRpbWVUZW1wLCBOVUxMKTsKLQotICAgIGFwcERlaW5pdCgpOwotICAgIGRlaW5pdEdyYXBoaWNzKCk7Ci0KLSAgICB0b3RhbFRpbWUgPSAodGltZVRlbXAudHZfdXNlYy8xMDAwMDAwLjAgKyB0aW1lVGVtcC50dl9zZWMpIC0gdG90YWxUaW1lOwotICAgIHByaW50ZigidG90YWxUaW1lPSVmIHMsIGZyYW1lQ291bnQ9JWQsICUuMmYgZnBzXG4iLAotICAgICAgICAgICAgdG90YWxUaW1lLCBmcmFtZUNvdW50LCBmcmFtZUNvdW50L3RvdGFsVGltZSk7Ci0KLSAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlYmQzNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKLSAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgotICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQotICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgotICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgotICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgotICoKLSAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCi0gKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAkSWQ6IGFwcC5oLHYgMS4xNCAyMDA1LzAyLzA2IDIxOjEzOjU0IHRvbmljIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuMTQgJAotICovCi0KLSNpZm5kZWYgQVBQX0hfSU5DTFVERUQKLSNkZWZpbmUgQVBQX0hfSU5DTFVERUQKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotI2RlZmluZSBXSU5ET1dfREVGQVVMVF9XSURUSCAgICA2NDAKLSNkZWZpbmUgV0lORE9XX0RFRkFVTFRfSEVJR0hUICAgNDgwCi0KLSNkZWZpbmUgV0lORE9XX0JQUCAgICAgICAgICAgICAgMTYKLQotCi0vLyBUaGUgc2ltcGxlIGZyYW1ld29yayBleHBlY3RzIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRvIGRlZmluZSB0aGVzZSBmdW5jdGlvbnMuCi1leHRlcm4gdm9pZCBhcHBJbml0KCk7Ci1leHRlcm4gdm9pZCBhcHBEZWluaXQoKTsKLWV4dGVybiB2b2lkIGFwcFJlbmRlcihsb25nIHRpY2ssIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0KLS8qIFZhbHVlIGlzIG5vbi16ZXJvIHdoZW4gYXBwbGljYXRpb24gaXMgYWxpdmUsIGFuZCAwIHdoZW4gaXQgaXMgY2xvc2luZy4KLSAqIERlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZyYW1ld29yay4KLSAqLwotZXh0ZXJuIGludCBnQXBwQWxpdmU7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotCi0jZW5kaWYgLy8gIUFQUF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWFjYjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvY2Ftcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQotICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KLSAqCi0gKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgotICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCi0gKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCi0gKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCi0gKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCi0gKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKLSAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICRJZDogY2Ftcy5oLHYgMS43IDIwMDUvMDEvMzEgMjI6MTU6MTUgdG9uaWMgRXhwICQKLSAqICRSZXZpc2lvbjogMS43ICQKLSAqLwotCi0jaWZuZGVmIENBTVNfSF9JTkNMVURFRAotI2RlZmluZSBDQU1TX0hfSU5DTFVERUQKLQotCi0vKiBMZW5ndGggaW4gbWlsbGlzZWNvbmRzIG9mIG9uZSBjYW1lcmEgdHJhY2sgYmFzZSB1bml0LgotICogVGhlIHZhbHVlIG9yaWdpbmF0ZXMgZnJvbSB0aGUgbXVzaWMgc3luY2hyb25pemF0aW9uLgotICovCi0jZGVmaW5lIENBTVRSQUNLX0xFTiAgICA1NDQyCi0KLQotLy8gQ2FtZXJhIHRyYWNrIGRlZmluaXRpb24gZm9yIG9uZSBjYW1lcmEgdHJ1Y2tpbmcgc2hvdC4KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgLyogRml2ZSBwYXJhbWV0ZXJzIG9mIHNyY1s1XSBhbmQgZGVzdFs1XToKLSAgICAgKiBleWVYLCBleWVZLCBleWVaLCB2aWV3QW5nbGUsIHZpZXdIZWlnaHRPZmZzCi0gICAgICovCi0gICAgc2hvcnQgc3JjWzVdLCBkZXN0WzVdOwotICAgIHVuc2lnbmVkIGNoYXIgZGlzdDsgICAgIC8vIGlmID4wLCBjYW0gcm90YXRlcyBhcm91bmQgZXllIHh5IG9uIGRpc3QgKiAwLjEKLSAgICB1bnNpZ25lZCBjaGFyIGxlbjsgICAgICAvLyBsZW5ndGggbXVsdGlwbGllcgotfSBDQU1UUkFDSzsKLQotc3RhdGljIENBTVRSQUNLIHNDYW1UcmFja3NbXSA9Ci17Ci0gICAgeyB7IDQ1MDAsIDI3MDAsIDEwMCwgNzAsIC0zMCB9LCB7IDUwLCA1MCwgLTkwLCAtMTAwLCAwIH0sIDIwLCAxIH0sCi0gICAgeyB7IC0xNDQ4LCA0Mjk0LCAyNSwgMzYzLCAwIH0sIHsgLTEzNiwgMjAyLCAxMjUsIC05OCwgMTAwIH0sIDAsIDEgfSwKLSAgICB7IHsgMTQzNywgNDkzMCwgMjAwLCAtMjc1LCAtMjAgfSwgeyAxNjg0LCAwLCAwLCA5LCAwIH0sIDAsIDEgfSwKLSAgICB7IHsgMTgwMCwgMzYwOSwgMjAwLCAwLCA2NzUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgMCwgMSB9LAotICAgIHsgeyA5MjMsIDk5NiwgNTAsIDIzMzYsIC04MCB9LCB7IDAsIC0yMCwgLTUwLCAwLCAxNzAgfSwgMCwgMSB9LAotICAgIHsgeyAtMTY2MywgLTQzLCA2MDAsIDIxNzAsIDAgfSwgeyAyMCwgMCwgLTYwMCwgMCwgMTAwIH0sIDAsIDEgfSwKLSAgICB7IHsgMTA0OSwgLTE0MjAsIDE3NSwgMjExMSwgLTE3IH0sIHsgMCwgMCwgMCwgLTMzNCwgMCB9LCAwLCAyIH0sCi0gICAgeyB7IDAsIDAsIDUwLCAzMDAsIDI1IH0sIHsgMCwgMCwgMCwgMzAwLCAwIH0sIDcwLCAyIH0sCi0gICAgeyB7IC00NzMsIC05NTMsIDM1MDAsIC0zNTMsIC0zNTAgfSwgeyAwLCAwLCAtMjgwMCwgMCwgMCB9LCAwLCAyIH0sCi0gICAgeyB7IDE5MSwgMTkzOCwgMzUsIDExMzksIC0xNyB9LCB7IDEyMDUsIC0yOTA5LCAwLCAwLCAwIH0sIDAsIDIgfSwKLSAgICB7IHsgLTE0NDksIC0yNzAwLCAxNTAsIDAsIDAgfSwgeyAwLCAyMDAwLCAwLCAwLCAwIH0sIDAsIDIgfSwKLSAgICB7IHsgNTI3MywgNDk5MiwgNjUwLCAzNzMsIC01MCB9LCB7IC00NTk4LCAtMzA3MiwgMCwgMCwgMCB9LCAwLCAyIH0sCi0gICAgeyB7IDMyMjMsIC0zMjgyLCAxMDc1LCAtMzkzLCAtMjUgfSwgeyAxNjQ5LCAtMTY0OSwgMCwgMCwgMCB9LCAwLCAyIH0KLX07Ci0jZGVmaW5lIENBTVRSQUNLX0NPVU5UIChzaXplb2YoY2FtVHJhY2tzKSAvIHNpemVvZihjYW1UcmFja3NbMF0pKQotCi0KLSNlbmRpZiAvLyAhQ0FNU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9kZW1vLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMmYzOTguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkyICswLDAgQEAKLS8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCi0gKgotICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKLSAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgotICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQotICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgotICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgotICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgotICoKLSAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCi0gKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAkSWQ6IGRlbW8uYyx2IDEuMTAgMjAwNS8wMi8wOCAyMDo1NDozOSB0b25pYyBFeHAgJAotICogJFJldmlzaW9uOiAxLjEwICQKLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0KLSNpbmNsdWRlICJhcHAuaCIKLSNpbmNsdWRlICJzaGFwZXMuaCIKLSNpbmNsdWRlICJjYW1zLmgiCi0KLQotLy8gVG90YWwgcnVuIGxlbmd0aCBpcyAyMCAqIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQgbGVuZ3RoIChzZWUgY2Ftcy5oKS4KLSNkZWZpbmUgUlVOX0xFTkdUSCAgKDIwICogQ0FNVFJBQ0tfTEVOKQotI3VuZGVmIFBJCi0jZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzMmYKLSNkZWZpbmUgUkFORE9NX1VJTlRfTUFYIDY1NTM1Ci0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc1JhbmRvbVNlZWQgPSAwOwotCi1zdGF0aWMgdm9pZCBzZWVkUmFuZG9tKHVuc2lnbmVkIGxvbmcgc2VlZCkKLXsKLSAgICBzUmFuZG9tU2VlZCA9IHNlZWQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHJhbmRvbVVJbnQoKQotewotICAgIHNSYW5kb21TZWVkID0gc1JhbmRvbVNlZWQgKiAweDM0M2ZkICsgMHgyNjllYzM7Ci0gICAgcmV0dXJuIHNSYW5kb21TZWVkID4+IDE2OwotfQotCi0KLS8vIENhcHBlZCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdG8gZml4ZWQuCi1zdGF0aWMgbG9uZyBmbG9hdFRvRml4ZWQoZmxvYXQgdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlIDwgLTMyNzY4KSB2YWx1ZSA9IC0zMjc2ODsKLSAgICBpZiAodmFsdWUgPiAzMjc2NykgdmFsdWUgPSAzMjc2NzsKLSAgICByZXR1cm4gKGxvbmcpKHZhbHVlICogNjU1MzYpOwotfQotCi0jZGVmaW5lIEZJWEVEKHZhbHVlKSBmbG9hdFRvRml4ZWQodmFsdWUpCi0KLQotLy8gRGVmaW5pdGlvbiBvZiBvbmUgR0wgb2JqZWN0IGluIHRoaXMgZGVtby4KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAvKiBWZXJ0ZXggYXJyYXkgYW5kIGNvbG9yIGFycmF5IGFyZSBlbmFibGVkIGZvciBhbGwgb2JqZWN0cywgc28gdGhlaXIKLSAgICAgKiBwb2ludGVycyBtdXN0IGFsd2F5cyBiZSB2YWxpZCBhbmQgbm9uLU5VTEwuIE5vcm1hbCBhcnJheSBpcyBub3QKLSAgICAgKiB1c2VkIGJ5IHRoZSBncm91bmQgcGxhbmUsIHNvIHdoZW4gaXRzIHBvaW50ZXIgaXMgTlVMTCB0aGVuIG5vcm1hbAotICAgICAqIGFycmF5IHVzYWdlIGlzIGRpc2FibGVkLgotICAgICAqCi0gICAgICogVmVydGV4IGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAKLSAgICAgKiAoaS5lLiB0aWdodGx5IHBhY2tlZCBhcnJheSkuIENvbG9yIGFycmF5IGlzIHN1cHBvc2VkIHRvIGhhdmUgNAotICAgICAqIGNvbXBvbmVudHMgcGVyIGNvbG9yIHdpdGggR0xfVU5TSUdORURfQllURSBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCi0gICAgICogTm9ybWFsIGFycmF5IGlzIHN1cHBvc2VkIHRvIHVzZSBHTF9GSVhFRCBkYXRhdHlwZSBhbmQgc3RyaWRlIDAuCi0gICAgICovCi0gICAgR0xmaXhlZCAqdmVydGV4QXJyYXk7Ci0gICAgR0x1Ynl0ZSAqY29sb3JBcnJheTsKLSAgICBHTGZpeGVkICpub3JtYWxBcnJheTsKLSAgICBHTGludCB2ZXJ0ZXhDb21wb25lbnRzOwotICAgIEdMc2l6ZWkgY291bnQ7Ci19IEdMT0JKRUNUOwotCi0KLXN0YXRpYyBsb25nIHNTdGFydFRpY2sgPSAwOwotc3RhdGljIGxvbmcgc1RpY2sgPSAwOwotCi1zdGF0aWMgaW50IHNDdXJyZW50Q2FtVHJhY2sgPSAwOwotc3RhdGljIGxvbmcgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IDA7Ci1zdGF0aWMgbG9uZyBzTmV4dENhbVRyYWNrU3RhcnRUaWNrID0gMHg3ZmZmZmZmZjsKLQotc3RhdGljIEdMT0JKRUNUICpzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVF0gPSB7IE5VTEwgfTsKLXN0YXRpYyBHTE9CSkVDVCAqc0dyb3VuZFBsYW5lID0gTlVMTDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZmxvYXQgeCwgeSwgejsKLX0gVkVDVE9SMzsKLQotCi1zdGF0aWMgdm9pZCBmcmVlR0xPYmplY3QoR0xPQkpFQ1QgKm9iamVjdCkKLXsKLSAgICBpZiAob2JqZWN0ID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBmcmVlKG9iamVjdC0+bm9ybWFsQXJyYXkpOwotICAgIGZyZWUob2JqZWN0LT5jb2xvckFycmF5KTsKLSAgICBmcmVlKG9iamVjdC0+dmVydGV4QXJyYXkpOwotICAgIGZyZWUob2JqZWN0KTsKLX0KLQotCi1zdGF0aWMgR0xPQkpFQ1QgKiBuZXdHTE9iamVjdChsb25nIHZlcnRpY2VzLCBpbnQgdmVydGV4Q29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VOb3JtYWxBcnJheSkKLXsKLSAgICBHTE9CSkVDVCAqcmVzdWx0OwotICAgIHJlc3VsdCA9IChHTE9CSkVDVCAqKW1hbGxvYyhzaXplb2YoR0xPQkpFQ1QpKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdC0+Y291bnQgPSB2ZXJ0aWNlczsKLSAgICByZXN1bHQtPnZlcnRleENvbXBvbmVudHMgPSB2ZXJ0ZXhDb21wb25lbnRzOwotICAgIHJlc3VsdC0+dmVydGV4QXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIHZlcnRleENvbXBvbmVudHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOwotICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9IChHTHVieXRlICopbWFsbG9jKHZlcnRpY2VzICogNCAqIHNpemVvZihHTHVieXRlKSk7Ci0gICAgaWYgKHVzZU5vcm1hbEFycmF5KQotICAgIHsKLSAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheSA9IChHTGZpeGVkICopbWFsbG9jKHZlcnRpY2VzICogMyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoR0xmaXhlZCkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSBOVUxMOwotICAgIGlmIChyZXN1bHQtPnZlcnRleEFycmF5ID09IE5VTEwgfHwKLSAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5ID09IE5VTEwgfHwKLSAgICAgICAgKHVzZU5vcm1hbEFycmF5ICYmIHJlc3VsdC0+bm9ybWFsQXJyYXkgPT0gTlVMTCkpCi0gICAgewotICAgICAgICBmcmVlR0xPYmplY3QocmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgZHJhd0dMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCi17Ci0gICAgYXNzZXJ0KG9iamVjdCAhPSBOVUxMKTsKLQotICAgIGdsVmVydGV4UG9pbnRlcihvYmplY3QtPnZlcnRleENvbXBvbmVudHMsIEdMX0ZJWEVELAotICAgICAgICAgICAgICAgICAgICAwLCBvYmplY3QtPnZlcnRleEFycmF5KTsKLSAgICBnbENvbG9yUG9pbnRlcig0LCBHTF9VTlNJR05FRF9CWVRFLCAwLCBvYmplY3QtPmNvbG9yQXJyYXkpOwotCi0gICAgLy8gQWxyZWFkeSBkb25lIGluIGluaXRpYWxpemF0aW9uOgotICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgIC8vZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0KLSAgICBpZiAob2JqZWN0LT5ub3JtYWxBcnJheSkKLSAgICB7Ci0gICAgICAgIGdsTm9ybWFsUG9pbnRlcihHTF9GSVhFRCwgMCwgb2JqZWN0LT5ub3JtYWxBcnJheSk7Ci0gICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOwotICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIG9iamVjdC0+Y291bnQpOwotfQotCi0KLXN0YXRpYyB2b2lkIHZlY3RvcjNTdWIoVkVDVE9SMyAqZGVzdCwgVkVDVE9SMyAqdjEsIFZFQ1RPUjMgKnYyKQotewotICAgIGRlc3QtPnggPSB2MS0+eCAtIHYyLT54OwotICAgIGRlc3QtPnkgPSB2MS0+eSAtIHYyLT55OwotICAgIGRlc3QtPnogPSB2MS0+eiAtIHYyLT56OwotfQotCi0KLXN0YXRpYyB2b2lkIHN1cGVyU2hhcGVNYXAoVkVDVE9SMyAqcG9pbnQsIGZsb2F0IHIxLCBmbG9hdCByMiwgZmxvYXQgdCwgZmxvYXQgcCkKLXsKLSAgICAvLyBzcGhlcmUtbWFwcGluZyBvZiBzdXBlcnNoYXBlIHBhcmFtZXRlcnMKLSAgICBwb2ludC0+eCA9IChmbG9hdCkoY29zKHQpICogY29zKHApIC8gcjEgLyByMik7Ci0gICAgcG9pbnQtPnkgPSAoZmxvYXQpKHNpbih0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOwotICAgIHBvaW50LT56ID0gKGZsb2F0KShzaW4ocCkgLyByMik7Ci19Ci0KLQotc3RhdGljIGZsb2F0IHNzRnVuYyhjb25zdCBmbG9hdCB0LCBjb25zdCBmbG9hdCAqcCkKLXsKLSAgICByZXR1cm4gKGZsb2F0KShwb3cocG93KGZhYnMoY29zKHBbMF0gKiB0IC8gNCkpIC8gcFsxXSwgcFs0XSkgKwotICAgICAgICAgICAgICAgICAgICAgICBwb3coZmFicyhzaW4ocFswXSAqIHQgLyA0KSkgLyBwWzJdLCBwWzVdKSwgMSAvIHBbM10pKTsKLX0KLQotCi0vLyBDcmVhdGVzIGFuZCByZXR1cm5zIGEgc3VwZXJzaGFwZSBvYmplY3QuCi0vLyBCYXNlZCBvbiBQYXVsIEJvdXJrZSdzIFBPVi1SYXkgaW1wbGVtZW50YXRpb24uCi0vLyBodHRwOi8vYXN0cm9ub215LnN3aW4uZWR1LmF1L35wYm91cmtlL3BvdnJheS9zdXBlcnNoYXBlLwotc3RhdGljIEdMT0JKRUNUICogY3JlYXRlU3VwZXJTaGFwZShjb25zdCBmbG9hdCAqcGFyYW1zKQotewotICAgIGNvbnN0IGludCByZXNvbDEgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDNdOwotICAgIGNvbnN0IGludCByZXNvbDIgPSAoaW50KXBhcmFtc1tTVVBFUlNIQVBFX1BBUkFNUyAtIDJdOwotICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMiBmb3Igbm8gbWlycm9yZWQgYm90dG9tCi0gICAgLy8gKGxhdGl0dWRlQmVnaW49PTAgZm9yIC1waS8yIHRvIHBpLzIgb3JpZ2luYWxseSkKLSAgICBjb25zdCBpbnQgbGF0aXR1ZGVCZWdpbiA9IHJlc29sMiAvIDQ7Ci0gICAgY29uc3QgaW50IGxhdGl0dWRlRW5kID0gcmVzb2wyIC8gMjsgICAgLy8gbm9uLWluY2x1c2l2ZQotICAgIGNvbnN0IGludCBsb25naXR1ZGVDb3VudCA9IHJlc29sMTsKLSAgICBjb25zdCBpbnQgbGF0aXR1ZGVDb3VudCA9IGxhdGl0dWRlRW5kIC0gbGF0aXR1ZGVCZWdpbjsKLSAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSBsb25naXR1ZGVDb3VudCAqIGxhdGl0dWRlQ291bnQgKiAyOwotICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKLSAgICBHTE9CSkVDVCAqcmVzdWx0OwotICAgIGZsb2F0IGJhc2VDb2xvclszXTsKLSAgICBpbnQgYSwgbG9uZ2l0dWRlLCBsYXRpdHVkZTsKLSAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOwotCi0gICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDMsIDEpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQotICAgICAgICBiYXNlQ29sb3JbYV0gPSAoKHJhbmRvbVVJbnQoKSAlIDE1NSkgKyAxMDApIC8gMjU1LmY7Ci0KLSAgICBjdXJyZW50UXVhZCA9IDA7Ci0gICAgY3VycmVudFZlcnRleCA9IDA7Ci0KLSAgICAvLyBsb25naXR1ZGUgLXBpIHRvIHBpCi0gICAgZm9yIChsb25naXR1ZGUgPSAwOyBsb25naXR1ZGUgPCBsb25naXR1ZGVDb3VudDsgKytsb25naXR1ZGUpCi0gICAgewotCi0gICAgICAgIC8vIGxhdGl0dWRlIDAgdG8gcGkvMgotICAgICAgICBmb3IgKGxhdGl0dWRlID0gbGF0aXR1ZGVCZWdpbjsgbGF0aXR1ZGUgPCBsYXRpdHVkZUVuZDsgKytsYXRpdHVkZSkKLSAgICAgICAgewotICAgICAgICAgICAgZmxvYXQgdDEgPSAtUEkgKyBsb25naXR1ZGUgKiAyICogUEkgLyByZXNvbDE7Ci0gICAgICAgICAgICBmbG9hdCB0MiA9IC1QSSArIChsb25naXR1ZGUgKyAxKSAqIDIgKiBQSSAvIHJlc29sMTsKLSAgICAgICAgICAgIGZsb2F0IHAxID0gLVBJIC8gMiArIGxhdGl0dWRlICogMiAqIFBJIC8gcmVzb2wyOwotICAgICAgICAgICAgZmxvYXQgcDIgPSAtUEkgLyAyICsgKGxhdGl0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDI7Ci0gICAgICAgICAgICBmbG9hdCByMCwgcjEsIHIyLCByMzsKLQotICAgICAgICAgICAgcjAgPSBzc0Z1bmModDEsIHBhcmFtcyk7Ci0gICAgICAgICAgICByMSA9IHNzRnVuYyhwMSwgJnBhcmFtc1s2XSk7Ci0gICAgICAgICAgICByMiA9IHNzRnVuYyh0MiwgcGFyYW1zKTsKLSAgICAgICAgICAgIHIzID0gc3NGdW5jKHAyLCAmcGFyYW1zWzZdKTsKLQotICAgICAgICAgICAgaWYgKHIwICE9IDAgJiYgcjEgIT0gMCAmJiByMiAhPSAwICYmIHIzICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkVDVE9SMyBwYSwgcGIsIHBjLCBwZDsKLSAgICAgICAgICAgICAgICBWRUNUT1IzIHYxLCB2MiwgbjsKLSAgICAgICAgICAgICAgICBmbG9hdCBjYTsKLSAgICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgICAvL2Zsb2F0IGxlblNxLCBpbnZMZW5TcTsKLQotICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBhLCByMCwgcjEsIHQxLCBwMSk7Ci0gICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGIsIHIyLCByMSwgdDIsIHAxKTsKLSAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYywgcjIsIHIzLCB0MiwgcDIpOwotICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBkLCByMCwgcjMsIHQxLCBwMik7Ci0KLSAgICAgICAgICAgICAgICAvLyBrbHVkZ2UgdG8gc2V0IGxvd2VyIGVkZ2Ugb2YgdGhlIG9iamVjdCB0byBmaXhlZCBsZXZlbAotICAgICAgICAgICAgICAgIGlmIChsYXRpdHVkZSA9PSBsYXRpdHVkZUJlZ2luICsgMSkKLSAgICAgICAgICAgICAgICAgICAgcGEueiA9IHBiLnogPSAwOwotCi0gICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjEsICZwYiwgJnBhKTsKLSAgICAgICAgICAgICAgICB2ZWN0b3IzU3ViKCZ2MiwgJnBkLCAmcGEpOwotCi0gICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG5vcm1hbCB3aXRoIGNyb3NzIHByb2R1Y3QuCi0gICAgICAgICAgICAgICAgLyogICBpICAgIGogICAgayAgICAgIGkgICAgagotICAgICAgICAgICAgICAgICAqIHYxLnggdjEueSB2MS56IHwgdjEueCB2MS55Ci0gICAgICAgICAgICAgICAgICogdjIueCB2Mi55IHYyLnogfCB2Mi54IHYyLnkKLSAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgIG4ueCA9IHYxLnkgKiB2Mi56IC0gdjEueiAqIHYyLnk7Ci0gICAgICAgICAgICAgICAgbi55ID0gdjEueiAqIHYyLnggLSB2MS54ICogdjIuejsKLSAgICAgICAgICAgICAgICBuLnogPSB2MS54ICogdjIueSAtIHYxLnkgKiB2Mi54OwotCi0gICAgICAgICAgICAgICAgLyogUHJlLW5vcm1hbGl6YXRpb24gb2YgdGhlIG5vcm1hbHMgaXMgZGlzYWJsZWQgaGVyZSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICogdGhleSB3aWxsIGJlIG5vcm1hbGl6ZWQgYW55d2F5IGxhdGVyIGR1ZSB0byBhdXRvbWF0aWMKLSAgICAgICAgICAgICAgICAgKiBub3JtYWxpemF0aW9uIChHTF9OT1JNQUxJWkUpLiBJdCBpcyBlbmFibGVkIGJlY2F1c2UgdGhlCi0gICAgICAgICAgICAgICAgICogb2JqZWN0cyBhcmUgc2NhbGVkIHdpdGggZ2xTY2FsZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgIGxlblNxID0gbi54ICogbi54ICsgbi55ICogbi55ICsgbi56ICogbi56OwotICAgICAgICAgICAgICAgIGludkxlblNxID0gKGZsb2F0KSgxIC8gc3FydChsZW5TcSkpOwotICAgICAgICAgICAgICAgIG4ueCAqPSBpbnZMZW5TcTsKLSAgICAgICAgICAgICAgICBuLnkgKj0gaW52TGVuU3E7Ci0gICAgICAgICAgICAgICAgbi56ICo9IGludkxlblNxOwotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBjYSA9IHBhLnogKyAwLjVmOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gY3VycmVudFZlcnRleCAqIDM7Ci0gICAgICAgICAgICAgICAgICAgICBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDM7Ci0gICAgICAgICAgICAgICAgICAgICBpICs9IDMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2ldID0gRklYRUQobi54KTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMV0gPSBGSVhFRChuLnkpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5W2kgKyAyXSA9IEZJWEVEKG4ueik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OwotICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OwotICAgICAgICAgICAgICAgICAgICAgaSArPSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEsIGNvbG9yWzNdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMzsgKythKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xvclthXSA9IChpbnQpKGNhICogYmFzZUNvbG9yW2FdICogMjU1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvclthXSA+IDI1NSkgY29sb3JbYV0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gKEdMdWJ5dGUpY29sb3JbMF07Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMV0gPSAoR0x1Ynl0ZSljb2xvclsxXTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IChHTHVieXRlKWNvbG9yWzJdOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYS54KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYS55KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYS56KTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYi54KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYi55KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYi56KTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwYy54KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwYy55KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwYy56KTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogM10gPSBGSVhFRChwZC54KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMV0gPSBGSVhFRChwZC55KTsKLSAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAzICsgMl0gPSBGSVhFRChwZC56KTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICB9IC8vIHIwICYmIHIxICYmIHIyICYmIHIzCi0gICAgICAgICAgICArK2N1cnJlbnRRdWFkOwotICAgICAgICB9IC8vIGxhdGl0dWRlCi0gICAgfSAvLyBsb25naXR1ZGUKLQotICAgIC8vIFNldCBudW1iZXIgb2YgdmVydGljZXMgaW4gb2JqZWN0IHRvIHRoZSBhY3R1YWwgYW1vdW50IGNyZWF0ZWQuCi0gICAgcmVzdWx0LT5jb3VudCA9IGN1cnJlbnRWZXJ0ZXg7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZUdyb3VuZFBsYW5lKCkKLXsKLSAgICBjb25zdCBpbnQgc2NhbGUgPSA0OwotICAgIGNvbnN0IGludCB5QmVnaW4gPSAtMTUsIHlFbmQgPSAxNTsgICAgLy8gZW5kcyBhcmUgbm9uLWluY2x1c2l2ZQotICAgIGNvbnN0IGludCB4QmVnaW4gPSAtMTUsIHhFbmQgPSAxNTsKLSAgICBjb25zdCBsb25nIHRyaWFuZ2xlQ291bnQgPSAoeUVuZCAtIHlCZWdpbikgKiAoeEVuZCAtIHhCZWdpbikgKiAyOwotICAgIGNvbnN0IGxvbmcgdmVydGljZXMgPSB0cmlhbmdsZUNvdW50ICogMzsKLSAgICBHTE9CSkVDVCAqcmVzdWx0OwotICAgIGludCB4LCB5OwotICAgIGxvbmcgY3VycmVudFZlcnRleCwgY3VycmVudFF1YWQ7Ci0KLSAgICByZXN1bHQgPSBuZXdHTE9iamVjdCh2ZXJ0aWNlcywgMiwgMCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGN1cnJlbnRRdWFkID0gMDsKLSAgICBjdXJyZW50VmVydGV4ID0gMDsKLQotICAgIGZvciAoeSA9IHlCZWdpbjsgeSA8IHlFbmQ7ICsreSkKLSAgICB7Ci0gICAgICAgIGZvciAoeCA9IHhCZWdpbjsgeCA8IHhFbmQ7ICsreCkKLSAgICAgICAgewotICAgICAgICAgICAgR0x1Ynl0ZSBjb2xvcjsKLSAgICAgICAgICAgIGludCBpLCBhOwotICAgICAgICAgICAgY29sb3IgPSAoR0x1Ynl0ZSkoKHJhbmRvbVVJbnQoKSAmIDB4NWYpICsgODEpOyAgLy8gMTAxIDExMTEKLSAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiA0OyBpIDwgKGN1cnJlbnRWZXJ0ZXggKyA2KSAqIDQ7IGkgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaV0gPSBjb2xvcjsKLSAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gY29sb3I7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAyXSA9IGNvbG9yOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgM10gPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBeGlzIGJpdHMgZm9yIHF1YWQgdHJpYW5nbGVzOgotICAgICAgICAgICAgLy8geDogMDExMTAwICgweDFjKSwgeTogMTEwMDAxICgweDMxKSAgKGNsb2Nrd2lzZSkKLSAgICAgICAgICAgIC8vIHg6IDAwMTExMCAoMHgwZSksIHk6IDEwMDAxMSAoMHgyMykgIChjb3VudGVyLWNsb2Nrd2lzZSkKLSAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCA2OyArK2EpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IHhtID0geCArICgoMHgxYyA+PiBhKSAmIDEpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCB5bSA9IHkgKyAoKDB4MzEgPj4gYSkgJiAxKTsKLSAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBtID0gKGZsb2F0KShjb3MoeG0gKiAyKSAqIHNpbih5bSAqIDQpICogMC43NWYpOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDJdID0KLSAgICAgICAgICAgICAgICAgICAgRklYRUQoeG0gKiBzY2FsZSArIG0pOwotICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDIgKyAxXSA9Ci0gICAgICAgICAgICAgICAgICAgIEZJWEVEKHltICogc2NhbGUgKyBtKTsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRWZXJ0ZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK2N1cnJlbnRRdWFkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgZHJhd0dyb3VuZFBsYW5lKCkKLXsKLSAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKLSAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7Ci0gICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgIGdsQmxlbmRGdW5jKEdMX1pFUk8sIEdMX1NSQ19DT0xPUik7Ci0gICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKLQotICAgIGRyYXdHTE9iamVjdChzR3JvdW5kUGxhbmUpOwotCi0gICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOwotICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZHJhd0ZhZGVRdWFkKCkKLXsKLSAgICBzdGF0aWMgY29uc3QgR0xmaXhlZCBxdWFkVmVydGljZXNbXSA9IHsKLSAgICAgICAgLTB4MTAwMDAsIC0weDEwMDAwLAotICAgICAgICAgMHgxMDAwMCwgLTB4MTAwMDAsCi0gICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMCwKLSAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAotICAgICAgICAgMHgxMDAwMCwgIDB4MTAwMDAsCi0gICAgICAgIC0weDEwMDAwLCAgMHgxMDAwMAotICAgIH07Ci0KLSAgICBjb25zdCBpbnQgYmVnaW5GYWRlID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOwotICAgIGNvbnN0IGludCBlbmRGYWRlID0gc05leHRDYW1UcmFja1N0YXJ0VGljayAtIHNUaWNrOwotICAgIGNvbnN0IGludCBtaW5GYWRlID0gYmVnaW5GYWRlIDwgZW5kRmFkZSA/IGJlZ2luRmFkZSA6IGVuZEZhZGU7Ci0KLSAgICBpZiAobWluRmFkZSA8IDEwMjQpCi0gICAgewotICAgICAgICBjb25zdCBHTGZpeGVkIGZhZGVDb2xvciA9IG1pbkZhZGUgPDwgNjsKLSAgICAgICAgZ2xDb2xvcjR4KGZhZGVDb2xvciwgZmFkZUNvbG9yLCBmYWRlQ29sb3IsIDApOwotCi0gICAgICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICAgICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotICAgICAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOwotICAgICAgICBnbERpc2FibGUoR0xfTElHSFRJTkcpOwotCi0gICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgICAgICBnbExvYWRJZGVudGl0eSgpOwotCi0gICAgICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLQotICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0gICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7Ci0gICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgcXVhZFZlcnRpY2VzKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgNik7Ci0KLSAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0KLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0KLSAgICAgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOwotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgICAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICB9Ci19Ci0KLQotLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCi12b2lkIGFwcEluaXQoKQotewotICAgIGludCBhOwotCi0gICAgZ2xFbmFibGUoR0xfTk9STUFMSVpFKTsKLSAgICBnbEVuYWJsZShHTF9ERVBUSF9URVNUKTsKLSAgICBnbERpc2FibGUoR0xfQ1VMTF9GQUNFKTsKLSAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7Ci0KLSAgICBnbEVuYWJsZShHTF9MSUdIVElORyk7Ci0gICAgZ2xFbmFibGUoR0xfTElHSFQwKTsKLSAgICBnbEVuYWJsZShHTF9MSUdIVDEpOwotICAgIGdsRW5hYmxlKEdMX0xJR0hUMik7Ci0KLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1ZFUlRFWF9BUlJBWSk7Ci0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9DT0xPUl9BUlJBWSk7Ci0KLSAgICBzZWVkUmFuZG9tKDE1KTsKLQotICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCi0gICAgewotICAgICAgICBzU3VwZXJTaGFwZU9iamVjdHNbYV0gPSBjcmVhdGVTdXBlclNoYXBlKHNTdXBlclNoYXBlUGFyYW1zW2FdKTsKLSAgICAgICAgYXNzZXJ0KHNTdXBlclNoYXBlT2JqZWN0c1thXSAhPSBOVUxMKTsKLSAgICB9Ci0gICAgc0dyb3VuZFBsYW5lID0gY3JlYXRlR3JvdW5kUGxhbmUoKTsKLSAgICBhc3NlcnQoc0dyb3VuZFBsYW5lICE9IE5VTEwpOwotfQotCi0KLS8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgotdm9pZCBhcHBEZWluaXQoKQotewotICAgIGludCBhOwotICAgIGZvciAoYSA9IDA7IGEgPCBTVVBFUlNIQVBFX0NPVU5UOyArK2EpCi0gICAgICAgIGZyZWVHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbYV0pOwotICAgIGZyZWVHTE9iamVjdChzR3JvdW5kUGxhbmUpOwotfQotCi0KLXN0YXRpYyB2b2lkIGdsdVBlcnNwZWN0aXZlKEdMZmxvYXQgZm92eSwgR0xmbG9hdCBhc3BlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpCi17Ci0gICAgR0xmbG9hdCB4bWluLCB4bWF4LCB5bWluLCB5bWF4OwotCi0gICAgeW1heCA9IHpOZWFyICogKEdMZmxvYXQpdGFuKGZvdnkgKiBQSSAvIDM2MCk7Ci0gICAgeW1pbiA9IC15bWF4OwotICAgIHhtaW4gPSB5bWluICogYXNwZWN0OwotICAgIHhtYXggPSB5bWF4ICogYXNwZWN0OwotCi0gICAgZ2xGcnVzdHVteCgoR0xmaXhlZCkoeG1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHhtYXggKiA2NTUzNiksCi0gICAgICAgICAgICAgICAoR0xmaXhlZCkoeW1pbiAqIDY1NTM2KSwgKEdMZml4ZWQpKHltYXggKiA2NTUzNiksCi0gICAgICAgICAgICAgICAoR0xmaXhlZCkoek5lYXIgKiA2NTUzNiksIChHTGZpeGVkKSh6RmFyICogNjU1MzYpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBwcmVwYXJlRnJhbWUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICBnbENsZWFyQ29sb3J4KChHTGZpeGVkKSgwLjFmICogNjU1MzYpLAotICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuMmYgKiA2NTUzNiksCi0gICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoMC4zZiAqIDY1NTM2KSwgMHgxMDAwMCk7Ci0gICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0KLSAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBnbHVQZXJzcGVjdGl2ZSg0NSwgKGZsb2F0KXdpZHRoIC8gaGVpZ2h0LCAwLjVmLCAxNTApOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0KLSAgICBnbExvYWRJZGVudGl0eSgpOwotfQotCi0KLXN0YXRpYyB2b2lkIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKQotewotICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MFBvc2l0aW9uW10gPSB7IC0weDQwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAwIH07Ci0gICAgc3RhdGljIEdMZml4ZWQgbGlnaHQwRGlmZnVzZVtdID0geyAweDEwMDAwLCAweDY2NjYsIDAsIDB4MTAwMDAgfTsKLSAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFQb3NpdGlvbltdID0geyAweDEwMDAwLCAtMHgyMDAwMCwgLTB4MTAwMDAsIDAgfTsKLSAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDFEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyM2Q3LCAweDU5OTksIDB4MTAwMDAgfTsKLSAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJQb3NpdGlvbltdID0geyAtMHgxMDAwMCwgMCwgLTB4NDAwMDAsIDAgfTsKLSAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDJEaWZmdXNlW10gPSB7IDB4MTFlYiwgMHgyYjg1LCAweDIzZDcsIDB4MTAwMDAgfTsKLSAgICBzdGF0aWMgR0xmaXhlZCBtYXRlcmlhbFNwZWN1bGFyW10gPSB7IDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAsIDB4MTAwMDAgfTsKLQotICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX1BPU0lUSU9OLCBsaWdodDBQb3NpdGlvbik7Ci0gICAgZ2xMaWdodHh2KEdMX0xJR0hUMCwgR0xfRElGRlVTRSwgbGlnaHQwRGlmZnVzZSk7Ci0gICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfUE9TSVRJT04sIGxpZ2h0MVBvc2l0aW9uKTsKLSAgICBnbExpZ2h0eHYoR0xfTElHSFQxLCBHTF9ESUZGVVNFLCBsaWdodDFEaWZmdXNlKTsKLSAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9QT1NJVElPTiwgbGlnaHQyUG9zaXRpb24pOwotICAgIGdsTGlnaHR4dihHTF9MSUdIVDIsIEdMX0RJRkZVU0UsIGxpZ2h0MkRpZmZ1c2UpOwotICAgIGdsTWF0ZXJpYWx4dihHTF9GUk9OVF9BTkRfQkFDSywgR0xfU1BFQ1VMQVIsIG1hdGVyaWFsU3BlY3VsYXIpOwotCi0gICAgZ2xNYXRlcmlhbHgoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NISU5JTkVTUywgNjAgPDwgMTYpOwotICAgIGdsRW5hYmxlKEdMX0NPTE9SX01BVEVSSUFMKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkcmF3TW9kZWxzKGZsb2F0IHpTY2FsZSkKLXsKLSAgICBjb25zdCBpbnQgdHJhbnNsYXRpb25TY2FsZSA9IDk7Ci0gICAgaW50IHgsIHk7Ci0KLSAgICBzZWVkUmFuZG9tKDkpOwotCi0gICAgZ2xTY2FsZXgoMSA8PCAxNiwgMSA8PCAxNiwgKEdMZml4ZWQpKHpTY2FsZSAqIDY1NTM2KSk7Ci0KLSAgICBmb3IgKHkgPSAtNTsgeSA8PSA1OyArK3kpCi0gICAgewotICAgICAgICBmb3IgKHggPSAtNTsgeCA8PSA1OyArK3gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZsb2F0IGJ1aWxkaW5nU2NhbGU7Ci0gICAgICAgICAgICBHTGZpeGVkIGZpeGVkU2NhbGU7Ci0KLSAgICAgICAgICAgIGludCBjdXJTaGFwZSA9IHJhbmRvbVVJbnQoKSAlIFNVUEVSU0hBUEVfQ09VTlQ7Ci0gICAgICAgICAgICBidWlsZGluZ1NjYWxlID0gc1N1cGVyU2hhcGVQYXJhbXNbY3VyU2hhcGVdW1NVUEVSU0hBUEVfUEFSQU1TIC0gMV07Ci0gICAgICAgICAgICBmaXhlZFNjYWxlID0gKEdMZml4ZWQpKGJ1aWxkaW5nU2NhbGUgKiA2NTUzNik7Ci0KLSAgICAgICAgICAgIGdsUHVzaE1hdHJpeCgpOwotICAgICAgICAgICAgZ2xUcmFuc2xhdGV4KCh4ICogdHJhbnNsYXRpb25TY2FsZSkgKiA2NTUzNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoeSAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBnbFJvdGF0ZXgoKEdMZml4ZWQpKChyYW5kb21VSW50KCkgJSAzNjApIDw8IDE2KSwgMCwgMCwgMSA8PCAxNik7Ci0gICAgICAgICAgICBnbFNjYWxleChmaXhlZFNjYWxlLCBmaXhlZFNjYWxlLCBmaXhlZFNjYWxlKTsKLQotICAgICAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tjdXJTaGFwZV0pOwotICAgICAgICAgICAgZ2xQb3BNYXRyaXgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoeCA9IC0yOyB4IDw9IDI7ICsreCkKLSAgICB7Ci0gICAgICAgIGNvbnN0IGludCBzaGlwU2NhbGUxMDAgPSB0cmFuc2xhdGlvblNjYWxlICogNTAwOwotICAgICAgICBjb25zdCBpbnQgb2ZmczEwMCA9IHggKiBzaGlwU2NhbGUxMDAgKyAoc1RpY2sgJSBzaGlwU2NhbGUxMDApOwotICAgICAgICBmbG9hdCBvZmZzID0gb2ZmczEwMCAqIDAuMDFmOwotICAgICAgICBHTGZpeGVkIGZpeGVkT2ZmcyA9IChHTGZpeGVkKShvZmZzICogNjU1MzYpOwotICAgICAgICBnbFB1c2hNYXRyaXgoKTsKLSAgICAgICAgZ2xUcmFuc2xhdGV4KGZpeGVkT2ZmcywgLTQgKiA2NTUzNiwgMiA8PCAxNik7Ci0gICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbU1VQRVJTSEFQRV9DT1VOVCAtIDFdKTsKLSAgICAgICAgZ2xQb3BNYXRyaXgoKTsKLSAgICAgICAgZ2xQdXNoTWF0cml4KCk7Ci0gICAgICAgIGdsVHJhbnNsYXRleCgtNCAqIDY1NTM2LCBmaXhlZE9mZnMsIDQgPDwgMTYpOwotICAgICAgICBnbFJvdGF0ZXgoOTAgPDwgMTYsIDAsIDAsIDEgPDwgMTYpOwotICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7Ci0gICAgICAgIGdsUG9wTWF0cml4KCk7Ci0gICAgfQotfQotCi0KLS8qIEZvbGxvd2luZyBnbHVMb29rQXQgaW1wbGVtZW50YXRpb24gaXMgYWRhcHRlZCBmcm9tIHRoZQotICogTWVzYSAzRCBHcmFwaGljcyBsaWJyYXJ5LiBodHRwOi8vd3d3Lm1lc2EzZC5vcmcKLSAqLwotc3RhdGljIHZvaWQgZ2x1TG9va0F0KEdMZmxvYXQgZXlleCwgR0xmbG9hdCBleWV5LCBHTGZsb2F0IGV5ZXosCi0JICAgICAgICAgICAgICBHTGZsb2F0IGNlbnRlcngsIEdMZmxvYXQgY2VudGVyeSwgR0xmbG9hdCBjZW50ZXJ6LAotCSAgICAgICAgICAgICAgR0xmbG9hdCB1cHgsIEdMZmxvYXQgdXB5LCBHTGZsb2F0IHVweikKLXsKLSAgICBHTGZsb2F0IG1bMTZdOwotICAgIEdMZmxvYXQgeFszXSwgeVszXSwgelszXTsKLSAgICBHTGZsb2F0IG1hZzsKLQotICAgIC8qIE1ha2Ugcm90YXRpb24gbWF0cml4ICovCi0KLSAgICAvKiBaIHZlY3RvciAqLwotICAgIHpbMF0gPSBleWV4IC0gY2VudGVyeDsKLSAgICB6WzFdID0gZXlleSAtIGNlbnRlcnk7Ci0gICAgelsyXSA9IGV5ZXogLSBjZW50ZXJ6OwotICAgIG1hZyA9IChmbG9hdClzcXJ0KHpbMF0gKiB6WzBdICsgelsxXSAqIHpbMV0gKyB6WzJdICogelsyXSk7Ci0gICAgaWYgKG1hZykgewkJCS8qIG1waWNobGVyLCAxOTk1MDUxNSAqLwotICAgICAgICB6WzBdIC89IG1hZzsKLSAgICAgICAgelsxXSAvPSBtYWc7Ci0gICAgICAgIHpbMl0gLz0gbWFnOwotICAgIH0KLQotICAgIC8qIFkgdmVjdG9yICovCi0gICAgeVswXSA9IHVweDsKLSAgICB5WzFdID0gdXB5OwotICAgIHlbMl0gPSB1cHo7Ci0KLSAgICAvKiBYIHZlY3RvciA9IFkgY3Jvc3MgWiAqLwotICAgIHhbMF0gPSB5WzFdICogelsyXSAtIHlbMl0gKiB6WzFdOwotICAgIHhbMV0gPSAteVswXSAqIHpbMl0gKyB5WzJdICogelswXTsKLSAgICB4WzJdID0geVswXSAqIHpbMV0gLSB5WzFdICogelswXTsKLQotICAgIC8qIFJlY29tcHV0ZSBZID0gWiBjcm9zcyBYICovCi0gICAgeVswXSA9IHpbMV0gKiB4WzJdIC0gelsyXSAqIHhbMV07Ci0gICAgeVsxXSA9IC16WzBdICogeFsyXSArIHpbMl0gKiB4WzBdOwotICAgIHlbMl0gPSB6WzBdICogeFsxXSAtIHpbMV0gKiB4WzBdOwotCi0gICAgLyogbXBpY2hsZXIsIDE5OTUwNTE1ICovCi0gICAgLyogY3Jvc3MgcHJvZHVjdCBnaXZlcyBhcmVhIG9mIHBhcmFsbGVsb2dyYW0sIHdoaWNoIGlzIDwgMS4wIGZvcgotICAgICAqIG5vbi1wZXJwZW5kaWN1bGFyIHVuaXQtbGVuZ3RoIHZlY3RvcnM7IHNvIG5vcm1hbGl6ZSB4LCB5IGhlcmUKLSAgICAgKi8KLQotICAgIG1hZyA9IChmbG9hdClzcXJ0KHhbMF0gKiB4WzBdICsgeFsxXSAqIHhbMV0gKyB4WzJdICogeFsyXSk7Ci0gICAgaWYgKG1hZykgewotICAgICAgICB4WzBdIC89IG1hZzsKLSAgICAgICAgeFsxXSAvPSBtYWc7Ci0gICAgICAgIHhbMl0gLz0gbWFnOwotICAgIH0KLQotICAgIG1hZyA9IChmbG9hdClzcXJ0KHlbMF0gKiB5WzBdICsgeVsxXSAqIHlbMV0gKyB5WzJdICogeVsyXSk7Ci0gICAgaWYgKG1hZykgewotICAgICAgICB5WzBdIC89IG1hZzsKLSAgICAgICAgeVsxXSAvPSBtYWc7Ci0gICAgICAgIHlbMl0gLz0gbWFnOwotICAgIH0KLQotI2RlZmluZSBNKHJvdyxjb2wpICBtW2NvbCo0K3Jvd10KLSAgICBNKDAsIDApID0geFswXTsKLSAgICBNKDAsIDEpID0geFsxXTsKLSAgICBNKDAsIDIpID0geFsyXTsKLSAgICBNKDAsIDMpID0gMC4wOwotICAgIE0oMSwgMCkgPSB5WzBdOwotICAgIE0oMSwgMSkgPSB5WzFdOwotICAgIE0oMSwgMikgPSB5WzJdOwotICAgIE0oMSwgMykgPSAwLjA7Ci0gICAgTSgyLCAwKSA9IHpbMF07Ci0gICAgTSgyLCAxKSA9IHpbMV07Ci0gICAgTSgyLCAyKSA9IHpbMl07Ci0gICAgTSgyLCAzKSA9IDAuMDsKLSAgICBNKDMsIDApID0gMC4wOwotICAgIE0oMywgMSkgPSAwLjA7Ci0gICAgTSgzLCAyKSA9IDAuMDsKLSAgICBNKDMsIDMpID0gMS4wOwotI3VuZGVmIE0KLSAgICB7Ci0gICAgICAgIGludCBhOwotICAgICAgICBHTGZpeGVkIGZpeGVkTVsxNl07Ci0gICAgICAgIGZvciAoYSA9IDA7IGEgPCAxNjsgKythKQotICAgICAgICAgICAgZml4ZWRNW2FdID0gKEdMZml4ZWQpKG1bYV0gKiA2NTUzNik7Ci0gICAgICAgIGdsTXVsdE1hdHJpeHgoZml4ZWRNKTsKLSAgICB9Ci0KLSAgICAvKiBUcmFuc2xhdGUgRXllIHRvIE9yaWdpbiAqLwotICAgIGdsVHJhbnNsYXRleCgoR0xmaXhlZCkoLWV5ZXggKiA2NTUzNiksCi0gICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleSAqIDY1NTM2KSwKLSAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKC1leWV6ICogNjU1MzYpKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjYW1UcmFjaygpCi17Ci0gICAgZmxvYXQgbGVycFs1XTsKLSAgICBmbG9hdCBlWCwgZVksIGVaLCBjWCwgY1ksIGNaOwotICAgIGZsb2F0IHRyYWNrUG9zOwotICAgIENBTVRSQUNLICpjYW07Ci0gICAgbG9uZyBjdXJyZW50Q2FtVGljazsKLSAgICBpbnQgYTsKLQotICAgIGlmIChzTmV4dENhbVRyYWNrU3RhcnRUaWNrIDw9IHNUaWNrKQotICAgIHsKLSAgICAgICAgKytzQ3VycmVudENhbVRyYWNrOwotICAgICAgICBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrID0gc05leHRDYW1UcmFja1N0YXJ0VGljazsKLSAgICB9Ci0gICAgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdLmxlbiAqIENBTVRSQUNLX0xFTjsKLQotICAgIGNhbSA9ICZzQ2FtVHJhY2tzW3NDdXJyZW50Q2FtVHJhY2tdOwotICAgIGN1cnJlbnRDYW1UaWNrID0gc1RpY2sgLSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrOwotICAgIHRyYWNrUG9zID0gKGZsb2F0KWN1cnJlbnRDYW1UaWNrIC8gKENBTVRSQUNLX0xFTiAqIGNhbS0+bGVuKTsKLQotICAgIGZvciAoYSA9IDA7IGEgPCA1OyArK2EpCi0gICAgICAgIGxlcnBbYV0gPSAoY2FtLT5zcmNbYV0gKyBjYW0tPmRlc3RbYV0gKiB0cmFja1BvcykgKiAwLjAxZjsKLQotICAgIGlmIChjYW0tPmRpc3QpCi0gICAgewotICAgICAgICBmbG9hdCBkaXN0ID0gY2FtLT5kaXN0ICogMC4xZjsKLSAgICAgICAgY1ggPSBsZXJwWzBdOwotICAgICAgICBjWSA9IGxlcnBbMV07Ci0gICAgICAgIGNaID0gbGVycFsyXTsKLSAgICAgICAgZVggPSBjWCAtIChmbG9hdCljb3MobGVycFszXSkgKiBkaXN0OwotICAgICAgICBlWSA9IGNZIC0gKGZsb2F0KXNpbihsZXJwWzNdKSAqIGRpc3Q7Ci0gICAgICAgIGVaID0gY1ogLSBsZXJwWzRdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBlWCA9IGxlcnBbMF07Ci0gICAgICAgIGVZID0gbGVycFsxXTsKLSAgICAgICAgZVogPSBsZXJwWzJdOwotICAgICAgICBjWCA9IGVYICsgKGZsb2F0KWNvcyhsZXJwWzNdKTsKLSAgICAgICAgY1kgPSBlWSArIChmbG9hdClzaW4obGVycFszXSk7Ci0gICAgICAgIGNaID0gZVogKyBsZXJwWzRdOwotICAgIH0KLSAgICBnbHVMb29rQXQoZVgsIGVZLCBlWiwgY1gsIGNZLCBjWiwgMCwgMCwgMSk7Ci19Ci0KLQotLy8gQ2FsbGVkIGZyb20gdGhlIGFwcCBmcmFtZXdvcmsuCi0vKiBUaGUgdGljayBpcyBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzLCB3aWR0aCBhbmQgaGVpZ2h0Ci0gKiBhcmUgdGhlIGltYWdlIGRpbWVuc2lvbnMgdG8gYmUgcmVuZGVyZWQuCi0gKi8KLXZvaWQgYXBwUmVuZGVyKGxvbmcgdGljaywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIGlmIChzU3RhcnRUaWNrID09IDApCi0gICAgICAgIHNTdGFydFRpY2sgPSB0aWNrOwotICAgIGlmICghZ0FwcEFsaXZlKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBBY3R1YWwgdGljayB2YWx1ZSBpcyAiYmx1cnJlZCIgYSBsaXR0bGUgYml0LgotICAgIHNUaWNrID0gKHNUaWNrICsgdGljayAtIHNTdGFydFRpY2spID4+IDE7Ci0KLSAgICAvLyBUZXJtaW5hdGUgYXBwbGljYXRpb24gYWZ0ZXIgcnVubmluZyB0aHJvdWdoIHRoZSBkZW1vbnN0cmF0aW9uIG9uY2UuCi0gICAgaWYgKHNUaWNrID49IFJVTl9MRU5HVEgpCi0gICAgewotICAgICAgICBnQXBwQWxpdmUgPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gUHJlcGFyZSBPcGVuR0wgRVMgZm9yIHJlbmRlcmluZyBvZiB0aGUgZnJhbWUuCi0gICAgcHJlcGFyZUZyYW1lKHdpZHRoLCBoZWlnaHQpOwotCi0gICAgLy8gVXBkYXRlIHRoZSBjYW1lcmEgcG9zaXRpb24gYW5kIHNldCB0aGUgbG9va2F0LgotICAgIGNhbVRyYWNrKCk7Ci0KLSAgICAvLyBDb25maWd1cmUgZW52aXJvbm1lbnQuCi0gICAgY29uZmlndXJlTGlnaHRBbmRNYXRlcmlhbCgpOwotCi0gICAgLy8gRHJhdyB0aGUgcmVmbGVjdGlvbiBieSBkcmF3aW5nIG1vZGVscyB3aXRoIG5lZ2F0ZWQgWi1heGlzLgotICAgIGdsUHVzaE1hdHJpeCgpOwotICAgIGRyYXdNb2RlbHMoLTEpOwotICAgIGdsUG9wTWF0cml4KCk7Ci0KLSAgICAvLyBCbGVuZCB0aGUgZ3JvdW5kIHBsYW5lIHRvIHRoZSB3aW5kb3cuCi0gICAgZHJhd0dyb3VuZFBsYW5lKCk7Ci0KLSAgICAvLyBEcmF3IGFsbCB0aGUgbW9kZWxzIG5vcm1hbGx5LgotICAgIGRyYXdNb2RlbHMoMSk7Ci0KLSAgICAvLyBEcmF3IGZhZGUgcXVhZCBvdmVyIHdob2xlIHdpbmRvdyAod2hlbiBjaGFuZ2luZyBjYW1lcmFzKS4KLSAgICBkcmF3RmFkZVF1YWQoKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmODQxMC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotI2lmbmRlZiBfX2VnbF9oXwotI2RlZmluZSBfX2VnbF9oXwotCi0vKgotKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCi0qKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCi0qKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKLSoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCi0qKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5Ci0qKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAotKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgotKioKLSoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgotKioKLSoqIE5vdGUgdGhhdCwgYXMgcHJvdmlkZWQgaW4gdGhlIExpY2Vuc2UsIHRoZSBTb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotKiogIkFTIElTIiBiYXNpcywgd2l0aCBBTEwgRVhQUkVTUyBBTkQgSU1QTElFRCBXQVJSQU5USUVTIEFORCBDT05ESVRJT05TCi0qKiBESVNDTEFJTUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIElNUExJRUQgV0FSUkFOVElFUyBBTkQKLSoqIENPTkRJVElPTlMgT0YgTUVSQ0hBTlRBQklMSVRZLCBTQVRJU0ZBQ1RPUlkgUVVBTElUWSwgRklUTkVTUyBGT1IgQQotKiogUEFSVElDVUxBUiBQVVJQT1NFLCBBTkQgTk9OLUlORlJJTkdFTUVOVC4KLSoqCi0qKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKLSoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAotKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0qKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKLSoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qKgotKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKLSoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKLSoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCi0qKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KLSoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAotKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCi0qKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCi0qKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKLSoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgotKi8KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2VnbHR5cGVzLmg+Ci0KLS8qCi0qKiBlZ2x0eXBlcy5oIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gSXQgZGVmaW5lczoKLSoqCi0qKiAgICAgLSBFR0wgdHlwZXMgYW5kIHJlc291cmNlcwotKiogICAgIC0gTmF0aXZlIHR5cGVzCi0qKiAgICAgLSBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCi0qKgotKiogRUdMIHR5cGVzIGFuZCByZXNvdXJjZXMgYXJlIHRvIGJlIHR5cGVkZWYnZWQgd2l0aCBhcHByb3ByaWF0ZSBwbGF0Zm9ybQotKiogZGVwZW5kZW50IHJlc291cmNlIGhhbmRsZSB0eXBlcy4gRUdMaW50IG11c3QgYmUgYW4gaW50ZWdlciBvZiBhdCBsZWFzdAotKiogMzItYml0LgotKioKLSoqIE5hdGl2ZURpc3BsYXlUeXBlLCBOYXRpdmVXaW5kb3dUeXBlIGFuZCBOYXRpdmVQaXhtYXBUeXBlIGFyZSB0byBiZQotKiogcmVwbGFjZWQgd2l0aCBjb3JyZXNwb25kaW5nIHR5cGVzIG9mIHRoZSBuYXRpdmUgd2luZG93IHN5c3RlbSBpbiBlZ2wuaC4KLSoqCi0qKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzIG11c3QgbWF0Y2ggdGhlaXIgdHlwZXMuCi0qKgotKiogRXhhbXBsZSBlZ2x0eXBlcy5oOgotKi8KLQotI2lmIDAKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPG5hdGl2ZV93aW5kb3dfc3lzdGVtLmg+Ci0KLS8qCi0qKiBUeXBlcyBhbmQgcmVzb3VyY2VzCi0qLwotdHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKLXR5cGVkZWYgaW50MzJfdCBFR0xpbnQ7Ci10eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Ci10eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKLXR5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKLXR5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKLQotLyoKLSoqIEVHTCBhbmQgbmF0aXZlIGhhbmRsZSB2YWx1ZXMKLSovCi0jZGVmaW5lIEVHTF9ERUZBVUxUX0RJU1BMQVkgKChOYXRpdmVEaXNwbGF5VHlwZSkwKQotI2RlZmluZSBFR0xfTk9fQ09OVEVYVCAoKEVHTENvbnRleHQpMCkKLSNkZWZpbmUgRUdMX05PX0RJU1BMQVkgKChFR0xEaXNwbGF5KTApCi0jZGVmaW5lIEVHTF9OT19TVVJGQUNFICgoRUdMU3VyZmFjZSkwKQotCi0jZW5kaWYKLQotLyoKLSoqIFZlcnNpb25pbmcgYW5kIGV4dGVuc2lvbnMKLSovCi0jZGVmaW5lIEVHTF9WRVJTSU9OXzFfMAkJICAgICAgIDEKLQotLyoKLSoqIEJvb2xlYW4KLSovCi0jZGVmaW5lIEVHTF9GQUxTRQkJICAgICAgIDAKLSNkZWZpbmUgRUdMX1RSVUUJCSAgICAgICAxCi0KLS8qCi0qKiBFcnJvcnMKLSovCi0jZGVmaW5lIEVHTF9TVUNDRVNTCQkgICAgICAgMHgzMDAwCi0jZGVmaW5lIEVHTF9OT1RfSU5JVElBTElaRUQJICAgICAgIDB4MzAwMQotI2RlZmluZSBFR0xfQkFEX0FDQ0VTUwkJICAgICAgIDB4MzAwMgotI2RlZmluZSBFR0xfQkFEX0FMTE9DCQkgICAgICAgMHgzMDAzCi0jZGVmaW5lIEVHTF9CQURfQVRUUklCVVRFCSAgICAgICAweDMwMDQKLSNkZWZpbmUgRUdMX0JBRF9DT05GSUcJCSAgICAgICAweDMwMDUKLSNkZWZpbmUgRUdMX0JBRF9DT05URVhUCQkgICAgICAgMHgzMDA2Ci0jZGVmaW5lIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFICAgICAgICAweDMwMDcKLSNkZWZpbmUgRUdMX0JBRF9ESVNQTEFZCQkgICAgICAgMHgzMDA4Ci0jZGVmaW5lIEVHTF9CQURfTUFUQ0gJCSAgICAgICAweDMwMDkKLSNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfUElYTUFQCSAgICAgICAweDMwMEEKLSNkZWZpbmUgRUdMX0JBRF9OQVRJVkVfV0lORE9XCSAgICAgICAweDMwMEIKLSNkZWZpbmUgRUdMX0JBRF9QQVJBTUVURVIJICAgICAgIDB4MzAwQwotI2RlZmluZSBFR0xfQkFEX1NVUkZBQ0UJCSAgICAgICAweDMwMEQKLS8qIDB4MzAwRSAtIDB4MzAxRiByZXNlcnZlZCBmb3IgYWRkaXRpb25hbCBlcnJvcnMuICovCi0KLS8qCi0qKiBDb25maWcgYXR0cmlidXRlcwotKi8KLSNkZWZpbmUgRUdMX0JVRkZFUl9TSVpFCQkgICAgICAgMHgzMDIwCi0jZGVmaW5lIEVHTF9BTFBIQV9TSVpFCQkgICAgICAgMHgzMDIxCi0jZGVmaW5lIEVHTF9CTFVFX1NJWkUJCSAgICAgICAweDMwMjIKLSNkZWZpbmUgRUdMX0dSRUVOX1NJWkUJCSAgICAgICAweDMwMjMKLSNkZWZpbmUgRUdMX1JFRF9TSVpFCQkgICAgICAgMHgzMDI0Ci0jZGVmaW5lIEVHTF9ERVBUSF9TSVpFCQkgICAgICAgMHgzMDI1Ci0jZGVmaW5lIEVHTF9TVEVOQ0lMX1NJWkUJICAgICAgIDB4MzAyNgotI2RlZmluZSBFR0xfQ09ORklHX0NBVkVBVAkgICAgICAgMHgzMDI3Ci0jZGVmaW5lIEVHTF9DT05GSUdfSUQJCSAgICAgICAweDMwMjgKLSNkZWZpbmUgRUdMX0xFVkVMCQkgICAgICAgMHgzMDI5Ci0jZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQJICAgICAgIDB4MzAyQQotI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfUElYRUxTCSAgICAgICAweDMwMkIKLSNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1dJRFRICSAgICAgICAweDMwMkMKLSNkZWZpbmUgRUdMX05BVElWRV9SRU5ERVJBQkxFCSAgICAgICAweDMwMkQKLSNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfSUQJICAgICAgIDB4MzAyRQotI2RlZmluZSBFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFCSAgICAgICAweDMwMkYKLS8qI2RlZmluZSBFR0xfUFJFU0VSVkVEX1JFU09VUkNFUwkgMHgzMDMwKi8KLSNkZWZpbmUgRUdMX1NBTVBMRVMJCSAgICAgICAweDMwMzEKLSNkZWZpbmUgRUdMX1NBTVBMRV9CVUZGRVJTCSAgICAgICAweDMwMzIKLSNkZWZpbmUgRUdMX1NVUkZBQ0VfVFlQRQkgICAgICAgMHgzMDMzCi0jZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9UWVBFCSAgICAgICAweDMwMzQKLSNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUgICAgIDB4MzAzNQotI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUgICAgMHgzMDM2Ci0jZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUgICAgICAweDMwMzcKLQotLyoKLSoqIENvbmZpZyBhdHRyaWJ1dGUgYW5kIHZhbHVlCi0qLwotI2RlZmluZSBFR0xfTk9ORQkJICAgICAgIDB4MzAzOAotLyogMHgzMDM5IC0gMHgzMDRGIHJlc2VydmVkIGZvciBhZGRpdGlvbmFsIGNvbmZpZyBhdHRyaWJ1dGVzLiAqLwotCi0vKgotKiogQ29uZmlnIHZhbHVlcwotKi8KLSNkZWZpbmUgRUdMX0RPTlRfQ0FSRQkJICAgICAgICgoRUdMaW50KSAtMSkKLSNkZWZpbmUgRUdMX1BCVUZGRVJfQklUCQkgICAgICAgMHgwMQotI2RlZmluZSBFR0xfUElYTUFQX0JJVAkJICAgICAgIDB4MDIKLSNkZWZpbmUgRUdMX1dJTkRPV19CSVQJCSAgICAgICAweDA0Ci0jZGVmaW5lIEVHTF9TTE9XX0NPTkZJRwkJICAgICAgIDB4MzA1MAotI2RlZmluZSBFR0xfTk9OX0NPTkZPUk1BTlRfQ09ORklHICAgICAgMHgzMDUxCi0jZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9SR0IJICAgICAgIDB4MzA1MgotCi0vKgotKiogU3RyaW5nIG5hbWVzCi0qLwotI2RlZmluZSBFR0xfVkVORE9SCQkgICAgICAgMHgzMDUzCi0jZGVmaW5lIEVHTF9WRVJTSU9OCQkgICAgICAgMHgzMDU0Ci0jZGVmaW5lIEVHTF9FWFRFTlNJT05TCQkgICAgICAgMHgzMDU1Ci0KLS8qCi0qKiBTdXJmYWNlIGF0dHJpYnV0ZXMKLSovCi0jZGVmaW5lIEVHTF9IRUlHSFQJCSAgICAgICAweDMwNTYKLSNkZWZpbmUgRUdMX1dJRFRICQkgICAgICAgMHgzMDU3Ci0jZGVmaW5lIEVHTF9MQVJHRVNUX1BCVUZGRVIJICAgICAgIDB4MzA1OAotCi0vKgotKiogQ3VycmVudCBzdXJmYWNlcwotKi8KLSNkZWZpbmUgRUdMX0RSQVcJCSAgICAgICAweDMwNTkKLSNkZWZpbmUgRUdMX1JFQUQJCSAgICAgICAweDMwNUEKLQotLyoKLSoqIEVuZ2luZXMKLSovCi0jZGVmaW5lIEVHTF9DT1JFX05BVElWRV9FTkdJTkUJICAgICAgIDB4MzA1QgotCi0vKiAweDMwNUMtMHgzRkZGRiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCi0vKgotKiogRnVuY3Rpb25zCi0qLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1HTEFQSSBFR0xpbnQgQVBJRU5UUlkgZWdsR2V0RXJyb3IgKHZvaWQpOwotCi1HTEFQSSBFR0xEaXNwbGF5IEFQSUVOVFJZIGVnbEdldERpc3BsYXkgKE5hdGl2ZURpc3BsYXlUeXBlIGRpc3BsYXkpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xJbml0aWFsaXplIChFR0xEaXNwbGF5IGRweSwgRUdMaW50ICptYWpvciwgRUdMaW50ICptaW5vcik7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFRlcm1pbmF0ZSAoRUdMRGlzcGxheSBkcHkpOwotR0xBUEkgY29uc3QgY2hhciAqIEFQSUVOVFJZIGVnbFF1ZXJ5U3RyaW5nIChFR0xEaXNwbGF5IGRweSwgRUdMaW50IG5hbWUpOwotR0xBUEkgdm9pZCAoKiBBUElFTlRSWSBlZ2xHZXRQcm9jQWRkcmVzcyAoY29uc3QgY2hhciAqcHJvY25hbWUpKSgpOwotCi1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ3MgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgKmNvbmZpZ3MsIEVHTGludCBjb25maWdfc2l6ZSwgRUdMaW50ICpudW1fY29uZmlnKTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ2hvb3NlQ29uZmlnIChFR0xEaXNwbGF5IGRweSwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZyk7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbEdldENvbmZpZ0F0dHJpYiAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOwotCi1HTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1HTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBpeG1hcFN1cmZhY2UgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBOYXRpdmVQaXhtYXBUeXBlIHBpeG1hcCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1HTEFQSSBFR0xTdXJmYWNlIEFQSUVOVFJZIGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbERlc3Ryb3lTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlKTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsUXVlcnlTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKLQotR0xBUEkgRUdMQ29udGV4dCBBUElFTlRSWSBlZ2xDcmVhdGVDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgRUdMQ29udGV4dCBzaGFyZV9saXN0LCBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsRGVzdHJveUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCk7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbE1ha2VDdXJyZW50IChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3LCBFR0xTdXJmYWNlIHJlYWQsIEVHTENvbnRleHQgY3R4KTsKLUdMQVBJIEVHTENvbnRleHQgQVBJRU5UUlkgZWdsR2V0Q3VycmVudENvbnRleHQgKHZvaWQpOwotR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xHZXRDdXJyZW50U3VyZmFjZSAoRUdMaW50IHJlYWRkcmF3KTsKLUdMQVBJIEVHTERpc3BsYXkgQVBJRU5UUlkgZWdsR2V0Q3VycmVudERpc3BsYXkgKHZvaWQpOwotR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xRdWVyeUNvbnRleHQgKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGN0eCwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7Ci0KLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdEdMICh2b2lkKTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsV2FpdE5hdGl2ZSAoRUdMaW50IGVuZ2luZSk7Ci1HTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFN3YXBCdWZmZXJzIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBkcmF3KTsKLUdMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsQ29weUJ1ZmZlcnMgKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cmZhY2UsIE5hdGl2ZVBpeG1hcFR5cGUgdGFyZ2V0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fX2VnbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiMzZjOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0qKiBUeXBlcyBhbmQgcmVzb3VyY2VzCi0qLwotdHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKLXR5cGVkZWYgbG9uZyBFR0xpbnQ7Ci10eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Ci10eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKLXR5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKLXR5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKLXR5cGVkZWYgdm9pZCAqTmF0aXZlRGlzcGxheVR5cGU7Ci10eXBlZGVmIHZvaWQgKk5hdGl2ZVdpbmRvd1R5cGU7Ci10eXBlZGVmIHZvaWQgKk5hdGl2ZVBpeG1hcFR5cGU7Ci0KLS8qCi0qKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCi0qLwotI2RlZmluZSBFR0xfREVGQVVMVF9ESVNQTEFZICgoTmF0aXZlRGlzcGxheVR5cGUpMCkKLSNkZWZpbmUgRUdMX05PX0NPTlRFWFQgKChFR0xDb250ZXh0KTApCi0jZGVmaW5lIEVHTF9OT19ESVNQTEFZICgoRUdMRGlzcGxheSkwKQotI2RlZmluZSBFR0xfTk9fU1VSRkFDRSAoKEVHTFN1cmZhY2UpMCkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTQ4MjIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotI2lmbmRlZiBfX2dsX2hfCi0jZGVmaW5lIF9fZ2xfaF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotKiogTGljZW5zZSBBcHBsaWNhYmlsaXR5LiBFeGNlcHQgdG8gdGhlIGV4dGVudCBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlCi0qKiBtYWRlIHN1YmplY3QgdG8gYW4gYWx0ZXJuYXRpdmUgbGljZW5zZSBhcyBwZXJtaXR0ZWQgaW4gdGhlIFNHSSBGcmVlCi0qKiBTb2Z0d2FyZSBMaWNlbnNlIEIsIFZlcnNpb24gMS4wICh0aGUgIkxpY2Vuc2UiKSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKLSoqIGZpbGUgYXJlIHN1YmplY3Qgb25seSB0byB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgTGljZW5zZS4gWW91IG1heSBub3QgdXNlCi0qKiB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5Ci0qKiBvZiB0aGUgTGljZW5zZSBhdCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCBhdHRuOiBMZWdhbCBTZXJ2aWNlcywgMTYwMAotKiogQW1waGl0aGVhdHJlIFBhcmt3YXksIE1vdW50YWluIFZpZXcsIENBIDk0MDQzLTEzNTEsIG9yIGF0OgotKiogCi0qKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKLSoqIAotKiogTm90ZSB0aGF0LCBhcyBwcm92aWRlZCBpbiB0aGUgTGljZW5zZSwgdGhlIFNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qKiAiQVMgSVMiIGJhc2lzLCB3aXRoIEFMTCBFWFBSRVNTIEFORCBJTVBMSUVEIFdBUlJBTlRJRVMgQU5EIENPTkRJVElPTlMKLSoqIERJU0NMQUlNRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgSU1QTElFRCBXQVJSQU5USUVTIEFORAotKiogQ09ORElUSU9OUyBPRiBNRVJDSEFOVEFCSUxJVFksIFNBVElTRkFDVE9SWSBRVUFMSVRZLCBGSVRORVNTIEZPUiBBCi0qKiBQQVJUSUNVTEFSIFBVUlBPU0UsIEFORCBOT04tSU5GUklOR0VNRU5ULgotKiogCi0qKiBPcmlnaW5hbCBDb2RlLiBUaGUgT3JpZ2luYWwgQ29kZSBpczogT3BlbkdMIFNhbXBsZSBJbXBsZW1lbnRhdGlvbiwKLSoqIFZlcnNpb24gMS4yLjEsIHJlbGVhc2VkIEphbnVhcnkgMjYsIDIwMDAsIGRldmVsb3BlZCBieSBTaWxpY29uIEdyYXBoaWNzLAotKiogSW5jLiBUaGUgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTEtMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0qKiBDb3B5cmlnaHQgaW4gYW55IHBvcnRpb25zIGNyZWF0ZWQgYnkgdGhpcmQgcGFydGllcyBpcyBhcyBpbmRpY2F0ZWQKLSoqIGVsc2V3aGVyZSBoZXJlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qKiAKLSoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCi0qKiBlc3RhYmxpc2hlZCBieSBTR0kgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgT3JpZ2luYWwgQ29kZSBhcmUgVGhlCi0qKiBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtOiBBIFNwZWNpZmljYXRpb24gKFZlcnNpb24gMS4yLjEpLCByZWxlYXNlZAotKiogQXByaWwgMSwgMTk5OTsgVGhlIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW0gVXRpbGl0eSBMaWJyYXJ5IChWZXJzaW9uCi0qKiAxLjMpLCByZWxlYXNlZCBOb3ZlbWJlciA0LCAxOTk4OyBhbmQgT3BlbkdMKFIpIEdyYXBoaWNzIHdpdGggdGhlIFgKLSoqIFdpbmRvdyBTeXN0ZW0oUikgKFZlcnNpb24gMS4zKSwgcmVsZWFzZWQgT2N0b2JlciAxOSwgMTk5OC4gVGhpcyBzb2Z0d2FyZQotKiogd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbgotKiogcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcyBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nCi0qKiBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KLSovCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoQVBJRU5UUlkpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNlbmRpZgotCi0jaWZuZGVmIEFQSUVOVFJZCi0jZGVmaW5lIEFQSUVOVFJZCi0jZW5kaWYKLSNpZm5kZWYgR0xBUEkKLSNkZWZpbmUgR0xBUEkgZXh0ZXJuCi0jZW5kaWYKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xlbnVtOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMYm9vbGVhbjsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEdMYml0ZmllbGQ7Ci10eXBlZGVmIHNpZ25lZCBjaGFyIEdMYnl0ZTsKLXR5cGVkZWYgc2hvcnQgR0xzaG9ydDsKLXR5cGVkZWYgaW50IEdMaW50OwotdHlwZWRlZiBpbnQgR0xzaXplaTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBHTHVieXRlOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBHTHVzaG9ydDsKLXR5cGVkZWYgdW5zaWduZWQgaW50IEdMdWludDsKLXR5cGVkZWYgZmxvYXQgR0xmbG9hdDsKLXR5cGVkZWYgZmxvYXQgR0xjbGFtcGY7Ci10eXBlZGVmIHZvaWQgR0x2b2lkOwotdHlwZWRlZiBpbnQgR0xpbnRwdHJBUkI7Ci10eXBlZGVmIGludCBHTHNpemVpcHRyQVJCOwotdHlwZWRlZiBpbnQgR0xmaXhlZDsKLXR5cGVkZWYgaW50IEdMY2xhbXB4OwotLyogSW50ZXJuYWwgY29udmVuaWVuY2UgdHlwZWRlZnMgKi8KLXR5cGVkZWYgdm9pZCAoKl9HTGZ1bmNwdHIpKCk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFeHRlbnNpb25zICovCi0jZGVmaW5lIEdMX09FU19WRVJTSU9OXzFfMCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEdMX09FU19yZWFkX2Zvcm1hdCAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEdMX09FU19jb21wcmVzc2VkX3BhbGV0dGVkX3RleHR1cmUgMQotCi0vKiBDbGVhckJ1ZmZlck1hc2sgKi8KLSNkZWZpbmUgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKLSNkZWZpbmUgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKLQotLyogQm9vbGVhbiAqLwotI2RlZmluZSBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotCi0vKiBCZWdpbk1vZGUgKi8KLSNkZWZpbmUgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBHTF9MSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIEdMX1RSSUFOR0xFX1NUUklQICAgICAgICAgICAgICAgICAweDAwMDUKLSNkZWZpbmUgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgIDB4MDAwNgotCi0vKiBBbHBoYUZ1bmN0aW9uICovCi0jZGVmaW5lIEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMQotI2RlZmluZSBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyCi0jZGVmaW5lIEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDMKLSNkZWZpbmUgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNAotI2RlZmluZSBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA1Ci0jZGVmaW5lIEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDYKLSNkZWZpbmUgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNwotCi0vKiBCbGVuZGluZ0ZhY3RvckRlc3QgKi8KLSNkZWZpbmUgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMAotI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgMHgwMzAxCi0jZGVmaW5lIEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDIKLSNkZWZpbmUgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgIDB4MDMwMwotI2RlZmluZSBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMHgwMzA0Ci0jZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAweDAzMDUKLQotLyogQmxlbmRpbmdGYWN0b3JTcmMgKi8KLS8qICAgICAgR0xfWkVSTyAqLwotLyogICAgICBHTF9PTkUgKi8KLSNkZWZpbmUgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MDMwNgotI2RlZmluZSBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgMHgwMzA3Ci0jZGVmaW5lIEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAweDAzMDgKLS8qICAgICAgR0xfU1JDX0FMUEhBICovCi0vKiAgICAgIEdMX09ORV9NSU5VU19TUkNfQUxQSEEgKi8KLS8qICAgICAgR0xfRFNUX0FMUEhBICovCi0vKiAgICAgIEdMX09ORV9NSU5VU19EU1RfQUxQSEEgKi8KLQotLyogQ29sb3JNYXRlcmlhbEZhY2UgKi8KLS8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KLQotLyogQ29sb3JNYXRlcmlhbFBhcmFtZXRlciAqLwotLyogICAgICBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICovCi0KLS8qIENvbG9yUG9pbnRlclR5cGUgKi8KLS8qICAgICAgR0xfVU5TSUdORURfQllURSAqLwotLyogICAgICBHTF9GTE9BVCAqLwotLyogICAgICBHTF9GSVhFRCAqLwotCi0vKiBDdWxsRmFjZU1vZGUgKi8KLSNkZWZpbmUgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwNAotI2RlZmluZSBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA1Ci0jZGVmaW5lIEdMX0ZST05UX0FORF9CQUNLICAgICAgICAgICAgICAgICAweDA0MDgKLQotLyogRGVwdGhGdW5jdGlvbiAqLwotLyogICAgICBHTF9ORVZFUiAqLwotLyogICAgICBHTF9MRVNTICovCi0vKiAgICAgIEdMX0VRVUFMICovCi0vKiAgICAgIEdMX0xFUVVBTCAqLwotLyogICAgICBHTF9HUkVBVEVSICovCi0vKiAgICAgIEdMX05PVEVRVUFMICovCi0vKiAgICAgIEdMX0dFUVVBTCAqLwotLyogICAgICBHTF9BTFdBWVMgKi8KLQotLyogRW5hYmxlQ2FwICovCi0jZGVmaW5lIEdMX0ZPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCNjAKLSNkZWZpbmUgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgIDB4MEI1MAotI2RlZmluZSBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgMHgwREUxCi0jZGVmaW5lIEdMX0NVTExfRkFDRSAgICAgICAgICAgICAgICAgICAgICAweDBCNDQKLSNkZWZpbmUgR0xfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEJDMAotI2RlZmluZSBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkUyCi0jZGVmaW5lIEdMX0NPTE9SX0xPR0lDX09QICAgICAgICAgICAgICAgICAweDBCRjIKLSNkZWZpbmUgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEJEMAotI2RlZmluZSBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQjkwCi0jZGVmaW5lIEdMX0RFUFRIX1RFU1QgICAgICAgICAgICAgICAgICAgICAweDBCNzEKLS8qICAgICAgR0xfTElHSFQwICovCi0vKiAgICAgIEdMX0xJR0hUMSAqLwotLyogICAgICBHTF9MSUdIVDIgKi8KLS8qICAgICAgR0xfTElHSFQzICovCi0vKiAgICAgIEdMX0xJR0hUNCAqLwotLyogICAgICBHTF9MSUdIVDUgKi8KLS8qICAgICAgR0xfTElHSFQ2ICovCi0vKiAgICAgIEdMX0xJR0hUNyAqLwotI2RlZmluZSBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgMHgwQjEwCi0jZGVmaW5lIEdMX0xJTkVfU01PT1RIICAgICAgICAgICAgICAgICAgICAweDBCMjAKLSNkZWZpbmUgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgIDB4MEMxMQotI2RlZmluZSBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgMHgwQjU3Ci0jZGVmaW5lIEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAweDBCQTEKLSNkZWZpbmUgR0xfUkVTQ0FMRV9OT1JNQUwgICAgICAgICAgICAgICAgIDB4ODAzQQotI2RlZmluZSBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgMHg4MDM3Ci0jZGVmaW5lIEdMX1ZFUlRFWF9BUlJBWSAgICAgICAgICAgICAgICAgICAweDgwNzQKLSNkZWZpbmUgR0xfTk9STUFMX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NQotI2RlZmluZSBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgMHg4MDc2Ci0jZGVmaW5lIEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAweDgwNzgKLSNkZWZpbmUgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgIDB4ODA5RAotI2RlZmluZSBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgMHg4MDlFCi0jZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAweDgwOUYKLSNkZWZpbmUgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgIDB4ODBBMAotCi0vKiBFcnJvckNvZGUgKi8KLSNkZWZpbmUgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgIDB4MDUwMAotI2RlZmluZSBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgMHgwNTAxCi0jZGVmaW5lIEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAweDA1MDIKLSNkZWZpbmUgR0xfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAgICAgIDB4MDUwMwotI2RlZmluZSBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgMHgwNTA0Ci0jZGVmaW5lIEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAweDA1MDUKLQotLyogRm9nTW9kZSAqLwotLyogICAgICBHTF9MSU5FQVIgKi8KLSNkZWZpbmUgR0xfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAotI2RlZmluZSBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCi0KLS8qIEZvZ1BhcmFtZXRlciAqLwotI2RlZmluZSBHTF9GT0dfREVOU0lUWSAgICAgICAgICAgICAgICAgICAgMHgwQjYyCi0jZGVmaW5lIEdMX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAweDBCNjMKLSNkZWZpbmUgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NAotI2RlZmluZSBHTF9GT0dfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY1Ci0jZGVmaW5lIEdMX0ZPR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAweDBCNjYKLQotLyogRnJvbnRGYWNlRGlyZWN0aW9uICovCi0jZGVmaW5lIEdMX0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAKLSNkZWZpbmUgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMQotCi0vKiBHZXRQTmFtZSAqLwotI2RlZmluZSBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgMHgwQjEyCi0jZGVmaW5lIEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAweDBCMjIKLSNkZWZpbmUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgIDB4ODQ2RAotI2RlZmluZSBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgMHg4NDZFCi0jZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgMHg4QjlBCi0jZGVmaW5lIEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAweDhCOUIKLSNkZWZpbmUgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQzMQotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TSVpFICAgICAgICAgICAgICAgMHgwRDMzCi0jZGVmaW5lIEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAweDBEMzYKLSNkZWZpbmUgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgIDB4MEQzOAotI2RlZmluZSBHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgMHgwRDM5Ci0jZGVmaW5lIEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAweDBEM0EKLSNkZWZpbmUgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgIDB4ODBFOAotI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyAgICAgICAgICAgMHg4MEU5Ci0jZGVmaW5lIEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAweDg0RTIKLSNkZWZpbmUgR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIDB4ODZBMgotI2RlZmluZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgMHg4NkEzCi0jZGVmaW5lIEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAweDBENTAKLSNkZWZpbmUgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1MgotI2RlZmluZSBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDUzCi0jZGVmaW5lIEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAweDBENTQKLSNkZWZpbmUgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NQotI2RlZmluZSBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU2Ci0jZGVmaW5lIEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAweDBENTcKLQotLyogSGludE1vZGUgKi8KLSNkZWZpbmUgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMAotI2RlZmluZSBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTAxCi0jZGVmaW5lIEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDIKLQotLyogSGludFRhcmdldCAqLwotI2RlZmluZSBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgMHgwQzUwCi0jZGVmaW5lIEdMX1BPSU5UX1NNT09USF9ISU5UICAgICAgICAgICAgICAweDBDNTEKLSNkZWZpbmUgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgIDB4MEM1MgotI2RlZmluZSBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgMHgwQzUzCi0jZGVmaW5lIEdMX0ZPR19ISU5UICAgICAgICAgICAgICAgICAgICAgICAweDBDNTQKLQotLyogTGlnaHRNb2RlbFBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UICAgICAgICAgICAgMHgwQjUzCi0jZGVmaW5lIEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAweDBCNTIKLQotLyogTGlnaHRQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMAotI2RlZmluZSBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAxCi0jZGVmaW5lIEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAweDEyMDIKLSNkZWZpbmUgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMwotI2RlZmluZSBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgMHgxMjA0Ci0jZGVmaW5lIEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAweDEyMDUKLSNkZWZpbmUgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgIDB4MTIwNgotI2RlZmluZSBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgMHgxMjA3Ci0jZGVmaW5lIEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAweDEyMDgKLSNkZWZpbmUgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgIDB4MTIwOQotCi0vKiBEYXRhVHlwZSAqLwotI2RlZmluZSBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwCi0jZGVmaW5lIEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAweDE0MDEKLSNkZWZpbmUgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwMgotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgMHgxNDAzCi0jZGVmaW5lIEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDYKLSNkZWZpbmUgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwQwotCi0vKiBMb2dpY09wICovCi0jZGVmaW5lIEdMX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDAKLSNkZWZpbmUgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMQotI2RlZmluZSBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgMHgxNTAyCi0jZGVmaW5lIEdMX0NPUFkgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDMKLSNkZWZpbmUgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgIDB4MTUwNAotI2RlZmluZSBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA1Ci0jZGVmaW5lIEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDYKLSNkZWZpbmUgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNwotI2RlZmluZSBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA4Ci0jZGVmaW5lIEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDkKLSNkZWZpbmUgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwQQotI2RlZmluZSBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgMHgxNTBCCi0jZGVmaW5lIEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAweDE1MEMKLSNkZWZpbmUgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgIDB4MTUwRAotI2RlZmluZSBHTF9OQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBFCi0jZGVmaW5lIEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEYKLQotLyogTWF0ZXJpYWxGYWNlICovCi0vKiAgICAgIEdMX0ZST05UX0FORF9CQUNLICovCi0KLS8qIE1hdGVyaWFsUGFyYW1ldGVyICovCi0jZGVmaW5lIEdMX0VNSVNTSU9OICAgICAgICAgICAgICAgICAgICAgICAweDE2MDAKLSNkZWZpbmUgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMQotI2RlZmluZSBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgMHgxNjAyCi0vKiAgICAgIEdMX0FNQklFTlQgKi8KLS8qICAgICAgR0xfRElGRlVTRSAqLwotLyogICAgICBHTF9TUEVDVUxBUiAqLwotCi0vKiBNYXRyaXhNb2RlICovCi0jZGVmaW5lIEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAweDE3MDAKLSNkZWZpbmUgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgIDB4MTcwMQotI2RlZmluZSBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgMHgxNzAyCi0KLS8qIE5vcm1hbFBvaW50ZXJUeXBlICovCi0vKiAgICAgIEdMX0JZVEUgKi8KLS8qICAgICAgR0xfU0hPUlQgKi8KLS8qICAgICAgR0xfRkxPQVQgKi8KLS8qICAgICAgR0xfRklYRUQgKi8KLQotLyogUGl4ZWxGb3JtYXQgKi8KLSNkZWZpbmUgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwNgotI2RlZmluZSBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA3Ci0jZGVmaW5lIEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDgKLSNkZWZpbmUgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOQotI2RlZmluZSBHTF9MVU1JTkFOQ0VfQUxQSEEgICAgICAgICAgICAgICAgMHgxOTBBCi0KLS8qIFBpeGVsU3RvcmVQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgIDB4MENGNQotI2RlZmluZSBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgMHgwRDA1Ci0KLS8qIFBpeGVsVHlwZSAqLwotLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCi0jZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAweDgwMzMKLSNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgIDB4ODAzNAotI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSAgICAgICAgICAgMHg4MzYzCi0KLS8qIFNoYWRpbmdNb2RlbCAqLwotI2RlZmluZSBHTF9GTEFUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRDAwCi0jZGVmaW5lIEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDEKLQotLyogU3RlbmNpbEZ1bmN0aW9uICovCi0vKiAgICAgIEdMX05FVkVSICovCi0vKiAgICAgIEdMX0xFU1MgKi8KLS8qICAgICAgR0xfRVFVQUwgKi8KLS8qICAgICAgR0xfTEVRVUFMICovCi0vKiAgICAgIEdMX0dSRUFURVIgKi8KLS8qICAgICAgR0xfTk9URVFVQUwgKi8KLS8qICAgICAgR0xfR0VRVUFMICovCi0vKiAgICAgIEdMX0FMV0FZUyAqLwotCi0vKiBTdGVuY2lsT3AgKi8KLS8qICAgICAgR0xfWkVSTyAqLwotI2RlZmluZSBHTF9LRUVQICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAwCi0jZGVmaW5lIEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDEKLSNkZWZpbmUgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMgotI2RlZmluZSBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAzCi0vKiAgICAgIEdMX0lOVkVSVCAqLwotCi0vKiBTdHJpbmdOYW1lICovCi0jZGVmaW5lIEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAKLSNkZWZpbmUgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMQotI2RlZmluZSBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAyCi0jZGVmaW5lIEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAweDFGMDMKLQotLyogVGV4Q29vcmRQb2ludGVyVHlwZSAqLwotLyogICAgICBHTF9TSE9SVCAqLwotLyogICAgICBHTF9GTE9BVCAqLwotLyogICAgICBHTF9GSVhFRCAqLwotLyogICAgICBHTF9CWVRFICovCi0KLS8qIFRleHR1cmVFbnZNb2RlICovCi0jZGVmaW5lIEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAweDIxMDAKLSNkZWZpbmUgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMQotLyogICAgICBHTF9CTEVORCAqLwotI2RlZmluZSBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTA0Ci0vKiAgICAgIEdMX1JFUExBQ0UgKi8KLQotLyogVGV4dHVyZUVudlBhcmFtZXRlciAqLwotI2RlZmluZSBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgMHgyMjAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfRU5WX0NPTE9SICAgICAgICAgICAgICAweDIyMDEKLQotLyogVGV4dHVyZUVudlRhcmdldCAqLwotI2RlZmluZSBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgMHgyMzAwCi0KLS8qIFRleHR1cmVNYWdGaWx0ZXIgKi8KLSNkZWZpbmUgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYwMAotI2RlZmluZSBHTF9MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAxCi0KLS8qIFRleHR1cmVNaW5GaWx0ZXIgKi8KLS8qICAgICAgR0xfTkVBUkVTVCAqLwotLyogICAgICBHTF9MSU5FQVIgKi8KLSNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgIDB4MjcwMAotI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgMHgyNzAxCi0jZGVmaW5lIEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAweDI3MDIKLSNkZWZpbmUgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgIDB4MjcwMwotCi0vKiBUZXh0dXJlUGFyYW1ldGVyTmFtZSAqLwotI2RlZmluZSBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgMHgyODAwCi0jZGVmaW5lIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDEKLSNkZWZpbmUgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgIDB4MjgwMgotI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgMHgyODAzCi0KLS8qIFRleHR1cmVUYXJnZXQgKi8KLS8qICAgICAgR0xfVEVYVFVSRV8yRCAqLwotCi0vKiBUZXh0dXJlVW5pdCAqLwotI2RlZmluZSBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMwCi0jZGVmaW5lIEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAweDg0QzEKLSNkZWZpbmUgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMgotI2RlZmluZSBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMzCi0jZGVmaW5lIEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzQKLSNkZWZpbmUgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNQotI2RlZmluZSBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM2Ci0jZGVmaW5lIEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzcKLSNkZWZpbmUgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgIDB4ODRDOAotI2RlZmluZSBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM5Ci0jZGVmaW5lIEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAweDg0Q0EKLSNkZWZpbmUgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQgotI2RlZmluZSBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgMHg4NENDCi0jZGVmaW5lIEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAweDg0Q0QKLSNkZWZpbmUgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRQotI2RlZmluZSBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgMHg4NENGCi0jZGVmaW5lIEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAweDg0RDAKLSNkZWZpbmUgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMQotI2RlZmluZSBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgMHg4NEQyCi0jZGVmaW5lIEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAweDg0RDMKLSNkZWZpbmUgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgIDB4ODRENAotI2RlZmluZSBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ1Ci0jZGVmaW5lIEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAweDg0RDYKLSNkZWZpbmUgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgIDB4ODRENwotI2RlZmluZSBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ4Ci0jZGVmaW5lIEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAweDg0RDkKLSNkZWZpbmUgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQQotI2RlZmluZSBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgMHg4NERCCi0jZGVmaW5lIEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAweDg0REMKLSNkZWZpbmUgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgIDB4ODRERAotI2RlZmluZSBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgMHg4NERFCi0jZGVmaW5lIEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAweDg0REYKLQotLyogVGV4dHVyZVdyYXBNb2RlICovCi0jZGVmaW5lIEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAweDI5MDEKLSNkZWZpbmUgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgIDB4ODEyRgotCi0vKiBQaXhlbEludGVybmFsRm9ybWF0ICovCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTAKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5MQotI2RlZmluZSBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4QjkyCi0jZGVmaW5lIEdMX1BBTEVUVEU0X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTMKLSNkZWZpbmUgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5NAotI2RlZmluZSBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgMHg4Qjk1Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE4X09FUyAgICAgICAgICAgICAweDhCOTYKLSNkZWZpbmUgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgIDB4OEI5NwotI2RlZmluZSBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgMHg4Qjk4Ci0jZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjVfQTFfT0VTICAgICAgICAgICAweDhCOTkKLQotLyogVmVydGV4UG9pbnRlclR5cGUgKi8KLS8qICAgICAgR0xfU0hPUlQgKi8KLS8qICAgICAgR0xfRkxPQVQgKi8KLS8qICAgICAgR0xfRklYRUQgKi8KLS8qICAgICAgR0xfQllURSAqLwotCi0vKiBMaWdodE5hbWUgKi8KLSNkZWZpbmUgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAotI2RlZmluZSBHTF9MSUdIVDEgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCi0jZGVmaW5lIEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDIKLSNkZWZpbmUgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMwotI2RlZmluZSBHTF9MSUdIVDQgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA0Ci0jZGVmaW5lIEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDUKLSNkZWZpbmUgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNgotI2RlZmluZSBHTF9MSUdIVDcgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA3Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQWxwaGFGdW5jIChHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmN4IChHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xCaW5kVGV4dHVyZSAoR0xlbnVtIHRhcmdldCwgR0x1aW50IHRleHR1cmUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJsZW5kRnVuYyAoR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhciAoR0xiaXRmaWVsZCBtYXNrKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yIChHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJDb2xvcnggKEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckRlcHRoZiAoR0xjbGFtcGYgZGVwdGgpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGh4IChHTGNsYW1weCBkZXB0aCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJTdGVuY2lsIChHTGludCBzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGllbnRBY3RpdmVUZXh0dXJlIChHTGVudW0gdGV4dHVyZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0ZiAoR0xmbG9hdCByZWQsIEdMZmxvYXQgZ3JlZW4sIEdMZmxvYXQgYmx1ZSwgR0xmbG9hdCBhbHBoYSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3I0eCAoR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JNYXNrIChHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbG9yUG9pbnRlciAoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4SW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29weVRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ3VsbEZhY2UgKEdMZW51bSBtb2RlKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZWxldGVUZXh0dXJlcyAoR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnRleHR1cmVzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aEZ1bmMgKEdMZW51bSBmdW5jKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aE1hc2sgKEdMYm9vbGVhbiBmbGFnKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEZXB0aFJhbmdlZiAoR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2V4IChHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZSAoR0xlbnVtIGNhcCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGlzYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbERyYXdBcnJheXMgKEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0VsZW1lbnRzIChHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRW5hYmxlIChHTGVudW0gY2FwKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGVDbGllbnRTdGF0ZSAoR0xlbnVtIGFycmF5KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGaW5pc2ggKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZsdXNoICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2dmIChHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2Z2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9neCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4diAoR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZyb250RmFjZSAoR0xlbnVtIG1vZGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW1mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGcnVzdHVteCAoR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2VuVGV4dHVyZXMgKEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyk7Ci1HTEFQSSBHTGVudW0gQVBJRU5UUlkgZ2xHZXRFcnJvciAodm9pZCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsR2V0SW50ZWdlcnYgKEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyk7Ci1HTEFQSSBjb25zdCBHTHVieXRlICogQVBJRU5UUlkgZ2xHZXRTdHJpbmcgKEdMZW51bSBuYW1lKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xIaW50IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGYgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbGZ2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHggKEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRNb2RlbHh2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmIChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHRmdiAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGlnaHR4diAoR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTGluZVdpZHRoIChHTGZsb2F0IHdpZHRoKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGh4IChHTGZpeGVkIHdpZHRoKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkSWRlbnRpdHkgKHZvaWQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXhmIChjb25zdCBHTGZsb2F0ICptKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2FkTWF0cml4eCAoY29uc3QgR0xmaXhlZCAqbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9naWNPcCAoR0xlbnVtIG9wY29kZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWxmIChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGZ2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFseCAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4diAoR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRyaXhNb2RlIChHTGVudW0gbW9kZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNGYgKEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdGlUZXhDb29yZDR4IChHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDNmIChHTGZsb2F0IG54LCBHTGZsb2F0IG55LCBHTGZsb2F0IG56KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWwzeCAoR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsUG9pbnRlciAoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbE9ydGhvZiAoR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG94IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQaXhlbFN0b3JlaSAoR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXplIChHTGZsb2F0IHNpemUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvaW50U2l6ZXggKEdMZml4ZWQgc2l6ZSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldCAoR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBvbHlnb25PZmZzZXR4IChHTGZpeGVkIGZhY3RvciwgR0xmaXhlZCB1bml0cyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9wTWF0cml4ICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQdXNoTWF0cml4ICh2b2lkKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSZWFkUGl4ZWxzIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIEdMdm9pZCAqcGl4ZWxzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGVmIChHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xSb3RhdGV4IChHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTYW1wbGVDb3ZlcmFnZSAoR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdleCAoR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjYWxlZiAoR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2lzc29yIChHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2hhZGVNb2RlbCAoR0xlbnVtIG1vZGUpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxGdW5jIChHTGVudW0gZnVuYywgR0xpbnQgcmVmLCBHTHVpbnQgbWFzayk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbE1hc2sgKEdMdWludCBtYXNrKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsT3AgKEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52ZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmdiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMpOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eHYgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyk7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4UGFyYW1ldGVyZiAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJ4IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOwotR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFN1YkltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUcmFuc2xhdGV4IChHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6KTsKLUdMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWZXJ0ZXhQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7Ci1HTEFQSSB2b2lkIEFQSUVOVFJZIGdsVmlld3BvcnQgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9fZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dCBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtQlNELnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyNGUzYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1UaGlzIGlzIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3IgdGhlICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiINCi1PcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlIHNvdXJjZSBjb2RlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotDQotU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KLUNvcHlyaWdodCAoYykgMjAwNC0yMDA1LCBKZXRybyBMYXVoYQ0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuDQotDQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zDQotYXJlIG1ldDoNCi0NCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KLSAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbg0KLSAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUNCi0gICAgICBkaXN0cmlidXRpb24uDQotICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgc29mdHdhcmUgcHJvZHVjdCdzIGNvcHlyaWdodCBvd25lciBub3INCi0gICAgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCi0gICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4NCi0gICAgICBwZXJtaXNzaW9uLg0KLQ0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMNCi0iQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUDQotT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEDQotVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUg0KLVBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YNCi1MSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUw0KLVNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWUzZjVhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2xpY2Vuc2UtTEdQTC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKLQotIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCi0gYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKLSB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KLQotCQkJICAgIFByZWFtYmxlCi0KLSAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgotZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKLWZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KLQotICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKLWNhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKLXRoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCi1zdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCi1ub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Ci15b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCi1mb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0Ci1pdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKLWl0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwotdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWRpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKLXJpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoteW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KLXdpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCi1saWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Ci10aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCi1tb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKLXRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAotYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCi1pbnRyb2R1Y2VkIGJ5IG90aGVycy4KLQwKLSAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKLWFueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKLWVmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQotcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKLWFueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKLWNvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgotCi0gIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCi1pcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQotdGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQotbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCi0KLSAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKLWEgc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQotY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5Ci1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQotZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCi10aGUgbGlicmFyeS4KLQotICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Ci1kb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCi1vZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCi1hcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKLWxpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KLXNwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KLQotICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bwotZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKLWEgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKLWFsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKLWxpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcwotY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCi1zb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotCi0gIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQotcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCi1mcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCi1ub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKLW9wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCi1zeXN0ZW0uCi0KLSAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKLXVzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCi1saW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KLXRoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCi0KLSAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKLW1vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQotIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKLWZvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKLWJlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgotDAotCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCi0KLSAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCi1wcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgotb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgotRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCi0KLSAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQotcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCi0od2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgotCi0gIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCi13aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgotY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKLXBvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKLXN0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKLWluY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCi0KLSAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKLWFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCi1pbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KLWFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCi0KLSAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KLXN1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKLXdyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKLWFuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgotICAKLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCi1jb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoteW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KLWFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0Ci1hbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQotd2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKLUxpYnJhcnkuCi0KLSAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKLWFuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKLWZlZS4KLQwKLSAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgotb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAotZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCi1hYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgotCi0gICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KLQotICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubwotICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgotCi0gICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCi0gICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcwotICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKLSAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKLSAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKLSAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgotICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KLQotICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCi0gICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQotICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55Ci0gICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKLSAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQotICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCi0KLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKLWl0LgotCi1UaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKLXlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bwotZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCi1jb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgotCi1JbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Ci13aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKLWEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCi10aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCi10aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCi10aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi1pbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCi1vcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Ci10aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCi10aGVzZSBub3RpY2VzLgotDAotICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCi10aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAotc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KLQotICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKLXRoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KLQotICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgotZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KLXVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQotaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAotbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCi0KLSAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKLWZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCi1zb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0KLSAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKLUxpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKLWxpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCi13b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCi10aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgotCi0gIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKLWNyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAotY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKLWxpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgotU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCi0KLSAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKLXRoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQotZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCi1XaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQotbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKLXRocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCi0KLSAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKLXN0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQotZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAotZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQotd29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKLUxpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCi0KLSAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKLWRpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgotQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCi13aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCi0MCi0gIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCi1saW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQotd29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKLXVuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKLW1vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQotZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCi0KLSAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCi1MaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKLXRoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKLWR1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1jb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCi1kaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCi1vZiB0aGVzZSB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZwotICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgotICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCi0gICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKLSAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKLSAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQotICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCi0gICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKLSAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKLSAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgotICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQotCi0gICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCi0gICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKLSAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKLSAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKLSAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCi0gICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCi0gICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCi0KLSAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKLW5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgotY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgotd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwotdGhlIGV4ZWN1dGFibGUuCi0KLSAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKLXJlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKLWFjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKLXVzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKLWRpc3RyaWJ1dGUuCi0MCi0gIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5Ci1mYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCi1saWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KLXRoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQotcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCi0gICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQotICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAgIFNlY3Rpb25zIGFib3ZlLgotCi0gICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKLSAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZwotICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KLQotICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQotdGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKLWF0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCi1yaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCi1vciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCi10ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKLW9yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKLXN1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0MCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLSAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcwotCi0gIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKLXBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAotZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCi1yZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLW9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgotCi0gIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKLXNhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Ci1jb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKLSJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCi0KLSAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgotICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCi0gIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCi0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCi0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwODQxZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLVNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCi1Db3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhDQotQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi1XZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vDQotDQotVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6DQotICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUNCi0gICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdA0KLSAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXINCi0gICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlDQotICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0Lg0KLSAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4NCi0gICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuDQotDQotVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcw0KLUxJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLg0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL3NoYXBlcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZmZhZTguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCi0gKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLwotICoKLSAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6Ci0gKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKLSAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKLSAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KLSAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KLSAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KLSAqCi0gKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcwotICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogJElkOiBzaGFwZXMuaCx2IDEuNiAyMDA1LzAxLzMxIDIyOjE1OjMwIHRvbmljIEV4cCAkCi0gKiAkUmV2aXNpb246IDEuNiAkCi0gKi8KLQotI2lmbmRlZiBTSEFQRVNfSF9JTkNMVURFRAotI2RlZmluZSBTSEFQRVNfSF9JTkNMVURFRAotCi0KLSNkZWZpbmUgU1VQRVJTSEFQRV9QQVJBTVMgMTUKLQotc3RhdGljIGNvbnN0IGZsb2F0IHNTdXBlclNoYXBlUGFyYW1zW11bU1VQRVJTSEFQRV9QQVJBTVNdID0KLXsKLSAgICAvLyBtICBhICAgICBiICAgICBuMSAgICAgIG4yICAgICBuMyAgICAgbSAgICAgYSAgICAgYiAgICAgbjEgICAgIG4yICAgICAgbjMgICByZXMxIHJlczIgc2NhbGUgIChvcmcucmVzMSxyZXMyKQotICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA4LCAgICAxLCAgICAxLCAgICAtMSwgICAgIDEsICAtMC40ZiwgICAyMCwgIDMwLCAyIH0sIC8vIDQwLCA2MAotICAgIHsgMTAsIDEsICAgIDIsICAgIDkwLCAgICAgIDEsICAgLTQ1LCAgICA0LCAgICAxLCAgICAxLCAgICAxMCwgICAgIDEsICAtMC40ZiwgICAyMCwgIDIwLCA0IH0sIC8vIDQwLCA0MAotICAgIHsgMTAsIDEsICAgIDIsICAgIDYwLCAgICAgIDEsICAgLTEwLCAgICA0LCAgICAxLCAgICAxLCAgICAtMSwgICAgLTIsICAtMC40ZiwgICA0MSwgIDQxLCAxIH0sIC8vIDgyLCA4MgotICAgIHsgIDYsIDEsICAgIDEsICAgIDYwLCAgICAgIDEsICAgLTcwLCAgICA4LCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAyMCwgIDIwLCAxIH0sIC8vIDQwLCA0MAotICAgIHsgIDQsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIDIwLCAgIDEyLCAgICAxLCAgICAxLCAgMC40ZiwgICAgIDMsICAwLjI1ZiwgICAxMCwgIDMwLCAxIH0sIC8vIDIwLCA2MAotICAgIHsgIDgsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgICA4LCAgICAyLCAgICAxLCAgICAtMSwgICAgIDUsICAgMC41ZiwgICAyNSwgIDI2LCAxIH0sIC8vIDYwLCA2MAotICAgIHsgMTMsIDEsICAgIDEsICAgIDMwLCAgICAgIDEsICAgIC00LCAgIDEzLCAgICAxLCAgICAxLCAgICAgMSwgICAgIDUsICAgICAgMSwgICAzMCwgIDMwLCA2IH0sIC8vIDYwLCA2MAotICAgIHsgMTAsIDEsIDEuMWYsIC0wLjVmLCAgIDAuMWYsICAgIDcwLCAgIDYwLCAgICAxLCAgICAxLCAgIC05MCwgICAgIDAsIC0wLjI1ZiwgICAyMCwgIDYwLCA4IH0sIC8vIDYwLCAxODAKLSAgICB7ICA3LCAxLCAgICAxLCAgICAyMCwgIC0wLjNmLCAtMy41ZiwgICAgNiwgICAgMSwgICAgMSwgICAgLTEsICA0LjVmLCAgIDAuNWYsICAgMTAsICAyMCwgNCB9LCAvLyA2MCwgODAKLSAgICB7ICA0LCAxLCAgICAxLCAgICAxMCwgICAgIDEwLCAgICAxMCwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMCwgMSB9LCAvLyAyMCwgNDAKLSAgICB7ICA0LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNCwgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMTAsICAxMCwgMiB9LCAvLyAxMCwgMTAKLSAgICB7ICAxLCAxLCAgICAxLCAgICAzOCwgLTAuMjVmLCAgICAxOSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMTAsICAxNSwgMiB9LCAvLyAyMCwgNDAKLSAgICB7ICAyLCAxLCAgICAxLCAgMC43ZiwgICAwLjNmLCAgMC4yZiwgICAgMywgICAgMSwgICAgMSwgICAxMDAsICAgMTAwLCAgICAxMDAsICAgMTAsICAyNSwgMiB9LCAvLyAyMCwgNTAKLSAgICB7ICA2LCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgMywgICAgMSwgICAgMSwgICAgIDEsICAgICAxLCAgICAgIDEsICAgMzAsICAzMCwgMiB9LCAvLyA2MCwgNjAKLSAgICB7ICAzLCAxLCAgICAxLCAgICAgMSwgICAgICAxLCAgICAgMSwgICAgNiwgICAgMSwgICAgMSwgICAgIDIsICAgICAxLCAgICAgIDEsICAgMTAsICAyMCwgMiB9LCAvLyAyMCwgNDAKLSAgICB7ICA2LCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgMjUsICAgIDEwLCAgICAgMTAsICAgMzAsICAyMCwgMiB9LCAvLyA2MCwgNDAKLSAgICB7ICAzLCAxLCAgICAxLCAgMC41ZiwgICAxLjdmLCAgMS43ZiwgICAgMiwgICAgMSwgICAgMSwgICAgMTAsICAgIDEwLCAgICAgMTAsICAgMjAsICAyMCwgMiB9LCAvLyA0MCwgNDAKLSAgICB7ICA1LCAxLCAgICAxLCAgMC4xZiwgICAxLjdmLCAgMS43ZiwgICAgMSwgICAgMSwgICAgMSwgIDAuM2YsICAwLjVmLCAgIDAuNWYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKLSAgICB7ICAyLCAxLCAgICAxLCAgICAgNiwgICA1LjVmLCAgIDEwMCwgICAgNiwgICAgMSwgICAgMSwgICAgIDQsICAgIDEwLCAgICAgMTAsICAgMTAsICAyMiwgMSB9LCAvLyA0MCwgNDAKLSAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDcwLCAgMC4xZiwgICAgOSwgICAgMSwgMC41ZiwgICAtOTgsIDAuMDVmLCAgICAtNDUsICAgMjAsICAzMCwgNCB9LCAvLyA2MCwgOTEKLSAgICB7ICA2LCAxLCAgICAxLCAgICAtMSwgICAgIDkwLCAtMC4xZiwgICAgNywgICAgMSwgICAgMSwgICAgOTAsICAxLjNmLCAgICAgMzQsICAgMTMsICAxNiwgMSB9LCAvLyAzMiwgNjAKLX07Ci0jZGVmaW5lIFNVUEVSU0hBUEVfQ09VTlQgKHNpemVvZihzU3VwZXJTaGFwZVBhcmFtcykgLyBzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXNbMF0pKQotCi0KLSNlbmRpZiAvLyAhU0hBUEVTX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9jb25maWdkdW1wL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvY29uZmlnZHVtcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdjOTE1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9jb25maWdkdW1wL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JY29uZmlnZHVtcC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1jb25maWdkdW1wCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2NvbmZpZ2R1bXAvY29uZmlnZHVtcC5jcHAgYi9vcGVuZ2wvdGVzdHMvY29uZmlnZHVtcC9jb25maWdkdW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliOWViNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvY29uZmlnZHVtcC9jb25maWdkdW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0qKiBDb3B5cmlnaHQgMjAxMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0KLSNkZWZpbmUgQVRUUklCVVRFKF9hdHRyKSB7IF9hdHRyLCAjX2F0dHIgfQotCi1zdHJ1Y3QgQXR0cmlidXRlIHsKLSAgICBFR0xpbnQgYXR0cmlidXRlOwotICAgIGNoYXIgY29uc3QqIG5hbWU7Ci19OwotCi1BdHRyaWJ1dGUgYXR0cmlidXRlc1tdID0gewotICAgICAgICBBVFRSSUJVVEUoIEVHTF9CVUZGRVJfU0laRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9BTFBIQV9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0JMVUVfU0laRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9HUkVFTl9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1JFRF9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0RFUFRIX1NJWkUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfU1RFTkNJTF9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0NPTkZJR19DQVZFQVQgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfQ09ORklHX0lEICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0xFVkVMICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX01BWF9QQlVGRkVSX0hFSUdIVCApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9NQVhfUEJVRkZFUl9XSURUSCApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTkFUSVZFX1JFTkRFUkFCTEUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTkFUSVZFX1ZJU1VBTF9JRCApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9OQVRJVkVfVklTVUFMX1RZUEUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfU0FNUExFUyApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9TQU1QTEVfQlVGRkVSUyApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9TVVJGQUNFX1RZUEUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfVFJBTlNQQVJFTlRfVFlQRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX01JTl9TV0FQX0lOVEVSVkFMICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX01BWF9TV0FQX0lOVEVSVkFMICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0xVTUlOQU5DRV9TSVpFICksCi0gICAgICAgIEFUVFJJQlVURSggRUdMX0FMUEhBX01BU0tfU0laRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9DT0xPUl9CVUZGRVJfVFlQRSApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9SRU5ERVJBQkxFX1RZUEUgKSwKLSAgICAgICAgQVRUUklCVVRFKCBFR0xfTUFUQ0hfTkFUSVZFX1BJWE1BUCApLAotICAgICAgICBBVFRSSUJVVEUoIEVHTF9DT05GT1JNQU5UICksCi19OwotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBFR0xDb25maWcqIGNvbmZpZ3M7Ci0gICAgRUdMaW50IG47Ci0KLSAgICBFR0xEaXNwbGF5IGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgZWdsSW5pdGlhbGl6ZShkcHksIDAsIDApOwotICAgIGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbik7Ci0gICAgY29uZmlncyA9IG5ldyBFR0xDb25maWdbbl07Ci0gICAgZWdsR2V0Q29uZmlncyhkcHksIGNvbmZpZ3MsIG4sICZuKTsKLQotICAgIGZvciAoRUdMaW50IGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICBwcmludGYoIkVHTENvbmZpZ1slZF1cbiIsIGkpOwotICAgICAgICBmb3IgKGludCBhdHRyID0gMCA7IGF0dHI8c2l6ZW9mKGF0dHJpYnV0ZXMpL3NpemVvZihBdHRyaWJ1dGUpIDsgYXR0cisrKSB7Ci0gICAgICAgICAgICBFR0xpbnQgdmFsdWU7Ci0gICAgICAgICAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWdzW2ldLCBhdHRyaWJ1dGVzW2F0dHJdLmF0dHJpYnV0ZSwgJnZhbHVlKTsKLSAgICAgICAgICAgIHByaW50ZigiXHQlLTMyczogJTEwZCAoMHglMDh4KVxuIiwgYXR0cmlidXRlc1thdHRyXS5uYW1lLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZGVsZXRlIFtdIGNvbmZpZ3M7Ci0gICAgZWdsVGVybWluYXRlKGRweSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsbHJhdGUvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9maWxscmF0ZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFkZTIxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9maWxscmF0ZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWZpbGxyYXRlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTSBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1maWxscmF0ZQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWxscmF0ZS9maWxscmF0ZS5jcHAgYi9vcGVuZ2wvdGVzdHMvZmlsbHJhdGUvZmlsbHJhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA4NjQ3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9maWxscmF0ZS9maWxscmF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgImZpbGxyYXRlIgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RvcFdhdGNoLmg+Ci0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICBFR0xfREVQVEhfU0laRSwgMCwKLSAgICAgICAgIEVHTF9OT05FCi0gICAgIH07Ci0gICAgIAotICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICAgRUdMaW50IHcsIGg7Ci0gICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgICAKLSAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgICAgICAgIAotICAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KAotICAgICAgICAgICAgIGRweSwgY29uZmlnQXR0cmlicywgd2luZG93LCAmY29uZmlnKTsKLSAgICAgaWYgKGVycikgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBmaW5kIGFuIEVHTENvbmZpZyBtYXRjaGluZyB0aGUgc2NyZWVuIGZvcm1hdFxuIik7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgfQotCi0gICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7Ci0gICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCi0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgIAotICAgICBwcmludGYoInc9JWQsIGg9JWRcbiIsIHcsIGgpOwotICAgICAKLSAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7Ci0gICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgIGdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0gICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICBnbENvbG9yNGYoMSwxLDEsMSk7Ci0KLSAgICAgdWludDMyX3QqIHQzMiA9ICh1aW50MzJfdCopbWFsbG9jKDUxMio1MTIqNCk7IAotICAgICBmb3IgKGludCB5PTAgOyB5PDUxMiA7IHkrKykgewotICAgICAgICAgZm9yIChpbnQgeD0wIDsgeDw1MTIgOyB4KyspIHsKLSAgICAgICAgICAgICBpbnQgdSA9IHgtMjU2OwotICAgICAgICAgICAgIGludCB2ID0geS0yNTY7Ci0gICAgICAgICAgICAgaWYgKHUqdSt2KnYgPCAyNTYqMjU2KSB7Ci0gICAgICAgICAgICAgICAgIHQzMlt4K3kqNTEyXSA9IDB4MTBGRkZGRkY7Ci0gICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgdDMyW3greSo1MTJdID0gMHgyMEZGMDAwMDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLQotICAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzWzRdWzJdID0gewotICAgICAgICAgICAgIHsgMCwgIDAgfSwKLSAgICAgICAgICAgICB7IDAsICBoIH0sCi0gICAgICAgICAgICAgeyB3LCAgaCB9LAotICAgICAgICAgICAgIHsgdywgIDAgfQotICAgICB9OwotCi0gICAgIGNvbnN0IEdMZmxvYXQgdGV4Q29vcmRzWzRdWzJdID0gewotICAgICAgICAgICAgIHsgMCwgIDAgfSwKLSAgICAgICAgICAgICB7IDAsICAxIH0sCi0gICAgICAgICAgICAgeyAxLCAgMSB9LAotICAgICAgICAgICAgIHsgMSwgIDAgfQotICAgICB9OwotCi0gICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA1MTIsIDUxMiwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKLQotICAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgIGdsT3J0aG9mKDAsIHcsIDAsIGgsIDAsIDEpOwotCi0gICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7Ci0gICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB0ZXhDb29yZHMpOwotCi0gICAgIGVnbFN3YXBJbnRlcnZhbChkcHksIDEpOwotCi0gICAgIGdsQ2xlYXJDb2xvcigxLDAsMCwwKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7IAotICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICAKLQotICAgICBuc2Vjc190IHRpbWVzWzMyXTsKLQotICAgICBmb3IgKGludCBjPTEgOyBjPDMyIDsgYysrKSB7Ci0gICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxjIDsgaSsrKSB7Ci0gICAgICAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7IAotICAgICAgICAgfQotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotCi0KLSAgICAgLy8gICAgIGZvciAoaW50IGM9MzEgOyBjPj0xIDsgYy0tKSB7Ci0gICAgIGludCBqPTA7Ci0gICAgIGZvciAoaW50IGM9MSA7IGM8MzIgOyBjKyspIHsKLSAgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIGZvciAoaW50IGk9MCA7IGk8YyA7IGkrKykgewotICAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOyAKLSAgICAgICAgIH0KLSAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgICBuc2Vjc190IHQgPSBzeXN0ZW1UaW1lKCkgLSBub3c7Ci0gICAgICAgICB0aW1lc1tqKytdID0gdDsKLSAgICAgfQotCi0gICAgIGZvciAoaW50IGM9MSwgaj0wIDsgYzwzMiA7IGMrKywgaisrKSB7Ci0gICAgICAgICBuc2Vjc190IHQgPSB0aW1lc1tqXTsKLSAgICAgICAgIHByaW50ZigiJWxsZFx0JWRcdCVmXG4iLCB0LCBjLCAoZG91YmxlKHQpL2MpLzEwMDAwMDAuMCk7Ci0gICAgIH0KLQotCi0gICAgICAgCi0gICAgIGVnbFRlcm1pbmF0ZShkcHkpOwotICAgICAKLSAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTRkMzguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2ZpbHRlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWZpbHRlci5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTSBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1maWx0ZXIKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmNwcCBiL29wZW5nbC90ZXN0cy9maWx0ZXIvZmlsdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2NzMyNy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL2ZpbHRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLSNkZWZpbmUgVVNFX0RSQVdfVEVYVFVSRSAxCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBpZiAoYXJnYyE9MiAmJiBhcmdjIT0zKSB7Ci0gICAgICAgIHByaW50ZigidXNhZ2U6ICVzIDwwLTY+IFtwYnVmZmVyXVxuIiwgYXJndlswXSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBjb25zdCBpbnQgdGVzdCA9IGF0b2koYXJndlsxXSk7Ci0gICAgaW50IHVzZVBidWZmZXIgPSBhcmdjPT0zICYmICFzdHJjbXAoYXJndlsyXSwgInBidWZmZXIiKTsKLSAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfUEJVRkZFUl9CSVR8RUdMX1dJTkRPV19CSVQsCi0gICAgICAgICBFR0xfUkVEX1NJWkUsICAgICAgIDUsCi0gICAgICAgICBFR0xfR1JFRU5fU0laRSwgICAgIDYsCi0gICAgICAgICBFR0xfQkxVRV9TSVpFLCAgICAgIDUsCi0gICAgICAgICBFR0xfTk9ORQotICAgICB9OwotICAgICAKLSAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKLSAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICAgRUdMQ29uZmlnIGNvbmZpZzsKLSAgICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgIEVHTGludCB3LCBoOwotICAgICAKLSAgICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSAwOwotICAgICBpZiAoIXVzZVBidWZmZXIpIHsKLSAgICAgICAgIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICAgfQotICAgICAKLSAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgICBpZiAoIXVzZVBidWZmZXIpIHsKLSAgICAgICAgIEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICAgICAgIGRweSwgc19jb25maWdBdHRyaWJzLCB3aW5kb3csICZjb25maWcpOwotICAgICAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgICBwcmludGYoInVzaW5nIHBidWZmZXJcbiIpOwotICAgICAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7Ci0gICAgICAgICBFR0xpbnQgYXR0cmlic1tdID0geyBFR0xfV0lEVEgsIDMyMCwgRUdMX0hFSUdIVCwgNDgwLCBFR0xfTk9ORSB9OwotICAgICAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJzKTsKLSAgICAgICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSBlcnJvciAleFxuIiwgZWdsR2V0RXJyb3IoKSk7Ci0gICAgICAgICB9Ci0gICAgIH0KLSAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOwotICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOwotICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKLQotICAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgIGdsT3J0aG9mKDAsIHcsIDAsIGgsIDAsIDEpOwotCi0gICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgICBHTGludCBjcm9wWzRdID0geyAwLCA0LCA0LCAtNCB9OwotICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOwotICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICBnbENvbG9yNGYoMSwxLDEsMSk7Ci0KLSAgICAgLy8gcGFja2luZyBpcyBhbHdheXMgNAotICAgICB1aW50OF90IHQ4W10gID0geyAKLSAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKLSAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGLAotICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAotICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYgIH07Ci0KLSAgICAgdWludDE2X3QgdDE2W10gID0geyAKLSAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAotICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiwKLSAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAotICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiAgfTsKLQotICAgICB1aW50MTZfdCB0NTU1MVtdICA9IHsgCi0gICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKLSAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsCi0gICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKLSAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAgIH07Ci0KLSAgICAgdWludDMyX3QgdDMyW10gID0geyAKLSAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAKLSAgICAgICAgICAgICAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAKLSAgICAgICAgICAgICAweEZGMDBGRkZGLCAweEZGMDBGRjAwLCAweDAwRkYwMEZGLCAweEZGRkZGRjAwLCAKLSAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGRkYwMEZGLCAweEZGMDBGRkZGLCAweEZGRkZGRkZGCi0gICAgIH07Ci0KLSAgICAgc3dpdGNoKHRlc3QpIAotICAgICB7Ci0gICAgIGNhc2UgMToKLSAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsCi0gICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOwotICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgMjoKLSAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCi0gICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHQxNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgY2FzZSAzOgotICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCi0gICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIHQxNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgY2FzZSA0OgotICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwKLSAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0MTYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgNToKLSAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAotICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xLCB0NTU1MSk7Ci0gICAgICAgICBicmVhazsKLSAgICAgY2FzZSA2OgotICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCi0gICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHQzMik7Ci0gICAgICAgICBicmVhazsKLSAgICAgfQotCi0gICAgIC8vZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCBkaW0sIGRpbSk7Ci0gICAgIAotICAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzWzRdWzJdID0gewotICAgICAgICAgICAgIHsgMCwgICAgMCAgIH0sCi0gICAgICAgICAgICAgeyAwLCAgICBkaW0gfSwKLSAgICAgICAgICAgICB7IGRpbSwgIGRpbSB9LAotICAgICAgICAgICAgIHsgZGltLCAgMCAgIH0KLSAgICAgfTsKLQotICAgICBjb25zdCBHTGZsb2F0IHRleENvb3Jkc1s0XVsyXSA9IHsKLSAgICAgICAgICAgICB7IDAsICAwIH0sCi0gICAgICAgICAgICAgeyAwLCAgMSB9LAotICAgICAgICAgICAgIHsgMSwgIDEgfSwKLSAgICAgICAgICAgICB7IDEsICAwIH0KLSAgICAgfTsKLSAgICAgCi0gICAgIGlmICghdXNlUGJ1ZmZlcikgewotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotICAgICAKLSAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0gICAgIGdsU2Npc3NvcigwLGRpbSxkaW0saC1kaW0pOwotICAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICAgCi0gICAgIGZvciAoaW50IHk9MCA7IHk8ZGltIDsgeSsrKSB7Ci0gICAgICAgICAvL2dsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLQotICAgICAgICAgLy9nbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotCi0jaWYgVVNFX0RSQVdfVEVYVFVSRSAmJiBHTF9PRVNfZHJhd190ZXh0dXJlCi0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIHksIDEsIGRpbSwgZGltKTsKLSNlbHNlCi0gICAgICAgICBnbExvYWRJZGVudGl0eSgpOwotICAgICAgICAgZ2xUcmFuc2xhdGVmKDAsIHksIDApOwotICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgdmVydGljZXMpOwotICAgICAgICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHRleENvb3Jkcyk7Ci0gICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSNlbmRpZgotCi0gICAgICAgICBpZiAoIXVzZVBidWZmZXIpIHsKLSAgICAgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAgZWdsVGVybWluYXRlKGRweSk7Ci0gICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThhZGNhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9maW5pc2gvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlmaW5pc2guY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlidXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWZpbmlzaAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guY3BwIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYwYzIyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICBFR0xfREVQVEhfU0laRSwgMCwKLSAgICAgICAgIEVHTF9OT05FCi0gICAgIH07Ci0gICAgIAotICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICAgRUdMaW50IHcsIGg7Ci0gICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgICAKLSAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgICAgICAgIAotICAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KAotICAgICAgICAgICAgIGRweSwgY29uZmlnQXR0cmlicywgd2luZG93LCAmY29uZmlnKTsKLSAgICAgaWYgKGVycikgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBmaW5kIGFuIEVHTENvbmZpZyBtYXRjaGluZyB0aGUgc2NyZWVuIGZvcm1hdFxuIik7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgfQotCi0gICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7Ci0gICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCi0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOwotCi0gICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsKLSAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKLSAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgIGdsU2hhZGVNb2RlbChHTF9GTEFUKTsKLQotICAgICBsb25nIGxvbmcgbm93LCB0OwotICAgICBpbnQgaTsKLQotICAgICBjaGFyKiB0ZXhlbHMgPSAoY2hhciopbWFsbG9jKDUxMio1MTIqMik7Ci0gICAgIG1lbXNldCh0ZXhlbHMsMHhGRiw1MTIqNTEyKjIpOwotICAgICAKLSAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKLSAgICAgICAgICAgICA1MTIsIDUxMiwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdGV4ZWxzKTsKLQotICAgICBjaGFyKiBkc3QgPSAoY2hhciopbWFsbG9jKDMyMCo0ODAqMik7Ci0gICAgIG1lbXNldChkc3QsIDAsIDMyMCo0ODAqMik7Ci0gICAgIHByaW50ZigiMzA3MjAwIGJ5dGVzIG1lbWNweVxuIik7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBtZW1jcHkoZHN0LCB0ZXhlbHMsIDMyMCo0ODAqMik7Ci0gICAgICAgICB0ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgcHJpbnRmKCJtZW1jcHkoKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICB9Ci0gICAgIGZyZWUoZHN0KTsKLQotICAgICBmcmVlKHRleGVscyk7Ci0KLSAgICAgc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCAtMjApOwotICAgICAKLSAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OwotICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7Ci0gICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotICAgICAKLSAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKLSAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOwotICAgICAgICAgZ2xGaW5pc2goKTsKLSAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgIH0KLSAgICAgCi0gICAgIHByaW50ZigiNTEyeDUxMiB1bm1vZGlmaWVkIHRleHR1cmUsIDUxMng1MTIgYmxpdCAoeDIpOlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCA1MTIsIDUxMiwgLTUxMiB9OwotICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKLSAgICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgICB0ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOwotICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICB9Ci0KLSAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQgKHgyKTpcbiIpOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKLSAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7Ci0gICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOwotICAgICAgICAgZ2xGaW5pc2goKTsKLSAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgIH0KLQotICAgICAKLSAgICAgcHJpbnRmKCI1MTJ4NTEyICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKLSAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOwotICAgICAgICAgZ2xGaW5pc2goKTsKLSAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7Ci0gICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgIH0KLQotCi0gICAgIGludDE2X3QgdGV4ZWwgPSAweEY4MDA7Ci0gICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCi0gICAgICAgICAgICAgMSwgMSwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJnRleGVsKTsKLQotICAgICBwcmludGYoIjF4MSB1bm1vZGlmaWVkIHRleHR1cmUsIDF4MSBibGl0OlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OwotICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKLSAgICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgICB0ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotCi0gICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0OlxuIik7Ci0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7Ci0gICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OwotICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOwotICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7Ci0gICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotCi0gICAgIHByaW50ZigiMXgxICgxeDEgdGV4ZWwgTU9ESUZJRUQgdGV4dHVyZSksIDUxMng1MTIgYmxpdDpcbiIpOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgewotICAgICAgICAgdWludDE2X3QgZ3JlZW4gPSAweDdFMDsKLSAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07Ci0gICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7Ci0gICAgICAgICBnbFRleFN1YkltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgMCwgMCwgMSwgMSwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgJmdyZWVuKTsKLSAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7Ci0gICAgICAgICBnbEZpbmlzaCgpOwotICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKLSAgICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgfQotCi0gICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9iYXNpYy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsMl9iYXNpYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzgxOWExLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfYmFzaWMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlnbDJfYmFzaWMuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjIgXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX2Jhc2ljCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2Jhc2ljL2dsMl9iYXNpYy5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2wyX2Jhc2ljL2dsMl9iYXNpYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMDc4NzEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9iYXNpYy9nbDJfYmFzaWMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotc3RhdGljIHZvaWQgcHJpbnRHTFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBHTGVudW0gcykgewotICAgIC8vIGZwcmludGYoc3RkZXJyLCAicHJpbnRHTFN0cmluZyAlcywgJWRcbiIsIG5hbWUsIHMpOwotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLSAgICAvLyBpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7Ci0gICAgLy8gZnByaW50ZihzdGRlcnIsICJnbEdldEVycm9yKCkgPSAlZCwgcmVzdWx0IG9mIGdsR2V0U3RyaW5nID0gJXhcbiIsIGVycm9yLAotICAgIC8vICAgICAgICAodW5zaWduZWQgaW50KSB2KTsKLSAgICAvLyBpZiAoKHYgPCAoY29uc3QgY2hhciopIDApIHx8ICh2ID4gKGNvbnN0IGNoYXIqKSAweDEwMDAwKSkKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotICAgIC8vIGVsc2UKLSAgICAvLyAgICBmcHJpbnRmKHN0ZGVyciwgIkdMICVzID0gKG51bGwpIDB4JTA4eFxuIiwgbmFtZSwgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgewotICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAotICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0gImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX1Bvc2l0aW9uID0gdlBvc2l0aW9uO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgY29uc3QgY2hhciBnRnJhZ21lbnRTaGFkZXJbXSA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHZlYzQoMC4wLCAxLjAsIDAuMCwgMS4wKTtcbiIKLSAgICAifVxuIjsKLQotR0x1aW50IGxvYWRTaGFkZXIoR0xlbnVtIHNoYWRlclR5cGUsIGNvbnN0IGNoYXIqIHBTb3VyY2UpIHsKLSAgICBHTHVpbnQgc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgaWYgKHNoYWRlcikgewotICAgICAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsICZwU291cmNlLCBOVUxMKTsKLSAgICAgICAgZ2xDb21waWxlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgIEdMaW50IGNvbXBpbGVkID0gMDsKLSAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0NPTVBJTEVfU1RBVFVTLCAmY29tcGlsZWQpOwotICAgICAgICBpZiAoIWNvbXBpbGVkKSB7Ci0gICAgICAgICAgICBHTGludCBpbmZvTGVuID0gMDsKLSAgICAgICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICAgICAgICAgIGlmIChpbmZvTGVuKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFNoYWRlckluZm9Mb2coc2hhZGVyLCBpbmZvTGVuLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGUsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaGFkZXI7Ci19Ci0KLUdMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgewotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOwotICAgIGlmICghdmVydGV4U2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOwotICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSkgewotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgbGluayBwcm9ncmFtOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICBwcm9ncmFtID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcHJvZ3JhbTsKLX0KLQotR0x1aW50IGdQcm9ncmFtOwotR0x1aW50IGd2UG9zaXRpb25IYW5kbGU7Ci0KLWJvb2wgc2V0dXBHcmFwaGljcyhpbnQgdywgaW50IGgpIHsKLSAgICBnUHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgZ0ZyYWdtZW50U2hhZGVyKTsKLSAgICBpZiAoIWdQcm9ncmFtKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ3ZQb3NpdGlvbkhhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24oZ1Byb2dyYW0sICJ2UG9zaXRpb24iKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImdsR2V0QXR0cmliTG9jYXRpb24oXCJ2UG9zaXRpb25cIikgPSAlZFxuIiwKLSAgICAgICAgICAgIGd2UG9zaXRpb25IYW5kbGUpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVmlld3BvcnQiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgR0xmbG9hdCBnVHJpYW5nbGVWZXJ0aWNlc1tdID0geyAwLjBmLCAwLjVmLCAtMC41ZiwgLTAuNWYsCi0gICAgICAgIDAuNWYsIC0wLjVmIH07Ci0KLXZvaWQgcmVuZGVyRnJhbWUoKSB7Ci0gICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDEuMGYsIDEuMGYpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhckNvbG9yIik7Ci0gICAgZ2xDbGVhciggR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotCi0gICAgZ2xVc2VQcm9ncmFtKGdQcm9ncmFtKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGd2UG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgZ1RyaWFuZ2xlVmVydGljZXMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIik7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShndlBvc2l0aW9uSGFuZGxlKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCAzKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQotCi12b2lkIHByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZykgewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsICZ2YWx1ZSk7Ci0gICAgICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgJiYgZXJyb3IgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHByaW50ZigiICVzOiAiLCBuYW1lc1tqXS5uYW1lKTsKLSAgICAgICAgICAgIHByaW50ZigiJWQgKDB4JXgpIiwgdmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLWludCBwcmludEVHTENvbmZpZ3VyYXRpb25zKEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgRUdMaW50IG51bUNvbmZpZyA9IDA7Ci0gICAgRUdMaW50IHJldHVyblZhbCA9IGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlnKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXRDb25maWdzIiwgcmV0dXJuVmFsKTsKLSAgICBpZiAoIXJldHVyblZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJOdW1iZXIgb2YgRUdMIGNvbmZpZ3VyYXRpb246ICVkXG4iLCBudW1Db25maWcpOwotCi0gICAgRUdMQ29uZmlnKiBjb25maWdzID0gKEVHTENvbmZpZyopIG1hbGxvYyhzaXplb2YoRUdMQ29uZmlnKSAqIG51bUNvbmZpZyk7Ci0gICAgaWYgKCEgY29uZmlncykgewotICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBhbGxvY2F0ZSBjb25maWdzLlxuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdzKGRweSwgY29uZmlncywgbnVtQ29uZmlnLCAmbnVtQ29uZmlnKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXRDb25maWdzIiwgcmV0dXJuVmFsKTsKLSAgICBpZiAoIXJldHVyblZhbCkgewotICAgICAgICBmcmVlKGNvbmZpZ3MpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yKGludCBpID0gMDsgaSA8IG51bUNvbmZpZzsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiQ29uZmlndXJhdGlvbiAlZFxuIiwgaSk7Ci0gICAgICAgIHByaW50RUdMQ29uZmlndXJhdGlvbihkcHksIGNvbmZpZ3NbaV0pOwotICAgIH0KLQotICAgIGZyZWUoY29uZmlncyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotCi0gICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FIH07Ci0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgRUdMaW50IHcsIGg7Ci0KLSAgICBFR0xEaXNwbGF5IGRweTsKLQotICAgIGNoZWNrRWdsRXJyb3IoIjxpbml0PiIpOwotICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOwotICAgIGlmIChkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IHJldHVybmVkIEVHTF9OT19ESVNQTEFZLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVyblZhbHVlID0gZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEluaXRpYWxpemUiLCByZXR1cm5WYWx1ZSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJFR0wgdmVyc2lvbiAlZC4lZFxuIiwgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24pOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCFwcmludEVHTENvbmZpZ3VyYXRpb25zKGRweSkpIHsKLSAgICAgICAgcHJpbnRmKCJwcmludEVHTENvbmZpZ3VyYXRpb25zIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNoZWNrRWdsRXJyb3IoInByaW50RUdMQ29uZmlndXJhdGlvbnMiKTsKLQotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOw0KLSAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKLSAgICBpZiAocmV0dXJuVmFsdWUpIHsKLSAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKLQotICAgIHByaW50ZigiQ2hvc2UgdGhpcyBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgbXlDb25maWcpOwotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0gICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKLQotICAgIGZwcmludGYoc3RkZXJyLCAiV2luZG93IGRpbWVuc2lvbnM6ICVkIHggJWRcbiIsIHcsIGgpOwotCi0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgaWYoIXNldHVwR3JhcGhpY3ModywgaCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0IHVwIGdyYXBoaWNzLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgcmVuZGVyRnJhbWUoKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQzYTllLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfY2FtZXJhZXllL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi0jIE9ubHkgY29tcGlsZSBzb3VyY2UgamF2YSBmaWxlcyBpbiB0aGlzIGFway4KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEdMMkNhbWVyYUV5ZQotCi1MT0NBTF9TREtfVkVSU0lPTiA6PSBjdXJyZW50Ci0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQotCi0jIFVzZSB0aGUgZm9sbG93aW5nIGluY2x1ZGUgdG8gbWFrZSBvdXIgdGVzdCBhcGsuCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsMl9jYW1lcmFleWUvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzZjdiZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhpcyBBbmRyb2lkIGFwcGxpY2F0aW9uLiAgVGhlIG5hbWVzcGFjZQotICAgICBhdHRyaWJ1dGUgYnJpbmdzIGluIHRoZSBBbmRyb2lkIHBsYXRmb3JtIG5hbWVzcGFjZSwgYW5kIHRoZSBwYWNrYWdlCi0gICAgIHN1cHBsaWVzIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFdoZW4gd3JpdGluZyB5b3VyCi0gICAgIG93biBhcHBsaWNhdGlvbiwgdGhlIHBhY2thZ2UgbmFtZSBtdXN0IGJlIGNoYW5nZWQgZnJvbSAiY29tLmV4YW1wbGUuKiIKLSAgICAgdG8gY29tZSBmcm9tIGEgZG9tYWluIHRoYXQgeW91IG93biBvciBoYXZlIGNvbnRyb2wgb3Zlci4gLS0+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmdsMmNhbWVyYWV5ZSI+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiIC8+Ci0gICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhIiAvPgotICAgIDx1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hdXRvZm9jdXMiIC8+Ci0gICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOmdsRXNWZXJzaW9uPSIweDAwMDIwMDAwIiAvPgotICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2dsMmNhbWVyYWV5ZV9uYW1lIj4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0wyQ2FtZXJhRXllIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIi8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsMl9jYW1lcmFleWUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2YjkzMC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIAotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0KLSAgICA8c3RyaW5nIG5hbWU9ImdsMmNhbWVyYWV5ZV9uYW1lIj5HTDJDYW1lcmFFeWU8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9zcmMvY29tL2FuZHJvaWQvZ2wyY2FtZXJhZXllL0dMMkNhbWVyYUV5ZS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsMl9jYW1lcmFleWUvc3JjL2NvbS9hbmRyb2lkL2dsMmNhbWVyYWV5ZS9HTDJDYW1lcmFFeWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxZTRjNS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2NhbWVyYWV5ZS9zcmMvY29tL2FuZHJvaWQvZ2wyY2FtZXJhZXllL0dMMkNhbWVyYUV5ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsMmNhbWVyYWV5ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xVdGlsczsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5NYXRyaXg7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotCi1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmE7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5TZW5zb3JFdmVudExpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuU2Vuc29yOwotCi1wdWJsaWMgY2xhc3MgR0wyQ2FtZXJhRXllIGV4dGVuZHMgQWN0aXZpdHkgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbUdMVmlldyA9IG5ldyBDYW1HTFN1cmZhY2VWaWV3KHRoaXMpOwotICAgICAgICBzZXRDb250ZW50VmlldyhtR0xWaWV3KTsKLSAgICAgICAgc2V0UmVxdWVzdGVkT3JpZW50YXRpb24gKEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1HTFZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtR0xWaWV3Lm9uUmVzdW1lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBHTFN1cmZhY2VWaWV3IG1HTFZpZXc7Ci19Ci0KLWNsYXNzIENhbUdMU3VyZmFjZVZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IGltcGxlbWVudHMgU2Vuc29yRXZlbnRMaXN0ZW5lciB7Ci0gICAgcHVibGljIENhbUdMU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBzZXRFR0xDb250ZXh0Q2xpZW50VmVyc2lvbigyKTsKLSAgICAgICAgbVJlbmRlcmVyID0gbmV3IENhbVJlbmRlcmVyKGNvbnRleHQpOwotICAgICAgICBzZXRSZW5kZXJlcihtUmVuZGVyZXIpOwotCi0gICAgICAgIG1TZW5zb3JNYW5hZ2VyID0gKFNlbnNvck1hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuU0VOU09SX1NFUlZJQ0UpOwotICAgICAgICBtQWNjZWxlcmF0aW9uID0gbVNlbnNvck1hbmFnZXIuZ2V0RGVmYXVsdFNlbnNvcihTZW5zb3IuVFlQRV9MSU5FQVJfQUNDRUxFUkFUSU9OKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoZmluYWwgTW90aW9uRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgcXVldWVFdmVudChuZXcgUnVubmFibGUoKXsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgbVJlbmRlcmVyLnNldFBvc2l0aW9uKGV2ZW50LmdldFgoKSAvIGdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFkoKSAvIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIH19KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtQ2FtZXJhLnN0b3BQcmV2aWV3KCk7Ci0gICAgICAgIG1DYW1lcmEucmVsZWFzZSgpOwotCi0gICAgICAgIG1TZW5zb3JNYW5hZ2VyLnVucmVnaXN0ZXJMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgbUNhbWVyYSA9IENhbWVyYS5vcGVuKCk7Ci0gICAgICAgIENhbWVyYS5QYXJhbWV0ZXJzIHAgPSBtQ2FtZXJhLmdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgLy8gTm8gY2hhbmdlcyB0byBkZWZhdWx0IGNhbWVyYSBwYXJhbWV0ZXJzCi0gICAgICAgIG1DYW1lcmEuc2V0UGFyYW1ldGVycyhwKTsKLQotICAgICAgICBxdWV1ZUV2ZW50KG5ldyBSdW5uYWJsZSgpewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLnNldENhbWVyYShtQ2FtZXJhKTsKLSAgICAgICAgICAgICAgICB9fSk7Ci0KLSAgICAgICAgbVNlbnNvck1hbmFnZXIucmVnaXN0ZXJMaXN0ZW5lcih0aGlzLCBtQWNjZWxlcmF0aW9uLCBTZW5zb3JNYW5hZ2VyLlNFTlNPUl9ERUxBWV9HQU1FKTsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblNlbnNvckNoYW5nZWQoU2Vuc29yRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LnNlbnNvci5nZXRUeXBlKCkgPT0gU2Vuc29yLlRZUEVfTElORUFSX0FDQ0VMRVJBVElPTikgewotICAgICAgICAgICAgZmluYWwgZmxvYXRbXSBhY2NlbGVyYXRpb25WZWN0b3IgPSBldmVudC52YWx1ZXM7Ci0gICAgICAgICAgICBxdWV1ZUV2ZW50KG5ldyBSdW5uYWJsZSgpewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXIuc2V0QWNjZWxlcmF0aW9uKGFjY2VsZXJhdGlvblZlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgIH19KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQWNjdXJhY3lDaGFuZ2VkKFNlbnNvciBzZW5zb3IsIGludCBhY2N1cmFjeSkgewotICAgICAgICAvLyBJZ25vcmluZyBzZW5zb3IgYWNjdXJhY3kgY2hhbmdlcy4KLSAgICB9Ci0KLSAgICBDYW1SZW5kZXJlciBtUmVuZGVyZXI7Ci0gICAgQ2FtZXJhIG1DYW1lcmE7Ci0KLSAgICBTZW5zb3JNYW5hZ2VyIG1TZW5zb3JNYW5hZ2VyOwotICAgIFNlbnNvciBtQWNjZWxlcmF0aW9uOwotfQotCi1jbGFzcyBDYW1SZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIsIFN1cmZhY2VUZXh0dXJlLk9uRnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7Ci0KLSAgICBwdWJsaWMgQ2FtUmVuZGVyZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLQotICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QobVRyaWFuZ2xlVmVydGljZXNEYXRhLmxlbmd0aAotICAgICAgICAgICAgICAgICogRkxPQVRfU0laRV9CWVRFUykub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzRmxvYXRCdWZmZXIoKTsKLSAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucHV0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YSkucG9zaXRpb24oMCk7Ci0KLSAgICAgICAgTWF0cml4LnNldElkZW50aXR5TShtU1RNYXRyaXgsIDApOwotICAgICAgICBNYXRyaXguc2V0SWRlbnRpdHlNKG1NTWF0cml4LCAwKTsKLQotICAgICAgICBmbG9hdFtdIGRlZmF1bHRBY2NlbGVyYXRpb24gPSB7MC5mLDAuZiwwLmZ9OwotICAgICAgICBzZXRBY2NlbGVyYXRpb24oZGVmYXVsdEFjY2VsZXJhdGlvbik7Ci0gICAgICAgIG1Qb3NbMF0gPSAwLmY7Ci0gICAgICAgIG1Qb3NbMV0gPSAwLmY7Ci0gICAgICAgIG1Qb3NbMl0gPSAwLmY7Ci0gICAgICAgIG1WZWxbMF0gPSAwLmY7Ci0gICAgICAgIG1WZWxbMV0gPSAwLmY7Ci0gICAgICAgIG1WZWxbMl0gPSAwLmY7Ci0KLSAgICB9Ci0KLSAgICAvKiBUaGUgZm9sbG93aW5nIHNldCBtZXRob2RzIGFyZSBub3Qgc3luY2hyb25pemVkLCBzbyBzaG91bGQgb25seQotICAgICAqIGJlIGNhbGxlZCB3aXRoaW4gdGhlIHJlbmRlcmluZyB0aHJlYWQgY29udGV4dC4gVXNlIEdMU3VyZmFjZVZpZXcucXVldWVFdmVudCBmb3Igc2FmZSBhY2Nlc3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSkgewotICAgICAgICAvKiBNYXAgZnJvbSBzY3JlZW4gKDAsMCktKDEsMSkgdG8gc2NlbmUgY29vcmRpbmF0ZXMgKi8KLSAgICAgICAgbVBvc1swXSA9ICh4KjItMSkqbVJhdGlvOwotICAgICAgICBtUG9zWzFdID0gKC15KSoyKzE7Ci0gICAgICAgIG1Qb3NbMl0gPSAwLmY7Ci0gICAgICAgIG1WZWxbMF0gPSAwOwotICAgICAgICBtVmVsWzFdID0gMDsKLSAgICAgICAgbVZlbFsyXSA9IDA7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q2FtZXJhKENhbWVyYSBjYW1lcmEpIHsKLSAgICAgICAgbUNhbWVyYSA9IGNhbWVyYTsKLSAgICAgICAgQ2FtZXJhLlNpemUgcHJldmlld1NpemUgPSBjYW1lcmEuZ2V0UGFyYW1ldGVycygpLmdldFByZXZpZXdTaXplKCk7Ci0gICAgICAgIG1DYW1lcmFSYXRpbyA9IChmbG9hdClwcmV2aWV3U2l6ZS53aWR0aC9wcmV2aWV3U2l6ZS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWNjZWxlcmF0aW9uKGZsb2F0W10gYWNjZWxlcmF0aW9uVmVjdG9yKSB7Ci0gICAgICAgIG1HRm9yY2VbMF0gPSBhY2NlbGVyYXRpb25WZWN0b3JbMF07Ci0gICAgICAgIG1HRm9yY2VbMV0gPSBhY2NlbGVyYXRpb25WZWN0b3JbMV07Ci0gICAgICAgIG1HRm9yY2VbMl0gPSBhY2NlbGVyYXRpb25WZWN0b3JbMl07Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbFVudXNlZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgaWYgKHVwZGF0ZVN1cmZhY2UpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZS51cGRhdGVUZXhJbWFnZSgpOwotCi0gICAgICAgICAgICAgICAgbVN1cmZhY2UuZ2V0VHJhbnNmb3JtTWF0cml4KG1TVE1hdHJpeCk7Ci0gICAgICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSBtU3VyZmFjZS5nZXRUaW1lc3RhbXAoKTsKLSAgICAgICAgICAgICAgICBkb1BoeXNpY3ModGltZXN0YW1wKTsKLQotICAgICAgICAgICAgICAgIHVwZGF0ZVN1cmZhY2UgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIElnbm9yZSB0aGUgcGFzc2VkLWluIEdMMTAgaW50ZXJmYWNlLCBhbmQgdXNlIHRoZSBHTEVTMjAKLSAgICAgICAgLy8gY2xhc3MncyBzdGF0aWMgbWV0aG9kcyBpbnN0ZWFkLgotICAgICAgICBHTEVTMjAuZ2xDbGVhciggR0xFUzIwLkdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTEVTMjAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIEdMRVMyMC5nbFVzZVByb2dyYW0obVByb2dyYW0pOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgICAgIEdMRVMyMC5nbEFjdGl2ZVRleHR1cmUoR0xFUzIwLkdMX1RFWFRVUkUwKTsKLSAgICAgICAgR0xFUzIwLmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIG1UZXh0dXJlSUQpOwotCi0gICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzLnBvc2l0aW9uKFRSSUFOR0xFX1ZFUlRJQ0VTX0RBVEFfUE9TX09GRlNFVCk7Ci0gICAgICAgIEdMRVMyMC5nbFZlcnRleEF0dHJpYlBvaW50ZXIobWFQb3NpdGlvbkhhbmRsZSwgMywgR0xFUzIwLkdMX0ZMT0FULCBmYWxzZSwKLSAgICAgICAgICAgICAgICBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1NUUklERV9CWVRFUywgbVRyaWFuZ2xlVmVydGljZXMpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciBtYVBvc2l0aW9uIik7Ci0gICAgICAgIEdMRVMyMC5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1hUG9zaXRpb25IYW5kbGUpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkgbWFQb3NpdGlvbkhhbmRsZSIpOwotCi0gICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzLnBvc2l0aW9uKFRSSUFOR0xFX1ZFUlRJQ0VTX0RBVEFfVVZfT0ZGU0VUKTsKLSAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtYVRleHR1cmVIYW5kbGUsIDMsIEdMRVMyMC5HTF9GTE9BVCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgVFJJQU5HTEVfVkVSVElDRVNfREFUQV9TVFJJREVfQllURVMsIG1UcmlhbmdsZVZlcnRpY2VzKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIgbWFUZXh0dXJlSGFuZGxlIik7Ci0gICAgICAgIEdMRVMyMC5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG1hVGV4dHVyZUhhbmRsZSk7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSBtYVRleHR1cmVIYW5kbGUiKTsKLQotICAgICAgICBNYXRyaXgubXVsdGlwbHlNTShtTVZQTWF0cml4LCAwLCBtVk1hdHJpeCwgMCwgbU1NYXRyaXgsIDApOwotICAgICAgICBNYXRyaXgubXVsdGlwbHlNTShtTVZQTWF0cml4LCAwLCBtUHJvak1hdHJpeCwgMCwgbU1WUE1hdHJpeCwgMCk7Ci0KLSAgICAgICAgR0xFUzIwLmdsVW5pZm9ybU1hdHJpeDRmdihtdU1WUE1hdHJpeEhhbmRsZSwgMSwgZmFsc2UsIG1NVlBNYXRyaXgsIDApOwotICAgICAgICBHTEVTMjAuZ2xVbmlmb3JtTWF0cml4NGZ2KG11U1RNYXRyaXhIYW5kbGUsIDEsIGZhbHNlLCBtU1RNYXRyaXgsIDApOwotICAgICAgICBHTEVTMjAuZ2xVbmlmb3JtMWYobXVDUmF0aW9IYW5kbGUsIG1DYW1lcmFSYXRpbyk7Ci0KLSAgICAgICAgR0xFUzIwLmdsRHJhd0FycmF5cyhHTEVTMjAuR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbFVudXNlZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIElnbm9yZSB0aGUgcGFzc2VkLWluIEdMMTAgaW50ZXJmYWNlLCBhbmQgdXNlIHRoZSBHTEVTMjAKLSAgICAgICAgLy8gY2xhc3MncyBzdGF0aWMgbWV0aG9kcyBpbnN0ZWFkLgotICAgICAgICBHTEVTMjAuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgbVJhdGlvID0gKGZsb2F0KSB3aWR0aCAvIGhlaWdodDsKLSAgICAgICAgTWF0cml4LmZydXN0dW1NKG1Qcm9qTWF0cml4LCAwLCAtbVJhdGlvLCBtUmF0aW8sIC0xLCAxLCAzLCA3KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2xVbnVzZWQsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgLy8gSWdub3JlIHRoZSBwYXNzZWQtaW4gR0wxMCBpbnRlcmZhY2UsIGFuZCB1c2UgdGhlIEdMRVMyMAotICAgICAgICAvLyBjbGFzcydzIHN0YXRpYyBtZXRob2RzIGluc3RlYWQuCi0KLSAgICAgICAgLyogU2V0IHVwIGFscGhhIGJsZW5kaW5nIGFuZCBhbiBBbmRyb2lkIGJhY2tncm91bmQgY29sb3IgKi8KLSAgICAgICAgR0xFUzIwLmdsRW5hYmxlKEdMRVMyMC5HTF9CTEVORCk7Ci0gICAgICAgIEdMRVMyMC5nbEJsZW5kRnVuYyhHTEVTMjAuR0xfU1JDX0FMUEhBLCBHTEVTMjAuR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0gICAgICAgIEdMRVMyMC5nbENsZWFyQ29sb3IoMC42NDNmLCAwLjc3NmYsIDAuMjIzZiwgMS4wZik7Ci0KLSAgICAgICAgLyogU2V0IHVwIHNoYWRlcnMgYW5kIGhhbmRsZXMgdG8gdGhlaXIgdmFyaWFibGVzICovCi0gICAgICAgIG1Qcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShtVmVydGV4U2hhZGVyLCBtRnJhZ21lbnRTaGFkZXIpOwotICAgICAgICBpZiAobVByb2dyYW0gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1hUG9zaXRpb25IYW5kbGUgPSBHTEVTMjAuZ2xHZXRBdHRyaWJMb2NhdGlvbihtUHJvZ3JhbSwgImFQb3NpdGlvbiIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24gYVBvc2l0aW9uIik7Ci0gICAgICAgIGlmIChtYVBvc2l0aW9uSGFuZGxlID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIGFQb3NpdGlvbiIpOwotICAgICAgICB9Ci0gICAgICAgIG1hVGV4dHVyZUhhbmRsZSA9IEdMRVMyMC5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYVRleHR1cmVDb29yZCIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24gYVRleHR1cmVDb29yZCIpOwotICAgICAgICBpZiAobWFUZXh0dXJlSGFuZGxlID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIGFUZXh0dXJlQ29vcmQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG11TVZQTWF0cml4SGFuZGxlID0gR0xFUzIwLmdsR2V0VW5pZm9ybUxvY2F0aW9uKG1Qcm9ncmFtLCAidU1WUE1hdHJpeCIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsR2V0VW5pZm9ybUxvY2F0aW9uIHVNVlBNYXRyaXgiKTsKLSAgICAgICAgaWYgKG11TVZQTWF0cml4SGFuZGxlID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHVNVlBNYXRyaXgiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG11U1RNYXRyaXhIYW5kbGUgPSBHTEVTMjAuZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJ1U1RNYXRyaXgiKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEdldFVuaWZvcm1Mb2NhdGlvbiB1U1RNYXRyaXgiKTsKLSAgICAgICAgaWYgKG11TVZQTWF0cml4SGFuZGxlID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHVTVE1hdHJpeCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXVDUmF0aW9IYW5kbGUgPSBHTEVTMjAuZ2xHZXRVbmlmb3JtTG9jYXRpb24obVByb2dyYW0sICJ1Q1JhdGlvIik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRVbmlmb3JtTG9jYXRpb24gdUNSYXRpbyIpOwotICAgICAgICBpZiAobXVNVlBNYXRyaXhIYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IGF0dHJpYiBsb2NhdGlvbiBmb3IgdUNSYXRpbyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ3JlYXRlIG91ciB0ZXh0dXJlLiBUaGlzIGhhcyB0byBiZSBkb25lIGVhY2ggdGltZSB0aGUKLSAgICAgICAgICogc3VyZmFjZSBpcyBjcmVhdGVkLgotICAgICAgICAgKi8KLQotICAgICAgICBpbnRbXSB0ZXh0dXJlcyA9IG5ldyBpbnRbMV07Ci0gICAgICAgIEdMRVMyMC5nbEdlblRleHR1cmVzKDEsIHRleHR1cmVzLCAwKTsKLQotICAgICAgICBtVGV4dHVyZUlEID0gdGV4dHVyZXNbMF07Ci0gICAgICAgIEdMRVMyMC5nbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBtVGV4dHVyZUlEKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIG1UZXh0dXJlSUQiKTsKLQotICAgICAgICAvLyBDYW4ndCBkbyBtaXBtYXBwaW5nIHdpdGggY2FtZXJhIHNvdXJjZQotICAgICAgICBHTEVTMjAuZ2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTEVTMjAuR0xfVEVYVFVSRV9NSU5fRklMVEVSLAotICAgICAgICAgICAgICAgIEdMRVMyMC5HTF9ORUFSRVNUKTsKLSAgICAgICAgR0xFUzIwLmdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xFUzIwLkdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwKLSAgICAgICAgICAgICAgICBHTEVTMjAuR0xfTElORUFSKTsKLSAgICAgICAgLy8gQ2xhbXAgdG8gZWRnZSBpcyB0aGUgb25seSBvcHRpb24KLSAgICAgICAgR0xFUzIwLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xFUzIwLkdMX1RFWFRVUkVfV1JBUF9TLAotICAgICAgICAgICAgICAgIEdMRVMyMC5HTF9DTEFNUF9UT19FREdFKTsKLSAgICAgICAgR0xFUzIwLmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xFUzIwLkdMX1RFWFRVUkVfV1JBUF9ULAotICAgICAgICAgICAgICAgIEdMRVMyMC5HTF9DTEFNUF9UT19FREdFKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbFRleFBhcmFtZXRlcmkgbVRleHR1cmVJRCIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENyZWF0ZSB0aGUgU3VyZmFjZVRleHR1cmUgdGhhdCB3aWxsIGZlZWQgdGhpcyB0ZXh0dXJlSUQsIGFuZCBwYXNzIGl0IHRvIHRoZSBjYW1lcmEKLSAgICAgICAgICovCi0KLSAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZVRleHR1cmUobVRleHR1cmVJRCk7Ci0gICAgICAgIG1TdXJmYWNlLnNldE9uRnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1DYW1lcmEuc2V0UHJldmlld1RleHR1cmUobVN1cmZhY2UpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB0KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDYW5ub3Qgc2V0IHByZXZpZXcgdGV4dHVyZSB0YXJnZXQhIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTdGFydCB0aGUgY2FtZXJhICovCi0gICAgICAgIG1DYW1lcmEuc3RhcnRQcmV2aWV3KCk7Ci0KLSAgICAgICAgTWF0cml4LnNldExvb2tBdE0obVZNYXRyaXgsIDAsIDAsIDAsIDVmLCAwZiwgMGYsIDBmLCAwZiwgMS4wZiwgMC4wZik7Ci0KLSAgICAgICAgbUxhc3RUaW1lID0gMDsKLQotICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgdXBkYXRlU3VyZmFjZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIG9uRnJhbWVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZSkgewotICAgICAgICAvKiBGb3Igc2ltcGxpY2l0eSwgU3VyZmFjZVRleHR1cmUgY2FsbHMgaGVyZSB3aGVuIGl0IGhhcyBuZXcKLSAgICAgICAgICogZGF0YSBhdmFpbGFibGUuICBDYWxsIG1heSBjb21lIGluIGZyb20gc29tZSByYW5kb20gdGhyZWFkLAotICAgICAgICAgKiBzbyBsZXQncyBiZSBzYWZlIGFuZCB1c2Ugc3luY2hyb25pemUuIE5vIE9wZW5HTCBjYWxscyBjYW4gYmUgZG9uZSBoZXJlLgotICAgICAgICAgKi8KLSAgICAgICAgdXBkYXRlU3VyZmFjZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvUGh5c2ljcyhsb25nIHRpbWVzdGFtcCkgewotICAgICAgICAvKgotICAgICAgICAgKiBNb3ZlIHRoZSBjYW1lcmEgc3VyZmFjZSBhcm91bmQgYmFzZWQgb24gc29tZSBzaW1wbGUgc3ByaW5nIHBoeXNpY3Mgd2l0aCBkcmFnCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmIChtTGFzdFRpbWUgPT0gMCkKLSAgICAgICAgICAgIG1MYXN0VGltZSA9IHRpbWVzdGFtcDsKLQotICAgICAgICBmbG9hdCBkZWx0YVQgPSAodGltZXN0YW1wIC0gbUxhc3RUaW1lKS8xMDAwMDAwMDAwLmY7IC8vIFRvIHNlY29uZHMKLQotICAgICAgICBmbG9hdCBzcHJpbmdTdHJlbmd0aCA9IDIwLmY7Ci0gICAgICAgIGZsb2F0IGZyaWN0aW9uQ29lZmYgPSAxMC5mOwotICAgICAgICBmbG9hdCBtYXNzID0gMTAuZjsKLSAgICAgICAgZmxvYXQgZ011bHRpcGxpZXIgPSA0LmY7Ci0gICAgICAgIC8qIE9ubHkgdXBkYXRlIHBoeXNpY3MgZXZlcnkgMzAgbXMgKi8KLSAgICAgICAgaWYgKGRlbHRhVCA+IDAuMDMwZikgewotICAgICAgICAgICAgbUxhc3RUaW1lID0gdGltZXN0YW1wOwotCi0gICAgICAgICAgICBmbG9hdFtdIHRvdGFsRm9yY2UgPSBuZXcgZmxvYXRbM107Ci0gICAgICAgICAgICB0b3RhbEZvcmNlWzBdID0gLW1Qb3NbMF0gKiBzcHJpbmdTdHJlbmd0aCAtIG1WZWxbMF0qZnJpY3Rpb25Db2VmZiArIGdNdWx0aXBsaWVyKm1HRm9yY2VbMF0qbWFzczsKLSAgICAgICAgICAgIHRvdGFsRm9yY2VbMV0gPSAtbVBvc1sxXSAqIHNwcmluZ1N0cmVuZ3RoIC0gbVZlbFsxXSpmcmljdGlvbkNvZWZmICsgZ011bHRpcGxpZXIqbUdGb3JjZVsxXSptYXNzOwotICAgICAgICAgICAgdG90YWxGb3JjZVsyXSA9IC1tUG9zWzJdICogc3ByaW5nU3RyZW5ndGggLSBtVmVsWzJdKmZyaWN0aW9uQ29lZmYgKyBnTXVsdGlwbGllciptR0ZvcmNlWzJdKm1hc3M7Ci0KLSAgICAgICAgICAgIGZsb2F0W10gYWNjZWwgPSBuZXcgZmxvYXRbM107Ci0gICAgICAgICAgICBhY2NlbFswXSA9IHRvdGFsRm9yY2VbMF0vbWFzczsKLSAgICAgICAgICAgIGFjY2VsWzFdID0gdG90YWxGb3JjZVsxXS9tYXNzOwotICAgICAgICAgICAgYWNjZWxbMl0gPSB0b3RhbEZvcmNlWzJdL21hc3M7Ci0KLSAgICAgICAgICAgIC8qIE5vdCBhIHZlcnkgYWNjdXJhdGUgaW50ZWdyYXRvciAqLwotICAgICAgICAgICAgbVZlbFswXSA9IG1WZWxbMF0gKyBhY2NlbFswXSpkZWx0YVQ7Ci0gICAgICAgICAgICBtVmVsWzFdID0gbVZlbFsxXSArIGFjY2VsWzFdKmRlbHRhVDsKLSAgICAgICAgICAgIG1WZWxbMl0gPSBtVmVsWzJdICsgYWNjZWxbMl0qZGVsdGFUOwotCi0gICAgICAgICAgICBtUG9zWzBdID0gbVBvc1swXSArIG1WZWxbMF0qZGVsdGFUOwotICAgICAgICAgICAgbVBvc1sxXSA9IG1Qb3NbMV0gKyBtVmVsWzFdKmRlbHRhVDsKLSAgICAgICAgICAgIG1Qb3NbMl0gPSBtUG9zWzJdICsgbVZlbFsyXSpkZWx0YVQ7Ci0KLSAgICAgICAgICAgIE1hdHJpeC5zZXRJZGVudGl0eU0obU1NYXRyaXgsIDApOwotICAgICAgICAgICAgTWF0cml4LnRyYW5zbGF0ZU0obU1NYXRyaXgsIDAsIG1Qb3NbMF0sIG1Qb3NbMV0sIG1Qb3NbMl0pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBsb2FkU2hhZGVyKGludCBzaGFkZXJUeXBlLCBTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgIGludCBzaGFkZXIgPSBHTEVTMjAuZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgICAgIGlmIChzaGFkZXIgIT0gMCkgewotICAgICAgICAgICAgR0xFUzIwLmdsU2hhZGVyU291cmNlKHNoYWRlciwgc291cmNlKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgIGludFtdIGNvbXBpbGVkID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIEdMRVMyMC5nbEdldFNoYWRlcml2KHNoYWRlciwgR0xFUzIwLkdMX0NPTVBJTEVfU1RBVFVTLCBjb21waWxlZCwgMCk7Ci0gICAgICAgICAgICBpZiAoY29tcGlsZWRbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAiICsgc2hhZGVyVHlwZSArICI6Iik7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBHTEVTMjAuZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNoYWRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBjcmVhdGVQcm9ncmFtKFN0cmluZyB2ZXJ0ZXhTb3VyY2UsIFN0cmluZyBmcmFnbWVudFNvdXJjZSkgewotICAgICAgICBpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTEVTMjAuR0xfVkVSVEVYX1NIQURFUiwgdmVydGV4U291cmNlKTsKLSAgICAgICAgaWYgKHZlcnRleFNoYWRlciA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMRVMyMC5HTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U291cmNlKTsKLSAgICAgICAgaWYgKHBpeGVsU2hhZGVyID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHByb2dyYW0gPSBHTEVTMjAuZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgICAgIGlmIChwcm9ncmFtICE9IDApIHsKLSAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICAgICAgR0xFUzIwLmdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgaW50W10gbGlua1N0YXR1cyA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICBHTEVTMjAuZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xFUzIwLkdMX0xJTktfU1RBVFVTLCBsaW5rU3RhdHVzLCAwKTsKLSAgICAgICAgICAgIGlmIChsaW5rU3RhdHVzWzBdICE9IEdMRVMyMC5HTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTogIik7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBHTEVTMjAuZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgICAgICBwcm9ncmFtID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvZ3JhbTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tHbEVycm9yKFN0cmluZyBvcCkgewotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIHdoaWxlICgoZXJyb3IgPSBHTEVTMjAuZ2xHZXRFcnJvcigpKSAhPSBHTEVTMjAuR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgb3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihvcCArICI6IGdsRXJyb3IgIiArIGVycm9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGTE9BVF9TSVpFX0JZVEVTID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJJQU5HTEVfVkVSVElDRVNfREFUQV9TVFJJREVfQllURVMgPSA1ICogRkxPQVRfU0laRV9CWVRFUzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJJQU5HTEVfVkVSVElDRVNfREFUQV9QT1NfT0ZGU0VUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFJJQU5HTEVfVkVSVElDRVNfREFUQV9VVl9PRkZTRVQgPSAzOwotICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEgPSB7Ci0gICAgICAgIC8vIFgsIFksIFosIFUsIFYKLSAgICAgICAgLTEuMGYsIC0xLjBmLCAwLCAwLmYsIDAuZiwKLSAgICAgICAgMS4wZiwgLTEuMGYsIDAsIDEuZiwgMC5mLAotICAgICAgICAtMS4wZiwgIDEuMGYsIDAsIDAuZiwgMS5mLAotICAgICAgICAxLjBmLCAgIDEuMGYsIDAsIDEuZiwgMS5mLAotICAgIH07Ci0KLSAgICBwcml2YXRlIEZsb2F0QnVmZmVyIG1UcmlhbmdsZVZlcnRpY2VzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVZlcnRleFNoYWRlciA9Ci0gICAgICAgICJ1bmlmb3JtIG1hdDQgdU1WUE1hdHJpeDtcbiIgKwotICAgICAgICAidW5pZm9ybSBtYXQ0IHVTVE1hdHJpeDtcbiIgKwotICAgICAgICAidW5pZm9ybSBmbG9hdCB1Q1JhdGlvO1xuIiArCi0gICAgICAgICJhdHRyaWJ1dGUgdmVjNCBhUG9zaXRpb247XG4iICsKLSAgICAgICAgImF0dHJpYnV0ZSB2ZWM0IGFUZXh0dXJlQ29vcmQ7XG4iICsKLSAgICAgICAgInZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkO1xuIiArCi0gICAgICAgICJ2YXJ5aW5nIHZlYzIgdlRleHR1cmVOb3JtQ29vcmQ7XG4iICsKLSAgICAgICAgInZvaWQgbWFpbigpIHtcbiIgKwotICAgICAgICAiICB2ZWM0IHNjYWxlZFBvcyA9IGFQb3NpdGlvbjtcbiIgKwotICAgICAgICAiICBzY2FsZWRQb3MueCA9IHNjYWxlZFBvcy54ICogdUNSYXRpbztcbiIgKwotICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IHVNVlBNYXRyaXggKiBzY2FsZWRQb3M7XG4iICsKLSAgICAgICAgIiAgdlRleHR1cmVDb29yZCA9ICh1U1RNYXRyaXggKiBhVGV4dHVyZUNvb3JkKS54eTtcbiIgKwotICAgICAgICAiICB2VGV4dHVyZU5vcm1Db29yZCA9IGFUZXh0dXJlQ29vcmQueHk7XG4iICsKLSAgICAgICAgIn1cbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRnJhZ21lbnRTaGFkZXIgPQotICAgICAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIiArCi0gICAgICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIgKwotICAgICAgICAidmFyeWluZyB2ZWMyIHZUZXh0dXJlQ29vcmQ7XG4iICsKLSAgICAgICAgInZhcnlpbmcgdmVjMiB2VGV4dHVyZU5vcm1Db29yZDtcbiIgKwotICAgICAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgc1RleHR1cmU7XG4iICsKLSAgICAgICAgInZvaWQgbWFpbigpIHtcbiIgKwotICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoc1RleHR1cmUsIHZUZXh0dXJlQ29vcmQpO1xuIiArCi0gICAgICAgICIgIGdsX0ZyYWdDb2xvci5hID0gMS4wLW1pbihsZW5ndGgodlRleHR1cmVOb3JtQ29vcmQtMC41KSoyLjAsMS4wKTtcbiIgKwotICAgICAgICAifVxuIjsKLQotICAgIHByaXZhdGUgZmxvYXRbXSBtTVZQTWF0cml4ID0gbmV3IGZsb2F0WzE2XTsKLSAgICBwcml2YXRlIGZsb2F0W10gbVByb2pNYXRyaXggPSBuZXcgZmxvYXRbMTZdOwotICAgIHByaXZhdGUgZmxvYXRbXSBtTU1hdHJpeCA9IG5ldyBmbG9hdFsxNl07Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1WTWF0cml4ID0gbmV3IGZsb2F0WzE2XTsKLSAgICBwcml2YXRlIGZsb2F0W10gbVNUTWF0cml4ID0gbmV3IGZsb2F0WzE2XTsKLQotICAgIHByaXZhdGUgaW50IG1Qcm9ncmFtOwotICAgIHByaXZhdGUgaW50IG1UZXh0dXJlSUQ7Ci0gICAgcHJpdmF0ZSBpbnQgbXVNVlBNYXRyaXhIYW5kbGU7Ci0gICAgcHJpdmF0ZSBpbnQgbXVTVE1hdHJpeEhhbmRsZTsKLSAgICBwcml2YXRlIGludCBtdUNSYXRpb0hhbmRsZTsKLSAgICBwcml2YXRlIGludCBtYVBvc2l0aW9uSGFuZGxlOwotICAgIHByaXZhdGUgaW50IG1hVGV4dHVyZUhhbmRsZTsKLQotICAgIHByaXZhdGUgZmxvYXQgbVJhdGlvID0gMS4wZjsKLSAgICBwcml2YXRlIGZsb2F0IG1DYW1lcmFSYXRpbyA9IDEuMGY7Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1WZWwgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1Qb3MgPSBuZXcgZmxvYXRbM107Ci0gICAgcHJpdmF0ZSBmbG9hdFtdIG1HRm9yY2UgPSBuZXcgZmxvYXRbM107Ci0KLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZTsKLSAgICBwcml2YXRlIENhbWVyYSBtQ2FtZXJhOwotICAgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVTdXJmYWNlID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRBRyA9ICJDYW1SZW5kZXJlciI7Ci0KLSAgICAvLyBNYWdpYyBrZXkKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMgPSAweDhENjU7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2NvcHlUZXhJbWFnZS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsMl9jb3B5VGV4SW1hZ2UvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1YzM4My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2NvcHlUZXhJbWFnZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWdsMl9jb3B5VGV4SW1hZ2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjIgXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2wyX2NvcHlUZXhJbWFnZQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9jb3B5VGV4SW1hZ2UvZ2wyX2NvcHlUZXhJbWFnZS5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2wyX2NvcHlUZXhJbWFnZS9nbDJfY29weVRleEltYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4ZDdhYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2NvcHlUZXhJbWFnZS9nbDJfY29weVRleEltYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICAvLyBmcHJpbnRmKHN0ZGVyciwgInByaW50R0xTdHJpbmcgJXMsICVkXG4iLCBuYW1lLCBzKTsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgLy8gaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOwotICAgIC8vIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRFcnJvcigpID0gJWQsIHJlc3VsdCBvZiBnbEdldFN0cmluZyA9ICV4XG4iLCBlcnJvciwKLSAgICAvLyAgICAgICAgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgLy8gaWYgKCh2IDwgKGNvbnN0IGNoYXIqKSAwKSB8fCAodiA+IChjb25zdCBjaGFyKikgMHgxMDAwMCkpCi0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLSAgICAvLyBlbHNlCi0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9IChudWxsKSAweCUwOHhcbiIsIG5hbWUsICh1bnNpZ25lZCBpbnQpIHYpOwotICAgIGZwcmludGYoc3RkZXJyLCAiR0wgJXMgPSAlc1xuIiwgbmFtZSwgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpIHsKLSAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoKSByZXR1cm5lZCAlZFxuIiwgb3AsIHJldHVyblZhbCk7Ci0gICAgfQotCi0gICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKLSAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpXG4iLCBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwKLSAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9ICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZ0ZyYWdtZW50U2hhZGVyW10gPSAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMS4wLCAwLjAsIDAuNSk7XG4iCi0gICAgIn1cbiI7Ci0KLUdMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIGlmIChzaGFkZXIpIHsKLSAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICAgICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgJWQ6XG4lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJUeXBlLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi1HTHVpbnQgY3JlYXRlUHJvZ3JhbShjb25zdCBjaGFyKiBwVmVydGV4U291cmNlLCBjb25zdCBjaGFyKiBwRnJhZ21lbnRTb3VyY2UpIHsKLSAgICBHTHVpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTF9WRVJURVhfU0hBREVSLCBwVmVydGV4U291cmNlKTsKLSAgICBpZiAoIXZlcnRleFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUiwgcEZyYWdtZW50U291cmNlKTsKLSAgICBpZiAoIXBpeGVsU2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwcm9ncmFtID0gZ2xDcmVhdGVQcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0pIHsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOwotICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7Ci0gICAgICAgICAgICBHTGludCBidWZMZW5ndGggPSAwOwotICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhidWZMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGxpbmsgcHJvZ3JhbTpcbiVzXG4iLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHByb2dyYW07Ci19Ci0KLUdMdWludCBnUHJvZ3JhbTsKLUdMdWludCBnVGV4dHVyZVByb2dyYW07Ci1HTHVpbnQgZ3ZQb3NpdGlvbkhhbmRsZTsKLUdMdWludCBndlRleHR1cmVQb3NpdGlvbkhhbmRsZTsKLUdMdWludCBndlRleHR1cmVUZXhDb29yZHNIYW5kbGU7Ci1HTHVpbnQgZ3ZUZXh0dXJlU2FtcGxlckhhbmRsZTsKLUdMdWludCBnRmJvOwotR0x1aW50IGdUZXh0dXJlOwotR0x1aW50IGdCdWZmZXJUZXh0dXJlOwotCi1zdGF0aWMgY29uc3QgY2hhciBnU2ltcGxlVlNbXSA9Ci0gICAgImF0dHJpYnV0ZSB2ZWM0IHBvc2l0aW9uO1xuIgotICAgICJhdHRyaWJ1dGUgdmVjMiB0ZXhDb29yZHM7XG4iCi0gICAgInZhcnlpbmcgdmVjMiBvdXRUZXhDb29yZHM7XG4iCi0gICAgIlxudm9pZCBtYWluKHZvaWQpIHtcbiIKLSAgICAiICAgIG91dFRleENvb3JkcyA9IHRleENvb3JkcztcbiIKLSAgICAiICAgIGdsX1Bvc2l0aW9uID0gcG9zaXRpb247XG4iCi0gICAgIn1cblxuIjsKLXN0YXRpYyBjb25zdCBjaGFyIGdTaW1wbGVGU1tdID0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbiIKLSAgICAidmFyeWluZyB2ZWMyIG91dFRleENvb3JkcztcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcbiIKLSAgICAiXG52b2lkIG1haW4odm9pZCkge1xuIgotICAgICIgICAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHRleHR1cmUsIG91dFRleENvb3Jkcyk7XG4iCi0gICAgIn1cblxuIjsKLQotYm9vbCBzZXR1cEdyYXBoaWNzKGludCB3LCBpbnQgaCkgewotICAgIGdQcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShnVmVydGV4U2hhZGVyLCBnRnJhZ21lbnRTaGFkZXIpOwotICAgIGlmICghZ1Byb2dyYW0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBndlBvc2l0aW9uSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihnUHJvZ3JhbSwgInZQb3NpdGlvbiIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRBdHRyaWJMb2NhdGlvbihcInZQb3NpdGlvblwiKSA9ICVkXG4iLCBndlBvc2l0aW9uSGFuZGxlKTsKLQotICAgIGdUZXh0dXJlUHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ1NpbXBsZVZTLCBnU2ltcGxlRlMpOwotICAgIGlmICghZ1RleHR1cmVQcm9ncmFtKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ3ZUZXh0dXJlUG9zaXRpb25IYW5kbGUgPSBnbEdldEF0dHJpYkxvY2F0aW9uKGdUZXh0dXJlUHJvZ3JhbSwgInBvc2l0aW9uIik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEdldEF0dHJpYkxvY2F0aW9uIik7Ci0gICAgZ3ZUZXh0dXJlVGV4Q29vcmRzSGFuZGxlID0gZ2xHZXRBdHRyaWJMb2NhdGlvbihnVGV4dHVyZVByb2dyYW0sICJ0ZXhDb29yZHMiKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICBndlRleHR1cmVTYW1wbGVySGFuZGxlID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24oZ1RleHR1cmVQcm9ncmFtLCAidGV4dHVyZSIpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotCi0gICAgZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKTsKLQotICAgIGdsR2VuVGV4dHVyZXMoMSwgJmdUZXh0dXJlKTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdUZXh0dXJlKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgdywgaCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgTlVMTCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKLQotICAgIGdsR2VuVGV4dHVyZXMoMSwgJmdCdWZmZXJUZXh0dXJlKTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdCdWZmZXJUZXh0dXJlKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgdywgaCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgTlVMTCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKLQotICAgIGdsR2VuRnJhbWVidWZmZXJzKDEsICZnRmJvKTsKLSAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgZ0Zibyk7Ci0gICAgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRChHTF9GUkFNRUJVRkZFUiwgR0xfQ09MT1JfQVRUQUNITUVOVDAsIEdMX1RFWFRVUkVfMkQsIGdUZXh0dXJlLCAwKTsKLQotICAgIGdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVGRkVSLCAwKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZpZXdwb3J0Iik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEdMZmxvYXQgZ1RyaWFuZ2xlVmVydGljZXNbXSA9IHsgMC4wZiwgMC41ZiwgLTAuNWYsIC0wLjVmLAotICAgICAgICAwLjVmLCAtMC41ZiB9OwotCi1jb25zdCBHTGludCBGTE9BVF9TSVpFX0JZVEVTID0gNDsKLWNvbnN0IEdMaW50IFRSSUFOR0xFX1ZFUlRJQ0VTX0RBVEFfU1RSSURFX0JZVEVTID0gNSAqIEZMT0FUX1NJWkVfQllURVM7Ci1jb25zdCBHTGZsb2F0IGdUcmlhbmdsZVZlcnRpY2VzRGF0YVtdID0gewotICAgIC8vIFgsIFksIFosIFUsIFYKLSAgICAtMS4wZiwgLTEuMGYsIDAsIDAuZiwgMC5mLAotICAgIDEuMGYsIC0xLjBmLCAwLCAxLmYsIDAuZiwKLSAgICAtMS4wZiwgIDEuMGYsIDAsIDAuZiwgMS5mLAotICAgIDEuMGYsICAgMS4wZiwgMCwgMS5mLCAxLmYsCi19OwotCi12b2lkIHJlbmRlckZyYW1lKEdMaW50IHcsIEdMaW50IGgpIHsKLSAgICBnbENsZWFyQ29sb3IoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENsZWFyQ29sb3IiKTsKLSAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXIiKTsKLQotICAgIC8vIEJpbmQgRkJPIGFuZCBkcmF3IGludG8gaXQKLSAgICBnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgZ0Zibyk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEJpbmRGcmFtZWJ1ZmZlciIpOwotCi0gICAgZ2xDbGVhckNvbG9yKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhckNvbG9yIik7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXIiKTsKLQotICAgIGdsVXNlUHJvZ3JhbShnUHJvZ3JhbSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFVzZVByb2dyYW0iKTsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihndlBvc2l0aW9uSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIGdUcmlhbmdsZVZlcnRpY2VzKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciIpOwotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZ3ZQb3NpdGlvbkhhbmRsZSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5Iik7Ci0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFUywgMCwgMyk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbERyYXdBcnJheXMiKTsKLQotICAgIC8vIENvcHkgY29udGVudCBvZiBGQk8gaW50byBhIHRleHR1cmUKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIGdCdWZmZXJUZXh0dXJlKTsKLSAgICBnbENvcHlUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIDAsIDAsIHcgLyAyLCBoIC8gMik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbENvcHlUZXhTdWJJbWFnZTJEIik7Ci0KLSAgICAvLyBCYWNrIHRvIHRoZSBkaXNwbGF5Ci0gICAgZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApOwotICAgIGNoZWNrR2xFcnJvcigiZ2xCaW5kRnJhbWVidWZmZXIiKTsKLQotICAgIC8vIERyYXcgY29waWVkIGNvbnRlbnQgb24gdGhlIHNjcmVlbgotICAgIGdsVXNlUHJvZ3JhbShnVGV4dHVyZVByb2dyYW0pOwotICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7Ci0KLSAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihndlRleHR1cmVQb3NpdGlvbkhhbmRsZSwgMywgR0xfRkxPQVQsIEdMX0ZBTFNFLAotICAgICAgICAgICAgVFJJQU5HTEVfVkVSVElDRVNfREFUQV9TVFJJREVfQllURVMsIGdUcmlhbmdsZVZlcnRpY2VzRGF0YSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIiKTsKLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoZ3ZUZXh0dXJlVGV4Q29vcmRzSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCi0gICAgICAgICAgICBUUklBTkdMRV9WRVJUSUNFU19EQVRBX1NUUklERV9CWVRFUywgJmdUcmlhbmdsZVZlcnRpY2VzRGF0YVszXSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIiKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGd2VGV4dHVyZVBvc2l0aW9uSGFuZGxlKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGd2VGV4dHVyZVRleENvb3Jkc0hhbmRsZSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5Iik7Ci0gICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKLSAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQotCi12b2lkIHByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZykgewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsICZ2YWx1ZSk7Ci0gICAgICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgJiYgZXJyb3IgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHByaW50ZigiICVzOiAiLCBuYW1lc1tqXS5uYW1lKTsKLSAgICAgICAgICAgIHByaW50ZigiJWQgKDB4JXgpIiwgdmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLWludCBwcmludEVHTENvbmZpZ3VyYXRpb25zKEVHTERpc3BsYXkgZHB5KSB7Ci0gICAgRUdMaW50IG51bUNvbmZpZyA9IDA7Ci0gICAgRUdMaW50IHJldHVyblZhbCA9IGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlnKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXRDb25maWdzIiwgcmV0dXJuVmFsKTsKLSAgICBpZiAoIXJldHVyblZhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJOdW1iZXIgb2YgRUdMIGNvbmZpZ3VyYXRpb246ICVkXG4iLCBudW1Db25maWcpOwotCi0gICAgRUdMQ29uZmlnKiBjb25maWdzID0gKEVHTENvbmZpZyopIG1hbGxvYyhzaXplb2YoRUdMQ29uZmlnKSAqIG51bUNvbmZpZyk7Ci0gICAgaWYgKCEgY29uZmlncykgewotICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBhbGxvY2F0ZSBjb25maWdzLlxuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdzKGRweSwgY29uZmlncywgbnVtQ29uZmlnLCAmbnVtQ29uZmlnKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXRDb25maWdzIiwgcmV0dXJuVmFsKTsKLSAgICBpZiAoIXJldHVyblZhbCkgewotICAgICAgICBmcmVlKGNvbmZpZ3MpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yKGludCBpID0gMDsgaSA8IG51bUNvbmZpZzsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiQ29uZmlndXJhdGlvbiAlZFxuIiwgaSk7Ci0gICAgICAgIHByaW50RUdMQ29uZmlndXJhdGlvbihkcHksIGNvbmZpZ3NbaV0pOwotICAgIH0KLQotICAgIGZyZWUoY29uZmlncyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotCi0gICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRURfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX0JMVUVfU0laRSwgOCwKLSAgICAgICAgICAgIEVHTF9BTFBIQV9TSVpFLCA4LAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xpbnQgdywgaDsKLQotICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7Ci0gICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7Ci0gICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCB2ZXJzaW9uICVkLiVkXG4iLCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbik7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoIXByaW50RUdMQ29uZmlndXJhdGlvbnMoZHB5KSkgewotICAgICAgICBwcmludGYoInByaW50RUdMQ29uZmlndXJhdGlvbnMgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY2hlY2tFZ2xFcnJvcigicHJpbnRFR0xDb25maWd1cmF0aW9ucyIpOwotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMSwgbiA9IDA7Ci0gICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAwLCAwLCAmbnVtQ29uZmlncyk7Ci0gICAgaWYgKG51bUNvbmZpZ3MpIHsKLSAgICAgICAgRUdMQ29uZmlnKiBjb25zdCBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKLSAgICAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCBjb25maWdzLCBudW1Db25maWdzLCAmbik7Ci0gICAgICAgIG15Q29uZmlnID0gY29uZmlnc1swXTsKLSAgICAgICAgZGVsZXRlW10gY29uZmlnczsKLSAgICB9Ci0KLSAgICBjaGVja0VnbEVycm9yKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93Iik7Ci0KLSAgICBwcmludGYoIkNob3NlIHRoaXMgY29uZmlndXJhdGlvbjpcbiIpOwotICAgIHByaW50RUdMQ29uZmlndXJhdGlvbihkcHksIG15Q29uZmlnKTsKLQotICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOwotICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIHByaW50ZigiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmlicyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOwotICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIldpbmRvdyBkaW1lbnNpb25zOiAlZCB4ICVkXG4iLCB3LCBoKTsKLQotICAgIHByaW50R0xTdHJpbmcoIlZlcnNpb24iLCBHTF9WRVJTSU9OKTsKLSAgICBwcmludEdMU3RyaW5nKCJWZW5kb3IiLCBHTF9WRU5ET1IpOwotICAgIHByaW50R0xTdHJpbmcoIlJlbmRlcmVyIiwgR0xfUkVOREVSRVIpOwotICAgIHByaW50R0xTdHJpbmcoIkV4dGVuc2lvbnMiLCBHTF9FWFRFTlNJT05TKTsKLQotICAgIGlmKCFzZXR1cEdyYXBoaWNzKHcsIGgpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCB1cCBncmFwaGljcy5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHJlbmRlckZyYW1lKHcsIGgpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICAgICBjaGVja0VnbEVycm9yKCJlZ2xTd2FwQnVmZmVycyIpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qYXZhL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmNGFlZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkdMIEVTIDIuMCBKYXZhIHNhbXBsZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1UT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQnVpbGQgYWN0aXZpdHkKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBHTDJKYXZhCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qYXZhL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiNjg0MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2wyamF2YSI+Ci0gICAgPHVzZXMtZmVhdHVyZSBhbmRyb2lkOmdsRXNWZXJzaW9uPSIweDAwMDIwMDAwIiAvPgotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbDJqYXZhX2FjdGl2aXR5Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0wySmF2YUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKLSAgICAgICAgICAgIAlhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCi0gICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbDJfamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJkMjNjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfamF2YS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJnbDJqYXZhX2FjdGl2aXR5Ij5HTDJKYXZhPC9zdHJpbmc+Ci0KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvc3JjL2NvbS9hbmRyb2lkL2dsMmphdmEvR0wySmF2YUFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvc3JjL2NvbS9hbmRyb2lkL2dsMmphdmEvR0wySmF2YUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NjU0ZmIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9qYXZhL3NyYy9jb20vYW5kcm9pZC9nbDJqYXZhL0dMMkphdmFBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2wyamF2YTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIEdMMkphdmFBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEdMMkphdmFWaWV3IG1WaWV3OwotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLSAgICAgICAgbVZpZXcgPSBuZXcgR0wySmF2YVZpZXcoZ2V0QXBwbGljYXRpb24oKSk7Ci0Jc2V0Q29udGVudFZpZXcobVZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1WaWV3Lm9uUmVzdW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qYXZhL3NyYy9jb20vYW5kcm9pZC9nbDJqYXZhL0dMMkphdmFWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvc3JjL2NvbS9hbmRyb2lkL2dsMmphdmEvR0wySmF2YVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyYmZkMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2phdmEvc3JjL2NvbS9hbmRyb2lkL2dsMmphdmEvR0wySmF2YVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbDJqYXZhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBHTDJKYXZhVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiR0wySmF2YVZpZXciOwotCi0gICAgcHVibGljIEdMMkphdmFWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgc2V0RUdMQ29udGV4dENsaWVudFZlcnNpb24oMik7Ci0gICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotCi0gICAgICAgIHB1YmxpYyBSZW5kZXJlcigpIHsKLSAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChtVHJpYW5nbGVWZXJ0aWNlc0RhdGEubGVuZ3RoICogNCkKLSAgICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpLmFzRmxvYXRCdWZmZXIoKTsKLSAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzLnB1dChtVHJpYW5nbGVWZXJ0aWNlc0RhdGEpLnBvc2l0aW9uKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyKCBHTEVTMjAuR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbFVzZVByb2dyYW0obVByb2dyYW0pOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbFVzZVByb2dyYW0iKTsKLQotICAgICAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtdlBvc2l0aW9uSGFuZGxlLCAyLCBHTEVTMjAuR0xfRkxPQVQsIGZhbHNlLCAwLCBtVHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciIpOwotICAgICAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobXZQb3NpdGlvbkhhbmRsZSk7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbERyYXdBcnJheXMoR0xFUzIwLkdMX1RSSUFOR0xFUywgMCwgMyk7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgR0xFUzIwLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgICAgIG1Qcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShtVmVydGV4U2hhZGVyLCBtRnJhZ21lbnRTaGFkZXIpOwotICAgICAgICAgICAgaWYgKG1Qcm9ncmFtID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtdlBvc2l0aW9uSGFuZGxlID0gR0xFUzIwLmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJ2UG9zaXRpb24iKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgICAgICAgICAgaWYgKG12UG9zaXRpb25IYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHZQb3NpdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbG9hZFNoYWRlcihpbnQgc2hhZGVyVHlwZSwgU3RyaW5nIHNvdXJjZSkgewotICAgICAgICAgICAgaW50IHNoYWRlciA9IEdMRVMyMC5nbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICAgICAgICAgIGlmIChzaGFkZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIEdMRVMyMC5nbFNoYWRlclNvdXJjZShzaGFkZXIsIHNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgIGludFtdIGNvbXBpbGVkID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMRVMyMC5HTF9DT01QSUxFX1NUQVRVUywgY29tcGlsZWQsIDApOwotICAgICAgICAgICAgICAgIGlmIChjb21waWxlZFswXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAiICsgc2hhZGVyVHlwZSArICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgR0xFUzIwLmdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNoYWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGNyZWF0ZVByb2dyYW0oU3RyaW5nIHZlcnRleFNvdXJjZSwgU3RyaW5nIGZyYWdtZW50U291cmNlKSB7Ci0gICAgICAgICAgICBpbnQgdmVydGV4U2hhZGVyID0gbG9hZFNoYWRlcihHTEVTMjAuR0xfVkVSVEVYX1NIQURFUiwgdmVydGV4U291cmNlKTsKLSAgICAgICAgICAgIGlmICh2ZXJ0ZXhTaGFkZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcGl4ZWxTaGFkZXIgPSBsb2FkU2hhZGVyKEdMRVMyMC5HTF9GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50U291cmNlKTsKLSAgICAgICAgICAgIGlmIChwaXhlbFNoYWRlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBwcm9ncmFtID0gR0xFUzIwLmdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgICAgICAgICAgaWYgKHByb2dyYW0gIT0gMCkgewotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgICAgICBpbnRbXSBsaW5rU3RhdHVzID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xFUzIwLkdMX0xJTktfU1RBVFVTLCBsaW5rU3RhdHVzLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobGlua1N0YXR1c1swXSAhPSBHTEVTMjAuR0xfVFJVRSkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgbGluayBwcm9ncmFtOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBHTEVTMjAuZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7Ci0gICAgICAgICAgICAgICAgICAgIEdMRVMyMC5nbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwcm9ncmFtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrR2xFcnJvcihTdHJpbmcgb3ApIHsKLSAgICAgICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgICAgIHdoaWxlICgoZXJyb3IgPSBHTEVTMjAuZ2xHZXRFcnJvcigpKSAhPSBHTEVTMjAuR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsIG9wICsgIjogZ2xFcnJvciAiICsgZXJyb3IpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG9wICsgIjogZ2xFcnJvciAiICsgZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1UcmlhbmdsZVZlcnRpY2VzRGF0YSA9IHsgMC4wZiwgMC41ZiwgLTAuNWYsIC0wLjVmLAotICAgICAgICAgICAgICAgIDAuNWYsIC0wLjVmIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBGbG9hdEJ1ZmZlciBtVHJpYW5nbGVWZXJ0aWNlczsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVydGV4U2hhZGVyID0gImF0dHJpYnV0ZSB2ZWM0IHZQb3NpdGlvbjtcbiIKLSAgICAgICAgICAgICsgInZvaWQgbWFpbigpIHtcbiIKLSAgICAgICAgICAgICsgIiAgZ2xfUG9zaXRpb24gPSB2UG9zaXRpb247XG4iCi0gICAgICAgICAgICArICJ9XG4iOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GcmFnbWVudFNoYWRlciA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAgICAgICAgICsgInZvaWQgbWFpbigpIHtcbiIKLSAgICAgICAgICAgICsgIiAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgwLjAsIDEuMCwgMC4wLCAxLjApO1xuIgotICAgICAgICAgICAgKyAifVxuIjsKLQotICAgICAgICBwcml2YXRlIGludCBtUHJvZ3JhbTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbXZQb3NpdGlvbkhhbmRsZTsKLQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbDJfam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTBmZjYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEdMMkpOSQotCi1MT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbDJqbmkKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUxPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICBnbF9jb2RlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1dGlscyBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmdsMmpuaQotCi0KLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9nbDJfam5pL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjdlNWYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2wyam5pIj4KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZ2wyam5pX2FjdGl2aXR5Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0wySk5JQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfam5pL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbDJfam5pL2puaS9nbF9jb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2YmQ5My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9qbmkvZ2xfY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8gT3BlbkdMIEVTIDIuMCBjb2RlCi0KLSNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+Ci0jZGVmaW5lIExPR19UQUcgIkdMMkpOSSBnbF9jb2RlLmNwcCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi1zdGF0aWMgdm9pZCBwcmludEdMU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEdMZW51bSBzKSB7Ci0gICAgY29uc3QgY2hhciAqdiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKHMpOwotICAgIEFMT0dJKCJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7Ci0gICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCi0gICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgewotICAgICAgICBBTE9HSSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9ICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZ0ZyYWdtZW50U2hhZGVyW10gPSAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMS4wLCAwLjAsIDEuMCk7XG4iCi0gICAgIn1cbiI7Ci0KLUdMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIGlmIChzaGFkZXIpIHsKLSAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICAgICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGUsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaGFkZXI7Ci19Ci0KLUdMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgewotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOwotICAgIGlmICghdmVydGV4U2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOwotICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSkgewotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9ncmFtOwotfQotCi1HTHVpbnQgZ1Byb2dyYW07Ci1HTHVpbnQgZ3ZQb3NpdGlvbkhhbmRsZTsKLQotYm9vbCBzZXR1cEdyYXBoaWNzKGludCB3LCBpbnQgaCkgewotICAgIHByaW50R0xTdHJpbmcoIlZlcnNpb24iLCBHTF9WRVJTSU9OKTsKLSAgICBwcmludEdMU3RyaW5nKCJWZW5kb3IiLCBHTF9WRU5ET1IpOwotICAgIHByaW50R0xTdHJpbmcoIlJlbmRlcmVyIiwgR0xfUkVOREVSRVIpOwotICAgIHByaW50R0xTdHJpbmcoIkV4dGVuc2lvbnMiLCBHTF9FWFRFTlNJT05TKTsKLQotICAgIEFMT0dJKCJzZXR1cEdyYXBoaWNzKCVkLCAlZCkiLCB3LCBoKTsKLSAgICBnUHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgZ0ZyYWdtZW50U2hhZGVyKTsKLSAgICBpZiAoIWdQcm9ncmFtKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgY3JlYXRlIHByb2dyYW0uIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ3ZQb3NpdGlvbkhhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24oZ1Byb2dyYW0sICJ2UG9zaXRpb24iKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICBBTE9HSSgiZ2xHZXRBdHRyaWJMb2NhdGlvbihcInZQb3NpdGlvblwiKSA9ICVkXG4iLAotICAgICAgICAgICAgZ3ZQb3NpdGlvbkhhbmRsZSk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWaWV3cG9ydCIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBHTGZsb2F0IGdUcmlhbmdsZVZlcnRpY2VzW10gPSB7IDAuMGYsIDAuNWYsIC0wLjVmLCAtMC41ZiwKLSAgICAgICAgMC41ZiwgLTAuNWYgfTsKLQotdm9pZCByZW5kZXJGcmFtZSgpIHsKLSAgICBzdGF0aWMgZmxvYXQgZ3JleTsKLSAgICBncmV5ICs9IDAuMDFmOwotICAgIGlmIChncmV5ID4gMS4wZikgewotICAgICAgICBncmV5ID0gMC4wZjsKLSAgICB9Ci0gICAgZ2xDbGVhckNvbG9yKGdyZXksIGdyZXksIGdyZXksIDEuMGYpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhckNvbG9yIik7Ci0gICAgZ2xDbGVhciggR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotCi0gICAgZ2xVc2VQcm9ncmFtKGdQcm9ncmFtKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGd2UG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgZ1RyaWFuZ2xlVmVydGljZXMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIik7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShndlBvc2l0aW9uSGFuZGxlKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCAzKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQotCi1leHRlcm4gIkMiIHsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2wyam5pX0dMMkpOSUxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCk7Ci0gICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsMmpuaV9HTDJKTklMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKTsKLX07Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbDJqbmlfR0wySk5JTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KQ0KLXsKLSAgICBzZXR1cEdyYXBoaWNzKHdpZHRoLCBoZWlnaHQpOwotfQotCi1KTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2wyam5pX0dMMkpOSUxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCi17Ci0gICAgcmVuZGVyRnJhbWUoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbDJfam5pL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWM3NGIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKLSAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZ2wyam5pX2FjdGl2aXR5Ij5HTDJKTkk8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2NmEyYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9zcmMvY29tL2FuZHJvaWQvZ2wyam5pL0dMMkpOSUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbDJqbmk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBHTDJKTklBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEdMMkpOSVZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBtVmlldyA9IG5ldyBHTDJKTklWaWV3KGdldEFwcGxpY2F0aW9uKCkpOwotCXNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JTGliLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9zcmMvY29tL2FuZHJvaWQvZ2wyam5pL0dMMkpOSUxpYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBhOTg0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbDJfam5pL3NyYy9jb20vYW5kcm9pZC9nbDJqbmkvR0wySk5JTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbDJqbmk7Ci0KLS8vIFdyYXBwZXIgZm9yIG5hdGl2ZSBsaWJyYXJ5Ci0KLXB1YmxpYyBjbGFzcyBHTDJKTklMaWIgewotCi0gICAgIHN0YXRpYyB7Ci0gICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImdsMmpuaSIpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGN1cnJlbnQgdmlldyB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGN1cnJlbnQgdmlldyBoZWlnaHQKLSAgICAgKi8KLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RlcCgpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsMmpuaS9HTDJKTklWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9zcmMvY29tL2FuZHJvaWQvZ2wyam5pL0dMMkpOSVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiMWRmYi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2wyX2puaS9zcmMvY29tL2FuZHJvaWQvZ2wyam5pL0dMMkpOSVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbDJqbmk7Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKLSAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKLSAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KLSAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KLSAqCi0gKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCi0gKiBpbnN0YW5jZS4KLSAqLwotY2xhc3MgR0wySk5JVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiR0wySk5JVmlldyI7Ci0KLSAgICBwdWJsaWMgR0wySk5JVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQoZmFsc2UsIDAsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBHTDJKTklWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCh0cmFuc2x1Y2VudCwgZGVwdGgsIHN0ZW5jaWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgc2V0RUdMQ29udGV4dEZhY3RvcnkobmV3IENvbnRleHRGYWN0b3J5KCkpOwotICAgICAgICBzZXRFR0xDb25maWdDaG9vc2VyKCB0cmFuc2x1Y2VudCA/Ci0gICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDgsOCw4LDgsIGRlcHRoLCBzdGVuY2lsKSA6Ci0gICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDUsNiw1LDAsIGRlcHRoLCBzdGVuY2lsKSk7Ci0gICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29udGV4dEZhY3RvcnkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7Ci0gICAgICAgIHB1YmxpYyBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImNyZWF0aW5nIE9wZW5HTCBFUyAyLjAgY29udGV4dCIpOwotICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQmVmb3JlIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOwotICAgICAgICAgICAgaW50W10gYXR0cmliX2xpc3QgPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTDEwLkVHTF9OT05FIH07Ci0gICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULCBhdHRyaWJfbGlzdCk7Ci0gICAgICAgICAgICBjaGVja0VnbEVycm9yKCJBZnRlciBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgZWdsLmVnbERlc3Ryb3lDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKFN0cmluZyBwcm9tcHQsIEVHTDEwIGVnbCkgewotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIHdoaWxlICgoZXJyb3IgPSBlZ2wuZWdsR2V0RXJyb3IoKSkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiJXM6IEVHTCBlcnJvcjogMHgleCIsIHByb21wdCwgZXJyb3IpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpZ0Nob29zZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbmZpZ0Nob29zZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX09QRU5HTF9FUzJfQklUID0gNDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc19jb25maWdBdHRyaWJzMiA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHVibGljIENvbmZpZ0Nob29zZXIoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgICAgIG1SZWRTaXplID0gcjsKLSAgICAgICAgICAgIG1HcmVlblNpemUgPSBnOwotICAgICAgICAgICAgbUJsdWVTaXplID0gYjsKLSAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhOwotICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoOwotICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7Ci0KLSAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBudWxsLCAwLCBudW1fY29uZmlnKTsKLQotICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOwotCi0gICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKLSAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgY29uZmlncywgbnVtQ29uZmlncywgbnVtX2NvbmZpZyk7Ci0gICAgICAgICAgICAvLyBwcmludENvbmZpZ3MoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKLSAgICAgICAgICAgIHJldHVybiBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIEVHTENvbmZpZyBjbG9zZXN0Q29uZmlnID0gbnVsbDsKLSAgICAgICAgICAgIGludCBjbG9zZXN0RGlzdGFuY2UgPSAxMDAwOwotICAgICAgICAgICAgZm9yKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOwotICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOwotICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcz49IG1TdGVuY2lsU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSBNYXRoLmFicyhyIC0gbVJlZFNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoZyAtIG1HcmVlblNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYiAtIG1CbHVlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhhIC0gbUFscGhhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RDb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQotICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZ3MoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7Ci0gICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGNvbmZpZ3MubGVuZ3RoOwotICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIlZCBjb25maWd1cmF0aW9ucyIsIG51bUNvbmZpZ3MpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uICVkOlxuIiwgaSkpOwotICAgICAgICAgICAgICAgIHByaW50Q29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgaW50W10gYXR0cmlidXRlcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfQ0FWRUFULAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0lELAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9SRU5ERVJBQkxFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9JRCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDMwLCAvLyBFR0wxMC5FR0xfUFJFU0VSVkVEX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRVMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVfQlVGRkVSUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NVUkZBQ0VfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzOSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzQSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLAotICAgICAgICAgICAgICAgICAgICAweDMwM0IsIC8vIEVHTDEwLkVHTF9NSU5fU1dBUF9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDNDLCAvLyBFR0wxMC5FR0xfTUFYX1NXQVBfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MVU1JTkFOQ0VfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX01BU0tfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTE9SX0JVRkZFUl9UWVBFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAweDMwNDIgLy8gRUdMMTAuRUdMX0NPTkZPUk1BTlQKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CVUZGRVJfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQkxVRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9HUkVFTl9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9SRURfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfREVQVEhfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU1RFTkNJTF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfQ0FWRUFUIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfSUQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0xFVkVMIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1BJWEVMUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfV0lEVEgiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9SRU5ERVJBQkxFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX0lEIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRVMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRV9CVUZGRVJTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TVVJGQUNFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NSU5fU1dBUF9JTlRFUlZBTCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1NXQVBfSU5URVJWQUwiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0xVTUlOQU5DRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9NQVNLX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTE9SX0JVRkZFUl9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9SRU5ERVJBQkxFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZPUk1BTlQiCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgaW50W10gdmFsdWUgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6ICVkXG4iLCBuYW1lLCB2YWx1ZVswXSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogZmFpbGVkXG4iLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3ViY2xhc3NlcyBjYW4gYWRqdXN0IHRoZXNlIHZhbHVlczoKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUmVkU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtR3JlZW5TaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1CbHVlU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtQWxwaGFTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1EZXB0aFNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbVN0ZW5jaWxTaXplOwotICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZSA9IG5ldyBpbnRbMV07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgR0wySk5JTGliLnN0ZXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBHTDJKTklMaWIuaW5pdCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsMl95dXZ0ZXgvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbDJfeXV2dGV4L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDM3NTkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl95dXZ0ZXgvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlnbDJfeXV2dGV4LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YyIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWdsMl95dXZ0ZXgKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbDJfeXV2dGV4L2dsMl95dXZ0ZXguY3BwIGIvb3BlbmdsL3Rlc3RzL2dsMl95dXZ0ZXgvZ2wyX3l1dnRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTQ5MzIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsMl95dXZ0ZXgvZ2wyX3l1dnRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzY2hlZC5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICAvLyBmcHJpbnRmKHN0ZGVyciwgInByaW50R0xTdHJpbmcgJXMsICVkXG4iLCBuYW1lLCBzKTsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgLy8gaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOwotICAgIC8vIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRFcnJvcigpID0gJWQsIHJlc3VsdCBvZiBnbEdldFN0cmluZyA9ICV4XG4iLCBlcnJvciwKLSAgICAvLyAgICAgICAgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgLy8gaWYgKCh2IDwgKGNvbnN0IGNoYXIqKSAwKSB8fCAodiA+IChjb25zdCBjaGFyKikgMHgxMDAwMCkpCi0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLSAgICAvLyBlbHNlCi0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9IChudWxsKSAweCUwOHhcbiIsIG5hbWUsICh1bnNpZ25lZCBpbnQpIHYpOwotICAgIGZwcmludGYoc3RkZXJyLCAiR0wgJXMgPSAlc1xuIiwgbmFtZSwgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpIHsKLSAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoKSByZXR1cm5lZCAlZFxuIiwgb3AsIHJldHVyblZhbCk7Ci0gICAgfQotCi0gICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKLSAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpXG4iLCBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwKLSAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9ICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgInZhcnlpbmcgdmVjMiB5dXZUZXhDb29yZHM7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB5dXZUZXhDb29yZHMgPSB2UG9zaXRpb24ueHkgKyB2ZWMyKDAuNSwgMC41KTtcbiIKLSAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZ0ZyYWdtZW50U2hhZGVyW10gPSAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIgotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyRXh0ZXJuYWxPRVMgeXV2VGV4U2FtcGxlcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHl1dlRleENvb3JkcztcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh5dXZUZXhTYW1wbGVyLCB5dXZUZXhDb29yZHMpO1xuIgotICAgICJ9XG4iOwotCi1HTHVpbnQgbG9hZFNoYWRlcihHTGVudW0gc2hhZGVyVHlwZSwgY29uc3QgY2hhciogcFNvdXJjZSkgewotICAgIEdMdWludCBzaGFkZXIgPSBnbENyZWF0ZVNoYWRlcihzaGFkZXJUeXBlKTsKLSAgICBpZiAoc2hhZGVyKSB7Ci0gICAgICAgIGdsU2hhZGVyU291cmNlKHNoYWRlciwgMSwgJnBTb3VyY2UsIE5VTEwpOwotICAgICAgICBnbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgR0xpbnQgY29tcGlsZWQgPSAwOwotICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfQ09NUElMRV9TVEFUVVMsICZjb21waWxlZCk7Ci0gICAgICAgIGlmICghY29tcGlsZWQpIHsKLSAgICAgICAgICAgIEdMaW50IGluZm9MZW4gPSAwOwotICAgICAgICAgICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgICAgICAgICAgaWYgKGluZm9MZW4pIHsKLSAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhpbmZvTGVuKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNvbXBpbGUgc2hhZGVyICVkOlxuJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyVHlwZSwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJHdWVzc2luZyBhdCBHTF9JTkZPX0xPR19MRU5HVEggc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoMHgxMDAwKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIDB4MTAwMCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgJWQ6XG4lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJUeXBlLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgIHNoYWRlciA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNoYWRlcjsKLX0KLQotR0x1aW50IGNyZWF0ZVByb2dyYW0oY29uc3QgY2hhciogcFZlcnRleFNvdXJjZSwgY29uc3QgY2hhciogcEZyYWdtZW50U291cmNlKSB7Ci0gICAgR0x1aW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfVkVSVEVYX1NIQURFUiwgcFZlcnRleFNvdXJjZSk7Ci0gICAgaWYgKCF2ZXJ0ZXhTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTF9GUkFHTUVOVF9TSEFERVIsIHBGcmFnbWVudFNvdXJjZSk7Ci0gICAgaWYgKCFwaXhlbFNoYWRlcikgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBHTHVpbnQgcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOwotICAgIGlmIChwcm9ncmFtKSB7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHZlcnRleFNoYWRlcik7Ci0gICAgICAgIGNoZWNrR2xFcnJvcigiZ2xBdHRhY2hTaGFkZXIiKTsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsTGlua1Byb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgIEdMaW50IGxpbmtTdGF0dXMgPSBHTF9GQUxTRTsKLSAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfTElOS19TVEFUVVMsICZsaW5rU3RhdHVzKTsKLSAgICAgICAgaWYgKGxpbmtTdGF0dXMgIT0gR0xfVFJVRSkgewotICAgICAgICAgICAgR0xpbnQgYnVmTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoYnVmTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdsR2V0UHJvZ3JhbUluZm9Mb2cocHJvZ3JhbSwgYnVmTGVuZ3RoLCBOVUxMLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9ncmFtOwotfQotCi1HTHVpbnQgZ1Byb2dyYW07Ci1HTGludCBndlBvc2l0aW9uSGFuZGxlOwotR0xpbnQgZ1l1dlRleFNhbXBsZXJIYW5kbGU7Ci0KLWJvb2wgc2V0dXBHcmFwaGljcyhpbnQgdywgaW50IGgpIHsKLSAgICBnUHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgZ0ZyYWdtZW50U2hhZGVyKTsKLSAgICBpZiAoIWdQcm9ncmFtKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ3ZQb3NpdGlvbkhhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24oZ1Byb2dyYW0sICJ2UG9zaXRpb24iKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImdsR2V0QXR0cmliTG9jYXRpb24oXCJ2UG9zaXRpb25cIikgPSAlZFxuIiwKLSAgICAgICAgICAgIGd2UG9zaXRpb25IYW5kbGUpOwotICAgIGdZdXZUZXhTYW1wbGVySGFuZGxlID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24oZ1Byb2dyYW0sICJ5dXZUZXhTYW1wbGVyIik7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEdldFVuaWZvcm1Mb2NhdGlvbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRVbmlmb3JtTG9jYXRpb24oXCJ5dXZUZXhTYW1wbGVyXCIpID0gJWRcbiIsCi0gICAgICAgICAgICBnWXV2VGV4U2FtcGxlckhhbmRsZSk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWaWV3cG9ydCIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgYWxpZ24oaW50IHgsIGludCBhKSB7Ci0gICAgcmV0dXJuICh4ICsgKGEtMSkpICYgKH4oYS0xKSk7Ci19Ci0KLWNvbnN0IGludCB5dXZUZXhXaWR0aCA9IDYwODsKLWNvbnN0IGludCB5dXZUZXhIZWlnaHQgPSA0ODA7Ci1jb25zdCBpbnQgeXV2VGV4VXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZOwotY29uc3QgaW50IHl1dlRleEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKLWNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLWNvbnN0IGJvb2wgeXV2VGV4U2FtZVVWID0gZmFsc2U7Ci1zdGF0aWMgc3A8R3JhcGhpY0J1ZmZlcj4geXV2VGV4QnVmZmVyOwotc3RhdGljIEdMdWludCB5dXZUZXg7Ci0KLWJvb2wgc2V0dXBZdXZUZXhTdXJmYWNlKEVHTERpc3BsYXkgZHB5LCBFR0xDb250ZXh0IGNvbnRleHQpIHsKLSAgICBpbnQgYmxvY2tXaWR0aCA9IHl1dlRleFdpZHRoID4gMTYgPyB5dXZUZXhXaWR0aCAvIDE2IDogMTsKLSAgICBpbnQgYmxvY2tIZWlnaHQgPSB5dXZUZXhIZWlnaHQgPiAxNiA/IHl1dlRleEhlaWdodCAvIDE2IDogMTsKLSAgICB5dXZUZXhCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcih5dXZUZXhXaWR0aCwgeXV2VGV4SGVpZ2h0LCB5dXZUZXhGb3JtYXQsCi0gICAgICAgICAgICB5dXZUZXhVc2FnZSk7Ci0gICAgaW50IHl1dlRleFN0cmlkZVkgPSB5dXZUZXhCdWZmZXItPmdldFN0cmlkZSgpOwotICAgIGludCB5dXZUZXhPZmZzZXRWID0geXV2VGV4U3RyaWRlWSAqIHl1dlRleEhlaWdodDsKLSAgICBpbnQgeXV2VGV4U3RyaWRlViA9ICh5dXZUZXhTdHJpZGVZLzIgKyAweGYpICYgfjB4ZjsKLSAgICBpbnQgeXV2VGV4T2Zmc2V0VSA9IHl1dlRleE9mZnNldFYgKyB5dXZUZXhTdHJpZGVWICogeXV2VGV4SGVpZ2h0LzI7Ci0gICAgaW50IHl1dlRleFN0cmlkZVUgPSB5dXZUZXhTdHJpZGVWOwotICAgIGNoYXIqIGJ1ZiA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgZXJyID0geXV2VGV4QnVmZmVyLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZidWYpKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ5dXZUZXhCdWZmZXItPmxvY2soLi4uKSBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoaW50IHggPSAwOyB4IDwgeXV2VGV4V2lkdGg7IHgrKykgewotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IHl1dlRleEhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WCA9ICh4IC8gYmxvY2tXaWR0aCkgJiAxOwotICAgICAgICAgICAgaW50IHBhcml0eVkgPSAoeSAvIGJsb2NrSGVpZ2h0KSAmIDE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGludGVuc2l0eSA9IChwYXJpdHlYIF4gcGFyaXR5WSkgPyA2MyA6IDE5MTsKLSAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRZICsgKHkgKiB5dXZUZXhTdHJpZGVZKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgaWYgKHggPCB5dXZUZXhXaWR0aCAvIDIgJiYgeSA8IHl1dlRleEhlaWdodCAvIDIpIHsKLSAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICBpZiAoeXV2VGV4U2FtZVVWKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkgKiB5dXZUZXhTdHJpZGVWKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA8IHl1dlRleFdpZHRoIC8gNCAmJiB5IDwgeXV2VGV4SGVpZ2h0IC8gNCkgewotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5KjIgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDBdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSoyICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAxXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKCh5KjIrMSkgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDBdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoKHkqMisxKSAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMV0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0geXV2VGV4QnVmZmVyLT51bmxvY2soKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ5dXZUZXhCdWZmZXItPnVubG9jaygpIGZhaWxlZDogJWRcbiIsIGVycik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBFR0xDbGllbnRCdWZmZXIgY2xpZW50QnVmZmVyID0gKEVHTENsaWVudEJ1ZmZlcil5dXZUZXhCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpOwotICAgIEVHTEltYWdlS0hSIGltZyA9IGVnbENyZWF0ZUltYWdlS0hSKGRweSwgRUdMX05PX0NPTlRFWFQsIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsCi0gICAgICAgICAgICBjbGllbnRCdWZmZXIsIDApOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUltYWdlS0hSIik7Ci0gICAgaWYgKGltZyA9PSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBnbEdlblRleHR1cmVzKDEsICZ5dXZUZXgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZW5UZXh0dXJlcyIpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIHl1dlRleCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIik7Ci0gICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgKEdMZWdsSW1hZ2VPRVMpaW1nKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMiKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBHTGZsb2F0IGdUcmlhbmdsZVZlcnRpY2VzW10gPSB7Ci0gICAgLTAuNWYsIDAuNWYsCi0gICAgLTAuNWYsIC0wLjVmLAotICAgIDAuNWYsIC0wLjVmLAotICAgIDAuNWYsIDAuNWYsCi19OwotCi12b2lkIHJlbmRlckZyYW1lKCkgewotICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXJDb2xvciIpOwotICAgIGdsQ2xlYXIoIEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXIiKTsKLQotICAgIGdsVXNlUHJvZ3JhbShnUHJvZ3JhbSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFVzZVByb2dyYW0iKTsKLQotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihndlBvc2l0aW9uSGFuZGxlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsIDAsIGdUcmlhbmdsZVZlcnRpY2VzKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciIpOwotICAgIGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZ3ZQb3NpdGlvbkhhbmRsZSk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5Iik7Ci0KLSAgICBnbFVuaWZvcm0xaShnWXV2VGV4U2FtcGxlckhhbmRsZSwgMCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFVuaWZvcm0xaSIpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIHl1dlRleCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIik7Ci0KLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQotCi12b2lkIHByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZykgewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsICZ2YWx1ZSk7Ci0gICAgICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgJiYgZXJyb3IgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHByaW50ZigiICVzOiAiLCBuYW1lc1tqXS5uYW1lKTsKLSAgICAgICAgICAgIHByaW50ZigiJWQgKDB4JXgpIiwgdmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotCi0gICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FIH07Ci0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgRUdMaW50IHcsIGg7Ci0KLSAgICBFR0xEaXNwbGF5IGRweTsKLQotICAgIGNoZWNrRWdsRXJyb3IoIjxpbml0PiIpOwotICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOwotICAgIGlmIChkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IHJldHVybmVkIEVHTF9OT19ESVNQTEFZLlxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVyblZhbHVlID0gZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEluaXRpYWxpemUiLCByZXR1cm5WYWx1ZSk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJFR0wgdmVyc2lvbiAlZC4lZFxuIiwgbWFqb3JWZXJzaW9uLCBtaW5vclZlcnNpb24pOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICBwcmludGYoImVnbEluaXRpYWxpemUgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRUdMTmF0aXZlV2luZG93VHlwZSB3aW5kb3cgPSBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCk7Ci0gICAgcmV0dXJuVmFsdWUgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KGRweSwgc19jb25maWdBdHRyaWJzLCB3aW5kb3csICZteUNvbmZpZyk7Ci0gICAgaWYgKHJldHVyblZhbHVlKSB7Ci0gICAgICAgIHByaW50ZigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygpIHJldHVybmVkICVkIiwgcmV0dXJuVmFsdWUpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBjaGVja0VnbEVycm9yKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93Iik7Ci0KLSAgICBwcmludGYoIkNob3NlIHRoaXMgY29uZmlndXJhdGlvbjpcbiIpOwotICAgIHByaW50RUdMQ29uZmlndXJhdGlvbihkcHksIG15Q29uZmlnKTsKLQotICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOwotICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIHByaW50ZigiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmlicyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOwotICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIldpbmRvdyBkaW1lbnNpb25zOiAlZCB4ICVkXG4iLCB3LCBoKTsKLQotICAgIHByaW50R0xTdHJpbmcoIlZlcnNpb24iLCBHTF9WRVJTSU9OKTsKLSAgICBwcmludEdMU3RyaW5nKCJWZW5kb3IiLCBHTF9WRU5ET1IpOwotICAgIHByaW50R0xTdHJpbmcoIlJlbmRlcmVyIiwgR0xfUkVOREVSRVIpOwotICAgIHByaW50R0xTdHJpbmcoIkV4dGVuc2lvbnMiLCBHTF9FWFRFTlNJT05TKTsKLQotICAgIGlmKCFzZXR1cFl1dlRleFN1cmZhY2UoZHB5LCBjb250ZXh0KSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgdXAgdGV4dHVyZSBzdXJmYWNlLlxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGlmKCFzZXR1cEdyYXBoaWNzKHcsIGgpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCB1cCBncmFwaGljcy5cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHJlbmRlckZyYW1lKCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbFN3YXBCdWZmZXJzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfYmFzaWMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9iYXNpYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJjYzYwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9iYXNpYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWdsX2Jhc2ljLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWdsX2Jhc2ljCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX2Jhc2ljL2dsX2Jhc2ljLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9iYXNpYy9nbF9iYXNpYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzY2U5MzQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2Jhc2ljL2dsX2Jhc2ljLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vLyBTaW1wbGUgT3BlbkdMIEVTIDEueCBhcHBsaWNhdGlvbiBzaG93aW5nIGhvdyB0byBpbml0aWFsaXplIGFuZCBkcmF3IHNvbWV0aGluZy4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotRUdMRGlzcGxheSBlZ2xEaXNwbGF5OwotRUdMU3VyZmFjZSBlZ2xTdXJmYWNlOwotRUdMQ29udGV4dCBlZ2xDb250ZXh0OwotR0x1aW50IHRleHR1cmU7Ci0KLSNkZWZpbmUgRklYRURfT05FIDB4MTAwMDAKLSNkZWZpbmUgSVRFUkFUSU9OUyA1MAotCi1pbnQgaW5pdF9nbF9zdXJmYWNlKHZvaWQpOwotdm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCk7Ci12b2lkIGluaXRfc2NlbmUodm9pZCk7Ci12b2lkIHJlbmRlcigpOwotdm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKTsKLWludCByZWFkVGltZXIodm9pZCk7Ci0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgZ2x1TG9va0F0KGZsb2F0IGV5ZVgsIGZsb2F0IGV5ZVksIGZsb2F0IGV5ZVosCi0gICAgICAgIGZsb2F0IGNlbnRlclgsIGZsb2F0IGNlbnRlclksIGZsb2F0IGNlbnRlclosIGZsb2F0IHVwWCwgZmxvYXQgdXBZLAotICAgICAgICBmbG9hdCB1cFopCi17Ci0gICAgLy8gU2VlIHRoZSBPcGVuR0wgR0xVVCBkb2N1bWVudGF0aW9uIGZvciBnbHVMb29rQXQgZm9yIGEgZGVzY3JpcHRpb24KLSAgICAvLyBvZiB0aGUgYWxnb3JpdGhtLiBXZSBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgd2F5OgotCi0gICAgZmxvYXQgZnggPSBjZW50ZXJYIC0gZXllWDsKLSAgICBmbG9hdCBmeSA9IGNlbnRlclkgLSBleWVZOwotICAgIGZsb2F0IGZ6ID0gY2VudGVyWiAtIGV5ZVo7Ci0KLSAgICAvLyBOb3JtYWxpemUgZgotICAgIGZsb2F0IHJsZiA9IDEuMGYgLyBzcXJ0ZihmeCpmeCArIGZ5KmZ5ICsgZnoqZnopOwotICAgIGZ4ICo9IHJsZjsKLSAgICBmeSAqPSBybGY7Ci0gICAgZnogKj0gcmxmOwotCi0gICAgLy8gTm9ybWFsaXplIHVwCi0gICAgZmxvYXQgcmx1cCA9IDEuMGYgLyBzcXJ0Zih1cFgqdXBYICsgdXBZKnVwWSArIHVwWip1cFopOwotICAgIHVwWCAqPSBybHVwOwotICAgIHVwWSAqPSBybHVwOwotICAgIHVwWiAqPSBybHVwOwotCi0gICAgLy8gY29tcHV0ZSBzID0gZiB4IHVwICh4IG1lYW5zICJjcm9zcyBwcm9kdWN0IikKLQotICAgIGZsb2F0IHN4ID0gZnkgKiB1cFogLSBmeiAqIHVwWTsKLSAgICBmbG9hdCBzeSA9IGZ6ICogdXBYIC0gZnggKiB1cFo7Ci0gICAgZmxvYXQgc3ogPSBmeCAqIHVwWSAtIGZ5ICogdXBYOwotCi0gICAgLy8gY29tcHV0ZSB1ID0gcyB4IGYKLSAgICBmbG9hdCB1eCA9IHN5ICogZnogLSBzeiAqIGZ5OwotICAgIGZsb2F0IHV5ID0gc3ogKiBmeCAtIHN4ICogZno7Ci0gICAgZmxvYXQgdXogPSBzeCAqIGZ5IC0gc3kgKiBmeDsKLQotICAgIGZsb2F0IG1bMTZdIDsKLSAgICBtWzBdID0gc3g7Ci0gICAgbVsxXSA9IHV4OwotICAgIG1bMl0gPSAtZng7Ci0gICAgbVszXSA9IDAuMGY7Ci0KLSAgICBtWzRdID0gc3k7Ci0gICAgbVs1XSA9IHV5OwotICAgIG1bNl0gPSAtZnk7Ci0gICAgbVs3XSA9IDAuMGY7Ci0KLSAgICBtWzhdID0gc3o7Ci0gICAgbVs5XSA9IHV6OwotICAgIG1bMTBdID0gLWZ6OwotICAgIG1bMTFdID0gMC4wZjsKLQotICAgIG1bMTJdID0gMC4wZjsKLSAgICBtWzEzXSA9IDAuMGY7Ci0gICAgbVsxNF0gPSAwLjBmOwotICAgIG1bMTVdID0gMS4wZjsKLQotICAgIGdsTXVsdE1hdHJpeGYobSk7Ci0gICAgZ2xUcmFuc2xhdGVmKC1leWVYLCAtZXllWSwgLWV5ZVopOwotfQotCi12b2lkIHByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZykgewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsICZ2YWx1ZSk7Ci0gICAgICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgJiYgZXJyb3IgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHByaW50ZigiICVzOiAiLCBuYW1lc1tqXS5uYW1lKTsKLSAgICAgICAgICAgIHByaW50ZigiJWQgKDB4JXgpIiwgdmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpIHsKLSAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoKSByZXR1cm5lZCAlZFxuIiwgb3AsIHJldHVyblZhbCk7Ci0gICAgfQotCi0gICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKLSAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpXG4iLCBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwKLSAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgfQotfQotCi1pbnQgcHJpbnRFR0xDb25maWd1cmF0aW9ucyhFR0xEaXNwbGF5IGRweSkgewotICAgIEVHTGludCBudW1Db25maWcgPSAwOwotICAgIEVHTGludCByZXR1cm5WYWwgPSBlZ2xHZXRDb25maWdzKGRweSwgTlVMTCwgMCwgJm51bUNvbmZpZyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0Q29uZmlncyIsIHJldHVyblZhbCk7Ci0gICAgaWYgKCFyZXR1cm5WYWwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaW50ZigiTnVtYmVyIG9mIEVHTCBjb25maWd1cmF0aW9uczogJWRcbiIsIG51bUNvbmZpZyk7Ci0KLSAgICBFR0xDb25maWcqIGNvbmZpZ3MgPSAoRUdMQ29uZmlnKikgbWFsbG9jKHNpemVvZihFR0xDb25maWcpICogbnVtQ29uZmlnKTsKLSAgICBpZiAoISBjb25maWdzKSB7Ci0gICAgICAgIHByaW50ZigiQ291bGQgbm90IGFsbG9jYXRlIGNvbmZpZ3MuXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVyblZhbCA9IGVnbEdldENvbmZpZ3MoZHB5LCBjb25maWdzLCBudW1Db25maWcsICZudW1Db25maWcpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEdldENvbmZpZ3MiLCByZXR1cm5WYWwpOwotICAgIGlmICghcmV0dXJuVmFsKSB7Ci0gICAgICAgIGZyZWUoY29uZmlncyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCJDb25maWd1cmF0aW9uICVkXG4iLCBpKTsKLSAgICAgICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgY29uZmlnc1tpXSk7Ci0gICAgfQotCi0gICAgZnJlZShjb25maWdzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBxOwotICAgIGludCBzdGFydCwgZW5kOwotICAgIHByaW50ZigiSW5pdGlhbGl6aW5nIEVHTC4uLlxuIik7Ci0gICAgaWYoIWluaXRfZ2xfc3VyZmFjZSgpKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJHTCBpbml0aWFsaXNhdGlvbiBmYWlsZWQgLSBleGl0aW5nXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGluaXRfc2NlbmUoKTsKLSAgICBjcmVhdGVfdGV4dHVyZSgpOwotICAgIHByaW50ZigiUnVubmluZy4uLlxuIik7Ci0gICAgd2hpbGUodHJ1ZSkgewotICAgICAgICByZW5kZXIoKTsKLSAgICB9Ci0gICAgZnJlZV9nbF9zdXJmYWNlKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBpbml0X2dsX3N1cmZhY2Uodm9pZCkKLXsKLSAgICBFR0xpbnQgbnVtQ29uZmlncyA9IDE7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotICAgIEVHTGludCBhdHRyaWJbXSA9Ci0gICAgewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0KLSAgICBpZiAoIChlZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKSkgPT0gRUdMX05PX0RJU1BMQVkgKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xHZXREaXNwbGF5IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBpZiAoIGVnbEluaXRpYWxpemUoZWdsRGlzcGxheSwgTlVMTCwgTlVMTCkgIT0gRUdMX1RSVUUgKQotICAgIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICghIHByaW50RUdMQ29uZmlndXJhdGlvbnMoZWdsRGlzcGxheSkpIHsKLSAgICAgICAgcHJpbnRmKCJwcmludEVHTENvbmZpZ3VyYXRpb25zIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KGVnbERpc3BsYXksIGF0dHJpYiwgd2luZG93LCAmbXlDb25maWcpOwotCi0gICAgaWYgKCAoZWdsU3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZWdsRGlzcGxheSwgbXlDb25maWcsCi0gICAgICAgICAgICB3aW5kb3csIDApKSA9PSBFR0xfTk9fU1VSRkFDRSApCi0gICAgewotICAgICAgICBwcmludGYoImVnbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCAoZWdsQ29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZWdsRGlzcGxheSwgbXlDb25maWcsIDAsIDApKSA9PSBFR0xfTk9fQ09OVEVYVCApCi0gICAgewotICAgICAgICBwcmludGYoImVnbENyZWF0ZUNvbnRleHQgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCBlZ2xNYWtlQ3VycmVudChlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBlZ2xTdXJmYWNlLCBlZ2xDb250ZXh0KSAhPSBFR0xfVFJVRSApCi0gICAgewotICAgICAgICBwcmludGYoImVnbE1ha2VDdXJyZW50IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBpbnQgdywgaDsKLQotICAgIGVnbFF1ZXJ5U3VyZmFjZShlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7Ci0gICAgCi0gICAgZnByaW50ZihzdGRlcnIsICJXaW5kb3cgZGltZW5zaW9uczogJWQgeCAlZFxuIiwgdywgaCk7Ci0KLSAgICBwcmludEdMU3RyaW5nKCJWZXJzaW9uIiwgR0xfVkVSU0lPTik7Ci0gICAgcHJpbnRHTFN0cmluZygiVmVuZG9yIiwgR0xfVkVORE9SKTsKLSAgICBwcmludEdMU3RyaW5nKCJSZW5kZXJlciIsIEdMX1JFTkRFUkVSKTsKLSAgICBwcmludEdMU3RyaW5nKCJFeHRlbnNpb25zIiwgR0xfRVhURU5TSU9OUyk7Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotdm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCkKLXsKLSAgICBpZiAoZWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkKLSAgICB7Ci0gICAgICAgIGVnbE1ha2VDdXJyZW50KCBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NVUkZBQ0UsCi0gICAgICAgICAgICAgICAgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUICk7Ci0gICAgICAgIGVnbERlc3Ryb3lDb250ZXh0KCBlZ2xEaXNwbGF5LCBlZ2xDb250ZXh0ICk7Ci0gICAgICAgIGVnbERlc3Ryb3lTdXJmYWNlKCBlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlICk7Ci0gICAgICAgIGVnbFRlcm1pbmF0ZSggZWdsRGlzcGxheSApOwotICAgICAgICBlZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7Ci0gICAgfQotfQotCi12b2lkIGluaXRfc2NlbmUodm9pZCkKLXsKLSAgICBnbERpc2FibGUoR0xfRElUSEVSKTsKLSAgICBnbEVuYWJsZShHTF9DVUxMX0ZBQ0UpOwotICAgIGZsb2F0IHJhdGlvID0gMzIwLjBmIC8gNDgwLjBmOwotICAgIGdsVmlld3BvcnQoMCwgMCwgMzIwLCA0ODApOwotICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsdUxvb2tBdCgKLSAgICAgICAgICAgIDAsIDAsIDMsICAvLyBleWUKLSAgICAgICAgICAgIDAsIDAsIDAsICAvLyBjZW50ZXIKLSAgICAgICAgICAgIDAsIDEsIDApOyAvLyB1cAotICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotfQotCi12b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpCi17Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IG9uID0gMHhmZjAwMDBmZjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgb2ZmID0gMHhmZmZmZmZmZjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgcGl4ZWxzW10gPQotICAgIHsKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgIH07Ci0KLSAgICBnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRleHR1cmUpOwotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA4LCA4LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci19Ci0KLXZvaWQgcmVuZGVyKCkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgcXVhZHMgPSAxOwotCi0gICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0gewotICAgICAgICAgICAgLTEsICAtMSwgIDAsCi0gICAgICAgICAgICAgMSwgIC0xLCAgMCwKLSAgICAgICAgICAgICAxLCAgIDEsICAwLAotICAgICAgICAgICAgLTEsICAgMSwgIDAKLSAgICB9OwotCi0gICAgY29uc3QgR0xmaXhlZCB0ZXhDb29yZHNbXSA9IHsKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIEZJWEVEX09ORSwgICAgMCwKLSAgICAgICAgICAgIEZJWEVEX09ORSwgICAgRklYRURfT05FLAotICAgICAgICAgICAgMCwgICAgICAgICAgICBGSVhFRF9PTkUKLSAgICB9OwotCi0gICAgY29uc3QgR0x1c2hvcnQgaW5kaWNlc1tdID0geyAwLCAxLCAyLCAgMCwgMiwgMyB9OwotCi0gICAgZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7Ci0gICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRklYRUQsIDAsIHRleENvb3Jkcyk7Ci0gICAgZ2xDbGVhckNvbG9yKDEuMCwgMS4wLCAxLjAsIDEuMCk7Ci0gICAgaW50IG5lbGVtID0gc2l6ZW9mKGluZGljZXMpL3NpemVvZihpbmRpY2VzWzBdKTsKLSAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBnbERyYXdFbGVtZW50cyhHTF9UUklBTkdMRVMsIG5lbGVtLCBHTF9VTlNJR05FRF9TSE9SVCwgaW5kaWNlcyk7Ci0gICAgZWdsU3dhcEJ1ZmZlcnMoZWdsRGlzcGxheSwgZWdsU3VyZmFjZSk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjBlNzIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBPcGVuR0wgRVMgSk5JIHNhbXBsZQotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR0xKTkkKLQotTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZ2xqbmkKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUxPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICBnbF9jb2RlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1dGlscyBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjFfQ00KLQotTE9DQUxfTU9EVUxFIDo9IGxpYmdsam5pCi0KLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotCi0KLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBlYzk2Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2xqbmkiPgotICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9FWFRFUk5BTF9TVE9SQUdFIiAvPgotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9nbGpuaV9hY3Rpdml0eSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkdMSk5JQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgIAlhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsYW5kc2NhcGUiCi0gICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL2puaS9nbF9jb2RlLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg2MDIwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvam5pL2dsX2NvZGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8vIE9wZW5HTCBFUyAxLjAgY29kZQotCi0jaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgotI2RlZmluZSBMT0dfVEFHICJHTEpOSSBnbF9jb2RlLmNwcCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLUdMdWludCB0ZXh0dXJlOwotR0xmbG9hdCBiYWNrZ3JvdW5kOwotCi0jZGVmaW5lIEZJWEVEX09ORSAweDEwMDAwCi0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgQUxPR0koIkdMICVzID0gJXNcbiIsIG5hbWUsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBnbHVMb29rQXQoZmxvYXQgZXllWCwgZmxvYXQgZXllWSwgZmxvYXQgZXllWiwKLSAgICAgICAgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgY2VudGVyWiwgZmxvYXQgdXBYLCBmbG9hdCB1cFksCi0gICAgICAgIGZsb2F0IHVwWikKLXsKLSAgICAvLyBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbgotICAgIC8vIG9mIHRoZSBhbGdvcml0aG0uIFdlIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXk6Ci0KLSAgICBmbG9hdCBmeCA9IGNlbnRlclggLSBleWVYOwotICAgIGZsb2F0IGZ5ID0gY2VudGVyWSAtIGV5ZVk7Ci0gICAgZmxvYXQgZnogPSBjZW50ZXJaIC0gZXllWjsKLQotICAgIC8vIE5vcm1hbGl6ZSBmCi0gICAgZmxvYXQgcmxmID0gMS4wZiAvIHNxcnRmKGZ4KmZ4ICsgZnkqZnkgKyBmeipmeik7Ci0gICAgZnggKj0gcmxmOwotICAgIGZ5ICo9IHJsZjsKLSAgICBmeiAqPSBybGY7Ci0KLSAgICAvLyBOb3JtYWxpemUgdXAKLSAgICBmbG9hdCBybHVwID0gMS4wZiAvIHNxcnRmKHVwWCp1cFggKyB1cFkqdXBZICsgdXBaKnVwWik7Ci0gICAgdXBYICo9IHJsdXA7Ci0gICAgdXBZICo9IHJsdXA7Ci0gICAgdXBaICo9IHJsdXA7Ci0KLSAgICAvLyBjb21wdXRlIHMgPSBmIHggdXAgKHggbWVhbnMgImNyb3NzIHByb2R1Y3QiKQotCi0gICAgZmxvYXQgc3ggPSBmeSAqIHVwWiAtIGZ6ICogdXBZOwotICAgIGZsb2F0IHN5ID0gZnogKiB1cFggLSBmeCAqIHVwWjsKLSAgICBmbG9hdCBzeiA9IGZ4ICogdXBZIC0gZnkgKiB1cFg7Ci0KLSAgICAvLyBjb21wdXRlIHUgPSBzIHggZgotICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7Ci0gICAgZmxvYXQgdXkgPSBzeiAqIGZ4IC0gc3ggKiBmejsKLSAgICBmbG9hdCB1eiA9IHN4ICogZnkgLSBzeSAqIGZ4OwotCi0gICAgZmxvYXQgbVsxNl0gOwotICAgIG1bMF0gPSBzeDsKLSAgICBtWzFdID0gdXg7Ci0gICAgbVsyXSA9IC1meDsKLSAgICBtWzNdID0gMC4wZjsKLQotICAgIG1bNF0gPSBzeTsKLSAgICBtWzVdID0gdXk7Ci0gICAgbVs2XSA9IC1meTsKLSAgICBtWzddID0gMC4wZjsKLQotICAgIG1bOF0gPSBzejsKLSAgICBtWzldID0gdXo7Ci0gICAgbVsxMF0gPSAtZno7Ci0gICAgbVsxMV0gPSAwLjBmOwotCi0gICAgbVsxMl0gPSAwLjBmOwotICAgIG1bMTNdID0gMC4wZjsKLSAgICBtWzE0XSA9IDAuMGY7Ci0gICAgbVsxNV0gPSAxLjBmOwotCi0gICAgZ2xNdWx0TWF0cml4ZihtKTsKLSAgICBnbFRyYW5zbGF0ZWYoLWV5ZVgsIC1leWVZLCAtZXllWik7Ci19Ci0KLXZvaWQgaW5pdF9zY2VuZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKLQotICAgIGZsb2F0IHJhdGlvID0gd2lkdGggLyBoZWlnaHQ7Ci0gICAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDEsIDEwKTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotCi0gICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICBnbHVMb29rQXQoCi0gICAgICAgICAgICAwLCAwLCAzLCAgLy8gZXllCi0gICAgICAgICAgICAwLCAwLCAwLCAgLy8gY2VudGVyCi0gICAgICAgICAgICAwLCAxLCAwKTsgLy8gdXAKLQotICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotfQotCi12b2lkIGNyZWF0ZV90ZXh0dXJlKCkKLXsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgb24gPSAweGZmMDAwMGZmOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmYgPSAweGZmZmZmZmZmOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBwaXhlbHNbXSA9Ci0gICAgewotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgfTsKLQotICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7Ci0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIDgsIDgsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHBpeGVscyk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci0gICAgSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsam5pX0dMSk5JTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KTsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xqbmlfR0xKTklMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKTsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xqbmlfR0xKTklMaWJfY2hhbmdlQmFja2dyb3VuZChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKTsKLX07Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGpuaV9HTEpOSUxpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosICBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkKLXsKLSAgICBpbml0X3NjZW5lKHdpZHRoLCBoZWlnaHQpOwotICAgIGNyZWF0ZV90ZXh0dXJlKCk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGpuaV9HTEpOSUxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCi17Ci0gICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1tdID0gewotICAgICAgICAgICAgLTEsICAtMSwgIDAsCi0gICAgICAgICAgICAgMSwgIC0xLCAgMCwKLSAgICAgICAgICAgICAxLCAgIDEsICAwLAotICAgICAgICAgICAgLTEsICAgMSwgIDAKLSAgICB9OwotCi0gICAgY29uc3QgR0xmaXhlZCB0ZXhDb29yZHNbXSA9IHsKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIEZJWEVEX09ORSwgICAgMCwKLSAgICAgICAgICAgIEZJWEVEX09ORSwgICAgRklYRURfT05FLAotICAgICAgICAgICAgMCwgICAgICAgICAgICBGSVhFRF9PTkUKLSAgICB9OwotCi0gICAgY29uc3QgR0x1c2hvcnQgcXVhZEluZGljZXNbXSA9IHsgMCwgMSwgMiwgIDAsIDIsIDMgfTsKLSAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsKLSAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GSVhFRCwgMCwgdGV4Q29vcmRzKTsKLQotICAgIGludCBuZWxlbSA9IHNpemVvZihxdWFkSW5kaWNlcykvc2l6ZW9mKHF1YWRJbmRpY2VzWzBdKTsKLSAgICBzdGF0aWMgZmxvYXQgZ3JleTsKLSAgICBncmV5ICs9IDAuMDFmOwotICAgIGlmIChncmV5ID4gMS4wZikgewotICAgICAgICBncmV5ID0gMC4wZjsKLSAgICB9Ci0gICAgZ2xDbGVhckNvbG9yKGJhY2tncm91bmQsIGdyZXksIGdyZXksIDEuMGYpOwotICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGdsRHJhd0VsZW1lbnRzKEdMX1RSSUFOR0xFUywgbmVsZW0sIEdMX1VOU0lHTkVEX1NIT1JULCBxdWFkSW5kaWNlcyk7Ci19Ci0KLUpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbGpuaV9HTEpOSUxpYl9jaGFuZ2VCYWNrZ3JvdW5kKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopCi17Ci0gICAgYmFja2dyb3VuZCA9IDEuMGYgLSBiYWNrZ3JvdW5kOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWU5ZmEwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKLSAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZ2xqbmlfYWN0aXZpdHkiPkdMSk5JPC9zdHJpbmc+Ci0KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSUFjdGl2aXR5LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZjUzMTMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX2puaS9zcmMvY29tL2FuZHJvaWQvZ2xqbmkvR0xKTklBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2xqbmk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEdMSk5JQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBHTEpOSVZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7Ci0gICAgICAgIG1WaWV3ID0gbmV3IEdMSk5JVmlldyhnZXRBcHBsaWNhdGlvbigpKTsKLQkgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0JICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSUxpYi5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsX2puaS9zcmMvY29tL2FuZHJvaWQvZ2xqbmkvR0xKTklMaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2ZDJhZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSUxpYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2xqbmk7Ci0KLS8vIFdyYXBwZXIgZm9yIG5hdGl2ZSBsaWJyYXJ5Ci0KLXB1YmxpYyBjbGFzcyBHTEpOSUxpYiB7Ci0KLSAgICAgc3RhdGljIHsKLSAgICAgICAgIFN5c3RlbS5sb2FkTGlicmFyeSgiZ2xqbmkiKTsKLSAgICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHdpZHRoIHRoZSBjdXJyZW50IHZpZXcgd2lkdGgKLSAgICAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBjdXJyZW50IHZpZXcgaGVpZ2h0Ci0gICAgICovCi0gICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgaW5pdChpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotICAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSB2b2lkIHN0ZXAoKTsKLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBjaGFuZ2VCYWNrZ3JvdW5kKCk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfam5pL3NyYy9jb20vYW5kcm9pZC9nbGpuaS9HTEpOSVZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJjOGM0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9qbmkvc3JjL2NvbS9hbmRyb2lkL2dsam5pL0dMSk5JVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2xqbmk7Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFN1cmZhY2VWaWV3IHRoYXQgdXNlcyB0aGUgZGVkaWNhdGVkIHN1cmZhY2UgZm9yCi0gKiBkaXNwbGF5aW5nIGFuIE9wZW5HTCBhbmltYXRpb24uICBUaGlzIGFsbG93cyB0aGUgYW5pbWF0aW9uIHRvIHJ1biBpbiBhCi0gKiBzZXBhcmF0ZSB0aHJlYWQsIHdpdGhvdXQgcmVxdWlyaW5nIHRoYXQgaXQgYmUgZHJpdmVuIGJ5IHRoZSB1cGRhdGUgbWVjaGFuaXNtCi0gKiBvZiB0aGUgdmlldyBoaWVyYXJjaHkuCi0gKgotICogVGhlIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlbmRlcmluZyBjb2RlIGlzIGRlbGVnYXRlZCB0byBhIEdMVmlldy5SZW5kZXJlcgotICogaW5zdGFuY2UuCi0gKi8KLWNsYXNzIEdMSk5JVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIEdMSk5JVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0xKTklWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KCkgewotICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBSZW5kZXJlciBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuUmVuZGVyZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbmRlcmVyIjsKLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgR0xKTklMaWIuc3RlcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIEdMSk5JTGliLmluaXQod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlEb3duKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBHTEpOSUxpYi5jaGFuZ2VCYWNrZ3JvdW5kKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmY2EwODkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlnbDJfcGVyZi5jcHAgXAotCWZpbGx0ZXN0LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YyIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLWdsMl9wZXJmCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsX2NvbW1vbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTM4MWYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiZnJhZ21lbnRfc2hhZGVycy5jcHAiCi0KLUZJTEUgKiBmT3V0ID0gTlVMTDsKLXZvaWQgcHRTd2FwKCk7Ci0KLXN0YXRpYyBjaGFyIGdDdXJyZW50VGVzdE5hbWVbMTAyNF07Ci1zdGF0aWMgdWludDMyX3QgZ1dpZHRoID0gMDsKLXN0YXRpYyB1aW50MzJfdCBnSGVpZ2h0ID0gMDsKLQotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7Ci0gICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCi0gICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgewotICAgICAgICBBTE9HRSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLUdMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIGlmIChzaGFkZXIpIHsKLSAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICAgICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLCBzaGFkZXJUeXBlLCBidWYpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci0gICAgICAgICAgICAgICAgc2hhZGVyID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc2hhZGVyOwotfQotCi1lbnVtIHsKLSAgICBBX1BPUywKLSAgICBBX0NPTE9SLAotICAgIEFfVEVYMCwKLSAgICBBX1RFWDEKLX07Ci0KLUdMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgewotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOwotICAgIGlmICghdmVydGV4U2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOwotICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSkgewotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHYiKTsKLSAgICAgICAgZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgcGl4ZWxTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHAiKTsKLQotICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1BPUywgImFfcG9zIik7Ci0gICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfQ09MT1IsICJhX2NvbG9yIik7Ci0gICAgICAgIGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIEFfVEVYMCwgImFfdGV4MCIpOwotICAgICAgICBnbEJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBBX1RFWDEsICJhX3RleDEiKTsKLSAgICAgICAgZ2xMaW5rUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgR0xpbnQgbGlua1N0YXR1cyA9IEdMX0ZBTFNFOwotICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9MSU5LX1NUQVRVUywgJmxpbmtTdGF0dXMpOwotICAgICAgICBpZiAobGlua1N0YXR1cyAhPSBHTF9UUlVFKSB7Ci0gICAgICAgICAgICBHTGludCBidWZMZW5ndGggPSAwOwotICAgICAgICAgICAgZ2xHZXRQcm9ncmFtaXYocHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmYnVmTGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChidWZMZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBjaGFyKiBidWYgPSAoY2hhciopIG1hbGxvYyhidWZMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtLCBidWZMZW5ndGgsIE5VTEwsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgbGluayBwcm9ncmFtOlxuJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgICAgICAgICBwcm9ncmFtID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBjaGVja0dsRXJyb3IoImNyZWF0ZVByb2dyYW0iKTsKLSAgICBnbFVzZVByb2dyYW0ocHJvZ3JhbSk7Ci0gICAgcmV0dXJuIHByb2dyYW07Ci19Ci0KLXVpbnQ2NF90IGdldFRpbWUoKSB7Ci0gICAgc3RydWN0IHRpbWVzcGVjIHQ7Ci0gICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKLSAgICByZXR1cm4gdC50dl9uc2VjICsgKCh1aW50NjRfdCl0LnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCk7Ci19Ci0KLXVpbnQ2NF90IGdUaW1lOwotdm9pZCBzdGFydFRpbWVyKCkgewotICAgIGdUaW1lID0gZ2V0VGltZSgpOwotfQotCi0KLXN0YXRpYyB2b2lkIGVuZFRpbWVyKGludCBjb3VudCkgewotICAgIHVpbnQ2NF90IHQyID0gZ2V0VGltZSgpOwotICAgIGRvdWJsZSBkZWx0YSA9ICgoZG91YmxlKSh0MiAtIGdUaW1lKSkgLyAxMDAwMDAwMDAwOwotICAgIGRvdWJsZSBwaXhlbHMgPSAoZ1dpZHRoICogZ0hlaWdodCkgKiBjb3VudDsKLSAgICBkb3VibGUgbXBwcyA9IHBpeGVscyAvIGRlbHRhIC8gMTAwMDAwMDsKLSAgICBkb3VibGUgZGM2MCA9ICgoZG91YmxlKWNvdW50KSAvIGRlbHRhIC8gNjA7Ci0KLSAgICBpZiAoZk91dCkgewotICAgICAgICBmcHJpbnRmKGZPdXQsICIlcywgJWYsICVmXHJcbiIsIGdDdXJyZW50VGVzdE5hbWUsIG1wcHMsIGRjNjApOwotICAgICAgICBmZmx1c2goZk91dCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIlcywgJWYsICVmXG4iLCBnQ3VycmVudFRlc3ROYW1lLCBtcHBzLCBkYzYwKTsKLSAgICB9Ci0gICAgQUxPR0koIiVzLCAlZiwgJWZcclxuIiwgZ0N1cnJlbnRUZXN0TmFtZSwgbXBwcywgZGM2MCk7Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgZ1ZlcnRleFNoYWRlcltdID0KLSAgICAiYXR0cmlidXRlIHZlYzQgYV9wb3M7XG4iCi0gICAgImF0dHJpYnV0ZSB2ZWM0IGFfY29sb3I7XG4iCi0gICAgImF0dHJpYnV0ZSB2ZWMyIGFfdGV4MDtcbiIKLSAgICAiYXR0cmlidXRlIHZlYzIgYV90ZXgxO1xuIgotICAgICJ2YXJ5aW5nIHZlYzQgdl9jb2xvcjtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MTtcbiIKLSAgICAidW5pZm9ybSB2ZWMyIHVfdGV4T2ZmO1xuIgotCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICAgIHZfY29sb3IgPSBhX2NvbG9yO1xuIgotICAgICIgICAgdl90ZXgwID0gYV90ZXgwO1xuIgotICAgICIgICAgdl90ZXgxID0gYV90ZXgxO1xuIgotICAgICIgICAgdl90ZXgwLnggKz0gdV90ZXhPZmYueDtcbiIKLSAgICAiICAgIHZfdGV4MS55ICs9IHVfdGV4T2ZmLnk7XG4iCi0gICAgIiAgICBnbF9Qb3NpdGlvbiA9IGFfcG9zO1xuIgotICAgICJ9XG4iOwotCi1zdGF0aWMgdm9pZCBzZXR1cFZBKCkgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCB2dHhbXSA9IHsKLSAgICAgICAgLTEuMGYsLTEuMGYsCi0gICAgICAgICAxLjBmLC0xLjBmLAotICAgICAgICAtMS4wZiwgMS4wZiwKLSAgICAgICAgIDEuMGYsIDEuMGYgfTsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgY29sb3JbXSA9IHsKLSAgICAgICAgMS4wZiwwLjBmLDEuMGYsMS4wZiwKLSAgICAgICAgMC4wZiwwLjBmLDEuMGYsMS4wZiwKLSAgICAgICAgMS4wZiwxLjBmLDAuMGYsMS4wZiwKLSAgICAgICAgMS4wZiwxLjBmLDEuMGYsMS4wZiB9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgwW10gPSB7Ci0gICAgICAgIDAuMGYsMC4wZiwKLSAgICAgICAgMS4wZiwwLjBmLAotICAgICAgICAwLjBmLDEuMGYsCi0gICAgICAgIDEuMGYsMS4wZiB9OwotICAgIHN0YXRpYyBjb25zdCBmbG9hdCB0ZXgxW10gPSB7Ci0gICAgICAgIDEuMGYsMC4wZiwKLSAgICAgICAgMS4wZiwxLjBmLAotICAgICAgICAwLjBmLDEuMGYsCi0gICAgICAgIDAuMGYsMC4wZiB9OwotCi0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1BPUyk7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX0NPTE9SKTsKLSAgICBnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KEFfVEVYMCk7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShBX1RFWDEpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfUE9TLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHZ0eCk7Ci0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKEFfQ09MT1IsIDQsIEdMX0ZMT0FULCBmYWxzZSwgMTYsIGNvbG9yKTsKLSAgICBnbFZlcnRleEF0dHJpYlBvaW50ZXIoQV9URVgwLCAyLCBHTF9GTE9BVCwgZmFsc2UsIDgsIHRleDApOwotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihBX1RFWDEsIDIsIEdMX0ZMT0FULCBmYWxzZSwgOCwgdGV4MSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJhbmRVbmlmb3JtKGludCBwZ20sIGNvbnN0IGNoYXIgKnZhcikgewotICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sIHZhcik7Ci0gICAgaWYgKGxvYyA+PSAwKSB7Ci0gICAgICAgIGZsb2F0IHggPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKLSAgICAgICAgZmxvYXQgeSA9ICgoZmxvYXQpcmFuZCgpKSAvIFJBTkRfTUFYOwotICAgICAgICBmbG9hdCB6ID0gKChmbG9hdClyYW5kKCkpIC8gUkFORF9NQVg7Ci0gICAgICAgIGZsb2F0IHcgPSAoKGZsb2F0KXJhbmQoKSkgLyBSQU5EX01BWDsKLSAgICAgICAgZ2xVbmlmb3JtNGYobG9jLCB4LCB5LCB6LCB3KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvTG9vcChib29sIHdhcm11cCwgaW50IHBnbSwgdWludDMyX3QgcGFzc0NvdW50KSB7Ci0gICAgaWYgKHdhcm11cCkgewotICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX1NUUklQLCAwLCA0KTsKLSAgICAgICAgcHRTd2FwKCk7Ci0gICAgICAgIGdsRmluaXNoKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdGFydFRpbWVyKCk7Ci0gICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgZm9yICh1aW50MzJfdCBjdD0wOyBjdCA8IHBhc3NDb3VudDsgY3QrKykgewotICAgICAgICBpbnQgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXhPZmYiKTsKLSAgICAgICAgZ2xVbmlmb3JtMmYobG9jLCAoKGZsb2F0KWN0KSAvIHBhc3NDb3VudCwgKChmbG9hdCljdCkgLyAyLmYgLyBwYXNzQ291bnQpOwotCi0gICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfY29sb3IiKTsKLSAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8wIik7Ci0gICAgICAgIHJhbmRVbmlmb3JtKHBnbSwgInVfMSIpOwotICAgICAgICByYW5kVW5pZm9ybShwZ20sICJ1XzIiKTsKLSAgICAgICAgcmFuZFVuaWZvcm0ocGdtLCAidV8zIik7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9TVFJJUCwgMCwgNCk7Ci0gICAgfQotICAgIHB0U3dhcCgpOwotICAgIGdsRmluaXNoKCk7Ci0gICAgZW5kVGltZXIocGFzc0NvdW50KTsKLX0KLQotCi1zdGF0aWMgdWludDMyX3QgcmdiKHVpbnQzMl90IHIsIHVpbnQzMl90IGcsIHVpbnQzMl90IGIpCi17Ci0gICAgdWludDMyX3QgcmV0ID0gMHhmZjAwMDAwMDsKLSAgICByZXQgfD0gciAmIDB4ZmY7Ci0gICAgcmV0IHw9IChnICYgMHhmZikgPDwgODsKLSAgICByZXQgfD0gKGIgJiAweGZmKSA8PCAxNjsKLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGdlblRleHR1cmVzKCkgewotICAgIHVpbnQzMl90ICptID0gKHVpbnQzMl90ICopbWFsbG9jKDEwMjQqMTAyNCo0KTsKLSAgICBmb3IgKGludCB5PTA7IHkgPCAxMDI0OyB5KyspewotICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxMDI0OyB4KyspewotICAgICAgICAgICAgbVt5KjEwMjQgKyB4XSA9IHJnYih4LCAoKCh4K3kpICYgMHhmZikgPT0gMHg3ZikgKiAweGZmLCB5KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDEpOwotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCAxMDI0LCAxMDI0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLQotICAgIGZvciAoaW50IHk9MDsgeSA8IDE2OyB5KyspewotICAgICAgICBmb3IgKGludCB4PTA7IHggPCAxNjsgeCsrKXsKLSAgICAgICAgICAgIG1beSoxNiArIHhdID0gcmdiKHggPDwgNCwgKCgoeCt5KSAmIDB4ZikgPT0gMHg3KSAqIDB4ZmYsIHkgPDwgNCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAyKTsKLSAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgMTYsIDE2LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBtKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9SRVBFQVQpOwotICAgIGdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICBmcmVlKG0pOwotfQotCi1zdGF0aWMgdm9pZCBkb1NpbmdsZVRlc3QodWludDMyX3QgcGdtTnVtLCBpbnQgdGV4KSB7Ci0gICAgY29uc3QgY2hhciAqcGdtVHh0ID0gZ0ZyYWdtZW50VGVzdHNbcGdtTnVtXS0+dHh0OwotICAgIGludCBwZ20gPSBjcmVhdGVQcm9ncmFtKGdWZXJ0ZXhTaGFkZXIsIHBnbVR4dCk7Ci0gICAgaWYgKCFwZ20pIHsKLSAgICAgICAgcHJpbnRmKCJlcnJvciBydW5uaW5nIHRlc3RcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludCBsb2MgPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwZ20sICJ1X3RleDAiKTsKLSAgICBpZiAobG9jID49IDApIGdsVW5pZm9ybTFpKGxvYywgMCk7Ci0gICAgbG9jID0gZ2xHZXRVbmlmb3JtTG9jYXRpb24ocGdtLCAidV90ZXgxIik7Ci0gICAgaWYgKGxvYyA+PSAwKSBnbFVuaWZvcm0xaShsb2MsIDEpOwotCi0KLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4KTsKLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTEpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4KTsKLSAgICBnbEFjdGl2ZVRleHR1cmUoR0xfVEVYVFVSRTApOwotCi0gICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOwotICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgLy9zcHJpbnRmKHN0cjIsICIlaSwgJWksICVpLCAlaSwgJWksIDAiLAotICAgICAgICAgICAgLy91c2VWYXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlRmlyc3RUZXgsIGV4dHJhTWF0aCwgdGV4MCk7Ci0gICAgLy9kb0xvb3AodHJ1ZSwgcGdtLCB3LCBoLCBzdHIyKTsKLSAgICAvL2RvTG9vcChmYWxzZSwgcGdtLCB3LCBoLCBzdHIyKTsKLQotICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICBzcHJpbnRmKGdDdXJyZW50VGVzdE5hbWUsICIlcywgJWksICVpLCAxIiwgZ0ZyYWdtZW50VGVzdHNbcGdtTnVtXS0+bmFtZSwgcGdtTnVtLCB0ZXgpOwotICAgIGRvTG9vcCh0cnVlLCBwZ20sIDEwMCk7Ci0gICAgZG9Mb29wKGZhbHNlLCBwZ20sIDEwMCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZpbGx0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4ZmFjYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9maWxsdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLQotI2luY2x1ZGUgImZpbGxfY29tbW9uLmNwcCIKLQotCi1ib29sIGRvVGVzdCh1aW50MzJfdCB3LCB1aW50MzJfdCBoKSB7Ci0gICAgZ1dpZHRoID0gdzsKLSAgICBnSGVpZ2h0ID0gaDsKLSAgICBzZXR1cFZBKCk7Ci0gICAgZ2VuVGV4dHVyZXMoKTsKLQotICAgIHByaW50ZigiXG52YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXG4iKTsKLQotICAgIGZvciAodWludDMyX3QgbnVtID0gMDsgbnVtIDwgZ0ZyYWdtZW50VGVzdENvdW50OyBudW0rKykgewotICAgICAgICBkb1NpbmdsZVRlc3QobnVtLCAyKTsKLSAgICAgICAgaWYgKGdGcmFnbWVudFRlc3RzW251bV0tPnRleENvdW50KSB7Ci0gICAgICAgICAgICBkb1NpbmdsZVRlc3QobnVtLCAxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGV4aXQoMCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZi9mcmFnbWVudF9zaGFkZXJzLmNwcCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ1ZWFkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2ZyYWdtZW50X3NoYWRlcnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLQotdHlwZWRlZiBzdHJ1Y3QgRnJhZ21lbnRUZXN0UmVjIHsKLQljb25zdCBjaGFyICogbmFtZTsKLQl1aW50MzJfdCB0ZXhDb3VudDsKLQljb25zdCBjaGFyICogdHh0OwotfSBGcmFnbWVudFRlc3Q7Ci0KLXN0YXRpYyBGcmFnbWVudFRlc3QgZnBGaWxsID0gewotCSJTb2xpZCBjb2xvciIsIDAsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvcjtcbiIKLSAgICAifVxuIgotfTsKLQotc3RhdGljIEZyYWdtZW50VGVzdCBmcEdyYWRpZW50ID0gewotCSJTb2xpZCBncmFkaWVudCIsIDAsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZhcnlpbmcgbG93cCB2ZWM0IHZfY29sb3I7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB2X2NvbG9yO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwQ29weVRleCA9IHsKLQkiVGV4dHVyZSBjb3B5IiwgMSwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKLSAgICAifVxuIgotfTsKLQotc3RhdGljIEZyYWdtZW50VGVzdCBmcENvcHlUZXhHYW1tYSA9IHsKLQkiVGV4dHVyZSBjb3B5IHdpdGggZ2FtbWEiLCAxLAotCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICB2ZWM0IHQgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgotICAgICIgIHQucmdiID0gcG93KHQucmdiLCB2ZWMzKDEuNCwgMS40LCAxLjQpKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB0O1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwVGV4U3BlYyA9IHsKLQkiVGV4dHVyZSBzcGVjIiwgMSwKLQotICAgICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAidmFyeWluZyB2ZWMyIHZfdGV4MDtcbiIKLSAgICAidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXgwO1xuIgotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgdmVjNCB0ID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKLSAgICAiICBmbG9hdCBzaW1TcGVjID0gZG90KGdsX0ZyYWdDb29yZC54eXosIGdsX0ZyYWdDb29yZC54eXopO1xuIgotICAgICIgIHNpbVNwZWMgPSBwb3coY2xhbXAoc2ltU3BlYywgMC4xLCAxLjApLCA0MC4wKTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB0ICsgdmVjNChzaW1TcGVjLCBzaW1TcGVjLCBzaW1TcGVjLCBzaW1TcGVjKTtcbiIKLSAgICAifVxuIgotfTsKLQotc3RhdGljIEZyYWdtZW50VGVzdCBmcERlcFRleCA9IHsKLQkiRGVwZW5kZW50IExvb2t1cCIsIDEsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIHZlYzQgdCA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCi0gICAgIiAgdCArPSB0ZXh0dXJlMkQodV90ZXgwLCB0Lnh5KTtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB0O1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwTW9kdWxhdGVDb25zdGFudFRleCA9IHsKLQkiVGV4dHVyZSBtb2R1bGF0ZSBjb25zdGFudCIsIDEsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKLSAgICAidW5pZm9ybSB2ZWM0IHVfY29sb3I7XG4iCi0KLSAgICAidm9pZCBtYWluKCkge1xuIgotICAgICIgIGxvd3AgdmVjNCBjID0gdGV4dHVyZTJEKHVfdGV4MCwgdl90ZXgwKTtcbiIKLQkiICBjICo9IHVfY29sb3I7XG4iCi0gICAgIiAgZ2xfRnJhZ0NvbG9yID0gYztcbiIKLSAgICAifVxuIgotfTsKLQotc3RhdGljIEZyYWdtZW50VGVzdCBmcE1vZHVsYXRlVmFyeWluZ1RleCA9IHsKLQkiVGV4dHVyZSBtb2R1bGF0ZSBncmFkaWVudCIsIDEsCi0KLSAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZhcnlpbmcgdmVjMiB2X3RleDA7XG4iCi0gICAgInZhcnlpbmcgbG93cCB2ZWM0IHZfY29sb3I7XG4iCi0gICAgInVuaWZvcm0gc2FtcGxlcjJEIHVfdGV4MDtcbiIKLQotICAgICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgIiAgbG93cCB2ZWM0IGMgPSB0ZXh0dXJlMkQodV90ZXgwLCB2X3RleDApO1xuIgotCSIgIGMgKj0gdl9jb2xvcjtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0IGZwTW9kdWxhdGVWYXJ5aW5nQ29uc3RhbnRUZXggPSB7Ci0JIlRleHR1cmUgbW9kdWxhdGUgZ3JhZGllbnQgY29uc3RhbnQiLCAxLAotCi0gICAgInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuIgotICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXgwO1xuIgotICAgICJ2YXJ5aW5nIGxvd3AgdmVjNCB2X2NvbG9yO1xuIgotICAgICJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleDA7XG4iCi0gICAgInVuaWZvcm0gdmVjNCB1X2NvbG9yO1xuIgotCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBsb3dwIHZlYzQgYyA9IHRleHR1cmUyRCh1X3RleDAsIHZfdGV4MCk7XG4iCi0JIiAgYyAqPSB2X2NvbG9yO1xuIgotCSIgIGMgKj0gdV9jb2xvcjtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSBjO1xuIgotICAgICJ9XG4iCi19OwotCi1zdGF0aWMgRnJhZ21lbnRUZXN0ICpnRnJhZ21lbnRUZXN0c1tdID0gewotCSZmcEZpbGwsCi0JJmZwR3JhZGllbnQsCi0JJmZwQ29weVRleCwKLQkmZnBDb3B5VGV4R2FtbWEsCi0gICAmZnBUZXhTcGVjLAotICAgJmZwRGVwVGV4LAotCSZmcE1vZHVsYXRlQ29uc3RhbnRUZXgsCi0JJmZwTW9kdWxhdGVWYXJ5aW5nVGV4LAotCSZmcE1vZHVsYXRlVmFyeWluZ0NvbnN0YW50VGV4LAotCi19OwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGdGcmFnbWVudFRlc3RDb3VudCA9IHNpemVvZihnRnJhZ21lbnRUZXN0cykgLyBzaXplb2YoZ0ZyYWdtZW50VGVzdHNbMF0pOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsX3BlcmYvZ2wyX3BlcmYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRhY2FmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmL2dsMl9wZXJmLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwgPSBFR0xfVFJVRSkgewotICAgIGlmIChyZXR1cm5WYWwgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlcygpIHJldHVybmVkICVkXG4iLCBvcCwgcmV0dXJuVmFsKTsKLSAgICB9Ci0KLSAgICBmb3IgKEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7IGVycm9yICE9IEVHTF9TVUNDRVNTOyBlcnJvcgotICAgICAgICAgICAgPSBlZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBlZ2xFcnJvciAlcyAoMHgleClcbiIsIG9wLCBFR0xVdGlsczo6c3RyZXJyb3IoZXJyb3IpLAotICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkgewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJhZnRlciAlcygpIGdsRXJyb3IgKDB4JXgpXG4iLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotYm9vbCBkb1Rlc3QodWludDMyX3QgdywgdWludDMyX3QgaCk7Ci0KLXN0YXRpYyBFR0xEaXNwbGF5IGRweTsKLXN0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotCi0gICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMiwgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTF9OT05FIH07Ci0gICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgIEVHTENvbnRleHQgY29udGV4dDsKLSAgICBFR0xpbnQgdywgaDsKLQotCi0gICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7Ci0gICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7Ci0gICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKLSAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOw0KLSAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKLSAgICBpZiAocmV0dXJuVmFsdWUpIHsKLSAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKLQotICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgbXlDb25maWcsIHdpbmRvdywgTlVMTCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlV2luZG93U3VyZmFjZSIpOwotICAgIGlmIChzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIHByaW50ZigiZ2VsQ3JlYXRlV2luZG93U3VyZmFjZSBmYWlsZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRfYXR0cmlicyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsQ3JlYXRlQ29udGV4dCIpOwotICAgIGlmIChjb250ZXh0ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIHByaW50ZigiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuVmFsdWUgPSBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbE1ha2VDdXJyZW50IiwgcmV0dXJuVmFsdWUpOwotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIEdMaW50IGRpbSA9IHcgPCBoID8gdyA6IGg7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBkb1Rlc3QodywgaCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgIGNoZWNrRWdsRXJyb3IoImVnbFN3YXBCdWZmZXJzIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcHRTd2FwKCkgewotICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWU1MGU5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE9wZW5HTCBFUyBQZXJmIEFwcAotIyBUaGlzIG1ha2VmaWxlIGJ1aWxkcyBib3RoIGFuIGFjdGl2aXR5IGFuZCBhIHNoYXJlZCBsaWJyYXJ5LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gR0xQZXJmCi0KLUxPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmdscGVyZgotCi0jIFJ1biBvbiBFY2xhaXIKLUxPQ0FMX1NES19WRVJTSU9OIDo9IDcKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUxPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICBnbF9jb2RlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1dGlscyBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmdscGVyZgotCi0KLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNGJkOTguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2xwZXJmIgotICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMC4wIiBhbmRyb2lkOnZlcnNpb25Db2RlPSIxMDAwMCIgPgotICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjciIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iNyIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+Ci0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2dscGVyZl9hY3Rpdml0eSI+Ci0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkdMUGVyZkFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKLSAgICAgICAgICAgIAlhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCi0gICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9qbmkvZ2xfY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDQxODMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvam5pL2dsX2NvZGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vIE9wZW5HTCBFUyAyLjAgY29kZQotCi0jaW5jbHVkZSA8bmF0aXZlaGVscGVyL2puaS5oPgotI2RlZmluZSBMT0dfVEFHICJHTFBlcmYgZ2xfY29kZS5jcHAiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgIi4uLy4uL2dsX3BlcmYvZmlsbF9jb21tb24uY3BwIgotCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vIFdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHNjcmVlbgotCi11aW50MzJfdCB3OwotdWludDMyX3QgaDsKLQotLy8gVGhlIHN0YXRlQ2xvY2sgc3RhcnRzIGF0IHplcm8gYW5kIGluY3JlbWVudHMgYnkgMSBldmVyeSB0aW1lIHdlIGRyYXcgYSBmcmFtZS4gSXQgaXMgdXNlZCB0byBjb250cm9sIHdoaWNoIHBoYXNlIG9mIHRoZSB0ZXN0IHdlIGFyZSBpbi4KLQotaW50IHN0YXRlQ2xvY2s7Ci1jb25zdCBpbnQgZG9Mb29wU3RhdGVzID0gMjsKLWNvbnN0IGludCBkb1NpbmdsZVRlc3RTdGF0ZXMgPSAyOwotYm9vbCBkb25lOwotCi0vLyBTYXZlcyB0aGUgcGFyYW1ldGVycyBvZiB0aGUgdGVzdCAoc28gd2UgY2FuIHByaW50IHRoZW0gb3V0IHdoZW4gd2UgZmluaXNoIHRoZSB0aW1pbmcuKQotCi0KLWludCBwZ207Ci0KLXZvaWQgcHRTd2FwKCkgewotfQotCi12b2lkIGRvVGVzdCgpIHsKLSAgICB1aW50MzJfdCB0ZXN0TnVtID0gc3RhdGVDbG9jayA+PiAyOwotICAgIGludCB0ZXhTaXplID0gKChzdGF0ZUNsb2NrID4+IDEpICYgMHgxKSArIDE7Ci0KLSAgICBpZiAodGVzdE51bSA+PSBnRnJhZ21lbnRUZXN0Q291bnQpIHsKLSAgICAgICBBTE9HSSgiZG9uZVxuIik7Ci0gICAgICAgaWYgKGZPdXQpIHsKLSAgICAgICAgICAgZmNsb3NlKGZPdXQpOwotICAgICAgICAgICBmT3V0ID0gTlVMTDsKLSAgICAgICB9Ci0gICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEFMT0dJKCJkb1Rlc3QgJWQgJWQgJWRcbiIsIHRleENvdW50LCBleHRyYU1hdGgsIHRlc3RTdWJTdGF0ZSk7Ci0KLS8vICAgICAgICBmb3IgKHVpbnQzMl90IG51bSA9IDA7IG51bSA8IGdGcmFnbWVudFRlc3RDb3VudDsgbnVtKyspIHsKLSAgICBkb1NpbmdsZVRlc3QodGVzdE51bSwgdGV4U2l6ZSk7Ci19Ci0KLWV4dGVybiAiQyIgewotICAgIEpOSUVYUE9SVCB2b2lkIEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9nbHBlcmZfR0xQZXJmTGliX2luaXQoSk5JRW52ICogZW52LCBqb2JqZWN0IG9iaiwgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KTsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xwZXJmX0dMUGVyZkxpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOwotfTsKLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCAgamludCB3aWR0aCwgamludCBoZWlnaHQpCi17Ci0gICAgZ1dpZHRoID0gd2lkdGg7Ci0gICAgZ0hlaWdodCA9IGhlaWdodDsKLSAgICBpZiAoIWRvbmUpIHsKLSAgICAgICAgICAgIHN0YXRlQ2xvY2sgPSAwOwotICAgICAgICAgICAgZG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgc2V0dXBWQSgpOwotICAgICAgICAgICAgZ2VuVGV4dHVyZXMoKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVOYW1lID0gIi9zZGNhcmQvZ2xwZXJmLmNzdiI7Ci0gICAgICAgICAgICBpZiAoZk91dCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgIEFMT0dJKCJDbG9zaW5nIHBhcnRpYWxseSB3cml0dGVuIG91dHB1dC5uIik7Ci0gICAgICAgICAgICAgICAgIGZjbG9zZShmT3V0KTsKLSAgICAgICAgICAgICAgICAgZk91dCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HSSgiV3JpdGluZyB0bzogJXNcbiIsZmlsZU5hbWUpOwotICAgICAgICAgICAgZk91dCA9IGZvcGVuKGZpbGVOYW1lLCAidyIpOwotICAgICAgICAgICAgaWYgKGZPdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbjogJXNcbiIsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR0koIlxudmFyQ29sb3IsIHRleENvdW50LCBtb2R1bGF0ZSwgZXh0cmFNYXRoLCB0ZXhTaXplLCBibGVuZCwgTXBwcywgREM2MFxuIik7Ci0gICAgICAgICAgICBpZiAoZk91dCkgZnByaW50ZihmT3V0LCJ2YXJDb2xvciwgdGV4Q291bnQsIG1vZHVsYXRlLCBleHRyYU1hdGgsIHRleFNpemUsIGJsZW5kLCBNcHBzLCBEQzYwXHJcbiIpOwotICAgIH0KLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dscGVyZl9HTFBlcmZMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKQotewotICAgIGlmICghIGRvbmUpIHsKLSAgICAgICAgaWYgKHN0YXRlQ2xvY2sgPiAwICYmICgoc3RhdGVDbG9jayAmIDEpID09IDApKSB7Ci0gICAgICAgICAgICAvL2VuZFRpbWVyKDEwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZG9UZXN0KCk7Ci0gICAgICAgIHN0YXRlQ2xvY2srKzsKLSAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2xDbGVhcihHTF9ERVBUSF9CVUZGRVJfQklUIHwgR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyY2Q5NjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBmaWxlIGNvbnRhaW5zIHJlc291cmNlIGRlZmluaXRpb25zIGZvciBkaXNwbGF5ZWQgc3RyaW5ncywgYWxsb3dpbmcKLSAgICAgdGhlbSB0byBiZSBjaGFuZ2VkIGJhc2VkIG9uIHRoZSBsb2NhbGUgYW5kIG9wdGlvbnMuIC0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gU2ltcGxlIHN0cmluZ3MuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iZ2xwZXJmX2FjdGl2aXR5Ij5HTFBlcmY8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmM2FiZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0KLXB1YmxpYyBjbGFzcyBHTFBlcmZBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEdMUGVyZlZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotCWdldFdpbmRvdygpLnNldEZsYWdzKFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04sIFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfS0VFUF9TQ1JFRU5fT04pOwotICAgICAgICBtVmlldyA9IG5ldyBHTFBlcmZWaWV3KGdldEFwcGxpY2F0aW9uKCkpOwotCXNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOwotICAgICAgICBtVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZkxpYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWEwZTU0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF9wZXJmYXBwL3NyYy9jb20vYW5kcm9pZC9nbHBlcmYvR0xQZXJmTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7Ci0KLS8vIFdyYXBwZXIgZm9yIG5hdGl2ZSBsaWJyYXJ5Ci0KLXB1YmxpYyBjbGFzcyBHTFBlcmZMaWIgewotCi0gICAgIHN0YXRpYyB7Ci0gICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImdscGVyZiIpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGN1cnJlbnQgdmlldyB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGN1cnJlbnQgdmlldyBoZWlnaHQKLSAgICAgKi8KLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RlcCgpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3BlcmZhcHAvc3JjL2NvbS9hbmRyb2lkL2dscGVyZi9HTFBlcmZWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlNGE0ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xfcGVyZmFwcC9zcmMvY29tL2FuZHJvaWQvZ2xwZXJmL0dMUGVyZlZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbHBlcmY7Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29uZmlnOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xEaXNwbGF5OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTA7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKLSAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKLSAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KLSAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KLSAqCi0gKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCi0gKiBpbnN0YW5jZS4KLSAqLwotY2xhc3MgR0xQZXJmVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiR0xQZXJmVmlldyI7Ci0KLSAgICBwdWJsaWMgR0xQZXJmVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQoZmFsc2UsIDAsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBHTFBlcmZWaWV3KENvbnRleHQgY29udGV4dCwgYm9vbGVhbiB0cmFuc2x1Y2VudCwgaW50IGRlcHRoLCBpbnQgc3RlbmNpbCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCh0cmFuc2x1Y2VudCwgZGVwdGgsIHN0ZW5jaWwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0KGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgc2V0RUdMQ29udGV4dEZhY3RvcnkobmV3IENvbnRleHRGYWN0b3J5KCkpOwotICAgICAgICBzZXRFR0xDb25maWdDaG9vc2VyKCB0cmFuc2x1Y2VudCA/Ci0gICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDgsOCw4LDgsIGRlcHRoLCBzdGVuY2lsKSA6Ci0gICAgICAgICAgICAgIG5ldyBDb25maWdDaG9vc2VyKDUsNiw1LDAsIGRlcHRoLCBzdGVuY2lsKSk7Ci0gICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIEdMU3VyZmFjZVZpZXcuRUdMQ29udGV4dEZhY3RvcnkgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04gPSAweDMwOTg7Ci0gICAgICAgIHB1YmxpYyBFR0xDb250ZXh0IGNyZWF0ZUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbmZpZyBlZ2xDb25maWcpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImNyZWF0aW5nIE9wZW5HTCBFUyAyLjAgY29udGV4dCIpOwotICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQmVmb3JlIGVnbENyZWF0ZUNvbnRleHQiLCBlZ2wpOwotICAgICAgICAgICAgaW50W10gYXR0cmliX2xpc3QgPSB7RUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTDEwLkVHTF9OT05FIH07Ci0gICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQgPSBlZ2wuZWdsQ3JlYXRlQ29udGV4dChkaXNwbGF5LCBlZ2xDb25maWcsIEVHTDEwLkVHTF9OT19DT05URVhULCBhdHRyaWJfbGlzdCk7Ci0gICAgICAgICAgICBjaGVja0VnbEVycm9yKCJBZnRlciBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveUNvbnRleHQoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksIEVHTENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgZWdsLmVnbERlc3Ryb3lDb250ZXh0KGRpc3BsYXksIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0VnbEVycm9yKFN0cmluZyBwcm9tcHQsIEVHTDEwIGVnbCkgewotICAgICAgICBpbnQgZXJyb3I7Ci0gICAgICAgIHdoaWxlICgoZXJyb3IgPSBlZ2wuZWdsR2V0RXJyb3IoKSkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgU3RyaW5nLmZvcm1hdCgiJXM6IEVHTCBlcnJvcjogMHgleCIsIHByb21wdCwgZXJyb3IpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbmZpZ0Nob29zZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbmZpZ0Nob29zZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRUdMX09QRU5HTF9FUzJfQklUID0gNDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gc19jb25maWdBdHRyaWJzMiA9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLCA0LAotICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVMyX0JJVCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9OT05FCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHVibGljIENvbmZpZ0Nob29zZXIoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgICAgIG1SZWRTaXplID0gcjsKLSAgICAgICAgICAgIG1HcmVlblNpemUgPSBnOwotICAgICAgICAgICAgbUJsdWVTaXplID0gYjsKLSAgICAgICAgICAgIG1BbHBoYVNpemUgPSBhOwotICAgICAgICAgICAgbURlcHRoU2l6ZSA9IGRlcHRoOwotICAgICAgICAgICAgbVN0ZW5jaWxTaXplID0gc3RlbmNpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5KSB7Ci0KLSAgICAgICAgICAgIGludFtdIG51bV9jb25maWcgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgZWdsLmVnbENob29zZUNvbmZpZyhkaXNwbGF5LCBzX2NvbmZpZ0F0dHJpYnMyLCBudWxsLCAwLCBudW1fY29uZmlnKTsKLQotICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBudW1fY29uZmlnWzBdOwotCi0gICAgICAgICAgICBpZiAobnVtQ29uZmlncyA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29uZmlncyBtYXRjaCBjb25maWdTcGVjIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKLSAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgY29uZmlncywgbnVtQ29uZmlncywgbnVtX2NvbmZpZyk7Ci0gICAgICAgICAgICAvLyBwcmludENvbmZpZ3MoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKLSAgICAgICAgICAgIHJldHVybiBjaG9vc2VDb25maWcoZWdsLCBkaXNwbGF5LCBjb25maWdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFR0xDb25maWcgY2hvb3NlQ29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZ1tdIGNvbmZpZ3MpIHsKLSAgICAgICAgICAgIEVHTENvbmZpZyBjbG9zZXN0Q29uZmlnID0gbnVsbDsKLSAgICAgICAgICAgIGludCBjbG9zZXN0RGlzdGFuY2UgPSAxMDAwOwotICAgICAgICAgICAgZm9yKEVHTENvbmZpZyBjb25maWcgOiBjb25maWdzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGQgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsIDApOwotICAgICAgICAgICAgICAgIGludCBzID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsIDApOwotICAgICAgICAgICAgICAgIGlmIChkID49IG1EZXB0aFNpemUgJiYgcz49IG1TdGVuY2lsU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFRF9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGcgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSBNYXRoLmFicyhyIC0gbVJlZFNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoZyAtIG1HcmVlblNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYiAtIG1CbHVlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYXRoLmFicyhhIC0gbUFscGhhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGNsb3Nlc3REaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0Q29uZmlnID0gY29uZmlnOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RDb25maWc7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kQ29uZmlnQXR0cmliKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcsIGludCBhdHRyaWJ1dGUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQotICAgICAgICAgICAgaWYgKGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIG1WYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVZhbHVlWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBwcmludENvbmZpZ3MoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7Ci0gICAgICAgICAgICBpbnQgbnVtQ29uZmlncyA9IGNvbmZpZ3MubGVuZ3RoOwotICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIlZCBjb25maWd1cmF0aW9ucyIsIG51bUNvbmZpZ3MpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29uZmlnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uICVkOlxuIiwgaSkpOwotICAgICAgICAgICAgICAgIHByaW50Q29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlnc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWcoRUdMMTAgZWdsLCBFR0xEaXNwbGF5IGRpc3BsYXksCi0gICAgICAgICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgaW50W10gYXR0cmlidXRlcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQUxQSEFfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0JMVUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0RFUFRIX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVEVOQ0lMX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT05GSUdfQ0FWRUFULAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0lELAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9NQVhfUEJVRkZFUl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9SRU5ERVJBQkxFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTkFUSVZFX1ZJU1VBTF9JRCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDMwLCAvLyBFR0wxMC5FR0xfUFJFU0VSVkVEX1JFU09VUkNFUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NBTVBMRVMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVfQlVGRkVSUywKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1NVUkZBQ0VfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzOSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzQSwgLy8gRUdMMTAuRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBLAotICAgICAgICAgICAgICAgICAgICAweDMwM0IsIC8vIEVHTDEwLkVHTF9NSU5fU1dBUF9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDNDLCAvLyBFR0wxMC5FR0xfTUFYX1NXQVBfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9MVU1JTkFOQ0VfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX01BU0tfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTE9SX0JVRkZFUl9UWVBFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLAotICAgICAgICAgICAgICAgICAgICAweDMwNDIgLy8gRUdMMTAuRUdMX0NPTkZPUk1BTlQKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CVUZGRVJfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQkxVRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9HUkVFTl9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9SRURfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfREVQVEhfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU1RFTkNJTF9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfQ0FWRUFUIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GSUdfSUQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0xFVkVMIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9IRUlHSFQiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1BJWEVMUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfV0lEVEgiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX05BVElWRV9SRU5ERVJBQkxFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX0lEIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfVklTVUFMX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRVMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NBTVBMRV9CVUZGRVJTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TVVJGQUNFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX1JFRF9WQUxVRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0JMVUVfVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0IiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JJTkRfVE9fVEVYVFVSRV9SR0JBIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NSU5fU1dBUF9JTlRFUlZBTCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1NXQVBfSU5URVJWQUwiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0xVTUlOQU5DRV9TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9BTFBIQV9NQVNLX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTE9SX0JVRkZFUl9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9SRU5ERVJBQkxFX1RZUEUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0NPTkZPUk1BTlQiCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgaW50W10gdmFsdWUgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbaV07Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoIGVnbC5lZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBhdHRyaWJ1dGUsIHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6ICVkXG4iLCBuYW1lLCB2YWx1ZVswXSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiICAlczogZmFpbGVkXG4iLCBuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChlZ2wuZWdsR2V0RXJyb3IoKSAhPSBFR0wxMC5FR0xfU1VDQ0VTUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU3ViY2xhc3NlcyBjYW4gYWRqdXN0IHRoZXNlIHZhbHVlczoKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUmVkU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtR3JlZW5TaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1CbHVlU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtQWxwaGFTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1EZXB0aFNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbVN0ZW5jaWxTaXplOwotICAgICAgICBwcml2YXRlIGludFtdIG1WYWx1ZSA9IG5ldyBpbnRbMV07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgR0xQZXJmTGliLnN0ZXAoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBHTFBlcmZMaWIuaW5pdCh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsX3l1dnRleC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsX3l1dnRleC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVkYmEwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbF95dXZ0ZXgvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlnbF95dXZ0ZXguY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjFfQ00gXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ2xfeXV2dGV4Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xfeXV2dGV4L2dsX3l1dnRleC5jcHAgYi9vcGVuZ2wvdGVzdHMvZ2xfeXV2dGV4L2dsX3l1dnRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDBmNzYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsX3l1dnRleC9nbF95dXZ0ZXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpIHsKLSAgICAvLyBmcHJpbnRmKHN0ZGVyciwgInByaW50R0xTdHJpbmcgJXMsICVkXG4iLCBuYW1lLCBzKTsKLSAgICBjb25zdCBjaGFyICp2ID0gKGNvbnN0IGNoYXIgKikgZ2xHZXRTdHJpbmcocyk7Ci0gICAgLy8gaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOwotICAgIC8vIGZwcmludGYoc3RkZXJyLCAiZ2xHZXRFcnJvcigpID0gJWQsIHJlc3VsdCBvZiBnbEdldFN0cmluZyA9ICV4XG4iLCBlcnJvciwKLSAgICAvLyAgICAgICAgKHVuc2lnbmVkIGludCkgdik7Ci0gICAgLy8gaWYgKCh2IDwgKGNvbnN0IGNoYXIqKSAwKSB8fCAodiA+IChjb25zdCBjaGFyKikgMHgxMDAwMCkpCi0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLSAgICAvLyBlbHNlCi0gICAgLy8gICAgZnByaW50ZihzdGRlcnIsICJHTCAlcyA9IChudWxsKSAweCUwOHhcbiIsIG5hbWUsICh1bnNpZ25lZCBpbnQpIHYpOwotICAgIGZwcmludGYoc3RkZXJyLCAiR0wgJXMgPSAlc1xuIiwgbmFtZSwgdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpIHsKLSAgICBpZiAocmV0dXJuVmFsICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMoKSByZXR1cm5lZCAlZFxuIiwgb3AsIHJldHVyblZhbCk7Ci0gICAgfQotCi0gICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKLSAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImFmdGVyICVzKCkgZWdsRXJyb3IgJXMgKDB4JXgpXG4iLCBvcCwgRUdMVXRpbHM6OnN0cmVycm9yKGVycm9yKSwKLSAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjaGVja0dsRXJyb3IoY29uc3QgY2hhciogb3ApIHsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLWJvb2wgc2V0dXBHcmFwaGljcyhpbnQgdywgaW50IGgpIHsKLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWaWV3cG9ydCIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1pbnQgYWxpZ24oaW50IHgsIGludCBhKSB7Ci0gICAgcmV0dXJuICh4ICsgKGEtMSkpICYgKH4oYS0xKSk7Ci19Ci0KLWNvbnN0IGludCB5dXZUZXhXaWR0aCA9IDYwMDsKLWNvbnN0IGludCB5dXZUZXhIZWlnaHQgPSA0ODA7Ci1jb25zdCBpbnQgeXV2VGV4VXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZOwotY29uc3QgaW50IHl1dlRleEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKLWNvbnN0IGludCB5dXZUZXhPZmZzZXRZID0gMDsKLWNvbnN0IGludCB5dXZUZXhTdHJpZGVZID0gKHl1dlRleFdpZHRoICsgMHhmKSAmIH4weGY7Ci1jb25zdCBpbnQgeXV2VGV4T2Zmc2V0ViA9IHl1dlRleFN0cmlkZVkgKiB5dXZUZXhIZWlnaHQ7Ci1jb25zdCBpbnQgeXV2VGV4U3RyaWRlViA9ICh5dXZUZXhTdHJpZGVZLzIgKyAweGYpICYgfjB4ZjsgCi1jb25zdCBpbnQgeXV2VGV4T2Zmc2V0VSA9IHl1dlRleE9mZnNldFYgKyB5dXZUZXhTdHJpZGVWICogeXV2VGV4SGVpZ2h0LzI7Ci1jb25zdCBpbnQgeXV2VGV4U3RyaWRlVSA9IHl1dlRleFN0cmlkZVY7Ci1jb25zdCBib29sIHl1dlRleFNhbWVVViA9IGZhbHNlOwotc3RhdGljIHNwPEdyYXBoaWNCdWZmZXI+IHl1dlRleEJ1ZmZlcjsKLXN0YXRpYyBHTHVpbnQgeXV2VGV4OwotCi1ib29sIHNldHVwWXV2VGV4U3VyZmFjZShFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgaW50IGJsb2NrV2lkdGggPSB5dXZUZXhXaWR0aCA+IDE2ID8geXV2VGV4V2lkdGggLyAxNiA6IDE7Ci0gICAgaW50IGJsb2NrSGVpZ2h0ID0geXV2VGV4SGVpZ2h0ID4gMTYgPyB5dXZUZXhIZWlnaHQgLyAxNiA6IDE7Ci0gICAgeXV2VGV4QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoeXV2VGV4V2lkdGgsIHl1dlRleEhlaWdodCwgeXV2VGV4Rm9ybWF0LAotICAgICAgICAgICAgeXV2VGV4VXNhZ2UpOwotICAgIGNoYXIqIGJ1ZiA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgZXJyID0geXV2VGV4QnVmZmVyLT5sb2NrKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICh2b2lkKiopKCZidWYpKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ5dXZUZXhCdWZmZXItPmxvY2soLi4uKSBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoaW50IHggPSAwOyB4IDwgeXV2VGV4V2lkdGg7IHgrKykgewotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IHl1dlRleEhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICBpbnQgcGFyaXR5WCA9ICh4IC8gYmxvY2tXaWR0aCkgJiAxOwotICAgICAgICAgICAgaW50IHBhcml0eVkgPSAoeSAvIGJsb2NrSGVpZ2h0KSAmIDE7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGludGVuc2l0eSA9IChwYXJpdHlYIF4gcGFyaXR5WSkgPyA2MyA6IDE5MTsKLSAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRZICsgKHkgKiB5dXZUZXhTdHJpZGVZKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgaWYgKHggPCB5dXZUZXhXaWR0aCAvIDIgJiYgeSA8IHl1dlRleEhlaWdodCAvIDIpIHsKLSAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0VSArICh5ICogeXV2VGV4U3RyaWRlVSkgKyB4XSA9IGludGVuc2l0eTsKLSAgICAgICAgICAgICAgICBpZiAoeXV2VGV4U2FtZVVWKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKHkgKiB5dXZUZXhTdHJpZGVWKSArIHhdID0gaW50ZW5zaXR5OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA8IHl1dlRleFdpZHRoIC8gNCAmJiB5IDwgeXV2VGV4SGVpZ2h0IC8gNCkgewotICAgICAgICAgICAgICAgICAgICBidWZbeXV2VGV4T2Zmc2V0ViArICh5KjIgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDBdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoeSoyICogeXV2VGV4U3RyaWRlVikgKyB4KjIgKyAxXSA9Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zlt5dXZUZXhPZmZzZXRWICsgKCh5KjIrMSkgKiB5dXZUZXhTdHJpZGVWKSArIHgqMiArIDBdID0KLSAgICAgICAgICAgICAgICAgICAgYnVmW3l1dlRleE9mZnNldFYgKyAoKHkqMisxKSAqIHl1dlRleFN0cmlkZVYpICsgeCoyICsgMV0gPSBpbnRlbnNpdHk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXJyID0geXV2VGV4QnVmZmVyLT51bmxvY2soKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ5dXZUZXhCdWZmZXItPnVubG9jaygpIGZhaWxlZDogJWRcbiIsIGVycik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBFR0xDbGllbnRCdWZmZXIgY2xpZW50QnVmZmVyID0gKEVHTENsaWVudEJ1ZmZlcil5dXZUZXhCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpOwotICAgIEVHTEltYWdlS0hSIGltZyA9IGVnbENyZWF0ZUltYWdlS0hSKGRweSwgRUdMX05PX0NPTlRFWFQsIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsCi0gICAgICAgICAgICBjbGllbnRCdWZmZXIsIDApOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbENyZWF0ZUltYWdlS0hSIik7Ci0gICAgaWYgKGltZyA9PSBFR0xfTk9fSU1BR0VfS0hSKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBnbEdlblRleHR1cmVzKDEsICZ5dXZUZXgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xHZW5UZXh0dXJlcyIpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIHl1dlRleCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbEJpbmRUZXh0dXJlIik7Ci0gICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyhHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgKEdMZWdsSW1hZ2VPRVMpaW1nKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMiKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFRleFBhcmFtZXRlcmkiKTsKLSAgICBnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgY2hlY2tHbEVycm9yKCJnbFRleFBhcmFtZXRlcmkiKTsKLSAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xUZXhFbnZ4Iik7Ci0KLSAgICBHTGludCBjcm9wWzRdID0geyAwLCAwLCB5dXZUZXhXaWR0aCwgeXV2VGV4SGVpZ2h0IH07Ci0gICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVGV4UGFyYW1ldGVyaXYiKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIHJlbmRlckZyYW1lKGludCB3LCBpbnQgaCkgewotICAgIGdsQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAxLjBmLCAxLjBmKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXJDb2xvciIpOwotICAgIGdsQ2xlYXIoIEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBjaGVja0dsRXJyb3IoImdsQ2xlYXIiKTsKLSAgICAKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCB5dXZUZXgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xCaW5kVGV4dHVyZSIpOwotICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlIik7Ci0KLSAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIHcsIGgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xEcmF3VGV4aU9FUyIpOwotfQotCi12b2lkIHByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZykgewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsICZ2YWx1ZSk7Ci0gICAgICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgJiYgZXJyb3IgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHByaW50ZigiICVzOiAiLCBuYW1lc1tqXS5uYW1lKTsKLSAgICAgICAgICAgIHByaW50ZigiJWQgKDB4JXgpIiwgdmFsdWUsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewotICAgIEVHTEJvb2xlYW4gcmV0dXJuVmFsdWU7Ci0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9OwotCi0gICAgRUdMaW50IGNvbnRleHRfYXR0cmlic1tdID0geyBFR0xfQ09OVEVYVF9DTElFTlRfVkVSU0lPTiwgMSwgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgc19jb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCBFR0xfV0lORE9XX0JJVCwKLSAgICAgICAgICAgIEVHTF9SRU5ERVJBQkxFX1RZUEUsIEVHTF9PUEVOR0xfRVNfQklULAotICAgICAgICAgICAgRUdMX05PTkUgfTsKLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xpbnQgdywgaDsKLQotICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7Ci0gICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xHZXREaXNwbGF5Iik7Ci0gICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsSW5pdGlhbGl6ZSIsIHJldHVyblZhbHVlKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVHTCB2ZXJzaW9uICVkLiVkXG4iLCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbik7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICByZXR1cm5WYWx1ZSA9IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coZHB5LCBzX2NvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJm15Q29uZmlnKTsKLSAgICBpZiAocmV0dXJuVmFsdWUpIHsKLSAgICAgICAgcHJpbnRmKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGNoZWNrRWdsRXJyb3IoIkVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3ciKTsKLQotICAgIHByaW50ZigiQ2hvc2UgdGhpcyBjb25maWd1cmF0aW9uOlxuIik7Ci0gICAgcHJpbnRFR0xDb25maWd1cmF0aW9uKGRweSwgbXlDb25maWcpOwotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0gICAgaWYgKHN1cmZhY2UgPT0gRUdMX05PX1NVUkZBQ0UpIHsKLSAgICAgICAgcHJpbnRmKCJnZWxDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZC5cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIG15Q29uZmlnLCBFR0xfTk9fQ09OVEVYVCwgY29udGV4dF9hdHRyaWJzKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm5WYWx1ZSA9IGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsTWFrZUN1cnJlbnQiLCByZXR1cm5WYWx1ZSk7Ci0gICAgaWYgKHJldHVyblZhbHVlICE9IEVHTF9UUlVFKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsUXVlcnlTdXJmYWNlIik7Ci0gICAgR0xpbnQgZGltID0gdyA8IGggPyB3IDogaDsKLQotICAgIGZwcmludGYoc3RkZXJyLCAiV2luZG93IGRpbWVuc2lvbnM6ICVkIHggJWRcbiIsIHcsIGgpOwotCi0gICAgcHJpbnRHTFN0cmluZygiVmVyc2lvbiIsIEdMX1ZFUlNJT04pOwotICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgcHJpbnRHTFN0cmluZygiUmVuZGVyZXIiLCBHTF9SRU5ERVJFUik7Ci0gICAgcHJpbnRHTFN0cmluZygiRXh0ZW5zaW9ucyIsIEdMX0VYVEVOU0lPTlMpOwotCi0gICAgaWYoIXNldHVwWXV2VGV4U3VyZmFjZShkcHksIGNvbnRleHQpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNldCB1cCB0ZXh0dXJlIHN1cmZhY2UuXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYoIXNldHVwR3JhcGhpY3ModywgaCkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0IHVwIGdyYXBoaWNzLlxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgc3RhdGljIGludCBkaXIgPSAtMTsKLQotICAgICAgICByZW5kZXJGcmFtZSh3LCBoKTsKLSAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgICAgY2hlY2tFZ2xFcnJvcigiZWdsU3dhcEJ1ZmZlcnMiKTsKLQotICAgICAgICBpZiAodyA8PSAxMCB8fCBoIDw9IDEwKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXIgPSAtZGlyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHcgPj0gMTMwMCB8fCBoID49IDkwMCkKLSAgICAgICAgewotICAgICAgICAgICAgZGlyID0gLWRpcjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgdyArPSBkaXI7Ci0gICAgICAgIGggKz0gZGlyOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGIzNzhlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbGR1YWwvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IEdMRHVhbAotCi1MT0NBTF9KTklfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJnbGR1YWxqbmkKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQnVpbGQgSk5JIFNoYXJlZCBMaWJyYXJ5Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUxPQ0FMX1BBVEg6PSAkKExPQ0FMX1BBVEgpL2puaQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyBPcHRpb25hbCB0YWcgd291bGQgbWVhbiBpdCBkb2Vzbid0IGdldCBpbnN0YWxsZWQgYnkgZGVmYXVsdAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICBnbF9jb2RlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJ1dGlscyBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmdsZHVhbGpuaQotCi0KLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZmNGY3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbGR1YWwvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQuZ2xkdWFsIj4KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZ2xkdWFsX2FjdGl2aXR5Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iR0xEdWFsQWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgIAlhbmRyb2lkOmNvbmZpZ0NoYW5nZXM9Im9yaWVudGF0aW9ufGtleWJvYXJkSGlkZGVuIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLSAgICA8L2FwcGxpY2F0aW9uPgotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbGR1YWwvam5pL2dsX2NvZGUuY3BwIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9qbmkvZ2xfY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyODY3ZWQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9qbmkvZ2xfY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLy8gT3BlbkdMIEVTIDIuMCBjb2RlCi0KLSNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvam5pLmg+Ci0jZGVmaW5lIExPR19UQUcgIkdMMkpOSSBnbF9jb2RlLmNwcCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi1zdGF0aWMgdm9pZCBwcmludEdMU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEdMZW51bSBzKSB7Ci0gICAgY29uc3QgY2hhciAqdiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKHMpOwotICAgIEFMT0dJKCJHTCAlcyA9ICVzXG4iLCBuYW1lLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKSB7Ci0gICAgZm9yIChHTGludCBlcnJvciA9IGdsR2V0RXJyb3IoKTsgZXJyb3I7IGVycm9yCi0gICAgICAgICAgICA9IGdsR2V0RXJyb3IoKSkgewotICAgICAgICBBTE9HSSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KVxuIiwgb3AsIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGdWZXJ0ZXhTaGFkZXJbXSA9ICJhdHRyaWJ1dGUgdmVjNCB2UG9zaXRpb247XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9Qb3NpdGlvbiA9IHZQb3NpdGlvbjtcbiIKLSAgICAifVxuIjsKLQotc3RhdGljIGNvbnN0IGNoYXIgZ0ZyYWdtZW50U2hhZGVyW10gPSAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4iCi0gICAgInZvaWQgbWFpbigpIHtcbiIKLSAgICAiICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMS4wLCAwLjAsIDEuMCk7XG4iCi0gICAgIn1cbiI7Ci0KLUdMdWludCBsb2FkU2hhZGVyKEdMZW51bSBzaGFkZXJUeXBlLCBjb25zdCBjaGFyKiBwU291cmNlKSB7Ci0gICAgR0x1aW50IHNoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKHNoYWRlclR5cGUpOwotICAgIGlmIChzaGFkZXIpIHsKLSAgICAgICAgZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCAxLCAmcFNvdXJjZSwgTlVMTCk7Ci0gICAgICAgIGdsQ29tcGlsZVNoYWRlcihzaGFkZXIpOwotICAgICAgICBHTGludCBjb21waWxlZCA9IDA7Ci0gICAgICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTF9DT01QSUxFX1NUQVRVUywgJmNvbXBpbGVkKTsKLSAgICAgICAgaWYgKCFjb21waWxlZCkgewotICAgICAgICAgICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgICAgICAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmaW5mb0xlbik7Ci0gICAgICAgICAgICBpZiAoaW5mb0xlbikgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgICAgICAgICAgICAgIGlmIChidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjb21waWxlIHNoYWRlciAlZDpcbiVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlclR5cGUsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaGFkZXI7Ci19Ci0KLUdMdWludCBjcmVhdGVQcm9ncmFtKGNvbnN0IGNoYXIqIHBWZXJ0ZXhTb3VyY2UsIGNvbnN0IGNoYXIqIHBGcmFnbWVudFNvdXJjZSkgewotICAgIEdMdWludCB2ZXJ0ZXhTaGFkZXIgPSBsb2FkU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIsIHBWZXJ0ZXhTb3VyY2UpOwotICAgIGlmICghdmVydGV4U2hhZGVyKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEdMdWludCBwaXhlbFNoYWRlciA9IGxvYWRTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSLCBwRnJhZ21lbnRTb3VyY2UpOwotICAgIGlmICghcGl4ZWxTaGFkZXIpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgR0x1aW50IHByb2dyYW0gPSBnbENyZWF0ZVByb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSkgewotICAgICAgICBnbEF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIpOwotICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIik7Ci0gICAgICAgIGdsQXR0YWNoU2hhZGVyKHByb2dyYW0sIHBpeGVsU2hhZGVyKTsKLSAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciIpOwotICAgICAgICBnbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICBHTGludCBsaW5rU3RhdHVzID0gR0xfRkFMU0U7Ci0gICAgICAgIGdsR2V0UHJvZ3JhbWl2KHByb2dyYW0sIEdMX0xJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Ci0gICAgICAgIGlmIChsaW5rU3RhdHVzICE9IEdMX1RSVUUpIHsKLSAgICAgICAgICAgIEdMaW50IGJ1Zkxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBnbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZidWZMZW5ndGgpOwotICAgICAgICAgICAgaWYgKGJ1Zkxlbmd0aCkgewotICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZikgewotICAgICAgICAgICAgICAgICAgICBnbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0sIGJ1Zkxlbmd0aCwgTlVMTCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06XG4lc1xuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShidWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgIHByb2dyYW0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwcm9ncmFtOwotfQotCi1HTHVpbnQgZ1Byb2dyYW07Ci1HTHVpbnQgZ3ZQb3NpdGlvbkhhbmRsZTsKLQotYm9vbCBzZXR1cEdyYXBoaWNzKGludCB3LCBpbnQgaCkgewotICAgIHByaW50R0xTdHJpbmcoIlZlcnNpb24iLCBHTF9WRVJTSU9OKTsKLSAgICBwcmludEdMU3RyaW5nKCJWZW5kb3IiLCBHTF9WRU5ET1IpOwotICAgIHByaW50R0xTdHJpbmcoIlJlbmRlcmVyIiwgR0xfUkVOREVSRVIpOwotICAgIHByaW50R0xTdHJpbmcoIkV4dGVuc2lvbnMiLCBHTF9FWFRFTlNJT05TKTsKLQotICAgIEFMT0dJKCJzZXR1cEdyYXBoaWNzKCVkLCAlZCkiLCB3LCBoKTsKLSAgICBnUHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oZ1ZlcnRleFNoYWRlciwgZ0ZyYWdtZW50U2hhZGVyKTsKLSAgICBpZiAoIWdQcm9ncmFtKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgY3JlYXRlIHByb2dyYW0uIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZ3ZQb3NpdGlvbkhhbmRsZSA9IGdsR2V0QXR0cmliTG9jYXRpb24oZ1Byb2dyYW0sICJ2UG9zaXRpb24iKTsKLSAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICBBTE9HSSgiZ2xHZXRBdHRyaWJMb2NhdGlvbihcInZQb3NpdGlvblwiKSA9ICVkXG4iLAotICAgICAgICAgICAgZ3ZQb3NpdGlvbkhhbmRsZSk7Ci0KLSAgICBnbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWaWV3cG9ydCIpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBHTGZsb2F0IGdUcmlhbmdsZVZlcnRpY2VzW10gPSB7IDAuMGYsIDAuNWYsIC0wLjVmLCAtMC41ZiwKLSAgICAgICAgMC41ZiwgLTAuNWYgfTsKLQotdm9pZCByZW5kZXJGcmFtZSgpIHsKLSAgICBzdGF0aWMgZmxvYXQgZ3JleTsKLSAgICBncmV5ICs9IDAuMDFmOwotICAgIGlmIChncmV5ID4gMS4wZikgewotICAgICAgICBncmV5ID0gMC4wZjsKLSAgICB9Ci0gICAgZ2xDbGVhckNvbG9yKGdyZXksIGdyZXksIGdyZXksIDEuMGYpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhckNvbG9yIik7Ci0gICAgZ2xDbGVhciggR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xDbGVhciIpOwotCi0gICAgZ2xVc2VQcm9ncmFtKGdQcm9ncmFtKTsKLSAgICBjaGVja0dsRXJyb3IoImdsVXNlUHJvZ3JhbSIpOwotCi0gICAgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGd2UG9zaXRpb25IYW5kbGUsIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwgMCwgZ1RyaWFuZ2xlVmVydGljZXMpOwotICAgIGNoZWNrR2xFcnJvcigiZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyIik7Ci0gICAgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShndlBvc2l0aW9uSGFuZGxlKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCAzKTsKLSAgICBjaGVja0dsRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQotCi1leHRlcm4gIkMiIHsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xkdWFsX0dMRHVhbExpYl9pbml0KEpOSUVudiAqIGVudiwgam9iamVjdCBvYmosIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KTsKLSAgICBKTklFWFBPUlQgdm9pZCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfZ2xkdWFsX0dMRHVhbExpYl9zdGVwKEpOSUVudiAqIGVudiwgam9iamVjdCBvYmopOwotfTsKLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsZHVhbF9HTER1YWxMaWJfaW5pdChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqLCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkNCi17Ci0gICAgc2V0dXBHcmFwaGljcyh3aWR0aCwgaGVpZ2h0KTsKLX0KLQotSk5JRVhQT1JUIHZvaWQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX2dsZHVhbF9HTER1YWxMaWJfc3RlcChKTklFbnYgKiBlbnYsIGpvYmplY3Qgb2JqKQotewotICAgIHJlbmRlckZyYW1lKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbGR1YWwvcmVzL2xheW91dC9nbGR1YWxfYWN0aXZpdHkueG1sIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9yZXMvbGF5b3V0L2dsZHVhbF9hY3Rpdml0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NWFjYmMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9yZXMvbGF5b3V0L2dsZHVhbF9hY3Rpdml0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICAKLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLQotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgotICA8YW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyBhbmRyb2lkOmlkPSJAK2lkL2dsMSIKLQlhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotCSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0JICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KLSAgPGNvbS5hbmRyb2lkLmdsZHVhbC5HTER1YWxHTDJWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvZ2wyIgotCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiIC8+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbGR1YWwvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy9nbGR1YWwvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmNTM1ZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgZmlsZSBjb250YWlucyByZXNvdXJjZSBkZWZpbml0aW9ucyBmb3IgZGlzcGxheWVkIHN0cmluZ3MsIGFsbG93aW5nCi0gICAgIHRoZW0gdG8gYmUgY2hhbmdlZCBiYXNlZCBvbiB0aGUgbG9jYWxlIGFuZCBvcHRpb25zLiAtLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFNpbXBsZSBzdHJpbmdzLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9ImdsZHVhbF9hY3Rpdml0eSI+R0xEdWFsPC9zdHJpbmc+Ci0KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvR0xEdWFsQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDg4ZjY0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZ2xkdWFsOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci0KLQotcHVibGljIGNsYXNzIEdMRHVhbEFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotCi0gICAgR0xTdXJmYWNlVmlldyBtR0xWaWV3OwotICAgIEdMRHVhbEdMMlZpZXcgbUdMMlZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBWaWV3IHJvb3QgPSBnZXRMYXlvdXRJbmZsYXRlcigpLmluZmxhdGUoUi5sYXlvdXQuZ2xkdWFsX2FjdGl2aXR5LCBudWxsKTsKLSAgICAgICAgbUdMVmlldyA9IChHTFN1cmZhY2VWaWV3KSByb290LmZpbmRWaWV3QnlJZChSLmlkLmdsMSk7Ci0gICAgICAgIG1HTFZpZXcuc2V0RUdMQ29uZmlnQ2hvb3Nlcig1LDYsNSwwLDAsMCk7Ci0gICAgICAgIG1HTFZpZXcuc2V0UmVuZGVyZXIobmV3IFRyaWFuZ2xlUmVuZGVyZXIoKSk7Ci0gICAgICAgIG1HTDJWaWV3ID0gKEdMRHVhbEdMMlZpZXcpIHJvb3QuZmluZFZpZXdCeUlkKFIuaWQuZ2wyKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcocm9vdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbUdMVmlldy5vblBhdXNlKCk7Ci0gICAgICAgIG1HTDJWaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1HTFZpZXcub25SZXN1bWUoKTsKLSAgICAgICAgbUdMMlZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvR0xEdWFsR0wyVmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL0dMRHVhbEdMMlZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1ZTM0Ny4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvR0xEdWFsR0wyVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmdsZHVhbDsKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgU3VyZmFjZVZpZXcgdGhhdCB1c2VzIHRoZSBkZWRpY2F0ZWQgc3VyZmFjZSBmb3IKLSAqIGRpc3BsYXlpbmcgYW4gT3BlbkdMIGFuaW1hdGlvbi4gIFRoaXMgYWxsb3dzIHRoZSBhbmltYXRpb24gdG8gcnVuIGluIGEKLSAqIHNlcGFyYXRlIHRocmVhZCwgd2l0aG91dCByZXF1aXJpbmcgdGhhdCBpdCBiZSBkcml2ZW4gYnkgdGhlIHVwZGF0ZSBtZWNoYW5pc20KLSAqIG9mIHRoZSB2aWV3IGhpZXJhcmNoeS4KLSAqCi0gKiBUaGUgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVuZGVyaW5nIGNvZGUgaXMgZGVsZWdhdGVkIHRvIGEgR0xWaWV3LlJlbmRlcmVyCi0gKiBpbnN0YW5jZS4KLSAqLwotY2xhc3MgR0xEdWFsR0wyVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiR0xEdWFsR0wyVmlldyI7Ci0KLSAgICBwdWJsaWMgR0xEdWFsR0wyVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQoZmFsc2UsIDAsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBHTER1YWxHTDJWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IHNldCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBzZXQpOwotICAgICAgICBpbml0KGZhbHNlLCAwLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR0xEdWFsR0wyVmlldyhDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gdHJhbnNsdWNlbnQsIGludCBkZXB0aCwgaW50IHN0ZW5jaWwpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIGluaXQodHJhbnNsdWNlbnQsIGRlcHRoLCBzdGVuY2lsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdChib29sZWFuIHRyYW5zbHVjZW50LCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7Ci0gICAgICAgIHNldEVHTENvbnRleHRGYWN0b3J5KG5ldyBDb250ZXh0RmFjdG9yeSgpKTsKLSAgICAgICAgc2V0RUdMQ29uZmlnQ2hvb3NlciggdHJhbnNsdWNlbnQgPwotICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig4LDgsOCw4LCBkZXB0aCwgc3RlbmNpbCkgOgotICAgICAgICAgICAgICBuZXcgQ29uZmlnQ2hvb3Nlcig1LDYsNSwwLCBkZXB0aCwgc3RlbmNpbCkpOwotICAgICAgICBzZXRSZW5kZXJlcihuZXcgUmVuZGVyZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LkVHTENvbnRleHRGYWN0b3J5IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OID0gMHgzMDk4OwotICAgICAgICBwdWJsaWMgRUdMQ29udGV4dCBjcmVhdGVDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb25maWcgZWdsQ29uZmlnKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJjcmVhdGluZyBPcGVuR0wgRVMgMi4wIGNvbnRleHQiKTsKLSAgICAgICAgICAgIGNoZWNrRWdsRXJyb3IoIkJlZm9yZSBlZ2xDcmVhdGVDb250ZXh0IiwgZWdsKTsKLSAgICAgICAgICAgIGludFtdIGF0dHJpYl9saXN0ID0ge0VHTF9DT05URVhUX0NMSUVOVF9WRVJTSU9OLCAyLCBFR0wxMC5FR0xfTk9ORSB9OwotICAgICAgICAgICAgRUdMQ29udGV4dCBjb250ZXh0ID0gZWdsLmVnbENyZWF0ZUNvbnRleHQoZGlzcGxheSwgZWdsQ29uZmlnLCBFR0wxMC5FR0xfTk9fQ09OVEVYVCwgYXR0cmliX2xpc3QpOwotICAgICAgICAgICAgY2hlY2tFZ2xFcnJvcigiQWZ0ZXIgZWdsQ3JlYXRlQ29udGV4dCIsIGVnbCk7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lDb250ZXh0KEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LCBFR0xDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGVnbC5lZ2xEZXN0cm95Q29udGV4dChkaXNwbGF5LCBjb250ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihTdHJpbmcgcHJvbXB0LCBFR0wxMCBlZ2wpIHsKLSAgICAgICAgaW50IGVycm9yOwotICAgICAgICB3aGlsZSAoKGVycm9yID0gZWdsLmVnbEdldEVycm9yKCkpICE9IEVHTDEwLkVHTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsIFN0cmluZy5mb3JtYXQoIiVzOiBFR0wgZXJyb3I6IDB4JXgiLCBwcm9tcHQsIGVycm9yKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25maWdDaG9vc2VyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5FR0xDb25maWdDaG9vc2VyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVHTF9PUEVOR0xfRVMyX0JJVCA9IDQ7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGludFtdIHNfY29uZmlnQXR0cmliczIgPQotICAgICAgICB7Ci0gICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsIDQsCi0gICAgICAgICAgICBFR0wxMC5FR0xfR1JFRU5fU0laRSwgNCwKLSAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsIDQsCi0gICAgICAgICAgICBFR0wxMC5FR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgICAgICBFR0wxMC5FR0xfTk9ORQotICAgICAgICB9OwotCi0gICAgICAgIHB1YmxpYyBDb25maWdDaG9vc2VyKGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCBpbnQgZGVwdGgsIGludCBzdGVuY2lsKSB7Ci0gICAgICAgICAgICBtUmVkU2l6ZSA9IHI7Ci0gICAgICAgICAgICBtR3JlZW5TaXplID0gZzsKLSAgICAgICAgICAgIG1CbHVlU2l6ZSA9IGI7Ci0gICAgICAgICAgICBtQWxwaGFTaXplID0gYTsKLSAgICAgICAgICAgIG1EZXB0aFNpemUgPSBkZXB0aDsKLSAgICAgICAgICAgIG1TdGVuY2lsU2l6ZSA9IHN0ZW5jaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSkgewotCi0gICAgICAgICAgICBpbnRbXSBudW1fY29uZmlnID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIGVnbC5lZ2xDaG9vc2VDb25maWcoZGlzcGxheSwgc19jb25maWdBdHRyaWJzMiwgbnVsbCwgMCwgbnVtX2NvbmZpZyk7Ci0KLSAgICAgICAgICAgIGludCBudW1Db25maWdzID0gbnVtX2NvbmZpZ1swXTsKLQotICAgICAgICAgICAgaWYgKG51bUNvbmZpZ3MgPD0gMCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNvbmZpZ3MgbWF0Y2ggY29uZmlnU3BlYyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncyA9IG5ldyBFR0xDb25maWdbbnVtQ29uZmlnc107Ci0gICAgICAgICAgICBlZ2wuZWdsQ2hvb3NlQ29uZmlnKGRpc3BsYXksIHNfY29uZmlnQXR0cmliczIsIGNvbmZpZ3MsIG51bUNvbmZpZ3MsIG51bV9jb25maWcpOwotICAgICAgICAgICAgLy8gcHJpbnRDb25maWdzKGVnbCwgZGlzcGxheSwgY29uZmlncyk7Ci0gICAgICAgICAgICByZXR1cm4gY2hvb3NlQ29uZmlnKGVnbCwgZGlzcGxheSwgY29uZmlncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRUdMQ29uZmlnIGNob29zZUNvbmZpZyhFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBFR0xDb25maWdbXSBjb25maWdzKSB7Ci0gICAgICAgICAgICBFR0xDb25maWcgY2xvc2VzdENvbmZpZyA9IG51bGw7Ci0gICAgICAgICAgICBpbnQgY2xvc2VzdERpc3RhbmNlID0gMTAwMDsKLSAgICAgICAgICAgIGZvcihFR0xDb25maWcgY29uZmlnIDogY29uZmlncykgewotICAgICAgICAgICAgICAgIGludCBkID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICBpbnQgcyA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoZCA+PSBtRGVwdGhTaXplICYmIHM+PSBtU3RlbmNpbFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9SRURfU0laRSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBnID0gZmluZENvbmZpZ0F0dHJpYihlZ2wsIGRpc3BsYXksIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0dSRUVOX1NJWkUsIDApOwotICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IGZpbmRDb25maWdBdHRyaWIoZWdsLCBkaXNwbGF5LCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQkxVRV9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBmaW5kQ29uZmlnQXR0cmliKGVnbCwgZGlzcGxheSwgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9TSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gTWF0aC5hYnMociAtIG1SZWRTaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGcgLSBtR3JlZW5TaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1hdGguYWJzKGIgLSBtQmx1ZVNpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgTWF0aC5hYnMoYSAtIG1BbHBoYVNpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBjbG9zZXN0RGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3REaXN0YW5jZSA9IGRpc3RhbmNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdENvbmZpZyA9IGNvbmZpZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjbG9zZXN0Q29uZmlnOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZENvbmZpZ0F0dHJpYihFR0wxMCBlZ2wsIEVHTERpc3BsYXkgZGlzcGxheSwKLSAgICAgICAgICAgICAgICBFR0xDb25maWcgY29uZmlnLCBpbnQgYXR0cmlidXRlLCBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0KLSAgICAgICAgICAgIGlmIChlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCBtVmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZVswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRDb25maWdzKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgRUdMQ29uZmlnW10gY29uZmlncykgewotICAgICAgICAgICAgaW50IG51bUNvbmZpZ3MgPSBjb25maWdzLmxlbmd0aDsKLSAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiJWQgY29uZmlndXJhdGlvbnMiLCBudW1Db25maWdzKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbmZpZ3M7IGkrKykgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgU3RyaW5nLmZvcm1hdCgiQ29uZmlndXJhdGlvbiAlZDpcbiIsIGkpKTsKLSAgICAgICAgICAgICAgICBwcmludENvbmZpZyhlZ2wsIGRpc3BsYXksIGNvbmZpZ3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHByaW50Q29uZmlnKEVHTDEwIGVnbCwgRUdMRGlzcGxheSBkaXNwbGF5LAotICAgICAgICAgICAgICAgIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgICAgIGludFtdIGF0dHJpYnV0ZXMgPSB7Ci0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CVUZGRVJfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0FMUEhBX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9CTFVFX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9HUkVFTl9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfUkVEX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9ERVBUSF9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU1RFTkNJTF9TSVpFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfQ09ORklHX0NBVkVBVCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0NPTkZJR19JRCwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX0xFVkVMLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfSEVJR0hULAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfUElYRUxTLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTUFYX1BCVUZGRVJfV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfUkVOREVSQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX05BVElWRV9WSVNVQUxfSUQsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9OQVRJVkVfVklTVUFMX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzMCwgLy8gRUdMMTAuRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TQU1QTEVTLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfU0FNUExFX0JVRkZFUlMsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9TVVJGQUNFX1RZUEUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9UWVBFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfVFJBTlNQQVJFTlRfR1JFRU5fVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAweDMwMzksIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCLAotICAgICAgICAgICAgICAgICAgICAweDMwM0EsIC8vIEVHTDEwLkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDNCLCAvLyBFR0wxMC5FR0xfTUlOX1NXQVBfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgIDB4MzAzQywgLy8gRUdMMTAuRUdMX01BWF9TV0FQX0lOVEVSVkFMLAotICAgICAgICAgICAgICAgICAgICBFR0wxMC5FR0xfTFVNSU5BTkNFX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9BTFBIQV9NQVNLX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgIEVHTDEwLkVHTF9DT0xPUl9CVUZGRVJfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgRUdMMTAuRUdMX1JFTkRFUkFCTEVfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgMHgzMDQyIC8vIEVHTDEwLkVHTF9DT05GT1JNQU5UCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB7Ci0gICAgICAgICAgICAgICAgICAgICJFR0xfQlVGRkVSX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0FMUEhBX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0JMVUVfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfR1JFRU5fU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfUkVEX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX0RFUFRIX1NJWkUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1NURU5DSUxfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0NBVkVBVCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQ09ORklHX0lEIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9MRVZFTCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUFYX1BCVUZGRVJfSEVJR0hUIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9NQVhfUEJVRkZFUl9QSVhFTFMiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9QQlVGRkVSX1dJRFRIIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9OQVRJVkVfUkVOREVSQUJMRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9JRCIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9QUkVTRVJWRURfUkVTT1VSQ0VTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVTIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9TQU1QTEVfQlVGRkVSUyIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfU1VSRkFDRV9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfTUlOX1NXQVBfSU5URVJWQUwiLAotICAgICAgICAgICAgICAgICAgICAiRUdMX01BWF9TV0FQX0lOVEVSVkFMIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9MVU1JTkFOQ0VfU0laRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfQUxQSEFfTUFTS19TSVpFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT0xPUl9CVUZGRVJfVFlQRSIsCi0gICAgICAgICAgICAgICAgICAgICJFR0xfUkVOREVSQUJMRV9UWVBFIiwKLSAgICAgICAgICAgICAgICAgICAgIkVHTF9DT05GT1JNQU5UIgotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGludFtdIHZhbHVlID0gbmV3IGludFsxXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW2ldOwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKCBlZ2wuZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgYXR0cmlidXRlLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCBTdHJpbmcuZm9ybWF0KCIgICVzOiAlZFxuIiwgbmFtZSwgdmFsdWVbMF0pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBMb2cudyhUQUcsIFN0cmluZy5mb3JtYXQoIiAgJXM6IGZhaWxlZFxuIiwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWdsLmVnbEdldEVycm9yKCkgIT0gRUdMMTAuRUdMX1NVQ0NFU1MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFN1YmNsYXNzZXMgY2FuIGFkanVzdCB0aGVzZSB2YWx1ZXM6Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbVJlZFNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbUdyZWVuU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtQmx1ZVNpemU7Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgbUFscGhhU2l6ZTsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtRGVwdGhTaXplOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1TdGVuY2lsU2l6ZTsKLSAgICAgICAgcHJpdmF0ZSBpbnRbXSBtVmFsdWUgPSBuZXcgaW50WzFdOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKLSAgICAgICAgICAgIEdMRHVhbExpYi5zdGVwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgR0xEdWFsTGliLmluaXQod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxMaWIuamF2YSBiL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9HTER1YWxMaWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmNzY1ZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvZ2xkdWFsL3NyYy9jb20vYW5kcm9pZC9nbGR1YWwvR0xEdWFsTGliLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbGR1YWw7Ci0KLS8vIFdyYXBwZXIgZm9yIG5hdGl2ZSBsaWJyYXJ5Ci0KLXB1YmxpYyBjbGFzcyBHTER1YWxMaWIgewotCi0gICAgIHN0YXRpYyB7Ci0gICAgICAgICBTeXN0ZW0ubG9hZExpYnJhcnkoImdsZHVhbGpuaSIpOwotICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gd2lkdGggdGhlIGN1cnJlbnQgdmlldyB3aWR0aAotICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIGN1cnJlbnQgdmlldyBoZWlnaHQKLSAgICAgKi8KLSAgICAgcHVibGljIHN0YXRpYyBuYXRpdmUgdm9pZCBpbml0KGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgc3RlcCgpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL1RyaWFuZ2xlUmVuZGVyZXIuamF2YSBiL29wZW5nbC90ZXN0cy9nbGR1YWwvc3JjL2NvbS9hbmRyb2lkL2dsZHVhbC9UcmlhbmdsZVJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODJkNDcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dsZHVhbC9zcmMvY29tL2FuZHJvaWQvZ2xkdWFsL1RyaWFuZ2xlUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5nbGR1YWw7Ci0KLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5GbG9hdEJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5TaG9ydEJ1ZmZlcjsKLQotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xVOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci0KLXB1YmxpYyBjbGFzcyBUcmlhbmdsZVJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlcnsKLQotICAgIHB1YmxpYyBUcmlhbmdsZVJlbmRlcmVyKCkgewotICAgICAgICBtVHJpYW5nbGUgPSBuZXcgVHJpYW5nbGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQnkgZGVmYXVsdCwgT3BlbkdMIGVuYWJsZXMgZmVhdHVyZXMgdGhhdCBpbXByb3ZlIHF1YWxpdHkKLSAgICAgICAgICogYnV0IHJlZHVjZSBwZXJmb3JtYW5jZS4gT25lIG1pZ2h0IHdhbnQgdG8gdHdlYWsgdGhhdAotICAgICAgICAgKiBlc3BlY2lhbGx5IG9uIHNvZnR3YXJlIHJlbmRlcmVyLgotICAgICAgICAgKi8KLSAgICAgICAgZ2wuZ2xEaXNhYmxlKEdMMTAuR0xfRElUSEVSKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTb21lIG9uZS10aW1lIE9wZW5HTCBpbml0aWFsaXphdGlvbiBjYW4gYmUgbWFkZSBoZXJlCi0gICAgICAgICAqIHByb2JhYmx5IGJhc2VkIG9uIGZlYXR1cmVzIG9mIHRoaXMgcGFydGljdWxhciBjb250ZXh0Ci0gICAgICAgICAqLwotICAgICAgICBnbC5nbEhpbnQoR0wxMC5HTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQsCi0gICAgICAgICAgICAgICAgR0wxMC5HTF9GQVNURVNUKTsKLQotICAgICAgICBnbC5nbENsZWFyQ29sb3IoLjVmLCAuNWYsIC41ZiwgMSk7Ci0gICAgICAgIGdsLmdsU2hhZGVNb2RlbChHTDEwLkdMX1NNT09USCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAvKgotICAgICAgICAgKiBCeSBkZWZhdWx0LCBPcGVuR0wgZW5hYmxlcyBmZWF0dXJlcyB0aGF0IGltcHJvdmUgcXVhbGl0eQotICAgICAgICAgKiBidXQgcmVkdWNlIHBlcmZvcm1hbmNlLiBPbmUgbWlnaHQgd2FudCB0byB0d2VhayB0aGF0Ci0gICAgICAgICAqIGVzcGVjaWFsbHkgb24gc29mdHdhcmUgcmVuZGVyZXIuCi0gICAgICAgICAqLwotICAgICAgICBnbC5nbERpc2FibGUoR0wxMC5HTF9ESVRIRVIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVzdWFsbHksIHRoZSBmaXJzdCB0aGluZyBvbmUgbWlnaHQgd2FudCB0byBkbyBpcyB0byBjbGVhcgotICAgICAgICAgKiB0aGUgc2NyZWVuLiBUaGUgbW9zdCBlZmZpY2llbnQgd2F5IG9mIGRvaW5nIHRoaXMgaXMgdG8gdXNlCi0gICAgICAgICAqIGdsQ2xlYXIoKS4KLSAgICAgICAgICovCi0KLSAgICAgICAgZ2wuZ2xDbGVhcihHTDEwLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDEwLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE5vdyB3ZSdyZSByZWFkeSB0byBkcmF3IHNvbWUgM0Qgb2JqZWN0cwotICAgICAgICAgKi8KLQotICAgICAgICBnbC5nbE1hdHJpeE1vZGUoR0wxMC5HTF9NT0RFTFZJRVcpOwotICAgICAgICBnbC5nbExvYWRJZGVudGl0eSgpOwotCi0gICAgICAgIEdMVS5nbHVMb29rQXQoZ2wsIDAsIDAsIC01LCAwZiwgMGYsIDBmLCAwZiwgMS4wZiwgMC4wZik7Ci0KLSAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7Ci0KLSAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgJSA0MDAwTDsKLSAgICAgICAgZmxvYXQgYW5nbGUgPSAwLjA5MGYgKiAoKGludCkgdGltZSk7Ci0KLSAgICAgICAgZ2wuZ2xSb3RhdGVmKGFuZ2xlLCAwLCAwLCAxLjBmKTsKLQotICAgICAgICBtVHJpYW5nbGUuZHJhdyhnbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgdywgaW50IGgpIHsKLSAgICAgICAgZ2wuZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLQotICAgICAgICAvKgotICAgICAgICAqIFNldCBvdXIgcHJvamVjdGlvbiBtYXRyaXguIFRoaXMgZG9lc24ndCBoYXZlIHRvIGJlIGRvbmUKLSAgICAgICAgKiBlYWNoIHRpbWUgd2UgZHJhdywgYnV0IHVzdWFsbHkgYSBuZXcgcHJvamVjdGlvbiBuZWVkcyB0bwotICAgICAgICAqIGJlIHNldCB3aGVuIHRoZSB2aWV3cG9ydCBpcyByZXNpemVkLgotICAgICAgICAqLwotCi0gICAgICAgIGZsb2F0IHJhdGlvID0gKGZsb2F0KSB3IC8gaDsKLSAgICAgICAgZ2wuZ2xNYXRyaXhNb2RlKEdMMTAuR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIGdsLmdsTG9hZElkZW50aXR5KCk7Ci0gICAgICAgIGdsLmdsRnJ1c3R1bWYoLXJhdGlvLCByYXRpbywgLTEsIDEsIDMsIDcpOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBUcmlhbmdsZSBtVHJpYW5nbGU7Ci19Ci0KLWNsYXNzIFRyaWFuZ2xlIHsKLSAgICBwdWJsaWMgVHJpYW5nbGUoKSB7Ci0KLSAgICAgICAgLy8gQnVmZmVycyB0byBiZSBwYXNzZWQgdG8gZ2wqUG9pbnRlcigpIGZ1bmN0aW9ucwotICAgICAgICAvLyBtdXN0IGJlIGRpcmVjdCwgaS5lLiwgdGhleSBtdXN0IGJlIHBsYWNlZCBvbiB0aGUKLSAgICAgICAgLy8gbmF0aXZlIGhlYXAgd2hlcmUgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGNhbm5vdAotICAgICAgICAvLyBtb3ZlIHRoZW0uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJ1ZmZlcnMgd2l0aCBtdWx0aS1ieXRlIGRhdGF0eXBlcyAoZS5nLiwgc2hvcnQsIGludCwgZmxvYXQpCi0gICAgICAgIC8vIG11c3QgaGF2ZSB0aGVpciBieXRlIG9yZGVyIHNldCB0byBuYXRpdmUgb3JkZXIKLQotICAgICAgICBCeXRlQnVmZmVyIHZiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVFMgKiAzICogNCk7Ci0gICAgICAgIHZiYi5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7Ci0gICAgICAgIG1GVmVydGV4QnVmZmVyID0gdmJiLmFzRmxvYXRCdWZmZXIoKTsKLQotICAgICAgICBCeXRlQnVmZmVyIHRiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoVkVSVFMgKiAyICogNCk7Ci0gICAgICAgIHRiYi5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7Ci0KLSAgICAgICAgQnl0ZUJ1ZmZlciBpYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KFZFUlRTICogMik7Ci0gICAgICAgIGliYi5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7Ci0gICAgICAgIG1JbmRleEJ1ZmZlciA9IGliYi5hc1Nob3J0QnVmZmVyKCk7Ci0KLSAgICAgICAgLy8gQSB1bml0LXNpZGVkIGVxdWFsYXRlcmFsIHRyaWFuZ2xlIGNlbnRlcmVkIG9uIHRoZSBvcmlnaW4uCi0gICAgICAgIGZsb2F0W10gY29vcmRzID0gewotICAgICAgICAgICAgICAgIC8vIFgsIFksIFoKLSAgICAgICAgICAgICAgICAtMC41ZiwgLTAuMjVmLCAwLAotICAgICAgICAgICAgICAgICAwLjVmLCAtMC4yNWYsIDAsCi0gICAgICAgICAgICAgICAgIDAuMGYsICAwLjU1OTAxNjk5NGYsIDAKLSAgICAgICAgfTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZFUlRTOyBpKyspIHsKLSAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCAzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBtRlZlcnRleEJ1ZmZlci5wdXQoY29vcmRzW2kqMytqXSAqIDIuMGYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IFZFUlRTOyBpKyspIHsKLSAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoKHNob3J0KSBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1GVmVydGV4QnVmZmVyLnBvc2l0aW9uKDApOwotICAgICAgICBtSW5kZXhCdWZmZXIucG9zaXRpb24oMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZHJhdyhHTDEwIGdsKSB7Ci0gICAgICAgIGdsLmdsRnJvbnRGYWNlKEdMMTAuR0xfQ0NXKTsKLSAgICAgICAgZ2wuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMMTAuR0xfRkxPQVQsIDAsIG1GVmVydGV4QnVmZmVyKTsKLSAgICAgICAgZ2wuZ2xEcmF3RWxlbWVudHMoR0wxMC5HTF9UUklBTkdMRV9TVFJJUCwgVkVSVFMsCi0gICAgICAgICAgICAgICAgR0wxMC5HTF9VTlNJR05FRF9TSE9SVCwgbUluZGV4QnVmZmVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVkVSVFMgPSAzOwotCi0gICAgcHJpdmF0ZSBGbG9hdEJ1ZmZlciBtRlZlcnRleEJ1ZmZlcjsKLSAgICBwcml2YXRlIFNob3J0QnVmZmVyIG1JbmRleEJ1ZmZlcjsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9ncmFsbG9jL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZ3JhbGxvYy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNjMzlhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9ncmFsbG9jL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgZ3JhbGxvYy5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlidWkKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZ3JhbGxvYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9ncmFsbG9jL2dyYWxsb2MuY3BwIGIvb3BlbmdsL3Rlc3RzL2dyYWxsb2MvZ3JhbGxvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODcwNDAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2dyYWxsb2MvZ3JhbGxvYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqKgotICoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdG9wV2F0Y2giCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLXZvaWQqIGxhbWVjcHkodm9pZCogZCwgdm9pZCBjb25zdCogcywgc2l6ZV90IHNpemUpIHsKLSAgICBjaGFyKiBkc3QgPSAoY2hhciopZDsKLSAgICBjaGFyIGNvbnN0KiBzcmMgPSAoY2hhciBjb25zdCopczsKLSAgICB3aGlsZSAoc2l6ZSkgewotICAgICAgICAqZHN0KysgPSAqc3JjKys7Ci0gICAgICAgIHNpemUtLTsKLSAgICB9Ci0gICAgcmV0dXJuIGQ7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBzaXplX3Qgc2l6ZSA9IDEyOCoyNTYqNDsKLSAgICB2b2lkKiB0ZW1wID0gbWFsbG9jKHNpemUpOwotICAgIHZvaWQqIHRlbXAyID0gbWFsbG9jKHNpemUpOwotICAgIG1lbXNldCh0ZW1wLCAwLCBzaXplKTsKLSAgICBtZW1zZXQodGVtcDIsIDAsIHNpemUpOwotCi0KLSAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcigxMjgsIDI1NiwgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBidWZmZXItPmluaXRDaGVjaygpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcHJpbnRmKCIlc1xuIiwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2b2lkKiB2YWRkcjsKLSAgICBidWZmZXItPmxvY2soCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAotICAgICAgICAgICAgJnZhZGRyKTsKLQotICAgIHsKLSAgICAgICAgU3RvcFdhdGNoIHdhdGNoKCJtZW1zZXQiKTsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwxMCA7IGkrKykKLSAgICAgICAgICAgIG1lbXNldCh2YWRkciwgMCwgc2l6ZSk7Ci0gICAgfQotCi0gICAgewotICAgICAgICBTdG9wV2F0Y2ggd2F0Y2goIm1lbWNweSBiYXNlbGluZSIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDEwIDsgaSsrKQotICAgICAgICAgICAgbWVtY3B5KHRlbXAsIHRlbXAyLCBzaXplKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIFN0b3BXYXRjaCB3YXRjaCgibWVtY3B5IGZyb20gZ3JhbGxvYyIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDEwIDsgaSsrKQotICAgICAgICAgICAgbWVtY3B5KHRlbXAsIHZhZGRyLCBzaXplKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIFN0b3BXYXRjaCB3YXRjaCgibWVtY3B5IGludG8gZ3JhbGxvYyIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDEwIDsgaSsrKQotICAgICAgICAgICAgbWVtY3B5KHZhZGRyLCB0ZW1wLCBzaXplKTsKLSAgICB9Ci0KLQotICAgIHsKLSAgICAgICAgU3RvcFdhdGNoIHdhdGNoKCJsYW1lY3B5IGJhc2VsaW5lIik7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8MTAgOyBpKyspCi0gICAgICAgICAgICBsYW1lY3B5KHRlbXAsIHRlbXAyLCBzaXplKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIFN0b3BXYXRjaCB3YXRjaCgibGFtZWNweSBmcm9tIGdyYWxsb2MiKTsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTwxMCA7IGkrKykKLSAgICAgICAgICAgIGxhbWVjcHkodGVtcCwgdmFkZHIsIHNpemUpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgU3RvcFdhdGNoIHdhdGNoKCJsYW1lY3B5IGludG8gZ3JhbGxvYyIpOwotICAgICAgICBmb3IgKGludCBpPTAgOyBpPDEwIDsgaSsrKQotICAgICAgICAgICAgbGFtZWNweSh2YWRkciwgdGVtcCwgc2l6ZSk7Ci0gICAgfQotCi0gICAgYnVmZmVyLT51bmxvY2soKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2h3Yy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2h3Yy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI1OGIxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfTU9EVUxFOj0gbGliaHdjVGVzdAotTE9DQUxfU1JDX0ZJTEVTOj0gaHdjVGVzdExpYi5jcHAKLUxPQ0FMX0NfSU5DTFVERVMgKz0gc3lzdGVtL2V4dHJhcy90ZXN0cy9pbmNsdWRlIFwKLSAgICBiaW9uaWMgXAotICAgIGJpb25pYy9saWJzdGRjKysvaW5jbHVkZSBcCi0gICAgZXh0ZXJuYWwvc3RscG9ydC9zdGxwb3J0IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9DRkxBR1MgOj0gLURHTF9HTEVYVF9QUk9UT1RZUEVTIC1ERUdMX0VHTEVYVF9QUk9UT1RZUEVTCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYnV0aWxzIGxpYnN0bHBvcnQKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliZ2xUZXN0Ci0KLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUzo9IGh3Y1N0cmVzcy5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MiBcCi0gICAgbGlidWkgXAotICAgIGxpYmhhcmR3YXJlIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidGVzdFV0aWwgXAotICAgIGxpYmdsVGVzdCBcCi0gICAgbGliaHdjVGVzdCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIHN5c3RlbS9leHRyYXMvdGVzdHMvaW5jbHVkZSBcCi0gICAgaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1MT0NBTF9NT0RVTEU6PSBod2NTdHJlc3MKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBKS9uYXRpdmVzdHJlc3N0ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUzo9IGh3Y1JlY3RzLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YyIFwKLSAgICBsaWJ1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJ0ZXN0VXRpbCBcCi0gICAgbGliZ2xUZXN0IFwKLSAgICBsaWJod2NUZXN0IFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL2V4dHJhcy90ZXN0cy9pbmNsdWRlIFwKLSAgICBoYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSBod2NSZWN0cwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEEpL25hdGl2ZXV0aWwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTOj0gaHdjQ29sb3JFcXVpdi5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MiBcCi0gICAgbGlidWkgXAotICAgIGxpYmhhcmR3YXJlIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidGVzdFV0aWwgXAotICAgIGxpYmdsVGVzdCBcCi0gICAgbGliaHdjVGVzdCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIHN5c3RlbS9leHRyYXMvdGVzdHMvaW5jbHVkZSBcCi0gICAgaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gaHdjQ29sb3JFcXVpdgotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0RBVEEpL25hdGl2ZXV0aWwKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfU1JDX0ZJTEVTOj0gaHdjQ29tbWl0LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YyIFwKLSAgICBsaWJ1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJ0ZXN0VXRpbCBcCi0gICAgbGliZ2xUZXN0IFwKLSAgICBsaWJod2NUZXN0IFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgc3lzdGVtL2V4dHJhcy90ZXN0cy9pbmNsdWRlIFwKLSAgICBoYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSBod2NDb21taXQKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9EQVRBKS9uYXRpdmViZW5jaG1hcmsKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1pbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y0NvbG9yRXF1aXYuY3BwIGIvb3BlbmdsL3Rlc3RzL2h3Yy9od2NDb2xvckVxdWl2LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDVkYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y0NvbG9yRXF1aXYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyoKLSAqIEhhcmR3YXJlIENvbXBvc2VyIENvbG9yIEVxdWl2YWxlbmNlCi0gKgotICogU3lub3BzaXMKLSAqICAgaHdjX2NvbG9yZXF1aXYgW29wdGlvbnNdIGVGbXQKLSAqCi0gKiAgICAgb3B0aW9uczoKLSAgICAgICAgIC12IC0gdmVyYm9zZQotICogICAgICAgLXMgPDAuIyMsIDAuIyMsIDAuIyM+IC0gU3RhcnQgY29sb3IgKGRlZmF1bHQ6IDwwLjAsIDAuMCwgMC4wPgotICogICAgICAgLWUgPDAuIyMsIDAuIyMsIDAuIyM+IC0gRW5kaW5nIGNvbG9yIChkZWZhdWx0OiA8MS4wLCAxLjAsIDEuMD4KLSAqICAgICAgIC1yIGZtdCAtIHJlZmVyZW5jZSBncmFwaGljIGZvcm1hdAotICogICAgICAgLUQgIy4jIyAtIEVuZCBvZiB0ZXN0IGRlbGF5Ci0gKgotICogICAgIGdyYXBoaWMgZm9ybWF0czoKLSAqICAgICAgIFJHQkE4ODg4IChyZWZlcmVuY2UgZnJhbWUgZGVmYXVsdCkKLSAqICAgICAgIFJHQlg4ODg4Ci0gKiAgICAgICBSR0I4ODgKLSAqICAgICAgIFJHQjU2NQotICogICAgICAgQkdSQTg4ODgKLSAqICAgICAgIFJHQkE1NTUxCi0gKiAgICAgICBSR0JBNDQ0NAotICogICAgICAgWVYxMgotICoKLSAqIERlc2NyaXB0aW9uCi0gKiAgIFJlbmRlcnMgYSBob3Jpem9udGFsIGJsZW5kIGluIHR3byBmcmFtZXMuICBUaGUgZmlyc3QgZnJhbWUgaXMgcmVuZGVyZWQKLSAqICAgaW4gdGhlIHVwcGVyIHRoaXJkIG9mIHRoZSBkaXNwbGF5IGFuZCBpcyBjYWxsZWQgdGhlIHJlZmVyZW5jZSBmcmFtZS4KLSAqICAgVGhlIHNlY29uZCBmcmFtZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIG1pZGRsZSB0aGlyZCBhbmQgaXMgY2FsbGVkIHRoZQotICogICBlcXVpdmFsZW5jZSBmcmFtZS4gIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyB1dGlsaXR5IGlzIHRvIHZlcmlmeQotICogICB0aGF0IHRoZSBjb2xvcnMgcHJvZHVjZWQgaW4gdGhlIHJlZmVyZW5jZSBhbmQgZXF1aXZhbGVuY2UgZnJhbWVzIGFyZQotICogICB0aGUgc2FtZS4gIFRoZSBjb2xvcnMgYXJlIHRoZSBzYW1lIHdoZW4gdGhlIGNvbG9ycyBhcmUgdGhlIHNhbWUKLSAqICAgdmVydGljYWxseSBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgYW5kIGVxdWl2YWxlbmNlIGZyYW1lcy4KLSAqCi0gKiAgIEJ5IGRlZmF1bHQgdGhlIHJlZmVyZW5jZSBmcmFtZSBpcyByZW5kZXJlZCB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlCi0gKiAgIFJHQkE4ODg4IGdyYXBoaWMgZm9ybWF0LiAgVGhlIC1yIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEKLSAqICAgbm9uLWRlZmF1bHQgcmVmZXJlbmNlIGZyYW1lIGdyYXBoaWMgZm9ybWF0LiAgVGhlIGdyYXBoaWMgZm9ybWF0IG9mCi0gKiAgIHRoZSBlcXVpdmFsZW5jZSBmcmFtZSBpcyBkZXRlcm1pbmVkIGJ5IGEgc2luZ2xlIHJlcXVpcmVkIHBvc2l0aW9uYWwKLSAqICAgcGFyYW1ldGVyLiAgSW50ZW50aW9uYWxseSB0aGVyZSBpcyBubyBkZWZhdWx0IGZvciB0aGUgZ3JhcGhpYyBmb3JtYXQKLSAqICAgb2YgdGhlIGVxdWl2YWxlbmNlIGZyYW1lLgotICoKLSAqICAgVGhlIGhvcml6b250YWwgYmxlbmQgaW4gdGhlIHJlZmVyZW5jZSBmcmFtZSBpcyBwcm9kdWNlZCBmcm9tIGEgbGluZWFyCi0gKiAgIGludGVycG9sYXRpb24gZnJvbSBhIHN0YXJ0IGNvbG9yIChkZWZhdWx0OiA8MC4wLCAwLjAsIDAuMD4gb24gdGhlIGxlZnQKLSAqICAgc2lkZSB0byBhbiBlbmQgY29sb3IgKGRlZmF1bHQgPDEuMCwgMS4wLCAxLjA+IG9uIHRoZSByaWdodCBzaWRlLiAgV2hlcmUKLSAqICAgcG9zc2libGUgdGhlIGVxdWl2YWxlbmNlIGZyYW1lIGlzIHJlbmRlcmVkIHdpdGggdGhlIGVxdWl2YWxlbnQgY29sb3IKLSAqICAgZnJvbSB0aGUgcmVmZXJlbmNlIGZyYW1lLiAgQSBjb2xvciBvZiBibGFjayBpcyB1c2VkIGluIHRoZSBlcXVpdmFsZW5jZQotICogICBmcmFtZSBmb3IgY2FzZXMgd2hlcmUgYW4gZXF1aXZhbGVudCBjb2xvciBkb2VzIG5vdCBleGlzdC4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGN0aW1lPgotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiaHdjQ29sb3JFcXVpdlRlc3QiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dGVzdFV0aWwuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KLQotI2luY2x1ZGUgImh3Y1Rlc3RMaWIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi0vLyBEZWZhdWx0cyBmb3IgY29tbWFuZC1saW5lIG9wdGlvbnMKLWNvbnN0IGJvb2wgZGVmYXVsdFZlcmJvc2UgPSBmYWxzZTsKLWNvbnN0IENvbG9yRnJhY3QgZGVmYXVsdFN0YXJ0Q29sb3IoMC4wLCAwLjAsIDAuMCk7Ci1jb25zdCBDb2xvckZyYWN0IGRlZmF1bHRFbmRDb2xvcigxLjAsIDEuMCwgMS4wKTsKLWNvbnN0IGNoYXIgKmRlZmF1bHRSZWZGb3JtYXQgPSAiUkdCQTg4ODgiOwotY29uc3QgZmxvYXQgZGVmYXVsdEVuZERlbGF5ID0gMi4wOyAvLyBEZWZhdWx0IGRlbGF5IGFmdGVyIHJlbmRlcmluZyBncmFwaGljcwotCi0vLyBEZWZpbmVzCi0jZGVmaW5lIE1BWFNUUiAgICAgICAgICAgICAgIDEwMAotI2RlZmluZSBNQVhDTUQgICAgICAgICAgICAgICAyMDAKLSNkZWZpbmUgQklUU1BFUkJZVEUgICAgICAgICAgICA4IC8vIFRPRE86IE9idGFpbiBmcm9tIDx2YWx1ZXMuaD4sIG9uY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGhhcyBiZWVuIGFkZGVkCi0KLSNkZWZpbmUgQ01EX1NUT1BfRlJBTUVXT1JLICAgInN0b3AgMj4mMSIKLSNkZWZpbmUgQ01EX1NUQVJUX0ZSQU1FV09SSyAgInN0YXJ0IDI+JjEiCi0KLS8vIE1hY3JvcwotI2RlZmluZSBOVU1BKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYSBbMF0pKSAvLyBOdW0gZWxlbWVudHMgaW4gYW4gYXJyYXkKLSNkZWZpbmUgTUVNQ0xSKGFkZHIsIHNpemUpIGRvIHsgXAotICAgICAgICBtZW1zZXQoKGFkZHIpLCAwLCAoc2l6ZSkpOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLy8gR2xvYmFscwotc3RhdGljIGNvbnN0IGludCB0ZXhVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkUgfAotICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19XUklURV9SQVJFTFk7Ci1zdGF0aWMgaHdjX2NvbXBvc2VyX2RldmljZV90ICpod2NEZXZpY2U7Ci1zdGF0aWMgRUdMRGlzcGxheSBkcHk7Ci1zdGF0aWMgRUdMU3VyZmFjZSBzdXJmYWNlOwotc3RhdGljIEVHTGludCB3aWR0aCwgaGVpZ2h0OwotCi0vLyBGdW5jdGlvbnMgcHJvdG90eXBlcwotdm9pZCBpbml0KHZvaWQpOwotdm9pZCBwcmludFN5bnRheChjb25zdCBjaGFyICpjbWQpOwotCi0vLyBDb21tYW5kLWxpbmUgb3B0aW9uIHNldHRpbmdzCi1zdGF0aWMgYm9vbCB2ZXJib3NlID0gZGVmYXVsdFZlcmJvc2U7Ci1zdGF0aWMgQ29sb3JGcmFjdCBzdGFydFJlZkNvbG9yID0gZGVmYXVsdFN0YXJ0Q29sb3I7Ci1zdGF0aWMgQ29sb3JGcmFjdCBlbmRSZWZDb2xvciA9IGRlZmF1bHRFbmRDb2xvcjsKLXN0YXRpYyBmbG9hdCBlbmREZWxheSA9IGRlZmF1bHRFbmREZWxheTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgKnJlZkZvcm1hdAotICAgID0gaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAoZGVmYXVsdFJlZkZvcm1hdCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICplcXVpdkZvcm1hdDsKLQotLyoKLSAqIE1haW4KLSAqCi0gKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGhpZ2gtbGV2ZWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9uczoKLSAqCi0gKiAgIDEuIENvbW1hbmQtbGluZSBwYXJzaW5nCi0gKgotICogICAyLiBTdG9wIGZyYW1ld29yawotICoKLSAqICAgMy4gSW5pdGlhbGl6YXRpb24KLSAqCi0gKiAgIDQuIENyZWF0ZSBIYXJkd2FyZSBDb21wb3NlciBkZXNjcmlwdGlvbiBvZiByZWZlcmVuY2UgYW5kIGVxdWl2YWxlbmNlIGZyYW1lcwotICoKLSAqICAgNS4gSGF2ZSBIYXJkd2FyZSBDb21wb3NlciByZW5kZXIgdGhlIHJlZmVyZW5jZSBhbmQgZXF1aXZhbGVuY2UgZnJhbWVzCi0gKgotICogICA2LiBEZWxheSBmb3IgYW1vdW50IG9mIHRpbWUgZ2l2ZW4gYnkgZW5kRGVsYXkKLSAqCi0gKiAgIDcuIFN0YXJ0IGZyYW1ld29yawotICovCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgcnYsIG9wdDsKLSAgICBib29sIGVycm9yOwotICAgIGNoYXIgKmNocHRyOwotICAgIHVuc2lnbmVkIGludCBwYXNzOwotICAgIGNoYXIgY21kW01BWENNRF07Ci0gICAgc3RyaW5nIHN0cjsKLQotICAgIHRlc3RTZXRMb2dDYXRUYWcoTE9HX1RBRyk7Ci0KLSAgICBhc3NlcnQocmVmRm9ybWF0ICE9IE5VTEwpOwotCi0gICAgdGVzdFNldExvZ0NhdFRhZyhMT0dfVEFHKTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAidnM6ZTpyOkQ6P2giKSkgIT0gLTEpIHsKLSAgICAgICAgc3dpdGNoIChvcHQpIHsKLSAgICAgICAgICBjYXNlICdEJzogLy8gRW5kIG9mIHRlc3QgZGVsYXkKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXkgYmV0d2VlbiBjb21wbGV0aW9uIG9mIGZpbmFsIHBhc3MgYW5kIHJlc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgLy8gb2YgZnJhbWV3b3JrCi0gICAgICAgICAgICBlbmREZWxheSA9IHN0cnRvZChvcHRhcmcsICZjaHB0cik7Ci0gICAgICAgICAgICBpZiAoKCpjaHB0ciAhPSAnXDAnKSB8fCAoZW5kRGVsYXkgPCAwLjApKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGVuZCBvZiB0ZXN0IGRlbGF5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZjogJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3MnOiAvLyBTdGFydGluZyByZWZlcmVuY2UgY29sb3IKLSAgICAgICAgICAgIHN0ciA9IG9wdGFyZzsKLSAgICAgICAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCphcmd2W29wdGluZF0gPT0gJy0nKSB7IGJyZWFrOyB9Ci0gICAgICAgICAgICAgICAgY2hhciBlbmRDaGFyID0gKHN0ci5sZW5ndGgoKSA+IDEpID8gc3RyW3N0ci5sZW5ndGgoKSAtIDFdIDogMDsKLSAgICAgICAgICAgICAgICBpZiAoKGVuZENoYXIgPT0gJz4nKSB8fCAoZW5kQ2hhciA9PSAnXScpKSB7IGJyZWFrOyB9Ci0gICAgICAgICAgICAgICAgc3RyICs9ICIgIiArIHN0cmluZyhhcmd2W29wdGluZCsrXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXN0cmluZ3N0cmVhbSBpbihzdHIpOwotICAgICAgICAgICAgICAgIHN0YXJ0UmVmQ29sb3IgPSBod2NUZXN0UGFyc2VDb2xvcihpbiwgZXJyb3IpOwotICAgICAgICAgICAgICAgIC8vIEFueSBwYXJzZSBlcnJvciBvciBjaGFyYWN0ZXJzIG5vdCB1c2VkIGJ5IHBhcnNlcgotICAgICAgICAgICAgICAgIGlmIChlcnJvcgotICAgICAgICAgICAgICAgICAgICB8fCAoKCh1bnNpZ25lZCBpbnQpIGluLnRlbGxnKCkgIT0gaW4uc3RyKCkubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoaW4udGVsbGcoKSAhPSAoc3RyZWFtcG9zKSAtMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBzdGFydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBjb2xvciBvZjogJXMiLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdlJzogLy8gRW5kaW5nIHJlZmVyZW5jZSBjb2xvcgotICAgICAgICAgICAgc3RyID0gb3B0YXJnOwotICAgICAgICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKLSAgICAgICAgICAgICAgICBpZiAoKmFyZ3Zbb3B0aW5kXSA9PSAnLScpIHsgYnJlYWs7IH0KLSAgICAgICAgICAgICAgICBjaGFyIGVuZENoYXIgPSAoc3RyLmxlbmd0aCgpID4gMSkgPyBzdHJbc3RyLmxlbmd0aCgpIC0gMV0gOiAwOwotICAgICAgICAgICAgICAgIGlmICgoZW5kQ2hhciA9PSAnPicpIHx8IChlbmRDaGFyID09ICddJykpIHsgYnJlYWs7IH0KLSAgICAgICAgICAgICAgICBzdHIgKz0gIiAiICsgc3RyaW5nKGFyZ3Zbb3B0aW5kKytdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpc3RyaW5nc3RyZWFtIGluKHN0cik7Ci0gICAgICAgICAgICAgICAgZW5kUmVmQ29sb3IgPSBod2NUZXN0UGFyc2VDb2xvcihpbiwgZXJyb3IpOwotICAgICAgICAgICAgICAgIC8vIEFueSBwYXJzZSBlcnJvciBvciBjaGFyYWN0ZXJzIG5vdCB1c2VkIGJ5IHBhcnNlcgotICAgICAgICAgICAgICAgIGlmIChlcnJvcgotICAgICAgICAgICAgICAgICAgICB8fCAoKCh1bnNpZ25lZCBpbnQpIGluLnRlbGxnKCkgIT0gaW4uc3RyKCkubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoaW4udGVsbGcoKSAhPSAoc3RyZWFtcG9zKSAtMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBlbmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UgY29sb3Igb2Y6ICVzIiwgc3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAncic6IC8vIFJlZmVyZW5jZSBncmFwaGljIGZvcm1hdAotICAgICAgICAgICAgcmVmRm9ybWF0ID0gaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAob3B0YXJnKTsKLSAgICAgICAgICAgIGlmIChyZWZGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIlVua293biBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIHJlZmVyZW5jZSBncmFwaGljICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgb2Y6ICVzIiwgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBwcmludFN5bnRheChiYXNlbmFtZShhcmd2WzBdKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAndic6IC8vIFZlcmJvc2UKLSAgICAgICAgICAgIHZlcmJvc2UgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdoJzogLy8gSGVscAotICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwcmludFN5bnRheChiYXNlbmFtZShhcmd2WzBdKSk7Ci0gICAgICAgICAgICBleGl0KCgob3B0b3B0ID09IDApIHx8IChvcHRvcHQgPT0gJz8nKSkgPyAwIDogNSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBFeHBlY3QgYSBzaW5nbGUgcG9zaXRpb25hbCBwYXJhbWV0ZXIsIHdoaWNoIHNwZWNpZmllcyB0aGUKLSAgICAvLyBlcXVpdmFsZW5jZSBncmFwaGljIGZvcm1hdC4KLSAgICBpZiAoYXJnYyAhPSAob3B0aW5kICsgMSkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiRXhwZWN0ZWQgYSBzaW5nbGUgY29tbWFuZC1saW5lIHBvc3Rpb25hbCBwYXJhbWV0ZXIiKTsKLSAgICAgICAgcHJpbnRTeW50YXgoYmFzZW5hbWUoYXJndlswXSkpOwotICAgICAgICBleGl0KDYpOwotICAgIH0KLSAgICBlcXVpdkZvcm1hdCA9IGh3Y1Rlc3RHcmFwaGljRm9ybWF0TG9va3VwKGFyZ3Zbb3B0aW5kXSk7Ci0gICAgaWYgKGVxdWl2Rm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5rb3duIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgZXF1aXZhbGVuY2UgZ3JhcGhpYyAiCi0gICAgICAgICAgICAgICAgICAgImZvcm1hdCBvZjogJXMiLCBhcmd2W29wdGluZF0pOwotICAgICAgICBwcmludFN5bnRheChiYXNlbmFtZShhcmd2WzBdKSk7Ci0gICAgICAgIGV4aXQoNyk7Ci0gICAgfQotCi0gICAgdGVzdFByaW50SSgicmVmRm9ybWF0OiAldSAlcyIsIHJlZkZvcm1hdC0+Zm9ybWF0LCByZWZGb3JtYXQtPmRlc2MpOwotICAgIHRlc3RQcmludEkoImVxdWl2Rm9ybWF0OiAldSAlcyIsIGVxdWl2Rm9ybWF0LT5mb3JtYXQsIGVxdWl2Rm9ybWF0LT5kZXNjKTsKLSAgICB0ZXN0UHJpbnRJKCJzdGFydFJlZkNvbG9yOiAlcyIsICgoc3RyaW5nKSBzdGFydFJlZkNvbG9yKS5jX3N0cigpKTsKLSAgICB0ZXN0UHJpbnRJKCJlbmRSZWZDb2xvcjogJXMiLCAoKHN0cmluZykgZW5kUmVmQ29sb3IpLmNfc3RyKCkpOwotICAgIHRlc3RQcmludEkoImVuZERlbGF5OiAlZiIsIGVuZERlbGF5KTsKLQotICAgIC8vIFN0b3AgZnJhbWV3b3JrCi0gICAgcnYgPSBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJXMiLCBDTURfU1RPUF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUT1BfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCg4KTsKLSAgICB9Ci0gICAgdGVzdEV4ZWNDbWQoY21kKTsKLSAgICB0ZXN0RGVsYXkoMS4wKTsgLy8gVE9ETyAtIG5lZWRzIG1lYW5zIHRvIHF1ZXJ5IHdoZXRoZXIgYXN5bmNocm9ub3VzIHN0b3AKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWV3b3JrIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiAgRm9yIG5vdywganVzdCB3YWl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGEgbG9uZyB0aW1lLgotCi0gICAgaW5pdCgpOwotCi0gICAgLy8gVXNlIHRoZSB1cHBlciB0aGlyZCBvZiB0aGUgZGlzcGxheSBmb3IgdGhlIHJlZmVyZW5jZSBmcmFtZSBhbmQKLSAgICAvLyB0aGUgbWlkZGxlIHRoaXJkIGZvciB0aGUgZXF1aXZhbGVuY2UgZnJhbWUuCi0gICAgdW5zaWduZWQgaW50IHJlZkhlaWdodCA9IGhlaWdodCAvIDM7Ci0gICAgdW5zaWduZWQgaW50IHJlZlBvc1kgPSAwOyAvLyBSZWZlcmVuY2UgZnJhbWUgWSBwb3NpdGlvbgotICAgIHVuc2lnbmVkIGludCByZWZQb3NYID0gMDsgLy8gUmVmZXJlbmNlIGZyYW1lIFggcG9zaXRpb24KLSAgICB1bnNpZ25lZCBpbnQgcmVmV2lkdGggPSB3aWR0aCAtIHJlZlBvc1g7Ci0gICAgaWYgKChyZWZXaWR0aCAmIHJlZkZvcm1hdC0+d01vZCkgIT0gMCkgewotICAgICAgICByZWZXaWR0aCArPSByZWZGb3JtYXQtPndNb2QgLSAocmVmV2lkdGggJSByZWZGb3JtYXQtPndNb2QpOwotICAgIH0KLSAgICB1bnNpZ25lZCBpbnQgZXF1aXZIZWlnaHQgPSBoZWlnaHQgLyAzOwotICAgIHVuc2lnbmVkIGludCBlcXVpdlBvc1kgPSByZWZIZWlnaHQ7IC8vIEVxdWl2YWxlbmNlIGZyYW1lIFkgcG9zaXRpb24KLSAgICB1bnNpZ25lZCBpbnQgZXF1aXZQb3NYID0gMDsgICAgICAgICAvLyBFcXVpdmFsZW5jZSBmcmFtZSBYIHBvc2l0aW9uCi0gICAgdW5zaWduZWQgaW50IGVxdWl2V2lkdGggPSB3aWR0aCAtIGVxdWl2UG9zWDsKLSAgICBpZiAoKGVxdWl2V2lkdGggJiBlcXVpdkZvcm1hdC0+d01vZCkgIT0gMCkgewotICAgICAgICBlcXVpdldpZHRoICs9IGVxdWl2Rm9ybWF0LT53TW9kIC0gKGVxdWl2V2lkdGggJSBlcXVpdkZvcm1hdC0+d01vZCk7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHJlZmVyZW5jZSBhbmQgZXF1aXZhbGVuY2UgZ3JhcGhpYyBidWZmZXJzCi0gICAgY29uc3QgdW5zaWduZWQgaW50IG51bUZyYW1lcyA9IDI7Ci0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gcmVmRnJhbWU7Ci0gICAgcmVmRnJhbWUgPSBuZXcgR3JhcGhpY0J1ZmZlcihyZWZXaWR0aCwgcmVmSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmRm9ybWF0LT5mb3JtYXQsIHRleFVzYWdlKTsKLSAgICBpZiAoKHJ2ID0gcmVmRnJhbWUtPmluaXRDaGVjaygpKSAhPSBOT19FUlJPUikgewotICAgICAgICB0ZXN0UHJpbnRFKCJyZWZGcmFtZSBpbml0Q2hlY2sgZmFpbGVkLCBydjogJWkiLCBydik7Ci0gICAgICAgIHRlc3RQcmludEUoIiAgd2lkdGggJXUgaGVpZ2h0OiAldSBmb3JtYXQ6ICV1ICVzIiwgcmVmV2lkdGgsIHJlZkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICByZWZGb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICBod2NUZXN0R3JhcGhpY0Zvcm1hdDJzdHIocmVmRm9ybWF0LT5mb3JtYXQpKTsKLSAgICAgICAgZXhpdCg5KTsKLSAgICB9Ci0gICAgdGVzdFByaW50SSgicmVmRnJhbWUgd2lkdGg6ICV1IGhlaWdodDogJXUgZm9ybWF0OiAldSAlcyIsCi0gICAgICAgICAgICAgICByZWZXaWR0aCwgcmVmSGVpZ2h0LCByZWZGb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgIGh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cihyZWZGb3JtYXQtPmZvcm1hdCkpOwotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gZXF1aXZGcmFtZTsKLSAgICBlcXVpdkZyYW1lID0gbmV3IEdyYXBoaWNCdWZmZXIoZXF1aXZXaWR0aCwgZXF1aXZIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWl2Rm9ybWF0LT5mb3JtYXQsIHRleFVzYWdlKTsKLSAgICBpZiAoKHJ2ID0gcmVmRnJhbWUtPmluaXRDaGVjaygpKSAhPSBOT19FUlJPUikgewotICAgICAgICB0ZXN0UHJpbnRFKCJyZWZGcmFtZSBpbml0Q2hlY2sgZmFpbGVkLCBydjogJWkiLCBydik7Ci0gICAgICAgIHRlc3RQcmludEUoIiAgd2lkdGggJXUgaGVpZ2h0OiAldSBmb3JtYXQ6ICV1ICVzIiwgcmVmV2lkdGgsIHJlZkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICByZWZGb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICBod2NUZXN0R3JhcGhpY0Zvcm1hdDJzdHIocmVmRm9ybWF0LT5mb3JtYXQpKTsKLSAgICAgICAgZXhpdCgxMCk7Ci0gICAgfQotICAgIHRlc3RQcmludEkoImVxdWl2RnJhbWUgd2lkdGg6ICV1IGhlaWdodDogJXUgZm9ybWF0OiAldSAlcyIsCi0gICAgICAgICAgICAgICBlcXVpdldpZHRoLCBlcXVpdkhlaWdodCwgZXF1aXZGb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgIGh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cihlcXVpdkZvcm1hdC0+Zm9ybWF0KSk7Ci0KLSAgICAvLyBGaWxsIHRoZSBmcmFtZXMgd2l0aCBhIGhvcml6b250YWwgYmxlbmQKLSAgICBod2NUZXN0RmlsbENvbG9ySEJsZW5kKHJlZkZyYW1lLmdldCgpLCByZWZGb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UmVmQ29sb3IsIGVuZFJlZkNvbG9yKTsKLSAgICBod2NUZXN0RmlsbENvbG9ySEJsZW5kKGVxdWl2RnJhbWUuZ2V0KCksIHJlZkZvcm1hdC0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRSZWZDb2xvciwgZW5kUmVmQ29sb3IpOwotCi0gICAgaHdjX2xheWVyX2xpc3RfdCAqbGlzdDsKLSAgICBzaXplX3Qgc2l6ZSA9IHNpemVvZihod2NfbGF5ZXJfbGlzdCkgKyBudW1GcmFtZXMgKiBzaXplb2YoaHdjX2xheWVyX3QpOwotICAgIGlmICgobGlzdCA9IChod2NfbGF5ZXJfbGlzdF90ICopIGNhbGxvYygxLCBzaXplKSkgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJBbGxvY2F0ZSBsaXN0IGZhaWxlZCIpOwotICAgICAgICBleGl0KDExKTsKLSAgICB9Ci0gICAgbGlzdC0+ZmxhZ3MgPSBIV0NfR0VPTUVUUllfQ0hBTkdFRDsKLSAgICBsaXN0LT5udW1Id0xheWVycyA9IG51bUZyYW1lczsKLQotICAgIGh3Y19sYXllcl90ICpsYXllciA9ICZsaXN0LT5od0xheWVyc1swXTsKLSAgICBsYXllci0+aGFuZGxlID0gcmVmRnJhbWUtPmhhbmRsZTsKLSAgICBsYXllci0+YmxlbmRpbmcgPSBIV0NfQkxFTkRJTkdfTk9ORTsKLSAgICBsYXllci0+c291cmNlQ3JvcC5sZWZ0ID0gMDsKLSAgICBsYXllci0+c291cmNlQ3JvcC50b3AgPSAwOwotICAgIGxheWVyLT5zb3VyY2VDcm9wLnJpZ2h0ID0gd2lkdGg7Ci0gICAgbGF5ZXItPnNvdXJjZUNyb3AuYm90dG9tID0gcmVmSGVpZ2h0OwotICAgIGxheWVyLT5kaXNwbGF5RnJhbWUubGVmdCA9IDA7Ci0gICAgbGF5ZXItPmRpc3BsYXlGcmFtZS50b3AgPSAwOwotICAgIGxheWVyLT5kaXNwbGF5RnJhbWUucmlnaHQgPSB3aWR0aDsKLSAgICBsYXllci0+ZGlzcGxheUZyYW1lLmJvdHRvbSA9IHJlZkhlaWdodDsKLSAgICBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbi5udW1SZWN0cyA9IDE7Ci0gICAgbGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4ucmVjdHMgPSAmbGF5ZXItPmRpc3BsYXlGcmFtZTsKLQotICAgIGxheWVyKys7Ci0gICAgbGF5ZXItPmhhbmRsZSA9IGVxdWl2RnJhbWUtPmhhbmRsZTsKLSAgICBsYXllci0+YmxlbmRpbmcgPSBIV0NfQkxFTkRJTkdfTk9ORTsKLSAgICBsYXllci0+c291cmNlQ3JvcC5sZWZ0ID0gMDsKLSAgICBsYXllci0+c291cmNlQ3JvcC50b3AgPSAwOwotICAgIGxheWVyLT5zb3VyY2VDcm9wLnJpZ2h0ID0gd2lkdGg7Ci0gICAgbGF5ZXItPnNvdXJjZUNyb3AuYm90dG9tID0gZXF1aXZIZWlnaHQ7Ci0gICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5sZWZ0ID0gMDsKLSAgICBsYXllci0+ZGlzcGxheUZyYW1lLnRvcCA9IHJlZkhlaWdodDsKLSAgICBsYXllci0+ZGlzcGxheUZyYW1lLnJpZ2h0ID0gd2lkdGg7Ci0gICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5ib3R0b20gPSBsYXllci0+ZGlzcGxheUZyYW1lLnRvcCArIGVxdWl2SGVpZ2h0OwotICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzID0gMTsKLSAgICBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbi5yZWN0cyA9ICZsYXllci0+ZGlzcGxheUZyYW1lOwotCi0gICAgLy8gUGVyZm9ybSBwcmVwYXJlIG9wZXJhdGlvbgotICAgIGlmICh2ZXJib3NlKSB7IHRlc3RQcmludEkoIlByZXBhcmU6Iik7IGh3Y1Rlc3REaXNwbGF5TGlzdChsaXN0KTsgfQotICAgIGh3Y0RldmljZS0+cHJlcGFyZShod2NEZXZpY2UsIGxpc3QpOwotICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIHRlc3RQcmludEkoIlBvc3QgUHJlcGFyZToiKTsKLSAgICAgICAgaHdjVGVzdERpc3BsYXlMaXN0UHJlcGFyZU1vZGlmaWFibGUobGlzdCk7Ci0gICAgfQotCi0gICAgLy8gVHVybiBvZmYgdGhlIGdlb21ldHJ5IGNoYW5nZWQgZmxhZwotICAgIGxpc3QtPmZsYWdzICY9IH5IV0NfR0VPTUVUUllfQ0hBTkdFRDsKLQotICAgIGlmICh2ZXJib3NlKSB7aHdjVGVzdERpc3BsYXlMaXN0SGFuZGxlcyhsaXN0KTsgfQotICAgIGh3Y0RldmljZS0+c2V0KGh3Y0RldmljZSwgZHB5LCBzdXJmYWNlLCBsaXN0KTsKLQotICAgIHRlc3REZWxheShlbmREZWxheSk7Ci0KLSAgICAvLyBTdGFydCBmcmFtZXdvcmsKLSAgICBydiA9IHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICIlcyIsIENNRF9TVEFSVF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUQVJUX0ZSQU1FV09SSyk7Ci0gICAgICAgIGV4aXQoMTIpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgaW5pdCh2b2lkKQotewotICAgIC8vIFNlZWQgcHNldWRvIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi0gICAgLy8gU2VlZGluZyBjYXVzZXMgZmlsbCBob3Jpem9udGFsIGJsZW5kIHRvIGZpbGwgdGhlIHBhZCBhcmVhIHdpdGgKLSAgICAvLyBhIGRldGVybWluaXN0aWMgc2V0IG9mIHZhbHVlcy4KLSAgICBzcmFuZDQ4KDApOwotCi0gICAgaHdjVGVzdEluaXREaXNwbGF5KHZlcmJvc2UsICZkcHksICZzdXJmYWNlLCAmd2lkdGgsICZoZWlnaHQpOwotCi0gICAgaHdjVGVzdE9wZW5Id2MoJmh3Y0RldmljZSk7Ci19Ci0KLXZvaWQgcHJpbnRTeW50YXgoY29uc3QgY2hhciAqY21kKQotewotICAgIHRlc3RQcmludEUoIiAgJXMgW29wdGlvbnNdIGdyYXBoaWNGb3JtYXQiLCBjbWQpOwotICAgIHRlc3RQcmludEUoIiAgICBvcHRpb25zOiIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC1zIDwwLiMjLCAwLiMjLCAwLiMjPiAtIFN0YXJ0aW5nIHJlZmVyZW5jZSBjb2xvciIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIC1lIDwwLiMjLCAwLiMjLCAwLiMjPiAtIEVuZGluZyByZWZlcmVuY2UgY29sb3IiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtciBmb3JtYXQgLSBSZWZlcmVuY2UgZ3JhcGhpYyBmb3JtYXQiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtRCAjLiMjIC0gRW5kIG9mIHRlc3QgZGVsYXkiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtdiBWZXJib3NlIik7Ci0gICAgdGVzdFByaW50RSgiIik7Ci0gICAgdGVzdFByaW50RSgiICAgIGdyYXBoaWMgZm9ybWF0czoiKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgTlVNQShod2NUZXN0R3JhcGhpY0Zvcm1hdCk7IG4xKyspIHsKLSAgICAgICAgdGVzdFByaW50RSgiICAgICAgJXMiLCBod2NUZXN0R3JhcGhpY0Zvcm1hdFtuMV0uZGVzYyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2h3Yy9od2NDb21taXQuY3BwIGIvb3BlbmdsL3Rlc3RzL2h3Yy9od2NDb21taXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE2NDZjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvaHdjQ29tbWl0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKgotICogSGFyZHdhcmUgQ29tcG9zZXIgQ29tbWl0IFBvaW50cwotICoKLSAqIFN5bm9wc2lzCi0gKiAgIGh3Y0NvbW1pdCBbb3B0aW9uc10gZ3JhcGhpY0Zvcm1hdCAuLi4KLSAqICAgICBvcHRpb25zOgotICogICAgICAgLXMgW3dpZHRoLCBoZWlnaHRdIC0gU3RhcnRpbmcgZGltZW5zaW9uCi0gKiAgICAgICAtdiAtIFZlcmJvc2UKLSAqCi0gKiAgICAgIGdyYXBoaWMgZm9ybWF0czoKLSAqICAgICAgICBSR0JBODg4OCAocmVmZXJlbmNlIGZyYW1lIGRlZmF1bHQpCi0gKiAgICAgICAgUkdCWDg4ODgKLSAqICAgICAgICBSR0I4ODgKLSAqICAgICAgICBSR0I1NjUKLSAqICAgICAgICBCR1JBODg4OAotICogICAgICAgIFJHQkE1NTUxCi0gKiAgICAgICAgUkdCQTQ0NDQKLSAqICAgICAgICBZVjEyCi0gKgotICogRGVzY3JpcHRpb24KLSAqICAgVGhlIEhhcmR3YXJlIENvbXBvc2VyIChIV0MpIENvbW1pdCB0ZXN0IGlzIGEgYmVuY2htYXJrIHRoYXQKLSAqICAgZGlzY292ZXJzIHRoZSBwb2ludHMgYXQgd2hpY2ggdGhlIEhXQyB3aWxsIGNvbW1pdCB0byByZW5kZXJpbmcgYW4KLSAqICAgb3ZlcmxheShzKS4gIEJlZm9yZSByZW5kZXJpbmcgYSBzZXQgb2Ygb3ZlcmxheXMsIHRoZSBIV0MgaXMgc2hvd24KLSAqICAgdGhlIGxpc3QgdGhyb3VnaCBhIHByZXBhcmUgY2FsbC4gIER1cmluZyB0aGUgcHJlcGFyZSBjYWxsIHRoZSBIV0MKLSAqICAgaXMgYWJsZSB0byBleGFtaW5lIHRoZSBsaXN0IGFuZCBzcGVjaWZ5IHdoaWNoIG92ZXJsYXlzIGl0IGlzIGFibGUKLSAqICAgdG8gaGFuZGxlLiAgVGhlIG92ZXJsYXlzIHRoYXQgaXQgY2FuJ3QgaGFuZGxlIGFyZSB0eXBpY2FsbHkgY29tcG9zaXRlZAotICogICBieSBhIGhpZ2hlciBsZXZlbCAoZS5nLiBTdXJmYWNlIEZsaW5nZXIpIGFuZCB0aGVuIHRoZSBvcmlnaW5hbCBsaXN0Ci0gKiAgIHBsdXMgYSBjb21wb3NpdCBvZiB3aGF0IEhXQyBwYXNzZWQgb24gYXJlIHByb3ZpZGVkIGJhY2sgdG8gdGhlIEhXQwotICogICBmb3IgcmVuZGVyaW5nLgotICoKLSAqICAgT25jZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSFdDIGhhcyBiZWVuIHNoaXBwZWQsIGEgcmVncmVzc2lvbiB3b3VsZAotICogICBsaWtlbHkgb2NjdXIgaWYgYSBsYXR0ZXIgaW1wbGVtZW50YXRpb24gc3RhcnRlZCBwYXNzaW5nIG9uIGNvbmRpdGlvbnMKLSAqICAgdGhhdCBpdCB1c2VkIHRvIGNvbW1pdCB0by4gIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBiZW5jaG1hcmsKLSAqICAgaXMgdGhlIGF1dG9tYXRlZCBkaXNjb3Zlcnkgb2YgdGhlIGNvbW1pdCBwb2ludHMsIHdoZXJlIGFuIGltcGxlbWVudGF0aW9uCi0gKiAgIGlzIG9uIHRoZSBlZGdlIGJldHdlZW4gY29tbWl0dGluZyBhbmQgbm90IGNvbW1pdHRpbmcuICBUaGVzZSBhcmUgY29tbW9ubHkKLSAqICAgcmVmZXJyZWQgdG8gYXMgY29tbWl0IHBvaW50cy4gIEJldHdlZW4gaW1wbGVtZW50YXRpb25zIGNoYW5nZXMgdG8gdGhlCi0gKiAgIGNvbW1pdCBwb2ludHMgYXJlIGFsbG93ZWQsIGFzIGxvbmcgYXMgdGhleSBpbXByb3ZlIHdoYXQgdGhlIEhXQyBjb21taXRzCi0gKiAgIHRvLiAgT25jZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSFdDIGlzIHNoaXBwZWQsIHRoZSBjb21taXQgcG9pbnRzIGFyZQotICogICBub3QgYWxsb3dlZCB0byByZWdyZXNzIGluIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMuCi0gKgotICogICBUaGlzIGJlbmNobWFyayB0YWtlcyBhIHNhbXBsaW5nIGFuZCB0aGVuIGFkanVzdHMgdW50aWwgaXQgZmluZHMgYQotICogICBjb21taXQgcG9pbnQuICBJdCBkb2Vzbid0IGV4aGF1c3RpdmVseSBjaGVjayBhbGwgcG9zc2libGUgY29uZGl0aW9ucywKLSAqICAgd2hpY2ggZG8gdG8gdGhlIG51bWJlciBvZiBjb21iaW5hdGlvbnMgd291bGQgYmUgaW1wb3NzaWJsZS4gIEluc3RlYWQKLSAqICAgaXQgc3RhcnRzIGl0cyBzZWFyY2ggZnJvbSBhIHN0YXJ0aW5nIGRpbWVuc2lvbiwgdGhhdCBjYW4gYmUgY2hhbmdlZAotICogICB2aWEgdGhlIC1zIG9wdGlvbi4gIFRoZSBzZWFyY2ggaXMgYWxzbyBib3VuZGVkIGJ5IGEgc2V0IG9mIHNlYXJjaAotICogICBsaW1pdHMsIHRoYXQgYXJlIGhhcmQtY29kZWQgaW50byBhIHN0cnVjdHVyZSBvZiBjb25zdGFudHMgbmFtZWQKLSAqICAgc2VhcmNoTGltaXRzLiAgUmVzdWx0cyB0aGF0IGhhcHBlbiB0byByZWFjaCBhIHNlYXJjaExpbWl0IGFyZSBwcmVmaXhlZAotICogICB3aXRoID49LCBzbyB0aGF0IGl0IGlzIGtub3duIHRoYXQgdGhlIHZhbHVlIGNvdWxkIHBvc3NpYmx5IGJlIGxhcmdlci4KLSAqCi0gKiAgIE1lYXN1cmVtZW50cyBhcmUgbWFkZSBmb3IgZWFjaCBvZiB0aGUgZ3JhcGhpYyBmb3JtYXRzIHNwZWNpZmllZCBhcwotICogICBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgb24gdGhlIGNvbW1hbmQtbGluZS4gIElmIG5vIGdyYXBoaWMgZm9ybWF0cwotICogICBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gYnkgZGVmYXVsdCBtZWFzdXJlbWVudHMgYXJlCi0gKiAgIG1hZGUgYW5kIHJlcG9ydGVkIGZvciBlYWNoIG9mIHRoZSBrbm93biBncmFwaGljIGZvcm1hdC4KLSAqLwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGNlcnJubz4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGN0aW1lPgotI2luY2x1ZGUgPGlvbWFuaXA+Ci0jaW5jbHVkZSA8aXN0cmVhbT4KLSNpbmNsdWRlIDxsaWJnZW4uaD4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHNjaGVkLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiaHdjQ29tbWl0VGVzdCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx0ZXN0VXRpbC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0jaW5jbHVkZSA8Z2xUZXN0TGliLmg+Ci0jaW5jbHVkZSAiaHdjVGVzdExpYi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIERlZmF1bHRzCi1jb25zdCBId2NUZXN0RGltIGRlZmF1bHRTdGFydERpbSA9IEh3Y1Rlc3REaW0oMTAwLCAxMDApOwotY29uc3QgYm9vbCBkZWZhdWx0VmVyYm9zZSA9IGZhbHNlOwotCi1jb25zdCB1aW50MzJfdCAgIGRlZmF1bHRGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKLWNvbnN0IGludDMyX3QgICAgZGVmYXVsdFRyYW5zZm9ybSA9IDA7Ci1jb25zdCB1aW50MzJfdCAgIGRlZmF1bHRCbGVuZCA9IEhXQ19CTEVORElOR19OT05FOwotY29uc3QgQ29sb3JGcmFjdCBkZWZhdWx0Q29sb3IoMC41LCAwLjUsIDAuNSk7Ci1jb25zdCBmbG9hdCAgICAgIGRlZmF1bHRBbHBoYSA9IDEuMDsgLy8gT3BhcXVlCi1jb25zdCBId2NUZXN0RGltIGRlZmF1bHRTb3VyY2VEaW0oMSwgMSk7Ci1jb25zdCBzdHJ1Y3QgaHdjX3JlY3QgZGVmYXVsdFNvdXJjZUNyb3AgPSB7MCwgMCwgMSwgMX07Ci1jb25zdCBzdHJ1Y3QgaHdjX3JlY3QgZGVmYXVsdERpc3BsYXlGcmFtZSA9IHswLCAwLCAxMDAsIDEwMH07Ci0KLS8vIEdsb2JhbCBDb25zdGFudHMKLWNvbnN0IHVpbnQzMl90IHByaW50RmllbGRXaWR0aCA9IDI7Ci1jb25zdCBzdHJ1Y3Qgc2VhcmNoTGltaXRzIHsKLSAgICB1aW50MzJfdCAgIG51bU92ZXJsYXlzOwotICAgIEh3Y1Rlc3REaW0gc291cmNlQ3JvcDsKLX0gc2VhcmNoTGltaXRzID0gewotICAgIDEwLAotICAgIEh3Y1Rlc3REaW0oMzAwMCwgMjAwMCksCi19OwotY29uc3Qgc3RydWN0IHRyYW5zZm9ybVR5cGUgewotICAgIGNvbnN0IGNoYXIgKmRlc2M7Ci0gICAgdWludDMyX3QgaWQ7Ci19IHRyYW5zZm9ybVR5cGVbXSA9IHsKLSAgICB7ImZsaXBoIiwgIEhXQ19UUkFOU0ZPUk1fRkxJUF9IfSwKLSAgICB7ImZsaXB2IiwgIEhXQ19UUkFOU0ZPUk1fRkxJUF9WfSwKLSAgICB7InJvdDkwIiwgIEhXQ19UUkFOU0ZPUk1fUk9UXzkwfSwKLSAgICB7InJvdDE4MCIsIEhXQ19UUkFOU0ZPUk1fUk9UXzE4MH0sCi0gICAgeyJyb3QyNzAiLCBIV0NfVFJBTlNGT1JNX1JPVF8yNzB9LAotfTsKLWNvbnN0IHN0cnVjdCBibGVuZFR5cGUgewotICAgIGNvbnN0IGNoYXIgKmRlc2M7Ci0gICAgdWludDMyX3QgaWQ7Ci19IGJsZW5kVHlwZVtdID0gewotICAgIHsibm9uZSIsIEhXQ19CTEVORElOR19OT05FfSwKLSAgICB7InByZW11bHQiLCBIV0NfQkxFTkRJTkdfUFJFTVVMVH0sCi0gICAgeyJjb3ZlcmFnZSIsIEhXQ19CTEVORElOR19DT1ZFUkFHRX0sCi19OwotCi0vLyBEZWZpbmVzCi0jZGVmaW5lIE1BWENNRCAgICAgICAgICAgICAgIDIwMAotI2RlZmluZSBDTURfU1RPUF9GUkFNRVdPUksgICAic3RvcCAyPiYxIgotI2RlZmluZSBDTURfU1RBUlRfRlJBTUVXT1JLICAic3RhcnQgMj4mMSIKLQotLy8gTWFjcm9zCi0jZGVmaW5lIE5VTUEoYSkgKHNpemVvZihhKSAvIHNpemVvZihhIFswXSkpIC8vIE51bSBlbGVtZW50cyBpbiBhbiBhcnJheQotCi0vLyBMb2NhbCB0eXBlcwotY2xhc3MgUmVjdGFuZ2xlIHsKLXB1YmxpYzoKLSAgICBSZWN0YW5nbGUodWludDMyX3QgZ3JhcGhpY0Zvcm1hdCA9IGRlZmF1bHRGb3JtYXQsCi0gICAgICAgICAgICAgIEh3Y1Rlc3REaW0gZGZEaW0gPSBId2NUZXN0RGltKDEsIDEpLAotICAgICAgICAgICAgICBId2NUZXN0RGltIHNEaW0gPSBId2NUZXN0RGltKDEsIDEpKTsKLSAgICB2b2lkIHNldFNvdXJjZURpbShId2NUZXN0RGltIGRpbSk7Ci0KLSAgICB1aW50MzJfdCAgICAgZm9ybWF0OwotICAgIHVpbnQzMl90ICAgICB0cmFuc2Zvcm07Ci0gICAgaW50MzJfdCAgICAgIGJsZW5kOwotICAgIENvbG9yRnJhY3QgICBjb2xvcjsKLSAgICBmbG9hdCAgICAgICAgYWxwaGE7Ci0gICAgSHdjVGVzdERpbSAgIHNvdXJjZURpbTsKLSAgICBzdHJ1Y3QgaHdjX3JlY3QgICBzb3VyY2VDcm9wOwotICAgIHN0cnVjdCBod2NfcmVjdCAgIGRpc3BsYXlGcmFtZTsKLX07Ci0KLWNsYXNzIFJhbmdlIHsKLXB1YmxpYzoKLSAgICBSYW5nZSh2b2lkKSA6IF9sKDApLCBfdSgwKSB7fQotICAgIFJhbmdlKHVpbnQzMl90IGxvd2VyLCB1aW50MzJfdCB1cHBlcikgOiBfbChsb3dlciksIF91KHVwcGVyKSB7fQotICAgIHVpbnQzMl90IGxvd2VyKHZvaWQpIHsgcmV0dXJuIF9sOyB9Ci0gICAgdWludDMyX3QgdXBwZXIodm9pZCkgeyByZXR1cm4gX3U7IH0KLQotICAgIG9wZXJhdG9yIHN0cmluZygpOwotCi1wcml2YXRlOgotICAgIHVpbnQzMl90IF9sOyAvLyBsb3dlcgotICAgIHVpbnQzMl90IF91OyAvLyB1cHBlcgotfTsKLQotUmFuZ2U6Om9wZXJhdG9yIHN0cmluZygpCi17Ci0gICAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgICBvdXQgPDwgJ1snIDw8IF9sIDw8ICIsICIgPDwgX3UgPDwgJ10nOwotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotY2xhc3MgUmF0aW9uYWwgewotcHVibGljOgotICAgIFJhdGlvbmFsKHZvaWQpIDogX24oMCksIF9kKDEpIHt9Ci0gICAgUmF0aW9uYWwodWludDMyX3QgbiwgdWludDMyX3QgZCkgOiBfbihuKSwgX2QoZCkge30KLSAgICB1aW50MzJfdCBudW1lcmF0b3Iodm9pZCkgeyByZXR1cm4gX247IH0KLSAgICB1aW50MzJfdCBkZW5vbWluYXRvcih2b2lkKSB7IHJldHVybiBfZDsgfQotICAgIHZvaWQgc2V0TnVtZXJhdG9yKHVpbnQzMl90IG51bWVyYXRvcikgeyBfbiA9IG51bWVyYXRvcjsgfQotCi0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJhdGlvbmFsJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJhdGlvbmFsJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KLSAgICBib29sIG9wZXJhdG9yPChjb25zdCBSYXRpb25hbCYgb3RoZXIpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFJhdGlvbmFsJiBvdGhlcikgY29uc3QgewotICAgICAgICByZXR1cm4gKCEoKnRoaXMgPT0gb3RoZXIpICYmICEoKnRoaXMgPCBvdGhlcikpOwotICAgIH0KLSAgICBzdGF0aWMgdm9pZCBkb3VibGUyUmF0aW9uYWwoZG91YmxlIGYsIFJhbmdlIG5SYW5nZSwgUmFuZ2UgZFJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhdGlvbmFsJiBsb3dlciwgUmF0aW9uYWwmIHVwcGVyKTsKLSAgICAgICAgCi0gICAgb3BlcmF0b3Igc3RyaW5nKCkgY29uc3Q7Ci0gICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3QgeyByZXR1cm4gKGRvdWJsZSkgX24gLyAoZG91YmxlKSBfZDsgfQotCi0KLXByaXZhdGU6Ci0gICAgdWludDMyX3QgX247Ci0gICAgdWludDMyX3QgX2Q7Ci19OwotCi0vLyBHbG9iYWxzCi1zdGF0aWMgY29uc3QgaW50IHRleFVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8Ci0gICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1dSSVRFX1JBUkVMWTsKLXN0YXRpYyBod2NfY29tcG9zZXJfZGV2aWNlX3QgKmh3Y0RldmljZTsKLXN0YXRpYyBFR0xEaXNwbGF5IGRweTsKLXN0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7Ci1zdGF0aWMgRUdMaW50IHdpZHRoLCBoZWlnaHQ7Ci1zdGF0aWMgc2l6ZV90IG1heEhlYWRpbmdMZW47Ci1zdGF0aWMgdmVjdG9yPHN0cmluZz4gZm9ybWF0czsKLQotLy8gTWVhc3VyZW1lbnRzCi1zdHJ1Y3QgbWVhcyB7Ci0gICAgdWludDMyX3QgZm9ybWF0OwotICAgIHVpbnQzMl90IHN0YXJ0RGltT3ZlcmxheXM7Ci0gICAgdWludDMyX3QgbWF4Tm9uT3ZlcmxhcHBpbmc7Ci0gICAgdWludDMyX3QgbWF4T3ZlcmxhcHBpbmc7Ci0gICAgbGlzdDx1aW50MzJfdD4gdHJhbnNmb3JtczsKLSAgICBsaXN0PHVpbnQzMl90PiBibGVuZHM7Ci0gICAgc3RydWN0IGRpc3BsYXlGcmFtZSB7Ci0gICAgICAgIHVpbnQzMl90IG1pbldpZHRoOwotICAgICAgICB1aW50MzJfdCBtaW5IZWlnaHQ7Ci0gICAgICAgIEh3Y1Rlc3REaW0gbWluRGltOwotICAgICAgICB1aW50MzJfdCBtYXhXaWR0aDsKLSAgICAgICAgdWludDMyX3QgbWF4SGVpZ2h0OwotICAgICAgICBId2NUZXN0RGltIG1heERpbTsKLSAgICB9IGRmOwotICAgIHN0cnVjdCBzb3VyY2VDcm9wIHsKLSAgICAgICAgdWludDMyX3QgbWluV2lkdGg7Ci0gICAgICAgIHVpbnQzMl90IG1pbkhlaWdodDsKLSAgICAgICAgSHdjVGVzdERpbSBtaW5EaW07Ci0gICAgICAgIHVpbnQzMl90IG1heFdpZHRoOwotICAgICAgICB1aW50MzJfdCBtYXhIZWlnaHQ7Ci0gICAgICAgIEh3Y1Rlc3REaW0gbWF4RGltOwotICAgICAgICBSYXRpb25hbCBoU2NhbGU7Ci0gICAgICAgIEh3Y1Rlc3REaW0gaFNjYWxlQmVzdERmOwotICAgICAgICBId2NUZXN0RGltIGhTY2FsZUJlc3RTYzsKLSAgICAgICAgUmF0aW9uYWwgdlNjYWxlOwotICAgICAgICBId2NUZXN0RGltIHZTY2FsZUJlc3REZjsKLSAgICAgICAgSHdjVGVzdERpbSB2U2NhbGVCZXN0U2M7Ci0gICAgfSBzYzsKLSAgICB2ZWN0b3I8dWludDMyX3Q+IG92ZXJsYXBCbGVuZE5vbmU7Ci0gICAgdmVjdG9yPHVpbnQzMl90PiBvdmVybGFwQmxlbmRQcmVtdWx0OwotICAgIHZlY3Rvcjx1aW50MzJfdD4gb3ZlcmxhcEJsZW5kQ292ZXJhZ2U7Ci19OwotdmVjdG9yPG1lYXM+IG1lYXN1cmVtZW50czsKLQotLy8gRnVuY3Rpb24gcHJvdG90eXBlcwotdWludDMyX3QgbnVtT3ZlcmxheXMobGlzdDxSZWN0YW5nbGU+JiByZWN0TGlzdCk7Ci11aW50MzJfdCBtYXhPdmVybGF5cyh1aW50MzJfdCBmb3JtYXQsIGJvb2wgYWxsb3dPdmVybGFwKTsKLWxpc3Q8dWludDMyX3Q+IHN1cHBvcnRlZFRyYW5zZm9ybXModWludDMyX3QgZm9ybWF0KTsKLWxpc3Q8dWludDMyX3Q+IHN1cHBvcnRlZEJsZW5kcyh1aW50MzJfdCBmb3JtYXQpOwotdWludDMyX3QgZGZNaW5XaWR0aCh1aW50MzJfdCBmb3JtYXQpOwotdWludDMyX3QgZGZNaW5IZWlnaHQodWludDMyX3QgZm9ybWF0KTsKLXVpbnQzMl90IGRmTWF4V2lkdGgodWludDMyX3QgZm9ybWF0KTsKLXVpbnQzMl90IGRmTWF4SGVpZ2h0KHVpbnQzMl90IGZvcm1hdCk7Ci1Id2NUZXN0RGltIGRmTWluRGltKHVpbnQzMl90IGZvcm1hdCk7Ci1Id2NUZXN0RGltIGRmTWF4RGltKHVpbnQzMl90IGZvcm1hdCk7Ci11aW50MzJfdCBzY01pbldpZHRoKHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pOwotdWludDMyX3Qgc2NNaW5IZWlnaHQodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSk7Ci11aW50MzJfdCBzY01heFdpZHRoKHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pOwotdWludDMyX3Qgc2NNYXhIZWlnaHQodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSk7Ci1Id2NUZXN0RGltIHNjTWluRGltKHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pOwotSHdjVGVzdERpbSBzY01heERpbSh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKTsKLVJhdGlvbmFsIHNjSFNjYWxlKHVpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWluLCBjb25zdCBId2NUZXN0RGltJiBkZk1heCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIHNjTWluLCBjb25zdCBId2NUZXN0RGltJiBzY01heCwKLSAgICAgICAgICAgICAgICAgIEh3Y1Rlc3REaW0mIG91dEJlc3REZiwgSHdjVGVzdERpbSYgb3V0QmVzdFNjKTsKLVJhdGlvbmFsIHNjVlNjYWxlKHVpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWluLCBjb25zdCBId2NUZXN0RGltJiBkZk1heCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIHNjTWluLCBjb25zdCBId2NUZXN0RGltJiBzY01heCwKLSAgICAgICAgICAgICAgICAgIEh3Y1Rlc3REaW0mIG91dEJlc3REZiwgSHdjVGVzdERpbSYgb3V0QmVzdFNjKTsKLXVpbnQzMl90IG51bU92ZXJsYXBwaW5nKHVpbnQzMl90IGJhY2tncm91bmRGb3JtYXQsIHVpbnQzMl90IGZvcmVncm91bmRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYWNrZ3JvdW5kQmxlbmQsIHVpbnQzMl90IGZvcmVncm91bmRCbGVuZCk7Ci1zdHJpbmcgdHJhbnNmb3JtTGlzdDJzdHIoY29uc3QgbGlzdDx1aW50MzJfdD4mIHRyYW5zZm9ybUxpc3QpOwotc3RyaW5nIGJsZW5kTGlzdDJzdHIoY29uc3QgbGlzdDx1aW50MzJfdD4mIGJsZW5kTGlzdCk7Ci12b2lkIGluaXQodm9pZCk7Ci12b2lkIHByaW50Rm9ybWF0SGVhZGluZ3Moc2l6ZV90IGluZGVudCk7Ci12b2lkIHByaW50T3ZlcmxhcExpbmUoc2l6ZV90IGluZGVudCwgY29uc3Qgc3RyaW5nIGZvcm1hdFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dWludDMyX3Q+JiByZXN1bHRzKTsKLXZvaWQgcHJpbnRTeW50YXgoY29uc3QgY2hhciAqY21kKTsKLQotLy8gQ29tbWFuZC1saW5lIG9wdGlvbiBzZXR0aW5ncwotc3RhdGljIGJvb2wgdmVyYm9zZSA9IGRlZmF1bHRWZXJib3NlOwotc3RhdGljIEh3Y1Rlc3REaW0gc3RhcnREaW0gPSBkZWZhdWx0U3RhcnREaW07Ci0KLS8qCi0gKiBNYWluCi0gKgotICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyBoaWdoLWxldmVsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnM6Ci0gKgotICogICAxLiBDb21tYW5kLWxpbmUgcGFyc2luZwotICoKLSAqICAgMi4gRm9ybSBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIHNwZWNpZmllZCBncmFwaGljIGZvcm1hdHMuICBJZgotICogICAgICBubyBmb3JtYXRzIGFyZSBzcGVjaWZpZWQsIHRoZW4gZm9ybSBhIGxpc3Qgb2YgYWxsIGtub3duIGZvcm1hdHMuCi0gKgotICogICAzLiBTdG9wIGZyYW1ld29yawotICogICAgICBPbmx5IG9uZSB1c2VyIGF0IGEgdGltZSBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgSFdDLiAgU3VyZmFjZQotICogICAgICBGbGluZ2VyIHVzZXMgdGhlIEhXQyBhbmQgaXMgcGFydCBvZiB0aGUgZnJhbWV3b3JrLiAgTmVlZCB0bwotICogICAgICBzdG9wIHRoZSBmcmFtZXdvcmsgc28gdGhhdCBTdXJmYWNlIEZsaW5nZXIgd2lsbCBzdG9wIHVzaW5nCi0gKiAgICAgIHRoZSBIV0MuCi0gKiAgIAotICogICA0LiBJbml0aWFsaXphdGlvbgotICoKLSAqICAgNS4gRm9yIGVhY2ggZ3JhcGhpYyBmb3JtYXQgaW4gdGhlIHByZXZpb3VzbHkgZm9ybWVkIGxpc3QgcGVyZm9ybQotICogICAgICBtZWFzdXJlbWVudHMgb24gdGhhdCBmb3JtYXQgYW5kIHJlcG9ydCB0aGUgcmVzdWx0cy4KLSAqCi0gKiAgIDYuIFN0YXJ0IGZyYW1ld29yawotICovCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgICAgIHJ2LCBvcHQ7Ci0gICAgY2hhciAgICpjaHB0cjsKLSAgICBib29sICAgIGVycm9yOwotICAgIHN0cmluZyAgc3RyOwotICAgIGNoYXIgY21kW01BWENNRF07Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotCi0gICAgdGVzdFNldExvZ0NhdFRhZyhMT0dfVEFHKTsKLQotICAgIC8vIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgICB3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiczp2P2giKSkgIT0gLTEpIHsKLSAgICAgICAgc3dpdGNoIChvcHQpIHsKLQotICAgICAgICAgIGNhc2UgJ3MnOiAvLyBTdGFydCBEaW1lbnNpb24KLSAgICAgICAgICAgIC8vIFVzZSBhcmd1bWVudHMgdW50aWwgbmV4dCBzdGFydHMgd2l0aCBhIGRhc2gKLSAgICAgICAgICAgIC8vIG9yIGN1cnJlbnQgZW5kcyB3aXRoIGEgPiBvciBdCi0gICAgICAgICAgICBzdHIgPSBvcHRhcmc7Ci0gICAgICAgICAgICB3aGlsZSAob3B0aW5kIDwgYXJnYykgewotICAgICAgICAgICAgICAgIGlmICgqYXJndltvcHRpbmRdID09ICctJykgeyBicmVhazsgfQotICAgICAgICAgICAgICAgIGNoYXIgZW5kQ2hhciA9IChzdHIubGVuZ3RoKCkgPiAxKSA/IHN0cltzdHIubGVuZ3RoKCkgLSAxXSA6IDA7Ci0gICAgICAgICAgICAgICAgaWYgKChlbmRDaGFyID09ICc+JykgfHwgKGVuZENoYXIgPT0gJ10nKSkgeyBicmVhazsgfQotICAgICAgICAgICAgICAgIHN0ciArPSAiICIgKyBzdHJpbmcoYXJndltvcHRpbmQrK10pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlzdHJpbmdzdHJlYW0gaW4oc3RyKTsKLSAgICAgICAgICAgICAgICBzdGFydERpbSA9IGh3Y1Rlc3RQYXJzZURpbShpbiwgZXJyb3IpOwotICAgICAgICAgICAgICAgIC8vIEFueSBwYXJzZSBlcnJvciBvciBjaGFyYWN0ZXJzIG5vdCB1c2VkIGJ5IHBhcnNlcgotICAgICAgICAgICAgICAgIGlmIChlcnJvcgotICAgICAgICAgICAgICAgICAgICB8fCAoKCh1bnNpZ25lZCBpbnQpIGluLnRlbGxnKCkgIT0gaW4uc3RyKCkubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoaW4udGVsbGcoKSAhPSAoc3RyZWFtcG9zKSAtMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBzdGFydCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpbWVuc2lvbiBvZjogJXMiLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXQoOCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICd2JzogLy8gVmVyYm9zZQotICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2gnOiAvLyBIZWxwCi0gICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50U3ludGF4KGJhc2VuYW1lKGFyZ3ZbMF0pKTsKLSAgICAgICAgICAgIGV4aXQoKChvcHRvcHQgPT0gMCkgfHwgKG9wdG9wdCA9PSAnPycpKSA/IDAgOiAxMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBQb3NpdGlvbmFsIHBhcmFtZXRlcnMKLSAgICAvLyBQb3NpdGlvbmFsIHBhcmFtZXRlcnMgcHJvdmlkZSB0aGUgbmFtZXMgb2YgZ3JhcGhpYyBmb3JtYXRzIHRoYXQKLSAgICAvLyBtZWFzdXJlbWVudHMgYXJlIHRvIGJlIG1hZGUgb24uICBNZWFzdXJlbWVudHMgYXJlIG1hZGUgb24gYWxsCi0gICAgLy8ga25vd24gZ3JhcGhpYyBmb3JtYXRzIHdoZW4gbm8gcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSBwcm92aWRlZC4KLSAgICBpZiAob3B0aW5kID09IGFyZ2MpIHsKLSAgICAgICAgLy8gTm8gY29tbWFuZC1saW5lIHNwZWNpZmllZCBncmFwaGljIGZvcm1hdHMKLSAgICAgICAgLy8gQWRkIGFsbCBncmFwaGljIGZvcm1hdHMgdG8gdGhlIGxpc3Qgb2YgZm9ybWF0cyB0byBiZSBtZWFzdXJlZAotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgTlVNQShod2NUZXN0R3JhcGhpY0Zvcm1hdCk7IG4xKyspIHsKLSAgICAgICAgICAgIGZvcm1hdHMucHVzaF9iYWNrKGh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXS5kZXNjKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFkZCBuYW1lcyBvZiBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGdyYXBoaWMgZm9ybWF0cyB0byB0aGUKLSAgICAgICAgLy8gbGlzdCBvZiBmb3JtYXRzIHRvIGJlIHRlc3RlZAotICAgICAgICBmb3IgKDsgYXJndltvcHRpbmRdICE9IE5VTEw7IG9wdGluZCsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLnB1c2hfYmFjayhhcmd2W29wdGluZF0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRGV0ZXJtaW5lIGxlbmd0aCBvZiBsb25nZXN0IHNwZWNpZmllZCBncmFwaGljIGZvcm1hdC4KLSAgICAvLyBUaGlzIHZhbHVlIGlzIHVzZWQgZm9yIG91dHB1dCBmb3JtYXRpbmcKLSAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZvcm1hdHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGZvcm1hdHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgIG1heEhlYWRpbmdMZW4gPSBtYXgobWF4SGVhZGluZ0xlbiwgaXQtPmxlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICAvLyBTdG9wIGZyYW1ld29yawotICAgIHJ2ID0gc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIiVzIiwgQ01EX1NUT1BfRlJBTUVXT1JLKTsKLSAgICBpZiAocnYgPj0gKHNpZ25lZCkgc2l6ZW9mKGNtZCkgLSAxKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkNvbW1hbmQgdG9vIGxvbmcgZm9yOiAlcyIsIENNRF9TVE9QX0ZSQU1FV09SSyk7Ci0gICAgICAgIGV4aXQoMTQpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotICAgIHRlc3REZWxheSgxLjApOyAvLyBUT0RPIC0gbmVlZHMgbWVhbnMgdG8gcXVlcnkgd2hldGhlciBhc3luY2hyb25vdXMgc3RvcAotICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXdvcmsgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBGb3Igbm93LCBqdXN0IHdhaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBsb25nIHRpbWUuCi0KLSAgICB0ZXN0UHJpbnRJKCJzdGFydERpbTogJXMiLCAoKHN0cmluZykgc3RhcnREaW0pLmNfc3RyKCkpOwotCi0gICAgaW5pdCgpOwotCi0gICAgLy8gRm9yIGVhY2ggb2YgdGhlIGdyYXBoaWMgZm9ybWF0cwotICAgIGZvciAodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0Rm9ybWF0ID0gZm9ybWF0cy5iZWdpbigpOwotICAgICAgICAgaXRGb3JtYXQgIT0gZm9ybWF0cy5lbmQoKTsgKytpdEZvcm1hdCkgewotCi0gICAgICAgIC8vIExvY2F0ZSBod2NUZXN0TGliIHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyB0aGlzIGZvcm1hdAotICAgICAgICBjb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgKmZvcm1hdDsKLSAgICAgICAgZm9ybWF0ID0gaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAoKCppdEZvcm1hdCkuY19zdHIoKSk7Ci0gICAgICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgdGVzdFByaW50RSgiVW5rbm93biBncmFwaGljIGZvcm1hdCBvZjogJXMiLCAoKml0Rm9ybWF0KS5jX3N0cigpKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEaXNwbGF5IGZvcm1hdCBoZWFkZXIKLSAgICAgICAgdGVzdFByaW50SSgiZm9ybWF0OiAlcyIsIGZvcm1hdC0+ZGVzYyk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIGFyZWEgdG8gaG9sZCB0aGUgbWVhc3VyZW1lbnRzCi0gICAgICAgIHN0cnVjdCBtZWFzIG1lYXM7Ci0gICAgICAgIHN0cnVjdCBtZWFzICptZWFzUHRyOwotICAgICAgICBtZWFzLmZvcm1hdCA9IGZvcm1hdC0+Zm9ybWF0OwotICAgICAgICBtZWFzdXJlbWVudHMucHVzaF9iYWNrKG1lYXMpOwotICAgICAgICBtZWFzUHRyID0gJm1lYXN1cmVtZW50c1ttZWFzdXJlbWVudHMuc2l6ZSgpIC0gMV07Ci0KLSAgICAgICAgLy8gU3RhcnQgZGltZW5zaW9uIG51bSBvdmVybGF5cwotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQtPmZvcm1hdCwgc3RhcnREaW0pOwotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIG1lYXNQdHItPnN0YXJ0RGltT3ZlcmxheXMgPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgc3RhcnREaW1PdmVybGF5czogJXUiLCBtZWFzUHRyLT5zdGFydERpbU92ZXJsYXlzKTsKLQotICAgICAgICAvLyBTa2lwIHRoZSByZXN0IG9mIHRoZSBtZWFzdXJlbWVudHMsIHdoZW4gdGhlIHN0YXJ0IGRpbWVuc2lvbgotICAgICAgICAvLyBkb2Vzbid0IHByb2R1Y2UgYW4gb3ZlcmxheQotICAgICAgICBpZiAobWVhc1B0ci0+c3RhcnREaW1PdmVybGF5cyA9PSAwKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgLy8gTWF4IE92ZXJsYXlzCi0gICAgICAgIG1lYXNQdHItPm1heE5vbk92ZXJsYXBwaW5nID0gbWF4T3ZlcmxheXMoZm9ybWF0LT5mb3JtYXQsIGZhbHNlKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBtYXggbm9uT3ZlcmxhcHBpbmcgb3ZlcmxheXM6ICVzJXUiLAotICAgICAgICAgICAgICAgICAgIChtZWFzUHRyLT5tYXhOb25PdmVybGFwcGluZyA9PSBzZWFyY2hMaW1pdHMubnVtT3ZlcmxheXMpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIj49ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5tYXhOb25PdmVybGFwcGluZyk7Ci0gICAgICAgIG1lYXNQdHItPm1heE92ZXJsYXBwaW5nID0gbWF4T3ZlcmxheXMoZm9ybWF0LT5mb3JtYXQsIHRydWUpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIG1heCBPdmVybGFwcGluZyBvdmVybGF5czogJXMldSIsCi0gICAgICAgICAgICAgICAgICAgKG1lYXNQdHItPm1heE92ZXJsYXBwaW5nID09IHNlYXJjaExpbWl0cy5udW1PdmVybGF5cykKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiPj0gIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPm1heE92ZXJsYXBwaW5nKTsKLQotICAgICAgICAvLyBUcmFuc2Zvcm1zIGFuZCBibGVuZHMKLSAgICAgICAgbWVhc1B0ci0+dHJhbnNmb3JtcyA9IHN1cHBvcnRlZFRyYW5zZm9ybXMoZm9ybWF0LT5mb3JtYXQpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIHRyYW5zZm9ybXM6ICVzIiwKLSAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1MaXN0MnN0cihtZWFzUHRyLT50cmFuc2Zvcm1zKS5jX3N0cigpKTsKLSAgICAgICAgbWVhc1B0ci0+YmxlbmRzID0gc3VwcG9ydGVkQmxlbmRzKGZvcm1hdC0+Zm9ybWF0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBibGVuZHM6ICVzIiwKLSAgICAgICAgICAgICAgICAgICBibGVuZExpc3Qyc3RyKG1lYXNQdHItPmJsZW5kcykuY19zdHIoKSk7Ci0KLSAgICAgICAgLy8gRGlzcGxheSBmcmFtZSBtZWFzdXJlbWVudHMKLSAgICAgICAgbWVhc1B0ci0+ZGYubWluV2lkdGggPSBkZk1pbldpZHRoKGZvcm1hdC0+Zm9ybWF0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBkZk1pbldpZHRoOiAldSIsIG1lYXNQdHItPmRmLm1pbldpZHRoKTsKLQotICAgICAgICBtZWFzUHRyLT5kZi5taW5IZWlnaHQgPSBkZk1pbkhlaWdodChmb3JtYXQtPmZvcm1hdCk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgZGZNaW5IZWlnaHQ6ICV1IiwgbWVhc1B0ci0+ZGYubWluSGVpZ2h0KTsKLQotICAgICAgICBtZWFzUHRyLT5kZi5tYXhXaWR0aCA9IGRmTWF4V2lkdGgoZm9ybWF0LT5mb3JtYXQpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIGRmTWF4V2lkdGg6ICV1IiwgbWVhc1B0ci0+ZGYubWF4V2lkdGgpOwotCi0gICAgICAgIG1lYXNQdHItPmRmLm1heEhlaWdodCA9IGRmTWF4SGVpZ2h0KGZvcm1hdC0+Zm9ybWF0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBkZk1heEhlaWdodDogJXUiLCBtZWFzUHRyLT5kZi5tYXhIZWlnaHQpOwotCi0gICAgICAgIG1lYXNQdHItPmRmLm1pbkRpbSA9IGRmTWluRGltKGZvcm1hdC0+Zm9ybWF0KTsKLSAgICAgICAgdGVzdFByaW50SSgiICBkZk1pbkRpbTogJXMiLCAoKHN0cmluZykgbWVhc1B0ci0+ZGYubWluRGltKS5jX3N0cigpKTsKLQotICAgICAgICBtZWFzUHRyLT5kZi5tYXhEaW0gPSBkZk1heERpbShmb3JtYXQtPmZvcm1hdCk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgZGZNYXhEaW06ICVzIiwgKChzdHJpbmcpIG1lYXNQdHItPmRmLm1heERpbSkuY19zdHIoKSk7Ci0KLSAgICAgICAgLy8gU291cmNlIGNyb3AgbWVhc3VyZW1lbnRzCi0gICAgICAgIG1lYXNQdHItPnNjLm1pbldpZHRoID0gc2NNaW5XaWR0aChmb3JtYXQtPmZvcm1hdCwgbWVhc1B0ci0+ZGYubWluRGltKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY01pbldpZHRoOiAldSIsIG1lYXNQdHItPnNjLm1pbldpZHRoKTsKLQotICAgICAgICBtZWFzUHRyLT5zYy5taW5IZWlnaHQgPSBzY01pbkhlaWdodChmb3JtYXQtPmZvcm1hdCwgbWVhc1B0ci0+ZGYubWluRGltKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY01pbkhlaWdodDogJXUiLCBtZWFzUHRyLT5zYy5taW5IZWlnaHQpOwotCi0gICAgICAgIG1lYXNQdHItPnNjLm1heFdpZHRoID0gc2NNYXhXaWR0aChmb3JtYXQtPmZvcm1hdCwgbWVhc1B0ci0+ZGYubWF4RGltKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY01heFdpZHRoOiAlcyV1IiwgKG1lYXNQdHItPnNjLm1heFdpZHRoCi0gICAgICAgICAgICAgICAgICAgPT0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3Aud2lkdGgoKSkgPyAiPj0gIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLm1heFdpZHRoKTsKLQotICAgICAgICBtZWFzUHRyLT5zYy5tYXhIZWlnaHQgPSBzY01heEhlaWdodChmb3JtYXQtPmZvcm1hdCwgbWVhc1B0ci0+ZGYubWF4RGltKTsKLSAgICAgICAgdGVzdFByaW50SSgiICBzY01heEhlaWdodDogJXMldSIsIChtZWFzUHRyLT5zYy5tYXhIZWlnaHQKLSAgICAgICAgICAgICAgICAgICA9PSBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC5oZWlnaHQoKSkgPyAiPj0gIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLm1heEhlaWdodCk7Ci0KLSAgICAgICAgbWVhc1B0ci0+c2MubWluRGltID0gc2NNaW5EaW0oZm9ybWF0LT5mb3JtYXQsIG1lYXNQdHItPmRmLm1pbkRpbSk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgc2NNaW5EaW06ICVzIiwgKChzdHJpbmcpIG1lYXNQdHItPnNjLm1pbkRpbSkuY19zdHIoKSk7Ci0KLSAgICAgICAgbWVhc1B0ci0+c2MubWF4RGltID0gc2NNYXhEaW0oZm9ybWF0LT5mb3JtYXQsIG1lYXNQdHItPmRmLm1heERpbSk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgc2NNYXhEaW06ICVzJXMiLCAoKG1lYXNQdHItPnNjLm1heERpbS53aWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPj0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3Aud2lkdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobWVhc1B0ci0+c2MubWF4RGltLndpZHRoKCkgPj0KLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC5oZWlnaHQoKSkpID8gIj49ICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAoKHN0cmluZykgbWVhc1B0ci0+c2MubWF4RGltKS5jX3N0cigpKTsKLQotICAgICAgICBtZWFzUHRyLT5zYy5oU2NhbGUgPSBzY0hTY2FsZShmb3JtYXQtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+ZGYubWluRGltLCBtZWFzUHRyLT5kZi5tYXhEaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLm1pbkRpbSwgbWVhc1B0ci0+c2MubWF4RGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5zYy5oU2NhbGVCZXN0RGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPnNjLmhTY2FsZUJlc3RTYyk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgc2NIU2NhbGU6ICVzJWYiLAotICAgICAgICAgICAgICAgICAgIChtZWFzUHRyLT5zYy5oU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgPj0gUmF0aW9uYWwoc2VhcmNoTGltaXRzLnNvdXJjZUNyb3Aud2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+ZGYubWluRGltLndpZHRoKCkpKSA/ICI+PSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbWVhc1B0ci0+c2MuaFNjYWxlKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgIEhTY2FsZSBCZXN0IERpc3BsYXkgRnJhbWU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAoKHN0cmluZykgbWVhc1B0ci0+c2MuaFNjYWxlQmVzdERmKS5jX3N0cigpKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgIEhTY2FsZSBCZXN0IFNvdXJjZSBDcm9wOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgKChzdHJpbmcpIG1lYXNQdHItPnNjLmhTY2FsZUJlc3RTYykuY19zdHIoKSk7Ci0KLSAgICAgICAgbWVhc1B0ci0+c2MudlNjYWxlID0gc2NWU2NhbGUoZm9ybWF0LT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXNQdHItPmRmLm1pbkRpbSwgbWVhc1B0ci0+ZGYubWF4RGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5zYy5taW5EaW0sIG1lYXNQdHItPnNjLm1heERpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc1B0ci0+c2MudlNjYWxlQmVzdERmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5zYy52U2NhbGVCZXN0U2MpOwotICAgICAgICB0ZXN0UHJpbnRJKCIgIHNjVlNjYWxlOiAlcyVmIiwKLSAgICAgICAgICAgICAgICAgICAobWVhc1B0ci0+c2MudlNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgID49IFJhdGlvbmFsKHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLmhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzUHRyLT5kZi5taW5EaW0uaGVpZ2h0KCkpKSA/ICI+PSAiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgbWVhc1B0ci0+c2MudlNjYWxlKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgIFZTY2FsZSBCZXN0IERpc3BsYXkgRnJhbWU6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAoKHN0cmluZykgbWVhc1B0ci0+c2MudlNjYWxlQmVzdERmKS5jX3N0cigpKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgIFZTY2FsZSBCZXN0IFNvdXJjZSBDcm9wOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgKChzdHJpbmcpIG1lYXNQdHItPnNjLnZTY2FsZUJlc3RTYykuY19zdHIoKSk7Ci0KLSAgICAgICAgLy8gT3ZlcmxhcCB0d28gZ3JhcGhpYyBmb3JtYXRzIGFuZCBkaWZmZXJlbnQgYmxlbmRzCi0gICAgICAgIC8vIFJlc3VsdHMgZGlzcGxheWVkIGFmdGVyIGFsbCBvdmVybGFwIG1lYXN1cm1lbnRzIHdpdGgKLSAgICAgICAgLy8gY3VycmVudCBmb3JtYXQgaW4gdGhlIGZvcmVncm91bmQKLSAgICAgICAgLy8gVE9ETzogbWFrZSBtZWFzdXJtZW50cyB3aXRoIGJhY2tncm91bmQgYmxlbmQgb3RoZXIgdGhhbgotICAgICAgICAvLyAgICAgICBub25lLiAgQWxsIG9mIHRoZXNlIG1lYXN1cmVtZW50cyBhcmUgZG9uZSB3aXRoIGEKLSAgICAgICAgLy8gICAgICAgYmFja2dyb3VuZCBibGVuZCBvZiBIV0NfQkxFTkRJTkdfTk9ORSwgd2l0aCB0aGUKLSAgICAgICAgLy8gICAgICAgYmxlbmQgdHlwZSBvZiB0aGUgZm9yZWdvdW5kIGJlaW5nIHZhcmllZC4KLSAgICAgICAgdWludDMyX3QgZm9yZWdyb3VuZEZvcm1hdCA9IGZvcm1hdC0+Zm9ybWF0OwotICAgICAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZvcm1hdHMuYmVnaW4oKTsKLSAgICAgICAgICAgICBpdCAhPSBmb3JtYXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBudW07Ci0KLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqYmFja2dyb3VuZEZvcm1hdFB0cgotICAgICAgICAgICAgICAgID0gaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAoKCppdCkuY19zdHIoKSk7Ci0gICAgICAgICAgICB1aW50MzJfdCBiYWNrZ3JvdW5kRm9ybWF0ID0gYmFja2dyb3VuZEZvcm1hdFB0ci0+Zm9ybWF0OwotCi0gICAgICAgICAgICBudW0gPSBudW1PdmVybGFwcGluZyhiYWNrZ3JvdW5kRm9ybWF0LCBmb3JlZ3JvdW5kRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdDX0JMRU5ESU5HX05PTkUsIEhXQ19CTEVORElOR19OT05FKTsKLSAgICAgICAgICAgIG1lYXNQdHItPm92ZXJsYXBCbGVuZE5vbmUucHVzaF9iYWNrKG51bSk7Ci0KLSAgICAgICAgICAgIG51bSA9IG51bU92ZXJsYXBwaW5nKGJhY2tncm91bmRGb3JtYXQsIGZvcmVncm91bmRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0NfQkxFTkRJTkdfTk9ORSwgSFdDX0JMRU5ESU5HX1BSRU1VTFQpOwotICAgICAgICAgICAgbWVhc1B0ci0+b3ZlcmxhcEJsZW5kUHJlbXVsdC5wdXNoX2JhY2sobnVtKTsKLQotICAgICAgICAgICAgbnVtID0gbnVtT3ZlcmxhcHBpbmcoYmFja2dyb3VuZEZvcm1hdCwgZm9yZWdyb3VuZEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQ19CTEVORElOR19OT05FLCBIV0NfQkxFTkRJTkdfQ09WRVJBR0UpOwotICAgICAgICAgICAgbWVhc1B0ci0+b3ZlcmxhcEJsZW5kQ292ZXJhZ2UucHVzaF9iYWNrKG51bSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIC8vIERpc3BsYXkgb3ZlcmxhcCByZXN1bHRzCi0gICAgc2l6ZV90IGluZGVudCA9IDI7Ci0gICAgdGVzdFByaW50SSgib3ZlcmxhcHBpbmcgYmxlbmQ6IG5vbmUiKTsKLSAgICBwcmludEZvcm1hdEhlYWRpbmdzKGluZGVudCk7Ci0gICAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBmb3JtYXRzLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBmb3JtYXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHByaW50T3ZlcmxhcExpbmUoaW5kZW50LCAqaXQsIG1lYXN1cmVtZW50c1tpdAotICAgICAgICAgICAgICAgICAgICAgICAgIC0gZm9ybWF0cy5iZWdpbigpXS5vdmVybGFwQmxlbmROb25lKTsKLSAgICB9Ci0gICAgdGVzdFByaW50SSgiIik7Ci0KLSAgICB0ZXN0UHJpbnRJKCJvdmVybGFwcGluZyBibGVuZDogcHJlbXVsdCIpOwotICAgIHByaW50Rm9ybWF0SGVhZGluZ3MoaW5kZW50KTsKLSAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZvcm1hdHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGZvcm1hdHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgcHJpbnRPdmVybGFwTGluZShpbmRlbnQsICppdCwgbWVhc3VyZW1lbnRzW2l0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLSBmb3JtYXRzLmJlZ2luKCldLm92ZXJsYXBCbGVuZFByZW11bHQpOwotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCIiKTsKLQotICAgIHRlc3RQcmludEkoIm92ZXJsYXBwaW5nIGJsZW5kOiBjb3ZlcmFnZSIpOwotICAgIHByaW50Rm9ybWF0SGVhZGluZ3MoaW5kZW50KTsKLSAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZvcm1hdHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IGZvcm1hdHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgcHJpbnRPdmVybGFwTGluZShpbmRlbnQsICppdCwgbWVhc3VyZW1lbnRzW2l0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLSBmb3JtYXRzLmJlZ2luKCldLm92ZXJsYXBCbGVuZENvdmVyYWdlKTsKLSAgICB9Ci0gICAgdGVzdFByaW50SSgiIik7Ci0KLSAgICAvLyBTdGFydCBmcmFtZXdvcmsKLSAgICBydiA9IHNucHJpbnRmKGNtZCwgc2l6ZW9mKGNtZCksICIlcyIsIENNRF9TVEFSVF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUQVJUX0ZSQU1FV09SSyk7Ci0gICAgICAgIGV4aXQoMjEpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIERldGVybWluZSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3ZlcmxheXMgdGhhdCBhcmUgYWxsIG9mIHRoZSBzYW1lIGZvcm1hdAotLy8gdGhhdCB0aGUgSFdDIHdpbGwgY29tbWl0IHRvLiAgSWYgYWxsb3dPdmVybGFwIGlzIHRydWUsIHRoZW4gdGhlIHJlY3RhbmdsZXMKLS8vIGFyZSBsYWlkIG91dCBvbiBhIGRpYWdvbmFsIHN0YXJ0aW5nIGZyb20gdGhlIHVwcGVyIGxlZnQgY29ybmVyLiAgV2l0aAotLy8gZWFjaCByZWN0YW5nbGUgYWRqdXN0IG9uZSBwaXhlbCB0byB0aGUgcmlnaHQgYW5kIG9uZSBwaXhlbCBkb3duLgotLy8gV2hlbiBhbGxvd092ZXJsYXAgaXMgZmFsc2UsIHRoZSByZWN0YW5nbGVzIGFyZSB0aWxlZCBpbiBjb2x1bW4gbWFqb3IKLS8vIG9yZGVyLiAgTm90ZSwgY29sdW1uIG1ham9yIG9yZGVyaW5nIGlzIHVzZWQgc28gdGhhdCB0aGUgaW5pdGlhbCByZWN0YW5nbGVzCi0vLyBhcmUgYWxsIG9uIGRpZmZlcmVudCBob3Jpem9udGFsIHNjYW4gcm93cy4gIEl0IGlzIGNvbW1vbiB0aGF0IGhhcmR3YXJlCi0vLyBoYXMgbGltaXRzIG9uIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpdCBjYW4gaGFuZGxlIG9uIGFueSBzaW5nbGUgcm93LgotdWludDMyX3QgbWF4T3ZlcmxheXModWludDMyX3QgZm9ybWF0LCBib29sIGFsbG93T3ZlcmxhcCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgbWF4ID0gMDsKLQotICAgIGZvciAodW5zaWduZWQgaW50IG51bVJlY3RzID0gMTsgbnVtUmVjdHMgPD0gc2VhcmNoTGltaXRzLm51bU92ZXJsYXlzOwotICAgICAgICAgbnVtUmVjdHMrKykgewotICAgICAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgeCA9IDA7Ci0gICAgICAgICAgICAgKHggKyBzdGFydERpbS53aWR0aCgpKSA8ICh1bnNpZ25lZCBpbnQpIHdpZHRoOwotICAgICAgICAgICAgIHggKz0gKGFsbG93T3ZlcmxhcCkgPyAxIDogc3RhcnREaW0ud2lkdGgoKSkgewotICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgeSA9IDA7Ci0gICAgICAgICAgICAgICAgICh5ICsgc3RhcnREaW0uaGVpZ2h0KCkpIDwgKHVuc2lnbmVkIGludCkgaGVpZ2h0OwotICAgICAgICAgICAgICAgICB5ICs9IChhbGxvd092ZXJsYXApID8gMSA6IHN0YXJ0RGltLmhlaWdodCgpKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBzdGFydERpbSwgc3RhcnREaW0pOwotICAgICAgICAgICAgICAgIHJlY3QuZGlzcGxheUZyYW1lLmxlZnQgPSB4OwotICAgICAgICAgICAgICAgIHJlY3QuZGlzcGxheUZyYW1lLnRvcCA9IHk7Ci0gICAgICAgICAgICAgICAgcmVjdC5kaXNwbGF5RnJhbWUucmlnaHQgPSB4ICsgc3RhcnREaW0ud2lkdGgoKTsKLSAgICAgICAgICAgICAgICByZWN0LmRpc3BsYXlGcmFtZS5ib3R0b20gPSB5ICsgc3RhcnREaW0uaGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVjdExpc3Quc2l6ZSgpID49IG51bVJlY3RzKSB7IGJyZWFrOyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVjdExpc3Quc2l6ZSgpID49IG51bVJlY3RzKSB7IGJyZWFrOyB9Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiBtYXgpIHsgbWF4ID0gbnVtOyB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1heDsKLX0KLQotLy8gTWVhc3VyZXMgd2hhdCB0cmFuc2Zvcm1zIChpLmUuIGZsaXAgaG9yaXpvbnRhbCwgcm90YXRlIDE4MCkgYXJlCi0vLyBzdXBwb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBmb3JtYXQKLWxpc3Q8dWludDMyX3Q+IHN1cHBvcnRlZFRyYW5zZm9ybXModWludDMyX3QgZm9ybWF0KQotewotICAgIGxpc3Q8dWludDMyX3Q+IHJ2OwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIHN0YXJ0RGltKTsKLQotICAgIC8vIEZvciBlYWNoIG9mIHRoZSB0cmFuc2Zvcm0gdHlwZXMKLSAgICBmb3IgKHVuc2lnbmVkIGludCBpZHggPSAwOyBpZHggPCBOVU1BKHRyYW5zZm9ybVR5cGUpOyBpZHgrKykgewotICAgICAgICB1bnNpZ25lZCBpbnQgaWQgPSB0cmFuc2Zvcm1UeXBlW2lkeF0uaWQ7Ci0KLSAgICAgICAgcmVjdC50cmFuc2Zvcm0gPSBpZDsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0KLSAgICAgICAgaWYgKG51bSA9PSAxKSB7Ci0gICAgICAgICAgICBydi5wdXNoX2JhY2soaWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0vLyBEZXRlcm1pbmVzIHdoaWNoIHR5cGVzIG9mIGJsZW5kcyAoaS5lLiBub25lLCBwcmVtdWx0LCBjb3ZlcmFnZSkgYXJlCi0vLyBzdXBwb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBmb3JtYXQKLWxpc3Q8dWludDMyX3Q+IHN1cHBvcnRlZEJsZW5kcyh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgbGlzdDx1aW50MzJfdD4gcnY7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgc3RhcnREaW0pOwotCi0gICAgLy8gRm9yIGVhY2ggb2YgdGhlIGJsZW5kIHR5cGVzCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaWR4ID0gMDsgaWR4IDwgTlVNQShibGVuZFR5cGUpOyBpZHgrKykgewotICAgICAgICB1bnNpZ25lZCBpbnQgaWQgPSBibGVuZFR5cGVbaWR4XS5pZDsKLQotICAgICAgICByZWN0LmJsZW5kID0gaWQ7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotCi0gICAgICAgIGlmIChudW0gPT0gMSkgewotICAgICAgICAgICAgcnYucHVzaF9iYWNrKGlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBydjsKLX0KLQotLy8gRGV0ZXJtaW5lcyB0aGUgbWluaW11bSB3aWR0aCBvZiBhbnkgZGlzcGxheSBmcmFtZSBvZiB0aGUgZ2l2ZW4gZm9ybWF0Ci0vLyB0aGF0IHRoZSBIV0Mgd2lsbCBjb21taXQgdG8uCi11aW50MzJfdCBkZk1pbldpZHRoKHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICB1aW50MzJfdCB3OwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgIGZvciAodyA9IDE7IHcgPD0gc3RhcnREaW0ud2lkdGgoKTsgdysrKSB7Ci0gICAgICAgIEh3Y1Rlc3REaW0gZGltKHcsIHN0YXJ0RGltLmhlaWdodCgpKTsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkaW0pOwotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB3OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3ID4gc3RhcnREaW0ud2lkdGgoKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJGYWlsZWQgdG8gbG9jYXRlIGRpc3BsYXkgZnJhbWUgbWluIHdpZHRoIik7Ci0gICAgICAgIGV4aXQoMzMpOwotICAgIH0KLQotICAgIHJldHVybiB3OwotfQotCi0vLyBEaXNwbGF5IGZyYW1lIG1pbmltdW0gaGVpZ2h0Ci11aW50MzJfdCBkZk1pbkhlaWdodCh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgdWludDMyX3QgaDsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICBmb3IgKGggPSAxOyBoIDw9IHN0YXJ0RGltLmhlaWdodCgpOyBoKyspIHsKLSAgICAgICAgSHdjVGVzdERpbSBkaW0oc3RhcnREaW0ud2lkdGgoKSwgaCk7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGltKTsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaCA+IHN0YXJ0RGltLmhlaWdodCgpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkZhaWxlZCB0byBsb2NhdGUgZGlzcGxheSBmcmFtZSBtaW4gaGVpZ2h0Iik7Ci0gICAgICAgIGV4aXQoMzQpOwotICAgIH0KLQotICAgIHJldHVybiBoOwotfQotCi0vLyBEaXNwbGF5IGZyYW1lIG1heGltdW0gd2lkdGgKLXVpbnQzMl90IGRmTWF4V2lkdGgodWludDMyX3QgZm9ybWF0KQotewotICAgIHVpbnQzMl90IHc7Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotCi0gICAgZm9yICh3ID0gd2lkdGg7IHcgPj0gc3RhcnREaW0ud2lkdGgoKTsgdy0tKSB7Ci0gICAgICAgIEh3Y1Rlc3REaW0gZGltKHcsIHN0YXJ0RGltLmhlaWdodCgpKTsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkaW0pOwotICAgICAgICByZWN0TGlzdC5jbGVhcigpOwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB3OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh3IDwgc3RhcnREaW0ud2lkdGgoKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJGYWlsZWQgdG8gbG9jYXRlIGRpc3BsYXkgZnJhbWUgbWF4IHdpZHRoIik7Ci0gICAgICAgIGV4aXQoMzUpOwotICAgIH0KLQotICAgIHJldHVybiB3OwotfQotCi0vLyBEaXNwbGF5IGZyYW1lIG1heGltdW0gaGVpZ2h0Ci11aW50MzJfdCBkZk1heEhlaWdodCh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgdWludDMyX3QgaDsKLQotICAgIGZvciAoaCA9IGhlaWdodDsgaCA+PSBzdGFydERpbS5oZWlnaHQoKTsgaC0tKSB7Ci0gICAgICAgIEh3Y1Rlc3REaW0gZGltKHN0YXJ0RGltLndpZHRoKCksIGgpOwotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRpbSk7Ci0gICAgICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gaDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoaCA8IHN0YXJ0RGltLmhlaWdodCgpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkZhaWxlZCB0byBsb2NhdGUgZGlzcGxheSBmcmFtZSBtYXggaGVpZ2h0Iik7Ci0gICAgICAgIGV4aXQoMzYpOwotICAgIH0KLQotICAgIHJldHVybiBoOwotfQotCi0vLyBEZXRlcm1pbmUgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBIV0Mgd2lsbCBldmVyIGNvbW1pdCB0by4KLS8vIE5vdGUsIHRoaXMgbWlnaHQgYmUgZGlmZmVyZW50IHRoYXQgZGZNaW5XaWR0aCAqIGRmTWluSGVpZ2h0LCBpbiB0aGF0IHRoaXMKLS8vIGZ1bmN0aW9uIGFkanVzdHMgYm90aCB0aGUgd2lkdGggYW5kIGhlaWdodCBmcm9tIHRoZSBzdGFydGluZyBkaW1lbnNpb24uCi1Id2NUZXN0RGltIGRmTWluRGltKHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICB1aW50NjRfdCBiZXN0TWluUGl4ZWxzID0gMDsKLSAgICBId2NUZXN0RGltIGJlc3REaW07Ci0gICAgYm9vbCBiZXN0U2V0ID0gZmFsc2U7IC8vIFRydWUgd2hlbiB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0TWluUGl4ZWxzIGFuZCBiZXN0RGltCi0KLSAgICBib29sIG9yaWdWZXJib3NlID0gdmVyYm9zZTsgIC8vIFRlbXBvcmFyaWx5IHR1cm4gb2ZmIHZlcmJvc2UKLSAgICB2ZXJib3NlID0gZmFsc2U7Ci0gICAgZm9yICh1aW50MzJfdCB3ID0gMTsgdyA8PSBzdGFydERpbS53aWR0aCgpOyB3KyspIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBoID0gMTsgaCA8PSBzdGFydERpbS5oZWlnaHQoKTsgaCsrKSB7Ci0gICAgICAgICAgICBpZiAoYmVzdFNldCAmJiAoKHcgPiBiZXN0TWluUGl4ZWxzKSB8fCAoaCA+IGJlc3RNaW5QaXhlbHMpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBId2NUZXN0RGltIGRpbSh3LCBoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGltKTsKLSAgICAgICAgICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICAgICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgdWludDY0X3QgcGl4ZWxzID0gZGltLndpZHRoKCkgKiBkaW0uaGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFiZXN0U2V0IHx8IChwaXhlbHMgPCBiZXN0TWluUGl4ZWxzKSkgewotICAgICAgICAgICAgICAgICAgICBiZXN0TWluUGl4ZWxzID0gcGl4ZWxzOwotICAgICAgICAgICAgICAgICAgICBiZXN0RGltID0gZGltOwotICAgICAgICAgICAgICAgICAgICBiZXN0U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmVyYm9zZSA9IG9yaWdWZXJib3NlOwotCi0gICAgaWYgKCFiZXN0U2V0KSB7Ci0gICAgICAgIHRlc3RQcmludEUoIlVuYWJsZSB0byBsb2NhdGUgZGlzcGxheSBmcmFtZSBtaW4gZGltZW5zaW9uIik7Ci0gICAgICAgIGV4aXQoMjApOwotICAgIH0KLQotICAgIHJldHVybiBiZXN0RGltOwotfQotCi0vLyBEaXNwbGF5IGZyYW1lIG1heGltdW0gZGltZW5zaW9uCi1Id2NUZXN0RGltIGRmTWF4RGltKHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICB1aW50NjRfdCBiZXN0TWF4UGl4ZWxzID0gMDsKLSAgICBId2NUZXN0RGltIGJlc3REaW07Ci0gICAgYm9vbCBiZXN0U2V0ID0gZmFsc2U7IC8vIFRydWUgd2hlbiB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0TWF4UGl4ZWxzIGFuZCBiZXN0RGltOwotCi0gICAgLy8gUG90ZW50aWFsbHkgaW5jcmVhc2UgYmVuY2htYXJrIHBlcmZvcm1hbmNlIGJ5IGZpcnN0IGNoZWNraW5nCi0gICAgLy8gZm9yIHRoZSBjb21tb24gY2FzZSBvZiBzdXBwb3J0aW5nIGEgZnVsbCBkaXNwbGF5IGZyYW1lLgotICAgIEh3Y1Rlc3REaW0gZGltKHdpZHRoLCBoZWlnaHQpOwotICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGltKTsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0gICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICBpZiAobnVtID09IDEpIHsgcmV0dXJuIGRpbTsgfQotCi0gICAgLy8gVE9ETzogVXNlIGEgYmluYXJ5IHNlYXJjaAotICAgIGJvb2wgb3JpZ1ZlcmJvc2UgPSB2ZXJib3NlOyAgLy8gVGVtcG9yYXJpbHkgdHVybiBvZmYgdmVyYm9zZQotICAgIHZlcmJvc2UgPSBmYWxzZTsKLSAgICBmb3IgKHVpbnQzMl90IHcgPSBzdGFydERpbS53aWR0aCgpOyB3IDw9ICh1aW50MzJfdCkgd2lkdGg7IHcrKykgewotICAgICAgICBmb3IgKHVpbnQzMl90IGggPSBzdGFydERpbS5oZWlnaHQoKTsgaCA8PSAodWludDMyX3QpIGhlaWdodDsgaCsrKSB7Ci0gICAgICAgICAgICBpZiAoYmVzdFNldCAmJiAoKHcgKiBoKSA8PSBiZXN0TWF4UGl4ZWxzKSkgeyBjb250aW51ZTsgfQotCi0gICAgICAgICAgICBId2NUZXN0RGltIGRpbSh3LCBoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGltKTsKLSAgICAgICAgICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICAgICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgdWludDY0X3QgcGl4ZWxzID0gZGltLndpZHRoKCkgKiBkaW0uaGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFiZXN0U2V0IHx8IChwaXhlbHMgPiBiZXN0TWF4UGl4ZWxzKSkgewotICAgICAgICAgICAgICAgICAgICBiZXN0TWF4UGl4ZWxzID0gcGl4ZWxzOwotICAgICAgICAgICAgICAgICAgICBiZXN0RGltID0gZGltOwotICAgICAgICAgICAgICAgICAgICBiZXN0U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmVyYm9zZSA9IG9yaWdWZXJib3NlOwotCi0gICAgaWYgKCFiZXN0U2V0KSB7Ci0gICAgICAgIHRlc3RQcmludEUoIlVuYWJsZSB0byBsb2NhdGUgZGlzcGxheSBmcmFtZSBtYXggZGltZW5zaW9uIik7Ci0gICAgICAgIGV4aXQoMjEpOwotICAgIH0KLQotICAgIHJldHVybiBiZXN0RGltOwotfQotCi0vLyBTb3VyY2UgY3JvcCBtaW5pbXVtIHdpZHRoCi11aW50MzJfdCBzY01pbldpZHRoKHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pCi17Ci0gICAgdWludDMyX3QgdzsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICAvLyBTb3VyY2UgY3JvcCBmcmFtZSBtaW4gd2lkdGgKLSAgICBmb3IgKHcgPSAxOyB3IDw9IGRmRGltLndpZHRoKCk7IHcrKykgewotICAgICAgICBSZWN0YW5nbGUgcmVjdChmb3JtYXQsIGRmRGltLCBId2NUZXN0RGltKHcsIGRmRGltLmhlaWdodCgpKSk7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFByaW50RSgiRmFpbGVkIHRvIGxvY2F0ZSBzb3VyY2UgY3JvcCBtaW4gd2lkdGgiKTsKLSAgICBleGl0KDM1KTsKLX0KLQotLy8gU291cmNlIGNyb3AgbWluaW11bSBoZWlnaHQKLXVpbnQzMl90IHNjTWluSGVpZ2h0KHVpbnQzMl90IGZvcm1hdCwgY29uc3QgSHdjVGVzdERpbSYgZGZEaW0pCi17Ci0gICAgdWludDMyX3QgaDsKLSAgICBsaXN0PFJlY3RhbmdsZT4gcmVjdExpc3Q7Ci0KLSAgICBmb3IgKGggPSAxOyBoIDw9IGRmRGltLmhlaWdodCgpOyBoKyspIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgSHdjVGVzdERpbShkZkRpbS53aWR0aCgpLCBoKSk7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFByaW50RSgiRmFpbGVkIHRvIGxvY2F0ZSBzb3VyY2UgY3JvcCBtaW4gaGVpZ2h0Iik7Ci0gICAgZXhpdCgzNik7Ci19Ci0KLS8vIFNvdXJjZSBjcm9wIG1heGltdW0gd2lkdGgKLXVpbnQzMl90IHNjTWF4V2lkdGgodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSkKLXsKLSAgICB1aW50MzJfdCB3OwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgIGZvciAodyA9IHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLndpZHRoKCk7IHcgPj0gZGZEaW0ud2lkdGgoKTsgdy0tKSB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGZEaW0sIEh3Y1Rlc3REaW0odywgZGZEaW0uaGVpZ2h0KCkpKTsKLSAgICAgICAgcmVjdExpc3QuY2xlYXIoKTsKLSAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0gICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdzsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZXN0UHJpbnRFKCJGYWlsZWQgdG8gbG9jYXRlIHNvdXJjZSBjcm9wIG1heCB3aWR0aCIpOwotICAgIGV4aXQoMzUpOwotfQotCi0vLyBTb3VyY2UgY3JvcCBtYXhpbXVtIGhlaWdodAotdWludDMyX3Qgc2NNYXhIZWlnaHQodWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSkKLXsKLSAgICB1aW50MzJfdCBoOwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLQotICAgIGZvciAoaCA9IHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLmhlaWdodCgpOyBoID49IGRmRGltLmhlaWdodCgpOyBoLS0pIHsKLSAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgSHdjVGVzdERpbShkZkRpbS53aWR0aCgpLCBoKSk7Ci0gICAgICAgIHJlY3RMaXN0LmNsZWFyKCk7Ci0gICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICBpZiAobnVtID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIGg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFByaW50RSgiRmFpbGVkIHRvIGxvY2F0ZSBzb3VyY2UgY3JvcCBtYXggaGVpZ2h0Iik7Ci0gICAgZXhpdCgzNik7Ci19Ci0KLS8vIFNvdXJjZSBjcm9wIG1pbmltdW0gZGltZW5zaW9uCi0vLyBEaXNjb3ZlcnMgdGhlIHNvdXJjZSBjcm9wIHdpdGggdGhlIGxlYXN0IG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUKLS8vIEhXQyB3aWxsIGNvbW1pdCB0by4gIE5vdGUsIHRoaXMgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHNjTWluV2lkdGgKLS8vICogc2NNaW5IZWlnaHQsIGluIHRoYXQgdGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYSBjb21iaW5hdGlvbiBvZgotLy8gd2lkdGggYW5kIGhlaWdodC4gIFdoaWxlIHRoZSBvdGhlciByb3V0aW5lcyBhbHdheXMga2VlcCBvbmUgb2YgdGhlCi0vLyBkaW1lbnNpb25zIGVxdWFsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0YXJ0IGRpbWVuc2lvbi4KLUh3Y1Rlc3REaW0gc2NNaW5EaW0odWludDMyX3QgZm9ybWF0LCBjb25zdCBId2NUZXN0RGltJiBkZkRpbSkKLXsKLSAgICB1aW50NjRfdCBiZXN0TWluUGl4ZWxzID0gMDsKLSAgICBId2NUZXN0RGltIGJlc3REaW07Ci0gICAgYm9vbCBiZXN0U2V0ID0gZmFsc2U7IC8vIFRydWUgd2hlbiB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0TWluUGl4ZWxzIGFuZCBiZXN0RGltCi0KLSAgICBib29sIG9yaWdWZXJib3NlID0gdmVyYm9zZTsgIC8vIFRlbXBvcmFyaWx5IHR1cm4gb2ZmIHZlcmJvc2UKLSAgICB2ZXJib3NlID0gZmFsc2U7Ci0gICAgZm9yICh1aW50MzJfdCB3ID0gMTsgdyA8PSBkZkRpbS53aWR0aCgpOyB3KyspIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBoID0gMTsgaCA8PSBkZkRpbS5oZWlnaHQoKTsgaCsrKSB7Ci0gICAgICAgICAgICBpZiAoYmVzdFNldCAmJiAoKHcgPiBiZXN0TWluUGl4ZWxzKSB8fCAoaCA+IGJlc3RNaW5QaXhlbHMpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBId2NUZXN0RGltIGRpbSh3LCBoKTsKLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGZEaW0sIEh3Y1Rlc3REaW0odywgaCkpOwotICAgICAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICAgICAgcmVjdExpc3QucHVzaF9iYWNrKHJlY3QpOwotICAgICAgICAgICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgICAgICAgICAgaWYgKG51bSA+IDApIHsKLSAgICAgICAgICAgICAgICB1aW50NjRfdCBwaXhlbHMgPSBkaW0ud2lkdGgoKSAqIGRpbS5oZWlnaHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJlc3RTZXQgfHwgKHBpeGVscyA8IGJlc3RNaW5QaXhlbHMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RNaW5QaXhlbHMgPSBwaXhlbHM7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3REaW0gPSBkaW07Ci0gICAgICAgICAgICAgICAgICAgIGJlc3RTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICB2ZXJib3NlID0gb3JpZ1ZlcmJvc2U7Ci0KLSAgICBpZiAoIWJlc3RTZXQpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5hYmxlIHRvIGxvY2F0ZSBzb3VyY2UgY3JvcCBtaW4gZGltZW5zaW9uIik7Ci0gICAgICAgIGV4aXQoMjApOwotICAgIH0KLQotICAgIHJldHVybiBiZXN0RGltOwotfQotCi0vLyBTb3VyY2UgY3JvcCBtYXhpbXVtIGRpbWVuc2lvbgotSHdjVGVzdERpbSBzY01heERpbSh1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEh3Y1Rlc3REaW0mIGRmRGltKQotewotICAgIHVpbnQ2NF90IGJlc3RNYXhQaXhlbHMgPSAwOwotICAgIEh3Y1Rlc3REaW0gYmVzdERpbTsKLSAgICBib29sIGJlc3RTZXQgPSBmYWxzZTsgLy8gVHJ1ZSB3aGVuIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3RNYXhQaXhlbHMgYW5kIGJlc3REaW07Ci0KLSAgICAvLyBQb3RlbnRpYWxseSBpbmNyZWFzZSBiZW5jaG1hcmsgcGVyZm9ybWFuY2UgYnkgZmlyc3QgY2hlY2tpbmcKLSAgICAvLyBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHN1cHBvcnRpbmcgdGhlIG1heGltdW0gY2hlY2tlZCBzb3VyY2Ugc2l6ZQotICAgIEh3Y1Rlc3REaW0gZGltID0gc2VhcmNoTGltaXRzLnNvdXJjZUNyb3A7Ci0gICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgc2VhcmNoTGltaXRzLnNvdXJjZUNyb3ApOwotICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgdWludDMyX3QgbnVtID0gbnVtT3ZlcmxheXMocmVjdExpc3QpOwotICAgIGlmIChudW0gPT0gMSkgeyByZXR1cm4gZGltOyB9Ci0KLSAgICAvLyBUT0RPOiBVc2UgYSBiaW5hcnkgc2VhcmNoCi0gICAgYm9vbCBvcmlnVmVyYm9zZSA9IHZlcmJvc2U7ICAvLyBUZW1wb3JhcmlseSB0dXJuIG9mZiB2ZXJib3NlCi0gICAgdmVyYm9zZSA9IGZhbHNlOwotICAgIGZvciAodWludDMyX3QgdyA9IGRmRGltLndpZHRoKCk7Ci0gICAgICAgICB3IDw9IHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLndpZHRoKCk7IHcrKykgewotICAgICAgICBmb3IgKHVpbnQzMl90IGggPSBkZkRpbS5oZWlnaHQoKTsKLSAgICAgICAgICAgICBoIDw9IHNlYXJjaExpbWl0cy5zb3VyY2VDcm9wLmhlaWdodCgpOyBoKyspIHsKLSAgICAgICAgICAgIGlmIChiZXN0U2V0ICYmICgodyAqIGgpIDw9IGJlc3RNYXhQaXhlbHMpKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgICAgIEh3Y1Rlc3REaW0gZGltKHcsIGgpOwotICAgICAgICAgICAgUmVjdGFuZ2xlIHJlY3QoZm9ybWF0LCBkZkRpbSwgZGltKTsKLSAgICAgICAgICAgIGxpc3Q8UmVjdGFuZ2xlPiByZWN0TGlzdDsKLSAgICAgICAgICAgIHJlY3RMaXN0LnB1c2hfYmFjayhyZWN0KTsKLSAgICAgICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLSAgICAgICAgICAgIGlmIChudW0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgdWludDY0X3QgcGl4ZWxzID0gZGltLndpZHRoKCkgKiBkaW0uaGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFiZXN0U2V0IHx8IChwaXhlbHMgPiBiZXN0TWF4UGl4ZWxzKSkgewotICAgICAgICAgICAgICAgICAgICBiZXN0TWF4UGl4ZWxzID0gcGl4ZWxzOwotICAgICAgICAgICAgICAgICAgICBiZXN0RGltID0gZGltOwotICAgICAgICAgICAgICAgICAgICBiZXN0U2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmVyYm9zZSA9IG9yaWdWZXJib3NlOwotCi0gICAgaWYgKCFiZXN0U2V0KSB7Ci0gICAgICAgIHRlc3RQcmludEUoIlVuYWJsZSB0byBsb2NhdGUgc291cmNlIGNyb3AgbWF4IGRpbWVuc2lvbiIpOwotICAgICAgICBleGl0KDIxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYmVzdERpbTsKLX0KLQotLy8gU291cmNlIGNyb3AgaG9yaXpvbnRhbCBzY2FsZQotLy8gRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBmYWN0b3IgYnkgd2hpY2ggdGhlIHNvdXJjZSBjcm9wIGNhbiBiZSBsYXJnZXIKLS8vIHRoYXQgdGhlIGRpc3BsYXkgZnJhbWUuICBUaGUgY29tbWl0IHBvaW50IGlzIGRpc2NvdmVyZWQgdGhyb3VnaCBhCi0vLyBiaW5hcnkgc2VhcmNoIG9mIHJhdGlvbmFsIG51bWJlcnMuICBUaGUgbnVtZXJhdG9yIGluIGVhY2ggb2YgdGhlCi0vLyByYXRpb25hbCBudW1iZXJzIGNvbnRhaW5zIHRoZSBkaW1lbnNpb24gZm9yIHRoZSBzb3VyY2UgY3JvcCwgd2hpbGUKLS8vIHRoZSBkZW5vbWluYXRvciBzcGVjaWZpZXMgdGhlIGRpbWVuc2lvbiBmb3IgdGhlIGRpc3BsYXkgZnJhbWUuICBPbgotLy8gZWFjaCBwYXNzIG9mIHRoZSBiaW5hcnkgc2VhcmNoIHRoZSBtaWQtcG9pbnQgYmV0d2VlbiB0aGUgZ3JlYXRlc3QKLS8vIHBvaW50IGNvbW1pdHRlZCB0byAoYmVzdCkgYW5kIHRoZSBzbWFsbGVzdCBwb2ludCBpbiB3aGljaCBhIGNvbW1pdAotLy8gaGFzIGZhaWxlZCBpcyBjYWxjdWxhdGVkLiAgVGhpcyBtaWQtcG9pbnQgaXMgdGhlbiBwYXNzZWQgdG8gYSBmdW5jdGlvbgotLy8gbmFtZWQgZG91YmxlMlJhdGlvbmFsLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjbG9zZXN0IHJhdGlvbmFsIG51bWJlcnMKLS8vIGp1c3QgYmVsb3cgYW5kIGFib3ZlIHRoZSBtaWQtcG9pbnQuICBCeSBkZWZhdWx0IHRoZSBsb3dlciByYXRpb25hbAotLy8gbnVtYmVyIGlzIHVzZWQgZm9yIHRoZSBzY2FsZSBmYWN0b3Igb24gdGhlIG5leHQgcGFzcyBvZiB0aGUgYmluYXJ5Ci0vLyBzZWFyY2guICBUaGUgdXBwZXIgdmFsdWUgaXMgb25seSB1c2VkIHdoZW4gYmVzdCBpcyBhbHJlYWR5IGVxdWFsCi0vLyB0byB0aGUgbG93ZXIgdmFsdWUuICBUaGlzIG9ubHkgb2NjdXJzIHdoZW4gdGhlIGxvd2VyIHZhbHVlIGhhcyBhbHJlYWR5Ci0vLyBiZWVuIHRyaWVkLgotUmF0aW9uYWwgc2NIU2NhbGUodWludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh3Y1Rlc3REaW0mIGRmTWluLCBjb25zdCBId2NUZXN0RGltJiBkZk1heCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBId2NUZXN0RGltJiBzY01pbiwgY29uc3QgSHdjVGVzdERpbSYgc2NNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgSHdjVGVzdERpbSYgb3V0QmVzdERmLCBId2NUZXN0RGltJiBvdXRCZXN0U2MpCi17Ci0gICAgSHdjVGVzdERpbSBzY0RpbSwgZGZEaW07IC8vIFNvdXJjZSBjcm9wIGFuZCBkaXNwbGF5IGZyYW1lIGRpbWVuc2lvbgotICAgIFJhdGlvbmFsIGJlc3QoMCwgMSksIG1pbkJhZDsgIC8vIEN1cnJlbnQgYm91bmRzIGZvciBhIGJpbmFyeSBzZWFyY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW5Hb29kIGlzIHNldCBiZWxvdyB0aGUgbG93ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libGUgc2NhbGUuICBUaGUgdmFsdWUgb2YgbWluQmFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgc2V0IGJ5IHRoZSBmaXJzdCBwYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGJpbmFyeSBzZWFyY2guCi0KLSAgICAvLyBQZXJmb3JtIHRoZSBwYXNzZXMgb2YgdGhlIGJpbmFyeSBzZWFyY2gKLSAgICBib29sIGZpcnN0UGFzcyA9IHRydWU7Ci0gICAgZG8gewotICAgICAgICAvLyBPbiBmaXJzdCBwYXNzIHRyeSB0aGUgbWF4aW11bSBzY2FsZSB3aXRoaW4gdGhlIHNlYXJjaCBsaW1pdHMKLSAgICAgICAgaWYgKGZpcnN0UGFzcykgewotICAgICAgICAgICAgLy8gVHJ5IHRoZSBtYXhpbXVtIHBvc3NpYmxlIHNjYWxlLCB3aXRoaW4gdGhlIHNlYXJjaCBsaW1pdHMKLSAgICAgICAgICAgIHNjRGltID0gSHdjVGVzdERpbShzZWFyY2hMaW1pdHMuc291cmNlQ3JvcC53aWR0aCgpLCBzY01pbi5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBkZkRpbSA9IGRmTWluOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gU3Vic2VxdWVudCBwYXNzCi0gICAgICAgICAgICAvLyBIYWx2ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJlc3QgYW5kIG1pbkJhZC4KLSAgICAgICAgICAgIFJhdGlvbmFsIGxvd2VyLCB1cHBlciwgc2VsZWN0ZWQ7Ci0KLSAgICAgICAgICAgIC8vIFRyeSB0aGUgY2xvc2VzdCByYXRpbyBoYWxmd2F5IGJldHdlZW4gbWluQm9vZCBhbmQgbWluQmFkOwotICAgICAgICAgICAgLy8gVE9ETzogQXZvaWQgcm91bmRpbmcgaXNzdWUgYnkgdXNpbmcgUmF0aW9uYWwgdHlwZSBmb3IKLSAgICAgICAgICAgIC8vICAgICAgIG1pZHBvaW50LiAgRm9yIG5vdyB3aWxsIHVzZSBkb3VibGUsIHdoaWNoIHNob3VsZAotICAgICAgICAgICAgLy8gICAgICAgaGF2ZSBtb3JlIHRoYW4gc3VmZmljaWVudCByZXNvbHV0aW9uLgotICAgICAgICAgICAgZG91YmxlIG1pZCA9IChkb3VibGUpIGJlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICArICgoZG91YmxlKSBtaW5CYWQgLSAoZG91YmxlKSBiZXN0KSAvIDIuMDsKLSAgICAgICAgICAgIFJhdGlvbmFsOjpkb3VibGUyUmF0aW9uYWwobWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKHNjTWluLndpZHRoKCksIHNjTWF4LndpZHRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKGRmTWluLndpZHRoKCksIGRmTWF4LndpZHRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyLCB1cHBlcik7Ci0gICAgICAgICAgICBpZiAoKChsb3dlciA9PSBiZXN0KSAmJiAodXBwZXIgPT0gbWluQmFkKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXNlIGxvd2VyIHZhbHVlIHVubGVzcyBpdHMgYWxyZWFkeSBiZWVuIHRyaWVkCi0gICAgICAgICAgICBzZWxlY3RlZCA9IChsb3dlciAhPSBiZXN0KSA/IGxvd2VyIDogdXBwZXI7Ci0KLSAgICAgICAgICAgIC8vIEFzc2lnbiB0aGUgc2l6ZSBvZiB0aGUgc291cmNlIGNyb3AgYW5kIGRpc3BsYXkgZnJhbWUKLSAgICAgICAgICAgIC8vIGZyb20gdGhlIHNlbGVjdGVkIHJhdGlvIG9mIHNvdXJjZSBjcm9wIHRvIGRpc3BsYXkgZnJhbWUuCi0gICAgICAgICAgICBzY0RpbSA9IEh3Y1Rlc3REaW0oc2VsZWN0ZWQubnVtZXJhdG9yKCksIHNjTWluLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGRmRGltID0gSHdjVGVzdERpbShzZWxlY3RlZC5kZW5vbWluYXRvcigpLCBkZk1pbi5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgdGhlIEhXQyB3aWxsIGNvbW1pdCB0byB0aGlzIGNvbWJpbmF0aW9uCi0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGZEaW0sIHNjRGltKTsKLSAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLQotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgdGVzdFByaW50SSgiICBzY0hzY2FsZSBudW06ICV1IHNjYWxlOiAlZiBkZkRpbTogJXMgc2NEaW06ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtLCAoZmxvYXQpIFJhdGlvbmFsKHNjRGltLndpZHRoKCksIGRmRGltLndpZHRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAoKHN0cmluZykgZGZEaW0pLmNfc3RyKCksICgoc3RyaW5nKSBzY0RpbSkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bSA9PSAxKSB7Ci0gICAgICAgICAgICAvLyBIV0MgY29tbWl0dGVkIHRvIHRoZSBjb21iaW5hdGlvbgotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYmVzdCBzY2FsZSBmYWN0b3Igc2VlbiBzbyBmYXIuICBSZXBvcnQgdGhlCi0gICAgICAgICAgICAvLyBkaW1lbnNpb25zIHRvIHRoZSBjYWxsZXIsIGluIGNhc2Ugbm90aGluZyBiZXR0ZXIgaXMgc2Vlbi4KLSAgICAgICAgICAgIG91dEJlc3REZiA9IGRmRGltOwotICAgICAgICAgICAgb3V0QmVzdFNjID0gc2NEaW07Ci0KLSAgICAgICAgICAgIC8vIFN1Y2Nlc3Mgb24gdGhlIGZpcnN0IHBhc3MgbWVhbnMgdGhlIGxhcmdlc3QgcG9zc2libGUgc2NhbGUKLSAgICAgICAgICAgIC8vIGlzIHN1cHBvcnRlZCwgaW4gd2hpY2ggY2FzZSBubyBuZWVkIHRvIHNlYXJjaCBhbnkgZnVydGhlci4KLSAgICAgICAgICAgIGlmIChmaXJzdFBhc3MpIHsgcmV0dXJuIFJhdGlvbmFsKHNjRGltLndpZHRoKCksIGRmRGltLndpZHRoKCkpOyB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIGJpbmFyeSBzZWFyY2gKLSAgICAgICAgICAgIGJlc3QgPSBSYXRpb25hbChzY0RpbS53aWR0aCgpLCBkZkRpbS53aWR0aCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEhXQyBkaWRuJ3QgY29tbWl0IHRvIHRoaXMgY29tYmluYXRpb24sIHNvIHVwZGF0ZSB0aGUKLSAgICAgICAgICAgIC8vIHVwcGVyIGJvdW5kIG9mIHRoZSBiaW5hcnkgc2VhcmNoLgotICAgICAgICAgICAgbWluQmFkID0gUmF0aW9uYWwoc2NEaW0ud2lkdGgoKSwgZGZEaW0ud2lkdGgoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKLSAgICB9IHdoaWxlIChiZXN0ICE9IG1pbkJhZCk7Ci0KLSAgICByZXR1cm4gYmVzdDsKLX0KLQotLy8gU291cmNlIGNyb3AgdmVydGljYWwgc2NhbGUKLS8vIERldGVybWluZXMgdGhlIG1heGltdW0gZmFjdG9yIGJ5IHdoaWNoIHRoZSBzb3VyY2UgY3JvcCBjYW4gYmUgbGFyZ2VyCi0vLyB0aGF0IHRoZSBkaXNwbGF5IGZyYW1lLiAgVGhlIGNvbW1pdCBwb2ludCBpcyBkaXNjb3ZlcmVkIHRocm91Z2ggYQotLy8gYmluYXJ5IHNlYXJjaCBvZiByYXRpb25hbCBudW1iZXJzLiAgVGhlIG51bWVyYXRvciBpbiBlYWNoIG9mIHRoZQotLy8gcmF0aW9uYWwgbnVtYmVycyBjb250YWlucyB0aGUgZGltZW5zaW9uIGZvciB0aGUgc291cmNlIGNyb3AsIHdoaWxlCi0vLyB0aGUgZGVub21pbmF0b3Igc3BlY2lmaWVzIHRoZSBkaW1lbnNpb24gZm9yIHRoZSBkaXNwbGF5IGZyYW1lLiAgT24KLS8vIGVhY2ggcGFzcyBvZiB0aGUgYmluYXJ5IHNlYXJjaCB0aGUgbWlkLXBvaW50IGJldHdlZW4gdGhlIGdyZWF0ZXN0Ci0vLyBwb2ludCBjb21taXR0ZWQgdG8gKGJlc3QpIGFuZCB0aGUgc21hbGxlc3QgcG9pbnQgaW4gd2hpY2ggYSBjb21taXQKLS8vIGhhcyBmYWlsZWQgaXMgY2FsY3VsYXRlZC4gIFRoaXMgbWlkLXBvaW50IGlzIHRoZW4gcGFzc2VkIHRvIGEgZnVuY3Rpb24KLS8vIG5hbWVkIGRvdWJsZTJSYXRpb25hbCwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgY2xvc2VzdCByYXRpb25hbCBudW1iZXJzCi0vLyBqdXN0IGJlbG93IGFuZCBhYm92ZSB0aGUgbWlkLXBvaW50LiAgQnkgZGVmYXVsdCB0aGUgbG93ZXIgcmF0aW9uYWwKLS8vIG51bWJlciBpcyB1c2VkIGZvciB0aGUgc2NhbGUgZmFjdG9yIG9uIHRoZSBuZXh0IHBhc3Mgb2YgdGhlIGJpbmFyeQotLy8gc2VhcmNoLiAgVGhlIHVwcGVyIHZhbHVlIGlzIG9ubHkgdXNlZCB3aGVuIGJlc3QgaXMgYWxyZWFkeSBlcXVhbAotLy8gdG8gdGhlIGxvd2VyIHZhbHVlLiAgVGhpcyBvbmx5IG9jY3VycyB3aGVuIHRoZSBsb3dlciB2YWx1ZSBoYXMgYWxyZWFkeQotLy8gYmVlbiB0cmllZC4KLVJhdGlvbmFsIHNjVlNjYWxlKHVpbnQzMl90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBId2NUZXN0RGltJiBkZk1pbiwgY29uc3QgSHdjVGVzdERpbSYgZGZNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHdjVGVzdERpbSYgc2NNaW4sIGNvbnN0IEh3Y1Rlc3REaW0mIHNjTWF4LAotICAgICAgICAgICAgICAgICAgICAgIEh3Y1Rlc3REaW0mIG91dEJlc3REZiwgSHdjVGVzdERpbSYgb3V0QmVzdFNjKQotewotICAgIEh3Y1Rlc3REaW0gc2NEaW0sIGRmRGltOyAvLyBTb3VyY2UgY3JvcCBhbmQgZGlzcGxheSBmcmFtZSBkaW1lbnNpb24KLSAgICBSYXRpb25hbCBiZXN0KDAsIDEpLCBtaW5CYWQ7ICAvLyBDdXJyZW50IGJvdW5kcyBmb3IgYSBiaW5hcnkgc2VhcmNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWluR29vZCBpcyBzZXQgYmVsb3cgdGhlIGxvd2VzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIHNjYWxlLiAgVGhlIHZhbHVlIG9mIG1pbkJhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIHNldCBieSB0aGUgZmlyc3QgcGFzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBiaW5hcnkgc2VhcmNoLgotCi0gICAgLy8gUGVyZm9ybSB0aGUgcGFzc2VzIG9mIHRoZSBiaW5hcnkgc2VhcmNoCi0gICAgYm9vbCBmaXJzdFBhc3MgPSB0cnVlOwotICAgIGRvIHsKLSAgICAgICAgLy8gT24gZmlyc3QgcGFzcyB0cnkgdGhlIG1heGltdW0gc2NhbGUgd2l0aGluIHRoZSBzZWFyY2ggbGltaXRzCi0gICAgICAgIGlmIChmaXJzdFBhc3MpIHsKLSAgICAgICAgICAgIC8vIFRyeSB0aGUgbWF4aW11bSBwb3NzaWJsZSBzY2FsZSwgd2l0aGluIHRoZSBzZWFyY2ggbGltaXRzCi0gICAgICAgICAgICBzY0RpbSA9IEh3Y1Rlc3REaW0oc2NNaW4ud2lkdGgoKSwgc2VhcmNoTGltaXRzLnNvdXJjZUNyb3AuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZGZEaW0gPSBkZk1pbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFN1YnNlcXVlbnQgcGFzcwotICAgICAgICAgICAgLy8gSGFsdmUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiZXN0IGFuZCBtaW5CYWQuCi0gICAgICAgICAgICBSYXRpb25hbCBsb3dlciwgdXBwZXIsIHNlbGVjdGVkOwotCi0gICAgICAgICAgICAvLyBUcnkgdGhlIGNsb3Nlc3QgcmF0aW8gaGFsZndheSBiZXR3ZWVuIG1pbkJvb2QgYW5kIG1pbkJhZDsKLSAgICAgICAgICAgIC8vIFRPRE86IEF2b2lkIHJvdW5kaW5nIGlzc3VlIGJ5IHVzaW5nIFJhdGlvbmFsIHR5cGUgZm9yCi0gICAgICAgICAgICAvLyAgICAgICBtaWRwb2ludC4gIEZvciBub3cgd2lsbCB1c2UgZG91YmxlLCB3aGljaCBzaG91bGQKLSAgICAgICAgICAgIC8vICAgICAgIGhhdmUgbW9yZSB0aGFuIHN1ZmZpY2llbnQgcmVzb2x1dGlvbi4KLSAgICAgICAgICAgIGRvdWJsZSBtaWQgPSAoZG91YmxlKSBiZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKyAoKGRvdWJsZSkgbWluQmFkIC0gKGRvdWJsZSkgYmVzdCkgLyAyLjA7Ci0gICAgICAgICAgICBSYXRpb25hbDo6ZG91YmxlMlJhdGlvbmFsKG1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5nZShzY01pbi5oZWlnaHQoKSwgc2NNYXguaGVpZ2h0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlKGRmTWluLmhlaWdodCgpLCBkZk1heC5oZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIsIHVwcGVyKTsKLSAgICAgICAgICAgIGlmICgoKGxvd2VyID09IGJlc3QpICYmICh1cHBlciA9PSBtaW5CYWQpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVc2UgbG93ZXIgdmFsdWUgdW5sZXNzIGl0cyBhbHJlYWR5IGJlZW4gdHJpZWQKLSAgICAgICAgICAgIHNlbGVjdGVkID0gKGxvd2VyICE9IGJlc3QpID8gbG93ZXIgOiB1cHBlcjsKLQotICAgICAgICAgICAgLy8gQXNzaWduIHRoZSBzaXplIG9mIHRoZSBzb3VyY2UgY3JvcCBhbmQgZGlzcGxheSBmcmFtZQotICAgICAgICAgICAgLy8gZnJvbSB0aGUgc2VsZWN0ZWQgcmF0aW8gb2Ygc291cmNlIGNyb3AgdG8gZGlzcGxheSBmcmFtZS4KLSAgICAgICAgICAgIHNjRGltID0gSHdjVGVzdERpbShzY01pbi53aWR0aCgpLCBzZWxlY3RlZC5udW1lcmF0b3IoKSk7Ci0gICAgICAgICAgICBkZkRpbSA9IEh3Y1Rlc3REaW0oZGZNaW4ud2lkdGgoKSwgc2VsZWN0ZWQuZGVub21pbmF0b3IoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZWUgaWYgdGhlIEhXQyB3aWxsIGNvbW1pdCB0byB0aGlzIGNvbWJpbmF0aW9uCi0gICAgICAgIFJlY3RhbmdsZSByZWN0KGZvcm1hdCwgZGZEaW0sIHNjRGltKTsKLSAgICAgICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotICAgICAgICByZWN0TGlzdC5wdXNoX2JhY2socmVjdCk7Ci0gICAgICAgIHVpbnQzMl90IG51bSA9IG51bU92ZXJsYXlzKHJlY3RMaXN0KTsKLQotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgdGVzdFByaW50SSgiICBzY0hzY2FsZSBudW06ICV1IHNjYWxlOiAlZiBkZkRpbTogJXMgc2NEaW06ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtLCAoZmxvYXQpIFJhdGlvbmFsKHNjRGltLmhlaWdodCgpLCBkZkRpbS5oZWlnaHQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICgoc3RyaW5nKSBkZkRpbSkuY19zdHIoKSwgKChzdHJpbmcpIHNjRGltKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVtID09IDEpIHsKLSAgICAgICAgICAgIC8vIEhXQyBjb21taXR0ZWQgdG8gdGhlIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZXN0IHNjYWxlIGZhY3RvciBzZWVuIHNvIGZhci4gIFJlcG9ydCB0aGUKLSAgICAgICAgICAgIC8vIGRpbWVuc2lvbnMgdG8gdGhlIGNhbGxlciwgaW4gY2FzZSBub3RoaW5nIGJldHRlciBpcyBzZWVuLgotICAgICAgICAgICAgb3V0QmVzdERmID0gZGZEaW07Ci0gICAgICAgICAgICBvdXRCZXN0U2MgPSBzY0RpbTsKLQotICAgICAgICAgICAgLy8gU3VjY2VzcyBvbiB0aGUgZmlyc3QgcGFzcyBtZWFucyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzY2FsZQotICAgICAgICAgICAgLy8gaXMgc3VwcG9ydGVkLCBpbiB3aGljaCBjYXNlIG5vIG5lZWQgdG8gc2VhcmNoIGFueSBmdXJ0aGVyLgotICAgICAgICAgICAgaWYgKGZpcnN0UGFzcykgeyByZXR1cm4gUmF0aW9uYWwoc2NEaW0uaGVpZ2h0KCksIGRmRGltLmhlaWdodCgpKTsgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBiaW5hcnkgc2VhcmNoCi0gICAgICAgICAgICBiZXN0ID0gUmF0aW9uYWwoc2NEaW0uaGVpZ2h0KCksIGRmRGltLmhlaWdodCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEhXQyBkaWRuJ3QgY29tbWl0IHRvIHRoaXMgY29tYmluYXRpb24sIHNvIHVwZGF0ZSB0aGUKLSAgICAgICAgICAgIC8vIHVwcGVyIGJvdW5kIG9mIHRoZSBiaW5hcnkgc2VhcmNoLgotICAgICAgICAgICAgbWluQmFkID0gUmF0aW9uYWwoc2NEaW0uaGVpZ2h0KCksIGRmRGltLmhlaWdodCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOwotICAgIH0gd2hpbGUgKGJlc3QgIT0gbWluQmFkKTsKLQotICAgIHJldHVybiBiZXN0OwotfQotCi11aW50MzJfdCBudW1PdmVybGFwcGluZyh1aW50MzJfdCBiYWNrZ3JvdW5kRm9ybWF0LCB1aW50MzJfdCBmb3JlZ3JvdW5kRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmFja2dyb3VuZEJsZW5kLCB1aW50MzJfdCBmb3JlZ3JvdW5kQmxlbmQpCi17Ci0gICAgbGlzdDxSZWN0YW5nbGU+IHJlY3RMaXN0OwotCi0gICAgUmVjdGFuZ2xlIGJhY2tncm91bmQoYmFja2dyb3VuZEZvcm1hdCwgc3RhcnREaW0sIHN0YXJ0RGltKTsKLSAgICBiYWNrZ3JvdW5kLmJsZW5kID0gYmFja2dyb3VuZEJsZW5kOwotICAgIHJlY3RMaXN0LnB1c2hfYmFjayhiYWNrZ3JvdW5kKTsKLQotICAgIC8vIFRPRE86IEhhbmRsZSBjYXNlcyB3aGVyZSBzdGFydERpbSBpcyBzbyBzbWFsbCB0aGF0IGFkZGluZyA1Ci0gICAgLy8gICAgICAgY2F1c2VzIGZyYW1lcyBub3QgdG8gb3ZlcmxhcC4KLSAgICAvLyBUT0RPOiBIYW5kbGUgY2FzZXMgd2hlcmUgc3RhcnREaW0gaXMgc28gbGFyZ2UgdGhhdCBhZGRpbmcgNQotICAgIC8vICAgICAgIGNhdXNlIGEgcG9ydGlvbiBvciBhbGwgb2YgdGhlIGZvcmVncm91bmQgZGlzcGxheUZyYW1lCi0gICAgLy8gICAgICAgdG8gYmUgb2ZmIHRoZSBkaXNwbGF5LgotICAgIFJlY3RhbmdsZSBmb3JlZ3JvdW5kKGZvcmVncm91bmRGb3JtYXQsIHN0YXJ0RGltLCBzdGFydERpbSk7Ci0gICAgZm9yZWdyb3VuZC5kaXNwbGF5RnJhbWUubGVmdCArPSA1OwotICAgIGZvcmVncm91bmQuZGlzcGxheUZyYW1lLnRvcCArPSA1OwotICAgIGZvcmVncm91bmQuZGlzcGxheUZyYW1lLnJpZ2h0ICs9IDU7Ci0gICAgZm9yZWdyb3VuZC5kaXNwbGF5RnJhbWUuYm90dG9tICs9IDU7Ci0gICAgYmFja2dyb3VuZC5ibGVuZCA9IGZvcmVncm91bmRCbGVuZDsKLSAgICByZWN0TGlzdC5wdXNoX2JhY2soZm9yZWdyb3VuZCk7Ci0KLSAgICB1aW50MzJfdCBudW0gPSBudW1PdmVybGF5cyhyZWN0TGlzdCk7Ci0KLSAgICByZXR1cm4gbnVtOwotfQotCi1SZWN0YW5nbGU6OlJlY3RhbmdsZSh1aW50MzJfdCBncmFwaGljRm9ybWF0LCBId2NUZXN0RGltIGRmRGltLAotICAgICAgICAgICAgICAgICAgICAgSHdjVGVzdERpbSBzRGltKSA6Ci0gICAgZm9ybWF0KGdyYXBoaWNGb3JtYXQpLCB0cmFuc2Zvcm0oZGVmYXVsdFRyYW5zZm9ybSksCi0gICAgYmxlbmQoZGVmYXVsdEJsZW5kKSwgY29sb3IoZGVmYXVsdENvbG9yKSwgYWxwaGEoZGVmYXVsdEFscGhhKSwKLSAgICBzb3VyY2VDcm9wKHNEaW0pLCBkaXNwbGF5RnJhbWUoZGZEaW0pCi17Ci0gICAgLy8gU2V0IHNvdXJjZSBkaW1lbnNpb24KLSAgICAvLyBDYW4ndCB1c2UgYSBiYXNlIGluaXRpYWxpemVyLCBiZWNhdXNlIHRoZSBzZXR0aW5nIG9mIGZvcm1hdAotICAgIC8vIG11c3QgYmUgZG9uZSBiZWZvcmUgc2V0dGluZyB0aGUgc291cmNlRGltZW5zaW9uLgotICAgIHNldFNvdXJjZURpbShzRGltKTsKLX0KLQotdm9pZCBSZWN0YW5nbGU6OnNldFNvdXJjZURpbShId2NUZXN0RGltIGRpbSkKLXsKLSAgICB0aGlzLT5zb3VyY2VEaW0gPSBkaW07Ci0KLSAgICBjb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgKmF0dHJpYjsKLSAgICBhdHRyaWIgPSBod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cCh0aGlzLT5mb3JtYXQpOwotICAgIGlmIChhdHRyaWIgIT0gTlVMTCkgewotICAgICAgICBpZiAoc291cmNlRGltLndpZHRoKCkgJSBhdHRyaWItPndNb2QpIHsKLSAgICAgICAgICAgIHNvdXJjZURpbS5zZXRXaWR0aChzb3VyY2VEaW0ud2lkdGgoKSArIGF0dHJpYi0+d01vZAotICAgICAgICAgICAgLSAoc291cmNlRGltLndpZHRoKCkgJSBhdHRyaWItPndNb2QpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc291cmNlRGltLmhlaWdodCgpICUgYXR0cmliLT5oTW9kKSB7Ci0gICAgICAgICAgICBzb3VyY2VEaW0uc2V0SGVpZ2h0KHNvdXJjZURpbS5oZWlnaHQoKSArIGF0dHJpYi0+aE1vZAotICAgICAgICAgICAgLSAoc291cmNlRGltLmhlaWdodCgpICUgYXR0cmliLT5oTW9kKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFJhdGlvbmFsIG1lbWJlciBmdW5jdGlvbnMKLWJvb2wgUmF0aW9uYWw6Om9wZXJhdG9yPT0oY29uc3QgUmF0aW9uYWwmIG90aGVyKSBjb25zdAotewotICAgIGlmICgoKHVpbnQ2NF90KSBfbiAqIG90aGVyLl9kKQotICAgICAgICA9PSAoKHVpbnQ2NF90KSBfZCAqIG90aGVyLl9uKSkgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFJhdGlvbmFsOjpvcGVyYXRvcjwoY29uc3QgUmF0aW9uYWwmIG90aGVyKSBjb25zdAotewotICAgIGlmICgoKHVpbnQ2NF90KSBfbiAqIG90aGVyLl9kKQotICAgICAgICA8ICgodWludDY0X3QpIF9kICogb3RoZXIuX24pKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVJhdGlvbmFsOjpvcGVyYXRvciBzdHJpbmcoKSBjb25zdAotewotICAgIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gICAgb3V0IDw8IF9uIDw8ICcvJyA8PCBfZDsKLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXZvaWQgUmF0aW9uYWw6OmRvdWJsZTJSYXRpb25hbChkb3VibGUgZiwgUmFuZ2UgblJhbmdlLCBSYW5nZSBkUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgIFJhdGlvbmFsJiBsb3dlciwgUmF0aW9uYWwmIHVwcGVyKQotewotICAgIFJhdGlvbmFsIGJlc3RMb3dlcihuUmFuZ2UubG93ZXIoKSwgZFJhbmdlLnVwcGVyKCkpOwotICAgIFJhdGlvbmFsIGJlc3RVcHBlcihuUmFuZ2UudXBwZXIoKSwgZFJhbmdlLmxvd2VyKCkpOwotCi0gICAgLy8gU2VhcmNoIGZvciBhIGJldHRlciBzb2x1dGlvbgotICAgIGZvciAodWludDMyX3QgZCA9IGRSYW5nZS5sb3dlcigpOyBkIDw9IGRSYW5nZS51cHBlcigpOyBkKyspIHsKLSAgICAgICAgUmF0aW9uYWwgdmFsKGQgKiBmLCBkKTsgIC8vIExvd2VyLCBiZWNhdXNlIGRvdWJsZSB0byBpbnQgY2FzdCB0cnVuY2F0ZXMKLQotICAgICAgICBpZiAoKHZhbC5udW1lcmF0b3IoKSA8IG5SYW5nZS5sb3dlcigpKQotICAgICAgICAgICAgfHwgKHZhbC5udW1lcmF0b3IoKSA+IG5SYW5nZS51cHBlcigpKSkgeyBjb250aW51ZTsgfQotCi0gICAgICAgIGlmICgoKGRvdWJsZSkgdmFsID4gKGRvdWJsZSkgYmVzdExvd2VyKSAmJiAoKGRvdWJsZSkgdmFsIDw9IGYpKSB7Ci0gICAgICAgICAgICBiZXN0TG93ZXIgPSB2YWw7Ci0gICAgICAgIH0gCi0KLSAgICAgICAgdmFsLnNldE51bWVyYXRvcih2YWwubnVtZXJhdG9yKCkgKyAxKTsKLSAgICAgICAgaWYgKHZhbC5udW1lcmF0b3IoKSA+IG5SYW5nZS51cHBlcigpKSB7IGNvbnRpbnVlOyB9Ci0KLSAgICAgICAgaWYgKCgoZG91YmxlKSB2YWwgPCAoZG91YmxlKSBiZXN0VXBwZXIpICYmICgoZG91YmxlKSB2YWwgPj0gZikpIHsKLSAgICAgICAgICAgIGJlc3RVcHBlciA9IHZhbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGxvd2VyID0gYmVzdExvd2VyOwotICAgIHVwcGVyID0gYmVzdFVwcGVyOwotfQotCi0vLyBMb2NhbCBmdW5jdGlvbnMKLQotLy8gTnVtIE92ZXJsYXlzCi0vLyBHaXZlbiBhIGxpc3Qgb2YgcmVjdGFuZ2xlcywgZGV0ZXJtaW5lIGhvdyBtYW55IEhXQyB3aWxsIGNvbW1pdCB0byByZW5kZXIKLXVpbnQzMl90IG51bU92ZXJsYXlzKGxpc3Q8UmVjdGFuZ2xlPiYgcmVjdExpc3QpCi17Ci0gICAgaHdjX2xheWVyX2xpc3RfdCAqaHdjTGlzdDsKLSAgICBsaXN0PHNwPEdyYXBoaWNCdWZmZXI+ID4gYnVmZmVyczsKLQotICAgIGh3Y0xpc3QgPSBod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0KHJlY3RMaXN0LnNpemUoKSk7Ci0gICAgaWYgKGh3Y0xpc3QgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJudW1PdmVybGF5cyBjcmVhdGUgaHdjTGlzdCBmYWlsZWQiKTsKLSAgICAgICAgZXhpdCgzMCk7Ci0gICAgfQotCi0gICAgaHdjX2xheWVyX3QgKmxheWVyID0gJmh3Y0xpc3QtPmh3TGF5ZXJzWzBdOwotICAgIGZvciAoc3RkOjpsaXN0PFJlY3RhbmdsZT46Oml0ZXJhdG9yIGl0ID0gcmVjdExpc3QuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHJlY3RMaXN0LmVuZCgpOyArK2l0LCArK2xheWVyKSB7Ci0gICAgICAgIC8vIEFsbG9jYXRlIHRoZSB0ZXh0dXJlIGZvciB0aGUgc291cmNlIGZyYW1lCi0gICAgICAgIC8vIGFuZCBwdXNoIGl0IG9udG8gdGhlIGJ1ZmZlcnMgbGlzdCwgc28gdGhhdCBpdAotICAgICAgICAvLyBzdGF5cyBpbiBzY29wZSB1bnRpbCBhIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24uCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IHRleHR1cmU7Ci0gICAgICAgIHRleHR1cmUgID0gbmV3IEdyYXBoaWNCdWZmZXIoaXQtPnNvdXJjZURpbS53aWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5zb3VyY2VEaW0uaGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPmZvcm1hdCwgdGV4VXNhZ2UpOwotICAgICAgICBidWZmZXJzLnB1c2hfYmFjayh0ZXh0dXJlKTsKLQotICAgICAgICBsYXllci0+aGFuZGxlID0gdGV4dHVyZS0+aGFuZGxlOwotICAgICAgICBsYXllci0+YmxlbmRpbmcgPSBpdC0+YmxlbmQ7Ci0gICAgICAgIGxheWVyLT50cmFuc2Zvcm0gPSBpdC0+dHJhbnNmb3JtOwotICAgICAgICBsYXllci0+c291cmNlQ3JvcCA9IGl0LT5zb3VyY2VDcm9wOwotICAgICAgICBsYXllci0+ZGlzcGxheUZyYW1lID0gaXQtPmRpc3BsYXlGcmFtZTsKLQotICAgICAgICBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbi5udW1SZWN0cyA9IDE7Ci0gICAgICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLnJlY3RzID0gJmxheWVyLT5kaXNwbGF5RnJhbWU7Ci0gICAgfQotCi0gICAgLy8gUGVyZm9ybSBwcmVwYXJlIG9wZXJhdGlvbgotICAgIGlmICh2ZXJib3NlKSB7IHRlc3RQcmludEkoIlByZXBhcmU6Iik7IGh3Y1Rlc3REaXNwbGF5TGlzdChod2NMaXN0KTsgfQotICAgIGh3Y0RldmljZS0+cHJlcGFyZShod2NEZXZpY2UsIGh3Y0xpc3QpOwotICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIHRlc3RQcmludEkoIlBvc3QgUHJlcGFyZToiKTsKLSAgICAgICAgaHdjVGVzdERpc3BsYXlMaXN0UHJlcGFyZU1vZGlmaWFibGUoaHdjTGlzdCk7Ci0gICAgfQotCi0gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBvdmVybGF5cwotICAgIHVpbnQzMl90IHRvdGFsID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgaHdjTGlzdC0+bnVtSHdMYXllcnM7IG4xKyspIHsKLSAgICAgICAgaWYgKGh3Y0xpc3QtPmh3TGF5ZXJzW24xXS5jb21wb3NpdGlvblR5cGUgPT0gSFdDX09WRVJMQVkpIHsKLSAgICAgICAgICAgIHRvdGFsKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGcmVlIHRoZSBsYXllciBsaXN0IGFuZCBncmFwaGljIGJ1ZmZlcnMKLSAgICBod2NUZXN0RnJlZUxheWVyTGlzdChod2NMaXN0KTsKLQotICAgIHJldHVybiB0b3RhbDsKLX0KLQotc3RyaW5nIHRyYW5zZm9ybUxpc3Qyc3RyKGNvbnN0IGxpc3Q8dWludDMyX3Q+JiB0cmFuc2Zvcm1MaXN0KQotewotICAgIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gICAgZm9yIChsaXN0PHVpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0cmFuc2Zvcm1MaXN0LmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSB0cmFuc2Zvcm1MaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHVpbnQzMl90IGlkID0gKml0OwotCi0gICAgICAgIGlmIChpdCAhPSB0cmFuc2Zvcm1MaXN0LmJlZ2luKCkpIHsKLSAgICAgICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBpZDsKLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpZHggPSAwOyBpZHggPCBOVU1BKHRyYW5zZm9ybVR5cGUpOyBpZHgrKykgewotICAgICAgICAgICAgaWYgKGlkID09IHRyYW5zZm9ybVR5cGVbaWR4XS5pZCkgewotICAgICAgICAgICAgICAgIG91dCA8PCAiICgiIDw8IHRyYW5zZm9ybVR5cGVbaWR4XS5kZXNjIDw8ICcpJzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyBibGVuZExpc3Qyc3RyKGNvbnN0IGxpc3Q8dWludDMyX3Q+JiBibGVuZExpc3QpCi17Ci0gICAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgICBmb3IgKGxpc3Q8dWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGJsZW5kTGlzdC5iZWdpbigpOwotICAgICAgICAgaXQgIT0gYmxlbmRMaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIHVpbnQzMl90IGlkID0gKml0OwotCi0gICAgICAgIGlmIChpdCAhPSBibGVuZExpc3QuYmVnaW4oKSkgewotICAgICAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8IGlkOwotCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGlkeCA9IDA7IGlkeCA8IE5VTUEoYmxlbmRUeXBlKTsgaWR4KyspIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBibGVuZFR5cGVbaWR4XS5pZCkgewotICAgICAgICAgICAgICAgIG91dCA8PCAiICgiIDw8IGJsZW5kVHlwZVtpZHhdLmRlc2MgPDwgJyknOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotdm9pZCBpbml0KHZvaWQpCi17Ci0gICAgc3JhbmQ0OCgwKTsKLQotICAgIGh3Y1Rlc3RJbml0RGlzcGxheSh2ZXJib3NlLCAmZHB5LCAmc3VyZmFjZSwgJndpZHRoLCAmaGVpZ2h0KTsKLQotICAgIGh3Y1Rlc3RPcGVuSHdjKCZod2NEZXZpY2UpOwotfQotCi12b2lkIHByaW50Rm9ybWF0SGVhZGluZ3Moc2l6ZV90IGluZGVudCkKLXsKLSAgICBmb3IgKHNpemVfdCByb3cgPSAwOyByb3cgPD0gbWF4SGVhZGluZ0xlbjsgcm93KyspIHsKLSAgICAgICAgb3N0cmluZ3N0cmVhbSBsaW5lOwotICAgICAgICBmb3IodmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gZm9ybWF0cy5iZWdpbigpOwotICAgICAgICAgICAgaXQgIT0gZm9ybWF0cy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgaWYgKChtYXhIZWFkaW5nTGVuIC0gcm93KSA8PSBpdC0+bGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAocm93ICE9IG1heEhlYWRpbmdMZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjaCA9ICgqaXQpW2l0LT5sZW5ndGgoKSAtIChtYXhIZWFkaW5nTGVuIC0gcm93KV07Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPDwgJyAnIDw8IHNldHcocHJpbnRGaWVsZFdpZHRoKSA8PCBjaDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5lIDw8ICcgJyA8PCBzdHJpbmcocHJpbnRGaWVsZFdpZHRoLCAnLScpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBsaW5lIDw8ICcgJyA8PCBzZXR3KHByaW50RmllbGRXaWR0aCkgPDwgIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdFByaW50SSgiJSpzJXMiLCBpbmRlbnQgKyBtYXhIZWFkaW5nTGVuLCAiIiwKLSAgICAgICAgICAgICAgICAgICBsaW5lLnN0cigpLmNfc3RyKCkpOwotICAgIH0KLX0KLQotdm9pZCBwcmludE92ZXJsYXBMaW5lKHNpemVfdCBpbmRlbnQsIGNvbnN0IHN0cmluZyBmb3JtYXRTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dWludDMyX3Q+JiByZXN1bHRzKQotewotICAgIG9zdHJpbmdzdHJlYW0gbGluZTsKLQotICAgIGxpbmUgPDwgc2V0dyhpbmRlbnQgKyBtYXhIZWFkaW5nTGVuIC0gZm9ybWF0U3RyLmxlbmd0aCgpKSA8PCAiIjsKLQotICAgIGxpbmUgPDwgZm9ybWF0U3RyOwotCi0gICAgZm9yICh2ZWN0b3I8dWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlc3VsdHMuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHJlc3VsdHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgbGluZSA8PCAnICcgPDwgc2V0dyhwcmludEZpZWxkV2lkdGgpIDw8ICppdDsKLSAgICB9Ci0KLSAgICB0ZXN0UHJpbnRJKCIlcyIsIGxpbmUuc3RyKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgcHJpbnRTeW50YXgoY29uc3QgY2hhciAqY21kKQotewotICAgIHRlc3RQcmludEUoIiAgJXMgW29wdGlvbnNdIFtncmFwaGljRm9ybWF0XSAuLi4iLAotICAgICAgICAgICAgICAgY21kKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgb3B0aW9uczoiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtcyBbd2lkdGgsIGhlaWdodF0gLSBzdGFydCBkaW1lbnNpb24iKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtdiAtIFZlcmJvc2UiKTsKLSAgICB0ZXN0UHJpbnRFKCIiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgZ3JhcGhpYyBmb3JtYXRzOiIpOwotICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBOVU1BKGh3Y1Rlc3RHcmFwaGljRm9ybWF0KTsgbjErKykgewotICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAlcyIsIGh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXS5kZXNjKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y1JlY3RzLmNwcCBiL29wZW5nbC90ZXN0cy9od2MvaHdjUmVjdHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjMTY5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvaHdjUmVjdHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotICogSGFyZHdhcmUgQ29tcG9zZXIgUmVjdGFuZ2xlcwotICoKLSAqIFN5bm9wc2lzCi0gKiAgIGh3Y1JlY3RzIFtvcHRpb25zXSAoZ3JhcGhpY0Zvcm1hdCBkaXNwbGF5RnJhbWUgW2F0dHJpYnV0ZXNdLCkuLi4KLSAqICAgICBvcHRpb25zOgotICogICAgICAgLUQgIy4jIyAtIEVuZCBvZiB0ZXN0IGRlbGF5Ci0gKiAgICAgICAtdiAtIFZlcmJvc2UKLSAqCi0gKiAgICAgIGdyYXBoaWMgZm9ybWF0czoKLSAqICAgICAgICBSR0JBODg4OCAocmVmZXJlbmNlIGZyYW1lIGRlZmF1bHQpCi0gKiAgICAgICAgUkdCWDg4ODgKLSAqICAgICAgICBSR0I4ODgKLSAqICAgICAgICBSR0I1NjUKLSAqICAgICAgICBCR1JBODg4OAotICogICAgICAgIFJHQkE1NTUxCi0gKiAgICAgICAgUkdCQTQ0NDQKLSAqICAgICAgICBZVjEyCi0gKgotICogICAgICBkaXNwbGF5RnJhbWUKLSAqICAgICAgICBbbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXQotICoKLSAqICAgICAgYXR0cmlidXRlczoKLSAqICAgICAgICB0cmFuc2Zvcm06IG5vbmUgfCBmbGlwaCB8IGZsaXB2IHwgcm90OTAgfCByb3QxODAgfCByb3QyNzAKLSAqICAgICAgICBibGVuZDogbm9uZSB8IHByZW11bHQgfCBjb3ZlcmFnZQotICogICAgICAgIGNvbG9yOiBbMC4jIywgMC4jIywgMC4jI10KLSAqICAgICAgICBhbHBoYTogMC4jIwotICogICAgICAgIHNvdXJjZURpbTogW3dpZHRoLCBoZWlnaHRdCi0gKiAgICAgICAgc291cmNlQ3JvcDogW2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbV0KLSAqCi0gKiAgICAgIEV4YW1wbGU6Ci0gKiAgICAgICAgIyBXaGl0ZSBZVjEyIHJlY3RhbmdsZSwgd2l0aCBvdmVybGFwcGluZyB0dXJxdW9pc2UKLSAqICAgICAgICAjICBSR0JBODg4OCByZWN0YW5nbGUgYXQgMzAlJSAoYWxwaGE6IDAuNykgdHJhbnNwYXJlbmN5Ci0gKiAgICAgICAgaHdjUmVjdHMgLXYgLUQgMzAuMCBcCi0gKiAgICAgICAgICBZVjEyIFs1MCwgODAsIDIwMCwgMzAwXSB0cmFuc2Zvcm06IG5vbmUgXAotICogICAgICAgICAgICBjb2xvcjogWzEuMCwgMC41LCAwLjVdLCBcCi0gKiAgICAgICAgICBSR0JBODg4OCBbMTAwLCAxNTAsIDMwMCwgNDAwXSBibGVuZDogY292ZXJhZ2UgXAotICogICAgICAgICAgICBjb2xvcjogWzAuMjUxLCAwLjg3OCwgMC44MTZdIGFscGhhOiAwLjcgXAotICogICAgICAgICAgICBzb3VyY2VEaW06IFs1MCwgNjBdIHNvdXJjZUNyb3A6IFs1LCA4LCAxMiwgMTVdCi0gKgotICogRGVzY3JpcHRpb24KLSAqICAgQ29uc3RydWN0cyBhIEhhcmR3YXJlIENvbXBvc2VyIChIV0MpIGxpc3Qgb2YgZnJhbWVzIGZyb20KLSAqICAgY29tbWFuZC1saW5lIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiAgVGhlbiBzZW5kcyBpdCB0byB0aGUgSFdDCi0gKiAgIGJlIHJlbmRlcmVkLiAgVGhlIGludGVuZGVkIHB1cnBvc2Ugb2YgdGhpcyB0b29sIGlzIGFzIGEgbWVhbnMgdG8KLSAqICAgcmVwcm9kdWNlIGFuZCBzdWNjaW5jdGx5IHNwZWNpZnkgYW4gb2JzZXJ2ZWQgSFdDIG9wZXJhdGlvbiwgd2l0aAotICogICBubyBuZWVkIHRvIG1vZGlmeS9jb21waWxlIGEgcHJvZ3JhbS4KLSAqCi0gKiAgIFRoZSBjb21tYW5kLWxpbmUgc3ludGF4IGNvbnNpc3RzIG9mIGEgZmV3IHN0YW5kYXJkIGNvbW1hbmQtbGluZQotICogICBvcHRpb25zIGFuZCB0aGVuIGEgZGVzY3JpcHRpb24gb2Ygb25lIG9yIG1vcmUgZnJhbWVzLiAgVGhlIGZyYW1lCi0gKiAgIGRlc2NyaXB0aW9ucyBhcmUgc2VwYXJhdGVkIGZyb20gb25lIGFub3RoZXIgdmlhIGEgY29tbWEuICBUaGUKLSAqICAgYmVnaW5uaW5nIG9mIGEgZnJhbWUgZGVzY3JpcHRpb24gcmVxdWlyZXMgdGhlIHNwZWNpZmljYXRpb24KLSAqICAgb2YgdGhlIGdyYXBoaWMgZm9ybWF0IGFuZCB0aGVuIHRoZSBkaXNwbGF5IGZyYW1lIHJlY3RhbmdsZSB3aGVyZQotICogICB0aGUgZnJhbWUgd2lsbCBiZSBkaXNwbGF5ZWQuICBUaGUgZGlzcGxheSBmcmFtZSByZWN0YW5nbGUgaXMKLSAqICAgc3BlY2lmaWVkIGFzIGZvbGxvd3MsIHdpdGggdGhlIHJpZ2h0IGFuZCBib3R0b20gY29vcmRpbmF0ZXMgYmVpbmcKLSAqICAgZXhjbHVzaXZlIHZhbHVlczoKLSAqCi0gKiAgICAgW2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbV0KLSAqICAgIAotICogICBBZnRlciB0aGVzZSB0d28gcmVxdWlyZWQgcGFyYW1ldGVycyBlYWNoIGZyYW1lIGRlc2NyaXB0aW9uIGNhbgotICogICBzcGVjaWZ5IDEgb3IgbW9yZSBvcHRpb25hbCBhdHRyaWJ1dGVzLiAgVGhlIG5hbWUgb2YgZWFjaCBvcHRpb25hbAotICogICBhdHRyaWJ1dGUgaXMgcHJlY2VkZWQgYnkgYSBjb2xvbi4gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCi0gKiAgIHRoZW4gcmVxdWlyZXMgd2hpdGUgc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uIGFuZCB0aGVuIHRoZSB2YWx1ZSBvZgotICogICB0aGUgYXR0cmlidXRlIGlzIHNwZWNpZmllZC4gIFNlZSB0aGUgc3lub3BzaXMgc2VjdGlvbiBhYm92ZSBmb3IKLSAqICAgYSBsaXN0IG9mIGF0dHJpYnV0ZXMgYW5kIHRoZSBmb3JtYXQgb2YgdGhlaXIgZXhwZWN0ZWQgdmFsdWUuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxjZXJybm8+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjdGltZT4KLSNpbmNsdWRlIDxpc3RyZWFtPgotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi0jZGVmaW5lIExPR19UQUcgImh3Y1JlY3RzVGVzdCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx0ZXN0VXRpbC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0jaW5jbHVkZSA8Z2xUZXN0TGliLmg+Ci0jaW5jbHVkZSAiaHdjVGVzdExpYi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLS8vIERlZmF1bHRzCi1jb25zdCBib29sIGRlZmF1bHRWZXJib3NlID0gZmFsc2U7Ci1jb25zdCBmbG9hdCBkZWZhdWx0RW5kRGVsYXkgPSAyLjA7IC8vIERlZmF1bHQgZGVsYXkgYWZ0ZXIgcmVuZGVyaW5nIGdyYXBoaWNzCi0KLWNvbnN0IHVpbnQzMl90ICAgZGVmYXVsdEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotY29uc3QgaW50MzJfdCAgICBkZWZhdWx0VHJhbnNmb3JtID0gMDsKLWNvbnN0IHVpbnQzMl90ICAgZGVmYXVsdEJsZW5kID0gSFdDX0JMRU5ESU5HX05PTkU7Ci1jb25zdCBDb2xvckZyYWN0IGRlZmF1bHRDb2xvcigwLjUsIDAuNSwgMC41KTsKLWNvbnN0IGZsb2F0ICAgICAgZGVmYXVsdEFscGhhID0gMS4wOyAvLyBPcGFxdWUKLWNvbnN0IEh3Y1Rlc3REaW0gZGVmYXVsdFNvdXJjZURpbSgxLCAxKTsKLWNvbnN0IHN0cnVjdCBod2NfcmVjdCBkZWZhdWx0U291cmNlQ3JvcCA9IHswLCAwLCAxLCAxfTsKLWNvbnN0IHN0cnVjdCBod2NfcmVjdCBkZWZhdWx0RGlzcGxheUZyYW1lID0gezAsIDAsIDEwMCwgMTAwfTsKLQotLy8gRGVmaW5lcwotI2RlZmluZSBNQVhDTUQgICAgICAgICAgICAgICAyMDAKLSNkZWZpbmUgQ01EX1NUT1BfRlJBTUVXT1JLICAgInN0b3AgMj4mMSIKLSNkZWZpbmUgQ01EX1NUQVJUX0ZSQU1FV09SSyAgInN0YXJ0IDI+JjEiCi0KLS8vIE1hY3JvcwotI2RlZmluZSBOVU1BKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYSBbMF0pKSAvLyBOdW0gZWxlbWVudHMgaW4gYW4gYXJyYXkKLQotLy8gTG9jYWwgdHlwZXMKLWNsYXNzIFJlY3RhbmdsZSB7Ci1wdWJsaWM6Ci0gICAgUmVjdGFuZ2xlKCkgOiBmb3JtYXQoZGVmYXVsdEZvcm1hdCksIHRyYW5zZm9ybShkZWZhdWx0VHJhbnNmb3JtKSwKLSAgICAgICAgICAgICAgICAgIGJsZW5kKGRlZmF1bHRCbGVuZCksIGNvbG9yKGRlZmF1bHRDb2xvciksCi0gICAgICAgICAgICAgICAgICBhbHBoYShkZWZhdWx0QWxwaGEpLCBzb3VyY2VEaW0oZGVmYXVsdFNvdXJjZURpbSksCi0gICAgICAgICAgICAgICAgICBzb3VyY2VDcm9wKGRlZmF1bHRTb3VyY2VDcm9wKSwKLSAgICAgICAgICAgICAgICAgIGRpc3BsYXlGcmFtZShkZWZhdWx0RGlzcGxheUZyYW1lKSB7fTsKLQotICAgIHVpbnQzMl90ICAgICBmb3JtYXQ7Ci0gICAgdWludDMyX3QgICAgIHRyYW5zZm9ybTsKLSAgICBpbnQzMl90ICAgICAgYmxlbmQ7Ci0gICAgQ29sb3JGcmFjdCAgIGNvbG9yOwotICAgIGZsb2F0ICAgICAgICBhbHBoYTsKLSAgICBId2NUZXN0RGltICAgc291cmNlRGltOwotICAgIHN0cnVjdCBod2NfcmVjdCAgIHNvdXJjZUNyb3A7Ci0gICAgc3RydWN0IGh3Y19yZWN0ICAgZGlzcGxheUZyYW1lOwotCi0gICAgc3A8R3JhcGhpY0J1ZmZlcj4gdGV4dHVyZTsKLX07Ci0KLS8vIEdsb2JhbHMKLWxpc3Q8UmVjdGFuZ2xlPiByZWN0YW5nbGU7Ci1zdGF0aWMgY29uc3QgaW50IHRleFVzYWdlID0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfVEVYVFVSRSB8Ci0gICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1dSSVRFX1JBUkVMWTsKLXN0YXRpYyBod2NfY29tcG9zZXJfZGV2aWNlX3QgKmh3Y0RldmljZTsKLXN0YXRpYyBFR0xEaXNwbGF5IGRweTsKLXN0YXRpYyBFR0xTdXJmYWNlIHN1cmZhY2U7Ci1zdGF0aWMgRUdMaW50IHdpZHRoLCBoZWlnaHQ7Ci0KLS8vIEZ1bmN0aW9uIHByb3RvdHlwZXMKLXN0YXRpYyBSZWN0YW5nbGUgcGFyc2VSZWN0KHN0cmluZyByZWN0U3RyKTsKLXZvaWQgaW5pdCh2b2lkKTsKLXZvaWQgcHJpbnRTeW50YXgoY29uc3QgY2hhciAqY21kKTsKLQotLy8gQ29tbWFuZC1saW5lIG9wdGlvbiBzZXR0aW5ncwotc3RhdGljIGJvb2wgdmVyYm9zZSA9IGRlZmF1bHRWZXJib3NlOwotc3RhdGljIGZsb2F0IGVuZERlbGF5ID0gZGVmYXVsdEVuZERlbGF5OwotCi0vKgotICogTWFpbgotICoKLSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgaGlnaC1sZXZlbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zOgotICoKLSAqICAgMS4gUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMKLSAqCi0gKiAgIDIuIFN0b3AgZnJhbWV3b3JrCi0gKgotICogICAzLiBJbml0aWFsaXphdGlvbgotICoKLSAqICAgNC4gUGFyc2UgZnJhbWUgZGVzY3JpcHRpb25zCi0gKgotICogICA1LiBDcmVhdGUgSFdDIGxpc3QgZnJvbSBmcmFtZSBkZXNjcmlwdGlvbnMKLSAqCi0gKiAgIDYuIEhhdmUgSFdDIHJlbmRlciB0aGUgbGlzdCBkZXNjcmlwdGlvbiBvZiB0aGUgZnJhbWVzCi0gKgotICogICA3LiBEZWxheSBmb3IgYW1vdW50IG9mIHRpbWUgZ2l2ZW4gYnkgZW5kRGVsYXkKLSAqCi0gKiAgIDguIFN0YXJ0IGZyYW1ld29yawotICovCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLSAgICBpbnQgICAgIHJ2LCBvcHQ7Ci0gICAgY2hhciAgICpjaHB0cjsKLSAgICBib29sICAgIGVycm9yOwotICAgIHN0cmluZyAgc3RyOwotICAgIGNoYXIgY21kW01BWENNRF07Ci0KLSAgICB0ZXN0U2V0TG9nQ2F0VGFnKExPR19UQUcpOwotCi0gICAgLy8gUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICAgIHdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJEOnY/aCIpKSAhPSAtMSkgewotICAgICAgICBzd2l0Y2ggKG9wdCkgewotICAgICAgICAgIGNhc2UgJ0QnOiAvLyBFbmQgb2YgdGVzdCBkZWxheQotICAgICAgICAgICAgZW5kRGVsYXkgPSBzdHJ0b2Qob3B0YXJnLCAmY2hwdHIpOwotICAgICAgICAgICAgaWYgKCgqY2hwdHIgIT0gJ1wwJykgfHwgKGVuZERlbGF5IDwgMC4wKSkgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBlbmQgb2YgdGVzdCBkZWxheSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAib2Y6ICVzIiwgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICd2JzogLy8gVmVyYm9zZQotICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ2gnOiAvLyBIZWxwCi0gICAgICAgICAgY2FzZSAnPyc6Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50U3ludGF4KGJhc2VuYW1lKGFyZ3ZbMF0pKTsKLSAgICAgICAgICAgIGV4aXQoKChvcHRvcHQgPT0gMCkgfHwgKG9wdG9wdCA9PSAnPycpKSA/IDAgOiAyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFN0b3AgZnJhbWV3b3JrCi0gICAgcnYgPSBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJXMiLCBDTURfU1RPUF9GUkFNRVdPUkspOwotICAgIGlmIChydiA+PSAoc2lnbmVkKSBzaXplb2YoY21kKSAtIDEpIHsKLSAgICAgICAgdGVzdFByaW50RSgiQ29tbWFuZCB0b28gbG9uZyBmb3I6ICVzIiwgQ01EX1NUT1BfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCgzKTsKLSAgICB9Ci0gICAgdGVzdEV4ZWNDbWQoY21kKTsKLSAgICB0ZXN0RGVsYXkoMS4wKTsgLy8gVE9ETyAtIG5lZWRzIG1lYW5zIHRvIHF1ZXJ5IHdoZXRoZXIgYXN5bmNyb25vdXMgc3RvcAotICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXdvcmsgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuICBGb3Igbm93LCBqdXN0IHdhaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gYSBsb25nIHRpbWUuCi0KLSAgICBpbml0KCk7Ci0KLSAgICAvLyBQYXJzZSByZWN0YW5nbGUgZGVzY3JpcHRpb25zCi0gICAgaW50IG51bU9wZW4gPSAwOyAvLyBDdXJyZW50IG51bWJlciBvZiB1bm1hdGNoZWQgPFsKLSAgICBzdHJpbmcgcmVjdERlc2MoIiIpOyAvLyBTdHJpbmcgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgcmVjdGFuZ2xlCi0gICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKLSAgICAgICAgc3RyaW5nIGFyZ05leHQgPSBzdHJpbmcoYXJndltvcHRpbmQrK10pOwotCi0gICAgICAgIGlmIChyZWN0RGVzYy5sZW5ndGgoKSkgeyByZWN0RGVzYyArPSAnICc7IH0KLSAgICAgICAgcmVjdERlc2MgKz0gYXJnTmV4dDsKLQotICAgICAgICAvLyBDb3VudCBudW1iZXIgb2Ygb3BlbmluZyA8WyBhbmQgbWF0Y2hpbmcgPl0KLSAgICAgICAgLy8gQXQgdGhpcyBwb2ludCBub3Qgd29ycmllZCBhYm91dCBhbiBvcGVuaW5nIGNoYXJhY3RlciBiZWluZwotICAgICAgICAvLyBtYXRjaGVkIGJ5IGl0J3MgY29ycmVzcG9uZGluZyBjbG9zaW5nIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLAotICAgICAgICAvLyAiPDEuMCwgMi4wXSIgaXMgaW5jb3JyZWN0IGJlY2F1c2UgdGhlIG9wZW5pbmcgPCBzaG91bGQgYmUgbWF0Y2hlZAotICAgICAgICAvLyB3aXRoIGEgY2xvc2luZyA+LCBpbnN0ZWFkIG9mIHRoZSBjbG9zaW5nIF0uICBTdWNoIGVycm9ycyBhcmUKLSAgICAgICAgLy8gZGV0ZWN0ZWQgd2hlbiB0aGUgYWN0dWFsIHZhbHVlIGlzIHBhcnNlZC4KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgbjEgPSAwOyBuMSA8IGFyZ05leHQubGVuZ3RoKCk7IG4xKyspIHsKLSAgICAgICAgICAgIHN3aXRjaChhcmdOZXh0W24xXSkgewotICAgICAgICAgICAgICBjYXNlICdbJzoKLSAgICAgICAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICAgICAgbnVtT3BlbisrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgJ10nOgotICAgICAgICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgICAgICBudW1PcGVuLS07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEVycm9yIGFueXRpbWUgdGhlcmUgaXMgbW9yZSBjbG9zaW5nIHRoZW4gb3BlbmluZyBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBpZiAobnVtT3BlbiA8IDApIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRJKCJNaXNtYXRjaGVkIG51bWJlciBvZiBvcGVuaW5nIDxbIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsb3NpbmcgPl0gaW46ICVzIiwgcmVjdERlc2MuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIERlc2NyaXB0aW9uIG9mIGEgcmVjdGFuZ2xlIGlzIGNvbXBsZXRlIHdoZW4gYWxsIG9wZW5pbmcKLSAgICAgICAgLy8gPFsgYXJlIGNsb3NlZCB3aXRoID5dIGFuZCB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIGNvbW1hIG9yCi0gICAgICAgIC8vIHRoZXJlIGFyZSBubyBtb3JlIGFyZ3MuCi0gICAgICAgIGlmICgobnVtT3BlbiA9PSAwKSAmJiByZWN0RGVzYy5sZW5ndGgoKQotICAgICAgICAgICAgJiYgKChyZWN0RGVzY1tyZWN0RGVzYy5sZW5ndGgoKSAtIDFdID09ICcsJykKLSAgICAgICAgICAgICAgICB8fCAob3B0aW5kID09IGFyZ2MpKSkgewotICAgICAgICAgICAgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGlmIGl0IGlzIHByZXNlbnQKLSAgICAgICAgICAgIGlmIChyZWN0RGVzY1tyZWN0RGVzYy5sZW5ndGgoKSAtIDFdID09ICcsJykgewotICAgICAgICAgICAgICAgIHJlY3REZXNjLmVyYXNlKHJlY3REZXNjLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFBhcnNlIHN0cmluZyBkZXNjcmlwdGlvbiBvZiByZWN0YW5nbGUKLSAgICAgICAgICAgIFJlY3RhbmdsZSByZWN0ID0gcGFyc2VSZWN0KHJlY3REZXNjKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRvIHRoZSBsaXN0IG9mIHJlY3RhbmdsZXMKLSAgICAgICAgICAgIHJlY3RhbmdsZS5wdXNoX2JhY2socmVjdCk7Ci0KLSAgICAgICAgICAgIC8vIFByZXBhcmUgZm9yIGRlc2NyaXB0aW9uIG9mIGFub3RoZXIgcmVjdGFuZ2xlCi0gICAgICAgICAgICByZWN0RGVzYyA9IHN0cmluZygiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgbGlzdCBvZiBmcmFtZXMKLSAgICBod2NfbGF5ZXJfbGlzdF90ICpsaXN0OwotICAgIGxpc3QgPSBod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0KHJlY3RhbmdsZS5zaXplKCkpOwotICAgIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdENyZWF0ZUxheWVyTGlzdCBmYWlsZWQiKTsKLSAgICAgICAgZXhpdCg1KTsKLSAgICB9Ci0KLSAgICBod2NfbGF5ZXJfdCAqbGF5ZXIgPSAmbGlzdC0+aHdMYXllcnNbMF07Ci0gICAgZm9yIChzdGQ6Omxpc3Q8UmVjdGFuZ2xlPjo6aXRlcmF0b3IgaXQgPSByZWN0YW5nbGUuYmVnaW4oKTsKLSAgICAgICAgIGl0ICE9IHJlY3RhbmdsZS5lbmQoKTsgKytpdCwgKytsYXllcikgewotICAgICAgICBsYXllci0+aGFuZGxlID0gaXQtPnRleHR1cmUtPmhhbmRsZTsKLSAgICAgICAgbGF5ZXItPmJsZW5kaW5nID0gaXQtPmJsZW5kOwotICAgICAgICBsYXllci0+dHJhbnNmb3JtID0gaXQtPnRyYW5zZm9ybTsKLSAgICAgICAgbGF5ZXItPnNvdXJjZUNyb3AgPSBpdC0+c291cmNlQ3JvcDsKLSAgICAgICAgbGF5ZXItPmRpc3BsYXlGcmFtZSA9IGl0LT5kaXNwbGF5RnJhbWU7Ci0KLSAgICAgICAgbGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4ubnVtUmVjdHMgPSAxOwotICAgICAgICBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbi5yZWN0cyA9ICZsYXllci0+ZGlzcGxheUZyYW1lOwotICAgIH0KLQotICAgIC8vIFBlcmZvcm0gcHJlcGFyZSBvcGVyYXRpb24KLSAgICBpZiAodmVyYm9zZSkgeyB0ZXN0UHJpbnRJKCJQcmVwYXJlOiIpOyBod2NUZXN0RGlzcGxheUxpc3QobGlzdCk7IH0KLSAgICBod2NEZXZpY2UtPnByZXBhcmUoaHdjRGV2aWNlLCBsaXN0KTsKLSAgICBpZiAodmVyYm9zZSkgewotICAgICAgICB0ZXN0UHJpbnRJKCJQb3N0IFByZXBhcmU6Iik7Ci0gICAgICAgIGh3Y1Rlc3REaXNwbGF5TGlzdFByZXBhcmVNb2RpZmlhYmxlKGxpc3QpOwotICAgIH0KLQotICAgIC8vIFR1cm4gb2ZmIHRoZSBnZW9tZXRyeSBjaGFuZ2VkIGZsYWcKLSAgICBsaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7Ci0KLSAgICAvLyBQZXJmb3JtIHRoZSBzZXQgb3BlcmF0aW9uKHMpCi0gICAgaWYgKHZlcmJvc2UpIHt0ZXN0UHJpbnRJKCJTZXQ6Iik7IH0KLSAgICBpZiAodmVyYm9zZSkgeyBod2NUZXN0RGlzcGxheUxpc3RIYW5kbGVzKGxpc3QpOyB9Ci0gICAgaHdjRGV2aWNlLT5zZXQoaHdjRGV2aWNlLCBkcHksIHN1cmZhY2UsIGxpc3QpOwotCi0gICAgdGVzdERlbGF5KGVuZERlbGF5KTsKLQotICAgIC8vIFN0YXJ0IGZyYW1ld29yawotICAgIHJ2ID0gc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIiVzIiwgQ01EX1NUQVJUX0ZSQU1FV09SSyk7Ci0gICAgaWYgKHJ2ID49IChzaWduZWQpIHNpemVvZihjbWQpIC0gMSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJDb21tYW5kIHRvbyBsb25nIGZvcjogJXMiLCBDTURfU1RBUlRfRlJBTUVXT1JLKTsKLSAgICAgICAgZXhpdCg2KTsKLSAgICB9Ci0gICAgdGVzdEV4ZWNDbWQoY21kKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vLyBQYXJzZSBzdHJpbmcgZGVzY3JpcHRpb24gb2YgcmVjdGFuZ2xlIGFuZCBhZGQgaXQgdG8gbGlzdCBvZiByZWN0YW5nbGVzCi0vLyB0byBiZSByZW5kZXJlZC4KLXN0YXRpYyBSZWN0YW5nbGUgcGFyc2VSZWN0KHN0cmluZyByZWN0U3RyKQotewotICAgIGludCBydjsKLSAgICBzdHJpbmcgc3RyOwotICAgIGJvb2wgICBlcnJvcjsKLSAgICBpc3RyaW5nc3RyZWFtIGluKHJlY3RTdHIpOwotICAgIGNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqZm9ybWF0OwotICAgIFJlY3RhbmdsZSByZWN0OwotICAgIHN0cnVjdCBod2NfcmVjdCBod2NSZWN0OwotCi0gICAgLy8gR3JhcGhpYyBGb3JtYXQKLSAgICBpbiA+PiBzdHI7Ci0gICAgaWYgKCFpbikgewotICAgICAgICB0ZXN0UHJpbnRFKCJFcnJvciBwYXJzaW5nIGZvcm1hdCBmcm9tOiAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgIGV4aXQoMjApOwotICAgIH0KLSAgICBmb3JtYXQgPSBod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cChzdHIuY19zdHIoKSk7Ci0gICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIlVua25vd24gZ3JhcGhpYyBmb3JtYXQgaW46ICVzIiwgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgZXhpdCgyMSk7Ci0gICAgfQotICAgIHJlY3QuZm9ybWF0ID0gZm9ybWF0LT5mb3JtYXQ7Ci0KLSAgICAvLyBEaXNwbGF5IEZyYW1lCi0gICAgcmVjdC5kaXNwbGF5RnJhbWUgPSBod2NUZXN0UGFyc2VId2NSZWN0KGluLCBlcnJvcik7Ci0gICAgaWYgKGVycm9yKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgZGlzcGxheSBmcmFtZSBpbjogJXMiLCByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICBleGl0KDIyKTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgZGVmYXVsdCBzb3VyY2VEaW0gYW5kIHNvdXJjZUNyb3AgYmFzZWQgb24gc2l6ZSBvZiBkaXNwbGF5IGZyYW1lLgotICAgIC8vIERlZmF1bHQgaXMgc291cmNlIHNpemUgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGRpc3BsYXkgZnJhbWUsIHdpdGgKLSAgICAvLyB0aGUgc291cmNlIGNyb3AgYmVpbmcgdGhlIGVudGlyZSBzaXplIG9mIHRoZSBzb3VyY2UgZnJhbWUuCi0gICAgcmVjdC5zb3VyY2VEaW0gPSBId2NUZXN0RGltKHJlY3QuZGlzcGxheUZyYW1lLnJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSByZWN0LmRpc3BsYXlGcmFtZS5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5kaXNwbGF5RnJhbWUuYm90dG9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSByZWN0LmRpc3BsYXlGcmFtZS50b3ApOwotICAgIHJlY3Quc291cmNlQ3JvcC5sZWZ0ID0gMDsKLSAgICByZWN0LnNvdXJjZUNyb3AudG9wID0gMDsKLSAgICByZWN0LnNvdXJjZUNyb3AucmlnaHQgPSByZWN0LnNvdXJjZURpbS53aWR0aCgpOwotICAgIHJlY3Quc291cmNlQ3JvcC5ib3R0b20gPSByZWN0LnNvdXJjZURpbS5oZWlnaHQoKTsKLQotICAgIC8vIE9wdGlvbmFsIHNldHRpbmdzCi0gICAgd2hpbGUgKChpbi50ZWxsZygpIDwgKHN0cmVhbXBvcykgaW4uc3RyKCkubGVuZ3RoKCkpCi0gICAgICAgICAgICYmIChpbi50ZWxsZygpICE9IChzdHJlYW1wb3MpIC0xKSkgewotICAgICAgICBzdHJpbmcgYXR0ck5hbWU7Ci0KLSAgICAgICAgaW4gPj4gYXR0ck5hbWU7Ci0gICAgICAgIGlmIChpbi5lb2YoKSkgeyBicmVhazsgfQotICAgICAgICBpZiAoIWluKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCJFcnJvciByZWFkaW5nIGF0dHJpYnV0ZSBuYW1lIGluOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICBleGl0KDIzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRyYW5zZm9ybQotICAgICAgICBpZiAoYXR0ck5hbWUgPT0gInRyYW5zZm9ybToiKSB7IC8vIFRyYW5zZm9ybQotICAgICAgICAgICAgc3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaW4gPj4gc3RyOwotICAgICAgICAgICAgaWYgKHN0ciA9PSAibm9uZSIpIHsKLSAgICAgICAgICAgICAgICByZWN0LnRyYW5zZm9ybSA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAiZmxpcGgiKSB7Ci0gICAgICAgICAgICAgICAgcmVjdC50cmFuc2Zvcm0gPSBIV0NfVFJBTlNGT1JNX0ZMSVBfSDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJmbGlwdiIpIHsKLSAgICAgICAgICAgICAgICByZWN0LnRyYW5zZm9ybSA9IEhXQ19UUkFOU0ZPUk1fRkxJUF9WOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gInJvdDkwIikgewotICAgICAgICAgICAgICAgIHJlY3QudHJhbnNmb3JtID0gSFdDX1RSQU5TRk9STV9ST1RfOTA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAicm90MTgwIikgewotICAgICAgICAgICAgICAgIHJlY3QudHJhbnNmb3JtID0gSFdDX1RSQU5TRk9STV9ST1RfMTgwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHIgPT0gInJvdDI3MCIpIHsKLSAgICAgICAgICAgICAgICByZWN0LnRyYW5zZm9ybSA9IEhXQ19UUkFOU0ZPUk1fUk9UXzI3MDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiVW5rbm93biB0cmFuc2Zvcm0gb2YgXCIlc1wiIGluOiAlcyIsIHN0ci5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBleGl0KDI0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdHRyTmFtZSA9PSAiYmxlbmQ6IikgeyAvLyBCbGVuZAotICAgICAgICAgICAgc3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaW4gPj4gc3RyOwotICAgICAgICAgICAgaWYgKHN0ciA9PSBzdHJpbmcoIm5vbmUiKSkgewotICAgICAgICAgICAgICAgIHJlY3QuYmxlbmQgPSBIV0NfQkxFTkRJTkdfTk9ORTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJwcmVtdWx0IikgewotICAgICAgICAgICAgICAgIHJlY3QuYmxlbmQgPSBIV0NfQkxFTkRJTkdfUFJFTVVMVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJjb3ZlcmFnZSIpIHsKLSAgICAgICAgICAgICAgICByZWN0LmJsZW5kID0gSFdDX0JMRU5ESU5HX0NPVkVSQUdFOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJVbmtub3duIGJsZW5kIG9mIFwiJXNcIiBpbjogJXMiLCBzdHIuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgZXhpdCgyNSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXR0ck5hbWUgPT0gImNvbG9yOiIpIHsgLy8gQ29sb3IKLSAgICAgICAgICAgIHJlY3QuY29sb3IgPSBod2NUZXN0UGFyc2VDb2xvcihpbiwgZXJyb3IpOwotICAgICAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiRXJyb3IgcGFyc2luZyBjb2xvciBpbjogJXMiLCByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGV4aXQoMjYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJOYW1lID09ICJhbHBoYToiKSB7IC8vIEFscGhhCi0gICAgICAgICAgICBpbiA+PiByZWN0LmFscGhhOwotICAgICAgICAgICAgaWYgKCFpbikgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkVycm9yIHBhcnNpbmcgdmFsdWUgZm9yIGFscGhhIGF0dHJpYnV0ZSBpbjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBleGl0KDI3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdHRyTmFtZSA9PSAic291cmNlRGltOiIpIHsgLy8gU291cmNlIERpbWVuc2lvbgotICAgICAgICAgICByZWN0LnNvdXJjZURpbSA9IGh3Y1Rlc3RQYXJzZURpbShpbiwgZXJyb3IpOwotICAgICAgICAgICAgaWYgKGVycm9yKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiRXJyb3IgcGFyc2luZyBzb3VyY2UgZGltZW5pc2lvbiBpbjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdFN0ci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBleGl0KDI4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdHRyTmFtZSA9PSAic291cmNlQ3JvcDoiKSB7IC8vIFNvdXJjZSBDcm9wCi0gICAgICAgICAgICByZWN0LnNvdXJjZUNyb3AgPSBod2NUZXN0UGFyc2VId2NSZWN0KGluLCBlcnJvcik7Ci0gICAgICAgICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJFcnJvciBwYXJzaW5nIHNvdXJjZSBjcm9wIGluOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGV4aXQoMjkpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBVbmtub3duIGF0dHJpYnV0ZQotICAgICAgICAgICAgdGVzdFByaW50RSgiVW5rbm93biBhdHRyaWJ1dGUgb2YgXCIlc1wiIGluOiAlcyIsIGF0dHJOYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY3RTdHIuY19zdHIoKSk7Ci0gICAgICAgICAgICBleGl0KDMwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFZhbGlkYXRlCi0gICAgaWYgKCgodWludDMyX3QpIHJlY3Quc291cmNlQ3JvcC5sZWZ0ID49IHJlY3Quc291cmNlRGltLndpZHRoKCkpCi0gICAgICAgIHx8ICgodWludDMyX3QpIHJlY3Quc291cmNlQ3JvcC5yaWdodCA+IHJlY3Quc291cmNlRGltLndpZHRoKCkpCi0gICAgICAgIHx8ICgodWludDMyX3QpIHJlY3Quc291cmNlQ3JvcC50b3AgPj0gcmVjdC5zb3VyY2VEaW0uaGVpZ2h0KCkpCi0gICAgICAgIHx8ICgodWludDMyX3QpIHJlY3Quc291cmNlQ3JvcC5ib3R0b20gPiByZWN0LnNvdXJjZURpbS5oZWlnaHQoKSkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBzb3VyY2UgY3JvcCBpbjogJXMiLCByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICBleGl0KDMxKTsKLSAgICB9Ci0gICAgaWYgKChyZWN0LmRpc3BsYXlGcmFtZS5sZWZ0ID49IHdpZHRoKQotICAgICAgICB8fCAocmVjdC5kaXNwbGF5RnJhbWUucmlnaHQgPiB3aWR0aCkKLSAgICAgICAgfHwgKHJlY3QuZGlzcGxheUZyYW1lLnRvcCA+PSBoZWlnaHQpCi0gICAgICAgIHx8IChyZWN0LmRpc3BsYXlGcmFtZS5ib3R0b20gPiBoZWlnaHQpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgZGlzcGxheSBmcmFtZSBpbjogJXMiLCByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICBleGl0KDMyKTsKLSAgICB9Ci0gICAgaWYgKChyZWN0LmFscGhhIDwgMC4wKSB8fCAocmVjdC5hbHBoYSA+IDEuMCkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBhbHBoYSBpbjogJXMiLCByZWN0U3RyLmNfc3RyKCkpOwotICAgICAgICBleGl0KDMzKTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgc291cmNlIHRleHR1cmUKLSAgICByZWN0LnRleHR1cmUgPSBuZXcgR3JhcGhpY0J1ZmZlcihyZWN0LnNvdXJjZURpbS53aWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Quc291cmNlRGltLmhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QuZm9ybWF0LCB0ZXhVc2FnZSk7Ci0gICAgaWYgKChydiA9IHJlY3QudGV4dHVyZS0+aW5pdENoZWNrKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHRlc3RQcmludEUoInNvdXJjZSB0ZXh0dXJlIGluaXRDaGVjayBmYWlsZWQsIHJ2OiAlaSIsIHJ2KTsKLSAgICAgICAgdGVzdFByaW50RSgiICAlcyIsIHJlY3RTdHIuY19zdHIoKSk7Ci0KLSAgICB9Ci0KLSAgICAvLyBGaWxsIHdpdGggdW5pZm9ybSBjb2xvcgotICAgIGh3Y1Rlc3RGaWxsQ29sb3IocmVjdC50ZXh0dXJlLmdldCgpLCByZWN0LmNvbG9yLCByZWN0LmFscGhhKTsKLSAgICBpZiAodmVyYm9zZSkgewotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgYnVmOiAlcCBoYW5kbGU6ICVwIGZvcm1hdDogJXMgd2lkdGg6ICV1IGhlaWdodDogJXUgIgotICAgICAgICAgICAgICAgICAgICJjb2xvcjogJXMgYWxwaGE6ICVmIiwKLSAgICAgICAgICAgICAgICAgICByZWN0LnRleHR1cmUuZ2V0KCksIHJlY3QudGV4dHVyZS0+aGFuZGxlLCBmb3JtYXQtPmRlc2MsCi0gICAgICAgICAgICAgICAgICAgcmVjdC5zb3VyY2VEaW0ud2lkdGgoKSwgcmVjdC5zb3VyY2VEaW0uaGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgc3RyaW5nKHJlY3QuY29sb3IpLmNfc3RyKCksIHJlY3QuYWxwaGEpOwotICAgIH0KLQotICAgIHJldHVybiByZWN0OwotfQotCi12b2lkIGluaXQodm9pZCkKLXsKLSAgICAvLyBTZWVkIHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgotICAgIC8vIE5lZWRlZCBzbyB0aGF0IHRoZSBwYWQgYXJlYXMgb2YgZnJhbWVzIGFyZSBmaWxsZWQgd2l0aCBhIGRldGVybWluaXN0aWMKLSAgICAvLyBwc2V1ZG8gcmFuZG9tIHZhbHVlLgotICAgIHNyYW5kNDgoMCk7Ci0KLSAgICBod2NUZXN0SW5pdERpc3BsYXkodmVyYm9zZSwgJmRweSwgJnN1cmZhY2UsICZ3aWR0aCwgJmhlaWdodCk7Ci0KLSAgICBod2NUZXN0T3Blbkh3YygmaHdjRGV2aWNlKTsKLX0KLQotdm9pZCBwcmludFN5bnRheChjb25zdCBjaGFyICpjbWQpCi17Ci0gICAgdGVzdFByaW50RSgiICAlcyBbb3B0aW9uc10gKGdyYXBoaWNGb3JtYXQgZGlzcGxheUZyYW1lIFthdHRyaWJ1dGVzXSwpLi4uIiwKLSAgICAgICAgICAgICAgIGNtZCk7Ci0gICAgdGVzdFByaW50RSgiICAgIG9wdGlvbnM6Iik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgLUQgRW5kIG9mIHRlc3QgZGVsYXkiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAtdiBWZXJib3NlIik7Ci0gICAgdGVzdFByaW50RSgiIik7Ci0gICAgdGVzdFByaW50RSgiICAgIGdyYXBoaWMgZm9ybWF0czoiKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgTlVNQShod2NUZXN0R3JhcGhpY0Zvcm1hdCk7IG4xKyspIHsKLSAgICAgICAgdGVzdFByaW50RSgiICAgICAgJXMiLCBod2NUZXN0R3JhcGhpY0Zvcm1hdFtuMV0uZGVzYyk7Ci0gICAgfQotICAgIHRlc3RQcmludEUoIiIpOwotICAgIHRlc3RQcmludEUoIiAgICBkaXNwbGF5RnJhbWUiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICBbbGVmdCwgdG9wLCByaWdodCwgYm90dG9tXSIpOwotICAgIHRlc3RQcmludEUoIiIpOwotICAgIHRlc3RQcmludEUoIiAgICBhdHRyaWJ1dGVzOiIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIHRyYW5zZm9ybTogbm9uZSB8IGZsaXBoIHwgZmxpcHYgfCByb3Q5MCB8IHJvdDE4MCAiCi0gICAgICAgICAgICAgICAiIHwgcm90MjcwIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgYmxlbmQ6IG5vbmUgfCBwcmVtdWx0IHwgY292ZXJhZ2UiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICBjb2xvcjogWzAuIyMsIDAuIyMsIDAuIyNdIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgYWxwaGE6IDAuIyMiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICBzb3VyY2VEaW06IFt3aWR0aCwgaGVpZ2h0XSIpOwotICAgIHRlc3RQcmludEUoIiAgICAgIHNvdXJjZUNyb3A6IFtsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b21dIik7Ci0gICAgdGVzdFByaW50RSgiIik7Ci0gICAgdGVzdFByaW50RSgiICAgIEV4YW1wbGU6Iik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgIyBXaGl0ZSBZVjEyIHJlY3RhbmdsZSwgd2l0aCBvdmVybGFwcGluZyB0dXJxdW9pc2UgIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgIyAgUkdCQTg4ODggcmVjdGFuZ2xlIGF0IDMwJSUgKGFscGhhOiAwLjcpIHRyYW5zcGFyZW5jeSIpOwotICAgIHRlc3RQcmludEUoIiAgICAgICVzIC12IC1EIDMwLjAgXFwiLCBjbWQpOwotICAgIHRlc3RQcmludEUoIiAgICAgICAgWVYxMiBbNTAsIDgwLCAyMDAsIDMwMF0gdHJhbnNmb3JtOiBub25lIFxcIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgICAgIGNvbG9yOiBbMS4wLCAwLjUsIDAuNV0sIFxcIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgICBSR0JBODg4OCBbMTAwLCAxNTAsIDMwMCwgNDAwXSBibGVuZDogY292ZXJhZ2UgXFwiKTsKLSAgICB0ZXN0UHJpbnRFKCIgICAgICAgICAgY29sb3I6IFswLjI1MSwgMC44NzgsIDAuODE2XSBhbHBoYTogMC43IFxcIik7Ci0gICAgdGVzdFByaW50RSgiICAgICAgICAgIHNvdXJjZURpbTogWzUwLCA2MF0gc291cmNlQ3JvcDogWzUsIDgsIDEyLCAxNV0iKTsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9od2MvaHdjU3RyZXNzLmNwcCBiL29wZW5nbC90ZXN0cy9od2MvaHdjU3RyZXNzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyYTQyNC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y1N0cmVzcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vKgotICogSGFyZHdhcmUgQ29tcG9zZXIgc3RyZXNzIHRlc3QKLSAqCi0gKiBQZXJmb3JtcyBhIHBzZXVkby1yYW5kb20gKHByYW5kb20pIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgdG8gdGhlCi0gKiBIYXJkd2FyZSBDb21wb3NlciAoSFdDKSwgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBwYXNzZXMgb3IgZm9yCi0gKiBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS4gIEJ5IGRlZmF1bHQgdGhlIHBlcmlvZCBvZiB0aW1lIGlzIEZMVF9NQVgsCi0gKiBzbyB0aGF0IHRoZSBudW1iZXIgb2YgcGFzc2VzIHdpbGwgdGFrZSBwcmVjZWRlbmNlLgotICoKLSAqIFRoZSBwYXNzZXMgYXJlIGdyb3VwZWQgdG9nZXRoZXIsIHdoZXJlIChwYXNzIC8gcGFzc2VzUGVyR3JvdXApIHNwZWNpZmllcwotICogd2hpY2ggZ3JvdXAgYSBwYXJ0aWN1bGFyIHBhc3MgaXMgaW4uICBUaGlzIGNhdXNlcyBldmVyeSBwYXNzZXNQZXJHcm91cAotICogd29ydGggb2Ygc2VxdWVudGlhbCBwYXNzZXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIGdyb3VwLiAgQ29tcHV0YXRpb25hbGx5Ci0gKiBpbnRlbnNpdmUgb3BlcmF0aW9ucyBhcmUgcGVyZm9ybWVkIGp1c3Qgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZ3JvdXAKLSAqIG9mIHBhc3NlcyBhbmQgdGhlbiB1c2VkIGJ5IGFsbCB0aGUgcGFzc2VzIGluIHRoYXQgZ3JvdXAuICBUaGlzIGlzIGRvbmUKLSAqIHNvIGFzIHRvIGluY3JlYXNlIGJvdGggdGhlIGF2ZXJhZ2UgYW5kIHBlYWsgcmF0ZSBvZiBncmFwaGljIG9wZXJhdGlvbnMsCi0gKiBieSBtb3ZpbmcgY29tcHV0YXRpb25hbGx5IGludGVuc2l2ZSBvcGVyYXRpb25zIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBncm91cC4KLSAqIEluIHBhcnRpY3VsYXIsIGF0IHRoZSBzdGFydCBvZiBlYWNoIGdyb3VwIG9mIHBhc3NlcyBhIHNldCBvZgotICogZ3JhcGhpYyBidWZmZXJzIGFyZSBjcmVhdGVkLCB0aGVuIHVzZWQgYnkgdGhlIGZpcnN0IGFuZCByZW1haW5pbmcKLSAqIHBhc3NlcyBvZiB0aGF0IGdyb3VwIG9mIHBhc3Nlcy4KLSAqCi0gKiBUaGUgcGVyLWdyb3VwIGluaXRpYWxpemF0aW9uIG9mIHRoZSBncmFwaGljIGJ1ZmZlcnMgaXMgcGVyZm9ybWVkCi0gKiBieSBhIGZ1bmN0aW9uIGNhbGxlZCBpbml0RnJhbWVzLiAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIGFycmF5Ci0gKiBvZiBzbWFydCBwb2ludGVycyB0byB0aGUgZ3JhcGhpYyBidWZmZXJzLCBpbiB0aGUgZm9ybSBvZiBhIHZlY3RvcgotICogb2YgdmVjdG9ycy4gIFRoZSBhcnJheSBpcyBhY2Nlc3NlZCBpbiByb3cgbWFqb3Igb3JkZXIsIHNvIGVhY2gKLSAqIHJvdyBpcyBhIHZlY3RvciBvZiBzbWFydCBwb2ludGVycy4gIEFsbCB0aGUgcG9pbnRlcnMgb2YgYSBzaW5nbGUKLSAqIHJvdyBwb2ludCB0byBncmFwaGljIGJ1ZmZlcnMgd2hpY2ggdXNlIHRoZSBzYW1lIHBpeGVsIGZvcm1hdCBhbmQKLSAqIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLCBhbHRob3VnaCBpdCBpcyBsaWtlbHkgdGhhdCBlYWNoIG9uZSBpcwotICogZmlsbGVkIHdpdGggYSBkaWZmZXJlbnQgY29sb3IuICBUaGlzIGlzIGRvbmUgc28gdGhhdCBhZnRlciBkb2luZwotICogdGhlIGZpcnN0IEhXQyBwcmVwYXJlIHRoZW4gc2V0IGNhbGwsIHN1YnNlcXVlbnQgc2V0IGNhbGxzIGNhbgotICogYmUgbWFkZSB3aXRoIGVhY2ggb2YgdGhlIGxheWVyIGhhbmRsZXMgY2hhbmdlZCB0byBhIGRpZmZlcmVudAotICogZ3JhcGhpYyBidWZmZXIgd2l0aGluIHRoZSBzYW1lIHJvdy4gIFNpbmNlIHRoZSBncmFwaGljIGJ1ZmZlcnMKLSAqIGluIGEgcGFydGljdWxhciByb3cgaGF2ZSB0aGUgc2FtZSBwaXhlbCBmb3JtYXQgYW5kIGRpbWVuc2lvbiwKLSAqIGFkZGl0aW9uYWwgSFdDIHNldCBjYWxscyBjYW4gYmUgbWFkZSwgd2l0aG91dCBoYXZpbmcgdG8gcGVyZm9ybQotICogYW4gSFdDIHByZXBhcmUgY2FsbC4KLSAqCi0gKiBUaGlzIHRlc3Qgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kLWxpbmUgb3B0aW9uczoKLSAqCi0gKiAgIC12ICAgICAgICBWZXJib3NlCi0gKiAgIC1zIG51bSAgICBTdGFydGluZyBwYXNzCi0gKiAgIC1lIG51bSAgICBFbmRpbmcgcGFzcwotICogICAtcCBudW0gICAgRXhlY3V0ZSB0aGUgc2luZ2xlIHBhc3Mgc3BlY2lmaWVkIGJ5IG51bQotICogICAtbiBudW0gICAgTnVtYmVyIG9mIHNldCBvcGVyYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgZWFjaCBwcmVwYXJlIG9wZXJhdGlvbgotICogICAtdCBmbG9hdCAgTWF4aW11bSB0aW1lIGluIHNlY29uZHMgdG8gZXhlY3V0ZSB0aGUgdGVzdAotICogICAtZCBmbG9hdCAgRGVsYXkgaW4gc2Vjb25kcyBwZXJmb3JtZWQgYWZ0ZXIgZWFjaCBzZXQgb3BlcmF0aW9uCi0gKiAgIC1EIGZsb2F0ICBEZWxheSBpbiBzZWNvbmRzIHBlcmZvcm1lZCBhZnRlciB0aGUgbGFzdCBwYXNzIGlzIGV4ZWN1dGVkCi0gKgotICogVHlwaWNhbGx5IHRoZSB0ZXN0IGlzIGV4ZWN1dGVkIGZvciBhIGxhcmdlIHJhbmdlIG9mIHBhc3Nlcy4gIEJ5IGRlZmF1bHQKLSAqIHBhc3NlcyAwIHRocm91Z2ggOTk5OTkgKDEwMCwwMDAgcGFzc2VzKSBhcmUgZXhlY3V0ZWQuICBBbHRob3VnaCB0aGlzIHRlc3QKLSAqIGRvZXMgbm90IHZhbGlkYXRlIHRoZSBnZW5lcmF0ZWQgaW1hZ2UsIGF0IHRpbWVzIGl0IGlzIHVzZWZ1bCB0byByZWV4ZWN1dGUKLSAqIGEgcGFydGljdWxhciBwYXNzIGFuZCBsZWF2ZSB0aGUgZGlzcGxheWVkIGltYWdlIG9uIHRoZSBzY3JlZW4gZm9yIGFuCi0gKiBleHRlbmRlZCBwZXJpb2Qgb2YgdGltZS4gIFRoaXMgY2FuIGJlIGRvbmUgZWl0aGVyIGJ5IHNldHRpbmcgdGhlIC1zCi0gKiBhbmQgLWUgb3B0aW9ucyB0byB0aGUgZGVzaXJlZCBwYXNzLCBhbG9uZyB3aXRoIGEgbGFyZ2UgdmFsdWUgZm9yIC1ELgotICogVGhpcyBjYW4gYWxzbyBiZSBkb25lIHZpYSB0aGUgLXAgb3B0aW9uLCBhZ2FpbiB3aXRoIGEgbGFyZ2UgdmFsdWUgZm9yCi0gKiB0aGUgLUQgb3B0aW9ucy4KLSAqCi0gKiBTbyBmYXIgdGhpcyB0ZXN0IG9ubHkgY29udGFpbnMgY29kZSB0byBjcmVhdGUgZ3JhcGhpYyBidWZmZXJzIHdpdGgKLSAqIGEgY29udGludW91cyBzb2xpZCBjb2xvci4gIEFsdGhvdWdoIHRoaXMgdGVzdCBpcyB1bmFibGUgdG8gdmFsaWRhdGUgdGhlCi0gKiBpbWFnZSBwcm9kdWNlZCwgYW55IGltYWdlIHRoYXQgY29udGFpbnMgb3RoZXIgdGhhbiByZWN0YW5nbGVzIG9mIGEgc29saWQKLSAqIGNvbG9yIGFyZSBpbmNvcnJlY3QuICBOb3RlIHRoYXQgdGhlIHJlY3RhbmdsZXMgbWF5IHVzZSBhIHRyYW5zcGFyZW50Ci0gKiBjb2xvciBhbmQgaGF2ZSBhIGJsZW5kaW5nIG9wZXJhdGlvbiB0aGF0IGNhdXNlcyB0aGUgY29sb3IgaW4gb3ZlcmxhcHBpbmcKLSAqIHJlY3RhbmdsZXMgdG8gYmUgbWl4ZWQuICBJbiBzdWNoIGNhc2VzIHRoZSBvdmVybGFwcGluZyBwb3J0aW9ucyBtYXkgaGF2ZQotICogYSBkaWZmZXJlbnQgY29sb3IgZnJvbSB0aGUgcmVzdCBvZiB0aGUgcmVjdGFuZ2xlLgotICovCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y2Vycm5vPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Y3RpbWU+Ci0jaW5jbHVkZSA8bGliZ2VuLmg+Ci0jaW5jbHVkZSA8c2NoZWQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2RlZmluZSBMT0dfVEFHICJod2NTdHJlc3NUZXN0IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHRlc3RVdGlsLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9od2NvbXBvc2VyLmg+Ci0KLSNpbmNsdWRlIDxnbFRlc3RMaWIuaD4KLSNpbmNsdWRlICJod2NUZXN0TGliLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotY29uc3QgZmxvYXQgbWF4U2l6ZVJhdGlvID0gMS4zOyAgLy8gR3JhcGhpYyBidWZmZXJzIGNhbiBiZSB1cHRvIHRoaXMgbXVuY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0IHNjcmVlbiBzaXplCi1jb25zdCB1bnNpZ25lZCBpbnQgcGFzc2VzUGVyR3JvdXAgPSAxMDsgLy8gQSBncm91cCBvZiBwYXNzZXMgYWxsIHVzZSB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyYXBoaWMgYnVmZmVycwotCi0vLyBSYXRpb3MgYXQgd2hpY2ggcmFyZSBhbmQgZnJlcXVlbnQgY29uZGl0aW9ucyBzaG91bGQgYmUgcHJvZHVjZWQKLWNvbnN0IGZsb2F0IHJhcmVSYXRpbyA9IDAuMTsKLWNvbnN0IGZsb2F0IGZyZXFSYXRpbyA9IDAuOTsKLQotLy8gRGVmYXVsdHMgZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zCi1jb25zdCBib29sIGRlZmF1bHRWZXJib3NlID0gZmFsc2U7Ci1jb25zdCB1bnNpZ25lZCBpbnQgZGVmYXVsdFN0YXJ0UGFzcyA9IDA7Ci1jb25zdCB1bnNpZ25lZCBpbnQgZGVmYXVsdEVuZFBhc3MgPSA5OTk5OTsKLWNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0UGVyUGFzc051bVNldCA9IDEwOwotY29uc3QgZmxvYXQgZGVmYXVsdFBlclNldERlbGF5ID0gMC4wOyAvLyBEZWZhdWx0IGRlbGF5IGFmdGVyIGVhY2ggc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbi4gIERlZmF1bHQgZGVsYXkgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gemVybyB1c2VkIHNvIGFzIHRvIHBlcmZvcm0gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZXQgb3BlcmF0aW9ucyBhcyBxdWlja2x5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzIHBvc3NpYmxlLgotY29uc3QgZmxvYXQgZGVmYXVsdEVuZERlbGF5ID0gMi4wOyAvLyBEZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5hbCBwYXNzIGFuZCByZXN0YXJ0IG9mIGZyYW1ld29yawotY29uc3QgZmxvYXQgZGVmYXVsdER1cmF0aW9uID0gRkxUX01BWDsgLy8gQSBmYWlybHkgbG9uZyB0aW1lLCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByYW5nZSBvZiBwYXNzZXMgd2lsbCBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVjZWRlbmNlCi0KLS8vIENvbW1hbmQtbGluZSBvcHRpb24gc2V0dGluZ3MKLXN0YXRpYyBib29sIHZlcmJvc2UgPSBkZWZhdWx0VmVyYm9zZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnRQYXNzID0gZGVmYXVsdFN0YXJ0UGFzczsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZW5kUGFzcyA9IGRlZmF1bHRFbmRQYXNzOwotc3RhdGljIHVuc2lnbmVkIGludCBudW1TZXQgPSBkZWZhdWx0UGVyUGFzc051bVNldDsKLXN0YXRpYyBmbG9hdCBwZXJTZXREZWxheSA9IGRlZmF1bHRQZXJTZXREZWxheTsKLXN0YXRpYyBmbG9hdCBlbmREZWxheSA9IGRlZmF1bHRFbmREZWxheTsKLXN0YXRpYyBmbG9hdCBkdXJhdGlvbiA9IGRlZmF1bHREdXJhdGlvbjsKLQotLy8gQ29tbWFuZC1saW5lIG11dHVhbCBleGNsdXNpb24gZGV0ZWN0aW9uIGZsYWdzLgotLy8gQ29ycmVzcG9uZGluZyBmbGFnIHNldCB0cnVlIG9uY2UgYW4gb3B0aW9uIGlzIHVzZWQuCi1ib29sIGVGbGFnLCBzRmxhZywgcEZsYWc7Ci0KLSNkZWZpbmUgTUFYU1RSICAgICAgICAgICAgICAgMTAwCi0jZGVmaW5lIE1BWENNRCAgICAgICAgICAgICAgIDIwMAotI2RlZmluZSBCSVRTUEVSQllURSAgICAgICAgICAgIDggLy8gVE9ETzogT2J0YWluIGZyb20gPHZhbHVlcy5oPiwgb25jZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgaGFzIGJlZW4gYWRkZWQKLQotI2RlZmluZSBDTURfU1RPUF9GUkFNRVdPUksgICAic3RvcCAyPiYxIgotI2RlZmluZSBDTURfU1RBUlRfRlJBTUVXT1JLICAic3RhcnQgMj4mMSIKLQotI2RlZmluZSBOVU1BKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYSBbMF0pKQotI2RlZmluZSBNRU1DTFIoYWRkciwgc2l6ZSkgZG8geyBcCi0gICAgICAgIG1lbXNldCgoYWRkciksIDAsIChzaXplKSk7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vLyBGaWxlIHNjb3BlIGNvbnN0YW50cwotY29uc3QgdW5zaWduZWQgaW50IGJsZW5kaW5nT3BzW10gPSB7Ci0gICAgSFdDX0JMRU5ESU5HX05PTkUsCi0gICAgSFdDX0JMRU5ESU5HX1BSRU1VTFQsCi0gICAgSFdDX0JMRU5ESU5HX0NPVkVSQUdFLAotfTsKLWNvbnN0IHVuc2lnbmVkIGludCBsYXllckZsYWdzW10gPSB7Ci0gICAgSFdDX1NLSVBfTEFZRVIsCi19OwotY29uc3QgdmVjdG9yPHVuc2lnbmVkIGludD4gdmVjTGF5ZXJGbGFncyhsYXllckZsYWdzLAotICAgIGxheWVyRmxhZ3MgKyBOVU1BKGxheWVyRmxhZ3MpKTsKLQotY29uc3QgdW5zaWduZWQgaW50IHRyYW5zZm9ybUZsYWdzW10gPSB7Ci0gICAgSFdDX1RSQU5TRk9STV9GTElQX0gsCi0gICAgSFdDX1RSQU5TRk9STV9GTElQX1YsCi0gICAgSFdDX1RSQU5TRk9STV9ST1RfOTAsCi0gICAgLy8gUk9UXzE4MCAmIFJPVF8yNzAgaW50ZW50aW9uYWxseSBub3QgbGlzdGVkLCBiZWNhdXNlIHRoZXkKLSAgICAvLyB0aGV5IGFyZSBmb3JtZWQgZnJvbSBjb21iaW5hdGlvbnMgb2YgdGhlIGZsYWdzIGFscmVhZHkgbGlzdGVkLgotfTsKLWNvbnN0IHZlY3Rvcjx1bnNpZ25lZCBpbnQ+IHZlY1RyYW5zZm9ybUZsYWdzKHRyYW5zZm9ybUZsYWdzLAotICAgIHRyYW5zZm9ybUZsYWdzICsgTlVNQSh0cmFuc2Zvcm1GbGFncykpOwotCi0vLyBGaWxlIHNjb3BlIGdsb2JhbHMKLXN0YXRpYyBjb25zdCBpbnQgdGV4VXNhZ2UgPSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19URVhUVVJFIHwKLSAgICAgICAgR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZOwotc3RhdGljIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAqaHdjRGV2aWNlOwotc3RhdGljIEVHTERpc3BsYXkgZHB5Owotc3RhdGljIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLXN0YXRpYyBFR0xpbnQgd2lkdGgsIGhlaWdodDsKLXN0YXRpYyB2ZWN0b3IgPHZlY3RvciA8c3A8R3JhcGhpY0J1ZmZlcj4gPiA+IGZyYW1lczsKLQotLy8gRmlsZSBzY29wZSBwcm90b3R5cGVzCi12b2lkIGluaXQodm9pZCk7Ci12b2lkIGluaXRGcmFtZXModW5zaWduZWQgaW50IHNlZWQpOwotdGVtcGxhdGUgPGNsYXNzIFQ+IHZlY3RvcjxUPiB2ZWN0b3JSYW5kU2VsZWN0KGNvbnN0IHZlY3RvcjxUPiYgdmVjLCBzaXplX3QgbnVtKTsKLXRlbXBsYXRlIDxjbGFzcyBUPiBUIHZlY3Rvck9yKGNvbnN0IHZlY3RvcjxUPiYgdmVjKTsKLQotLyoKLSAqIE1haW4KLSAqCi0gKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGhpZ2gtbGV2ZWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9uczoKLSAqCi0gKiAgIDEuIENvbW1hbmQtbGluZSBwYXJzaW5nCi0gKgotICogICAyLiBJbml0aWFsaXphdGlvbgotICoKLSAqICAgMy4gRm9yIGVhY2ggcGFzczoKLSAqCi0gKiAgICAgICAgYS4gSWYgcGFzcyBpcyBmaXJzdCBwYXNzIG9yIGluIGEgZGlmZmVyZW50IGdyb3VwIGZyb20gdGhlCi0gKiAgICAgICAgICAgcHJldmlvdXMgcGFzcywgaW5pdGlhbGl6ZSB0aGUgYXJyYXkgb2YgZ3JhcGhpYyBidWZmZXJzLgotICoKLSAqICAgICAgICBiLiBDcmVhdGUgYSBIV0MgbGlzdCB3aXRoIHJvb20gdG8gc3BlY2lmeSBhIHByYW5kb21seQotICogICAgICAgICAgIHNlbGVjdGVkIG51bWJlciBvZiBsYXllcnMuCi0gKgotICogICAgICAgIGMuIFNlbGVjdCBhIHN1YnNldCBvZiB0aGUgcm93cyBmcm9tIHRoZSBncmFwaGljIGJ1ZmZlciBhcnJheSwKLSAqICAgICAgICAgICBzdWNoIHRoYXQgdGhlcmUgaXMgYSB1bmlxdWUgcm93IHRvIGJlIHVzZWQgZm9yIGVhY2gKLSAqICAgICAgICAgICBvZiB0aGUgbGF5ZXJzIGluIHRoZSBIV0MgbGlzdC4KLSAqCi0gKiAgICAgICAgZC4gUHJhbmRvbWx5IGZpbGwgaW4gdGhlIEhXQyBsaXN0IHdpdGggaGFuZGxlcwotICogICAgICAgICAgIHNlbGVjdGVkIGZyb20gYW55IG9mIHRoZSBjb2x1bW5zIG9mIHRoZSBzZWxlY3RlZCByb3cuCi0gKgotICogICAgICAgIGUuIFBhc3MgdGhlIHBvcHVsYXRlZCBsaXN0IHRvIHRoZSBIV0MgcHJlcGFyZSBjYWxsLgotICoKLSAqICAgICAgICBmLiBQYXNzIHRoZSBwb3B1bGF0ZWQgbGlzdCB0byB0aGUgSFdDIHNldCBjYWxsLgotICoKLSAqICAgICAgICBnLiBJZiBhZGRpdGlvbmFsIHNldCBjYWxscyBhcmUgdG8gYmUgbWFkZSwgdGhlbiBmb3IgZWFjaAotICogICAgICAgICAgIGFkZGl0aW9uYWwgc2V0IGNhbGwsIHNlbGVjdCBhIG5ldyBzZXQgb2YgaGFuZGxlcyBhbmQKLSAqICAgICAgICAgICBwZXJmb3JtIHRoZSBzZXQgY2FsbC4KLSAqLwotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgaW50IHJ2LCBvcHQ7Ci0gICAgY2hhciAqY2hwdHI7Ci0gICAgdW5zaWduZWQgaW50IHBhc3M7Ci0gICAgY2hhciBjbWRbTUFYQ01EXTsKLSAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydFRpbWUsIGN1cnJlbnRUaW1lLCBkZWx0YTsKLQotICAgIHRlc3RTZXRMb2dDYXRUYWcoTE9HX1RBRyk7Ci0KLSAgICAvLyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCi0gICAgd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgInZwOmQ6RDpuOnM6ZTp0Oj9oIikpICE9IC0xKSB7Ci0gICAgICAgIHN3aXRjaCAob3B0KSB7Ci0gICAgICAgICAgY2FzZSAnZCc6IC8vIERlbGF5IGFmdGVyIGVhY2ggc2V0IG9wZXJhdGlvbgotICAgICAgICAgICAgcGVyU2V0RGVsYXkgPSBzdHJ0b2Qob3B0YXJnLCAmY2hwdHIpOwotICAgICAgICAgICAgaWYgKCgqY2hwdHIgIT0gJ1wwJykgfHwgKHBlclNldERlbGF5IDwgMC4wKSkgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBwZXIgcGFzcyBkZWxheSBvZjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIiwgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdEJzogLy8gRW5kIG9mIHRlc3QgZGVsYXkKLSAgICAgICAgICAgICAgICAgICAgLy8gRGVsYXkgYmV0d2VlbiBjb21wbGV0aW9uIG9mIGZpbmFsIHBhc3MgYW5kIHJlc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgLy8gb2YgZnJhbWV3b3JrCi0gICAgICAgICAgICBlbmREZWxheSA9IHN0cnRvZChvcHRhcmcsICZjaHB0cik7Ci0gICAgICAgICAgICBpZiAoKCpjaHB0ciAhPSAnXDAnKSB8fCAoZW5kRGVsYXkgPCAwLjApKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGVuZCBvZiB0ZXN0IGRlbGF5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZjogJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3QnOiAvLyBEdXJhdGlvbgotICAgICAgICAgICAgZHVyYXRpb24gPSBzdHJ0b2Qob3B0YXJnLCAmY2hwdHIpOwotICAgICAgICAgICAgaWYgKCgqY2hwdHIgIT0gJ1wwJykgfHwgKGR1cmF0aW9uIDwgMC4wKSkgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tbWFuZC1saW5lIHNwZWNpZmllZCBkdXJhdGlvbiBvZjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBleGl0KDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICduJzogLy8gTnVtIHNldCBvcGVyYXRpb25zIHBlciBwYXNzCi0gICAgICAgICAgICBudW1TZXQgPSBzdHJ0b3VsKG9wdGFyZywgJmNocHRyLCAxMCk7Ci0gICAgICAgICAgICBpZiAoKmNocHRyICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgbnVtIHNldCBwZXIgcGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAib2Y6ICVzIiwgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBleGl0KDQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdzJzogLy8gU3RhcnRpbmcgUGFzcwotICAgICAgICAgICAgc0ZsYWcgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHBGbGFnKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21iaW5hdGlvbiBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucy4iKTsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCIgIFRoZSAtcCBvcHRpb24gaXMgbXV0dWFsbHkgZXhjbHVzaXZlIGZyb20gdGhlIik7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiICAtcyBhbmQgLWUgb3B0aW9ucy4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnRQYXNzID0gc3RydG91bChvcHRhcmcsICZjaHB0ciwgMTApOwotICAgICAgICAgICAgaWYgKCpjaHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIHN0YXJ0aW5nIHBhc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mOiAlcyIsIG9wdGFyZyk7Ci0gICAgICAgICAgICAgICAgZXhpdCg2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnZSc6IC8vIEVuZGluZyBQYXNzCi0gICAgICAgICAgICBlRmxhZyA9IHRydWU7Ci0gICAgICAgICAgICBpZiAocEZsYWcpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbWJpbmF0aW9uIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zLiIpOwotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIiAgVGhlIC1wIG9wdGlvbiBpcyBtdXR1YWxseSBleGNsdXNpdmUgZnJvbSB0aGUiKTsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCIgIC1zIGFuZCAtZSBvcHRpb25zLiIpOwotICAgICAgICAgICAgICAgIGV4aXQoNyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmRQYXNzID0gc3RydG91bChvcHRhcmcsICZjaHB0ciwgMTApOwotICAgICAgICAgICAgaWYgKCpjaHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiSW52YWxpZCBjb21tYW5kLWxpbmUgc3BlY2lmaWVkIGVuZGluZyBwYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZjogJXMiLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIGV4aXQoOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ3AnOiAvLyBSdW4gYSBzaW5nbGUgc3BlY2lmaWVkIHBhc3MKLSAgICAgICAgICAgIHBGbGFnID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChzRmxhZyB8fCBlRmxhZykgewotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIkludmFsaWQgY29tYmluYXRpb24gb2YgY29tbWFuZC1saW5lIG9wdGlvbnMuIik7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiICBUaGUgLXAgb3B0aW9uIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSBmcm9tIHRoZSIpOwotICAgICAgICAgICAgICAgIHRlc3RQcmludEUoIiAgLXMgYW5kIC1lIG9wdGlvbnMuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCg5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXJ0UGFzcyA9IGVuZFBhc3MgPSBzdHJ0b3VsKG9wdGFyZywgJmNocHRyLCAxMCk7Ci0gICAgICAgICAgICBpZiAoKmNocHRyICE9ICdcMCcpIHsKLSAgICAgICAgICAgICAgICB0ZXN0UHJpbnRFKCJJbnZhbGlkIGNvbW1hbmQtbGluZSBzcGVjaWZpZWQgcGFzcyBvZjogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0YXJnKTsKLSAgICAgICAgICAgICAgICBleGl0KDEwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAndic6IC8vIFZlcmJvc2UKLSAgICAgICAgICAgIHZlcmJvc2UgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlICdoJzogLy8gSGVscAotICAgICAgICAgIGNhc2UgJz8nOgotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCIgICVzIFtvcHRpb25zXSIsIGJhc2VuYW1lKGFyZ3ZbMF0pKTsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgICBvcHRpb25zOiIpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgICAgLXAgRXhlY3V0ZSBzcGVjaWZpZWQgcGFzcyIpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgICAgLXMgU3RhcnRpbmcgcGFzcyIpOwotICAgICAgICAgICAgdGVzdFByaW50RSgiICAgICAgLWUgRW5kaW5nIHBhc3MiKTsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgICAgIC10IER1cmF0aW9uIik7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAtZCBEZWxheSBhZnRlciBlYWNoIHNldCBvcGVyYXRpb24iKTsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgICAgIC1EIEVuZCBvZiB0ZXN0IGRlbGF5Iik7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRFKCIgICAgICAtbiBOdW0gc2V0IG9wZXJhdGlvbnMgcGVyIHBhc3MiKTsKLSAgICAgICAgICAgIHRlc3RQcmludEUoIiAgICAgIC12IFZlcmJvc2UiKTsKLSAgICAgICAgICAgIGV4aXQoKChvcHRvcHQgPT0gMCkgfHwgKG9wdG9wdCA9PSAnPycpKSA/IDAgOiAxMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGVuZFBhc3MgPCBzdGFydFBhc3MpIHsKLSAgICAgICAgdGVzdFByaW50RSgiVW5leHBlY3RlZCBlbmRpbmcgcGFzcyBiZWZvcmUgc3RhcnRpbmcgcGFzcyIpOwotICAgICAgICB0ZXN0UHJpbnRFKCIgIHN0YXJ0UGFzczogJXUgZW5kUGFzczogJXUiLCBzdGFydFBhc3MsIGVuZFBhc3MpOwotICAgICAgICBleGl0KDEyKTsKLSAgICB9Ci0gICAgaWYgKGFyZ2MgIT0gb3B0aW5kKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIlVuZXhwZWN0ZWQgY29tbWFuZC1saW5lIHBvc3Rpb25hbCBhcmd1bWVudCIpOwotICAgICAgICB0ZXN0UHJpbnRFKCIgICVzIFstcyBzdGFydF9wYXNzXSBbLWUgZW5kX3Bhc3NdIFstdCBkdXJhdGlvbl0iLAotICAgICAgICAgICAgYmFzZW5hbWUoYXJndlswXSkpOwotICAgICAgICBleGl0KDEzKTsKLSAgICB9Ci0gICAgdGVzdFByaW50SSgiZHVyYXRpb246ICVnIiwgZHVyYXRpb24pOwotICAgIHRlc3RQcmludEkoInN0YXJ0UGFzczogJXUiLCBzdGFydFBhc3MpOwotICAgIHRlc3RQcmludEkoImVuZFBhc3M6ICV1IiwgZW5kUGFzcyk7Ci0gICAgdGVzdFByaW50SSgibnVtU2V0OiAldSIsIG51bVNldCk7Ci0KLSAgICAvLyBTdG9wIGZyYW1ld29yawotICAgIHJ2ID0gc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgIiVzIiwgQ01EX1NUT1BfRlJBTUVXT1JLKTsKLSAgICBpZiAocnYgPj0gKHNpZ25lZCkgc2l6ZW9mKGNtZCkgLSAxKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkNvbW1hbmQgdG9vIGxvbmcgZm9yOiAlcyIsIENNRF9TVE9QX0ZSQU1FV09SSyk7Ci0gICAgICAgIGV4aXQoMTQpOwotICAgIH0KLSAgICB0ZXN0RXhlY0NtZChjbWQpOwotICAgIHRlc3REZWxheSgxLjApOyAvLyBUT0RPIC0gbmVlZCBtZWFucyB0byBxdWVyeSB3aGV0aGVyIGFzeW5jcm9ub3VzIHN0b3AKLSAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWV3b3JrIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLiAgRm9yIG5vdywganVzdCB3YWl0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGEgbG9uZyB0aW1lLgotCi0gICAgaW5pdCgpOwotCi0gICAgLy8gRm9yIGVhY2ggcGFzcwotICAgIGdldHRpbWVvZmRheSgmc3RhcnRUaW1lLCBOVUxMKTsKLSAgICBmb3IgKHBhc3MgPSBzdGFydFBhc3M7IHBhc3MgPD0gZW5kUGFzczsgcGFzcysrKSB7Ci0gICAgICAgIC8vIFN0b3AgaWYgZHVyYXRpb24gb2Ygd29yayBoYXMgYWxyZWFkeSBiZWVuIHBlcmZvcm1lZAotICAgICAgICBnZXR0aW1lb2ZkYXkoJmN1cnJlbnRUaW1lLCBOVUxMKTsKLSAgICAgICAgZGVsdGEgPSB0dkRlbHRhKCZzdGFydFRpbWUsICZjdXJyZW50VGltZSk7Ci0gICAgICAgIGlmICh0djJkb3VibGUoJmRlbHRhKSA+IGR1cmF0aW9uKSB7IGJyZWFrOyB9Ci0KLSAgICAgICAgLy8gUmVnZW5lcmF0ZSBhIG5ldyBzZXQgb2YgdGVzdCBmcmFtZXMgd2hlbiB0aGlzIHBhc3MgaXMKLSAgICAgICAgLy8gZWl0aGVyIHRoZSBmaXJzdCBwYXNzIG9yIGlzIGluIGEgZGlmZmVyZW50IGdyb3VwIHRoZW4KLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIHBhc3MuICBBIGdyb3VwIG9mIHBhc3NlcyBhcmUgcGFzc2VzIHRoYXQKLSAgICAgICAgLy8gYWxsIGhhdmUgdGhlIHNhbWUgcXVvdGllbnQgd2hlbiB0aGVpciBwYXNzIG51bWJlciBpcwotICAgICAgICAvLyBkaXZpZGVkIGJ5IHBhc3Nlc1Blckdyb3VwLgotICAgICAgICBpZiAoKHBhc3MgPT0gc3RhcnRQYXNzKQotICAgICAgICAgICAgfHwgKChwYXNzIC8gcGFzc2VzUGVyR3JvdXApICE9ICgocGFzcyAtIDEpIC8gcGFzc2VzUGVyR3JvdXApKSkgewotICAgICAgICAgICAgaW5pdEZyYW1lcyhwYXNzIC8gcGFzc2VzUGVyR3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgdGVzdFByaW50SSgiPT09PSBTdGFydGluZyBwYXNzOiAldSIsIHBhc3MpOwotCi0gICAgICAgIC8vIENhdXNlIGRldGVybWluaXN0aWMgc2VxdWVuY2Ugb2YgcHJhbmRvbSBudW1iZXJzIHRvIGJlCi0gICAgICAgIC8vIGdlbmVyYXRlZCBmb3IgdGhpcyBwYXNzLgotICAgICAgICBzcmFuZDQ4KHBhc3MpOwotCi0gICAgICAgIGh3Y19sYXllcl9saXN0X3QgKmxpc3Q7Ci0gICAgICAgIGxpc3QgPSBod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0KHRlc3RSYW5kTW9kKGZyYW1lcy5zaXplKCkpICsgMSk7Ci0gICAgICAgIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHRlc3RQcmludEUoImh3Y1Rlc3RDcmVhdGVMYXllckxpc3QgZmFpbGVkIik7Ci0gICAgICAgICAgICBleGl0KDIwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByYW5kb21seSBzZWxlY3QgYSBzdWJzZXQgb2YgZnJhbWVzIHRvIGJlIHVzZWQgYnkgdGhpcyBwYXNzLgotICAgICAgICB2ZWN0b3IgPHZlY3RvciA8c3A8R3JhcGhpY0J1ZmZlcj4gPiA+IHNlbGVjdGVkRnJhbWVzOwotICAgICAgICBzZWxlY3RlZEZyYW1lcyA9IHZlY3RvclJhbmRTZWxlY3QoZnJhbWVzLCBsaXN0LT5udW1Id0xheWVycyk7Ci0KLSAgICAgICAgLy8gQW55IHRyYW5zZm9ybSB0ZW5kcyB0byBjcmVhdGUgYSBsYXllciB0aGF0IHRoZSBoYXJkd2FyZQotICAgICAgICAvLyBjb21wb3NlciBpcyB1bmFibGUgdG8gc3VwcG9ydCBhbmQgdGh1cyBoYXMgdG8gbGVhdmUgZm9yCi0gICAgICAgIC8vIFN1cmZhY2VGbGluZ2VyLiAgUGxhY2UgaGVhdnkgYmlhcyBvbiBzcGVjaWZ5aW5nIG5vIHRyYW5zZm9ybXMuCi0gICAgICAgIGJvb2wgbm9UcmFuc2Zvcm0gPSB0ZXN0UmFuZEZyYWN0KCkgPiByYXJlUmF0aW87Ci0KLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgbjEgPSAwOyBuMSA8IGxpc3QtPm51bUh3TGF5ZXJzOyBuMSsrKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWR4ID0gdGVzdFJhbmRNb2Qoc2VsZWN0ZWRGcmFtZXNbbjFdLnNpemUoKSk7Ci0gICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnQnVmID0gc2VsZWN0ZWRGcmFtZXNbbjFdW2lkeF07Ci0gICAgICAgICAgICBod2NfbGF5ZXJfdCAqbGF5ZXIgPSAmbGlzdC0+aHdMYXllcnNbbjFdOwotICAgICAgICAgICAgbGF5ZXItPmhhbmRsZSA9IGdCdWYtPmhhbmRsZTsKLQotICAgICAgICAgICAgbGF5ZXItPmJsZW5kaW5nID0gYmxlbmRpbmdPcHNbdGVzdFJhbmRNb2QoTlVNQShibGVuZGluZ09wcykpXTsKLSAgICAgICAgICAgIGxheWVyLT5mbGFncyA9ICh0ZXN0UmFuZEZyYWN0KCkgPiByYXJlUmF0aW8pID8gMAotICAgICAgICAgICAgICAgIDogdmVjdG9yT3IodmVjdG9yUmFuZFNlbGVjdCh2ZWNMYXllckZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJhbmRNb2QodmVjTGF5ZXJGbGFncy5zaXplKCkgKyAxKSkpOwotICAgICAgICAgICAgbGF5ZXItPnRyYW5zZm9ybSA9IChub1RyYW5zZm9ybSB8fCB0ZXN0UmFuZEZyYWN0KCkgPiByYXJlUmF0aW8pID8gMAotICAgICAgICAgICAgICAgIDogdmVjdG9yT3IodmVjdG9yUmFuZFNlbGVjdCh2ZWNUcmFuc2Zvcm1GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSYW5kTW9kKHZlY1RyYW5zZm9ybUZsYWdzLnNpemUoKSArIDEpKSk7Ci0gICAgICAgICAgICBsYXllci0+c291cmNlQ3JvcC5sZWZ0ID0gdGVzdFJhbmRNb2QoZ0J1Zi0+Z2V0V2lkdGgoKSk7Ci0gICAgICAgICAgICBsYXllci0+c291cmNlQ3JvcC50b3AgPSB0ZXN0UmFuZE1vZChnQnVmLT5nZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBsYXllci0+c291cmNlQ3JvcC5yaWdodCA9IGxheWVyLT5zb3VyY2VDcm9wLmxlZnQKLSAgICAgICAgICAgICAgICArIHRlc3RSYW5kTW9kKGdCdWYtPmdldFdpZHRoKCkgLSBsYXllci0+c291cmNlQ3JvcC5sZWZ0KSArIDE7Ci0gICAgICAgICAgICBsYXllci0+c291cmNlQ3JvcC5ib3R0b20gPSBsYXllci0+c291cmNlQ3JvcC50b3AKLSAgICAgICAgICAgICAgICArIHRlc3RSYW5kTW9kKGdCdWYtPmdldEhlaWdodCgpIC0gbGF5ZXItPnNvdXJjZUNyb3AudG9wKSArIDE7Ci0gICAgICAgICAgICBsYXllci0+ZGlzcGxheUZyYW1lLmxlZnQgPSB0ZXN0UmFuZE1vZCh3aWR0aCk7Ci0gICAgICAgICAgICBsYXllci0+ZGlzcGxheUZyYW1lLnRvcCA9IHRlc3RSYW5kTW9kKGhlaWdodCk7Ci0gICAgICAgICAgICBsYXllci0+ZGlzcGxheUZyYW1lLnJpZ2h0ID0gbGF5ZXItPmRpc3BsYXlGcmFtZS5sZWZ0Ci0gICAgICAgICAgICAgICAgKyB0ZXN0UmFuZE1vZCh3aWR0aCAtIGxheWVyLT5kaXNwbGF5RnJhbWUubGVmdCkgKyAxOwotICAgICAgICAgICAgbGF5ZXItPmRpc3BsYXlGcmFtZS5ib3R0b20gPSBsYXllci0+ZGlzcGxheUZyYW1lLnRvcAotICAgICAgICAgICAgICAgICsgdGVzdFJhbmRNb2QoaGVpZ2h0IC0gbGF5ZXItPmRpc3BsYXlGcmFtZS50b3ApICsgMTsKLQotICAgICAgICAgICAgLy8gSW5jcmVhc2UgdGhlIGZyZXF1ZW5jeSB0aGF0IGEgc2NhbGUgZmFjdG9yIG9mIDEuMCBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgc291cmNlQ3JvcCB0byBkaXNwbGF5RnJhbWUgb2NjdXJzLiAgVGhpcyBpcyB0aGUKLSAgICAgICAgICAgIC8vIG1vc3QgY29tbW9uIHNjYWxlIGZhY3RvciB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBhbmQgd291bGQKLSAgICAgICAgICAgIC8vIGJlIHJhcmVseSBwcm9kdWNlZCBieSB0aGlzIHN0cmVzcyB0ZXN0IHdpdGhvdXQgdGhpcwotICAgICAgICAgICAgLy8gbG9naWMuCi0gICAgICAgICAgICBpZiAodGVzdFJhbmRGcmFjdCgpIDw9IGZyZXFSYXRpbykgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgY2hhbmdlIHRvIHNjYWxlIGZhY3RvciB0byAxLjAgaWYgYm90aCB0aGUKLSAgICAgICAgICAgICAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgZml0LgotICAgICAgICAgICAgICAgIGludCBzb3VyY2VXaWR0aCA9IGxheWVyLT5zb3VyY2VDcm9wLnJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXllci0+c291cmNlQ3JvcC5sZWZ0OwotICAgICAgICAgICAgICAgIGludCBzb3VyY2VIZWlnaHQgPSBsYXllci0+c291cmNlQ3JvcC5ib3R0b20KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXllci0+c291cmNlQ3JvcC50b3A7Ci0gICAgICAgICAgICAgICAgaWYgKCgobGF5ZXItPmRpc3BsYXlGcmFtZS5sZWZ0ICsgc291cmNlV2lkdGgpIDw9IHdpZHRoKQotICAgICAgICAgICAgICAgICAgICAmJiAoKGxheWVyLT5kaXNwbGF5RnJhbWUudG9wICsgc291cmNlSGVpZ2h0KSA8PSBoZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheWVyLT5kaXNwbGF5RnJhbWUucmlnaHQgPSBsYXllci0+ZGlzcGxheUZyYW1lLmxlZnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc291cmNlV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgIGxheWVyLT5kaXNwbGF5RnJhbWUuYm90dG9tID0gbGF5ZXItPmRpc3BsYXlGcmFtZS50b3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNvdXJjZUhlaWdodDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLm51bVJlY3RzID0gMTsKLSAgICAgICAgICAgIGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuLnJlY3RzID0gJmxheWVyLT5kaXNwbGF5RnJhbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQZXJmb3JtIHByZXBhcmUgb3BlcmF0aW9uCi0gICAgICAgIGlmICh2ZXJib3NlKSB7IHRlc3RQcmludEkoIlByZXBhcmU6Iik7IGh3Y1Rlc3REaXNwbGF5TGlzdChsaXN0KTsgfQotICAgICAgICBod2NEZXZpY2UtPnByZXBhcmUoaHdjRGV2aWNlLCBsaXN0KTsKLSAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgIHRlc3RQcmludEkoIlBvc3QgUHJlcGFyZToiKTsKLSAgICAgICAgICAgIGh3Y1Rlc3REaXNwbGF5TGlzdFByZXBhcmVNb2RpZmlhYmxlKGxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVHVybiBvZmYgdGhlIGdlb21ldHJ5IGNoYW5nZWQgZmxhZwotICAgICAgICBsaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7Ci0KLSAgICAgICAgLy8gUGVyZm9ybSB0aGUgc2V0IG9wZXJhdGlvbihzKQotICAgICAgICBpZiAodmVyYm9zZSkge3Rlc3RQcmludEkoIlNldDoiKTsgfQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgbnVtU2V0OyBuMSsrKSB7Ci0gICAgICAgICAgICBpZiAodmVyYm9zZSkgeyBod2NUZXN0RGlzcGxheUxpc3RIYW5kbGVzKGxpc3QpOyB9Ci0gICAgICAgICAgICBod2NEZXZpY2UtPnNldChod2NEZXZpY2UsIGRweSwgc3VyZmFjZSwgbGlzdCk7Ci0KLSAgICAgICAgICAgIC8vIFByYW5kb21seSBzZWxlY3QgYSBuZXcgc2V0IG9mIGhhbmRsZXMKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IG4xID0gMDsgbjEgPCBsaXN0LT5udW1Id0xheWVyczsgbjErKykgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZHggPSB0ZXN0UmFuZE1vZChzZWxlY3RlZEZyYW1lc1tuMV0uc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnQnVmID0gc2VsZWN0ZWRGcmFtZXNbbjFdW2lkeF07Ci0gICAgICAgICAgICAgICAgaHdjX2xheWVyX3QgKmxheWVyID0gJmxpc3QtPmh3TGF5ZXJzW24xXTsKLSAgICAgICAgICAgICAgICBsYXllci0+aGFuZGxlID0gKG5hdGl2ZV9oYW5kbGVfdCAqKSBnQnVmLT5oYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRlc3REZWxheShwZXJTZXREZWxheSk7Ci0gICAgICAgIH0KLQotICAgICAgICBod2NUZXN0RnJlZUxheWVyTGlzdChsaXN0KTsKLSAgICAgICAgdGVzdFByaW50SSgiPT09PSBDb21wbGV0ZWQgcGFzczogJXUiLCBwYXNzKTsKLSAgICB9Ci0KLSAgICB0ZXN0RGVsYXkoZW5kRGVsYXkpOwotCi0gICAgLy8gU3RhcnQgZnJhbWV3b3JrCi0gICAgcnYgPSBzbnByaW50ZihjbWQsIHNpemVvZihjbWQpLCAiJXMiLCBDTURfU1RBUlRfRlJBTUVXT1JLKTsKLSAgICBpZiAocnYgPj0gKHNpZ25lZCkgc2l6ZW9mKGNtZCkgLSAxKSB7Ci0gICAgICAgIHRlc3RQcmludEUoIkNvbW1hbmQgdG9vIGxvbmcgZm9yOiAlcyIsIENNRF9TVEFSVF9GUkFNRVdPUkspOwotICAgICAgICBleGl0KDIxKTsKLSAgICB9Ci0gICAgdGVzdEV4ZWNDbWQoY21kKTsKLQotICAgIHRlc3RQcmludEkoIlN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgJXUgcGFzc2VzIiwgcGFzcyAtIHN0YXJ0UGFzcyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBpbml0KHZvaWQpCi17Ci0gICAgc3JhbmQ0OCgwKTsgLy8gRGVmZW5zaXZlbHkgc2V0IHBzZXVkbyByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IG5lZWQgdG8gc2V0IHRoaXMsIGJlY2F1c2UgYSBzdHJlc3MgdGVzdAotICAgICAgICAgICAgICAgIC8vIHNldHMgdGhlIHNlZWQgb24gZWFjaCBwYXNzLiAgRGVmZW5zaXZlbHkgc2V0IGl0IGhlcmUKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IGZ1dHVyZSBjb2RlIHRoYXQgdXNlcyBwc2V1ZG8gcmFuZG9tIG51bWJlcnMKLSAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIGZpcnN0IHBhc3Mgd2lsbCBiZSBkZXRlcm1pbmlzdGljLgotCi0gICAgaHdjVGVzdEluaXREaXNwbGF5KHZlcmJvc2UsICZkcHksICZzdXJmYWNlLCAmd2lkdGgsICZoZWlnaHQpOwotCi0gICAgaHdjVGVzdE9wZW5Id2MoJmh3Y0RldmljZSk7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIEZyYW1lcwotICoKLSAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZ3JhcGhpYyBidWZmZXJzLCB3aXRoaW4gdGhlIGdsb2JhbCB2YXJpYWJsZQotICogbmFtZWQgZnJhbWVzLiAgVGhlIGdyYXBoaWMgYnVmZmVycyBhcmUgY29udGFpbmVkIHdpdGhpbiBhIHZlY3RvciBvZgotICogdmVjdG9ycy4gIEFsbCB0aGUgZ3JhcGhpYyBidWZmZXJzIGluIGEgcGFydGljdWxhciByb3cgYXJlIG9mIHRoZSBzYW1lCi0gKiBmb3JtYXQgYW5kIGRpbWVuc2lvbi4gIEVhY2ggZ3JhcGhpYyBidWZmZXIgaXMgdW5pZm9ybWx5IGZpbGxlZCB3aXRoIGEKLSAqIHByYW5kb21seSBzZWxlY3RlZCBjb2xvci4gIEl0IGlzIGxpa2VseSB0aGF0IGVhY2ggYnVmZmVyLCBldmVuCi0gKiBpbiB0aGUgc2FtZSByb3csIHdpbGwgYmUgZmlsbGVkIHdpdGggYSB1bmlxdWUgY29sb3IuCi0gKi8KLXZvaWQgaW5pdEZyYW1lcyh1bnNpZ25lZCBpbnQgc2VlZCkKLXsKLSAgICBpbnQgcnY7Ci0gICAgY29uc3Qgc2l6ZV90IG1heFJvd3MgPSA1OwotICAgIGNvbnN0IHNpemVfdCBtaW5Db2xzID0gMjsgIC8vIE5lZWQgYXQgbGVhc3QgZG91YmxlIGJ1ZmZlcmluZwotICAgIGNvbnN0IHNpemVfdCBtYXhDb2xzID0gNDsgIC8vIE9uZSBtb3JlIHRoYW4gdHJpcGxlIGJ1ZmZlcmluZwotCi0gICAgaWYgKHZlcmJvc2UpIHsgdGVzdFByaW50SSgiaW5pdEZyYW1lcyBzZWVkOiAldSIsIHNlZWQpOyB9Ci0gICAgc3JhbmQ0OChzZWVkKTsKLSAgICBzaXplX3Qgcm93cyA9IHRlc3RSYW5kTW9kKG1heFJvd3MpICsgMTsKLQotICAgIGZyYW1lcy5jbGVhcigpOwotICAgIGZyYW1lcy5yZXNpemUocm93cyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCByb3cgPSAwOyByb3cgPCByb3dzOyByb3crKykgewotICAgICAgICAvLyBBbGwgZnJhbWVzIHdpdGhpbiBhIHJvdyBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgZm9ybWF0IGFuZAotICAgICAgICAvLyBkaW1lbnNpb25zLiAgV2lkdGggYW5kIGhlaWdodCBuZWVkIHRvIGJlID49IDEuCi0gICAgICAgIHVuc2lnbmVkIGludCBmb3JtYXRJZHggPSB0ZXN0UmFuZE1vZChOVU1BKGh3Y1Rlc3RHcmFwaGljRm9ybWF0KSk7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqZm9ybWF0UHRyCi0gICAgICAgICAgICA9ICZod2NUZXN0R3JhcGhpY0Zvcm1hdFtmb3JtYXRJZHhdOwotICAgICAgICBpbnQgZm9ybWF0ID0gZm9ybWF0UHRyLT5mb3JtYXQ7Ci0KLSAgICAgICAgLy8gUGljayB3aWR0aCBhbmQgaGVpZ2h0LCB3aGljaCBtdXN0IGJlID49IDEgYW5kIHRoZSBzaXplCi0gICAgICAgIC8vIG1vZCB0aGUgd01vZC9oTW9kIHZhbHVlIG11c3QgYmUgZXF1YWwgdG8gMC4KLSAgICAgICAgc2l6ZV90IHcgPSAod2lkdGggKiBtYXhTaXplUmF0aW8pICogdGVzdFJhbmRGcmFjdCgpOwotICAgICAgICBzaXplX3QgaCA9IChoZWlnaHQgKiBtYXhTaXplUmF0aW8pICogdGVzdFJhbmRGcmFjdCgpOwotICAgICAgICB3ID0gbWF4KDF1LCB3KTsKLSAgICAgICAgaCA9IG1heCgxdSwgaCk7Ci0gICAgICAgIGlmICgodyAlIGZvcm1hdFB0ci0+d01vZCkgIT0gMCkgewotICAgICAgICAgICAgdyArPSBmb3JtYXRQdHItPndNb2QgLSAodyAlIGZvcm1hdFB0ci0+d01vZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChoICUgZm9ybWF0UHRyLT5oTW9kKSAhPSAwKSB7Ci0gICAgICAgICAgICBoICs9IGZvcm1hdFB0ci0+aE1vZCAtIChoICUgZm9ybWF0UHRyLT5oTW9kKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgdGVzdFByaW50SSgiICBmcmFtZSAldSB3aWR0aDogJXUgaGVpZ2h0OiAldSBmb3JtYXQ6ICV1ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcm93LCB3LCBoLCBmb3JtYXQsIGh3Y1Rlc3RHcmFwaGljRm9ybWF0MnN0cihmb3JtYXQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb2xzID0gdGVzdFJhbmRNb2QoKG1heENvbHMgKyAxKSAtIG1pbkNvbHMpICsgbWluQ29sczsKLSAgICAgICAgZnJhbWVzW3Jvd10ucmVzaXplKGNvbHMpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBjb2wgPSAwOyBjb2wgPCBjb2xzOyBjb2wrKykgewotICAgICAgICAgICAgQ29sb3JGcmFjdCBjb2xvcih0ZXN0UmFuZEZyYWN0KCksIHRlc3RSYW5kRnJhY3QoKSwgdGVzdFJhbmRGcmFjdCgpKTsKLSAgICAgICAgICAgIGZsb2F0IGFscGhhID0gdGVzdFJhbmRGcmFjdCgpOwotCi0gICAgICAgICAgICBmcmFtZXNbcm93XVtjb2xdID0gbmV3IEdyYXBoaWNCdWZmZXIodywgaCwgZm9ybWF0LCB0ZXhVc2FnZSk7Ci0gICAgICAgICAgICBpZiAoKHJ2ID0gZnJhbWVzW3Jvd11bY29sXS0+aW5pdENoZWNrKCkpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiR3JhcGhpY0J1ZmZlciBpbml0Q2hlY2sgZmFpbGVkLCBydjogJWkiLCBydik7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50RSgiICBmcmFtZSAldSB3aWR0aDogJXUgaGVpZ2h0OiAldSBmb3JtYXQ6ICV1ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywgdywgaCwgZm9ybWF0LCBod2NUZXN0R3JhcGhpY0Zvcm1hdDJzdHIoZm9ybWF0KSk7Ci0gICAgICAgICAgICAgICAgZXhpdCg4MCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGh3Y1Rlc3RGaWxsQ29sb3IoZnJhbWVzW3Jvd11bY29sXS5nZXQoKSwgY29sb3IsIGFscGhhKTsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgdGVzdFByaW50SSgiICAgIGJ1ZjogJXAgaGFuZGxlOiAlcCBjb2xvcjogJXMgYWxwaGE6ICVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1tyb3ddW2NvbF0uZ2V0KCksIGZyYW1lc1tyb3ddW2NvbF0tPmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyhjb2xvcikuY19zdHIoKSwgYWxwaGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKgotICogVmVjdG9yIFJhbmRvbSBTZWxlY3QKLSAqCi0gKiBQcmFuZG9tbHkgc2VsZWN0cyBhbmQgcmV0dXJucyBudW0gZWxlbWVudHMgZnJvbSB2ZWMuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotdmVjdG9yPFQ+IHZlY3RvclJhbmRTZWxlY3QoY29uc3QgdmVjdG9yPFQ+JiB2ZWMsIHNpemVfdCBudW0pCi17Ci0gICAgdmVjdG9yPFQ+IHJ2ID0gdmVjOwotCi0gICAgd2hpbGUgKHJ2LnNpemUoKSA+IG51bSkgewotICAgICAgICBydi5lcmFzZShydi5iZWdpbigpICsgdGVzdFJhbmRNb2QocnYuc2l6ZSgpKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJ2OwotfQotCi0vKgotICogVmVjdG9yIE9yCi0gKgotICogT3IncyB0b2dldGhlbiB0aGUgdmFsdWVzIG9mIGVhY2ggZWxlbWVudCBvZiB2ZWMgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1UIHZlY3Rvck9yKGNvbnN0IHZlY3RvcjxUPiYgdmVjKQotewotICAgIFQgcnYgPSAwOwotCi0gICAgZm9yIChzaXplX3QgbjEgPSAwOyBuMSA8IHZlYy5zaXplKCk7IG4xKyspIHsKLSAgICAgICAgcnYgfD0gdmVjW24xXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcnY7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y1Rlc3RMaWIuY3BwIGIvb3BlbmdsL3Rlc3RzL2h3Yy9od2NUZXN0TGliLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlMGMzZi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y1Rlc3RMaWIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qCi0gKiBIYXJkd2FyZSBDb21wb3NlciBUZXN0IExpYnJhcnkKLSAqIFV0aWxpdHkgbGlicmFyeSBmdW5jdGlvbnMgZm9yIHVzZSBieSB0aGUgSGFyZHdhcmUgQ29tcG9zZXIgdGVzdCBjYXNlcwotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAvLyBGb3IgbnRvaGwoKSBhbmQgaHRvbmwoKQotCi0jaW5jbHVkZSAiaHdjVGVzdExpYi5oIgotCi0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotLy8gRGVmaW5lcwotI2RlZmluZSBOVU1BKGEpIChzaXplb2YoYSkgLyBzaXplb2YoYSBbMF0pKQotCi0vLyBGdW5jdGlvbiBQcm90b3R5cGVzCi1zdGF0aWMgdm9pZCBwcmludEdMU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEdMZW51bSBzKTsKLXN0YXRpYyB2b2lkIGNoZWNrRWdsRXJyb3IoY29uc3QgY2hhciogb3AsIEVHTEJvb2xlYW4gcmV0dXJuVmFsID0gRUdMX1RSVUUpOwotc3RhdGljIHZvaWQgY2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKTsKLXN0YXRpYyB2b2lkIHByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZyk7Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotCi0jZGVmaW5lIEJJVFNQRVJCWVRFICAgICAgICAgICAgOCAvLyBUT0RPOiBPYnRhaW4gZnJvbSA8dmFsdWVzLmg+LCBvbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBoYXMgYmVlbiBhZGRlZAotCi0vLyBJbml0aWFsaXplIERpc3BsYXkKLXZvaWQgaHdjVGVzdEluaXREaXNwbGF5KGJvb2wgdmVyYm9zZSwgRUdMRGlzcGxheSAqZHB5LCBFR0xTdXJmYWNlICpzdXJmYWNlLAotICAgIEVHTGludCAqd2lkdGgsIEVHTGludCAqaGVpZ2h0KQotewotICAgIHN0YXRpYyBFR0xDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICBpbnQgcnY7Ci0KLSAgICBFR0xCb29sZWFuIHJldHVyblZhbHVlOwotICAgIEVHTENvbmZpZyBteUNvbmZpZyA9IHswfTsKLSAgICBFR0xpbnQgY29udGV4dEF0dHJpYnNbXSA9IHsgRUdMX0NPTlRFWFRfQ0xJRU5UX1ZFUlNJT04sIDIsIEVHTF9OT05FIH07Ci0gICAgRUdMaW50IHNDb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsIEVHTF9XSU5ET1dfQklULAotICAgICAgICBFR0xfUkVOREVSQUJMRV9UWVBFLCBFR0xfT1BFTkdMX0VTMl9CSVQsCi0gICAgICAgIEVHTF9OT05FIH07Ci0gICAgRUdMaW50IG1ham9yVmVyc2lvbiwgbWlub3JWZXJzaW9uOwotCi0gICAgY2hlY2tFZ2xFcnJvcigiPGluaXQ+Iik7Ci0gICAgKmRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgY2hlY2tFZ2xFcnJvcigiZWdsR2V0RGlzcGxheSIpOwotICAgIGlmICgqZHB5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImVnbEdldERpc3BsYXkgcmV0dXJuZWQgRUdMX05PX0RJU1BMQVkiKTsKLSAgICAgICAgZXhpdCg3MCk7Ci0gICAgfQotCi0gICAgcmV0dXJuVmFsdWUgPSBlZ2xJbml0aWFsaXplKCpkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbEluaXRpYWxpemUiLCByZXR1cm5WYWx1ZSk7Ci0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgdGVzdFByaW50SSgiRUdMIHZlcnNpb24gJWQuJWQiLCBtYWpvclZlcnNpb24sIG1pbm9yVmVyc2lvbik7Ci0gICAgfQotICAgIGlmIChyZXR1cm5WYWx1ZSAhPSBFR0xfVFJVRSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJlZ2xJbml0aWFsaXplIGZhaWxlZCIpOwotICAgICAgICBleGl0KDcxKTsKLSAgICB9Ci0KLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICBpZiAod2luZG93ID09IE5VTEwpIHsKLSAgICAgICAgdGVzdFByaW50RSgiYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSBmYWlsZWQiKTsKLSAgICAgICAgZXhpdCg3Mik7Ci0gICAgfQotICAgIHJldHVyblZhbHVlID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygqZHB5LAotICAgICAgICBzQ29uZmlnQXR0cmlicywgd2luZG93LCAmbXlDb25maWcpOwotICAgIGlmIChyZXR1cm5WYWx1ZSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KCkgcmV0dXJuZWQgJWQiLAotICAgICAgICAgICAgcmV0dXJuVmFsdWUpOwotICAgICAgICBleGl0KDczKTsKLSAgICB9Ci0gICAgY2hlY2tFZ2xFcnJvcigiRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdyIpOwotCi0gICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgdGVzdFByaW50SSgiQ2hvc2UgdGhpcyBjb25maWd1cmF0aW9uOiIpOwotICAgICAgICBwcmludEVHTENvbmZpZ3VyYXRpb24oKmRweSwgbXlDb25maWcpOwotICAgIH0KLQotICAgICpzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZSgqZHB5LCBteUNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIik7Ci0gICAgaWYgKCpzdXJmYWNlID09IEVHTF9OT19TVVJGQUNFKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImdlbENyZWF0ZVdpbmRvd1N1cmZhY2UgZmFpbGVkLiIpOwotICAgICAgICBleGl0KDc0KTsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dCgqZHB5LCBteUNvbmZpZywgRUdMX05PX0NPTlRFWFQsIGNvbnRleHRBdHRyaWJzKTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7Ci0gICAgaWYgKGNvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKLSAgICAgICAgdGVzdFByaW50RSgiZWdsQ3JlYXRlQ29udGV4dCBmYWlsZWQiKTsKLSAgICAgICAgZXhpdCg3NSk7Ci0gICAgfQotICAgIHJldHVyblZhbHVlID0gZWdsTWFrZUN1cnJlbnQoKmRweSwgKnN1cmZhY2UsICpzdXJmYWNlLCBjb250ZXh0KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xNYWtlQ3VycmVudCIsIHJldHVyblZhbHVlKTsKLSAgICBpZiAocmV0dXJuVmFsdWUgIT0gRUdMX1RSVUUpIHsKLSAgICAgICAgdGVzdFByaW50RSgiZWdsTWFrZUN1cnJlbnQgZmFpbGVkIik7Ci0gICAgICAgIGV4aXQoNzYpOwotICAgIH0KLSAgICBlZ2xRdWVyeVN1cmZhY2UoKmRweSwgKnN1cmZhY2UsIEVHTF9XSURUSCwgd2lkdGgpOwotICAgIGNoZWNrRWdsRXJyb3IoImVnbFF1ZXJ5U3VyZmFjZSIpOwotICAgIGVnbFF1ZXJ5U3VyZmFjZSgqZHB5LCAqc3VyZmFjZSwgRUdMX0hFSUdIVCwgaGVpZ2h0KTsKLSAgICBjaGVja0VnbEVycm9yKCJlZ2xRdWVyeVN1cmZhY2UiKTsKLQotICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgIHRlc3RQcmludEkoIldpbmRvdyBkaW1lbnNpb25zOiAlZCB4ICVkIiwgKndpZHRoLCAqaGVpZ2h0KTsKLQotICAgICAgICBwcmludEdMU3RyaW5nKCJWZXJzaW9uIiwgR0xfVkVSU0lPTik7Ci0gICAgICAgIHByaW50R0xTdHJpbmcoIlZlbmRvciIsIEdMX1ZFTkRPUik7Ci0gICAgICAgIHByaW50R0xTdHJpbmcoIlJlbmRlcmVyIiwgR0xfUkVOREVSRVIpOwotICAgICAgICBwcmludEdMU3RyaW5nKCJFeHRlbnNpb25zIiwgR0xfRVhURU5TSU9OUyk7Ci0gICAgfQotfQotCi0vLyBPcGVuIEhhcmR3YXJlIENvbXBvc2VyIERldmljZQotdm9pZCBod2NUZXN0T3Blbkh3Yyhod2NfY29tcG9zZXJfZGV2aWNlX3QgKipod2NEZXZpY2VQdHIpCi17Ci0gICAgaW50IHJ2OwotICAgIGh3X21vZHVsZV90IGNvbnN0ICpod2NNb2R1bGU7Ci0KLSAgICBpZiAoKHJ2ID0gaHdfZ2V0X21vZHVsZShIV0NfSEFSRFdBUkVfTU9EVUxFX0lELCAmaHdjTW9kdWxlKSkgIT0gMCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod19nZXRfbW9kdWxlIGZhaWxlZCwgcnY6ICVpIiwgcnYpOwotICAgICAgICBlcnJubyA9IC1ydjsKLSAgICAgICAgcGVycm9yKE5VTEwpOwotICAgICAgICBleGl0KDc3KTsKLSAgICB9Ci0gICAgaWYgKChydiA9IGh3Y19vcGVuKGh3Y01vZHVsZSwgaHdjRGV2aWNlUHRyKSkgIT0gMCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod2Nfb3BlbiBmYWlsZWQsIHJ2OiAlaSIsIHJ2KTsKLSAgICAgICAgZXJybm8gPSAtcnY7Ci0gICAgICAgIHBlcnJvcihOVUxMKTsKLSAgICAgICAgZXhpdCg3OCk7Ci0gICAgfQotfQotCi0vLyBDb2xvciBmcmFjdGlvbiBjbGFzcyB0byBzdHJpbmcgY29udmVyc2lvbgotQ29sb3JGcmFjdDo6b3BlcmF0b3Igc3RyaW5nKCkKLXsKLSAgICBvc3RyaW5nc3RyZWFtIG91dDsKLQotICAgIG91dCA8PCAnWycgPDwgdGhpcy0+YzEoKSA8PCAiLCAiCi0gICAgICAgIDw8IHRoaXMtPmMyKCkgPDwgIiwgIgotICAgICAgICA8PCB0aGlzLT5jMygpIDw8ICddJzsKLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8vIERpbWVuc2lvbiBjbGFzcyB0byBzdHJpbmcgY29udmVyc2lvbgotSHdjVGVzdERpbTo6b3BlcmF0b3Igc3RyaW5nKCkKLXsKLSAgICBvc3RyaW5nc3RyZWFtIG91dDsKLQotICAgIG91dCA8PCAnWycgPDwgdGhpcy0+d2lkdGgoKSA8PCAiLCAiCi0gICAgICAgIDw8IHRoaXMtPmhlaWdodCgpIDw8ICddJzsKLQotICAgIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8vIERpbWVuc2lvbiBjbGFzcyB0byBod2NfcmVjdCBjb252ZXJzaW9uCi1Id2NUZXN0RGltOjpvcGVyYXRvciBod2NfcmVjdCgpIGNvbnN0Ci17Ci0gICAgaHdjX3JlY3QgcmVjdDsKLQotICAgIHJlY3QubGVmdCA9IHJlY3QudG9wID0gMDsKLQotICAgIHJlY3QucmlnaHQgPSB0aGlzLT5fdzsKLSAgICByZWN0LmJvdHRvbSA9IHRoaXMtPl9oOwotCi0gICAgcmV0dXJuIHJlY3Q7Ci19Ci0KLS8vIEhhcmR3YXJlIENvbXBvc2VyIHJlY3RhbmdsZSB0byBzdHJpbmcgY29udmVyc2lvbgotc3RyaW5nIGh3Y1Rlc3RSZWN0MnN0cihjb25zdCBzdHJ1Y3QgaHdjX3JlY3QmIHJlY3QpCi17Ci0gICAgb3N0cmluZ3N0cmVhbSBvdXQ7Ci0KLSAgICBvdXQgPDwgJ1snOwotICAgIG91dCA8PCByZWN0LmxlZnQgPDwgIiwgIjsKLSAgICBvdXQgPDwgcmVjdC50b3AgPDwgIiwgIjsKLSAgICBvdXQgPDwgcmVjdC5yaWdodCA8PCAiLCAiOwotICAgIG91dCA8PCByZWN0LmJvdHRvbTsKLSAgICBvdXQgPDwgJ10nOwotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLy8gUGFyc2UgSFdDIHJlY3RhbmdsZSBkZXNjcmlwdGlvbiBvZiBmb3JtIFtsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b21dCi1zdHJ1Y3QgaHdjX3JlY3QgaHdjVGVzdFBhcnNlSHdjUmVjdChpc3RyaW5nc3RyZWFtJiBpbiwgYm9vbCYgZXJyb3IpCi17Ci0gICAgc3RydWN0IGh3Y19yZWN0IHJlY3Q7Ci0gICAgY2hhciBjaFN0YXJ0LCBjaDsKLQotICAgIC8vIERlZmVuc2l2ZWx5IHNwZWNpZnkgdGhhdCBhbiBlcnJvciBvY2N1cnJlZC4gIFdpbGwgY2xlYXIKLSAgICAvLyBlcnJvciBmbGFnIGlmIGFsbCBvZiBwYXJzaW5nIHN1Y2NlZWRzLgotICAgIGVycm9yID0gdHJ1ZTsKLQotICAgIC8vIEZpcnN0IGNoYXJhY3RlciBzaG91bGQgYmUgYSBbIG9yIDwKLSAgICBpbiA+PiBjaFN0YXJ0OwotICAgIGlmICghaW4gfHwgKChjaFN0YXJ0ICE9ICc8JykgJiYgKGNoU3RhcnQgIT0gJ1snKSkpIHsgcmV0dXJuIHJlY3Q7IH0KLQotICAgIC8vIExlZnQKLSAgICBpbiA+PiByZWN0LmxlZnQ7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gcmVjdDsgfQotICAgIGluID4+IGNoOwotICAgIGlmICghaW4gfHwgKGNoICE9ICcsJykpIHsgcmV0dXJuIHJlY3Q7IH0KLQotICAgIC8vIFRvcAotICAgIGluID4+IHJlY3QudG9wOwotICAgIGlmICghaW4pIHsgcmV0dXJuIHJlY3Q7IH0KLSAgICBpbiA+PiBjaDsKLSAgICBpZiAoIWluIHx8IChjaCAhPSAnLCcpKSB7IHJldHVybiByZWN0OyB9Ci0KLSAgICAvLyBSaWdodAotICAgIGluID4+IHJlY3QucmlnaHQ7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gcmVjdDsgfQotICAgIGluID4+IGNoOwotICAgIGlmICghaW4gfHwgKGNoICE9ICcsJykpIHsgcmV0dXJuIHJlY3Q7IH0KLQotICAgIC8vIEJvdHRvbQotICAgIGluID4+IHJlY3QuYm90dG9tOwotICAgIGlmICghaW4pIHsgcmV0dXJuIHJlY3Q7IH0KLQotICAgIC8vIENsb3NpbmcgPiBvciBdCi0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gcmVjdDsgfQotICAgIGlmICgoKGNoU3RhcnQgPT0gJzwnKSAmJiAoY2ggIT0gJz4nKSkKLSAgICAgICAgfHwgKChjaFN0YXJ0ID09ICdbJykgJiYgKGNoICE9ICddJykpKSB7IHJldHVybiByZWN0OyB9Ci0KLSAgICAvLyBWYWxpZGF0ZSByaWdodCBhbmQgYm90dG9tIGFyZSBncmVhdGVyIHRoYW4gbGVmdCBhbmQgdG9wCi0gICAgaWYgKChyZWN0LnJpZ2h0IDw9IHJlY3QubGVmdCkgfHwgKHJlY3QuYm90dG9tIDw9IHJlY3QudG9wKSkgeyByZXR1cm4gcmVjdDsgfQotCi0gICAgLy8gTWFkZSBJdCwgY2xlYXIgZXJyb3IgaW5kaWNhdG9yCi0gICAgZXJyb3IgPSBmYWxzZTsKLQotICAgIHJldHVybiByZWN0OwotfQotCi0vLyBQYXJzZSBkaW1lbnNpb24gb2YgZm9ybSBbd2lkdGgsIGhlaWdodF0KLUh3Y1Rlc3REaW0gaHdjVGVzdFBhcnNlRGltKGlzdHJpbmdzdHJlYW0mIGluLCBib29sJiBlcnJvcikKLXsKLSAgICBId2NUZXN0RGltIGRpbTsKLSAgICBjaGFyIGNoU3RhcnQsIGNoOwotICAgIHVpbnQzMl90IHZhbDsKLQotICAgIC8vIERlZmVuc2l2ZWx5IHNwZWNpZnkgdGhhdCBhbiBlcnJvciBvY2N1cnJlZC4gIFdpbGwgY2xlYXIKLSAgICAvLyBlcnJvciBmbGFnIGlmIGFsbCBvZiBwYXJzaW5nIHN1Y2NlZWRzLgotICAgIGVycm9yID0gdHJ1ZTsKLQotICAgIC8vIEZpcnN0IGNoYXJhY3RlciBzaG91bGQgYmUgYSBbIG9yIDwKLSAgICBpbiA+PiBjaFN0YXJ0OwotICAgIGlmICghaW4gfHwgKChjaFN0YXJ0ICE9ICc8JykgJiYgKGNoU3RhcnQgIT0gJ1snKSkpIHsgcmV0dXJuIGRpbTsgfQotCi0gICAgLy8gV2lkdGgKLSAgICBpbiA+PiB2YWw7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gZGltOyB9Ci0gICAgZGltLnNldFdpZHRoKHZhbCk7Ci0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbiB8fCAoY2ggIT0gJywnKSkgeyByZXR1cm4gZGltOyB9Ci0KLSAgICAvLyBIZWlnaHQKLSAgICBpbiA+PiB2YWw7Ci0gICAgaWYgKCFpbikgeyByZXR1cm4gZGltOyB9Ci0gICAgZGltLnNldEhlaWdodCh2YWwpOwotCi0gICAgLy8gQ2xvc2luZyA+IG9yIF0KLSAgICBpbiA+PiBjaDsKLSAgICBpZiAoIWluKSB7IHJldHVybiBkaW07IH0KLSAgICBpZiAoKChjaFN0YXJ0ID09ICc8JykgJiYgKGNoICE9ICc+JykpCi0gICAgICAgIHx8ICgoY2hTdGFydCA9PSAnWycpICYmIChjaCAhPSAnXScpKSkgeyByZXR1cm4gZGltOyB9Ci0KLSAgICAvLyBWYWxpZGF0ZSB3aWR0aCBhbmQgaGVpZ2h0IGdyZWF0ZXIgdGhhbiAwCi0gICAgaWYgKChkaW0ud2lkdGgoKSA8PSAwKSB8fCAoZGltLmhlaWdodCgpIDw9IDApKSB7IHJldHVybiBkaW07IH0KLQotICAgIC8vIE1hZGUgSXQsIGNsZWFyIGVycm9yIGluZGljYXRvcgotICAgIGVycm9yID0gZmFsc2U7Ci0gICAgcmV0dXJuIGRpbTsKLX0KLQotLy8gUGFyc2UgZnJhY3Rpb25hbCBjb2xvciBvZiBmb3JtIFswLiMjLCAwLiMjLCAwLiMjXQotLy8gRnJhY3Rpb25hbCB2YWx1ZXMgY2FuIGJlIGZyb20gMC4wIHRvIDEuMCBpbmNsdXNpdmUuICBOb3RlLCBpbnRlZ2VyCi0vLyB2YWx1ZXMgb2YgMC4wIGFuZCAxLjAsIHdoaWNoIGFyZSBub24tZnJhY3Rpb25hbCwgYXJlIGNvbnNpZGVyZWQgdmFsaWQuCi0vLyBUaGV5IGFyZSBhbiBleGNlcHRpb24sIGFsbCBvdGhlciB2YWxpZCBpbnB1dHMgYXJlIGZyYWN0aW9ucy4KLUNvbG9yRnJhY3QgaHdjVGVzdFBhcnNlQ29sb3IoaXN0cmluZ3N0cmVhbSYgaW4sIGJvb2wmIGVycm9yKQotewotICAgIENvbG9yRnJhY3QgY29sb3I7Ci0gICAgY2hhciBjaFN0YXJ0LCBjaDsKLSAgICBmbG9hdCBjMSwgYzIsIGMzOwotCi0gICAgLy8gRGVmZW5zaXZlbHkgc3BlY2lmeSB0aGF0IGFuIGVycm9yIG9jY3VycmVkLiAgV2lsbCBjbGVhcgotICAgIC8vIGVycm9yIGZsYWcgaWYgYWxsIG9mIHBhcnNpbmcgc3VjY2VlZHMuCi0gICAgZXJyb3IgPSB0cnVlOwotCi0gICAgLy8gRmlyc3QgY2hhcmFjdGVyIHNob3VsZCBiZSBhIFsgb3IgPAotICAgIGluID4+IGNoU3RhcnQ7Ci0gICAgaWYgKCFpbiB8fCAoKGNoU3RhcnQgIT0gJzwnKSAmJiAoY2hTdGFydCAhPSAnWycpKSkgeyByZXR1cm4gY29sb3I7IH0KLQotICAgIC8vIDFzdCBDb21wb25lbnQKLSAgICBpbiA+PiBjMTsKLSAgICBpZiAoIWluKSB7IHJldHVybiBjb2xvcjsgfQotICAgIGlmICgoYzEgPCAwLjApIHx8IChjMSA+IDEuMCkpIHsgcmV0dXJuIGNvbG9yOyB9Ci0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbiB8fCAoY2ggIT0gJywnKSkgeyByZXR1cm4gY29sb3I7IH0KLQotICAgIC8vIDJuZCBDb21wb25lbnQKLSAgICBpbiA+PiBjMjsKLSAgICBpZiAoIWluKSB7IHJldHVybiBjb2xvcjsgfQotICAgIGlmICgoYzIgPCAwLjApIHx8IChjMiA+IDEuMCkpIHsgcmV0dXJuIGNvbG9yOyB9Ci0gICAgaW4gPj4gY2g7Ci0gICAgaWYgKCFpbiB8fCAoY2ggIT0gJywnKSkgeyByZXR1cm4gY29sb3I7IH0KLQotICAgIC8vIDNyZCBDb21wb25lbnQKLSAgICBpbiA+PiBjMzsKLSAgICBpZiAoIWluKSB7IHJldHVybiBjb2xvcjsgfQotICAgIGlmICgoYzMgPCAwLjApIHx8IChjMyA+IDEuMCkpIHsgcmV0dXJuIGNvbG9yOyB9Ci0KLSAgICAvLyBDbG9zaW5nID4gb3IgXQotICAgIGluID4+IGNoOwotICAgIGlmICghaW4pIHsgcmV0dXJuIGNvbG9yOyB9Ci0gICAgaWYgKCgoY2hTdGFydCA9PSAnPCcpICYmIChjaCAhPSAnPicpKQotICAgICAgICB8fCAoKGNoU3RhcnQgPT0gJ1snKSAmJiAoY2ggIT0gJ10nKSkpIHsgcmV0dXJuIGNvbG9yOyB9Ci0KLSAgICAvLyBBcmUgYWxsIHRoZSBjb21wb25lbnRzIGZyYWN0aW9uYWwKLSAgICBpZiAoKGMxIDwgMC4wKSB8fCAoYzEgPiAxLjApCi0gICAgICAgIHx8IChjMiA8IDAuMCkgfHwgKGMyID4gMS4wKQotICAgICAgICB8fCAoYzMgPCAwLjApIHx8IChjMyA+IDEuMCkpIHsgcmV0dXJuIGNvbG9yOyB9Ci0KLSAgICAvLyBNYWRlIEl0LCBjbGVhciBlcnJvciBpbmRpY2F0b3IKLSAgICBlcnJvciA9IGZhbHNlOwotCi0gICAgcmV0dXJuIENvbG9yRnJhY3QoYzEsIGMyLCBjMyk7Ci19Ci0KLS8vIExvb2sgdXAgYW5kIHJldHVybiBwb2ludGVyIHRvIHN0cnVjdHVyZSB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpY3MKLS8vIG9mIHRoZSBncmFwaGljIGZvcm1hdCBuYW1lZCBieSB0aGUgZGVzYyBwYXJhbWV0ZXIuICBTZWFyY2ggZmFpbHVyZQotLy8gaW5kaWNhdGVkIGJ5IHRoZSByZXR1cm4gb2YgTlVMTC4KLWNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAoY29uc3QgY2hhciAqZGVzYykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBuMSA9IDA7IG4xIDwgTlVNQShod2NUZXN0R3JhcGhpY0Zvcm1hdCk7IG4xKyspIHsKLSAgICAgICAgaWYgKHN0cmluZyhkZXNjKSA9PSBzdHJpbmcoaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdLmRlc2MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gJmh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0vLyBMb29rIHVwIGFuZCByZXR1cm4gcG9pbnRlciB0byBzdHJ1Y3R1cmUgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWNzCi0vLyBvZiB0aGUgZ3JhcGhpYyBmb3JtYXQgc3BlY2lmaWVkIGJ5IHRoZSBpZCBwYXJhbWV0ZXIuICBTZWFyY2ggZmFpbHVyZQotLy8gaW5kaWNhdGVkIGJ5IHRoZSByZXR1cm4gb2YgTlVMTC4KLWNvbnN0IHN0cnVjdCBod2NUZXN0R3JhcGhpY0Zvcm1hdCAqaHdjVGVzdEdyYXBoaWNGb3JtYXRMb29rdXAodWludDMyX3QgaWQpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgbjEgPSAwOyBuMSA8IE5VTUEoaHdjVGVzdEdyYXBoaWNGb3JtYXQpOyBuMSsrKSB7Ci0gICAgICAgIGlmIChpZCA9PSBod2NUZXN0R3JhcGhpY0Zvcm1hdFtuMV0uZm9ybWF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gJmh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8vIEdpdmVuIHRoZSBpbnRlZ2VyIElEIG9mIGEgZ3JhcGhpYyBmb3JtYXQsIHJldHVybiBhIHBvaW50ZXIgdG8KLS8vIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBmb3JtYXQuCi1jb25zdCBjaGFyICpod2NUZXN0R3JhcGhpY0Zvcm1hdDJzdHIodWludDMyX3QgZm9ybWF0KQotewotICAgIGNvbnN0IHN0YXRpYyBjaGFyICp1bmtub3duID0gInVua25vd24iOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgbjEgPSAwOyBuMSA8IE5VTUEoaHdjVGVzdEdyYXBoaWNGb3JtYXQpOyBuMSsrKSB7Ci0gICAgICAgIGlmIChmb3JtYXQgPT0gaHdjVGVzdEdyYXBoaWNGb3JtYXRbbjFdLmZvcm1hdCkgewotICAgICAgICAgICAgcmV0dXJuIGh3Y1Rlc3RHcmFwaGljRm9ybWF0W24xXS5kZXNjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHVua25vd247Ci19Ci0KLS8qCi0gKiBod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0Ci0gKiBEeW5hbWljYWxseSBjcmVhdGVzIGxheWVyIGxpc3Qgd2l0aCBudW1MYXllcnMgd29ydGgKLSAqIG9mIGh3TGF5ZXJzIGVudHJpZXMuCi0gKi8KLWh3Y19sYXllcl9saXN0X3QgKmh3Y1Rlc3RDcmVhdGVMYXllckxpc3Qoc2l6ZV90IG51bUxheWVycykKLXsKLSAgICBod2NfbGF5ZXJfbGlzdF90ICpsaXN0OwotCi0gICAgc2l6ZV90IHNpemUgPSBzaXplb2YoaHdjX2xheWVyX2xpc3QpICsgbnVtTGF5ZXJzICogc2l6ZW9mKGh3Y19sYXllcl90KTsKLSAgICBpZiAoKGxpc3QgPSAoaHdjX2xheWVyX2xpc3RfdCAqKSBjYWxsb2MoMSwgc2l6ZSkpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGxpc3QtPmZsYWdzID0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7Ci0gICAgbGlzdC0+bnVtSHdMYXllcnMgPSBudW1MYXllcnM7Ci0KLSAgICByZXR1cm4gbGlzdDsKLX0KLQotLyoKLSAqIGh3Y1Rlc3RGcmVlTGF5ZXJMaXN0Ci0gKiBGcmVlcyBtZW1vcnkgcHJldmlvdXMgYWxsb2NhdGVkIHZpYSBod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0KCkuCi0gKi8KLXZvaWQgaHdjVGVzdEZyZWVMYXllckxpc3QoaHdjX2xheWVyX2xpc3RfdCAqbGlzdCkKLXsKLSAgICBmcmVlKGxpc3QpOwotfQotCi0vLyBEaXNwbGF5IHRoZSBzZXR0aW5ncyBvZiB0aGUgbGF5ZXIgbGlzdCBwb2ludGVkIHRvIGJ5IGxpc3QKLXZvaWQgaHdjVGVzdERpc3BsYXlMaXN0KGh3Y19sYXllcl9saXN0X3QgKmxpc3QpCi17Ci0gICAgdGVzdFByaW50SSgiICBmbGFnczogJSN4JXMiLCBsaXN0LT5mbGFncywKLSAgICAgICAgICAgICAgIChsaXN0LT5mbGFncyAmIEhXQ19HRU9NRVRSWV9DSEFOR0VEKSA/ICIgR0VPTUVUUllfQ0hBTkdFRCIgOiAiIik7Ci0gICAgdGVzdFByaW50SSgiICBudW1Id0xheWVyczogJXUiLCBsaXN0LT5udW1Id0xheWVycyk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBsYXllciA9IDA7IGxheWVyIDwgbGlzdC0+bnVtSHdMYXllcnM7IGxheWVyKyspIHsKLSAgICAgICAgdGVzdFByaW50SSgiICAgIGxheWVyICV1IGNvbXBvc2l0aW9uVHlwZTogJSN4JXMlcyIsIGxheWVyLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUgPT0gSFdDX0ZSQU1FQlVGRkVSKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgRlJBTUVCVUZGRVIiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUgPT0gSFdDX09WRVJMQVkpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBPVkVSTEFZIiA6ICIiKTsKLQotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBoaW50czogJSN4IiwKLSAgICAgICAgICAgICAgICAgICBsaXN0LT5od0xheWVyc1tsYXllcl0uaGludHMsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oaW50cyAmIEhXQ19ISU5UX1RSSVBMRV9CVUZGRVIpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBUUklQTEVfQlVGRkVSIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIChsaXN0LT5od0xheWVyc1tsYXllcl0uaGludHMgJiBIV0NfSElOVF9DTEVBUl9GQikKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIENMRUFSX0ZCIiA6ICIiKTsKLQotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBmbGFnczogJSN4JXMiLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5mbGFncywKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmZsYWdzICYgSFdDX1NLSVBfTEFZRVIpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBTS0lQX0xBWUVSIiA6ICIiKTsKLQotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBoYW5kbGU6ICVwIiwKLSAgICAgICAgICAgICAgICAgICBsaXN0LT5od0xheWVyc1tsYXllcl0uaGFuZGxlKTsKLQotICAgICAgICAvLyBJbnRlbnRpb25hbGx5IHNraXBwZWQgZGlzcGxheSBvZiBST1RfMTgwICYgUk9UXzI3MCwKLSAgICAgICAgLy8gd2hpY2ggYXJlIGZvcm1lZCBmcm9tIGNvbWJpbmF0aW9ucyBvZiB0aGUgb3RoZXIgZmxhZ3MuCi0gICAgICAgIHRlc3RQcmludEkoIiAgICAgIHRyYW5zZm9ybTogJSN4JXMlcyVzIiwKLSAgICAgICAgICAgICAgICAgICBsaXN0LT5od0xheWVyc1tsYXllcl0udHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgIChsaXN0LT5od0xheWVyc1tsYXllcl0udHJhbnNmb3JtICYgSFdDX1RSQU5TRk9STV9GTElQX0gpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBGTElQX0giIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS50cmFuc2Zvcm0gJiBIV0NfVFJBTlNGT1JNX0ZMSVBfVikKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIEZMSVBfViIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLnRyYW5zZm9ybSAmIEhXQ19UUkFOU0ZPUk1fUk9UXzkwKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgUk9UXzkwIiA6ICIiKTsKLQotICAgICAgICB0ZXN0UHJpbnRJKCIgICAgICBibGVuZGluZzogJSN4JXMlcyVzIiwKLSAgICAgICAgICAgICAgICAgICBsaXN0LT5od0xheWVyc1tsYXllcl0uYmxlbmRpbmcsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5ibGVuZGluZyA9PSBIV0NfQkxFTkRJTkdfTk9ORSkKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIE5PTkUiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5ibGVuZGluZyA9PSBIV0NfQkxFTkRJTkdfUFJFTVVMVCkKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIFBSRU1VTFQiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5ibGVuZGluZyA9PSBIV0NfQkxFTkRJTkdfQ09WRVJBR0UpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBDT1ZFUkFHRSIgOiAiIik7Ci0KLSAgICAgICAgdGVzdFByaW50SSgiICAgICAgc291cmNlQ3JvcDogJXMiLAotICAgICAgICAgICAgICAgICAgIGh3Y1Rlc3RSZWN0MnN0cihsaXN0LT5od0xheWVyc1tsYXllcl0uc291cmNlQ3JvcCkuY19zdHIoKSk7Ci0gICAgICAgIHRlc3RQcmludEkoIiAgICAgIGRpc3BsYXlGcmFtZTogJXMiLAotICAgICAgICAgICAgICAgICAgIGh3Y1Rlc3RSZWN0MnN0cihsaXN0LT5od0xheWVyc1tsYXllcl0uZGlzcGxheUZyYW1lKS5jX3N0cigpKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgICAgc2NhbGVGYWN0b3I6IFslZiwgJWZdIiwKLSAgICAgICAgICAgICAgICAgICAoZmxvYXQpIChsaXN0LT5od0xheWVyc1tsYXllcl0uc291cmNlQ3JvcC5yaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGlzdC0+aHdMYXllcnNbbGF5ZXJdLnNvdXJjZUNyb3AubGVmdCkKLSAgICAgICAgICAgICAgICAgICAgICAgLyAoZmxvYXQpIChsaXN0LT5od0xheWVyc1tsYXllcl0uZGlzcGxheUZyYW1lLnJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsaXN0LT5od0xheWVyc1tsYXllcl0uZGlzcGxheUZyYW1lLmxlZnQpLAotICAgICAgICAgICAgICAgICAgIChmbG9hdCkgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5zb3VyY2VDcm9wLmJvdHRvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbGlzdC0+aHdMYXllcnNbbGF5ZXJdLnNvdXJjZUNyb3AudG9wKQotICAgICAgICAgICAgICAgICAgICAgICAvIChmbG9hdCkgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5kaXNwbGF5RnJhbWUuYm90dG9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBsaXN0LT5od0xheWVyc1tsYXllcl0uZGlzcGxheUZyYW1lLnRvcCkpOwotICAgIH0KLX0KLQotLyoKLSAqIERpc3BsYXkgTGlzdCBQcmVwYXJlIE1vZGlmaWFibGUKLSAqCi0gKiBEaXNwbGF5cyB0aGUgcG9ydGlvbnMgb2YgYSBsaXN0IHRoYXQgYXJlIG1lYW50IHRvIGJlIG1vZGlmaWVkIGJ5Ci0gKiBhIHByZXBhcmUgY2FsbC4KLSAqLwotdm9pZCBod2NUZXN0RGlzcGxheUxpc3RQcmVwYXJlTW9kaWZpYWJsZShod2NfbGF5ZXJfbGlzdF90ICpsaXN0KQotewotICAgIHVpbnQzMl90IG51bU92ZXJsYXlzID0gMDsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBsYXllciA9IDA7IGxheWVyIDwgbGlzdC0+bnVtSHdMYXllcnM7IGxheWVyKyspIHsKLSAgICAgICAgaWYgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUgPT0gSFdDX09WRVJMQVkpIHsKLSAgICAgICAgICAgIG51bU92ZXJsYXlzKys7Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdFByaW50SSgiICAgIGxheWVyICV1IGNvbXBvc2l0aW9uVHlwZTogJSN4JXMlcyIsIGxheWVyLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUgPT0gSFdDX0ZSQU1FQlVGRkVSKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgRlJBTUVCVUZGRVIiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5jb21wb3NpdGlvblR5cGUgPT0gSFdDX09WRVJMQVkpCi0gICAgICAgICAgICAgICAgICAgICAgID8gIiBPVkVSTEFZIiA6ICIiKTsKLSAgICAgICAgdGVzdFByaW50SSgiICAgICAgaGludHM6ICUjeCVzJXMiLAotICAgICAgICAgICAgICAgICAgIGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oaW50cywKLSAgICAgICAgICAgICAgICAgICAobGlzdC0+aHdMYXllcnNbbGF5ZXJdLmhpbnRzICYgSFdDX0hJTlRfVFJJUExFX0JVRkZFUikKLSAgICAgICAgICAgICAgICAgICAgICAgPyAiIFRSSVBMRV9CVUZGRVIiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgKGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oaW50cyAmIEhXQ19ISU5UX0NMRUFSX0ZCKQotICAgICAgICAgICAgICAgICAgICAgICA/ICIgQ0xFQVJfRkIiIDogIiIpOwotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCIgICAgbnVtT3ZlcmxheXM6ICV1IiwgbnVtT3ZlcmxheXMpOwotfQotCi0vKgotICogRGlzcGxheSBMaXN0IEhhbmRsZXMKLSAqCi0gKiBEaXNwbGF5cyB0aGUgaGFuZGxlcyBvZiBhbGwgdGhlIGdyYXBoaWMgYnVmZmVycyBpbiB0aGUgbGlzdC4KLSAqLwotdm9pZCBod2NUZXN0RGlzcGxheUxpc3RIYW5kbGVzKGh3Y19sYXllcl9saXN0X3QgKmxpc3QpCi17Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IG1heExheWVyc1BlckxpbmUgPSA2OwotCi0gICAgb3N0cmluZ3N0cmVhbSBzdHIoIiAgbGF5ZXJzOiIpOwotICAgIGZvciAodW5zaWduZWQgaW50IGxheWVyID0gMDsgbGF5ZXIgPCBsaXN0LT5udW1Id0xheWVyczsgbGF5ZXIrKykgewotICAgICAgICBzdHIgPDwgJyAnIDw8IGxpc3QtPmh3TGF5ZXJzW2xheWVyXS5oYW5kbGU7Ci0gICAgICAgIGlmICgoKGxheWVyICUgbWF4TGF5ZXJzUGVyTGluZSkgPT0gKG1heExheWVyc1BlckxpbmUgLSAxKSkKLSAgICAgICAgICAgICYmIChsYXllciAhPSBsaXN0LT5udW1Id0xheWVycyAtIDEpKSB7Ci0gICAgICAgICAgICB0ZXN0UHJpbnRJKCIlcyIsIHN0ci5zdHIoKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHN0ci5zdHIoIiAgICAiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB0ZXN0UHJpbnRJKCIlcyIsIHN0ci5zdHIoKS5jX3N0cigpKTsKLX0KLQotLy8gUmV0dXJucyBhIHVpbnQzMl90IHRoYXQgY29udGFpbnMgYSBmb3JtYXQgc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgYQotLy8gc2luZ2xlIHBpeGVsIG9mIHRoZSBnaXZlbiBjb2xvciBhbmQgYWxwaGEgdmFsdWVzLgotdWludDMyX3QgaHdjVGVzdENvbG9yMlBpeGVsKHVpbnQzMl90IGZvcm1hdCwgQ29sb3JGcmFjdCBjb2xvciwgZmxvYXQgYWxwaGEpCi17Ci0gICAgY29uc3Qgc3RydWN0IGF0dHJpYiB7Ci0gICAgICAgIHVpbnQzMl90IGZvcm1hdDsKLSAgICAgICAgYm9vbCAgIGhvc3RCeXRlT3JkZXI7Ci0gICAgICAgIHNpemVfdCBieXRlczsKLSAgICAgICAgc2l6ZV90IGMxT2Zmc2V0OwotICAgICAgICBzaXplX3QgYzFTaXplOwotICAgICAgICBzaXplX3QgYzJPZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBjMlNpemU7Ci0gICAgICAgIHNpemVfdCBjM09mZnNldDsKLSAgICAgICAgc2l6ZV90IGMzU2l6ZTsKLSAgICAgICAgc2l6ZV90IGFPZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBhU2l6ZTsKLSAgICB9IGF0dHJpYnV0ZXNbXSA9IHsKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCBmYWxzZSwgNCwgIDAsIDgsICA4LCA4LCAxNiwgOCwgMjQsIDh9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsIGZhbHNlLCA0LCAgMCwgOCwgIDgsIDgsIDE2LCA4LCAgMCwgMH0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQl84ODgsICAgZmFsc2UsIDMsICAwLCA4LCAgOCwgOCwgMTYsIDgsICAwLCAwfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NSwgICB0cnVlLCAgMiwgIDAsIDUsICA1LCA2LCAxMSwgNSwgIDAsIDB9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgsIGZhbHNlLCA0LCAxNiwgOCwgIDgsIDgsICAwLCA4LCAyNCwgOH0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfNTU1MSwgdHJ1ZSAsIDIsICAwLCA1LCAgNSwgNSwgMTAsIDUsIDE1LCAxfSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0LCBmYWxzZSwgMiwgMTIsIDQsICAwLCA0LCAgNCwgNCwgIDgsIDR9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCAgICAgIHRydWUsICAzLCAxNiwgOCwgIDgsIDgsICAwLCA4LCAgMCwgMH0sICAKLSAgICB9OwotCi0gICAgY29uc3Qgc3RydWN0IGF0dHJpYiAqYXR0cmliOwotICAgIGZvciAoYXR0cmliID0gYXR0cmlidXRlczsgYXR0cmliIDwgYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcyk7Ci0gICAgICAgICBhdHRyaWIrKykgewotICAgICAgICBpZiAoYXR0cmliLT5mb3JtYXQgPT0gZm9ybWF0KSB7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmIChhdHRyaWIgPj0gYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcykpIHsKLSAgICAgICAgdGVzdFByaW50RSgiY29sb3JGcmFjdDJQaXhlbCB1bnN1cHBvcnRlZCBmb3JtYXQgb2Y6ICV1IiwgZm9ybWF0KTsKLSAgICAgICAgZXhpdCg4MCk7Ci0gICAgfQotCi0gICAgdWludDMyX3QgcGl4ZWw7Ci0gICAgcGl4ZWwgPSBodG9ubCgodWludDMyX3QpIHJvdW5kKCgoKDEgPDwgYXR0cmliLT5jMVNpemUpIC0gMSkgKiBjb2xvci5jMSgpKSkKLSAgICAgICAgIDw8ICgoc2l6ZW9mKHBpeGVsKSAqIEJJVFNQRVJCWVRFKQotICAgICAgICAgICAgIC0gKGF0dHJpYi0+YzFPZmZzZXQgKyBhdHRyaWItPmMxU2l6ZSkpKTsKLSAgICBwaXhlbCB8PSBodG9ubCgodWludDMyX3QpIHJvdW5kKCgoKDEgPDwgYXR0cmliLT5jMlNpemUpIC0gMSkgKiBjb2xvci5jMigpKSkKLSAgICAgICAgIDw8ICgoc2l6ZW9mKHBpeGVsKSAqIEJJVFNQRVJCWVRFKQotICAgICAgICAgICAgIC0gKGF0dHJpYi0+YzJPZmZzZXQgKyBhdHRyaWItPmMyU2l6ZSkpKTsKLSAgICBwaXhlbCB8PSBodG9ubCgodWludDMyX3QpIHJvdW5kKCgoKDEgPDwgYXR0cmliLT5jM1NpemUpIC0gMSkgKiBjb2xvci5jMygpKSkKLSAgICAgICAgIDw8ICgoc2l6ZW9mKHBpeGVsKSAqIEJJVFNQRVJCWVRFKQotICAgICAgICAgICAgIC0gKGF0dHJpYi0+YzNPZmZzZXQgKyBhdHRyaWItPmMzU2l6ZSkpKTsKLSAgICBpZiAoYXR0cmliLT5hU2l6ZSkgewotICAgICAgICBwaXhlbCB8PSBodG9ubCgodWludDMyX3QpIHJvdW5kKCgoKDEgPDwgYXR0cmliLT5hU2l6ZSkgLSAxKSAqIGFscGhhKSkKLSAgICAgICAgICAgICA8PCAoKHNpemVvZihwaXhlbCkgKiBCSVRTUEVSQllURSkKLSAgICAgICAgICAgICAgICAgLSAoYXR0cmliLT5hT2Zmc2V0ICsgYXR0cmliLT5hU2l6ZSkpKTsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYi0+aG9zdEJ5dGVPcmRlcikgewotICAgICAgICBwaXhlbCA9IG50b2hsKHBpeGVsKTsKLSAgICAgICAgcGl4ZWwgPj49IHNpemVvZihwaXhlbCkgKiBCSVRTUEVSQllURSAtIGF0dHJpYi0+Ynl0ZXMgKiBCSVRTUEVSQllURTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGl4ZWw7Ci19Ci0KLS8vIFNldHMgdGhlIHBpeGVsIGF0IHRoZSBnaXZlbiB4IGFuZCB5IGNvb3JkaW5hdGVzIHRvIHRoZSBjb2xvciBhbmQgYWxwaGEKLS8vIHZhbHVlIGdpdmVuIGJ5IHBpeGVsLiAgVGhlIGNvbnRlbnRzIG9mIHBpeGVsIGlzIGZvcm1hdCBzcGVjaWZpYy4gIEl0J3MKLS8vIHZhbHVlIHNob3VsZCBjb21lIGZyb20gYSBjYWxsIHRvIGh3Y1Rlc3RDb2xvcjJQaXhlbCgpLgotdm9pZCBod2NUZXN0U2V0UGl4ZWwoR3JhcGhpY0J1ZmZlciAqZ0J1ZiwgdW5zaWduZWQgY2hhciAqYnVmLAotICAgICAgICAgICAgICB1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCBwaXhlbCkKLXsKLQotICAgIGNvbnN0IHN0cnVjdCBhdHRyaWIgewotICAgICAgICBpbnQgZm9ybWF0OwotICAgICAgICBzaXplX3QgYnl0ZXM7Ci0gICAgfSBhdHRyaWJ1dGVzW10gPSB7Ci0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgIDR9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgsICA0fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwgICAgM30sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsICAgIDJ9LAotICAgICAgICB7SEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODgsICA0fSwKLSAgICAgICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLCAgMn0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwgIDJ9LAotICAgIH07Ci0KLSAgICBpZiAoZ0J1Zi0+Z2V0UGl4ZWxGb3JtYXQoKSA9PSBIQUxfUElYRUxfRk9STUFUX1lWMTIpIHsKLSAgICAgICAgdWludDMyX3QgeVBsYW5lT2Zmc2V0LCB1UGxhbmVPZmZzZXQsIHZQbGFuZU9mZnNldDsKLSAgICAgICAgdWludDMyX3QgeVBsYW5lU3RyaWRlID0gZ0J1Zi0+Z2V0U3RyaWRlKCk7Ci0gICAgICAgIHVpbnQzMl90IHVQbGFuZVN0cmlkZSA9ICgoZ0J1Zi0+Z2V0U3RyaWRlKCkgLyAyKSArIDB4ZikgJiB+MHhmOwotICAgICAgICB1aW50MzJfdCB2UGxhbmVTdHJpZGUgPSB1UGxhbmVTdHJpZGU7Ci0gICAgICAgIHlQbGFuZU9mZnNldCA9IDA7Ci0gICAgICAgIHZQbGFuZU9mZnNldCA9IHlQbGFuZU9mZnNldCArIHlQbGFuZVN0cmlkZSAqIGdCdWYtPmdldEhlaWdodCgpOwotICAgICAgICB1UGxhbmVPZmZzZXQgPSB2UGxhbmVPZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgKyB2UGxhbmVTdHJpZGUgKiAoZ0J1Zi0+Z2V0SGVpZ2h0KCkgLyAyKTsKLSAgICAgICAgKihidWYgKyB5UGxhbmVPZmZzZXQgKyB5ICogeVBsYW5lU3RyaWRlICsgeCkgPSBwaXhlbCAmIDB4ZmY7Ci0gICAgICAgICooYnVmICsgdVBsYW5lT2Zmc2V0ICsgKHkgLyAyKSAqIHVQbGFuZVN0cmlkZSArICh4IC8gMikpCi0gICAgICAgICAgICA9IChwaXhlbCAmIDB4ZmYwMCkgPj4gODsKLSAgICAgICAgKihidWYgKyB2UGxhbmVPZmZzZXQgKyAoeSAvIDIpICogdlBsYW5lU3RyaWRlICsgKHggLyAyKSkKLSAgICAgICAgICAgID0gKHBpeGVsICYgMHhmZjAwMDApID4+IDE2OwotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjb25zdCBzdHJ1Y3QgYXR0cmliICphdHRyaWI7Ci0gICAgZm9yIChhdHRyaWIgPSBhdHRyaWJ1dGVzOyBhdHRyaWIgPCBhdHRyaWJ1dGVzICsgTlVNQShhdHRyaWJ1dGVzKTsKLSAgICAgICAgIGF0dHJpYisrKSB7Ci0gICAgICAgIGlmIChhdHRyaWItPmZvcm1hdCA9PSBnQnVmLT5nZXRQaXhlbEZvcm1hdCgpKSB7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmIChhdHRyaWIgPj0gYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcykpIHsKLSAgICAgICAgdGVzdFByaW50RSgic2V0UGl4ZWwgdW5zdXBwb3J0ZWQgZm9ybWF0IG9mOiAldSIsCi0gICAgICAgICAgICAgICAgICAgZ0J1Zi0+Z2V0UGl4ZWxGb3JtYXQoKSk7Ci0gICAgICAgIGV4aXQoOTApOwotICAgIH0KLQotICAgIG1lbW1vdmUoYnVmICsgKChnQnVmLT5nZXRTdHJpZGUoKSAqIGF0dHJpYi0+Ynl0ZXMpICogeSkKLSAgICAgICAgICAgICsgKGF0dHJpYi0+Ynl0ZXMgKiB4KSwgJnBpeGVsLCBhdHRyaWItPmJ5dGVzKTsKLX0KLQotLy8gRmlsbCBhIGdpdmVuIGdyYXBoaWMgYnVmZmVyIHdpdGggYSB1bmlmb3JtIGNvbG9yIGFuZCBhbHBoYQotdm9pZCBod2NUZXN0RmlsbENvbG9yKEdyYXBoaWNCdWZmZXIgKmdCdWYsIENvbG9yRnJhY3QgY29sb3IsIGZsb2F0IGFscGhhKQotewotICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZiA9IE5VTEw7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIHVpbnQzMl90IHBpeGVsOwotCi0gICAgcGl4ZWwgPSBod2NUZXN0Q29sb3IyUGl4ZWwoZ0J1Zi0+Z2V0UGl4ZWxGb3JtYXQoKSwgY29sb3IsIGFscGhhKTsKLQotICAgIGVyciA9IGdCdWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmJ1ZikpOwotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICB0ZXN0UHJpbnRFKCJod2NUZXN0RmlsbENvbG9yIGxvY2sgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgIGV4aXQoMTAwKTsKLSAgICB9Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCB4ID0gMDsgeCA8IGdCdWYtPmdldFN0cmlkZSgpOyB4KyspIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBnQnVmLT5nZXRIZWlnaHQoKTsgeSsrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB2YWwgPSBwaXhlbDsKLSAgICAgICAgICAgIGh3Y1Rlc3RTZXRQaXhlbChnQnVmLCBidWYsIHgsIHksICh4IDwgZ0J1Zi0+Z2V0V2lkdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBpeGVsIDogdGVzdFJhbmQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBnQnVmLT51bmxvY2soKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdEZpbGxDb2xvciB1bmxvY2sgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgIGV4aXQoMTAxKTsKLSAgICB9Ci19Ci0KLS8vIEZpbGwgdGhlIGdpdmVuIGJ1ZmZlciB3aXRoIGEgaG9yaXpvbnRhbCBibGVuZCBvZiBjb2xvcnMsIHdpdGggdGhlIGxlZnQKLS8vIHNpZGUgY29sb3IgZ2l2ZW4gYnkgc3RhcnRDb2xvciBhbmQgdGhlIHJpZ2h0IHNpZGUgY29sb3IgZ2l2ZW4gYnkKLS8vIGVuZENvbG9yLiAgVGhlIHN0YXJ0Q29sb3IgYW5kIGVuZENvbG9yIHZhbHVlcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQKLS8vIGdpdmVuIGJ5IGNvbG9yRm9ybWF0LCB3aGljaCBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgZm9ybWF0IG9mIHRoZQotLy8gZ3JhcGhpYyBidWZmZXIuICBXaGVuIGRpZmZlcmVudCwgYSBjb2xvciBjb252ZXJzaW9uIGlzIGRvbmUgd2hlbiBwb3NzaWJsZQotLy8gdG8gdGhlIGdyYXBoaWMgZm9ybWF0IG9mIHRoZSBncmFwaGljIGJ1ZmZlci4gIEEgY29sb3Igb2YgYmxhY2sgaXMKLS8vIHByb2R1Y2VkIGZvciBjYXNlcyB3aGVyZSB0aGUgY29udmVyc2lvbiBpcyBpbXBvc3NpYmxlIChlLmcuIG91dCBvZiBnYW11dAotLy8gdmFsdWVzKS4KLXZvaWQgaHdjVGVzdEZpbGxDb2xvckhCbGVuZChHcmFwaGljQnVmZmVyICpnQnVmLCB1aW50MzJfdCBjb2xvckZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckZyYWN0IHN0YXJ0Q29sb3IsIENvbG9yRnJhY3QgZW5kQ29sb3IpCi17Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZiA9IE5VTEw7Ci0gICAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBnQnVmLT5nZXRXaWR0aCgpOwotICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGdCdWYtPmdldEhlaWdodCgpOwotICAgIGNvbnN0IHVpbnQzMl90IHN0cmlkZSA9IGdCdWYtPmdldFN0cmlkZSgpOwotCi0gICAgZXJyID0gZ0J1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmYnVmKSk7Ci0gICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImh3Y1Rlc3RGaWxsQ29sb3JIQmxlbmQgbG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgZXhpdCgxMTApOwotICAgIH0KLQotICAgIGZvciAodW5zaWduZWQgaW50IHggPSAwOyB4IDwgc3RyaWRlOyB4KyspIHsKLSAgICAgICAgdWludDMyX3QgcGl4ZWw7Ci0gICAgICAgIGlmICh4IDwgd2lkdGgpIHsKLSAgICAgICAgICAgIENvbG9yRnJhY3QgY29sb3Ioc3RhcnRDb2xvci5jMSgpICsgKGVuZENvbG9yLmMxKCkgLSBzdGFydENvbG9yLmMxKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgoZmxvYXQpIHggLyAoZmxvYXQpICh3aWR0aCAtIDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDb2xvci5jMigpICsgKGVuZENvbG9yLmMyKCkgLSBzdGFydENvbG9yLmMyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgoZmxvYXQpIHggLyAoZmxvYXQpICh3aWR0aCAtIDEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDb2xvci5jMygpICsgKGVuZENvbG9yLmMzKCkgLSBzdGFydENvbG9yLmMzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICgoZmxvYXQpIHggLyAoZmxvYXQpICh3aWR0aCAtIDEpKSk7Ci0KLSAgICAgICAgICAgIC8vIFdoZW4gZm9ybWF0cyBkaWZmZXIsIGNvbnZlcnQgY29sb3JzLgotICAgICAgICAgICAgLy8gSW1wb3J0YW50IHRvIG5vdCBjb252ZXJ0IHdoZW4gZm9ybWF0cyBhcmUgdGhlIHNhbWUsIHNpbmNlCi0gICAgICAgICAgICAvLyBvdXQgb2YgZ2FtdXQgY29sb3JzIGFyZSBhbHdheXMgY29udmVydGVkIHRvIGJsYWNrLgotICAgICAgICAgICAgaWYgKGNvbG9yRm9ybWF0ICE9ICh1aW50MzJfdCkgZ0J1Zi0+Z2V0UGl4ZWxGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIGh3Y1Rlc3RDb2xvckNvbnZlcnQoY29sb3JGb3JtYXQsIGdCdWYtPmdldFBpeGVsRm9ybWF0KCksIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpeGVsID0gaHdjVGVzdENvbG9yMlBpeGVsKGdCdWYtPmdldFBpeGVsRm9ybWF0KCksIGNvbG9yLCAxLjApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRmlsbCBwYWQgd2l0aCByYW5kb20gdmFsdWVzCi0gICAgICAgICAgICBwaXhlbCA9IHRlc3RSYW5kKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICBod2NUZXN0U2V0UGl4ZWwoZ0J1ZiwgYnVmLCB4LCB5LCBwaXhlbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnIgPSBnQnVmLT51bmxvY2soKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdEZpbGxDb2xvckhCbGVuZCB1bmxvY2sgZmFpbGVkOiAlZCIsIGVycik7Ci0gICAgICAgIGV4aXQoMTExKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBXaGVuIHBvc3NpYmxlLCBjb252ZXJ0cyBjb2xvciBzcGVjaWZpZWQgYXMgYSBmdWxsIHJhbmdlIHZhbHVlIGluCi0gKiB0aGUgZnJvbUZvcm1hdCwgaW50byBhbiBlcXVpdmFsZW50IGZ1bGwgcmFuZ2UgY29sb3IgaW4gdGhlIHRvRm9ybWF0LgotICogV2hlbiBjb252ZXJzaW9uIGlzIGltcG9zc2libGUgKGUuZy4gb3V0IG9mIGdhbXV0IGNvbG9yKSBhIGNvbG9yCi0gKiBvciBibGFjayBpbiB0aGUgZnVsbCByYW5nZSBvdXRwdXQgZm9ybWF0IGlzIHByb2R1Y2VkLiAgVGhlIGlucHV0Ci0gKiBjb2xvciBpcyBnaXZlbiBhcyBhIGZyYWN0aW9uYWwgY29sb3IgaW4gdGhlIHBhcmFtZXRlciBuYW1lZCBjb2xvci4KLSAqIFRoZSBwcm9kdWNlZCBjb2xvciBpcyB3cml0dGVuIG92ZXIgdGhlIHNhbWUgcGFyYW1ldGVyIHVzZWQgdG8KLSAqIHByb3ZpZGUgdGhlIGlucHV0IGNvbG9yLgotICoKLSAqIEVhY2ggZ3JhcGhpYyBmb3JtYXQgaGFzIDMgY29sb3IgY29tcG9uZW50cyBhbmQgZWFjaCBvZiB0aGVzZQotICogY29tcG9uZW50cyBoYXMgYm90aCBhIGZ1bGwgYW5kIGluIGdhbXV0IHJhbmdlLiAgVGhpcyBmdW5jdGlvbiB1c2VzCi0gKiBhIHRhYmxlIHRoYXQgcHJvdmlkZXMgdGhlIGZ1bGwgYW5kIGluIGdhbXV0IHJhbmdlcyBvZiBlYWNoIG9mIHRoZQotICogc3VwcG9ydGVkIGdyYXBoaWMgZm9ybWF0cy4gIFRoZSBmdWxsIHJhbmdlIGlzIGdpdmVuIGJ5IG1lbWJlcnMgbmFtZWQKLSAqIGNbMTIzXU1pbiB0byBjWzEyM11NYXgsIHdoaWxlIHRoZSBpbiBnYW11dCByYW5nZSBpcyBnaXZlbiBieSBtZW1iZXJzCi0gKiBuYW1lZCBjWzEyM11Mb3cgdG8gY1sxMjNdSGlnaC4gIEluIG1vc3QgY2FzZXMgdGhlIGZ1bGwgYW5kIGluIGdhbXV0Ci0gKiByYW5nZXMgYXJlIGVxdWl2YWxlbnQuICBUaGlzIG9jY3VycyB3aGVuIHRoZSBjWzEyM11NaW4gPT0gY1sxMjNdTG93IGFuZAotICogY1sxMjNdSGlnaCA9PSBjWzEyM11NYXguCi0gKgotICogVGhlIGlucHV0IGFuZCBwcm9kdWNlZCBjb2xvcnMgYXJlIGJvdGggc3BlY2lmaWVkIGFzIGEgZnJhY3Rpb25hbCBhbW91bnQKLSAqIG9mIHRoZSBmdWxsIHJhbmdlLiAgVGhlIGRpYWdyYW0gYmVsb3cgcHJvdmlkZXMgYW4gb3ZlcnZpZXcgb2YgdGhlCi0gKiBjb252ZXJzaW9uIHByb2Nlc3MuICBUaGUgbWFpbiBzdGVwcyBhcmU6Ci0gKgotICogICAxLiBQcm9kdWNlIGJsYWNrIGlmIHRoZSBpbnB1dCBjb2xvciBpcyBvdXQgb2YgZ2FtdXQuCi0gKgotICogICAyLiBDb252ZXJ0IHRoZSBpbiBnYW11dCBjb2xvciBpbnRvIHRoZSBmcmFjdGlvbiBvZiB0aGUgZnJvbUZyb21hdAotICogICAgICBpbiBnYW11dCByYW5nZS4KLSAqCi0gKiAgIDMuIENvbnZlcnQgZnJvbSB0aGUgZnJhY3Rpb24gb2YgdGhlIGluIGdhbXV0IGZyb20gZm9ybWF0IHJhbmdlIHRvCi0gKiAgICAgIHRoZSBmcmFjdGlvbiBvZiB0aGUgaW4gZ2FtdXQgdG8gZm9ybWF0IHJhbmdlLiAgUHJvZHVjZSBibGFjawotICogICAgICBpZiBhbiBlcXVpdmFsZW50IGNvbG9yIGRvZXMgbm90IGV4aXN0cy4KLSAqCi0gKiAgIDQuIENvdmVydCBmcm9tIHRoZSBmcmFjdGlvbiBvZiB0aGUgaW4gZ2FtdXQgdG8gZm9ybWF0IHRvIHRoZQotICogICAgICBmcmFjdGlvbiBvZiB0aGUgZnVsbCByYW5nZSB0byBmb3JtYXQuCi0gKgotICogICAgICAgRnJvbSBGb3JtYXQgICAgICAgICAgICAgICAgIFRvIEZvcm1hdAotICogICAgbWF4ICAgICAgICAgICBoaWdoICAgICAgICAgICAgaGlnaCAgICAgICAgbWF4Ci0gKiAgICAtLS0tKyAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKwotICogICAgaGlnaCBcICAgICAgICAgICAgICAgLyAgICAgICAgICAgICBcICAgICAgaGlnaAotICogICAgLS0tLS0tXC0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgKy0tLS0tLS0tPgotICogICAgICAgICAgIFwKLSAqICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgICArLS0tIGJsYWNrIC0tKwotICogICAgICAgICAgICAgXCAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgXAotICogICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICstLT4KLSAqICAgIGxvdyAgICAgICAgXCAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgbG93Ci0gKiAgICAtLS0tLS0tLSAtLS0rLS0gYmxhY2sgLS0rCi0gKiAgICBtaW4gICAgICAgICAgICAgbG93ICAgICAgICAgICBsb3cgICAgICAgICAgIG1pbgotICogICAgIF4gICAgICAgICAgICAgICBeICAgICAgXiAgICAgIF4gICAgICAgICAgICAgXgotICogICAgIHwgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgICAgfAotICogICAgIHwgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgIHwgICAgICAgICAgICAgKy0tIGZyYWN0aW9uIG9mIGZ1bGwgcmFuZ2UKLSAqICAgICB8ICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICArLS0gZnJhY3Rpb24gb2YgdmFsaWQgcmFuZ2UKLSAqICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICstLSBmcm9tRm9ybWF0IHRvIHRvRm9ybWF0IGNvbG9yIGNvbnZlcnNpb24KLSAqICAgICB8ICAgICAgICAgICAgICAgKy0tIGZyYWN0aW9uIG9mIHZhbGlkIHJhbmdlCi0gKiAgICAgKy0tIGZyYWN0aW9uIG9mIGZ1bGwgcmFuZ2UKLSAqLwotdm9pZCBod2NUZXN0Q29sb3JDb252ZXJ0KHVpbnQzMl90IGZyb21Gb3JtYXQsIHVpbnQzMl90IHRvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgQ29sb3JGcmFjdCYgY29sb3IpCi17Ci0gICAgY29uc3Qgc3RydWN0IGF0dHJpYiB7Ci0gICAgICAgIHVpbnQzMl90ICAgICBmb3JtYXQ7Ci0gICAgICAgIGJvb2wgICAgICAgICByZ2I7Ci0gICAgICAgIGJvb2wgICAgICAgICB5dXY7Ci0gICAgICAgIGludCAgICAgICAgICBjMU1pbiwgYzFMb3csIGMxSGlnaCwgYzFNYXg7Ci0gICAgICAgIGludCAgICAgICAgICBjMk1pbiwgYzJMb3csIGMySGlnaCwgYzJNYXg7Ci0gICAgICAgIGludCAgICAgICAgICBjM01pbiwgYzNMb3csIGMzSGlnaCwgYzNNYXg7Ci0gICAgfSBhdHRyaWJ1dGVzW10gPSB7Ci0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OCwgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1LCAwLCAwLCAyNTUsIDI1NX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCwgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1LCAwLCAwLCAyNTUsIDI1NX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQl84ODgsICAgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1LCAwLCAwLCAyNTUsIDI1NX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQl81NjUsICAgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMzEsIDMxLCAwLCAwLCA2MywgNjMsIDAsIDAsIDMxLCAzMX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCwgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMjU1LCAyNTUsIDAsIDAsIDI1NSwgMjU1LCAwLCAwLCAyNTUsIDI1NX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfNTU1MSwgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMzEsIDMxLCAwLCAwLCAzMSwgMzEsIDAsIDAsIDMxLCAzMX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQkFfNDQ0NCwgdHJ1ZSwgIGZhbHNlLAotICAgICAgICAgMCwgMCwgMTUsIDE1LCAwLCAwLCAxNSwgMTUsIDAsIDAsIDE1LCAxNX0sCi0gICAgICAgIHtIQUxfUElYRUxfRk9STUFUX1lWMTIsICAgICAgZmFsc2UsIHRydWUsCi0gICAgICAgICAwLCAxNiwgMjM1LCAyNTUsIDAsIDE2LCAyNDAsIDI1NSwgMCwgMTYsIDI0MCwgMjU1fSwKLSAgICB9OwotCi0gICAgY29uc3Qgc3RydWN0IGF0dHJpYiAqZnJvbUF0dHJpYjsKLSAgICBmb3IgKGZyb21BdHRyaWIgPSBhdHRyaWJ1dGVzOyBmcm9tQXR0cmliIDwgYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcyk7Ci0gICAgICAgICBmcm9tQXR0cmliKyspIHsKLSAgICAgICAgaWYgKGZyb21BdHRyaWItPmZvcm1hdCA9PSBmcm9tRm9ybWF0KSB7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmIChmcm9tQXR0cmliID49IGF0dHJpYnV0ZXMgKyBOVU1BKGF0dHJpYnV0ZXMpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImh3Y1Rlc3RDb2xvckNvbnZlcnQgdW5zdXBwb3J0ZWQgZnJvbSBmb3JtYXQgb2Y6ICV1IiwKLSAgICAgICAgICAgICAgICAgICBmcm9tRm9ybWF0KTsKLSAgICAgICAgZXhpdCgxMjApOwotICAgIH0KLQotICAgIGNvbnN0IHN0cnVjdCBhdHRyaWIgKnRvQXR0cmliOwotICAgIGZvciAodG9BdHRyaWIgPSBhdHRyaWJ1dGVzOyB0b0F0dHJpYiA8IGF0dHJpYnV0ZXMgKyBOVU1BKGF0dHJpYnV0ZXMpOwotICAgICAgICAgdG9BdHRyaWIrKykgewotICAgICAgICBpZiAodG9BdHRyaWItPmZvcm1hdCA9PSB0b0Zvcm1hdCkgeyBicmVhazsgfQotICAgIH0KLSAgICBpZiAodG9BdHRyaWIgPj0gYXR0cmlidXRlcyArIE5VTUEoYXR0cmlidXRlcykpIHsKLSAgICAgICAgdGVzdFByaW50RSgiaHdjVGVzdENvbG9yQ29udmVydCB1bnN1cHBvcnRlZCB0byBmb3JtYXQgb2Y6ICV1IiwKLSAgICAgICAgICAgICAgICAgICB0b0Zvcm1hdCk7Ci0gICAgICAgIGV4aXQoMTIxKTsKLSAgICB9Ci0KLSAgICAvLyBQcm9kdWNlIGJsYWNrIGlmIGFueSBvZiB0aGUgZnJvbSBjb21wb25lbnRzIGFyZSBvdXRzaWRlIHRoZQotICAgIC8vIHZhbGlkIGNvbG9yIHJhbmdlCi0gICAgZmxvYXQgYzFWYWwgPSBmcm9tQXR0cmliLT5jMU1pbgotICAgICAgICArICgoZmxvYXQpIChmcm9tQXR0cmliLT5jMU1heCAtIGZyb21BdHRyaWItPmMxTWluKSAqIGNvbG9yLmMxKCkpOwotICAgIGZsb2F0IGMyVmFsID0gZnJvbUF0dHJpYi0+YzJNaW4KLSAgICAgICAgKyAoKGZsb2F0KSAoZnJvbUF0dHJpYi0+YzJNYXggLSBmcm9tQXR0cmliLT5jMk1pbikgKiBjb2xvci5jMigpKTsKLSAgICBmbG9hdCBjM1ZhbCA9IGZyb21BdHRyaWItPmMzTWluCi0gICAgICAgICsgKChmbG9hdCkgKGZyb21BdHRyaWItPmMzTWF4IC0gZnJvbUF0dHJpYi0+YzNNaW4pICogY29sb3IuYzMoKSk7Ci0gICAgaWYgKChjMVZhbCA8IGZyb21BdHRyaWItPmMxTG93KSB8fCAoYzFWYWwgPiBmcm9tQXR0cmliLT5jMUhpZ2gpCi0gICAgICAgIHx8IChjMlZhbCA8IGZyb21BdHRyaWItPmMyTG93KSB8fCAoYzJWYWwgPiBmcm9tQXR0cmliLT5jMkhpZ2gpCi0gICAgICAgIHx8IChjM1ZhbCA8IGZyb21BdHRyaWItPmMzTG93KSB8fCAoYzNWYWwgPiBmcm9tQXR0cmliLT5jM0hpZ2gpKSB7Ci0KLSAgICAgICAgLy8gUmV0dXJuIGJsYWNrCi0gICAgICAgIC8vIFdpbGwgdXNlIHJlcHJlc2VudGF0aW9uIG9mIGJsYWNrIGZyb20gUkdCQTg4ODggZ3JhcGhpYyBmb3JtYXQKLSAgICAgICAgLy8gYW5kIHJlY3Vyc2l2ZWx5IGNvbnZlcnQgaXQgdG8gdGhlIHJlcXVlc3RlZCBncmFwaGljIGZvcm1hdC4KLSAgICAgICAgY29sb3IgPSBDb2xvckZyYWN0KDAuMCwgMC4wLCAwLjApOwotICAgICAgICBod2NUZXN0Q29sb3JDb252ZXJ0KEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LCB0b0Zvcm1hdCwgY29sb3IpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gV2l0aGluIGZyb20gZm9ybWF0LCBjb252ZXJ0IGZyb20gZnJhY3Rpb24gb2YgZnVsbCByYW5nZQotICAgIC8vIHRvIGZyYWN0aW9uIG9mIHZhbGlkIHJhbmdlCi0gICAgY29sb3IgPSBDb2xvckZyYWN0KChjMVZhbCAtIGZyb21BdHRyaWItPmMxTG93KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZnJvbUF0dHJpYi0+YzFIaWdoIC0gZnJvbUF0dHJpYi0+YzFMb3cpLAotICAgICAgICAgICAgICAgICAgICAgICAoYzJWYWwgLSBmcm9tQXR0cmliLT5jMkxvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGZyb21BdHRyaWItPmMySGlnaCAtIGZyb21BdHRyaWItPmMyTG93KSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGMzVmFsIC0gZnJvbUF0dHJpYi0+YzNMb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvIChmcm9tQXR0cmliLT5jM0hpZ2ggLSBmcm9tQXR0cmliLT5jM0xvdykpOwotCi0gICAgLy8gSWYgbmVlZGVkIHBlcmZvcm0gUkdCIHRvIFlVViBjb252ZXJzaW9uCi0gICAgZmxvYXQgd3IgPSAwLjIxMjYsIHdnID0gMC43MTUyLCB3YiA9IDAuMDcyMjsgLy8gSVRVNzA5IHJlY29tbWVuZGVkIGNvbnN0YW50cwotICAgIGlmIChmcm9tQXR0cmliLT5yZ2IgJiYgdG9BdHRyaWItPnl1dikgewotICAgICAgICBmbG9hdCByID0gY29sb3IuYzEoKSwgZyA9IGNvbG9yLmMyKCksIGIgPSBjb2xvci5jMygpOwotICAgICAgICBmbG9hdCB5ID0gd3IgKiByICsgd2cgKiBnICsgd2IgKiBiOwotICAgICAgICBmbG9hdCB1ID0gMC41ICogKChiIC0geSkgLyAoMS4wIC0gd2IpKSArIDAuNTsKLSAgICAgICAgZmxvYXQgdiA9IDAuNSAqICgociAtIHkpIC8gKDEuMCAtIHdyKSkgKyAwLjU7Ci0KLSAgICAgICAgLy8gUHJvZHVjZSBibGFjayBpZiBjb2xvciBpcyBvdXRzaWRlIHRoZSBZVVYgZ2FtdXQKLSAgICAgICAgaWYgKCh5IDwgMC4wKSB8fCAoeSA+IDEuMCkKLSAgICAgICAgICAgIHx8ICh1IDwgMC4wKSB8fCAodSA+IDEuMCkKLSAgICAgICAgICAgIHx8ICh2IDwgMC4wKSB8fCAodiA+IDEuMCkpIHsKLSAgICAgICAgICAgIHkgPSAwLjA7Ci0gICAgICAgICAgICB1ID0gdiA9IDAuNTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbG9yID0gQ29sb3JGcmFjdCh5LCB1LCB2KTsKLSAgICB9Ci0KLSAgICAvLyBJZiBuZWVkZWQgcGVyZm9ybSBZVVYgdG8gUkdCIGNvbnZlcnNpb24KLSAgICAvLyBFcXVhdGlvbnMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBJVFU3MDkgZXF1YXRpb25zIGZvciBSR0IgdG8gWVVWCi0gICAgLy8gY29udmVyc2lvbiwgcGx1cyB0aGUgZm9sbG93aW5nIGFsZ2VicmE6Ci0gICAgLy8KLSAgICAvLyAgIHUgPSAwLjUgKiAoKGIgLSB5KSAvICgxLjAgLSB3YikpICsgMC41Ci0gICAgLy8gICAwLjUgKiAoKGIgLSB5KSAvICgxLjAgLSB3YikpID0gdSAtIDAuNQotICAgIC8vICAgKGIgLSB5KSAvICgxLjAgLSB3YikgPSAyICogKHUgLSAwLjUpCi0gICAgLy8gICBiIC0geSA9IDIgKiAodSAtIDAuNSkgKiAoMS4wIC0gd2IpCi0gICAgLy8gICBiID0gMiAqICh1IC0gMC41KSAqICgxLjAgLSB3YikgKyB5Ci0gICAgLy8KLSAgICAvLyAgIHYgPSAwLjUgKiAoKHIgLXkpIC8gKDEuMCAtIHdyKSkgKyAwLjUKLSAgICAvLyAgIDAuNSAqICgociAtIHkpIC8gKDEuMCAtIHdyKSkgPSB2IC0gMC41Ci0gICAgLy8gICAociAtIHkpIC8gKDEuMCAtIHdyKSA9IDIgKiAodiAtIDAuNSkKLSAgICAvLyAgIHIgLSB5ID0gMiAqICh2IC0gMC41KSAqICgxLjAgLSB3cikKLSAgICAvLyAgIHIgPSAyICogKHYgLSAwLjUpICogKDEuMCAtIHdyKSArIHkKLSAgICAvLwotICAgIC8vICAgeSA9IHdyICogciArIHdnICogZyArIHdiICogYgotICAgIC8vICAgd3IgKiByICsgd2cgKiBnICsgd2IgKiBiID0geQotICAgIC8vICAgd2cgKiBnID0geSAtIHdyICogciAtIHdiICogYgotICAgIC8vICAgZyA9ICh5IC0gd3IgKiByIC0gd2IgKiBiKSAvIHdnCi0gICAgaWYgKGZyb21BdHRyaWItPnl1diAmJiB0b0F0dHJpYi0+cmdiKSB7Ci0gICAgICAgIGZsb2F0IHkgPSBjb2xvci5jMSgpLCB1ID0gY29sb3IuYzIoKSwgdiA9IGNvbG9yLmMzKCk7Ci0gICAgICAgIGZsb2F0IHIgPSAyLjAgKiAodiAtIDAuNSkgKiAoMS4wIC0gd3IpICsgeTsKLSAgICAgICAgZmxvYXQgYiA9IDIuMCAqICh1IC0gMC41KSAqICgxLjAgLSB3YikgKyB5OwotICAgICAgICBmbG9hdCBnID0gKHkgLSB3ciAqIHIgLSB3YiAqIGIpIC8gd2c7Ci0KLSAgICAgICAgLy8gUHJvZHVjZSBibGFjayBpZiBjb2xvciBpcyBvdXRzaWRlIHRoZSBSR0IgZ2FtdXQKLSAgICAgICAgaWYgKChyIDwgMC4wKSB8fCAociA+IDEuMCkKLSAgICAgICAgICAgIHx8IChnIDwgMC4wKSB8fCAoZyA+IDEuMCkKLSAgICAgICAgICAgIHx8IChiIDwgMC4wKSB8fCAoYiA+IDEuMCkpIHsKLSAgICAgICAgICAgIHIgPSBnID0gYiA9IDAuMDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbG9yID0gQ29sb3JGcmFjdChyLCBnLCBiKTsKLSAgICB9Ci0KLSAgICAvLyBXaXRoaW4gdG8gZm9ybWF0LCBjb252ZXJ0IGZyb20gZnJhY3Rpb24gb2YgdmFsaWQgcmFuZ2UKLSAgICAvLyB0byBmcmFjdGlvbiBvZiBmdWxsIHJhbmdlCi0gICAgYzFWYWwgPSAodG9BdHRyaWItPmMxTG93Ci0gICAgICAgICsgKGZsb2F0KSAodG9BdHRyaWItPmMxSGlnaCAtIHRvQXR0cmliLT5jMUxvdykgKiBjb2xvci5jMSgpKTsKLSAgICBjMlZhbCA9ICh0b0F0dHJpYi0+YzFMb3cKLSAgICAgICAgKyAoZmxvYXQpICh0b0F0dHJpYi0+YzJIaWdoIC0gdG9BdHRyaWItPmMyTG93KSAqIGNvbG9yLmMyKCkpOwotICAgIGMzVmFsID0gKHRvQXR0cmliLT5jMUxvdwotICAgICAgICArIChmbG9hdCkgKHRvQXR0cmliLT5jM0hpZ2ggLSB0b0F0dHJpYi0+YzNMb3cpICogY29sb3IuYzMoKSk7Ci0gICAgY29sb3IgPSBDb2xvckZyYWN0KChmbG9hdCkgKGMxVmFsIC0gdG9BdHRyaWItPmMxTWluKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoZmxvYXQpICh0b0F0dHJpYi0+YzFNYXggLSB0b0F0dHJpYi0+YzFNaW4pLAotICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIChjMlZhbCAtIHRvQXR0cmliLT5jMk1pbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKGZsb2F0KSAodG9BdHRyaWItPmMyTWF4IC0gdG9BdHRyaWItPmMyTWluKSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KSAoYzNWYWwgLSB0b0F0dHJpYi0+YzNNaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvIChmbG9hdCkgKHRvQXR0cmliLT5jM01heCAtIHRvQXR0cmliLT5jM01pbikpOwotfQotCi0vLyBUT0RPOiBVc2UgUHJpbnRHTFN0cmluZywgQ2VjaGNrR2xFcnJvciwgYW5kIFByaW50RUdMQ29uZmlndXJhdGlvbgotLy8gICAgICAgZnJvbSBsaWJnbFRlc3QKLXN0YXRpYyB2b2lkIHByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpCi17Ci0gICAgY29uc3QgY2hhciAqdiA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKHMpOwotCi0gICAgaWYgKHYgPT0gTlVMTCkgewotICAgICAgICB0ZXN0UHJpbnRJKCJHTCAlcyB1bmtub3duIiwgbmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGVzdFByaW50SSgiR0wgJXMgPSAlcyIsIG5hbWUsIHYpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwpCi17Ci0gICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgewotICAgICAgICB0ZXN0UHJpbnRFKCIlcygpIHJldHVybmVkICVkIiwgb3AsIHJldHVyblZhbCk7Ci0gICAgfQotCi0gICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKLSAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksIGVycm9yKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrR2xFcnJvcihjb25zdCBjaGFyKiBvcCkKLXsKLSAgICBmb3IgKEdMaW50IGVycm9yID0gZ2xHZXRFcnJvcigpOyBlcnJvcjsgZXJyb3IKLSAgICAgICAgICAgID0gZ2xHZXRFcnJvcigpKSB7Ci0gICAgICAgIHRlc3RQcmludEUoImFmdGVyICVzKCkgZ2xFcnJvciAoMHgleCkiLCBvcCwgZXJyb3IpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgcHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKQotewotCi0jZGVmaW5lIFgoVkFMKSB7VkFMLCAjVkFMfQotICAgIHN0cnVjdCB7RUdMaW50IGF0dHJpYnV0ZTsgY29uc3QgY2hhciogbmFtZTt9IG5hbWVzW10gPSB7Ci0gICAgWChFR0xfQlVGRkVSX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX1NJWkUpLAotICAgIFgoRUdMX0JMVUVfU0laRSksCi0gICAgWChFR0xfR1JFRU5fU0laRSksCi0gICAgWChFR0xfUkVEX1NJWkUpLAotICAgIFgoRUdMX0RFUFRIX1NJWkUpLAotICAgIFgoRUdMX1NURU5DSUxfU0laRSksCi0gICAgWChFR0xfQ09ORklHX0NBVkVBVCksCi0gICAgWChFR0xfQ09ORklHX0lEKSwKLSAgICBYKEVHTF9MRVZFTCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfSEVJR0hUKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9QSVhFTFMpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX1dJRFRIKSwKLSAgICBYKEVHTF9OQVRJVkVfUkVOREVSQUJMRSksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9JRCksCi0gICAgWChFR0xfTkFUSVZFX1ZJU1VBTF9UWVBFKSwKLSAgICBYKEVHTF9TQU1QTEVTKSwKLSAgICBYKEVHTF9TQU1QTEVfQlVGRkVSUyksCi0gICAgWChFR0xfU1VSRkFDRV9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9UWVBFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9SRURfVkFMVUUpLAotICAgIFgoRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCKSwKLSAgICBYKEVHTF9CSU5EX1RPX1RFWFRVUkVfUkdCQSksCi0gICAgWChFR0xfTUlOX1NXQVBfSU5URVJWQUwpLAotICAgIFgoRUdMX01BWF9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9MVU1JTkFOQ0VfU0laRSksCi0gICAgWChFR0xfQUxQSEFfTUFTS19TSVpFKSwKLSAgICBYKEVHTF9DT0xPUl9CVUZGRVJfVFlQRSksCi0gICAgWChFR0xfUkVOREVSQUJMRV9UWVBFKSwKLSAgICBYKEVHTF9DT05GT1JNQU5UKSwKLSAgIH07Ci0jdW5kZWYgWAotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2YobmFtZXMpIC8gc2l6ZW9mKG5hbWVzWzBdKTsgaisrKSB7Ci0gICAgICAgIEVHTGludCB2YWx1ZSA9IC0xOwotICAgICAgICBFR0xpbnQgcmV0dXJuVmFsID0gZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBuYW1lc1tqXS5hdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgICAgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgaWYgKHJldHVyblZhbCAmJiBlcnJvciA9PSBFR0xfU1VDQ0VTUykgewotICAgICAgICAgICAgdGVzdFByaW50SSgiICVzOiAlZCAoJSN4KSIsIG5hbWVzW2pdLm5hbWUsIHZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdGVzdFByaW50SSgiIik7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvaHdjL2h3Y1Rlc3RMaWIuaCBiL29wZW5nbC90ZXN0cy9od2MvaHdjVGVzdExpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGMzMDEyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9od2MvaHdjVGVzdExpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotLyoKLSAqIEhhcmR3YXJlIENvbXBvc2VyIFRlc3QgTGlicmFyeSBIZWFkZXIKLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx0ZXN0VXRpbC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgotCi0vLyBDaGFyYWN0ZXJpc3RpY3Mgb2Yga25vd24gZ3JhcGhpYyBmb3JtYXRzCi1jb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgewotICAgIHVpbnQzMl90IGZvcm1hdDsKLSAgICBjb25zdCBjaGFyICpkZXNjOwotICAgIHVpbnQzMl90IHdNb2QsIGhNb2Q7IC8vIFdpZHRoL2hlaWdodCBtb2QgdGhpcyB2YWx1ZSBtdXN0IGVxdWFsIHplcm8KLX0gaHdjVGVzdEdyYXBoaWNGb3JtYXRbXSA9IHsKLSAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsICJSR0JBODg4OCIsIDEsIDF9LAotICAgIHtIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCwgIlJHQlg4ODg4IiwgMSwgMX0sCi0gICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCXzg4OCwgICAiUkdCODg4IiwgICAxLCAxfSwKLSAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1LCAgICJSR0I1NjUiLCAgIDEsIDF9LAotICAgIHtIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4OCwgIkJHUkE4ODg4IiwgMSwgMX0sCi0gICAge0hBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxLCAiUkdCQTU1NTEiLCAxLCAxfSwKLSAgICB7SEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzQ0NDQsICJSR0JBNDQ0NCIsIDEsIDF9LAotICAgIHtIQUxfUElYRUxfRk9STUFUX1lWMTIsICAgICAgIllWMTIiLCAgICAgMiwgMn0sCi19OwotCi0vLyBSZXByZXNlbnQgUkdCIGNvbG9yIGFzIGZyYWN0aW9uIG9mIGNvbG9yIGNvbXBvbmVudHMuCi0vLyBFYWNoIG9mIHRoZSBjb2xvciBjb21wb25lbnRzIGFyZSBleHBlY3RlZCBpbiB0aGUgcmFuZ2UgWzAuMCwgMS4wXQotY2xhc3MgQ29sb3JGcmFjdCB7Ci0gIHB1YmxpYzoKLSAgICBDb2xvckZyYWN0KCk6IF9jMSgwLjApLCBfYzIoMC4wKSwgX2MzKDAuMCkge307Ci0gICAgQ29sb3JGcmFjdChmbG9hdCBjMSwgZmxvYXQgYzIsIGZsb2F0IGMzKTogX2MxKGMxKSwgX2MyKGMyKSwgX2MzKGMzKSB7fTsKLSAgICBmbG9hdCBjMSh2b2lkKSBjb25zdCB7IHJldHVybiBfYzE7IH0KLSAgICBmbG9hdCBjMih2b2lkKSBjb25zdCB7IHJldHVybiBfYzI7IH0KLSAgICBmbG9hdCBjMyh2b2lkKSBjb25zdCB7IHJldHVybiBfYzM7IH0KLQotICAgIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmbG9hdCBfYzE7Ci0gICAgZmxvYXQgX2MyOwotICAgIGZsb2F0IF9jMzsKLX07Ci0KLS8vIFJlcHJlc2VudCBSR0IgY29sb3IgYXMgZnJhY3Rpb24gb2YgY29sb3IgY29tcG9uZW50cy4KLS8vIEVhY2ggb2YgdGhlIGNvbG9yIGNvbXBvbmVudHMgYXJlIGV4cGVjdGVkIGluIHRoZSByYW5nZSBbMC4wLCAxLjBdCi1jbGFzcyBDb2xvclJHQiB7Ci0gIHB1YmxpYzoKLSAgICBDb2xvclJHQigpOiBfcigwLjApLCBfZygwLjApLCBfYigwLjApIHt9OwotICAgIENvbG9yUkdCKGZsb2F0IGYpOiBfcihmKSwgX2coZiksIF9iKGYpIHt9OyAvLyBHcmF5Ci0gICAgQ29sb3JSR0IoZmxvYXQgciwgZmxvYXQgZywgZmxvYXQgYik6IF9yKHIpLCBfZyhnKSwgX2IoYikge307Ci0gICAgZmxvYXQgcih2b2lkKSBjb25zdCB7IHJldHVybiBfcjsgfQotICAgIGZsb2F0IGcodm9pZCkgY29uc3QgeyByZXR1cm4gX2c7IH0KLSAgICBmbG9hdCBiKHZvaWQpIGNvbnN0IHsgcmV0dXJuIF9iOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmbG9hdCBfcjsKLSAgICBmbG9hdCBfZzsKLSAgICBmbG9hdCBfYjsKLX07Ci0KLS8vIERpbWVuc2lvbiAtIHdpZHRoIGFuZCBoZWlnaHQgb2YgYSByZWN0YW5ndWxlciBhcmVhCi1jbGFzcyBId2NUZXN0RGltIHsKLSAgcHVibGljOgotICAgIEh3Y1Rlc3REaW0oKTogX3coMCksIF9oKDApIHt9OwotICAgIEh3Y1Rlc3REaW0odWludDMyX3QgdywgdWludDMyX3QgaCkgOiBfdyh3KSwgX2goaCkge30KLSAgICB1aW50MzJfdCB3aWR0aCh2b2lkKSBjb25zdCB7IHJldHVybiBfdzsgfQotICAgIHVpbnQzMl90IGhlaWdodCh2b2lkKSBjb25zdCB7IHJldHVybiBfaDsgfQotICAgIHZvaWQgc2V0V2lkdGgodWludDMyX3QgdykgeyBfdyA9IHc7IH0KLSAgICB2b2lkIHNldEhlaWdodCh1aW50MzJfdCBoKSB7IF9oID0gaDsgfQotCi0gICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKTsKLSAgICBvcGVyYXRvciBod2NfcmVjdCgpIGNvbnN0OwotCi0gIHByaXZhdGU6Ci0gICAgdWludDMyX3QgX3c7Ci0gICAgdWludDMyX3QgX2g7Ci19OwotCi0vLyBGdW5jdGlvbiBQcm90b3R5cGVzCi12b2lkIGh3Y1Rlc3RJbml0RGlzcGxheShib29sIHZlcmJvc2UsIEVHTERpc3BsYXkgKmRweSwgRUdMU3VyZmFjZSAqc3VyZmFjZSwKLSAgICBFR0xpbnQgKndpZHRoLCBFR0xpbnQgKmhlaWdodCk7Ci12b2lkIGh3Y1Rlc3RPcGVuSHdjKGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAqKmh3Y0RldmljZVB0cik7Ci1jb25zdCBzdHJ1Y3QgaHdjVGVzdEdyYXBoaWNGb3JtYXQgKmh3Y1Rlc3RHcmFwaGljRm9ybWF0TG9va3VwKGNvbnN0IGNoYXIgKmRlc2MpOwotY29uc3Qgc3RydWN0IGh3Y1Rlc3RHcmFwaGljRm9ybWF0ICpod2NUZXN0R3JhcGhpY0Zvcm1hdExvb2t1cCh1aW50MzJfdCBpZCk7Ci1jb25zdCBjaGFyICpod2NUZXN0R3JhcGhpY0Zvcm1hdDJzdHIodWludDMyX3QgZm9ybWF0KTsKLXN0ZDo6c3RyaW5nIGh3Y1Rlc3RSZWN0MnN0cihjb25zdCBzdHJ1Y3QgaHdjX3JlY3QmIHJlY3QpOwotCi1od2NfbGF5ZXJfbGlzdF90ICpod2NUZXN0Q3JlYXRlTGF5ZXJMaXN0KHNpemVfdCBudW1MYXllcnMpOwotdm9pZCBod2NUZXN0RnJlZUxheWVyTGlzdChod2NfbGF5ZXJfbGlzdF90ICpsaXN0KTsKLXZvaWQgaHdjVGVzdERpc3BsYXlMaXN0KGh3Y19sYXllcl9saXN0X3QgKmxpc3QpOwotdm9pZCBod2NUZXN0RGlzcGxheUxpc3RQcmVwYXJlTW9kaWZpYWJsZShod2NfbGF5ZXJfbGlzdF90ICpsaXN0KTsKLXZvaWQgaHdjVGVzdERpc3BsYXlMaXN0SGFuZGxlcyhod2NfbGF5ZXJfbGlzdF90ICpsaXN0KTsKLQotdWludDMyX3QgaHdjVGVzdENvbG9yMlBpeGVsKHVpbnQzMl90IGZvcm1hdCwgQ29sb3JGcmFjdCBjb2xvciwgZmxvYXQgYWxwaGEpOwotdm9pZCBod2NUZXN0Q29sb3JDb252ZXJ0KHVpbnQzMl90IGZyb21Gb3JtYXQsIHVpbnQzMl90IHRvRm9ybWF0LAotICAgICAgICAgICAgICAgICAgQ29sb3JGcmFjdCYgY29sb3IpOwotdm9pZCBod2NUZXN0U2V0UGl4ZWwoYW5kcm9pZDo6R3JhcGhpY0J1ZmZlciAqZ0J1ZiwgdW5zaWduZWQgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgeCwgdWludDMyX3QgeSwgdWludDMyX3QgcGl4ZWwpOwotdm9pZCBod2NUZXN0RmlsbENvbG9yKGFuZHJvaWQ6OkdyYXBoaWNCdWZmZXIgKmdCdWYsIENvbG9yRnJhY3QgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEpOwotdm9pZCBod2NUZXN0RmlsbENvbG9ySEJsZW5kKGFuZHJvaWQ6OkdyYXBoaWNCdWZmZXIgKmdCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3JGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JGcmFjdCBzdGFydENvbG9yLCBDb2xvckZyYWN0IGVuZENvbG9yKTsKLUNvbG9yRnJhY3QgaHdjVGVzdFBhcnNlQ29sb3Ioc3RkOjppc3RyaW5nc3RyZWFtJiBpbiwgYm9vbCYgZXJyb3IpOwotc3RydWN0IGh3Y19yZWN0IGh3Y1Rlc3RQYXJzZUh3Y1JlY3Qoc3RkOjppc3RyaW5nc3RyZWFtJiBpbiwgYm9vbCYgZXJyb3IpOwotSHdjVGVzdERpbSBod2NUZXN0UGFyc2VEaW0oc3RkOjppc3RyaW5nc3RyZWFtJiBpbiwgYm9vbCYgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2luY2x1ZGUvRUdMVXRpbHMuaCBiL29wZW5nbC90ZXN0cy9pbmNsdWRlL0VHTFV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNGMyNjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2luY2x1ZGUvRUdMVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfVUlfRUdMVVRJTFNfSAotI2RlZmluZSBBTkRST0lEX1VJX0VHTFVUSUxTX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEVHTFV0aWxzCi17Ci1wdWJsaWM6Ci0KLSAgICBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnN0cmVycm9yKEVHTGludCBlcnIpOwotCi0gICAgc3RhdGljIGlubGluZSBzdGF0dXNfdCBzZWxlY3RDb25maWdGb3JQaXhlbEZvcm1hdCgKLSAgICAgICAgICAgIEVHTERpc3BsYXkgZHB5LAotICAgICAgICAgICAgRUdMaW50IGNvbnN0KiBhdHRycywKLSAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LAotICAgICAgICAgICAgRUdMQ29uZmlnKiBvdXRDb25maWcpOwotCi0gICAgc3RhdGljIGlubGluZSBzdGF0dXNfdCBzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgICAgICBFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgICAgIEVHTGludCBjb25zdCogYXR0cnMsCi0gICAgICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywKLSAgICAgICAgICAgIEVHTENvbmZpZyogb3V0Q29uZmlnKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgY2hhciAqRUdMVXRpbHM6OnN0cmVycm9yKEVHTGludCBlcnIpCi17Ci0gICAgc3dpdGNoIChlcnIpewotICAgICAgICBjYXNlIEVHTF9TVUNDRVNTOiAgICAgICAgICAgcmV0dXJuICJFR0xfU1VDQ0VTUyI7Ci0gICAgICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogICByZXR1cm4gIkVHTF9OT1RfSU5JVElBTElaRUQiOwotICAgICAgICBjYXNlIEVHTF9CQURfQUNDRVNTOiAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FDQ0VTUyI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9BTExPQzogICAgICAgICByZXR1cm4gIkVHTF9CQURfQUxMT0MiOwotICAgICAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiAgICAgcmV0dXJuICJFR0xfQkFEX0FUVFJJQlVURSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9DT05GSUc6ICAgICAgICByZXR1cm4gIkVHTF9CQURfQ09ORklHIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NPTlRFWFQ6ICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05URVhUIjsKLSAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogcmV0dXJuICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9ESVNQTEFZOiAgICAgICByZXR1cm4gIkVHTF9CQURfRElTUExBWSI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9NQVRDSDogICAgICAgICByZXR1cm4gIkVHTF9CQURfTUFUQ0giOwotICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogcmV0dXJuICJFR0xfQkFEX05BVElWRV9QSVhNQVAiOwotICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1dJTkRPVzogcmV0dXJuICJFR0xfQkFEX05BVElWRV9XSU5ET1ciOwotICAgICAgICBjYXNlIEVHTF9CQURfUEFSQU1FVEVSOiAgICAgcmV0dXJuICJFR0xfQkFEX1BBUkFNRVRFUiI7Ci0gICAgICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiAgICAgICByZXR1cm4gIkVHTF9CQURfU1VSRkFDRSI7Ci0gICAgICAgIGNhc2UgRUdMX0NPTlRFWFRfTE9TVDogICAgICByZXR1cm4gIkVHTF9DT05URVhUX0xPU1QiOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gIlVOS05PV04iOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0ZvclBpeGVsRm9ybWF0KAotICAgICAgICBFR0xEaXNwbGF5IGRweSwKLSAgICAgICAgRUdMaW50IGNvbnN0KiBhdHRycywKLSAgICAgICAgaW50MzJfdCBmb3JtYXQsCi0gICAgICAgIEVHTENvbmZpZyogb3V0Q29uZmlnKQotewotICAgIEVHTGludCBudW1Db25maWdzID0gLTEsIG49MDsKLQotICAgIGlmICghYXR0cnMpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpZiAob3V0Q29uZmlnID09IE5VTEwpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICAvLyBHZXQgYWxsIHRoZSAicG90ZW50aWFsIG1hdGNoIiBjb25maWdzLi4uCi0gICAgaWYgKGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlncykgPT0gRUdMX0ZBTFNFKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgRUdMQ29uZmlnKiBjb25zdCBjb25maWdzID0gKEVHTENvbmZpZyopbWFsbG9jKHNpemVvZihFR0xDb25maWcpKm51bUNvbmZpZ3MpOwotICAgIGlmIChlZ2xDaG9vc2VDb25maWcoZHB5LCBhdHRycywgY29uZmlncywgbnVtQ29uZmlncywgJm4pID09IEVHTF9GQUxTRSkgewotICAgICAgICBmcmVlKGNvbmZpZ3MpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGludCBpOwotICAgIEVHTENvbmZpZyBjb25maWcgPSBOVUxMOwotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgIEVHTGludCBuYXRpdmVWaXN1YWxJZCA9IDA7Ci0gICAgICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZ3NbaV0sIEVHTF9OQVRJVkVfVklTVUFMX0lELCAmbmF0aXZlVmlzdWFsSWQpOwotICAgICAgICBpZiAobmF0aXZlVmlzdWFsSWQ+MCAmJiBmb3JtYXQgPT0gbmF0aXZlVmlzdWFsSWQpIHsKLSAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZyZWUoY29uZmlncyk7Ci0KLSAgICBpZiAoaTxuKSB7Ci0gICAgICAgICpvdXRDb25maWcgPSBjb25maWc7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci19Ci0KLXN0YXR1c190IEVHTFV0aWxzOjpzZWxlY3RDb25maWdGb3JOYXRpdmVXaW5kb3coCi0gICAgICAgIEVHTERpc3BsYXkgZHB5LAotICAgICAgICBFR0xpbnQgY29uc3QqIGF0dHJzLAotICAgICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdywKLSAgICAgICAgRUdMQ29uZmlnKiBvdXRDb25maWcpCi17Ci0gICAgaW50IGVycjsKLSAgICBpbnQgZm9ybWF0OwotCi0gICAgaWYgKCF3aW5kb3cpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpZiAoKGVyciA9IHdpbmRvdy0+cXVlcnkod2luZG93LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpIDwgMCkgewotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIHJldHVybiBzZWxlY3RDb25maWdGb3JQaXhlbEZvcm1hdChkcHksIGF0dHJzLCBmb3JtYXQsIG91dENvbmZpZyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNlbmRpZiAvKiBBTkRST0lEX1VJX0VHTFVUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9pbmNsdWRlL2dsVGVzdExpYi5oIGIvb3BlbmdsL3Rlc3RzL2luY2x1ZGUvZ2xUZXN0TGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MWM1OTQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2luY2x1ZGUvZ2xUZXN0TGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qCi0gKiBHcmFwaGljcyBUZXN0IExpYnJhcnkgSGVhZGVyCi0gKi8KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Ci0jaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+Ci0KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi12b2lkIGdsVGVzdFByaW50R0xTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgR0xlbnVtIHMpOwotdm9pZCBnbFRlc3RDaGVja0VnbEVycm9yKGNvbnN0IGNoYXIqIG9wLCBFR0xCb29sZWFuIHJldHVyblZhbCA9IEVHTF9UUlVFKTsKLXZvaWQgZ2xUZXN0Q2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKTsKLXZvaWQgZ2xUZXN0UHJpbnRFR0xDb25maWd1cmF0aW9uKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9saWIvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9saWIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1MmEzNy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvbGliL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfTU9EVUxFOj0gbGliZ2xUZXN0Ci1MT0NBTF9TUkNfRklMRVM6PSBnbFRlc3RMaWIuY3BwCi1MT0NBTF9DX0lOQ0xVREVTICs9IHN5c3RlbS9leHRyYXMvdGVzdHMvaW5jbHVkZSBcCi0gICAgYmlvbmljIFwKLSAgICBiaW9uaWMvbGlic3RkYysrL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3N0bHBvcnQvc3RscG9ydCBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfQ0ZMQUdTIDo9IC1ER0xfR0xFWFRfUFJPVE9UWVBFUyAtREVHTF9FR0xFWFRfUFJPVE9UWVBFUwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmN1dGlscyBsaWJ1dGlscyBsaWJzdGxwb3J0Ci0KLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2xpYi9nbFRlc3RMaWIuY3BwIGIvb3BlbmdsL3Rlc3RzL2xpYi9nbFRlc3RMaWIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDM0ZmM3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9saWIvZ2xUZXN0TGliLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLS8qCi0gKiBHcmFwaGljcyBUZXN0IExpYnJhcnkKLSAqLwotCi0jaW5jbHVkZSA8Z2xUZXN0TGliLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgotI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgotCi0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHRlc3RVdGlsLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotdm9pZCBnbFRlc3RQcmludEdMU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEdMZW51bSBzKQotewotICAgIGNvbnN0IGNoYXIgKnYgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhzKTsKLQotICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgdGVzdFByaW50SSgiR0wgJXMgdW5rbm93biIsIG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHRlc3RQcmludEkoIkdMICVzID0gJXMiLCBuYW1lLCB2KTsKLSAgICB9Ci19Ci0KLXZvaWQgZ2xUZXN0Q2hlY2tFZ2xFcnJvcihjb25zdCBjaGFyKiBvcCwgRUdMQm9vbGVhbiByZXR1cm5WYWwpCi17Ci0gICAgaWYgKHJldHVyblZhbCAhPSBFR0xfVFJVRSkgewotICAgICAgICB0ZXN0UHJpbnRFKCIlcygpIHJldHVybmVkICVkIiwgb3AsIHJldHVyblZhbCk7Ci0gICAgfQotCi0gICAgZm9yIChFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOyBlcnJvciAhPSBFR0xfU1VDQ0VTUzsgZXJyb3IKLSAgICAgICAgICAgID0gZWdsR2V0RXJyb3IoKSkgewotICAgICAgICB0ZXN0UHJpbnRFKCJhZnRlciAlcygpIGVnbEVycm9yICVzICgweCV4KSIsCi0gICAgICAgICAgICAgICAgICAgb3AsIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvciksIGVycm9yKTsKLSAgICB9Ci19Ci0KLXZvaWQgZ2xUZXN0Q2hlY2tHbEVycm9yKGNvbnN0IGNoYXIqIG9wKQotewotICAgIGZvciAoR0xpbnQgZXJyb3IgPSBnbEdldEVycm9yKCk7IGVycm9yOyBlcnJvcgotICAgICAgICAgICAgPSBnbEdldEVycm9yKCkpIHsKLSAgICAgICAgdGVzdFByaW50RSgiYWZ0ZXIgJXMoKSBnbEVycm9yICgweCV4KSIsIG9wLCBlcnJvcik7Ci0gICAgfQotfQotCi12b2lkIGdsVGVzdFByaW50RUdMQ29uZmlndXJhdGlvbihFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZykKLXsKLQotI2RlZmluZSBYKFZBTCkge1ZBTCwgI1ZBTH0KLSAgICBzdHJ1Y3Qge0VHTGludCBhdHRyaWJ1dGU7IGNvbnN0IGNoYXIqIG5hbWU7fSBuYW1lc1tdID0gewotICAgIFgoRUdMX0JVRkZFUl9TSVpFKSwKLSAgICBYKEVHTF9BTFBIQV9TSVpFKSwKLSAgICBYKEVHTF9CTFVFX1NJWkUpLAotICAgIFgoRUdMX0dSRUVOX1NJWkUpLAotICAgIFgoRUdMX1JFRF9TSVpFKSwKLSAgICBYKEVHTF9ERVBUSF9TSVpFKSwKLSAgICBYKEVHTF9TVEVOQ0lMX1NJWkUpLAotICAgIFgoRUdMX0NPTkZJR19DQVZFQVQpLAotICAgIFgoRUdMX0NPTkZJR19JRCksCi0gICAgWChFR0xfTEVWRUwpLAotICAgIFgoRUdMX01BWF9QQlVGRkVSX0hFSUdIVCksCi0gICAgWChFR0xfTUFYX1BCVUZGRVJfUElYRUxTKSwKLSAgICBYKEVHTF9NQVhfUEJVRkZFUl9XSURUSCksCi0gICAgWChFR0xfTkFUSVZFX1JFTkRFUkFCTEUpLAotICAgIFgoRUdMX05BVElWRV9WSVNVQUxfSUQpLAotICAgIFgoRUdMX05BVElWRV9WSVNVQUxfVFlQRSksCi0gICAgWChFR0xfU0FNUExFUyksCi0gICAgWChFR0xfU0FNUExFX0JVRkZFUlMpLAotICAgIFgoRUdMX1NVUkZBQ0VfVFlQRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfVFlQRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFKSwKLSAgICBYKEVHTF9UUkFOU1BBUkVOVF9HUkVFTl9WQUxVRSksCi0gICAgWChFR0xfVFJBTlNQQVJFTlRfQkxVRV9WQUxVRSksCi0gICAgWChFR0xfQklORF9UT19URVhUVVJFX1JHQiksCi0gICAgWChFR0xfQklORF9UT19URVhUVVJFX1JHQkEpLAotICAgIFgoRUdMX01JTl9TV0FQX0lOVEVSVkFMKSwKLSAgICBYKEVHTF9NQVhfU1dBUF9JTlRFUlZBTCksCi0gICAgWChFR0xfTFVNSU5BTkNFX1NJWkUpLAotICAgIFgoRUdMX0FMUEhBX01BU0tfU0laRSksCi0gICAgWChFR0xfQ09MT1JfQlVGRkVSX1RZUEUpLAotICAgIFgoRUdMX1JFTkRFUkFCTEVfVFlQRSksCi0gICAgWChFR0xfQ09ORk9STUFOVCksCi0gICB9OwotI3VuZGVmIFgKLQotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKG5hbWVzKSAvIHNpemVvZihuYW1lc1swXSk7IGorKykgewotICAgICAgICBFR0xpbnQgdmFsdWUgPSAtMTsKLSAgICAgICAgRUdMaW50IHJldHVyblZhbCA9IGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgbmFtZXNbal0uYXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gICAgICAgIEVHTGludCBlcnJvciA9IGVnbEdldEVycm9yKCk7Ci0gICAgICAgIGlmIChyZXR1cm5WYWwgJiYgZXJyb3IgPT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIHRlc3RQcmludEkoIiAlczogJWQgKCUjeCkiLCBuYW1lc1tqXS5uYW1lLCB2YWx1ZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHRlc3RQcmludEkoIiIpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2xpZ2h0aW5nMTcwOS9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2xpZ2h0aW5nMTcwOS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYzZTYxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9saWdodGluZzE3MDkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gTGlnaHRpbmdUZXN0Ci1MT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9saWdodGluZzE3MDkvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL29wZW5nbC90ZXN0cy9saWdodGluZzE3MDkvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyM2Q0Mi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvbGlnaHRpbmcxNzA5L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5saWdodGluZ3Rlc3QiPgotCi0gICAgPGFwcGxpY2F0aW9uPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDbGVhckFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJMaWdodGluZ1Rlc3QiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvbGlnaHRpbmcxNzA5L3NyYy9jb20vYW5kcm9pZC9saWdodGluZ3Rlc3QvQ2xlYXJBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL2xpZ2h0aW5nMTcwOS9zcmMvY29tL2FuZHJvaWQvbGlnaHRpbmd0ZXN0L0NsZWFyQWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlOGM1Yy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvbGlnaHRpbmcxNzA5L3NyYy9jb20vYW5kcm9pZC9saWdodGluZ3Rlc3QvQ2xlYXJBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmxpZ2h0aW5ndGVzdDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhckFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgewotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbUdMVmlldyA9IG5ldyBDbGVhckdMU3VyZmFjZVZpZXcodGhpcyk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG1HTFZpZXcpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbUdMVmlldy5vblBhdXNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIG1HTFZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBHTFN1cmZhY2VWaWV3IG1HTFZpZXc7Ci19Ci0KLWNsYXNzIENsZWFyR0xTdXJmYWNlVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHB1YmxpYyBDbGVhckdMU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBtUmVuZGVyZXIgPSBuZXcgQ2xlYXJSZW5kZXJlcigpOwotICAgICAgICBzZXRSZW5kZXJlcihtUmVuZGVyZXIpOwotICAgIH0KLQotICAgIENsZWFyUmVuZGVyZXIgbVJlbmRlcmVyOwotfQotCi1jbGFzcyBDbGVhclJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7Ci0gICAgcHVibGljIENsZWFyUmVuZGVyZXIoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChHTDEwIGdsLCBFR0xDb25maWcgY29uZmlnKSB7Ci0gICAgICAgIC8vIERvIG5vdGhpbmcgc3BlY2lhbC4KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3LCBpbnQgaCkgewotICAgICAgICAvLyBDb21wdXRlIHRoZSBwcm9qZWN0aW9uIG1hdHJpeAotICAgICAgICBnbC5nbE1hdHJpeE1vZGUoR0wxMC5HTF9QUk9KRUNUSU9OKTsKLSAgICAgICAgZ2wuZ2xMb2FkSWRlbnRpdHkoKTsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBmcnVzdHVtCi0gICAgICAgIGZsb2F0IGZsID0gKGZsb2F0KSAoLSh3IC8gMikpIC8gMjg4OwotICAgICAgICBmbG9hdCBmciA9IChmbG9hdCkgKHcgLyAyKSAvIDI4ODsKLSAgICAgICAgZmxvYXQgZnQgPSAoZmxvYXQpIChoIC8gMikgLyAyODg7Ci0gICAgICAgIGZsb2F0IGZiID0gKGZsb2F0KSAoLShoIC8gMikpIC8gMjg4OwotCi0gICAgICAgIC8vIFNldCB0aGUgdmlldyBmcnVzdHVtCi0gICAgICAgIGdsLmdsRnJ1c3R1bWYoZmwsIGZyLCBmYiwgZnQsIDEuMGYsIDIwMDAuMGYpOwotCi0gICAgICAgIC8vIFNldCB0aGUgdmlld3BvcnQgZGltZW5zaW9ucwotICAgICAgICBnbC5nbE1hdHJpeE1vZGUoR0wxMC5HTF9NT0RFTFZJRVcpOwotICAgICAgICBnbC5nbExvYWRJZGVudGl0eSgpOwotICAgICAgICBnbC5nbFZpZXdwb3J0KDAsIDAsIHcsIGgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKLSAgICAgICAgZ2wuZ2xDbGVhcihHTDEwLkdMX0NPTE9SX0JVRkZFUl9CSVQgfCBHTDEwLkdMX0RFUFRIX0JVRkZFUl9CSVQpOwotCi0gICAgICAgIGZpbmFsIGZsb2F0IGxpZ2h0T2ZmW10gICAgICAgID0gezAuMGYsIDAuMGYsICAwLjBmLCAxLjBmfTsKLSAgICAgICAgZmluYWwgZmxvYXQgbGlnaHRBbWJpZW50W10gICAgPSB7NS4wZiwgMC4wZiwgIDAuMGYsIDEuMGZ9OwotICAgICAgICBmaW5hbCBmbG9hdCBsaWdodERpZmZ1c2VbXSAgICA9IHswLjBmLCAyLjBmLCAgMC4wZiwgMC4wZn07Ci0gICAgICAgIGZpbmFsIGZsb2F0IGxpZ2h0UG9zU3BvdFtdICAgID0gezAuMGYsIDAuMGYsIC04LjBmLCAxLjBmfTsKLQotICAgICAgICBmaW5hbCBmbG9hdCBwb3NbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgLTUuMGYsIC0xLjVmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgMC4wZiwgLTEuNWYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICA1LjBmLCAtMS41ZiwgMC4wZiwKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAKLSAgICAgICAgZmluYWwgZmxvYXQgdltdID0gbmV3IGZsb2F0WzldOwotICAgICAgICBCeXRlQnVmZmVyIHZiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3Qodi5sZW5ndGgqNCk7Ci0gICAgICAgIHZiYi5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7Ci0gICAgICAgIEZsb2F0QnVmZmVyIHZiID0gdmJiLmFzRmxvYXRCdWZmZXIoKTsKLQotICAgICAgICBnbC5nbERpc2FibGUoR0wxMC5HTF9ESVRIRVIpOwotCi0gICAgICAgIGdsLmdsTGlnaHRmdihHTDEwLkdMX0xJR0hUMCwgR0wxMC5HTF9BTUJJRU5ULCBsaWdodEFtYmllbnQsIDApOwotICAgICAgICBnbC5nbExpZ2h0ZnYoR0wxMC5HTF9MSUdIVDAsIEdMMTAuR0xfRElGRlVTRSwgbGlnaHREaWZmdXNlLCAwKTsKLSAgICAgICAgZ2wuZ2xMaWdodGZ2KEdMMTAuR0xfTElHSFQwLCBHTDEwLkdMX1NQRUNVTEFSLCBsaWdodE9mZiwgMCk7Ci0gICAgICAgIGdsLmdsTGlnaHRmdihHTDEwLkdMX0xJR0hUMCwgR0wxMC5HTF9QT1NJVElPTiwgbGlnaHRQb3NTcG90LCAwKTsKLSAgICAgICAgZ2wuZ2xFbmFibGUoR0wxMC5HTF9MSUdIVDApOwotICAgICAgICAKLSAgICAgICAgZ2wuZ2xFbmFibGUoR0wxMC5HTF9MSUdIVElORyk7Ci0KLQotICAgICAgICBnbC5nbEVuYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgICAgZ2wuZ2xOb3JtYWwzZigwLCAwLCAxKTsKLSAgICAgICAgCi0KLSAgICAgICAgLy8gZHJhdyBmaXJzdCAzIHRyaWFuZ2xlcywgd2l0aG91dCB1c2luZyB0cmFuc2Zvcm1zCi0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgewotICAgICAgICAgICAgdlswXSA9IC0xOyB2WzFdID0tMTsgdlsyXSA9IC0xMDsKLSAgICAgICAgICAgIHZbM10gPSAgMDsgdls0XSA9IDE7IHZbNV0gPSAtMTA7Ci0gICAgICAgICAgICB2WzZdID0gIDE7IHZbN10gPS0xOyB2WzhdID0gLTEwOwotICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdltqKjMrMF0gLT0gcG9zW2kqMyswXTsKLSAgICAgICAgICAgICAgICB2W2oqMysxXSAtPSBwb3NbaSozKzFdOwotICAgICAgICAgICAgICAgIHZbaiozKzJdIC09IHBvc1tpKjMrMl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2Yi5wdXQodikucG9zaXRpb24oMCk7Ci0gICAgICAgICAgICBnbC5nbFZlcnRleFBvaW50ZXIoMywgR0wxMC5HTF9GTE9BVCwgMCwgdmIpOwotICAgICAgICAgICAgZ2wuZ2xEcmF3QXJyYXlzKEdMMTAuR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDMpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBkcmF3IHRoZSAybmQgYmF0Y2ggdGhpcyB0aW1lIHdpdGggdHJhbnNmb3JtcwotICAgICAgICB2WzBdID0gLTE7IHZbMV0gPS0xOyB2WzJdID0gLTEwOwotICAgICAgICB2WzNdID0gIDA7IHZbNF0gPSAxOyB2WzVdID0gLTEwOwotICAgICAgICB2WzZdID0gIDE7IHZbN10gPS0xOyB2WzhdID0gLTEwOwotICAgICAgICB2Yi5wdXQodikucG9zaXRpb24oMCk7Ci0gICAgICAgIGdsLmdsVmVydGV4UG9pbnRlcigzLCBHTDEwLkdMX0ZMT0FULCAwLCB2Yik7Ci0KLSAgICAgICAgLy8gZHJhdyBsb3dlciBsZWZ0IHRyaWFuZ2xlCi0gICAgICAgIGdsLmdsUHVzaE1hdHJpeCgpOwotICAgICAgICBnbC5nbFRyYW5zbGF0ZWYocG9zWzBdLCBwb3NbMV0sIHBvc1syXSk7Ci0gICAgICAgIGdsLmdsRHJhd0FycmF5cyhHTDEwLkdMX1RSSUFOR0xFX1NUUklQLCAwLCAzKTsKLSAgICAgICAgZ2wuZ2xQb3BNYXRyaXgoKTsKLQotICAgICAgICAvLyBkcmF3IGxvd2VyIG1pZGRsZSB0cmlhbmdsZQotICAgICAgICBnbC5nbFB1c2hNYXRyaXgoKTsKLSAgICAgICAgZ2wuZ2xUcmFuc2xhdGVmKHBvc1szXSwgcG9zWzRdLCBwb3NbNV0pOwotICAgICAgICBnbC5nbERyYXdBcnJheXMoR0wxMC5HTF9UUklBTkdMRV9TVFJJUCwgMCwgMyk7Ci0gICAgICAgIGdsLmdsUG9wTWF0cml4KCk7Ci0KLSAgICAgICAgLy8gZHJhdyBsb3dlciByaWdodCB0cmlhbmdsZQotICAgICAgICBnbC5nbFB1c2hNYXRyaXgoKTsKLSAgICAgICAgZ2wuZ2xUcmFuc2xhdGVmKHBvc1s2XSwgcG9zWzddLCBwb3NbOF0pOwotICAgICAgICBnbC5nbERyYXdBcnJheXMoR0wxMC5HTF9UUklBTkdMRV9TVFJJUCwgMCwgMyk7Ci0gICAgICAgIGdsLmdsUG9wTWF0cml4KCk7ICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIGludFtdIGdldENvbmZpZ1NwZWMoKSB7Ci0gICAgICAgIGludFtdIGNvbmZpZ1NwZWMgPSB7IEVHTDEwLkVHTF9ERVBUSF9TSVpFLCAxNiwgRUdMMTAuRUdMX05PTkUgfTsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1NwZWM7ICAgICAgCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvbGluZXRleC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2xpbmV0ZXgvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI2Mzg0ZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvbGluZXRleC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCWxpbmV0ZXguY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjFfQ00gXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtbGluZXRleAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9saW5ldGV4L2xpbmV0ZXguY3BwIGIvb3BlbmdsL3Rlc3RzL2xpbmV0ZXgvbGluZXRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Njk0OTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL2xpbmV0ZXgvbGluZXRleC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0jZGVmaW5lIExPR19UQUcgImZpbGxyYXRlIgotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RvcFdhdGNoLmg+Ci0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIEVHTGludCBjb25maWdBdHRyaWJzW10gPSB7Ci0gICAgICAgICBFR0xfREVQVEhfU0laRSwgMCwKLSAgICAgICAgIEVHTF9OT05FCi0gICAgIH07Ci0gICAgIAotICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOwotICAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICAgRUdMaW50IHcsIGg7Ci0gICAgIEVHTERpc3BsYXkgZHB5OwotCi0gICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOwotICAgICAKLSAgICAgZHB5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKTsKLSAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgICAgICAgIAotICAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KAotICAgICAgICAgICAgIGRweSwgY29uZmlnQXR0cmlicywgd2luZG93LCAmY29uZmlnKTsKLSAgICAgaWYgKGVycikgewotICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZG4ndCBmaW5kIGFuIEVHTENvbmZpZyBtYXRjaGluZyB0aGUgc2NyZWVuIGZvcm1hdFxuIik7Ci0gICAgICAgICByZXR1cm4gMDsKLSAgICAgfQotCi0gICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLCB3aW5kb3csIE5VTEwpOwotICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7Ci0gICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCi0gICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOwotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0gICAgIAotICAgICBwcmludGYoInc9JWQsIGg9JWRcbiIsIHcsIGgpOwotICAgICAKLSAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX1JFUEVBVCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfVCwgR0xfUkVQRUFUKTsKLSAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgICBnbENvbG9yNGYoMSwxLDEsMSk7Ci0KLQotICAgICAvLyBkZWZhdWx0IHBhY2stYWxpZ25tZW50IGlzIDQKLSAgICAgY29uc3QgdWludDE2X3QgdDE2WzY0XSA9IHsgMHhGRkZGLCAwLCAweEY4MDAsIDAsIDB4MDdFMCwgMCwgMHgwMDFGLCAwIH07Ci0KLSAgICAgY29uc3QgR0xmbG9hdCB2ZXJ0aWNlc1s0XVsyXSA9IHsKLSAgICAgICAgICAgICB7IHcvMiwgIDAgfSwKLSAgICAgICAgICAgICB7IHcvMiwgIGggfQotICAgICB9OwotCi0gICAgIGNvbnN0IEdMZmxvYXQgdGV4Q29vcmRzWzRdWzJdID0gewotICAgICAgICAgICAgIHsgMCwgIDAgfSwKLSAgICAgICAgICAgICB7IDEsICAxIH0KLSAgICAgfTsKLQotICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCAxLCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOwotCi0gICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgIGdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKTsKLSAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgZ2xPcnRob2YoMCwgdywgMCwgaCwgMCwgMSk7Ci0KLSAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsKLSAgICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIHRleENvb3Jkcyk7Ci0KLSAgICAgZ2xDbGVhckNvbG9yKDAsMCwwLDApOwotICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICBnbERyYXdBcnJheXMoR0xfTElORVMsIDAsIDIpOwotICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotCi0gICAgIHVzbGVlcCg1KjEwMDAwMDApOwotCi0gICAgIGVnbFRlcm1pbmF0ZShkcHkpOwotICAgICAKLSAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvc3dhcGludGVydmFsL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvc3dhcGludGVydmFsL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTdmNjAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3N3YXBpbnRlcnZhbC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXN3YXBpbnRlcnZhbC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0gICAgbGliRUdMIFwKLSAgICBsaWJHTEVTdjFfQ00gXAotICAgIGxpYnVpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIG9wZW5nbC10ZXN0cy1pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtc3dhcGludGVydmFsCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3N3YXBpbnRlcnZhbC9zd2FwaW50ZXJ2YWwuY3BwIGIvb3BlbmdsL3Rlc3RzL3N3YXBpbnRlcnZhbC9zd2FwaW50ZXJ2YWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY0YmM0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy9zd2FwaW50ZXJ2YWwvc3dhcGludGVydmFsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKgotICoqCi0gKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqKgotICoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotICoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSAqKgotICoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotICoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotI2luY2x1ZGUgIkVHTFV0aWxzLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCi17Ci0gICAgRUdMaW50IGNvbmZpZ0F0dHJpYnNbXSA9IHsKLSAgICAgICAgICAgIEVHTF9TVVJGQUNFX1RZUEUsICAgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgICAgICBFR0xfTk9ORQotICAgIH07Ci0KLSAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOwotICAgIEVHTGludCBtaW5vclZlcnNpb247Ci0gICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgIEVHTENvbmZpZyBjb25maWc7Ci0gICAgRUdMaW50IG51bUNvbmZpZ3M9MDsKLSAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgRUdMaW50IHcsIGg7Ci0gICAgRUdMRGlzcGxheSBkcHk7Ci0KLSAgICAKLSAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLQotICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOwotICAgIGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7Ci0gICAgcHJpbnRmKCIjIGNvbmZpZ3MgPSAlZFxuIiwgbnVtQ29uZmlncyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KAotICAgICAgICAgICAgZHB5LCBjb25maWdBdHRyaWJzLCB3aW5kb3csICZjb25maWcpOwotICAgIGlmIChlcnIpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXMiLCBFR0xVdGlsczo6c3RyZXJyb3IoZWdsR2V0RXJyb3IoKSkpOwotICAgICAgICBlZ2xUZXJtaW5hdGUoZHB5KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRUdMaW50IHIsZyxiLGEsIHZpZDsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9SRURfU0laRSwgICAmcik7Ci0gICAgZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfR1JFRU5fU0laRSwgJmcpOwotICAgIGVnbEdldENvbmZpZ0F0dHJpYihkcHksIGNvbmZpZywgRUdMX0JMVUVfU0laRSwgICZiKTsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWcsIEVHTF9BTFBIQV9TSVpFLCAmYSk7Ci0gICAgZWdsR2V0Q29uZmlnQXR0cmliKGRweSwgY29uZmlnLCBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgJnZpZCk7Ci0KLSAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICBpZiAoc3VyZmFjZSA9PSBFR0xfTk9fU1VSRkFDRSkgewotICAgICAgICBFR0xpbnQgZXJyID0gZWdsR2V0RXJyb3IoKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogJXMsIGNvbmZpZz0lcCwgZm9ybWF0ID0gJWQtJWQtJWQtJWQsIHZpc3VhbC1pZCA9ICVkXG4iLAotICAgICAgICAgICAgICAgIEVHTFV0aWxzOjpzdHJlcnJvcihlcnIpLCBjb25maWcsIHIsZyxiLGEsIHZpZCk7Ci0gICAgICAgIGVnbFRlcm1pbmF0ZShkcHkpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoImNvbmZpZz0lcCwgZm9ybWF0ID0gJWQtJWQtJWQtJWQsIHZpc3VhbC1pZCA9ICVkXG4iLAotICAgICAgICAgICAgICAgIGNvbmZpZywgcixnLGIsYSwgdmlkKTsKLSAgICB9Ci0KLSAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7Ci0gICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7Ci0KLSAgICBwcmludGYoInc9JWQsIGg9JWRcbiIsIHcsIGgpOwotCi0gICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgZ2xFbmFibGUoR0xfQkxFTkQpOwotCi0gICAgZ2xWaWV3cG9ydCgwLCAwLCB3LCBoKTsKLSAgICBnbE9ydGhvZigwLCB3LCAwLCBoLCAwLCAxKTsKLQotICAgIGVnbFN3YXBJbnRlcnZhbChkcHksIDEpOwotCi0gICAgZ2xDbGVhckNvbG9yKDEsMCwwLDApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLQotCi0gICAgaW50IHRpbWUgPSAxMDsKLSAgICBwcmludGYoInNjcmVlbiBzaG91bGQgZmxhc2ggcmVkL2dyZWVuIHF1aWNrbHkgZm9yICVkIHMuLi5cbiIsIHRpbWUpOwotCi0gICAgaW50IGMgPSAwOwotICAgIG5zZWNzX3Qgc3RhcnQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgbnNlY3NfdCB0OwotICAgIGRvIHsKLSAgICAgICAgZ2xDbGVhckNvbG9yKDEsMCwwLDApOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOwotICAgICAgICBnbENsZWFyQ29sb3IoMCwxLDAsMCk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgICAgIHQgPSBzeXN0ZW1UaW1lKCkgLSBzdGFydDsKLSAgICAgICAgYyArPSAyOwotICAgIH0gd2hpbGUgKGludChuczJzKHQpKTw9dGltZSk7Ci0KLSAgICBkb3VibGUgcCA9ICAoZG91YmxlKHQpIC8gYykgLyAxMDAwMDAwMDAwLjA7Ci0gICAgcHJpbnRmKCJyZWZyZXNoLXJhdGUgaXMgJWYgZnBzICglZiBtcylcbiIsIDEuMGYvcCwgcCoxMDAwLjApOwotCi0gICAgZWdsVGVybWluYXRlKGRweSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDBhYmYzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRlc3QgZnJhbWVyYXRlIGFuZCBsb29rIGZvciBoaWNjdXBzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLXN1YmRpci1qYXZhLWZpbGVzKQotCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gVGVzdEZyYW1lcmF0ZQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTYxN2Y0Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RmcmFtZXJhdGUiPgotICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjgiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iOCIgLz4KLQotICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy90ZXN0RnJhbWVyYXRlX2FjdGl2aXR5Ij4KLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iVGVzdEZyYW1lcmF0ZUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhZGYwZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJ0ZXN0RnJhbWVyYXRlX2FjdGl2aXR5Ij5UZXN0RnJhbWVyYXRlPC9zdHJpbmc+Ci0KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlQWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmUyNzliLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0RnJhbWVyYXRlL3NyYy9jb20vYW5kcm9pZC90ZXN0ZnJhbWVyYXRlL1Rlc3RGcmFtZXJhdGVBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudGVzdGZyYW1lcmF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RGcmFtZXJhdGVBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIFRlc3RGcmFtZXJhdGVWaWV3IG1WaWV3OwotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLSAgICAgICAgbVZpZXcgPSBuZXcgVGVzdEZyYW1lcmF0ZVZpZXcoZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICAgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlVmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RGcmFtZXJhdGUvc3JjL2NvbS9hbmRyb2lkL3Rlc3RmcmFtZXJhdGUvVGVzdEZyYW1lcmF0ZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmYjVkZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdEZyYW1lcmF0ZS9zcmMvY29tL2FuZHJvaWQvdGVzdGZyYW1lcmF0ZS9UZXN0RnJhbWVyYXRlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudGVzdGZyYW1lcmF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1Qcm9wZXJ0aWVzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci1pbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMQ29udGV4dDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMRGlzcGxheTsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotCi1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xFUzIwOwotCi1jbGFzcyBUZXN0RnJhbWVyYXRlVmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBUQUcgPSAiVGVzdEZyYW1lcmF0ZVZpZXciOwotCi0gICAgcHVibGljIFRlc3RGcmFtZXJhdGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgc2V0RUdMQ29udGV4dENsaWVudFZlcnNpb24oMik7Ci0gICAgICAgIHNldFJlbmRlcmVyKG5ldyBSZW5kZXJlcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lX3VzID0gMDsKLSAgICBwcml2YXRlIGxvbmcgbU51bVNob3J0RnJhbWVzRWxhcHNlZCA9IDA7Ci0gICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyVGltZShsb25nIG5vd191cykgewotICAgICAgICBsb25nIGxvbmdGcmFtZVRpbWVfbXMgPSBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbVByb3BlcnRpZXMuZ2V0KCJkZWJ1Zy5sb25nZnJhbWVfbXMiLCAiMTYiKSk7Ci0gICAgICAgIGxvbmcgZWxhcHNlZFRpbWVfdXMgPSBub3dfdXMgLSBtTGFzdFRpbWVfdXM7Ci0gICAgICAgIGZsb2F0IGZwcyA9IDEwMDAwMDAuZiAvIGVsYXBzZWRUaW1lX3VzOwotICAgICAgICBpZiAobUxhc3RUaW1lX3VzID4gMCAmJiBlbGFwc2VkVGltZV91cyA+IGxvbmdGcmFtZVRpbWVfbXMqMTAwMCkgewotICAgICAgICAgIExvZy52KFRBRywgIkxvbmcgZnJhbWU6ICIgKyBlbGFwc2VkVGltZV91cy8xMDAwLmYgKyAiIG1zICgiICsgZnBzICsgIiBmcHMpIik7Ci0gICAgICAgICAgaWYgKG1OdW1TaG9ydEZyYW1lc0VsYXBzZWQgPiAwKSB7Ci0gICAgICAgICAgICBMb2cudihUQUcsICIgIFNob3J0IGZyYW1lcyBzaW5jZSBsYXN0IGxvbmcgZnJhbWU6ICIgKyBtTnVtU2hvcnRGcmFtZXNFbGFwc2VkKTsKLSAgICAgICAgICAgIG1OdW1TaG9ydEZyYW1lc0VsYXBzZWQgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICsrbU51bVNob3J0RnJhbWVzRWxhcHNlZDsKLSAgICAgICAgfQotCi0gICAgICAgIG1MYXN0VGltZV91cyA9IG5vd191czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJlbmRlcmVyIGltcGxlbWVudHMgR0xTdXJmYWNlVmlldy5SZW5kZXJlciB7Ci0gICAgICAgIHB1YmxpYyBSZW5kZXJlcigpIHsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIHZvaWQgb25EcmF3RnJhbWUoR0wxMCBnbCkgewotICAgICAgICAgICAgbG9uZyBub3dfdXMgPSBTeXN0ZW0ubmFub1RpbWUoKSAvIDEwMDA7Ci0gICAgICAgICAgICByZWdpc3RlclRpbWUobm93X3VzKTsKLQotICAgICAgICAgICAgZmxvYXQgcmVkID0gKG5vd191cyAlIDEwMDAwMDApIC8gMTAwMDAwMC5mOwotICAgICAgICAgICAgZmxvYXQgZ3JlZW4gPSAobm93X3VzICUgMjAwMDAwMCkgLyAyMDAwMDAwLmY7Ci0gICAgICAgICAgICBmbG9hdCBibHVlID0gKG5vd191cyAlIDMwMDAwMDApIC8gMzAwMDAwMC5mOwotICAgICAgICAgICAgR0xFUzIwLmdsQ2xlYXJDb2xvcihyZWQsIGdyZWVuLCBibHVlLCAxLjBmKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyKEdMRVMyMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQxN2M3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUZXN0IGVuZC10by1lbmQgbGF0ZW5jeS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotVE9QX0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIEJ1aWxkIGFjdGl2aXR5Ci0KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU0RLX1ZFUlNJT04gOj0gOAotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0TGF0ZW5jeQotCi1pbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZjI2NDMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLnRlc3RsYXRlbmN5Ij4KLSAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+Ci0KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvdGVzdExhdGVuY3lfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0TGF0ZW5jeUFjdGl2aXR5IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLk5vVGl0bGVCYXIuRnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhdW5jaE1vZGU9InNpbmdsZVRhc2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiNzdjLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJ0ZXN0TGF0ZW5jeV9hY3Rpdml0eSI+VGVzdExhdGVuY3k8L3N0cmluZz4KLQotPC9yZXNvdXJjZXM+Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0TGF0ZW5jeS9zcmMvY29tL2FuZHJvaWQvdGVzdGxhdGVuY3kvVGVzdExhdGVuY3lBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeUFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTkzY2IuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0bGF0ZW5jeTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RMYXRlbmN5QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0KLSAgICBUZXN0TGF0ZW5jeVZpZXcgbVZpZXc7Ci0KLSAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBtVmlldyA9IG5ldyBUZXN0TGF0ZW5jeVZpZXcoZ2V0QXBwbGljYXRpb24oKSk7Ci0gICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICAgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5Vmlldy5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RMYXRlbmN5L3NyYy9jb20vYW5kcm9pZC90ZXN0bGF0ZW5jeS9UZXN0TGF0ZW5jeVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyYmYxNy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdExhdGVuY3kvc3JjL2NvbS9hbmRyb2lkL3Rlc3RsYXRlbmN5L1Rlc3RMYXRlbmN5Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3RsYXRlbmN5OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEubmlvLkZsb2F0QnVmZmVyOwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbnRleHQ7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTERpc3BsYXk7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLQotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMRVMyMDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBUZXN0TGF0ZW5jeVZpZXcgZXh0ZW5kcyBHTFN1cmZhY2VWaWV3IHsKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RMYXRlbmN5aWV3IjsKLSAgICBwcml2YXRlIGZsb2F0IG1YOwotICAgIHByaXZhdGUgZmxvYXQgbVk7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRFg7Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRFk7Ci0gICAgcHJpdmF0ZSBsb25nICBtVDsKLSAgICBwcml2YXRlIGxvbmcgIG1EVDsKLQotICAgIHB1YmxpYyBUZXN0TGF0ZW5jeVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICBzZXRFR0xDb250ZXh0Q2xpZW50VmVyc2lvbigyKTsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgewotICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldEFjdGlvbigpKSB7Ci0gICAgICAgIGNhc2UgTW90aW9uRXZlbnQuQUNUSU9OX01PVkU6Ci0gICAgICAgICAgICBmbG9hdCB4ID0gZXZlbnQuZ2V0WCgpOwotICAgICAgICAgICAgZmxvYXQgeSA9IGV2ZW50LmdldFkoKTsKLSAgICAgICAgICAgIGxvbmcgIHQgPSBldmVudC5nZXRFdmVudFRpbWUoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7Ci0gICAgICAgICAgICAgICAgbURUID0gdCAtIG1UOwotICAgICAgICAgICAgICAgIG1UID0gdDsKLSAgICAgICAgICAgICAgICBtRFggPSB4IC0gbVg7Ci0gICAgICAgICAgICAgICAgbVggPSB4OwotICAgICAgICAgICAgICAgIG1EWSA9IHkgLSBtWTsKLSAgICAgICAgICAgICAgICBtWSA9IHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2NhbGVYLCBtU2NhbGVZLCBtT2Zmc2V0WCwgbU9mZnNldFk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgTVNfUEVSX0ZSQU1FID0gMTAwMCAvIDYwOwotICAgICAgICBwdWJsaWMgUmVuZGVyZXIoKSB7Ci0gICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlcyA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QobVRyaWFuZ2xlVmVydGljZXNEYXRhLmxlbmd0aCAqIDQpCi0gICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKS5hc0Zsb2F0QnVmZmVyKCk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKLSAgICAgICAgICAgIEdMRVMyMC5nbENsZWFyQ29sb3IoMC40ZiwgMC40ZiwgMC40ZiwgMS4wZik7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xDbGVhciggR0xFUzIwLkdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTEVTMjAuR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xVc2VQcm9ncmFtKG1Qcm9ncmFtKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xVc2VQcm9ncmFtIik7Ci0KLSAgICAgICAgICAgIGZsb2F0IHgsIHksIGR4LCBkeTsKLSAgICAgICAgICAgIGxvbmcgdCwgZHQ7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQoVGVzdExhdGVuY3lWaWV3LnRoaXMpIHsKLSAgICAgICAgICAgICAgICB4ID0gbVg7Ci0gICAgICAgICAgICAgICAgeSA9IG1ZOwotICAgICAgICAgICAgICAgIGR4ID0gbURYOwotICAgICAgICAgICAgICAgIGR5ID0gbURZOwotICAgICAgICAgICAgICAgIGR0ID0gbURUOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZHQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHggPSBkeCAqIE1TX1BFUl9GUkFNRSAvIGR0OwotICAgICAgICAgICAgICAgIGR5ID0gZHkgKiBNU19QRVJfRlJBTUUgLyBkdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgR0xFUzIwLmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkobXZQb3NpdGlvbkhhbmRsZSk7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkiKTsKLSAgICAgICAgICAgIEdMRVMyMC5nbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG12Q29sb3JIYW5kbGUpOwotICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5Iik7Ci0gICAgICAgICAgICBmb3IoaW50IHN0ZXAgPSAwOyBzdGVwIDwgODsgc3RlcCsrKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3ggPSAoeCArIGR4ICogc3RlcCkgKiBtU2NhbGVYICsgbU9mZnNldFg7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3kgPSAoeSArIGR5ICogc3RlcCkgKiBtU2NhbGVZICsgbU9mZnNldFk7Ci0gICAgICAgICAgICAgICAgaW50IGNiYXNlID0gc3RlcCAqIDQ7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1UcmlhbmdsZVZlcnRpY2VzRGF0YS5sZW5ndGg7IGkgKz0gNikgewotICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2ldID0gc3ggKyBtVHJpYW5nbGVWZXJ0aWNlc0RhdGFbaV07Ci0gICAgICAgICAgICAgICAgICAgIG1UcmlhbmdsZVZlcnRpY2VzRGF0YTJbaSsxXSA9IC1zeSArIG1UcmlhbmdsZVZlcnRpY2VzRGF0YVtpKzFdOwotICAgICAgICAgICAgICAgICAgICBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEyW2krMl0gPSBtQ29sb3JzW2NiYXNlXTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzNdID0gbUNvbG9yc1tjYmFzZSsxXTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzRdID0gbUNvbG9yc1tjYmFzZSsyXTsKLSAgICAgICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXNEYXRhMltpKzVdID0gbUNvbG9yc1tjYmFzZSszXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucG9zaXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucHV0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YTIpLnBvc2l0aW9uKDApOwotCi0gICAgICAgICAgICAgICAgR0xFUzIwLmdsVmVydGV4QXR0cmliUG9pbnRlcihtdlBvc2l0aW9uSGFuZGxlLCAyLCBHTEVTMjAuR0xfRkxPQVQsIGZhbHNlLCA2KjQsIG1UcmlhbmdsZVZlcnRpY2VzKTsKLSAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsVmVydGV4QXR0cmliUG9pbnRlciBtdlBvc2l0aW9uIik7Ci0gICAgICAgICAgICAgICAgbVRyaWFuZ2xlVmVydGljZXMucHV0KG1UcmlhbmdsZVZlcnRpY2VzRGF0YTIpLnBvc2l0aW9uKDIpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbFZlcnRleEF0dHJpYlBvaW50ZXIobXZDb2xvckhhbmRsZSwgNCwgR0xFUzIwLkdMX0ZMT0FULCBmYWxzZSwgNio0LCBtVHJpYW5nbGVWZXJ0aWNlcyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbFZlcnRleEF0dHJpYlBvaW50ZXIgbXZDb2xvciIpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbERyYXdBcnJheXMoR0xFUzIwLkdMX1RSSUFOR0xFUywgMCwgMyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbERyYXdBcnJheXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoR0wxMCBnbCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICBHTEVTMjAuZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIG1TY2FsZVggPSAyLjBmIC8gd2lkdGg7Ci0gICAgICAgICAgICBtU2NhbGVZID0gMi4wZiAvIGhlaWdodDsKLSAgICAgICAgICAgIG1PZmZzZXRYID0gLTFmOwotICAgICAgICAgICAgbU9mZnNldFkgPSAtMWY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgICAgIG1Qcm9ncmFtID0gY3JlYXRlUHJvZ3JhbShtVmVydGV4U2hhZGVyLCBtRnJhZ21lbnRTaGFkZXIpOwotICAgICAgICAgICAgaWYgKG1Qcm9ncmFtID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtdlBvc2l0aW9uSGFuZGxlID0gR0xFUzIwLmdsR2V0QXR0cmliTG9jYXRpb24obVByb2dyYW0sICJhUG9zaXRpb24iKTsKLSAgICAgICAgICAgIGNoZWNrR2xFcnJvcigiZ2xHZXRBdHRyaWJMb2NhdGlvbiIpOwotICAgICAgICAgICAgaWYgKG12UG9zaXRpb25IYW5kbGUgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGdldCBhdHRyaWIgbG9jYXRpb24gZm9yIHZQb3NpdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbXZDb2xvckhhbmRsZSA9IEdMRVMyMC5nbEdldEF0dHJpYkxvY2F0aW9uKG1Qcm9ncmFtLCAiYUNvbG9yIik7Ci0gICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsR2V0QXR0cmliTG9jYXRpb24iKTsKLSAgICAgICAgICAgIGlmIChtdkNvbG9ySGFuZGxlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgYXR0cmliIGxvY2F0aW9uIGZvciB2Q29sb3IiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGxvYWRTaGFkZXIoaW50IHNoYWRlclR5cGUsIFN0cmluZyBzb3VyY2UpIHsKLSAgICAgICAgICAgIGludCBzaGFkZXIgPSBHTEVTMjAuZ2xDcmVhdGVTaGFkZXIoc2hhZGVyVHlwZSk7Ci0gICAgICAgICAgICBpZiAoc2hhZGVyICE9IDApIHsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xTaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbENvbXBpbGVTaGFkZXIoc2hhZGVyKTsKLSAgICAgICAgICAgICAgICBpbnRbXSBjb21waWxlZCA9IG5ldyBpbnRbMV07Ci0gICAgICAgICAgICAgICAgR0xFUzIwLmdsR2V0U2hhZGVyaXYoc2hhZGVyLCBHTEVTMjAuR0xfQ09NUElMRV9TVEFUVVMsIGNvbXBpbGVkLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGlsZWRbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3QgY29tcGlsZSBzaGFkZXIgIiArIHNoYWRlclR5cGUgKyAiOiIpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFNoYWRlckluZm9Mb2coc2hhZGVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIEdMRVMyMC5nbERlbGV0ZVNoYWRlcihzaGFkZXIpOwotICAgICAgICAgICAgICAgICAgICBzaGFkZXIgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaGFkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBjcmVhdGVQcm9ncmFtKFN0cmluZyB2ZXJ0ZXhTb3VyY2UsIFN0cmluZyBmcmFnbWVudFNvdXJjZSkgewotICAgICAgICAgICAgaW50IHZlcnRleFNoYWRlciA9IGxvYWRTaGFkZXIoR0xFUzIwLkdMX1ZFUlRFWF9TSEFERVIsIHZlcnRleFNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAodmVydGV4U2hhZGVyID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHBpeGVsU2hhZGVyID0gbG9hZFNoYWRlcihHTEVTMjAuR0xfRlJBR01FTlRfU0hBREVSLCBmcmFnbWVudFNvdXJjZSk7Ci0gICAgICAgICAgICBpZiAocGl4ZWxTaGFkZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgcHJvZ3JhbSA9IEdMRVMyMC5nbENyZWF0ZVByb2dyYW0oKTsKLSAgICAgICAgICAgIGlmIChwcm9ncmFtICE9IDApIHsKLSAgICAgICAgICAgICAgICBHTEVTMjAuZ2xBdHRhY2hTaGFkZXIocHJvZ3JhbSwgdmVydGV4U2hhZGVyKTsKLSAgICAgICAgICAgICAgICBjaGVja0dsRXJyb3IoImdsQXR0YWNoU2hhZGVyIHZlcnRleFNoYWRlciIpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEF0dGFjaFNoYWRlcihwcm9ncmFtLCBwaXhlbFNoYWRlcik7Ci0gICAgICAgICAgICAgICAgY2hlY2tHbEVycm9yKCJnbEF0dGFjaFNoYWRlciBwaXhlbFNoYWRlciIpOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbExpbmtQcm9ncmFtKHByb2dyYW0pOwotICAgICAgICAgICAgICAgIGludFtdIGxpbmtTdGF0dXMgPSBuZXcgaW50WzFdOwotICAgICAgICAgICAgICAgIEdMRVMyMC5nbEdldFByb2dyYW1pdihwcm9ncmFtLCBHTEVTMjAuR0xfTElOS19TVEFUVVMsIGxpbmtTdGF0dXMsIDApOwotICAgICAgICAgICAgICAgIGlmIChsaW5rU3RhdHVzWzBdICE9IEdMRVMyMC5HTF9UUlVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBsaW5rIHByb2dyYW06ICIpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIEdMRVMyMC5nbEdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgR0xFUzIwLmdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb2dyYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tHbEVycm9yKFN0cmluZyBvcCkgewotICAgICAgICAgICAgaW50IGVycm9yOwotICAgICAgICAgICAgd2hpbGUgKChlcnJvciA9IEdMRVMyMC5nbEdldEVycm9yKCkpICE9IEdMRVMyMC5HTF9OT19FUlJPUikgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgb3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24ob3AgKyAiOiBnbEVycm9yICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBYLCBZLCBSIEcgQiBBCi0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXRbXSBtVHJpYW5nbGVWZXJ0aWNlc0RhdGEgPSB7Ci0gICAgICAgICAgICAgICAgLTAuMDI1ZiwgMC4zZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwKLSAgICAgICAgICAgICAgICAgMC4wZiAgLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgICAwLjAyNWYsIDAuM2YsIDEuMGYsIDEuMGYsIDI1NS4wZiwgMS4wZgotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgLy8gQ29sb3IgY2FzY2FkZToKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBmbG9hdFtdIG1Db2xvcnMgPSB7Ci0gICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiwKLSAgICAgICAgICAgICAgICAwLjVmLCAwLjBmLCAwLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgIDAuMGYsIDAuNWYsIDAuMGYsIDEuMGYsCi0gICAgICAgICAgICAgICAgMC41ZiwgMC41ZiwgMC4wZiwgMS4wZiwKLQotICAgICAgICAgICAgICAgIDAuMGYsIDAuMGYsIDAuNWYsIDEuMGYsCi0gICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwKLSAgICAgICAgICAgICAgICAxLjBmLCAxLjBmLCAxLjBmLCAxLjBmLAotICAgICAgICAgICAgICAgIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIGZsb2F0W10gbVRyaWFuZ2xlVmVydGljZXNEYXRhMiA9IG5ldyBmbG9hdFttVHJpYW5nbGVWZXJ0aWNlc0RhdGEubGVuZ3RoXTsKLSAgICAgICAgcHJpdmF0ZSBGbG9hdEJ1ZmZlciBtVHJpYW5nbGVWZXJ0aWNlczsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVmVydGV4U2hhZGVyID0gImF0dHJpYnV0ZSB2ZWM0IGFQb3NpdGlvbjtcbiIKLSAgICAgICAgICAgICsgImF0dHJpYnV0ZSB2ZWM0IGFDb2xvcjtcbiIKLSAgICAgICAgICAgICsgInZhcnlpbmcgdmVjNCB2Q29sb3I7XG4iCi0gICAgICAgICAgICArICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgICAgICAgICArICIgIGdsX1Bvc2l0aW9uID0gYVBvc2l0aW9uO1xuIgotICAgICAgICAgICAgKyAiICB2Q29sb3IgPSBhQ29sb3I7XG4iCi0gICAgICAgICAgICArICJ9XG4iOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1GcmFnbWVudFNoYWRlciA9ICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiIKLSAgICAgICAgICAgICsgInZhcnlpbmcgdmVjNCB2Q29sb3I7XG4iCi0gICAgICAgICAgICArICJ2b2lkIG1haW4oKSB7XG4iCi0gICAgICAgICAgICArICIgIGdsX0ZyYWdDb2xvciA9IHZDb2xvcjtcbiIKLSAgICAgICAgICAgICsgIn1cbiI7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByb2dyYW07Ci0gICAgICAgIHByaXZhdGUgaW50IG12UG9zaXRpb25IYW5kbGU7Ci0gICAgICAgIHByaXZhdGUgaW50IG12Q29sb3JIYW5kbGU7Ci0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4YmRjMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE9wZW5HTCBFUyBKTkkgc2FtcGxlCi0jIFRoaXMgbWFrZWZpbGUgYnVpbGRzIGJvdGggYW4gYWN0aXZpdHkgYW5kIGEgc2hhcmVkIGxpYnJhcnkuCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UT1BfTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQnVpbGQgYWN0aXZpdHkKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBUZXN0RUdMCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc5YmMzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQudGVzdCI+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+Ci0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6bGF1bmNoTW9kZT0ic2luZ2xlVGFzayIKLSAgICAgICAgICAgIAlhbmRyb2lkOnNjcmVlbk9yaWVudGF0aW9uPSJsYW5kc2NhcGUiCi0gICAgICAgICAgICAJYW5kcm9pZDpjb25maWdDaGFuZ2VzPSJvcmllbnRhdGlvbnxrZXlib2FyZEhpZGRlbiI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL1JFQURNRSBiL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2RiNzRhLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotUmVwcm8gc3RlcHM6Ci0KLWJ1aWxkLCBpbnN0YWxsIGFuZCBydW4gdGhlIGF0dGFjaGVkIHRlc3QgcHJvZ3JhbSBUZXN0RWdsLmFwawotCi1UaGUgcHJvZ3JhbSBkb2VzIG5vdCBkcmF3IGFueXRoaW5nIHRvIHRoZSBzY3JlZW4sIGl0IGp1c3QgcHJpbnRzIHRvIHRoZSBsb2csIHNvIHVzZSBhZGIgbG9nY2F0IHRvIHdhdGNoIHRoZSBvdXRwdXQuCi0KLUV4cGVjdGVkIGJlaGF2aW9yOgotCi1jb25zdGFudGx5IGluY3JlYXNpbmcgInN0ZXAiIGNvdW50OgotCi0KLVcvVGVzdEFjdGl2aXR5KCAxODg1KTogKioqKioqIHN0ZXAgMjM1IHJlc3VtZQotVy9UZXN0QWN0aXZpdHkoIDE4ODUpOiBzdGVwIDIzNiBwYXVzZQotVy9UZXN0QWN0aXZpdHkoIDE4ODUpOiAqKioqKiogc3RlcCAyMzYgcmVzdW1lCi0KLWFuZCBzbyBvbi4KLQotQWN0dWFsIGJlaGF2aW9yOgotCi1XL1Rlc3RBY3Rpdml0eSggMTQ2Nik6ICoqKioqKiBzdGVwIDI1IHJlc3VtZQotVy9UZXN0QWN0aXZpdHkoIDE0NjYpOiBzdGVwIDI2IHBhdXNlCi1XL1Rlc3RBY3Rpdml0eSggMTQ2Nik6ICoqKioqKiBzdGVwIDI2IHJlc3VtZQotVy9kYWx2aWt2bSggMTQ2Nik6IHRocmVhZGlkPTg6IHRocmVhZCBleGl0aW5nIHdpdGggdW5jYXVnaHQgZXhjZXB0aW9uIChncm91cD0weDQwMDFkN2YwKQotRS9BbmRyb2lkUnVudGltZSggMTQ2Nik6IEZBVEFMIEVYQ0VQVElPTjogR0xUaHJlYWQgOQotRS9BbmRyb2lkUnVudGltZSggMTQ2Nik6IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBjcmVhdGVDb250ZXh0IGZhaWxlZDogRUdMX0JBRF9BTExPQwotRS9BbmRyb2lkUnVudGltZSggMTQ2Nik6ICAgICAgICBhdCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3JEVnbEhlbHBlci50aHJvd0VnbEV4Y2VwdGlvbihHTFN1cmZhY2VWaWV3LmphdmE6MTA2NykKLUUvQW5kcm9pZFJ1bnRpbWUoIDE0NjYpOiAgICAgICAgYXQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRFZ2xIZWxwZXIudGhyb3dFZ2xFeGNlcHRpb24oR0xTdXJmYWNlVmlldy5qYXZhOjEwNTkpCi1FL0FuZHJvaWRSdW50aW1lKCAxNDY2KTogICAgICAgIGF0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckRWdsSGVscGVyLnN0YXJ0KEdMU3VyZmFjZVZpZXcuamF2YTo5MjUpCi1FL0FuZHJvaWRSdW50aW1lKCAxNDY2KTogICAgICAgIGF0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXckR0xUaHJlYWQuZ3VhcmRlZFJ1bihHTFN1cmZhY2VWaWV3LmphdmE6MTIzNikKLUUvQW5kcm9pZFJ1bnRpbWUoIDE0NjYpOiAgICAgICAgYXQgYW5kcm9pZC5vcGVuZ2wuR0xTdXJmYWNlVmlldyRHTFRocmVhZC5ydW4oR0xTdXJmYWNlVmlldy5qYXZhOjExMDYpCi1XL1Rlc3RBY3Rpdml0eSggMTQ2Nik6IHN0ZXAgMjcgcGF1c2UKLVcvVGVzdEFjdGl2aXR5KCAxNDY2KTogKioqKioqIHN0ZXAgMjcgcmVzdW1lCi1XL1Rlc3RBY3Rpdml0eSggMTQ2Nik6IHN0ZXAgMjggcGF1c2UKLVcvVGVzdEFjdGl2aXR5KCAxNDY2KTogKioqKioqIHN0ZXAgMjggcmVzdW1lCi0KLQotU2VlIGh0dHA6Ly9iL2lzc3VlP2lkPTI1NTA3NDUgZm9yIGZ1cnRoZXIgZGV0YWlscy4KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRjOThmZTIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IEVnbDwvc3RyaW5nPgotCi08L3Jlc291cmNlcz4KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RQYXVzZVJlc3VtZS9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzcxMzIxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdEFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotcHVibGljIGNsYXNzIFRlc3RBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHID0gIlRlc3RBY3Rpdml0eSI7Ci0gICAgVGVzdFZpZXcgbVZpZXc7Ci0gICAgYm9vbGVhbiBtVG9nZ2xlOwotICAgIGludCBtQ291bnQ7Ci0gICAgZmluYWwgc3RhdGljIGludCBQQVVTRV9ERUxBWSA9IDEwMDsKLSAgICBSdW5uYWJsZSBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgaWYgKG1Ub2dnbGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIioqKioqKiBzdGVwICIgKyBtQ291bnQgKyAiIHJlc3VtZSIpOwotICAgICAgICAgICAgbUNvdW50Kys7Ci0gICAgICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAic3RlcCAiICsgbUNvdW50ICsgIiBwYXVzZSIpOwotICAgICAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1Ub2dnbGUgPSAhIG1Ub2dnbGU7Ci0gICAgICAgIG1WaWV3LnBvc3REZWxheWVkKG1SdW5uYWJsZSwgUEFVU0VfREVMQVkpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKLSAgICAgICAgbVZpZXcgPSBuZXcgVGVzdFZpZXcoZ2V0QXBwbGljYXRpb24oKSk7Ci0JICAgIG1WaWV3LnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotCSAgICBzZXRDb250ZW50VmlldyhtVmlldyk7Ci0gICAgICAgIG1WaWV3LnBvc3REZWxheWVkKG1SdW5uYWJsZSwgUEFVU0VfREVMQVkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUGF1c2UoKSB7Ci0gICAgICAgIHN1cGVyLm9uUGF1c2UoKTsKLSAgICAgICAgbVZpZXcub25QYXVzZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgewotICAgICAgICBzdXBlci5vblJlc3VtZSgpOwotICAgICAgICBtVmlldy5vblJlc3VtZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YSBiL29wZW5nbC90ZXN0cy90ZXN0UGF1c2VSZXN1bWUvc3JjL2NvbS9hbmRyb2lkL3Rlc3QvVGVzdFZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyOGYxMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFBhdXNlUmVzdW1lL3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC50ZXN0OwotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQub3BlbmdsLkdMU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci0KLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5lZ2wuRUdMMTA7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTENvbmZpZzsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBUZXN0VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW5kZXJlciI7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKLSAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKEdMMTAgZ2wsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNyZWF0ZWQoR0wxMCBnbCwgRUdMQ29uZmlnIGNvbmZpZykgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTgwZTdkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXN0Vmlld3BvcnQvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgT3BlbkdMIEVTIEpOSSBzYW1wbGUKLSMgVGhpcyBtYWtlZmlsZSBidWlsZHMgYm90aCBhbiBhY3Rpdml0eSBhbmQgYSBzaGFyZWQgbGlicmFyeS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRPUF9MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBCdWlsZCBhY3Rpdml0eQotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1zdWJkaXItamF2YS1maWxlcykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFRlc3RWaWV3cG9ydAotCi0jIFNldCBhIHNwZWNpZmljIFNESyB2ZXJzaW9uIHNvIHdlIGNhbiBydW4gb24gRnJveW8uCi0KLUxPQ0FMX1NES19WRVJTSU9OIDo9IDgKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L0FuZHJvaWRNYW5pZmVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTc4YmIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC50ZXN0Ij4KLSAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIC8+Ci0gICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5JTlRFUk5FVCIgLz4KLSAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+Ci0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Rlc3RfYWN0aXZpdHkiPgotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJUZXN0QWN0aXZpdHkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuTm9UaXRsZUJhci5GdWxsc2NyZWVuIgotICAgICAgICAgICAgCWFuZHJvaWQ6Y29uZmlnQ2hhbmdlcz0ib3JpZW50YXRpb258a2V5Ym9hcmRIaWRkZW4iPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotICAgIDwvYXBwbGljYXRpb24+Ci08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9SRUFETUUgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2YWJjOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLVJlcHJvIHN0ZXBzOgotCi1idWlsZCwgaW5zdGFsbCBhbmQgcnVuIHRoZSBhdHRhY2hlZCB0ZXN0IHByb2dyYW0gVGVzdFZpZXdwb3J0LmFwawotCi1SdW4gb24gU2FwcGhpcmUgd2l0aCBGcm95by4KLQotVGhlIHByb2dyYW0gY2xlYXJzIHRoZSBzY3JlZW4gdG8gYmx1ZSwgdGhlbiBkcmF3cyBhIGZ1bGwgc2NyZWVuIHdoaXRlIHF1YWQgdGhhdAotaXMgYWxsaWduZWQgdG8gdGhlIHNjcmVlbi4KLShUaGVyZWZvcmUgdGhlIHdob2xlIHNjcmVlbiBzaG91bGQgYXBwZWFyIHRvIGJlIHdoaXRlLikKLQotCi1Ob3RlIHRoYXQgc2NyZWVuIGlzIGFsbCB3aGl0ZS4KLQotUm90YXRlIHNjcmVlbiA5MCBkZWdyZWVzLgotCi1FeHBlY3RlZDogc2NyZWVuIGlzIHN0aWxsIGFsbCB3aGl0ZS4KLQotQWN0dWFsOiBzY3JlZW4gaXMgYmx1ZSB3aXRoIG9mZnNldCB3aGl0ZSByZWN0YW5nbGUuCi0KLVRoaXMgYnVnIG9ubHkgaGFwcGVucyBvbiBTYXBwaGlyZSwgaXQgd29ya3MgY29ycmVjdGx5IG9uIFBhc3Npb24uCi0KLVdoYXQgaGFwcGVuczoKLQotSSB0aGluayB0aGUgYnVnIGlzIHRoYXQgdGhlIGdsLmdsVmlld3BvcnQoKSBjYWxsIGluIG9uU3VyZmFjZUNoYW5nZWQoKSBpcwotYmVpbmcgaWdub3JlZCBieSB0aGUgT3BlbkdMIGRyaXZlci4KLQotTk9URTogSWYgYSBnbC5nbFZpZXdwb3J0IGNhbGwgaXMgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgb25EcmF3RnJhbWUoKQotY2FsbCAod2hpY2ggbWVhbnMgaXQgaXMgY2FsbGVkIGJlZm9yZSBldmVyeSBkcmF3KSwgdGhlIHByb2dyYW0gcnVucyBjb3JyZWN0bHkuCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzdhN2MuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGZpbGUgY29udGFpbnMgcmVzb3VyY2UgZGVmaW5pdGlvbnMgZm9yIGRpc3BsYXllZCBzdHJpbmdzLCBhbGxvd2luZwotICAgICB0aGVtIHRvIGJlIGNoYW5nZWQgYmFzZWQgb24gdGhlIGxvY2FsZSBhbmQgb3B0aW9ucy4gLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBTaW1wbGUgc3RyaW5ncy4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJ0ZXN0X2FjdGl2aXR5Ij5UZXN0IFZpZXdwb3J0PC9zdHJpbmc+Ci0KLTwvcmVzb3VyY2VzPgotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhIGIvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0QWN0aXZpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3ZTQ1MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RBY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQudGVzdDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBRyA9ICJUZXN0QWN0aXZpdHkiOwotICAgIFRlc3RWaWV3IG1WaWV3OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwotICAgICAgICBtVmlldyA9IG5ldyBUZXN0VmlldyhnZXRBcHBsaWNhdGlvbigpKTsKLQkgICAgbVZpZXcuc2V0Rm9jdXNhYmxlSW5Ub3VjaE1vZGUodHJ1ZSk7Ci0JICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBzdXBlci5vblBhdXNlKCk7Ci0gICAgICAgIG1WaWV3Lm9uUGF1c2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKLSAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKLSAgICAgICAgbVZpZXcub25SZXN1bWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEgYi9vcGVuZ2wvdGVzdHMvdGVzdFZpZXdwb3J0L3NyYy9jb20vYW5kcm9pZC90ZXN0L1Rlc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzY2MzN2QuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3Rlc3RWaWV3cG9ydC9zcmMvY29tL2FuZHJvaWQvdGVzdC9UZXN0Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnRlc3Q7Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uRmxvYXRCdWZmZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm9wZW5nbC5HTFN1cmZhY2VWaWV3OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotCi1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3MuZWdsLkVHTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLmVnbC5FR0xDb25maWc7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0w7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMDsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExOwotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBTdXJmYWNlVmlldyB0aGF0IHVzZXMgdGhlIGRlZGljYXRlZCBzdXJmYWNlIGZvcgotICogZGlzcGxheWluZyBhbiBPcGVuR0wgYW5pbWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhlIGFuaW1hdGlvbiB0byBydW4gaW4gYQotICogc2VwYXJhdGUgdGhyZWFkLCB3aXRob3V0IHJlcXVpcmluZyB0aGF0IGl0IGJlIGRyaXZlbiBieSB0aGUgdXBkYXRlIG1lY2hhbmlzbQotICogb2YgdGhlIHZpZXcgaGllcmFyY2h5LgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZW5kZXJpbmcgY29kZSBpcyBkZWxlZ2F0ZWQgdG8gYSBHTFZpZXcuUmVuZGVyZXIKLSAqIGluc3RhbmNlLgotICovCi1jbGFzcyBUZXN0VmlldyBleHRlbmRzIEdMU3VyZmFjZVZpZXcgewotICAgIFRlc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgaW5pdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIGluaXQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAgICAgc2V0UmVuZGVyZXIobmV3IFJlbmRlcmVyKCkpOwotICAgICAgICBzZXRSZW5kZXJNb2RlKFJFTkRFUk1PREVfV0hFTl9ESVJUWSk7Ci0gICAgfQotICAgIAotICAgICAgICAvKiogQSBncmlkIGlzIGEgdG9wb2xvZ2ljYWxseSByZWN0YW5ndWxhciBhcnJheSBvZiB2ZXJ0aWNlcy4KLSAgICAqCi0gICAgKiBUaGUgdmVydGV4IGFuZCBpbmRleCBkYXRhIGFyZSBoZWxkIGluIFZCTyBvYmplY3RzIGJlY2F1c2Ugb24gbW9zdAotICAgICogR1BVcyBWQk8gb2JqZWN0cyBhcmUgdGhlIGZhc3Rlc3Qgd2F5IG9mIHJlbmRlcmluZyBzdGF0aWMgdmVydGV4Ci0gICAgKiBhbmQgaW5kZXggZGF0YS4KLSAgICAqCi0gICAgKi8KLQotICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JpZCB7Ci0gICAgICAgLy8gU2l6ZSBvZiB2ZXJ0ZXggZGF0YSBlbGVtZW50cyBpbiBieXRlczoKLSAgICAgICBmaW5hbCBzdGF0aWMgaW50IEZMT0FUX1NJWkUgPSA0OwotICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgQ0hBUl9TSVpFID0gMjsKLQotICAgICAgIC8vIFZlcnRleCBzdHJ1Y3R1cmU6Ci0gICAgICAgLy8gZmxvYXQgeCwgeSwgejsKLQotICAgICAgIGZpbmFsIHN0YXRpYyBpbnQgVkVSVEVYX1NJWkUgPSAzICogRkxPQVRfU0laRTsKLQotICAgICAgIHByaXZhdGUgaW50IG1WZXJ0ZXhCdWZmZXJPYmplY3RJZDsKLSAgICAgICBwcml2YXRlIGludCBtRWxlbWVudEJ1ZmZlck9iamVjdElkOwotCi0gICAgICAgLy8gVGhlc2UgYnVmZmVycyBhcmUgdXNlZCB0byBob2xkIHRoZSB2ZXJ0ZXggYW5kIGluZGV4IGRhdGEgd2hpbGUKLSAgICAgICAvLyBjb25zdHJ1Y3RpbmcgdGhlIGdyaWQuIE9uY2UgY3JlYXRlQnVmZmVyT2JqZWN0cygpIGlzIGNhbGxlZAotICAgICAgIC8vIHRoZSBidWZmZXJzIGFyZSBudWxsZWQgb3V0IHRvIHNhdmUgbWVtb3J5LgotCi0gICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1WZXJ0ZXhCeXRlQnVmZmVyOwotICAgICAgIHByaXZhdGUgRmxvYXRCdWZmZXIgbVZlcnRleEJ1ZmZlcjsKLSAgICAgICBwcml2YXRlIENoYXJCdWZmZXIgbUluZGV4QnVmZmVyOwotCi0gICAgICAgcHJpdmF0ZSBpbnQgbVc7Ci0gICAgICAgcHJpdmF0ZSBpbnQgbUg7Ci0gICAgICAgcHJpdmF0ZSBpbnQgbUluZGV4Q291bnQ7Ci0KLSAgICAgICBwdWJsaWMgR3JpZChpbnQgdywgaW50IGgpIHsKLSAgICAgICAgICAgaWYgKHcgPCAwIHx8IHcgPj0gNjU1MzYpIHsKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInciKTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoaCA8IDAgfHwgaCA+PSA2NTUzNikgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaCIpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmICh3ICogaCA+PSA2NTUzNikgewotICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidyAqIGggPj0gNjU1MzYiKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIG1XID0gdzsKLSAgICAgICAgICAgbUggPSBoOwotICAgICAgICAgICBpbnQgc2l6ZSA9IHcgKiBoOwotCi0gICAgICAgICAgIG1WZXJ0ZXhCeXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChWRVJURVhfU0laRSAqIHNpemUpCi0gICAgICAgICAgICAgICAub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOwotICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbVZlcnRleEJ5dGVCdWZmZXIuYXNGbG9hdEJ1ZmZlcigpOwotCi0gICAgICAgICAgIGludCBxdWFkVyA9IG1XIC0gMTsKLSAgICAgICAgICAgaW50IHF1YWRIID0gbUggLSAxOwotICAgICAgICAgICBpbnQgcXVhZENvdW50ID0gcXVhZFcgKiBxdWFkSDsKLSAgICAgICAgICAgaW50IGluZGV4Q291bnQgPSBxdWFkQ291bnQgKiA2OwotICAgICAgICAgICBtSW5kZXhDb3VudCA9IGluZGV4Q291bnQ7Ci0gICAgICAgICAgIG1JbmRleEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoQ0hBUl9TSVpFICogaW5kZXhDb3VudCkKLSAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSkuYXNDaGFyQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgLyoKLSAgICAgICAgICAgICogSW5pdGlhbGl6ZSB0cmlhbmdsZSBsaXN0IG1lc2guCi0gICAgICAgICAgICAqCi0gICAgICAgICAgICAqICAgICBbMF0tLS0tLVsgIDFdIC4uLgotICAgICAgICAgICAgKiAgICAgIHwgICAgLyAgIHwKLSAgICAgICAgICAgICogICAgICB8ICAgLyAgICB8Ci0gICAgICAgICAgICAqICAgICAgfCAgLyAgICAgfAotICAgICAgICAgICAgKiAgICAgW3ddLS0tLS1bdysxXSAuLi4KLSAgICAgICAgICAgICogICAgICB8ICAgICAgIHwKLSAgICAgICAgICAgICoKLSAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBxdWFkSDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBxdWFkVzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYSA9IChjaGFyKSAoeSAqIG1XICsgeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYiA9IChjaGFyKSAoeSAqIG1XICsgeCArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHgpOwotICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGQgPSAoY2hhcikgKCh5ICsgMSkgKiBtVyArIHggKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgIG1JbmRleEJ1ZmZlci5wdXQoaSsrLCBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgbUluZGV4QnVmZmVyLnB1dChpKyssIGMpOwotICAgICAgICAgICAgICAgICAgICAgICBtSW5kZXhCdWZmZXIucHV0KGkrKywgZCk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9Ci0KLSAgICAgICB9Ci0KLSAgICAgICBwdWJsaWMgdm9pZCBzZXQoaW50IGksIGludCBqLCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB6KSB7Ci0gICAgICAgICAgIGlmIChpIDwgMCB8fCBpID49IG1XKSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpIik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGogPCAwIHx8IGogPj0gbUgpIHsKLSAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImoiKTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICAgIGludCBpbmRleCA9IG1XICogaiArIGk7Ci0KLSAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wb3NpdGlvbihpbmRleCAqIFZFUlRFWF9TSVpFIC8gRkxPQVRfU0laRSk7Ci0gICAgICAgICAgIG1WZXJ0ZXhCdWZmZXIucHV0KHgpOwotICAgICAgICAgICBtVmVydGV4QnVmZmVyLnB1dCh5KTsKLSAgICAgICAgICAgbVZlcnRleEJ1ZmZlci5wdXQoeik7Ci0gICAgICAgfQotCi0gICAgICAgcHVibGljIHZvaWQgY3JlYXRlQnVmZmVyT2JqZWN0cyhHTCBnbCkgewotICAgICAgICAgICAvLyBHZW5lcmF0ZSBhIHRoZSB2ZXJ0ZXggYW5kIGVsZW1lbnQgYnVmZmVyIElEcwotICAgICAgICAgICBpbnRbXSB2Ym9JZHMgPSBuZXcgaW50WzJdOwotICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7Ci0gICAgICAgICAgIGdsMTEuZ2xHZW5CdWZmZXJzKDIsIHZib0lkcywgMCk7Ci0gICAgICAgICAgIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCA9IHZib0lkc1swXTsKLSAgICAgICAgICAgbUVsZW1lbnRCdWZmZXJPYmplY3RJZCA9IHZib0lkc1sxXTsKLQotICAgICAgICAgICAvLyBVcGxvYWQgdGhlIHZlcnRleCBkYXRhCi0gICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfQVJSQVlfQlVGRkVSLCBtVmVydGV4QnVmZmVyT2JqZWN0SWQpOwotICAgICAgICAgICBtVmVydGV4Qnl0ZUJ1ZmZlci5wb3NpdGlvbigwKTsKLSAgICAgICAgICAgZ2wxMS5nbEJ1ZmZlckRhdGEoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCeXRlQnVmZmVyLmNhcGFjaXR5KCksIG1WZXJ0ZXhCeXRlQnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKLQotICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtRWxlbWVudEJ1ZmZlck9iamVjdElkKTsKLSAgICAgICAgICAgbUluZGV4QnVmZmVyLnBvc2l0aW9uKDApOwotICAgICAgICAgICBnbDExLmdsQnVmZmVyRGF0YShHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCBtSW5kZXhCdWZmZXIuY2FwYWNpdHkoKSAqIENIQVJfU0laRSwgbUluZGV4QnVmZmVyLCBHTDExLkdMX1NUQVRJQ19EUkFXKTsKLQotICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBpbi1tZW1vcnkgZGF0YSBhbnkgbW9yZQotICAgICAgICAgICBtVmVydGV4QnVmZmVyID0gbnVsbDsKLSAgICAgICAgICAgbVZlcnRleEJ5dGVCdWZmZXIgPSBudWxsOwotICAgICAgICAgICBtSW5kZXhCdWZmZXIgPSBudWxsOwotICAgICAgIH0KLQotICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoR0wxMCBnbCkgewotICAgICAgICAgICBHTDExIGdsMTEgPSAoR0wxMSkgZ2w7Ci0KLSAgICAgICAgICAgZ2wuZ2xFbmFibGVDbGllbnRTdGF0ZShHTDEwLkdMX1ZFUlRFWF9BUlJBWSk7Ci0KLSAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIG1WZXJ0ZXhCdWZmZXJPYmplY3RJZCk7Ci0gICAgICAgICAgIGdsMTEuZ2xWZXJ0ZXhQb2ludGVyKDMsIEdMMTAuR0xfRkxPQVQsIFZFUlRFWF9TSVpFLCAwKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgIGdsMTEuZ2xCaW5kQnVmZmVyKEdMMTEuR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1FbGVtZW50QnVmZmVyT2JqZWN0SWQpOwotICAgICAgICAgICBnbDExLmdsRHJhd0VsZW1lbnRzKEdMMTAuR0xfVFJJQU5HTEVTLCBtSW5kZXhDb3VudCwgR0wxMC5HTF9VTlNJR05FRF9TSE9SVCwgMCk7Ci0gICAgICAgICAgIGdsLmdsRGlzYWJsZUNsaWVudFN0YXRlKEdMMTAuR0xfVkVSVEVYX0FSUkFZKTsKLSAgICAgICAgICAgZ2wxMS5nbEJpbmRCdWZmZXIoR0wxMS5HTF9BUlJBWV9CVUZGRVIsIDApOwotICAgICAgICAgICBnbDExLmdsQmluZEJ1ZmZlcihHTDExLkdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSLCAwKTsKLSAgICAgICB9Ci0gICB9Ci0KLQotICAgIHByaXZhdGUgY2xhc3MgUmVuZGVyZXIgaW1wbGVtZW50cyBHTFN1cmZhY2VWaWV3LlJlbmRlcmVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW5kZXJlciI7Ci0gICAgICAgIHByaXZhdGUgR3JpZCBtR3JpZDsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRHJhd0ZyYW1lKEdMMTAgZ2wpIHsKLQkJCWdsLmdsQ2xlYXJDb2xvcigwLDAsMSwxKTsKLQkJCWdsLmdsQ2xlYXIoR0wxMC5HTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgICAgIG1HcmlkLmRyYXcoZ2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChHTDEwIGdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgIGdsLmdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0JCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9QUk9KRUNUSU9OKTsKLQkJCWdsLmdsTG9hZElkZW50aXR5KCk7Ci0JCQlnbC5nbE9ydGhvZigwLCB3aWR0aCwgaGVpZ2h0LCAwLCAtMSwgMSk7Ci0JCQlnbC5nbE1hdHJpeE1vZGUoR0wxMS5HTF9NT0RFTFZJRVcpOwotICAgICAgICAgICAgY3JlYXRlR3JpZChnbCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKEdMMTAgZ2wsIEVHTENvbmZpZyBjb25maWcpIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyaWQoR0wxMCBnbCwgZmxvYXQgdywgZmxvYXQgaCkgewotICAgICAgICBtR3JpZCA9IG5ldyBHcmlkKDIsIDIpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotCQkJCQlmbG9hdCB4ID0gdyAqIGk7Ci0JCQkJCWZsb2F0IHkgPSBoICogajsKLQkJCQkJZmxvYXQgeiA9IDAuMGY7Ci0JCQkJCW1HcmlkLnNldChpLGosIHgsIHksIHopOwotCQkJCX0KLQkJCX0KLQkJCW1HcmlkLmNyZWF0ZUJ1ZmZlck9iamVjdHMoZ2wpOwotCQl9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzY5N2Q3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXRleHR1cmVzLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotICAgIGxpYkVHTCBcCi0gICAgbGliR0xFU3YxX0NNIFwKLSAgICBsaWJ1aQotCi1MT0NBTF9DX0lOQ0xVREVTICs9ICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBvcGVuZ2wtdGVzdHMtaW5jbHVkZXMpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXRleHR1cmVzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtREdMX0dMRVhUX1BST1RPVFlQRVMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuY3BwIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzZDk0ZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvdGV4dHVyZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgPHVpL0ZyYW1lYnVmZmVyTmF0aXZlV2luZG93Lmg+Ci0jaW5jbHVkZSAiRUdMVXRpbHMuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBFR0xpbnQgY29uZmlnQXR0cmlic1tdID0gewotICAgICAgICAgRUdMX0RFUFRIX1NJWkUsIDAsCi0gICAgICAgICBFR0xfTk9ORQotICAgICB9OwotICAgICAKLSAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKLSAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKLSAgICAgRUdMQ29udGV4dCBjb250ZXh0OwotICAgICBFR0xDb25maWcgY29uZmlnOwotICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7Ci0gICAgIEVHTGludCB3LCBoOwotICAgICBFR0xEaXNwbGF5IGRweTsKLQotICAgICBFR0xOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyA9IGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKTsKLSAgICAgCi0gICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7Ci0gICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKLSAgICAgICAgICAKLSAgICAgc3RhdHVzX3QgZXJyID0gRUdMVXRpbHM6OnNlbGVjdENvbmZpZ0Zvck5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgICBkcHksIGNvbmZpZ0F0dHJpYnMsIHdpbmRvdywgJmNvbmZpZyk7Ci0gICAgIGlmIChlcnIpIHsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgZmluZCBhbiBFR0xDb25maWcgbWF0Y2hpbmcgdGhlIHNjcmVlbiBmb3JtYXRcbiIpOwotICAgICAgICAgcmV0dXJuIDA7Ci0gICAgIH0KLQotICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgd2luZG93LCBOVUxMKTsKLSAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOwotICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAotICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKLSAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOwotICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKLQotCi0gICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07Ci0gICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKLQotICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0Ci0gICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAotICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAotICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCi0gICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCi0gICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKLQotICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAotICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCi0gICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAotICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCi0gICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OwotCi0gICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKLSAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAotICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKLSAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAotICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKLQotICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAotICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAotICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAotICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAotICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKLSAgICAgfTsKLQotCi0gICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOwotICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIGRpbS8yLCBkaW0vMik7Ci0KLSAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKLSAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgMCwgMCwgZGltLzIsIGRpbS8yKTsKLQotICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKLSAgICAgZ2xEcmF3VGV4aU9FUygwLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKLQotICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKLSAgICAgZ2xEcmF3VGV4aU9FUyhkaW0vMiwgZGltLzIsIDAsIGRpbS8yLCBkaW0vMik7Ci0KLSAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKLSAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZmFhODcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3RyaXRleC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXRyaXRleC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLSAgICBsaWJFR0wgXAotICAgIGxpYkdMRVN2MV9DTSBcCi0gICAgbGlidWkKLQotTE9DQUxfQ19JTkNMVURFUyArPSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgb3BlbmdsLXRlc3RzLWluY2x1ZGVzKQotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10cml0ZXgKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jcHAgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODM0ODMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rlc3RzL3RyaXRleC90cml0ZXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vIENhbGxzIGdsRHJhd0VsZW1lbnRzKCkgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgYnkKLS8vIElURVJBVElPTlMuIFNob3VsZCBkcmF3IGEgY2hlY2tlcmJvYXJkIG9uIHRoZSBzY3JlZW4gYWZ0ZXIKLS8vIGEgZmV3IHNlY29uZHMuCi0vLwotLy8gUG9ydGVkIGZyb20gYSBKYXZhIHZlcnNpb24gYnkgR29vZ2xlLgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPg0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8dWkvRnJhbWVidWZmZXJOYXRpdmVXaW5kb3cuaD4KLSNpbmNsdWRlICJFR0xVdGlscy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4NCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQ0KLUVHTERpc3BsYXkgZWdsRGlzcGxheTsNCi1FR0xTdXJmYWNlIGVnbFN1cmZhY2U7DQotRUdMQ29udGV4dCBlZ2xDb250ZXh0Ow0KLUdMdWludCB0ZXh0dXJlOw0KLQ0KLSNkZWZpbmUgRklYRURfT05FIDB4MTAwMDAKLSNkZWZpbmUgSVRFUkFUSU9OUyA1MA0KLQ0KLWludCBpbml0X2dsX3N1cmZhY2Uodm9pZCk7DQotdm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCk7DQotdm9pZCBpbml0X3NjZW5lKHZvaWQpOw0KLXZvaWQgcmVuZGVyKGludCBxdWFkcyk7DQotdm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKTsKLWludCByZWFkVGltZXIodm9pZCk7DQotCi1zdGF0aWMgdm9pZCBnbHVMb29rQXQoZmxvYXQgZXllWCwgZmxvYXQgZXllWSwgZmxvYXQgZXllWiwKLSAgICAgICAgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgY2VudGVyWiwgZmxvYXQgdXBYLCBmbG9hdCB1cFksCi0gICAgICAgIGZsb2F0IHVwWikKLXsKLSAgICAvLyBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbgotICAgIC8vIG9mIHRoZSBhbGdvcml0aG0uIFdlIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXk6Ci0KLSAgICBmbG9hdCBmeCA9IGNlbnRlclggLSBleWVYOwotICAgIGZsb2F0IGZ5ID0gY2VudGVyWSAtIGV5ZVk7Ci0gICAgZmxvYXQgZnogPSBjZW50ZXJaIC0gZXllWjsKLQotICAgIC8vIE5vcm1hbGl6ZSBmCi0gICAgZmxvYXQgcmxmID0gMS4wZiAvIHNxcnRmKGZ4KmZ4ICsgZnkqZnkgKyBmeipmeik7Ci0gICAgZnggKj0gcmxmOwotICAgIGZ5ICo9IHJsZjsKLSAgICBmeiAqPSBybGY7Ci0KLSAgICAvLyBOb3JtYWxpemUgdXAKLSAgICBmbG9hdCBybHVwID0gMS4wZiAvIHNxcnRmKHVwWCp1cFggKyB1cFkqdXBZICsgdXBaKnVwWik7Ci0gICAgdXBYICo9IHJsdXA7Ci0gICAgdXBZICo9IHJsdXA7Ci0gICAgdXBaICo9IHJsdXA7Ci0KLSAgICAvLyBjb21wdXRlIHMgPSBmIHggdXAgKHggbWVhbnMgImNyb3NzIHByb2R1Y3QiKQotCi0gICAgZmxvYXQgc3ggPSBmeSAqIHVwWiAtIGZ6ICogdXBZOwotICAgIGZsb2F0IHN5ID0gZnogKiB1cFggLSBmeCAqIHVwWjsKLSAgICBmbG9hdCBzeiA9IGZ4ICogdXBZIC0gZnkgKiB1cFg7Ci0KLSAgICAvLyBjb21wdXRlIHUgPSBzIHggZgotICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7Ci0gICAgZmxvYXQgdXkgPSBzeiAqIGZ4IC0gc3ggKiBmejsKLSAgICBmbG9hdCB1eiA9IHN4ICogZnkgLSBzeSAqIGZ4OwotCi0gICAgZmxvYXQgbVsxNl0gOwotICAgIG1bMF0gPSBzeDsKLSAgICBtWzFdID0gdXg7Ci0gICAgbVsyXSA9IC1meDsKLSAgICBtWzNdID0gMC4wZjsKLQotICAgIG1bNF0gPSBzeTsKLSAgICBtWzVdID0gdXk7Ci0gICAgbVs2XSA9IC1meTsKLSAgICBtWzddID0gMC4wZjsKLQotICAgIG1bOF0gPSBzejsKLSAgICBtWzldID0gdXo7Ci0gICAgbVsxMF0gPSAtZno7Ci0gICAgbVsxMV0gPSAwLjBmOwotCi0gICAgbVsxMl0gPSAwLjBmOwotICAgIG1bMTNdID0gMC4wZjsKLSAgICBtWzE0XSA9IDAuMGY7Ci0gICAgbVsxNV0gPSAxLjBmOwotCi0gICAgZ2xNdWx0TWF0cml4ZihtKTsKLSAgICBnbFRyYW5zbGF0ZWYoLWV5ZVgsIC1leWVZLCAtZXllWik7Ci19Ci0NCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQotew0KLSAgICBpbnQgcTsKLSAgICBpbnQgc3RhcnQsIGVuZDsNCi0KLSAgICBwcmludGYoIkluaXRpYWxpemluZyBFR0wuLi5cbiIpOwotDQotICAgIGlmKCFpbml0X2dsX3N1cmZhY2UoKSkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJHTCBpbml0aWFsaXNhdGlvbiBmYWlsZWQgLSBleGl0aW5nXG4iKTsNCi0gICAgICAgIHJldHVybiAwOw0KLSAgICB9DQotDQotICAgIGluaXRfc2NlbmUoKTsNCi0NCi0gICAgY3JlYXRlX3RleHR1cmUoKTsNCi0NCi0gICAgcHJpbnRmKCJTdGFydCB0ZXN0Li4uXG4iKTsKLQotICAgIHJlbmRlcihhcmdjPT0yID8gYXRvaShhcmd2WzFdKSA6IElURVJBVElPTlMpOw0KLQ0KLSAgICBmcmVlX2dsX3N1cmZhY2UoKTsNCi0NCi0gICAgcmV0dXJuIDA7DQotfQ0KLQ0KLWludCBpbml0X2dsX3N1cmZhY2Uodm9pZCkNCi17DQotICAgIEVHTGludCBudW1Db25maWdzID0gMTsNCi0gICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9Ow0KLSAgICBFR0xpbnQgYXR0cmliW10gPQ0KLSAgICB7DQotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgICAgICBFR0xfREVQVEhfU0laRSwgICAgIDE2LA0KLSAgICAgICAgICAgIEVHTF9OT05FDQotICAgIH07DQotDQotICAgIGlmICggKGVnbERpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpKSA9PSBFR0xfTk9fRElTUExBWSApDQotICAgIHsNCi0gICAgICAgIHByaW50ZigiZWdsR2V0RGlzcGxheSBmYWlsZWRcbiIpOw0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgaWYgKCBlZ2xJbml0aWFsaXplKGVnbERpc3BsYXksIE5VTEwsIE5VTEwpICE9IEVHTF9UUlVFICkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJlZ2xJbml0aWFsaXplIGZhaWxlZFxuIik7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQotICAgIEVHTE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93ID0gYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpOw0KLSAgICBFR0xVdGlsczo6c2VsZWN0Q29uZmlnRm9yTmF0aXZlV2luZG93KGVnbERpc3BsYXksIGF0dHJpYiwgd2luZG93LCAmbXlDb25maWcpOw0KLQ0KLSAgICBpZiAoIChlZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShlZ2xEaXNwbGF5LCBteUNvbmZpZywKLSAgICAgICAgICAgIHdpbmRvdywgMCkpID09IEVHTF9OT19TVVJGQUNFICkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZFxuIik7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoIChlZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBteUNvbmZpZywgMCwgMCkpID09IEVHTF9OT19DT05URVhUICkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7DQotICAgICAgICByZXR1cm4gMDsNCi0gICAgfQ0KLQ0KLSAgICBpZiAoIGVnbE1ha2VDdXJyZW50KGVnbERpc3BsYXksIGVnbFN1cmZhY2UsIGVnbFN1cmZhY2UsIGVnbENvbnRleHQpICE9IEVHTF9UUlVFICkNCi0gICAgew0KLSAgICAgICAgcHJpbnRmKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWRcbiIpOw0KLSAgICAgICAgcmV0dXJuIDA7DQotICAgIH0NCi0NCi0gICAgcmV0dXJuIDE7DQotfQ0KLQ0KLXZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpDQotew0KLSAgICBpZiAoZWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkNCi0gICAgew0KLSAgICAgICAgZWdsTWFrZUN1cnJlbnQoIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSwNCi0gICAgICAgICAgICAgICAgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUICk7DQotICAgICAgICBlZ2xEZXN0cm95Q29udGV4dCggZWdsRGlzcGxheSwgZWdsQ29udGV4dCApOw0KLSAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UoIGVnbERpc3BsYXksIGVnbFN1cmZhY2UgKTsNCi0gICAgICAgIGVnbFRlcm1pbmF0ZSggZWdsRGlzcGxheSApOw0KLSAgICAgICAgZWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOw0KLSAgICB9DQotfQ0KLQ0KLXZvaWQgaW5pdF9zY2VuZSh2b2lkKQ0KLXsNCi0gICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0gICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKLQotICAgIGZsb2F0IHJhdGlvID0gMzIwLjBmIC8gNDgwLjBmOwotICAgIGdsVmlld3BvcnQoMCwgMCwgMzIwLCA0ODApOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgZ2xGcnVzdHVtZigtcmF0aW8sIHJhdGlvLCAtMSwgMSwgMSwgMTApOwotCi0gICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7DQotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgZ2x1TG9va0F0KAotICAgICAgICAgICAgMCwgMCwgMywgIC8vIGV5ZQotICAgICAgICAgICAgMCwgMCwgMCwgIC8vIGNlbnRlcgotICAgICAgICAgICAgMCwgMSwgMCk7IC8vIHVwCi0NCi0gICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7DQotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsNCi0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLX0NCi0NCi12b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpDQotew0KLSAgICBjb25zdCB1bnNpZ25lZCBpbnQgb24gPSAweGZmMDAwMGZmOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmYgPSAweGZmZmZmZmZmOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBwaXhlbHNbXSA9Ci0gICAgewotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAotICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKLSAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCi0gICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAotICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKLSAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCi0gICAgfTsNCi0gICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZSk7DQotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7DQotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA4LCA4LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOw0KLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsNCi0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQotICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7DQotfQ0KLQ0KLXZvaWQgcmVuZGVyKGludCBxdWFkcykNCi17DQotICAgIGludCBpLCBqOw0KLQ0KLSAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzW10gPSB7DQotICAgICAgICAgICAgLTEsICAtMSwgIDAsDQotICAgICAgICAgICAgIDEsICAtMSwgIDAsDQotICAgICAgICAgICAgIDEsICAgMSwgIDAsDQotICAgICAgICAgICAgLTEsICAgMSwgIDANCi0gICAgfTsNCi0NCi0gICAgY29uc3QgR0xmaXhlZCB0ZXhDb29yZHNbXSA9IHsNCi0gICAgICAgICAgICAwLCAgICAgICAgICAgIDAsDQotICAgICAgICAgICAgRklYRURfT05FLCAgICAwLA0KLSAgICAgICAgICAgIEZJWEVEX09ORSwgICAgRklYRURfT05FLA0KLSAgICAgICAgICAgIDAsICAgICAgICAgICAgRklYRURfT05FDQotICAgIH07DQotDQotICAgIGNvbnN0IEdMdXNob3J0IHF1YWRJbmRpY2VzW10gPSB7IDAsIDEsIDIsICAwLCAyLCAzIH07Ci0KLQotICAgIEdMdXNob3J0KiBpbmRpY2VzID0gKEdMdXNob3J0KiltYWxsb2MocXVhZHMqc2l6ZW9mKHF1YWRJbmRpY2VzKSk7Ci0gICAgZm9yIChpPTAgOyBpPHF1YWRzIDsgaSsrKQotICAgICAgICBtZW1jcHkoaW5kaWNlcysoc2l6ZW9mKHF1YWRJbmRpY2VzKS9zaXplb2YoaW5kaWNlc1swXSkpKmksIHF1YWRJbmRpY2VzLCBzaXplb2YocXVhZEluZGljZXMpKTsKLQ0KLSAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsNCi0gICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRklYRUQsIDAsIHRleENvb3Jkcyk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gZG8gYSBjb3VwbGUgZWdsU3dhcEJ1ZmZlcnMgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZQotICAgIC8vIG5vIHByb2JsZW1zIHdpdGggdGhlIHZlcnkgZmlyc3Qgb25lcyAod2hvIGtub3dzKQotICAgIGdsQ2xlYXJDb2xvcigwLjQsIDAuNCwgMC40LCAwLjQpOwotICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOwotICAgIGdsQ2xlYXJDb2xvcigwLjYsIDAuNiwgMC42LCAwLjYpOwotICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOwotICAgIGdsQ2xlYXJDb2xvcigxLjAsIDEuMCwgMS4wLCAxLjApOwotCi0gICAgZm9yIChqPTAgOyBqPDEwIDsgaisrKSB7Ci0gICAgICAgIHByaW50ZigibG9vcCAlZCAvIDEwICglZCBxdWFkcyAvIGxvb3ApXG4iLCBqLCBxdWFkcyk7Ci0KLSAgICAgICAgaW50IG5lbGVtID0gc2l6ZW9mKHF1YWRJbmRpY2VzKS9zaXplb2YocXVhZEluZGljZXNbMF0pOwotICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBuZWxlbSpxdWFkcywgR0xfVU5TSUdORURfU0hPUlQsIGluZGljZXMpOwotICAgICAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKLSAgICB9Ci0KLSAgICBmcmVlKGluZGljZXMpOw0KLX0NCi0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi8uZ2l0aWdub3JlIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwN2VjNjUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWdlbmVyYXRlZAotb3V0CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzFmNDE5MC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSMhL2Jpbi9iYXNoCi1zZXQgLXUKLXNldCAtZQotcm0gLXJmIG91dCBnZW5lcmF0ZWQKLQotbWtkaXIgb3V0Ci0KLSMgQ3JlYXRlIGR1bW15IEphdmEgZmlsZXMgZm9yIEFuZHJvaWQgQVBJcyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb2RlIHdlIGdlbmVyYXRlLgotIyBUaGlzIGFsbG93cyB1cyB0byB0ZXN0IHRoZSBnZW5lcmF0ZWQgY29kZSB3aXRob3V0IGJ1aWxkaW5nIHRoZSByZXN0IG9mIEFuZHJvaWQuCi0KLW1rZGlyIC1wIG91dC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcwotbWtkaXIgLXAgb3V0L2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaQotbWtkaXIgLXAgb3V0L2FuZHJvaWQvYXBwCi1ta2RpciAtcCBvdXQvYW5kcm9pZC9ncmFwaGljcwotbWtkaXIgLXAgb3V0L2FuZHJvaWQvb3BlbmdsCi1ta2RpciAtcCBvdXQvYW5kcm9pZC9jb250ZW50Ci1ta2RpciAtcCBvdXQvYW5kcm9pZC9jb250ZW50L3BtCi1ta2RpciAtcCBvdXQvYW5kcm9pZC9vcwotbWtkaXIgLXAgb3V0L2FuZHJvaWQvdXRpbAotCi1lY2hvICJwYWNrYWdlIGFuZHJvaWQuZ3JhcGhpY3M7IiA+IG91dC9hbmRyb2lkL2dyYXBoaWNzL0NhbnZhcy5qYXZhCi1lY2hvICJwdWJsaWMgaW50ZXJmYWNlIENhbnZhcyB7fSIgPj4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKLQotZWNobyAicGFja2FnZSBhbmRyb2lkLmFwcDsgaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5JUGFja2FnZU1hbmFnZXI7IHB1YmxpYyBjbGFzcyBBcHBHbG9iYWxzIHsgcHVibGljIHN0YXRpYyBJUGFja2FnZU1hbmFnZXIgZ2V0UGFja2FnZU1hbmFnZXIoKSB7IHJldHVybiBudWxsO30gfSIgPiBvdXQvYW5kcm9pZC9hcHAvQXBwR2xvYmFscy5qYXZhCi0jIGVjaG8gInBhY2thZ2UgYW5kcm9pZC5jb250ZW50OyBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOyBwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgeyBwdWJsaWMgUGFja2FnZU1hbmFnZXIgZ2V0UGFja2FnZU1hbmFnZXIoKTsgfSIgPiBvdXQvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQotZWNobyAicGFja2FnZSBhbmRyb2lkLmNvbnRlbnQucG07IHB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkluZm8ge3B1YmxpYyBpbnQgdGFyZ2V0U2RrVmVyc2lvbjt9IiA+IG91dC9hbmRyb2lkL2NvbnRlbnQvcG0vQXBwbGljYXRpb25JbmZvLmphdmEKLWVjaG8gInBhY2thZ2UgYW5kcm9pZC5jb250ZW50LnBtOyBwdWJsaWMgaW50ZXJmYWNlIElQYWNrYWdlTWFuYWdlciB7QXBwbGljYXRpb25JbmZvIGdldEFwcGxpY2F0aW9uSW5mbyhqYXZhLmxhbmcuU3RyaW5nIHBhY2thZ2VOYW1lLCBpbnQgZmxhZ3MpIHRocm93cyBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjt9IiA+IG91dC9hbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyLmphdmEKLWVjaG8gInBhY2thZ2UgYW5kcm9pZC5vczsgcHVibGljIGNsYXNzIEJ1aWxkIHtwdWJsaWMgc3RhdGljIGNsYXNzIFZFUlNJT05fQ09ERVMgeyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDVVBDQUtFID0gMzt9Owl9IiA+IG91dC9hbmRyb2lkL29zL0J1aWxkLmphdmEKLWVjaG8gInBhY2thZ2UgYW5kcm9pZC5vczsgcHVibGljIGNsYXNzIFJlbW90ZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7fSIgPiBvdXQvYW5kcm9pZC9vcy9SZW1vdGVFeGNlcHRpb24uamF2YQotZWNobyAicGFja2FnZSBhbmRyb2lkLnV0aWw7IHB1YmxpYyBjbGFzcyBMb2cge3B1YmxpYyBzdGF0aWMgdm9pZCB3KFN0cmluZyBhLCBTdHJpbmcgYikge30gcHVibGljIHN0YXRpYyB2b2lkIGUoU3RyaW5nIGEsIFN0cmluZyBiKSB7fX0iID4gb3V0L2FuZHJvaWQvdXRpbC9Mb2cuamF2YQotCi1HTEZJTEU9b3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKLWNwIHN0dWJzL2pzcjIzOS9HTEhlYWRlci5qYXZhLWlmICRHTEZJTEUKLQotR0xHRU5fRklMRVM9IkNGdW5jLmphdmEgQ1R5cGUuamF2YSBDb2RlRW1pdHRlci5qYXZhIEdlbmVyYXRlR0wuamF2YSBHZW5lcmF0ZUdMRVMuamF2YSBHTEVTQ29kZUVtaXR0ZXIuamF2YSBKRnVuYy5qYXZhIEpuaUNvZGVFbWl0dGVyLmphdmEgSlR5cGUuamF2YSBKc3IyMzlDb2RlRW1pdHRlci5qYXZhIFBhcmFtZXRlckNoZWNrZXIuamF2YSIKLQotcHVzaGQgc3JjID4gL2Rldi9udWxsCi1qYXZhYyAke0dMR0VOX0ZJTEVTfQotSkFWQUNfUkVTVUxUPSQ/Ci1pZiBbICRKQVZBQ19SRVNVTFQgLW5lIDAgXTsgdGhlbgotICAgIGVjaG8gIkNvdWxkIG5vdCBjb21waWxlIGdsZ2VuLiIKLSAgICBleGl0ICRKQVZBQ19SRVNVTFQKLWZpCi1wb3BkID4gL2Rldi9udWxsCi0KLWVjaG8gIkdlbmVyYXRpbmcgSlNSMjM5LWxpa2UgQVBJcyIKLWphdmEgLWNsYXNzcGF0aCBzcmMgR2VuZXJhdGVHTCAtYyBzcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMCBzcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMGV4dCBzcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMSBzcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMWV4dCBzcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMWV4dHBhY2sgc3BlY3MvanNyMjM5L2dsc3BlYy1jaGVja3MKLUpBVkFfUkVTVUxUPSQ/Ci1pZiBbICRKQVZBX1JFU1VMVCAtbmUgMCBdOyB0aGVuCi0gICAgZWNobyAiQ291bGQgbm90IHJ1biBHZW5lcmF0ZUdMLiIKLSAgICBleGl0ICRKQVZBX1JFU1VMVAotZmkKLQotZWNobyAiR2VuZXJhdGluZyBzdGF0aWMgT3BlbkdMRVMgMS4xIGJpbmRpbmdzIgotamF2YSAtY2xhc3NwYXRoIHNyYyBHZW5lcmF0ZUdMRVMKLUpBVkFfUkVTVUxUPSQ/Ci1pZiBbICRKQVZBX1JFU1VMVCAtbmUgMCBdOyB0aGVuCi0gICAgZWNobyAiQ291bGQgbm90IHJ1biBHZW5lcmF0ZUdMRVMuIgotICAgIGV4aXQgJEpBVkFfUkVTVUxUCi1maQotCi1ybSBzcmMvKi5jbGFzcwotCi1wdXNoZCBvdXQgPiAvZGV2L251bGwKLW1rZGlyIGNsYXNzZXMKLWphdmFjIC1kIGNsYXNzZXMgY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhIGFuZHJvaWQvb3BlbmdsL0dMRVMxMC5qYXZhIGFuZHJvaWQvb3BlbmdsL0dMRVMxMEV4dC5qYXZhIGFuZHJvaWQvb3BlbmdsL0dMRVMxMS5qYXZhIGFuZHJvaWQvb3BlbmdsL0dMRVMxMUV4dC5qYXZhIGFuZHJvaWQvb3BlbmdsL0dMRVMyMC5qYXZhCi1wb3BkID4gL2Rldi9udWxsCi1KQVZBX1JFU1VMVD0kPwotaWYgWyAkSkFWQV9SRVNVTFQgLW5lIDAgXTsgdGhlbgotICAgIGVjaG8gIkNvdWxkIG5vdCBjb21waWxlIGdlbmVyYXRlZCBjbGFzc2VzLiIKLSAgICBleGl0ICRKQVZBX1JFU1VMVAotZmkKLQotcm0gLXJmIGdlbmVyYXRlZAotbWtkaXIgLXAgZ2VuZXJhdGVkL0MKLWNwIG91dC9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCBnZW5lcmF0ZWQvQwotY3AgLXIgb3V0L2NvbSBnZW5lcmF0ZWQKLWNwIC1yIG91dC9qYXZheCBnZW5lcmF0ZWQKLQotY3Agb3V0L2FuZHJvaWRfb3BlbmdsXyouY3BwIGdlbmVyYXRlZC9DCi1ta2RpciAtcCBnZW5lcmF0ZWQvYW5kcm9pZC9vcGVuZ2wKLWNwIC1yIG91dC9hbmRyb2lkL29wZW5nbCBnZW5lcmF0ZWQvYW5kcm9pZAotCi1ybSAtcmYgb3V0Ci1LRUVQX0dFTkVSQVRFRD0wCi1TQUlEX1BMRUFTRT0wCi0KLSMgY29tcGFyZUdlbmVyYXRlZCBkZXN0RGlyIGdlbmVyYXRlZERpciBmaWxlCi1jb21wYXJlR2VuZXJhdGVkKCkgewotICAgIGlmIGNtcCAtcyAkMS8kMyAkMi8kMyA7IHRoZW4KLSAgICAgICAgZWNobyAiIyAgICAiICQzIHVuY2hhbmdlZAotICAgIGVsc2UKLSAgICAgICAgaWYgWyAkU0FJRF9QTEVBU0UgPT0gIjAiIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvIFBsZWFzZSBldmFsdWF0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgotICAgICAgICAgICAgZWNobwotICAgICAgICAgICAgU0FJRF9QTEVBU0U9MQotICAgICAgICBmaQotICAgICAgICBlY2hvICIgICAgIiBjcCAkMi8kMyAkMQotICAgICAgICBlY2hvICIgICAgIiBnaXQgYWRkICQxLyQzCi0gICAgICAgIEtFRVBfR0VORVJBVEVEPTEKLSAgICBmaQotfQotCi1jb21wYXJlR2VuZXJhdGVkIC4uLy4uLy4uL2NvcmUvam5pIGdlbmVyYXRlZC9DIGNvbV9nb29nbGVfYW5kcm9pZF9nbGVzX2puaV9HTEltcGwuY3BwCi1jb21wYXJlR2VuZXJhdGVkIC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pIGdlbmVyYXRlZC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkgR0xJbXBsLmphdmEKLQotZm9yIHggaW4gR0wuamF2YSBHTDEwLmphdmEgR0wxMEV4dC5qYXZhIEdMMTEuamF2YSBHTDExRXh0LmphdmEgR0wxMUV4dGVuc2lvblBhY2suamF2YQotZG8KLSAgICBjb21wYXJlR2VuZXJhdGVkIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzICR4Ci1kb25lCi0KLWZvciB4IGluIEdMRVMxMCBHTEVTMTBFeHQgR0xFUzExIEdMRVMxMUV4dCBHTEVTMjAKLWRvCi0gICAgY29tcGFyZUdlbmVyYXRlZCAuLi8uLi9qYXZhL2FuZHJvaWQvb3BlbmdsIGdlbmVyYXRlZC9hbmRyb2lkL29wZW5nbCAke3h9LmphdmEKLSAgICBjb21wYXJlR2VuZXJhdGVkIC4uLy4uLy4uL2NvcmUvam5pIGdlbmVyYXRlZC9DIGFuZHJvaWRfb3BlbmdsXyR7eH0uY3BwCi1kb25lCi0KLWlmIFsgJEtFRVBfR0VORVJBVEVEID09ICIwIiBdIDsgdGhlbgotICAgIHJtIC1yZiBnZW5lcmF0ZWQKLWZpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMC5zcGVjIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMTAuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxMTUyZC4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXZvaWQgZ2xBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQotdm9pZCBnbEFscGhhRnVuYyAoIEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYgKQotdm9pZCBnbEFscGhhRnVuY3ggKCBHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmICkKLXZvaWQgZ2xCaW5kVGV4dHVyZSAoIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlICkKLXZvaWQgZ2xCbGVuZEZ1bmMgKCBHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IgKQotdm9pZCBnbENsZWFyICggR0xiaXRmaWVsZCBtYXNrICkKLXZvaWQgZ2xDbGVhckNvbG9yICggR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEgKQotdm9pZCBnbENsZWFyQ29sb3J4ICggR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEgKQotdm9pZCBnbENsZWFyRGVwdGhmICggR0xjbGFtcGYgZGVwdGggKQotdm9pZCBnbENsZWFyRGVwdGh4ICggR0xjbGFtcHggZGVwdGggKQotdm9pZCBnbENsZWFyU3RlbmNpbCAoIEdMaW50IHMgKQotdm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApCi12b2lkIGdsQ29sb3I0ZiAoIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEgKQotdm9pZCBnbENvbG9yNHggKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkKLXZvaWQgZ2xDb2xvck1hc2sgKCBHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEgKQotdm9pZCBnbENvbG9yUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkKLXZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQotdm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkKLXZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIgKQotdm9pZCBnbENvcHlUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkKLXZvaWQgZ2xDdWxsRmFjZSAoIEdMZW51bSBtb2RlICkKLXZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyApCi12b2lkIGdsRGVwdGhGdW5jICggR0xlbnVtIGZ1bmMgKQotdm9pZCBnbERlcHRoTWFzayAoIEdMYm9vbGVhbiBmbGFnICkKLXZvaWQgZ2xEZXB0aFJhbmdlZiAoIEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyICkKLXZvaWQgZ2xEZXB0aFJhbmdleCAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkKLXZvaWQgZ2xEaXNhYmxlICggR0xlbnVtIGNhcCApCi12b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlICggR0xlbnVtIGFycmF5ICkKLXZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkKLXZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyApCi12b2lkIGdsRW5hYmxlICggR0xlbnVtIGNhcCApCi12b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQotdm9pZCBnbEZpbmlzaCAoIHZvaWQgKQotdm9pZCBnbEZsdXNoICggdm9pZCApCi12b2lkIGdsRm9nZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsRm9nZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsRm9neCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsRm9neHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsRnJvbnRGYWNlICggR0xlbnVtIG1vZGUgKQotdm9pZCBnbEZydXN0dW1mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApCi12b2lkIGdsRnJ1c3R1bXggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkKLXZvaWQgZ2xHZW5UZXh0dXJlcyAoIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyApCi1HTGVudW0gZ2xHZXRFcnJvciAoIHZvaWQgKQotdm9pZCBnbEdldEludGVnZXJ2ICggR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKLWNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkKLXZvaWQgZ2xIaW50ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUgKQotdm9pZCBnbExpZ2h0TW9kZWxmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xMaWdodE1vZGVsZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsTGlnaHRNb2RlbHggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbExpZ2h0TW9kZWx4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xMaWdodGYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsTGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbExpZ2h0eCAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsTGluZVdpZHRoICggR0xmbG9hdCB3aWR0aCApCi12b2lkIGdsTGluZVdpZHRoeCAoIEdMZml4ZWQgd2lkdGggKQotdm9pZCBnbExvYWRJZGVudGl0eSAoIHZvaWQgKQotdm9pZCBnbExvYWRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApCi12b2lkIGdsTG9hZE1hdHJpeHggKCBjb25zdCBHTGZpeGVkICptICkKLXZvaWQgZ2xMb2dpY09wICggR0xlbnVtIG9wY29kZSApCi12b2lkIGdsTWF0ZXJpYWxmICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsTWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsTWF0ZXJpYWx4ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsTWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsTWF0cml4TW9kZSAoIEdMZW51bSBtb2RlICkKLXZvaWQgZ2xNdWx0TWF0cml4ZiAoIGNvbnN0IEdMZmxvYXQgKm0gKQotdm9pZCBnbE11bHRNYXRyaXh4ICggY29uc3QgR0xmaXhlZCAqbSApCi12b2lkIGdsTXVsdGlUZXhDb29yZDRmICggR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxICkKLXZvaWQgZ2xNdWx0aVRleENvb3JkNHggKCBHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEgKQotdm9pZCBnbE5vcm1hbDNmICggR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiApCi12b2lkIGdsTm9ybWFsM3ggKCBHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56ICkKLXZvaWQgZ2xOb3JtYWxQb2ludGVyICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQotdm9pZCBnbE9ydGhvZiAoIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIgKQotdm9pZCBnbE9ydGhveCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQotdm9pZCBnbFBpeGVsU3RvcmVpICggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsUG9pbnRTaXplICggR0xmbG9hdCBzaXplICkKLXZvaWQgZ2xQb2ludFNpemV4ICggR0xmaXhlZCBzaXplICkKLXZvaWQgZ2xQb2x5Z29uT2Zmc2V0ICggR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMgKQotdm9pZCBnbFBvbHlnb25PZmZzZXR4ICggR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMgKQotdm9pZCBnbFBvcE1hdHJpeCAoIHZvaWQgKQotdm9pZCBnbFB1c2hNYXRyaXggKCB2b2lkICkKLXZvaWQgZ2xSZWFkUGl4ZWxzICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyApCi12b2lkIGdsUm90YXRlZiAoIEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQotdm9pZCBnbFJvdGF0ZXggKCBHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkKLXZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSAoIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICkKLXZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXggKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApCi12b2lkIGdsU2NhbGVmICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApCi12b2lkIGdsU2NhbGV4ICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApCi12b2lkIGdsU2Npc3NvciAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkKLXZvaWQgZ2xTaGFkZU1vZGVsICggR0xlbnVtIG1vZGUgKQotdm9pZCBnbFN0ZW5jaWxGdW5jICggR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2sgKQotdm9pZCBnbFN0ZW5jaWxNYXNrICggR0x1aW50IG1hc2sgKQotdm9pZCBnbFN0ZW5jaWxPcCAoIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyApCi12b2lkIGdsVGV4Q29vcmRQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQotdm9pZCBnbFRleEVudmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQotdm9pZCBnbFRleEVudmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbFRleEVudnggKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbFRleEVudnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApCi12b2lkIGdsVGV4UGFyYW1ldGVyZiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsVGV4UGFyYW1ldGVyeCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkKLXZvaWQgZ2xUcmFuc2xhdGVmICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApCi12b2lkIGdsVHJhbnNsYXRleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQotdm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApCi12b2lkIGdsVmlld3BvcnQgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMEV4dC5zcGVjIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMTBFeHQuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmNmM2NS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMEV4dC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0xiaXRmaWVsZCBnbFF1ZXJ5TWF0cml4eE9FUyAoIEdMZml4ZWQgKm1hbnRpc3NhLCBHTGludCAqZXhwb25lbnQgKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMTEuc3BlYyBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvR0xFUzExLnNwZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjdjMTguLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMTEuc3BlYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXZvaWQgZ2xCaW5kQnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciApCi12b2lkIGdsQnVmZmVyRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhLCBHTGVudW0gdXNhZ2UgKQotdm9pZCBnbEJ1ZmZlclN1YkRhdGEgKCBHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkKLXZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApCi12b2lkIGdsQ2xpcFBsYW5leCAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQotdm9pZCBnbENvbG9yNHViICggR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSApCi12b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQotdm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApCi12b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBHTGludCBvZmZzZXQgKQotdm9pZCBnbEdlbkJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyApCi12b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkKLXZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0Q2xpcFBsYW5lZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkKLXZvaWQgZ2xHZXRDbGlwUGxhbmV4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICplcW4gKQotdm9pZCBnbEdldEZpeGVkdiAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRGbG9hdHYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsR2V0TGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbEdldExpZ2h0eHYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRNYXRlcmlhbHh2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLS8vIHZvaWQgZ2xHZXRQb2ludGVydiAoIEdMZW51bSBwbmFtZSwgdm9pZCAqKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4RW52ZnYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4RW52aXYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdldFRleEVudnh2ICggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbEdldFRleFBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLUdMYm9vbGVhbiBnbElzQnVmZmVyICggR0x1aW50IGJ1ZmZlciApCi1HTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkKLUdMYm9vbGVhbiBnbElzVGV4dHVyZSAoIEdMdWludCB0ZXh0dXJlICkKLXZvaWQgZ2xOb3JtYWxQb2ludGVyICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQotdm9pZCBnbFBvaW50UGFyYW1ldGVyZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xQb2ludFBhcmFtZXRlcnggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQotdm9pZCBnbFBvaW50UGFyYW1ldGVyeHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsUG9pbnRTaXplUG9pbnRlck9FUyAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkKLXZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApCi12b2lkIGdsVGV4RW52aSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQotdm9pZCBnbFRleEVudml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsVGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMUV4dC5zcGVjIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMTFFeHQuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3MzMzYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMxMUV4dC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotdm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZU9FUyAoIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhICkKLXZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUyAoIEdMZW51bSBzcmNSR0IsIEdMZW51bSBkc3RSR0IsIEdMZW51bSBzcmNBbHBoYSwgR0xlbnVtIGRzdEFscGhhICkKLXZvaWQgZ2xCbGVuZEVxdWF0aW9uT0VTICggR0xlbnVtIG1vZGUgKQotdm9pZCBnbERyYXdUZXhzT0VTICggR0xzaG9ydCB4LCBHTHNob3J0IHksIEdMc2hvcnQgeiwgR0xzaG9ydCB3aWR0aCwgR0xzaG9ydCBoZWlnaHQgKQotdm9pZCBnbERyYXdUZXhpT0VTICggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCApCi12b2lkIGdsRHJhd1RleHhPRVMgKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCApCi12b2lkIGdsRHJhd1RleHN2T0VTICggY29uc3QgR0xzaG9ydCAqY29vcmRzICkKLXZvaWQgZ2xEcmF3VGV4aXZPRVMgKCBjb25zdCBHTGludCAqY29vcmRzICkKLXZvaWQgZ2xEcmF3VGV4eHZPRVMgKCBjb25zdCBHTGZpeGVkICpjb29yZHMgKQotdm9pZCBnbERyYXdUZXhmT0VTICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQgKQotdm9pZCBnbERyYXdUZXhmdk9FUyAoIGNvbnN0IEdMZmxvYXQgKmNvb3JkcyApCi12b2lkIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlICkKLXZvaWQgZ2xFR0xJbWFnZVRhcmdldFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVnbEltYWdlT0VTIGltYWdlICkKLXZvaWQgZ2xBbHBoYUZ1bmN4T0VTICggR0xlbnVtIGZ1bmMsIEdMY2xhbXB4IHJlZiApCi12b2lkIGdsQ2xlYXJDb2xvcnhPRVMgKCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSApCi12b2lkIGdsQ2xlYXJEZXB0aHhPRVMgKCBHTGNsYW1weCBkZXB0aCApCi12b2lkIGdsQ2xpcFBsYW5leE9FUyAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmaXhlZCAqZXF1YXRpb24gKQotdm9pZCBnbENvbG9yNHhPRVMgKCBHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhICkKLXZvaWQgZ2xEZXB0aFJhbmdleE9FUyAoIEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyICkKLXZvaWQgZ2xGb2d4T0VTICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xGb2d4dk9FUyAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xGcnVzdHVteE9FUyAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQotdm9pZCBnbEdldENsaXBQbGFuZXhPRVMgKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKmVxbiApCi12b2lkIGdsR2V0Rml4ZWR2T0VTICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbEdldExpZ2h0eHZPRVMgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRNYXRlcmlhbHh2T0VTICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhFbnZ4dk9FUyAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4dk9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xMaWdodE1vZGVseE9FUyAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsTGlnaHRNb2RlbHh2T0VTICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbExpZ2h0eE9FUyAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xMaWdodHh2T0VTICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsTGluZVdpZHRoeE9FUyAoIEdMZml4ZWQgd2lkdGggKQotdm9pZCBnbExvYWRNYXRyaXh4T0VTICggY29uc3QgR0xmaXhlZCAqbSApCi12b2lkIGdsTWF0ZXJpYWx4T0VTICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsTWF0ZXJpYWx4dk9FUyAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsTXVsdE1hdHJpeHhPRVMgKCBjb25zdCBHTGZpeGVkICptICkKLXZvaWQgZ2xNdWx0aVRleENvb3JkNHhPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEgKQotdm9pZCBnbE5vcm1hbDN4T0VTICggR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueiApCi12b2lkIGdsT3J0aG94T0VTICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApCi12b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4T0VTICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkKLXZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2T0VTICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQotdm9pZCBnbFBvaW50U2l6ZXhPRVMgKCBHTGZpeGVkIHNpemUgKQotdm9pZCBnbFBvbHlnb25PZmZzZXR4T0VTICggR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMgKQotdm9pZCBnbFJvdGF0ZXhPRVMgKCBHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkKLXZvaWQgZ2xTYW1wbGVDb3ZlcmFnZXhPRVMgKCBHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCApCi12b2lkIGdsU2NhbGV4T0VTICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApCi12b2lkIGdsVGV4RW52eE9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsVGV4RW52eHZPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsVGV4UGFyYW1ldGVyeE9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsVGV4UGFyYW1ldGVyeHZPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApCi12b2lkIGdsVHJhbnNsYXRleE9FUyAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQotR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXJPRVMgKCBHTHVpbnQgcmVuZGVyYnVmZmVyICkKLXZvaWQgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTICggR0xlbnVtIHRhcmdldCwgR0x1aW50IHJlbmRlcmJ1ZmZlciApCi12b2lkIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpyZW5kZXJidWZmZXJzICkKLXZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTICggR0xzaXplaSBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMgKQotdm9pZCBnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0ICkKLXZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi1HTGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyT0VTICggR0x1aW50IGZyYW1lYnVmZmVyICkKLXZvaWQgZ2xCaW5kRnJhbWVidWZmZXJPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgZnJhbWVidWZmZXIgKQotdm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmcmFtZWJ1ZmZlcnMgKQotdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMgKQotR0xlbnVtIGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoIEdMZW51bSB0YXJnZXQgKQotdm9pZCBnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSByZW5kZXJidWZmZXJ0YXJnZXQsIEdMdWludCByZW5kZXJidWZmZXIgKQotdm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGF0dGFjaG1lbnQsIEdMZW51bSB0ZXh0YXJnZXQsIEdMdWludCB0ZXh0dXJlLCBHTGludCBsZXZlbCApCi12b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoIEdMZW51bSB0YXJnZXQgKQotLy8gSGFyZCB0byBleHBvcnQgdG8gSmF2YToKLS8vIHZvaWQgKmdsTWFwQnVmZmVyT0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGFjY2VzcyApCi0vLyBHTGJvb2xlYW4gZ2xVbm1hcEJ1ZmZlck9FUyAoIEdMZW51bSB0YXJnZXQgKQotLy8gdm9pZCBnbEdldEJ1ZmZlclBvaW50ZXJ2T0VTICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCB2b2lkICoqcGFyYW1zICkKLXZvaWQgZ2xDdXJyZW50UGFsZXR0ZU1hdHJpeE9FUyAoIEdMdWludCBtYXRyaXhwYWxldHRlaW5kZXggKQotdm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyAoIHZvaWQgKQotdm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkKLXZvaWQgZ2xXZWlnaHRQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQotdm9pZCBnbERlcHRoUmFuZ2VmT0VTICggR0xjbGFtcGYgek5lYXIsIEdMY2xhbXBmIHpGYXIgKQotdm9pZCBnbEZydXN0dW1mT0VTICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApCi12b2lkIGdsT3J0aG9mT0VTICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApCi12b2lkIGdsQ2xpcFBsYW5lZk9FUyAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24gKQotdm9pZCBnbEdldENsaXBQbGFuZWZPRVMgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKmVxbiApCi12b2lkIGdsQ2xlYXJEZXB0aGZPRVMgKCBHTGNsYW1wZiBkZXB0aCApCi12b2lkIGdsVGV4R2VuZk9FUyAoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKLXZvaWQgZ2xUZXhHZW5mdk9FUyAoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbFRleEdlbmlPRVMgKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQotdm9pZCBnbFRleEdlbml2T0VTICggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbFRleEdlbnhPRVMgKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApCi12b2lkIGdsVGV4R2VueHZPRVMgKCBHTGVudW0gY29vcmQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkKLXZvaWQgZ2xHZXRUZXhHZW5mdk9FUyAoIEdMZW51bSBjb29yZCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQotdm9pZCBnbEdldFRleEdlbml2T0VTICggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdldFRleEdlbnh2T0VTICggR0xlbnVtIGNvb3JkLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMyMC5zcGVjIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9HTEVTMjAuc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OGY1OS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvZ2xlczExL0dMRVMyMC5zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLXZvaWQgZ2xBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KLXZvaWQgZ2xBdHRhY2hTaGFkZXIgKCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IHNoYWRlciApDQotdm9pZCBnbEJpbmRBdHRyaWJMb2NhdGlvbiAoIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUgKQ0KLXZvaWQgZ2xCaW5kQnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciApDQotdm9pZCBnbEJpbmRGcmFtZWJ1ZmZlciAoIEdMZW51bSB0YXJnZXQsIEdMdWludCBmcmFtZWJ1ZmZlciApDQotdm9pZCBnbEJpbmRSZW5kZXJidWZmZXIgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyICkNCi12b2lkIGdsQmluZFRleHR1cmUgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSApDQotdm9pZCBnbEJsZW5kQ29sb3IgKCBHTGNsYW1wZiByZWQsIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLCBHTGNsYW1wZiBhbHBoYSApDQotdm9pZCBnbEJsZW5kRXF1YXRpb24gKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAoIEdMZW51bSBtb2RlUkdCLCBHTGVudW0gbW9kZUFscGhhICkNCi12b2lkIGdsQmxlbmRGdW5jICggR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yICkNCi12b2lkIGdsQmxlbmRGdW5jU2VwYXJhdGUgKCBHTGVudW0gc3JjUkdCLCBHTGVudW0gZHN0UkdCLCBHTGVudW0gc3JjQWxwaGEsIEdMZW51bSBkc3RBbHBoYSApDQotdm9pZCBnbEJ1ZmZlckRhdGEgKCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlICkNCi12b2lkIGdsQnVmZmVyU3ViRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KLUdMZW51bSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMgKCBHTGVudW0gdGFyZ2V0ICkNCi12b2lkIGdsQ2xlYXIgKCBHTGJpdGZpZWxkIG1hc2sgKQ0KLXZvaWQgZ2xDbGVhckNvbG9yICggR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEgKQ0KLXZvaWQgZ2xDbGVhckRlcHRoZiAoIEdMY2xhbXBmIGRlcHRoICkNCi12b2lkIGdsQ2xlYXJTdGVuY2lsICggR0xpbnQgcyApDQotdm9pZCBnbENvbG9yTWFzayAoIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSApDQotdm9pZCBnbENvbXBpbGVTaGFkZXIgKCBHTHVpbnQgc2hhZGVyICkNCi12b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkNCi12b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KLXZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIgKQ0KLXZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQotR0x1aW50IGdsQ3JlYXRlUHJvZ3JhbSAoIHZvaWQgKQ0KLUdMdWludCBnbENyZWF0ZVNoYWRlciAoIEdMZW51bSB0eXBlICkNCi12b2lkIGdsQ3VsbEZhY2UgKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbERlbGV0ZUJ1ZmZlcnMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqYnVmZmVycyApDQotdm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVycyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpmcmFtZWJ1ZmZlcnMgKQ0KLXZvaWQgZ2xEZWxldGVQcm9ncmFtICggR0x1aW50IHByb2dyYW0gKQ0KLXZvaWQgZ2xEZWxldGVSZW5kZXJidWZmZXJzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMgKQ0KLXZvaWQgZ2xEZWxldGVTaGFkZXIgKCBHTHVpbnQgc2hhZGVyICkNCi12b2lkIGdsRGVsZXRlVGV4dHVyZXMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMgKQ0KLXZvaWQgZ2xEZXB0aEZ1bmMgKCBHTGVudW0gZnVuYyApDQotdm9pZCBnbERlcHRoTWFzayAoIEdMYm9vbGVhbiBmbGFnICkNCi12b2lkIGdsRGVwdGhSYW5nZWYgKCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhciApDQotdm9pZCBnbERldGFjaFNoYWRlciAoIEdMdWludCBwcm9ncmFtLCBHTHVpbnQgc2hhZGVyICkNCi12b2lkIGdsRGlzYWJsZSAoIEdMZW51bSBjYXAgKQ0KLXZvaWQgZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkgKCBHTHVpbnQgaW5kZXggKQ0KLXZvaWQgZ2xEcmF3QXJyYXlzICggR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50ICkNCi12b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBHTGludCBvZmZzZXQgKQ0KLXZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyApDQotdm9pZCBnbEVuYWJsZSAoIEdMZW51bSBjYXAgKQ0KLXZvaWQgZ2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSAoIEdMdWludCBpbmRleCApDQotdm9pZCBnbEZpbmlzaCAoIHZvaWQgKQ0KLXZvaWQgZ2xGbHVzaCAoIHZvaWQgKQ0KLXZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBhdHRhY2htZW50LCBHTGVudW0gcmVuZGVyYnVmZmVydGFyZ2V0LCBHTHVpbnQgcmVuZGVyYnVmZmVyICkNCi12b2lkIGdsRnJhbWVidWZmZXJUZXh0dXJlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHRleHRhcmdldCwgR0x1aW50IHRleHR1cmUsIEdMaW50IGxldmVsICkNCi12b2lkIGdsRnJvbnRGYWNlICggR0xlbnVtIG1vZGUgKQ0KLXZvaWQgZ2xHZW5CdWZmZXJzICggR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMgKQ0KLXZvaWQgZ2xHZW5lcmF0ZU1pcG1hcCAoIEdMZW51bSB0YXJnZXQgKQ0KLXZvaWQgZ2xHZW5GcmFtZWJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqZnJhbWVidWZmZXJzICkNCi12b2lkIGdsR2VuUmVuZGVyYnVmZmVycyAoIEdMc2l6ZWkgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzICkNCi12b2lkIGdsR2VuVGV4dHVyZXMgKCBHTHNpemVpIG4sIEdMdWludCAqdGV4dHVyZXMgKQ0KLXZvaWQgZ2xHZXRBY3RpdmVBdHRyaWIgKCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgY2hhciAqbmFtZSApDQotdm9pZCBnbEdldEFjdGl2ZVVuaWZvcm0gKCBHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGluZGV4LCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgR0xpbnQgKnNpemUsIEdMZW51bSAqdHlwZSwgY2hhciAqbmFtZSApDQotdm9pZCBnbEdldEF0dGFjaGVkU2hhZGVycyAoIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heGNvdW50LCBHTHNpemVpICpjb3VudCwgR0x1aW50ICpzaGFkZXJzICkNCi1pbnQgZ2xHZXRBdHRyaWJMb2NhdGlvbiAoIEdMdWludCBwcm9ncmFtLCBjb25zdCBjaGFyICpuYW1lICkNCi12b2lkIGdsR2V0Qm9vbGVhbnYgKCBHTGVudW0gcG5hbWUsIEdMYm9vbGVhbiAqcGFyYW1zICkNCi12b2lkIGdsR2V0QnVmZmVyUGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLUdMZW51bSBnbEdldEVycm9yICggdm9pZCApDQotdm9pZCBnbEdldEZsb2F0diAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gYXR0YWNobWVudCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0SW50ZWdlcnYgKCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRQcm9ncmFtaXYgKCBHTHVpbnQgcHJvZ3JhbSwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0UHJvZ3JhbUluZm9Mb2cgKCBHTHVpbnQgcHJvZ3JhbSwgR0xzaXplaSBidWZzaXplLCBHTHNpemVpICpsZW5ndGgsIGNoYXIgKmluZm9sb2cgKQ0KLXZvaWQgZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbEdldFNoYWRlcml2ICggR0x1aW50IHNoYWRlciwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0U2hhZGVySW5mb0xvZyAoIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgYnVmc2l6ZSwgR0xzaXplaSAqbGVuZ3RoLCBjaGFyICppbmZvbG9nICkNCi12b2lkIGdsR2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ICggR0xlbnVtIHNoYWRlcnR5cGUsIEdMZW51bSBwcmVjaXNpb250eXBlLCBHTGludCAqcmFuZ2UsIEdMaW50ICpwcmVjaXNpb24gKQ0KLXZvaWQgZ2xHZXRTaGFkZXJTb3VyY2UgKCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGJ1ZnNpemUsIEdMc2l6ZWkgKmxlbmd0aCwgY2hhciAqc291cmNlICkNCi1jb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApDQotdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbEdldFVuaWZvcm1mdiAoIEdMdWludCBwcm9ncmFtLCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VW5pZm9ybWl2ICggR0x1aW50IHByb2dyYW0sIEdMaW50IGxvY2F0aW9uLCBHTGludCAqcGFyYW1zICkNCi1pbnQgZ2xHZXRVbmlmb3JtTG9jYXRpb24gKCBHTHVpbnQgcHJvZ3JhbSwgY29uc3QgY2hhciAqbmFtZSApDQotdm9pZCBnbEdldFZlcnRleEF0dHJpYmZ2ICggR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbEdldFZlcnRleEF0dHJpYml2ICggR0x1aW50IGluZGV4LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KLS8vIHZvaWQgZ2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydiAoIEdMdWludCBpbmRleCwgR0xlbnVtIHBuYW1lLCB2b2lkICoqcG9pbnRlciApDQotdm9pZCBnbEhpbnQgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gbW9kZSApDQotR0xib29sZWFuIGdsSXNCdWZmZXIgKCBHTHVpbnQgYnVmZmVyICkNCi1HTGJvb2xlYW4gZ2xJc0VuYWJsZWQgKCBHTGVudW0gY2FwICkNCi1HTGJvb2xlYW4gZ2xJc0ZyYW1lYnVmZmVyICggR0x1aW50IGZyYW1lYnVmZmVyICkNCi1HTGJvb2xlYW4gZ2xJc1Byb2dyYW0gKCBHTHVpbnQgcHJvZ3JhbSApDQotR0xib29sZWFuIGdsSXNSZW5kZXJidWZmZXIgKCBHTHVpbnQgcmVuZGVyYnVmZmVyICkNCi1HTGJvb2xlYW4gZ2xJc1NoYWRlciAoIEdMdWludCBzaGFkZXIgKQ0KLUdMYm9vbGVhbiBnbElzVGV4dHVyZSAoIEdMdWludCB0ZXh0dXJlICkNCi12b2lkIGdsTGluZVdpZHRoICggR0xmbG9hdCB3aWR0aCApDQotdm9pZCBnbExpbmtQcm9ncmFtICggR0x1aW50IHByb2dyYW0gKQ0KLXZvaWQgZ2xQaXhlbFN0b3JlaSAoIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KLXZvaWQgZ2xQb2x5Z29uT2Zmc2V0ICggR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMgKQ0KLXZvaWQgZ2xSZWFkUGl4ZWxzICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyApDQotdm9pZCBnbFJlbGVhc2VTaGFkZXJDb21waWxlciAoIHZvaWQgKQ0KLXZvaWQgZ2xSZW5kZXJidWZmZXJTdG9yYWdlICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQotdm9pZCBnbFNhbXBsZUNvdmVyYWdlICggR0xjbGFtcGYgdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KLXZvaWQgZ2xTY2lzc29yICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQ0KLXZvaWQgZ2xTaGFkZXJCaW5hcnkgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqc2hhZGVycywgR0xlbnVtIGJpbmFyeWZvcm1hdCwgY29uc3QgR0x2b2lkICpiaW5hcnksIEdMc2l6ZWkgbGVuZ3RoICkNCi12b2lkIGdsU2hhZGVyU291cmNlICggR0x1aW50IHNoYWRlciApDQotdm9pZCBnbFN0ZW5jaWxGdW5jICggR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2sgKQ0KLXZvaWQgZ2xTdGVuY2lsRnVuY1NlcGFyYXRlICggR0xlbnVtIGZhY2UsIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrICkNCi12b2lkIGdsU3RlbmNpbE1hc2sgKCBHTHVpbnQgbWFzayApDQotdm9pZCBnbFN0ZW5jaWxNYXNrU2VwYXJhdGUgKCBHTGVudW0gZmFjZSwgR0x1aW50IG1hc2sgKQ0KLXZvaWQgZ2xTdGVuY2lsT3AgKCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KLXZvaWQgZ2xTdGVuY2lsT3BTZXBhcmF0ZSAoIEdMZW51bSBmYWNlLCBHTGVudW0gZmFpbCwgR0xlbnVtIHpmYWlsLCBHTGVudW0genBhc3MgKQ0KLXZvaWQgZ2xUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbFRleFBhcmFtZXRlcmkgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KLXZvaWQgZ2xVbmlmb3JtMWYgKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4ICkNCi12b2lkIGdsVW5pZm9ybTFmdiAoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2ICkNCi12b2lkIGdsVW5pZm9ybTFpICggR0xpbnQgbG9jYXRpb24sIEdMaW50IHggKQ0KLXZvaWQgZ2xVbmlmb3JtMWl2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2ICkNCi12b2lkIGdsVW5pZm9ybTJmICggR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5ICkNCi12b2lkIGdsVW5pZm9ybTJmdiAoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2ICkNCi12b2lkIGdsVW5pZm9ybTJpICggR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHkgKQ0KLXZvaWQgZ2xVbmlmb3JtMml2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2ICkNCi12b2lkIGdsVW5pZm9ybTNmICggR0xpbnQgbG9jYXRpb24sIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KLXZvaWQgZ2xVbmlmb3JtM2Z2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMZmxvYXQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtM2kgKCBHTGludCBsb2NhdGlvbiwgR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiApDQotdm9pZCBnbFVuaWZvcm0zaXYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xpbnQgKnYgKQ0KLXZvaWQgZ2xVbmlmb3JtNGYgKCBHTGludCBsb2NhdGlvbiwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3ICkNCi12b2lkIGdsVW5pZm9ybTRmdiAoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGZsb2F0ICp2ICkNCi12b2lkIGdsVW5pZm9ybTRpICggR0xpbnQgbG9jYXRpb24sIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHcgKQ0KLXZvaWQgZ2xVbmlmb3JtNGl2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIGNvbnN0IEdMaW50ICp2ICkNCi12b2lkIGdsVW5pZm9ybU1hdHJpeDJmdiAoIEdMaW50IGxvY2F0aW9uLCBHTHNpemVpIGNvdW50LCBHTGJvb2xlYW4gdHJhbnNwb3NlLCBjb25zdCBHTGZsb2F0ICp2YWx1ZSApDQotdm9pZCBnbFVuaWZvcm1NYXRyaXgzZnYgKCBHTGludCBsb2NhdGlvbiwgR0xzaXplaSBjb3VudCwgR0xib29sZWFuIHRyYW5zcG9zZSwgY29uc3QgR0xmbG9hdCAqdmFsdWUgKQ0KLXZvaWQgZ2xVbmlmb3JtTWF0cml4NGZ2ICggR0xpbnQgbG9jYXRpb24sIEdMc2l6ZWkgY291bnQsIEdMYm9vbGVhbiB0cmFuc3Bvc2UsIGNvbnN0IEdMZmxvYXQgKnZhbHVlICkNCi12b2lkIGdsVXNlUHJvZ3JhbSAoIEdMdWludCBwcm9ncmFtICkNCi12b2lkIGdsVmFsaWRhdGVQcm9ncmFtICggR0x1aW50IHByb2dyYW0gKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWIxZiAoIEdMdWludCBpbmR4LCBHTGZsb2F0IHggKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWIxZnYgKCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCAqdmFsdWVzICkNCi12b2lkIGdsVmVydGV4QXR0cmliMmYgKCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHkgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWIyZnYgKCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCAqdmFsdWVzICkNCi12b2lkIGdsVmVydGV4QXR0cmliM2YgKCBHTHVpbnQgaW5keCwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApDQotdm9pZCBnbFZlcnRleEF0dHJpYjNmdiAoIEdMdWludCBpbmR4LCBjb25zdCBHTGZsb2F0ICp2YWx1ZXMgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWI0ZiAoIEdMdWludCBpbmR4LCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHcgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWI0ZnYgKCBHTHVpbnQgaW5keCwgY29uc3QgR0xmbG9hdCAqdmFsdWVzICkNCi12b2lkIGdsVmVydGV4QXR0cmliUG9pbnRlciAoIEdMdWludCBpbmR4LCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KLXZvaWQgZ2xWZXJ0ZXhBdHRyaWJQb2ludGVyICggR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcHRyICkNCi12b2lkIGdsVmlld3BvcnQgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9jaGVja3Muc3BlYyBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9nbGVzMTEvY2hlY2tzLnNwZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NzhhMzIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2dsZXMxMS9jaGVja3Muc3BlYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWdsQ2xpcFBsYW5lZiBjaGVjayBlcW4gNAotZ2xDbGlwUGxhbmV4IGNoZWNrIGVxbiA0Ci1nbEdldENsaXBQbGFuZWZPRVMgY2hlY2sgZXFuIDQKLWdsR2V0Q2xpcFBsYW5leE9FUyBjaGVjayBlcW4gNAotZ2xEZWxldGVCdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbgotZ2xEZWxldGVUZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuCi1nbERyYXdFbGVtZW50cyBjaGVja19BSU9PQkUgaW5kaWNlcyBjb3VudAotZ2xGb2cgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9GT0dfTU9ERSxHTF9GT0dfREVOU0lUWSxHTF9GT0dfU1RBUlQsR0xfRk9HX0VORCBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0ZPR19DT0xPUgotZ2xHZW5CdWZmZXJzIGNoZWNrIGJ1ZmZlcnMgbgotZ2xHZW5UZXh0dXJlcyBjaGVjayB0ZXh0dXJlcyBuCi1nbEdldENsaXBQbGFuZSBjaGVjayBlcW4gNAotZ2xHZXRJbnRlZ2VydiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0FMUEhBX0JJVFMsR0xfQUxQSEFfVEVTVF9GVU5DLEdMX0FMUEhBX1RFU1RfUkVGLEdMX0JMRU5EX0RTVCxHTF9CTFVFX0JJVFMsR0xfQ09MT1JfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfQ09MT1JfQVJSQVlfU0laRSxHTF9DT0xPUl9BUlJBWV9TVFJJREUsR0xfQ09MT1JfQVJSQVlfVFlQRSxHTF9DVUxMX0ZBQ0UsR0xfREVQVEhfQklUUyxHTF9ERVBUSF9DTEVBUl9WQUxVRSxHTF9ERVBUSF9GVU5DLEdMX0RFUFRIX1dSSVRFTUFTSyxHTF9GT0dfREVOU0lUWSxHTF9GT0dfRU5ELEdMX0ZPR19NT0RFLEdMX0ZPR19TVEFSVCxHTF9GUk9OVF9GQUNFLEdMX0dSRUVOX0JJVFMsR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMsR0xfTElHSFRfTU9ERUxfQ09MT1JfQ09OVFJPTCxHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsR0xfTElHSFRfTU9ERUxfVFdPX1NJREUsR0xfTElORV9TTU9PVEhfSElOVCxHTF9MSU5FX1dJRFRILEdMX0xPR0lDX09QX01PREUsR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU0laRV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NUUklERV9PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTLEdMX01BVFJJWF9NT0RFLEdMX01BWF9DTElQX1BMQU5FUyxHTF9NQVhfRUxFTUVOVFNfSU5ESUNFUyxHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMsR0xfTUFYX0xJR0hUUyxHTF9NQVhfTU9ERUxWSUVXX1NUQUNLX0RFUFRILEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyxHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCxHTF9NQVhfVEVYVFVSRV9TSVpFLEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRILEdMX01BWF9URVhUVVJFX1VOSVRTLEdMX01BWF9WRVJURVhfVU5JVFNfT0VTLEdMX01PREVMVklFV19TVEFDS19ERVBUSCxHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfTk9STUFMX0FSUkFZX1NUUklERSxHTF9OT1JNQUxfQVJSQVlfVFlQRSxHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsR0xfUEFDS19BTElHTk1FTlQsR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5ULEdMX1BPSU5UX1NJWkUsR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTLEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMsR0xfUE9JTlRfU01PT1RIX0hJTlQsR0xfUE9MWUdPTl9PRkZTRVRfRkFDVE9SLEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTLEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsR0xfUkVEX0JJVFMsR0xfU0hBREVfTU9ERUwsR0xfU1RFTkNJTF9CSVRTLEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUsR0xfU1RFTkNJTF9GQUlMLEdMX1NURU5DSUxfRlVOQyxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCxHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyxHTF9TVEVOQ0lMX1JFRixHTF9TVEVOQ0lMX1ZBTFVFX01BU0ssR0xfU1RFTkNJTF9XUklURU1BU0ssR0xfU1VCUElYRUxfQklUUyxHTF9URVhUVVJFX0JJTkRJTkdfMkQsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyxHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFLEdMX1RFWFRVUkVfU1RBQ0tfREVQVEgsR0xfVU5QQUNLX0FMSUdOTUVOVCxHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfVkVSVEVYX0FSUkFZX1NJWkUsR0xfVkVSVEVYX0FSUkFZX1NUUklERSxHTF9WRVJURVhfQVJSQVlfVFlQRSxHTF9XRUlHSFRfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyxHTF9XRUlHSFRfQVJSQVlfU1RSSURFX09FUyxHTF9XRUlHSFRfQVJSQVlfVFlQRV9PRVMgaWZjaGVjayBwYXJhbXMgMiBwbmFtZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UsR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFLEdMX0RFUFRIX1JBTkdFLEdMX01BWF9WSUVXUE9SVF9ESU1TLEdMX1NNT09USF9MSU5FX1dJRFRIX1JBTkdFLEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQ09MT1JfQ0xFQVJfVkFMVUUsR0xfQ09MT1JfV1JJVEVNQVNLLEdMX0ZPR19DT0xPUixHTF9MSUdIVF9NT0RFTF9BTUJJRU5ULEdMX1NDSVNTT1JfQk9YLEdMX1ZJRVdQT1JUIGlmY2hlY2sgcGFyYW1zIDE2IHBuYW1lIEdMX01PREVMVklFV19NQVRSSVgsR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMsR0xfUFJPSkVDVElPTl9NQVRSSVgsR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTLEdMX1RFWFRVUkVfTUFUUklYLEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyBpZmNoZWNrIHBhcmFtcyBnZXROdW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSBwbmFtZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUwotZ2xHZXRMaWdodCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NQT1RfRVhQT05FTlQsR0xfU1BPVF9DVVRPRkYsR0xfQ09OU1RBTlRfQVRURU5VQVRJT04sR0xfTElORUFSX0FUVEVOVUFUSU9OLEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiBpZmNoZWNrIHBhcmFtcyAzIHBuYW1lIEdMX1NQT1RfRElSRUNUSU9OIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OCi1nbEdldE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UKLWdsR2V0VGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1IKLWdsR2V0VGV4UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxCi1nbExpZ2h0TW9kZWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9MSUdIVF9NT0RFTF9UV09fU0lERSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0xJR0hUX01PREVMX0FNQklFTlQKLWdsTGlnaHQgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TUE9UX0VYUE9ORU5ULEdMX1NQT1RfQ1VUT0ZGLEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLEdMX0xJTkVBUl9BVFRFTlVBVElPTixHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gaWZjaGVjayBwYXJhbXMgMyBwbmFtZSBHTF9TUE9UX0RJUkVDVElPTiBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTgotZ2xMb2FkTWF0cml4IGNoZWNrIG0gMTYKLWdsTWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQotZ2xNdWx0TWF0cml4IGNoZWNrIG0gMTYKLWdsUG9pbnRQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDEKLWdsVGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1IKLWdsVGV4SW1hZ2UyRCBudWxsQWxsb3dlZAotZ2xUZXhTdWJJbWFnZTJEIG51bGxBbGxvd2VkCi1nbEJ1ZmZlckRhdGEgbnVsbEFsbG93ZWQgY2hlY2sgZGF0YSBzaXplCi1nbEJ1ZmZlclN1YkRhdGEgY2hlY2sgZGF0YSBzaXplCi1nbFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQotZ2xRdWVyeU1hdHJpeHhPRVMgY2hlY2sgbWFudGlzc2EgMTYgY2hlY2sgZXhwb25lbnQgMTYgcmV0dXJuIC0xCi1nbERyYXdUZXhmdk9FUyBjaGVjayBjb29yZHMgNQotZ2xEcmF3VGV4aXZPRVMgY2hlY2sgY29vcmRzIDUKLWdsRHJhd1RleHN2T0VTIGNoZWNrIGNvb3JkcyA1Ci1nbERyYXdUZXh4dk9FUyBjaGVjayBjb29yZHMgNQotZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgY2hlY2sgZnJhbWVidWZmZXJzIG4KLWdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyBjaGVjayByZW5kZXJidWZmZXJzIG4KLWdsR2VuRnJhbWVidWZmZXJzT0VTIGNoZWNrIGZyYW1lYnVmZmVycyBuCi1nbEdlblJlbmRlcmJ1ZmZlcnNPRVMgY2hlY2sgcmVuZGVyYnVmZmVycyBuCi1nbEdldEJ1ZmZlclBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQotZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyBjaGVjayBwYXJhbXMgMQotZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyBjaGVjayBwYXJhbXMgMQotZ2xHZXRUZXhHZW4gaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9URVhUVVJFX0dFTl9NT0RFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfT0JKRUNUX1BMQU5FLEdMX0VZRV9QTEFORQotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NDIzMjAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4wCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXZvaWQgZ2xBY3RpdmVUZXh0dXJlICggR0xlbnVtIHRleHR1cmUgKQ0KLXZvaWQgZ2xBbHBoYUZ1bmMgKCBHTGVudW0gZnVuYywgR0xjbGFtcGYgcmVmICkNCi12b2lkIGdsQWxwaGFGdW5jeCAoIEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYgKQ0KLXZvaWQgZ2xCaW5kVGV4dHVyZSAoIEdMZW51bSB0YXJnZXQsIEdMdWludCB0ZXh0dXJlICkNCi12b2lkIGdsQmxlbmRGdW5jICggR0xlbnVtIHNmYWN0b3IsIEdMZW51bSBkZmFjdG9yICkNCi12b2lkIGdsQ2xlYXIgKCBHTGJpdGZpZWxkIG1hc2sgKQ0KLXZvaWQgZ2xDbGVhckNvbG9yICggR0xjbGFtcGYgcmVkLCBHTGNsYW1wZiBncmVlbiwgR0xjbGFtcGYgYmx1ZSwgR0xjbGFtcGYgYWxwaGEgKQ0KLXZvaWQgZ2xDbGVhckNvbG9yeCAoIEdMY2xhbXB4IHJlZCwgR0xjbGFtcHggZ3JlZW4sIEdMY2xhbXB4IGJsdWUsIEdMY2xhbXB4IGFscGhhICkNCi12b2lkIGdsQ2xlYXJEZXB0aGYgKCBHTGNsYW1wZiBkZXB0aCApDQotdm9pZCBnbENsZWFyRGVwdGh4ICggR0xjbGFtcHggZGVwdGggKQ0KLXZvaWQgZ2xDbGVhclN0ZW5jaWwgKCBHTGludCBzICkNCi12b2lkIGdsQ2xpZW50QWN0aXZlVGV4dHVyZSAoIEdMZW51bSB0ZXh0dXJlICkNCi12b2lkIGdsQ29sb3I0ZiAoIEdMZmxvYXQgcmVkLCBHTGZsb2F0IGdyZWVuLCBHTGZsb2F0IGJsdWUsIEdMZmxvYXQgYWxwaGEgKQ0KLXZvaWQgZ2xDb2xvcjR4ICggR0xmaXhlZCByZWQsIEdMZml4ZWQgZ3JlZW4sIEdMZml4ZWQgYmx1ZSwgR0xmaXhlZCBhbHBoYSApDQotdm9pZCBnbENvbG9yTWFzayAoIEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSApDQotdm9pZCBnbENvbG9yUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCi12b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkNCi12b2lkIGdsQ29tcHJlc3NlZFRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KLXZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIgKQ0KLXZvaWQgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQotdm9pZCBnbEN1bGxGYWNlICggR0xlbnVtIG1vZGUgKQ0KLXZvaWQgZ2xEZWxldGVUZXh0dXJlcyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0ZXh0dXJlcyApDQotdm9pZCBnbERlcHRoRnVuYyAoIEdMZW51bSBmdW5jICkNCi12b2lkIGdsRGVwdGhNYXNrICggR0xib29sZWFuIGZsYWcgKQ0KLXZvaWQgZ2xEZXB0aFJhbmdlZiAoIEdMY2xhbXBmIHpOZWFyLCBHTGNsYW1wZiB6RmFyICkNCi12b2lkIGdsRGVwdGhSYW5nZXggKCBHTGNsYW1weCB6TmVhciwgR0xjbGFtcHggekZhciApDQotdm9pZCBnbERpc2FibGUgKCBHTGVudW0gY2FwICkNCi12b2lkIGdsRGlzYWJsZUNsaWVudFN0YXRlICggR0xlbnVtIGFycmF5ICkNCi12b2lkIGdsRHJhd0FycmF5cyAoIEdMZW51bSBtb2RlLCBHTGludCBmaXJzdCwgR0xzaXplaSBjb3VudCApDQotdm9pZCBnbERyYXdFbGVtZW50cyAoIEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzICkNCi12b2lkIGdsRW5hYmxlICggR0xlbnVtIGNhcCApDQotdm9pZCBnbEVuYWJsZUNsaWVudFN0YXRlICggR0xlbnVtIGFycmF5ICkNCi12b2lkIGdsRmluaXNoICggdm9pZCApDQotdm9pZCBnbEZsdXNoICggdm9pZCApDQotdm9pZCBnbEZvZ2YgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KLXZvaWQgZ2xGb2dmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsRm9neCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQotdm9pZCBnbEZvZ3h2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xGcm9udEZhY2UgKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbEZydXN0dW1mICggR0xmbG9hdCBsZWZ0LCBHTGZsb2F0IHJpZ2h0LCBHTGZsb2F0IGJvdHRvbSwgR0xmbG9hdCB0b3AsIEdMZmxvYXQgek5lYXIsIEdMZmxvYXQgekZhciApDQotdm9pZCBnbEZydXN0dW14ICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApDQotdm9pZCBnbEdlblRleHR1cmVzICggR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzICkNCi1HTGVudW0gZ2xHZXRFcnJvciAoIHZvaWQgKQ0KLXZvaWQgZ2xHZXRJbnRlZ2VydiAoIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKQ0KLXZvaWQgZ2xIaW50ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIG1vZGUgKQ0KLXZvaWQgZ2xMaWdodE1vZGVsZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQotdm9pZCBnbExpZ2h0TW9kZWxmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsTGlnaHRNb2RlbHggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KLXZvaWQgZ2xMaWdodE1vZGVseHYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbExpZ2h0ZiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCi12b2lkIGdsTGlnaHRmdiAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xMaWdodHggKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQotdm9pZCBnbExpZ2h0eHYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCi12b2lkIGdsTGluZVdpZHRoICggR0xmbG9hdCB3aWR0aCApDQotdm9pZCBnbExpbmVXaWR0aHggKCBHTGZpeGVkIHdpZHRoICkNCi12b2lkIGdsTG9hZElkZW50aXR5ICggdm9pZCApDQotdm9pZCBnbExvYWRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApDQotdm9pZCBnbExvYWRNYXRyaXh4ICggY29uc3QgR0xmaXhlZCAqbSApDQotdm9pZCBnbExvZ2ljT3AgKCBHTGVudW0gb3Bjb2RlICkNCi12b2lkIGdsTWF0ZXJpYWxmICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQotdm9pZCBnbE1hdGVyaWFsZnYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xNYXRlcmlhbHggKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCi12b2lkIGdsTWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbE1hdHJpeE1vZGUgKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbE11bHRNYXRyaXhmICggY29uc3QgR0xmbG9hdCAqbSApDQotdm9pZCBnbE11bHRNYXRyaXh4ICggY29uc3QgR0xmaXhlZCAqbSApDQotdm9pZCBnbE11bHRpVGV4Q29vcmQ0ZiAoIEdMZW51bSB0YXJnZXQsIEdMZmxvYXQgcywgR0xmbG9hdCB0LCBHTGZsb2F0IHIsIEdMZmxvYXQgcSApDQotdm9pZCBnbE11bHRpVGV4Q29vcmQ0eCAoIEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSApDQotdm9pZCBnbE5vcm1hbDNmICggR0xmbG9hdCBueCwgR0xmbG9hdCBueSwgR0xmbG9hdCBueiApDQotdm9pZCBnbE5vcm1hbDN4ICggR0xmaXhlZCBueCwgR0xmaXhlZCBueSwgR0xmaXhlZCBueiApDQotdm9pZCBnbE5vcm1hbFBvaW50ZXIgKCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQotdm9pZCBnbE9ydGhvZiAoIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIgKQ0KLXZvaWQgZ2xPcnRob3ggKCBHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyICkNCi12b2lkIGdsUGl4ZWxTdG9yZWkgKCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCi12b2lkIGdsUG9pbnRTaXplICggR0xmbG9hdCBzaXplICkNCi12b2lkIGdsUG9pbnRTaXpleCAoIEdMZml4ZWQgc2l6ZSApDQotdm9pZCBnbFBvbHlnb25PZmZzZXQgKCBHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyApDQotdm9pZCBnbFBvbHlnb25PZmZzZXR4ICggR0xmaXhlZCBmYWN0b3IsIEdMZml4ZWQgdW5pdHMgKQ0KLXZvaWQgZ2xQb3BNYXRyaXggKCB2b2lkICkNCi12b2lkIGdsUHVzaE1hdHJpeCAoIHZvaWQgKQ0KLXZvaWQgZ2xSZWFkUGl4ZWxzICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBHTHZvaWQgKnBpeGVscyApDQotdm9pZCBnbFJvdGF0ZWYgKCBHTGZsb2F0IGFuZ2xlLCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCi12b2lkIGdsUm90YXRleCAoIEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KLXZvaWQgZ2xTYW1wbGVDb3ZlcmFnZSAoIEdMY2xhbXBmIHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICkNCi12b2lkIGdsU2FtcGxlQ292ZXJhZ2V4ICggR0xjbGFtcHggdmFsdWUsIEdMYm9vbGVhbiBpbnZlcnQgKQ0KLXZvaWQgZ2xTY2FsZWYgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6ICkNCi12b2lkIGdsU2NhbGV4ICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQotdm9pZCBnbFNjaXNzb3IgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQotdm9pZCBnbFNoYWRlTW9kZWwgKCBHTGVudW0gbW9kZSApDQotdm9pZCBnbFN0ZW5jaWxGdW5jICggR0xlbnVtIGZ1bmMsIEdMaW50IHJlZiwgR0x1aW50IG1hc2sgKQ0KLXZvaWQgZ2xTdGVuY2lsTWFzayAoIEdMdWludCBtYXNrICkNCi12b2lkIGdsU3RlbmNpbE9wICggR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzICkNCi12b2lkIGdsVGV4Q29vcmRQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KLXZvaWQgZ2xUZXhFbnZmICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCi12b2lkIGdsVGV4RW52ZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbFRleEVudnggKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhFbnZ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCi12b2lkIGdsVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyZiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQotdm9pZCBnbFRleFBhcmFtZXRlcnggKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMgKQ0KLXZvaWQgZ2xUcmFuc2xhdGVmICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApDQotdm9pZCBnbFRyYW5zbGF0ZXggKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCi12b2lkIGdsVmVydGV4UG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCi12b2lkIGdsVmlld3BvcnQgKCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4wZXh0IGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4wZXh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDE5NzU4Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMGV4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUdMYml0ZmllbGQgZ2xRdWVyeU1hdHJpeHhPRVMgKCBHTGZpeGVkICptYW50aXNzYSwgR0xpbnQgKmV4cG9uZW50ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy0xLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDlhN2Y5Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLXZvaWQgZ2xCaW5kQnVmZmVyICggR0xlbnVtIHRhcmdldCwgR0x1aW50IGJ1ZmZlciApDQotdm9pZCBnbEJ1ZmZlckRhdGEgKCBHTGVudW0gdGFyZ2V0LCBHTHNpemVpcHRyIHNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSwgR0xlbnVtIHVzYWdlICkNCi12b2lkIGdsQnVmZmVyU3ViRGF0YSAoIEdMZW51bSB0YXJnZXQsIEdMaW50cHRyIG9mZnNldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQ0KLXZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApDQotdm9pZCBnbENsaXBQbGFuZXggKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZml4ZWQgKmVxdWF0aW9uICkNCi12b2lkIGdsQ29sb3I0dWIgKCBHTHVieXRlIHJlZCwgR0x1Ynl0ZSBncmVlbiwgR0x1Ynl0ZSBibHVlLCBHTHVieXRlIGFscGhhICkNCi12b2lkIGdsQ29sb3JQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KLXZvaWQgZ2xEZWxldGVCdWZmZXJzICggR0xzaXplaSBuLCBjb25zdCBHTHVpbnQgKmJ1ZmZlcnMgKQ0KLXZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbEdlbkJ1ZmZlcnMgKCBHTHNpemVpIG4sIEdMdWludCAqYnVmZmVycyApDQotdm9pZCBnbEdldEJvb2xlYW52ICggR0xlbnVtIHBuYW1lLCBHTGJvb2xlYW4gKnBhcmFtcyApDQotdm9pZCBnbEdldEJ1ZmZlclBhcmFtZXRlcml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0Q2xpcFBsYW5lZiAoIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqZXFuICkNCi12b2lkIGdsR2V0Q2xpcFBsYW5leCAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqZXFuICkNCi12b2lkIGdsR2V0Rml4ZWR2ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRGbG9hdHYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQotdm9pZCBnbEdldExpZ2h0ZnYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsR2V0TGlnaHR4diAoIEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsR2V0TWF0ZXJpYWx4diAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbEdldFRleEVudml2ICggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zICkNCi12b2lkIGdsR2V0VGV4RW52eHYgKCBHTGVudW0gZW52LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKnBhcmFtcyApDQotdm9pZCBnbEdldFRleFBhcmFtZXRlcmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbEdldFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KLUdMYm9vbGVhbiBnbElzQnVmZmVyICggR0x1aW50IGJ1ZmZlciApDQotR0xib29sZWFuIGdsSXNFbmFibGVkICggR0xlbnVtIGNhcCApDQotR0xib29sZWFuIGdsSXNUZXh0dXJlICggR0x1aW50IHRleHR1cmUgKQ0KLXZvaWQgZ2xOb3JtYWxQb2ludGVyICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KLXZvaWQgZ2xQb2ludFBhcmFtZXRlcmYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KLXZvaWQgZ2xQb2ludFBhcmFtZXRlcmZ2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KLXZvaWQgZ2xQb2ludFBhcmFtZXRlcnggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KLXZvaWQgZ2xQb2ludFBhcmFtZXRlcnh2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xQb2ludFNpemVQb2ludGVyT0VTICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KLXZvaWQgZ2xUZXhDb29yZFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbFRleEVudmkgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCi12b2lkIGdsVGV4RW52aXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCi12b2lkIGdsVGV4UGFyYW1ldGVyaSAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgcGFyYW0gKQ0KLXZvaWQgZ2xUZXhQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xpbnQgKnBhcmFtcyApDQotdm9pZCBnbFRleFBhcmFtZXRlcnh2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KLXZvaWQgZ2xWZXJ0ZXhQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMWV4dCBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMWV4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwOGM3MzUuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotdm9pZCBnbEN1cnJlbnRQYWxldHRlTWF0cml4T0VTICggR0x1aW50IG1hdHJpeHBhbGV0dGVpbmRleCApDQotdm9pZCBnbERyYXdUZXhmT0VTICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiwgR0xmbG9hdCB3aWR0aCwgR0xmbG9hdCBoZWlnaHQgKQ0KLXZvaWQgZ2xEcmF3VGV4ZnZPRVMgKCBjb25zdCBHTGZsb2F0ICpjb29yZHMgKQ0KLXZvaWQgZ2xEcmF3VGV4aU9FUyAoIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHosIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQ0KLXZvaWQgZ2xEcmF3VGV4aXZPRVMgKCBjb25zdCBHTGludCAqY29vcmRzICkNCi12b2lkIGdsRHJhd1RleHNPRVMgKCBHTHNob3J0IHgsIEdMc2hvcnQgeSwgR0xzaG9ydCB6LCBHTHNob3J0IHdpZHRoLCBHTHNob3J0IGhlaWdodCApDQotdm9pZCBnbERyYXdUZXhzdk9FUyAoIGNvbnN0IEdMc2hvcnQgKmNvb3JkcyApDQotdm9pZCBnbERyYXdUZXh4T0VTICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiwgR0xmaXhlZCB3aWR0aCwgR0xmaXhlZCBoZWlnaHQgKQ0KLXZvaWQgZ2xEcmF3VGV4eHZPRVMgKCBjb25zdCBHTGZpeGVkICpjb29yZHMgKQ0KLXZvaWQgZ2xFbmFibGUgKCBHTGVudW0gY2FwICkNCi12b2lkIGdsRW5hYmxlQ2xpZW50U3RhdGUgKCBHTGVudW0gYXJyYXkgKQ0KLXZvaWQgZ2xMb2FkUGFsZXR0ZUZyb21Nb2RlbFZpZXdNYXRyaXhPRVMgKCB2b2lkICkNCi12b2lkIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KLXZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQotdm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQotdm9pZCBnbFdlaWdodFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIEdMaW50IG9mZnNldCApDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0cGFjayBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLTEuMWV4dHBhY2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDEyZDkuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NwZWNzL2pzcjIzOS9nbHNwZWMtMS4xZXh0cGFjaworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXZvaWQgZ2xCaW5kRnJhbWVidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGZyYW1lYnVmZmVyICkKLXZvaWQgZ2xCaW5kUmVuZGVyYnVmZmVyT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCByZW5kZXJidWZmZXIgKQotdm9pZCBnbEJpbmRUZXh0dXJlICggR0xpbnQgdGFyZ2V0LCBHTGludCB0ZXh0dXJlICkKLXZvaWQgZ2xCbGVuZEVxdWF0aW9uICggR0xpbnQgbW9kZSApCi12b2lkIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlICggR0xpbnQgbW9kZVJHQiwgR0xpbnQgbW9kZUFscGhhICkKLXZvaWQgZ2xCbGVuZEZ1bmNTZXBhcmF0ZSAoIEdMaW50IHNyY1JHQiwgR0xpbnQgZHN0UkdCLCBHTGludCBzcmNBbHBoYSwgR0xpbnQgZHN0QWxwaGEgKQotR0xpbnQgZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzT0VTICggR0xpbnQgdGFyZ2V0ICkKLXZvaWQgZ2xDb21wcmVzc2VkVGV4SW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEgKQotdm9pZCBnbENvcHlUZXhJbWFnZTJEICggR0xpbnQgdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMaW50IHgsIEdMaW50IHksIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQsIEdMaW50IGJvcmRlciApCi12b2lkIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0x1aW50ICpmcmFtZWJ1ZmZlcnMgKQotdm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTHVpbnQgKnJlbmRlcmJ1ZmZlcnMgKQotdm9pZCBnbEVuYWJsZSAoIEdMaW50IGNhcCApCi12b2lkIGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgKCBHTGludCB0YXJnZXQsIEdMaW50IGF0dGFjaG1lbnQsIEdMaW50IHJlbmRlcmJ1ZmZlcnRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKLXZvaWQgZ2xGcmFtZWJ1ZmZlclRleHR1cmUyRE9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgdGV4dGFyZ2V0LCBHTGludCB0ZXh0dXJlLCBHTGludCBsZXZlbCApCi12b2lkIGdsR2VuZXJhdGVNaXBtYXBPRVMgKCBHTGludCB0YXJnZXQgKQotdm9pZCBnbEdlbkZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMdWludCAqZnJhbWVidWZmZXJzICkKLXZvaWQgZ2xHZW5SZW5kZXJidWZmZXJzT0VTICggR0xpbnQgbiwgR0x1aW50ICpyZW5kZXJidWZmZXJzICkKLXZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdldEludGVnZXJ2ICggR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsR2V0VGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbEdldFRleEdlbnh2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKLUdMYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMgKCBHTGludCBmcmFtZWJ1ZmZlciApCi1HTGJvb2xlYW4gZ2xJc1JlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHJlbmRlcmJ1ZmZlciApCi12b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQotdm9pZCBnbFN0ZW5jaWxPcCAoIEdMaW50IGZhaWwsIEdMaW50IHpmYWlsLCBHTGludCB6cGFzcyApCi12b2lkIGdsVGV4RW52ZiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQotdm9pZCBnbFRleEVudmZ2ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhFbnZ4ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQotdm9pZCBnbFRleEVudnh2ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCi12b2lkIGdsVGV4R2VuZiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCi12b2lkIGdsVGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCi12b2lkIGdsVGV4R2VuaSAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQotdm9pZCBnbFRleEdlbml2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKLXZvaWQgZ2xUZXhHZW54ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCi12b2lkIGdsVGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQotdm9pZCBnbFRleFBhcmFtZXRlcmYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLWNoZWNrcyBiL29wZW5nbC90b29scy9nbGdlbi9zcGVjcy9qc3IyMzkvZ2xzcGVjLWNoZWNrcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4YTc5My4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3BlY3MvanNyMjM5L2dsc3BlYy1jaGVja3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1nbENsaXBQbGFuZWYgY2hlY2sgZXF1YXRpb24gNAotZ2xDbGlwUGxhbmV4IGNoZWNrIGVxdWF0aW9uIDQKLWdsRGVsZXRlQnVmZmVycyBjaGVjayBidWZmZXJzIG4KLWdsRGVsZXRlVGV4dHVyZXMgY2hlY2sgdGV4dHVyZXMgbgotZ2xEcmF3RWxlbWVudHMgY2hlY2tfQUlPT0JFIGluZGljZXMgY291bnQKLWdsRm9nIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfRk9HX01PREUsR0xfRk9HX0RFTlNJVFksR0xfRk9HX1NUQVJULEdMX0ZPR19FTkQgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9GT0dfQ09MT1IKLWdsR2VuQnVmZmVycyBjaGVjayBidWZmZXJzIG4KLWdsR2VuVGV4dHVyZXMgY2hlY2sgdGV4dHVyZXMgbgotZ2xHZXRDbGlwUGxhbmUgY2hlY2sgZXFuIDQKLWdsR2V0SW50ZWdlcnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9BTFBIQV9CSVRTLEdMX0FMUEhBX1RFU1RfRlVOQyxHTF9BTFBIQV9URVNUX1JFRixHTF9CTEVORF9EU1QsR0xfQkxVRV9CSVRTLEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX0NPTE9SX0FSUkFZX1NJWkUsR0xfQ09MT1JfQVJSQVlfU1RSSURFLEdMX0NPTE9SX0FSUkFZX1RZUEUsR0xfQ1VMTF9GQUNFLEdMX0RFUFRIX0JJVFMsR0xfREVQVEhfQ0xFQVJfVkFMVUUsR0xfREVQVEhfRlVOQyxHTF9ERVBUSF9XUklURU1BU0ssR0xfRk9HX0RFTlNJVFksR0xfRk9HX0VORCxHTF9GT0dfTU9ERSxHTF9GT0dfU1RBUlQsR0xfRlJPTlRfRkFDRSxHTF9HUkVFTl9CSVRTLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTLEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wsR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLEdMX0xJR0hUX01PREVMX1RXT19TSURFLEdMX0xJTkVfU01PT1RIX0hJTlQsR0xfTElORV9XSURUSCxHTF9MT0dJQ19PUF9NT0RFLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUyxHTF9NQVRSSVhfTU9ERSxHTF9NQVhfQ0xJUF9QTEFORVMsR0xfTUFYX0VMRU1FTlRTX0lORElDRVMsR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTLEdMX01BWF9MSUdIVFMsR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCxHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMsR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsR0xfTUFYX1RFWFRVUkVfU0laRSxHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCxHTF9NQVhfVEVYVFVSRV9VTklUUyxHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyxHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgsR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX05PUk1BTF9BUlJBWV9TVFJJREUsR0xfTk9STUFMX0FSUkFZX1RZUEUsR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLEdMX1BBQ0tfQUxJR05NRU5ULEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCxHTF9QT0lOVF9TSVpFLEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUyxHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTLEdMX1BPSU5UX1NNT09USF9ISU5ULEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUixHTF9QT0xZR09OX09GRlNFVF9VTklUUyxHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRILEdMX1JFRF9CSVRTLEdMX1NIQURFX01PREVMLEdMX1NURU5DSUxfQklUUyxHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFLEdMX1NURU5DSUxfRkFJTCxHTF9TVEVOQ0lMX0ZVTkMsR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwsR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MsR0xfU1RFTkNJTF9SRUYsR0xfU1RFTkNJTF9WQUxVRV9NQVNLLEdMX1NURU5DSUxfV1JJVEVNQVNLLEdMX1NVQlBJWEVMX0JJVFMsR0xfVEVYVFVSRV9CSU5ESU5HXzJELEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSxHTF9URVhUVVJFX1NUQUNLX0RFUFRILEdMX1VOUEFDS19BTElHTk1FTlQsR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX1ZFUlRFWF9BUlJBWV9TSVpFLEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUsR0xfVkVSVEVYX0FSUkFZX1RZUEUsR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMsR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMsR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTIGlmY2hlY2sgcGFyYW1zIDIgcG5hbWUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFLEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSxHTF9ERVBUSF9SQU5HRSxHTF9NQVhfVklFV1BPUlRfRElNUyxHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSxHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0NPTE9SX0NMRUFSX1ZBTFVFLEdMX0NPTE9SX1dSSVRFTUFTSyxHTF9GT0dfQ09MT1IsR0xfTElHSFRfTU9ERUxfQU1CSUVOVCxHTF9TQ0lTU09SX0JPWCxHTF9WSUVXUE9SVCBpZmNoZWNrIHBhcmFtcyAxNiBwbmFtZSBHTF9NT0RFTFZJRVdfTUFUUklYLEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTLEdMX1BST0pFQ1RJT05fTUFUUklYLEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyxHTF9URVhUVVJFX01BVFJJWCxHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgaWZjaGVjayBwYXJhbXMgZ2V0TnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkgcG5hbWUgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMKLWdsR2V0TGlnaHQgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TUE9UX0VYUE9ORU5ULEdMX1NQT1RfQ1VUT0ZGLEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLEdMX0xJTkVBUl9BVFRFTlVBVElPTixHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gaWZjaGVjayBwYXJhbXMgMyBwbmFtZSBHTF9TUE9UX0RJUkVDVElPTiBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTgotZ2xHZXRNYXRlcmlhbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NISU5JTkVTUyBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTixHTF9BTUJJRU5UX0FORF9ESUZGVVNFCi1nbEdldFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SCi1nbEdldFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQotZ2xMaWdodE1vZGVsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9MSUdIVF9NT0RFTF9BTUJJRU5UCi1nbExpZ2h0IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU1BPVF9FWFBPTkVOVCxHTF9TUE9UX0NVVE9GRixHTF9DT05TVEFOVF9BVFRFTlVBVElPTixHTF9MSU5FQVJfQVRURU5VQVRJT04sR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OIGlmY2hlY2sgcGFyYW1zIDMgcG5hbWUgR0xfU1BPVF9ESVJFQ1RJT04gaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04KLWdsTG9hZE1hdHJpeCBjaGVjayBtIDE2Ci1nbE1hdGVyaWFsIGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfU0hJTklORVNTIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfQU1CSUVOVCxHTF9ESUZGVVNFLEdMX1NQRUNVTEFSLEdMX0VNSVNTSU9OLEdMX0FNQklFTlRfQU5EX0RJRkZVU0UKLWdsTXVsdE1hdHJpeCBjaGVjayBtIDE2Ci1nbFBvaW50UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxCi1nbFRleEVudiBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1RFWFRVUkVfRU5WX01PREUsR0xfQ09NQklORV9SR0IsR0xfQ09NQklORV9BTFBIQSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX1RFWFRVUkVfRU5WX0NPTE9SCi1nbFRleEltYWdlMkQgbnVsbEFsbG93ZWQKLWdsVGV4U3ViSW1hZ2UyRCBudWxsQWxsb3dlZAotZ2xCdWZmZXJEYXRhIG51bGxBbGxvd2VkIGNoZWNrIGRhdGEgc2l6ZQotZ2xCdWZmZXJTdWJEYXRhIGNoZWNrIGRhdGEgc2l6ZQotZ2xUZXhQYXJhbWV0ZXIgY2hlY2sgcGFyYW1zIDEKLWdsUXVlcnlNYXRyaXh4T0VTIGNoZWNrIG1hbnRpc3NhIDE2IGNoZWNrIGV4cG9uZW50IDE2IHJldHVybiAtMQotZ2xEcmF3VGV4ZnZPRVMgY2hlY2sgY29vcmRzIDUKLWdsRHJhd1RleGl2T0VTIGNoZWNrIGNvb3JkcyA1Ci1nbERyYXdUZXhzdk9FUyBjaGVjayBjb29yZHMgNQotZ2xEcmF3VGV4eHZPRVMgY2hlY2sgY29vcmRzIDUKLWdsQmluZEZyYW1lYnVmZmVyT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsQmluZFJlbmRlcmJ1ZmZlck9FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0Ci1nbEJsZW5kRXF1YXRpb24gcmVxdWlyZXMgT0VTX2JsZW5kX3N1YnRyYWN0Ci1nbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSByZXF1aXJlcyBPRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUKLWdsQmxlbmRGdW5jU2VwYXJhdGUgcmVxdWlyZXMgT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlCi1nbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCByZXR1cm4gMAotZ2xEZWxldGVGcmFtZWJ1ZmZlcnNPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCBjaGVjayBmcmFtZWJ1ZmZlcnMgbgotZ2xEZWxldGVSZW5kZXJidWZmZXJzT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QgY2hlY2sgcmVuZGVyYnVmZmVycyBuCi1nbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsRnJhbWVidWZmZXJTdG9yYWdlT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCBjaGVjayBmcmFtZWJ1ZmZlcnMgbgotZ2xHZW5SZW5kZXJidWZmZXJzT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QgY2hlY2sgcmVuZGVyYnVmZmVycyBuCi1nbEdlbmVyYXRlTWlwbWFwT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdAotZ2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdk9FUyByZXF1aXJlcyBPRVNfZnJhbWVidWZmZXJfb2JqZWN0Ci1nbElzRnJhbWVidWZmZXJPRVMgcmVxdWlyZXMgT0VTX2ZyYW1lYnVmZmVyX29iamVjdCByZXR1cm4gSk5JX0ZBTFNFCi1nbElzUmVuZGVyYnVmZmVyT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QgcmV0dXJuIEpOSV9GQUxTRQotZ2xSZW5kZXJidWZmZXJTdG9yYWdlT0VTIHJlcXVpcmVzIE9FU19mcmFtZWJ1ZmZlcl9vYmplY3QKLWdsR2V0VGV4R2VuIHJlcXVpcmVzIE9FU190ZXh0dXJlX2N1YmVfbWFwCi1nbFRleEdlbiByZXF1aXJlcyBPRVNfdGV4dHVyZV9jdWJlX21hcAotZ2xUZXhHZW5mIHJlcXVpcmVzIE9FU190ZXh0dXJlX2N1YmVfbWFwCi1nbFRleEdlbmkgcmVxdWlyZXMgT0VTX3RleHR1cmVfY3ViZV9tYXAKLWdsVGV4R2VueCByZXF1aXJlcyBPRVNfdGV4dHVyZV9jdWJlX21hcAotZ2xHZXRCdWZmZXJQYXJhbWV0ZXIgdW5zdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvLmdpdGlnbm9yZSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NjhiNi4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjLy5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0qLmNsYXNzCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDc2OTQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DRnVuYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBDRnVuYyB7Ci0KLSAgICBTdHJpbmcgb3JpZ2luYWw7Ci0KLSAgICBDVHlwZSBmdHlwZTsKLSAgICBTdHJpbmcgZm5hbWU7Ci0KLSAgICBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBMaXN0PENUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8Q1R5cGU+KCk7Ci0KLSAgICBib29sZWFuIGhhc1BvaW50ZXJBcmcgPSBmYWxzZTsKLSAgICBib29sZWFuIGhhc1R5cGVkUG9pbnRlckFyZyA9IGZhbHNlOwotCi0gICAgcHVibGljIENGdW5jKFN0cmluZyBvcmlnaW5hbCkgewotICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRPcmlnaW5hbCgpIHsKLSAgICAgICAgcmV0dXJuIG9yaWdpbmFsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7Ci0gICAgICAgIHRoaXMuZm5hbWUgPSBmbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKENUeXBlIGZ0eXBlKSB7Ci0gICAgICAgIHRoaXMuZnR5cGUgPSBmdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1R5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZ0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFyZ3VtZW50KFN0cmluZyBhcmdOYW1lLCBDVHlwZSBhcmdUeXBlKSB7Ci0gICAgICAgIGFyZ05hbWVzLmFkZChhcmdOYW1lKTsKLSAgICAgICAgYXJnVHlwZXMuYWRkKGFyZ1R5cGUpOwotCi0gICAgICAgIGlmIChhcmdUeXBlLmlzUG9pbnRlcigpKSB7Ci0gICAgICAgICAgICBoYXNQb2ludGVyQXJnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpKSB7Ci0gICAgICAgICAgICBoYXNUeXBlZFBvaW50ZXJBcmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1BcmdzKCkgewotICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaW50IGxlbiA9IGFyZ05hbWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmdOYW1lKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYXJnTmFtZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1R5cGUgZ2V0QXJnVHlwZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUG9pbnRlckFyZygpIHsKLSAgICAgICAgcmV0dXJuIGhhc1BvaW50ZXJBcmc7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzVHlwZWRQb2ludGVyQXJnKCkgewotICAgICAgICByZXR1cm4gaGFzVHlwZWRQb2ludGVyQXJnOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcyArPSAiLCAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyArPSBhcmdUeXBlcy5nZXQoaSkgKyAiICIgKyBhcmdOYW1lcy5nZXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDRnVuYyBwYXJzZUNGdW5jKFN0cmluZyBzKSB7Ci0gICAgICAgIENGdW5jIGNmdW5jID0gbmV3IENGdW5jKHMpOwotICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBzLnNwbGl0KCJcXHMiKTsKLQotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIENUeXBlIGZ0eXBlID0gbmV3IENUeXBlKCk7Ci0gICAgICAgIFN0cmluZyBmdHlwZU5hbWUgPSB0b2tlbnNbaSsrXTsKLSAgICAgICAgaWYgKGZ0eXBlTmFtZS5lcXVhbHMoImNvbnN0IikpIHsKLSAgICAgICAgICAgIGZ0eXBlLnNldElzQ29uc3QodHJ1ZSk7Ci0gICAgICAgICAgICBmdHlwZU5hbWUgPSB0b2tlbnNbaSsrXTsKLSAgICAgICAgfQotICAgICAgICBmdHlwZS5zZXRCYXNlVHlwZShmdHlwZU5hbWUpOwotCi0gICAgICAgIFN0cmluZyBmbmFtZSA9IHRva2Vuc1tpKytdOwotICAgICAgICBpZiAoZm5hbWUuZXF1YWxzKCIqIikpIHsKLSAgICAgICAgICAgIGZ0eXBlLnNldElzUG9pbnRlcih0cnVlKTsKLSAgICAgICAgICAgIGZuYW1lID0gdG9rZW5zW2krK107Ci0gICAgICAgIH0KLQotICAgICAgICBjZnVuYy5zZXROYW1lKGZuYW1lKTsKLSAgICAgICAgY2Z1bmMuc2V0VHlwZShmdHlwZSk7Ci0KLSAgICAgICAgd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgdG9rID0gdG9rZW5zW2krK107Ci0KLSAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIoIikpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0b2suZXF1YWxzKCIpIikpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ1R5cGUgYXJnVHlwZSA9IG5ldyBDVHlwZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgYXJnVHlwZU5hbWUgPSB0b2s7Ci0gICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9ICIiOwotCi0gICAgICAgICAgICBpZiAoYXJnVHlwZU5hbWUuZXF1YWxzKCJjb25zdCIpKSB7Ci0gICAgICAgICAgICAgICAgYXJnVHlwZS5zZXRJc0NvbnN0KHRydWUpOwotICAgICAgICAgICAgICAgIGFyZ1R5cGVOYW1lID0gdG9rZW5zW2krK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdUeXBlLnNldEJhc2VUeXBlKGFyZ1R5cGVOYW1lKTsKLQotICAgICAgICAgICAgaWYgKGFyZ1R5cGVOYW1lLmVxdWFscygidm9pZCIpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFyZ05hbWUgPSB0b2tlbnNbaSsrXTsKLSAgICAgICAgICAgIGlmIChhcmdOYW1lLnN0YXJ0c1dpdGgoIioiKSkgewotICAgICAgICAgICAgICAgIGFyZ1R5cGUuc2V0SXNQb2ludGVyKHRydWUpOwotICAgICAgICAgICAgICAgIGFyZ05hbWUgPSBhcmdOYW1lLnN1YnN0cmluZygxLCBhcmdOYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcmdOYW1lLmVuZHNXaXRoKCIsIikpIHsKLSAgICAgICAgICAgICAgICBhcmdOYW1lID0gYXJnTmFtZS5zdWJzdHJpbmcoMCwgYXJnTmFtZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjZnVuYy5hZGRBcmd1bWVudChhcmdOYW1lLCBhcmdUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjZnVuYzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjBjYTYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQ1R5cGUgewotCi0gICAgU3RyaW5nIGJhc2VUeXBlOwotICAgIGJvb2xlYW4gaXNDb25zdDsKLSAgICBib29sZWFuIGlzUG9pbnRlcjsKLQotICAgIHB1YmxpYyBDVHlwZSgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ1R5cGUoU3RyaW5nIGJhc2VUeXBlKSB7Ci0gICAgc2V0QmFzZVR5cGUoYmFzZVR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDVHlwZShTdHJpbmcgYmFzZVR5cGUsIGJvb2xlYW4gaXNDb25zdCwgYm9vbGVhbiBpc1BvaW50ZXIpIHsKLSAgICBzZXRCYXNlVHlwZShiYXNlVHlwZSk7Ci0gICAgc2V0SXNDb25zdChpc0NvbnN0KTsKLSAgICBzZXRJc1BvaW50ZXIoaXNQb2ludGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uKCkgewotICAgIHJldHVybiBiYXNlVHlwZSArIChpc1BvaW50ZXIgPyAiICoiIDogIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzQ29uc3QoYm9vbGVhbiBpc0NvbnN0KSB7Ci0gICAgdGhpcy5pc0NvbnN0ID0gaXNDb25zdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0KCkgewotICAgIHJldHVybiBpc0NvbnN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldElzUG9pbnRlcihib29sZWFuIGlzUG9pbnRlcikgewotICAgIHRoaXMuaXNQb2ludGVyID0gaXNQb2ludGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUG9pbnRlcigpIHsKLSAgICByZXR1cm4gaXNQb2ludGVyOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNWb2lkKCkgewotICAgIFN0cmluZyBiYXNlVHlwZSA9IGdldEJhc2VUeXBlKCk7Ci0gICAgcmV0dXJuIGJhc2VUeXBlLmVxdWFscygiR0x2b2lkIikgfHwKLSAgICAgICAgYmFzZVR5cGUuZXF1YWxzKCJ2b2lkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25zdENoYXJQb2ludGVyKCkgewotICAgICAgICByZXR1cm4gaXNDb25zdCAmJiBpc1BvaW50ZXIgJiYgYmFzZVR5cGUuZXF1YWxzKCJjaGFyIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNUeXBlZFBvaW50ZXIoKSB7Ci0gICAgcmV0dXJuIGlzUG9pbnRlcigpICYmICFpc1ZvaWQoKSAmJiAhaXNDb25zdENoYXJQb2ludGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QmFzZVR5cGUoU3RyaW5nIGJhc2VUeXBlKSB7Ci0gICAgdGhpcy5iYXNlVHlwZSA9IGJhc2VUeXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZVR5cGUoKSB7Ci0gICAgcmV0dXJuIGJhc2VUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nIHMgPSAiIjsKLSAgICBpZiAoaXNDb25zdCgpKSB7Ci0gICAgICAgIHMgKz0gImNvbnN0ICI7Ci0gICAgfQotICAgIHMgKz0gYmFzZVR5cGU7Ci0gICAgaWYgKGlzUG9pbnRlcigpKSB7Ci0gICAgICAgIHMgKz0gIioiOwotICAgIH0KLQotICAgIHJldHVybiBzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgcmV0dXJuIGJhc2VUeXBlLmhhc2hDb2RlKCkgXiAoaXNQb2ludGVyID8gMiA6IDApIF4gKGlzQ29uc3QgPyAxIDogMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgQ1R5cGUpIHsKLSAgICAgICAgQ1R5cGUgYyA9IChDVHlwZSlvOwotICAgICAgICByZXR1cm4gYmFzZVR5cGUuZXF1YWxzKGMuYmFzZVR5cGUpICYmCi0gICAgICAgIGlzUG9pbnRlcigpID09IGMuaXNQb2ludGVyKCkgJiYKLSAgICAgICAgaXNDb25zdCgpID09IGMuaXNDb25zdCgpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Db2RlRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ4MzRlLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ29kZUVtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIENvZGVFbWl0dGVyIHsKLQotICAgIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjayk7Ci0gICAgdm9pZCBlbWl0Q29kZShDRnVuYyBjZnVuYywgU3RyaW5nIG9yaWdpbmFsKTsKLSAgICB2b2lkIGFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgZm5hbWUpOwotICAgIHZvaWQgZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HTEVTQ29kZUVtaXR0ZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR0xFU0NvZGVFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMzgyNTAuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HTEVTQ29kZUVtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotLyoqCi0gKiBFbWl0cyBhIEphdmEgaW50ZXJmYWNlIGFuZCBKYXZhICYgQyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBDIGZ1bmN0aW9uLgotICoKLSAqIDxwPiBUaGUgSmF2YSBpbnRlcmZhY2Ugd2lsbCBoYXZlIEJ1ZmZlciBhbmQgYXJyYXkgdmFyaWFudHMgZm9yIGZ1bmN0aW9ucyB0aGF0Ci0gKiBoYXZlIGEgdHlwZWQgcG9pbnRlciBhcmd1bWVudC4gIFRoZSBhcnJheSB2YXJpYW50IHdpbGwgY29udmVydCBhIHNpbmdsZSAiPHR5cGU+ICpkYXRhIgotICogYXJndW1lbnQgdG8gYSBwYWlyIG9mIGFyZ3VtZW50cyAiPHR5cGU+W10gZGF0YSwgaW50IG9mZnNldCIuCi0gKi8KLXB1YmxpYyBjbGFzcyBHTEVTQ29kZUVtaXR0ZXIgZXh0ZW5kcyBKbmlDb2RlRW1pdHRlciB7Ci0KLSAgICBQcmludFN0cmVhbSBtSmF2YUltcGxTdHJlYW07Ci0gICAgUHJpbnRTdHJlYW0gbUNTdHJlYW07Ci0KLSAgICBQcmludFN0cmVhbSBtSmF2YUludGVyZmFjZVN0cmVhbTsKLQotICAgIC8qKgotICAgICAgKi8KLSAgICBwdWJsaWMgR0xFU0NvZGVFbWl0dGVyKFN0cmluZyBjbGFzc1BhdGhOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmFJbXBsU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB7Ci0gICAgICAgIG1DbGFzc1BhdGhOYW1lID0gY2xhc3NQYXRoTmFtZTsKLSAgICAgICAgbUNoZWNrZXIgPSBjaGVja2VyOwotCi0gICAgICAgIG1KYXZhSW1wbFN0cmVhbSA9IGphdmFJbXBsU3RyZWFtOwotICAgICAgICBtQ1N0cmVhbSA9IGNTdHJlYW07Ci0gICAgICAgIG1Vc2VDb250ZXh0UG9pbnRlciA9IGZhbHNlOwotICAgICAgICBtVXNlU3RhdGljTWV0aG9kcyA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCkgewotICAgICAgICBlbWl0Q29kZShjZnVuYywgb3JpZ2luYWwsIG51bGwsIG1KYXZhSW1wbFN0cmVhbSwKLSAgICAgICAgICAgICAgICBtQ1N0cmVhbSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgbmF0aXZlUmVnaXN0cmF0aW9uTmFtZSkgewotICAgICAgICBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKG5hdGl2ZVJlZ2lzdHJhdGlvbk5hbWUsIG1DU3RyZWFtKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0wuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDBjZjBiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUdMIHsKLQotICAgIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIGZpbGVuYW1lLCBQcmludFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7Ci0gICAgICAgIFN0cmluZyBzOwotICAgICAgICB3aGlsZSAoKHMgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW1pdChpbnQgdmVyc2lvbiwgYm9vbGVhbiBleHQsIGJvb2xlYW4gcGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUVtaXR0ZXIgZW1pdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlY1JlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2xTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gY1N0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBzID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKChzID0gc3BlY1JlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAocy50cmltKCkuc3RhcnRzV2l0aCgiLy8iKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDRnVuYyBjZnVuYyA9IENGdW5jLnBhcnNlQ0Z1bmMocyk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGNmdW5jLmdldE5hbWUoKTsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKCJzdHVicy9qc3IyMzkvIiArIGZuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuamF2YS0xIiArIHZlcnNpb24gKyAiLWlmIik7Ci0gICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3BlY2lhbC1jYXNpbmcgZnVuY3Rpb24gIiArIGZuYW1lKTsKLSAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy9qc3IyMzkvIiArIGZuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICIuamF2YS0xIiArIHZlcnNpb24gKyAiLWlmIiwgZ2xTdHJlYW0pOwotICAgICAgICAgICAgICAgIGNvcHkoInN0dWJzL2pzcjIzOS8iICsgZm5hbWUgKyAiLmphdmEtaW1wbCIsIGdsSW1wbFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29weSgic3R1YnMvanNyMjM5LyIgKyBmbmFtZSArICIuY3BwIiwgY1N0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBuYXRpdmUgZnVuY3Rpb24gbmFtZXMKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBpbXByb3ZlZCB0byByZXF1aXJlIGZld2VyIGRpc2NyZXRlIGZpbGVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gInN0dWJzL2pzcjIzOS8iICsgZm5hbWUgKyAiLm5hdGl2ZVJlZyI7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmZ1bmM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChuZnVuYyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5hZGROYXRpdmVSZWdpc3RyYXRpb24obmZ1bmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW1pdHRlci5zZXRWZXJzaW9uKHZlcnNpb24sIGV4dCwgcGFjayk7Ci0gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0Q29kZShjZnVuYywgcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzUGF0aE5hbWUgPSAiY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbCI7Ci0gICAgICAgIGJvb2xlYW4gdXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOwotCi0gICAgICAgIGludCBhaWR4ID0gMDsKLSAgICAgICAgd2hpbGUgKGFyZ3NbYWlkeF0uY2hhckF0KDApID09ICctJykgewotICAgICAgICAgICAgc3dpdGNoIChhcmdzW2FpZHhdLmNoYXJBdCgxKSkgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVua25vd24gZmxhZzogIiArIGFyZ3NbYWlkeF0pOwotICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhaWR4Kys7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVzZUNvbnRleHRQb2ludGVyID0gIiArIHVzZUNvbnRleHRQb2ludGVyKTsKLQotICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTBSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTBFeHRSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFFeHRSZWFkZXIgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFFeHRQYWNrUmVhZGVyID0KLSAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgY2hlY2tzUmVhZGVyID0KLSAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsKLQotICAgICAgICBTdHJpbmcgZ2wxMEZpbGVuYW1lID0gImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSI7Ci0gICAgICAgIFN0cmluZyBnbDEwRXh0RmlsZW5hbWUgPQotICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSI7Ci0gICAgICAgIFN0cmluZyBnbDExRmlsZW5hbWUgPSAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIjsKLSAgICAgICAgU3RyaW5nIGdsMTFFeHRGaWxlbmFtZSA9Ci0gICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIjsKLSAgICAgICAgU3RyaW5nIGdsMTFFeHRQYWNrRmlsZW5hbWUgPQotICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEiOwotICAgICAgICBTdHJpbmcgZ2xJbXBsRmlsZW5hbWUgPSAiY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIjsKLSAgICAgICAgU3RyaW5nIGNGaWxlbmFtZSA9ICJjb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCI7Ci0KLSAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMFN0cmVhbSA9Ci0gICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMEZpbGVuYW1lKSk7Ci0gICAgICAgIFByaW50U3RyZWFtIGdsMTBFeHRTdHJlYW0gPQotICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTBFeHRGaWxlbmFtZSkpOwotICAgICAgICBQcmludFN0cmVhbSBnbDExU3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRmlsZW5hbWUpKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMUV4dFN0cmVhbSA9Ci0gICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2wxMUV4dEZpbGVuYW1lKSk7Ci0gICAgICAgIFByaW50U3RyZWFtIGdsMTFFeHRQYWNrU3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRXh0UGFja0ZpbGVuYW1lKSk7Ci0gICAgICAgIFByaW50U3RyZWFtIGdsSW1wbFN0cmVhbSA9Ci0gICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgZ2xJbXBsRmlsZW5hbWUpKTsKLSAgICAgICAgUHJpbnRTdHJlYW0gY1N0cmVhbSA9Ci0gICAgICAgICAgICBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oIm91dC8iICsgY0ZpbGVuYW1lKSk7Ci0KLSAgICAgICAgUGFyYW1ldGVyQ2hlY2tlciBjaGVja2VyID0gbmV3IFBhcmFtZXRlckNoZWNrZXIoY2hlY2tzUmVhZGVyKTsKLQotICAgICAgICBDb2RlRW1pdHRlciBlbWl0dGVyID0KLSAgICAgICAgICAgIG5ldyBKc3IyMzlDb2RlRW1pdHRlcihjbGFzc1BhdGhOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2wxMFN0cmVhbSwgZ2wxMEV4dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbDExU3RyZWFtLCBnbDExRXh0U3RyZWFtLCBnbDExRXh0UGFja1N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbEltcGxTdHJlYW0sIGNTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlQ29udGV4dFBvaW50ZXIpOwotCi0gICAgICAgIGdsMTBTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDEwRmlsZW5hbWUpOwotICAgICAgICBnbDEwRXh0U3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMEV4dEZpbGVuYW1lKTsKLSAgICAgICAgZ2wxMVN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTFGaWxlbmFtZSk7Ci0gICAgICAgIGdsMTFFeHRTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDExRXh0RmlsZW5hbWUpOwotICAgICAgICBnbDExRXh0UGFja1N0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArCi0gICAgICAgICAgICBnbDExRXh0UGFja0ZpbGVuYW1lKTsKLSAgICAgICAgZ2xJbXBsU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2xJbXBsRmlsZW5hbWUpOwotICAgICAgICBjU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2xpYnMvYW5kcm9pZF9ydW50aW1lLyIgKyBjRmlsZW5hbWUpOwotCi0gICAgICAgIGNvcHkoInN0dWJzL2pzcjIzOS9HTDEwSGVhZGVyLmphdmEtaWYiLCBnbDEwU3RyZWFtKTsKLSAgICAgICAgY29weSgic3R1YnMvanNyMjM5L0dMMTBFeHRIZWFkZXIuamF2YS1pZiIsIGdsMTBFeHRTdHJlYW0pOwotICAgICAgICBjb3B5KCJzdHVicy9qc3IyMzkvR0wxMUhlYWRlci5qYXZhLWlmIiwgZ2wxMVN0cmVhbSk7Ci0gICAgICAgIGNvcHkoInN0dWJzL2pzcjIzOS9HTDExRXh0SGVhZGVyLmphdmEtaWYiLCBnbDExRXh0U3RyZWFtKTsKLSAgICAgICAgY29weSgic3R1YnMvanNyMjM5L0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYiLCBnbDExRXh0UGFja1N0cmVhbSk7Ci0gICAgICAgIGNvcHkoInN0dWJzL2pzcjIzOS9HTEltcGxIZWFkZXIuamF2YS1pbXBsIiwgZ2xJbXBsU3RyZWFtKTsKLSAgICAgICAgY29weSgic3R1YnMvanNyMjM5L0dMQ0hlYWRlci5jcHAiLCBjU3RyZWFtKTsKLQotICAgICAgICBlbWl0KDAsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTBSZWFkZXIsIGdsMTBTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7Ci0gICAgICAgIGVtaXQoMCwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgZW1pdHRlciwgc3BlYzEwRXh0UmVhZGVyLCBnbDEwRXh0U3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOwotICAgICAgICBlbWl0KDEsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFSZWFkZXIsIGdsMTFTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7Ci0gICAgICAgIGVtaXQoMSwgdHJ1ZSwgZmFsc2UsCi0gICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExRXh0UmVhZGVyLCBnbDExRXh0U3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOwotICAgICAgICBlbWl0KDEsIHRydWUsIHRydWUsCi0gICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExRXh0UGFja1JlYWRlciwgZ2wxMUV4dFBhY2tTdHJlYW0sIGdsSW1wbFN0cmVhbSwKLSAgICAgICAgICAgICBjU3RyZWFtKTsKLQotICAgICAgICBlbWl0dGVyLmVtaXROYXRpdmVSZWdpc3RyYXRpb24oKTsKLQotICAgICAgICBnbDEwU3RyZWFtLnByaW50bG4oIn0iKTsKLSAgICAgICAgZ2wxMEV4dFN0cmVhbS5wcmludGxuKCJ9Iik7Ci0gICAgICAgIGdsMTFTdHJlYW0ucHJpbnRsbigifSIpOwotICAgICAgICBnbDExRXh0U3RyZWFtLnByaW50bG4oIn0iKTsKLSAgICAgICAgZ2wxMUV4dFBhY2tTdHJlYW0ucHJpbnRsbigifSIpOwotICAgICAgICBnbEltcGxTdHJlYW0ucHJpbnRsbigifSIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTEVTLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0xFUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY4OTU3Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvR2VuZXJhdGVHTEVTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotcHVibGljIGNsYXNzIEdlbmVyYXRlR0xFUyB7Ci0KLSAgICBzdGF0aWMgdm9pZCBjb3B5KFN0cmluZyBmaWxlbmFtZSwgUHJpbnRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlbmFtZSkpOwotICAgICAgICBTdHJpbmcgczsKLSAgICAgICAgd2hpbGUgKChzID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgb3V0LnByaW50bG4ocyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVtaXQoR0xFU0NvZGVFbWl0dGVyIGVtaXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWNSZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGdsU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHMgPSBudWxsOwotICAgICAgICB3aGlsZSAoKHMgPSBzcGVjUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChzLnRyaW0oKS5zdGFydHNXaXRoKCIvLyIpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENGdW5jIGNmdW5jID0gQ0Z1bmMucGFyc2VDRnVuYyhzKTsKLQotICAgICAgICAgICAgU3RyaW5nIGZuYW1lID0gY2Z1bmMuZ2V0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIHN0dWJSb290ID0gInN0dWJzL2dsZXMxMS8iICsgZm5hbWU7Ci0gICAgICAgICAgICBTdHJpbmcgamF2YVBhdGggPSBzdHViUm9vdCArICIuamF2YSI7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShqYXZhUGF0aCk7Ci0gICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3BlY2lhbC1jYXNpbmcgZnVuY3Rpb24gIiArIGZuYW1lKTsKLSAgICAgICAgICAgICAgICBjb3B5KGphdmFQYXRoLCBnbFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29weShzdHViUm9vdCArICIuY3BwIiwgY1N0cmVhbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBuYXRpdmUgZnVuY3Rpb24gbmFtZXMKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBpbXByb3ZlZCB0byByZXF1aXJlIGZld2VyIGRpc2NyZXRlIGZpbGVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gc3R1YlJvb3QgKyAiLm5hdGl2ZVJlZyI7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmZ1bmM7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChuZnVuYyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5hZGROYXRpdmVSZWdpc3RyYXRpb24obmZ1bmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0Q29kZShjZnVuYywgcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGFpZHggPSAwOwotICAgICAgICB3aGlsZSAoKGFpZHggPCBhcmdzLmxlbmd0aCkgJiYgKGFyZ3NbYWlkeF0uY2hhckF0KDApID09ICctJykpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoYXJnc1thaWR4XS5jaGFyQXQoMSkpIHsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVbmtub3duIGZsYWc6ICIgKyBhcmdzW2FpZHhdKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWlkeCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgY2hlY2tzUmVhZGVyID0KLSAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcigic3BlY3MvZ2xlczExL2NoZWNrcy5zcGVjIikpOwotICAgICAgICBQYXJhbWV0ZXJDaGVja2VyIGNoZWNrZXIgPSBuZXcgUGFyYW1ldGVyQ2hlY2tlcihjaGVja3NSZWFkZXIpOwotCi0gICAgICAgIC8vIEdlbmVyYXRlIGZpbGVzCi0gICAgICAgIGZvcihTdHJpbmcgc3VmZml4OiBuZXcgU3RyaW5nW10geyJHTEVTMTAiLCAiR0xFUzEwRXh0IiwKLSAgICAgICAgICAgICAgICAiR0xFUzExIiwgIkdMRVMxMUV4dCIsICJHTEVTMjAifSkKLSAgICAgICAgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExUmVhZGVyID0KLSAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoInNwZWNzL2dsZXMxMS8iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHN1ZmZpeCArICIuc3BlYyIpKTsKLSAgICAgICAgICAgIFN0cmluZyBnbDExRmlsZW5hbWUgPSAiYW5kcm9pZC9vcGVuZ2wvIiArIHN1ZmZpeCArICIuamF2YSI7Ci0gICAgICAgICAgICBTdHJpbmcgZ2wxMWNGaWxlbmFtZSA9ICJhbmRyb2lkX29wZW5nbF8iICsgc3VmZml4ICsgIi5jcHAiOwotICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMVN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFGaWxlbmFtZSkpOwotICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMWNTdHJlYW0gPQotICAgICAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExY0ZpbGVuYW1lKSk7Ci0gICAgICAgICAgICBnbDExU3RyZWFtLnByaW50bG4oIi8qIik7Ci0gICAgICAgICAgICBnbDExY1N0cmVhbS5wcmludGxuKCIvKiIpOwotICAgICAgICAgICAgY29weSgic3R1YnMvZ2xlczExLyIgKyBzdWZmaXggKyAiSGVhZGVyLmphdmEtaWYiLCBnbDExU3RyZWFtKTsKLSAgICAgICAgICAgIGNvcHkoInN0dWJzL2dsZXMxMS8iICsgc3VmZml4ICsgImNIZWFkZXIuY3BwIiwgZ2wxMWNTdHJlYW0pOwotICAgICAgICAgICAgR0xFU0NvZGVFbWl0dGVyIGVtaXR0ZXIgPSBuZXcgR0xFU0NvZGVFbWl0dGVyKAotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC9vcGVuZ2wvIiArIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlciwgZ2wxMVN0cmVhbSwgZ2wxMWNTdHJlYW0pOwotICAgICAgICAgICAgZW1pdChlbWl0dGVyLCBzcGVjMTFSZWFkZXIsIGdsMTFTdHJlYW0sIGdsMTFjU3RyZWFtKTsKLSAgICAgICAgICAgIGVtaXR0ZXIuZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigicmVnaXN0ZXJfYW5kcm9pZF9vcGVuZ2xfam5pXyIKLSAgICAgICAgICAgICAgICAgICAgKyBzdWZmaXgpOwotICAgICAgICAgICAgZ2wxMVN0cmVhbS5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgICBnbDExU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICBnbDExY1N0cmVhbS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2Q3M2I2Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSkZ1bmMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKRnVuYyB7Ci0KLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gImNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaS5HTDExSW1wbCI7Ci0KLSAgICBDRnVuYyBjZnVuYzsKLSAgICBKVHlwZSBmdHlwZTsKLSAgICBTdHJpbmcgZm5hbWU7Ci0KLSAgICBMaXN0PFN0cmluZz4gYXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBMaXN0PEpUeXBlPiBhcmdUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SlR5cGU+KCk7Ci0gICAgTGlzdDxJbnRlZ2VyPiBhcmdDSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQotICAgIGJvb2xlYW4gaGFzQnVmZmVyQXJnID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBoYXNUeXBlZEJ1ZmZlckFyZyA9IGZhbHNlOwotICAgIEFycmF5TGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICBwdWJsaWMgSkZ1bmMoQ0Z1bmMgY2Z1bmMpIHsKLSAgICAgICAgdGhpcy5jZnVuYyA9IGNmdW5jOwotICAgIH0KLQotICAgIHB1YmxpYyBDRnVuYyBnZXRDRnVuYygpIHsKLSAgICAgICAgcmV0dXJuIGNmdW5jOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7Ci0gICAgICAgIHRoaXMuZm5hbWUgPSBmbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmbmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKEpUeXBlIGZ0eXBlKSB7Ci0gICAgICAgIHRoaXMuZnR5cGUgPSBmdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlR5cGUgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGZ0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0J1ZmZlckFyZygpIHsKLSAgICAgICAgcmV0dXJuIGhhc0J1ZmZlckFyZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNUeXBlZEJ1ZmZlckFyZygpIHsKLSAgICAgICAgcmV0dXJuIGhhc1R5cGVkQnVmZmVyQXJnOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVmZmVyQXJnTmFtZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlckFyZ05hbWVzLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ05hbWUsIEpUeXBlIGFyZ1R5cGUsIGludCBjaW5kZXgpIHsKLSAgICAgICAgYXJnTmFtZXMuYWRkKGFyZ05hbWUpOwotICAgICAgICBhcmdUeXBlcy5hZGQoYXJnVHlwZSk7Ci0gICAgICAgIGFyZ0NJbmRpY2VzLmFkZChuZXcgSW50ZWdlcihjaW5kZXgpKTsKLQotICAgICAgICBpZiAoYXJnVHlwZS5pc0J1ZmZlcigpKSB7Ci0gICAgICAgICAgICBoYXNCdWZmZXJBcmcgPSB0cnVlOwotICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdUeXBlLmlzVHlwZWRCdWZmZXIoKSkgewotICAgICAgICAgICAgaGFzVHlwZWRCdWZmZXJBcmcgPSB0cnVlOwotICAgICAgICAgICAgYnVmZmVyQXJnTmFtZXMuYWRkKGFyZ05hbWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXROdW1BcmdzKCkgewotICAgICAgICByZXR1cm4gYXJnTmFtZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QXJnSW5kZXgoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgaW50IGxlbiA9IGFyZ05hbWVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFyZ05hbWVzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmdOYW1lKGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gYXJnTmFtZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlR5cGUgZ2V0QXJnVHlwZShpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGFyZ1R5cGVzLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRBcmdDSW5kZXgoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBhcmdDSW5kaWNlcy5nZXQoaW5kZXgpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBKRnVuYyBjb252ZXJ0KENGdW5jIGNmdW5jLCBib29sZWFuIHVzZUFycmF5KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKRnVuYyBqZnVuYyA9IG5ldyBKRnVuYyhjZnVuYyk7Ci0gICAgICAgICAgICBqZnVuYy5zZXROYW1lKGNmdW5jLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBqZnVuYy5zZXRUeXBlKEpUeXBlLmNvbnZlcnQoY2Z1bmMuZ2V0VHlwZSgpLCBmYWxzZSkpOwotCi0gICAgICAgICAgICBpbnQgbnVtQXJncyA9IGNmdW5jLmdldE51bUFyZ3MoKTsKLSAgICAgICAgICAgIGludCBudW1PZmZzZXRzID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQ1R5cGUgY0FyZ1R5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGkpOwotICAgICAgICAgICAgICAgIGlmIChjQXJnVHlwZS5pc1R5cGVkUG9pbnRlcigpICYmIHVzZUFycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICsrbnVtT2Zmc2V0czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNBcmdOYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShpKTsKLSAgICAgICAgICAgICAgICBDVHlwZSBjQXJnVHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoaSk7Ci0KLSAgICAgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudChjQXJnTmFtZSwgSlR5cGUuY29udmVydChjQXJnVHlwZSwgdXNlQXJyYXkpLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoY0FyZ1R5cGUuaXNUeXBlZFBvaW50ZXIoKSAmJiB1c2VBcnJheSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobnVtT2Zmc2V0cyA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KGNBcmdOYW1lICsgIk9mZnNldCIsIG5ldyBKVHlwZSgiaW50IiksIGkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoIm9mZnNldCIsIG5ldyBKVHlwZSgiaW50IiksIGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gamZ1bmM7Ci0gICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGYWlsZWQgdG8gY29udmVydCBmdW5jdGlvbiAiICsgY2Z1bmMpOwotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyBzID0gICJGdW5jdGlvbiAiICsgZm5hbWUgKyAiIHJldHVybnMgIiArIGZ0eXBlICsgIjogIjsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdOYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcyArPSAiLCAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyArPSBhcmdUeXBlcy5nZXQoaSkgKyAiICIgKyBhcmdOYW1lcy5nZXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYjJmMDEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBKVHlwZSB7Ci0KLSAgICBTdHJpbmcgYmFzZVR5cGU7Ci0gICAgYm9vbGVhbiBpc0FycmF5OwotICAgIGJvb2xlYW4gaXNDbGFzczsKLSAgICBib29sZWFuIGlzU3RyaW5nOwotCi0gICAgc3RhdGljIEhhc2hNYXA8Q1R5cGUsSlR5cGU+IHR5cGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8Q1R5cGUsSlR5cGU+KCk7Ci0gICAgc3RhdGljIEhhc2hNYXA8Q1R5cGUsSlR5cGU+IGFycmF5VHlwZU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDVHlwZSxKVHlwZT4oKTsKLQotICAgIHN0YXRpYyB7Ci0gICAgLy8gUHJpbWl0aXZlIHR5cGVzCi0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xiaXRmaWVsZCIpLCBuZXcgSlR5cGUoImludCIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iKSwgbmV3IEpUeXBlKCJib29sZWFuIikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMY2xhbXBmIiksIG5ldyBKVHlwZSgiZmxvYXQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xjbGFtcHgiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlbnVtIiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiKSwgbmV3IEpUeXBlKCJmbG9hdCIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50cHRyIiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiKSwgbmV3IEpUeXBlKCJzaG9ydCIpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpIiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWlwdHIiKSwgbmV3IEpUeXBlKCJpbnQiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1Ynl0ZSIpLCBuZXcgSlR5cGUoImJ5dGUiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiksIG5ldyBKVHlwZSgiaW50IikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoInZvaWQiKSwgbmV3IEpUeXBlKCJ2b2lkIikpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWJ5dGUiLCB0cnVlLCB0cnVlKSwgbmV3IEpUeXBlKCJTdHJpbmciLCBmYWxzZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJjaGFyIiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImJ5dGUiKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiY2hhciIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoIlN0cmluZyIsIGZhbHNlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoImludCIpLCBuZXcgSlR5cGUoImludCIpKTsKLQotICAgIC8vIFVudHlwZWQgcG9pbnRlcnMgbWFwIHRvIHVudHlwZWQgQnVmZmVycwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIHRydWUsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdm9pZCIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJ2b2lkIiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZWdsSW1hZ2VPRVMiLCBmYWxzZSwgZmFsc2UpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotCi0gICAgLy8gVHlwZWQgcG9pbnRlcnMgbWFwIHRvIHR5cGVkIEJ1ZmZlcnMKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlbnVtIiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIHRydWUsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkZsb2F0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZsb2F0IiwgdHJ1ZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkZsb2F0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIGZhbHNlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICB0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIHRydWUsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWkiLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7Ci0gICAgdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIHRydWUsIHRydWUpLAotICAgICAgICAgICAgbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotICAgIHR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2hvcnQiLCB0cnVlLCB0cnVlKSwKLSAgICAgICAgICAgIG5ldyBKVHlwZSgiamF2YS5uaW8uU2hvcnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOwotCi0gICAgLy8gVHlwZWQgcG9pbnRlcnMgbWFwIHRvIGFycmF5cyArIG9mZnNldHMKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoImNoYXIiLCBmYWxzZSwgdHJ1ZSksCi0gICAgICAgICAgICBuZXcgSlR5cGUoImJ5dGUiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xib29sZWFuIiwgZmFsc2UsIHRydWUpLAotICAgICAgICAgICAgICAgICBuZXcgSlR5cGUoImJvb2xlYW4iLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xlbnVtIiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiZmxvYXQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImZsb2F0IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNob3J0IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgic2hvcnQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaSIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOwotICAgIGFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xzaXplaSIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiLCBmYWxzZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICBhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludHB0ciIpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7Ci0gICAgYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNpemVpcHRyIiksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlR5cGUoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEpUeXBlKFN0cmluZyBwcmltaXRpdmVUeXBlTmFtZSkgewotICAgIHRoaXMuYmFzZVR5cGUgPSBwcmltaXRpdmVUeXBlTmFtZTsKLSAgICB0aGlzLmlzQ2xhc3MgPSBmYWxzZTsKLSAgICB0aGlzLmlzQXJyYXkgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSlR5cGUoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lLCBib29sZWFuIGlzQ2xhc3MsIGJvb2xlYW4gaXNBcnJheSkgewotICAgIHRoaXMuYmFzZVR5cGUgPSBwcmltaXRpdmVUeXBlTmFtZTsKLSAgICB0aGlzLmlzQ2xhc3MgPSBpc0NsYXNzOwotICAgIHRoaXMuaXNBcnJheSA9IGlzQXJyYXk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRCYXNlVHlwZSgpIHsKLSAgICByZXR1cm4gYmFzZVR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gYmFzZVR5cGUgKyAoaXNBcnJheSA/ICJbXSIgOiAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLSAgICByZXR1cm4gaXNBcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NsYXNzKCkgewotICAgIHJldHVybiBpc0NsYXNzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gYmFzZVR5cGUuZXF1YWxzKCJTdHJpbmciKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZSgpIHsKLSAgICByZXR1cm4gIWlzQ2xhc3MoKSAmJiAhaXNBcnJheSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVm9pZCgpIHsKLSAgICByZXR1cm4gYmFzZVR5cGUuZXF1YWxzKCJ2b2lkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNCdWZmZXIoKSB7Ci0gICAgcmV0dXJuIGJhc2VUeXBlLmluZGV4T2YoIkJ1ZmZlciIpICE9IC0xOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVHlwZWRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuICFiYXNlVHlwZS5lcXVhbHMoImphdmEubmlvLkJ1ZmZlciIpICYmCi0gICAgICAgIChiYXNlVHlwZS5pbmRleE9mKCJCdWZmZXIiKSAhPSAtMSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBKVHlwZSBjb252ZXJ0KENUeXBlIGN0eXBlLCBib29sZWFuIHVzZUFycmF5KSB7Ci0gICAgIEpUeXBlIGphdmFUeXBlID0gbnVsbDsKLSAgICAgaWYgKHVzZUFycmF5KSB7Ci0gICAgICAgICBqYXZhVHlwZSA9IGFycmF5VHlwZU1hcHBpbmcuZ2V0KGN0eXBlKTsKLSAgICAgfQotICAgICBpZiAoamF2YVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgamF2YVR5cGUgPSB0eXBlTWFwcGluZy5nZXQoY3R5cGUpOwotICAgICB9Ci0gICAgIGlmIChqYXZhVHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgQyB0eXBlOiAiICsgY3R5cGUpOwotICAgICB9Ci0gICAgIHJldHVybiBqYXZhVHlwZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYTJiNzQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KbmlDb2RlRW1pdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKbmlDb2RlRW1pdHRlciB7Ci0KLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBtVXNlQ1BsdXNQbHVzID0gdHJ1ZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVXNlQ29udGV4dFBvaW50ZXIgPSB0cnVlOwotICAgIHByb3RlY3RlZCBib29sZWFuIG1Vc2VTdGF0aWNNZXRob2RzID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBtQ2xhc3NQYXRoTmFtZTsKLSAgICBwcm90ZWN0ZWQgUGFyYW1ldGVyQ2hlY2tlciBtQ2hlY2tlcjsKLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IG5hdGl2ZVJlZ2lzdHJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBib29sZWFuIG5lZWRzRXhpdDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBpbmRlbnQgPSAiICAgICI7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1GdW5jdGlvbnNFbWl0dGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sm5pTmFtZShKVHlwZSBqVHlwZSkgewotICAgICAgICBTdHJpbmcgam5pTmFtZSA9ICIiOwotICAgICAgICBpZiAoalR5cGUuaXNDbGFzcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkwiICsgalR5cGUuZ2V0QmFzZVR5cGUoKSArICI7IjsKLSAgICAgICAgfSBlbHNlIGlmIChqVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgIGpuaU5hbWUgPSAiWyI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBqVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZVR5cGUuZXF1YWxzKCJpbnQiKSkgewotICAgICAgICAgICAgam5pTmFtZSArPSAiSSI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJmbG9hdCIpKSB7Ci0gICAgICAgICAgICBqbmlOYW1lICs9ICJGIjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImJvb2xlYW4iKSkgewotICAgICAgICAgICAgam5pTmFtZSArPSAiWiI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJzaG9ydCIpKSB7Ci0gICAgICAgICAgICBqbmlOYW1lICs9ICJTIjsKLSAgICAgICAgfSBlbHNlIGlmIChiYXNlVHlwZS5lcXVhbHMoImxvbmciKSkgewotICAgICAgICAgICAgam5pTmFtZSArPSAiTCI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJieXRlIikpIHsKLSAgICAgICAgICAgIGpuaU5hbWUgKz0gIkIiOwotICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiU3RyaW5nIikpIHsKLSAgICAgICAgICAgIGpuaU5hbWUgKz0gIkxqYXZhL2xhbmcvU3RyaW5nOyI7Ci0gICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJ2b2lkIikpIHsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcuCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBwcmltaXRpdmUgYmFzZXR5cGUgIiArIGJhc2VUeXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gam5pTmFtZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXRDb2RlKENGdW5jIGNmdW5jLCBTdHJpbmcgb3JpZ2luYWwsCi0gICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhSW50ZXJmYWNlU3RyZWFtLAotICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YUltcGxTdHJlYW0sCi0gICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB7Ci0gICAgICAgIEpGdW5jIGpmdW5jOwotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlOwotICAgICAgICBib29sZWFuIGR1cGxpY2F0ZTsKLQotICAgICAgICBpZiAoY2Z1bmMuaGFzVHlwZWRQb2ludGVyQXJnKCkpIHsKLSAgICAgICAgICAgIGpmdW5jID0gSkZ1bmMuY29udmVydChjZnVuYywgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGVtaXQgZHVwbGljYXRlIGZ1bmN0aW9ucwotICAgICAgICAgICAgLy8gVGhlc2UgbWF5IGFwcGVhciBiZWNhdXNlIHRoZXkgYXJlIGRlZmluZWQgaW4gbXVsdGlwbGUKLSAgICAgICAgICAgIC8vIEphdmEgaW50ZXJmYWNlcyAoZS5nLiwgR0wxMS9HTDExRXh0ZW5zaW9uUGFjaykKLSAgICAgICAgICAgIHNpZ25hdHVyZSA9IGpmdW5jLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBkdXBsaWNhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtRnVuY3Rpb25zRW1pdHRlZC5jb250YWlucyhzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZ1bmN0aW9uc0VtaXR0ZWQuYWRkKHNpZ25hdHVyZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZHVwbGljYXRlKSB7Ci0gICAgICAgICAgICAgICAgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKGpmdW5jLCBqYXZhSW1wbFN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBqYXZhSW1wbFN0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoamF2YUludGVyZmFjZVN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBqYXZhSW50ZXJmYWNlU3RyZWFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZHVwbGljYXRlKSB7Ci0gICAgICAgICAgICAgICAgZW1pdEpuaUNvZGUoamZ1bmMsIGNTdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgamZ1bmMgPSBKRnVuYy5jb252ZXJ0KGNmdW5jLCBmYWxzZSk7Ci0KLSAgICAgICAgc2lnbmF0dXJlID0gamZ1bmMudG9TdHJpbmcoKTsKLSAgICAgICAgZHVwbGljYXRlID0gZmFsc2U7Ci0gICAgICAgIGlmIChtRnVuY3Rpb25zRW1pdHRlZC5jb250YWlucyhzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICBkdXBsaWNhdGUgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZ1bmN0aW9uc0VtaXR0ZWQuYWRkKHNpZ25hdHVyZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgewotICAgICAgICAgICAgZW1pdE5hdGl2ZURlY2xhcmF0aW9uKGpmdW5jLCBqYXZhSW1wbFN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGphdmFJbnRlcmZhY2VTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgZW1pdEphdmFJbnRlcmZhY2VDb2RlKGpmdW5jLCBqYXZhSW50ZXJmYWNlU3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgewotICAgICAgICAgICAgZW1pdEphdmFDb2RlKGpmdW5jLCBqYXZhSW1wbFN0cmVhbSk7Ci0gICAgICAgICAgICBlbWl0Sm5pQ29kZShqZnVuYywgY1N0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlRGVjbGFyYXRpb24oSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBvdXQucHJpbnRsbigiICAgIC8vIEMgZnVuY3Rpb24gIiArIGpmdW5jLmdldENGdW5jKCkuZ2V0T3JpZ2luYWwoKSk7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0SmF2YUludGVyZmFjZUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgewotICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgZmFsc2UsIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXRKYXZhQ29kZShKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7Ci0gICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyhKRnVuYyBqZnVuYykgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGpmdW5jLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIChuYW1lLmVuZHNXaXRoKCJQb2ludGVyIikgfHwgbmFtZS5lbmRzV2l0aCgiUG9pbnRlck9FUyIpKQotICAgICAgICAgICAgJiYgamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7Ci0gICAgfQotCi0gICAgdm9pZCBlbWl0RnVuY3Rpb25DYWxsKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQsIFN0cmluZyBpaWksIGJvb2xlYW4gZ3JhYkFycmF5KSB7Ci0gICAgICAgIGJvb2xlYW4gaXNWb2lkID0gamZ1bmMuZ2V0VHlwZSgpLmlzVm9pZCgpOwotICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBpc1BvaW50ZXJGdW5jKGpmdW5jKTsKLQotICAgICAgICBpZiAoIWlzVm9pZCkgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgX3JldHVyblZhbHVlOyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKGlpaSArCi0gICAgICAgICAgICAgICAgICAgIChpc1ZvaWQgPyAiIiA6ICJfcmV0dXJuVmFsdWUgPSAiKSArCi0gICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIiApICsKLSAgICAgICAgICAgICAgICAgICAgIigiKTsKLQotICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gamZ1bmMuZ2V0QXJnTmFtZShpKTsKLSAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOwotCi0gICAgICAgICAgICBpZiAoZ3JhYkFycmF5ICYmIGFyZ1R5cGUuaXNUeXBlZEJ1ZmZlcigpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXJnVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc3Vic3RyaW5nKDksIHR5cGVOYW1lLmxlbmd0aCgpIC0gNik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdldCIgKyB0eXBlTmFtZSArICJBcnJheSgiICsgYXJnTmFtZSArICIpLCIpOwotICAgICAgICAgICAgICAgIG91dC5wcmludChpaWkgKyBpbmRlbnQgKyAiZ2V0T2Zmc2V0KCIgKyBhcmdOYW1lICsgIikiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50KGlpaSArIGluZGVudCArIGFyZ05hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyBhcmdOYW1lICsgIi5yZW1haW5pbmcoKSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIik7Iik7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLCBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKLSAgICAgICAgICAgIFN0cmluZyBpaWkpIHsKLSAgICAgICAgICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IiwgIl9yZW1haW5pbmciLCBpaWkpOwotICAgICAgICAgICAgfQotCi0gICAgdm9pZCBwcmludElmY2hlY2tQb3N0YW1ibGUoUHJpbnRTdHJlYW0gb3V0LCBib29sZWFuIGlzQnVmZmVyLCBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywKLSAgICAgICAgICAgIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIGRlZmF1bHQ6Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgX25lZWRlZCA9IDA7Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgYnJlYWs7Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLQotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoIiArIHJlbWFpbmluZyArICIgPCBfbmVlZGVkKSB7Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgKGlzQnVmZmVyID8gInJlbWFpbmluZygpIiA6ICJsZW5ndGggLSAiICsgb2Zmc2V0KSArICIgPCBuZWVkZWRcIik7Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdvdG8gZXhpdDsiKTsKLSAgICAgICAgICAgICAgICBuZWVkc0V4aXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICBib29sZWFuIGlzTnVsbEFsbG93ZWQoQ0Z1bmMgY2Z1bmMpIHsKLSAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7Ci0gICAgICAgIGludCBpbmRleCA9IDE7Ci0gICAgICAgIGlmIChjaGVja3MgIT0gbnVsbCkgewotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXF1aXJlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0RXJyb3JSZXR1cm5WYWx1ZShDRnVuYyBjZnVuYykgewotICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOwotICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7Ci0gICAgICAgIGlmIChpc1ZvaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tzW2luZGV4ICsgMV07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmVxdWlyZXMiKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiB1bmtub3duIGtleXdvcmQgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleF0gKyAiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkRnVuYyhDRnVuYyBjZnVuYykgewotICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJlcXVpcmVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgewotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZyBpc1JlcXVpcmVzRnVuYyhDRnVuYyBjZnVuYykgewotICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmVxdWlyZXMiKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tzW2luZGV4KzFdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLnN0YXJ0c1dpdGgoImNoZWNrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBjbmFtZSwgUHJpbnRTdHJlYW0gb3V0LAotICAgICAgICAgICAgYm9vbGVhbiBpc0J1ZmZlciwgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssIFN0cmluZyBvZmZzZXQsIFN0cmluZyByZW1haW5pbmcsIFN0cmluZyBpaWkpIHsKLQotICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKLQotICAgICAgICBib29sZWFuIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gMTsKLSAgICAgICAgaWYgKGNoZWNrcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFdhc0lmY2hlY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCBpaWkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RXYXNJZmNoZWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbmFtZSAhPSBudWxsICYmICFjbmFtZS5lcXVhbHMoY2hlY2tzW2luZGV4ICsgMV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgiICsgcmVtYWluaW5nICsgIiA8ICIgKyBjaGVja3NbaW5kZXggKyAyXSArICIpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBleGNlcHRpb25DbGFzc05hbWUgPSAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiI7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSAiY2hlY2siIGtleXdvcmQgd2FzIG9mIHRoZSBmb3JtCi0gICAgICAgICAgICAgICAgICAgIC8vICJjaGVja188Y2xhc3MgbmFtZT4iLCB1c2UgdGhlIGNsYXNzIG5hbWUgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KLSAgICAgICAgICAgICAgICAgICAgaW50IHVuZGVyc2NvcmUgPSBjaGVja3NbaW5kZXhdLmluZGV4T2YoJ18nKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVyc2NvcmUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFiYnIgPSBjaGVja3NbaW5kZXhdLnN1YnN0cmluZyh1bmRlcnNjb3JlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJici5lcXVhbHMoIkFJT09CRSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhc3NOYW1lID0gImphdmEvbGFuZy9BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5rbm93biBleGNlcHRpb24gYWJicmV2aWF0aW9uOiAiICsgYWJicik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImpuaVRocm93RXhjZXB0aW9uKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBleGNlcHRpb25DbGFzc05hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyAoaXNCdWZmZXIgPyAicmVtYWluaW5nKCkiIDogImxlbmd0aCAtICIgKyBvZmZzZXQpICsgIiA8ICIgKyBjaGVja3NbaW5kZXggKyAyXSArICJcIik7Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdvdG8gZXhpdDsiKTsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXRjaGVzID0gY2hlY2tzW2luZGV4ICsgNF0uc3BsaXQoIiwiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3RXYXNJZmNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaW50IF9uZWVkZWQ7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAic3dpdGNoICgiICsgY2hlY2tzW2luZGV4ICsgM10gKyAiKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIjaWYgZGVmaW5lZCgiICsgbWF0Y2hlc1tpXSArICIpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIGNhc2UgIiArIG1hdGNoZXNbaV0gKyAiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiNlbmRpZiAvLyBkZWZpbmVkKCIgKyBtYXRjaGVzW2ldICsgIikiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBfbmVlZGVkID0gIiArIGNoZWNrc1tpbmRleCArIDJdICsgIjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgICAgYnJlYWs7Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0lmY2hlY2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmVxdWlyZXMiKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKyBjaGVja3NbaW5kZXhdICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsYXN0V2FzSWZjaGVjaykgewotICAgICAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywgaWlpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gaGFzTm9uQ29uc3RBcmcoSkZ1bmMgamZ1bmMsIENGdW5jIGNmdW5jLCBMaXN0PEludGVnZXI+IG5vblByaW1pdGl2ZUFyZ3MpIHsKLSAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQnVmZmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbWl0IGEgZnVuY3Rpb24gaW4gc2V2ZXJhbCB2YXJpYW50czoKLSAgICAgKgotICAgICAqIGlmIG5hdGl2ZURlY2w6IHB1YmxpYyBuYXRpdmUgPHJldHVybnR5cGU+IGZ1bmMoYXJncyk7Ci0gICAgICoKLSAgICAgKiBpZiAhbmF0aXZlRGVjbDoKLSAgICAgKiAgIGlmIGludGVyZmFjZURlY2w6ICBwdWJsaWMgPHJldHVybnR5cGU+IGZ1bmMoYXJncyk7Ci0gICAgICogICBpZiAhaW50ZXJmYWNlRGVjbDogcHVibGljIDxyZXR1cm50eXBlPiBmdW5jKGFyZ3MpIHsgYm9keSB9Ci0gICAgICovCi0gICAgdm9pZCBlbWl0RnVuY3Rpb24oSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCwgYm9vbGVhbiBuYXRpdmVEZWNsLCBib29sZWFuIGludGVyZmFjZURlY2wpIHsKLSAgICAgICAgYm9vbGVhbiBpc1BvaW50ZXJGdW5jID0gaXNQb2ludGVyRnVuYyhqZnVuYyk7Ci0KLSAgICAgICAgaWYgKCFuYXRpdmVEZWNsICYmICFpbnRlcmZhY2VEZWNsICYmICFpc1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIHBvaW50ZXIgZnVuY3Rpb24sIHdlJ3ZlIGFscmVhZHkgZW1pdHRlZCBpdAotICAgICAgICAgICAgLy8gd2l0aCBuYXRpdmVEZWNsID09IHRydWUKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBtYXliZVN0YXRpYyA9IG1Vc2VTdGF0aWNNZXRob2RzID8gInN0YXRpYyAiIDogIiI7Ci0KLSAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJwcml2YXRlICIgKyBtYXliZVN0YXRpYyArIm5hdGl2ZSAiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ZXJmYWNlRGVjbCA/ICIiIDogInB1YmxpYyAiKSArIG1heWJlU3RhdGljKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRUeXBlKCkgKyAiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gIkJvdW5kcyIgOiAiIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgIigiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJwdWJsaWMgIiArIG1heWJlU3RhdGljICsibmF0aXZlICIgOgotICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRlcmZhY2VEZWNsID8gIiIgOiAicHVibGljICIpICsgbWF5YmVTdGF0aWMpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldFR5cGUoKSArICIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIigiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBqZnVuYy5nZXRBcmdOYW1lKGkpOwotICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7Ci0KLSAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyBpbmRlbnQgKyBhcmdUeXBlICsgIiAiICsgYXJnTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSBudW1BcmdzIC0gMSkgewotICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jICYmIG5hdGl2ZURlY2wpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgImludCByZW1haW5pbmciKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuYXRpdmVEZWNsIHx8IGludGVyZmFjZURlY2wpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpOyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIikgeyIpOwotCi0gICAgICAgICAgICBTdHJpbmcgaWlpID0gaW5kZW50ICsgaW5kZW50OwotCi0gICAgICAgICAgICAvLyBlbWl0Qm91bmRzQ2hlY2tzKGpmdW5jLCBvdXQsIGlpaSk7Ci0gICAgICAgICAgICBlbWl0RnVuY3Rpb25DYWxsKGpmdW5jLCBvdXQsIGlpaSwgZmFsc2UpOwotCi0gICAgICAgICAgICAvLyBTZXQgdGhlIHBvaW50ZXIgYWZ0ZXIgd2UgY2FsbCB0aGUgbmF0aXZlIGNvZGUsIHNvIHRoYXQgaWYKLSAgICAgICAgICAgIC8vIHRoZSBuYXRpdmUgY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdlIGRvbid0IG1vZGlmeSB0aGUKLSAgICAgICAgICAgIC8vIHBvaW50ZXIuIFdlIGFzc3VtZSB0aGF0IHRoZSBuYXRpdmUgY29kZSBpcyB3cml0dGVuIHNvIHRoYXQKLSAgICAgICAgICAgIC8vIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gdGhlIHVuZGVybHlpbmcgZ2xYWFhQb2ludGVyCi0gICAgICAgICAgICAvLyBmdW5jdGlvbiB3aWxsIG5vdCBoYXZlIGJlZW4gY2FsbGVkLgotCi0gICAgICAgICAgICBTdHJpbmcgZm5hbWUgPSBqZnVuYy5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBkZWFsIHdpdGggVkJPIHZhcmlhbnRzCi0gICAgICAgICAgICAgICAgaWYgKGZuYW1lLmVxdWFscygiZ2xDb2xvclBvaW50ZXIiKSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKChzaXplID09IDQpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9VTlNJR05FRF9CWVRFKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2NvbG9yUG9pbnRlciA9IHBvaW50ZXI7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsTm9ybWFsUG9pbnRlciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9ub3JtYWxQb2ludGVyID0gcG9pbnRlcjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xUZXhDb29yZFBvaW50ZXIiKSkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCgoc2l6ZSA9PSAyKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSAzKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSA0KSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX3RleENvb3JkUG9pbnRlciA9IHBvaW50ZXI7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsVmVydGV4UG9pbnRlciIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfdmVydGV4UG9pbnRlciA9IHBvaW50ZXI7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsUG9pbnRTaXplUG9pbnRlck9FUyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX3BvaW50U2l6ZVBvaW50ZXJPRVMgPSBwb2ludGVyOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbE1hdHJpeEluZGV4UG9pbnRlck9FUyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJpZiAoKChzaXplID09IDIpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDMpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgIChzaXplID09IDQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfbWF0cml4SW5kZXhQb2ludGVyT0VTID0gcG9pbnRlcjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZuYW1lLmVxdWFscygiZ2xXZWlnaHRQb2ludGVyIikpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl93ZWlnaHRQb2ludGVyT0VTID0gcG9pbnRlcjsiKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gamZ1bmMuZ2V0VHlwZSgpLmlzVm9pZCgpOwotCi0gICAgICAgICAgICBpZiAoIWlzVm9pZCkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJyZXR1cm4gX3JldHVyblZhbHVlOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgcykgewotICAgICAgICBuYXRpdmVSZWdpc3RyYXRpb25zLmFkZChzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyByZWdpc3RyYXRpb25GdW5jdGlvbk5hbWUsCi0gICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtKSB7Ci0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigic3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzUGF0aE5hbWUgPSBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbUNsYXNzUGF0aE5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlwiOyIpOwotICAgICAgICBjU3RyZWFtLnByaW50bG4oKTsKLQotICAgICAgICBjU3RyZWFtLnByaW50bG4oInN0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kc1tdID0geyIpOwotCi0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigie1wiX25hdGl2ZUNsYXNzSW5pdFwiLCBcIigpVlwiLCAodm9pZCopbmF0aXZlQ2xhc3NJbml0IH0sIik7Ci0KLSAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpID0gbmF0aXZlUmVnaXN0cmF0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGNTdHJlYW0ucHJpbnRsbihpLm5leHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjU3RyZWFtLnByaW50bG4oIn07Iik7Ci0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigpOwotCi0KLSAgICAgICAgY1N0cmVhbS5wcmludGxuKCJpbnQgIiArIHJlZ2lzdHJhdGlvbkZ1bmN0aW9uTmFtZSArICIoSk5JRW52ICpfZW52KSIpOwotICAgICAgICBjU3RyZWFtLnByaW50bG4oInsiKTsKLSAgICAgICAgY1N0cmVhbS5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiaW50IGVycjsiKTsKLQotICAgICAgICBjU3RyZWFtLnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJlcnIgPSBhbmRyb2lkOjpBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKF9lbnYsIGNsYXNzUGF0aE5hbWUsIG1ldGhvZHMsIE5FTEVNKG1ldGhvZHMpKTsiKTsKLQotICAgICAgICBjU3RyZWFtLnByaW50bG4oaW5kZW50ICsgInJldHVybiBlcnI7Iik7Ci0gICAgICAgIGNTdHJlYW0ucHJpbnRsbigifSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBKbmlDb2RlRW1pdHRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0Sm5pVHlwZShKVHlwZSBqVHlwZSkgewotICAgICAgICBpZiAoalR5cGUuaXNWb2lkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAidm9pZCI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBqVHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoalR5cGUuaXNQcmltaXRpdmUoKSkgewotICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmVxdWFscygiU3RyaW5nIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gImpzdHJpbmciOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gImoiICsgYmFzZVR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoalR5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gImoiICsgYmFzZVR5cGUgKyAiQXJyYXkiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICJqb2JqZWN0IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyBnZXRKbmlNYW5nbGVkTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCJfIiwgIl8xIik7Ci0gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIjsiLCAiXzIiKTsKLSAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiXFxbIiwgIl8zIik7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVtaXRKbmlDb2RlKEpGdW5jIGpmdW5jLCBQcmludFN0cmVhbSBvdXQpIHsKLSAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBqZnVuYy5nZXRDRnVuYygpOwotCi0gICAgICAgIC8vIEVtaXQgY29tbWVudCBpZGVudGlmeWluZyBvcmlnaW5hbCBDIGZ1bmN0aW9uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIC8qIHZvaWQgZ2xDbGlwUGxhbmVmICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZsb2F0ICplcXVhdGlvbiApICovCi0gICAgICAgIC8vCi0gICAgICAgIG91dC5wcmludGxuKCIvKiAiICsgY2Z1bmMuZ2V0T3JpZ2luYWwoKSArICIgKi8iKTsKLQotICAgICAgICAvLyBFbWl0IEpOSSBzaWduYXR1cmUgKG5hbWUpCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIHZvaWQKLSAgICAgICAgLy8gYW5kcm9pZF9nbENsaXBQbGFuZWZfX0lfM0ZJCi0gICAgICAgIC8vCi0KLSAgICAgICAgU3RyaW5nIG91dE5hbWUgPSAiYW5kcm9pZF8iICsgamZ1bmMuZ2V0TmFtZSgpOwotICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBpc1BvaW50ZXJGdW5jKGpmdW5jKTsKLSAgICAgICAgYm9vbGVhbiBpc1ZCT1BvaW50ZXJGdW5jID0gKG91dE5hbWUuZW5kc1dpdGgoIlBvaW50ZXIiKSB8fAotICAgICAgICAgICAgICAgIG91dE5hbWUuZW5kc1dpdGgoIlBvaW50ZXJPRVMiKSB8fAotICAgICAgICAgICAgb3V0TmFtZS5lbmRzV2l0aCgiRHJhd0VsZW1lbnRzIikgfHwgb3V0TmFtZS5lbmRzV2l0aCgiVmVydGV4QXR0cmliUG9pbnRlciIpKSAmJgotICAgICAgICAgICAgIWpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOwotICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgewotICAgICAgICAgICAgb3V0TmFtZSArPSAiQm91bmRzIjsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludCgic3RhdGljICIpOwotICAgICAgICBvdXQucHJpbnRsbihnZXRKbmlUeXBlKGpmdW5jLmdldFR5cGUoKSkpOwotICAgICAgICBvdXQucHJpbnQob3V0TmFtZSk7Ci0KLSAgICAgICAgU3RyaW5nIHJzaWduYXR1cmUgPSBnZXRKbmlOYW1lKGpmdW5jLmdldFR5cGUoKSk7Ci0KLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9ICIiOwotICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOwotICAgICAgICAgICAgc2lnbmF0dXJlICs9IGdldEpuaU5hbWUoYXJnVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgIHNpZ25hdHVyZSArPSAiSSI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBcHBlbmQgc2lnbmF0dXJlIHRvIGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgU3RyaW5nIHNpZyA9IGdldEpuaU1hbmdsZWROYW1lKHNpZ25hdHVyZSkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLycsICdfJyk7Ci0gICAgICAgIG91dC5wcmludCgiX18iICsgc2lnKTsKLSAgICAgICAgb3V0TmFtZSArPSAiX18iICsgc2lnOwotCi0gICAgICAgIHNpZ25hdHVyZSA9IHNpZ25hdHVyZS5yZXBsYWNlKCcuJywgJy8nKTsKLSAgICAgICAgcnNpZ25hdHVyZSA9IHJzaWduYXR1cmUucmVwbGFjZSgnLicsICcvJyk7Ci0KLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgaWYgKHJzaWduYXR1cmUubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgcnNpZ25hdHVyZSA9ICJWIjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzID0gIntcIiIgKwotICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKLSAgICAgICAgICAgIChpc1BvaW50ZXJGdW5jID8gIkJvdW5kcyIgOiAiIikgKwotICAgICAgICAgICAgIlwiLCBcIigiICsgc2lnbmF0dXJlICsiKSIgKwotICAgICAgICAgICAgcnNpZ25hdHVyZSArCi0gICAgICAgICAgICAiXCIsICh2b2lkICopICIgKwotICAgICAgICAgICAgb3V0TmFtZSArCi0gICAgICAgICAgICAiIH0sIjsKLSAgICAgICAgbmF0aXZlUmVnaXN0cmF0aW9ucy5hZGQocyk7Ci0KLSAgICAgICAgTGlzdDxJbnRlZ2VyPiBub25QcmltaXRpdmVBcmdzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotICAgICAgICBMaXN0PEludGVnZXI+IHN0cmluZ0FyZ3MgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIGludCBudW1CdWZmZXJBcmdzID0gMDsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGJ1ZmZlckFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgLy8gRW1pdCBKTkkgc2lnbmF0dXJlIChhcmd1bWVudHMpCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIChKTklFbnYgKl9lbnYsIGpvYmplY3QgdGhpcywgamludCBwbGFuZSwgamZsb2F0QXJyYXkgZXF1YXRpb25fcmVmLCBqaW50IG9mZnNldCkgewotICAgICAgICAvLwotICAgICAgICBvdXQucHJpbnQoIiAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcyIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgewotICAgICAgICAgICAgb3V0LnByaW50KCIsICIpOwotICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7Ci0gICAgICAgICAgICBTdHJpbmcgc3VmZml4OwotICAgICAgICAgICAgaWYgKCFhcmdUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0FycmF5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIl9yZWYiOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJfYnVmIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9uUHJpbWl0aXZlQXJncy5hZGQobmV3IEludGVnZXIoaSkpOwotICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGkpLmlzQnVmZmVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoY25hbWUpOwotICAgICAgICAgICAgICAgICAgICBudW1CdWZmZXJBcmdzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdWZmaXggPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcmdUeXBlLmlzU3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBzdHJpbmdBcmdzLmFkZChuZXcgSW50ZWdlcihpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludChnZXRKbmlUeXBlKGFyZ1R5cGUpICsgIiAiICsgamZ1bmMuZ2V0QXJnTmFtZShpKSArIHN1ZmZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgIG91dC5wcmludCgiLCBqaW50IHJlbWFpbmluZyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKCIpIHsiKTsKLQotICAgICAgICBpbnQgbnVtQXJyYXlzID0gMDsKLSAgICAgICAgaW50IG51bUJ1ZmZlcnMgPSAwOwotICAgICAgICBpbnQgbnVtU3RyaW5ncyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpZHgpOwotICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgKytudW1BcnJheXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0J1ZmZlcigpKSB7Ci0gICAgICAgICAgICAgICAgKytudW1CdWZmZXJzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNTdHJpbmcoKSkgewotICAgICAgICAgICAgICAgICsrbnVtU3RyaW5nczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVtaXQgbWV0aG9kIGJvZHkKLQotICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgX2V4Y2VwdGlvbiBhbmQgX3JldHVyblZhbHVlCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEV4YW1wbGU6Ci0gICAgICAgIC8vCi0gICAgICAgIC8vIGFuZHJvaWQ6OmdsOjpvZ2xlc19jb250ZXh0X3QgKmN0eDsKLSAgICAgICAgLy8KLSAgICAgICAgLy8gamludCBfZXhjZXB0aW9uOwotICAgICAgICAvLyBHTGVudW0gX3JldHVyblZhbHVlOwotICAgICAgICAvLwotICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOwotICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkID0gaXNVbnN1cHBvcnRlZEZ1bmMoY2Z1bmMpOwotICAgICAgICBpZiAoaXNVbnN1cHBvcnRlZCkgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCBcImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvblwiLCIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXCIiICsgY2Z1bmMuZ2V0TmFtZSgpICsgIlwiKTsiKTsKLSAgICAgICAgICAgIGlmICghaXNWb2lkKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJyZXR1cm4gIiArIHJldHZhbCArICI7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyByZXF1aXJlc0V4dGVuc2lvbiA9IGlzUmVxdWlyZXNGdW5jKGNmdW5jKTsKLSAgICAgICAgaWYgKHJlcXVpcmVzRXh0ZW5zaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAiaWYgKCEgc3VwcG9ydHNFeHRlbnNpb24oX2VudiwgX3RoaXMsIGhhdmVfIiArIHJlcXVpcmVzRXh0ZW5zaW9uICsgIklEKSkgeyIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCBcImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvblwiLCIpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXCIiICsgY2Z1bmMuZ2V0TmFtZSgpICsgIlwiKTsiKTsKLSAgICAgICAgICAgIGlmIChpc1ZvaWQpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiICAgIHJldHVybjsiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJldHZhbCA9IGdldEVycm9yUmV0dXJuVmFsdWUoY2Z1bmMpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICIgICAgcmV0dXJuICIgKyByZXR2YWwgKyAiOyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKwotICAgICAgICAgICAgICAgICJhbmRyb2lkOjpnbDo6b2dsZXNfY29udGV4dF90ICpjdHggPSBnZXRDb250ZXh0KF9lbnYsIF90aGlzKTsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaW5pdGlhbGl6ZVJldHVyblZhbHVlID0gc3RyaW5nQXJncy5zaXplKCkgPiAwOwotCi0gICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrID0gKG51bUFycmF5cyA+IDAgfHwgbnVtQnVmZmVycyA+IDAgfHwgbnVtU3RyaW5ncyA+IDApICYmCi0gICAgICAgICAgICBoYXNOb25Db25zdEFyZyhqZnVuYywgY2Z1bmMsIG5vblByaW1pdGl2ZUFyZ3MpOwotICAgICAgICAvLyBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKSAhPSBudWxsCi0KLSAgICAgICAgLy8gRW1pdCBhbiBfZXhlcHRpb24gdmFyaWFibGUgaWYgdGhlcmUgd2lsbCBiZSBlcnJvciBjaGVja3MKLSAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImppbnQgX2V4Y2VwdGlvbiA9IDA7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbWl0IGEgc2luZ2xlIF9hcnJheSBvciBtdWx0aXBsZSBfWFhYQXJyYXkgdmFyaWFibGVzCi0gICAgICAgIGlmIChudW1CdWZmZXJBcmdzID09IDEpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamFycmF5IF9hcnJheSA9IChqYXJyYXkpIDA7Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1ZmZlckFyZ3M7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqYXJyYXkgXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoaSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheSA9IChqYXJyYXkpIDA7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFpc1ZvaWQpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXR2YWwgPSBnZXRFcnJvclJldHVyblZhbHVlKGNmdW5jKTsKLSAgICAgICAgICAgIGlmIChyZXR2YWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJldHVyblR5cGUuZ2V0RGVjbGFyYXRpb24oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBfcmV0dXJuVmFsdWUgPSAiICsgcmV0dmFsICsgIjsiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZVJldHVyblZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmV0dXJuVHlwZS5nZXREZWNsYXJhdGlvbigpICsKLSAgICAgICAgICAgICAgICAiIF9yZXR1cm5WYWx1ZSA9IDA7Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJldHVyblR5cGUuZ2V0RGVjbGFyYXRpb24oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBfcmV0dXJuVmFsdWU7Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBmb3IgcG9pbnRlciBhcmd1bWVudHMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRXhhbXBsZToKLSAgICAgICAgLy8KLSAgICAgICAgLy8gR0xmaXhlZCAqZXFuX2Jhc2U7Ci0gICAgICAgIC8vIEdMZml4ZWQgKmVxbjsKLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIG9mZnNldCA9ICJvZmZzZXQiOwotICAgICAgICBTdHJpbmcgcmVtYWluaW5nID0gIl9yZW1haW5pbmciOwotICAgICAgICBpZiAobm9uUHJpbWl0aXZlQXJncy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgQ1R5cGUgdHlwZSA9IGNmdW5jLmdldEFyZ1R5cGUoamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBkZWNsID0gdHlwZS5nZXREZWNsYXJhdGlvbigpOwotICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbC5lbmRzV2l0aCgiKiIpID8gIiIgOiAiICIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0QXJnTmFtZShpZHgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKyBkZWNsICsgIikgMDsiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nID0gKChudW1BcnJheXMgKyBudW1CdWZmZXJzKSA8PSAxKSA/ICJfcmVtYWluaW5nIiA6Ci0gICAgICAgICAgICAgICAgICAgICJfIiArIGNuYW1lICsgIlJlbWFpbmluZyI7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamludCAiICsgcmVtYWluaW5nICsgIjsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNsLmVuZHNXaXRoKCIqIikgPyAiIiA6ICIgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICgiICsgZGVjbCArICIpIDA7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbWl0IGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGZvciBzdHJpbmdzCi0gICAgICAgIGlmIChzdHJpbmdBcmdzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nQXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBzdHJpbmdBcmdzLmdldChpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7Ci0KLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiY29uc3QgY2hhciogX25hdGl2ZSIgKyBjbmFtZSArICIgPSAwOyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTnVsbCBwb2ludGVyIGNoZWNrcyBhbmQgR2V0U3RyaW5nVVRGQ2hhcnMKLSAgICAgICAgaWYgKHN0cmluZ0FyZ3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJpbmdBcmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IHN0cmluZ0FyZ3MuZ2V0KGkpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKLQotICAgICAgICAgICAgICAgIENUeXBlIHR5cGUgPSBjZnVuYy5nZXRBcmdUeXBlKGpmdW5jLmdldEFyZ0NJbmRleChpZHgpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVjbCA9IHR5cGUuZ2V0RGVjbGFyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCEiICsgY25hbWUgKyAiKSB7Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJcImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cIiwgXCIiICsgY25hbWUgKyAiID09IG51bGxcIik7Iik7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBnb3RvIGV4aXQ7Iik7Ci0gICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIl9uYXRpdmUiICsgY25hbWUgKyAiID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoIiArIGNuYW1lICsgIiwgMCk7Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFbWl0ICdHZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsJyBmb3IgYXJyYXlzCi0gICAgICAgIC8vIEVtaXQgJ0dldFBvaW50ZXInIGNhbGxzIGZvciBCdWZmZXIgcG9pbnRlcnMKLSAgICAgICAgaW50IGJ1ZkFyZ0lkeCA9IDA7Ci0gICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBjbmFtZSA9IGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBudW1BcnJheXMgPD0gMSA/ICJvZmZzZXQiIDoKLSAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiT2Zmc2V0IjsKLSAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAoKG51bUFycmF5cyArIG51bUJ1ZmZlcnMpIDw9IDEpID8gIl9yZW1haW5pbmciIDoKLSAgICAgICAgICAgICAgICAgICAgIl8iICsgY25hbWUgKyAiUmVtYWluaW5nIjsKLQotICAgICAgICAgICAgICAgIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNBcnJheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoISIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVmKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25cIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIGNuYW1lICsgIiA9PSBudWxsXCIpOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGdvdG8gZXhpdDsiKTsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBvZmZzZXQgKyAiIDwgMCkgeyIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uXCIsIFwiIiArIG9mZnNldCArICIgPCAwXCIpOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGdvdG8gZXhpdDsiKTsKLSAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKLQotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZW1haW5pbmcgKyAiID0gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+R2V0QXJyYXlMZW5ndGgoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIl9yZWYpIC0gIiArIG9mZnNldCArICI7Iik7Ci0KLSAgICAgICAgICAgICAgICAgICAgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhjZnVuYywgY25hbWUsIG91dCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV4Y2VwdGlvbkNoZWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCAiICAgICIpOwotCi0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlID0gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuZ2V0RGVjbGFyYXRpb24oKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3JlZiwgKGpib29sZWFuICopMCk7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIiA9ICIgKyBjbmFtZSArICJfYmFzZSArICIgKyBvZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBhcnJheSA9IG51bUJ1ZmZlckFyZ3MgPD0gMSA/ICJfYXJyYXkiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIGJ1ZmZlckFyZ05hbWVzLmdldChidWZBcmdJZHgrKykgKyAiQXJyYXkiOwotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbnVsbEFsbG93ZWQgPSBpc051bGxBbGxvd2VkKGNmdW5jKSB8fCBpc1BvaW50ZXJGdW5jOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbEFsbG93ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIGNuYW1lICsgIl9idWYpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA9ICgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmdldERlY2xhcmF0aW9uKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSBnZXREaXJlY3RCdWZmZXJQb2ludGVyKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArICJfYnVmKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpaWkgPSAiICAgICI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiaWYgKCAhICIgKyBjbmFtZSArICIgKSB7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpaWkgKyBpbmRlbnQgKyAicmV0dXJuOyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiID0gKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmdldERlY2xhcmF0aW9uKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIilnZXRQb2ludGVyKF9lbnYsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9idWYsICYiICsgYXJyYXkgKyAiLCAmIiArIHJlbWFpbmluZyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoY2Z1bmMsIGNuYW1lLCBvdXQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdEV4Y2VwdGlvbkNoZWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcmVtYWluaW5nLCBudWxsQWxsb3dlZCA/ICIgICAgICAgICIgOiAiICAgICIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNWb2lkKSB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50ICsgIl9yZXR1cm5WYWx1ZSA9ICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIG5hbWUgPSBjZnVuYy5nZXROYW1lKCk7Ci0KLSAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgewotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDIsIG5hbWUubGVuZ3RoKCkpOyAvLyBTdHJpcCBvZmYgJ2dsJyBwcmVmaXgKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZSgpICsKLSAgICAgICAgICAgICAgICBuYW1lLnN1YnN0cmluZygxLCBuYW1lLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIG91dC5wcmludCgiY3R4LT5wcm9jcy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludChuYW1lICsgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiKSArICIoIik7Ci0KLSAgICAgICAgbnVtQXJncyA9IGNmdW5jLmdldE51bUFyZ3MoKTsKLSAgICAgICAgaWYgKG51bUFyZ3MgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Vc2VDb250ZXh0UG9pbnRlcikgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJjdHgpOyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiKTsiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY3R4LCIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZWNhc3Q7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEgJiYgaXNWQk9Qb2ludGVyRnVuYykgewotICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCA9ICJjb25zdCBHTHZvaWQgKiI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZWNhc3QgPSBjZnVuYy5nZXRBcmdUeXBlKGkpLmdldERlY2xhcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQgKyBpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlY2FzdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIpIik7Ci0gICAgICAgICAgICAgICAgaWYgKGNmdW5jLmdldEFyZ1R5cGUoaSkuaXNDb25zdENoYXJQb2ludGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50KCJfbmF0aXZlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5wcmludChjZnVuYy5nZXRBcmdOYW1lKGkpKTsKLQotICAgICAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIihHTHNpemVpKXJlbWFpbmluZyIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIik7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobmVlZHNFeGl0KSB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oImV4aXQ6Iik7Ci0gICAgICAgICAgICBuZWVkc0V4aXQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZkFyZ0lkeCA9IDA7Ci0gICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBub25QcmltaXRpdmVBcmdzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXJndW1lbnQgaXMgJ2NvbnN0JywgR0wgd2lsbCBub3Qgd3JpdGUgdG8gaXQuCi0gICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHVzZSB0aGUgJ0pOSV9BQk9SVCcgZmxhZyB0byBhdm9pZAotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmVlZCB0byB3cml0ZSBiYWNrIHRvIHRoZSBKYXZhIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoIiArIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArICJfYmFzZSkgeyIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCgiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArICJfcmVmLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9iYXNlLCIpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKyBpbmRlbnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5JX0FCT1JUIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2V4Y2VwdGlvbiA/IEpOSV9BQk9SVDogMCIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqZnVuYy5nZXRBcmdUeXBlKGlkeCkuaXNCdWZmZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoISBpc1BvaW50ZXJGdW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXJyYXkgPSBudW1CdWZmZXJBcmdzIDw9IDEgPyAiX2FycmF5IiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGJ1ZkFyZ0lkeCsrKSArICJBcnJheSI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiaWYgKCIgKyBhcnJheSArICIpIHsiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZVBvaW50ZXIoX2VudiwgIiArIGFycmF5ICsgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpOSV9GQUxTRSIgOiAiX2V4Y2VwdGlvbiA/IEpOSV9GQUxTRSA6IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEpOSV9UUlVFIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRW1pdCBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmb3Igc3RyaW5ncwotICAgICAgICBpZiAoc3RyaW5nQXJncy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gc3RyaW5nQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGNuYW1lID0gY2Z1bmMuZ2V0QXJnTmFtZShjSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmIChfbmF0aXZlIiArIGNuYW1lICsgIikgeyIpOwotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgX2Vudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKCIgKyBjbmFtZSArICIsIF9uYXRpdmUiICsgY25hbWUgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZiAoIWlzVm9pZCkgewotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgInJldHVybiBfcmV0dXJuVmFsdWU7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Kc3IyMzlDb2RlRW1pdHRlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9Kc3IyMzlDb2RlRW1pdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTBlZmUzLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSnNyMjM5Q29kZUVtaXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotLyoqCi0gKiBFbWl0cyBhIEphdmEgaW50ZXJmYWNlIGFuZCBKYXZhICYgQyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBDIGZ1bmN0aW9uLgotICoKLSAqIDxwPiBUaGUgSmF2YSBpbnRlcmZhY2Ugd2lsbCBoYXZlIEJ1ZmZlciBhbmQgYXJyYXkgdmFyaWFudHMgZm9yIGZ1bmN0aW9ucyB0aGF0Ci0gKiBoYXZlIGEgdHlwZWQgcG9pbnRlciBhcmd1bWVudC4gIFRoZSBhcnJheSB2YXJpYW50IHdpbGwgY29udmVydCBhIHNpbmdsZSAiPHR5cGU+ICpkYXRhIgotICogYXJndW1lbnQgdG8gYSBwYWlyIG9mIGFyZ3VtZW50cyAiPHR5cGU+W10gZGF0YSwgaW50IG9mZnNldCIuCi0gKi8KLXB1YmxpYyBjbGFzcyBKc3IyMzlDb2RlRW1pdHRlciBleHRlbmRzIEpuaUNvZGVFbWl0dGVyIGltcGxlbWVudHMgQ29kZUVtaXR0ZXIgewotCi0gICAgUHJpbnRTdHJlYW0gbUphdmExMEludGVyZmFjZVN0cmVhbTsKLSAgICBQcmludFN0cmVhbSBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtOwotICAgIFByaW50U3RyZWFtIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW07Ci0gICAgUHJpbnRTdHJlYW0gbUphdmExMUV4dEludGVyZmFjZVN0cmVhbTsKLSAgICBQcmludFN0cmVhbSBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbTsKLSAgICBQcmludFN0cmVhbSBtSmF2YUltcGxTdHJlYW07Ci0gICAgUHJpbnRTdHJlYW0gbUNTdHJlYW07Ci0KLSAgICBQcmludFN0cmVhbSBtSmF2YUludGVyZmFjZVN0cmVhbTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBqYXZhMTBJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjAgZnVuY3Rpb25zCi0gICAgICogQHBhcmFtIGphdmExMEV4dEludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMCBleHRlbnNpb24gZnVuY3Rpb25zCi0gICAgICogQHBhcmFtIGphdmExMUludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMSBmdW5jdGlvbnMKLSAgICAgKiBAcGFyYW0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGludGVyZmFjZSBmb3IgR0wgMS4xIEV4dGVuc2lvbiBmdW5jdGlvbnMKLSAgICAgKiBAcGFyYW0gamF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMSBFeHRlbnNpb24gUGFjayBmdW5jdGlvbnMKLSAgICAgKiBAcGFyYW0gamF2YUltcGxTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW1wbGVtZW50YXRpb24KLSAgICAgKiBAcGFyYW0gY1N0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgQyBpbXBsZW1lbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBKc3IyMzlDb2RlRW1pdHRlcihTdHJpbmcgY2xhc3NQYXRoTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQ2hlY2tlciBjaGVja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTBJbnRlcmZhY2VTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMEV4dEludGVyZmFjZVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExSW50ZXJmYWNlU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmFJbXBsU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBjU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUNvbnRleHRQb2ludGVyKSB7Ci0gICAgICAgIG1DbGFzc1BhdGhOYW1lID0gY2xhc3NQYXRoTmFtZTsKLSAgICAgICAgbUNoZWNrZXIgPSBjaGVja2VyOwotICAgICAgICBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtID0gamF2YTEwSW50ZXJmYWNlU3RyZWFtOwotICAgICAgICBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtID0gamF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtOwotICAgICAgICBtSmF2YTExSW50ZXJmYWNlU3RyZWFtID0gamF2YTExSW50ZXJmYWNlU3RyZWFtOwotICAgICAgICBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtID0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtOwotICAgICAgICBtSmF2YTExRXh0UGFja0ludGVyZmFjZVN0cmVhbSA9IGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW07Ci0gICAgICAgIG1KYXZhSW1wbFN0cmVhbSA9IGphdmFJbXBsU3RyZWFtOwotICAgICAgICBtQ1N0cmVhbSA9IGNTdHJlYW07Ci0gICAgICAgIG1Vc2VDb250ZXh0UG9pbnRlciA9IHVzZUNvbnRleHRQb2ludGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24sIGJvb2xlYW4gZXh0LCBib29sZWFuIHBhY2spIHsKLSAgICAgICAgaWYgKHZlcnNpb24gPT0gMCkgewotICAgICAgICAgICAgbUphdmFJbnRlcmZhY2VTdHJlYW0gPSBleHQgPyBtSmF2YTEwRXh0SW50ZXJmYWNlU3RyZWFtIDoKLSAgICAgICAgICAgICAgICBtSmF2YTEwSW50ZXJmYWNlU3RyZWFtOwotICAgICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gMSkgewotICAgICAgICAgICAgbUphdmFJbnRlcmZhY2VTdHJlYW0gPSBleHQgPwotICAgICAgICAgICAgICAgIChwYWNrID8gbUphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0gOgotICAgICAgICAgICAgICAgICBtSmF2YTExRXh0SW50ZXJmYWNlU3RyZWFtKSA6Ci0gICAgICAgICAgICAgICAgbUphdmExMUludGVyZmFjZVN0cmVhbTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCYWQgdmVyc2lvbjogIiArIHZlcnNpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW1pdENvZGUoQ0Z1bmMgY2Z1bmMsIFN0cmluZyBvcmlnaW5hbCkgewotICAgICAgICBlbWl0Q29kZShjZnVuYywgb3JpZ2luYWwsIG1KYXZhSW50ZXJmYWNlU3RyZWFtLCBtSmF2YUltcGxTdHJlYW0sIG1DU3RyZWFtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCkgewotICAgICAgICBlbWl0TmF0aXZlUmVnaXN0cmF0aW9uKCJyZWdpc3Rlcl9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsIiwgbUNTdHJlYW0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvUGFyYW1ldGVyQ2hlY2tlci5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjZkODYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9QYXJhbWV0ZXJDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJDaGVja2VyIHsKLQotICAgIEhhc2hNYXA8U3RyaW5nLFN0cmluZ1tdPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nW10+KCk7Ci0KLSAgICBwdWJsaWMgUGFyYW1ldGVyQ2hlY2tlcihCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgczsKLSAgICAgICAgd2hpbGUgKChzID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IHMuc3BsaXQoIlxccyIpOwotICAgICAgICAgICAgbWFwLnB1dCh0b2tlbnNbMF0sIHRva2Vucyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q2hlY2tzKFN0cmluZyBmdW5jdGlvbk5hbWUpIHsKLSAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbWFwLmdldChmdW5jdGlvbk5hbWUpOwotICAgICAgICBpZiAoY2hlY2tzID09IG51bGwgJiYKLSAgICAgICAgICAgIChmdW5jdGlvbk5hbWUuZW5kc1dpdGgoImZ2IikgfHwKLSAgICAgICAgICAgICBmdW5jdGlvbk5hbWUuZW5kc1dpdGgoInh2IikgfHwKLSAgICAgICAgICAgICBmdW5jdGlvbk5hbWUuZW5kc1dpdGgoIml2IikpKSB7Ci0gICAgICAgICAgICBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvbk5hbWUuc3Vic3RyaW5nKDAsIGZ1bmN0aW9uTmFtZS5sZW5ndGgoKSAtIDIpOwotICAgICAgICAgICAgY2hlY2tzID0gbWFwLmdldChmdW5jdGlvbk5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGVja3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzEwRXh0SGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODkxZWEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBFeHRIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKLQotcHVibGljIGNsYXNzIEdMRVMxMEV4dCB7Ci0gICAgbmF0aXZlIHByaXZhdGUgc3RhdGljIHZvaWQgX25hdGl2ZUNsYXNzSW5pdCgpOwotICAgIHN0YXRpYyB7Ci0JICAgIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICB9Ci0gICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBFeHRjSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzEwRXh0Y0hlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDE4ZDcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBFeHRjSGVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi1zdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQotc3RhdGljIGpjbGFzcyBuaW9BY2Nlc3NDbGFzczsKLXN0YXRpYyBqY2xhc3MgYnVmZmVyQ2xhc3M7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VQb2ludGVySUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheUlEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlPZmZzZXRJRDsKLXN0YXRpYyBqZmllbGRJRCBwb3NpdGlvbklEOwotc3RhdGljIGpmaWVsZElEIGxpbWl0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgZWxlbWVudFNpemVTaGlmdElEOwotCi0vKiBDYWNoZSBtZXRob2QgSURzIGVhY2ggdGltZSB0aGUgY2xhc3MgaXMgbG9hZGVkLiAqLwotCi1zdGF0aWMgdm9pZAotbmF0aXZlQ2xhc3NJbml0KEpOSUVudiAqX2VudiwgamNsYXNzIGdsSW1wbENsYXNzKQotewotICAgIGpjbGFzcyBuaW9BY2Nlc3NDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9OSU9BY2Nlc3MiKTsKLSAgICBuaW9BY2Nlc3NDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihuaW9BY2Nlc3NDbGFzc0xvY2FsKTsKLQotICAgIGpjbGFzcyBidWZmZXJDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9CdWZmZXIiKTsKLSAgICBidWZmZXJDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihidWZmZXJDbGFzc0xvY2FsKTsKLQotICAgIGdldEJhc2VQb2ludGVySUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlUG9pbnRlciIsICIoTGphdmEvbmlvL0J1ZmZlcjspSiIpOwotICAgIGdldEJhc2VBcnJheUlEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5IiwgIihMamF2YS9uaW8vQnVmZmVyOylMamF2YS9sYW5nL09iamVjdDsiKTsKLSAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheU9mZnNldCIsICIoTGphdmEvbmlvL0J1ZmZlcjspSSIpOwotCi0gICAgcG9zaXRpb25JRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJwb3NpdGlvbiIsICJJIik7Ci0gICAgbGltaXRJRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJsaW1pdCIsICJJIik7Ci0gICAgZWxlbWVudFNpemVTaGlmdElEID0KLSAgICAgICAgX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgIl9lbGVtZW50U2l6ZVNoaWZ0IiwgIkkiKTsKLX0KLQotCi1zdGF0aWMgdm9pZCAqCi1nZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKLXsKLSAgICBqaW50IHBvc2l0aW9uOwotICAgIGppbnQgbGltaXQ7Ci0gICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIGpsb25nIHBvaW50ZXI7Ci0gICAgamludCBvZmZzZXQ7Ci0gICAgdm9pZCAqZGF0YTsKLQotICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7Ci0gICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKLSAgICBpZiAocG9pbnRlciAhPSAwTCkgewotICAgICAgICAqYXJyYXkgPSBOVUxMOwotICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7Ci0gICAgfQotCi0gICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOwotICAgIG9mZnNldCA9IF9lbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCwgYnVmZmVyKTsKLSAgICBkYXRhID0gX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgqYXJyYXksIChqYm9vbGVhbiAqKSAwKTsKLQotICAgIHJldHVybiAodm9pZCAqKSAoKGNoYXIgKikgZGF0YSArIG9mZnNldCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlbGVhc2VQb2ludGVyKEpOSUVudiAqX2VudiwgamFycmF5IGFycmF5LCB2b2lkICpkYXRhLCBqYm9vbGVhbiBjb21taXQpCi17Ci0gICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJyYXksIGRhdGEsCi0JCQkJCSAgIGNvbW1pdCA/IDAgOiBKTklfQUJPUlQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzEwSGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmE4MzEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBhbmRyb2lkLm9wZW5nbDsKLQotaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKLQotcHVibGljIGNsYXNzIEdMRVMxMCB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMSUFTRURfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgPSAweDg0NkQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgPSAweDE2MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMVUVfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMkY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAgICAgICAgPSAweDg2QTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICA9IDB4MTIwNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPUFlfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgICAgPSAweDAxMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRU1JU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTYwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VRVUlWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDgwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjY0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZPR19ISU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GT0dfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjYzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVF9PRVMgID0gMHg4QjlCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgICAgPSAweDhCOUE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUX01PREVMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgPSAweDBCNTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgICAgICAgICA9IDB4MEI1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI2MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgICA9IDB4MTIwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgID0gMHgyNzAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICAgPSAweDI3MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgICAgICAgICA9IDB4ODBFOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgICAgICAgID0gMHg4MEU4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICA9IDB4MEQzNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgICAgICAgID0gMHgwRDM4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICA9IDB4MEQzOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfVEVYVFVSRV9VTklUUyAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAgICAgICAgPSAweDBEM0E7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RVTEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwOUQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgPSAweDI3MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICA9IDB4MjcwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORVZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgPSAweDg2QTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICA9IDB4MDMwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgPSAweDAzMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICA9IDB4MDMwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09SX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU0X1JHQjhfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhCOTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU4X1I1X0c2X0I1X09FUyAgICAgICAgICAgICAgICAgPSAweDhCOTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICA9IDB4OEI5OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgICAgICAgID0gMHgwQzUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgPSAweDgxMjg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgICAgICAgID0gMHg4MDM3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgPSAweDBDNTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1FVQURSQVRJQ19BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgPSAweDEyMDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI5MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDNBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgICAgICAgID0gMHg4MDlFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9BTFBIQV9UT19PTkUgICAgICAgICAgICAgICAgICAgPSAweDgwOUY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTYwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NNT09USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgICA9IDB4MEIyMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQRUNVTEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NQT1RfRVhQT05FTlQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEyMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgICAgICAgID0gMHgwMzA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICA9IDB4MDQwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NVQlBJWEVMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwREUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkgICAgICAgICAgICAgICAgICAgPSAweDgwNzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjMwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAgICAgICAgPSAweDIyMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0E7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Q7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MENGNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgICAgICAgICA9IDB4ODAzMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgICAgICAgID0gMHg4MDM0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAgICAgICAgPSAweDgzNjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLQotICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICBzdGF0aWMgewotCSAgICBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyIF9jb2xvclBvaW50ZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyIF9ub3JtYWxQb2ludGVyOwotICAgIHByaXZhdGUgc3RhdGljIEJ1ZmZlciBfdGV4Q29vcmRQb2ludGVyOwotICAgIHByaXZhdGUgc3RhdGljIEJ1ZmZlciBfdmVydGV4UG9pbnRlcjsKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBjSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzEwY0hlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTNjMzMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTBjSGVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0vKiBzcGVjaWFsIGNhbGxzIGltcGxlbWVudGVkIGluIEFuZHJvaWQncyBHTEVTIHdyYXBwZXIgdXNlZCB0byBtb3JlCi0gKiBlZmZpY2llbnRseSBib3VuZC1jaGVjayBwYXNzZWQgYXJyYXlzICovCi1leHRlcm4gIkMiIHsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsQ29sb3JQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwdHIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyQm91bmRzKEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVGV4Q29vcmRQb2ludGVyQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsVmVydGV4UG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOwotc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOwotc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7Ci1zdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKLXN0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7Ci0KLS8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCi0KLXN0YXRpYyB2b2lkCi1uYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCi17Ci0gICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOwotICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOwotCi0gICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOwotICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOwotCi0gICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7Ci0gICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOwotICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7Ci0KLSAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKLSAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQotICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1nZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKLXsKLSAgICBqaW50IHBvc2l0aW9uOwotICAgIGppbnQgbGltaXQ7Ci0gICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIGpsb25nIHBvaW50ZXI7Ci0gICAgamludCBvZmZzZXQ7Ci0gICAgdm9pZCAqZGF0YTsKLQotICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7Ci0gICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKLSAgICBpZiAocG9pbnRlciAhPSAwTCkgewotICAgICAgICAqYXJyYXkgPSBOVUxMOwotICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7Ci0gICAgfQotCi0gICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOwotICAgIG9mZnNldCA9IF9lbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCwgYnVmZmVyKTsKLSAgICBkYXRhID0gX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgqYXJyYXksIChqYm9vbGVhbiAqKSAwKTsKLQotICAgIHJldHVybiAodm9pZCAqKSAoKGNoYXIgKikgZGF0YSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWxlYXNlUG9pbnRlcihKTklFbnYgKl9lbnYsIGphcnJheSBhcnJheSwgdm9pZCAqZGF0YSwgamJvb2xlYW4gY29tbWl0KQotewotICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFycmF5LCBkYXRhLAotCQkJCQkgICBjb21taXQgPyAwIDogSk5JX0FCT1JUKTsKLX0KLQotc3RhdGljIHZvaWQgKgotZ2V0RGlyZWN0QnVmZmVyUG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyKSB7Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKSBfZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBqaW50IHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICAgICAgamludCBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICAgICBidWYgKz0gcG9zaXRpb24gPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICB9IGVsc2UgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IHVzZSBhIG5hdGl2ZSBvcmRlciBkaXJlY3QgQnVmZmVyIik7Ci0gICAgfQotICAgIHJldHVybiAodm9pZCopIGJ1ZjsKLX0KLQotc3RhdGljIGludAotZ2V0TnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkgewotICAgIGludCBudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSAwOwotICAgIGdsR2V0SW50ZWdlcnYoR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLCAmbnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKTsKLSAgICByZXR1cm4gbnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFFeHRIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExRXh0SGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNWZhMDQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFFeHRIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgYW5kcm9pZC5vcGVuZ2w7Ci0KLWltcG9ydCBqYXZhLm5pby5CdWZmZXI7Ci0KLXB1YmxpYyBjbGFzcyBHTEVTMTFFeHQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODgzRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1RfUkdCX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX1NSQ19SR0JfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRFNUX0FMUEhBX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9TUkNfQUxQSEFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0VRVUFUSU9OX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlVOQ19BRERfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GVU5DX1NVQlRSQUNUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZVTkNfUkVWRVJTRV9TVUJUUkFDVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVRDMV9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQyNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDMyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI5RDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GSVhFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PTkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQjVfQTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNTY1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DT01QT05FTlQxNl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0RFUFRIX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDU1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfT0VTICAgICAgICAgICAgICAgPSAweDhDRDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgICAgICA9IDB4OENEMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTICAgICAgICAgICAgID0gMHg4Q0QyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyAgICAgPSAweDhDRDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENENTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgID0gMHg4Q0Q2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UX09FUyAgICAgICAgPSAweDhDRDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TX09FUyAgICAgICAgICAgICAgICA9IDB4OENEOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgICAgID0gMHg4Q0RBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9SRU5ERVJCVUZGRVJfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgICAgICA9IDB4MDUwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XUklURV9PTkxZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEI5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JVRkZFUl9BQ0NFU1NfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4QkI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQlVGRkVSX01BUFBFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfTUFQX1BPSU5URVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEJEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICAgPSAweDg5OEQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgICAgICAgICAgICA9IDB4ODk4RTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgICAgICAgICAgICAgICAgID0gMHg4OThGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WRVJURVhfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1BBTEVUVEVfTUFUUklDRVNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg0MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfUEFMRVRURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODQwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV0VJR0hUX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1BBTEVUVEVfTUFUUklYX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODQzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg0NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVRSSVhfSU5ERVhfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX0lOREVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICA9IDB4OEI5RTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QTk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XRUlHSFRfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg4OUU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfU1RFTkNJTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRGOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9JTlRfMjRfOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEZBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIMjRfU1RFTkNJTDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfSU5ERVgxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0lOREVYOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOQ1JfV1JBUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUl9XUkFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTExOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRkxFQ1RJT05fTUFQX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWF9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1lfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1pfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTFBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9HRU5fTU9ERV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0dFTl9TVFJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01JUlJPUkVEX1JFUEVBVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfM0RDX1hfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODdGOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF8zRENfWFlfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4N0ZBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUQ19SR0JfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDOTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVRDX1JHQkFfRVhQTElDSVRfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEM5MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BVENfUkdCQV9JTlRFUlBPTEFURURfQUxQSEFfQU1EICAgICAgICAgICAgICAgICAgICAgID0gMHg4N0VFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RkU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRGRjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CR1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFUl9FWFRFUk5BTF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfRVhURVJOQUxfT0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDY3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFUVVJUkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgICAgPSAweDhENjg7Ci0KLSAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgc3RhdGljIHsKLQkgICAgX25hdGl2ZUNsYXNzSW5pdCgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0xfQllURSA9IEdMRVMxMC5HTF9CWVRFOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHTF9GSVhFRCA9IEdMRVMxMC5HTF9GSVhFRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVQgPSBHTEVTMTAuR0xfRkxPQVQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdMX1NIT1JUID0gR0xFUzEwLkdMX1NIT1JUOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIEJ1ZmZlciBfbWF0cml4SW5kZXhQb2ludGVyT0VTOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFFeHRjSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExRXh0Y0hlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjlhNDQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMTFFeHRjSGVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0vKiBzcGVjaWFsIGNhbGxzIGltcGxlbWVudGVkIGluIEFuZHJvaWQncyBHTEVTIHdyYXBwZXIgdXNlZCB0byBtb3JlCi0gKiBlZmZpY2llbnRseSBib3VuZC1jaGVjayBwYXNzZWQgYXJyYXlzICovCi1leHRlcm4gIkMiIHsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwdHIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xXZWlnaHRQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwKLSAgICAgICAgY29uc3QgR0x2b2lkICpwdHIsIEdMc2l6ZWkgY291bnQpOwotfQotCi1zdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQotc3RhdGljIGpjbGFzcyBuaW9BY2Nlc3NDbGFzczsKLXN0YXRpYyBqY2xhc3MgYnVmZmVyQ2xhc3M7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VQb2ludGVySUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheUlEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlPZmZzZXRJRDsKLXN0YXRpYyBqZmllbGRJRCBwb3NpdGlvbklEOwotc3RhdGljIGpmaWVsZElEIGxpbWl0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgZWxlbWVudFNpemVTaGlmdElEOwotCi0vKiBDYWNoZSBtZXRob2QgSURzIGVhY2ggdGltZSB0aGUgY2xhc3MgaXMgbG9hZGVkLiAqLwotCi1zdGF0aWMgdm9pZAotbmF0aXZlQ2xhc3NJbml0KEpOSUVudiAqX2VudiwgamNsYXNzIGdsSW1wbENsYXNzKQotewotICAgIGpjbGFzcyBuaW9BY2Nlc3NDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9OSU9BY2Nlc3MiKTsKLSAgICBuaW9BY2Nlc3NDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihuaW9BY2Nlc3NDbGFzc0xvY2FsKTsKLQotICAgIGpjbGFzcyBidWZmZXJDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9CdWZmZXIiKTsKLSAgICBidWZmZXJDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihidWZmZXJDbGFzc0xvY2FsKTsKLQotICAgIGdldEJhc2VQb2ludGVySUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlUG9pbnRlciIsICIoTGphdmEvbmlvL0J1ZmZlcjspSiIpOwotICAgIGdldEJhc2VBcnJheUlEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5IiwgIihMamF2YS9uaW8vQnVmZmVyOylMamF2YS9sYW5nL09iamVjdDsiKTsKLSAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheU9mZnNldCIsICIoTGphdmEvbmlvL0J1ZmZlcjspSSIpOwotCi0gICAgcG9zaXRpb25JRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJwb3NpdGlvbiIsICJJIik7Ci0gICAgbGltaXRJRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJsaW1pdCIsICJJIik7Ci0gICAgZWxlbWVudFNpemVTaGlmdElEID0KLSAgICAgICAgX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgIl9lbGVtZW50U2l6ZVNoaWZ0IiwgIkkiKTsKLX0KLQotCi1zdGF0aWMgdm9pZCAqCi1nZXRQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIsIGphcnJheSAqYXJyYXksIGppbnQgKnJlbWFpbmluZykKLXsKLSAgICBqaW50IHBvc2l0aW9uOwotICAgIGppbnQgbGltaXQ7Ci0gICAgamludCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIGpsb25nIHBvaW50ZXI7Ci0gICAgamludCBvZmZzZXQ7Ci0gICAgdm9pZCAqZGF0YTsKLQotICAgIHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICBsaW1pdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgbGltaXRJRCk7Ci0gICAgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAqcmVtYWluaW5nID0gKGxpbWl0IC0gcG9zaXRpb24pIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgcG9pbnRlciA9IF9lbnYtPkNhbGxTdGF0aWNMb25nTWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZVBvaW50ZXJJRCwgYnVmZmVyKTsKLSAgICBpZiAocG9pbnRlciAhPSAwTCkgewotICAgICAgICAqYXJyYXkgPSBOVUxMOwotICAgICAgICByZXR1cm4gKHZvaWQgKikgKGppbnQpIHBvaW50ZXI7Ci0gICAgfQotCi0gICAgKmFycmF5ID0gKGphcnJheSkgX2Vudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheUlELCBidWZmZXIpOwotICAgIG9mZnNldCA9IF9lbnYtPkNhbGxTdGF0aWNJbnRNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCwgYnVmZmVyKTsKLSAgICBkYXRhID0gX2Vudi0+R2V0UHJpbWl0aXZlQXJyYXlDcml0aWNhbCgqYXJyYXksIChqYm9vbGVhbiAqKSAwKTsKLQotICAgIHJldHVybiAodm9pZCAqKSAoKGNoYXIgKikgZGF0YSArIG9mZnNldCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXJlbGVhc2VQb2ludGVyKEpOSUVudiAqX2VudiwgamFycmF5IGFycmF5LCB2b2lkICpkYXRhLCBqYm9vbGVhbiBjb21taXQpCi17Ci0gICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJyYXksIGRhdGEsCi0JCQkJCSAgIGNvbW1pdCA/IDAgOiBKTklfQUJPUlQpOwotfQotCi1zdGF0aWMgdm9pZCAqCi1nZXREaXJlY3RCdWZmZXJQb2ludGVyKEpOSUVudiAqX2Vudiwgam9iamVjdCBidWZmZXIpIHsKLSAgICBjaGFyKiBidWYgPSAoY2hhciopIF9lbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoYnVmZmVyKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGppbnQgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgICAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgICAgIGJ1ZiArPSBwb3NpdGlvbiA8PCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgdXNlIGEgbmF0aXZlIG9yZGVyIGRpcmVjdCBCdWZmZXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuICh2b2lkKikgYnVmOwotfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMUhlYWRlci5qYXZhLWlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU3MmQyLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExSGVhZGVyLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgYW5kcm9pZC5vcGVuZ2w7Ci0KLWltcG9ydCBqYXZhLm5pby5CdWZmZXI7Ci0KLXB1YmxpYyBjbGFzcyBHTEVTMTEgZXh0ZW5kcyBHTEVTMTAgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BRERfU0lHTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDFDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX1RFU1RfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQV9URVNUX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODkyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICAgICAgICA9IDB4ODg5NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JVRkZFUl9BQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSUVOVF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICA9IDB4ODRFMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElQX1BMQU5FMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DTElQX1BMQU5FMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMSVBfUExBTkU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgPSAweDg4OTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgID0gMHg4MDkwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT0xPUl9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NQklORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTUJJTkVfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT01CSU5FX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPT1JEX1JFUExBQ0VfT0VTICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICAgICAgICAgICAgICAgICAgPSAweDBCMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjczOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPVDNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ET1QzX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgPSAweDg4OTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dFTkVSQVRFX01JUE1BUCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgICAgICAgICAgPSAweDgxOTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MT0dJQ19PUF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9DTElQX1BMQU5FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NT0RFTFZJRVdfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgID0gMHg4OThEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICA9IDB4MEJBMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgPSAweDg4OTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PUk1BTF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT1JNQUxfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1BFUkFORDBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09QRVJBTkQwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUEVSQU5EMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09QRVJBTkQyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PUEVSQU5EMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgICAgICAgICAgID0gMHg4MTI5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX0ZBREVfVEhSRVNIT0xEX1NJWkUgICAgICAgICAgICAgICA9IDB4ODEyODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgID0gMHg4QjlGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5QzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgPSAweDg5OEM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgID0gMHg4OThCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfVFlQRV9PRVMgICAgICAgICAgICAgICA9IDB4ODk4QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0lOVF9TSVpFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPSU5UX1NQUklURV9PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg2MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgICAgICAgICAgPSAweDgwMzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgICAgICAgICAgID0gMHgyQTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BSRVZJT1VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUklNQVJZX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1Nzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyA9IDB4ODk4RTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgPSAweDBCQTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTczOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUICAgICAgICAgICAgICAgICAgPSAweDgwQUI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgICAgICAgICAgID0gMHg4MEFBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQzBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQzFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkMyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OEE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUQVRJQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAgICAgICAgICAgICAgICAgPSAweDBCOTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgICAgICAgICAgID0gMHgwQjk2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNjk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgID0gMHg4ODlBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICA9IDB4ODA5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgPSAweDgwODg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgID0gMHg4MDhBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICA9IDB4ODA4OTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgID0gMHg4OThGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgPSAweDg4OTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0M7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9XUklURV9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4Qjk7Ci0KLSAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgc3RhdGljIHsKLQkgICAgX25hdGl2ZUNsYXNzSW5pdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEJ1ZmZlciBfcG9pbnRTaXplUG9pbnRlck9FUzsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExY0hlYWRlci5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMxMWNIZWFkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMwNzlmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzExY0hlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotLyogc3BlY2lhbCBjYWxscyBpbXBsZW1lbnRlZCBpbiBBbmRyb2lkJ3MgR0xFUyB3cmFwcGVyIHVzZWQgdG8gbW9yZQotICogZWZmaWNpZW50bHkgYm91bmQtY2hlY2sgcGFzc2VkIGFycmF5cyAqLwotZXh0ZXJuICJDIiB7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFBvaW50U2l6ZVBvaW50ZXJPRVNCb3VuZHMoR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLAotICAgICAgICBjb25zdCBHTHZvaWQgKnB0ciwgR0xzaXplaSBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOwotc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZVBvaW50ZXJJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5SUQ7Ci1zdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheU9mZnNldElEOwotc3RhdGljIGpmaWVsZElEIHBvc2l0aW9uSUQ7Ci1zdGF0aWMgamZpZWxkSUQgbGltaXRJRDsKLXN0YXRpYyBqZmllbGRJRCBlbGVtZW50U2l6ZVNoaWZ0SUQ7Ci0KLS8qIENhY2hlIG1ldGhvZCBJRHMgZWFjaCB0aW1lIHRoZSBjbGFzcyBpcyBsb2FkZWQuICovCi0KLXN0YXRpYyB2b2lkCi1uYXRpdmVDbGFzc0luaXQoSk5JRW52ICpfZW52LCBqY2xhc3MgZ2xJbXBsQ2xhc3MpCi17Ci0gICAgamNsYXNzIG5pb0FjY2Vzc0NsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL05JT0FjY2VzcyIpOwotICAgIG5pb0FjY2Vzc0NsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKG5pb0FjY2Vzc0NsYXNzTG9jYWwpOwotCi0gICAgamNsYXNzIGJ1ZmZlckNsYXNzTG9jYWwgPSBfZW52LT5GaW5kQ2xhc3MoImphdmEvbmlvL0J1ZmZlciIpOwotICAgIGJ1ZmZlckNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGJ1ZmZlckNsYXNzTG9jYWwpOwotCi0gICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7Ci0gICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOwotICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7Ci0KLSAgICBwb3NpdGlvbklEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgInBvc2l0aW9uIiwgIkkiKTsKLSAgICBsaW1pdElEID0gX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgImxpbWl0IiwgIkkiKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0SUQgPQotICAgICAgICBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAiX2VsZW1lbnRTaXplU2hpZnQiLCAiSSIpOwotfQotCi0KLXN0YXRpYyB2b2lkICoKLWdldFBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlciwgamFycmF5ICphcnJheSwgamludCAqcmVtYWluaW5nKQotewotICAgIGppbnQgcG9zaXRpb247Ci0gICAgamludCBsaW1pdDsKLSAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgamxvbmcgcG9pbnRlcjsKLSAgICBqaW50IG9mZnNldDsKLSAgICB2b2lkICpkYXRhOwotCi0gICAgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgIGxpbWl0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBsaW1pdElEKTsKLSAgICBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICpyZW1haW5pbmcgPSAobGltaXQgLSBwb3NpdGlvbikgPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICBwb2ludGVyID0gX2Vudi0+Q2FsbFN0YXRpY0xvbmdNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlUG9pbnRlcklELCBidWZmZXIpOwotICAgIGlmIChwb2ludGVyICE9IDBMKSB7Ci0gICAgICAgICphcnJheSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAodm9pZCAqKSAoamludCkgcG9pbnRlcjsKLSAgICB9Ci0KLSAgICAqYXJyYXkgPSAoamFycmF5KSBfZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5SUQsIGJ1ZmZlcik7Ci0gICAgb2Zmc2V0ID0gX2Vudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheU9mZnNldElELCBidWZmZXIpOwotICAgIGRhdGEgPSBfZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCphcnJheSwgKGpib29sZWFuICopIDApOwotCi0gICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKLX0KLQotCi1zdGF0aWMgdm9pZAotcmVsZWFzZVBvaW50ZXIoSk5JRW52ICpfZW52LCBqYXJyYXkgYXJyYXksIHZvaWQgKmRhdGEsIGpib29sZWFuIGNvbW1pdCkKLXsKLSAgICBfZW52LT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbChhcnJheSwgZGF0YSwKLQkJCQkJICAgY29tbWl0ID8gMCA6IEpOSV9BQk9SVCk7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLWdldERpcmVjdEJ1ZmZlclBvaW50ZXIoSk5JRW52ICpfZW52LCBqb2JqZWN0IGJ1ZmZlcikgewotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgX2Vudi0+R2V0RGlyZWN0QnVmZmVyQWRkcmVzcyhidWZmZXIpOwotICAgIGlmIChidWYpIHsKLSAgICAgICAgamludCBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7Ci0gICAgICAgIGppbnQgZWxlbWVudFNpemVTaGlmdCA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgZWxlbWVudFNpemVTaGlmdElEKTsKLSAgICAgICAgYnVmICs9IHBvc2l0aW9uIDw8IGVsZW1lbnRTaXplU2hpZnQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oX2VudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVzdCB1c2UgYSBuYXRpdmUgb3JkZXIgZGlyZWN0IEJ1ZmZlciIpOwotICAgIH0KLSAgICByZXR1cm4gKHZvaWQqKSBidWY7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMyMEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMjBIZWFkZXIuamF2YS1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxNWUwYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL0dMRVMyMEhlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgYW5kcm9pZC5vcGVuZ2w7Ci0KLS8qKiBPcGVuR0wgRVMgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHTEVTMjAgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDA0MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwNDAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FX0xPT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAzMDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NSQ19BTFBIQV9TQVRVUkFURSAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GVU5DX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsgICAvKiBzYW1lIGFzIEJMRU5EX0VRVUFUSU9OICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRVFVQVRJT05fQUxQSEEgICAgICAgICAgICAgICAgICAgID0gMHg4ODNEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgPSAweDgwMEI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0E7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTlNUQU5UX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9PTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IgICAgICAgICAgICAgICAgPSAweDgwMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09OU1RBTlRfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09ORV9NSU5VU19DT05TVEFOVF9BTFBIQSAgICAgICAgICAgICAgICA9IDB4ODAwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CTEVORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODkyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgPSAweDg4OTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgID0gMHg4ODk1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NUUkVBTV9EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CVUZGRVJfVVNBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ1VSUkVOVF9WRVJURVhfQVRUUklCICAgICAgICAgICAgICAgICAgID0gMHg4NjI2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MERFMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RJVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJEMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NDSVNTT1JfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgICAgICAgICAgPSAweDgwMzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgICAgICAgICAgID0gMHg4MDlFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlZBTElEX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX09VVF9PRl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA5MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgICAgICAgICAgPSAweDg0NkQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAgICAgICAgID0gMHg4NDZFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUk9OVF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjc0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgICAgICA9IDB4MEI5NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgICAgICAgPSAweDBCOTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CQUNLX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQkFDS19GQUlMICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODgwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgPSAweDg4MDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUyAgICAgICAgICAgID0gMHg4ODAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NURU5DSUxfQkFDS19SRUYgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0JBQ0tfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgPSAweDhDQTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CQUNLX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgID0gMHg4Q0E1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZJRVdQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDRjU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NQVhfVklFV1BPUlRfRElNUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEM0E7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFRF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HUkVFTl9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FMUEhBX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAgICAgICAgICA9IDB4MkEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgICAgICAgICAgPSAweDgwMzg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HXzJEICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDY5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9CVUZGRVJTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgICAgICAgICAgID0gMHg4MEFBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAgICAgICAgICA9IDB4ODBBQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgICAgICAgPSAweDg2QTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgICAgICAgICAgID0gMHg4NkEzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RPTlRfQ0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GQVNURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDBDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTBBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAgICAgICAgICA9IDB4ODAzMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgICAgICAgICAgPSAweDgwMzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgICAgICAgICAgID0gMHg4MzYzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQUdNRU5UX1NIQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjMwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9TSEFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjMxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WRVJURVhfQVRUUklCUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODY5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICAgICAgICAgICAgICAgID0gMHg4REZCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WQVJZSU5HX1ZFQ1RPUlMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4REZDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAgID0gMHg4QjREOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyAgICAgICAgICAgID0gMHg4QjRDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9URVhUVVJFX0lNQUdFX1VOSVRTICAgICAgICAgICAgICAgICAgID0gMHg4ODcyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMgICAgICAgICAgICAgID0gMHg4REZEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIQURFUl9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjRGOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFTEVURV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjgwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTktfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZBTElEQVRFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjgzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FUVEFDSEVEX1NIQURFUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjg1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDVElWRV9VTklGT1JNUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjg2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggICAgICAgICAgICAgICAgID0gMHg4Qjg3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDVElWRV9BVFRSSUJVVEVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjg5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCAgICAgICAgICAgICAgID0gMHg4QjhBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIQURJTkdfTEFOR1VBR0VfVkVSU0lPTiAgICAgICAgICAgICAgICAgID0gMHg4QjhDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NVUlJFTlRfUFJPR1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjhEOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTk9URVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTkNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI2MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNjAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgICA9IDB4MjcwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgICAgPSAweDI3MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICAgID0gMHgyNzAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICAgICA9IDB4MjcwMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfV1JBUF9TICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI4MDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgICAgICAgICAgPSAweDg1MTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgICAgICAgICAgID0gMHg4NTE1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAgICAgICAgICA9IDB4ODUxNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgICAgICAgICAgPSAweDg1MTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgICAgICAgICAgID0gMHg4NTE4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICAgICAgICAgICA9IDB4ODUxOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgICAgICAgICAgPSAweDg1MUE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgID0gMHg4NTFDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0QzQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Qzc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0E7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENCOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0Q0Q7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ3OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEREOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0REY7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyOTAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NMQU1QX1RPX0VER0UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyRjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVRfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjUwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1MTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5UX1ZFQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjUzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVF9WRUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTlRfVkVDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQk9PTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjU2OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0JPT0xfVkVDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1NzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9CT09MX1ZFQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNTg7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfQk9PTF9WRUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjU5OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZMT0FUX01BVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GTE9BVF9NQVQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNUI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRkxPQVRfTUFUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4QjVDOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NBTVBMRVJfMkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEI1RTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TQU1QTEVSX0NVQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCNjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEICAgICAgICAgICAgICAgICA9IDB4ODYyMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgID0gMHg4NjIzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgPSAweDg2MjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICA9IDB4ODYyNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9WRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQgICAgICAgICAgICAgID0gMHg4ODZBOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1ZFUlRFWF9BVFRSSUJfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgPSAweDg2NDU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICA9IDB4ODg5RjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEUgICAgICAgICAgICA9IDB4OEI5QTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCAgICAgICAgICA9IDB4OEI5QjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9DT01QSUxFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhCODE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfSU5GT19MT0dfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjg0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1NIQURFUl9TT1VSQ0VfTEVOR1RIICAgICAgICAgICAgICAgICAgICA9IDB4OEI4ODsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TSEFERVJfQ09NUElMRVIgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhERkE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU0hBREVSX0JJTkFSWV9GT1JNQVRTICAgICAgICAgICAgICAgICAgID0gMHg4REY4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05VTV9TSEFERVJfQklOQVJZX0ZPUk1BVFMgICAgICAgICAgICAgICA9IDB4OERGOTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MT1dfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhERjA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUVESVVNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4REYxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0hJR0hfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OERGMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9MT1dfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhERjM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUVESVVNX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4REY0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0hJR0hfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OERGNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JHQkE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1NjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SR0I1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDE2ICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9TVEVOQ0lMX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9JTkRFWDggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgPSAweDhENDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0lOVEVSTkFMX0ZPUk1BVCAgICAgICAgICAgID0gMHg4RDQ0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9SRURfU0laRSAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfR1JFRU5fU0laRSAgICAgICAgICAgICAgICAgPSAweDhENTE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRSAgICAgICAgICAgICAgICAgID0gMHg4RDUyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFICAgICAgICAgICAgICAgICA9IDB4OEQ1MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRSAgICAgICAgICAgICAgICAgPSAweDhENTQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSAgICAgICAgICAgICAgID0gMHg4RDU1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUgICAgICA9IDB4OENEMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FICAgICAgPSAweDhDRDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMICAgID0gMHg4Q0QyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFID0gMHg4Q0QzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQwICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDIwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEUgICAgICAgICAgICAgICAgICAgID0gMHg4Q0Q1OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCAgICAgICA9IDB4OENENjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVCAgICAgICAgICA9IDB4OENENzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMgICAgICAgPSAweDhDRDk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQgICAgICAgICAgICAgICAgID0gMHg4Q0REOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTF9SRU5ERVJCVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgPSAweDhDQTc7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgID0gMHg4NEU4OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdMX0lOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OICAgICAgICAgICA9IDB4MDUwNjsKLQotICAgIG5hdGl2ZSBwcml2YXRlIHN0YXRpYyB2b2lkIF9uYXRpdmVDbGFzc0luaXQoKTsKLSAgICBzdGF0aWMgewotCSAgICBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMjBjSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvR0xFUzIwY0hlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTI1NzcuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9HTEVTMjBjSGVhZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotI2luY2x1ZGUgImpuaS5oIgotI2luY2x1ZGUgIkpOSUhlbHAuaCIKLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9taXNjLmg+Ci0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLXN0YXRpYyBqY2xhc3MgbmlvQWNjZXNzQ2xhc3M7Ci1zdGF0aWMgamNsYXNzIGJ1ZmZlckNsYXNzOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlUG9pbnRlcklEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5T2Zmc2V0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgcG9zaXRpb25JRDsKLXN0YXRpYyBqZmllbGRJRCBsaW1pdElEOwotc3RhdGljIGpmaWVsZElEIGVsZW1lbnRTaXplU2hpZnRJRDsKLQotLyogQ2FjaGUgbWV0aG9kIElEcyBlYWNoIHRpbWUgdGhlIGNsYXNzIGlzIGxvYWRlZC4gKi8KLQotc3RhdGljIHZvaWQKLW5hdGl2ZUNsYXNzSW5pdChKTklFbnYgKl9lbnYsIGpjbGFzcyBnbEltcGxDbGFzcykKLXsKLSAgICBqY2xhc3MgbmlvQWNjZXNzQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vTklPQWNjZXNzIik7Ci0gICAgbmlvQWNjZXNzQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYobmlvQWNjZXNzQ2xhc3NMb2NhbCk7Ci0KLSAgICBqY2xhc3MgYnVmZmVyQ2xhc3NMb2NhbCA9IF9lbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vQnVmZmVyIik7Ci0gICAgYnVmZmVyQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoYnVmZmVyQ2xhc3NMb2NhbCk7Ci0KLSAgICBnZXRCYXNlUG9pbnRlcklEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZVBvaW50ZXIiLCAiKExqYXZhL25pby9CdWZmZXI7KUoiKTsKLSAgICBnZXRCYXNlQXJyYXlJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VBcnJheSIsICIoTGphdmEvbmlvL0J1ZmZlcjspTGphdmEvbGFuZy9PYmplY3Q7Iik7Ci0gICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXlPZmZzZXQiLCAiKExqYXZhL25pby9CdWZmZXI7KUkiKTsKLQotICAgIHBvc2l0aW9uSUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAicG9zaXRpb24iLCAiSSIpOwotICAgIGxpbWl0SUQgPSBfZW52LT5HZXRGaWVsZElEKGJ1ZmZlckNsYXNzLCAibGltaXQiLCAiSSIpOwotICAgIGVsZW1lbnRTaXplU2hpZnRJRCA9Ci0gICAgICAgIF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJfZWxlbWVudFNpemVTaGlmdCIsICJJIik7Ci19Ci0KLQotc3RhdGljIHZvaWQgKgotZ2V0UG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyLCBqYXJyYXkgKmFycmF5LCBqaW50ICpyZW1haW5pbmcpCi17Ci0gICAgamludCBwb3NpdGlvbjsKLSAgICBqaW50IGxpbWl0OwotICAgIGppbnQgZWxlbWVudFNpemVTaGlmdDsKLSAgICBqbG9uZyBwb2ludGVyOwotICAgIGppbnQgb2Zmc2V0OwotICAgIHZvaWQgKmRhdGE7Ci0KLSAgICBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7Ci0gICAgbGltaXQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGxpbWl0SUQpOwotICAgIGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgKnJlbWFpbmluZyA9IChsaW1pdCAtIHBvc2l0aW9uKSA8PCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIHBvaW50ZXIgPSBfZW52LT5DYWxsU3RhdGljTG9uZ01ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VQb2ludGVySUQsIGJ1ZmZlcik7Ci0gICAgaWYgKHBvaW50ZXIgIT0gMEwpIHsKLSAgICAgICAgKmFycmF5ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuICh2b2lkICopIChqaW50KSBwb2ludGVyOwotICAgIH0KLQotICAgICphcnJheSA9IChqYXJyYXkpIF9lbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlJRCwgYnVmZmVyKTsKLSAgICBvZmZzZXQgPSBfZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgZ2V0QmFzZUFycmF5T2Zmc2V0SUQsIGJ1ZmZlcik7Ci0gICAgZGF0YSA9IF9lbnYtPkdldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwoKmFycmF5LCAoamJvb2xlYW4gKikgMCk7Ci0KLSAgICByZXR1cm4gKHZvaWQgKikgKChjaGFyICopIGRhdGEgKyBvZmZzZXQpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1yZWxlYXNlUG9pbnRlcihKTklFbnYgKl9lbnYsIGphcnJheSBhcnJheSwgdm9pZCAqZGF0YSwgamJvb2xlYW4gY29tbWl0KQotewotICAgIF9lbnYtPlJlbGVhc2VQcmltaXRpdmVBcnJheUNyaXRpY2FsKGFycmF5LCBkYXRhLAotCQkJCQkgICBjb21taXQgPyAwIDogSk5JX0FCT1JUKTsKLX0KLQotc3RhdGljIHZvaWQgKgotZ2V0RGlyZWN0QnVmZmVyUG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyKSB7Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKSBfZW52LT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZikgewotICAgICAgICBqaW50IHBvc2l0aW9uID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBwb3NpdGlvbklEKTsKLSAgICAgICAgamludCBlbGVtZW50U2l6ZVNoaWZ0ID0gX2Vudi0+R2V0SW50RmllbGQoYnVmZmVyLCBlbGVtZW50U2l6ZVNoaWZ0SUQpOwotICAgICAgICBidWYgKz0gcG9zaXRpb24gPDwgZWxlbWVudFNpemVTaGlmdDsKLSAgICB9IGVsc2UgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJNdXN0IHVzZSBhIG5hdGl2ZSBvcmRlciBkaXJlY3QgQnVmZmVyIik7Ci0gICAgfQotICAgIHJldHVybiAodm9pZCopIGJ1ZjsKLX0KLQotc3RhdGljIGludAotZ2V0TnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkgewotICAgIGludCBudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSAwOwotICAgIGdsR2V0SW50ZWdlcnYoR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLCAmbnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKTsKLSAgICByZXR1cm4gbnVtQ29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOwotfQotCi1zdGF0aWMgdm9pZCBnbFZlcnRleEF0dHJpYlBvaW50ZXJCb3VuZHMoR0x1aW50IGluZHgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTGJvb2xlYW4gbm9ybWFsaXplZCwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCkgewotICAgIGdsVmVydGV4QXR0cmliUG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHBvaW50ZXIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFByb2dyYW1JbmZvTG9nLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRQcm9ncmFtSW5mb0xvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNmFiMjQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFByb2dyYW1JbmZvTG9nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogdm9pZCBnbEdldFByb2dyYW1JbmZvTG9nICggR0x1aW50IHNoYWRlciwgR0xzaXplaSBtYXhMZW5ndGgsIEdMc2l6ZWkqIGxlbmd0aCwgR0xjaGFyKiBpbmZvTG9nICkgKi8KLXN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfZ2xHZXRQcm9ncmFtSW5mb0xvZyhKTklFbnYgKl9lbnYsIGpvYmplY3QsIGppbnQgc2hhZGVyKSB7Ci0gICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgZ2xHZXRQcm9ncmFtaXYoc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZpbmZvTGVuKTsKLSAgICBpZiAoIWluZm9MZW4pIHsKLSAgICAgICAgcmV0dXJuIF9lbnYtPk5ld1N0cmluZ1VURigiIik7Ci0gICAgfQotICAgIGNoYXIqIGJ1ZiA9IChjaGFyKikgbWFsbG9jKGluZm9MZW4pOwotICAgIGlmIChidWYgPT0gTlVMTCkgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBnbEdldFByb2dyYW1JbmZvTG9nKHNoYWRlciwgaW5mb0xlbiwgTlVMTCwgYnVmKTsKLSAgICBqc3RyaW5nIHJlc3VsdCA9IF9lbnYtPk5ld1N0cmluZ1VURihidWYpOwotICAgIGZyZWUoYnVmKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFByb2dyYW1JbmZvTG9nLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0UHJvZ3JhbUluZm9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyZGYzOS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0UHJvZ3JhbUluZm9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0gICAgLy8gQyBmdW5jdGlvbiB2b2lkIGdsR2V0UHJvZ3JhbUluZm9Mb2coIEdMdWludCBwcm9ncmFtLCBHTHNpemVpIG1heExlbmd0aCwgR0xzaXplaSAqIGxlbmd0aCwKLSAJLy8gICAgIEdMY2hhciAqIGluZm9Mb2cpOwotCi0gICAgcHVibGljIHN0YXRpYyBuYXRpdmUgU3RyaW5nIGdsR2V0UHJvZ3JhbUluZm9Mb2coCi0gICAgICAgIGludCBwcm9ncmFtCi0gICAgKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRQcm9ncmFtSW5mb0xvZy5uYXRpdmVSZWcgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0UHJvZ3JhbUluZm9Mb2cubmF0aXZlUmVnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTUzZjJkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRQcm9ncmFtSW5mb0xvZy5uYXRpdmVSZWcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi17ImdsR2V0UHJvZ3JhbUluZm9Mb2ciLCAiKEkpTGphdmEvbGFuZy9TdHJpbmc7IiwgKHZvaWQgKikgYW5kcm9pZF9nbEdldFByb2dyYW1JbmZvTG9nIH0sCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U2hhZGVySW5mb0xvZy5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U2hhZGVySW5mb0xvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNjU2YjYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFNoYWRlckluZm9Mb2cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiB2b2lkIGdsR2V0U2hhZGVySW5mb0xvZyAoIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpKiBsZW5ndGgsIEdMY2hhciogaW5mb0xvZyApICovCi1zdGF0aWMganN0cmluZyBhbmRyb2lkX2dsR2V0U2hhZGVySW5mb0xvZyhKTklFbnYgKl9lbnYsIGpvYmplY3QsIGppbnQgc2hhZGVyKSB7Ci0gICAgR0xpbnQgaW5mb0xlbiA9IDA7Ci0gICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmluZm9MZW4pOwotICAgIGlmICghaW5mb0xlbikgewotICAgICAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKCIiKTsKLSAgICB9Ci0gICAgY2hhciogYnVmID0gKGNoYXIqKSBtYWxsb2MoaW5mb0xlbik7Ci0gICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIGpuaVRocm93RXhjZXB0aW9uKF9lbnYsICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGdsR2V0U2hhZGVySW5mb0xvZyhzaGFkZXIsIGluZm9MZW4sIE5VTEwsIGJ1Zik7Ci0gICAganN0cmluZyByZXN1bHQgPSBfZW52LT5OZXdTdHJpbmdVVEYoYnVmKTsKLSAgICBmcmVlKGJ1Zik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U2hhZGVySW5mb0xvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjUyOWMwLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotICAgIC8vIEMgZnVuY3Rpb24gdm9pZCBnbEdldFNoYWRlckluZm9Mb2coIEdMdWludCBzaGFkZXIsIEdMc2l6ZWkgbWF4TGVuZ3RoLCBHTHNpemVpICogbGVuZ3RoLAotIAkvLyAgICAgR0xjaGFyICogaW5mb0xvZyk7Ci0KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2xHZXRTaGFkZXJJbmZvTG9nKAotICAgICAgICBpbnQgc2hhZGVyCi0gICAgKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLm5hdGl2ZVJlZyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTaGFkZXJJbmZvTG9nLm5hdGl2ZVJlZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExNjNjMy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U2hhZGVySW5mb0xvZy5uYXRpdmVSZWcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi17ImdsR2V0U2hhZGVySW5mb0xvZyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKSBhbmRyb2lkX2dsR2V0U2hhZGVySW5mb0xvZyB9LApkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5jcHAgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5ZmU0YS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsR2V0U3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotLyogY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKSAqLw0KLXN0YXRpYyBqc3RyaW5nIGFuZHJvaWRfZ2xHZXRTdHJpbmcoSk5JRW52KiBfZW52LCBqb2JqZWN0LCBqaW50IG5hbWUpIHsNCi0gICAgY29uc3QgY2hhciogY2hhcnMgPSAoY29uc3QgY2hhciopIGdsR2V0U3RyaW5nKChHTGVudW0pIG5hbWUpOw0KLSAgICByZXR1cm4gX2Vudi0+TmV3U3RyaW5nVVRGKGNoYXJzKTsNCi19DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5qYXZhIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDJhMGQxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0gICAgLy8gQyBmdW5jdGlvbiBjb25zdCBHTHVieXRlICogZ2xHZXRTdHJpbmcgKCBHTGVudW0gbmFtZSApCi0KLSAgICBwdWJsaWMgc3RhdGljIG5hdGl2ZSBTdHJpbmcgZ2xHZXRTdHJpbmcoCi0gICAgICAgIGludCBuYW1lCi0gICAgKTsKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xHZXRTdHJpbmcubmF0aXZlUmVnIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5uYXRpdmVSZWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YWYzMWYuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbEdldFN0cmluZy5uYXRpdmVSZWcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi17ImdsR2V0U3RyaW5nIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopIGFuZHJvaWRfZ2xHZXRTdHJpbmcgfSwNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZDBmLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbGVzMTEvZ2xTaGFkZXJTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCi0vKiB2b2lkIGdsU2hhZGVyU291cmNlICggR0x1aW50IHNoYWRlciwgR0xzaXplaSBjb3VudCwgY29uc3QgR0xjaGFyICoqIHN0cmluZywgY29uc3QgR0xpbnQgKiBsZW5ndGggKSAqLwotc3RhdGljCi12b2lkCi1hbmRyb2lkX2dsU2hhZGVyU291cmNlCi0gICAgKEpOSUVudiAqX2Vudiwgam9iamVjdCBfdGhpcywgamludCBzaGFkZXIsIGpzdHJpbmcgc3RyaW5nKSB7Ci0KLSAgICBpZiAoIXN0cmluZykgewotICAgICAgICBqbmlUaHJvd0V4Y2VwdGlvbihfZW52LCAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsICJzdHJpbmcgPT0gbnVsbCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciogbmF0aXZlU3RyaW5nID0gX2Vudi0+R2V0U3RyaW5nVVRGQ2hhcnMoc3RyaW5nLCAwKTsKLSAgICBjb25zdCBjaGFyKiBzdHJpbmdzW10gPSB7bmF0aXZlU3RyaW5nfTsKLSAgICBnbFNoYWRlclNvdXJjZShzaGFkZXIsIDEsIHN0cmluZ3MsIDApOwotICAgIF9lbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhzdHJpbmcsIG5hdGl2ZVN0cmluZyk7Ci19CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmNlZjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbFNoYWRlclNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSAgICAvLyBDIGZ1bmN0aW9uIHZvaWQgZ2xTaGFkZXJTb3VyY2UgKCBHTHVpbnQgc2hhZGVyLCBHTHNpemVpIGNvdW50LCBjb25zdCBHTGNoYXIgKiogc3RyaW5nLCBjb25zdCBHTGludCogbGVuZ3RoICkKLQotICAgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIHZvaWQgZ2xTaGFkZXJTb3VyY2UoCi0gICAgICAgIGludCBzaGFkZXIsCi0gICAgICAgIFN0cmluZyBzdHJpbmcKLSAgICApOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsZXMxMS9nbFNoYWRlclNvdXJjZS5uYXRpdmVSZWcgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLm5hdGl2ZVJlZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NzgzYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xlczExL2dsU2hhZGVyU291cmNlLm5hdGl2ZVJlZworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXsiZ2xTaGFkZXJTb3VyY2UiLCAiKElMamF2YS9sYW5nL1N0cmluZzspViIsICh2b2lkICopIGFuZHJvaWRfZ2xTaGFkZXJTb3VyY2UgfSwKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMEV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDEwRXh0SGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTk5YzIuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDEwRXh0SGVhZGVyLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEdMMTBFeHQgZXh0ZW5kcyBHTCB7Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDEwSGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOTI4MjEuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDEwSGVhZGVyLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAotKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAotKioKLSoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKLSoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vIFRoaXMgc291cmNlIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKLQotcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKLQotcHVibGljIGludGVyZmFjZSBHTDEwIGV4dGVuZHMgR0wgewotICAgIGludCBHTF9BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTA0OwotICAgIGludCBHTF9BTElBU0VEX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZFOwotICAgIGludCBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgICAgICAgID0gMHg4NDZEOwotICAgIGludCBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA2OwotICAgIGludCBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU1OwotICAgIGludCBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMwOwotICAgIGludCBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA3OwotICAgIGludCBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAwOwotICAgIGludCBHTF9BTUJJRU5UX0FORF9ESUZGVVNFICAgICAgICAgICAgICAgICAgID0gMHgxNjAyOwotICAgIGludCBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAxOwotICAgIGludCBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA0OwotICAgIGludCBHTF9BTkRfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAyOwotICAgIGludCBHTF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNDA1OwotICAgIGludCBHTF9CTEVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUyOwotICAgIGludCBHTF9CTFVFX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU0OwotICAgIGludCBHTF9CWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwOwotICAgIGludCBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAxOwotICAgIGludCBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTJGOwotICAgIGludCBHTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAwOwotICAgIGludCBHTF9DT0xPUl9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc2OwotICAgIGludCBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHg0MDAwOwotICAgIGludCBHTF9DT0xPUl9MT0dJQ19PUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkYyOwotICAgIGludCBHTF9DT0xPUl9NQVRFUklBTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU3OwotICAgIGludCBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgICAgID0gMHg4NkEzOwotICAgIGludCBHTF9DT05TVEFOVF9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgID0gMHgxMjA3OwotICAgIGludCBHTF9DT1BZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTAzOwotICAgIGludCBHTF9DT1BZX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBDOwotICAgIGludCBHTF9DVUxMX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ0OwotICAgIGludCBHTF9DVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwOTAwOwotICAgIGludCBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMTAxOwotICAgIGludCBHTF9ERUNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAzOwotICAgIGludCBHTF9ERVBUSF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU2OwotICAgIGludCBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwOwotICAgIGludCBHTF9ERVBUSF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcxOwotICAgIGludCBHTF9ESUZGVVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAxOwotICAgIGludCBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkQwOwotICAgIGludCBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMTAwOwotICAgIGludCBHTF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA0OwotICAgIGludCBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzA2OwotICAgIGludCBHTF9FTUlTU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAwOwotICAgIGludCBHTF9FUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjAyOwotICAgIGludCBHTF9FUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA5OwotICAgIGludCBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAwOwotICAgIGludCBHTF9FWFAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwODAxOwotICAgIGludCBHTF9FWFRFTlNJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAzOwotICAgIGludCBHTF9GQUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICBpbnQgR0xfRkFTVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMTsKLSAgICBpbnQgR0xfRklYRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwQzsKLSAgICBpbnQgR0xfRkxBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMDsKLSAgICBpbnQgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwNjsKLSAgICBpbnQgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MDsKLSAgICBpbnQgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NjsKLSAgICBpbnQgR0xfRk9HX0RFTlNJVFkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MjsKLSAgICBpbnQgR0xfRk9HX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NDsKLSAgICBpbnQgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1NDsKLSAgICBpbnQgR0xfRk9HX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2NTsKLSAgICBpbnQgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI2MzsKLSAgICBpbnQgR0xfRlJPTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNDsKLSAgICBpbnQgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwODsKLSAgICBpbnQgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNjsKLSAgICBpbnQgR0xfR1JFQVRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNDsKLSAgICBpbnQgR0xfR1JFRU5fQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MzsKLSAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTICA9IDB4OEI5QjsKLSAgICBpbnQgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAgICA9IDB4OEI5QTsKLSAgICBpbnQgR0xfSU5DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMjsKLSAgICBpbnQgR0xfSU5WQUxJRF9FTlVNICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMDsKLSAgICBpbnQgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMjsKLSAgICBpbnQgR0xfSU5WQUxJRF9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMTsKLSAgICBpbnQgR0xfSU5WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQTsKLSAgICBpbnQgR0xfS0VFUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMDsKLSAgICBpbnQgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMzsKLSAgICBpbnQgR0xfTEVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMTsKLSAgICBpbnQgR0xfTElHSFRfTU9ERUxfQU1CSUVOVCAgICAgICAgICAgICAgICAgICA9IDB4MEI1MzsKLSAgICBpbnQgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgICAgICAgICA9IDB4MEI1MjsKLSAgICBpbnQgR0xfTElHSFQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDsKLSAgICBpbnQgR0xfTElHSFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMTsKLSAgICBpbnQgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMjsKLSAgICBpbnQgR0xfTElHSFQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMzsKLSAgICBpbnQgR0xfTElHSFQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNDsKLSAgICBpbnQgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNTsKLSAgICBpbnQgR0xfTElHSFQ2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNjsKLSAgICBpbnQgR0xfTElHSFQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwNzsKLSAgICBpbnQgR0xfTElHSFRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1MDsKLSAgICBpbnQgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMjsKLSAgICBpbnQgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIyMDsKLSAgICBpbnQgR0xfTElORV9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MjsKLSAgICBpbnQgR0xfTElORV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMzsKLSAgICBpbnQgR0xfTElORUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMTsKLSAgICBpbnQgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICAgICA9IDB4MTIwODsKLSAgICBpbnQgR0xfTElORUFSX01JUE1BUF9MSU5FQVIgICAgICAgICAgICAgICAgICA9IDB4MjcwMzsKLSAgICBpbnQgR0xfTElORUFSX01JUE1BUF9ORUFSRVNUICAgICAgICAgICAgICAgICA9IDB4MjcwMTsKLSAgICBpbnQgR0xfTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTsKLSAgICBpbnQgR0xfTFVNSU5BTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwOTsKLSAgICBpbnQgR0xfTFVNSU5BTkNFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwQTsKLSAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX0lORElDRVMgICAgICAgICAgICAgICAgICA9IDB4ODBFOTsKLSAgICBpbnQgR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTICAgICAgICAgICAgICAgICA9IDB4ODBFODsKLSAgICBpbnQgR0xfTUFYX0xJR0hUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMTsKLSAgICBpbnQgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgICAgICAgICA9IDB4MEQzNjsKLSAgICBpbnQgR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICA9IDB4MEQzODsKLSAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzMzsKLSAgICBpbnQgR0xfTUFYX1RFWFRVUkVfU1RBQ0tfREVQVEggICAgICAgICAgICAgICA9IDB4MEQzOTsKLSAgICBpbnQgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgICAgICAgICA9IDB4ODRFMjsKLSAgICBpbnQgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgICAgICAgICA9IDB4MEQzQTsKLSAgICBpbnQgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMDsKLSAgICBpbnQgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjEwMDsKLSAgICBpbnQgR0xfTVVMVElTQU1QTEUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA5RDsKLSAgICBpbnQgR0xfTkFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRTsKLSAgICBpbnQgR0xfTkVBUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjYwMDsKLSAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICA9IDB4MjcwMjsKLSAgICBpbnQgR0xfTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICA9IDB4MjcwMDsKLSAgICBpbnQgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMDsKLSAgICBpbnQgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMjsKLSAgICBpbnQgR0xfTk9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgaW50IEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDU7Ci0gICAgaW50IEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDg7Ci0gICAgaW50IEdMX05PUk1BTF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzU7Ci0gICAgaW50IEdMX05PUk1BTElaRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTE7Ci0gICAgaW50IEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDU7Ci0gICAgaW50IEdMX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyAgICAgICAgPSAweDg2QTI7Ci0gICAgaW50IEdMX09ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzA1OwotICAgIGludCBHTF9PTkVfTUlOVVNfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzA3OwotICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgID0gMHgwMzAzOwotICAgIGludCBHTF9PTkVfTUlOVVNfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgID0gMHgwMzAxOwotICAgIGludCBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA3OwotICAgIGludCBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBEOwotICAgIGludCBHTF9PUl9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBCOwotICAgIGludCBHTF9PVVRfT0ZfTUVNT1JZICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA1OwotICAgIGludCBHTF9QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDA1OwotICAgIGludCBHTF9QQUxFVFRFNF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4QjkyOwotICAgIGludCBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk0OwotICAgIGludCBHTF9QQUxFVFRFNF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4QjkwOwotICAgIGludCBHTF9QQUxFVFRFNF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkzOwotICAgIGludCBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjkxOwotICAgIGludCBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgICAgICAgID0gMHg4Qjk3OwotICAgIGludCBHTF9QQUxFVFRFOF9SR0I1X0ExX09FUyAgICAgICAgICAgICAgICAgID0gMHg4Qjk5OwotICAgIGludCBHTF9QQUxFVFRFOF9SR0I4X09FUyAgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk1OwotICAgIGludCBHTF9QQUxFVFRFOF9SR0JBNF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk4OwotICAgIGludCBHTF9QQUxFVFRFOF9SR0JBOF9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4Qjk2OwotICAgIGludCBHTF9QRVJTUEVDVElWRV9DT1JSRUNUSU9OX0hJTlQgICAgICAgICAgID0gMHgwQzUwOwotICAgIGludCBHTF9QT0lOVF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjEwOwotICAgIGludCBHTF9QT0lOVF9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICAgID0gMHgwQzUxOwotICAgIGludCBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDAwOwotICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgID0gMHg4MTI4OwotICAgIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjExOwotICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9GSUxMICAgICAgICAgICAgICAgICAgID0gMHg4MDM3OwotICAgIGludCBHTF9QT0xZR09OX1NNT09USF9ISU5UICAgICAgICAgICAgICAgICAgID0gMHgwQzUzOwotICAgIGludCBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAzOwotICAgIGludCBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAxOwotICAgIGludCBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgID0gMHgxMjA5OwotICAgIGludCBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUyOwotICAgIGludCBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRjAxOwotICAgIGludCBHTF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyOTAxOwotICAgIGludCBHTF9SRVBMQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRTAxOwotICAgIGludCBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDNBOwotICAgIGludCBHTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA3OwotICAgIGludCBHTF9SR0JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTA4OwotICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UgICAgICAgICAgICAgID0gMHg4MDlFOwotICAgIGludCBHTF9TQU1QTEVfQUxQSEFfVE9fT05FICAgICAgICAgICAgICAgICAgID0gMHg4MDlGOwotICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEEwOwotICAgIGludCBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzExOwotICAgIGludCBHTF9TRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTBGOwotICAgIGludCBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNjAxOwotICAgIGludCBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyOwotICAgIGludCBHTF9TTU9PVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxRDAxOwotICAgIGludCBHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjIyOwotICAgIGludCBHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSAgICAgICAgICAgICAgID0gMHgwQjEyOwotICAgIGludCBHTF9TUEVDVUxBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjAyOwotICAgIGludCBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA2OwotICAgIGludCBHTF9TUE9UX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA0OwotICAgIGludCBHTF9TUE9UX0VYUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMjA1OwotICAgIGludCBHTF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAyOwotICAgIGludCBHTF9TUkNfQUxQSEFfU0FUVVJBVEUgICAgICAgICAgICAgICAgICAgID0gMHgwMzA4OwotICAgIGludCBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMzAwOwotICAgIGludCBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTAzOwotICAgIGludCBHTF9TVEFDS19VTkRFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgID0gMHgwNTA0OwotICAgIGludCBHTF9TVEVOQ0lMX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDU3OwotICAgIGludCBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgICAgICAgID0gMHgwNDAwOwotICAgIGludCBHTF9TVEVOQ0lMX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkwOwotICAgIGludCBHTF9TVUJQSVhFTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDUwOwotICAgIGludCBHTF9URVhUVVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNzAyOwotICAgIGludCBHTF9URVhUVVJFXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwREUxOwotICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZICAgICAgICAgICAgICAgICAgID0gMHg4MDc4OwotICAgIGludCBHTF9URVhUVVJFX0VOViAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMzAwOwotICAgIGludCBHTF9URVhUVVJFX0VOVl9DT0xPUiAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAxOwotICAgIGludCBHTF9URVhUVVJFX0VOVl9NT0RFICAgICAgICAgICAgICAgICAgICAgID0gMHgyMjAwOwotICAgIGludCBHTF9URVhUVVJFX01BR19GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAwOwotICAgIGludCBHTF9URVhUVVJFX01JTl9GSUxURVIgICAgICAgICAgICAgICAgICAgID0gMHgyODAxOwotICAgIGludCBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAyOwotICAgIGludCBHTF9URVhUVVJFX1dSQVBfVCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyODAzOwotICAgIGludCBHTF9URVhUVVJFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMwOwotICAgIGludCBHTF9URVhUVVJFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMxOwotICAgIGludCBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMyOwotICAgIGludCBHTF9URVhUVVJFMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEMzOwotICAgIGludCBHTF9URVhUVVJFNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM0OwotICAgIGludCBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM1OwotICAgIGludCBHTF9URVhUVVJFNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM2OwotICAgIGludCBHTF9URVhUVVJFNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM3OwotICAgIGludCBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM4OwotICAgIGludCBHTF9URVhUVVJFOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEM5OwotICAgIGludCBHTF9URVhUVVJFMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENBOwotICAgIGludCBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENCOwotICAgIGludCBHTF9URVhUVVJFMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENDOwotICAgIGludCBHTF9URVhUVVJFMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENEOwotICAgIGludCBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENFOwotICAgIGludCBHTF9URVhUVVJFMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NENGOwotICAgIGludCBHTF9URVhUVVJFMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQwOwotICAgIGludCBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQxOwotICAgIGludCBHTF9URVhUVVJFMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQyOwotICAgIGludCBHTF9URVhUVVJFMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQzOwotICAgIGludCBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ0OwotICAgIGludCBHTF9URVhUVVJFMjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ1OwotICAgIGludCBHTF9URVhUVVJFMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ2OwotICAgIGludCBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ3OwotICAgIGludCBHTF9URVhUVVJFMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ4OwotICAgIGludCBHTF9URVhUVVJFMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEQ5OwotICAgIGludCBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERBOwotICAgIGludCBHTF9URVhUVVJFMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERCOwotICAgIGludCBHTF9URVhUVVJFMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERDOwotICAgIGludCBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEREOwotICAgIGludCBHTF9URVhUVVJFMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERFOwotICAgIGludCBHTF9URVhUVVJFMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NERGOwotICAgIGludCBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA2OwotICAgIGludCBHTF9UUklBTkdMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA1OwotICAgIGludCBHTF9UUklBTkdMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDA0OwotICAgIGludCBHTF9UUlVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBpbnQgR0xfVU5QQUNLX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MENGNTsKLSAgICBpbnQgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMTsKLSAgICBpbnQgR0xfVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMzsKLSAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgICAgICAgICA9IDB4ODAzMzsKLSAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV81XzVfMSAgICAgICAgICAgICAgICA9IDB4ODAzNDsKLSAgICBpbnQgR0xfVU5TSUdORURfU0hPUlRfNV82XzUgICAgICAgICAgICAgICAgICA9IDB4ODM2MzsKLSAgICBpbnQgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMDsKLSAgICBpbnQgR0xfVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMjsKLSAgICBpbnQgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NDsKLSAgICBpbnQgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNjsKLSAgICBpbnQgR0xfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExRXh0SGVhZGVyLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZTIxNjQuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExRXh0SGVhZGVyLmphdmEtaWYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHQgZXh0ZW5kcyBHTCB7Ci0gICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgPSAweDhCOUU7Ci0gICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgPSAweDg4NDQ7Ci0gICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgPSAweDg4NDk7Ci0gICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgPSAweDg4NDY7Ci0gICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgPSAweDg4NDg7Ci0gICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgPSAweDg4NDc7Ci0gICAgaW50IEdMX01BVFJJWF9QQUxFVFRFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDg4NDA7Ci0gICAgaW50IEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyAgICAgICAgICAgICAgPSAweDg4NDI7Ci0gICAgaW50IEdMX01BWF9WRVJURVhfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgPSAweDg2QTQ7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUyAgICAgICAgICAgICAgICAgPSAweDhCOUQ7Ci0gICAgaW50IEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgICAgPSAweDg4OUU7Ci0gICAgaW50IEdMX1dFSUdIVF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUQ7Ci0gICAgaW50IEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgPSAweDg2QUM7Ci0gICAgaW50IEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgPSAweDg2QUI7Ci0gICAgaW50IEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgICAgPSAweDg2QUE7Ci0gICAgaW50IEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgICAgPSAweDg2QTk7Ci0KLSAgICB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtLCBpbnQgb2Zmc2V0KTsKLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTDExRXh0ZW5zaW9uUGFja0hlYWRlci5qYXZhLWlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAwMTkxLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHRlbnNpb25QYWNrIGV4dGVuZHMgR0wgewotICAgIGludCBHTF9CTEVORF9EU1RfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0E7Ci0gICAgaW50IEdMX0JMRU5EX0RTVF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDODsKLSAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OwotICAgIGludCBHTF9CTEVORF9FUVVBVElPTl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4M0Q7Ci0gICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwOTsKLSAgICBpbnQgR0xfQkxFTkRfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MENCOwotICAgIGludCBHTF9CTEVORF9TUkNfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQzk7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMDsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UxOwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTI7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMzsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U0OwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTU7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ2X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNjsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U3OwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTg7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ5X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFOTsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEwX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VBOwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTFfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUI7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQzsKLSAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEzX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VEOwotICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUU7Ci0gICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRjsKLSAgICBpbnQgR0xfREVDUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA4OwotICAgIGludCBHTF9ERVBUSF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhEMDA7Ci0gICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwMjsKLSAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE1OwotICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTY7Ci0gICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNzsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRV9PRVMgICAgICAgICAgID0gMHg4Q0QxOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFX09FUyAgICAgICAgICAgPSAweDhDRDA7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFX09FUyA9IDB4OENEMzsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMX09FUyAgICAgICAgID0gMHg4Q0QyOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDQTY7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENENTsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgID0gMHg4Q0Q2OwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlNfT0VTICAgICAgICAgICAgPSAweDhDRDk7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRFJBV19CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQjsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9GT1JNQVRTX09FUyAgICAgICAgICAgICAgID0gMHg4Q0RBOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX01JU1NJTkdfQVRUQUNITUVOVF9PRVMgICAgPSAweDhDRDc7Ci0gICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfUkVBRF9CVUZGRVJfT0VTICAgICAgICAgICA9IDB4OENEQzsKLSAgICBpbnQgR0xfRlJBTUVCVUZGRVJfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQwOwotICAgIGludCBHTF9GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRF9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREQ7Ci0gICAgaW50IEdMX0ZVTkNfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwNjsKLSAgICBpbnQgR0xfRlVOQ19SRVZFUlNFX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDBCOwotICAgIGludCBHTF9GVU5DX1NVQlRSQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEE7Ci0gICAgaW50IEdMX0lOQ1JfV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUwNzsKLSAgICBpbnQgR0xfSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT05fT0VTICAgICAgICAgICAgICAgID0gMHgwNTA2OwotICAgIGludCBHTF9NQVhfQ09MT1JfQVRUQUNITUVOVFNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDREY7Ci0gICAgaW50IEdMX01BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQzsKLSAgICBpbnQgR0xfTUFYX1JFTkRFUkJVRkZFUl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU4OwotICAgIGludCBHTF9NSVJST1JFRF9SRVBFQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgzNzA7Ci0gICAgaW50IEdMX05PUk1BTF9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMTsKLSAgICBpbnQgR0xfUkVGTEVDVElPTl9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTEyOwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQUxQSEFfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTM7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9CSU5ESU5HX09FUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNzsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JMVUVfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUyOwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfREVQVEhfU0laRV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTQ7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9HUkVFTl9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MTsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0hFSUdIVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQzOwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUX09FUyAgICAgICAgICAgICAgICAgPSAweDhENDQ7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MTsKLSAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1JFRF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUwOwotICAgIGludCBHTF9SRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhENTU7Ci0gICAgaW50IEdMX1JFTkRFUkJVRkZFUl9XSURUSF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0MjsKLSAgICBpbnQgR0xfUkdCNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU3OwotICAgIGludCBHTF9SR0I1NjVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjI7Ci0gICAgaW50IEdMX1JHQjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1MTsKLSAgICBpbnQgR0xfUkdCQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDU2OwotICAgIGludCBHTF9SR0JBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTg7Ci0gICAgaW50IEdMX1NURU5DSUxfQVRUQUNITUVOVF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQyMDsKLSAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAxOwotICAgIGludCBHTF9TVEVOQ0lMX0lOREVYMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDY7Ci0gICAgaW50IEdMX1NURU5DSUxfSU5ERVg0X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NzsKLSAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDhfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ4OwotICAgIGludCBHTF9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAtMTsKLSAgICBpbnQgR0xfVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE0OwotICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTM7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNjsKLSAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE4OwotICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MUE7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxNTsKLSAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE3OwotICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ogICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTk7Ci0gICAgaW50IEdMX1RFWFRVUkVfR0VOX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjUwMDsKLSAgICBpbnQgR0xfVEVYVFVSRV9HRU5fU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDYwOwotCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTFIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUhlYWRlci5qYXZhLWlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGU1YTZiLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUhlYWRlci5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSoqCi0qKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCi0qKgotKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCi0qKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgR0wxMSBleHRlbmRzIEdMMTAgewotICAgIGludCBHTF9BQ1RJVkVfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTA7Ci0gICAgaW50IEdMX0FERF9TSUdORUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NDsKLSAgICBpbnQgR0xfQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDFDOwotICAgIGludCBHTF9BTFBIQV9URVNUX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzE7Ci0gICAgaW50IEdMX0FMUEhBX1RFU1RfUkVGICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMjsKLSAgICBpbnQgR0xfQVJSQVlfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODkyOwotICAgIGludCBHTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgICAgICAgPSAweDg4OTQ7Ci0gICAgaW50IEdMX0JMRU5EX0RTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMDsKLSAgICBpbnQgR0xfQkxFTkRfU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkUxOwotICAgIGludCBHTF9CVUZGRVJfQUNDRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4QkI7Ci0gICAgaW50IEdMX0JVRkZFUl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NDsKLSAgICBpbnQgR0xfQlVGRkVSX1VTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NzY1OwotICAgIGludCBHTF9DTElFTlRfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgPSAweDg0RTE7Ci0gICAgaW50IEdMX0NMSVBfUExBTkUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMDsKLSAgICBpbnQgR0xfQ0xJUF9QTEFORTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAxOwotICAgIGludCBHTF9DTElQX1BMQU5FMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDI7Ci0gICAgaW50IEdMX0NMSVBfUExBTkUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMzsKLSAgICBpbnQgR0xfQ0xJUF9QTEFORTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA0OwotICAgIGludCBHTF9DTElQX1BMQU5FNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDU7Ci0gICAgaW50IEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgICA9IDB4ODg5ODsKLSAgICBpbnQgR0xfQ09MT1JfQVJSQVlfUE9JTlRFUiAgICAgICAgICAgICAgICAgICAgID0gMHg4MDkwOwotICAgIGludCBHTF9DT0xPUl9BUlJBWV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODE7Ci0gICAgaW50IEdMX0NPTE9SX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MzsKLSAgICBpbnQgR0xfQ09MT1JfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgyOwotICAgIGludCBHTF9DT0xPUl9DTEVBUl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjI7Ci0gICAgaW50IEdMX0NPTE9SX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMyMzsKLSAgICBpbnQgR0xfQ09NQklORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcwOwotICAgIGludCBHTF9DT01CSU5FX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzI7Ci0gICAgaW50IEdMX0NPTUJJTkVfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MTsKLSAgICBpbnQgR0xfQ09OU1RBTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc2OwotICAgIGludCBHTF9DT09SRF9SRVBMQUNFX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjI7Ci0gICAgaW50IEdMX0NVTExfRkFDRV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NTsKLSAgICBpbnQgR0xfQ1VSUkVOVF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAwOwotICAgIGludCBHTF9DVVJSRU5UX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMDI7Ci0gICAgaW50IEdMX0NVUlJFTlRfVEVYVFVSRV9DT09SRFMgICAgICAgICAgICAgICAgICA9IDB4MEIwMzsKLSAgICBpbnQgR0xfREVQVEhfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjczOwotICAgIGludCBHTF9ERVBUSF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzQ7Ci0gICAgaW50IEdMX0RFUFRIX1JBTkdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MDsKLSAgICBpbnQgR0xfREVQVEhfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjcyOwotICAgIGludCBHTF9ET1QzX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUU7Ci0gICAgaW50IEdMX0RPVDNfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODZBRjsKLSAgICBpbnQgR0xfRFlOQU1JQ19EUkFXICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU4OwotICAgIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgPSAweDg4OTM7Ci0gICAgaW50IEdMX0VMRU1FTlRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICA9IDB4ODg5NTsKLSAgICBpbnQgR0xfRlJPTlRfRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjQ2OwotICAgIGludCBHTF9HRU5FUkFURV9NSVBNQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxOTE7Ci0gICAgaW50IEdMX0dFTkVSQVRFX01JUE1BUF9ISU5UICAgICAgICAgICAgICAgICAgICA9IDB4ODE5MjsKLSAgICBpbnQgR0xfSU5URVJQT0xBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc1OwotICAgIGludCBHTF9MSU5FX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMjE7Ci0gICAgaW50IEdMX0xPR0lDX09QX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMDsKLSAgICBpbnQgR0xfTUFUUklYX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEwOwotICAgIGludCBHTF9NQVhfQ0xJUF9QTEFORVMgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzI7Ci0gICAgaW50IEdMX01PREVMVklFV19NQVRSSVggICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNjsKLSAgICBpbnQgR0xfTU9ERUxWSUVXX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgID0gMHg4OThEOwotICAgIGludCBHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICAgPSAweDBCQTM7Ci0gICAgaW50IEdMX05PUk1BTF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NzsKLSAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhGOwotICAgIGludCBHTF9OT1JNQUxfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0Y7Ci0gICAgaW50IEdMX05PUk1BTF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3RTsKLSAgICBpbnQgR0xfT1BFUkFORDBfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTk4OwotICAgIGludCBHTF9PUEVSQU5EMF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTA7Ci0gICAgaW50IEdMX09QRVJBTkQxX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5OTsKLSAgICBpbnQgR0xfT1BFUkFORDFfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkxOwotICAgIGludCBHTF9PUEVSQU5EMl9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OUE7Ci0gICAgaW50IEdMX09QRVJBTkQyX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MjsKLSAgICBpbnQgR0xfUE9JTlRfRElTVEFOQ0VfQVRURU5VQVRJT04gICAgICAgICAgICAgID0gMHg4MTI5OwotICAgIGludCBHTF9QT0lOVF9GQURFX1RIUkVTSE9MRF9TSVpFICAgICAgICAgICAgICAgPSAweDgxMjg7Ci0gICAgaW50IEdMX1BPSU5UX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKLSAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgID0gMHg4QjlGOwotICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDhCOUM7Ci0gICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfUE9JTlRFUl9PRVMgICAgICAgICAgICA9IDB4ODk4QzsKLSAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgID0gMHg4OThCOwotICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTICAgICAgICAgICAgICAgPSAweDg5OEE7Ci0gICAgaW50IEdMX1BPSU5UX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyNzsKLSAgICBpbnQgR0xfUE9JTlRfU0laRV9NSU4gICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTI2OwotICAgIGludCBHTF9QT0lOVF9TUFJJVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4NjE7Ci0gICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUiAgICAgICAgICAgICAgICAgICA9IDB4ODAzODsKLSAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfVU5JVFMgICAgICAgICAgICAgICAgICAgID0gMHgyQTAwOwotICAgIGludCBHTF9QUkVWSU9VUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1Nzg7Ci0gICAgaW50IEdMX1BSSU1BUllfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NzsKLSAgICBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVggICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE3OwotICAgIGludCBHTF9QUk9KRUNUSU9OX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgPSAweDg5OEU7Ci0gICAgaW50IEdMX1BST0pFQ1RJT05fU1RBQ0tfREVQVEggICAgICAgICAgICAgICAgICA9IDB4MEJBNDsKLSAgICBpbnQgR0xfUkdCX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTczOwotICAgIGludCBHTF9TQU1QTEVfQlVGRkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTg7Ci0gICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9JTlZFUlQgICAgICAgICAgICAgICAgICA9IDB4ODBBQjsKLSAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFX1ZBTFVFICAgICAgICAgICAgICAgICAgID0gMHg4MEFBOwotICAgIGludCBHTF9TQU1QTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQTk7Ci0gICAgaW50IEdMX1NDSVNTT1JfQk9YICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMDsKLSAgICBpbnQgR0xfU0hBREVfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjU0OwotICAgIGludCBHTF9TUkMwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODg7Ci0gICAgaW50IEdMX1NSQzBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MDsKLSAgICBpbnQgR0xfU1JDMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg5OwotICAgIGludCBHTF9TUkMxX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODE7Ci0gICAgaW50IEdMX1NSQzJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4QTsKLSAgICBpbnQgR0xfU1JDMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgyOwotICAgIGludCBHTF9TVEFUSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4RTQ7Ci0gICAgaW50IEdMX1NURU5DSUxfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MTsKLSAgICBpbnQgR0xfU1RFTkNJTF9GQUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk0OwotICAgIGludCBHTF9TVEVOQ0lMX0ZVTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTI7Ci0gICAgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9GQUlMICAgICAgICAgICAgICAgICA9IDB4MEI5NTsKLSAgICBpbnQgR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MgICAgICAgICAgICAgICAgID0gMHgwQjk2OwotICAgIGludCBHTF9TVEVOQ0lMX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTc7Ci0gICAgaW50IEdMX1NURU5DSUxfVkFMVUVfTUFTSyAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MzsKLSAgICBpbnQgR0xfU1RFTkNJTF9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk4OwotICAgIGludCBHTF9TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTc7Ci0gICAgaW50IEdMX1RFWFRVUkVfQklORElOR18yRCAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA2OTsKLSAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgID0gMHg4ODlBOwotICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgPSAweDgwOTI7Ci0gICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU0laRSAgICAgICAgICAgICAgICA9IDB4ODA4ODsKLSAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgID0gMHg4MDhBOwotICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgPSAweDgwODk7Ci0gICAgaW50IEdMX1RFWFRVUkVfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBODsKLSAgICBpbnQgR0xfVEVYVFVSRV9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICAgID0gMHg4OThGOwotICAgIGludCBHTF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTU7Ci0gICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICA9IDB4ODg5NjsKLSAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgID0gMHg4MDhFOwotICAgIGludCBHTF9WRVJURVhfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0E7Ci0gICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QzsKLSAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdCOwotICAgIGludCBHTF9WSUVXUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTI7Ci0gICAgaW50IEdMX1dSSVRFX09OTFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhCOTsKLQotICAgIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcyk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMMTFJbXBsSGVhZGVyLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFiZTY1Li4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0wxMUltcGxIZWFkZXIuamF2YS1pbXBsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOwotCi1pbXBvcnQgamF2YS5uaW8uQnVmZmVyOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci0KLXB1YmxpYyBjbGFzcyBHTDExSW1wbCBpbXBsZW1lbnRzIEdMMTEgewotCi0gICAgLy8gUHJpdmF0ZSBhY2Nlc3NvcnMgZm9yIG5hdGl2ZSBjb2RlCi0KLSAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgc3RhdGljIHsKLQlfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgfQotCi0gICAgQnVmZmVyIF9jb2xvclBvaW50ZXIgPSBudWxsOwotICAgIEJ1ZmZlciBfbm9ybWFsUG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF90ZXhDb29yZFBvaW50ZXIgPSBudWxsOwotICAgIEJ1ZmZlciBfdmVydGV4UG9pbnRlciA9IG51bGw7Ci0KLSAgICBwdWJsaWMgR0wxMUltcGwoKSB7Ci0gICAgfQotCi0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xDSGVhZGVyLmNwcCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xDSGVhZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczMTVlZS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMQ0hlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotKioKLSoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotCi0vLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0KLSNpbmNsdWRlICJqbmkuaCIKLSNpbmNsdWRlICJKTklIZWxwLmgiCi0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0jaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotLy8gV29yayBhcm91bmQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZ2VuZXJhdGVkIG5hbWUgYW5kIHRoZSBhY3R1YWwgbmFtZS4KLQotI2RlZmluZSBnbEJsZW5kRXF1YXRpb24gZ2xCbGVuZEVxdWF0aW9uT0VTCi0jZGVmaW5lIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlIGdsQmxlbmRFcXVhdGlvblNlcGFyYXRlT0VTCi0jZGVmaW5lIGdsQmxlbmRGdW5jU2VwYXJhdGUgZ2xCbGVuZEZ1bmNTZXBhcmF0ZU9FUwotI2RlZmluZSBnbEdldFRleEdlbmZ2IGdsR2V0VGV4R2VuZnZPRVMKLSNkZWZpbmUgZ2xHZXRUZXhHZW5pdiBnbEdldFRleEdlbml2T0VTCi0jZGVmaW5lIGdsR2V0VGV4R2VueHYgZ2xHZXRUZXhHZW54dk9FUwotI2RlZmluZSBnbFRleEdlbmYgZ2xUZXhHZW5mT0VTCi0jZGVmaW5lIGdsVGV4R2VuZnYgZ2xUZXhHZW5mdk9FUwotI2RlZmluZSBnbFRleEdlbmkgZ2xUZXhHZW5pT0VTCi0jZGVmaW5lIGdsVGV4R2VuaXYgZ2xUZXhHZW5pdk9FUwotI2RlZmluZSBnbFRleEdlbnggZ2xUZXhHZW54T0VTCi0jZGVmaW5lIGdsVGV4R2VueHYgZ2xUZXhHZW54dk9FUwotCi0KLQotLyogc3BlY2lhbCBjYWxscyBpbXBsZW1lbnRlZCBpbiBBbmRyb2lkJ3MgR0xFUyB3cmFwcGVyIHVzZWQgdG8gbW9yZQotICogZWZmaWNpZW50bHkgYm91bmQtY2hlY2sgcGFzc2VkIGFycmF5cyAqLwotZXh0ZXJuICJDIiB7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbENvbG9yUG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcHRyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTm9ybWFsUG9pbnRlckJvdW5kcyhHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsCi0gICAgICAgIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFRleENvb3JkUG9pbnRlckJvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci1HTF9BUEkgdm9pZCBHTF9BUElFTlRSWSBnbFZlcnRleFBvaW50ZXJCb3VuZHMoR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCi0gICAgICAgIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIsIEdMc2l6ZWkgY291bnQpOwotR0xfQVBJIHZvaWQgR0xfQVBJRU5UUlkgZ2xQb2ludFNpemVQb2ludGVyT0VTQm91bmRzKEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsTWF0cml4SW5kZXhQb2ludGVyT0VTQm91bmRzKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAotICAgICAgICBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyLCBHTHNpemVpIGNvdW50KTsKLUdMX0FQSSB2b2lkIEdMX0FQSUVOVFJZIGdsV2VpZ2h0UG9pbnRlck9FU0JvdW5kcyhHTGludCBzaXplLCBHTGVudW0gdHlwZSwKLSAgICAgICAgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciwgR0xzaXplaSBjb3VudCk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwotCi1zdGF0aWMgamNsYXNzIG5pb0FjY2Vzc0NsYXNzOwotc3RhdGljIGpjbGFzcyBidWZmZXJDbGFzczsKLXN0YXRpYyBqY2xhc3MgRzExSW1wbENsYXNzOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlUG9pbnRlcklEOwotc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlJRDsKLXN0YXRpYyBqbWV0aG9kSUQgZ2V0QmFzZUFycmF5T2Zmc2V0SUQ7Ci1zdGF0aWMgam1ldGhvZElEIGFsbG93SW5kaXJlY3RCdWZmZXJzSUQ7Ci1zdGF0aWMgamZpZWxkSUQgcG9zaXRpb25JRDsKLXN0YXRpYyBqZmllbGRJRCBsaW1pdElEOwotc3RhdGljIGpmaWVsZElEIGVsZW1lbnRTaXplU2hpZnRJRDsKLXN0YXRpYyBqZmllbGRJRCBoYXZlQ2hlY2tlZEV4dGVuc2lvbnNJRDsKLXN0YXRpYyBqZmllbGRJRCBoYXZlX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZUlEOwotc3RhdGljIGpmaWVsZElEIGhhdmVfT0VTX2JsZW5kX3N1YnRyYWN0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgaGF2ZV9PRVNfZnJhbWVidWZmZXJfb2JqZWN0SUQ7Ci1zdGF0aWMgamZpZWxkSUQgaGF2ZV9PRVNfdGV4dHVyZV9jdWJlX21hcElEOwotCi0vKiBDYWNoZSBtZXRob2QgSURzIGVhY2ggdGltZSB0aGUgY2xhc3MgaXMgbG9hZGVkLiAqLwotCi1zdGF0aWMgdm9pZAotbmF0aXZlQ2xhc3NJbml0KEpOSUVudiAqX2VudiwgamNsYXNzIGdsSW1wbENsYXNzKQotewotICAgIGpjbGFzcyBuaW9BY2Nlc3NDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9OSU9BY2Nlc3MiKTsKLSAgICBuaW9BY2Nlc3NDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihuaW9BY2Nlc3NDbGFzc0xvY2FsKTsKLQotICAgIGpjbGFzcyBidWZmZXJDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9CdWZmZXIiKTsKLSAgICBidWZmZXJDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihidWZmZXJDbGFzc0xvY2FsKTsKLQotICAgIGpjbGFzcyBnMTFpbXBDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJjb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsIik7Ci0gICAgRzExSW1wbENsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKGcxMWltcENsYXNzTG9jYWwpOwotICAgIGhhdmVDaGVja2VkRXh0ZW5zaW9uc0lEID0gIF9lbnYtPkdldEZpZWxkSUQoRzExSW1wbENsYXNzLCAiaGF2ZUNoZWNrZWRFeHRlbnNpb25zIiwgIloiKTsKLSAgICBoYXZlX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZUlEID0gIF9lbnYtPkdldEZpZWxkSUQoRzExSW1wbENsYXNzLCAiaGF2ZV9PRVNfYmxlbmRfZXF1YXRpb25fc2VwYXJhdGUiLCAiWiIpOwotICAgIGhhdmVfT0VTX2JsZW5kX3N1YnRyYWN0SUQgPSAgX2Vudi0+R2V0RmllbGRJRChHMTFJbXBsQ2xhc3MsICJoYXZlX09FU19ibGVuZF9zdWJ0cmFjdCIsICJaIik7Ci0gICAgaGF2ZV9PRVNfZnJhbWVidWZmZXJfb2JqZWN0SUQgPSAgX2Vudi0+R2V0RmllbGRJRChHMTFJbXBsQ2xhc3MsICJoYXZlX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QiLCAiWiIpOwotICAgIGhhdmVfT0VTX3RleHR1cmVfY3ViZV9tYXBJRCA9ICBfZW52LT5HZXRGaWVsZElEKEcxMUltcGxDbGFzcywgImhhdmVfT0VTX3RleHR1cmVfY3ViZV9tYXAiLCAiWiIpOwotCi0gICAgZ2V0QmFzZVBvaW50ZXJJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAotICAgICAgICAgICAgImdldEJhc2VQb2ludGVyIiwgIihMamF2YS9uaW8vQnVmZmVyOylKIik7Ci0gICAgZ2V0QmFzZUFycmF5SUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgICJnZXRCYXNlQXJyYXkiLCAiKExqYXZhL25pby9CdWZmZXI7KUxqYXZhL2xhbmcvT2JqZWN0OyIpOwotICAgIGdldEJhc2VBcnJheU9mZnNldElEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICAiZ2V0QmFzZUFycmF5T2Zmc2V0IiwgIihMamF2YS9uaW8vQnVmZmVyOylJIik7Ci0gICAgYWxsb3dJbmRpcmVjdEJ1ZmZlcnNJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKGcxMWltcENsYXNzTG9jYWwsCi0gICAgICAgICAgICAiYWxsb3dJbmRpcmVjdEJ1ZmZlcnMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylaIik7Ci0gICAgcG9zaXRpb25JRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJwb3NpdGlvbiIsICJJIik7Ci0gICAgbGltaXRJRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJsaW1pdCIsICJJIik7Ci0gICAgZWxlbWVudFNpemVTaGlmdElEID0KLSAgICAgICAgX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgIl9lbGVtZW50U2l6ZVNoaWZ0IiwgIkkiKTsKLX0KLQotc3RhdGljIHZvaWQgKgotZ2V0UG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyLCBqYXJyYXkgKmFycmF5LCBqaW50ICpyZW1haW5pbmcpCi17Ci0gICAgamludCBwb3NpdGlvbjsKLSAgICBqaW50IGxpbWl0OwotICAgIGppbnQgZWxlbWVudFNpemVTaGlmdDsKLSAgICBqbG9uZyBwb2ludGVyOwotICAgIGppbnQgb2Zmc2V0OwotICAgIHZvaWQgKmRhdGE7Ci0KLSAgICBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7Ci0gICAgbGltaXQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGxpbWl0SUQpOwotICAgIGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgKnJlbWFpbmluZyA9IChsaW1pdCAtIHBvc2l0aW9uKSA8PCBlbGVtZW50U2l6ZVNoaWZ0OwotICAgIHBvaW50ZXIgPSBfZW52LT5DYWxsU3RhdGljTG9uZ01ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VQb2ludGVySUQsIGJ1ZmZlcik7Ci0gICAgaWYgKHBvaW50ZXIgIT0gMEwpIHsKLSAgICAgICAgKmFycmF5ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuICh2b2lkICopIChqaW50KSBwb2ludGVyOwotICAgIH0KLQotICAgICphcnJheSA9IChqYXJyYXkpIF9lbnYtPkNhbGxTdGF0aWNPYmplY3RNZXRob2QobmlvQWNjZXNzQ2xhc3MsCi0gICAgICAgICAgICBnZXRCYXNlQXJyYXlJRCwgYnVmZmVyKTsKLSAgICBpZiAoKmFycmF5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuICh2b2lkKikgTlVMTDsKLSAgICB9Ci0gICAgb2Zmc2V0ID0gX2Vudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKLSAgICAgICAgICAgIGdldEJhc2VBcnJheU9mZnNldElELCBidWZmZXIpOwotICAgIGRhdGEgPSBfZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCphcnJheSwgKGpib29sZWFuICopIDApOwotCi0gICAgcmV0dXJuICh2b2lkICopICgoY2hhciAqKSBkYXRhICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbGVhc2VQb2ludGVyKEpOSUVudiAqX2VudiwgamFycmF5IGFycmF5LCB2b2lkICpkYXRhLCBqYm9vbGVhbiBjb21taXQpCi17Ci0gICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJyYXksIGRhdGEsCi0JCQkJCSAgIGNvbW1pdCA/IDAgOiBKTklfQUJPUlQpOwotfQotCi1leHRlcm4gIkMiIHsKLWV4dGVybiBjaGFyKiAgX19wcm9nbmFtZTsKLX0KLQotc3RhdGljIGJvb2wKLWFsbG93SW5kaXJlY3RCdWZmZXJzKEpOSUVudiAqX2VudikgewotICAgIHN0YXRpYyBqaW50IHNJbmRpcmVjdEJ1ZmZlckNvbXBhdGFiaWxpdHk7Ci0gICAgaWYgKHNJbmRpcmVjdEJ1ZmZlckNvbXBhdGFiaWxpdHkgPT0gMCkgewotICAgICAgICBqb2JqZWN0IGFwcE5hbWUgPSBfZW52LT5OZXdTdHJpbmdVVEYoOjpfX3Byb2duYW1lKTsKLSAgICAgICAgc0luZGlyZWN0QnVmZmVyQ29tcGF0YWJpbGl0eSA9IF9lbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKEcxMUltcGxDbGFzcywgYWxsb3dJbmRpcmVjdEJ1ZmZlcnNJRCwgYXBwTmFtZSkgPyAyIDogMTsKLSAgICB9Ci0gICAgcmV0dXJuIHNJbmRpcmVjdEJ1ZmZlckNvbXBhdGFiaWxpdHkgPT0gMjsKLX0KLQotc3RhdGljIHZvaWQgKgotZ2V0RGlyZWN0QnVmZmVyUG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyKSB7Ci0gICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHZvaWQqIGJ1ZiA9IF9lbnYtPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoYnVmZmVyKTsKLSAgICBpZiAoYnVmKSB7Ci0gICAgICAgIGppbnQgcG9zaXRpb24gPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIHBvc2l0aW9uSUQpOwotICAgICAgICBqaW50IGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7Ci0gICAgICAgIGJ1ZiA9ICgoY2hhciopIGJ1ZikgKyAocG9zaXRpb24gPDwgZWxlbWVudFNpemVTaGlmdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFsbG93SW5kaXJlY3RCdWZmZXJzKF9lbnYpKSB7Ci0gICAgICAgICAgICBqYXJyYXkgYXJyYXkgPSAwOwotICAgICAgICAgICAgamludCByZW1haW5pbmc7Ci0gICAgICAgICAgICBidWYgPSBnZXRQb2ludGVyKF9lbnYsIGJ1ZmZlciwgJmFycmF5LCAmcmVtYWluaW5nKTsKLSAgICAgICAgICAgIGlmIChhcnJheSkgewotICAgICAgICAgICAgICAgIHJlbGVhc2VQb2ludGVyKF9lbnYsIGFycmF5LCBidWYsIDApOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgam5pVGhyb3dFeGNlcHRpb24oX2VudiwgImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgdXNlIGEgbmF0aXZlIG9yZGVyIGRpcmVjdCBCdWZmZXIiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgaW50Ci1nZXROdW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7Ci0gICAgaW50IG51bUNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IDA7Ci0gICAgZ2xHZXRJbnRlZ2VydihHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMsICZudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHMpOwotICAgIHJldHVybiBudW1Db21wcmVzc2VkVGV4dHVyZUZvcm1hdHM7Ci19Ci0KLS8vIENoZWNrIGlmIHRoZSBleHRlbnNpb24gYXQgdGhlIGhlYWQgb2YgcEV4dGVuc2lvbnMgaXMgcEV4dGVuc2lvbi4gTm90ZSB0aGF0IHBFeHRlbnNpb25zIGlzCi0vLyB0ZXJtaW5hdGVkIGJ5IGVpdGhlciAwIG9yIHNwYWNlLCB3aGlsZSBwRXh0ZW5zaW9uIGlzIHRlcm1pbmF0ZWQgYnkgMC4KLQotc3RhdGljIGJvb2wKLWV4dGVuc2lvbkVxdWFsKGNvbnN0IEdMdWJ5dGUqIHBFeHRlbnNpb25zLCBjb25zdCBHTHVieXRlKiBwRXh0ZW5zaW9uKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgY2hhciBhID0gKnBFeHRlbnNpb25zKys7Ci0gICAgICAgIGNoYXIgYiA9ICpwRXh0ZW5zaW9uKys7Ci0gICAgICAgIGJvb2wgYUVuZCA9IGEgPT0gJ1wwJyB8fCBhID09ICcgJzsKLSAgICAgICAgYm9vbCBiRW5kID0gYiA9PSAnXDAnOwotICAgICAgICBpZiAoIGFFbmQgfHwgYkVuZCkgewotICAgICAgICAgICAgcmV0dXJuIGFFbmQgPT0gYkVuZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGEgIT0gYiApIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IEdMdWJ5dGUqCi1uZXh0RXh0ZW5zaW9uKGNvbnN0IEdMdWJ5dGUqIHBFeHRlbnNpb25zKSB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgY2hhciBhID0gKnBFeHRlbnNpb25zKys7Ci0gICAgICAgIGlmICggYSA9PSAnXDAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gcEV4dGVuc2lvbnMtMTsKLSAgICAgICAgfSBlbHNlIGlmICggYSA9PSAnICcpIHsKLSAgICAgICAgICAgIHJldHVybiBwRXh0ZW5zaW9uczsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGJvb2wKLWNoZWNrRm9yRXh0ZW5zaW9uKGNvbnN0IEdMdWJ5dGUqIHBFeHRlbnNpb25zLCBjb25zdCBHTHVieXRlKiBwRXh0ZW5zaW9uKSB7Ci0gICAgZm9yICg7KnBFeHRlbnNpb25zICE9ICdcMCc7IHBFeHRlbnNpb25zID0gbmV4dEV4dGVuc2lvbihwRXh0ZW5zaW9ucykpIHsKLSAgICAgICAgaWYgKGV4dGVuc2lvbkVxdWFsKHBFeHRlbnNpb25zLCBwRXh0ZW5zaW9uKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbAotc3VwcG9ydHNFeHRlbnNpb24oSk5JRW52ICpfZW52LCBqb2JqZWN0IGltcGwsIGpmaWVsZElEIGZpZWxkSWQpIHsKLSAgICBpZiAoIV9lbnYtPkdldEJvb2xlYW5GaWVsZChpbXBsLCBoYXZlQ2hlY2tlZEV4dGVuc2lvbnNJRCkpIHsKLSAgICAgICAgX2Vudi0+U2V0Qm9vbGVhbkZpZWxkKGltcGwsIGhhdmVDaGVja2VkRXh0ZW5zaW9uc0lELCB0cnVlKTsKLSAgICAgICAgY29uc3QgR0x1Ynl0ZSogc0V4dGVuc2lvbnMgPSBnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKTsKLSAgICAgICAgX2Vudi0+U2V0Qm9vbGVhbkZpZWxkKGltcGwsIGhhdmVfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlSUQsCi0gICAgICAgICAgICBjaGVja0ZvckV4dGVuc2lvbihzRXh0ZW5zaW9ucywgKGNvbnN0IEdMdWJ5dGUqKSAiR0xfT0VTX2JsZW5kX2VxdWF0aW9uX3NlcGFyYXRlIikpOwotICAgICAgICBfZW52LT5TZXRCb29sZWFuRmllbGQoaW1wbCwgaGF2ZV9PRVNfYmxlbmRfc3VidHJhY3RJRCwKLSAgICAgICAgICAgIGNoZWNrRm9yRXh0ZW5zaW9uKHNFeHRlbnNpb25zLCAoY29uc3QgR0x1Ynl0ZSopICJHTF9PRVNfYmxlbmRfc3VidHJhY3QiKSk7Ci0gICAgICAgIF9lbnYtPlNldEJvb2xlYW5GaWVsZChpbXBsLCBoYXZlX09FU19mcmFtZWJ1ZmZlcl9vYmplY3RJRCwKLSAgICAgICAgICAgIGNoZWNrRm9yRXh0ZW5zaW9uKHNFeHRlbnNpb25zLCAoY29uc3QgR0x1Ynl0ZSopICJHTF9PRVNfZnJhbWVidWZmZXJfb2JqZWN0IikpOwotICAgICAgICBfZW52LT5TZXRCb29sZWFuRmllbGQoaW1wbCwgaGF2ZV9PRVNfdGV4dHVyZV9jdWJlX21hcElELAotICAgICAgICAgICAgY2hlY2tGb3JFeHRlbnNpb24oc0V4dGVuc2lvbnMsIChjb25zdCBHTHVieXRlKikgIkdMX09FU190ZXh0dXJlX2N1YmVfbWFwIikpOwotICAgIH0KLSAgICByZXR1cm4gX2Vudi0+R2V0Qm9vbGVhbkZpZWxkKGltcGwsIGZpZWxkSWQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9HTEhlYWRlci5qYXZhLWlmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjc4ZjNkLi4wMDAwMDAwCi0tLSBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xIZWFkZXIuamF2YS1pZgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotcGFja2FnZSBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlczsKLQotcHVibGljIGludGVyZmFjZSBHTCB7Ci19Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xJbXBsSGVhZGVyLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvR0xJbXBsSGVhZGVyLmphdmEtaW1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3MzBhYS4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L0dMSW1wbEhlYWRlci5qYXZhLWltcGwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0qKgotKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCi0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAotKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKLSoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KLQotLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAotCi1wYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFwcEdsb2JhbHM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uSVBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTBFeHQ7Ci1pbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKLWltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExRXh0OwotaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHRlbnNpb25QYWNrOwotCi1wdWJsaWMgY2xhc3MgR0xJbXBsIGltcGxlbWVudHMgR0wxMCwgR0wxMEV4dCwgR0wxMSwgR0wxMUV4dCwgR0wxMUV4dGVuc2lvblBhY2sgewotCi0gICAgLy8gUHJpdmF0ZSBhY2Nlc3NvcnMgZm9yIG5hdGl2ZSBjb2RlCi0KLSAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgc3RhdGljIHsKLQlfbmF0aXZlQ2xhc3NJbml0KCk7Ci0gICAgfQotCi0gICAgQnVmZmVyIF9jb2xvclBvaW50ZXIgPSBudWxsOwotICAgIEJ1ZmZlciBfbm9ybWFsUG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF90ZXhDb29yZFBvaW50ZXIgPSBudWxsOwotICAgIEJ1ZmZlciBfdmVydGV4UG9pbnRlciA9IG51bGw7Ci0gICAgQnVmZmVyIF9wb2ludFNpemVQb2ludGVyT0VTID0gbnVsbDsKLSAgICBCdWZmZXIgX21hdHJpeEluZGV4UG9pbnRlck9FUyA9IG51bGw7Ci0gICAgQnVmZmVyIF93ZWlnaHRQb2ludGVyT0VTID0gbnVsbDsKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZUNoZWNrZWRFeHRlbnNpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlX09FU19ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZV9PRVNfYmxlbmRfc3VidHJhY3Q7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhdmVfT0VTX2ZyYW1lYnVmZmVyX29iamVjdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaGF2ZV9PRVNfdGV4dHVyZV9jdWJlX21hcDsKLQotICAgIHB1YmxpYyBHTEltcGwoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2xHZXRQb2ludGVydihpbnQgcG5hbWUsIGphdmEubmlvLkJ1ZmZlcltdIHBhcmFtcykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImdsR2V0UG9pbnRlcnYiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFsbG93SW5kaXJlY3RCdWZmZXJzKFN0cmluZyBhcHBOYW1lKSB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGludCB2ZXJzaW9uID0gMDsKLSAgICAgICAgSVBhY2thZ2VNYW5hZ2VyIHBtID0gQXBwR2xvYmFscy5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXBwbGljYXRpb25JbmZvIGFwcGxpY2F0aW9uSW5mbyA9IHBtLmdldEFwcGxpY2F0aW9uSW5mbyhhcHBOYW1lLCAwKTsKLSAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbkluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHZlcnNpb24gPSBhcHBsaWNhdGlvbkluZm8udGFyZ2V0U2RrVmVyc2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgIH0KLSAgICAgICAgTG9nLmUoIk9wZW5HTEVTIiwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICJBcHBsaWNhdGlvbiAlcyAoU0RLIHRhcmdldCAlZCkgY2FsbGVkIGEgR0wxMSBQb2ludGVyIG1ldGhvZCB3aXRoIGFuIGluZGlyZWN0IEJ1ZmZlci4iLAotICAgICAgICAgICAgYXBwTmFtZSwgdmVyc2lvbikpOwotICAgICAgICBpZiAodmVyc2lvbiA8PSBCdWlsZC5WRVJTSU9OX0NPREVTLkNVUENBS0UpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNmUzZjMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qIGNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkgKi8NCi1zdGF0aWMganN0cmluZyBhbmRyb2lkX2dsR2V0U3RyaW5nKEpOSUVudiAqX2Vudiwgam9iamVjdCwgamludCBuYW1lKSB7DQotICAgIGNvbnN0IGNoYXIqIGNoYXJzID0gKGNvbnN0IGNoYXIqKSBnbEdldFN0cmluZygoR0xlbnVtKSBuYW1lKTsNCi0gICAgcmV0dXJuIF9lbnYtPk5ld1N0cmluZ1VURihjaGFycyk7DQotfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcuamF2YS0xMC1pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZmFiYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtMTAtaWYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSAgICBwdWJsaWMgU3RyaW5nIGdsR2V0U3RyaW5nKA0KLSAgICAgICAgaW50IG5hbWUNCi0gICAgKTsNCi0NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtaWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OGZhYmMuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5qYXZhLWlmCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0gICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCi0gICAgICAgIGludCBuYW1lDQotICAgICk7DQotDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtaW1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ODgxYy4uMDAwMDAwMAotLS0gYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvanNyMjM5L2dsR2V0U3RyaW5nLmphdmEtaW1wbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSAgICAvLyBDIGZ1bmN0aW9uIGNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkNCi0NCi0gICAgcHVibGljIG5hdGl2ZSBTdHJpbmcgX2dsR2V0U3RyaW5nKA0KLSAgICAgICAgaW50IG5hbWUNCi0gICAgKTsNCi0NCi0gICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCi0gICAgICAgIGludCBuYW1lDQotICAgICkgew0KLSAgICAgICAgU3RyaW5nIHJldHVyblZhbHVlOw0KLSAgICAgICAgcmV0dXJuVmFsdWUgPSBfZ2xHZXRTdHJpbmcoDQotICAgICAgICAgICAgbmFtZQ0KLSAgICAgICAgKTsNCi0gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCi0gICAgfQ0KLQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9qc3IyMzkvZ2xHZXRTdHJpbmcubmF0aXZlUmVnIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5uYXRpdmVSZWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDE4N2MuLjAwMDAwMDAKLS0tIGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2pzcjIzOS9nbEdldFN0cmluZy5uYXRpdmVSZWcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi17Il9nbEdldFN0cmluZyIsICIoSSlMamF2YS9sYW5nL1N0cmluZzsiLCAodm9pZCAqKSBhbmRyb2lkX2dsR2V0U3RyaW5nIH0sDQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmluZGV4IGJlZDIwZWIuLmQ1YWVhNDMgMTAwNjQ0Ci0tLSBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKQEAgLTE5LDUgKzE5LDUgQEAKIAogPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCiAgICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0iYXBwX2xhYmVsIiBtc2dpZD0iNDU2NzU2NjA5ODUyODU4ODg2MyI+IlNldGVsYW4gUGVueWltcGFuYW4iPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhcHBfbGFiZWwiIG1zZ2lkPSI0NTY3NTY2MDk4NTI4NTg4ODYzIj4iUGVuZ2F0dXJhbiBQZW55aW1wYW5hbiI8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL1N5c3RlbVVJL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKaW5kZXggYThiMDI0ZC4uMWU4MjY0NiAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU3lzdGVtVUkvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbAorKysgYi9wYWNrYWdlcy9TeXN0ZW1VSS9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3JlY2VudF9yZW1vdmVfaXRlbV90aXRsZSIgbXNnaWQ9IjYwMjYzOTU4NjgxMjk4NTI5NjgiPiJIYXB1cyBkYXJpIGRhZnRhciI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfcmVjZW50X2luc3BlY3RfaXRlbV90aXRsZSIgbXNnaWQ9Ijc3OTM2MjQ4NjQ1Mjg4MTg1NjkiPiJJbmZvIGFwbCI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfbm9fcmVjZW50X2FwcHMiIG1zZ2lkPSI2NTc2MzkyOTUxMDUzOTk0NjQwIj4iVGlkYWsgYWRhIGFwbCB0ZXJiYXJ1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9hY2Nlc3NpYmlsaXR5X2Rpc21pc3NfcmVjZW50cyIgbXNnaWQ9IjQ1NzYwNzYwNzUyMjY1NDAxMDUiPiJTaW5na2lya2FuIGFwbGlrYXNpIHRlcmJhcnUiPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX2FjY2Vzc2liaWxpdHlfZGlzbWlzc19yZWNlbnRzIiBtc2dpZD0iNDU3NjA3NjA3NTIyNjU0MDEwNSI+IlR1dHVwIGFwbGlrYXNpIHRlcmJhcnUiPC9zdHJpbmc+CiAgIDxwbHVyYWxzIG5hbWU9InN0YXR1c19iYXJfYWNjZXNzaWJpbGl0eV9yZWNlbnRfYXBwcyI+CiAgICAgPGl0ZW0gcXVhbnRpdHk9Im9uZSIgbXNnaWQ9IjU4NTQxNzYwODM4NjU4NDU1NDEiPiIxIGFwbCB0ZXJiYXJ1IjwvaXRlbT4KICAgICA8aXRlbSBxdWFudGl0eT0ib3RoZXIiIG1zZ2lkPSIxMDQwNzg0MzU5Nzk0ODkwNzQ0Ij4iJWQgYXBsIHRlcmJhcnUiPC9pdGVtPgpAQCAtMzksNyArMzksNyBAQAogICAgIDxzdHJpbmcgbmFtZT0iYmF0dGVyeV9sb3dfcGVyY2VudF9mb3JtYXQiIG1zZ2lkPSIxMDc3MjQ0OTQ5MzE4MjYxNzYxIj4iPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQlJTwveGxpZmY6Zz4gdGVyc2lzYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImludmFsaWRfY2hhcmdlciIgbXNnaWQ9IjQ1NDkxMDU5OTY3NDA1MjI1MjMiPiJQZW5naXNpYW4gZGF5YSBVU0IgdGlkYWsgZGlkdWt1bmcuIlxuIkd1bmFrYW4gaGFueWEgcGVuZ2lzaSBkYXlhIHlhbmcgZGlzZWRpYWthbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJiYXR0ZXJ5X2xvd193aHkiIG1zZ2lkPSI3Mjc5MTY5NjA5NTE4Mzg2MzcyIj4iUGVuZ2d1bmFhbiBiYXRlcmFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19zZXR0aW5nc19idXR0b24iIG1zZ2lkPSIzMDIzODg5OTE2Njk5MjcwMjI0Ij4iU2V0ZWxhbiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXR1c19iYXJfc2V0dGluZ3Nfc2V0dGluZ3NfYnV0dG9uIiBtc2dpZD0iMzAyMzg4OTkxNjY5OTI3MDIyNCI+IlBlbmdhdHVyYW4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX3dpZmlfYnV0dG9uIiBtc2dpZD0iMTczMzkyODE1MTY5ODMxMTkyMyI+IldpLUZpIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic3RhdHVzX2Jhcl9zZXR0aW5nc19haXJwbGFuZSIgbXNnaWQ9IjQ4Nzk4Nzk2OTg1MDA5NTUzMDAiPiJNb2RlIHBlc2F3YXQiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdGF0dXNfYmFyX3NldHRpbmdzX2F1dG9fcm90YXRpb24iIG1zZ2lkPSIzNzkwNDgyNTQxMzU3Nzk4NDIxIj4iUHV0YXIgbGF5YXIgc2VjYXJhIG90b21hdGlzIjwvc3RyaW5nPgpAQCAtNjksMTAgKzY5LDEwIEBACiAgICAgPHN0cmluZyBuYW1lPSJzY3JlZW5zaG90X3NhdmVkX3RleHQiIG1zZ2lkPSIxMTUyODM5NjQ3Njc3NTU4ODE1Ij4iU2VudHVoIHVudHVrIG1lbGloYXQgdGFuZ2thcGFuIGxheWFyIEFuZGEuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2NyZWVuc2hvdF9mYWlsZWRfdGl0bGUiIG1zZ2lkPSI3MDU3ODExMTY3NDY5MjI3NzEiPiJUaWRhayBkYXBhdCBtZW5nYW1iaWwgdGFuZ2thcGFuIGxheWFyLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InNjcmVlbnNob3RfZmFpbGVkX3RleHQiIG1zZ2lkPSI4MTM0MDExMjY5NTcyNDE1NDAyIj4iVGlkYWsgZGFwYXQgbWVueWltcGFuIHRhbmdrYXBhbiBsYXlhci4gUGVueWltcGFuYW4gbXVuZ2tpbiBzZWRhbmcgZGlndW5ha2FuLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9InVzYl9wcmVmZXJlbmNlX3RpdGxlIiBtc2dpZD0iNjU1MTA1MDM3NzM4ODg4Mjc4NyI+Ik9wc2kgdHJhbnNmZXIgYmVya2FzIFVTQiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InVzYl9wcmVmZXJlbmNlX3RpdGxlIiBtc2dpZD0iNjU1MTA1MDM3NzM4ODg4Mjc4NyI+Ik9wc2kgdHJhbnNmZXIgZmlsZSBVU0IiPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ1c2VfbXRwX2J1dHRvbl90aXRsZSIgbXNnaWQ9IjQzMzM1MDQ0MTM1NjMwMjM2MjYiPiJQYXNhbmcgc2ViYWdhaSBwZW11dGFyIG1lZGlhIChNVFApIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0idXNlX3B0cF9idXR0b25fdGl0bGUiIG1zZ2lkPSI3NTE3MTI3NTQwMzAxNjI1NzUxIj4iUGFzYW5nIHNlYmFnYWkga2FtZXJhIChQVFApIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iaW5zdGFsbGVyX2NkX2J1dHRvbl90aXRsZSIgbXNnaWQ9IjIzMTI2Njc1Nzg1NjIyMDE1ODMiPiJQYXNhbmcgYXBsIFRyYW5zZmVyIEJlcmthcyBBbmRyb2lkIHVudHVrIE1hYyI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc3RhbGxlcl9jZF9idXR0b25fdGl0bGUiIG1zZ2lkPSIyMzEyNjY3NTc4NTYyMjAxNTgzIj4iUGFzYW5nIGFwbCBUcmFuc2ZlciBGaWxlIEFuZHJvaWQgdW50dWsgTWFjIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjZXNzaWJpbGl0eV9iYWNrIiBtc2dpZD0iNTY3MDExNTM4OTk0NDI5MTIwIj4iS2VtYmFsaSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfaG9tZSIgbXNnaWQ9IjgyMTcyMTYwNzQ4OTUzNzc2NDEiPiJVdGFtYSI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfbWVudSIgbXNnaWQ9IjMxNjgzOTMwMzMyNDY5NTk0OSI+Ik1lbnUiPC9zdHJpbmc+CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfYmx1ZXRvb3RoX3RldGhlciIgbXNnaWQ9IjQxMDI3ODQ0OTgxNDAyNzE5NjkiPiJQZW5hbWJhdGFuIGJsdWV0b290aC4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X2FpcnBsYW5lX21vZGUiIG1zZ2lkPSI4MzQ3NDg5OTk3OTA3NjMwOTIiPiJNb2RlIHBlc2F3YXQuIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjZXNzaWJpbGl0eV9iYXR0ZXJ5X2xldmVsIiBtc2dpZD0iNzQ1MTQ3NDE4NzExMzM3MTk2NSI+IkJhdGVyYWkgPHhsaWZmOmcgaWQ9Ik5VTUJFUiI+JWQ8L3hsaWZmOmc+IHBlcnNlbi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X3NldHRpbmdzX2J1dHRvbiIgbXNnaWQ9Ijc5OTU4MzkxMTIzMTg5MzM4MCI+IlNldGVsYW4gc2lzdGVtLiI8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfc2V0dGluZ3NfYnV0dG9uIiBtc2dpZD0iNzk5NTgzOTExMjMxODkzMzgwIj4iUGVuZ2F0dXJhbiBzaXN0ZW0uIjwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYWNjZXNzaWJpbGl0eV9ub3RpZmljYXRpb25zX2J1dHRvbiIgbXNnaWQ9IjQ0OTgwMDAzNjk3Nzk0MjE4OTIiPiJQZW1iZXJpdGFodWFuLiI8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImFjY2Vzc2liaWxpdHlfcmVtb3ZlX25vdGlmaWNhdGlvbiIgbXNnaWQ9IjM2MDMwOTk1MTQ5MDIxODIzNTAiPiJNZW5naGFwdXMgcGVtYmVyaXRhaHVhbi4iPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhY2Nlc3NpYmlsaXR5X2dwc19lbmFibGVkIiBtc2dpZD0iMzUxMTQ2OTQ5OTI0MDEyMzAxOSI+IkdQUyBkaWFrdGlma2FuLiI8L3N0cmluZz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zY3JlZW5zaG90L0dsb2JhbFNjcmVlbnNob3QuamF2YSBiL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS9zY3JlZW5zaG90L0dsb2JhbFNjcmVlbnNob3QuamF2YQppbmRleCBjNGE5MmY3Li45YTc2YzE0IDEwMDY0NAotLS0gYS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvc2NyZWVuc2hvdC9HbG9iYWxTY3JlZW5zaG90LmphdmEKKysrIGIvcGFja2FnZXMvU3lzdGVtVUkvc3JjL2NvbS9hbmRyb2lkL3N5c3RlbXVpL3NjcmVlbnNob3QvR2xvYmFsU2NyZWVuc2hvdC5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5NYXRyaXg7CiBpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QaXhlbEZvcm1hdDsKIGltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50RjsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYVNvdW5kOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFBY3Rpb25Tb3VuZDsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgIHByaXZhdGUgZmxvYXQgbUJnUGFkZGluZzsKICAgICBwcml2YXRlIGZsb2F0IG1CZ1BhZGRpbmdTY2FsZTsKIAotICAgIHByaXZhdGUgQ2FtZXJhU291bmQgbUNhbWVyYVNvdW5kOworICAgIHByaXZhdGUgTWVkaWFBY3Rpb25Tb3VuZCBtQ2FtZXJhU291bmQ7CiAKIAogICAgIC8qKgpAQCAtMzA5LDcgKzMwOSw4IEBACiAgICAgICAgIG1CZ1BhZGRpbmdTY2FsZSA9IG1CZ1BhZGRpbmcgLyAgbURpc3BsYXlNZXRyaWNzLndpZHRoUGl4ZWxzOwogCiAgICAgICAgIC8vIFNldHVwIHRoZSBDYW1lcmEgc2h1dHRlciBzb3VuZAotICAgICAgICBtQ2FtZXJhU291bmQgPSBuZXcgQ2FtZXJhU291bmQoKTsKKyAgICAgICAgbUNhbWVyYVNvdW5kID0gbmV3IE1lZGlhQWN0aW9uU291bmQoKTsKKyAgICAgICAgbUNhbWVyYVNvdW5kLmxvYWQoTWVkaWFBY3Rpb25Tb3VuZC5TSFVUVEVSX0NMSUNLKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQyMiw3ICs0MjMsNyBAQAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgLy8gUGxheSB0aGUgc2h1dHRlciBzb3VuZCB0byBub3RpZnkgdGhhdCB3ZSd2ZSB0YWtlbiBhIHNjcmVlbnNob3QKLSAgICAgICAgICAgICAgICBtQ2FtZXJhU291bmQucGxheVNvdW5kKENhbWVyYVNvdW5kLlNIVVRURVJfQ0xJQ0spOworICAgICAgICAgICAgICAgIG1DYW1lcmFTb3VuZC5wbGF5KE1lZGlhQWN0aW9uU291bmQuU0hVVFRFUl9DTElDSyk7CiAKICAgICAgICAgICAgICAgICBtU2NyZWVuc2hvdFZpZXcuc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9IQVJEV0FSRSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgbVNjcmVlbnNob3RWaWV3LmJ1aWxkTGF5ZXIoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggZmUwNjhhZi4uZmQ3NDE4YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTEwNTMsNyArMTA1Myw3IEBACiB9CiAKIC8vIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjphdWRpb0NvbmZpZ0NoYW5nZWRfbChpbnQgZXZlbnQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCB2b2lkICpwYXJhbTIpCit2b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKQogewogICAgIHNpemVfdCBzaXplID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuc2l6ZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CkBAIC0xNDYyLDcgKzE0NjIsOSBAQAogICAgICAgICAvLyBBc3N1bWVzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCBieSBBdWRpb0ZsaW5nZXIgd2l0aCBpdCdzIG1Mb2NrIGhlbGQsCiAgICAgICAgIC8vIGJ1dCBpdCB3b3VsZCBiZSBzYWZlciB0byBleHBsaWNpdGx5IHBhc3MgaW5pdGlhbCBtYXN0ZXJWb2x1bWUgYXMgcGFyYW1ldGVyCiAgICAgICAgIG1NYXN0ZXJWb2x1bWUoYXVkaW9GbGluZ2VyLT5tYXN0ZXJWb2x1bWVTV19sKCkpLAotICAgICAgICBtTGFzdFdyaXRlVGltZSgwKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKQorICAgICAgICBtTGFzdFdyaXRlVGltZSgwKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKKyAgICAgICAgLy8gbU1peGVyU3RhdHVzCisgICAgICAgIG1QcmV2TWl4ZXJTdGF0dXMoTUlYRVJfSURMRSkKIHsKICAgICBzbnByaW50ZihtTmFtZSwga05hbWVMZW5ndGgsICJBdWRpb091dF8lWCIsIGlkKTsKIApAQCAtMTkyMiw3ICsxOTI0LDYgQEAKICAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUpCiB7CiAgICAgbUF1ZGlvTWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwotICAgIG1QcmV2TWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwogICAgIC8vIEZJWE1FIC0gQ3VycmVudCBtaXhlciBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHN0ZXJlbyBvdXRwdXQKICAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7CiAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGF1ZGlvIGhhcmR3YXJlIGNoYW5uZWwgY291bnQiKTsKQEAgLTIwNDMsMTEgKzIwNDQsNyBAQAogCiAgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHMoKTsKIAotaWYgKG1UeXBlID09IERJUkVDVCkgewotICAgICAgICBhY3RpdmVUcmFjay5jbGVhcigpOwotfQotCi0gICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKKyAgICAgICAgbU1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKIAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTIwNzQsMTcgKzIwNzEsNyBAQAogCiAgICAgICAgICAgICB9CiAKLWlmIChtVHlwZSA9PSBEVVBMSUNBVElORykgewotI2lmIDAgICAvLyBzZWUgZWFybGllciBGSVhNRQotICAgICAgICAgICAgLy8gTm93IHRoYXQgdGhpcyBpcyBhIGZpZWxkIGluc3RlYWQgb2YgbG9jYWwgdmFyaWFibGUsCi0gICAgICAgICAgICAvLyBjbGVhciBpdCBzbyBpdCBpcyBlbXB0eSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIHRoZSBsb29wLAotICAgICAgICAgICAgLy8gYW5kIGxhdGVyIGFuIGFzc2lnbm1lbnQgY291bGQgY29tYmluZSB0aGUgY2xlYXIgd2l0aCB0aGUgbG9vcCBiZWxvdwotICAgICAgICAgICAgb3V0cHV0VHJhY2tzLmNsZWFyKCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG91dHB1dFRyYWNrcy5hZGQobU91dHB1dFRyYWNrc1tpXSk7Ci0gICAgICAgICAgICB9Ci19CisgICAgICAgICAgICBzYXZlT3V0cHV0VHJhY2tzKCk7CiAKICAgICAgICAgICAgIC8vIHB1dCBhdWRpbyBoYXJkd2FyZSBpbnRvIHN0YW5kYnkgYWZ0ZXIgc2hvcnQgZGVsYXkKICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IHN0YW5kYnlUaW1lKSB8fApAQCAtMjEwMSw5ICsyMDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gd2FpdCwgZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKLWlmIChtVHlwZSA9PSBEVVBMSUNBVElORykgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFja3MuY2xlYXIoKTsKLX0KKyAgICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXRUcmFja3MoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgYnJlYWs7CiAKQEAgLTIxMTQsOSArMjA5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUaHJlYWQgJXAgdHlwZSAlZCBUSUQgJWQgd2FraW5nIHVwIiwgdGhpcywgbVR5cGUsIGdldHRpZCgpKTsKICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZVdha2VMb2NrX2woKTsKIAotaWYgKG1UeXBlID09IE1JWEVSIHx8IG1UeXBlID09IERVUExJQ0FUSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgIG1QcmV2TWl4ZXJTdGF0dXMgPSBNSVhFUl9JRExFOwotfQogCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKQEAgLTIxMzgsMTEgKzIxMjEsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1peGVyU3RhdHVzID0gcHJlcGFyZVRyYWNrc19sKCZ0cmFja3NUb1JlbW92ZSk7Ci0gICAgICAgICAgICAvLyBzZWUgRklYTUUgaW4gQXVkaW9GbGluZ2VyLmgKLSAgICAgICAgICAgIGlmIChtaXhlclN0YXR1cyA9PSBNSVhFUl9DT05USU5VRSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbWl4ZXJfc3RhdGUgbmV3TWl4ZXJTdGF0dXMgPSBwcmVwYXJlVHJhY2tzX2woJnRyYWNrc1RvUmVtb3ZlKTsKKyAgICAgICAgICAgIC8vIFNoaWZ0IGluIHRoZSBuZXcgc3RhdHVzOyB0aGlzIGNvdWxkIGJlIGEgcXVldWUgaWYgaXQncworICAgICAgICAgICAgLy8gdXNlZnVsIHRvIGZpbHRlciB0aGUgbWl4ZXIgc3RhdHVzIG92ZXIgc2V2ZXJhbCBjeWNsZXMuCisgICAgICAgICAgICBtUHJldk1peGVyU3RhdHVzID0gbU1peGVyU3RhdHVzOworICAgICAgICAgICAgbU1peGVyU3RhdHVzID0gbmV3TWl4ZXJTdGF0dXM7CiAKICAgICAgICAgICAgIC8vIHByZXZlbnQgYW55IGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluIGxpc3QgYW5kIGluIGVhY2ggZWZmZWN0IGNoYWluCiAgICAgICAgICAgICAvLyBkdXJpbmcgbWl4aW5nIGFuZCBlZmZlY3QgcHJvY2VzcyBhcyB0aGUgYXVkaW8gYnVmZmVycyBjb3VsZCBiZSBkZWxldGVkCkBAIC0yMTUwLDExICsyMTMzLDcgQEAKICAgICAgICAgICAgIGxvY2tFZmZlY3RDaGFpbnNfbChlZmZlY3RDaGFpbnMpOwogICAgICAgICB9CiAKLWlmIChtVHlwZSA9PSBESVJFQ1QpIHsKLSAgICAgICAgLy8gRm9yIERpcmVjdE91dHB1dFRocmVhZCwgdGhpcyB0ZXN0IGlzIGVxdWl2YWxlbnQgdG8gImFjdGl2ZVRyYWNrICE9IDAiCi19Ci0KLSAgICAgICAgaWYgKENDX0xJS0VMWShtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpKSB7CisgICAgICAgIGlmIChDQ19MSUtFTFkobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSkpIHsKICAgICAgICAgICAgIHRocmVhZExvb3BfbWl4KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwpAQCAtMjIwOCwxMyArMjE4NywxMCBAQAogICAgICAgICAvLyBzYW1lIGxvY2suCiAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLmNsZWFyKCk7CiAKLS8vIEZJWE1FIG1lcmdlIHRoZXNlCi1pZiAobVR5cGUgPT0gRElSRUNUKSB7Ci0gICAgICAgIGFjdGl2ZVRyYWNrLmNsZWFyKCk7Ci19Ci1pZiAobVR5cGUgPT0gRFVQTElDQVRJTkcpIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzLmNsZWFyKCk7Ci19CisgICAgICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGUgbmVlZCBmb3IgdGhpcyBoZXJlOworICAgICAgICAvLyAgICAgICBpdCB3YXMgaW4gdGhlIG9yaWdpbmFsIGNvZGUgYnV0IG1heWJlIHRoZQorICAgICAgICAvLyAgICAgICBhc3NpZ25tZW50IGluIHNhdmVPdXRwdXRUcmFja3MoKSBtYWtlcyB0aGlzIHVubmVjZXNzYXJ5PworICAgICAgICBjbGVhck91dHB1dFRyYWNrcygpOwogCiAgICAgICAgIC8vIEVmZmVjdCBjaGFpbnMgd2lsbCBiZSBhY3R1YWxseSBkZWxldGVkIGhlcmUgaWYgdGhleSB3ZXJlIHJlbW92ZWQgZnJvbQogICAgICAgICAvLyBtRWZmZWN0Q2hhaW5zIGxpc3QgZHVyaW5nIG1peGluZyBvciBlZmZlY3RzIHByb2Nlc3NpbmcKQEAgLTIyOTQsNyArMjI3MCw3IEBACiAgICAgLy8gSWYgbm8gdHJhY2tzIGFyZSByZWFkeSwgc2xlZXAgb25jZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGFuIG91dHB1dAogICAgIC8vIGJ1ZmZlciBzaXplLCB0aGVuIHdyaXRlIDBzIHRvIHRoZSBvdXRwdXQKICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKLSAgICAgICAgaWYgKG1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CisgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZSA+PiBzbGVlcFRpbWVTaGlmdDsKICAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPCBrTWluVGhyZWFkU2xlZXBUaW1lVXMpIHsKICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBrTWluVGhyZWFkU2xlZXBUaW1lVXM7CkBAIC0yMzEwLDEwICsyMjg2LDEwIEBACiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgfHwKLSAgICAgICAgICAgICAgIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCAmJiBsb25nU3RhbmRieUV4aXQpKSB7CisgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEICYmIGxvbmdTdGFuZGJ5RXhpdCkpIHsKICAgICAgICAgbWVtc2V0IChtTWl4QnVmZmVyLCAwLCBtaXhCdWZmZXJTaXplKTsKICAgICAgICAgc2xlZXBUaW1lID0gMDsKLSAgICAgICAgQUxPR1ZfSUYoKG1CeXRlc1dyaXR0ZW4gPT0gMCAmJiAobWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQgJiYgbG9uZ1N0YW5kYnlFeGl0KSksICJhbnRpY2lwYXRlZCBzdGFydCIpOworICAgICAgICBBTE9HVl9JRigobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQgJiYgbG9uZ1N0YW5kYnlFeGl0KSksICJhbnRpY2lwYXRlZCBzdGFydCIpOwogICAgIH0KICAgICAvLyBUT0RPIGFkZCBzdGFuZGJ5IHRpbWUgZXh0ZW5zaW9uIGZjdCBvZiBlZmZlY3QgdGFpbAogfQpAQCAtMjU2OSw3ICsyNTQ1LDYgQEAKICAgICAgICAgbWVtc2V0KG1NaXhCdWZmZXIsIDAsIG1GcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgfQogCi0gICAgbVByZXZNaXhlclN0YXR1cyA9IG1peGVyU3RhdHVzOwogICAgIHJldHVybiBtaXhlclN0YXR1czsKIH0KIApAQCAtMjgzNiwxNSArMjgxMSwxMyBAQAogewogICAgIHNwPFRyYWNrPiB0cmFja1RvUmVtb3ZlOwogCi0gICAgLy8gRklYTUUgVGVtcG9yYXJpbHkgcmVuYW1lZCB0byBhdm9pZCBjb25mdXNpb24gd2l0aCB0aGUgbWVtYmVyICJtaXhlclN0YXR1cyIKLSAgICBtaXhlcl9zdGF0ZSBtaXhlclN0YXR1c18gPSBNSVhFUl9JRExFOworICAgIG1peGVyX3N0YXRlIG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKIAogICAgIC8vIGZpbmQgb3V0IHdoaWNoIHRyYWNrcyBuZWVkIHRvIGJlIHByb2Nlc3NlZAogICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSAhPSAwKSB7CiAgICAgICAgIHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1swXS5wcm9tb3RlKCk7Ci0gICAgICAgIC8vIHNlZSBGSVhNRSBpbiBBdWRpb0ZsaW5nZXIuaCwgcmV0dXJuIE1JWEVSX0lETEUgbWlnaHQgYWxzbyB3b3JrCi0gICAgICAgIGlmICh0ID09IDApIHJldHVybiBNSVhFUl9DT05USU5VRTsKLSAgICAgICAgLy9pZiAodCA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgLy8gVGhlIHRyYWNrIGRpZWQgcmVjZW50bHkKKyAgICAgICAgaWYgKHQgPT0gMCkgcmV0dXJuIE1JWEVSX0lETEU7CiAKICAgICAgICAgVHJhY2sqIGNvbnN0IHRyYWNrID0gdC5nZXQoKTsKICAgICAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gdHJhY2stPmNibGsoKTsKQEAgLTI5MjksOCArMjkwMiw4IEBACiAKICAgICAgICAgICAgIC8vIHJlc2V0IHJldHJ5IGNvdW50CiAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzRGlyZWN0OwotICAgICAgICAgICAgYWN0aXZlVHJhY2sgPSB0OwotICAgICAgICAgICAgbWl4ZXJTdGF0dXNfID0gTUlYRVJfVFJBQ0tTX1JFQURZOworICAgICAgICAgICAgbUFjdGl2ZVRyYWNrID0gdDsKKyAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy9BTE9HVigidHJhY2sgJWQgdT0lMDh4LCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT51c2VyLCBjYmxrLT5zZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwZWQoKSkgewpAQCAtMjk0Nyw3ICsyOTIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3QiLCB0cmFjay0+bmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tUb1JlbW92ZSA9IHRyYWNrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzXyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOworICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjk2OCw3ICsyOTQxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBtaXhlclN0YXR1c187CisgICAgcmV0dXJuIG1peGVyU3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp0aHJlYWRMb29wX21peCgpCkBAIC0yOTc5LDcgKzI5NTIsNyBAQAogICAgIC8vIG91dHB1dCBhdWRpbyB0byBoYXJkd2FyZQogICAgIHdoaWxlIChmcmFtZUNvdW50KSB7CiAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICAgICAgYWN0aXZlVHJhY2stPmdldE5leHRCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgIG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKICAgICAgICAgaWYgKENDX1VOTElLRUxZKGJ1ZmZlci5yYXcgPT0gTlVMTCkpIHsKICAgICAgICAgICAgIG1lbXNldChjdXJCdWYsIDAsIGZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjk4NywxNyArMjk2MCwxOCBAQAogICAgICAgICBtZW1jcHkoY3VyQnVmLCBidWZmZXIucmF3LCBidWZmZXIuZnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwogICAgICAgICBmcmFtZUNvdW50IC09IGJ1ZmZlci5mcmFtZUNvdW50OwogICAgICAgICBjdXJCdWYgKz0gYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplOwotICAgICAgICBhY3RpdmVUcmFjay0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOwogICAgIH0KICAgICBzbGVlcFRpbWUgPSAwOwogICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OworICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwogICAgIGFwcGx5Vm9sdW1lKCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnRocmVhZExvb3Bfc2xlZXBUaW1lKCkKIHsKICAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKLSAgICAgICAgaWYgKG1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CisgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CkBAIC0zMTMzLDcgKzMxMDcsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3NsZWVwVGltZSgpCiB7CiAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7Ci0gICAgICAgIGlmIChtaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgeworICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOwpAQCAtMzE2OCw2ICszMTQyLDE2IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnNhdmVPdXRwdXRUcmFja3MoKQoreworICAgIG91dHB1dFRyYWNrcyA9IG1PdXRwdXRUcmFja3M7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6Y2xlYXJPdXRwdXRUcmFja3MoKQoreworICAgIG91dHB1dFRyYWNrcy5jbGVhcigpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OmFkZE91dHB1dFRyYWNrKE1peGVyVGhyZWFkICp0aHJlYWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA4Y2E0Zjg5Li4yZTI1OWMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC02MDcsMTAgKzYwNyw2IEBACiAgICAgICAgICAgICBNSVhFUl9UUkFDS1NfUkVBRFkgICAgICAvLyBhdCBsZWFzdCBvbmUgYWN0aXZlIHRyYWNrLCBhbmQgYXQgbGVhc3Qgb25lIHRyYWNrIGhhcyBkYXRhCiAgICAgICAgICAgICAvLyBzdGFuZGJ5IG1vZGUgZG9lcyBub3QgaGF2ZSBhbiBlbnVtIHZhbHVlCiAgICAgICAgICAgICAvLyBzdXNwZW5kIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGlzIG9ydGhvZ29uYWwgdG8gbWl4ZXIgc3RhdGUKLSNpZiAxCi0gICAgICAgICAgICAvLyBGSVhNRSByZW1vdmUgdGhpcyBoYWNrIGZvciBwcmVwYXJlVHJhY2tzX2woKQotICAgICAgICAgICAgLCBNSVhFUl9DT05USU5VRSAgICAgICAgLy8gImNvbnRpbnVlOyIKLSNlbmRpZgogICAgICAgICB9OwogCiAgICAgICAgIC8vIHBsYXliYWNrIHRyYWNrCkBAIC05MjAsNiArOTE2LDEwIEBACiAgICAgICAgIC8vIENvZGUgc25pcHBldHMgdGhhdCBhcmUgdGVtcG9yYXJpbHkgbGlmdGVkIHVwIG91dCBvZiB0aHJlYWRMb29wKCkgdW50aWwgdGhlIG1lcmdlCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKKyAgICAgICAgLy8gTm9uLXRyaXZpYWwgZm9yIERVUExJQ0FUSU5HIG9ubHkKKyAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2F2ZU91dHB1dFRyYWNrcygpIHsgfQorICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjbGVhck91dHB1dFRyYWNrcygpIHsgfQorCiAgICAgcHJpdmF0ZToKIAogICAgICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOwpAQCAtOTU4LDIzICs5NTgsMTkgQEAKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVTbGVlcFRpbWU7CiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgaWRsZVNsZWVwVGltZTsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWU7Ci0gICAgICAgIC8vIG1peGVyU3RhdHVzIHdhcyBsb2NhbCB0byB0aGUgd2hpbGUgIWV4aXRpbmdQZW5kaW5nIGxvb3AKLSAgICAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1czsKKworICAgICAgICAvLyBtaXhlciBzdGF0dXMgcmV0dXJuZWQgYnkgcHJlcGFyZVRyYWNrc19sKCkKKyAgICAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtTWl4ZXJTdGF0dXM7ICAgICAgIC8vIGN1cnJlbnQgY3ljbGUKKyAgICAgICAgbWl4ZXJfc3RhdGUgICAgICAgICAgICAgICAgICAgICBtUHJldk1peGVyU3RhdHVzOyAgIC8vIHByZXZpb3VzIGN5Y2xlCiAKICAgICAgICAgLy8gRklYTUUgbW92ZSB0aGVzZSBkZWNsYXJhdGlvbnMgaW50byB0aGUgc3BlY2lmaWMgc3ViLWNsYXNzIHRoYXQgbmVlZHMgdGhlbQogICAgICAgICAvLyBNSVhFUiBvbmx5CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1N0YW5kYnlFeGl0OwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZVNoaWZ0OwotICAgICAgICAvLyBNSVhFUiBhbmQgRFVQTElDQVRJTkcgb25seQotICAgICAgICBtaXhlcl9zdGF0ZSBtUHJldk1peGVyU3RhdHVzOyAvLyBwcmV2aW91cyBzdGF0dXMgcmV0dXJuZWQgYnkgcHJlcGFyZVRyYWNrc19sKCkKICAgICAgICAgLy8gRElSRUNUIG9ubHkKICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5RGVsYXk7Ci0gICAgICAgIC8vIGFjdGl2ZVRyYWNrIHdhcyBsb2NhbCB0byB0aGUgd2hpbGUgIWV4aXRpbmdQZW5kaW5nIGxvb3AKLSAgICAgICAgc3A8VHJhY2s+ICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjazsKICAgICAgICAgLy8gRFVQTElDQVRJTkcgb25seQotICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxPdXRwdXRUcmFjaz4gPiAgb3V0cHV0VHJhY2tzOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVzOwotICAgICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxPdXRwdXRUcmFjaz4gPiAgbU91dHB1dFRyYWNrczsKICAgICB9OwogCiAgICAgY2xhc3MgTWl4ZXJUaHJlYWQgOiBwdWJsaWMgUGxheWJhY2tUaHJlYWQgewpAQCAtMTA0NCw2ICsxMDQwLDkgQEAKIAogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYXBwbHlWb2x1bWUoKTsgIC8vIEZJWE1FIGlubGluZSBpbnRvIHRocmVhZExvb3BfbWl4KCkKKworICAgICAgICAvLyBwcmVwYXJlVHJhY2tzX2woKSB0ZWxscyB0aHJlYWRMb29wX21peCgpIHRoZSBuYW1lIG9mIHRoZSBzaW5nbGUgYWN0aXZlIHRyYWNrCisgICAgICAgIHNwPFRyYWNrPiAgICAgICAgICAgICAgIG1BY3RpdmVUcmFjazsKICAgICB9OwogCiAgICAgY2xhc3MgRHVwbGljYXRpbmdUaHJlYWQgOiBwdWJsaWMgTWl4ZXJUaHJlYWQgewpAQCAtMTA3MCw5ICsxMDY5LDEzIEBACiAKICAgICAgICAgLy8gY2FsbGVkIGZyb20gdGhyZWFkTG9vcCwgYWRkT3V0cHV0VHJhY2ssIHJlbW92ZU91dHB1dFRyYWNrCiAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHVwZGF0ZVdhaXRUaW1lX2woKTsKKyAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2F2ZU91dHB1dFRyYWNrcygpOworICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjbGVhck91dHB1dFRyYWNrcygpOwogICAgIHByaXZhdGU6CiAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgbVdhaXRUaW1lTXM7CisgICAgICAgIFNvcnRlZFZlY3RvciA8IHNwPE91dHB1dFRyYWNrPiA+ICBvdXRwdXRUcmFja3M7CisgICAgICAgIFNvcnRlZFZlY3RvciA8IHNwPE91dHB1dFRyYWNrPiA+ICBtT3V0cHV0VHJhY2tzOwogICAgIH07CiAKICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmNoZWNrUGxheWJhY2tUaHJlYWRfbChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIGNvbnN0OwpAQCAtMTA4NCw3ICsxMDg3LDcgQEAKICAgICAgICAgICAgICAgLy8gbm8gcmFuZ2UgY2hlY2ssIGRvZXNuJ3QgY2hlY2sgcGVyLXRocmVhZCBzdHJlYW0gdm9sdW1lLCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgZmxvYXQgc3RyZWFtVm9sdW1lX2woYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZTsgfQotICAgICAgICAgICAgICB2b2lkIGF1ZGlvQ29uZmlnQ2hhbmdlZF9sKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIHZvaWQgKnBhcmFtMik7CisgICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkX2woaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3Qgdm9pZCAqcGFyYW0yKTsKIAogICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBhbiBhdWRpb19pb19oYW5kbGVfdCwgc2Vzc2lvbiBJRCwgb3IgZWZmZWN0IElECiAgICAgICAgICAgICAgIHVpbnQzMl90IG5leHRVbmlxdWVJZCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvQWxhcm1NYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGI4YzQ0ZDkuLjA1NzQ0MDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL0FsYXJtTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9BbGFybU1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ3Nyw3ICs0NzcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgOiBicy5maWx0ZXJTdGF0cy5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgIik7IHB3LnByaW50KGZlLmdldFZhbHVlKCkuY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgYWxhcm1zOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGZlLmdldEtleSgpLmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihmZS5nZXRLZXkoKS5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9OZXR3b3JrTWFuYWdlbWVudFNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhCmluZGV4IDdiYjc5MzguLjcyMGI1ZmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL05ldHdvcmtNYW5hZ2VtZW50U2VydmljZS5qYXZhCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSW50ZXJmYWNlVHhUaHJvdHRsZVJlc3VsdCA9IDIxOTsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUXVvdGFDb3VudGVyUmVzdWx0ICAgICAgICA9IDIyMDsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVGV0aGVyaW5nU3RhdHNSZXN1bHQgICAgICA9IDIyMTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRG5zUHJveHlRdWVyeVJlc3VsdCAgICAgICA9IDIyMjsKIAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJbnRlcmZhY2VDaGFuZ2UgICAgICAgICAgID0gNjAwOwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCYW5kd2lkdGhDb250cm9sICAgICAgICAgID0gNjAxOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvUG93ZXJNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IGQ5ZDNmNGUuLjYzNDE4ZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1Bvd2VyTWFuYWdlclNlcnZpY2UuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9Qb3dlck1hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTIyMzQsMTQgKzIyMzQsMTggQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IGN1cnJlbnRWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRvU2NyZWVuQW5pbSA9IChtYXNrICYgKFNDUkVFTl9CUklHSFRfQklUIHwgU0NSRUVOX09OX0JJVCkpICE9IDA7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdHVybmluZ09mZiA9IGVuZFZhbHVlID09IFBvd2VyLkJSSUdIVE5FU1NfT0ZGOwotICAgICAgICAgICAgICAgICAgICBpZiAodHVybmluZ09mZiAmJiAoKG1hc2sgJiAoU0NSRUVOX09OX0JJVCB8IFNDUkVFTl9CUklHSFRfQklUKSkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHR1cm5pbmdPZmYgJiYgZG9TY3JlZW5BbmltKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW5jZWwgYWxsIHBlbmRpbmcgYW5pbWF0aW9ucyBzaW5jZSB3ZSdyZSB0dXJuaW5nIG9mZgogICAgICAgICAgICAgICAgICAgICAgICAgbVNjcmVlbkJyaWdodG5lc3NIYW5kbGVyLnJlbW92ZUNhbGxiYWNrc0FuZE1lc3NhZ2VzKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuT2ZmRmluaXNoZWRBbmltYXRpbmdMb2NrZWQobVNjcmVlbk9mZlJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDIwMDsgLy8gVE9ETzogaG93IGxvbmcgc2hvdWxkIHRoaXMgYmU/CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUludGVybmFsKG1hc2ssIHR1cm5pbmdPZmYsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoZG9TY3JlZW5BbmltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlSW50ZXJuYWwobWFzaywgdHVybmluZ09mZiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGtleWJvYXJkIGxpZ2h0IGFuaW1hdGlvbiB3aGVuIHdlIGhhdmUgZGV2aWNlcyB0aGF0IHN1cHBvcnQgaXQKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5TWFuYWdlclNlcnZpY2UuamF2YQppbmRleCA0ZWEyZjA0Li4yNTM4NDU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5qYXZhCkBAIC00OSwxMCArNDksMTAgQEAKIGltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5XYWxscGFwZXJNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQuYXBwLmJhY2t1cC5JQmFja3VwTWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQWN0aXZpdHlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBEYXRhOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnRDYWxsYmFja3MyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CkBAIC00Mjk3LDcgKzQyOTcsNyBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpbnQgdWlkID0gQXBwR2xvYmFscy5nZXRQYWNrYWdlTWFuYWdlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZVVpZChyZWMua2V5LnBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodWlkICE9IEJpbmRlci5nZXRDYWxsaW5nVWlkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVVzZXJJZC5pc1NhbWVBcHAodWlkLCBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5jZWxJbnRlbnRTZW5kZXIoKSBmcm9tIHBpZD0iCiAgICAgICAgICAgICAgICAgICAgICAgICArIEJpbmRlci5nZXRDYWxsaW5nUGlkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgdWlkPSIgKyBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpCkBAIC00NjU3LDkgKzQ2NTcsMTEgQEAKICAgICAgKiBpZiBjYWxsaW5nVWlkIGlzIG5vdCBhbGxvd2VkIHRvIGRvIHRoaXMuICBSZXR1cm5zIHRoZSB1aWQgb2YgdGhlIHRhcmdldAogICAgICAqIGlmIHRoZSBVUkkgcGVybWlzc2lvbiBncmFudCBzaG91bGQgYmUgcGVyZm9ybWVkOyByZXR1cm5zIC0xIGlmIGl0IGlzIG5vdAogICAgICAqIG5lZWRlZCAoZm9yIGV4YW1wbGUgdGFyZ2V0UGtnIGFscmVhZHkgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBVUkkpLgorICAgICAqIElmIHlvdSBhbHJlYWR5IGtub3cgdGhlIHVpZCBvZiB0aGUgdGFyZ2V0LCB5b3UgY2FuIHN1cHBseSBpdCBpbgorICAgICAqIGxhc3RUYXJnZXRVaWQgZWxzZSBzZXQgdGhhdCB0byAtMS4KICAgICAgKi8KICAgICBpbnQgY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoaW50IGNhbGxpbmdVaWQsIFN0cmluZyB0YXJnZXRQa2csCi0gICAgICAgICAgICBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzKSB7CisgICAgICAgICAgICBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzLCBpbnQgbGFzdFRhcmdldFVpZCkgewogICAgICAgICBtb2RlRmxhZ3MgJj0gKEludGVudC5GTEFHX0dSQU5UX1JFQURfVVJJX1BFUk1JU1NJT04KICAgICAgICAgICAgICAgICB8IEludGVudC5GTEFHX0dSQU5UX1dSSVRFX1VSSV9QRVJNSVNTSU9OKTsKICAgICAgICAgaWYgKG1vZGVGbGFncyA9PSAwKSB7CkBAIC00Njk4LDggKzQ3MDAsOCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IHRhcmdldFVpZDsKLSAgICAgICAgaWYgKHRhcmdldFBrZyAhPSBudWxsKSB7CisgICAgICAgIGludCB0YXJnZXRVaWQgPSBsYXN0VGFyZ2V0VWlkOworICAgICAgICBpZiAodGFyZ2V0VWlkIDwgMCAmJiB0YXJnZXRQa2cgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICB0YXJnZXRVaWQgPSBwbS5nZXRQYWNrYWdlVWlkKHRhcmdldFBrZyk7CiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFVpZCA8IDApIHsKQEAgLTQ3MTAsOCArNDcxMiw2IEBACiAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0YXJnZXRVaWQgPSAtMTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh0YXJnZXRVaWQgPj0gMCkgewpAQCAtNDc4Myw3ICs0NzgzLDcgQEAKICAgICAgICAgICAgIFVyaSB1cmksIGludCBtb2RlRmxhZ3MpIHsKICAgICAgICAgZW5mb3JjZU5vdElzb2xhdGVkQ2FsbGVyKCJjaGVja0dyYW50VXJpUGVybWlzc2lvbiIpOwogICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgewotICAgICAgICAgICAgcmV0dXJuIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uTG9ja2VkKGNhbGxpbmdVaWQsIHRhcmdldFBrZywgdXJpLCBtb2RlRmxhZ3MsIC0xKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDgzMCwxMyArNDgzMCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBncmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoaW50IGNhbGxpbmdVaWQsCi0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBVcmkgdXJpLCBpbnQgbW9kZUZsYWdzLCBVcmlQZXJtaXNzaW9uT3duZXIgb3duZXIpIHsKKyAgICB2b2lkIGdyYW50VXJpUGVybWlzc2lvbkxvY2tlZChpbnQgY2FsbGluZ1VpZCwgU3RyaW5nIHRhcmdldFBrZywgVXJpIHVyaSwKKyAgICAgICAgICAgIGludCBtb2RlRmxhZ3MsIFVyaVBlcm1pc3Npb25Pd25lciBvd25lcikgewogICAgICAgICBpZiAodGFyZ2V0UGtnID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidGFyZ2V0UGtnIik7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgdGFyZ2V0VWlkID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLCB1cmksIG1vZGVGbGFncyk7CisgICAgICAgIGludCB0YXJnZXRVaWQgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csIHVyaSwgbW9kZUZsYWdzLCAtMSk7CiAgICAgICAgIGlmICh0YXJnZXRVaWQgPCAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTQ4NDQsMTMgKzQ4NDQsMjYgQEAKICAgICAgICAgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkTG9ja2VkKHRhcmdldFVpZCwgdGFyZ2V0UGtnLCB1cmksIG1vZGVGbGFncywgb3duZXIpOwogICAgIH0KIAorICAgIHN0YXRpYyBjbGFzcyBOZWVkZWRVcmlHcmFudHMgZXh0ZW5kcyBBcnJheUxpc3Q8VXJpPiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXRQa2c7CisgICAgICAgIGZpbmFsIGludCB0YXJnZXRVaWQ7CisgICAgICAgIGZpbmFsIGludCBmbGFnczsKKworICAgICAgICBOZWVkZWRVcmlHcmFudHMoU3RyaW5nIF90YXJnZXRQa2csIGludCBfdGFyZ2V0VWlkLCBpbnQgX2ZsYWdzKSB7CisgICAgICAgICAgICB0YXJnZXRQa2cgPSBfdGFyZ2V0UGtnOworICAgICAgICAgICAgdGFyZ2V0VWlkID0gX3RhcmdldFVpZDsKKyAgICAgICAgICAgIGZsYWdzID0gX2ZsYWdzOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTGlrZSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZCwgYnV0IHRha2VzIGFuIEludGVudC4KICAgICAgKi8KLSAgICBpbnQgY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Gcm9tSW50ZW50TG9ja2VkKGludCBjYWxsaW5nVWlkLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBrZywgSW50ZW50IGludGVudCkgeworICAgIE5lZWRlZFVyaUdyYW50cyBjaGVja0dyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoaW50IGNhbGxpbmdVaWQsCisgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBJbnRlbnQgaW50ZW50LCBpbnQgbW9kZSwgTmVlZGVkVXJpR3JhbnRzIG5lZWRlZCkgewogICAgICAgICBpZiAoREVCVUdfVVJJX1BFUk1JU1NJT04pIFNsb2cudihUQUcsCi0gICAgICAgICAgICAgICAgIkNoZWNraW5nIFVSSSBwZXJtIHRvICIgKyAoaW50ZW50ICE9IG51bGwgPyBpbnRlbnQuZ2V0RGF0YSgpIDogbnVsbCkKKyAgICAgICAgICAgICAgICAiQ2hlY2tpbmcgVVJJIHBlcm0gdG8gZGF0YT0iICsgKGludGVudCAhPSBudWxsID8gaW50ZW50LmdldERhdGEoKSA6IG51bGwpCisgICAgICAgICAgICAgICAgKyAiIGNsaXA9IiArIChpbnRlbnQgIT0gbnVsbCA/IGludGVudC5nZXRDbGlwRGF0YSgpIDogbnVsbCkKICAgICAgICAgICAgICAgICArICIgZnJvbSAiICsgaW50ZW50ICsgIjsgZmxhZ3M9MHgiCiAgICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGludGVudCAhPSBudWxsID8gaW50ZW50LmdldEZsYWdzKCkgOiAwKSk7CiAKQEAgLTQ4NTksMzMgKzQ4NzIsNzQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgVXJpIGRhdGEgPSBpbnRlbnQuZ2V0RGF0YSgpOwotICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIENsaXBEYXRhIGNsaXAgPSBpbnRlbnQuZ2V0Q2xpcERhdGEoKTsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCAmJiBjbGlwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGVja0dyYW50VXJpUGVybWlzc2lvbkxvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csIGRhdGEsCi0gICAgICAgICAgICAgICAgaW50ZW50LmdldEZsYWdzKCkpOworICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICBpbnQgdGFyZ2V0ID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLCBkYXRhLAorICAgICAgICAgICAgICAgIG1vZGUsIG5lZWRlZCAhPSBudWxsID8gbmVlZGVkLnRhcmdldFVpZCA6IC0xKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5lZWRlZCA9IG5ldyBOZWVkZWRVcmlHcmFudHModGFyZ2V0UGtnLCB0YXJnZXQsIG1vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZWVkZWQuYWRkKGRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbGlwICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTxjbGlwLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBVcmkgdXJpID0gY2xpcC5nZXRJdGVtQXQoaSkuZ2V0VXJpKCk7CisgICAgICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Mb2NrZWQoY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLCB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwgbmVlZGVkICE9IG51bGwgPyBuZWVkZWQudGFyZ2V0VWlkIDogLTEpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkID0gbmV3IE5lZWRlZFVyaUdyYW50cyh0YXJnZXRQa2csIHRhcmdldCwgbW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQuYWRkKHVyaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBJbnRlbnQgY2xpcEludGVudCA9IGNsaXAuZ2V0SXRlbUF0KGkpLmdldEludGVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xpcEludGVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOZWVkZWRVcmlHcmFudHMgbmV3TmVlZGVkID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Gcm9tSW50ZW50TG9ja2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nVWlkLCB0YXJnZXRQa2csIGNsaXBJbnRlbnQsIG1vZGUsIG5lZWRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmVlZGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgPSBuZXdOZWVkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmVlZGVkOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIExpa2UgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkTG9ja2VkLCBidXQgdGFrZXMgYW4gSW50ZW50LgogICAgICAqLwotICAgIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkRnJvbUludGVudExvY2tlZChpbnQgdGFyZ2V0VWlkLAotICAgICAgICAgICAgU3RyaW5nIHRhcmdldFBrZywgSW50ZW50IGludGVudCwgVXJpUGVybWlzc2lvbk93bmVyIG93bmVyKSB7Ci0gICAgICAgIGdyYW50VXJpUGVybWlzc2lvblVuY2hlY2tlZExvY2tlZCh0YXJnZXRVaWQsIHRhcmdldFBrZywgaW50ZW50LmdldERhdGEoKSwKLSAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0RmxhZ3MoKSwgb3duZXIpOworICAgIHZvaWQgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkRnJvbUludGVudExvY2tlZChOZWVkZWRVcmlHcmFudHMgbmVlZGVkLAorICAgICAgICAgICAgVXJpUGVybWlzc2lvbk93bmVyIG93bmVyKSB7CisgICAgICAgIGlmIChuZWVkZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPG5lZWRlZC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGdyYW50VXJpUGVybWlzc2lvblVuY2hlY2tlZExvY2tlZChuZWVkZWQudGFyZ2V0VWlkLCBuZWVkZWQudGFyZ2V0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkLmdldChpKSwgbmVlZGVkLmZsYWdzLCBvd25lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGdyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoaW50IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGtnLCBJbnRlbnQgaW50ZW50LCBVcmlQZXJtaXNzaW9uT3duZXIgb3duZXIpIHsKLSAgICAgICAgaW50IHRhcmdldFVpZCA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uRnJvbUludGVudExvY2tlZChjYWxsaW5nVWlkLCB0YXJnZXRQa2csIGludGVudCk7Ci0gICAgICAgIGlmICh0YXJnZXRVaWQgPCAwKSB7CisgICAgICAgIE5lZWRlZFVyaUdyYW50cyBuZWVkZWQgPSBjaGVja0dyYW50VXJpUGVybWlzc2lvbkZyb21JbnRlbnRMb2NrZWQoY2FsbGluZ1VpZCwgdGFyZ2V0UGtnLAorICAgICAgICAgICAgICAgIGludGVudCwgaW50ZW50LmdldEZsYWdzKCksIG51bGwpOworICAgICAgICBpZiAobmVlZGVkID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGdyYW50VXJpUGVybWlzc2lvblVuY2hlY2tlZEZyb21JbnRlbnRMb2NrZWQodGFyZ2V0VWlkLCB0YXJnZXRQa2csIGludGVudCwgb3duZXIpOworICAgICAgICBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRGcm9tSW50ZW50TG9ja2VkKG5lZWRlZCwgb3duZXIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGdyYW50VXJpUGVybWlzc2lvbihJQXBwbGljYXRpb25UaHJlYWQgY2FsbGVyLCBTdHJpbmcgdGFyZ2V0UGtnLApAQCAtNTQwNiw3ICs1NDYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RvcFNlcnZpY2VMb2NrZWQoc3IpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHNyLnBlbmRpbmdTdGFydHMuYWRkKG5ldyBTZXJ2aWNlUmVjb3JkLlN0YXJ0SXRlbShzciwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzci5tYWtlTmV4dFN0YXJ0SWQoKSwgYmFzZUludGVudCwgLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzci5tYWtlTmV4dFN0YXJ0SWQoKSwgYmFzZUludGVudCwgbnVsbCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3IuYXBwICE9IG51bGwgJiYgc3IuYXBwLnRocmVhZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kU2VydmljZUFyZ3NMb2NrZWQoc3IsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTA0NCw3ICs5MDk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpPE47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgICAgSW50ZW50OiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudHMuZ2V0KGkpLnRvU2hvcnRTdHJpbmcoc2IsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnRzLmdldChpKS50b1Nob3J0U3RyaW5nKHNiLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gaW50ZW50cy5nZXQoaSkuZ2V0RXh0cmFzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKQEAgLTkxMjksNyArOTE4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvblJlY29yZCBjb25uID0gY2xpc3QuZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgICAgICAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludChjb25uLmJpbmRpbmcuaW50ZW50LmludGVudC5nZXRJbnRlbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU2hvcnRTdHJpbmcoZmFsc2UsIGZhbHNlLCBmYWxzZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU2hvcnRTdHJpbmcoZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIC0+ICIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NSZWNvcmQgcHJvYyA9IGNvbm4uYmluZGluZy5jbGllbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnRsbihwcm9jICE9IG51bGwgPyBwcm9jLnRvU2hvcnRTdHJpbmcoKSA6ICJudWxsIik7CkBAIC05MzgwLDcgKzk0MzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBDb21wbGV0ZSArIGJyaWVmID09IGdpdmUgYSBzdW1tYXJ5LiAgSXNuJ3QgdGhhdCBvYnZpb3VzPyE/CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VGFzay5pbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obGFzdFRhc2suaW50ZW50LnRvSW5zZWN1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4obGFzdFRhc2suaW50ZW50LnRvSW5zZWN1cmVTdHJpbmdXaXRoQ2xpcCgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEwNjkyLDkgKzEwNzQ2LDkgQEAKICAgICAgICAgICAgICAgICBzaS5kZWxpdmVyZWRUaW1lID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7CiAgICAgICAgICAgICAgICAgci5kZWxpdmVyZWRTdGFydHMuYWRkKHNpKTsKICAgICAgICAgICAgICAgICBzaS5kZWxpdmVyeUNvdW50Kys7Ci0gICAgICAgICAgICAgICAgaWYgKHNpLnRhcmdldFBlcm1pc3Npb25VaWQgPj0gMCAmJiBzaS5pbnRlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBncmFudFVyaVBlcm1pc3Npb25VbmNoZWNrZWRGcm9tSW50ZW50TG9ja2VkKHNpLnRhcmdldFBlcm1pc3Npb25VaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wYWNrYWdlTmFtZSwgc2kuaW50ZW50LCBzaS5nZXRVcmlQZXJtaXNzaW9uc0xvY2tlZCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2kubmVlZGVkR3JhbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JhbnRVcmlQZXJtaXNzaW9uVW5jaGVja2VkRnJvbUludGVudExvY2tlZChzaS5uZWVkZWRHcmFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2kuZ2V0VXJpUGVybWlzc2lvbnNMb2NrZWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJ1bXBTZXJ2aWNlRXhlY3V0aW5nTG9ja2VkKHIsICJzdGFydCIpOwogICAgICAgICAgICAgICAgIGlmICghb29tQWRqdXN0ZWQpIHsKQEAgLTEwNzcyLDcgKzEwODI2LDcgQEAKICAgICAgICAgYm9vbGVhbiBjcmVhdGVkID0gZmFsc2U7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBtU3RyaW5nQnVpbGRlci5zZXRMZW5ndGgoMCk7Ci0gICAgICAgICAgICByLmludGVudC5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKG1TdHJpbmdCdWlsZGVyLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICByLmludGVudC5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKG1TdHJpbmdCdWlsZGVyLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwogICAgICAgICAgICAgRXZlbnRMb2cud3JpdGVFdmVudChFdmVudExvZ1RhZ3MuQU1fQ1JFQVRFX1NFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHIpLCByLnNob3J0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgbVN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKSwgci5hcHAucGlkKTsKQEAgLTEwNzk4LDcgKzEwODUyLDcgQEAKICAgICAgICAgLy8gYmUgY2FsbGVkLgogICAgICAgICBpZiAoci5zdGFydFJlcXVlc3RlZCAmJiByLmNhbGxTdGFydCAmJiByLnBlbmRpbmdTdGFydHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIHIucGVuZGluZ1N0YXJ0cy5hZGQobmV3IFNlcnZpY2VSZWNvcmQuU3RhcnRJdGVtKHIsIGZhbHNlLCByLm1ha2VOZXh0U3RhcnRJZCgpLAotICAgICAgICAgICAgICAgICAgICBudWxsLCAtMSkpOworICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKSk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIHNlbmRTZXJ2aWNlQXJnc0xvY2tlZChyLCB0cnVlKTsKQEAgLTExMTcwLDE1ICsxMTIyNCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgPyByZXMucGVybWlzc2lvbiA6ICJwcml2YXRlIHRvIHBhY2thZ2UiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFNlcnZpY2VSZWNvcmQgciA9IHJlcy5yZWNvcmQ7Ci0gICAgICAgICAgICBpbnQgdGFyZ2V0UGVybWlzc2lvblVpZCA9IGNoZWNrR3JhbnRVcmlQZXJtaXNzaW9uRnJvbUludGVudExvY2tlZCgKLSAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1VpZCwgci5wYWNrYWdlTmFtZSwgc2VydmljZSk7CisgICAgICAgICAgICBOZWVkZWRVcmlHcmFudHMgbmVlZGVkR3JhbnRzID0gY2hlY2tHcmFudFVyaVBlcm1pc3Npb25Gcm9tSW50ZW50TG9ja2VkKAorICAgICAgICAgICAgICAgICAgICBjYWxsaW5nVWlkLCByLnBhY2thZ2VOYW1lLCBzZXJ2aWNlLCBzZXJ2aWNlLmdldEZsYWdzKCksIG51bGwpOwogICAgICAgICAgICAgaWYgKHVuc2NoZWR1bGVTZXJ2aWNlUmVzdGFydExvY2tlZChyKSkgewogICAgICAgICAgICAgICAgIGlmIChERUJVR19TRVJWSUNFKSBTbG9nLnYoVEFHLCAiU1RBUlQgU0VSVklDRSBXSElMRSBSRVNUQVJUIFBFTkRJTkc6ICIgKyByKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHIuc3RhcnRSZXF1ZXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgci5jYWxsU3RhcnQgPSBmYWxzZTsKICAgICAgICAgICAgIHIucGVuZGluZ1N0YXJ0cy5hZGQobmV3IFNlcnZpY2VSZWNvcmQuU3RhcnRJdGVtKHIsIGZhbHNlLCByLm1ha2VOZXh0U3RhcnRJZCgpLAotICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLCB0YXJnZXRQZXJtaXNzaW9uVWlkKSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UsIG5lZWRlZEdyYW50cykpOwogICAgICAgICAgICAgci5sYXN0QWN0aXZpdHkgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoci5zdGF0cy5nZXRCYXR0ZXJ5U3RhdHMoKSkgewogICAgICAgICAgICAgICAgIHIuc3RhdHMuc3RhcnRSdW5uaW5nTG9ja2VkKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlSZWNvcmQuamF2YQppbmRleCBjZGFiNmM2Li5hMzM3YjQwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5UmVjb3JkLmphdmEKQEAgLTEyNywyNiArMTI3LDI3IEBACiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJwYWNrYWdlTmFtZT0iKTsgcHcucHJpbnQocGFja2FnZU5hbWUpOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgcHJvY2Vzc05hbWU9Iik7IHB3LnByaW50bG4ocHJvY2Vzc05hbWUpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibGF1bmNoZWRGcm9tVWlkPSIpOyBwdy5wcmludChsYXVuY2hlZEZyb21VaWQpOwotICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgidXNlcklkPSIpOyBwdy5wcmludCh1c2VySWQpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KCIgYXBwPSIpOyBwdy5wcmludGxuKGFwcCk7Ci0gICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50bG4oaW50ZW50LnRvSW5zZWN1cmVTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB1c2VySWQ9Iik7IHB3LnByaW50bG4odXNlcklkKTsKKyAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImFwcD0iKTsgcHcucHJpbnRsbihhcHApOworICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludGxuKGludGVudC50b0luc2VjdXJlU3RyaW5nV2l0aENsaXAoKSk7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJmcm9udE9mVGFzaz0iKTsgcHcucHJpbnQoZnJvbnRPZlRhc2spOwogICAgICAgICAgICAgICAgIHB3LnByaW50KCIgdGFzaz0iKTsgcHcucHJpbnRsbih0YXNrKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInRhc2tBZmZpbml0eT0iKTsgcHcucHJpbnRsbih0YXNrQWZmaW5pdHkpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVhbEFjdGl2aXR5PSIpOwogICAgICAgICAgICAgICAgIHB3LnByaW50bG4ocmVhbEFjdGl2aXR5LmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCkpOwotICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiYmFzZT0iKTsgcHcucHJpbnQoYmFzZURpcik7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXNEaXIuZXF1YWxzKGJhc2VEaXIpKSBwdy5wcmludCgiIHJlcz0iKTsgcHcucHJpbnQocmVzRGlyKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludCgiIGRhdGE9Iik7IHB3LnByaW50bG4oZGF0YURpcik7Ci0gICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJsYWJlbFJlcz0weCIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcobGFiZWxSZXMpKTsKLSAgICAgICAgICAgICAgICBwdy5wcmludCgiIGljb249MHgiKTsgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhpY29uKSk7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoIiB0aGVtZT0weCIpOyBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcodGhlbWUpKTsKKyAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImJhc2VEaXI9Iik7IHB3LnByaW50bG4oYmFzZURpcik7CisgICAgICAgIGlmICghcmVzRGlyLmVxdWFscyhiYXNlRGlyKSkgeworICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInJlc0Rpcj0iKTsgcHcucHJpbnRsbihyZXNEaXIpOworICAgICAgICB9CisgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJkYXRhRGlyPSIpOyBwdy5wcmludGxuKGRhdGFEaXIpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgic3RhdGVOb3ROZWVkZWQ9Iik7IHB3LnByaW50KHN0YXRlTm90TmVlZGVkKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGNvbXBvbmVudFNwZWNpZmllZD0iKTsgcHcucHJpbnQoY29tcG9uZW50U3BlY2lmaWVkKTsKICAgICAgICAgICAgICAgICBwdy5wcmludCgiIGlzSG9tZUFjdGl2aXR5PSIpOyBwdy5wcmludGxuKGlzSG9tZUFjdGl2aXR5KTsKKyAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImNvbXBhdD0iKTsgcHcucHJpbnQoY29tcGF0KTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIGxhYmVsUmVzPTB4Iik7IHB3LnByaW50KEludGVnZXIudG9IZXhTdHJpbmcobGFiZWxSZXMpKTsKKyAgICAgICAgICAgICAgICBwdy5wcmludCgiIGljb249MHgiKTsgcHcucHJpbnQoSW50ZWdlci50b0hleFN0cmluZyhpY29uKSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoIiB0aGVtZT0weCIpOyBwdy5wcmludGxuKEludGVnZXIudG9IZXhTdHJpbmcodGhlbWUpKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImNvbmZpZz0iKTsgcHcucHJpbnRsbihjb25maWd1cmF0aW9uKTsKLSAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImNvbXBhdD0iKTsgcHcucHJpbnRsbihjb21wYXQpOwogICAgICAgICBpZiAocmVzdWx0VG8gIT0gbnVsbCB8fCByZXN1bHRXaG8gIT0gbnVsbCkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInJlc3VsdFRvPSIpOyBwdy5wcmludChyZXN1bHRUbyk7CiAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50KCIgcmVzdWx0V2hvPSIpOyBwdy5wcmludChyZXN1bHRXaG8pOwpAQCAtMTkzLDEzICsxOTQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKGxhdW5jaFRpbWUsIHB3KTsgcHcucHJpbnQoIiBzdGFydFRpbWU9Iik7CiAgICAgICAgICAgICAgICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihzdGFydFRpbWUsIHB3KTsgcHcucHJpbnRsbigiIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGxhc3RWaXNpYmxlVGltZSAhPSAwKSB7Ci0gICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgibGFzdFZpc2libGVUaW1lPSIpOwotICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24obGFzdFZpc2libGVUaW1lLCBwdyk7IHB3LnByaW50bG4oIiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3YWl0aW5nVmlzaWJsZSB8fCBub3dWaXNpYmxlKSB7CisgICAgICAgIGlmIChsYXN0VmlzaWJsZVRpbWUgIT0gMCB8fCB3YWl0aW5nVmlzaWJsZSB8fCBub3dWaXNpYmxlKSB7CiAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgid2FpdGluZ1Zpc2libGU9Iik7IHB3LnByaW50KHdhaXRpbmdWaXNpYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgcHcucHJpbnQoIiBub3dWaXNpYmxlPSIpOyBwdy5wcmludGxuKG5vd1Zpc2libGUpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgiIG5vd1Zpc2libGU9Iik7IHB3LnByaW50KG5vd1Zpc2libGUpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludCgibGFzdFZpc2libGVUaW1lPSIpOworICAgICAgICAgICAgICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24obGFzdFZpc2libGVUaW1lLCBwdyk7IHB3LnByaW50bG4oIiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb25maWdEZXN0cm95IHx8IGNvbmZpZ0NoYW5nZUZsYWdzICE9IDApIHsKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJjb25maWdEZXN0cm95PSIpOyBwdy5wcmludChjb25maWdEZXN0cm95KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0FjdGl2aXR5U3RhY2suamF2YQppbmRleCBmOTY0MWViLi5hNGU1NzNkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9BY3Rpdml0eVN0YWNrLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vQWN0aXZpdHlTdGFjay5qYXZhCkBAIC0xODIxLDYgKzE4MjEsMTAgQEAKICAgICAgICAgICAgIGlmIChiZWxvdyAhPSBudWxsICYmIGJlbG93LmZpbmlzaGluZykgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRG9uJ3QgY2hlY2sgYW55IGxvd2VyIGluIHRoZSBzdGFjayBpZiB3ZSdyZSBjcm9zc2luZyBhIHVzZXIgYm91bmRhcnkuCisgICAgICAgICAgICBpZiAoYmVsb3cgIT0gbnVsbCAmJiBiZWxvdy51c2VySWQgIT0gdGFza1RvcC51c2VySWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRhcmdldCA9IGJlbG93OwogICAgICAgICAgICAgICAgIHRhcmdldEkgPSBpOwpAQCAtMjI5MCw4ICsyMjk0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgPT0gU1RBUlRfU1VDQ0VTUykgewotICAgICAgICAgICAgU2xvZy5pKFRBRywgIlNUQVJUIHsiICsgaW50ZW50LnRvU2hvcnRTdHJpbmcodHJ1ZSwgdHJ1ZSwgdHJ1ZSkgKyAifSBmcm9tIHBpZCAiCi0gICAgICAgICAgICAgICAgICAgICsgKGNhbGxlckFwcCAhPSBudWxsID8gY2FsbGVyQXBwLnBpZCA6IGNhbGxpbmdQaWQpKTsKKyAgICAgICAgICAgIFNsb2cuaShUQUcsICJTVEFSVCB7IiArIGludGVudC50b1Nob3J0U3RyaW5nKHRydWUsIHRydWUsIHRydWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICArICJ9IGZyb20gcGlkICIgKyAoY2FsbGVyQXBwICE9IG51bGwgPyBjYWxsZXJBcHAucGlkIDogY2FsbGluZ1BpZCkpOwogICAgICAgICB9CiAKICAgICAgICAgQWN0aXZpdHlSZWNvcmQgc291cmNlUmVjb3JkID0gbnVsbDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0ludGVudEJpbmRSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL0ludGVudEJpbmRSZWNvcmQuamF2YQppbmRleCAyNjE4Yzc3Li5jOTRmNzE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9JbnRlbnRCaW5kUmVjb3JkLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vSW50ZW50QmluZFJlY29yZC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAKICAgICB2b2lkIGR1bXBJblNlcnZpY2UoUHJpbnRXcml0ZXIgcHcsIFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImludGVudD17Iik7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQoaW50ZW50LmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgcHcucHJpbnQoaW50ZW50LmdldEludGVudCgpLnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oJ30nKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoImJpbmRlcj0iKTsgcHcucHJpbnRsbihiaW5kZXIpOwogICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgicmVxdWVzdGVkPSIpOyBwdy5wcmludChyZXF1ZXN0ZWQpOwpAQCAtODksNyArODksNyBAQAogICAgICAgICBzYi5hcHBlbmQoc2VydmljZS5zaG9ydE5hbWUpOwogICAgICAgICBzYi5hcHBlbmQoJzonKTsKICAgICAgICAgaWYgKGludGVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQuZ2V0SW50ZW50KCkudG9TaG9ydFN0cmluZyhzYiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBpbnRlbnQuZ2V0SW50ZW50KCkudG9TaG9ydFN0cmluZyhzYiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIHNiLmFwcGVuZCgnfScpOwogICAgICAgICByZXR1cm4gc3RyaW5nTmFtZSA9IHNiLnRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9QZW5kaW5nSW50ZW50UmVjb3JkLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9QZW5kaW5nSW50ZW50UmVjb3JkLmphdmEKaW5kZXggM2I2YTk3Yy4uMDA0Mzg3NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vUGVuZGluZ0ludGVudFJlY29yZC5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1BlbmRpbmdJbnRlbnRSZWNvcmQuamF2YQpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gIktleXsiICsgdHlwZU5hbWUoKSArICIgcGtnPSIgKyBwYWNrYWdlTmFtZQogICAgICAgICAgICAgICAgICsgIiBpbnRlbnQ9IgogICAgICAgICAgICAgICAgICsgKHJlcXVlc3RJbnRlbnQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyByZXF1ZXN0SW50ZW50LnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlKSA6ICI8bnVsbD4iKQorICAgICAgICAgICAgICAgICAgICAgICAgPyByZXF1ZXN0SW50ZW50LnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSkgOiAiPG51bGw+IikKICAgICAgICAgICAgICAgICArICIgZmxhZ3M9MHgiICsgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykgKyAifSI7CiAgICAgICAgIH0KICAgICAgICAgCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoa2V5LnJlcXVlc3RJbnRlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInJlcXVlc3RJbnRlbnQ9Iik7Ci0gICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oa2V5LnJlcXVlc3RJbnRlbnQudG9TaG9ydFN0cmluZyhmYWxzZSwgdHJ1ZSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKGtleS5yZXF1ZXN0SW50ZW50LnRvU2hvcnRTdHJpbmcoZmFsc2UsIHRydWUsIHRydWUsIHRydWUpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc2VudCB8fCBjYW5jZWxlZCkgewogICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInNlbnQ9Iik7IHB3LnByaW50KHNlbnQpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vU2VydmljZVJlY29yZC5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vU2VydmljZVJlY29yZC5qYXZhCmluZGV4IGRhYTM2NTMuLjgyOGVlZjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1NlcnZpY2VSZWNvcmQuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9TZXJ2aWNlUmVjb3JkLmphdmEKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAgICBmaW5hbCBib29sZWFuIHRhc2tSZW1vdmVkOwogICAgICAgICBmaW5hbCBpbnQgaWQ7CiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQ7Ci0gICAgICAgIGZpbmFsIGludCB0YXJnZXRQZXJtaXNzaW9uVWlkOworICAgICAgICBmaW5hbCBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlLk5lZWRlZFVyaUdyYW50cyBuZWVkZWRHcmFudHM7CiAgICAgICAgIGxvbmcgZGVsaXZlcmVkVGltZTsKICAgICAgICAgaW50IGRlbGl2ZXJ5Q291bnQ7CiAgICAgICAgIGludCBkb25lRXhlY3V0aW5nQ291bnQ7CkBAIC0xMTUsMTIgKzExNSwxMiBAQAogICAgICAgICBTdHJpbmcgc3RyaW5nTmFtZTsgICAgICAvLyBjYWNoaW5nIG9mIHRvU3RyaW5nCiAKICAgICAgICAgU3RhcnRJdGVtKFNlcnZpY2VSZWNvcmQgX3NyLCBib29sZWFuIF90YXNrUmVtb3ZlZCwgaW50IF9pZCwgSW50ZW50IF9pbnRlbnQsCi0gICAgICAgICAgICAgICAgaW50IF90YXJnZXRQZXJtaXNzaW9uVWlkKSB7CisgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyU2VydmljZS5OZWVkZWRVcmlHcmFudHMgX25lZWRlZEdyYW50cykgewogICAgICAgICAgICAgc3IgPSBfc3I7CiAgICAgICAgICAgICB0YXNrUmVtb3ZlZCA9IF90YXNrUmVtb3ZlZDsKICAgICAgICAgICAgIGlkID0gX2lkOwogICAgICAgICAgICAgaW50ZW50ID0gX2ludGVudDsKLSAgICAgICAgICAgIHRhcmdldFBlcm1pc3Npb25VaWQgPSBfdGFyZ2V0UGVybWlzc2lvblVpZDsKKyAgICAgICAgICAgIG5lZWRlZEdyYW50cyA9IF9uZWVkZWRHcmFudHM7CiAgICAgICAgIH0KIAogICAgICAgICBVcmlQZXJtaXNzaW9uT3duZXIgZ2V0VXJpUGVybWlzc2lvbnNMb2NrZWQoKSB7CkBAIC0xNzcsOSArMTc3LDkgQEAKICAgICAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCIgIGludGVudD0iKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNpLmludGVudCAhPSBudWxsKSBwdy5wcmludGxuKHNpLmludGVudC50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZSBwdy5wcmludGxuKCJudWxsIik7Ci0gICAgICAgICAgICBpZiAoc2kudGFyZ2V0UGVybWlzc2lvblVpZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoIiAgdGFyZ2V0UGVybWlzc2lvblVpZD0iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB3LnByaW50bG4oc2kudGFyZ2V0UGVybWlzc2lvblVpZCk7CisgICAgICAgICAgICBpZiAoc2kubmVlZGVkR3JhbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdy5wcmludChwcmVmaXgpOyBwdy5wcmludCgiICBuZWVkZWRHcmFudHM9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy5wcmludGxuKHNpLm5lZWRlZEdyYW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc2kudXJpUGVybWlzc2lvbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChzaS51cmlQZXJtaXNzaW9ucy5yZWFkVXJpUGVybWlzc2lvbnMgIT0gbnVsbCkgewpAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgCiAgICAgdm9pZCBkdW1wKFByaW50V3JpdGVyIHB3LCBTdHJpbmcgcHJlZml4KSB7CiAgICAgICAgIHB3LnByaW50KHByZWZpeCk7IHB3LnByaW50KCJpbnRlbnQ9eyIpOwotICAgICAgICAgICAgICAgIHB3LnByaW50KGludGVudC5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKGZhbHNlLCB0cnVlLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIHB3LnByaW50KGludGVudC5nZXRJbnRlbnQoKS50b1Nob3J0U3RyaW5nKGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgIHB3LnByaW50bG4oJ30nKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInBhY2thZ2VOYW1lPSIpOyBwdy5wcmludGxuKHBhY2thZ2VOYW1lKTsKICAgICAgICAgcHcucHJpbnQocHJlZml4KTsgcHcucHJpbnQoInByb2Nlc3NOYW1lPSIpOyBwdy5wcmludGxuKHByb2Nlc3NOYW1lKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Rhc2tSZWNvcmQuamF2YSBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2FtL1Rhc2tSZWNvcmQuamF2YQppbmRleCA0N2VjMjE4Li42Nzg3M2NjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9hbS9UYXNrUmVjb3JkLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvYW0vVGFza1JlY29yZC5qYXZhCkBAIC0xMTEsMTQgKzExMSwxNCBAQAogICAgICAgICBpZiAoaW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwogICAgICAgICAgICAgc2IuYXBwZW5kKHByZWZpeCk7IHNiLmFwcGVuZCgiaW50ZW50PXsiKTsKLSAgICAgICAgICAgIGludGVudC50b1Nob3J0U3RyaW5nKHNiLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgaW50ZW50LnRvU2hvcnRTdHJpbmcoc2IsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICBzYi5hcHBlbmQoJ30nKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFmZmluaXR5SW50ZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOwogICAgICAgICAgICAgc2IuYXBwZW5kKHByZWZpeCk7IHNiLmFwcGVuZCgiYWZmaW5pdHlJbnRlbnQ9eyIpOwotICAgICAgICAgICAgYWZmaW5pdHlJbnRlbnQudG9TaG9ydFN0cmluZyhzYiwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGFmZmluaXR5SW50ZW50LnRvU2hvcnRTdHJpbmcoc2IsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICBzYi5hcHBlbmQoJ30nKTsKICAgICAgICAgICAgIHB3LnByaW50bG4oc2IudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci93bS9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDFjNWE3MGYuLjE4YjUxYTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL3dtL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKKysrIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvd20vV2luZG93TWFuYWdlclNlcnZpY2UuamF2YQpAQCAtNjM0Nyw2ICs2MzQ3LDggQEAKICAgICAgICAgc3luY2hyb25pemVkIChtV2luZG93TWFwKSB7CiAgICAgICAgICAgICBtSW5wdXRNb25pdG9yLnNldEV2ZW50RGlzcGF0Y2hpbmdMdyhlbmFibGVkKTsKICAgICAgICAgfQorCisgICAgICAgIHNlbmRTY3JlZW5TdGF0dXNUb0NsaWVudHMoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY1NzAsNiArNjU3MiwyMCBAQAogICAgICAgICBtUG9saWN5LnN5c3RlbVJlYWR5KCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRTY3JlZW5TdGF0dXNUb0NsaWVudHMoKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxXaW5kb3dTdGF0ZT4gd2luZG93cyA9IG1XaW5kb3dzOworICAgICAgICBmaW5hbCBpbnQgY291bnQgPSB3aW5kb3dzLnNpemUoKTsKKyAgICAgICAgYm9vbGVhbiBvbiA9IG1Qb3dlck1hbmFnZXIuaXNTY3JlZW5PbigpOworICAgICAgICBmb3IgKGludCBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgV2luZG93U3RhdGUgd2luID0gbVdpbmRvd3MuZ2V0KGkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aW4ubUNsaWVudC5kaXNwYXRjaFNjcmVlblN0YXRlKG9uKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlZAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLy8gVGhpcyBpcyBhbiBhbmltYXRpb24gdGhhdCBkb2VzIG5vdGhpbmc6IGl0IGp1c3QgaW1tZWRpYXRlbHkgZmluaXNoZXMKICAgICAvLyBpdHNlbGYgZXZlcnkgdGltZSBpdCBpcyBjYWxsZWQuICBJdCBpcyB1c2VkIGFzIGEgc3R1YiBhbmltYXRpb24gaW4gY2FzZXMKICAgICAvLyB3aGVyZSB3ZSB3YW50IHRvIHN5bmNocm9uaXplIG11bHRpcGxlIHRoaW5ncyB0aGF0IG1heSBiZSBhbmltYXRpbmcuCkBAIC05MTU3LDcgKzkxNzMsNyBAQAogCiAgICAgdm9pZCBzY2hlZHVsZUFuaW1hdGlvbkxvY2tlZCgpIHsKICAgICAgICAgaWYgKCFtQW5pbWF0aW9uU2NoZWR1bGVkKSB7Ci0gICAgICAgICAgICBtQ2hvcmVvZ3JhcGhlci5wb3N0QW5pbWF0aW9uQ2FsbGJhY2sobUFuaW1hdGlvblJ1bm5hYmxlKTsKKyAgICAgICAgICAgIG1DaG9yZW9ncmFwaGVyLnBvc3RBbmltYXRpb25DYWxsYmFjayhtQW5pbWF0aW9uUnVubmFibGUsIG51bGwpOwogICAgICAgICAgICAgbUFuaW1hdGlvblNjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExZTQyNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEV2ZW50VGhyZWFkLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTGF5ZXIuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMYXllckJhc2UuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExheWVyRGltLmNwcCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTGF5ZXJTY3JlZW5zaG90LmNwcCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEZG1Db25uZWN0aW9uLmNwcCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwICAgICBcCi0gICAgRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwIFwKLSAgICBEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5jcHAgICAgICAgICAgXAotICAgIERpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuY3BwICAgICAgICBcCi0gICAgRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAgICAgICAgICAgICAgIFwKLSAgICBHTEV4dGVuc2lvbnMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1lc3NhZ2VRdWV1ZS5jcHAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU3VyZmFjZUZsaW5nZXIuY3BwICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTdXJmYWNlVGV4dHVyZUxheWVyLmNwcCAgICAgICAgICAgICAgICAgXAotICAgIFRyYW5zZm9ybS5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgCi0KLUxPQ0FMX0NGTEFHUzo9IC1ETE9HX1RBRz1cIlN1cmZhY2VGbGluZ2VyXCIKLUxPQ0FMX0NGTEFHUyArPSAtREdMX0dMRVhUX1BST1RPVFlQRVMgLURFR0xfRUdMRVhUX1BST1RPVFlQRVMKLQotaWZlcSAoJChUQVJHRVRfSEFTX1dBSVRGT1JWU1lOQyksIHRydWUpCi0JTE9DQUxfQ0ZMQUdTICs9IC1ESEFTX1dBSVRGT1JWU1lOQwotZW5kaWYKLQotaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLCBvbWFwMykKLQlMT0NBTF9DRkxBR1MgKz0gLUROT19SR0JYXzg4ODgKLWVuZGlmCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIG9tYXA0KQotCUxPQ0FMX0NGTEFHUyArPSAtREhBU19DT05URVhUX1BSSU9SSVRZCi0JTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX1RSSVBMRV9CVUZGRVJJTkcKLWVuZGlmCi1pZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksIHM1cGMxMTApCi0JTE9DQUxfQ0ZMQUdTICs9IC1ESEFTX0NPTlRFWFRfUFJJT1JJVFkgLURORVZFUl9ERUZBVUxUX1RPX0FTWU5DX01PREUKLWVuZGlmCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGliaGFyZHdhcmUgXAotCWxpYnV0aWxzIFwKLQlsaWJFR0wgXAotCWxpYkdMRVN2MV9DTSBcCi0JbGliYmluZGVyIFwKLQlsaWJ1aSBcCi0JbGliZ3VpCi0KLSMgdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgRERNUyBkZWJ1Z2dpbmcKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZHZtIGxpYmFuZHJvaWRfcnVudGltZQotCi1MT0NBTF9NT0RVTEU6PSBsaWJzdXJmYWNlZmxpbmdlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9CYXJyaWVyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9CYXJyaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODUwN2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQmFycmllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9CQVJSSUVSX0gKLSNkZWZpbmUgQU5EUk9JRF9CQVJSSUVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBCYXJyaWVyCi17Ci1wdWJsaWM6Ci0gICAgaW5saW5lIEJhcnJpZXIoKSA6IHN0YXRlKENMT1NFRCkgeyB9Ci0gICAgaW5saW5lIH5CYXJyaWVyKCkgeyB9Ci0gICAgdm9pZCBvcGVuKCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgICAgIHN0YXRlID0gT1BFTkVEOwotICAgICAgICBjdi5icm9hZGNhc3QoKTsKLSAgICB9Ci0gICAgdm9pZCBjbG9zZSgpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGxvY2spOwotICAgICAgICBzdGF0ZSA9IENMT1NFRDsKLSAgICB9Ci0gICAgdm9pZCB3YWl0KCkgY29uc3QgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7Ci0gICAgICAgIHdoaWxlIChzdGF0ZSA9PSBDTE9TRUQpIHsKLSAgICAgICAgICAgIGN2LndhaXQobG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci1wcml2YXRlOgotICAgIGVudW0geyBPUEVORUQsIENMT1NFRCB9OwotICAgIG11dGFibGUgICAgIE11dGV4ICAgICAgIGxvY2s7Ci0gICAgbXV0YWJsZSAgICAgQ29uZGl0aW9uICAgY3Y7Ci0gICAgdm9sYXRpbGUgICAgaW50ICAgICAgICAgc3RhdGU7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9CQVJSSUVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0RkbUNvbm5lY3Rpb24uY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGRtQ29ubmVjdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2N2E5MTUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGRtQ29ubmVjdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgotCi0jaW5jbHVkZSAiam5pLmgiCi0jaW5jbHVkZSAiRGRtQ29ubmVjdGlvbi5oIgotCi1leHRlcm4gIkMiIGppbnQgSmF2YV9jb21fYW5kcm9pZF9pbnRlcm5hbF91dGlsX1dpdGhGcmFtZXdvcmtfcmVnaXN0ZXJOYXRpdmVzKAotICAgICAgICBKTklFbnYqIGVudiwgamNsYXNzIGNsYXp6KTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi12b2lkIERkbUNvbm5lY3Rpb246OnN0YXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICBKYXZhVk0qIHZtOwotICAgIEpOSUVudiogZW52OwotCi0gICAgLy8gc3RhcnQgYSBWTQotICAgIEphdmFWTUluaXRBcmdzIGFyZ3M7Ci0gICAgSmF2YVZNT3B0aW9uIG9wdDsKLQotICAgIG9wdC5vcHRpb25TdHJpbmcgPQotICAgICAgICAiLWFnZW50bGliOmpkd3A9dHJhbnNwb3J0PWR0X2FuZHJvaWRfYWRiLHN1c3BlbmQ9bixzZXJ2ZXI9eSI7Ci0KLSAgICBhcmdzLnZlcnNpb24gPSBKTklfVkVSU0lPTl8xXzQ7Ci0gICAgYXJncy5vcHRpb25zID0gJm9wdDsKLSAgICBhcmdzLm5PcHRpb25zID0gMTsKLSAgICBhcmdzLmlnbm9yZVVucmVjb2duaXplZCA9IEpOSV9GQUxTRTsKLQotICAgIGlmIChKTklfQ3JlYXRlSmF2YVZNKCZ2bSwgJmVudiwgJmFyZ3MpID09IDApIHsKLSAgICAgICAgamNsYXNzIHN0YXJ0Q2xhc3M7Ci0gICAgICAgIGptZXRob2RJRCBzdGFydE1ldGg7Ci0KLSAgICAgICAgLy8gcmVnaXN0ZXIgbmF0aXZlIGNvZGUKLSAgICAgICAgaWYgKEphdmFfY29tX2FuZHJvaWRfaW50ZXJuYWxfdXRpbF9XaXRoRnJhbWV3b3JrX3JlZ2lzdGVyTmF0aXZlcyhlbnYsIDApID09IDApIHsKLSAgICAgICAgICAgIC8vIHNldCBvdXIgbmFtZSBieSBjYWxsaW5nIERkbUhhbmRsZUFwcE5hbWUuc2V0QXBwTmFtZSgpCi0gICAgICAgICAgICBzdGFydENsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZGRtL0RkbUhhbmRsZUFwcE5hbWUiKTsKLSAgICAgICAgICAgIGlmIChzdGFydENsYXNzKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRNZXRoID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChzdGFydENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgInNldEFwcE5hbWUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylWIik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0TWV0aCkgewotICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIHN0ciA9IGVudi0+TmV3U3RyaW5nVVRGKG5hbWUpOwotICAgICAgICAgICAgICAgICAgICBlbnYtPkNhbGxTdGF0aWNWb2lkTWV0aG9kKHN0YXJ0Q2xhc3MsIHN0YXJ0TWV0aCwgc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihzdHIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBERE1TIGNvbW11bmljYXRpb24gYnkgY2FsbGluZwotICAgICAgICAgICAgLy8gRGRtUmVnaXN0ZXIucmVnaXN0ZXJIYW5kbGVycygpCi0gICAgICAgICAgICBzdGFydENsYXNzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvZGRtL0RkbVJlZ2lzdGVyIik7Ci0gICAgICAgICAgICBpZiAoc3RhcnRDbGFzcykgewotICAgICAgICAgICAgICAgIHN0YXJ0TWV0aCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoc3RhcnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlckhhbmRsZXJzIiwgIigpViIpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydE1ldGgpIHsKLSAgICAgICAgICAgICAgICAgICAgZW52LT5DYWxsU3RhdGljVm9pZE1ldGhvZChzdGFydENsYXNzLCBzdGFydE1ldGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0RkbUNvbm5lY3Rpb24uaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0RkbUNvbm5lY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiNzM3Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EZG1Db25uZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NGX0RETV9DT05ORUNUSU9OCi0jZGVmaW5lIEFORFJPSURfU0ZfRERNX0NPTk5FQ1RJT04KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZG1Db25uZWN0aW9uIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgdm9pZCBzdGFydChjb25zdCBjaGFyKiBuYW1lKTsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBBTkRST0lEX1NGX0RETV9DT05ORUNUSU9OICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5RXZlbnRDb25uZWN0aW9uLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlFdmVudENvbm5lY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2VjYmQyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlFdmVudENvbm5lY3Rpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGd1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPGd1aS9CaXRUdWJlLmg+Ci0jaW5jbHVkZSA8Z3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0jaW5jbHVkZSAiRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oIgotI2luY2x1ZGUgIkV2ZW50VGhyZWFkLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1EaXNwbGF5RXZlbnRDb25uZWN0aW9uOjpEaXNwbGF5RXZlbnRDb25uZWN0aW9uKAotICAgICAgICBjb25zdCBzcDxFdmVudFRocmVhZD4mIGV2ZW50VGhyZWFkKQotICAgIDogbUV2ZW50VGhyZWFkKGV2ZW50VGhyZWFkKSwgbUNoYW5uZWwobmV3IEJpdFR1YmUoKSkKLXsKLX0KLQotRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6fkRpc3BsYXlFdmVudENvbm5lY3Rpb24oKSB7Ci0gICAgbUV2ZW50VGhyZWFkLT51bnJlZ2lzdGVyRGlzcGxheUV2ZW50Q29ubmVjdGlvbih0aGlzKTsKLX0KLQotdm9pZCBEaXNwbGF5RXZlbnRDb25uZWN0aW9uOjpvbkZpcnN0UmVmKCkgewotICAgIC8vIE5PVEU6IG1FdmVudFRocmVhZCBkb2Vzbid0IGhvbGQgYSBzdHJvbmcgcmVmZXJlbmNlIG9uIHVzCi0gICAgbUV2ZW50VGhyZWFkLT5yZWdpc3RlckRpc3BsYXlFdmVudENvbm5lY3Rpb24odGhpcyk7Ci19Ci0KLXNwPEJpdFR1YmU+IERpc3BsYXlFdmVudENvbm5lY3Rpb246OmdldERhdGFDaGFubmVsKCkgY29uc3QgewotICAgIHJldHVybiBtQ2hhbm5lbDsKLX0KLQotdm9pZCBEaXNwbGF5RXZlbnRDb25uZWN0aW9uOjpzZXRWc3luY1JhdGUodWludDMyX3QgY291bnQpIHsKLSAgICBtRXZlbnRUaHJlYWQtPnNldFZzeW5jUmF0ZShjb3VudCwgdGhpcyk7Ci19Ci0KLXZvaWQgRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6cmVxdWVzdE5leHRWc3luYygpIHsKLSAgICBtRXZlbnRUaHJlYWQtPnJlcXVlc3ROZXh0VnN5bmModGhpcyk7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlFdmVudENvbm5lY3Rpb246OnBvc3RFdmVudChjb25zdCBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RXZlbnQmIGV2ZW50KQotewotICAgIHNzaXplX3Qgc2l6ZSA9IG1DaGFubmVsLT53cml0ZSgmZXZlbnQsIHNpemVvZihEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RXZlbnQpKTsKLSAgICByZXR1cm4gc2l6ZSA8IDAgPyBzdGF0dXNfdChzaXplKSA6IHN0YXR1c190KE5PX0VSUk9SKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5RXZlbnRDb25uZWN0aW9uLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjM2VlMzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfRElTUExBWV9FVkVOVF9DT05ORUNUSU9OX0gKLSNkZWZpbmUgQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfRElTUExBWV9FVkVOVF9DT05ORUNUSU9OX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEJpdFR1YmU7Ci1jbGFzcyBFdmVudFRocmVhZDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIERpc3BsYXlFdmVudENvbm5lY3Rpb24gOiBwdWJsaWMgQm5EaXNwbGF5RXZlbnRDb25uZWN0aW9uIHsKLXB1YmxpYzoKLSAgICBEaXNwbGF5RXZlbnRDb25uZWN0aW9uKGNvbnN0IHNwPEV2ZW50VGhyZWFkPiYgZmxpbmdlcik7Ci0KLSAgICBzdGF0dXNfdCBwb3N0RXZlbnQoY29uc3QgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkV2ZW50JiBldmVudCk7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB+RGlzcGxheUV2ZW50Q29ubmVjdGlvbigpOwotICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7Ci0gICAgdmlydHVhbCBzcDxCaXRUdWJlPiBnZXREYXRhQ2hhbm5lbCgpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRWc3luY1JhdGUodWludDMyX3QgY291bnQpOwotICAgIHZpcnR1YWwgdm9pZCByZXF1ZXN0TmV4dFZzeW5jKCk7ICAgIC8vIGFzeW5jaHJvbm91cwotCi0gICAgc3A8RXZlbnRUaHJlYWQ+IGNvbnN0IG1FdmVudFRocmVhZDsKLSAgICBzcDxCaXRUdWJlPiBjb25zdCBtQ2hhbm5lbDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2VuZGlmIC8qIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0RJU1BMQVlfRVZFTlRfQ09OTkVDVElPTl9IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFhZTgwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLSNpbmNsdWRlIDx1aS9GcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdy5oPgotCi0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0KLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KLSNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKLSNpbmNsdWRlICJIV0NvbXBvc2VyLmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLQotc3RhdGljIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLXZvaWQgY2hlY2tHTEVycm9ycygpCi17Ci0gICAgZG8gewotICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBtb3JlIHRoYW4gb25lIGVycm9yIGZsYWcKLSAgICAgICAgR0xlbnVtIGVycm9yID0gZ2xHZXRFcnJvcigpOwotICAgICAgICBpZiAoZXJyb3IgPT0gR0xfTk9fRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgQUxPR0UoIkdMIGVycm9yIDB4JTA0eCIsIGludChlcnJvcikpOwotICAgIH0gd2hpbGUodHJ1ZSk7Ci19Ci0KLXN0YXRpYyBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCi12b2lkIGNoZWNrRUdMRXJyb3JzKGNvbnN0IGNoYXIqIHRva2VuKQotewotICAgIHN0cnVjdCBFR0xVdGlscyB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpzdHJlcnJvcihFR0xpbnQgZXJyKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGVycil7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfU1VDQ0VTUzogICAgICAgICAgIHJldHVybiAiRUdMX1NVQ0NFU1MiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogICByZXR1cm4gIkVHTF9OT1RfSU5JVElBTElaRUQiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9BQ0NFU1M6ICAgICAgICByZXR1cm4gIkVHTF9CQURfQUNDRVNTIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfQUxMT0M6ICAgICAgICAgcmV0dXJuICJFR0xfQkFEX0FMTE9DIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfQVRUUklCVVRFOiAgICAgcmV0dXJuICJFR0xfQkFEX0FUVFJJQlVURSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0NPTkZJRzogICAgICAgIHJldHVybiAiRUdMX0JBRF9DT05GSUciOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOiAgICAgICByZXR1cm4gIkVHTF9CQURfQ09OVEVYVCI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRTogcmV0dXJuICJFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX0RJU1BMQVk6ICAgICAgIHJldHVybiAiRUdMX0JBRF9ESVNQTEFZIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfTUFUQ0g6ICAgICAgICAgcmV0dXJuICJFR0xfQkFEX01BVENIIjsKLSAgICAgICAgICAgICAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogcmV0dXJuICJFR0xfQkFEX05BVElWRV9QSVhNQVAiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9OQVRJVkVfV0lORE9XOiByZXR1cm4gIkVHTF9CQURfTkFUSVZFX1dJTkRPVyI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQkFEX1BBUkFNRVRFUjogICAgIHJldHVybiAiRUdMX0JBRF9QQVJBTUVURVIiOwotICAgICAgICAgICAgICAgIGNhc2UgRUdMX0JBRF9TVVJGQUNFOiAgICAgICByZXR1cm4gIkVHTF9CQURfU1VSRkFDRSI7Ci0gICAgICAgICAgICAgICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiAgICAgIHJldHVybiAiRUdMX0NPTlRFWFRfTE9TVCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOwotICAgIGlmIChlcnJvciAmJiBlcnJvciAhPSBFR0xfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgiJXM6IEVHTCBlcnJvciAweCUwNHggKCVzKSIsCi0gICAgICAgICAgICAgICAgdG9rZW4sIGludChlcnJvciksIEVHTFV0aWxzOjpzdHJlcnJvcihlcnJvcikpOwotICAgIH0KLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGRpc3BsYXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZXMuCi0gKgotICovCi0KLURpc3BsYXlIYXJkd2FyZTo6RGlzcGxheUhhcmR3YXJlKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgIHVpbnQzMl90IGRweSkKLSAgICA6IERpc3BsYXlIYXJkd2FyZUJhc2UoZmxpbmdlciwgZHB5KSwKLSAgICAgIG1GbGluZ2VyKGZsaW5nZXIpLCBtRmxhZ3MoMCksIG1Id2MoMCkKLXsKLSAgICBpbml0KGRweSk7Ci19Ci0KLURpc3BsYXlIYXJkd2FyZTo6fkRpc3BsYXlIYXJkd2FyZSgpCi17Ci0gICAgZmluaSgpOwotfQotCi1mbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldERwaVgoKSBjb25zdCAgICAgICAgICB7IHJldHVybiBtRHBpWDsgfQotZmxvYXQgRGlzcGxheUhhcmR3YXJlOjpnZXREcGlZKCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gbURwaVk7IH0KLWZsb2F0IERpc3BsYXlIYXJkd2FyZTo6Z2V0RGVuc2l0eSgpIGNvbnN0ICAgICAgIHsgcmV0dXJuIG1EZW5zaXR5OyB9Ci1mbG9hdCBEaXNwbGF5SGFyZHdhcmU6OmdldFJlZnJlc2hSYXRlKCkgY29uc3QgICB7IHJldHVybiBtUmVmcmVzaFJhdGU7IH0KLWludCBEaXNwbGF5SGFyZHdhcmU6OmdldFdpZHRoKCkgY29uc3QgICAgICAgICAgIHsgcmV0dXJuIG1XaWR0aDsgfQotaW50IERpc3BsYXlIYXJkd2FyZTo6Z2V0SGVpZ2h0KCkgY29uc3QgICAgICAgICAgeyByZXR1cm4gbUhlaWdodDsgfQotUGl4ZWxGb3JtYXQgRGlzcGxheUhhcmR3YXJlOjpnZXRGb3JtYXQoKSBjb25zdCAgeyByZXR1cm4gbUZvcm1hdDsgfQotdWludDMyX3QgRGlzcGxheUhhcmR3YXJlOjpnZXRNYXhUZXh0dXJlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1NYXhUZXh0dXJlU2l6ZTsgfQotCi11aW50MzJfdCBEaXNwbGF5SGFyZHdhcmU6OmdldE1heFZpZXdwb3J0RGltcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1heFZpZXdwb3J0RGltc1swXSA8IG1NYXhWaWV3cG9ydERpbXNbMV0gPwotICAgICAgICAgICAgbU1heFZpZXdwb3J0RGltc1swXSA6IG1NYXhWaWV3cG9ydERpbXNbMV07Ci19Ci0KLXN0YXRpYyBzdGF0dXNfdCBzZWxlY3RDb25maWdGb3JQaXhlbEZvcm1hdCgKLSAgICAgICAgRUdMRGlzcGxheSBkcHksCi0gICAgICAgIEVHTGludCBjb25zdCogYXR0cnMsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgRUdMQ29uZmlnKiBvdXRDb25maWcpCi17Ci0gICAgRUdMQ29uZmlnIGNvbmZpZyA9IE5VTEw7Ci0gICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMSwgbj0wOwotICAgIGVnbEdldENvbmZpZ3MoZHB5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7Ci0gICAgRUdMQ29uZmlnKiBjb25zdCBjb25maWdzID0gbmV3IEVHTENvbmZpZ1tudW1Db25maWdzXTsKLSAgICBlZ2xDaG9vc2VDb25maWcoZHB5LCBhdHRycywgY29uZmlncywgbnVtQ29uZmlncywgJm4pOwotICAgIGZvciAoaW50IGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICBFR0xpbnQgbmF0aXZlVmlzdWFsSWQgPSAwOwotICAgICAgICBlZ2xHZXRDb25maWdBdHRyaWIoZHB5LCBjb25maWdzW2ldLCBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgJm5hdGl2ZVZpc3VhbElkKTsKLSAgICAgICAgaWYgKG5hdGl2ZVZpc3VhbElkPjAgJiYgZm9ybWF0ID09IG5hdGl2ZVZpc3VhbElkKSB7Ci0gICAgICAgICAgICAqb3V0Q29uZmlnID0gY29uZmlnc1tpXTsKLSAgICAgICAgICAgIGRlbGV0ZSBbXSBjb25maWdzOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIGRlbGV0ZSBbXSBjb25maWdzOwotICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKLX0KLQotCi12b2lkIERpc3BsYXlIYXJkd2FyZTo6aW5pdCh1aW50MzJfdCBkcHkpCi17Ci0gICAgbU5hdGl2ZVdpbmRvdyA9IG5ldyBGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdygpOwotICAgIGZyYW1lYnVmZmVyX2RldmljZV90IGNvbnN0ICogZmJEZXYgPSBtTmF0aXZlV2luZG93LT5nZXREZXZpY2UoKTsKLSAgICBpZiAoIWZiRGV2KSB7Ci0gICAgICAgIEFMT0dFKCJEaXNwbGF5IHN1YnN5c3RlbSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gY2hlY2sgbG9ncy4gZXhpdGluZy4uLiIpOwotICAgICAgICBleGl0KDApOwotICAgIH0KLQotICAgIGludCBmb3JtYXQ7Ci0gICAgQU5hdGl2ZVdpbmRvdyBjb25zdCAqIGNvbnN0IHdpbmRvdyA9IG1OYXRpdmVXaW5kb3cuZ2V0KCk7Ci0gICAgd2luZG93LT5xdWVyeSh3aW5kb3csIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KTsKLSAgICBtRHBpWCA9IG1OYXRpdmVXaW5kb3ctPnhkcGk7Ci0gICAgbURwaVkgPSBtTmF0aXZlV2luZG93LT55ZHBpOwotICAgIG1SZWZyZXNoUmF0ZSA9IGZiRGV2LT5mcHM7Ci0gICAgbU5leHRGYWtlVlN5bmMgPSAwOwotCi0KLS8qIEZJWE1FOiB0aGlzIGlzIGEgdGVtcG9yYXJ5IEhBQ0sgdW50aWwgd2UgYXJlIGFibGUgdG8gcmVwb3J0IHRoZSByZWZyZXNoIHJhdGUKLSAqIHByb3Blcmx5IGZyb20gdGhlIEhBTC4gVGhlIFdpbmRvd01hbmFnZXJTZXJ2aWNlIG5vdyByZWxpZXMgb24gdGhpcyB2YWx1ZS4KLSAqLwotI2lmbmRlZiBSRUZSRVNIX1JBVEUKLSAgICBtUmVmcmVzaFJhdGUgPSBmYkRldi0+ZnBzOwotI2Vsc2UKLSAgICBtUmVmcmVzaFJhdGUgPSBSRUZSRVNIX1JBVEU7Ci0jd2FybmluZyAicmVmcmVzaCByYXRlIHNldCB2aWEgbWFrZWZpbGUgdG8gUkVGUkVTSF9SQVRFIgotI2VuZGlmCi0KLSAgICBtUmVmcmVzaFBlcmlvZCA9IG5zZWNzX3QoMWU5IC8gbVJlZnJlc2hSYXRlKTsKLQotICAgIEVHTGludCB3LCBoLCBkdW1teTsKLSAgICBFR0xpbnQgbnVtQ29uZmlncz0wOwotICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKLSAgICBFR0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgRUdMQm9vbGVhbiByZXN1bHQ7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBFR0wKLSAgICBFR0xpbnQgYXR0cmlic1tdID0gewotICAgICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgRUdMX1dJTkRPV19CSVQsCi0gICAgICAgICAgICBFR0xfTk9ORSwgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgRUdMX05PTkUKLSAgICB9OwotCi0gICAgLy8gZGVidWc6IGRpc2FibGUgaC93IHJlbmRlcmluZwotICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJkZWJ1Zy5zZi5odyIsIHByb3BlcnR5LCBOVUxMKSA+IDApIHsKLSAgICAgICAgaWYgKGF0b2kocHJvcGVydHkpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJIL1cgY29tcG9zaXRpb24gZGlzYWJsZWQiKTsKLSAgICAgICAgICAgIGF0dHJpYnNbMl0gPSBFR0xfQ09ORklHX0NBVkVBVDsKLSAgICAgICAgICAgIGF0dHJpYnNbM10gPSBFR0xfU0xPV19DT05GSUc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBhbGwgdGhlIGV4dGVuc2lvbnMgYmVsb3cgc2hvdWxkIGJlIHF1ZXJpZWQgdGhyb3VnaAotICAgIC8vIGVnbEdldFByb2NBZGRyZXNzKCkuCi0KLSAgICBFR0xEaXNwbGF5IGRpc3BsYXkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOwotICAgIGVnbEluaXRpYWxpemUoZGlzcGxheSwgTlVMTCwgTlVMTCk7Ci0gICAgZWdsR2V0Q29uZmlncyhkaXNwbGF5LCBOVUxMLCAwLCAmbnVtQ29uZmlncyk7Ci0KLSAgICBFR0xDb25maWcgY29uZmlnID0gTlVMTDsKLSAgICBlcnIgPSBzZWxlY3RDb25maWdGb3JQaXhlbEZvcm1hdChkaXNwbGF5LCBhdHRyaWJzLCBmb3JtYXQsICZjb25maWcpOwotICAgIEFMT0dFX0lGKGVyciwgImNvdWxkbid0IGZpbmQgYW4gRUdMQ29uZmlnIG1hdGNoaW5nIHRoZSBzY3JlZW4gZm9ybWF0Iik7Ci0gICAgCi0gICAgRUdMaW50IHIsZyxiLGE7Ci0gICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX1JFRF9TSVpFLCAgICZyKTsKLSAgICBlZ2xHZXRDb25maWdBdHRyaWIoZGlzcGxheSwgY29uZmlnLCBFR0xfR1JFRU5fU0laRSwgJmcpOwotICAgIGVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIEVHTF9CTFVFX1NJWkUsICAmYik7Ci0gICAgZWdsR2V0Q29uZmlnQXR0cmliKGRpc3BsYXksIGNvbmZpZywgRUdMX0FMUEhBX1NJWkUsICZhKTsKLQotICAgIGlmIChtTmF0aXZlV2luZG93LT5pc1VwZGF0ZU9uRGVtYW5kKCkpIHsKLSAgICAgICAgbUZsYWdzIHw9IFBBUlRJQUxfVVBEQVRFUzsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGVnbEdldENvbmZpZ0F0dHJpYihkaXNwbGF5LCBjb25maWcsIEVHTF9DT05GSUdfQ0FWRUFULCAmZHVtbXkpID09IEVHTF9UUlVFKSB7Ci0gICAgICAgIGlmIChkdW1teSA9PSBFR0xfU0xPV19DT05GSUcpCi0gICAgICAgICAgICBtRmxhZ3MgfD0gU0xPV19DT05GSUc7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgb3VyIG1haW4gc3VyZmFjZQotICAgICAqLwotCi0gICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZGlzcGxheSwgY29uZmlnLCBtTmF0aXZlV2luZG93LmdldCgpLCBOVUxMKTsKLSAgICBlZ2xRdWVyeVN1cmZhY2UoZGlzcGxheSwgc3VyZmFjZSwgRUdMX1dJRFRILCAgJm1XaWR0aCk7Ci0gICAgZWdsUXVlcnlTdXJmYWNlKGRpc3BsYXksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZtSGVpZ2h0KTsKLQotICAgIGlmIChtRmxhZ3MgJiBQQVJUSUFMX1VQREFURVMpIHsKLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBwYXJ0aWFsIHVwZGF0ZXMsIHdlIGRlZmluaXRlbHkgZG9uJ3QgbmVlZCB0bwotICAgICAgICAvLyBwcmVzZXJ2ZSB0aGUgYmFja2J1ZmZlciwgd2hpY2ggbWF5IGJlIGNvc3RseS4KLSAgICAgICAgZWdsU3VyZmFjZUF0dHJpYihkaXNwbGF5LCBzdXJmYWNlLAotICAgICAgICAgICAgICAgIEVHTF9TV0FQX0JFSEFWSU9SLCBFR0xfQlVGRkVSX0RFU1RST1lFRCk7Ci0gICAgfQotCi0gICAgaWYgKGVnbFF1ZXJ5U3VyZmFjZShkaXNwbGF5LCBzdXJmYWNlLCBFR0xfU1dBUF9CRUhBVklPUiwgJmR1bW15KSA9PSBFR0xfVFJVRSkgewotICAgICAgICBpZiAoZHVtbXkgPT0gRUdMX0JVRkZFUl9QUkVTRVJWRUQpIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBCVUZGRVJfUFJFU0VSVkVEOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qIFJlYWQgZGVuc2l0eSBmcm9tIGJ1aWxkLXNwZWNpZmljIHJvLnNmLmxjZF9kZW5zaXR5IHByb3BlcnR5Ci0gICAgICogZXhjZXB0IGlmIGl0IGlzIG92ZXJyaWRkZW4gYnkgcWVtdS5zZi5sY2RfZGVuc2l0eS4KLSAgICAgKi8KLSAgICBpZiAocHJvcGVydHlfZ2V0KCJxZW11LnNmLmxjZF9kZW5zaXR5IiwgcHJvcGVydHksIE5VTEwpIDw9IDApIHsKLSAgICAgICAgaWYgKHByb3BlcnR5X2dldCgicm8uc2YubGNkX2RlbnNpdHkiLCBwcm9wZXJ0eSwgTlVMTCkgPD0gMCkgewotICAgICAgICAgICAgQUxPR1coInJvLnNmLmxjZF9kZW5zaXR5IG5vdCBkZWZpbmVkLCB1c2luZyAxNjAgZHBpIGJ5IGRlZmF1bHQuIik7Ci0gICAgICAgICAgICBzdHJjcHkocHJvcGVydHksICIxNjAiKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGZvciB0aGUgZW11bGF0b3IgY2FzZSwgcmVzZXQgdGhlIGRwaSB2YWx1ZXMgdG9vICovCi0gICAgICAgIG1EcGlYID0gbURwaVkgPSBhdG9pKHByb3BlcnR5KTsKLSAgICB9Ci0gICAgbURlbnNpdHkgPSBhdG9pKHByb3BlcnR5KSAqICgxLjBmLzE2MC4wZik7Ci0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIG91ciBPcGVuR0wgRVMgY29udGV4dAotICAgICAqLwotICAgIAotCi0gICAgRUdMaW50IGNvbnRleHRBdHRyaWJ1dGVzW10gPSB7Ci0jaWZkZWYgRUdMX0lNR19jb250ZXh0X3ByaW9yaXR5Ci0jaWZkZWYgSEFTX0NPTlRFWFRfUFJJT1JJVFkKLSN3YXJuaW5nICJ1c2luZyBFR0xfSU1HX2NvbnRleHRfcHJpb3JpdHkiCi0gICAgICAgIEVHTF9DT05URVhUX1BSSU9SSVRZX0xFVkVMX0lNRywgRUdMX0NPTlRFWFRfUFJJT1JJVFlfSElHSF9JTUcsCi0jZW5kaWYKLSNlbmRpZgotICAgICAgICBFR0xfTk9ORSwgRUdMX05PTkUKLSAgICB9OwotICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRpc3BsYXksIGNvbmZpZywgTlVMTCwgY29udGV4dEF0dHJpYnV0ZXMpOwotCi0gICAgbURpc3BsYXkgPSBkaXNwbGF5OwotICAgIG1Db25maWcgID0gY29uZmlnOwotICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKLSAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgbUZvcm1hdCAgPSBmYkRldi0+Zm9ybWF0OwotICAgIG1QYWdlRmxpcENvdW50ID0gMDsKLQotICAgIC8qCi0gICAgICogR2F0aGVyIE9wZW5HTCBFUyBleHRlbnNpb25zCi0gICAgICovCi0KLSAgICByZXN1bHQgPSBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsKLSAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICBBTE9HRSgiQ291bGRuJ3QgY3JlYXRlIGEgd29ya2luZyBHTEVTIGNvbnRleHQuIGNoZWNrIGxvZ3MuIGV4aXRpbmcuLi4iKTsKLSAgICAgICAgZXhpdCgwKTsKLSAgICB9Ci0KLSAgICBHTEV4dGVuc2lvbnMmIGV4dGVuc2lvbnMoR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpKTsKLSAgICBleHRlbnNpb25zLmluaXRXaXRoR0xTdHJpbmdzKAotICAgICAgICAgICAgZ2xHZXRTdHJpbmcoR0xfVkVORE9SKSwKLSAgICAgICAgICAgIGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKSwKLSAgICAgICAgICAgIGdsR2V0U3RyaW5nKEdMX1ZFUlNJT04pLAotICAgICAgICAgICAgZ2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUyksCi0gICAgICAgICAgICBlZ2xRdWVyeVN0cmluZyhkaXNwbGF5LCBFR0xfVkVORE9SKSwKLSAgICAgICAgICAgIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9WRVJTSU9OKSwKLSAgICAgICAgICAgIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9FWFRFTlNJT05TKSk7Ci0KLSAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1NJWkUsICZtTWF4VGV4dHVyZVNpemUpOwotICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZJRVdQT1JUX0RJTVMsIG1NYXhWaWV3cG9ydERpbXMpOwotCi0gICAgQUxPR0koIkVHTCBpbmZvcm1hdGlvbnM6Iik7Ci0gICAgQUxPR0koIiMgb2YgY29uZmlncyA6ICVkIiwgbnVtQ29uZmlncyk7Ci0gICAgQUxPR0koInZlbmRvciAgICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRFZ2xWZW5kb3IoKSk7Ci0gICAgQUxPR0koInZlcnNpb24gICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRFZ2xWZXJzaW9uKCkpOwotICAgIEFMT0dJKCJleHRlbnNpb25zOiAlcyIsIGV4dGVuc2lvbnMuZ2V0RWdsRXh0ZW5zaW9uKCkpOwotICAgIEFMT0dJKCJDbGllbnQgQVBJOiAlcyIsIGVnbFF1ZXJ5U3RyaW5nKGRpc3BsYXksIEVHTF9DTElFTlRfQVBJUyk/OiJOb3QgU3VwcG9ydGVkIik7Ci0gICAgQUxPR0koIkVHTFN1cmZhY2U6ICVkLSVkLSVkLSVkLCBjb25maWc9JXAiLCByLCBnLCBiLCBhLCBjb25maWcpOwotCi0gICAgQUxPR0koIk9wZW5HTCBpbmZvcm1hdGlvbnM6Iik7Ci0gICAgQUxPR0koInZlbmRvciAgICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRWZW5kb3IoKSk7Ci0gICAgQUxPR0koInJlbmRlcmVyICA6ICVzIiwgZXh0ZW5zaW9ucy5nZXRSZW5kZXJlcigpKTsKLSAgICBBTE9HSSgidmVyc2lvbiAgIDogJXMiLCBleHRlbnNpb25zLmdldFZlcnNpb24oKSk7Ci0gICAgQUxPR0koImV4dGVuc2lvbnM6ICVzIiwgZXh0ZW5zaW9ucy5nZXRFeHRlbnNpb24oKSk7Ci0gICAgQUxPR0koIkdMX01BWF9URVhUVVJFX1NJWkUgPSAlZCIsIG1NYXhUZXh0dXJlU2l6ZSk7Ci0gICAgQUxPR0koIkdMX01BWF9WSUVXUE9SVF9ESU1TID0gJWQgeCAlZCIsIG1NYXhWaWV3cG9ydERpbXNbMF0sIG1NYXhWaWV3cG9ydERpbXNbMV0pOwotICAgIEFMT0dJKCJmbGFncyA9ICUwOHgiLCBtRmxhZ3MpOwotCi0gICAgLy8gVW5iaW5kIHRoZSBjb250ZXh0IGZyb20gdGhpcyB0aHJlYWQKLSAgICBlZ2xNYWtlQ3VycmVudChkaXNwbGF5LCBFR0xfTk9fU1VSRkFDRSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUKTsKLQotCi0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgSC9XIGNvbXBvc2VyCi0gICAgbUh3YyA9IG5ldyBIV0NvbXBvc2VyKG1GbGluZ2VyKTsKLSAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUh3Yy0+c2V0RnJhbWVCdWZmZXIobURpc3BsYXksIG1TdXJmYWNlKTsKLSAgICB9Ci19Ci0KLUhXQ29tcG9zZXImIERpc3BsYXlIYXJkd2FyZTo6Z2V0SHdDb21wb3NlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gKm1Id2M7Ci19Ci0KLS8qCi0gKiBDbGVhbiB1cC4gIFRocm93IG91dCBvdXIgbG9jYWwgc3RhdGUuCi0gKgotICogKEl0J3MgZW50aXJlbHkgcG9zc2libGUgd2UnbGwgbmV2ZXIgZ2V0IGhlcmUsIHNpbmNlIHRoaXMgaXMgbWVhbnQKLSAqIGZvciByZWFsIGhhcmR3YXJlLCB3aGljaCBkb2Vzbid0IHJlc3RhcnQuKQotICovCi0KLXZvaWQgRGlzcGxheUhhcmR3YXJlOjpmaW5pKCkKLXsKLSAgICBlZ2xNYWtlQ3VycmVudChtRGlzcGxheSwgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19TVVJGQUNFLCBFR0xfTk9fQ09OVEVYVCk7Ci0gICAgZWdsVGVybWluYXRlKG1EaXNwbGF5KTsKLX0KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmU6OnJlbGVhc2VTY3JlZW4oKSBjb25zdAotewotICAgIERpc3BsYXlIYXJkd2FyZUJhc2U6OnJlbGVhc2VTY3JlZW4oKTsKLSAgICBpZiAobUh3Yy0+aW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbUh3Yy0+cmVsZWFzZSgpOwotICAgIH0KLX0KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmU6OmFjcXVpcmVTY3JlZW4oKSBjb25zdAotewotICAgIERpc3BsYXlIYXJkd2FyZUJhc2U6OmFjcXVpcmVTY3JlZW4oKTsKLX0KLQotdWludDMyX3QgRGlzcGxheUhhcmR3YXJlOjpnZXRQYWdlRmxpcENvdW50KCkgY29uc3QgewotICAgIHJldHVybiBtUGFnZUZsaXBDb3VudDsKLX0KLQotLy8gdGhpcyBuZWVkcyB0byBiZSB0aHJlYWQgc2FmZQotbnNlY3NfdCBEaXNwbGF5SGFyZHdhcmU6OndhaXRGb3JSZWZyZXNoKCkgY29uc3QgewotICAgIG5zZWNzX3QgdGltZXN0YW1wOwotICAgIGlmIChtVlN5bmMud2FpdCgmdGltZXN0YW1wKSA8IDApIHsKLSAgICAgICAgLy8gdnN5bmMgbm90IHN1cHBvcnRlZCEKLSAgICAgICAgdXNsZWVwKCBnZXREZWxheVRvTmV4dFZTeW5jVXMoJnRpbWVzdGFtcCkgKTsKLSAgICB9Ci0gICAgbUxhc3RId1ZTeW5jID0gdGltZXN0YW1wOyAvLyBGSVhNRTogTm90IHRocmVhZCBzYWZlCi0gICAgcmV0dXJuIHRpbWVzdGFtcDsKLX0KLQotbnNlY3NfdCBEaXNwbGF5SGFyZHdhcmU6OmdldFJlZnJlc2hUaW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgLy8gdGhpcyByZXR1cm5zIHRoZSBsYXN0IHJlZnJlc2ggdGltZXN0YW1wLgotICAgIC8vIGlmIHRoZSBsYXN0IG9uZSBpcyBub3QgYXZhaWxhYmxlLCB3ZSBlc3RpbWF0ZSBpdCBiYXNlZCBvbgotICAgIC8vIHRoZSByZWZyZXNoIHBlcmlvZCBhbmQgd2hhdGV2ZXIgY2xvc2VzdCB0aW1lc3RhbXAgd2UgaGF2ZS4KLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICByZXR1cm4gbm93IC0gKChub3cgLSBtTGFzdEh3VlN5bmMpICUgIG1SZWZyZXNoUGVyaW9kKTsKLX0KLQotbnNlY3NfdCBEaXNwbGF5SGFyZHdhcmU6OmdldFJlZnJlc2hQZXJpb2QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SZWZyZXNoUGVyaW9kOwotfQotCi1pbnQzMl90IERpc3BsYXlIYXJkd2FyZTo6Z2V0RGVsYXlUb05leHRWU3luY1VzKG5zZWNzX3QqIHRpbWVzdGFtcCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtRmFrZVZTeW5jTXV0ZXgpOwotICAgIGNvbnN0IG5zZWNzX3QgcGVyaW9kID0gbVJlZnJlc2hQZXJpb2Q7Ci0gICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQyk7Ci0gICAgbnNlY3NfdCBuZXh0X3ZzeW5jID0gbU5leHRGYWtlVlN5bmM7Ci0gICAgbnNlY3NfdCBzbGVlcCA9IG5leHRfdnN5bmMgLSBub3c7Ci0gICAgaWYgKHNsZWVwIDwgMCkgewotICAgICAgICAvLyB3ZSBtaXNzZWQsIGZpbmQgd2hlcmUgdGhlIG5leHQgdnN5bmMgc2hvdWxkIGJlCi0gICAgICAgIHNsZWVwID0gKHBlcmlvZCAtICgobm93IC0gbmV4dF92c3luYykgJSBwZXJpb2QpKTsKLSAgICAgICAgbmV4dF92c3luYyA9IG5vdyArIHNsZWVwOwotICAgIH0KLSAgICBtTmV4dEZha2VWU3luYyA9IG5leHRfdnN5bmMgKyBwZXJpb2Q7Ci0gICAgdGltZXN0YW1wWzBdID0gbmV4dF92c3luYzsKLQotICAgIC8vIHJvdW5kIHRvIG5leHQgbWljcm9zZWNvbmQKLSAgICBpbnQzMl90IHNsZWVwX3VzID0gKHNsZWVwICsgOTk5TEwpIC8gMTAwMExMOwotCi0gICAgLy8gZ3VhcmFudGVlZCB0byBiZSA+IDAKLSAgICByZXR1cm4gc2xlZXBfdXM7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlIYXJkd2FyZTo6Y29tcG9zaXRpb25Db21wbGV0ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5hdGl2ZVdpbmRvdy0+Y29tcG9zaXRpb25Db21wbGV0ZSgpOwotfQotCi12b2lkIERpc3BsYXlIYXJkd2FyZTo6ZmxpcChjb25zdCBSZWdpb24mIGRpcnR5KSBjb25zdAotewotICAgIGNoZWNrR0xFcnJvcnMoKTsKLQotICAgIEVHTERpc3BsYXkgZHB5ID0gbURpc3BsYXk7Ci0gICAgRUdMU3VyZmFjZSBzdXJmYWNlID0gbVN1cmZhY2U7Ci0KLSNpZmRlZiBFR0xfQU5EUk9JRF9zd2FwX3JlY3RhbmdsZSAgICAKLSAgICBpZiAobUZsYWdzICYgU1dBUF9SRUNUQU5HTEUpIHsKLSAgICAgICAgY29uc3QgUmVnaW9uIG5ld0RpcnR5KGRpcnR5LmludGVyc2VjdChib3VuZHMoKSkpOwotICAgICAgICBjb25zdCBSZWN0IGIobmV3RGlydHkuZ2V0Qm91bmRzKCkpOwotICAgICAgICBlZ2xTZXRTd2FwUmVjdGFuZ2xlQU5EUk9JRChkcHksIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgYi5sZWZ0LCBiLnRvcCwgYi53aWR0aCgpLCBiLmhlaWdodCgpKTsKLSAgICB9IAotI2VuZGlmCi0gICAgCi0gICAgaWYgKG1GbGFncyAmIFBBUlRJQUxfVVBEQVRFUykgewotICAgICAgICBtTmF0aXZlV2luZG93LT5zZXRVcGRhdGVSZWN0YW5nbGUoZGlydHkuZ2V0Qm91bmRzKCkpOwotICAgIH0KLSAgICAKLSAgICBtUGFnZUZsaXBDb3VudCsrOwotCi0gICAgaWYgKG1Id2MtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1Id2MtPmNvbW1pdCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7Ci0gICAgfQotICAgIGNoZWNrRUdMRXJyb3JzKCJlZ2xTd2FwQnVmZmVycyIpOwotCi0gICAgLy8gZm9yIGRlYnVnZ2luZwotICAgIC8vZ2xDbGVhckNvbG9yKDEsMCwwLDApOwotICAgIC8vZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLX0KLQotdWludDMyX3QgRGlzcGxheUhhcmR3YXJlOjpnZXRGbGFncygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1GbGFnczsKLX0KLQotdm9pZCBEaXNwbGF5SGFyZHdhcmU6Om1ha2VDdXJyZW50KCkgY29uc3QKLXsKLSAgICBlZ2xNYWtlQ3VycmVudChtRGlzcGxheSwgbVN1cmZhY2UsIG1TdXJmYWNlLCBtQ29udGV4dCk7Ci19Ci0KLXZvaWQgRGlzcGxheUhhcmR3YXJlOjpkdW1wKFN0cmluZzgmIHJlcykgY29uc3QKLXsKLSAgICBtTmF0aXZlV2luZG93LT5kdW1wKHJlcyk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODI4YjMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfRElTUExBWV9IQVJEV0FSRV9ICi0jZGVmaW5lIEFORFJPSURfRElTUExBWV9IQVJEV0FSRV9ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8dWkvUmVnaW9uLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0KLSNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKLQotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmgiCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEZyYW1lYnVmZmVyTmF0aXZlV2luZG93OwotY2xhc3MgSFdDb21wb3NlcjsKLQotY2xhc3MgRGlzcGxheUhhcmR3YXJlIDogcHVibGljIERpc3BsYXlIYXJkd2FyZUJhc2UKLXsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgQ09QWV9CSVRTX0VYVEVOU0lPTiAgICAgICAgID0gMHgwMDAwMDAwOCwKLSAgICAgICAgQlVGRkVSX1BSRVNFUlZFRCAgICAgICAgICAgID0gMHgwMDAxMDAwMCwKLSAgICAgICAgUEFSVElBTF9VUERBVEVTICAgICAgICAgICAgID0gMHgwMDAyMDAwMCwgICAvLyB2aWRlbyBkcml2ZXIgZmVhdHVyZQotICAgICAgICBTTE9XX0NPTkZJRyAgICAgICAgICAgICAgICAgPSAweDAwMDQwMDAwLCAgIC8vIHNvZnR3YXJlCi0gICAgICAgIFNXQVBfUkVDVEFOR0xFICAgICAgICAgICAgICA9IDB4MDAwODAwMDAsCi0gICAgfTsKLQotICAgIERpc3BsYXlIYXJkd2FyZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKLSAgICAgICAgICAgIHVpbnQzMl90IGRpc3BsYXlJbmRleCk7Ci0KLSAgICB+RGlzcGxheUhhcmR3YXJlKCk7Ci0KLSAgICB2b2lkIHJlbGVhc2VTY3JlZW4oKSBjb25zdDsKLSAgICB2b2lkIGFjcXVpcmVTY3JlZW4oKSBjb25zdDsKLQotICAgIC8vIEZsaXAgdGhlIGZyb250IGFuZCBiYWNrIGJ1ZmZlcnMgaWYgdGhlIGJhY2sgYnVmZmVyIGlzICJkaXJ0eSIuICBNaWdodAotICAgIC8vIGJlIGluc3RhbnRhbmVvdXMsIG1pZ2h0IGludm9sdmUgY29weWluZyB0aGUgZnJhbWUgYnVmZmVyIGFyb3VuZC4KLSAgICB2b2lkIGZsaXAoY29uc3QgUmVnaW9uJiBkaXJ0eSkgY29uc3Q7Ci0KLSAgICBmbG9hdCAgICAgICBnZXREcGlYKCkgY29uc3Q7Ci0gICAgZmxvYXQgICAgICAgZ2V0RHBpWSgpIGNvbnN0OwotICAgIGZsb2F0ICAgICAgIGdldFJlZnJlc2hSYXRlKCkgY29uc3Q7Ci0gICAgZmxvYXQgICAgICAgZ2V0RGVuc2l0eSgpIGNvbnN0OwotICAgIGludCAgICAgICAgIGdldFdpZHRoKCkgY29uc3Q7Ci0gICAgaW50ICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7Ci0gICAgUGl4ZWxGb3JtYXQgZ2V0Rm9ybWF0KCkgY29uc3Q7Ci0gICAgdWludDMyX3QgICAgZ2V0RmxhZ3MoKSBjb25zdDsKLSAgICB2b2lkICAgICAgICBtYWtlQ3VycmVudCgpIGNvbnN0OwotICAgIHVpbnQzMl90ICAgIGdldE1heFRleHR1cmVTaXplKCkgY29uc3Q7Ci0gICAgdWludDMyX3QgICAgZ2V0TWF4Vmlld3BvcnREaW1zKCkgY29uc3Q7Ci0KLSAgICAvLyB3YWl0cyBmb3IgdGhlIG5leHQgdnN5bmMgYW5kIHJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiB3aGVuIGl0IGhhcHBlbmVkCi0gICAgbnNlY3NfdCAgICAgd2FpdEZvclJlZnJlc2goKSBjb25zdDsKLSAgICBuc2Vjc190ICAgICBnZXRSZWZyZXNoUGVyaW9kKCkgY29uc3Q7Ci0gICAgbnNlY3NfdCAgICAgZ2V0UmVmcmVzaFRpbWVzdGFtcCgpIGNvbnN0OwotCi0gICAgdWludDMyX3QgZ2V0UGFnZUZsaXBDb3VudCgpIGNvbnN0OwotICAgIEVHTERpc3BsYXkgZ2V0RUdMRGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1EaXNwbGF5OyB9Ci0KLSAgICB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzKSBjb25zdDsKLQotICAgIC8vIEhhcmR3YXJlIENvbXBvc2VyCi0gICAgSFdDb21wb3NlciYgZ2V0SHdDb21wb3NlcigpIGNvbnN0OwotICAgIAotICAgIHN0YXR1c190IGNvbXBvc2l0aW9uQ29tcGxldGUoKSBjb25zdDsKLSAgICAKLSAgICBSZWN0IGdldEJvdW5kcygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFJlY3QobVdpZHRoLCBtSGVpZ2h0KTsKLSAgICB9Ci0gICAgaW5saW5lIFJlY3QgYm91bmRzKCkgY29uc3QgeyByZXR1cm4gZ2V0Qm91bmRzKCk7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIGluaXQodWludDMyX3QgZGlzcGxheUluZGV4KSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpOwotICAgIHZvaWQgZmluaSgpIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSk7Ci0gICAgaW50MzJfdCBnZXREZWxheVRvTmV4dFZTeW5jVXMobnNlY3NfdCogdGltZXN0YW1wKSBjb25zdDsKLQotICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLSAgICBFR0xEaXNwbGF5ICAgICAgbURpc3BsYXk7Ci0gICAgRUdMU3VyZmFjZSAgICAgIG1TdXJmYWNlOwotICAgIEVHTENvbnRleHQgICAgICBtQ29udGV4dDsKLSAgICBFR0xDb25maWcgICAgICAgbUNvbmZpZzsKLSAgICBmbG9hdCAgICAgICAgICAgbURwaVg7Ci0gICAgZmxvYXQgICAgICAgICAgIG1EcGlZOwotICAgIGZsb2F0ICAgICAgICAgICBtUmVmcmVzaFJhdGU7Ci0gICAgZmxvYXQgICAgICAgICAgIG1EZW5zaXR5OwotICAgIGludCAgICAgICAgICAgICBtV2lkdGg7Ci0gICAgaW50ICAgICAgICAgICAgIG1IZWlnaHQ7Ci0gICAgUGl4ZWxGb3JtYXQgICAgIG1Gb3JtYXQ7Ci0gICAgdWludDMyX3QgICAgICAgIG1GbGFnczsKLSAgICBtdXRhYmxlIHVpbnQzMl90IG1QYWdlRmxpcENvdW50OwotICAgIEdMaW50ICAgICAgICAgICBtTWF4Vmlld3BvcnREaW1zWzJdOwotICAgIEdMaW50ICAgICAgICAgICBtTWF4VGV4dHVyZVNpemU7Ci0gICAgVlN5bmNCYXJyaWVyICAgIG1WU3luYzsKLQotICAgIG11dGFibGUgTXV0ZXggICBtRmFrZVZTeW5jTXV0ZXg7Ci0gICAgbXV0YWJsZSBuc2Vjc190IG1OZXh0RmFrZVZTeW5jOwotICAgIG5zZWNzX3QgICAgICAgICBtUmVmcmVzaFBlcmlvZDsKLSAgICBtdXRhYmxlIG5zZWNzX3QgbUxhc3RId1ZTeW5jOwotCi0gICAgSFdDb21wb3NlciogICAgIG1Id2M7Ci0KLSAgICBzcDxGcmFtZWJ1ZmZlck5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0RJU1BMQVlfSEFSRFdBUkVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZUJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWYxYWNhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGtTbGVlcEZpbGVOYW1lID0gIi9zeXMvcG93ZXIvd2FpdF9mb3JfZmJfc2xlZXAiOwotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBrV2FrZUZpbGVOYW1lICA9ICIvc3lzL3Bvd2VyL3dhaXRfZm9yX2ZiX3dha2UiOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6RGlzcGxheUV2ZW50VGhyZWFkKAotICAgICAgICBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpCi0gICAgOiBUaHJlYWQoZmFsc2UpLCBtRmxpbmdlcihmbGluZ2VyKSB7Ci19Ci0KLURpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6fkRpc3BsYXlFdmVudFRocmVhZCgpIHsKLX0KLQotc3RhdHVzX3QgRGlzcGxheUhhcmR3YXJlQmFzZTo6RGlzcGxheUV2ZW50VGhyZWFkOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuICgoYWNjZXNzKGtTbGVlcEZpbGVOYW1lLCBSX09LKSA9PSAwICYmCi0gICAgICAgICAgICBhY2Nlc3Moa1dha2VGaWxlTmFtZSwgUl9PSykgPT0gMCkpID8gTk9fRVJST1IgOiBOT19JTklUOwotfQotCi1ib29sIERpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6dGhyZWFkTG9vcCgpIHsKLQotICAgIGlmICh3YWl0Rm9yRmJTbGVlcCgpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBmbGluZ2VyID0gbUZsaW5nZXIucHJvbW90ZSgpOwotICAgICAgICBBTE9HRCgiQWJvdXQgdG8gZ2l2ZS11cCBzY3JlZW4sIGZsaW5nZXIgPSAlcCIsIGZsaW5nZXIuZ2V0KCkpOwotICAgICAgICBpZiAoZmxpbmdlciAhPSAwKSB7Ci0gICAgICAgICAgICBtQmFycmllci5jbG9zZSgpOwotICAgICAgICAgICAgZmxpbmdlci0+c2NyZWVuUmVsZWFzZWQoMCk7Ci0gICAgICAgICAgICBtQmFycmllci53YWl0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdhaXRGb3JGYldha2UoKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3A8U3VyZmFjZUZsaW5nZXI+IGZsaW5nZXIgPSBtRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBBTE9HRCgiU2NyZWVuIGFib3V0IHRvIHJldHVybiwgZmxpbmdlciA9ICVwIiwgZmxpbmdlci5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoZmxpbmdlciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmxpbmdlci0+c2NyZWVuQWNxdWlyZWQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVycm9yLCBleGl0IHRoZSB0aHJlYWQKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6d2FpdEZvckZiU2xlZXAoKSB7Ci0gICAgaW50IGVyciA9IDA7Ci0gICAgY2hhciBidWY7Ci0gICAgaW50IGZkID0gb3BlbihrU2xlZXBGaWxlTmFtZSwgT19SRE9OTFksIDApOwotICAgIC8vIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRoZSBlcnJvciB3aWxsIGJlIGNhdWdodCBpbiByZWFkKCkgYmVsb3cKLSAgICBkbyB7Ci0gICAgICAgIGVyciA9IHJlYWQoZmQsICZidWYsIDEpOwotICAgIH0gd2hpbGUgKGVyciA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotICAgIGNsb3NlKGZkKTsKLSAgICBBTE9HRV9JRihlcnI8MCwgIioqKiBBTkRST0lEX1dBSVRfRk9SX0ZCX1NMRUVQIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gZXJyIDwgMCA/IC1lcnJubyA6IGludChOT19FUlJPUik7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6d2FpdEZvckZiV2FrZSgpIHsKLSAgICBpbnQgZXJyID0gMDsKLSAgICBjaGFyIGJ1ZjsKLSAgICBpbnQgZmQgPSBvcGVuKGtXYWtlRmlsZU5hbWUsIE9fUkRPTkxZLCAwKTsKLSAgICAvLyBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCB0aGUgZXJyb3Igd2lsbCBiZSBjYXVnaHQgaW4gcmVhZCgpIGJlbG93Ci0gICAgZG8gewotICAgICAgICBlcnIgPSByZWFkKGZkLCAmYnVmLCAxKTsKLSAgICB9IHdoaWxlIChlcnIgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgQUxPR0VfSUYoZXJyPDAsICIqKiogQU5EUk9JRF9XQUlUX0ZPUl9GQl9XQUtFIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gZXJyIDwgMCA/IC1lcnJubyA6IGludChOT19FUlJPUik7Ci19Ci0KLXN0YXR1c190IERpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlFdmVudFRocmVhZDo6cmVsZWFzZVNjcmVlbigpIGNvbnN0IHsKLSAgICBtQmFycmllci5vcGVuKCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURpc3BsYXlIYXJkd2FyZUJhc2U6OkRpc3BsYXlIYXJkd2FyZUJhc2UoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAotICAgICAgICB1aW50MzJfdCBkaXNwbGF5SW5kZXgpIAotICAgIDogbVNjcmVlbkFjcXVpcmVkKHRydWUpCi17Ci0gICAgbURpc3BsYXlFdmVudFRocmVhZCA9IG5ldyBEaXNwbGF5RXZlbnRUaHJlYWQoZmxpbmdlcik7Ci19Ci0KLXZvaWQgRGlzcGxheUhhcmR3YXJlQmFzZTo6c3RhcnRTbGVlcE1hbmFnZW1lbnQoKSBjb25zdCB7Ci0gICAgaWYgKG1EaXNwbGF5RXZlbnRUaHJlYWQtPmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1EaXNwbGF5RXZlbnRUaHJlYWQtPnJ1bigiRGlzcGxheUV2ZW50VGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCIvc3lzL3Bvd2VyL3dhaXRfZm9yX2ZiX3t3YWtlfHNsZWVwfSBkb24ndCBleGlzdCIpOwotICAgIH0KLX0KLQotRGlzcGxheUhhcmR3YXJlQmFzZTo6fkRpc3BsYXlIYXJkd2FyZUJhc2UoKSB7Ci0gICAgLy8gcmVxdWVzdCBleGl0Ci0gICAgbURpc3BsYXlFdmVudFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7Ci19Ci0KLWJvb2wgRGlzcGxheUhhcmR3YXJlQmFzZTo6Y2FuRHJhdygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNjcmVlbkFjcXVpcmVkOwotfQotCi12b2lkIERpc3BsYXlIYXJkd2FyZUJhc2U6OnJlbGVhc2VTY3JlZW4oKSBjb25zdCB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbURpc3BsYXlFdmVudFRocmVhZC0+cmVsZWFzZVNjcmVlbigpOwotICAgIGlmIChlcnIgPj0gMCkgewotICAgICAgICBtU2NyZWVuQWNxdWlyZWQgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgRGlzcGxheUhhcmR3YXJlQmFzZTo6YWNxdWlyZVNjcmVlbigpIGNvbnN0IHsKLSAgICBtU2NyZWVuQWNxdWlyZWQgPSB0cnVlOwotfQotCi1ib29sIERpc3BsYXlIYXJkd2FyZUJhc2U6OmlzU2NyZWVuQWNxdWlyZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TY3JlZW5BY3F1aXJlZDsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEyMTFiLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmVCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0RJU1BMQVlfSEFSRFdBUkVfQkFTRV9ICi0jZGVmaW5lIEFORFJPSURfRElTUExBWV9IQVJEV0FSRV9CQVNFX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSAiQmFycmllci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN1cmZhY2VGbGluZ2VyOyAKLQotY2xhc3MgRGlzcGxheUhhcmR3YXJlQmFzZQotewotcHVibGljOgotICAgIERpc3BsYXlIYXJkd2FyZUJhc2UoCi0gICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIsCi0gICAgICAgICAgICB1aW50MzJfdCBkaXNwbGF5SW5kZXgpOwotCi0gICAgfkRpc3BsYXlIYXJkd2FyZUJhc2UoKTsKLQotICAgIHZvaWQgc3RhcnRTbGVlcE1hbmFnZW1lbnQoKSBjb25zdDsKLQotICAgIC8vIGNvbnNvbGUgbWFuYWdlbWVudAotICAgIHZvaWQgcmVsZWFzZVNjcmVlbigpIGNvbnN0OwotICAgIHZvaWQgYWNxdWlyZVNjcmVlbigpIGNvbnN0OwotICAgIGJvb2wgaXNTY3JlZW5BY3F1aXJlZCgpIGNvbnN0OwotCi0gICAgYm9vbCBjYW5EcmF3KCkgY29uc3Q7Ci0KLQotcHJpdmF0ZToKLSAgICBjbGFzcyBEaXNwbGF5RXZlbnRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICAgICAgd3A8U3VyZmFjZUZsaW5nZXI+IG1GbGluZ2VyOwotICAgICAgICBtdXRhYmxlIEJhcnJpZXIgbUJhcnJpZXI7Ci0gICAgICAgIHN0YXR1c190IHdhaXRGb3JGYlNsZWVwKCk7Ci0gICAgICAgIHN0YXR1c190IHdhaXRGb3JGYldha2UoKTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIERpc3BsYXlFdmVudFRocmVhZChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpOwotICAgICAgICB2aXJ0dWFsIH5EaXNwbGF5RXZlbnRUaHJlYWQoKTsKLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKLSAgICAgICAgc3RhdHVzX3QgcmVsZWFzZVNjcmVlbigpIGNvbnN0OwotICAgICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICB9OwotCi0gICAgc3A8RGlzcGxheUV2ZW50VGhyZWFkPiAgbURpc3BsYXlFdmVudFRocmVhZDsKLSAgICBtdXRhYmxlIGludCAgICAgICAgICAgICBtU2NyZWVuQWNxdWlyZWQ7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9ESVNQTEFZX0hBUkRXQVJFX0JBU0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdiZjQzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotCi0jaW5jbHVkZSAiTGF5ZXJCYXNlLmgiCi0jaW5jbHVkZSAiSFdDb21wb3Nlci5oIgotI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1IV0NvbXBvc2VyOjpIV0NvbXBvc2VyKGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcikKLSAgICA6IG1GbGluZ2VyKGZsaW5nZXIpLAotICAgICAgbU1vZHVsZSgwKSwgbUh3YygwKSwgbUxpc3QoMCksIG1DYXBhY2l0eSgwKSwKLSAgICAgIG1OdW1PVkxheWVycygwKSwgbU51bUZCTGF5ZXJzKDApLAotICAgICAgbURweShFR0xfTk9fRElTUExBWSksIG1TdXIoRUdMX05PX1NVUkZBQ0UpCi17Ci0gICAgaW50IGVyciA9IGh3X2dldF9tb2R1bGUoSFdDX0hBUkRXQVJFX01PRFVMRV9JRCwgJm1Nb2R1bGUpOwotICAgIEFMT0dXX0lGKGVyciwgIiVzIG1vZHVsZSBub3QgZm91bmQiLCBIV0NfSEFSRFdBUkVfTU9EVUxFX0lEKTsKLSAgICBpZiAoZXJyID09IDApIHsKLSAgICAgICAgZXJyID0gaHdjX29wZW4obU1vZHVsZSwgJm1Id2MpOwotICAgICAgICBBTE9HRV9JRihlcnIsICIlcyBkZXZpY2UgZmFpbGVkIHRvIGluaXRpYWxpemUgKCVzKSIsCi0gICAgICAgICAgICAgICAgSFdDX0hBUkRXQVJFX0NPTVBPU0VSLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgICAgIGlmIChlcnIgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1Id2MtPnJlZ2lzdGVyUHJvY3MpIHsKLSAgICAgICAgICAgICAgICBtQ0JDb250ZXh0Lmh3YyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgbUNCQ29udGV4dC5wcm9jcy5pbnZhbGlkYXRlID0gJmhvb2tfaW52YWxpZGF0ZTsKLSAgICAgICAgICAgICAgICBtSHdjLT5yZWdpc3RlclByb2NzKG1Id2MsICZtQ0JDb250ZXh0LnByb2NzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotSFdDb21wb3Nlcjo6fkhXQ29tcG9zZXIoKSB7Ci0gICAgZnJlZShtTGlzdCk7Ci0gICAgaWYgKG1Id2MpIHsKLSAgICAgICAgaHdjX2Nsb3NlKG1Id2MpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgSFdDb21wb3Nlcjo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSHdjID8gTk9fRVJST1IgOiBOT19JTklUOwotfQotCi12b2lkIEhXQ29tcG9zZXI6Omhvb2tfaW52YWxpZGF0ZShzdHJ1Y3QgaHdjX3Byb2NzKiBwcm9jcykgewotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2JfY29udGV4dCAqPihwcm9jcyktPmh3Yy0+aW52YWxpZGF0ZSgpOwotfQotCi12b2lkIEhXQ29tcG9zZXI6OmludmFsaWRhdGUoKSB7Ci0gICAgbUZsaW5nZXItPnJlcGFpbnRFdmVyeXRoaW5nKCk7Ci19Ci0KLXZvaWQgSFdDb21wb3Nlcjo6c2V0RnJhbWVCdWZmZXIoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyKSB7Ci0gICAgbURweSA9IChod2NfZGlzcGxheV90KWRweTsKLSAgICBtU3VyID0gKGh3Y19zdXJmYWNlX3Qpc3VyOwotfQotCi1zdGF0dXNfdCBIV0NvbXBvc2VyOjpjcmVhdGVXb3JrTGlzdChzaXplX3QgbnVtTGF5ZXJzKSB7Ci0gICAgaWYgKG1Id2MpIHsKLSAgICAgICAgaWYgKCFtTGlzdCB8fCBtQ2FwYWNpdHkgPCBudW1MYXllcnMpIHsKLSAgICAgICAgICAgIGZyZWUobUxpc3QpOwotICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBzaXplb2YoaHdjX2xheWVyX2xpc3QpICsgbnVtTGF5ZXJzKnNpemVvZihod2NfbGF5ZXJfdCk7Ci0gICAgICAgICAgICBtTGlzdCA9IChod2NfbGF5ZXJfbGlzdF90KiltYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICBtQ2FwYWNpdHkgPSBudW1MYXllcnM7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpc3QtPmZsYWdzID0gSFdDX0dFT01FVFJZX0NIQU5HRUQ7Ci0gICAgICAgIG1MaXN0LT5udW1Id0xheWVycyA9IG51bUxheWVyczsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBIV0NvbXBvc2VyOjpwcmVwYXJlKCkgY29uc3QgewotICAgIGludCBlcnIgPSBtSHdjLT5wcmVwYXJlKG1Id2MsIG1MaXN0KTsKLSAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHNpemVfdCBudW1PVkxheWVycyA9IDA7Ci0gICAgICAgIHNpemVfdCBudW1GQkxheWVycyA9IDA7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IG1MaXN0LT5udW1Id0xheWVyczsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgaHdjX2xheWVyJiBsKG1MaXN0LT5od0xheWVyc1tpXSk7Ci0gICAgICAgICAgICBpZiAobC5mbGFncyAmIEhXQ19TS0lQX0xBWUVSKSB7Ci0gICAgICAgICAgICAgICAgbC5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGwuY29tcG9zaXRpb25UeXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBIV0NfT1ZFUkxBWToKLSAgICAgICAgICAgICAgICAgICAgbnVtT1ZMYXllcnMrKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBIV0NfRlJBTUVCVUZGRVI6Ci0gICAgICAgICAgICAgICAgICAgIG51bUZCTGF5ZXJzKys7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1OdW1PVkxheWVycyA9IG51bU9WTGF5ZXJzOwotICAgICAgICBtTnVtRkJMYXllcnMgPSBudW1GQkxheWVyczsKLSAgICB9Ci0gICAgcmV0dXJuIChzdGF0dXNfdCllcnI7Ci19Ci0KLXNpemVfdCBIV0NvbXBvc2VyOjpnZXRMYXllckNvdW50KGludCB0eXBlKSBjb25zdCB7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgSFdDX09WRVJMQVk6Ci0gICAgICAgICAgICByZXR1cm4gbU51bU9WTGF5ZXJzOwotICAgICAgICBjYXNlIEhXQ19GUkFNRUJVRkZFUjoKLSAgICAgICAgICAgIHJldHVybiBtTnVtRkJMYXllcnM7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBIV0NvbXBvc2VyOjpjb21taXQoKSBjb25zdCB7Ci0gICAgaW50IGVyciA9IG1Id2MtPnNldChtSHdjLCBtRHB5LCBtU3VyLCBtTGlzdCk7Ci0gICAgaWYgKG1MaXN0KSB7Ci0gICAgICAgIG1MaXN0LT5mbGFncyAmPSB+SFdDX0dFT01FVFJZX0NIQU5HRUQ7Ci0gICAgfQotICAgIHJldHVybiAoc3RhdHVzX3QpZXJyOwotfQotCi1zdGF0dXNfdCBIV0NvbXBvc2VyOjpyZWxlYXNlKCkgY29uc3QgewotICAgIGlmIChtSHdjKSB7Ci0gICAgICAgIGludCBlcnIgPSBtSHdjLT5zZXQobUh3YywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAoc3RhdHVzX3QpZXJyOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEhXQ29tcG9zZXI6OmRpc2FibGUoKSB7Ci0gICAgaWYgKG1Id2MpIHsKLSAgICAgICAgZnJlZShtTGlzdCk7Ci0gICAgICAgIG1MaXN0ID0gTlVMTDsKLSAgICAgICAgaW50IGVyciA9IG1Id2MtPnByZXBhcmUobUh3YywgTlVMTCk7Ci0gICAgICAgIHJldHVybiAoc3RhdHVzX3QpZXJyOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNpemVfdCBIV0NvbXBvc2VyOjpnZXROdW1MYXllcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1MaXN0ID8gbUxpc3QtPm51bUh3TGF5ZXJzIDogMDsKLX0KLQotaHdjX2xheWVyX3QqIEhXQ29tcG9zZXI6OmdldExheWVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUxpc3QgPyBtTGlzdC0+aHdMYXllcnMgOiAwOwotfQotCi12b2lkIEhXQ29tcG9zZXI6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFLAotICAgICAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgdmlzaWJsZUxheWVyc1NvcnRlZEJ5WikgY29uc3QgewotICAgIGlmIChtSHdjICYmIG1MaXN0KSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkhhcmR3YXJlIENvbXBvc2VyIHN0YXRlOlxuIik7Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBudW1Id0xheWVycz0ldSwgZmxhZ3M9JTA4eFxuIiwKLSAgICAgICAgICAgICAgICBtTGlzdC0+bnVtSHdMYXllcnMsIG1MaXN0LT5mbGFncyk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgKLSAgICAgICAgICAgICAgICAiICAgdHlwZSAgIHwgIGhhbmRsZSAgfCAgIGhpbnRzICB8ICAgZmxhZ3MgIHwgdHIgfCBibGVuZCB8ICBmb3JtYXQgIHwgICAgICAgc291cmNlIGNyb3AgICAgICAgICB8ICAgICAgICAgICBmcmFtZSAgICAgICAgICAgbmFtZSBcbiIKLSAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tKy0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotICAgICAgICAvLyAgICAgICIgX19fX19fX18gfCBfX19fX19fXyB8IF9fX19fX19fIHwgX19fX19fX18gfCBfXyB8IF9fX19fIHwgX19fX19fX18gfCBbX19fX18sX19fX18sX19fX18sX19fX19dIHwgW19fX19fLF9fX19fLF9fX19fLF9fX19fXQotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPG1MaXN0LT5udW1Id0xheWVycyA7IGkrKykgewotICAgICAgICAgICAgY29uc3QgaHdjX2xheWVyX3QmIGwobUxpc3QtPmh3TGF5ZXJzW2ldKTsKLSAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4gbGF5ZXIodmlzaWJsZUxheWVyc1NvcnRlZEJ5WltpXSk7Ci0gICAgICAgICAgICBpbnQzMl90IGZvcm1hdCA9IC0xOwotICAgICAgICAgICAgaWYgKGxheWVyLT5nZXRMYXllcigpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKGxheWVyLT5nZXRMYXllcigpLT5nZXRBY3RpdmVCdWZmZXIoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IGJ1ZmZlci0+Z2V0UGl4ZWxGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgICAgICIgJThzIHwgJTA4eCB8ICUwOHggfCAlMDh4IHwgJTAyeCB8ICUwNXggfCAlMDh4IHwgWyU1ZCwlNWQsJTVkLCU1ZF0gfCBbJTVkLCU1ZCwlNWQsJTVkXSAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgbC5jb21wb3NpdGlvblR5cGUgPyAiT1ZFUkxBWSIgOiAiRkIiLAotICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdChsLmhhbmRsZSksIGwuaGludHMsIGwuZmxhZ3MsIGwudHJhbnNmb3JtLCBsLmJsZW5kaW5nLCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIGwuc291cmNlQ3JvcC5sZWZ0LCBsLnNvdXJjZUNyb3AudG9wLCBsLnNvdXJjZUNyb3AucmlnaHQsIGwuc291cmNlQ3JvcC5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgIGwuZGlzcGxheUZyYW1lLmxlZnQsIGwuZGlzcGxheUZyYW1lLnRvcCwgbC5kaXNwbGF5RnJhbWUucmlnaHQsIGwuZGlzcGxheUZyYW1lLmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmdldE5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1Id2MgJiYgbUh3Yy0+Y29tbW9uLnZlcnNpb24gPj0gMSAmJiBtSHdjLT5kdW1wKSB7Ci0gICAgICAgIG1Id2MtPmR1bXAobUh3YywgYnVmZmVyLCBTSVpFKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhOGViZTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0hXQ29tcG9zZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICi0jZGVmaW5lIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFN0cmluZzg7Ci1jbGFzcyBTdXJmYWNlRmxpbmdlcjsKLWNsYXNzIExheWVyQmFzZTsKLQotY2xhc3MgSFdDb21wb3NlcgotewotcHVibGljOgotCi0gICAgSFdDb21wb3Nlcihjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpOwotICAgIH5IV0NvbXBvc2VyKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIC8vIHRlbGxzIHRoZSBIQUwgd2hhdCB0aGUgZnJhbWVidWZmZXIgaXMKLSAgICB2b2lkIHNldEZyYW1lQnVmZmVyKEVHTERpc3BsYXkgZHB5LCBFR0xTdXJmYWNlIHN1cik7Ci0KLSAgICAvLyBjcmVhdGUgYSB3b3JrIGxpc3QgZm9yIG51bUxheWVycyBsYXllcgotICAgIHN0YXR1c190IGNyZWF0ZVdvcmtMaXN0KHNpemVfdCBudW1MYXllcnMpOwotCi0gICAgLy8gQXNrcyB0aGUgSEFMIHdoYXQgaXQgY2FuIGRvCi0gICAgc3RhdHVzX3QgcHJlcGFyZSgpIGNvbnN0OwotCi0gICAgLy8gZGlzYWJsZSBod2MgdW50aWwgbmV4dCBjcmVhdGVXb3JrTGlzdAotICAgIHN0YXR1c190IGRpc2FibGUoKTsKLQotICAgIC8vIGNvbW1pdHMgdGhlIGxpc3QKLSAgICBzdGF0dXNfdCBjb21taXQoKSBjb25zdDsKLQotICAgIC8vIHJlbGVhc2UgaGFyZHdhcmUgcmVzb3VyY2VzCi0gICAgc3RhdHVzX3QgcmVsZWFzZSgpIGNvbnN0OwotCi0gICAgc2l6ZV90IGdldE51bUxheWVycygpIGNvbnN0OwotICAgIGh3Y19sYXllcl90KiBnZXRMYXllcnMoKSBjb25zdDsKLQotICAgIC8vIHVwZGF0ZWQgaW4gcHJlYXByZSgpCi0gICAgc2l6ZV90IGdldExheWVyQ291bnQoaW50IHR5cGUpIGNvbnN0OwotCi0gICAgLy8gZm9yIGRlYnVnZ2luZwotICAgIHZvaWQgZHVtcChTdHJpbmc4JiBvdXQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBTSVpFLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIHZpc2libGVMYXllcnNTb3J0ZWRCeVopIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBjYl9jb250ZXh0IHsKLSAgICAgICAgaHdjX3Byb2NzX3QgcHJvY3M7Ci0gICAgICAgIEhXQ29tcG9zZXIqIGh3YzsKLSAgICB9OwotICAgIHN0YXRpYyB2b2lkIGhvb2tfaW52YWxpZGF0ZShzdHJ1Y3QgaHdjX3Byb2NzKiBwcm9jcyk7Ci0gICAgdm9pZCBpbnZhbGlkYXRlKCk7Ci0KLSAgICBzcDxTdXJmYWNlRmxpbmdlcj4gICAgICBtRmxpbmdlcjsKLSAgICBod19tb2R1bGVfdCBjb25zdCogICAgICBtTW9kdWxlOwotICAgIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCogIG1Id2M7Ci0gICAgaHdjX2xheWVyX2xpc3RfdCogICAgICAgbUxpc3Q7Ci0gICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUNhcGFjaXR5OwotICAgIG11dGFibGUgc2l6ZV90ICAgICAgICAgIG1OdW1PVkxheWVyczsKLSAgICBtdXRhYmxlIHNpemVfdCAgICAgICAgICBtTnVtRkJMYXllcnM7Ci0gICAgaHdjX2Rpc3BsYXlfdCAgICAgICAgICAgbURweTsKLSAgICBod2Nfc3VyZmFjZV90ICAgICAgICAgICBtU3VyOwotICAgIGNiX2NvbnRleHQgICAgICAgICAgICAgIG1DQkNvbnRleHQ7Ci19OwotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfU0ZfSFdDT01QT1NFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvVlN5bmNCYXJyaWVyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODdkYTIwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL1ZTeW5jQmFycmllci5oIgotCi0jaWZuZGVmIEZCSU9fV0FJVEZPUlZTWU5DCi0jZGVmaW5lIEZCSU9fV0FJVEZPUlZTWU5DICAgX0lPVygnRicsIDB4MjAsIF9fdTMyKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1WU3luY0JhcnJpZXI6OlZTeW5jQmFycmllcigpIDogbUZkKC1FSU5WQUwpIHsKLSNpZiBIQVNfV0FJVEZPUlZTWU5DCi0gICAgbUZkID0gb3BlbigiL2Rldi9ncmFwaGljcy9mYjAiLCBPX1JEV1IpOwotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIG1GZCA9IC1lcnJubzsKLSAgICB9Ci0gICAgLy8gdHJ5IHRvIHNlZSBpZiBGQklPX1dBSVRGT1JWU1lOQyBpcyBzdXBwb3J0ZWQKLSAgICB1aW50MzJfdCBjcnQgPSAwOwotICAgIGludCBlcnIgPSBpb2N0bChtRmQsIEZCSU9fV0FJVEZPUlZTWU5DLCAmY3J0KTsKLSAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICBjbG9zZShtRmQpOwotICAgICAgICBtRmQgPSAtRUlOVkFMOwotICAgIH0KLSNlbmRpZgotfQotCi1WU3luY0JhcnJpZXI6On5WU3luY0JhcnJpZXIoKSB7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIGNsb3NlKG1GZCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBWU3luY0JhcnJpZXI6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZkIDwgMCA/IG1GZCA6IHN0YXR1c190KE5PX0VSUk9SKTsKLX0KLQotLy8gdGhpcyBtdXN0IGJlIHRocmVhZC1zYWZlCi1zdGF0dXNfdCBWU3luY0JhcnJpZXI6OndhaXQobnNlY3NfdCogdGltZXN0YW1wKSBjb25zdCB7Ci0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIG1GZDsKLSAgICB9Ci0KLSAgICBpbnQgZXJyOwotICAgIHVpbnQzMl90IGNydCA9IDA7Ci0gICAgZG8gewotICAgICAgICBlcnIgPSBpb2N0bChtRmQsIEZCSU9fV0FJVEZPUlZTWU5DLCAmY3J0KTsKLSAgICB9IHdoaWxlIChlcnI8MCAmJiBlcnJubz09RUlOVFIpOwotICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotICAgIC8vIGlkZWFsbHkgdGhpcyB3b3VsZCBjb21lIGZyb20gdGhlIGRyaXZlcgotICAgIHRpbWVzdGFtcFswXSA9IHN5c3RlbVRpbWUoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WU3luY0JhcnJpZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzMjk1MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvVlN5bmNCYXJyaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9WU1lOQ0JBUlJJRVJfSF8KLSNkZWZpbmUgQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfVlNZTkNCQVJSSUVSX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVlN5bmNCYXJyaWVyIHsKLSAgICBpbnQgbUZkOwotcHVibGljOgotICAgIFZTeW5jQmFycmllcigpOwotICAgIH5WU3luY0JhcnJpZXIoKTsKLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLSAgICBzdGF0dXNfdCB3YWl0KG5zZWNzX3QqIHRpbWVzdGFtcCkgY29uc3Q7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9WU1lOQ0JBUlJJRVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0V2ZW50VGhyZWFkLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0V2ZW50VGhyZWFkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwNDVkNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9FdmVudFRocmVhZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGd1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPGd1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KLQotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLSNpbmNsdWRlICJEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiRXZlbnRUaHJlYWQuaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRXZlbnRUaHJlYWQ6OkV2ZW50VGhyZWFkKGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlcikKLSAgICA6IG1GbGluZ2VyKGZsaW5nZXIpLAotICAgICAgbUh3KGZsaW5nZXItPmdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSksCi0gICAgICBtTGFzdFZTeW5jVGltZXN0YW1wKDApLAotICAgICAgbURlbGl2ZXJlZEV2ZW50cygwKQotewotfQotCi12b2lkIEV2ZW50VGhyZWFkOjpvbkZpcnN0UmVmKCkgewotICAgIHJ1bigiRXZlbnRUaHJlYWQiLCBQUklPUklUWV9VUkdFTlRfRElTUExBWSArIFBSSU9SSVRZX01PUkVfRkFWT1JBQkxFKTsKLX0KLQotc3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gRXZlbnRUaHJlYWQ6OmNyZWF0ZUV2ZW50Q29ubmVjdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbmV3IERpc3BsYXlFdmVudENvbm5lY3Rpb24oY29uc3RfY2FzdDxFdmVudFRocmVhZCo+KHRoaXMpKTsKLX0KLQotbnNlY3NfdCBFdmVudFRocmVhZDo6Z2V0TGFzdFZTeW5jVGltZXN0YW1wKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1MYXN0VlN5bmNUaW1lc3RhbXA7Ci19Ci0KLW5zZWNzX3QgRXZlbnRUaHJlYWQ6OmdldFZTeW5jUGVyaW9kKCkgY29uc3QgewotICAgIHJldHVybiBtSHcuZ2V0UmVmcmVzaFBlcmlvZCgpOwotCi19Ci0KLXN0YXR1c190IEV2ZW50VGhyZWFkOjpyZWdpc3RlckRpc3BsYXlFdmVudENvbm5lY3Rpb24oCi0gICAgICAgIGNvbnN0IHNwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBDb25uZWN0aW9uSW5mbyBpbmZvOwotICAgIG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbiwgaW5mbyk7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEV2ZW50VGhyZWFkOjp1bnJlZ2lzdGVyRGlzcGxheUV2ZW50Q29ubmVjdGlvbigKLSAgICAgICAgY29uc3Qgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5yZW1vdmVJdGVtKGNvbm5lY3Rpb24pOwotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEV2ZW50VGhyZWFkOjpyZW1vdmVEaXNwbGF5RXZlbnRDb25uZWN0aW9uKAotICAgICAgICBjb25zdCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLnJlbW92ZUl0ZW0oY29ubmVjdGlvbik7Ci19Ci0KLUV2ZW50VGhyZWFkOjpDb25uZWN0aW9uSW5mbyogRXZlbnRUaHJlYWQ6OmdldENvbm5lY3Rpb25JbmZvTG9ja2VkKAotICAgICAgICBjb25zdCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbikgewotICAgIHNzaXplX3QgaW5kZXggPSBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuaW5kZXhPZktleShjb25uZWN0aW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gJm1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5lZGl0VmFsdWVBdChpbmRleCk7Ci19Ci0KLXZvaWQgRXZlbnRUaHJlYWQ6OnNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCwKLSAgICAgICAgY29uc3Qgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pIHsKLSAgICBpZiAoaW50MzJfdChjb3VudCkgPj0gMCkgeyAvLyBzZXJ2ZXIgbXVzdCBwcm90ZWN0IGFnYWluc3QgYmFkIHBhcmFtcwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBDb25uZWN0aW9uSW5mbyogaW5mbyA9IGdldENvbm5lY3Rpb25JbmZvTG9ja2VkKGNvbm5lY3Rpb24pOwotICAgICAgICBpZiAoaW5mbykgewotICAgICAgICAgICAgY29uc3QgaW50MzJfdCBuZXdfY291bnQgPSAoY291bnQgPT0gMCkgPyAtMSA6IGNvdW50OwotICAgICAgICAgICAgaWYgKGluZm8tPmNvdW50ICE9IG5ld19jb3VudCkgewotICAgICAgICAgICAgICAgIGluZm8tPmNvdW50ID0gbmV3X2NvdW50OwotICAgICAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRXZlbnRUaHJlYWQ6OnJlcXVlc3ROZXh0VnN5bmMoCi0gICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBDb25uZWN0aW9uSW5mbyogaW5mbyA9IGdldENvbm5lY3Rpb25JbmZvTG9ja2VkKGNvbm5lY3Rpb24pOwotICAgIGlmIChpbmZvICYmIGluZm8tPmNvdW50IDwgMCkgewotICAgICAgICBpbmZvLT5jb3VudCA9IDA7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgfQotfQotCi1ib29sIEV2ZW50VGhyZWFkOjp0aHJlYWRMb29wKCkgewotCi0gICAgbnNlY3NfdCB0aW1lc3RhbXA7Ci0gICAgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkV2ZW50IHZzeW5jOwotICAgIFZlY3Rvcjwgd3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gPiBkaXNwbGF5RXZlbnRDb25uZWN0aW9uczsKLQotICAgIHsgLy8gc2NvcGUgZm9yIHRoZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBWU1lOQyBhdCBhbGwKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBib29sIHdhaXRGb3JOZXh0VnN5bmMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29ubmVjdGlvbkluZm8mIGluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5jb3VudCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdCBsZWFzdCBvbmUgY29udGludW91cyBtb2RlIG9yIGFjdGl2ZSBvbmUtc2hvdCBldmVudAotICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEZvck5leHRWc3luYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh3YWl0Rm9yTmV4dFZzeW5jKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgICAgICAgICB9IHdoaWxlKHRydWUpOwotCi0gICAgICAgICAgICAvLyBhdCBsZWFzdCBvbmUgbGlzdGVuZXIgcmVxdWVzdGVkIFZTWU5DCi0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcCA9IG1Idy53YWl0Rm9yUmVmcmVzaCgpOwotICAgICAgICAgICAgQVRSQUNFX0lOVCgiVlNZTkMiLCBtRGVsaXZlcmVkRXZlbnRzJjEpOwotICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgbURlbGl2ZXJlZEV2ZW50cysrOwotICAgICAgICAgICAgbUxhc3RWU3luY1RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQotICAgICAgICAgICAgLy8gbm93IHNlZSBpZiB3ZSBzdGlsbCBuZWVkIHRvIHJlcG9ydCB0aGlzIFZTWU5DIGV2ZW50Ci0gICAgICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0VnN5bmMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBjb25zdCBDb25uZWN0aW9uSW5mbyYgaW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy52YWx1ZUF0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5jb3VudCA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLmNvdW50PT0xIHx8IChtRGVsaXZlcmVkRXZlbnRzICUgaW5mby5jb3VudCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludW91cyBldmVudCwgYW5kIHRpbWUgdG8gcmVwb3J0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRWc3luYyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm8uY291bnQgPj0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbkluZm8mIGluZm8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc3BsYXlFdmVudENvbm5lY3Rpb25zLmVkaXRWYWx1ZUF0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8uY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyZWQgdGhpcyB0aW1lIGFyb3VuZAotICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0VnN5bmMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGluZm8uY291bnQtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFZzeW5jKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFdmVudENvbm5lY3Rpb25zLmFkZChtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoIWRpc3BsYXlFdmVudENvbm5lY3Rpb25zLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gZGlzcGF0Y2ggdnN5bmMgZXZlbnRzIHRvIGxpc3RlbmVycy4uLgotICAgICAgICB2c3luYy5oZWFkZXIudHlwZSA9IERpc3BsYXlFdmVudFJlY2VpdmVyOjpESVNQTEFZX0VWRU5UX1ZTWU5DOwotICAgICAgICB2c3luYy5oZWFkZXIudGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICB2c3luYy52c3luYy5jb3VudCA9IG1EZWxpdmVyZWRFdmVudHM7Ci0gICAgfQotCi0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gZGlzcGxheUV2ZW50Q29ubmVjdGlvbnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgc3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4gY29ubihkaXNwbGF5RXZlbnRDb25uZWN0aW9uc1tpXS5wcm9tb3RlKCkpOwotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNvbm5lY3Rpb24gZGlkbid0IGRpZQotICAgICAgICBpZiAoY29ubiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25uLT5wb3N0RXZlbnQodnN5bmMpOwotICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOIHx8IGVyciA9PSAtRVdPVUxEQkxPQ0spIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgZGVzdGluYXRpb24gZG9lc24ndCBhY2NlcHQgZXZlbnRzIGFueW1vcmUsIGl0J3MgcHJvYmFibHkKLSAgICAgICAgICAgICAgICAvLyBmdWxsLiBGb3Igbm93LCB3ZSBqdXN0IGRyb3AgdGhlIGV2ZW50cyBvbiB0aGUgZmxvb3IuCi0gICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHNvbWUgZXZlbnRzIGNhbm5vdCBiZSBkcm9wcGVkIGFuZCB3b3VsZCBoYXZlIHRvIGJlCi0gICAgICAgICAgICAgICAgLy8gcmUtc2VudCBsYXRlci4gUmlnaHQtbm93IHdlIGRvbid0IGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8KLSAgICAgICAgICAgICAgICAvLyB0aGlzLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZm9yIFZTWU5DLgotICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGFueSBvdGhlciBlcnJvciBvbiB0aGUgcGlwZSBhcyBmYXRhbC4gdGhlIG9ubHkKLSAgICAgICAgICAgICAgICAvLyByZWFzb25hYmxlIHRoaW5nIHRvIGRvIGlzIHRvIGNsZWFuLXVwIHRoaXMgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAvLyBUaGUgbW9zdCBjb21tb24gZXJyb3Igd2UnbGwgZ2V0IGhlcmUgaXMgLUVQSVBFLgotICAgICAgICAgICAgICAgIHJlbW92ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oZGlzcGxheUV2ZW50Q29ubmVjdGlvbnNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc29tZWhvdyB0aGUgY29ubmVjdGlvbiBpcyBkZWFkLCBidXQgd2Ugc3RpbGwgaGF2ZSBpdCBpbiBvdXIgbGlzdAotICAgICAgICAgICAgLy8ganVzdCBjbGVhbiB0aGUgbGlzdC4KLSAgICAgICAgICAgIHJlbW92ZURpc3BsYXlFdmVudENvbm5lY3Rpb24oZGlzcGxheUV2ZW50Q29ubmVjdGlvbnNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gY2xlYXIgYWxsIG91ciByZWZlcmVuY2VzIHdpdGhvdXQgaG9sZGluZyBtTG9jawotICAgIGRpc3BsYXlFdmVudENvbm5lY3Rpb25zLmNsZWFyKCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgRXZlbnRUaHJlYWQ6OnJlYWR5VG9SdW4oKSB7Ci0gICAgQUxPR0koIkV2ZW50VGhyZWFkIHJlYWR5IHRvIHJ1bi4iKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgRXZlbnRUaHJlYWQ6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXN1bHQuYXBwZW5kKCJWU1lOQyBzdGF0ZTpcbiIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgbnVtTGlzdGVuZXJzPSV1LCBldmVudHMtZGVsaXZlcmVkOiAldVxuIiwKLSAgICAgICAgICAgIG1EaXNwbGF5RXZlbnRDb25uZWN0aW9ucy5zaXplKCksIG1EZWxpdmVyZWRFdmVudHMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9FdmVudFRocmVhZC5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRXZlbnRUaHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzMDcxZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9FdmVudFRocmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0VWRU5UX1RIUkVBRF9ICi0jZGVmaW5lIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0VWRU5UX1RIUkVBRF9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPGd1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oPgotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0KLSNpbmNsdWRlICJEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBTdXJmYWNlRmxpbmdlcjsKLWNsYXNzIERpc3BsYXlIYXJkd2FyZTsKLWNsYXNzIERpc3BsYXlFdmVudENvbm5lY3Rpb247Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBFdmVudFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIGZyaWVuZCBjbGFzcyBEaXNwbGF5RXZlbnRDb25uZWN0aW9uOwotCi1wdWJsaWM6Ci0gICAgRXZlbnRUaHJlYWQoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyKTsKLQotICAgIHNwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+IGNyZWF0ZUV2ZW50Q29ubmVjdGlvbigpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgcmVnaXN0ZXJEaXNwbGF5RXZlbnRDb25uZWN0aW9uKAotICAgICAgICAgICAgY29uc3Qgc3A8RGlzcGxheUV2ZW50Q29ubmVjdGlvbj4mIGNvbm5lY3Rpb24pOwotCi0gICAgc3RhdHVzX3QgdW5yZWdpc3RlckRpc3BsYXlFdmVudENvbm5lY3Rpb24oCi0gICAgICAgICAgICBjb25zdCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbik7Ci0KLSAgICB2b2lkIHNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKLQotICAgIHZvaWQgcmVxdWVzdE5leHRWc3luYyhjb25zdCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbik7Ci0KLSAgICBuc2Vjc190IGdldExhc3RWU3luY1RpbWVzdGFtcCgpIGNvbnN0OwotCi0gICAgbnNlY3NfdCBnZXRWU3luY1BlcmlvZCgpIGNvbnN0OwotCi0gICAgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0KLSAgICBzdHJ1Y3QgQ29ubmVjdGlvbkluZm8gewotICAgICAgICBDb25uZWN0aW9uSW5mbygpIDogY291bnQoLTEpIHsgfQotCi0gICAgICAgIC8vIGNvdW50ID49IDEgOiBjb250aW51b3VzIGV2ZW50LiBjb3VudCBpcyB0aGUgdnN5bmMgcmF0ZQotICAgICAgICAvLyBjb3VudCA9PSAwIDogb25lLXNob3QgZXZlbnQgdGhhdCBoYXMgbm90IGZpcmVkCi0gICAgICAgIC8vIGNvdW50ID09LTEgOiBvbmUtc2hvdCBldmVudCB0aGF0IGZpcmVkIHRoaXMgcm91bmQgLyBkaXNhYmxlZAotICAgICAgICAvLyBjb3VudCA9PS0yIDogb25lLXNob3QgZXZlbnQgdGhhdCBmaXJlZCB0aGUgcm91bmQgYmVmb3JlCi0gICAgICAgIGludDMyX3QgY291bnQ7Ci0gICAgfTsKLQotICAgIHZvaWQgcmVtb3ZlRGlzcGxheUV2ZW50Q29ubmVjdGlvbigKLSAgICAgICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKLQotICAgIENvbm5lY3Rpb25JbmZvKiBnZXRDb25uZWN0aW9uSW5mb0xvY2tlZCgKLSAgICAgICAgICAgIGNvbnN0IHdwPERpc3BsYXlFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIG1IdzsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgbXV0YWJsZSBDb25kaXRpb24gbUNvbmRpdGlvbjsKLQotICAgIC8vIHByb3RlY3RlZCBieSBtTG9jawotICAgIEtleWVkVmVjdG9yPCB3cDxEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiwgQ29ubmVjdGlvbkluZm8gPiBtRGlzcGxheUV2ZW50Q29ubmVjdGlvbnM7Ci0gICAgbnNlY3NfdCBtTGFzdFZTeW5jVGltZXN0YW1wOwotCi0gICAgLy8gbWFpbiB0aHJlYWQgb25seQotICAgIHNpemVfdCBtRGVsaXZlcmVkRXZlbnRzOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZW5kaWYgLyogQU5EUk9JRF9TVVJGQUNFX0ZMSU5HRVJfRVZFTlRfVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0dMRXh0ZW5zaW9ucy5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9HTEV4dGVuc2lvbnMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTMxMjJkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0dMRXh0ZW5zaW9ucy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BTkRST0lEX1NJTkdMRVRPTl9TVEFUSUNfSU5TVEFOQ0UoIEdMRXh0ZW5zaW9ucyApCi0KLUdMRXh0ZW5zaW9uczo6R0xFeHRlbnNpb25zKCkKLSAgICA6IG1IYXZlVGV4dHVyZUV4dGVybmFsKGZhbHNlKSwKLSAgICAgIG1IYXZlTnBvdChmYWxzZSksCi0gICAgICBtSGF2ZURpcmVjdFRleHR1cmUoZmFsc2UpCi17Ci19Ci0KLXZvaWQgR0xFeHRlbnNpb25zOjppbml0V2l0aEdMU3RyaW5ncygKLSAgICAgICAgR0x1Ynl0ZSBjb25zdCogdmVuZG9yLAotICAgICAgICBHTHVieXRlIGNvbnN0KiByZW5kZXJlciwKLSAgICAgICAgR0x1Ynl0ZSBjb25zdCogdmVyc2lvbiwKLSAgICAgICAgR0x1Ynl0ZSBjb25zdCogZXh0ZW5zaW9ucywKLSAgICAgICAgY2hhciBjb25zdCogZWdsX3ZlbmRvciwKLSAgICAgICAgY2hhciBjb25zdCogZWdsX3ZlcnNpb24sCi0gICAgICAgIGNoYXIgY29uc3QqIGVnbF9leHRlbnNpb25zKQotewotICAgIG1WZW5kb3IgICAgID0gKGNoYXIgY29uc3QqKXZlbmRvcjsKLSAgICBtUmVuZGVyZXIgICA9IChjaGFyIGNvbnN0KilyZW5kZXJlcjsKLSAgICBtVmVyc2lvbiAgICA9IChjaGFyIGNvbnN0Kil2ZXJzaW9uOwotICAgIG1FeHRlbnNpb25zID0gKGNoYXIgY29uc3QqKWV4dGVuc2lvbnM7Ci0gICAgbUVnbFZlbmRvciAgICAgPSBlZ2xfdmVuZG9yOwotICAgIG1FZ2xWZXJzaW9uICAgID0gZWdsX3ZlcnNpb247Ci0gICAgbUVnbEV4dGVuc2lvbnMgPSBlZ2xfZXh0ZW5zaW9uczsKLQotICAgIGNoYXIgY29uc3QqIGN1cnIgPSAoY2hhciBjb25zdCopZXh0ZW5zaW9uczsKLSAgICBjaGFyIGNvbnN0KiBoZWFkID0gY3VycjsKLSAgICBkbyB7Ci0gICAgICAgIGhlYWQgPSBzdHJjaHIoY3VyciwgJyAnKTsKLSAgICAgICAgU3RyaW5nOCBzKGN1cnIsIGhlYWQgPyBoZWFkLWN1cnIgOiBzdHJsZW4oY3VycikpOwotICAgICAgICBpZiAocy5sZW5ndGgoKSkgewotICAgICAgICAgICAgbUV4dGVuc2lvbkxpc3QuYWRkKHMpOwotICAgICAgICB9Ci0gICAgICAgIGN1cnIgPSBoZWFkKzE7Ci0gICAgfSB3aGlsZSAoaGVhZCk7Ci0KLSAgICBjdXJyID0gZWdsX2V4dGVuc2lvbnM7Ci0gICAgaGVhZCA9IGN1cnI7Ci0gICAgZG8gewotICAgICAgICBoZWFkID0gc3RyY2hyKGN1cnIsICcgJyk7Ci0gICAgICAgIFN0cmluZzggcyhjdXJyLCBoZWFkID8gaGVhZC1jdXJyIDogc3RybGVuKGN1cnIpKTsKLSAgICAgICAgaWYgKHMubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIG1FeHRlbnNpb25MaXN0LmFkZChzKTsKLSAgICAgICAgfQotICAgICAgICBjdXJyID0gaGVhZCsxOwotICAgIH0gd2hpbGUgKGhlYWQpOwotCi0jaWZkZWYgRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlcgotICAgIGlmIChoYXNFeHRlbnNpb24oIkdMX09FU19FR0xfaW1hZ2UiKSAmJgotICAgICAgICAoaGFzRXh0ZW5zaW9uKCJFR0xfS0hSX2ltYWdlX2Jhc2UiKSB8fCBoYXNFeHRlbnNpb24oIkVHTF9LSFJfaW1hZ2UiKSkgJiYKLSAgICAgICAgaGFzRXh0ZW5zaW9uKCJFR0xfQU5EUk9JRF9pbWFnZV9uYXRpdmVfYnVmZmVyIikpCi0gICAgewotICAgICAgICBtSGF2ZURpcmVjdFRleHR1cmUgPSB0cnVlOwotICAgIH0KLSNlbHNlCi0jd2FybmluZyAiRUdMX0FORFJPSURfaW1hZ2VfbmF0aXZlX2J1ZmZlciBub3Qgc3VwcG9ydGVkIgotI2VuZGlmCi0KLSAgICBpZiAoaGFzRXh0ZW5zaW9uKCJHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvIikpIHsKLSAgICAgICAgbUhhdmVOcG90ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzRXh0ZW5zaW9uKCJHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIikpIHsKLSAgICAgICAgbUhhdmVUZXh0dXJlRXh0ZXJuYWwgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoc3Ryc3RyKG1SZW5kZXJlci5zdHJpbmcoKSwgIkFkcmVubyIpKSB7Ci0gICAgICAgIC8vIGhhY2sgZm9yIEFkcmVubyAyMDAKLSAgICAgICAgbUhhdmVUZXh0dXJlRXh0ZXJuYWwgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChoYXNFeHRlbnNpb24oIkdMX09FU19mcmFtZWJ1ZmZlcl9vYmplY3QiKSkgewotICAgICAgICBtSGF2ZUZyYW1lYnVmZmVyT2JqZWN0ID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLWJvb2wgR0xFeHRlbnNpb25zOjpoYXNFeHRlbnNpb24oY2hhciBjb25zdCogZXh0ZW5zaW9uKSBjb25zdAotewotICAgIGNvbnN0IFN0cmluZzggcyhleHRlbnNpb24pOwotICAgIHJldHVybiBtRXh0ZW5zaW9uTGlzdC5pbmRleE9mKHMpID49IDA7Ci19Ci0KLWNoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0VmVuZG9yKCkgY29uc3QgewotICAgIHJldHVybiBtVmVuZG9yLnN0cmluZygpOwotfQotCi1jaGFyIGNvbnN0KiBHTEV4dGVuc2lvbnM6OmdldFJlbmRlcmVyKCkgY29uc3QgewotICAgIHJldHVybiBtUmVuZGVyZXIuc3RyaW5nKCk7Ci19Ci0KLWNoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0VmVyc2lvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVZlcnNpb24uc3RyaW5nKCk7Ci19Ci0KLWNoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0RXh0ZW5zaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZW5zaW9ucy5zdHJpbmcoKTsKLX0KLQotY2hhciBjb25zdCogR0xFeHRlbnNpb25zOjpnZXRFZ2xWZW5kb3IoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FZ2xWZW5kb3Iuc3RyaW5nKCk7Ci19Ci0KLWNoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0RWdsVmVyc2lvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVnbFZlcnNpb24uc3RyaW5nKCk7Ci19Ci0KLWNoYXIgY29uc3QqIEdMRXh0ZW5zaW9uczo6Z2V0RWdsRXh0ZW5zaW9uKCkgY29uc3QgewotICAgIHJldHVybiBtRWdsRXh0ZW5zaW9ucy5zdHJpbmcoKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9HTEV4dGVuc2lvbnMuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0dMRXh0ZW5zaW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZjNjZhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0dMRXh0ZW5zaW9ucy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRl9HTEVYVEVOU0lPTl9ICi0jZGVmaW5lIEFORFJPSURfU0ZfR0xFWFRFTlNJT05fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLSNpbmNsdWRlIDxHTEVTL2dsZXh0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBHTEV4dGVuc2lvbnMgOiBwdWJsaWMgU2luZ2xldG9uPEdMRXh0ZW5zaW9ucz4KLXsKLSAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPEdMRXh0ZW5zaW9ucz47Ci0KLSAgICBib29sIG1IYXZlVGV4dHVyZUV4dGVybmFsICAgOiAxOwotICAgIGJvb2wgbUhhdmVOcG90ICAgICAgICAgICAgICA6IDE7Ci0gICAgYm9vbCBtSGF2ZURpcmVjdFRleHR1cmUgICAgIDogMTsKLSAgICBib29sIG1IYXZlRnJhbWVidWZmZXJPYmplY3QgOiAxOwotCi0gICAgU3RyaW5nOCBtVmVuZG9yOwotICAgIFN0cmluZzggbVJlbmRlcmVyOwotICAgIFN0cmluZzggbVZlcnNpb247Ci0gICAgU3RyaW5nOCBtRXh0ZW5zaW9uczsKLSAgICBTdHJpbmc4IG1FZ2xWZW5kb3I7Ci0gICAgU3RyaW5nOCBtRWdsVmVyc2lvbjsKLSAgICBTdHJpbmc4IG1FZ2xFeHRlbnNpb25zOwotICAgIFNvcnRlZFZlY3RvcjxTdHJpbmc4PiBtRXh0ZW5zaW9uTGlzdDsKLQotICAgIEdMRXh0ZW5zaW9ucyhjb25zdCBHTEV4dGVuc2lvbnMmKTsKLSAgICBHTEV4dGVuc2lvbnMmIG9wZXJhdG9yID0gKGNvbnN0IEdMRXh0ZW5zaW9ucyYpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgR0xFeHRlbnNpb25zKCk7Ci0KLXB1YmxpYzoKLSAgICBpbmxpbmUgYm9vbCBoYXZlVGV4dHVyZUV4dGVybmFsKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUhhdmVUZXh0dXJlRXh0ZXJuYWw7Ci0gICAgfQotICAgIGlubGluZSBib29sIGhhdmVOcG90KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbUhhdmVOcG90OwotICAgIH0KLSAgICBpbmxpbmUgYm9vbCBoYXZlRGlyZWN0VGV4dHVyZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1IYXZlRGlyZWN0VGV4dHVyZTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBoYXZlRnJhbWVidWZmZXJPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtSGF2ZUZyYW1lYnVmZmVyT2JqZWN0OwotICAgIH0KLQotICAgIHZvaWQgaW5pdFdpdGhHTFN0cmluZ3MoCi0gICAgICAgICAgICBHTHVieXRlIGNvbnN0KiB2ZW5kb3IsCi0gICAgICAgICAgICBHTHVieXRlIGNvbnN0KiByZW5kZXJlciwKLSAgICAgICAgICAgIEdMdWJ5dGUgY29uc3QqIHZlcnNpb24sCi0gICAgICAgICAgICBHTHVieXRlIGNvbnN0KiBleHRlbnNpb25zLAotICAgICAgICAgICAgY2hhciBjb25zdCogZWdsX3ZlbmRvciwKLSAgICAgICAgICAgIGNoYXIgY29uc3QqIGVnbF92ZXJzaW9uLAotICAgICAgICAgICAgY2hhciBjb25zdCogZWdsX2V4dGVuc2lvbnMpOwotCi0gICAgY2hhciBjb25zdCogZ2V0VmVuZG9yKCkgY29uc3Q7Ci0gICAgY2hhciBjb25zdCogZ2V0UmVuZGVyZXIoKSBjb25zdDsKLSAgICBjaGFyIGNvbnN0KiBnZXRWZXJzaW9uKCkgY29uc3Q7Ci0gICAgY2hhciBjb25zdCogZ2V0RXh0ZW5zaW9uKCkgY29uc3Q7Ci0KLSAgICBjaGFyIGNvbnN0KiBnZXRFZ2xWZW5kb3IoKSBjb25zdDsKLSAgICBjaGFyIGNvbnN0KiBnZXRFZ2xWZXJzaW9uKCkgY29uc3Q7Ci0gICAgY2hhciBjb25zdCogZ2V0RWdsRXh0ZW5zaW9uKCkgY29uc3Q7Ci0KLSAgICBib29sIGhhc0V4dGVuc2lvbihjaGFyIGNvbnN0KiBleHRlbnNpb24pIGNvbnN0OwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NGX0dMRVhURU5TSU9OX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmU1Yy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdG9wV2F0Y2guaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+Ci0KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotCi0jaW5jbHVkZSAiY2x6LmgiCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9IV0NvbXBvc2VyLmgiCi0jaW5jbHVkZSAiR0xFeHRlbnNpb25zLmgiCi0jaW5jbHVkZSAiTGF5ZXIuaCIKLSNpbmNsdWRlICJTdXJmYWNlRmxpbmdlci5oIgotI2luY2x1ZGUgIlN1cmZhY2VUZXh0dXJlTGF5ZXIuaCIKLQotI2RlZmluZSBERUJVR19SRVNJWkUgICAgMAotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXllcjo6TGF5ZXIoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsCi0gICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LCBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQpCi0gICAgOiAgIExheWVyQmFzZUNsaWVudChmbGluZ2VyLCBkaXNwbGF5LCBjbGllbnQpLAotICAgICAgICBtVGV4dHVyZU5hbWUoLTFVKSwKLSAgICAgICAgbVF1ZXVlZEZyYW1lcygwKSwKLSAgICAgICAgbUN1cnJlbnRUcmFuc2Zvcm0oMCksCi0gICAgICAgIG1DdXJyZW50U2NhbGluZ01vZGUoTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfRlJFRVpFKSwKLSAgICAgICAgbUN1cnJlbnRPcGFjaXR5KHRydWUpLAotICAgICAgICBtUmVmcmVzaFBlbmRpbmcoZmFsc2UpLAotICAgICAgICBtRnJhbWVMYXRlbmN5TmVlZGVkKGZhbHNlKSwKLSAgICAgICAgbUZyYW1lTGF0ZW5jeU9mZnNldCgwKSwKLSAgICAgICAgbUZvcm1hdChQSVhFTF9GT1JNQVRfTk9ORSksCi0gICAgICAgIG1HTEV4dGVuc2lvbnMoR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpKSwKLSAgICAgICAgbU9wYXF1ZUxheWVyKHRydWUpLAotICAgICAgICBtTmVlZHNEaXRoZXJpbmcoZmFsc2UpLAotICAgICAgICBtU2VjdXJlKGZhbHNlKSwKLSAgICAgICAgbVByb3RlY3RlZEJ5QXBwKGZhbHNlKQotewotICAgIG1DdXJyZW50Q3JvcC5tYWtlSW52YWxpZCgpOwotICAgIGdsR2VuVGV4dHVyZXMoMSwgJm1UZXh0dXJlTmFtZSk7Ci19Ci0KLXZvaWQgTGF5ZXI6Om9uTGF5ZXJEaXNwbGF5ZWQoKSB7Ci0gICAgaWYgKG1GcmFtZUxhdGVuY3lOZWVkZWQpIHsKLSAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgICAgICBtRnJhbWVTdGF0c1ttRnJhbWVMYXRlbmN5T2Zmc2V0XS50aW1lc3RhbXAgPSBtU3VyZmFjZVRleHR1cmUtPmdldFRpbWVzdGFtcCgpOwotICAgICAgICBtRnJhbWVTdGF0c1ttRnJhbWVMYXRlbmN5T2Zmc2V0XS5zZXQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgIG1GcmFtZVN0YXRzW21GcmFtZUxhdGVuY3lPZmZzZXRdLnZzeW5jID0gaHcuZ2V0UmVmcmVzaFRpbWVzdGFtcCgpOwotICAgICAgICBtRnJhbWVMYXRlbmN5T2Zmc2V0ID0gKG1GcmFtZUxhdGVuY3lPZmZzZXQgKyAxKSAlIDEyODsKLSAgICAgICAgbUZyYW1lTGF0ZW5jeU5lZWRlZCA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBMYXllcjo6b25GaXJzdFJlZigpCi17Ci0gICAgTGF5ZXJCYXNlQ2xpZW50OjpvbkZpcnN0UmVmKCk7Ci0KLSAgICBzdHJ1Y3QgRnJhbWVRdWV1ZWRMaXN0ZW5lciA6IHB1YmxpYyBTdXJmYWNlVGV4dHVyZTo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7Ci0gICAgICAgIEZyYW1lUXVldWVkTGlzdGVuZXIoTGF5ZXIqIGxheWVyKSA6IG1MYXllcihsYXllcikgeyB9Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgd3A8TGF5ZXI+IG1MYXllcjsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSB7Ci0gICAgICAgICAgICBzcDxMYXllcj4gdGhhdChtTGF5ZXIucHJvbW90ZSgpKTsKLSAgICAgICAgICAgIGlmICh0aGF0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB0aGF0LT5vbkZyYW1lUXVldWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotICAgIG1TdXJmYWNlVGV4dHVyZSA9IG5ldyBTdXJmYWNlVGV4dHVyZUxheWVyKG1UZXh0dXJlTmFtZSwgdGhpcyk7Ci0gICAgbVN1cmZhY2VUZXh0dXJlLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKG5ldyBGcmFtZVF1ZXVlZExpc3RlbmVyKHRoaXMpKTsKLSAgICBtU3VyZmFjZVRleHR1cmUtPnNldFN5bmNocm9ub3VzTW9kZSh0cnVlKTsKLSNpZmRlZiBVU0VfVFJJUExFX0JVRkZFUklORwotI3dhcm5pbmcgInVzaW5nIHRyaXBsZSBidWZmZXJpbmciCi0gICAgbVN1cmZhY2VUZXh0dXJlLT5zZXRCdWZmZXJDb3VudFNlcnZlcigzKTsKLSNlbHNlCi0gICAgbVN1cmZhY2VUZXh0dXJlLT5zZXRCdWZmZXJDb3VudFNlcnZlcigyKTsKLSNlbmRpZgotfQotCi1MYXllcjo6fkxheWVyKCkKLXsKLSAgICBtRmxpbmdlci0+cG9zdE1lc3NhZ2VBc3luYygKLSAgICAgICAgICAgIG5ldyBTdXJmYWNlRmxpbmdlcjo6TWVzc2FnZURlc3Ryb3lHTFRleHR1cmUobVRleHR1cmVOYW1lKSApOwotfQotCi12b2lkIExheWVyOjpvbkZyYW1lUXVldWVkKCkgewotICAgIGFuZHJvaWRfYXRvbWljX2luYygmbVF1ZXVlZEZyYW1lcyk7Ci0gICAgbUZsaW5nZXItPnNpZ25hbExheWVyVXBkYXRlKCk7Ci19Ci0KLS8vIGNhbGxlZCB3aXRoIFN1cmZhY2VGbGluZ2VyOjptU3RhdGVMb2NrIGFzIHNvb24gYXMgdGhlIGxheWVyIGlzIGVudGVyZWQKLS8vIGluIHRoZSBwdXJnYXRvcnkgbGlzdAotdm9pZCBMYXllcjo6b25SZW1vdmVkKCkKLXsKLSAgICBtU3VyZmFjZVRleHR1cmUtPmFiYW5kb24oKTsKLX0KLQotdm9pZCBMYXllcjo6c2V0TmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKSB7Ci0gICAgTGF5ZXJCYXNlOjpzZXROYW1lKG5hbWUpOwotICAgIG1TdXJmYWNlVGV4dHVyZS0+c2V0TmFtZShuYW1lKTsKLX0KLQotc3A8SVN1cmZhY2U+IExheWVyOjpjcmVhdGVTdXJmYWNlKCkKLXsKLSAgICBjbGFzcyBCU3VyZmFjZSA6IHB1YmxpYyBCblN1cmZhY2UsIHB1YmxpYyBMYXllckNsZWFuZXIgewotICAgICAgICB3cDxjb25zdCBMYXllcj4gbU93bmVyOwotICAgICAgICB2aXJ0dWFsIHNwPElTdXJmYWNlVGV4dHVyZT4gZ2V0U3VyZmFjZVRleHR1cmUoKSBjb25zdCB7Ci0gICAgICAgICAgICBzcDxJU3VyZmFjZVRleHR1cmU+IHJlczsKLSAgICAgICAgICAgIHNwPGNvbnN0IExheWVyPiB0aGF0KCBtT3duZXIucHJvbW90ZSgpICk7Ci0gICAgICAgICAgICBpZiAodGhhdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gdGhhdC0+bVN1cmZhY2VUZXh0dXJlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotICAgIHB1YmxpYzoKLSAgICAgICAgQlN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPExheWVyPiYgbGF5ZXIpCi0gICAgICAgICAgICA6IExheWVyQ2xlYW5lcihmbGluZ2VyLCBsYXllciksIG1Pd25lcihsYXllcikgeyB9Ci0gICAgfTsKLSAgICBzcDxJU3VyZmFjZT4gc3VyKG5ldyBCU3VyZmFjZShtRmxpbmdlciwgdGhpcykpOwotICAgIHJldHVybiBzdXI7Ci19Ci0KLXdwPElCaW5kZXI+IExheWVyOjpnZXRTdXJmYWNlVGV4dHVyZUJpbmRlcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TdXJmYWNlVGV4dHVyZS0+YXNCaW5kZXIoKTsKLX0KLQotc3RhdHVzX3QgTGF5ZXI6OnNldEJ1ZmZlcnMoIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyB0aGlzIHN1cmZhY2VzIHBpeGVsIGZvcm1hdAotICAgIFBpeGVsRm9ybWF0SW5mbyBpbmZvOwotICAgIHN0YXR1c190IGVyciA9IGdldFBpeGVsRm9ybWF0SW5mbyhmb3JtYXQsICZpbmZvKTsKLSAgICBpZiAoZXJyKSB7Ci0gICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCBwaXhlbGZvcm1hdCAlZCIsIGZvcm1hdCk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgLy8gdGhlIGRpc3BsYXkncyBwaXhlbCBmb3JtYXQKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgdWludDMyX3QgY29uc3QgbWF4U3VyZmFjZURpbXMgPSBtaW4oCi0gICAgICAgICAgICBody5nZXRNYXhUZXh0dXJlU2l6ZSgpLCBody5nZXRNYXhWaWV3cG9ydERpbXMoKSk7Ci0KLSAgICAvLyBuZXZlciBhbGxvdyBhIHN1cmZhY2UgbGFyZ2VyIHRoYW4gd2hhdCBvdXIgdW5kZXJseWluZyBHTCBpbXBsZW1lbnRhdGlvbgotICAgIC8vIGNhbiBoYW5kbGUuCi0gICAgaWYgKCh1aW50MzJfdCh3KT5tYXhTdXJmYWNlRGltcykgfHwgKHVpbnQzMl90KGgpPm1heFN1cmZhY2VEaW1zKSkgewotICAgICAgICBBTE9HRSgiZGltZW5zaW9ucyB0b28gbGFyZ2UgJXUgeCAldSIsIHVpbnQzMl90KHcpLCB1aW50MzJfdChoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgUGl4ZWxGb3JtYXRJbmZvIGRpc3BsYXlJbmZvOwotICAgIGdldFBpeGVsRm9ybWF0SW5mbyhody5nZXRGb3JtYXQoKSwgJmRpc3BsYXlJbmZvKTsKLSAgICBjb25zdCB1aW50MzJfdCBod0ZsYWdzID0gaHcuZ2V0RmxhZ3MoKTsKLSAgICAKLSAgICBtRm9ybWF0ID0gZm9ybWF0OwotCi0gICAgbVNlY3VyZSA9IChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVTZWN1cmUpID8gdHJ1ZSA6IGZhbHNlOwotICAgIG1Qcm90ZWN0ZWRCeUFwcCA9IChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVQcm90ZWN0ZWRCeUFwcCkgPyB0cnVlIDogZmFsc2U7Ci0gICAgbU9wYXF1ZUxheWVyID0gKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZU9wYXF1ZSk7Ci0gICAgbUN1cnJlbnRPcGFjaXR5ID0gZ2V0T3BhY2l0eUZvckZvcm1hdChmb3JtYXQpOwotCi0gICAgbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3LCBoKTsKLSAgICBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZm9ybWF0KTsKLQotICAgIC8vIHdlIHVzZSB0aGUgcmVkIGluZGV4Ci0gICAgaW50IGRpc3BsYXlSZWRTaXplID0gZGlzcGxheUluZm8uZ2V0U2l6ZShQaXhlbEZvcm1hdEluZm86OklOREVYX1JFRCk7Ci0gICAgaW50IGxheWVyUmVkc2l6ZSA9IGluZm8uZ2V0U2l6ZShQaXhlbEZvcm1hdEluZm86OklOREVYX1JFRCk7Ci0gICAgbU5lZWRzRGl0aGVyaW5nID0gbGF5ZXJSZWRzaXplID4gZGlzcGxheVJlZFNpemU7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgTGF5ZXI6OnNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKQotewotICAgIExheWVyQmFzZUNsaWVudDo6c2V0R2VvbWV0cnkoaHdjbCk7Ci0KLSAgICBod2NsLT5mbGFncyAmPSB+SFdDX1NLSVBfTEFZRVI7Ci0KLSAgICAvLyB3ZSBjYW4ndCBkbyBhbHBoYS1mYWRlIHdpdGggdGhlIGh3YyBIQUwKLSAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0gICAgaWYgKHMuYWxwaGEgPCAweEZGKSB7Ci0gICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmFuc2Zvcm1hdGlvbnMgYXJlIGFwcGxpZWQgaW4gdGhpcyBvcmRlcjoKLSAgICAgKiAxKSBidWZmZXIgb3JpZW50YXRpb24vZmxpcC9taXJyb3IKLSAgICAgKiAyKSBzdGF0ZSB0cmFuc2Zvcm1hdGlvbiAod2luZG93IG1hbmFnZXIpCi0gICAgICogMykgbGF5ZXIgb3JpZW50YXRpb24gKHNjcmVlbiBvcmllbnRhdGlvbikKLSAgICAgKiBtVHJhbnNmb3JtIGlzIGFscmVhZHkgdGhlIGNvbXBvc2l0aW9uIG9mICgyKSBhbmQgKDMpCi0gICAgICogKE5PVEU6IHRoZSBtYXRyaWNlcyBhcmUgbXVsdGlwbGllZCBpbiByZXZlcnNlIG9yZGVyKQotICAgICAqLwotCi0gICAgY29uc3QgVHJhbnNmb3JtIGJ1ZmZlck9yaWVudGF0aW9uKG1DdXJyZW50VHJhbnNmb3JtKTsKLSAgICBjb25zdCBUcmFuc2Zvcm0gdHIobVRyYW5zZm9ybSAqIGJ1ZmZlck9yaWVudGF0aW9uKTsKLQotICAgIC8vIHRoaXMgZ2l2ZXMgdXMgb25seSB0aGUgIm9yaWVudGF0aW9uIiBjb21wb25lbnQgb2YgdGhlIHRyYW5zZm9ybQotICAgIGNvbnN0IHVpbnQzMl90IGZpbmFsVHJhbnNmb3JtID0gdHIuZ2V0T3JpZW50YXRpb24oKTsKLQotICAgIC8vIHdlIGNhbiBvbmx5IGhhbmRsZSBzaW1wbGUgdHJhbnNmb3JtYXRpb24KLSAgICBpZiAoZmluYWxUcmFuc2Zvcm0gJiBUcmFuc2Zvcm06OlJPVF9JTlZBTElEKSB7Ci0gICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaHdjbC0+dHJhbnNmb3JtID0gZmluYWxUcmFuc2Zvcm07Ci0gICAgfQotCi0gICAgaWYgKGlzQ3JvcHBlZCgpKSB7Ci0gICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AubGVmdCAgID0gbUN1cnJlbnRDcm9wLmxlZnQ7Ci0gICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gbUN1cnJlbnRDcm9wLnRvcDsKLSAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5yaWdodCAgPSBtQ3VycmVudENyb3AucmlnaHQ7Ci0gICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AuYm90dG9tID0gbUN1cnJlbnRDcm9wLmJvdHRvbTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKG1BY3RpdmVCdWZmZXIpOwotICAgICAgICBod2NsLT5zb3VyY2VDcm9wLmxlZnQgICA9IDA7Ci0gICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AudG9wICAgID0gMDsKLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBod2NsLT5zb3VyY2VDcm9wLnJpZ2h0ICA9IGJ1ZmZlci0+d2lkdGg7Ci0gICAgICAgICAgICBod2NsLT5zb3VyY2VDcm9wLmJvdHRvbSA9IGJ1ZmZlci0+aGVpZ2h0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaHdjbC0+c291cmNlQ3JvcC5yaWdodCAgPSBtVHJhbnNmb3JtZWRCb3VuZHMud2lkdGgoKTsKLSAgICAgICAgICAgIGh3Y2wtPnNvdXJjZUNyb3AuYm90dG9tID0gbVRyYW5zZm9ybWVkQm91bmRzLmhlaWdodCgpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExheWVyOjpzZXRQZXJGcmFtZURhdGEoaHdjX2xheWVyX3QqIGh3Y2wpIHsKLSAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKG1BY3RpdmVCdWZmZXIpOwotICAgIGlmIChidWZmZXIgPT0gTlVMTCkgewotICAgICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIGNsaWVudCBuZXZlciBkcmV3IGludG8gdGhpcyBsYXllciB5ZXQsCi0gICAgICAgIC8vIG9yIGlmIHdlIHJhbiBvdXQgb2YgbWVtb3J5LiBJbiB0aGF0IGNhc2UsIGRvbid0IGxldAotICAgICAgICAvLyBIV0MgaGFuZGxlIGl0LgotICAgICAgICBod2NsLT5mbGFncyB8PSBIV0NfU0tJUF9MQVlFUjsKLSAgICAgICAgaHdjbC0+aGFuZGxlID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBod2NsLT5oYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKLSAgICB9Ci19Ci0KLXZvaWQgTGF5ZXI6Om9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0Ci17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIGlmIChDQ19VTkxJS0VMWShtQWN0aXZlQnVmZmVyID09IDApKSB7Ci0gICAgICAgIC8vIHRoZSB0ZXh0dXJlIGhhcyBub3QgYmVlbiBjcmVhdGVkIHlldCwgdGhpcyBMYXllciBoYXMKLSAgICAgICAgLy8gaW4gZmFjdCBuZXZlciBiZWVuIGRyYXduIGludG8uIFRoaXMgaGFwcGVucyBmcmVxdWVudGx5IHdpdGgKLSAgICAgICAgLy8gU3VyZmFjZVZpZXcgYmVjYXVzZSB0aGUgV2luZG93TWFuYWdlciBjYW4ndCBrbm93IHdoZW4gdGhlIGNsaWVudAotICAgICAgICAvLyBoYXMgZHJhd24gdGhlIGZpcnN0IHRpbWUuCi0KLSAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm90aGluZyB1bmRlciB1cywgd2UgcGFpbnQgdGhlIHNjcmVlbiBpbiBibGFjaywgb3RoZXJ3aXNlCi0gICAgICAgIC8vIHdlIGp1c3Qgc2tpcCB0aGlzIHVwZGF0ZS4KLQotICAgICAgICAvLyBmaWd1cmUgb3V0IGlmIHRoZXJlIGlzIHNvbWV0aGluZyBiZWxvdyB1cwotICAgICAgICBSZWdpb24gdW5kZXI7Ci0gICAgICAgIGNvbnN0IFN1cmZhY2VGbGluZ2VyOjpMYXllclZlY3RvciYgZHJhd2luZ0xheWVycygKLSAgICAgICAgICAgICAgICBtRmxpbmdlci0+bURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOwotICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBkcmF3aW5nTGF5ZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7ICsraSkgewotICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIoZHJhd2luZ0xheWVyc1tpXSk7Ci0gICAgICAgICAgICBpZiAobGF5ZXIuZ2V0KCkgPT0gc3RhdGljX2Nhc3Q8TGF5ZXJCYXNlIGNvbnN0Kj4odGhpcykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB1bmRlci5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG5vdCBldmVyeXRoaW5nIGJlbG93IHVzIGlzIGNvdmVyZWQsIHdlIHBsdWcgdGhlIGhvbGVzIQotICAgICAgICBSZWdpb24gaG9sZXMoY2xpcC5zdWJ0cmFjdCh1bmRlcikpOwotICAgICAgICBpZiAoIWhvbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgY2xlYXJXaXRoT3BlbkdMKGhvbGVzLCAwLCAwLCAwLCAxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFpc1Byb3RlY3RlZCgpKSB7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIG1UZXh0dXJlTmFtZSk7Ci0gICAgICAgIEdMZW51bSBmaWx0ZXIgPSBHTF9ORUFSRVNUOwotICAgICAgICBpZiAoZ2V0RmlsdGVyaW5nKCkgfHwgbmVlZHNGaWx0ZXJpbmcoKSB8fCBpc0ZpeGVkU2l6ZSgpIHx8IGlzQ3JvcHBlZCgpKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB3ZSBjb3VsZCBiZSBtb3JlIHN1YnRsZSB3aXRoIGlzRml4ZWRTaXplKCkKLSAgICAgICAgICAgIGZpbHRlciA9IEdMX0xJTkVBUjsKLSAgICAgICAgfQotICAgICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyKTsKLSAgICAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBHTF9URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlcik7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICAgICAgZ2xMb2FkTWF0cml4ZihtVGV4dHVyZU1hdHJpeCk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICB9IGVsc2UgewotICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1GbGluZ2VyLT5nZXRQcm90ZWN0ZWRUZXhOYW1lKCkpOwotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfVEVYVFVSRSk7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICB9Ci0KLSAgICBkcmF3V2l0aE9wZW5HTChjbGlwKTsKLQotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFX0VYVEVSTkFMX09FUyk7Ci0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotfQotCi0vLyBBcyBkb2N1bWVudGVkIGluIGxpYmhhcmR3YXJlIGhlYWRlciwgZm9ybWF0cyBpbiB0aGUgcmFuZ2UKLS8vIDB4MTAwIC0gMHgxRkYgYXJlIHNwZWNpZmljIHRvIHRoZSBIQUwgaW1wbGVtZW50YXRpb24sIGFuZAotLy8gYXJlIGtub3duIHRvIGhhdmUgbm8gYWxwaGEgY2hhbm5lbAotLy8gVE9ETzogbW92ZSBkZWZpbml0aW9uIGZvciBkZXZpY2Utc3BlY2lmaWMgcmFuZ2UgaW50bwotLy8gaGFyZHdhcmUuaCwgaW5zdGVhZCBvZiB1c2luZyBoYXJkLWNvZGVkIHZhbHVlcyBoZXJlLgotI2RlZmluZSBIQVJEV0FSRV9JU19ERVZJQ0VfRk9STUFUKGYpICgoZikgPj0gMHgxMDAgJiYgKGYpIDw9IDB4MUZGKQotCi1ib29sIExheWVyOjpnZXRPcGFjaXR5Rm9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCkKLXsKLSAgICBpZiAoSEFSRFdBUkVfSVNfREVWSUNFX0ZPUk1BVChmb3JtYXQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBQaXhlbEZvcm1hdEluZm8gaW5mbzsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRQaXhlbEZvcm1hdEluZm8oUGl4ZWxGb3JtYXQoZm9ybWF0KSwgJmluZm8pOwotICAgIC8vIGluIGNhc2Ugb2YgZXJyb3IgKHVua25vd24gZm9ybWF0KSwgd2UgYXNzdW1lIG5vIGJsZW5kaW5nCi0gICAgcmV0dXJuIChlcnIgfHwgaW5mby5oX2FscGhhIDw9IGluZm8ubF9hbHBoYSk7Ci19Ci0KLQotYm9vbCBMYXllcjo6aXNPcGFxdWUoKSBjb25zdAotewotICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYSBidWZmZXIgeWV0LCB3ZSdyZSB0cmFuc2x1Y2VudCByZWdhcmRsZXNzIG9mIHRoZQotICAgIC8vIGxheWVyJ3Mgb3BhcXVlIGZsYWcuCi0gICAgaWYgKG1BY3RpdmVCdWZmZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gaWYgdGhlIGxheWVyIGhhcyB0aGUgb3BhcXVlIGZsYWcsIHRoZW4gd2UncmUgYWx3YXlzIG9wYXF1ZSwKLSAgICAvLyBvdGhlcndpc2Ugd2UgdXNlIHRoZSBjdXJyZW50IGJ1ZmZlcidzIGZvcm1hdC4KLSAgICByZXR1cm4gbU9wYXF1ZUxheWVyIHx8IG1DdXJyZW50T3BhY2l0eTsKLX0KLQotYm9vbCBMYXllcjo6aXNQcm90ZWN0ZWQoKSBjb25zdAotewotICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBhY3RpdmVCdWZmZXIobUFjdGl2ZUJ1ZmZlcik7Ci0gICAgcmV0dXJuIChhY3RpdmVCdWZmZXIgIT0gMCkgJiYKLSAgICAgICAgICAgIChhY3RpdmVCdWZmZXItPmdldFVzYWdlKCkgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCk7Ci19Ci0KLXVpbnQzMl90IExheWVyOjpkb1RyYW5zYWN0aW9uKHVpbnQzMl90IGZsYWdzKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0KLSAgICBjb25zdCBMYXllcjo6U3RhdGUmIGZyb250KGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBjb25zdCBMYXllcjo6U3RhdGUmIHRlbXAoY3VycmVudFN0YXRlKCkpOwotCi0gICAgY29uc3QgYm9vbCBzaXplQ2hhbmdlZCA9IChmcm9udC5yZXF1ZXN0ZWRfdyAhPSB0ZW1wLnJlcXVlc3RlZF93KSB8fAotICAgICAgICAgICAgKGZyb250LnJlcXVlc3RlZF9oICE9IHRlbXAucmVxdWVzdGVkX2gpOwotCi0gICAgaWYgKHNpemVDaGFuZ2VkKSB7Ci0gICAgICAgIC8vIHRoZSBzaXplIGNoYW5nZWQsIHdlIG5lZWQgdG8gYXNrIG91ciBjbGllbnQgdG8gcmVxdWVzdCBhIG5ldyBidWZmZXIKLSAgICAgICAgQUxPR0RfSUYoREVCVUdfUkVTSVpFLAotICAgICAgICAgICAgICAgICJkb1RyYW5zYWN0aW9uOiAiCi0gICAgICAgICAgICAgICAgInJlc2l6ZSAobGF5ZXI9JXApLCByZXF1ZXN0ZWQgKCVkeCVkKSwgZHJhd2luZyAoJWQsJWQpLCAiCi0gICAgICAgICAgICAgICAgInNjYWxpbmdNb2RlPSVkIiwKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIGludCh0ZW1wLnJlcXVlc3RlZF93KSwgaW50KHRlbXAucmVxdWVzdGVkX2gpLAotICAgICAgICAgICAgICAgIGludChmcm9udC5yZXF1ZXN0ZWRfdyksIGludChmcm9udC5yZXF1ZXN0ZWRfaCksCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRTY2FsaW5nTW9kZSk7Ci0KLSAgICAgICAgaWYgKCFpc0ZpeGVkU2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIHdpbGwgbWFrZSBzdXJlIExheWVyQmFzZTo6ZG9UcmFuc2FjdGlvbiBkb2Vzbid0IHVwZGF0ZQotICAgICAgICAgICAgLy8gdGhlIGRyYXdpbmcgc3RhdGUncyBzaXplCi0gICAgICAgICAgICBMYXllcjo6U3RhdGUmIGVkaXREcmF3KG1EcmF3aW5nU3RhdGUpOwotICAgICAgICAgICAgZWRpdERyYXcucmVxdWVzdGVkX3cgPSB0ZW1wLnJlcXVlc3RlZF93OwotICAgICAgICAgICAgZWRpdERyYXcucmVxdWVzdGVkX2ggPSB0ZW1wLnJlcXVlc3RlZF9oOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmVjb3JkIHRoZSBuZXcgc2l6ZSwgZm9ybSB0aGlzIHBvaW50IG9uLCB3aGVuIHRoZSBjbGllbnQgcmVxdWVzdAotICAgICAgICAvLyBhIGJ1ZmZlciwgaXQnbGwgZ2V0IHRoZSBuZXcgc2l6ZS4KLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh0ZW1wLnJlcXVlc3RlZF93LAotICAgICAgICAgICAgICAgIHRlbXAucmVxdWVzdGVkX2gpOwotICAgIH0KLQotICAgIHJldHVybiBMYXllckJhc2U6OmRvVHJhbnNhY3Rpb24oZmxhZ3MpOwotfQotCi1ib29sIExheWVyOjppc0ZpeGVkU2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUN1cnJlbnRTY2FsaW5nTW9kZSAhPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9GUkVFWkU7Ci19Ci0KLWJvb2wgTGF5ZXI6OmlzQ3JvcHBlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gIW1DdXJyZW50Q3JvcC5pc0VtcHR5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHBhZ2VmbGlwIGhhbmRsaW5nLi4uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJvb2wgTGF5ZXI6Om9uUHJlQ29tcG9zaXRpb24oKSB7Ci0gICAgbVJlZnJlc2hQZW5kaW5nID0gZmFsc2U7Ci0gICAgcmV0dXJuIG1RdWV1ZWRGcmFtZXMgPiAwOwotfQotCi12b2lkIExheWVyOjpsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIGlmIChtUXVldWVkRnJhbWVzID4gMCkgewotCi0gICAgICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgY2FsbGVkIHVwZGF0ZVRleEltYWdlKCkgd2l0aG91dCBnb2luZyB0aHJvdWdoCi0gICAgICAgIC8vIGEgY29tcG9zaXRpb24gc3RlcCwgd2UgaGF2ZSB0byBza2lwIHRoaXMgbGF5ZXIgYXQgdGhpcyBwb2ludAotICAgICAgICAvLyBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHVwZGF0ZVRleGltYWdlKCkgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgLy8gY29tcG9zaXRpb25Db21wbGV0ZSgpIGNhbGwuCi0gICAgICAgIC8vIHdlJ2xsIHRyaWdnZXIgYW4gdXBkYXRlIGluIG9uUHJlQ29tcG9zaXRpb24oKS4KLSAgICAgICAgaWYgKG1SZWZyZXNoUGVuZGluZykgewotICAgICAgICAgICAgbVBvc3RlZERpcnR5UmVnaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVJlZnJlc2hQZW5kaW5nID0gdHJ1ZTsKLQotICAgICAgICAvLyBDYXB0dXJlIHRoZSBvbGQgc3RhdGUgb2YgdGhlIGxheWVyIGZvciBjb21wYXJpc29ucyBsYXRlcgotICAgICAgICBjb25zdCBib29sIG9sZE9wYWNpdHkgPSBpc09wYXF1ZSgpOwotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBvbGRBY3RpdmVCdWZmZXIgPSBtQWN0aXZlQnVmZmVyOwotCi0gICAgICAgIC8vIHNpZ25hbCBhbm90aGVyIGV2ZW50IGlmIHdlIGhhdmUgbW9yZSBmcmFtZXMgcGVuZGluZwotICAgICAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZtUXVldWVkRnJhbWVzKSA+IDEpIHsKLSAgICAgICAgICAgIG1GbGluZ2VyLT5zaWduYWxMYXllclVwZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TdXJmYWNlVGV4dHVyZS0+dXBkYXRlVGV4SW1hZ2UoKSA8IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQhCi0gICAgICAgICAgICByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB1cGRhdGUgdGhlIGFjdGl2ZSBidWZmZXIKLSAgICAgICAgbUFjdGl2ZUJ1ZmZlciA9IG1TdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudEJ1ZmZlcigpOwotICAgICAgICBtRnJhbWVMYXRlbmN5TmVlZGVkID0gdHJ1ZTsKLQotICAgICAgICBpZiAob2xkQWN0aXZlQnVmZmVyID09IE5VTEwgJiYgbUFjdGl2ZUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSB3ZSByZWNlaXZlIGEgYnVmZmVyLCB3ZSBuZWVkIHRvIHRyaWdnZXIgYQotICAgICAgICAgICAgLy8gZ2VvbWV0cnkgaW52YWxpZGF0aW9uLgotICAgICAgICAgICAgbUZsaW5nZXItPmludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgUmVjdCBjcm9wKG1TdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudENyb3AoKSk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHRyYW5zZm9ybShtU3VyZmFjZVRleHR1cmUtPmdldEN1cnJlbnRUcmFuc2Zvcm0oKSk7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHNjYWxpbmdNb2RlKG1TdXJmYWNlVGV4dHVyZS0+Z2V0Q3VycmVudFNjYWxpbmdNb2RlKCkpOwotICAgICAgICBpZiAoKGNyb3AgIT0gbUN1cnJlbnRDcm9wKSB8fAotICAgICAgICAgICAgKHRyYW5zZm9ybSAhPSBtQ3VycmVudFRyYW5zZm9ybSkgfHwKLSAgICAgICAgICAgIChzY2FsaW5nTW9kZSAhPSBtQ3VycmVudFNjYWxpbmdNb2RlKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUN1cnJlbnRDcm9wID0gY3JvcDsKLSAgICAgICAgICAgIG1DdXJyZW50VHJhbnNmb3JtID0gdHJhbnNmb3JtOwotICAgICAgICAgICAgbUN1cnJlbnRTY2FsaW5nTW9kZSA9IHNjYWxpbmdNb2RlOwotICAgICAgICAgICAgbUZsaW5nZXItPmludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgR0xmbG9hdCB0ZXh0dXJlTWF0cml4WzE2XTsKLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlLT5nZXRUcmFuc2Zvcm1NYXRyaXgodGV4dHVyZU1hdHJpeCk7Ci0gICAgICAgIGlmIChtZW1jbXAodGV4dHVyZU1hdHJpeCwgbVRleHR1cmVNYXRyaXgsIHNpemVvZih0ZXh0dXJlTWF0cml4KSkpIHsKLSAgICAgICAgICAgIG1lbWNweShtVGV4dHVyZU1hdHJpeCwgdGV4dHVyZU1hdHJpeCwgc2l6ZW9mKHRleHR1cmVNYXRyaXgpKTsKLSAgICAgICAgICAgIG1GbGluZ2VyLT5pbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGJ1ZldpZHRoICA9IG1BY3RpdmVCdWZmZXItPmdldFdpZHRoKCk7Ci0gICAgICAgIHVpbnQzMl90IGJ1ZkhlaWdodCA9IG1BY3RpdmVCdWZmZXItPmdldEhlaWdodCgpOwotICAgICAgICBpZiAob2xkQWN0aXZlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChidWZXaWR0aCAhPSB1aW50MzJfdChvbGRBY3RpdmVCdWZmZXItPndpZHRoKSB8fAotICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCAhPSB1aW50MzJfdChvbGRBY3RpdmVCdWZmZXItPmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBtRmxpbmdlci0+aW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtQ3VycmVudE9wYWNpdHkgPSBnZXRPcGFjaXR5Rm9yRm9ybWF0KG1BY3RpdmVCdWZmZXItPmZvcm1hdCk7Ci0gICAgICAgIGlmIChvbGRPcGFjaXR5ICE9IGlzT3BhcXVlKCkpIHsKLSAgICAgICAgICAgIHJlY29tcHV0ZVZpc2libGVSZWdpb25zID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFX0VYVEVSTkFMX09FUywgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKLQotICAgICAgICAvLyB1cGRhdGUgdGhlIGxheWVyIHNpemUgaWYgbmVlZGVkCi0gICAgICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgZnJvbnQoZHJhd2luZ1N0YXRlKCkpOwotCi0gICAgICAgIC8vIEZJWE1FOiBtUG9zdGVkRGlydHlSZWdpb24gPSBkaXJ0eSAmIGJvdW5kcwotICAgICAgICBtUG9zdGVkRGlydHlSZWdpb24uc2V0KGZyb250LncsIGZyb250LmgpOwotCi0gICAgICAgIGlmICgoZnJvbnQudyAhPSBmcm9udC5yZXF1ZXN0ZWRfdykgfHwKLSAgICAgICAgICAgIChmcm9udC5oICE9IGZyb250LnJlcXVlc3RlZF9oKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSByZWNlaXZlZCBhIGJ1ZmZlciBvZiB0aGUgcmlnaHQgc2l6ZQotICAgICAgICAgICAgLy8gKFRha2UgdGhlIGJ1ZmZlcidzIG9yaWVudGF0aW9uIGludG8gYWNjb3VudCkKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFRyYW5zZm9ybSAmIFRyYW5zZm9ybTo6Uk9UXzkwKSB7Ci0gICAgICAgICAgICAgICAgc3dhcChidWZXaWR0aCwgYnVmSGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzRml4ZWRTaXplKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGJ1ZldpZHRoID09IGZyb250LnJlcXVlc3RlZF93ICYmCi0gICAgICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9PSBmcm9udC5yZXF1ZXN0ZWRfaCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSGVyZSB3ZSBwcmV0ZW5kIHRoZSB0cmFuc2FjdGlvbiBoYXBwZW5lZCBieSB1cGRhdGluZyB0aGUKLSAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGFuZCBkcmF3aW5nIHN0YXRlcy4gRHJhd2luZyBzdGF0ZSBpcyBvbmx5IGFjY2Vzc2VkCi0gICAgICAgICAgICAgICAgLy8gaW4gdGhpcyB0aHJlYWQsIG5vIG5lZWQgdG8gaGF2ZSBpdCBsb2NrZWQKLSAgICAgICAgICAgICAgICBMYXllcjo6U3RhdGUmIGVkaXREcmF3KG1EcmF3aW5nU3RhdGUpOwotICAgICAgICAgICAgICAgIGVkaXREcmF3LncgPSBlZGl0RHJhdy5yZXF1ZXN0ZWRfdzsKLSAgICAgICAgICAgICAgICBlZGl0RHJhdy5oID0gZWRpdERyYXcucmVxdWVzdGVkX2g7Ci0KLSAgICAgICAgICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IHN0YXRlIHNvIHRoYXQgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAvLyBlbmQtdXAgZG9pbmcgdG9vIG11Y2ggd29yayBkdXJpbmcgdGhlIG5leHQgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICAgICAgLy8gTk9URTogV2UgYWN0dWFsbHkgZG9uJ3QgbmVlZCBob2xkIHRoZSB0cmFuc2FjdGlvbiBsb2NrIGhlcmUKLSAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIFN0YXRlOjp3IGFuZCBTdGF0ZTo6aCBhcmUgb25seSBhY2Nlc3NlZCBmcm9tCi0gICAgICAgICAgICAgICAgLy8gdGhpcyB0aHJlYWQKLSAgICAgICAgICAgICAgICBMYXllcjo6U3RhdGUmIGVkaXRUZW1wKGN1cnJlbnRTdGF0ZSgpKTsKLSAgICAgICAgICAgICAgICBlZGl0VGVtcC53ID0gZWRpdERyYXcudzsKLSAgICAgICAgICAgICAgICBlZGl0VGVtcC5oID0gZWRpdERyYXcuaDsKLQotICAgICAgICAgICAgICAgIC8vIHJlY29tcHV0ZSB2aXNpYmxlIHJlZ2lvbgotICAgICAgICAgICAgICAgIHJlY29tcHV0ZVZpc2libGVSZWdpb25zID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR0RfSUYoREVCVUdfUkVTSVpFLAotICAgICAgICAgICAgICAgICAgICAibG9ja1BhZ2VGbGlwIDogIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgIChsYXllcj0lcCksIGJ1ZmZlciAoJXV4JXUsIHRyPSUwMngpLCAiCi0gICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWQgKCVkeCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZldpZHRoLCBidWZIZWlnaHQsIG1DdXJyZW50VHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICBmcm9udC5yZXF1ZXN0ZWRfdywgZnJvbnQucmVxdWVzdGVkX2gpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExheWVyOjp1bmxvY2tQYWdlRmxpcCgKLSAgICAgICAgY29uc3QgVHJhbnNmb3JtJiBwbGFuZVRyYW5zZm9ybSwgUmVnaW9uJiBvdXREaXJ0eVJlZ2lvbikKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotCi0gICAgUmVnaW9uIHBvc3RlZFJlZ2lvbihtUG9zdGVkRGlydHlSZWdpb24pOwotICAgIGlmICghcG9zdGVkUmVnaW9uLmlzRW1wdHkoKSkgewotICAgICAgICBtUG9zdGVkRGlydHlSZWdpb24uY2xlYXIoKTsKLSAgICAgICAgaWYgKCF2aXNpYmxlUmVnaW9uU2NyZWVuLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gVGhlIGRpcnR5IHJlZ2lvbiBpcyBnaXZlbiBpbiB0aGUgbGF5ZXIncyBjb29yZGluYXRlIHNwYWNlCi0gICAgICAgICAgICAvLyB0cmFuc2Zvcm0gdGhlIGRpcnR5IHJlZ2lvbiBieSB0aGUgc3VyZmFjZSdzIHRyYW5zZm9ybWF0aW9uCi0gICAgICAgICAgICAvLyBhbmQgdGhlIGdsb2JhbCB0cmFuc2Zvcm1hdGlvbi4KLSAgICAgICAgICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0gICAgICAgICAgICBjb25zdCBUcmFuc2Zvcm0gdHIocGxhbmVUcmFuc2Zvcm0gKiBzLnRyYW5zZm9ybSk7Ci0gICAgICAgICAgICBwb3N0ZWRSZWdpb24gPSB0ci50cmFuc2Zvcm0ocG9zdGVkUmVnaW9uKTsKLQotICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGRpcnR5IHJlZ2lvbiBpcyBpbiBzY3JlZW4gc3BhY2UuCi0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBjb25zdHJhaW5lZCBieSB0aGUgdmlzaWJsZSByZWdpb24gKHdoaWNoCi0gICAgICAgICAgICAvLyBpcyBpbiBzY3JlZW4gc3BhY2UgYXMgd2VsbCkuCi0gICAgICAgICAgICBwb3N0ZWRSZWdpb24uYW5kU2VsZih2aXNpYmxlUmVnaW9uU2NyZWVuKTsKLSAgICAgICAgICAgIG91dERpcnR5UmVnaW9uLm9yU2VsZihwb3N0ZWRSZWdpb24pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExheWVyOjpkdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3QKLXsKLSAgICBMYXllckJhc2VDbGllbnQ6OmR1bXAocmVzdWx0LCBidWZmZXIsIFNJWkUpOwotCi0gICAgc3A8Y29uc3QgR3JhcGhpY0J1ZmZlcj4gYnVmMChtQWN0aXZlQnVmZmVyKTsKLSAgICB1aW50MzJfdCB3MD0wLCBoMD0wLCBzMD0wLCBmMD0wOwotICAgIGlmIChidWYwICE9IDApIHsKLSAgICAgICAgdzAgPSBidWYwLT5nZXRXaWR0aCgpOwotICAgICAgICBoMCA9IGJ1ZjAtPmdldEhlaWdodCgpOwotICAgICAgICBzMCA9IGJ1ZjAtPmdldFN0cmlkZSgpOwotICAgICAgICBmMCA9IGJ1ZjAtPmZvcm1hdDsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgIiAgICAgICIKLSAgICAgICAgICAgICJmb3JtYXQ9JTJkLCBhY3RpdmVCdWZmZXI9WyU0dXglNHU6JTR1LCUzWF0sIgotICAgICAgICAgICAgIiB0cmFuc2Zvcm0taGludD0weCUwMngsIHF1ZXVlZC1mcmFtZXM9JWQsIG1SZWZyZXNoUGVuZGluZz0lZFxuIiwKLSAgICAgICAgICAgIG1Gb3JtYXQsIHcwLCBoMCwgczAsZjAsCi0gICAgICAgICAgICBnZXRUcmFuc2Zvcm1IaW50KCksIG1RdWV1ZWRGcmFtZXMsIG1SZWZyZXNoUGVuZGluZyk7Ci0KLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBpZiAobVN1cmZhY2VUZXh0dXJlICE9IDApIHsKLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlLT5kdW1wKHJlc3VsdCwgIiAgICAgICAgICAgICIsIGJ1ZmZlciwgU0laRSk7Ci0gICAgfQotfQotCi12b2lkIExheWVyOjpkdW1wU3RhdHMoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIExheWVyQmFzZUNsaWVudDo6ZHVtcFN0YXRzKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKLSAgICBjb25zdCBzaXplX3QgbyA9IG1GcmFtZUxhdGVuY3lPZmZzZXQ7Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IG5zZWNzX3QgcGVyaW9kID0gaHcuZ2V0UmVmcmVzaFBlcmlvZCgpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVsbGRcbiIsIHBlcmlvZCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTwxMjggOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gKG8raSkgJSAxMjg7Ci0gICAgICAgIGNvbnN0IG5zZWNzX3QgdGltZV9hcHAgICA9IG1GcmFtZVN0YXRzW2luZGV4XS50aW1lc3RhbXA7Ci0gICAgICAgIGNvbnN0IG5zZWNzX3QgdGltZV9zZXQgICA9IG1GcmFtZVN0YXRzW2luZGV4XS5zZXQ7Ci0gICAgICAgIGNvbnN0IG5zZWNzX3QgdGltZV92c3luYyA9IG1GcmFtZVN0YXRzW2luZGV4XS52c3luYzsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWxsZFx0JWxsZFx0JWxsZFxuIiwKLSAgICAgICAgICAgICAgICB0aW1lX2FwcCwKLSAgICAgICAgICAgICAgICB0aW1lX3ZzeW5jLAotICAgICAgICAgICAgICAgIHRpbWVfc2V0KTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLX0KLQotdm9pZCBMYXllcjo6Y2xlYXJTdGF0cygpCi17Ci0gICAgTGF5ZXJCYXNlQ2xpZW50OjpjbGVhclN0YXRzKCk7Ci0gICAgbWVtc2V0KG1GcmFtZVN0YXRzLCAwLCBzaXplb2YobUZyYW1lU3RhdHMpKTsKLX0KLQotdWludDMyX3QgTGF5ZXI6OmdldEVmZmVjdGl2ZVVzYWdlKHVpbnQzMl90IHVzYWdlKSBjb25zdAotewotICAgIC8vIFRPRE86IHNob3VsZCB3ZSBkbyBzb21ldGhpbmcgc3BlY2lhbCBpZiBtU2VjdXJlIGlzIHNldD8KLSAgICBpZiAobVByb3RlY3RlZEJ5QXBwKSB7Ci0gICAgICAgIC8vIG5lZWQgYSBoYXJkd2FyZS1wcm90ZWN0ZWQgcGF0aCB0byBleHRlcm5hbCB2aWRlbyBzaW5rCi0gICAgICAgIHVzYWdlIHw9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX1BST1RFQ1RFRDsKLSAgICB9Ci0gICAgdXNhZ2UgfD0gR3JhcGhpY0J1ZmZlcjo6VVNBR0VfSFdfQ09NUE9TRVI7Ci0gICAgcmV0dXJuIHVzYWdlOwotfQotCi11aW50MzJfdCBMYXllcjo6Z2V0VHJhbnNmb3JtSGludCgpIGNvbnN0IHsKLSAgICB1aW50MzJfdCBvcmllbnRhdGlvbiA9IDA7Ci0gICAgaWYgKCFtRmxpbmdlci0+bURlYnVnRGlzYWJsZVRyYW5zZm9ybUhpbnQpIHsKLSAgICAgICAgb3JpZW50YXRpb24gPSBnZXRQbGFuZU9yaWVudGF0aW9uKCk7Ci0gICAgICAgIGlmIChvcmllbnRhdGlvbiAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIG9yaWVudGF0aW9uID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb3JpZW50YXRpb247Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1MDhjMi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX0xBWUVSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VUZXh0dXJlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotI2luY2x1ZGUgPEVHTC9lZ2wuaD4KLSNpbmNsdWRlIDxFR0wvZWdsZXh0Lmg+Ci0jaW5jbHVkZSA8R0xFUy9nbC5oPgotI2luY2x1ZGUgPEdMRVMvZ2xleHQuaD4KLQotI2luY2x1ZGUgIkxheWVyQmFzZS5oIgotI2luY2x1ZGUgIlN1cmZhY2VUZXh0dXJlTGF5ZXIuaCIKLSNpbmNsdWRlICJUcmFuc2Zvcm0uaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ2xpZW50OwotY2xhc3MgR0xFeHRlbnNpb25zOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTGF5ZXIgOiBwdWJsaWMgTGF5ZXJCYXNlQ2xpZW50Ci17Ci1wdWJsaWM6Ci0gICAgICAgICAgICBMYXllcihTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCk7Ci0KLSAgICB2aXJ0dWFsIH5MYXllcigpOwotCi0gICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRUeXBlSWQoKSBjb25zdCB7IHJldHVybiAiTGF5ZXIiOyB9Ci0KLSAgICAvLyB0aGUgdGhpcyBsYXllcidzIHNpemUgYW5kIGZvcm1hdAotICAgIHN0YXR1c190IHNldEJ1ZmZlcnModWludDMyX3QgdywgdWludDMyX3QgaCwgCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IGZsYWdzPTApOwotCi0gICAgYm9vbCBpc0ZpeGVkU2l6ZSgpIGNvbnN0OwotCi0gICAgLy8gTGF5ZXJCYXNlIGludGVyZmFjZQotICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uRHJhdyhjb25zdCBSZWdpb24mIGNsaXApIGNvbnN0OwotICAgIHZpcnR1YWwgdWludDMyX3QgZG9UcmFuc2FjdGlvbih1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzKTsKLSAgICB2aXJ0dWFsIHZvaWQgbG9ja1BhZ2VGbGlwKGJvb2wmIHJlY29tcHV0ZVZpc2libGVSZWdpb25zKTsKLSAgICB2aXJ0dWFsIHZvaWQgdW5sb2NrUGFnZUZsaXAoY29uc3QgVHJhbnNmb3JtJiBwbGFuZVRyYW5zZm9ybSwgUmVnaW9uJiBvdXREaXJ0eVJlZ2lvbik7Ci0gICAgdmlydHVhbCBib29sIGlzT3BhcXVlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIG5lZWRzRGl0aGVyaW5nKCkgY29uc3QgICAgIHsgcmV0dXJuIG1OZWVkc0RpdGhlcmluZzsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1NlY3VyZSgpIGNvbnN0ICAgICAgICAgICB7IHJldHVybiBtU2VjdXJlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzUHJvdGVjdGVkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIG9uUmVtb3ZlZCgpOwotICAgIHZpcnR1YWwgc3A8TGF5ZXI+IGdldExheWVyKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxMYXllcio+KHRoaXMpOyB9Ci0gICAgdmlydHVhbCB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nOCYgbmFtZSk7Ci0KLSAgICAvLyBMYXllckJhc2VDbGllbnQgaW50ZXJmYWNlCi0gICAgdmlydHVhbCB3cDxJQmluZGVyPiBnZXRTdXJmYWNlVGV4dHVyZUJpbmRlcigpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIG9uTGF5ZXJEaXNwbGF5ZWQoKTsKLSAgICB2aXJ0dWFsIGJvb2wgb25QcmVDb21wb3NpdGlvbigpOwotCi0gICAgLy8gb25seSBmb3IgZGVidWdnaW5nCi0gICAgaW5saW5lIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBnZXRBY3RpdmVCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlQnVmZmVyOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogc2NyYXRjaCwgc2l6ZV90IHNpemUpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBkdW1wU3RhdHMoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJTdGF0cygpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBTdXJmYWNlVGV4dHVyZUxheWVyOwotICAgIHZvaWQgb25GcmFtZVF1ZXVlZCgpOwotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2U+IGNyZWF0ZVN1cmZhY2UoKTsKLSAgICB1aW50MzJfdCBnZXRFZmZlY3RpdmVVc2FnZSh1aW50MzJfdCB1c2FnZSkgY29uc3Q7Ci0gICAgdWludDMyX3QgZ2V0VHJhbnNmb3JtSGludCgpIGNvbnN0OwotICAgIGJvb2wgaXNDcm9wcGVkKCkgY29uc3Q7Ci0gICAgc3RhdGljIGJvb2wgZ2V0T3BhY2l0eUZvckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIGNvbnN0YW50cwotICAgIHNwPFN1cmZhY2VUZXh0dXJlTGF5ZXI+IG1TdXJmYWNlVGV4dHVyZTsKLSAgICBHTHVpbnQgbVRleHR1cmVOYW1lOwotCi0gICAgLy8gdGhyZWFkLXNhZmUKLSAgICB2b2xhdGlsZSBpbnQzMl90IG1RdWV1ZWRGcmFtZXM7Ci0KLSAgICAvLyBtYWluIHRocmVhZAotICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1BY3RpdmVCdWZmZXI7Ci0gICAgR0xmbG9hdCBtVGV4dHVyZU1hdHJpeFsxNl07Ci0gICAgUmVjdCBtQ3VycmVudENyb3A7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRUcmFuc2Zvcm07Ci0gICAgdWludDMyX3QgbUN1cnJlbnRTY2FsaW5nTW9kZTsKLSAgICBib29sIG1DdXJyZW50T3BhY2l0eTsKLSAgICBib29sIG1SZWZyZXNoUGVuZGluZzsKLSAgICBib29sIG1GcmFtZUxhdGVuY3lOZWVkZWQ7Ci0gICAgaW50IG1GcmFtZUxhdGVuY3lPZmZzZXQ7Ci0KLSAgICBzdHJ1Y3QgU3RhdGlzdGljcyB7Ci0gICAgICAgIFN0YXRpc3RpY3MoKSA6IHRpbWVzdGFtcCgwKSwgc2V0KDApLCB2c3luYygwKSB7IH0KLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXA7ICAvLyBidWZmZXIgdGltZXN0YW1wCi0gICAgICAgIG5zZWNzX3Qgc2V0OyAgICAgICAgLy8gYnVmZmVyIGRpc3BsYXllZCB0aW1lc3RhbXAKLSAgICAgICAgbnNlY3NfdCB2c3luYzsgICAgICAvLyB2c3luYyBpbW1lZGlhdGVseSBiZWZvcmUgc2V0Ci0gICAgfTsKLQotICAgIC8vIHByb3RlY3RlZCBieSBtTG9jawotICAgIFN0YXRpc3RpY3MgbUZyYW1lU3RhdHNbMTI4XTsKLQotICAgIC8vIGNvbnN0YW50cwotICAgIFBpeGVsRm9ybWF0IG1Gb3JtYXQ7Ci0gICAgY29uc3QgR0xFeHRlbnNpb25zJiBtR0xFeHRlbnNpb25zOwotICAgIGJvb2wgbU9wYXF1ZUxheWVyOwotICAgIGJvb2wgbU5lZWRzRGl0aGVyaW5nOwotCi0gICAgLy8gcGFnZS1mbGlwIHRocmVhZCAoY3VycmVudGx5IG1haW4gdGhyZWFkKQotICAgIGJvb2wgbVNlY3VyZTsgICAgICAgICAvLyBubyBzY3JlZW5zaG90cwotICAgIGJvb2wgbVByb3RlY3RlZEJ5QXBwOyAvLyBhcHBsaWNhdGlvbiByZXF1aXJlcyBwcm90ZWN0ZWQgcGF0aCB0byBleHRlcm5hbCBzaW5rCi0gICAgUmVnaW9uIG1Qb3N0ZWREaXJ0eVJlZ2lvbjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9MQVlFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2NDAwMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDxHTEVTL2dsLmg+Ci0jaW5jbHVkZSA8R0xFUy9nbGV4dC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgImNsei5oIgotI2luY2x1ZGUgIkxheWVyQmFzZS5oIgotI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0jaW5jbHVkZSAiRGlzcGxheUhhcmR3YXJlL0Rpc3BsYXlIYXJkd2FyZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQzMl90IExheWVyQmFzZTo6c1NlcXVlbmNlID0gMTsKLQotTGF5ZXJCYXNlOjpMYXllckJhc2UoU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5KQotICAgIDogZHB5KGRpc3BsYXkpLCBjb250ZW50RGlydHkoZmFsc2UpLAotICAgICAgc2VxdWVuY2UodWludDMyX3QoYW5kcm9pZF9hdG9taWNfaW5jKCZzU2VxdWVuY2UpKSksCi0gICAgICBtRmxpbmdlcihmbGluZ2VyKSwgbUZpbHRlcmluZyhmYWxzZSksCi0gICAgICBtTmVlZHNGaWx0ZXJpbmcoZmFsc2UpLCBtSW5PdmVybGF5KGZhbHNlKSwKLSAgICAgIG1PcmllbnRhdGlvbigwKSwKLSAgICAgIG1QbGFuZU9yaWVudGF0aW9uKDApLAotICAgICAgbVRyYW5zYWN0aW9uRmxhZ3MoMCksCi0gICAgICBtUHJlbXVsdGlwbGllZEFscGhhKHRydWUpLCBtTmFtZSgidW5uYW1lZCIpLCBtRGVidWcoZmFsc2UpCi17Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhmbGluZ2VyLT5ncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIG1GbGFncyA9IGh3LmdldEZsYWdzKCk7Ci19Ci0KLUxheWVyQmFzZTo6fkxheWVyQmFzZSgpCi17Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpzZXROYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIHsKLSAgICBtTmFtZSA9IG5hbWU7Ci19Ci0KLVN0cmluZzggTGF5ZXJCYXNlOjpnZXROYW1lKCkgY29uc3QgewotICAgIHJldHVybiBtTmFtZTsKLX0KLQotY29uc3QgR3JhcGhpY1BsYW5lJiBMYXllckJhc2U6OmdyYXBoaWNQbGFuZShpbnQgZHB5KSBjb25zdAoteyAKLSAgICByZXR1cm4gbUZsaW5nZXItPmdyYXBoaWNQbGFuZShkcHkpOwotfQotCi1HcmFwaGljUGxhbmUmIExheWVyQmFzZTo6Z3JhcGhpY1BsYW5lKGludCBkcHkpCi17Ci0gICAgcmV0dXJuIG1GbGluZ2VyLT5ncmFwaGljUGxhbmUoZHB5KTsgCi19Ci0KLXZvaWQgTGF5ZXJCYXNlOjppbml0U3RhdGVzKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzKQotewotICAgIHVpbnQzMl90IGxheWVyRmxhZ3MgPSAwOwotICAgIGlmIChmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVIaWRkZW4pCi0gICAgICAgIGxheWVyRmxhZ3MgPSBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW47Ci0KLSAgICBpZiAoZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplTm9uUHJlbXVsdGlwbGllZCkKLSAgICAgICAgbVByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlOwotCi0gICAgbUN1cnJlbnRTdGF0ZS56ICAgICAgICAgICAgID0gMDsKLSAgICBtQ3VycmVudFN0YXRlLncgICAgICAgICAgICAgPSB3OwotICAgIG1DdXJyZW50U3RhdGUuaCAgICAgICAgICAgICA9IGg7Ci0gICAgbUN1cnJlbnRTdGF0ZS5yZXF1ZXN0ZWRfdyAgID0gdzsKLSAgICBtQ3VycmVudFN0YXRlLnJlcXVlc3RlZF9oICAgPSBoOwotICAgIG1DdXJyZW50U3RhdGUuYWxwaGEgICAgICAgICA9IDB4RkY7Ci0gICAgbUN1cnJlbnRTdGF0ZS5mbGFncyAgICAgICAgID0gbGF5ZXJGbGFnczsKLSAgICBtQ3VycmVudFN0YXRlLnNlcXVlbmNlICAgICAgPSAwOwotICAgIG1DdXJyZW50U3RhdGUudHJhbnNmb3JtLnNldCgwLCAwKTsKLQotICAgIC8vIGRyYXdpbmcgc3RhdGUgJiBjdXJyZW50IHN0YXRlIGFyZSBpZGVudGljYWwKLSAgICBtRHJhd2luZ1N0YXRlID0gbUN1cnJlbnRTdGF0ZTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmNvbW1pdFRyYW5zYWN0aW9uKCkgewotICAgIG1EcmF3aW5nU3RhdGUgPSBtQ3VycmVudFN0YXRlOwotfQotdm9pZCBMYXllckJhc2U6OmZvcmNlVmlzaWJpbGl0eVRyYW5zYWN0aW9uKCkgewotICAgIC8vIHRoaXMgY2FuIGJlIGNhbGxlZCB3aXRob3V0IFN1cmZhY2VGbGluZ2VyLm1TdGF0ZUxvY2ssIGJ1dCBpZiB3ZQotICAgIC8vIGNhbiBhdG9taWNhbGx5IGluY3JlbWVudCB0aGUgc2VxdWVuY2UgbnVtYmVyLCBpdCBkb2Vzbid0IG1hdHRlci4KLSAgICBhbmRyb2lkX2F0b21pY19pbmMoJm1DdXJyZW50U3RhdGUuc2VxdWVuY2UpOwotICAgIHJlcXVlc3RUcmFuc2FjdGlvbigpOwotfQotYm9vbCBMYXllckJhc2U6OnJlcXVlc3RUcmFuc2FjdGlvbigpIHsKLSAgICBpbnQzMl90IG9sZCA9IHNldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYW5zYWN0aW9uTmVlZGVkKTsKLSAgICByZXR1cm4gKChvbGQgJiBlVHJhbnNhY3Rpb25OZWVkZWQpID09IDApOwotfQotdWludDMyX3QgTGF5ZXJCYXNlOjpnZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FuZCh+ZmxhZ3MsICZtVHJhbnNhY3Rpb25GbGFncykgJiBmbGFnczsKLX0KLXVpbnQzMl90IExheWVyQmFzZTo6c2V0VHJhbnNhY3Rpb25GbGFncyh1aW50MzJfdCBmbGFncykgewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19vcihmbGFncywgJm1UcmFuc2FjdGlvbkZsYWdzKTsKLX0KLQotYm9vbCBMYXllckJhc2U6OnNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpIHsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZS50cmFuc2Zvcm0udHgoKSA9PSB4ICYmIG1DdXJyZW50U3RhdGUudHJhbnNmb3JtLnR5KCkgPT0geSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1DdXJyZW50U3RhdGUuc2VxdWVuY2UrKzsKLSAgICBtQ3VycmVudFN0YXRlLnRyYW5zZm9ybS5zZXQoeCwgeSk7Ci0gICAgcmVxdWVzdFRyYW5zYWN0aW9uKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIExheWVyQmFzZTo6c2V0TGF5ZXIodWludDMyX3QgeikgewotICAgIGlmIChtQ3VycmVudFN0YXRlLnogPT0geikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1DdXJyZW50U3RhdGUuc2VxdWVuY2UrKzsKLSAgICBtQ3VycmVudFN0YXRlLnogPSB6OwotICAgIHJlcXVlc3RUcmFuc2FjdGlvbigpOwotICAgIHJldHVybiB0cnVlOwotfQotYm9vbCBMYXllckJhc2U6OnNldFNpemUodWludDMyX3QgdywgdWludDMyX3QgaCkgewotICAgIGlmIChtQ3VycmVudFN0YXRlLnJlcXVlc3RlZF93ID09IHcgJiYgbUN1cnJlbnRTdGF0ZS5yZXF1ZXN0ZWRfaCA9PSBoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbUN1cnJlbnRTdGF0ZS5yZXF1ZXN0ZWRfdyA9IHc7Ci0gICAgbUN1cnJlbnRTdGF0ZS5yZXF1ZXN0ZWRfaCA9IGg7Ci0gICAgcmVxdWVzdFRyYW5zYWN0aW9uKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIExheWVyQmFzZTo6c2V0QWxwaGEodWludDhfdCBhbHBoYSkgewotICAgIGlmIChtQ3VycmVudFN0YXRlLmFscGhhID09IGFscGhhKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSsrOwotICAgIG1DdXJyZW50U3RhdGUuYWxwaGEgPSBhbHBoYTsKLSAgICByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgTGF5ZXJCYXNlOjpzZXRNYXRyaXgoY29uc3QgbGF5ZXJfc3RhdGVfdDo6bWF0cml4MjJfdCYgbWF0cml4KSB7Ci0gICAgbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSsrOwotICAgIG1DdXJyZW50U3RhdGUudHJhbnNmb3JtLnNldCgKLSAgICAgICAgICAgIG1hdHJpeC5kc2R4LCBtYXRyaXguZHNkeSwgbWF0cml4LmR0ZHgsIG1hdHJpeC5kdGR5KTsKLSAgICByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgTGF5ZXJCYXNlOjpzZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQoY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudCkgewotICAgIG1DdXJyZW50U3RhdGUuc2VxdWVuY2UrKzsKLSAgICBtQ3VycmVudFN0YXRlLnRyYW5zcGFyZW50UmVnaW9uID0gdHJhbnNwYXJlbnQ7Ci0gICAgcmVxdWVzdFRyYW5zYWN0aW9uKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIExheWVyQmFzZTo6c2V0RmxhZ3ModWludDhfdCBmbGFncywgdWludDhfdCBtYXNrKSB7Ci0gICAgY29uc3QgdWludDMyX3QgbmV3RmxhZ3MgPSAobUN1cnJlbnRTdGF0ZS5mbGFncyAmIH5tYXNrKSB8IChmbGFncyAmIG1hc2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlLmZsYWdzID09IG5ld0ZsYWdzKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbUN1cnJlbnRTdGF0ZS5zZXF1ZW5jZSsrOwotICAgIG1DdXJyZW50U3RhdGUuZmxhZ3MgPSBuZXdGbGFnczsKLSAgICByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotUmVjdCBMYXllckJhc2U6OnZpc2libGVCb3VuZHMoKSBjb25zdAotewotICAgIHJldHVybiBtVHJhbnNmb3JtZWRCb3VuZHM7Ci19ICAgICAgCi0KLXZvaWQgTGF5ZXJCYXNlOjpzZXRWaXNpYmxlUmVnaW9uKGNvbnN0IFJlZ2lvbiYgdmlzaWJsZVJlZ2lvbikgewotICAgIC8vIGFsd2F5cyBjYWxsZWQgZnJvbSBtYWluIHRocmVhZAotICAgIHZpc2libGVSZWdpb25TY3JlZW4gPSB2aXNpYmxlUmVnaW9uOwotfQotCi12b2lkIExheWVyQmFzZTo6c2V0Q292ZXJlZFJlZ2lvbihjb25zdCBSZWdpb24mIGNvdmVyZWRSZWdpb24pIHsKLSAgICAvLyBhbHdheXMgY2FsbGVkIGZyb20gbWFpbiB0aHJlYWQKLSAgICBjb3ZlcmVkUmVnaW9uU2NyZWVuID0gY292ZXJlZFJlZ2lvbjsKLX0KLQotdWludDMyX3QgTGF5ZXJCYXNlOjpkb1RyYW5zYWN0aW9uKHVpbnQzMl90IGZsYWdzKQotewotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgZnJvbnQoZHJhd2luZ1N0YXRlKCkpOwotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgdGVtcChjdXJyZW50U3RhdGUoKSk7Ci0KLSAgICBpZiAoKGZyb250LnJlcXVlc3RlZF93ICE9IHRlbXAucmVxdWVzdGVkX3cpIHx8Ci0gICAgICAgIChmcm9udC5yZXF1ZXN0ZWRfaCAhPSB0ZW1wLnJlcXVlc3RlZF9oKSkgIHsKLSAgICAgICAgLy8gcmVzaXplIHRoZSBsYXllciwgc2V0IHRoZSBwaHlzaWNhbCBzaXplIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZQotICAgICAgICBMYXllcjo6U3RhdGUmIGVkaXRUZW1wKGN1cnJlbnRTdGF0ZSgpKTsKLSAgICAgICAgZWRpdFRlbXAudyA9IHRlbXAucmVxdWVzdGVkX3c7Ci0gICAgICAgIGVkaXRUZW1wLmggPSB0ZW1wLnJlcXVlc3RlZF9oOwotICAgIH0KLQotICAgIGlmICgoZnJvbnQudyAhPSB0ZW1wLncpIHx8IChmcm9udC5oICE9IHRlbXAuaCkpIHsKLSAgICAgICAgLy8gaW52YWxpZGF0ZSBhbmQgcmVjb21wdXRlIHRoZSB2aXNpYmxlIHJlZ2lvbnMgaWYgbmVlZGVkCi0gICAgICAgIGZsYWdzIHw9IExheWVyOjplVmlzaWJsZVJlZ2lvbjsKLSAgICB9Ci0KLSAgICBpZiAodGVtcC5zZXF1ZW5jZSAhPSBmcm9udC5zZXF1ZW5jZSkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIGFuZCByZWNvbXB1dGUgdGhlIHZpc2libGUgcmVnaW9ucyBpZiBuZWVkZWQKLSAgICAgICAgZmxhZ3MgfD0gZVZpc2libGVSZWdpb247Ci0gICAgICAgIHRoaXMtPmNvbnRlbnREaXJ0eSA9IHRydWU7Ci0KLSAgICAgICAgLy8gd2UgbWF5IHVzZSBsaW5lYXIgZmlsdGVyaW5nLCBpZiB0aGUgbWF0cml4IHNjYWxlcyB1cwotICAgICAgICBjb25zdCB1aW50OF90IHR5cGUgPSB0ZW1wLnRyYW5zZm9ybS5nZXRUeXBlKCk7Ci0gICAgICAgIG1OZWVkc0ZpbHRlcmluZyA9ICghdGVtcC50cmFuc2Zvcm0ucHJlc2VydmVSZWN0cygpIHx8Ci0gICAgICAgICAgICAgICAgKHR5cGUgPj0gVHJhbnNmb3JtOjpTQ0FMRSkpOwotICAgIH0KLQotICAgIC8vIENvbW1pdCB0aGUgdHJhbnNhY3Rpb24KLSAgICBjb21taXRUcmFuc2FjdGlvbigpOwotICAgIHJldHVybiBmbGFnczsKLX0KLQotdm9pZCBMYXllckJhc2U6OnZhbGlkYXRlVmlzaWJpbGl0eShjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtKQotewotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0gICAgY29uc3QgVHJhbnNmb3JtIHRyKHBsYW5lVHJhbnNmb3JtICogcy50cmFuc2Zvcm0pOwotICAgIGNvbnN0IGJvb2wgdHJhbnNmb3JtZWQgPSB0ci50cmFuc2Zvcm1lZCgpOwotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCB1aW50MzJfdCBod19oID0gaHcuZ2V0SGVpZ2h0KCk7Ci0KLSAgICB1aW50MzJfdCB3ID0gcy53OwotICAgIHVpbnQzMl90IGggPSBzLmg7ICAgIAotICAgIHRyLnRyYW5zZm9ybShtVmVydGljZXNbMF0sIDAsIDApOwotICAgIHRyLnRyYW5zZm9ybShtVmVydGljZXNbMV0sIDAsIGgpOwotICAgIHRyLnRyYW5zZm9ybShtVmVydGljZXNbMl0sIHcsIGgpOwotICAgIHRyLnRyYW5zZm9ybShtVmVydGljZXNbM10sIHcsIDApOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8NCA7IGkrKykKLSAgICAgICAgbVZlcnRpY2VzW2ldWzFdID0gaHdfaCAtIG1WZXJ0aWNlc1tpXVsxXTsKLQotICAgIGlmIChDQ19VTkxJS0VMWSh0cmFuc2Zvcm1lZCkpIHsKLSAgICAgICAgLy8gTk9URTogaGVyZSB3ZSBjb3VsZCBhbHNvIHB1bnQgaWYgd2UgaGF2ZSB0b28gbWFueSByZWN0YW5nbGVzCi0gICAgICAgIC8vIGluIHRoZSB0cmFuc3BhcmVudCByZWdpb24KLSAgICAgICAgaWYgKHRyLnByZXNlcnZlUmVjdHMoKSkgewotICAgICAgICAgICAgLy8gdHJhbnNmb3JtIHRoZSB0cmFuc3BhcmVudCByZWdpb24KLSAgICAgICAgICAgIHRyYW5zcGFyZW50UmVnaW9uU2NyZWVuID0gdHIudHJhbnNmb3JtKHMudHJhbnNwYXJlbnRSZWdpb24pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gdHJhbnNmb3JtYXRpb24gdG9vIGNvbXBsZXgsIGNhbid0IGRvIHRoZSB0cmFuc3BhcmVudCByZWdpb24KLSAgICAgICAgICAgIC8vIG9wdGltaXphdGlvbi4KLSAgICAgICAgICAgIHRyYW5zcGFyZW50UmVnaW9uU2NyZWVuLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB0cmFuc3BhcmVudFJlZ2lvblNjcmVlbiA9IHMudHJhbnNwYXJlbnRSZWdpb247Ci0gICAgfQotCi0gICAgLy8gY2FjaGUgYSBmZXcgdGhpbmdzLi4uCi0gICAgbU9yaWVudGF0aW9uID0gdHIuZ2V0T3JpZW50YXRpb24oKTsKLSAgICBtUGxhbmVPcmllbnRhdGlvbiA9IHBsYW5lVHJhbnNmb3JtLmdldE9yaWVudGF0aW9uKCk7Ci0gICAgbVRyYW5zZm9ybSA9IHRyOwotICAgIG1UcmFuc2Zvcm1lZEJvdW5kcyA9IHRyLm1ha2VCb3VuZHModywgaCk7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpsb2NrUGFnZUZsaXAoYm9vbCYgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMpIHsKLX0KLQotdm9pZCBMYXllckJhc2U6OnVubG9ja1BhZ2VGbGlwKAotICAgICAgICBjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtLCBSZWdpb24mIG91dERpcnR5UmVnaW9uKSB7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpkcmF3UmVnaW9uKGNvbnN0IFJlZ2lvbiYgcmVnKSBjb25zdAotewotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWcuYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHJlZy5lbmQoKTsKLSAgICBpZiAoaXQgIT0gZW5kKSB7Ci0gICAgICAgIFJlY3QgcjsKLSAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgICAgICBjb25zdCBpbnQzMl90IGZiV2lkdGggID0gaHcuZ2V0V2lkdGgoKTsKLSAgICAgICAgY29uc3QgaW50MzJfdCBmYkhlaWdodCA9IGh3LmdldEhlaWdodCgpOwotICAgICAgICBjb25zdCBHTHNob3J0IHZlcnRpY2VzW11bMl0gPSB7IHsgMCwgMCB9LCB7IGZiV2lkdGgsIDAgfSwgCi0gICAgICAgICAgICAgICAgeyBmYldpZHRoLCBmYkhlaWdodCB9LCB7IDAsIGZiSGVpZ2h0IH0gIH07Ci0gICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9TSE9SVCwgMCwgdmVydGljZXMpOwotICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7Ci0gICAgICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgICAgICBjb25zdCBHTGludCBzeSA9IGZiSGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOyAKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBMYXllckJhc2U6OnNldEdlb21ldHJ5KGh3Y19sYXllcl90KiBod2NsKQotewotICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKLSAgICBod2NsLT5oaW50cyA9IDA7Ci0gICAgaHdjbC0+ZmxhZ3MgPSBIV0NfU0tJUF9MQVlFUjsKLSAgICBod2NsLT50cmFuc2Zvcm0gPSAwOwotICAgIGh3Y2wtPmJsZW5kaW5nID0gSFdDX0JMRU5ESU5HX05PTkU7Ci0KLSAgICAvLyB0aGlzIGdpdmVzIHVzIG9ubHkgdGhlICJvcmllbnRhdGlvbiIgY29tcG9uZW50IG9mIHRoZSB0cmFuc2Zvcm0KLSAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgZmluYWxUcmFuc2Zvcm0gPSBzLnRyYW5zZm9ybS5nZXRPcmllbnRhdGlvbigpOwotICAgIC8vIHdlIGNhbiBvbmx5IGhhbmRsZSBzaW1wbGUgdHJhbnNmb3JtYXRpb24KLSAgICBpZiAoZmluYWxUcmFuc2Zvcm0gJiBUcmFuc2Zvcm06OlJPVF9JTlZBTElEKSB7Ci0gICAgICAgIGh3Y2wtPmZsYWdzID0gSFdDX1NLSVBfTEFZRVI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaHdjbC0+dHJhbnNmb3JtID0gZmluYWxUcmFuc2Zvcm07Ci0gICAgfQotCi0gICAgaWYgKCFpc09wYXF1ZSgpKSB7Ci0gICAgICAgIGh3Y2wtPmJsZW5kaW5nID0gbVByZW11bHRpcGxpZWRBbHBoYSA/Ci0gICAgICAgICAgICAgICAgSFdDX0JMRU5ESU5HX1BSRU1VTFQgOiBIV0NfQkxFTkRJTkdfQ09WRVJBR0U7Ci0gICAgfQotCi0gICAgLy8gc2NhbGluZyBpcyBhbHJlYWR5IGFwcGxpZWQgaW4gbVRyYW5zZm9ybWVkQm91bmRzCi0gICAgaHdjbC0+ZGlzcGxheUZyYW1lLmxlZnQgICA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5sZWZ0OwotICAgIGh3Y2wtPmRpc3BsYXlGcmFtZS50b3AgICAgPSBtVHJhbnNmb3JtZWRCb3VuZHMudG9wOwotICAgIGh3Y2wtPmRpc3BsYXlGcmFtZS5yaWdodCAgPSBtVHJhbnNmb3JtZWRCb3VuZHMucmlnaHQ7Ci0gICAgaHdjbC0+ZGlzcGxheUZyYW1lLmJvdHRvbSA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5ib3R0b207Ci0gICAgaHdjbC0+dmlzaWJsZVJlZ2lvblNjcmVlbi5yZWN0cyA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PGh3Y19yZWN0X3QgY29uc3QgKj4oCi0gICAgICAgICAgICAgICAgICAgIHZpc2libGVSZWdpb25TY3JlZW4uZ2V0QXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3Y2wtPnZpc2libGVSZWdpb25TY3JlZW4ubnVtUmVjdHMpKTsKLQotICAgIGh3Y2wtPnNvdXJjZUNyb3AubGVmdCAgID0gMDsKLSAgICBod2NsLT5zb3VyY2VDcm9wLnRvcCAgICA9IDA7Ci0gICAgaHdjbC0+c291cmNlQ3JvcC5yaWdodCAgPSBtVHJhbnNmb3JtZWRCb3VuZHMud2lkdGgoKTsKLSAgICBod2NsLT5zb3VyY2VDcm9wLmJvdHRvbSA9IG1UcmFuc2Zvcm1lZEJvdW5kcy5oZWlnaHQoKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OnNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCkgewotICAgIGh3Y2wtPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKLSAgICBod2NsLT5oYW5kbGUgPSBOVUxMOwotfQotCi12b2lkIExheWVyQmFzZTo6c2V0T3ZlcmxheShib29sIGluT3ZlcmxheSkgewotICAgIG1Jbk92ZXJsYXkgPSBpbk92ZXJsYXk7Ci19Ci0KLWJvb2wgTGF5ZXJCYXNlOjppc092ZXJsYXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jbk92ZXJsYXk7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpzZXRGaWx0ZXJpbmcoYm9vbCBmaWx0ZXJpbmcpCi17Ci0gICAgbUZpbHRlcmluZyA9IGZpbHRlcmluZzsKLX0KLQotYm9vbCBMYXllckJhc2U6OmdldEZpbHRlcmluZygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1GaWx0ZXJpbmc7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpkcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKLXsKLSAgICAvLyByZXNldCBHTCBzdGF0ZQotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0KLSAgICBvbkRyYXcoY2xpcCk7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpkcmF3Rm9yU3JlZW5TaG90KCkKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgc2V0RmlsdGVyaW5nKHRydWUpOwotICAgIG9uRHJhdyggUmVnaW9uKGh3LmJvdW5kcygpKSApOwotICAgIHNldEZpbHRlcmluZyhmYWxzZSk7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpjbGVhcldpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwLCBHTGNsYW1wZiByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMY2xhbXBmIGdyZWVuLCBHTGNsYW1wZiBibHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGNsYW1wZiBhbHBoYSkgY29uc3QKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgZmJIZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKLSAgICBnbENvbG9yNGYocmVkLGdyZWVuLGJsdWUsYWxwaGEpOwotCi0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLQotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjbGlwLmJlZ2luKCk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCBlbmQgPSBjbGlwLmVuZCgpOwotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCBtVmVydGljZXMpOwotICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICAgICAgY29uc3QgUmVjdCYgciA9ICppdCsrOwotICAgICAgICBjb25zdCBHTGludCBzeSA9IGZiSGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7Ci0gICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsgCi0gICAgfQotfQotCi12b2lkIExheWVyQmFzZTo6Y2xlYXJXaXRoT3BlbkdMKGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKLXsKLSAgICBjbGVhcldpdGhPcGVuR0woY2xpcCwwLDAsMCwwKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmRyYXdXaXRoT3BlbkdMKGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgZmJIZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKLSAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0KLSAgICBHTGVudW0gc3JjID0gbVByZW11bHRpcGxpZWRBbHBoYSA/IEdMX09ORSA6IEdMX1NSQ19BTFBIQTsKLSAgICBpZiAoQ0NfVU5MSUtFTFkocy5hbHBoYSA8IDB4RkYpKSB7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgYWxwaGEgPSBzLmFscGhhICogKDEuMGYvMjU1LjBmKTsKLSAgICAgICAgaWYgKG1QcmVtdWx0aXBsaWVkQWxwaGEpIHsKLSAgICAgICAgICAgIGdsQ29sb3I0ZihhbHBoYSwgYWxwaGEsIGFscGhhLCBhbHBoYSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbENvbG9yNGYoMSwgMSwgMSwgYWxwaGEpOwotICAgICAgICB9Ci0gICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xCbGVuZEZ1bmMoc3JjLCBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBKTsKLSAgICAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9NT0RVTEFURSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZ2xDb2xvcjRmKDEsIDEsIDEsIDEpOwotICAgICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOwotICAgICAgICBpZiAoIWlzT3BhcXVlKCkpIHsKLSAgICAgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgICAgIGdsQmxlbmRGdW5jKHNyYywgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RydWN0IFRleENvb3JkcyB7Ci0gICAgICAgIEdMZmxvYXQgdTsKLSAgICAgICAgR0xmbG9hdCB2OwotICAgIH07Ci0KLSAgICBUZXhDb29yZHMgdGV4Q29vcmRzWzRdOwotICAgIHRleENvb3Jkc1swXS51ID0gMDsKLSAgICB0ZXhDb29yZHNbMF0udiA9IDE7Ci0gICAgdGV4Q29vcmRzWzFdLnUgPSAwOwotICAgIHRleENvb3Jkc1sxXS52ID0gMDsKLSAgICB0ZXhDb29yZHNbMl0udSA9IDE7Ci0gICAgdGV4Q29vcmRzWzJdLnYgPSAwOwotICAgIHRleENvb3Jkc1szXS51ID0gMTsKLSAgICB0ZXhDb29yZHNbM10udiA9IDE7Ci0KLSAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgbVZlcnRpY2VzKTsKLSAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9GTE9BVCwgMCwgdGV4Q29vcmRzKTsKLQotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjbGlwLmJlZ2luKCk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCBlbmQgPSBjbGlwLmVuZCgpOwotICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICAgICAgY29uc3QgUmVjdCYgciA9ICppdCsrOwotICAgICAgICBjb25zdCBHTGludCBzeSA9IGZiSGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7Ci0gICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICB9Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiKyAlcyAlcCAoJXMpXG4iLAotICAgICAgICAgICAgZ2V0VHlwZUlkKCksIHRoaXMsIGdldE5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgcy50cmFuc3BhcmVudFJlZ2lvbi5kdW1wKHJlc3VsdCwgInRyYW5zcGFyZW50UmVnaW9uIik7Ci0gICAgdHJhbnNwYXJlbnRSZWdpb25TY3JlZW4uZHVtcChyZXN1bHQsICJ0cmFuc3BhcmVudFJlZ2lvblNjcmVlbiIpOwotICAgIHZpc2libGVSZWdpb25TY3JlZW4uZHVtcChyZXN1bHQsICJ2aXNpYmxlUmVnaW9uU2NyZWVuIik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiICAgICAgIgotICAgICAgICAgICAgIno9JTlkLCBwb3M9KCVnLCVnKSwgc2l6ZT0oJTRkLCU0ZCksICIKLSAgICAgICAgICAgICJpc09wYXF1ZT0lMWQsIG5lZWRzRGl0aGVyaW5nPSUxZCwgaW52YWxpZGF0ZT0lMWQsICIKLSAgICAgICAgICAgICJhbHBoYT0weCUwMngsIGZsYWdzPTB4JTA4eCwgdHI9WyUuMmYsICUuMmZdWyUuMmYsICUuMmZdXG4iLAotICAgICAgICAgICAgcy56LCBzLnRyYW5zZm9ybS50eCgpLCBzLnRyYW5zZm9ybS50eSgpLCBzLncsIHMuaCwKLSAgICAgICAgICAgIGlzT3BhcXVlKCksIG5lZWRzRGl0aGVyaW5nKCksIGNvbnRlbnREaXJ0eSwKLSAgICAgICAgICAgIHMuYWxwaGEsIHMuZmxhZ3MsCi0gICAgICAgICAgICBzLnRyYW5zZm9ybVswXVswXSwgcy50cmFuc2Zvcm1bMF1bMV0sCi0gICAgICAgICAgICBzLnRyYW5zZm9ybVsxXVswXSwgcy50cmFuc2Zvcm1bMV1bMV0pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLX0KLQotdm9pZCBMYXllckJhc2U6OnNob3J0RHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBzaXplKSBjb25zdCB7Ci0gICAgTGF5ZXJCYXNlOjpkdW1wKHJlc3VsdCwgc2NyYXRjaCwgc2l6ZSk7Ci19Ci0KLXZvaWQgTGF5ZXJCYXNlOjpkdW1wU3RhdHMoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3QgU0laRSkgY29uc3QgewotfQotCi12b2lkIExheWVyQmFzZTo6Y2xlYXJTdGF0cygpIHsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludDMyX3QgTGF5ZXJCYXNlQ2xpZW50OjpzSWRlbnRpdHkgPSAxOwotCi1MYXllckJhc2VDbGllbnQ6OkxheWVyQmFzZUNsaWVudChTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCkKLSAgICA6IExheWVyQmFzZShmbGluZ2VyLCBkaXNwbGF5KSwKLSAgICAgIG1IYXNTdXJmYWNlKGZhbHNlKSwKLSAgICAgIG1DbGllbnRSZWYoY2xpZW50KSwKLSAgICAgIG1JZGVudGl0eSh1aW50MzJfdChhbmRyb2lkX2F0b21pY19pbmMoJnNJZGVudGl0eSkpKQotewotfQotCi1MYXllckJhc2VDbGllbnQ6On5MYXllckJhc2VDbGllbnQoKQotewotICAgIHNwPENsaWVudD4gYyhtQ2xpZW50UmVmLnByb21vdGUoKSk7Ci0gICAgaWYgKGMgIT0gMCkgewotICAgICAgICBjLT5kZXRhY2hMYXllcih0aGlzKTsKLSAgICB9Ci19Ci0KLXNwPElTdXJmYWNlPiBMYXllckJhc2VDbGllbnQ6OmNyZWF0ZVN1cmZhY2UoKQotewotICAgIGNsYXNzIEJTdXJmYWNlIDogcHVibGljIEJuU3VyZmFjZSwgcHVibGljIExheWVyQ2xlYW5lciB7Ci0gICAgICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VUZXh0dXJlPiBnZXRTdXJmYWNlVGV4dHVyZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBwdWJsaWM6Ci0gICAgICAgIEJTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2VGbGluZ2VyPiYgZmxpbmdlciwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBsYXllcikKLSAgICAgICAgICAgIDogTGF5ZXJDbGVhbmVyKGZsaW5nZXIsIGxheWVyKSB7IH0KLSAgICB9OwotICAgIHNwPElTdXJmYWNlPiBzdXIobmV3IEJTdXJmYWNlKG1GbGluZ2VyLCB0aGlzKSk7Ci0gICAgcmV0dXJuIHN1cjsKLX0KLQotc3A8SVN1cmZhY2U+IExheWVyQmFzZUNsaWVudDo6Z2V0U3VyZmFjZSgpCi17Ci0gICAgc3A8SVN1cmZhY2U+IHM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUhhc1N1cmZhY2UsCi0gICAgICAgICAgICAiTGF5ZXJCYXNlQ2xpZW50OjpnZXRTdXJmYWNlKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQiKTsKLQotICAgIG1IYXNTdXJmYWNlID0gdHJ1ZTsKLSAgICBzID0gY3JlYXRlU3VyZmFjZSgpOwotICAgIG1DbGllbnRTdXJmYWNlQmluZGVyID0gcy0+YXNCaW5kZXIoKTsKLSAgICByZXR1cm4gczsKLX0KLQotd3A8SUJpbmRlcj4gTGF5ZXJCYXNlQ2xpZW50OjpnZXRTdXJmYWNlQmluZGVyKCkgY29uc3QgewotICAgIHJldHVybiBtQ2xpZW50U3VyZmFjZUJpbmRlcjsKLX0KLQotd3A8SUJpbmRlcj4gTGF5ZXJCYXNlQ2xpZW50OjpnZXRTdXJmYWNlVGV4dHVyZUJpbmRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBMYXllckJhc2VDbGllbnQ6OmR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIExheWVyQmFzZTo6ZHVtcChyZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0KLSAgICBzcDxDbGllbnQ+IGNsaWVudChtQ2xpZW50UmVmLnByb21vdGUoKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgIiAgICAgIGNsaWVudD0lcCwgaWRlbnRpdHk9JXVcbiIsCi0gICAgICAgICAgICBjbGllbnQuZ2V0KCksIGdldElkZW50aXR5KCkpOwotCi0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotfQotCi0KLXZvaWQgTGF5ZXJCYXNlQ2xpZW50OjpzaG9ydER1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3Qgc2l6ZSkgY29uc3QKLXsKLSAgICBMYXllckJhc2VDbGllbnQ6OmR1bXAocmVzdWx0LCBzY3JhdGNoLCBzaXplKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxheWVyQmFzZUNsaWVudDo6TGF5ZXJDbGVhbmVyOjpMYXllckNsZWFuZXIoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAotICAgICAgICBjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBsYXllcikKLSAgICA6IG1GbGluZ2VyKGZsaW5nZXIpLCBtTGF5ZXIobGF5ZXIpIHsKLX0KLQotTGF5ZXJCYXNlQ2xpZW50OjpMYXllckNsZWFuZXI6On5MYXllckNsZWFuZXIoKSB7Ci0gICAgLy8gZGVzdHJveSBjbGllbnQgcmVzb3VyY2VzCi0gICAgbUZsaW5nZXItPmRlc3Ryb3lTdXJmYWNlKG1MYXllcik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJCYXNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2ZWZkZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0xBWUVSX0JBU0VfSAotI2RlZmluZSBBTkRST0lEX0xBWUVSX0JBU0VfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgotCi0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0xheWVyU3RhdGUuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2h3Y29tcG9zZXIuaD4KLQotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLSNpbmNsdWRlICJUcmFuc2Zvcm0uaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ2xpZW50OwotY2xhc3MgRGlzcGxheUhhcmR3YXJlOwotY2xhc3MgR3JhcGhpY0J1ZmZlcjsKLWNsYXNzIEdyYXBoaWNQbGFuZTsKLWNsYXNzIExheWVyOwotY2xhc3MgTGF5ZXJCYXNlQ2xpZW50OwotY2xhc3MgU3VyZmFjZUZsaW5nZXI7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMYXllckJhc2UgOiBwdWJsaWMgUmVmQmFzZQotewotICAgIHN0YXRpYyBpbnQzMl90IHNTZXF1ZW5jZTsKLQotcHVibGljOgotICAgICAgICAgICAgTGF5ZXJCYXNlKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZGlzcGxheSk7Ci0KLSAgICBEaXNwbGF5SUQgICAgICAgICAgIGRweTsKLSAgICBtdXRhYmxlIGJvb2wgICAgICAgIGNvbnRlbnREaXJ0eTsKLSAgICAgICAgICAgIFJlZ2lvbiAgICAgIHZpc2libGVSZWdpb25TY3JlZW47Ci0gICAgICAgICAgICBSZWdpb24gICAgICB0cmFuc3BhcmVudFJlZ2lvblNjcmVlbjsKLSAgICAgICAgICAgIFJlZ2lvbiAgICAgIGNvdmVyZWRSZWdpb25TY3JlZW47Ci0gICAgICAgICAgICBpbnQzMl90ICAgICBzZXF1ZW5jZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgc3RydWN0IFN0YXRlIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdzsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgaDsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgcmVxdWVzdGVkX3c7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHJlcXVlc3RlZF9oOwotICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICB6OwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICBhbHBoYTsKLSAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAgZmxhZ3M7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgIHJlc2VydmVkWzJdOwotICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBzZXF1ZW5jZTsgICAvLyBjaGFuZ2VzIHdoZW4gdmlzaWJsZSByZWdpb25zIGNhbiBjaGFuZ2UKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgdGludDsKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm0gICAgICAgdHJhbnNmb3JtOwotICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICB0cmFuc3BhcmVudFJlZ2lvbjsKLSAgICAgICAgICAgIH07Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmc4JiBuYW1lKTsKLSAgICAgICAgICAgIFN0cmluZzggZ2V0TmFtZSgpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBtb2RpZnkgY3VycmVudCBzdGF0ZQotICAgICAgICAgICAgYm9vbCBzZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KTsKLSAgICAgICAgICAgIGJvb2wgc2V0TGF5ZXIodWludDMyX3Qgeik7Ci0gICAgICAgICAgICBib29sIHNldFNpemUodWludDMyX3QgdywgdWludDMyX3QgaCk7Ci0gICAgICAgICAgICBib29sIHNldEFscGhhKHVpbnQ4X3QgYWxwaGEpOwotICAgICAgICAgICAgYm9vbCBzZXRNYXRyaXgoY29uc3QgbGF5ZXJfc3RhdGVfdDo6bWF0cml4MjJfdCYgbWF0cml4KTsKLSAgICAgICAgICAgIGJvb2wgc2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KGNvbnN0IFJlZ2lvbiYgb3BhcXVlKTsKLSAgICAgICAgICAgIGJvb2wgc2V0RmxhZ3ModWludDhfdCBmbGFncywgdWludDhfdCBtYXNrKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdm9pZCBjb21taXRUcmFuc2FjdGlvbigpOwotICAgICAgICAgICAgYm9vbCByZXF1ZXN0VHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIHZvaWQgZm9yY2VWaXNpYmlsaXR5VHJhbnNhY3Rpb24oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdWludDMyX3QgZ2V0VHJhbnNhY3Rpb25GbGFncyh1aW50MzJfdCBmbGFncyk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgUmVjdCB2aXNpYmxlQm91bmRzKCkgY29uc3Q7Ci0gICAgICAgICAgICB2b2lkIGRyYXdSZWdpb24oY29uc3QgUmVnaW9uJiByZWcpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzcDxMYXllckJhc2VDbGllbnQ+IGdldExheWVyQmFzZUNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHNwPExheWVyPiBnZXRMYXllcigpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VHlwZUlkKCkgY29uc3QgeyByZXR1cm4gIkxheWVyQmFzZSI7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeShod2NfbGF5ZXJfdCogaHdjbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldFBlckZyYW1lRGF0YShod2NfbGF5ZXJfdCogaHdjbCk7Ci0gICAgICAgICAgICB2b2lkIHNldE92ZXJsYXkoYm9vbCBpbk92ZXJsYXkpOwotICAgICAgICAgICAgYm9vbCBpc092ZXJsYXkoKSBjb25zdDsKLQotCi0gICAgLyoqCi0gICAgICogZHJhdyAtIHBlcmZvcm1zIHNvbWUgZ2xvYmFsIGNsaXBwaW5nIG9wdGltaXphdGlvbnMKLSAgICAgKiBhbmQgY2FsbHMgb25EcmF3KCkuCi0gICAgICogVHlwaWNhbGx5IHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBpbnN0ZWFkIGltcGxlbWVudCBvbkRyYXcoKQotICAgICAqIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBkcmF3aW5nLiAgCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhd0ZvclNyZWVuU2hvdCgpOwotICAgIAotICAgIC8qKgotICAgICAqIG9uRHJhdyAtIGRyYXdzIHRoZSBzdXJmYWNlLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdCA9IDA7Ci0gICAgCi0gICAgLyoqCi0gICAgICogaW5pdFN0YXRlcyAtIGNhbGxlZCBqdXN0IGFmdGVyIGNvbnN0cnVjdGlvbgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBpbml0U3RhdGVzKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBkb1RyYW5zYWN0aW9uIC0gcHJvY2VzcyB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIGZpZ3VyZQotICAgICAqIG91dCB3aGljaCBhdHRyaWJ1dGVzIG9mIHRoZSBzdXJmYWNlIGhhdmUgY2hhbmdlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGRvVHJhbnNhY3Rpb24odWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogc2V0VmlzaWJsZVJlZ2lvbiAtIGNhbGxlZCB0byBzZXQgdGhlIG5ldyB2aXNpYmxlIHJlZ2lvbi4gVGhpcyBnaXZlcwotICAgICAqIGEgY2hhbmNlIHRvIHVwZGF0ZSB0aGUgbmV3IHZpc2libGUgcmVnaW9uIG9yIHJlY29yZCB0aGUgZmFjdCBpdCBjaGFuZ2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgdm9pZCBzZXRWaXNpYmxlUmVnaW9uKGNvbnN0IFJlZ2lvbiYgdmlzaWJsZVJlZ2lvbik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogc2V0Q292ZXJlZFJlZ2lvbiAtIGNhbGxlZCB3aGVuIHRoZSBjb3ZlcmVkIHJlZ2lvbiBjaGFuZ2VzLiBUaGUgY292ZXJlZAotICAgICAqIHJlZ2lvbiBjb3JyZXNwb25kcyB0byBhbnkgYXJlYSBvZiB0aGUgc3VyZmFjZSB0aGF0IGlzIGNvdmVyZWQKLSAgICAgKiAodHJhbnNwYXJlbnRseSBvciBub3QpIGJ5IGFub3RoZXIgc3VyZmFjZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgc2V0Q292ZXJlZFJlZ2lvbihjb25zdCBSZWdpb24mIGNvdmVyZWRSZWdpb24pOwotCi0gICAgLyoqCi0gICAgICogdmFsaWRhdGVWaXNpYmlsaXR5IC0gY2FjaGUgYSBidW5jaCBvZiB0aGluZ3MKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGVWaXNpYmlsaXR5KGNvbnN0IFRyYW5zZm9ybSYgZ2xvYmFsVHJhbnNmb3JtKTsKLQotICAgIC8qKgotICAgICAqIGxvY2tQYWdlRmxpcCAtIGNhbGxlZCBlYWNoIHRpbWUgdGhlIHNjcmVlbiBpcyByZWRyYXduIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgICAgKiB0aGUgdmlzaWJsZSByZWdpb25zIG5lZWQgdG8gYmUgcmVjb21wdXRlZCAodGhpcyBpcyBhIGZhaXJseSBoZWF2eQotICAgICAqIG9wZXJhdGlvbiwgc28gdGhpcyBzaG91bGQgYmUgc2V0IG9ubHkgaWYgbmVlZGVkKS4gVHlwaWNhbGx5IHRoaXMgaXMgdXNlZAotICAgICAqIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGNvbnRlbnQgb3Igc2l6ZSBvZiBhIHN1cmZhY2UgaGFzIGNoYW5nZWQuCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIGxvY2tQYWdlRmxpcChib29sJiByZWNvbXB1dGVWaXNpYmxlUmVnaW9ucyk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogdW5sb2NrUGFnZUZsaXAgLSBjYWxsZWQgZWFjaCB0aW1lIHRoZSBzY3JlZW4gaXMgcmVkcmF3bi4gdXBkYXRlcyB0aGUKLSAgICAgKiBmaW5hbCBkaXJ0eSByZWdpb24gd3J0IHRoZSBwbGFuZVRyYW5zZm9ybS4KLSAgICAgKiBBdCB0aGlzIHBvaW50LCBhbGwgdmlzaWJsZSByZWdpb25zLCBzdXJmYWNlIHBvc2l0aW9uIGFuZCBzaXplLCBldGMuLi4gYXJlCi0gICAgICogY29ycmVjdC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgdW5sb2NrUGFnZUZsaXAoY29uc3QgVHJhbnNmb3JtJiBwbGFuZVRyYW5zZm9ybSwgUmVnaW9uJiBvdXREaXJ0eVJlZ2lvbik7Ci0gICAgCi0gICAgLyoqCi0gICAgICogaXNPcGFxdWUgLSB0cnVlIGlmIHRoaXMgc3VyZmFjZSBpcyBvcGFxdWUKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNPcGFxdWUoKSBjb25zdCAgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgLyoqCi0gICAgICogbmVlZHNEaXRoZXJpbmcgLSB0cnVlIGlmIHRoaXMgc3VyZmFjZSBuZWVkcyBkaXRoZXJpbmcKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgbmVlZHNEaXRoZXJpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLyoqCi0gICAgICogbmVlZHNMaW5lYXJGaWx0ZXJpbmcgLSB0cnVlIGlmIHRoaXMgc3VyZmFjZSdzIHN0YXRlIHJlcXVpcmVzIGZpbHRlcmluZwotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBuZWVkc0ZpbHRlcmluZygpIGNvbnN0IHsgcmV0dXJuIG1OZWVkc0ZpbHRlcmluZzsgfQotCi0gICAgLyoqCi0gICAgICogaXNTZWN1cmUgLSB0cnVlIGlmIHRoaXMgc3VyZmFjZSBpcyBzZWN1cmUsIHRoYXQgaXMgaWYgaXQgcHJldmVudHMKLSAgICAgKiBzY3JlZW5zaG90cyBvciBWTkMgc2VydmVycy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNTZWN1cmUoKSBjb25zdCAgICAgICB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgLyoqCi0gICAgICogaXNQcm90ZWN0ZWQgLSB0cnVlIGlmIHRoZSBsYXllciBtYXkgY29udGFpbiBwcm90ZWN0ZWQgY29udGVudCBpbiB0aGUKLSAgICAgKiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCBzZW5zZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdCAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAvKiogY2FsbGVkIHdpdGggdGhlIHN0YXRlIGxvY2sgd2hlbiB0aGUgc3VyZmFjZSBpcyByZW1vdmVkIGZyb20gdGhlCi0gICAgICogIGN1cnJlbnQgbGlzdCAqLwotICAgIHZpcnR1YWwgdm9pZCBvblJlbW92ZWQoKSB7IH0KLQotICAgIC8qKiBjYWxsZWQgYWZ0ZXIgcGFnZS1mbGlwCi0gICAgICovCi0gICAgdmlydHVhbCB2b2lkIG9uTGF5ZXJEaXNwbGF5ZWQoKSB7IH0KLQotICAgIC8qKiBjYWxsZWQgYmVmb3JlIGNvbXBvc2l0aW9uLgotICAgICAqIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGF5ZXIgaGFzIHBlbmRpbmcgdXBkYXRlcy4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGJvb2wgb25QcmVDb21wb3NpdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICAvKiogYWx3YXlzIGNhbGwgYmFzZSBjbGFzcyBmaXJzdCAqLwotICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCwgY2hhciogc2NyYXRjaCwgc2l6ZV90IHNpemUpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzaG9ydER1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGR1bXBTdGF0cyhTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBjbGVhclN0YXRzKCk7Ci0KLQotICAgIGVudW0geyAvLyBmbGFncyBmb3IgZG9UcmFuc2FjdGlvbigpCi0gICAgICAgIGVWaXNpYmxlUmVnaW9uICAgICAgPSAweDAwMDAwMDAyLAotICAgIH07Ci0KLQotICAgIGlubGluZSAgY29uc3QgU3RhdGUmICAgIGRyYXdpbmdTdGF0ZSgpIGNvbnN0ICAgIHsgcmV0dXJuIG1EcmF3aW5nU3RhdGU7IH0KLSAgICBpbmxpbmUgIGNvbnN0IFN0YXRlJiAgICBjdXJyZW50U3RhdGUoKSBjb25zdCAgICB7IHJldHVybiBtQ3VycmVudFN0YXRlOyB9Ci0gICAgaW5saW5lICBTdGF0ZSYgICAgICAgICAgY3VycmVudFN0YXRlKCkgICAgICAgICAgeyByZXR1cm4gbUN1cnJlbnRTdGF0ZTsgfQotCi0gICAgaW50MzJfdCAgZ2V0T3JpZW50YXRpb24oKSBjb25zdCB7IHJldHVybiBtT3JpZW50YXRpb247IH0KLSAgICBpbnQzMl90ICBnZXRQbGFuZU9yaWVudGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbVBsYW5lT3JpZW50YXRpb247IH0KLSAgICAKLXByb3RlY3RlZDoKLSAgICBjb25zdCBHcmFwaGljUGxhbmUmIGdyYXBoaWNQbGFuZShpbnQgZHB5KSBjb25zdDsKLSAgICAgICAgICBHcmFwaGljUGxhbmUmIGdyYXBoaWNQbGFuZShpbnQgZHB5KTsKLQotICAgICAgICAgIHZvaWQgY2xlYXJXaXRoT3BlbkdMKGNvbnN0IFJlZ2lvbiYgY2xpcCwgR0xjbGFtcGYgciwgR0xjbGFtcGYgZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGNsYW1wZiBiLCBHTGNsYW1wZiBhbHBoYSkgY29uc3Q7Ci0gICAgICAgICAgdm9pZCBjbGVhcldpdGhPcGVuR0woY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLSAgICAgICAgICB2b2lkIGRyYXdXaXRoT3BlbkdMKGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3Q7Ci0KLSAgICAgICAgICB2b2lkIHNldEZpbHRlcmluZyhib29sIGZpbHRlcmluZyk7Ci0gICAgICAgICAgYm9vbCBnZXRGaWx0ZXJpbmcoKSBjb25zdDsKLQotICAgICAgICAgICAgICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgbUZsYWdzOwotCi1wcml2YXRlOgotICAgICAgICAgICAgICAgIC8vIGFjY2Vzc2VkIG9ubHkgaW4gdGhlIG1haW4gdGhyZWFkCi0gICAgICAgICAgICAgICAgLy8gV2hldGhlciBmaWx0ZXJpbmcgaXMgZm9yY2VkIG9uIG9yIG5vdAotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBtRmlsdGVyaW5nOwotCi0gICAgICAgICAgICAgICAgLy8gY2FjaGVkIGR1cmluZyB2YWxpZGF0ZVZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgZmlsdGVyaW5nIGlzIG5lZWRlZCBiL2Mgb2YgdGhlIGRyYXdpbmdzdGF0ZQotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBtTmVlZHNGaWx0ZXJpbmc7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGlzIGxheWVyIGlzIGN1cnJlbnRseSBoYW5kbGVkIGJ5IHRoZSBod2MuIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAvLyB1cGRhdGVkIGF0IGNvbXBvc2l0aW9uIHRpbWUsIGFsd2F5cyBmcm1vIHRoZSBjb21wb3NpdGlvbgotICAgICAgICAgICAgICAgIC8vIHRocmVhZC4KLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgbUluT3ZlcmxheTsKLQotcHJvdGVjdGVkOgotICAgICAgICAgICAgICAgIC8vIGNhY2hlZCBkdXJpbmcgdmFsaWRhdGVWaXNpYmlsaXR5KCkKLSAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgbU9yaWVudGF0aW9uOwotICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBtUGxhbmVPcmllbnRhdGlvbjsKLSAgICAgICAgICAgICAgICBUcmFuc2Zvcm0gICAgICAgbVRyYW5zZm9ybTsKLSAgICAgICAgICAgICAgICBHTGZsb2F0ICAgICAgICAgbVZlcnRpY2VzWzRdWzJdOwotICAgICAgICAgICAgICAgIFJlY3QgICAgICAgICAgICBtVHJhbnNmb3JtZWRCb3VuZHM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgcHJvdGVjdGVkIGJ5IGFuIGV4dGVybmFsIGxvY2sKLSAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgbUN1cnJlbnRTdGF0ZTsKLSAgICAgICAgICAgICAgICBTdGF0ZSAgICAgICAgICAgbURyYXdpbmdTdGF0ZTsKLSAgICB2b2xhdGlsZSAgICBpbnQzMl90ICAgICAgICAgbVRyYW5zYWN0aW9uRmxhZ3M7Ci0KLSAgICAgICAgICAgICAgICAvLyBkb24ndCBjaGFuZ2UsIGRvbid0IG5lZWQgYSBsb2NrCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIG1QcmVtdWx0aXBsaWVkQWxwaGE7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCAgICAgICAgIG1OYW1lOwotICAgIG11dGFibGUgICAgIGJvb2wgICAgICAgICAgICBtRGVidWc7Ci0KLQotcHVibGljOgotICAgIC8vIGNhbGxlZCBmcm9tIGNsYXNzIFN1cmZhY2VGbGluZ2VyCi0gICAgdmlydHVhbCB+TGF5ZXJCYXNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgTGF5ZXJCYXNlKGNvbnN0IExheWVyQmFzZSYgcmhzKTsKLX07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIExheWVyQmFzZUNsaWVudCA6IHB1YmxpYyBMYXllckJhc2UKLXsKLXB1YmxpYzoKLSAgICAgICAgICAgIExheWVyQmFzZUNsaWVudChTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQpOwotCi0gICAgICAgICAgICB2aXJ0dWFsIH5MYXllckJhc2VDbGllbnQoKTsKLQotICAgICAgICAgICAgc3A8SVN1cmZhY2U+IGdldFN1cmZhY2UoKTsKLSAgICAgICAgICAgIHdwPElCaW5kZXI+IGdldFN1cmZhY2VCaW5kZXIoKSBjb25zdDsKLSAgICAgICAgICAgIHZpcnR1YWwgd3A8SUJpbmRlcj4gZ2V0U3VyZmFjZVRleHR1cmVCaW5kZXIoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3A8TGF5ZXJCYXNlQ2xpZW50PiBnZXRMYXllckJhc2VDbGllbnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBjb25zdF9jYXN0PExheWVyQmFzZUNsaWVudCo+KHRoaXMpOyB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGdldFR5cGVJZCgpIGNvbnN0IHsgcmV0dXJuICJMYXllckJhc2VDbGllbnQiOyB9Ci0KLSAgICB1aW50MzJfdCBnZXRJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGl0eTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBzY3JhdGNoLCBzaXplX3Qgc2l6ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHNob3J0RHVtcChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIHNjcmF0Y2gsIHNpemVfdCBzaXplKSBjb25zdDsKLQotICAgIGNsYXNzIExheWVyQ2xlYW5lciB7Ci0gICAgICAgIHNwPFN1cmZhY2VGbGluZ2VyPiBtRmxpbmdlcjsKLSAgICAgICAgd3A8TGF5ZXJCYXNlQ2xpZW50PiBtTGF5ZXI7Ci0gICAgcHJvdGVjdGVkOgotICAgICAgICB+TGF5ZXJDbGVhbmVyKCk7Ci0gICAgcHVibGljOgotICAgICAgICBMYXllckNsZWFuZXIoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKTsKLSAgICB9OwotCi1wcml2YXRlOgotICAgIHZpcnR1YWwgc3A8SVN1cmZhY2U+IGNyZWF0ZVN1cmZhY2UoKTsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgbXV0YWJsZSBib29sIG1IYXNTdXJmYWNlOwotICAgIHdwPElCaW5kZXI+IG1DbGllbnRTdXJmYWNlQmluZGVyOwotICAgIGNvbnN0IHdwPENsaWVudD4gbUNsaWVudFJlZjsKLSAgICAvLyBvbmx5IHJlYWQKLSAgICBjb25zdCB1aW50MzJfdCBtSWRlbnRpdHk7Ci0gICAgc3RhdGljIGludDMyX3Qgc0lkZW50aXR5OwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0xBWUVSX0JBU0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjY1ZDdhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KLQotI2luY2x1ZGUgIkxheWVyRGltLmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MYXllckRpbTo6TGF5ZXJEaW0oU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQpCi0gICAgOiBMYXllckJhc2VDbGllbnQoZmxpbmdlciwgZGlzcGxheSwgY2xpZW50KQotewotfQotCi1MYXllckRpbTo6fkxheWVyRGltKCkKLXsKLX0KLQotdm9pZCBMYXllckRpbTo6b25EcmF3KGNvbnN0IFJlZ2lvbiYgY2xpcCkgY29uc3QKLXsKLSAgICBjb25zdCBTdGF0ZSYgcyhkcmF3aW5nU3RhdGUoKSk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IGNsaXAuYmVnaW4oKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IGNsaXAuZW5kKCk7Ci0gICAgaWYgKHMuYWxwaGE+MCAmJiAoaXQgIT0gZW5kKSkgewotICAgICAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgYWxwaGEgPSBzLmFscGhhLzI1NS4wZjsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZmJIZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotCi0gICAgICAgIGlmIChzLmFscGhhID09IDB4RkYpIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgICAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xDb2xvcjRmKDAsIDAsIDAsIGFscGhhKTsKLQotICAgICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlcyk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICAgICAgY29uc3QgUmVjdCYgciA9ICppdCsrOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBmYkhlaWdodCAtIChyLnRvcCArIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xTY2lzc29yKHIubGVmdCwgc3ksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsgCi0gICAgICAgIH0KLSAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzcwZTZkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0xBWUVSX0RJTV9ICi0jZGVmaW5lIEFORFJPSURfTEFZRVJfRElNX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8RUdML2VnbC5oPgotI2luY2x1ZGUgPEVHTC9lZ2xleHQuaD4KLQotI2luY2x1ZGUgIkxheWVyQmFzZS5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBMYXllckRpbSA6IHB1YmxpYyBMYXllckJhc2VDbGllbnQKLXsKLXB1YmxpYzogICAgCi0gICAgICAgICAgICAgICAgTGF5ZXJEaW0oU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXIsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KTsKLSAgICAgICAgdmlydHVhbCB+TGF5ZXJEaW0oKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNPcGFxdWUoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzU2VjdXJlKCkgY29uc3QgICAgICAgICB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1Byb3RlY3RlZEJ5QXBwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNQcm90ZWN0ZWRCeURSTSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRUeXBlSWQoKSBjb25zdCB7IHJldHVybiAiTGF5ZXJEaW0iOyB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTEFZRVJfRElNX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyU2NyZWVuc2hvdC5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllclNjcmVlbnNob3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NmNDZlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyU2NyZWVuc2hvdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgotCi0jaW5jbHVkZSAiTGF5ZXJTY3JlZW5zaG90LmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvRGlzcGxheUhhcmR3YXJlLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxheWVyU2NyZWVuc2hvdDo6TGF5ZXJTY3JlZW5zaG90KFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50KQotICAgIDogTGF5ZXJCYXNlQ2xpZW50KGZsaW5nZXIsIGRpc3BsYXksIGNsaWVudCksCi0gICAgICBtVGV4dHVyZU5hbWUoMCksIG1GbGluZ2VyKGZsaW5nZXIpCi17Ci19Ci0KLUxheWVyU2NyZWVuc2hvdDo6fkxheWVyU2NyZWVuc2hvdCgpCi17Ci0gICAgaWYgKG1UZXh0dXJlTmFtZSkgewotICAgICAgICBtRmxpbmdlci0+cG9zdE1lc3NhZ2VBc3luYygKLSAgICAgICAgICAgICAgICBuZXcgU3VyZmFjZUZsaW5nZXI6Ok1lc3NhZ2VEZXN0cm95R0xUZXh0dXJlKG1UZXh0dXJlTmFtZSkgKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IExheWVyU2NyZWVuc2hvdDo6Y2FwdHVyZUxvY2tlZCgpIHsKLSAgICBHTGZsb2F0IHUsIHY7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbUZsaW5nZXItPnJlbmRlclNjcmVlblRvVGV4dHVyZUxvY2tlZCgwLCAmbVRleHR1cmVOYW1lLCAmdSwgJnYpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaW5pdFRleHR1cmUodSwgdik7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBMYXllclNjcmVlbnNob3Q6OmNhcHR1cmUoKSB7Ci0gICAgR0xmbG9hdCB1LCB2OwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1GbGluZ2VyLT5yZW5kZXJTY3JlZW5Ub1RleHR1cmUoMCwgJm1UZXh0dXJlTmFtZSwgJnUsICZ2KTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGluaXRUZXh0dXJlKHUsIHYpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBMYXllclNjcmVlbnNob3Q6OmluaXRUZXh0dXJlKEdMZmxvYXQgdSwgR0xmbG9hdCB2KSB7Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtVGV4dHVyZU5hbWUpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVBfVE9fRURHRSk7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBtVGV4Q29vcmRzWzBdID0gMDsgICAgICAgICBtVGV4Q29vcmRzWzFdID0gdjsKLSAgICBtVGV4Q29vcmRzWzJdID0gMDsgICAgICAgICBtVGV4Q29vcmRzWzNdID0gMDsKLSAgICBtVGV4Q29vcmRzWzRdID0gdTsgICAgICAgICBtVGV4Q29vcmRzWzVdID0gMDsKLSAgICBtVGV4Q29vcmRzWzZdID0gdTsgICAgICAgICBtVGV4Q29vcmRzWzddID0gdjsKLX0KLQotdm9pZCBMYXllclNjcmVlbnNob3Q6OmluaXRTdGF0ZXModWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBMYXllckJhc2VDbGllbnQ6OmluaXRTdGF0ZXModywgaCwgZmxhZ3MpOwotICAgIGlmICghKGZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUhpZGRlbikpIHsKLSAgICAgICAgY2FwdHVyZSgpOwotICAgIH0KLX0KLQotdWludDMyX3QgTGF5ZXJTY3JlZW5zaG90Ojpkb1RyYW5zYWN0aW9uKHVpbnQzMl90IGZsYWdzKQotewotICAgIGNvbnN0IExheWVyOjpTdGF0ZSYgZHJhdyhkcmF3aW5nU3RhdGUoKSk7Ci0gICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBjdXJyKGN1cnJlbnRTdGF0ZSgpKTsKLQotICAgIGlmIChkcmF3LmZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVySGlkZGVuKSB7Ci0gICAgICAgIGlmICghKGN1cnIuZmxhZ3MgJiBJU3VyZmFjZUNvbXBvc2VyOjplTGF5ZXJIaWRkZW4pKSB7Ci0gICAgICAgICAgICAvLyB3ZSdyZSBnb2luZyBmcm9tIGhpZGRlbiB0byB2aXNpYmxlCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBjYXB0dXJlTG9ja2VkKCk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZVNjcmVlbnNob3RTdXJmYWNlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjdXJyLmZsYWdzICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUxheWVySGlkZGVuKSB7Ci0gICAgICAgIC8vIHdlJ3JlIGdvaW5nIGZyb20gdmlzaWJsZSB0byBoaWRkZW4KLSAgICAgICAgaWYgKG1UZXh0dXJlTmFtZSkgewotICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmbVRleHR1cmVOYW1lKTsKLSAgICAgICAgICAgIG1UZXh0dXJlTmFtZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIExheWVyQmFzZUNsaWVudDo6ZG9UcmFuc2FjdGlvbihmbGFncyk7Ci19Ci0KLXZvaWQgTGF5ZXJTY3JlZW5zaG90OjpvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdAotewotICAgIGNvbnN0IFN0YXRlJiBzKGRyYXdpbmdTdGF0ZSgpKTsKLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2xpcC5iZWdpbigpOwotICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgY29uc3QgZW5kID0gY2xpcC5lbmQoKTsKLSAgICBpZiAocy5hbHBoYT4wICYmIChpdCAhPSBlbmQpKSB7Ci0gICAgICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBhbHBoYSA9IHMuYWxwaGEvMjU1LjBmOwotICAgICAgICBjb25zdCB1aW50MzJfdCBmYkhlaWdodCA9IGh3LmdldEhlaWdodCgpOwotCi0gICAgICAgIGlmIChzLmFscGhhID09IDB4RkYpIHsKLSAgICAgICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgICAgICAgICBnbEJsZW5kRnVuYyhHTF9TUkNfQUxQSEEsIEdMX09ORV9NSU5VU19TUkNfQUxQSEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2xDb2xvcjRmKDAsIDAsIDAsIGFscGhhKTsKLQotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKLQotICAgICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1UZXh0dXJlTmFtZSk7Ci0gICAgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0KLSAgICAgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICAgICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIG1UZXhDb29yZHMpOwotICAgICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRkxPQVQsIDAsIG1WZXJ0aWNlcyk7Ci0KLSAgICAgICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICAgICAgY29uc3QgUmVjdCYgciA9ICppdCsrOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBmYkhlaWdodCAtIChyLnRvcCArIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xTY2lzc29yKHIubGVmdCwgc3ksIHIud2lkdGgoKSwgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyU2NyZWVuc2hvdC5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTY3JlZW5zaG90LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTAwNDcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJTY3JlZW5zaG90LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0xBWUVSX1NDUkVFTlNIT1RfSAotI2RlZmluZSBBTkRST0lEX0xBWUVSX1NDUkVFTlNIT1RfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxFR0wvZWdsLmg+Ci0jaW5jbHVkZSA8RUdML2VnbGV4dC5oPgotCi0jaW5jbHVkZSAiTGF5ZXJCYXNlLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIExheWVyU2NyZWVuc2hvdCA6IHB1YmxpYyBMYXllckJhc2VDbGllbnQKLXsKLSAgICBHTHVpbnQgbVRleHR1cmVOYW1lOwotICAgIEdMZmxvYXQgbVRleENvb3Jkc1s4XTsKLSAgICBzcDxTdXJmYWNlRmxpbmdlcj4gbUZsaW5nZXI7Ci1wdWJsaWM6ICAgIAotICAgICAgICAgICAgTGF5ZXJTY3JlZW5zaG90KFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCk7Ci0gICAgICAgIHZpcnR1YWwgfkxheWVyU2NyZWVuc2hvdCgpOwotCi0gICAgICAgIHN0YXR1c190IGNhcHR1cmUoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBpbml0U3RhdGVzKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGRvVHJhbnNhY3Rpb24odWludDMyX3QgZmxhZ3MpOwotICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3QgUmVnaW9uJiBjbGlwKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNPcGFxdWUoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBib29sIGlzU2VjdXJlKCkgY29uc3QgICAgICAgICB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc1Byb3RlY3RlZEJ5QXBwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNQcm90ZWN0ZWRCeURSTSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCBjb25zdCBjaGFyKiBnZXRUeXBlSWQoKSBjb25zdCB7IHJldHVybiAiTGF5ZXJTY3JlZW5zaG90IjsgfQotCi1wcml2YXRlOgotICAgIHN0YXR1c190IGNhcHR1cmVMb2NrZWQoKTsKLSAgICB2b2lkIGluaXRUZXh0dXJlKEdMZmxvYXQgdSwgR0xmbG9hdCB2KTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9MQVlFUl9TQ1JFRU5TSE9UX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTWVzc2FnZVF1ZXVlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01lc3NhZ2VRdWV1ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGZmZjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTWVzc2FnZVF1ZXVlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLQotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGd1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPGd1aS9CaXRUdWJlLmg+Ci0KLSNpbmNsdWRlICJNZXNzYWdlUXVldWUuaCIKLSNpbmNsdWRlICJFdmVudFRocmVhZC5oIgotI2luY2x1ZGUgIlN1cmZhY2VGbGluZ2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU1lc3NhZ2VCYXNlOjpNZXNzYWdlQmFzZSgpCi0gICAgOiBNZXNzYWdlSGFuZGxlcigpIHsKLX0KLQotTWVzc2FnZUJhc2U6On5NZXNzYWdlQmFzZSgpIHsKLX0KLQotdm9pZCBNZXNzYWdlQmFzZTo6aGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJikgewotICAgIHRoaXMtPmhhbmRsZXIoKTsKLSAgICBiYXJyaWVyLm9wZW4oKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6SGFuZGxlcjo6c2lnbmFsUmVmcmVzaCgpIHsKLSAgICBpZiAoKGFuZHJvaWRfYXRvbWljX29yKGV2ZW50TWFza1JlZnJlc2gsICZtRXZlbnRNYXNrKSAmIGV2ZW50TWFza1JlZnJlc2gpID09IDApIHsKLSAgICAgICAgbVF1ZXVlLm1Mb29wZXItPnNlbmRNZXNzYWdlKHRoaXMsIE1lc3NhZ2UoTWVzc2FnZVF1ZXVlOjpSRUZSRVNIKSk7Ci0gICAgfQotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6SGFuZGxlcjo6c2lnbmFsSW52YWxpZGF0ZSgpIHsKLSAgICBpZiAoKGFuZHJvaWRfYXRvbWljX29yKGV2ZW50TWFza0ludmFsaWRhdGUsICZtRXZlbnRNYXNrKSAmIGV2ZW50TWFza0ludmFsaWRhdGUpID09IDApIHsKLSAgICAgICAgbVF1ZXVlLm1Mb29wZXItPnNlbmRNZXNzYWdlKHRoaXMsIE1lc3NhZ2UoTWVzc2FnZVF1ZXVlOjpJTlZBTElEQVRFKSk7Ci0gICAgfQotfQotCi12b2lkIE1lc3NhZ2VRdWV1ZTo6SGFuZGxlcjo6aGFuZGxlTWVzc2FnZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gICAgc3dpdGNoIChtZXNzYWdlLndoYXQpIHsKLSAgICAgICAgY2FzZSBJTlZBTElEQVRFOgotICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5ldmVudE1hc2tJbnZhbGlkYXRlLCAmbUV2ZW50TWFzayk7Ci0gICAgICAgICAgICBtUXVldWUubUZsaW5nZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRUZSRVNIOgotICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfYW5kKH5ldmVudE1hc2tSZWZyZXNoLCAmbUV2ZW50TWFzayk7Ci0gICAgICAgICAgICBtUXVldWUubUZsaW5nZXItPm9uTWVzc2FnZVJlY2VpdmVkKG1lc3NhZ2Uud2hhdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1NZXNzYWdlUXVldWU6Ok1lc3NhZ2VRdWV1ZSgpCi17Ci19Ci0KLU1lc3NhZ2VRdWV1ZTo6fk1lc3NhZ2VRdWV1ZSgpIHsKLX0KLQotdm9pZCBNZXNzYWdlUXVldWU6OmluaXQoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyKQotewotICAgIG1GbGluZ2VyID0gZmxpbmdlcjsKLSAgICBtTG9vcGVyID0gbmV3IExvb3Blcih0cnVlKTsKLSAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCp0aGlzKTsKLX0KLQotdm9pZCBNZXNzYWdlUXVldWU6OnNldEV2ZW50VGhyZWFkKGNvbnN0IHNwPEV2ZW50VGhyZWFkPiYgZXZlbnRUaHJlYWQpCi17Ci0gICAgbUV2ZW50VGhyZWFkID0gZXZlbnRUaHJlYWQ7Ci0gICAgbUV2ZW50cyA9IGV2ZW50VGhyZWFkLT5jcmVhdGVFdmVudENvbm5lY3Rpb24oKTsKLSAgICBtRXZlbnRUdWJlID0gbUV2ZW50cy0+Z2V0RGF0YUNoYW5uZWwoKTsKLSAgICBtTG9vcGVyLT5hZGRGZChtRXZlbnRUdWJlLT5nZXRGZCgpLCAwLCBBTE9PUEVSX0VWRU5UX0lOUFVULAotICAgICAgICAgICAgTWVzc2FnZVF1ZXVlOjpjYl9ldmVudFJlY2VpdmVyLCB0aGlzKTsKLX0KLQotdm9pZCBNZXNzYWdlUXVldWU6OndhaXRNZXNzYWdlKCkgewotICAgIGRvIHsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBpbnQzMl90IHJldCA9IG1Mb29wZXItPnBvbGxPbmNlKC0xKTsKLSAgICAgICAgc3dpdGNoIChyZXQpIHsKLSAgICAgICAgICAgIGNhc2UgQUxPT1BFUl9QT0xMX1dBS0U6Ci0gICAgICAgICAgICBjYXNlIEFMT09QRVJfUE9MTF9DQUxMQkFDSzoKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhc2UgQUxPT1BFUl9QT0xMX0VSUk9SOgotICAgICAgICAgICAgICAgIEFMT0dFKCJBTE9PUEVSX1BPTExfRVJST1IiKTsKLSAgICAgICAgICAgIGNhc2UgQUxPT1BFUl9QT0xMX1RJTUVPVVQ6Ci0gICAgICAgICAgICAgICAgLy8gdGltZW91dCAoc2hvdWxkIG5vdCBoYXBwZW4pCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuCi0gICAgICAgICAgICAgICAgQUxPR0UoIkxvb3Blcjo6cG9sbE9uY2UoKSByZXR1cm5lZCB1bmtub3duIHN0YXR1cyAlZCIsIHJldCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICh0cnVlKTsKLX0KLQotc3RhdHVzX3QgTWVzc2FnZVF1ZXVlOjpwb3N0TWVzc2FnZSgKLSAgICAgICAgY29uc3Qgc3A8TWVzc2FnZUJhc2U+JiBtZXNzYWdlSGFuZGxlciwgbnNlY3NfdCByZWxUaW1lKQotewotICAgIGNvbnN0IE1lc3NhZ2UgZHVtbXlNZXNzYWdlOwotICAgIGlmIChyZWxUaW1lID4gMCkgewotICAgICAgICBtTG9vcGVyLT5zZW5kTWVzc2FnZURlbGF5ZWQocmVsVGltZSwgbWVzc2FnZUhhbmRsZXIsIGR1bW15TWVzc2FnZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxvb3Blci0+c2VuZE1lc3NhZ2UobWVzc2FnZUhhbmRsZXIsIGR1bW15TWVzc2FnZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBNZXNzYWdlUXVldWU6OmludmFsaWRhdGUoKSB7Ci0vLyAgICBtSGFuZGxlci0+c2lnbmFsSW52YWxpZGF0ZSgpOwotICAgIG1FdmVudHMtPnJlcXVlc3ROZXh0VnN5bmMoKTsKLX0KLQotdm9pZCBNZXNzYWdlUXVldWU6OnJlZnJlc2goKSB7Ci0gICAgbUV2ZW50cy0+cmVxdWVzdE5leHRWc3luYygpOwotfQotCi1pbnQgTWVzc2FnZVF1ZXVlOjpjYl9ldmVudFJlY2VpdmVyKGludCBmZCwgaW50IGV2ZW50cywgdm9pZCogZGF0YSkgewotICAgIE1lc3NhZ2VRdWV1ZSogcXVldWUgPSByZWludGVycHJldF9jYXN0PE1lc3NhZ2VRdWV1ZSAqPihkYXRhKTsKLSAgICByZXR1cm4gcXVldWUtPmV2ZW50UmVjZWl2ZXIoZmQsIGV2ZW50cyk7Ci19Ci0KLWludCBNZXNzYWdlUXVldWU6OmV2ZW50UmVjZWl2ZXIoaW50IGZkLCBpbnQgZXZlbnRzKSB7Ci0gICAgc3NpemVfdCBuOwotICAgIERpc3BsYXlFdmVudFJlY2VpdmVyOjpFdmVudCBidWZmZXJbOF07Ci0gICAgd2hpbGUgKChuID0gRGlzcGxheUV2ZW50UmVjZWl2ZXI6OmdldEV2ZW50cyhtRXZlbnRUdWJlLCBidWZmZXIsIDgpKSA+IDApIHsKLSAgICAgICAgZm9yIChpbnQgaT0wIDsgaTxuIDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyW2ldLmhlYWRlci50eXBlID09IERpc3BsYXlFdmVudFJlY2VpdmVyOjpESVNQTEFZX0VWRU5UX1ZTWU5DKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXItPnNpZ25hbFJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9NZXNzYWdlUXVldWUuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01lc3NhZ2VRdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTI5ZTdlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01lc3NhZ2VRdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTUVTU0FHRV9RVUVVRV9ICi0jZGVmaW5lIEFORFJPSURfTUVTU0FHRV9RVUVVRV9ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvb3Blci5oPgotCi0jaW5jbHVkZSA8Z3VpL0Rpc3BsYXlFdmVudFJlY2VpdmVyLmg+Ci0KLSNpbmNsdWRlICJCYXJyaWVyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSURpc3BsYXlFdmVudENvbm5lY3Rpb247Ci1jbGFzcyBFdmVudFRocmVhZDsKLWNsYXNzIFN1cmZhY2VGbGluZ2VyOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTWVzc2FnZUJhc2UgOiBwdWJsaWMgTWVzc2FnZUhhbmRsZXIKLXsKLXB1YmxpYzoKLSAgICBNZXNzYWdlQmFzZSgpOwotICAgIAotICAgIC8vIHJldHVybiB0cnVlIGlmIG1lc3NhZ2UgaGFzIGEgaGFuZGxlcgotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVyKCkgPSAwOwotCi0gICAgLy8gd2FpdHMgZm9yIHRoZSBoYW5kbGVyIHRvIGJlIHByb2Nlc3NlZAotICAgIHZvaWQgd2FpdCgpIGNvbnN0IHsgYmFycmllci53YWl0KCk7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk1lc3NhZ2VCYXNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0KLSAgICBtdXRhYmxlIEJhcnJpZXIgYmFycmllcjsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBNZXNzYWdlUXVldWUgewotICAgIGNsYXNzIEhhbmRsZXIgOiBwdWJsaWMgTWVzc2FnZUhhbmRsZXIgewotICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIGV2ZW50TWFza0ludmFsaWRhdGUgPSAweDEsCi0gICAgICAgICAgICBldmVudE1hc2tSZWZyZXNoICAgID0gMHgyCi0gICAgICAgIH07Ci0gICAgICAgIE1lc3NhZ2VRdWV1ZSYgbVF1ZXVlOwotICAgICAgICBpbnQzMl90IG1FdmVudE1hc2s7Ci0gICAgcHVibGljOgotICAgICAgICBIYW5kbGVyKE1lc3NhZ2VRdWV1ZSYgcXVldWUpIDogbVF1ZXVlKHF1ZXVlKSwgbUV2ZW50TWFzaygwKSB7IH0KLSAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZU1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0gICAgICAgIHZvaWQgc2lnbmFsUmVmcmVzaCgpOwotICAgICAgICB2b2lkIHNpZ25hbEludmFsaWRhdGUoKTsKLSAgICB9OwotCi0gICAgZnJpZW5kIGNsYXNzIEhhbmRsZXI7Ci0KLSAgICBzcDxTdXJmYWNlRmxpbmdlcj4gbUZsaW5nZXI7Ci0gICAgc3A8TG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEV2ZW50VGhyZWFkPiBtRXZlbnRUaHJlYWQ7Ci0gICAgc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IG1FdmVudHM7Ci0gICAgc3A8Qml0VHViZT4gbUV2ZW50VHViZTsKLSAgICBzcDxIYW5kbGVyPiBtSGFuZGxlcjsKLQotCi0gICAgc3RhdGljIGludCBjYl9ldmVudFJlY2VpdmVyKGludCBmZCwgaW50IGV2ZW50cywgdm9pZCogZGF0YSk7Ci0gICAgaW50IGV2ZW50UmVjZWl2ZXIoaW50IGZkLCBpbnQgZXZlbnRzKTsKLQotcHVibGljOgotICAgIGVudW0gewotICAgICAgICBJTlZBTElEQVRFID0gMCwKLSAgICAgICAgUkVGUkVTSCAgICA9IDEsCi0gICAgfTsKLQotICAgIE1lc3NhZ2VRdWV1ZSgpOwotICAgIH5NZXNzYWdlUXVldWUoKTsKLSAgICB2b2lkIGluaXQoY29uc3Qgc3A8U3VyZmFjZUZsaW5nZXI+JiBmbGluZ2VyKTsKLSAgICB2b2lkIHNldEV2ZW50VGhyZWFkKGNvbnN0IHNwPEV2ZW50VGhyZWFkPiYgZXZlbnRzKTsKLQotICAgIHZvaWQgd2FpdE1lc3NhZ2UoKTsKLSAgICBzdGF0dXNfdCBwb3N0TWVzc2FnZShjb25zdCBzcDxNZXNzYWdlQmFzZT4mIG1lc3NhZ2UsIG5zZWNzX3QgcmVsdGltZT0wKTsKLSAgICB2b2lkIGludmFsaWRhdGUoKTsKLSAgICB2b2lkIHJlZnJlc2goKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLyogQU5EUk9JRF9NRVNTQUdFX1FVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2MWZlNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0KLSNpbmNsdWRlIDxndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uaD4KLQotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotI2luY2x1ZGUgPHV0aWxzL1N0b3BXYXRjaC5oPgotI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KLQotI2luY2x1ZGUgPEdMRVMvZ2wuaD4KLQotI2luY2x1ZGUgImNsei5oIgotI2luY2x1ZGUgIkRkbUNvbm5lY3Rpb24uaCIKLSNpbmNsdWRlICJEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmgiCi0jaW5jbHVkZSAiRXZlbnRUaHJlYWQuaCIKLSNpbmNsdWRlICJHTEV4dGVuc2lvbnMuaCIKLSNpbmNsdWRlICJMYXllci5oIgotI2luY2x1ZGUgIkxheWVyRGltLmgiCi0jaW5jbHVkZSAiTGF5ZXJTY3JlZW5zaG90LmgiCi0jaW5jbHVkZSAiU3VyZmFjZUZsaW5nZXIuaCIKLQotI2luY2x1ZGUgIkRpc3BsYXlIYXJkd2FyZS9EaXNwbGF5SGFyZHdhcmUuaCIKLSNpbmNsdWRlICJEaXNwbGF5SGFyZHdhcmUvSFdDb21wb3Nlci5oIgotCi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9ndWkvU2hhcmVkQnVmZmVyU3RhY2suaD4KLQotI2RlZmluZSBFR0xfVkVSU0lPTl9IV19BTkRST0lEICAweDMxNDMKLQotI2RlZmluZSBESVNQTEFZX0NPVU5UICAgICAgIDEKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNvbnN0IFN0cmluZzE2IHNIYXJkd2FyZVRlc3QoImFuZHJvaWQucGVybWlzc2lvbi5IQVJEV0FSRV9URVNUIik7Ci1jb25zdCBTdHJpbmcxNiBzQWNjZXNzU3VyZmFjZUZsaW5nZXIoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfU1VSRkFDRV9GTElOR0VSIik7Ci1jb25zdCBTdHJpbmcxNiBzUmVhZEZyYW1lYnVmZmVyKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVBRF9GUkFNRV9CVUZGRVIiKTsKLWNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotU3VyZmFjZUZsaW5nZXI6OlN1cmZhY2VGbGluZ2VyKCkKLSAgICA6ICAgQm5TdXJmYWNlQ29tcG9zZXIoKSwgVGhyZWFkKGZhbHNlKSwKLSAgICAgICAgbVRyYW5zYWN0aW9uRmxhZ3MoMCksCi0gICAgICAgIG1UcmFuc2F0aW9uUGVuZGluZyhmYWxzZSksCi0gICAgICAgIG1MYXllcnNSZW1vdmVkKGZhbHNlKSwKLSAgICAgICAgbUJvb3RUaW1lKHN5c3RlbVRpbWUoKSksCi0gICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5KGZhbHNlKSwKLSAgICAgICAgbUh3V29ya0xpc3REaXJ0eShmYWxzZSksCi0gICAgICAgIG1FbGVjdHJvbkJlYW1BbmltYXRpb25Nb2RlKDApLAotICAgICAgICBtRGVidWdSZWdpb24oMCksCi0gICAgICAgIG1EZWJ1Z0JhY2tncm91bmQoMCksCi0gICAgICAgIG1EZWJ1Z0RETVMoMCksCi0gICAgICAgIG1EZWJ1Z0Rpc2FibGVIV0MoMCksCi0gICAgICAgIG1EZWJ1Z0Rpc2FibGVUcmFuc2Zvcm1IaW50KDApLAotICAgICAgICBtRGVidWdJblN3YXBCdWZmZXJzKDApLAotICAgICAgICBtTGFzdFN3YXBCdWZmZXJUaW1lKDApLAotICAgICAgICBtRGVidWdJblRyYW5zYWN0aW9uKDApLAotICAgICAgICBtTGFzdFRyYW5zYWN0aW9uVGltZSgwKSwKLSAgICAgICAgbUJvb3RGaW5pc2hlZChmYWxzZSksCi0gICAgICAgIG1Db25zb2xlU2lnbmFscygwKSwKLSAgICAgICAgbVNlY3VyZUZyYW1lQnVmZmVyKDApCi17Ci0gICAgaW5pdCgpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjppbml0KCkKLXsKLSAgICBBTE9HSSgiU3VyZmFjZUZsaW5nZXIgaXMgc3RhcnRpbmciKTsKLQotICAgIC8vIGRlYnVnZ2luZyBzdHVmZi4uLgotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLQotICAgIHByb3BlcnR5X2dldCgiZGVidWcuc2Yuc2hvd3VwZGF0ZXMiLCB2YWx1ZSwgIjAiKTsKLSAgICBtRGVidWdSZWdpb24gPSBhdG9pKHZhbHVlKTsKLQotICAgIHByb3BlcnR5X2dldCgiZGVidWcuc2Yuc2hvd2JhY2tncm91bmQiLCB2YWx1ZSwgIjAiKTsKLSAgICBtRGVidWdCYWNrZ3JvdW5kID0gYXRvaSh2YWx1ZSk7Ci0KLSAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLnNmLmRkbXMiLCB2YWx1ZSwgIjAiKTsKLSAgICBtRGVidWdERE1TID0gYXRvaSh2YWx1ZSk7Ci0gICAgaWYgKG1EZWJ1Z0RETVMpIHsKLSAgICAgICAgRGRtQ29ubmVjdGlvbjo6c3RhcnQoZ2V0U2VydmljZU5hbWUoKSk7Ci0gICAgfQotCi0gICAgQUxPR0lfSUYobURlYnVnUmVnaW9uLCAgICAgICAic2hvd3VwZGF0ZXMgZW5hYmxlZCIpOwotICAgIEFMT0dJX0lGKG1EZWJ1Z0JhY2tncm91bmQsICAgInNob3diYWNrZ3JvdW5kIGVuYWJsZWQiKTsKLSAgICBBTE9HSV9JRihtRGVidWdERE1TLCAgICAgICAgICJERE1TIGRlYnVnZ2luZyBlbmFibGVkIik7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6Om9uRmlyc3RSZWYoKQotewotICAgIG1FdmVudFF1ZXVlLmluaXQodGhpcyk7Ci0KLSAgICBydW4oIlN1cmZhY2VGbGluZ2VyIiwgUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVkpOwotCi0gICAgLy8gV2FpdCBmb3IgdGhlIG1haW4gdGhyZWFkIHRvIGJlIGRvbmUgd2l0aCBpdHMgaW5pdGlhbGl6YXRpb24KLSAgICBtUmVhZHlUb1J1bkJhcnJpZXIud2FpdCgpOwotfQotCi0KLVN1cmZhY2VGbGluZ2VyOjp+U3VyZmFjZUZsaW5nZXIoKQotewotICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJm1Xb3JtaG9sZVRleE5hbWUpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pCi17Ci0gICAgLy8gdGhlIHdpbmRvdyBtYW5hZ2VyIGRpZWQgb24gdXMuIHByZXBhcmUgaXRzIGV1bG9neS4KLQotICAgIC8vIHJlc2V0IHNjcmVlbiBvcmllbnRhdGlvbgotICAgIFZlY3RvcjxDb21wb3NlclN0YXRlPiBzdGF0ZTsKLSAgICBzZXRUcmFuc2FjdGlvblN0YXRlKHN0YXRlLCBlT3JpZW50YXRpb25EZWZhdWx0LCAwKTsKLQotICAgIC8vIHJlc3RhcnQgdGhlIGJvb3QtYW5pbWF0aW9uCi0gICAgcHJvcGVydHlfc2V0KCJjdGwuc3RhcnQiLCAiYm9vdGFuaW0iKTsKLX0KLQotc3A8SU1lbW9yeUhlYXA+IFN1cmZhY2VGbGluZ2VyOjpnZXRDYmxrKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVNlcnZlckhlYXA7Ci19Ci0KLXNwPElTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IFN1cmZhY2VGbGluZ2VyOjpjcmVhdGVDb25uZWN0aW9uKCkKLXsKLSAgICBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBiY2xpZW50OwotICAgIHNwPENsaWVudD4gY2xpZW50KG5ldyBDbGllbnQodGhpcykpOwotICAgIHN0YXR1c190IGVyciA9IGNsaWVudC0+aW5pdENoZWNrKCk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBiY2xpZW50ID0gY2xpZW50OwotICAgIH0KLSAgICByZXR1cm4gYmNsaWVudDsKLX0KLQotc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpCi17Ci0gICAgc3A8R3JhcGhpY0J1ZmZlckFsbG9jPiBnYmEobmV3IEdyYXBoaWNCdWZmZXJBbGxvYygpKTsKLSAgICByZXR1cm4gZ2JhOwotfQotCi1jb25zdCBHcmFwaGljUGxhbmUmIFN1cmZhY2VGbGluZ2VyOjpncmFwaGljUGxhbmUoaW50IGRweSkgY29uc3QKLXsKLSAgICBBTE9HRV9JRih1aW50MzJfdChkcHkpID49IERJU1BMQVlfQ09VTlQsICJJbnZhbGlkIERpc3BsYXlJRCAlZCIsIGRweSk7Ci0gICAgY29uc3QgR3JhcGhpY1BsYW5lJiBwbGFuZShtR3JhcGhpY1BsYW5lc1tkcHldKTsKLSAgICByZXR1cm4gcGxhbmU7Ci19Ci0KLUdyYXBoaWNQbGFuZSYgU3VyZmFjZUZsaW5nZXI6OmdyYXBoaWNQbGFuZShpbnQgZHB5KQotewotICAgIHJldHVybiBjb25zdF9jYXN0PEdyYXBoaWNQbGFuZSY+KAotICAgICAgICBjb25zdF9jYXN0PFN1cmZhY2VGbGluZ2VyIGNvbnN0ICo+KHRoaXMpLT5ncmFwaGljUGxhbmUoZHB5KSk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmJvb3RGaW5pc2hlZCgpCi17Ci0gICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgY29uc3QgbnNlY3NfdCBkdXJhdGlvbiA9IG5vdyAtIG1Cb290VGltZTsKLSAgICBBTE9HSSgiQm9vdCBpcyBmaW5pc2hlZCAoJWxkIG1zKSIsIGxvbmcobnMybXMoZHVyYXRpb24pKSApOwotICAgIG1Cb290RmluaXNoZWQgPSB0cnVlOwotCi0gICAgLy8gd2FpdCBwYXRpZW50bHkgZm9yIHRoZSB3aW5kb3cgbWFuYWdlciBkZWF0aAotICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoIndpbmRvdyIpOwotICAgIHNwPElCaW5kZXI+IHdpbmRvdyhkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShuYW1lKSk7Ci0gICAgaWYgKHdpbmRvdyAhPSAwKSB7Ci0gICAgICAgIHdpbmRvdy0+bGlua1RvRGVhdGgodGhpcyk7Ci0gICAgfQotCi0gICAgLy8gc3RvcCBib290IGFuaW1hdGlvbgotICAgIHByb3BlcnR5X3NldCgiY3RsLnN0b3AiLCAiYm9vdGFuaW0iKTsKLX0KLQotc3RhdGljIGlubGluZSB1aW50MTZfdCBwYWNrNTY1KGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgICByZXR1cm4gKHI8PDExKXwoZzw8NSl8YjsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnJlYWR5VG9SdW4oKQotewotICAgIEFMT0dJKCAgICJTdXJmYWNlRmxpbmdlcidzIG1haW4gdGhyZWFkIHJlYWR5IHRvIHJ1bi4gIgotICAgICAgICAgICAgIkluaXRpYWxpemluZyBncmFwaGljcyBIL1cuLi4iKTsKLQotICAgIC8vIHdlIG9ubHkgc3VwcG9ydCBvbmUgZGlzcGxheSBjdXJyZW50bHkKLSAgICBpbnQgZHB5ID0gMDsKLQotICAgIHsKLSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbWFpbiBkaXNwbGF5Ci0gICAgICAgIEdyYXBoaWNQbGFuZSYgcGxhbmUoZ3JhcGhpY1BsYW5lKGRweSkpOwotICAgICAgICBEaXNwbGF5SGFyZHdhcmUqIGNvbnN0IGh3ID0gbmV3IERpc3BsYXlIYXJkd2FyZSh0aGlzLCBkcHkpOwotICAgICAgICBwbGFuZS5zZXREaXNwbGF5SGFyZHdhcmUoaHcpOwotICAgIH0KLQotICAgIC8vIGNyZWF0ZSB0aGUgc2hhcmVkIGNvbnRyb2wtYmxvY2sKLSAgICBtU2VydmVySGVhcCA9IG5ldyBNZW1vcnlIZWFwQmFzZSg0MDk2LAotICAgICAgICAgICAgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSwgIlN1cmZhY2VGbGluZ2VyIHJlYWQtb25seSBoZWFwIik7Ci0gICAgQUxPR0VfSUYobVNlcnZlckhlYXA9PTAsICJjYW4ndCBjcmVhdGUgc2hhcmVkIG1lbW9yeSBkZWFsZXIiKTsKLQotICAgIG1TZXJ2ZXJDYmxrID0gc3RhdGljX2Nhc3Q8c3VyZmFjZV9mbGluZ2VyX2NibGtfdCo+KG1TZXJ2ZXJIZWFwLT5nZXRCYXNlKCkpOwotICAgIEFMT0dFX0lGKG1TZXJ2ZXJDYmxrPT0wLCAiY2FuJ3QgZ2V0IHRvIHNoYXJlZCBjb250cm9sIGJsb2NrJ3MgYWRkcmVzcyIpOwotCi0gICAgbmV3KG1TZXJ2ZXJDYmxrKSBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwotCi0gICAgLy8gaW5pdGlhbGl6ZSBwcmltYXJ5IHNjcmVlbgotICAgIC8vIChvdGhlciBkaXNwbGF5IHNob3VsZCBiZSBpbml0aWFsaXplZCBpbiB0aGUgc2FtZSBtYW5uZXIsIGJ1dAotICAgIC8vIGFzeW5jaHJvbm91c2x5LCBhcyB0aGV5IGNvdWxkIGNvbWUgYW5kIGdvLiBOb25lIG9mIHRoaXMgaXMgc3VwcG9ydGVkCi0gICAgLy8geWV0KS4KLSAgICBjb25zdCBHcmFwaGljUGxhbmUmIHBsYW5lKGdyYXBoaWNQbGFuZShkcHkpKTsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3ID0gcGxhbmUuZGlzcGxheUhhcmR3YXJlKCk7Ci0gICAgY29uc3QgdWludDMyX3QgdyA9IGh3LmdldFdpZHRoKCk7Ci0gICAgY29uc3QgdWludDMyX3QgaCA9IGh3LmdldEhlaWdodCgpOwotICAgIGNvbnN0IHVpbnQzMl90IGYgPSBody5nZXRGb3JtYXQoKTsKLSAgICBody5tYWtlQ3VycmVudCgpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSB0aGUgc2hhcmVkIGNvbnRyb2wgYmxvY2sKLSAgICBtU2VydmVyQ2Jsay0+Y29ubmVjdGVkIHw9IDE8PGRweTsKLSAgICBkaXNwbGF5X2NibGtfdCogZGNibGsgPSBtU2VydmVyQ2Jsay0+ZGlzcGxheXMgKyBkcHk7Ci0gICAgbWVtc2V0KGRjYmxrLCAwLCBzaXplb2YoZGlzcGxheV9jYmxrX3QpKTsKLSAgICBkY2Jsay0+dyAgICAgICAgICAgID0gcGxhbmUuZ2V0V2lkdGgoKTsKLSAgICBkY2Jsay0+aCAgICAgICAgICAgID0gcGxhbmUuZ2V0SGVpZ2h0KCk7Ci0gICAgZGNibGstPmZvcm1hdCAgICAgICA9IGY7Ci0gICAgZGNibGstPm9yaWVudGF0aW9uICA9IElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbkRlZmF1bHQ7Ci0gICAgZGNibGstPnhkcGkgICAgICAgICA9IGh3LmdldERwaVgoKTsKLSAgICBkY2Jsay0+eWRwaSAgICAgICAgID0gaHcuZ2V0RHBpWSgpOwotICAgIGRjYmxrLT5mcHMgICAgICAgICAgPSBody5nZXRSZWZyZXNoUmF0ZSgpOwotICAgIGRjYmxrLT5kZW5zaXR5ICAgICAgPSBody5nZXREZW5zaXR5KCk7Ci0KLSAgICAvLyBJbml0aWFsaXplIE9wZW5HTHxFUwotICAgIGdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0FMSUdOTUVOVCwgNCk7Ci0gICAgZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7Ci0gICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOwotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOwotICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOwotICAgIGdsRGlzYWJsZShHTF9DVUxMX0ZBQ0UpOwotCi0gICAgY29uc3QgdWludDE2X3QgZzAgPSBwYWNrNTY1KDB4MEYsMHgxRiwweDBGKTsKLSAgICBjb25zdCB1aW50MTZfdCBnMSA9IHBhY2s1NjUoMHgxNywweDJmLDB4MTcpOwotICAgIGNvbnN0IHVpbnQxNl90IHdvcm1ob2xlVGV4RGF0YVs0XSA9IHsgZzAsIGcxLCBnMSwgZzAgfTsKLSAgICBnbEdlblRleHR1cmVzKDEsICZtV29ybWhvbGVUZXhOYW1lKTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1Xb3JtaG9sZVRleE5hbWUpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7Ci0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgMiwgMiwgMCwKLSAgICAgICAgICAgIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHdvcm1ob2xlVGV4RGF0YSk7Ci0KLSAgICBjb25zdCB1aW50MTZfdCBwcm90VGV4RGF0YVtdID0geyBwYWNrNTY1KDB4MDMsIDB4MDMsIDB4MDMpIH07Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAmbVByb3RlY3RlZFRleE5hbWUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVByb3RlY3RlZFRleE5hbWUpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX05FQVJFU1QpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfUkVQRUFUKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX1JFUEVBVCk7Ci0gICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwgMSwgMSwgMCwKLSAgICAgICAgICAgIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHByb3RUZXhEYXRhKTsKLQotICAgIGdsVmlld3BvcnQoMCwgMCwgdywgaCk7Ci0gICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgLy8gcHV0IHRoZSBvcmlnaW4gaW4gdGhlIGxlZnQtYm90dG9tIGNvcm5lcgotICAgIGdsT3J0aG9mKDAsIHcsIDAsIGgsIDAsIDEpOyAvLyBsPTAsIHI9dyA7IGI9MCwgdD1oCi0KLQotICAgIC8vIHN0YXJ0IHRoZSBFdmVudFRocmVhZAotICAgIG1FdmVudFRocmVhZCA9IG5ldyBFdmVudFRocmVhZCh0aGlzKTsKLSAgICBtRXZlbnRRdWV1ZS5zZXRFdmVudFRocmVhZChtRXZlbnRUaHJlYWQpOwotICAgIGh3LnN0YXJ0U2xlZXBNYW5hZ2VtZW50KCk7Ci0KLSAgICAvKgotICAgICAqICBXZSdyZSBub3cgcmVhZHkgdG8gYWNjZXB0IGNsaWVudHMuLi4KLSAgICAgKi8KLQotICAgIG1SZWFkeVRvUnVuQmFycmllci5vcGVuKCk7Ci0KLSAgICAvLyBzdGFydCBib290IGFuaW1hdGlvbgotICAgIHByb3BlcnR5X3NldCgiY3RsLnN0YXJ0IiwgImJvb3RhbmltIik7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBTdXJmYWNlRmxpbmdlcjo6YXV0aGVudGljYXRlU3VyZmFjZVRleHR1cmUoCi0gICAgICAgIGNvbnN0IHNwPElTdXJmYWNlVGV4dHVyZT4mIHN1cmZhY2VUZXh0dXJlKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIHNwPElCaW5kZXI+IHN1cmZhY2VUZXh0dXJlQmluZGVyKHN1cmZhY2VUZXh0dXJlLT5hc0JpbmRlcigpKTsKLQotICAgIC8vIENoZWNrIHRoZSB2aXNpYmxlIGxheWVyIGxpc3QgZm9yIHRoZSBJU3VyZmFjZQotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzID0gbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVo7Ci0gICAgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihjdXJyZW50TGF5ZXJzW2ldKTsKLSAgICAgICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYmMobGF5ZXItPmdldExheWVyQmFzZUNsaWVudCgpKTsKLSAgICAgICAgaWYgKGxiYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB3cDxJQmluZGVyPiBsYmNCaW5kZXIgPSBsYmMtPmdldFN1cmZhY2VUZXh0dXJlQmluZGVyKCk7Ci0gICAgICAgICAgICBpZiAobGJjQmluZGVyID09IHN1cmZhY2VUZXh0dXJlQmluZGVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayB0aGUgbGF5ZXJzIGluIHRoZSBwdXJnYXRvcnkuICBUaGlzIGNoZWNrIGlzIGhlcmUgc28gdGhhdCBpZiBhCi0gICAgLy8gU3VyZmFjZVRleHR1cmUgZ2V0cyBkZXN0cm95ZWQgYmVmb3JlIGFsbCB0aGUgY2xpZW50cyBhcmUgZG9uZSB1c2luZyBpdCwKLSAgICAvLyB0aGUgZXJyb3Igd2lsbCBub3QgYmUgcmVwb3J0ZWQgYXMgInN1cmZhY2UgWFlaIGlzIG5vdCBhdXRoZW50aWNhdGVkIiwgYnV0Ci0gICAgLy8gd2lsbCBpbnN0ZWFkIGZhaWwgbGF0ZXIgb24gd2hlbiB0aGUgY2xpZW50IHRyaWVzIHRvIHVzZSB0aGUgc3VyZmFjZSwKLSAgICAvLyB3aGljaCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgInN1cmZhY2UgWFlaIHJldHVybmVkIGFuIC1FTk9ERVYiLiAgVGhlCi0gICAgLy8gcHVyZ2F0b3JpemVkIGxheWVycyBhcmUgbm8gbGVzcyBhdXRoZW50aWMgdGhhbiB0aGUgdmlzaWJsZSBvbmVzLCBzbyB0aGlzCi0gICAgLy8gc2hvdWxkIG5vdCBjYXVzZSBhbnkgaGFybS4KLSAgICBzaXplX3QgcHVyZ2F0b3J5U2l6ZSA9ICBtTGF5ZXJQdXJnYXRvcnkuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8cHVyZ2F0b3J5U2l6ZSA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihtTGF5ZXJQdXJnYXRvcnkuaXRlbUF0KGkpKTsKLSAgICAgICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYmMobGF5ZXItPmdldExheWVyQmFzZUNsaWVudCgpKTsKLSAgICAgICAgaWYgKGxiYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB3cDxJQmluZGVyPiBsYmNCaW5kZXIgPSBsYmMtPmdldFN1cmZhY2VUZXh0dXJlQmluZGVyKCk7Ci0gICAgICAgICAgICBpZiAobGJjQmluZGVyID09IHN1cmZhY2VUZXh0dXJlQmluZGVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3A8SURpc3BsYXlFdmVudENvbm5lY3Rpb24+IFN1cmZhY2VGbGluZ2VyOjpjcmVhdGVEaXNwbGF5RXZlbnRDb25uZWN0aW9uKCkgewotICAgIHJldHVybiBtRXZlbnRUaHJlYWQtPmNyZWF0ZUV2ZW50Q29ubmVjdGlvbigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OndhaXRGb3JFdmVudCgpIHsKLSAgICBtRXZlbnRRdWV1ZS53YWl0TWVzc2FnZSgpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpzaWduYWxUcmFuc2FjdGlvbigpIHsKLSAgICBtRXZlbnRRdWV1ZS5pbnZhbGlkYXRlKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnNpZ25hbExheWVyVXBkYXRlKCkgewotICAgIG1FdmVudFF1ZXVlLmludmFsaWRhdGUoKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6c2lnbmFsUmVmcmVzaCgpIHsKLSAgICBtRXZlbnRRdWV1ZS5yZWZyZXNoKCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpwb3N0TWVzc2FnZUFzeW5jKGNvbnN0IHNwPE1lc3NhZ2VCYXNlPiYgbXNnLAotICAgICAgICBuc2Vjc190IHJlbHRpbWUsIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgcmV0dXJuIG1FdmVudFF1ZXVlLnBvc3RNZXNzYWdlKG1zZywgcmVsdGltZSk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpwb3N0TWVzc2FnZVN5bmMoY29uc3Qgc3A8TWVzc2FnZUJhc2U+JiBtc2csCi0gICAgICAgIG5zZWNzX3QgcmVsdGltZSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBtRXZlbnRRdWV1ZS5wb3N0TWVzc2FnZShtc2csIHJlbHRpbWUpOwotICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgbXNnLT53YWl0KCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLWJvb2wgU3VyZmFjZUZsaW5nZXI6OnRocmVhZExvb3AoKQotewotICAgIHdhaXRGb3JFdmVudCgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpvbk1lc3NhZ2VSZWNlaXZlZChpbnQzMl90IHdoYXQpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgY2FzZSBNZXNzYWdlUXVldWU6OlJFRlJFU0g6IHsKLS8vICAgICAgICBjYXNlIE1lc3NhZ2VRdWV1ZTo6SU5WQUxJREFURTogewotICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHRyYW5zYWN0aW9ucwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKG1Db25zb2xlU2lnbmFscykpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVDb25zb2xlRXZlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGEgZ2xvYmFsIHRyYW5zYWN0aW9uLCBkb24ndCBkbyBhbnl0aGluZy4KLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IG1hc2sgPSBlVHJhbnNhY3Rpb25OZWVkZWQgfCBlVHJhdmVyc2FsTmVlZGVkOwotICAgICAgICAgICAgdWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyA9IHBlZWtUcmFuc2FjdGlvbkZsYWdzKG1hc2spOwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHRyYW5zYWN0aW9uRmxhZ3MpKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25GbGFncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBvc3Qgc3VyZmFjZXMgKGlmIG5lZWRlZCkKLSAgICAgICAgICAgIGhhbmRsZVBhZ2VGbGlwKCk7Ci0KLS8vICAgICAgICAgICAgc2lnbmFsUmVmcmVzaCgpOwotLy8KLS8vICAgICAgICB9IGJyZWFrOwotLy8KLS8vICAgICAgICBjYXNlIE1lc3NhZ2VRdWV1ZTo6UkVGUkVTSDogewotCi0gICAgICAgICAgICBoYW5kbGVSZWZyZXNoKCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLQotLy8gICAgICAgICAgICBpZiAobURpcnR5UmVnaW9uLmlzRW1wdHkoKSkgewotLy8gICAgICAgICAgICAgICAgcmV0dXJuOwotLy8gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShtSHdXb3JrTGlzdERpcnR5KSkgewotICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHRoZSBoL3cgd29yayBsaXN0Ci0gICAgICAgICAgICAgICAgaGFuZGxlV29ya0xpc3QoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKENDX0xJS0VMWShody5jYW5EcmF3KCkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVwYWludCB0aGUgZnJhbWVidWZmZXIgKGlmIG5lZWRlZCkKLSAgICAgICAgICAgICAgICBoYW5kbGVSZXBhaW50KCk7Ci0gICAgICAgICAgICAgICAgLy8gaW5mb3JtIHRoZSBoL3cgdGhhdCB3ZSdyZSBkb25lIGNvbXBvc2l0aW5nCi0gICAgICAgICAgICAgICAgaHcuY29tcG9zaXRpb25Db21wbGV0ZSgpOwotICAgICAgICAgICAgICAgIHBvc3RGcmFtZWJ1ZmZlcigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBwcmV0ZW5kIHdlIGRpZCB0aGUgcG9zdAotICAgICAgICAgICAgICAgIGh3LmNvbXBvc2l0aW9uQ29tcGxldGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6cG9zdEZyYW1lYnVmZmVyKCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIC8vIG1Td2FwUmVnaW9uIGNhbiBiZSBlbXB0eSBoZXJlIGlzIHNvbWUgY2FzZXMsIGZvciBpbnN0YW5jZSBpZiBhIGhpZGRlbgotICAgIC8vIG9yIGZ1bGx5IHRyYW5zcGFyZW50IHdpbmRvdyBpcyB1cGRhdGluZy4KLSAgICAvLyBpbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gZmxpcCBhbnl3YXlzIHRvIG5vdCByaXNrIGEgZGVhZGxvY2sgd2l0aAotICAgIC8vIGgvdyBjb21wb3Nlci4KLQotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICBtRGVidWdJblN3YXBCdWZmZXJzID0gbm93OwotICAgIGh3LmZsaXAobVN3YXBSZWdpb24pOwotCi0gICAgc2l6ZV90IG51bUxheWVycyA9IG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUxheWVyczsgaSsrKSB7Ci0gICAgICAgIG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaW2ldLT5vbkxheWVyRGlzcGxheWVkKCk7Ci0gICAgfQotCi0gICAgbUxhc3RTd2FwQnVmZmVyVGltZSA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKLSAgICBtRGVidWdJblN3YXBCdWZmZXJzID0gMDsKLSAgICBtU3dhcFJlZ2lvbi5jbGVhcigpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVDb25zb2xlRXZlbnRzKCkKLXsKLSAgICAvLyBzb21ldGhpbmcgdG8gZG8gd2l0aCB0aGUgY29uc29sZQotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcgPSBncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCk7Ci0KLSAgICBpbnQgd2hhdCA9IGFuZHJvaWRfYXRvbWljX2FuZCgwLCAmbUNvbnNvbGVTaWduYWxzKTsKLSAgICBpZiAod2hhdCAmIGVDb25zb2xlQWNxdWlyZWQpIHsKLSAgICAgICAgaHcuYWNxdWlyZVNjcmVlbigpOwotICAgICAgICAvLyB0aGlzIGlzIGEgdGVtcG9yYXJ5IHdvcmstYXJvdW5kLCBldmVudHVhbGx5IHRoaXMgc2hvdWxkIGJlIGNhbGxlZAotICAgICAgICAvLyBieSB0aGUgcG93ZXItbWFuYWdlcgotICAgICAgICBTdXJmYWNlRmxpbmdlcjo6dHVybkVsZWN0cm9uQmVhbU9uKG1FbGVjdHJvbkJlYW1BbmltYXRpb25Nb2RlKTsKLSAgICB9Ci0KLSAgICBpZiAod2hhdCAmIGVDb25zb2xlUmVsZWFzZWQpIHsKLSAgICAgICAgaWYgKGh3LmlzU2NyZWVuQWNxdWlyZWQoKSkgewotICAgICAgICAgICAgaHcucmVsZWFzZVNjcmVlbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbURpcnR5UmVnaW9uLnNldChody5ib3VuZHMoKSk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVRyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKLSAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICBtRGVidWdJblRyYW5zYWN0aW9uID0gbm93OwotCi0gICAgLy8gSGVyZSB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgc29tZSB0cmFuc2FjdGlvbiBmbGFncyBhcmUgc2V0Ci0gICAgLy8gc28gd2UgY2FuIGNhbGwgaGFuZGxlVHJhbnNhY3Rpb25Mb2NrZWQoKSB1bmNvbmRpdGlvbmFsbHkuCi0gICAgLy8gV2UgY2FsbCBnZXRUcmFuc2FjdGlvbkZsYWdzKCksIHdoaWNoIHdpbGwgYWxzbyBjbGVhciB0aGUgZmxhZ3MsCi0gICAgLy8gd2l0aCBtU3RhdGVMb2NrIGhlbGQgdG8gZ3VhcmFudGVlIHRoYXQgbUN1cnJlbnRTdGF0ZSB3b24ndCBjaGFuZ2UKLSAgICAvLyB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgotCi0gICAgY29uc3QgdWludDMyX3QgbWFzayA9IGVUcmFuc2FjdGlvbk5lZWRlZCB8IGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgdHJhbnNhY3Rpb25GbGFncyA9IGdldFRyYW5zYWN0aW9uRmxhZ3MobWFzayk7Ci0gICAgaGFuZGxlVHJhbnNhY3Rpb25Mb2NrZWQodHJhbnNhY3Rpb25GbGFncyk7Ci0KLSAgICBtTGFzdFRyYW5zYWN0aW9uVGltZSA9IHN5c3RlbVRpbWUoKSAtIG5vdzsKLSAgICBtRGVidWdJblRyYW5zYWN0aW9uID0gMDsKLSAgICBpbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAvLyBoZXJlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYmVlbiBjb21taXR0ZWQKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlVHJhbnNhY3Rpb25Mb2NrZWQodWludDMyX3QgdHJhbnNhY3Rpb25GbGFncykKLXsKLSAgICBjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyhtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5Wik7Ci0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0KLSAgICAvKgotICAgICAqIFRyYXZlcnNhbCBvZiB0aGUgY2hpbGRyZW4KLSAgICAgKiAocGVyZm9ybSB0aGUgdHJhbnNhY3Rpb24gZm9yIGVhY2ggb2YgdGhlbSBpZiBuZWVkZWQpCi0gICAgICovCi0KLSAgICBjb25zdCBib29sIGxheWVyc05lZWRUcmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uRmxhZ3MgJiBlVHJhdmVyc2FsTmVlZGVkOwotICAgIGlmIChsYXllcnNOZWVkVHJhbnNhY3Rpb24pIHsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIgPSBjdXJyZW50TGF5ZXJzW2ldOwotICAgICAgICAgICAgdWludDMyX3QgdHJGbGFncyA9IGxheWVyLT5nZXRUcmFuc2FjdGlvbkZsYWdzKGVUcmFuc2FjdGlvbk5lZWRlZCk7Ci0gICAgICAgICAgICBpZiAoIXRyRmxhZ3MpIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBmbGFncyA9IGxheWVyLT5kb1RyYW5zYWN0aW9uKDApOwotICAgICAgICAgICAgaWYgKGZsYWdzICYgTGF5ZXI6OmVWaXNpYmxlUmVnaW9uKQotICAgICAgICAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUGVyZm9ybSBvdXIgb3duIHRyYW5zYWN0aW9uIGlmIG5lZWRlZAotICAgICAqLwotCi0gICAgaWYgKHRyYW5zYWN0aW9uRmxhZ3MgJiBlVHJhbnNhY3Rpb25OZWVkZWQpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUub3JpZW50YXRpb24gIT0gbURyYXdpbmdTdGF0ZS5vcmllbnRhdGlvbikgewotICAgICAgICAgICAgLy8gdGhlIG9yaWVudGF0aW9uIGhhcyBjaGFuZ2VkLCByZWNvbXB1dGUgYWxsIHZpc2libGUgcmVnaW9ucwotICAgICAgICAgICAgLy8gYW5kIGludmFsaWRhdGUgZXZlcnl0aGluZy4KLQotICAgICAgICAgICAgY29uc3QgaW50IGRweSA9IDA7Ci0gICAgICAgICAgICBjb25zdCBpbnQgb3JpZW50YXRpb24gPSBtQ3VycmVudFN0YXRlLm9yaWVudGF0aW9uOwotICAgICAgICAgICAgLy8gQ3VycmVudGx5IHVudXNlZDogY29uc3QgdWludDMyX3QgZmxhZ3MgPSBtQ3VycmVudFN0YXRlLm9yaWVudGF0aW9uRmxhZ3M7Ci0gICAgICAgICAgICBHcmFwaGljUGxhbmUmIHBsYW5lKGdyYXBoaWNQbGFuZShkcHkpKTsKLSAgICAgICAgICAgIHBsYW5lLnNldE9yaWVudGF0aW9uKG9yaWVudGF0aW9uKTsKLQotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBzaGFyZWQgY29udHJvbCBibG9jawotICAgICAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhwbGFuZS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgICAgICAgICB2b2xhdGlsZSBkaXNwbGF5X2NibGtfdCogZGNibGsgPSBtU2VydmVyQ2Jsay0+ZGlzcGxheXMgKyBkcHk7Ci0gICAgICAgICAgICBkY2Jsay0+b3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLSAgICAgICAgICAgIGRjYmxrLT53ID0gcGxhbmUuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGRjYmxrLT5oID0gcGxhbmUuZ2V0SGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1EaXJ0eVJlZ2lvbi5zZXQoaHcuYm91bmRzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRMYXllcnMuc2l6ZSgpID4gbURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVouc2l6ZSgpKSB7Ci0gICAgICAgICAgICAvLyBsYXllcnMgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eSA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzb21lIGxheWVycyBtaWdodCBoYXZlIGJlZW4gcmVtb3ZlZCwgc28KLSAgICAgICAgLy8gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHJlZ2lvbnMgdGhleSdyZSBleHBvc2luZy4KLSAgICAgICAgaWYgKG1MYXllcnNSZW1vdmVkKSB7Ci0gICAgICAgICAgICBtTGF5ZXJzUmVtb3ZlZCA9IGZhbHNlOwotICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHkgPSB0cnVlOwotICAgICAgICAgICAgY29uc3QgTGF5ZXJWZWN0b3ImIHByZXZpb3VzTGF5ZXJzKG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IHByZXZpb3VzTGF5ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihwcmV2aW91c0xheWVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMYXllcnMuaW5kZXhPZiggbGF5ZXIgKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBsYXllciBpcyBub3QgdmlzaWJsZSBhbnltb3JlCi0gICAgICAgICAgICAgICAgICAgIG1EaXJ0eVJlZ2lvblJlbW92ZWRMYXllci5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGNvbW1pdFRyYW5zYWN0aW9uKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmNvbXB1dGVWaXNpYmxlUmVnaW9ucygKLSAgICBjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycywgUmVnaW9uJiBkaXJ0eVJlZ2lvbiwgUmVnaW9uJiBvcGFxdWVSZWdpb24pCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIGNvbnN0IEdyYXBoaWNQbGFuZSYgcGxhbmUoZ3JhcGhpY1BsYW5lKDApKTsKLSAgICBjb25zdCBUcmFuc2Zvcm0mIHBsYW5lVHJhbnNmb3JtKHBsYW5lLnRyYW5zZm9ybSgpKTsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KHBsYW5lLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCBSZWdpb24gc2NyZWVuUmVnaW9uKGh3LmJvdW5kcygpKTsKLQotICAgIFJlZ2lvbiBhYm92ZU9wYXF1ZUxheWVyczsKLSAgICBSZWdpb24gYWJvdmVDb3ZlcmVkTGF5ZXJzOwotICAgIFJlZ2lvbiBkaXJ0eTsKLQotICAgIGJvb2wgc2VjdXJlRnJhbWVCdWZmZXIgPSBmYWxzZTsKLQotICAgIHNpemVfdCBpID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgd2hpbGUgKGktLSkgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllciA9IGN1cnJlbnRMYXllcnNbaV07Ci0gICAgICAgIGxheWVyLT52YWxpZGF0ZVZpc2liaWxpdHkocGxhbmVUcmFuc2Zvcm0pOwotCi0gICAgICAgIC8vIHN0YXJ0IHdpdGggdGhlIHdob2xlIHN1cmZhY2UgYXQgaXRzIGN1cnJlbnQgbG9jYXRpb24KLSAgICAgICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBzKGxheWVyLT5kcmF3aW5nU3RhdGUoKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogb3BhcXVlUmVnaW9uOiBhcmVhIG9mIGEgc3VyZmFjZSB0aGF0IGlzIGZ1bGx5IG9wYXF1ZS4KLSAgICAgICAgICovCi0gICAgICAgIFJlZ2lvbiBvcGFxdWVSZWdpb247Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogdmlzaWJsZVJlZ2lvbjogYXJlYSBvZiBhIHN1cmZhY2UgdGhhdCBpcyB2aXNpYmxlIG9uIHNjcmVlbgotICAgICAgICAgKiBhbmQgbm90IGZ1bGx5IHRyYW5zcGFyZW50LiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBsYXllcidzCi0gICAgICAgICAqIGZvb3RwcmludCBtaW51cyB0aGUgb3BhcXVlIHJlZ2lvbnMgYWJvdmUgaXQuCi0gICAgICAgICAqIEFyZWFzIGNvdmVyZWQgYnkgYSB0cmFuc2x1Y2VudCBzdXJmYWNlIGFyZSBjb25zaWRlcmVkIHZpc2libGUuCi0gICAgICAgICAqLwotICAgICAgICBSZWdpb24gdmlzaWJsZVJlZ2lvbjsKLQotICAgICAgICAvKgotICAgICAgICAgKiBjb3ZlcmVkUmVnaW9uOiBhcmVhIG9mIGEgc3VyZmFjZSB0aGF0IGlzIGNvdmVyZWQgYnkgYWxsCi0gICAgICAgICAqIHZpc2libGUgcmVnaW9ucyBhYm92ZSBpdCAod2hpY2ggaW5jbHVkZXMgdGhlIHRyYW5zbHVjZW50IGFyZWFzKS4KLSAgICAgICAgICovCi0gICAgICAgIFJlZ2lvbiBjb3ZlcmVkUmVnaW9uOwotCi0KLSAgICAgICAgLy8gaGFuZGxlIGhpZGRlbiBzdXJmYWNlcyBieSBzZXR0aW5nIHRoZSB2aXNpYmxlIHJlZ2lvbiB0byBlbXB0eQotICAgICAgICBpZiAoQ0NfTElLRUxZKCEocy5mbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckhpZGRlbikgJiYgcy5hbHBoYSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgdHJhbnNsdWNlbnQgPSAhbGF5ZXItPmlzT3BhcXVlKCk7Ci0gICAgICAgICAgICBjb25zdCBSZWN0IGJvdW5kcyhsYXllci0+dmlzaWJsZUJvdW5kcygpKTsKLSAgICAgICAgICAgIHZpc2libGVSZWdpb24uc2V0KGJvdW5kcyk7Ci0gICAgICAgICAgICB2aXNpYmxlUmVnaW9uLmFuZFNlbGYoc2NyZWVuUmVnaW9uKTsKLSAgICAgICAgICAgIGlmICghdmlzaWJsZVJlZ2lvbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRyYW5zcGFyZW50IGFyZWEgZnJvbSB0aGUgdmlzaWJsZSByZWdpb24KLSAgICAgICAgICAgICAgICBpZiAodHJhbnNsdWNlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVJlZ2lvbi5zdWJ0cmFjdFNlbGYobGF5ZXItPnRyYW5zcGFyZW50UmVnaW9uU2NyZWVuKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBvcGFxdWUgcmVnaW9uCi0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBsYXllck9yaWVudGF0aW9uID0gbGF5ZXItPmdldE9yaWVudGF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHMuYWxwaGE9PTI1NSAmJiAhdHJhbnNsdWNlbnQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICgobGF5ZXJPcmllbnRhdGlvbiAmIFRyYW5zZm9ybTo6Uk9UX0lOVkFMSUQpID09IGZhbHNlKSkgewotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb3BhcXVlIHJlZ2lvbiBpcyB0aGUgbGF5ZXIncyBmb290cHJpbnQKLSAgICAgICAgICAgICAgICAgICAgb3BhcXVlUmVnaW9uID0gdmlzaWJsZVJlZ2lvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDbGlwIHRoZSBjb3ZlcmVkIHJlZ2lvbiB0byB0aGUgdmlzaWJsZSByZWdpb24KLSAgICAgICAgY292ZXJlZFJlZ2lvbiA9IGFib3ZlQ292ZXJlZExheWVycy5pbnRlcnNlY3QodmlzaWJsZVJlZ2lvbik7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGFib3ZlQ292ZXJlZExheWVycyBmb3IgbmV4dCAobG93ZXIpIGxheWVyCi0gICAgICAgIGFib3ZlQ292ZXJlZExheWVycy5vclNlbGYodmlzaWJsZVJlZ2lvbik7Ci0KLSAgICAgICAgLy8gc3VidHJhY3QgdGhlIG9wYXF1ZSByZWdpb24gY292ZXJlZCBieSB0aGUgbGF5ZXJzIGFib3ZlIHVzCi0gICAgICAgIHZpc2libGVSZWdpb24uc3VidHJhY3RTZWxmKGFib3ZlT3BhcXVlTGF5ZXJzKTsKLQotICAgICAgICAvLyBjb21wdXRlIHRoaXMgbGF5ZXIncyBkaXJ0eSByZWdpb24KLSAgICAgICAgaWYgKGxheWVyLT5jb250ZW50RGlydHkpIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUgd2hvbGUgcmVnaW9uCi0gICAgICAgICAgICBkaXJ0eSA9IHZpc2libGVSZWdpb247Ci0gICAgICAgICAgICAvLyBhcyB3ZWxsLCBhcyB0aGUgb2xkIHZpc2libGUgcmVnaW9uCi0gICAgICAgICAgICBkaXJ0eS5vclNlbGYobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pOwotICAgICAgICAgICAgbGF5ZXItPmNvbnRlbnREaXJ0eSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY29tcHV0ZSB0aGUgZXhwb3NlZCByZWdpb246Ci0gICAgICAgICAgICAgKiAgIHRoZSBleHBvc2VkIHJlZ2lvbiBjb25zaXN0cyBvZiB0d28gY29tcG9uZW50czoKLSAgICAgICAgICAgICAqICAgMSkgd2hhdCdzIFZJU0lCTEUgbm93IGFuZCB3YXMgQ09WRVJFRCBiZWZvcmUKLSAgICAgICAgICAgICAqICAgMikgd2hhdCdzIEVYUE9TRUQgbm93IGxlc3Mgd2hhdCB3YXMgRVhQT1NFRCBiZWZvcmUKLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBub3RlIHRoYXQgKDEpIGlzIGNvbnNlcnZhdGl2ZSwgd2Ugc3RhcnQgd2l0aCB0aGUgd2hvbGUKLSAgICAgICAgICAgICAqIHZpc2libGUgcmVnaW9uIGJ1dCBvbmx5IGtlZXAgd2hhdCB1c2VkIHRvIGJlIGNvdmVyZWQgYnkKLSAgICAgICAgICAgICAqIHNvbWV0aGluZyAtLSB3aGljaCBtZWFuIGl0IG1heSBoYXZlIGJlZW4gZXhwb3NlZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAoMikgaGFuZGxlcyBhcmVhcyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgYW55dGhpbmcgYnV0IGdvdAotICAgICAgICAgICAgICogZXhwb3NlZCBiZWNhdXNlIG9mIGEgcmVzaXplLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBjb25zdCBSZWdpb24gbmV3RXhwb3NlZCA9IHZpc2libGVSZWdpb24gLSBjb3ZlcmVkUmVnaW9uOwotICAgICAgICAgICAgY29uc3QgUmVnaW9uIG9sZFZpc2libGVSZWdpb24gPSBsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbjsKLSAgICAgICAgICAgIGNvbnN0IFJlZ2lvbiBvbGRDb3ZlcmVkUmVnaW9uID0gbGF5ZXItPmNvdmVyZWRSZWdpb25TY3JlZW47Ci0gICAgICAgICAgICBjb25zdCBSZWdpb24gb2xkRXhwb3NlZCA9IG9sZFZpc2libGVSZWdpb24gLSBvbGRDb3ZlcmVkUmVnaW9uOwotICAgICAgICAgICAgZGlydHkgPSAodmlzaWJsZVJlZ2lvbiZvbGRDb3ZlcmVkUmVnaW9uKSB8IChuZXdFeHBvc2VkLW9sZEV4cG9zZWQpOwotICAgICAgICB9Ci0gICAgICAgIGRpcnR5LnN1YnRyYWN0U2VsZihhYm92ZU9wYXF1ZUxheWVycyk7Ci0KLSAgICAgICAgLy8gYWNjdW11bGF0ZSB0byB0aGUgc2NyZWVuIGRpcnR5IHJlZ2lvbgotICAgICAgICBkaXJ0eVJlZ2lvbi5vclNlbGYoZGlydHkpOwotCi0gICAgICAgIC8vIFVwZGF0ZSBhYm92ZU9wYXF1ZUxheWVycyBmb3IgbmV4dCAobG93ZXIpIGxheWVyCi0gICAgICAgIGFib3ZlT3BhcXVlTGF5ZXJzLm9yU2VsZihvcGFxdWVSZWdpb24pOwotCi0gICAgICAgIC8vIFN0b3JlIHRoZSB2aXNpYmxlIHJlZ2lvbiBpcyBzY3JlZW4gc3BhY2UKLSAgICAgICAgbGF5ZXItPnNldFZpc2libGVSZWdpb24odmlzaWJsZVJlZ2lvbik7Ci0gICAgICAgIGxheWVyLT5zZXRDb3ZlcmVkUmVnaW9uKGNvdmVyZWRSZWdpb24pOwotCi0gICAgICAgIC8vIElmIGEgc2VjdXJlIGxheWVyIGlzIHBhcnRpYWxseSB2aXNpYmxlLCBsb2NrLWRvd24gdGhlIHNjcmVlbiEKLSAgICAgICAgaWYgKGxheWVyLT5pc1NlY3VyZSgpICYmICF2aXNpYmxlUmVnaW9uLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc2VjdXJlRnJhbWVCdWZmZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gaW52YWxpZGF0ZSB0aGUgYXJlYXMgd2hlcmUgYSBsYXllciB3YXMgcmVtb3ZlZAotICAgIGRpcnR5UmVnaW9uLm9yU2VsZihtRGlydHlSZWdpb25SZW1vdmVkTGF5ZXIpOwotICAgIG1EaXJ0eVJlZ2lvblJlbW92ZWRMYXllci5jbGVhcigpOwotCi0gICAgbVNlY3VyZUZyYW1lQnVmZmVyID0gc2VjdXJlRnJhbWVCdWZmZXI7Ci0gICAgb3BhcXVlUmVnaW9uID0gYWJvdmVPcGFxdWVMYXllcnM7Ci19Ci0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6Y29tbWl0VHJhbnNhY3Rpb24oKQotewotICAgIGlmICghbUxheWVyc1BlbmRpbmdSZW1vdmFsLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBOb3RpZnkgcmVtb3ZlZCBsYXllcnMgbm93IHRoYXQgdGhleSBjYW4ndCBiZSBkcmF3biBmcm9tCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUxheWVyc1BlbmRpbmdSZW1vdmFsLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtTGF5ZXJzUGVuZGluZ1JlbW92YWxbaV0tPm9uUmVtb3ZlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG1MYXllcnNQZW5kaW5nUmVtb3ZhbC5jbGVhcigpOwotICAgIH0KLQotICAgIG1EcmF3aW5nU3RhdGUgPSBtQ3VycmVudFN0YXRlOwotICAgIG1UcmFuc2F0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgIG1UcmFuc2FjdGlvbkNWLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVQYWdlRmxpcCgpCi17Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3ID0gZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpOwotICAgIGNvbnN0IFJlZ2lvbiBzY3JlZW5SZWdpb24oaHcuYm91bmRzKCkpOwotCi0gICAgY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMobURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOwotICAgIGNvbnN0IGJvb2wgdmlzaWJsZVJlZ2lvbnMgPSBsb2NrUGFnZUZsaXAoY3VycmVudExheWVycyk7Ci0KLSAgICAgICAgaWYgKHZpc2libGVSZWdpb25zIHx8IG1WaXNpYmxlUmVnaW9uc0RpcnR5KSB7Ci0gICAgICAgICAgICBSZWdpb24gb3BhcXVlUmVnaW9uOwotICAgICAgICAgICAgY29tcHV0ZVZpc2libGVSZWdpb25zKGN1cnJlbnRMYXllcnMsIG1EaXJ0eVJlZ2lvbiwgb3BhcXVlUmVnaW9uKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICByZWJ1aWxkIHRoZSB2aXNpYmxlIGxheWVyIGxpc3QKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgICAgICAgICBtVmlzaWJsZUxheWVyc1NvcnRlZEJ5Wi5jbGVhcigpOwotICAgICAgICAgICAgbVZpc2libGVMYXllcnNTb3J0ZWRCeVouc2V0Q2FwYWNpdHkoY291bnQpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghY3VycmVudExheWVyc1tpXS0+dmlzaWJsZVJlZ2lvblNjcmVlbi5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaLmFkZChjdXJyZW50TGF5ZXJzW2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVdvcm1ob2xlUmVnaW9uID0gc2NyZWVuUmVnaW9uLnN1YnRyYWN0KG9wYXF1ZVJlZ2lvbik7Ci0gICAgICAgICAgICBtVmlzaWJsZVJlZ2lvbnNEaXJ0eSA9IGZhbHNlOwotICAgICAgICAgICAgaW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCk7Ci0gICAgICAgIH0KLQotICAgIHVubG9ja1BhZ2VGbGlwKGN1cnJlbnRMYXllcnMpOwotCi0gICAgbURpcnR5UmVnaW9uLm9yU2VsZihnZXRBbmRDbGVhckludmFsaWRhdGVSZWdpb24oKSk7Ci0gICAgbURpcnR5UmVnaW9uLmFuZFNlbGYoc2NyZWVuUmVnaW9uKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCkKLXsKLSAgICBtSHdXb3JrTGlzdERpcnR5ID0gdHJ1ZTsKLX0KLQotYm9vbCBTdXJmYWNlRmxpbmdlcjo6bG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKQotewotICAgIGJvb2wgcmVjb21wdXRlVmlzaWJsZVJlZ2lvbnMgPSBmYWxzZTsKLSAgICBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBzcDxMYXllckJhc2U+IGNvbnN0KiBsYXllcnMgPSBjdXJyZW50TGF5ZXJzLmFycmF5KCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwotICAgICAgICBsYXllci0+bG9ja1BhZ2VGbGlwKHJlY29tcHV0ZVZpc2libGVSZWdpb25zKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlY29tcHV0ZVZpc2libGVSZWdpb25zOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjp1bmxvY2tQYWdlRmxpcChjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycykKLXsKLSAgICBjb25zdCBHcmFwaGljUGxhbmUmIHBsYW5lKGdyYXBoaWNQbGFuZSgwKSk7Ci0gICAgY29uc3QgVHJhbnNmb3JtJiBwbGFuZVRyYW5zZm9ybShwbGFuZS50cmFuc2Zvcm0oKSk7Ci0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgc3A8TGF5ZXJCYXNlPiBjb25zdCogbGF5ZXJzID0gY3VycmVudExheWVycy5hcnJheSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKLSAgICAgICAgbGF5ZXItPnVubG9ja1BhZ2VGbGlwKHBsYW5lVHJhbnNmb3JtLCBtRGlydHlSZWdpb24pOwotICAgIH0KLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlUmVmcmVzaCgpCi17Ci0gICAgYm9vbCBuZWVkSW52YWxpZGF0ZSA9IGZhbHNlOwotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKG1EcmF3aW5nU3RhdGUubGF5ZXJzU29ydGVkQnlaKTsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICBpZiAobGF5ZXItPm9uUHJlQ29tcG9zaXRpb24oKSkgewotICAgICAgICAgICAgbmVlZEludmFsaWRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChuZWVkSW52YWxpZGF0ZSkgewotICAgICAgICBzaWduYWxMYXllclVwZGF0ZSgpOwotICAgIH0KLX0KLQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVXb3JrTGlzdCgpCi17Ci0gICAgbUh3V29ya0xpc3REaXJ0eSA9IGZhbHNlOwotICAgIEhXQ29tcG9zZXImIGh3YyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkuZ2V0SHdDb21wb3NlcigpKTsKLSAgICBpZiAoaHdjLmluaXRDaGVjaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+JiBjdXJyZW50TGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLSAgICAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgICAgIGh3Yy5jcmVhdGVXb3JrTGlzdChjb3VudCk7Ci0gICAgICAgIGh3Y19sYXllcl90KiBjb25zdCBjdXIoaHdjLmdldExheWVycygpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgY3VyICYmIGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGN1cnJlbnRMYXllcnNbaV0tPnNldEdlb21ldHJ5KCZjdXJbaV0pOwotICAgICAgICAgICAgaWYgKG1EZWJ1Z0Rpc2FibGVIV0MgfHwgbURlYnVnUmVnaW9uKSB7Ci0gICAgICAgICAgICAgICAgY3VyW2ldLmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKLSAgICAgICAgICAgICAgICBjdXJbaV0uZmxhZ3MgfD0gSFdDX1NLSVBfTEFZRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZVJlcGFpbnQoKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0KLSAgICAvLyBjb21wdXRlIHRoZSBpbnZhbGlkIHJlZ2lvbgotICAgIG1Td2FwUmVnaW9uLm9yU2VsZihtRGlydHlSZWdpb24pOwotCi0gICAgaWYgKENDX1VOTElLRUxZKG1EZWJ1Z1JlZ2lvbikpIHsKLSAgICAgICAgZGVidWdGbGFzaFJlZ2lvbnMoKTsKLSAgICB9Ci0KLSAgICAvLyBzZXQgdGhlIGZyYW1lIGJ1ZmZlcgotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotCi0gICAgdWludDMyX3QgZmxhZ3MgPSBody5nZXRGbGFncygpOwotICAgIGlmICgoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlNXQVBfUkVDVEFOR0xFKSB8fAotICAgICAgICAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OkJVRkZFUl9QUkVTRVJWRUQpKQotICAgIHsKLSAgICAgICAgLy8gd2UgY2FuIHJlZHJhdyBvbmx5IHdoYXQncyBkaXJ0eSwgYnV0IHNpbmNlIFNXQVBfUkVDVEFOR0xFIG9ubHkKLSAgICAgICAgLy8gdGFrZXMgYSByZWN0YW5nbGUsIHdlIG11c3QgbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGF0IHdob2xlCi0gICAgICAgIC8vIHJlY3RhbmdsZSBpbiB0aGF0IGNhc2UKLSAgICAgICAgaWYgKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgewotICAgICAgICAgICAgLy8gVE9ETzogd2UgcmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIHBhc3MgYSByZWdpb24gdG8KLSAgICAgICAgICAgIC8vIFNXQVBfUkVDVEFOR0xFIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWRyYXcgYWxsIHRoaXMuCi0gICAgICAgICAgICBtRGlydHlSZWdpb24uc2V0KG1Td2FwUmVnaW9uLmJvdW5kcygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGluIHRoZSBCVUZGRVJfUFJFU0VSVkVEIGNhc2UsIG9idmlvdXNseSwgd2UgY2FuIHVwZGF0ZSBvbmx5Ci0gICAgICAgICAgICAvLyB3aGF0J3MgbmVlZGVkIGFuZCBub3RoaW5nIG1vcmUuCi0gICAgICAgICAgICAvLyBOT1RFOiB0aGlzIGlzIE5PVCBhIGNvbW1vbiBjYXNlLCBhcyBwcmVzZXJ2aW5nIHRoZSBiYWNrYnVmZmVyCi0gICAgICAgICAgICAvLyBpcyBjb3N0bHkgYW5kIHVzdWFsbHkgaW52b2x2ZXMgY29weWluZyB0aGUgd2hvbGUgdXBkYXRlIGJhY2suCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZmxhZ3MgJiBEaXNwbGF5SGFyZHdhcmU6OlBBUlRJQUxfVVBEQVRFUykgewotICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZWRyYXcgdGhlIHJlY3RhbmdsZSB0aGF0IHdpbGwgYmUgdXBkYXRlZAotICAgICAgICAgICAgLy8gKHB1c2hlZCB0byB0aGUgZnJhbWVidWZmZXIpLgotICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBQQVJUSUFMX1VQREFURVMgb25seSB0YWtlcyBvbmUKLSAgICAgICAgICAgIC8vIHJlY3RhbmdsZSBpbnN0ZWFkIG9mIGEgcmVnaW9uIChzZWUgRGlzcGxheUhhcmR3YXJlOjpmbGlwKCkpCi0gICAgICAgICAgICBtRGlydHlSZWdpb24uc2V0KG1Td2FwUmVnaW9uLmJvdW5kcygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVkcmF3IGV2ZXJ5dGhpbmcgKHRoZSB3aG9sZSBzY3JlZW4pCi0gICAgICAgICAgICBtRGlydHlSZWdpb24uc2V0KGh3LmJvdW5kcygpKTsKLSAgICAgICAgICAgIG1Td2FwUmVnaW9uID0gbURpcnR5UmVnaW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2V0dXBIYXJkd2FyZUNvbXBvc2VyKG1EaXJ0eVJlZ2lvbik7Ci0gICAgY29tcG9zZVN1cmZhY2VzKG1EaXJ0eVJlZ2lvbik7Ci0KLSAgICAvLyB1cGRhdGUgdGhlIHN3YXAgcmVnaW9uIGFuZCBjbGVhciB0aGUgZGlydHkgcmVnaW9uCi0gICAgbVN3YXBSZWdpb24ub3JTZWxmKG1EaXJ0eVJlZ2lvbik7Ci0gICAgbURpcnR5UmVnaW9uLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnNldHVwSGFyZHdhcmVDb21wb3NlcihSZWdpb24mIGRpcnR5SW5PdXQpCi17Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIEhXQ29tcG9zZXImIGh3Yyhody5nZXRId0NvbXBvc2VyKCkpOwotICAgIGh3Y19sYXllcl90KiBjb25zdCBjdXIoaHdjLmdldExheWVycygpKTsKLSAgICBpZiAoIWN1cikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGxheWVycyhtVmlzaWJsZUxheWVyc1NvcnRlZEJ5Wik7Ci0gICAgc2l6ZV90IGNvdW50ID0gbGF5ZXJzLnNpemUoKTsKLQotICAgIEFMT0dFX0lGKGh3Yy5nZXROdW1MYXllcnMoKSAhPSBjb3VudCwKLSAgICAgICAgICAgICJIQUwgbnVtYmVyIG9mIGxheWVycyAoJWQpIGRvZXNuJ3QgbWF0Y2ggc3VyZmFjZWZsaW5nZXIgKCVkKSIsCi0gICAgICAgICAgICBod2MuZ2V0TnVtTGF5ZXJzKCksIGNvdW50KTsKLQotICAgIC8vIGp1c3QgdG8gYmUgZXh0cmEtc2FmZSwgdXNlIHRoZSBzbWFsbGVzdCBjb3VudAotICAgIGlmIChod2MuaW5pdENoZWNrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgY291bnQgPSBjb3VudCA8IGh3Yy5nZXROdW1MYXllcnMoKSA/IGNvdW50IDogaHdjLmdldE51bUxheWVycygpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIHVwZGF0ZSB0aGUgcGVyLWZyYW1lIGgvdyBjb21wb3NlciBkYXRhIGZvciBlYWNoIGxheWVyCi0gICAgICogIGFuZCBidWlsZCB0aGUgdHJhbnNwYXJlbnQgcmVnaW9uIG9mIHRoZSBGQgotICAgICAqLwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobGF5ZXJzW2ldKTsKLSAgICAgICAgbGF5ZXItPnNldFBlckZyYW1lRGF0YSgmY3VyW2ldKTsKLSAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IGZiTGF5ZXJDb3VudCA9IGh3Yy5nZXRMYXllckNvdW50KEhXQ19GUkFNRUJVRkZFUik7Ci0gICAgc3RhdHVzX3QgZXJyID0gaHdjLnByZXBhcmUoKTsKLSAgICBBTE9HRV9JRihlcnIsICJIV0NvbXBvc2VyOjpwcmVwYXJlIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICAvLyB3aGF0J3MgaGFwcGVuaW5nIGhlcmUgaXMgdHJpY2t5LgotICAgICAgICAvLyB3ZSB3YW50IHRvIGNsZWFyIGFsbCB0aGUgbGF5ZXJzIHdpdGggdGhlIENMRUFSX0ZCIGZsYWdzCi0gICAgICAgIC8vIHRoYXQgYXJlIG9wYXF1ZS4KLSAgICAgICAgLy8gaG93ZXZlciwgc2luY2Ugc29tZSBHUFUgYXJlIGVmZmljaWVudCBhdCBwcmVzZXJ2aW5nCi0gICAgICAgIC8vIHRoZSBiYWNrYnVmZmVyLCB3ZSB3YW50IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoYXQgc28gd2UgZG8gdGhlCi0gICAgICAgIC8vIGNsZWFyIG9ubHkgaW4gdGhlIGRpcnR5IHJlZ2lvbiAob3RoZXIgYXJlYXMgd2lsbCBiZSBwcmVzZXJ2ZWQKLSAgICAgICAgLy8gb24gdGhvc2UgR1BVcykuCi0gICAgICAgIC8vICAgTk9URTogb24gbm9uIGJhY2tidWZmZXIgcHJlc2VydmluZyBHUFUsIHRoZSBkaXJ0eSByZWdpb24KLSAgICAgICAgLy8gICBoYXMgYWxyZWFkeSBiZWVuIGV4cGFuZGVkIGFzIG5lZWRlZCwgc28gdGhlIGNvZGUgaXMgY29ycmVjdAotICAgICAgICAvLyAgIHRoZXJlIHRvby4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSG93ZXZlciwgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYW1lYnVmZmVyIGNhbm5vdCBiZSB0cnVzdGVkIHdoZW4KLSAgICAgICAgLy8gd2Ugc3dpdGNoIHRvL2Zyb20gRkIvT1ZFUkxBWSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvCi0gICAgICAgIC8vIGV4cGFuZCB0aGUgZGlydHkgcmVnaW9uIHRvIHRob3NlIGFyZWFzIHRvby4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gTm90ZSBhbHNvIHRoYXQgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlbiBzd2l0Y2hpbmcgZnJvbQotICAgICAgICAvLyAibm8gbGF5ZXJzIGluIEZCIiB0byAic29tZSBsYXllcnMgaW4gRkIiLCB3aGVyZSB3ZSBuZWVkIHRvIHJlZHJhdwotICAgICAgICAvLyB0aGUgZW50aXJlIEZCLCBzaW5jZSBzb21lIGFyZWFzIG1pZ2h0IGNvbnRhaW4gdW5pbml0aWFsaXplZAotICAgICAgICAvLyBkYXRhLgotICAgICAgICAvLwotICAgICAgICAvLyBBbHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIG5vdCBjbGVhciBhcmVhcyB0aGF0IGJlbG9uZyB0bwotICAgICAgICAvLyBsYXllcnMgYWJvdmUgdGhhdCB3b24ndCByZWRyYXcgKHdlIHdvdWxkIGp1c3QgYmUgZXJhc2luZyB0aGVtKSwKLSAgICAgICAgLy8gdGhhdCBpcywgd2UgY2FuJ3QgZXJhc2UgYW55dGhpbmcgb3V0c2lkZSB0aGUgZGlydHkgcmVnaW9uLgotCi0gICAgICAgIFJlZ2lvbiB0cmFuc3BhcmVudDsKLQotICAgICAgICBpZiAoIWZiTGF5ZXJDb3VudCAmJiBod2MuZ2V0TGF5ZXJDb3VudChIV0NfRlJBTUVCVUZGRVIpKSB7Ci0gICAgICAgICAgICB0cmFuc3BhcmVudC5zZXQoaHcuZ2V0Qm91bmRzKCkpOwotICAgICAgICAgICAgZGlydHlJbk91dCA9IHRyYW5zcGFyZW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKChjdXJbaV0uaGludHMgJiBIV0NfSElOVF9DTEVBUl9GQikgJiYgbGF5ZXItPmlzT3BhcXVlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnQub3JTZWxmKGxheWVyLT52aXNpYmxlUmVnaW9uU2NyZWVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbCBpc092ZXJsYXkgPSAoY3VyW2ldLmNvbXBvc2l0aW9uVHlwZSAhPSBIV0NfRlJBTUVCVUZGRVIpOwotICAgICAgICAgICAgICAgIGlmIChpc092ZXJsYXkgIT0gbGF5ZXItPmlzT3ZlcmxheSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIHRyYW5zaXRpb25lZCB0by9mcm9tIG92ZXJsYXksIHNvIGFkZCB0aGlzIGxheWVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBkaXJ0eSByZWdpb24gc28gdGhlIGZyYW1lYnVmZmVyIGNhbiBiZSBlaXRoZXIKLSAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXJlZCBvciByZWRyYXduLgotICAgICAgICAgICAgICAgICAgICBkaXJ0eUluT3V0Lm9yU2VsZihsYXllci0+dmlzaWJsZVJlZ2lvblNjcmVlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxheWVyLT5zZXRPdmVybGF5KGlzT3ZlcmxheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkb24ndCBlcmFzZSBzdHVmZiBvdXRzaWRlIHRoZSBkaXJ0eSByZWdpb24KLSAgICAgICAgICAgIHRyYW5zcGFyZW50LmFuZFNlbGYoZGlydHlJbk91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgY2xlYXIgdGhlIGFyZWEgb2YgdGhlIEZCIHRoYXQgbmVlZCB0byBiZSB0cmFuc3BhcmVudAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCF0cmFuc3BhcmVudC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKLSAgICAgICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0cmFuc3BhcmVudC5iZWdpbigpOwotICAgICAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCBlbmQgPSB0cmFuc3BhcmVudC5lbmQoKTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQgIT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgUmVjdCYgcigqaXQrKyk7Ci0gICAgICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpjb21wb3NlU3VyZmFjZXMoY29uc3QgUmVnaW9uJiBkaXJ0eSkKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7Ci0KLSAgICBjb25zdCBzaXplX3QgZmJMYXllckNvdW50ID0gaHdjLmdldExheWVyQ291bnQoSFdDX0ZSQU1FQlVGRkVSKTsKLSAgICBpZiAoQ0NfVU5MSUtFTFkoZmJMYXllckNvdW50ICYmICFtV29ybWhvbGVSZWdpb24uaXNFbXB0eSgpKSkgewotICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyB0aGUgd2luZG93IG1hbmFnZXIgaGFzIGEgYnVnCi0gICAgICAgIC8vIGRyYXcgc29tZXRoaW5nLi4uCi0gICAgICAgIGRyYXdXb3JtaG9sZSgpOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiB3b3JrYXJvdWQgZm9yIGIvNjAyMDg2MAotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xTY2lzc29yKDAsMCwwLDApOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgLy8gZW5kLXdvcmthcm91bmQKLQotICAgIC8qCi0gICAgICogYW5kIHRoZW4sIHJlbmRlciB0aGUgbGF5ZXJzIHRhcmdldGVkIGF0IHRoZSBmcmFtZWJ1ZmZlcgotICAgICAqLwotICAgIGh3Y19sYXllcl90KiBjb25zdCBjdXIoaHdjLmdldExheWVycygpKTsKLSAgICBjb25zdCBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiYgbGF5ZXJzKG1WaXNpYmxlTGF5ZXJzU29ydGVkQnlaKTsKLSAgICBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgaWYgKGN1ciAmJiAoY3VyW2ldLmNvbXBvc2l0aW9uVHlwZSAhPSBIV0NfRlJBTUVCVUZGRVIpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwotICAgICAgICBjb25zdCBSZWdpb24gY2xpcChkaXJ0eS5pbnRlcnNlY3QobGF5ZXItPnZpc2libGVSZWdpb25TY3JlZW4pKTsKLSAgICAgICAgaWYgKCFjbGlwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbGF5ZXItPmRyYXcoY2xpcCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmRlYnVnRmxhc2hSZWdpb25zKCkKLXsKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgZmxhZ3MgPSBody5nZXRGbGFncygpOwotICAgIGNvbnN0IGludDMyX3QgaGVpZ2h0ID0gaHcuZ2V0SGVpZ2h0KCk7Ci0gICAgaWYgKG1Td2FwUmVnaW9uLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCEoKGZsYWdzICYgRGlzcGxheUhhcmR3YXJlOjpTV0FQX1JFQ1RBTkdMRSkgfHwKLSAgICAgICAgICAgIChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6QlVGRkVSX1BSRVNFUlZFRCkpKSB7Ci0gICAgICAgIGNvbnN0IFJlZ2lvbiByZXBhaW50KChmbGFncyAmIERpc3BsYXlIYXJkd2FyZTo6UEFSVElBTF9VUERBVEVTKSA/Ci0gICAgICAgICAgICAgICAgbURpcnR5UmVnaW9uLmJvdW5kcygpIDogaHcuYm91bmRzKCkpOwotICAgICAgICBjb21wb3NlU3VyZmFjZXMocmVwYWludCk7Ci0gICAgfQotCi0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLQotICAgIHN0YXRpYyBpbnQgdG9nZ2xlID0gMDsKLSAgICB0b2dnbGUgPSAxIC0gdG9nZ2xlOwotICAgIGlmICh0b2dnbGUpIHsKLSAgICAgICAgZ2xDb2xvcjRmKDEsIDAsIDEsIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGdsQ29sb3I0ZigxLCAxLCAwLCAxKTsKLSAgICB9Ci0KLSAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbURpcnR5UmVnaW9uLmJlZ2luKCk7Ci0gICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCBlbmQgPSBtRGlydHlSZWdpb24uZW5kKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICBjb25zdCBSZWN0JiByID0gKml0Kys7Ci0gICAgICAgIEdMZmxvYXQgdmVydGljZXNbXVsyXSA9IHsKLSAgICAgICAgICAgICAgICB7IHIubGVmdCwgIGhlaWdodCAtIHIudG9wIH0sCi0gICAgICAgICAgICAgICAgeyByLmxlZnQsICBoZWlnaHQgLSByLmJvdHRvbSB9LAotICAgICAgICAgICAgICAgIHsgci5yaWdodCwgaGVpZ2h0IC0gci5ib3R0b20gfSwKLSAgICAgICAgICAgICAgICB7IHIucmlnaHQsIGhlaWdodCAtIHIudG9wIH0KLSAgICAgICAgfTsKLSAgICAgICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB2ZXJ0aWNlcyk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgIH0KLQotICAgIGh3LmZsaXAobVN3YXBSZWdpb24pOwotCi0gICAgaWYgKG1EZWJ1Z1JlZ2lvbiA+IDEpCi0gICAgICAgIHVzbGVlcChtRGVidWdSZWdpb24gKiAxMDAwKTsKLQotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OmRyYXdXb3JtaG9sZSgpIGNvbnN0Ci17Ci0gICAgY29uc3QgUmVnaW9uIHJlZ2lvbihtV29ybWhvbGVSZWdpb24uaW50ZXJzZWN0KG1EaXJ0eVJlZ2lvbikpOwotICAgIGlmIChyZWdpb24uaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgaW50MzJfdCB3aWR0aCA9IGh3LmdldFdpZHRoKCk7Ci0gICAgY29uc3QgaW50MzJfdCBoZWlnaHQgPSBody5nZXRIZWlnaHQoKTsKLQotICAgIGlmIChDQ19MSUtFTFkoIW1EZWJ1Z0JhY2tncm91bmQpKSB7Ci0gICAgICAgIGdsQ2xlYXJDb2xvcigwLDAsMCwwKTsKLSAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBpdCA9IHJlZ2lvbi5iZWdpbigpOwotICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHJlZ2lvbi5lbmQoKTsKLSAgICAgICAgd2hpbGUgKGl0ICE9IGVuZCkgewotICAgICAgICAgICAgY29uc3QgUmVjdCYgciA9ICppdCsrOwotICAgICAgICAgICAgY29uc3QgR0xpbnQgc3kgPSBoZWlnaHQgLSAoci50b3AgKyByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsU2Npc3NvcihyLmxlZnQsIHN5LCByLndpZHRoKCksIHIuaGVpZ2h0KCkpOwotICAgICAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IEdMc2hvcnQgdmVydGljZXNbXVsyXSA9IHsgeyAwLCAwIH0sIHsgd2lkdGgsIDAgfSwKLSAgICAgICAgICAgICAgICB7IHdpZHRoLCBoZWlnaHQgfSwgeyAwLCBoZWlnaHQgfSAgfTsKLSAgICAgICAgY29uc3QgR0xzaG9ydCB0Y29vcmRzW11bMl0gPSB7IHsgMCwgMCB9LCB7IDEsIDAgfSwgIHsgMSwgMSB9LCB7IDAsIDEgfSB9OwotCi0gICAgICAgIGdsVmVydGV4UG9pbnRlcigyLCBHTF9TSE9SVCwgMCwgdmVydGljZXMpOwotICAgICAgICBnbFRleENvb3JkUG9pbnRlcigyLCBHTF9TSE9SVCwgMCwgdGNvb3Jkcyk7Ci0gICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0KLSAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKTsKLSAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbVdvcm1ob2xlVGV4TmFtZSk7Ci0gICAgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKLQotICAgICAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotCi0gICAgICAgIGdsU2NhbGVmKHdpZHRoKigxLjBmLzMyLjBmKSwgaGVpZ2h0KigxLjBmLzMyLjBmKSwgMSk7Ci0gICAgICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZWdpb24uYmVnaW4oKTsKLSAgICAgICAgUmVnaW9uOjpjb25zdF9pdGVyYXRvciBjb25zdCBlbmQgPSByZWdpb24uZW5kKCk7Ci0gICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICAgICAgICAgIGNvbnN0IFJlY3QmIHIgPSAqaXQrKzsKLSAgICAgICAgICAgIGNvbnN0IEdMaW50IHN5ID0gaGVpZ2h0IC0gKHIudG9wICsgci5oZWlnaHQoKSk7Ci0gICAgICAgICAgICBnbFNjaXNzb3Ioci5sZWZ0LCBzeSwgci53aWR0aCgpLCByLmhlaWdodCgpKTsKLSAgICAgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgICAgICB9Ci0gICAgICAgIGdsRGlzYWJsZUNsaWVudFN0YXRlKEdMX1RFWFRVUkVfQ09PUkRfQVJSQVkpOwotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmFkZExheWVyKGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKLSAgICBhZGRMYXllcl9sKGxheWVyKTsKLSAgICBzZXRUcmFuc2FjdGlvbkZsYWdzKGVUcmFuc2FjdGlvbk5lZWRlZHxlVHJhdmVyc2FsTmVlZGVkKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjphZGRMYXllcl9sKGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKQotewotICAgIHNzaXplX3QgaSA9IG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaLmFkZChsYXllcik7Ci0gICAgcmV0dXJuIChpIDwgMCkgPyBzdGF0dXNfdChpKSA6IHN0YXR1c190KE5PX0VSUk9SKTsKLX0KLQotc3NpemVfdCBTdXJmYWNlRmxpbmdlcjo6YWRkQ2xpZW50TGF5ZXIoY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBsYmMpCi17Ci0gICAgLy8gYXR0YWNoIHRoaXMgbGF5ZXIgdG8gdGhlIGNsaWVudAotICAgIHNpemVfdCBuYW1lID0gY2xpZW50LT5hdHRhY2hMYXllcihsYmMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotCi0gICAgLy8gYWRkIHRoaXMgbGF5ZXIgdG8gdGhlIGN1cnJlbnQgc3RhdGUgbGlzdAotICAgIGFkZExheWVyX2wobGJjKTsKLQotICAgIHJldHVybiBzc2l6ZV90KG5hbWUpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6cmVtb3ZlTGF5ZXIoY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIHN0YXR1c190IGVyciA9IHB1cmdhdG9yaXplTGF5ZXJfbChsYXllcik7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikKLSAgICAgICAgc2V0VHJhbnNhY3Rpb25GbGFncyhlVHJhbnNhY3Rpb25OZWVkZWQpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpyZW1vdmVMYXllcl9sKGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyQmFzZSkKLXsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxiYyhsYXllckJhc2UtPmdldExheWVyQmFzZUNsaWVudCgpKTsKLSAgICBpZiAobGJjICE9IDApIHsKLSAgICAgICAgbUxheWVyTWFwLnJlbW92ZUl0ZW0oIGxiYy0+Z2V0U3VyZmFjZUJpbmRlcigpICk7Ci0gICAgfQotICAgIHNzaXplX3QgaW5kZXggPSBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5Wi5yZW1vdmUobGF5ZXJCYXNlKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBtTGF5ZXJzUmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1c190KGluZGV4KTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnB1cmdhdG9yaXplTGF5ZXJfbChjb25zdCBzcDxMYXllckJhc2U+JiBsYXllckJhc2UpCi17Ci0gICAgLy8gRmlyc3QgYWRkIHRoZSBsYXllciB0byB0aGUgcHVyZ2F0b3J5IGxpc3QsIHdoaWNoIG1ha2VzIHN1cmUgaXQgd29uJ3QKLSAgICAvLyBnbyBhd2F5LCB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBtYWluIGxpc3QgKHRocm91Z2ggYSB0cmFuc2FjdGlvbikuCi0gICAgc3NpemVfdCBlcnIgPSByZW1vdmVMYXllcl9sKGxheWVyQmFzZSk7Ci0gICAgaWYgKGVyciA+PSAwKSB7Ci0gICAgICAgIG1MYXllclB1cmdhdG9yeS5hZGQobGF5ZXJCYXNlKTsKLSAgICB9Ci0KLSAgICBtTGF5ZXJzUGVuZGluZ1JlbW92YWwucHVzaChsYXllckJhc2UpOwotCi0gICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHdlIGRvbid0IGZpbmQgYSBsYXllciwgYmVjYXVzZSBpdCBtaWdodAotICAgIC8vIGhhdmUgYmVlbiBkZXN0cm95ZWQgYWxyZWFkeSAtLSB0aGlzIGlzIG5vdCB0ZWNobmljYWxseSBhbiBlcnJvcgotICAgIC8vIGZyb20gdGhlIHVzZXIgYmVjYXVzZSB0aGVyZSBpcyBhIHJhY2UgYmV0d2VlbiBDbGllbnQ6OmRlc3Ryb3lTdXJmYWNlKCksCi0gICAgLy8gfkNsaWVudCgpIGFuZCB+SVN1cmZhY2UoKS4KLSAgICByZXR1cm4gKGVyciA9PSBOQU1FX05PVF9GT1VORCkgPyBzdGF0dXNfdChOT19FUlJPUikgOiBlcnI7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjppbnZhbGlkYXRlTGF5ZXJWaXNpYmlsaXR5KGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKQotewotICAgIGxheWVyLT5mb3JjZVZpc2liaWxpdHlUcmFuc2FjdGlvbigpOwotICAgIHNldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYXZlcnNhbE5lZWRlZCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi11aW50MzJfdCBTdXJmYWNlRmxpbmdlcjo6cGVla1RyYW5zYWN0aW9uRmxhZ3ModWludDMyX3QgZmxhZ3MpCi17Ci0gICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX3JlbGVhc2VfbG9hZCgmbVRyYW5zYWN0aW9uRmxhZ3MpOwotfQotCi11aW50MzJfdCBTdXJmYWNlRmxpbmdlcjo6Z2V0VHJhbnNhY3Rpb25GbGFncyh1aW50MzJfdCBmbGFncykKLXsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfYW5kKH5mbGFncywgJm1UcmFuc2FjdGlvbkZsYWdzKSAmIGZsYWdzOwotfQotCi11aW50MzJfdCBTdXJmYWNlRmxpbmdlcjo6c2V0VHJhbnNhY3Rpb25GbGFncyh1aW50MzJfdCBmbGFncykKLXsKLSAgICB1aW50MzJfdCBvbGQgPSBhbmRyb2lkX2F0b21pY19vcihmbGFncywgJm1UcmFuc2FjdGlvbkZsYWdzKTsKLSAgICBpZiAoKG9sZCAmIGZsYWdzKT09MCkgeyAvLyB3YWtlIHRoZSBzZXJ2ZXIgdXAKLSAgICAgICAgc2lnbmFsVHJhbnNhY3Rpb24oKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9sZDsKLX0KLQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpzZXRUcmFuc2FjdGlvblN0YXRlKGNvbnN0IFZlY3RvcjxDb21wb3NlclN0YXRlPiYgc3RhdGUsCi0gICAgICAgIGludCBvcmllbnRhdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobVN0YXRlTG9jayk7Ci0KLSAgICB1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzID0gMDsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZS5vcmllbnRhdGlvbiAhPSBvcmllbnRhdGlvbikgewotICAgICAgICBpZiAodWludDMyX3Qob3JpZW50YXRpb24pPD1lT3JpZW50YXRpb24yNzAgfHwgb3JpZW50YXRpb249PTQyKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlLm9yaWVudGF0aW9uID0gb3JpZW50YXRpb247Ci0gICAgICAgICAgICB0cmFuc2FjdGlvbkZsYWdzIHw9IGVUcmFuc2FjdGlvbk5lZWRlZDsKLSAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiAhPSBlT3JpZW50YXRpb25VbmNoYW5nZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRUcmFuc2FjdGlvblN0YXRlOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgb3JpZW50YXRpb246ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gc3RhdGUuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgY29uc3QgQ29tcG9zZXJTdGF0ZSYgcyhzdGF0ZVtpXSk7Ci0gICAgICAgIHNwPENsaWVudD4gY2xpZW50KCBzdGF0aWNfY2FzdDxDbGllbnQgKj4ocy5jbGllbnQuZ2V0KCkpICk7Ci0gICAgICAgIHRyYW5zYWN0aW9uRmxhZ3MgfD0gc2V0Q2xpZW50U3RhdGVMb2NrZWQoY2xpZW50LCBzLnN0YXRlKTsKLSAgICB9Ci0KLSAgICBpZiAodHJhbnNhY3Rpb25GbGFncykgewotICAgICAgICAvLyB0aGlzIHRyaWdnZXJzIHRoZSB0cmFuc2FjdGlvbgotICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWdzKHRyYW5zYWN0aW9uRmxhZ3MpOwotCi0gICAgICAgIC8vIGlmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbiwgd2FpdCBmb3IgaXQgdG8gdGFrZSBlZmZlY3QKLSAgICAgICAgLy8gYmVmb3JlIHJldHVybmluZy4KLSAgICAgICAgaWYgKGZsYWdzICYgZVN5bmNocm9ub3VzKSB7Ci0gICAgICAgICAgICBtVHJhbnNhdGlvblBlbmRpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChtVHJhbnNhdGlvblBlbmRpbmcpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1UcmFuc2FjdGlvbkNWLndhaXRSZWxhdGl2ZShtU3RhdGVMb2NrLCBzMm5zKDUpKTsKLSAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShlcnIgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgICAgICAgICAgLy8ganVzdCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nIGluIFNGLCByZXR1cm4gdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gY2FsbGVkIGFmdGVyIGEgZmV3IHNlY29uZHMuCi0gICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJyID09IFRJTUVEX09VVCwgImNsb3NlR2xvYmFsVHJhbnNhY3Rpb24gdGltZWQgb3V0ISIpOwotICAgICAgICAgICAgICAgIG1UcmFuc2F0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1zcDxJU3VyZmFjZT4gU3VyZmFjZUZsaW5nZXI6OmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCi0gICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKLSAgICAgICAgRGlzcGxheUlEIGQsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllcjsKLSAgICBzcDxJU3VyZmFjZT4gc3VyZmFjZUhhbmRsZTsKLQotICAgIGlmIChpbnQzMl90KHd8aCkgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJjcmVhdGVTdXJmYWNlKCkgZmFpbGVkLCB3IG9yIGggaXMgbmVnYXRpdmUgKHc9JWQsIGg9JWQpIiwKLSAgICAgICAgICAgICAgICBpbnQodyksIGludChoKSk7Ci0gICAgICAgIHJldHVybiBzdXJmYWNlSGFuZGxlOwotICAgIH0KLQotICAgIC8vQUxPR0QoImNyZWF0ZVN1cmZhY2UgZm9yICglZCB4ICVkKSwgbmFtZT0lcyIsIHcsIGgsIG5hbWUuc3RyaW5nKCkpOwotICAgIHNwPExheWVyPiBub3JtYWxMYXllcjsKLSAgICBzd2l0Y2ggKGZsYWdzICYgZUZYU3VyZmFjZU1hc2spIHsKLSAgICAgICAgY2FzZSBlRlhTdXJmYWNlTm9ybWFsOgotICAgICAgICAgICAgbm9ybWFsTGF5ZXIgPSBjcmVhdGVOb3JtYWxTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MsIGZvcm1hdCk7Ci0gICAgICAgICAgICBsYXllciA9IG5vcm1hbExheWVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZUZYU3VyZmFjZUJsdXI6Ci0gICAgICAgICAgICAvLyBmb3Igbm93IHdlIHRyZWF0IEJsdXIgYXMgRGltLCB1bnRpbCB3ZSBjYW4gaW1wbGVtZW50IGl0Ci0gICAgICAgICAgICAvLyBlZmZpY2llbnRseS4KLSAgICAgICAgY2FzZSBlRlhTdXJmYWNlRGltOgotICAgICAgICAgICAgbGF5ZXIgPSBjcmVhdGVEaW1TdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgZUZYU3VyZmFjZVNjcmVlbnNob3Q6Ci0gICAgICAgICAgICBsYXllciA9IGNyZWF0ZVNjcmVlbnNob3RTdXJmYWNlKGNsaWVudCwgZCwgdywgaCwgZmxhZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKGxheWVyICE9IDApIHsKLSAgICAgICAgbGF5ZXItPmluaXRTdGF0ZXModywgaCwgZmxhZ3MpOwotICAgICAgICBsYXllci0+c2V0TmFtZShuYW1lKTsKLSAgICAgICAgc3NpemVfdCB0b2tlbiA9IGFkZENsaWVudExheWVyKGNsaWVudCwgbGF5ZXIpOwotCi0gICAgICAgIHN1cmZhY2VIYW5kbGUgPSBsYXllci0+Z2V0U3VyZmFjZSgpOwotICAgICAgICBpZiAoc3VyZmFjZUhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICBwYXJhbXMtPnRva2VuID0gdG9rZW47Ci0gICAgICAgICAgICBwYXJhbXMtPmlkZW50aXR5ID0gbGF5ZXItPmdldElkZW50aXR5KCk7Ci0gICAgICAgICAgICBpZiAobm9ybWFsTGF5ZXIgIT0gMCkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKLSAgICAgICAgICAgICAgICBtTGF5ZXJNYXAuYWRkKGxheWVyLT5nZXRTdXJmYWNlQmluZGVyKCksIG5vcm1hbExheWVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYW5zYWN0aW9uTmVlZGVkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3VyZmFjZUhhbmRsZTsKLX0KLQotc3A8TGF5ZXI+IFN1cmZhY2VGbGluZ2VyOjpjcmVhdGVOb3JtYWxTdXJmYWNlKAotICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsIERpc3BsYXlJRCBkaXNwbGF5LAotICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmbGFncywKLSAgICAgICAgUGl4ZWxGb3JtYXQmIGZvcm1hdCkKLXsKLSAgICAvLyBpbml0aWFsaXplIHRoZSBzdXJmYWNlcwotICAgIHN3aXRjaCAoZm9ybWF0KSB7IC8vIFRPRE86IHRha2UgaC93IGludG8gYWNjb3VudAotICAgIGNhc2UgUElYRUxfRk9STUFUX1RSQU5TUEFSRU5UOgotICAgIGNhc2UgUElYRUxfRk9STUFUX1RSQU5TTFVDRU5UOgotICAgICAgICBmb3JtYXQgPSBQSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBJWEVMX0ZPUk1BVF9PUEFRVUU6Ci0jaWZkZWYgTk9fUkdCWF84ODg4Ci0gICAgICAgIGZvcm1hdCA9IFBJWEVMX0ZPUk1BVF9SR0JfNTY1OwotI2Vsc2UKLSAgICAgICAgZm9ybWF0ID0gUElYRUxfRk9STUFUX1JHQlhfODg4ODsKLSNlbmRpZgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSNpZmRlZiBOT19SR0JYXzg4ODgKLSAgICBpZiAoZm9ybWF0ID09IFBJWEVMX0ZPUk1BVF9SR0JYXzg4ODgpCi0gICAgICAgIGZvcm1hdCA9IFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7Ci0jZW5kaWYKLQotICAgIHNwPExheWVyPiBsYXllciA9IG5ldyBMYXllcih0aGlzLCBkaXNwbGF5LCBjbGllbnQpOwotICAgIHN0YXR1c190IGVyciA9IGxheWVyLT5zZXRCdWZmZXJzKHcsIGgsIGZvcm1hdCwgZmxhZ3MpOwotICAgIGlmIChDQ19MSUtFTFkoZXJyICE9IE5PX0VSUk9SKSkgewotICAgICAgICBBTE9HRSgiY3JlYXRlTm9ybWFsU3VyZmFjZUxvY2tlZCgpIGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICBsYXllci5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLXNwPExheWVyRGltPiBTdXJmYWNlRmxpbmdlcjo6Y3JlYXRlRGltU3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3A8TGF5ZXJEaW0+IGxheWVyID0gbmV3IExheWVyRGltKHRoaXMsIGRpc3BsYXksIGNsaWVudCk7Ci0gICAgcmV0dXJuIGxheWVyOwotfQotCi1zcDxMYXllclNjcmVlbnNob3Q+IFN1cmZhY2VGbGluZ2VyOjpjcmVhdGVTY3JlZW5zaG90U3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpCi17Ci0gICAgc3A8TGF5ZXJTY3JlZW5zaG90PiBsYXllciA9IG5ldyBMYXllclNjcmVlbnNob3QodGhpcywgZGlzcGxheSwgY2xpZW50KTsKLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpyZW1vdmVTdXJmYWNlKGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwgU3VyZmFjZUlEIHNpZCkKLXsKLSAgICAvKgotICAgICAqIGNhbGxlZCBieSB0aGUgd2luZG93IG1hbmFnZXIsIHdoZW4gYSBzdXJmYWNlIHNob3VsZCBiZSBtYXJrZWQgZm9yCi0gICAgICogZGVzdHJ1Y3Rpb24uCi0gICAgICoKLSAgICAgKiBUaGUgc3VyZmFjZSBpcyByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgYW5kIGRyYXdpbmcgbGlzdHMsIGJ1dCBwbGFjZWQKLSAgICAgKiBpbiB0aGUgcHVyZ2F0b3J5IHF1ZXVlLCBzbyBpdCdzIG5vdCBkZXN0cm95ZWQgcmlnaHQtYXdheSAod2UgbmVlZAotICAgICAqIHRvIHdhaXQgZm9yIGFsbCBjbGllbnQncyByZWZlcmVuY2VzIHRvIGdvIGF3YXkgZmlyc3QpLgotICAgICAqLwotCi0gICAgc3RhdHVzX3QgZXJyID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIHNwPExheWVyQmFzZUNsaWVudD4gbGF5ZXIgPSBjbGllbnQtPmdldExheWVyVXNlcihzaWQpOwotICAgIGlmIChsYXllciAhPSAwKSB7Ci0gICAgICAgIGVyciA9IHB1cmdhdG9yaXplTGF5ZXJfbChsYXllcik7Ci0gICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uRmxhZ3MoZVRyYW5zYWN0aW9uTmVlZGVkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6ZGVzdHJveVN1cmZhY2UoY29uc3Qgd3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGF5ZXIpCi17Ci0gICAgLy8gY2FsbGVkIGJ5IH5JU3VyZmFjZSgpIHdoZW4gYWxsIHJlZmVyZW5jZXMgYXJlIGdvbmUKLSAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IGwobGF5ZXIucHJvbW90ZSgpKTsKLSAgICBpZiAobCAhPSBOVUxMKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU3RhdGVMb2NrKTsKLSAgICAgICAgZXJyID0gcmVtb3ZlTGF5ZXJfbChsKTsKLSAgICAgICAgaWYgKGVyciA9PSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICAgICAgLy8gVGhlIHN1cmZhY2Ugd2Fzbid0IGluIHRoZSBjdXJyZW50IGxpc3QsIHdoaWNoIG1lYW5zIGl0IHdhcwotICAgICAgICAgICAgLy8gcmVtb3ZlZCBhbHJlYWR5LCB3aGljaCBtZWFucyBpdCBpcyBpbiB0aGUgcHVyZ2F0b3J5LAotICAgICAgICAgICAgLy8gYW5kIG5lZWQgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZXJlLgotICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtTGF5ZXJQdXJnYXRvcnkucmVtb3ZlKGwpOwotICAgICAgICAgICAgQUxPR0VfSUYoaWR4IDwgMCwKLSAgICAgICAgICAgICAgICAgICAgImxheWVyPSVwIGlzIG5vdCBpbiB0aGUgcHVyZ2F0b3J5IGxpc3QiLCBsLmdldCgpKTsKLSAgICAgICAgfQotICAgICAgICBBTE9HRV9JRihlcnI8MCAmJiBlcnIgIT0gTkFNRV9OT1RfRk9VTkQsCi0gICAgICAgICAgICAgICAgImVycm9yIHJlbW92aW5nIGxheWVyPSVwICglcykiLCBsLmdldCgpLCBzdHJlcnJvcigtZXJyKSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXVpbnQzMl90IFN1cmZhY2VGbGluZ2VyOjpzZXRDbGllbnRTdGF0ZUxvY2tlZCgKLSAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBsYXllcl9zdGF0ZV90JiBzKQotewotICAgIHVpbnQzMl90IGZsYWdzID0gMDsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IGxheWVyKGNsaWVudC0+Z2V0TGF5ZXJVc2VyKHMuc3VyZmFjZSkpOwotICAgIGlmIChsYXllciAhPSAwKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHdoYXQgPSBzLndoYXQ7Ci0gICAgICAgIGlmICh3aGF0ICYgZVBvc2l0aW9uQ2hhbmdlZCkgewotICAgICAgICAgICAgaWYgKGxheWVyLT5zZXRQb3NpdGlvbihzLngsIHMueSkpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gZVRyYXZlcnNhbE5lZWRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAod2hhdCAmIGVMYXllckNoYW5nZWQpIHsKLSAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVouaW5kZXhPZihsYXllcik7Ci0gICAgICAgICAgICBpZiAobGF5ZXItPnNldExheWVyKHMueikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5Wi5yZW1vdmVBdChpZHgpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaLmFkZChsYXllcik7Ci0gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0cmF2ZXJzYWwgKHN0YXRlIGNoYW5nZWQpCi0gICAgICAgICAgICAgICAgLy8gQU5EIHRyYW5zYWN0aW9uIChsaXN0IGNoYW5nZWQpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gZVRyYW5zYWN0aW9uTmVlZGVkfGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdoYXQgJiBlU2l6ZUNoYW5nZWQpIHsKLSAgICAgICAgICAgIGlmIChsYXllci0+c2V0U2l6ZShzLncsIHMuaCkpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBlVHJhdmVyc2FsTmVlZGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh3aGF0ICYgZUFscGhhQ2hhbmdlZCkgewotICAgICAgICAgICAgaWYgKGxheWVyLT5zZXRBbHBoYSh1aW50OF90KDI1NS4wZipzLmFscGhhKzAuNWYpKSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBlVHJhdmVyc2FsTmVlZGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aGF0ICYgZU1hdHJpeENoYW5nZWQpIHsKLSAgICAgICAgICAgIGlmIChsYXllci0+c2V0TWF0cml4KHMubWF0cml4KSkKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBlVHJhdmVyc2FsTmVlZGVkOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aGF0ICYgZVRyYW5zcGFyZW50UmVnaW9uQ2hhbmdlZCkgewotICAgICAgICAgICAgaWYgKGxheWVyLT5zZXRUcmFuc3BhcmVudFJlZ2lvbkhpbnQocy50cmFuc3BhcmVudFJlZ2lvbikpCi0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gZVRyYXZlcnNhbE5lZWRlZDsKLSAgICAgICAgfQotICAgICAgICBpZiAod2hhdCAmIGVWaXNpYmlsaXR5Q2hhbmdlZCkgewotICAgICAgICAgICAgaWYgKGxheWVyLT5zZXRGbGFncyhzLmZsYWdzLCBzLm1hc2spKQotICAgICAgICAgICAgICAgIGZsYWdzIHw9IGVUcmF2ZXJzYWxOZWVkZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZsYWdzOwotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpzY3JlZW5SZWxlYXNlZChpbnQgZHB5KQotewotICAgIC8vIHRoaXMgbWF5IGJlIGNhbGxlZCBieSBhIHNpZ25hbCBoYW5kbGVyLCB3ZSBjYW4ndCBkbyB0b28gbXVjaCBpbiBoZXJlCi0gICAgYW5kcm9pZF9hdG9taWNfb3IoZUNvbnNvbGVSZWxlYXNlZCwgJm1Db25zb2xlU2lnbmFscyk7Ci0gICAgc2lnbmFsVHJhbnNhY3Rpb24oKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6c2NyZWVuQWNxdWlyZWQoaW50IGRweSkKLXsKLSAgICAvLyB0aGlzIG1heSBiZSBjYWxsZWQgYnkgYSBzaWduYWwgaGFuZGxlciwgd2UgY2FuJ3QgZG8gdG9vIG11Y2ggaW4gaGVyZQotICAgIGFuZHJvaWRfYXRvbWljX29yKGVDb25zb2xlQWNxdWlyZWQsICZtQ29uc29sZVNpZ25hbHMpOwotICAgIHNpZ25hbFRyYW5zYWN0aW9uKCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDQwOTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBpZiAoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBTdXJmYWNlRmxpbmdlciBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVHJ5IHRvIGdldCB0aGUgbWFpbiBsb2NrLCBidXQgZG9uJ3QgaW5zaXN0IGlmIHdlIGNhbid0Ci0gICAgICAgIC8vICh0aGlzIHdvdWxkIGluZGljYXRlIFNGIGlzIHN0dWNrLCBidXQgd2Ugd2FudCB0byBiZSBhYmxlIHRvCi0gICAgICAgIC8vIHByaW50IHNvbWV0aGluZyBpbiBkdW1wc3lzKS4KLSAgICAgICAgaW50IHJldHJ5ID0gMzsKLSAgICAgICAgd2hpbGUgKG1TdGF0ZUxvY2sudHJ5TG9jaygpPDAgJiYgLS1yZXRyeT49MCkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMDApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGJvb2wgbG9ja2VkKHJldHJ5ID49IDApOwotICAgICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICAgICAgICAiU3VyZmFjZUZsaW5nZXIgYXBwZWFycyB0byBiZSB1bnJlc3BvbnNpdmUsICIKLSAgICAgICAgICAgICAgICAgICAgImR1bXBpbmcgYW55d2F5cyAobm8gbG9ja3MgaGVsZClcbiIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBkdW1wQWxsID0gdHJ1ZTsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKLSAgICAgICAgc2l6ZV90IG51bUFyZ3MgPSBhcmdzLnNpemUoKTsKLSAgICAgICAgaWYgKG51bUFyZ3MpIHsKLSAgICAgICAgICAgIGR1bXBBbGwgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKChpbmRleCA8IG51bUFyZ3MpICYmCi0gICAgICAgICAgICAgICAgICAgIChhcmdzW2luZGV4XSA9PSBTdHJpbmcxNigiLS1saXN0IikpKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXgrKzsKLSAgICAgICAgICAgICAgICBsaXN0TGF5ZXJzTG9ja2VkKGFyZ3MsIGluZGV4LCByZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoaW5kZXggPCBudW1BcmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoYXJnc1tpbmRleF0gPT0gU3RyaW5nMTYoIi0tbGF0ZW5jeSIpKSkgewotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgZHVtcFN0YXRzTG9ja2VkKGFyZ3MsIGluZGV4LCByZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgoaW5kZXggPCBudW1BcmdzKSAmJgotICAgICAgICAgICAgICAgICAgICAoYXJnc1tpbmRleF0gPT0gU3RyaW5nMTYoIi0tbGF0ZW5jeS1jbGVhciIpKSkgewotICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgY2xlYXJTdGF0c0xvY2tlZChhcmdzLCBpbmRleCwgcmVzdWx0LCBidWZmZXIsIFNJWkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGR1bXBBbGwpIHsKLSAgICAgICAgICAgIGR1bXBBbGxMb2NrZWQocmVzdWx0LCBidWZmZXIsIFNJWkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxvY2tlZCkgewotICAgICAgICAgICAgbVN0YXRlTG9jay51bmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6Omxpc3RMYXllcnNMb2NrZWQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgc2l6ZV90JiBpbmRleCwKLSAgICAgICAgU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzID0gbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVo7Ci0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihjdXJyZW50TGF5ZXJzW2ldKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXNcbiIsIGxheWVyLT5nZXROYW1lKCkuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpkdW1wU3RhdHNMb2NrZWQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgc2l6ZV90JiBpbmRleCwKLSAgICAgICAgU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdAotewotICAgIFN0cmluZzggbmFtZTsKLSAgICBpZiAoaW5kZXggPCBhcmdzLnNpemUoKSkgewotICAgICAgICBuYW1lID0gU3RyaW5nOChhcmdzW2luZGV4XSk7Ci0gICAgICAgIGluZGV4Kys7Ci0gICAgfQotCi0gICAgY29uc3QgTGF5ZXJWZWN0b3ImIGN1cnJlbnRMYXllcnMgPSBtQ3VycmVudFN0YXRlLmxheWVyc1NvcnRlZEJ5WjsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBjdXJyZW50TGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzXG4iLCBsYXllci0+Z2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkgfHwgKG5hbWUgPT0gbGF5ZXItPmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIGxheWVyLT5kdW1wU3RhdHMocmVzdWx0LCBidWZmZXIsIFNJWkUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpjbGVhclN0YXRzTG9ja2VkKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIHNpemVfdCYgaW5kZXgsCi0gICAgICAgIFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3QKLXsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgaWYgKGluZGV4IDwgYXJncy5zaXplKCkpIHsKLSAgICAgICAgbmFtZSA9IFN0cmluZzgoYXJnc1tpbmRleF0pOwotICAgICAgICBpbmRleCsrOwotICAgIH0KLQotICAgIGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzID0gbUN1cnJlbnRTdGF0ZS5sYXllcnNTb3J0ZWRCeVo7Ci0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gY3VycmVudExheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihjdXJyZW50TGF5ZXJzW2ldKTsKLSAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpIHx8IChuYW1lID09IGxheWVyLT5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICBsYXllci0+Y2xlYXJTdGF0cygpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpkdW1wQWxsTG9ja2VkKAotICAgICAgICBTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0Ci17Ci0gICAgLy8gZmlndXJlIG91dCBpZiB3ZSdyZSBzdHVjayBzb21ld2hlcmUKLSAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKLSAgICBjb25zdCBuc2Vjc190IGluU3dhcEJ1ZmZlcnMobURlYnVnSW5Td2FwQnVmZmVycyk7Ci0gICAgY29uc3QgbnNlY3NfdCBpblRyYW5zYWN0aW9uKG1EZWJ1Z0luVHJhbnNhY3Rpb24pOwotICAgIG5zZWNzX3QgaW5Td2FwQnVmZmVyc0R1cmF0aW9uID0gKGluU3dhcEJ1ZmZlcnMpID8gbm93LWluU3dhcEJ1ZmZlcnMgOiAwOwotICAgIG5zZWNzX3QgaW5UcmFuc2FjdGlvbkR1cmF0aW9uID0gKGluVHJhbnNhY3Rpb24pID8gbm93LWluVHJhbnNhY3Rpb24gOiAwOwotCi0gICAgLyoKLSAgICAgKiBEdW1wIHRoZSB2aXNpYmxlIGxheWVyIGxpc3QKLSAgICAgKi8KLSAgICBjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycyA9IG1DdXJyZW50U3RhdGUubGF5ZXJzU29ydGVkQnlaOwotICAgIGNvbnN0IHNpemVfdCBjb3VudCA9IGN1cnJlbnRMYXllcnMuc2l6ZSgpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlZpc2libGUgbGF5ZXJzIChjb3VudCA9ICVkKVxuIiwgY291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGN1cnJlbnRMYXllcnNbaV0pOwotICAgICAgICBsYXllci0+ZHVtcChyZXN1bHQsIGJ1ZmZlciwgU0laRSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEdW1wIHRoZSBsYXllcnMgaW4gdGhlIHB1cmdhdG9yeQotICAgICAqLwotCi0gICAgY29uc3Qgc2l6ZV90IHB1cmdhdG9yeVNpemUgPSBtTGF5ZXJQdXJnYXRvcnkuc2l6ZSgpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlB1cmdhdG9yeSBzdGF0ZSAoJWQgZW50cmllcylcbiIsIHB1cmdhdG9yeVNpemUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPHB1cmdhdG9yeVNpemUgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIobUxheWVyUHVyZ2F0b3J5Lml0ZW1BdChpKSk7Ci0gICAgICAgIGxheWVyLT5zaG9ydER1bXAocmVzdWx0LCBidWZmZXIsIFNJWkUpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRHVtcCBTdXJmYWNlRmxpbmdlciBnbG9iYWwgc3RhdGUKLSAgICAgKi8KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlN1cmZhY2VGbGluZ2VyIGdsb2JhbCBzdGF0ZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIGNvbnN0IEdMRXh0ZW5zaW9ucyYgZXh0ZW5zaW9ucyhHTEV4dGVuc2lvbnM6OmdldEluc3RhbmNlKCkpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkdMRVM6ICVzLCAlcywgJXNcbiIsCi0gICAgICAgICAgICBleHRlbnNpb25zLmdldFZlbmRvcigpLAotICAgICAgICAgICAgZXh0ZW5zaW9ucy5nZXRSZW5kZXJlcigpLAotICAgICAgICAgICAgZXh0ZW5zaW9ucy5nZXRWZXJzaW9uKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkVHTCA6ICVzXG4iLAotICAgICAgICAgICAgZWdsUXVlcnlTdHJpbmcoZ3JhcGhpY1BsYW5lKDApLmdldEVHTERpc3BsYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX1ZFUlNJT05fSFdfQU5EUk9JRCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkVYVFM6ICVzXG4iLCBleHRlbnNpb25zLmdldEV4dGVuc2lvbigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBtV29ybWhvbGVSZWdpb24uZHVtcChyZXN1bHQsICJXb3JtaG9sZVJlZ2lvbiIpOwotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAiICBvcmllbnRhdGlvbj0lZCwgY2FuRHJhdz0lZFxuIiwKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUub3JpZW50YXRpb24sIGh3LmNhbkRyYXcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICIgIGxhc3QgZWdsU3dhcEJ1ZmZlcnMoKSB0aW1lOiAlZiB1c1xuIgotICAgICAgICAgICAgIiAgbGFzdCB0cmFuc2FjdGlvbiB0aW1lICAgICA6ICVmIHVzXG4iCi0gICAgICAgICAgICAiICB0cmFuc2FjdGlvbi1mbGFncyAgICAgICAgIDogJTA4eFxuIgotICAgICAgICAgICAgIiAgcmVmcmVzaC1yYXRlICAgICAgICAgICAgICA6ICVmIGZwc1xuIgotICAgICAgICAgICAgIiAgeC1kcGkgICAgICAgICAgICAgICAgICAgICA6ICVmXG4iCi0gICAgICAgICAgICAiICB5LWRwaSAgICAgICAgICAgICAgICAgICAgIDogJWZcbiIsCi0gICAgICAgICAgICBtTGFzdFN3YXBCdWZmZXJUaW1lLzEwMDAuMCwKLSAgICAgICAgICAgIG1MYXN0VHJhbnNhY3Rpb25UaW1lLzEwMDAuMCwKLSAgICAgICAgICAgIG1UcmFuc2FjdGlvbkZsYWdzLAotICAgICAgICAgICAgaHcuZ2V0UmVmcmVzaFJhdGUoKSwKLSAgICAgICAgICAgIGh3LmdldERwaVgoKSwKLSAgICAgICAgICAgIGh3LmdldERwaVkoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICBlZ2xTd2FwQnVmZmVycyB0aW1lOiAlZiB1c1xuIiwKLSAgICAgICAgICAgIGluU3dhcEJ1ZmZlcnNEdXJhdGlvbi8xMDAwLjApOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgdHJhbnNhY3Rpb24gdGltZTogJWYgdXNcbiIsCi0gICAgICAgICAgICBpblRyYW5zYWN0aW9uRHVyYXRpb24vMTAwMC4wKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICAvKgotICAgICAqIFZTWU5DIHN0YXRlCi0gICAgICovCi0gICAgbUV2ZW50VGhyZWFkLT5kdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFKTsKLQotICAgIC8qCi0gICAgICogRHVtcCBIV0NvbXBvc2VyIHN0YXRlCi0gICAgICovCi0gICAgSFdDb21wb3NlciYgaHdjKGh3LmdldEh3Q29tcG9zZXIoKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiaC93IGNvbXBvc2VyIHN0YXRlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgaC93IGNvbXBvc2VyICVzIGFuZCAlc1xuIiwKLSAgICAgICAgICAgIGh3Yy5pbml0Q2hlY2soKT09Tk9fRVJST1IgPyAicHJlc2VudCIgOiAibm90IHByZXNlbnQiLAotICAgICAgICAgICAgICAgICAgICAobURlYnVnRGlzYWJsZUhXQyB8fCBtRGVidWdSZWdpb24pID8gImRpc2FibGVkIiA6ICJlbmFibGVkIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGh3Yy5kdW1wKHJlc3VsdCwgYnVmZmVyLCBTSVpFLCBtVmlzaWJsZUxheWVyc1NvcnRlZEJ5Wik7Ci0KLSAgICAvKgotICAgICAqIER1bXAgZ3JhbGxvYyBzdGF0ZQotICAgICAqLwotICAgIGNvbnN0IEdyYXBoaWNCdWZmZXJBbGxvY2F0b3ImIGFsbG9jKEdyYXBoaWNCdWZmZXJBbGxvY2F0b3I6OmdldCgpKTsKLSAgICBhbGxvYy5kdW1wKHJlc3VsdCk7Ci0gICAgaHcuZHVtcChyZXN1bHQpOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6b25UcmFuc2FjdCgKLSAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKQotewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIENSRUFURV9DT05ORUNUSU9OOgotICAgICAgICBjYXNlIFNFVF9UUkFOU0FDVElPTl9TVEFURToKLSAgICAgICAgY2FzZSBTRVRfT1JJRU5UQVRJT046Ci0gICAgICAgIGNhc2UgQk9PVF9GSU5JU0hFRDoKLSAgICAgICAgY2FzZSBUVVJOX0VMRUNUUk9OX0JFQU1fT0ZGOgotICAgICAgICBjYXNlIFRVUk5fRUxFQ1RST05fQkVBTV9PTjoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY29kZXMgdGhhdCByZXF1aXJlIHBlcm1pc3Npb24gY2hlY2sKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICAgICAgaWYgKCh1aWQgIT0gQUlEX0dSQVBISUNTKSAmJgotICAgICAgICAgICAgICAgICAgICAhUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0FjY2Vzc1N1cmZhY2VGbGluZ2VyLCBwaWQsIHVpZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBhY2Nlc3MgU3VyZmFjZUZsaW5nZXIgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDQVBUVVJFX1NDUkVFTjoKLSAgICAgICAgewotICAgICAgICAgICAgLy8gY29kZXMgdGhhdCByZXF1aXJlIHBlcm1pc3Npb24gY2hlY2sKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICAgICAgaWYgKCh1aWQgIT0gQUlEX0dSQVBISUNTKSAmJgotICAgICAgICAgICAgICAgICAgICAhUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc1JlYWRGcmFtZWJ1ZmZlciwgcGlkLCB1aWQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcmVhZCBmcmFtZWJ1ZmZlciBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IEJuU3VyZmFjZUNvbXBvc2VyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci0gICAgaWYgKGVyciA9PSBVTktOT1dOX1RSQU5TQUNUSU9OIHx8IGVyciA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewotICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoIVBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzSGFyZHdhcmVUZXN0KSkpIHsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOwotICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGlwYy0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAgICAgICAgICJjYW4ndCBhY2Nlc3MgU3VyZmFjZUZsaW5nZXIgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IG47Ci0gICAgICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICAgICAgY2FzZSAxMDAwOiAvLyBTSE9XX0NQVSwgTk9UIFNVUFBPUlRFRCBBTllNT1JFCi0gICAgICAgICAgICBjYXNlIDEwMDE6IC8vIFNIT1dfRlBTLCBOT1QgU1VQUE9SVEVEIEFOWU1PUkUKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICBjYXNlIDEwMDI6ICAvLyBTSE9XX1VQREFURVMKLSAgICAgICAgICAgICAgICBuID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBtRGVidWdSZWdpb24gPSBuID8gbiA6IChtRGVidWdSZWdpb24gPyAwIDogMSk7Ci0gICAgICAgICAgICAgICAgaW52YWxpZGF0ZUh3Y0dlb21ldHJ5KCk7Ci0gICAgICAgICAgICAgICAgcmVwYWludEV2ZXJ5dGhpbmcoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICBjYXNlIDEwMDM6ICAvLyBTSE9XX0JBQ0tHUk9VTkQKLSAgICAgICAgICAgICAgICBuID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBtRGVidWdCYWNrZ3JvdW5kID0gbiA/IDEgOiAwOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgMTAwNDp7IC8vIHJlcGFpbnQgZXZlcnl0aGluZwotICAgICAgICAgICAgICAgIHJlcGFpbnRFdmVyeXRoaW5nKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAxMDA1OnsgLy8gZm9yY2UgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvbkZsYWdzKGVUcmFuc2FjdGlvbk5lZWRlZHxlVHJhdmVyc2FsTmVlZGVkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDEwMDY6eyAvLyBzZW5kIGVtcHR5IHVwZGF0ZQotICAgICAgICAgICAgICAgIHNpZ25hbFJlZnJlc2goKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlIDEwMDg6ICAvLyB0b2dnbGUgdXNlIG9mIGh3IGNvbXBvc2VyCi0gICAgICAgICAgICAgICAgbiA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgbURlYnVnRGlzYWJsZUhXQyA9IG4gPyAxIDogMDsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAgICAgICAgICAgICByZXBhaW50RXZlcnl0aGluZygpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgMTAwOTogIC8vIHRvZ2dsZSB1c2Ugb2YgdHJhbnNmb3JtIGhpbnQKLSAgICAgICAgICAgICAgICBuID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlVHJhbnNmb3JtSGludCA9IG4gPyAxIDogMDsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLSAgICAgICAgICAgICAgICByZXBhaW50RXZlcnl0aGluZygpOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgMTAxMDogIC8vIGludGVycm9nYXRlLgotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG1EZWJ1Z1JlZ2lvbik7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobURlYnVnQmFja2dyb3VuZCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobURlYnVnRGlzYWJsZUhXQyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgY2FzZSAxMDEzOiB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgICAgICAgICAgICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihody5nZXRQYWdlRmxpcENvdW50KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgU3VyZmFjZUZsaW5nZXI6OnJlcGFpbnRFdmVyeXRoaW5nKCkgewotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKDApLmRpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBjb25zdCBSZWN0IGJvdW5kcyhody5nZXRCb3VuZHMoKSk7Ci0gICAgc2V0SW52YWxpZGF0ZVJlZ2lvbihSZWdpb24oYm91bmRzKSk7Ci0gICAgc2lnbmFsVHJhbnNhY3Rpb24oKTsKLX0KLQotdm9pZCBTdXJmYWNlRmxpbmdlcjo6c2V0SW52YWxpZGF0ZVJlZ2lvbihjb25zdCBSZWdpb24mIHJlZykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtSW52YWxpZGF0ZUxvY2spOwotICAgIG1JbnZhbGlkYXRlUmVnaW9uID0gcmVnOwotfQotCi1SZWdpb24gU3VyZmFjZUZsaW5nZXI6OmdldEFuZENsZWFySW52YWxpZGF0ZVJlZ2lvbigpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUludmFsaWRhdGVMb2NrKTsKLSAgICBSZWdpb24gcmVnKG1JbnZhbGlkYXRlUmVnaW9uKTsKLSAgICBtSW52YWxpZGF0ZVJlZ2lvbi5jbGVhcigpOwotICAgIHJldHVybiByZWc7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6cmVuZGVyU2NyZWVuVG9UZXh0dXJlKERpc3BsYXlJRCBkcHksCi0gICAgICAgIEdMdWludCogdGV4dHVyZU5hbWUsIEdMZmxvYXQqIHVPdXQsIEdMZmxvYXQqIHZPdXQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIHJldHVybiByZW5kZXJTY3JlZW5Ub1RleHR1cmVMb2NrZWQoZHB5LCB0ZXh0dXJlTmFtZSwgdU91dCwgdk91dCk7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjpyZW5kZXJTY3JlZW5Ub1RleHR1cmVMb2NrZWQoRGlzcGxheUlEIGRweSwKLSAgICAgICAgR0x1aW50KiB0ZXh0dXJlTmFtZSwgR0xmbG9hdCogdU91dCwgR0xmbG9hdCogdk91dCkKLXsKLSAgICBpZiAoIUdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXZlRnJhbWVidWZmZXJPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgLy8gZ2V0IHNjcmVlbiBnZW9tZXRyeQotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZ3JhcGhpY1BsYW5lKGRweSkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IHVpbnQzMl90IGh3X3cgPSBody5nZXRXaWR0aCgpOwotICAgIGNvbnN0IHVpbnQzMl90IGh3X2ggPSBody5nZXRIZWlnaHQoKTsKLSAgICBHTGZsb2F0IHUgPSAxOwotICAgIEdMZmxvYXQgdiA9IDE7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gY2xlYXIgYWxsIEdMIGVycm9yIGZsYWdzCi0gICAgd2hpbGUgKCBnbEdldEVycm9yKCkgIT0gR0xfTk9fRVJST1IgKSA7Ci0KLSAgICAvLyBjcmVhdGUgYSBGQk8KLSAgICBHTHVpbnQgbmFtZSwgdG5hbWU7Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAmdG5hbWUpOwotICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdG5hbWUpOwotICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCi0gICAgICAgICAgICBod193LCBod19oLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX0JZVEUsIDApOwotICAgIGlmIChnbEdldEVycm9yKCkgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgd2hpbGUgKCBnbEdldEVycm9yKCkgIT0gR0xfTk9fRVJST1IgKSA7Ci0gICAgICAgIEdMaW50IHR3ID0gKDIgPDwgKDMxIC0gY2x6KGh3X3cpKSk7Ci0gICAgICAgIEdMaW50IHRoID0gKDIgPDwgKDMxIC0gY2x6KGh3X2gpKSk7Ci0gICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCi0gICAgICAgICAgICAgICAgdHcsIHRoLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX0JZVEUsIDApOwotICAgICAgICB1ID0gR0xmbG9hdChod193KSAvIHR3OwotICAgICAgICB2ID0gR0xmbG9hdChod19oKSAvIHRoOwotICAgIH0KLSAgICBnbEdlbkZyYW1lYnVmZmVyc09FUygxLCAmbmFtZSk7Ci0gICAgZ2xCaW5kRnJhbWVidWZmZXJPRVMoR0xfRlJBTUVCVUZGRVJfT0VTLCBuYW1lKTsKLSAgICBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTKEdMX0ZSQU1FQlVGRkVSX09FUywKLSAgICAgICAgICAgIEdMX0NPTE9SX0FUVEFDSE1FTlQwX09FUywgR0xfVEVYVFVSRV8yRCwgdG5hbWUsIDApOwotCi0gICAgLy8gcmVkcmF3IHRoZSBzY3JlZW4gZW50aXJlbHkuLi4KLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMpOwotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbENsZWFyQ29sb3IoMCwwLDAsMSk7Ci0gICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0gICAgY29uc3QgVmVjdG9yPCBzcDxMYXllckJhc2U+ID4mIGxheWVycyhtVmlzaWJsZUxheWVyc1NvcnRlZEJ5Wik7Ci0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gbGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKGxheWVyc1tpXSk7Ci0gICAgICAgIGxheWVyLT5kcmF3Rm9yU3JlZW5TaG90KCk7Ci0gICAgfQotCi0gICAgaHcuY29tcG9zaXRpb25Db21wbGV0ZSgpOwotCi0gICAgLy8gYmFjayB0byBtYWluIGZyYW1lYnVmZmVyCi0gICAgZ2xCaW5kRnJhbWVidWZmZXJPRVMoR0xfRlJBTUVCVUZGRVJfT0VTLCAwKTsKLSAgICBnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUygxLCAmbmFtZSk7Ci0KLSAgICAqdGV4dHVyZU5hbWUgPSB0bmFtZTsKLSAgICAqdU91dCA9IHU7Ci0gICAgKnZPdXQgPSB2OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjplbGVjdHJvbkJlYW1PZmZBbmltYXRpb25JbXBsTG9ja2VkKCkKLXsKLSAgICAvLyBnZXQgc2NyZWVuIGdlb21ldHJ5Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IHVpbnQzMl90IGh3X3cgPSBody5nZXRXaWR0aCgpOwotICAgIGNvbnN0IHVpbnQzMl90IGh3X2ggPSBody5nZXRIZWlnaHQoKTsKLSAgICBjb25zdCBSZWdpb24gc2NyZWVuQm91bmRzKGh3LmdldEJvdW5kcygpKTsKLQotICAgIEdMZmxvYXQgdSwgdjsKLSAgICBHTHVpbnQgdG5hbWU7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVuZGVyU2NyZWVuVG9UZXh0dXJlTG9ja2VkKDAsICZ0bmFtZSwgJnUsICZ2KTsKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgR0xmbG9hdCB2dHhbOF07Ci0gICAgY29uc3QgR0xmbG9hdCB0ZXhDb29yZHNbNF1bMl0gPSB7IHswLDB9LCB7MCx2fSwge3Usdn0sIHt1LDB9IH07Ci0gICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0bmFtZSk7Ci0gICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB0ZXhDb29yZHMpOwotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB2dHgpOwotCi0gICAgLyoKLSAgICAgKiBUZXh0dXJlIGNvb3JkaW5hdGUgbWFwcGluZwotICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgIHUKLSAgICAgKiAgICAxICstLS0tLS0tLS0tKy0tLSsKLSAgICAgKiAgICAgIHwgICAgIHwgICAgfCAgIHwgIGltYWdlIGlzIGludmVydGVkCi0gICAgICogICAgICB8ICAgICBWICAgIHwgICB8ICB3LnIudC4gdGhlIHRleHR1cmUKLSAgICAgKiAgMS12ICstLS0tLS0tLS0tKyAgIHwgIGNvb3JkaW5hdGVzCi0gICAgICogICAgICB8ICAgICAgICAgICAgICB8Ci0gICAgICogICAgICB8ICAgICAgICAgICAgICB8Ci0gICAgICogICAgICB8ICAgICAgICAgICAgICB8Ci0gICAgICogICAgMCArLS0tLS0tLS0tLS0tLS0rCi0gICAgICogICAgICAwICAgICAgICAgICAgICAxCi0gICAgICoKLSAgICAgKi8KLQotICAgIGNsYXNzIHNfY3VydmVfaW50ZXJwb2xhdG9yIHsKLSAgICAgICAgY29uc3QgZmxvYXQgbmJGcmFtZXMsIHMsIHY7Ci0gICAgcHVibGljOgotICAgICAgICBzX2N1cnZlX2ludGVycG9sYXRvcihpbnQgbmJGcmFtZXMsIGZsb2F0IHMpCi0gICAgICAgIDogbmJGcmFtZXMoMS4wZiAvIChuYkZyYW1lcy0xKSksIHMocyksCi0gICAgICAgICAgdigxLjBmICsgZXhwZigtcyArIDAuNWYqcykpIHsKLSAgICAgICAgfQotICAgICAgICBmbG9hdCBvcGVyYXRvcigpKGludCBmKSB7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCB4ID0gZiAqIG5iRnJhbWVzOwotICAgICAgICAgICAgcmV0dXJuICgoMS4wZi8oMS4wZiArIGV4cGYoLXgqcyArIDAuNWYqcykpKSAtIDAuNWYpICogdiArIDAuNWY7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgY2xhc3Mgdl9zdHJldGNoIHsKLSAgICAgICAgY29uc3QgR0xmbG9hdCBod193LCBod19oOwotICAgIHB1YmxpYzoKLSAgICAgICAgdl9zdHJldGNoKHVpbnQzMl90IGh3X3csIHVpbnQzMl90IGh3X2gpCi0gICAgICAgIDogaHdfdyhod193KSwgaHdfaChod19oKSB7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBvcGVyYXRvcigpKEdMZmxvYXQqIHZ0eCwgZmxvYXQgdikgewotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB3ID0gaHdfdyArIChod193ICogdik7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IGggPSBod19oIC0gKGh3X2ggKiB2KTsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgeCA9IChod193IC0gdykgKiAwLjVmOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB5ID0gKGh3X2ggLSBoKSAqIDAuNWY7Ci0gICAgICAgICAgICB2dHhbMF0gPSB4OyAgICAgICAgIHZ0eFsxXSA9IHk7Ci0gICAgICAgICAgICB2dHhbMl0gPSB4OyAgICAgICAgIHZ0eFszXSA9IHkgKyBoOwotICAgICAgICAgICAgdnR4WzRdID0geCArIHc7ICAgICB2dHhbNV0gPSB5ICsgaDsKLSAgICAgICAgICAgIHZ0eFs2XSA9IHggKyB3OyAgICAgdnR4WzddID0geTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyBoX3N0cmV0Y2ggewotICAgICAgICBjb25zdCBHTGZsb2F0IGh3X3csIGh3X2g7Ci0gICAgcHVibGljOgotICAgICAgICBoX3N0cmV0Y2godWludDMyX3QgaHdfdywgdWludDMyX3QgaHdfaCkKLSAgICAgICAgOiBod193KGh3X3cpLCBod19oKGh3X2gpIHsKLSAgICAgICAgfQotICAgICAgICB2b2lkIG9wZXJhdG9yKCkoR0xmbG9hdCogdnR4LCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHcgPSBod193IC0gKGh3X3cgKiB2KTsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgaCA9IDEuMGY7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHggPSAoaHdfdyAtIHcpICogMC41ZjsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgeSA9IChod19oIC0gaCkgKiAwLjVmOwotICAgICAgICAgICAgdnR4WzBdID0geDsgICAgICAgICB2dHhbMV0gPSB5OwotICAgICAgICAgICAgdnR4WzJdID0geDsgICAgICAgICB2dHhbM10gPSB5ICsgaDsKLSAgICAgICAgICAgIHZ0eFs0XSA9IHggKyB3OyAgICAgdnR4WzVdID0geSArIGg7Ci0gICAgICAgICAgICB2dHhbNl0gPSB4ICsgdzsgICAgIHZ0eFs3XSA9IHk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gdGhlIGZ1bGwgYW5pbWF0aW9uIGlzIDI0IGZyYW1lcwotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLnNmLmVsZWN0cm9uX2ZyYW1lcyIsIHZhbHVlLCAiMjQiKTsKLSAgICBpbnQgbmJGcmFtZXMgPSAoYXRvaSh2YWx1ZSkgKyAxKSA+PiAxOwotICAgIGlmIChuYkZyYW1lcyA8PSAwKSAvLyBqdXN0IGluIGNhc2UKLSAgICAgICAgbmJGcmFtZXMgPSAyNDsKLQotICAgIHNfY3VydmVfaW50ZXJwb2xhdG9yIGl0cihuYkZyYW1lcywgNy41Zik7Ci0gICAgc19jdXJ2ZV9pbnRlcnBvbGF0b3IgaXRnKG5iRnJhbWVzLCA4LjBmKTsKLSAgICBzX2N1cnZlX2ludGVycG9sYXRvciBpdGIobmJGcmFtZXMsIDguNWYpOwotCi0gICAgdl9zdHJldGNoIHZ2ZXJ0cyhod193LCBod19oKTsKLQotICAgIGdsTWF0cml4TW9kZShHTF9URVhUVVJFKTsKLSAgICBnbExvYWRJZGVudGl0eSgpOwotICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIGdsTG9hZElkZW50aXR5KCk7Ci0KLSAgICBnbEVuYWJsZShHTF9CTEVORCk7Ci0gICAgZ2xCbGVuZEZ1bmMoR0xfT05FLCBHTF9PTkUpOwotICAgIGZvciAoaW50IGk9MCA7IGk8bmJGcmFtZXMgOyBpKyspIHsKLSAgICAgICAgZmxvYXQgeCwgeSwgdywgaDsKLSAgICAgICAgY29uc3QgZmxvYXQgdnIgPSBpdHIoaSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHZnID0gaXRnKGkpOwotICAgICAgICBjb25zdCBmbG9hdCB2YiA9IGl0YihpKTsKLQotICAgICAgICAvLyBjbGVhciBzY3JlZW4KLSAgICAgICAgZ2xDb2xvck1hc2soMSwxLDEsMSk7Ci0gICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIHJlZCBwbGFuZQotICAgICAgICB2dmVydHModnR4LCB2cik7Ci0gICAgICAgIGdsQ29sb3JNYXNrKDEsMCwwLDEpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLQotICAgICAgICAvLyBkcmF3IHRoZSBncmVlbiBwbGFuZQotICAgICAgICB2dmVydHModnR4LCB2Zyk7Ci0gICAgICAgIGdsQ29sb3JNYXNrKDAsMSwwLDEpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLQotICAgICAgICAvLyBkcmF3IHRoZSBibHVlIHBsYW5lCi0gICAgICAgIHZ2ZXJ0cyh2dHgsIHZiKTsKLSAgICAgICAgZ2xDb2xvck1hc2soMCwwLDEsMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIHdoaXRlIGhpZ2hsaWdodCAod2UgdXNlIHRoZSBsYXN0IHZlcnRpY2VzKQotICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgICAgIGdsQ29sb3JNYXNrKDEsMSwxLDEpOwotICAgICAgICBnbENvbG9yNGYodmcsIHZnLCB2ZywgMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgICAgICBody5mbGlwKHNjcmVlbkJvdW5kcyk7Ci0gICAgfQotCi0gICAgaF9zdHJldGNoIGh2ZXJ0cyhod193LCBod19oKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbENvbG9yTWFzaygxLDEsMSwxKTsKLSAgICBmb3IgKGludCBpPTAgOyBpPG5iRnJhbWVzIDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHYgPSBpdGcoaSk7Ci0gICAgICAgIGh2ZXJ0cyh2dHgsIHYpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICAgICAgICBnbENvbG9yNGYoMS12LCAxLXYsIDEtdiwgMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotICAgICAgICBody5mbGlwKHNjcmVlbkJvdW5kcyk7Ci0gICAgfQotCi0gICAgZ2xDb2xvck1hc2soMSwxLDEsMSk7Ci0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKLSAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0bmFtZSk7Ci0gICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfMkQpOwotICAgIGdsRGlzYWJsZShHTF9CTEVORCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6ZWxlY3Ryb25CZWFtT25BbmltYXRpb25JbXBsTG9ja2VkKCkKLXsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIGlmICghR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhdmVGcmFtZWJ1ZmZlck9iamVjdCgpKQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLQotICAgIC8vIGdldCBzY3JlZW4gZ2VvbWV0cnkKLSAgICBjb25zdCBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfdyA9IGh3LmdldFdpZHRoKCk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfaCA9IGh3LmdldEhlaWdodCgpOwotICAgIGNvbnN0IFJlZ2lvbiBzY3JlZW5Cb3VuZHMoaHcuYm91bmRzKCkpOwotCi0gICAgR0xmbG9hdCB1LCB2OwotICAgIEdMdWludCB0bmFtZTsKLSAgICByZXN1bHQgPSByZW5kZXJTY3JlZW5Ub1RleHR1cmVMb2NrZWQoMCwgJnRuYW1lLCAmdSwgJnYpOwotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBHTGZsb2F0IHZ0eFs4XTsKLSAgICBjb25zdCBHTGZsb2F0IHRleENvb3Jkc1s0XVsyXSA9IHsgezAsdn0sIHswLDB9LCB7dSwwfSwge3Usdn0gfTsKLSAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHRuYW1lKTsKLSAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX01PRFVMQVRFKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKLSAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOwotICAgIGdsVGV4Q29vcmRQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB0ZXhDb29yZHMpOwotICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xWZXJ0ZXhQb2ludGVyKDIsIEdMX0ZMT0FULCAwLCB2dHgpOwotCi0gICAgY2xhc3Mgc19jdXJ2ZV9pbnRlcnBvbGF0b3IgewotICAgICAgICBjb25zdCBmbG9hdCBuYkZyYW1lcywgcywgdjsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHNfY3VydmVfaW50ZXJwb2xhdG9yKGludCBuYkZyYW1lcywgZmxvYXQgcykKLSAgICAgICAgOiBuYkZyYW1lcygxLjBmIC8gKG5iRnJhbWVzLTEpKSwgcyhzKSwKLSAgICAgICAgICB2KDEuMGYgKyBleHBmKC1zICsgMC41ZipzKSkgewotICAgICAgICB9Ci0gICAgICAgIGZsb2F0IG9wZXJhdG9yKCkoaW50IGYpIHsKLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IHggPSBmICogbmJGcmFtZXM7Ci0gICAgICAgICAgICByZXR1cm4gKCgxLjBmLygxLjBmICsgZXhwZigteCpzICsgMC41ZipzKSkpIC0gMC41ZikgKiB2ICsgMC41ZjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBjbGFzcyB2X3N0cmV0Y2ggewotICAgICAgICBjb25zdCBHTGZsb2F0IGh3X3csIGh3X2g7Ci0gICAgcHVibGljOgotICAgICAgICB2X3N0cmV0Y2godWludDMyX3QgaHdfdywgdWludDMyX3QgaHdfaCkKLSAgICAgICAgOiBod193KGh3X3cpLCBod19oKGh3X2gpIHsKLSAgICAgICAgfQotICAgICAgICB2b2lkIG9wZXJhdG9yKCkoR0xmbG9hdCogdnR4LCBmbG9hdCB2KSB7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHcgPSBod193ICsgKGh3X3cgKiB2KTsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgaCA9IGh3X2ggLSAoaHdfaCAqIHYpOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB4ID0gKGh3X3cgLSB3KSAqIDAuNWY7Ci0gICAgICAgICAgICBjb25zdCBHTGZsb2F0IHkgPSAoaHdfaCAtIGgpICogMC41ZjsKLSAgICAgICAgICAgIHZ0eFswXSA9IHg7ICAgICAgICAgdnR4WzFdID0geTsKLSAgICAgICAgICAgIHZ0eFsyXSA9IHg7ICAgICAgICAgdnR4WzNdID0geSArIGg7Ci0gICAgICAgICAgICB2dHhbNF0gPSB4ICsgdzsgICAgIHZ0eFs1XSA9IHkgKyBoOwotICAgICAgICAgICAgdnR4WzZdID0geCArIHc7ICAgICB2dHhbN10gPSB5OwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIGNsYXNzIGhfc3RyZXRjaCB7Ci0gICAgICAgIGNvbnN0IEdMZmxvYXQgaHdfdywgaHdfaDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGhfc3RyZXRjaCh1aW50MzJfdCBod193LCB1aW50MzJfdCBod19oKQotICAgICAgICA6IGh3X3coaHdfdyksIGh3X2goaHdfaCkgewotICAgICAgICB9Ci0gICAgICAgIHZvaWQgb3BlcmF0b3IoKShHTGZsb2F0KiB2dHgsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgdyA9IGh3X3cgLSAoaHdfdyAqIHYpOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCBoID0gMS4wZjsKLSAgICAgICAgICAgIGNvbnN0IEdMZmxvYXQgeCA9IChod193IC0gdykgKiAwLjVmOwotICAgICAgICAgICAgY29uc3QgR0xmbG9hdCB5ID0gKGh3X2ggLSBoKSAqIDAuNWY7Ci0gICAgICAgICAgICB2dHhbMF0gPSB4OyAgICAgICAgIHZ0eFsxXSA9IHk7Ci0gICAgICAgICAgICB2dHhbMl0gPSB4OyAgICAgICAgIHZ0eFszXSA9IHkgKyBoOwotICAgICAgICAgICAgdnR4WzRdID0geCArIHc7ICAgICB2dHhbNV0gPSB5ICsgaDsKLSAgICAgICAgICAgIHZ0eFs2XSA9IHggKyB3OyAgICAgdnR4WzddID0geTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvLyB0aGUgZnVsbCBhbmltYXRpb24gaXMgMTIgZnJhbWVzCi0gICAgaW50IG5iRnJhbWVzID0gODsKLSAgICBzX2N1cnZlX2ludGVycG9sYXRvciBpdHIobmJGcmFtZXMsIDcuNWYpOwotICAgIHNfY3VydmVfaW50ZXJwb2xhdG9yIGl0ZyhuYkZyYW1lcywgOC4wZik7Ci0gICAgc19jdXJ2ZV9pbnRlcnBvbGF0b3IgaXRiKG5iRnJhbWVzLCA4LjVmKTsKLQotICAgIGhfc3RyZXRjaCBodmVydHMoaHdfdywgaHdfaCk7Ci0gICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKLSAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7Ci0gICAgZ2xDb2xvck1hc2soMSwxLDEsMSk7Ci0gICAgZm9yIChpbnQgaT1uYkZyYW1lcy0xIDsgaT49MCA7IGktLSkgewotICAgICAgICBjb25zdCBmbG9hdCB2ID0gaXRnKGkpOwotICAgICAgICBodmVydHModnR4LCB2KTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZ2xDb2xvcjRmKDEtdiwgMS12LCAxLXYsIDEpOwotICAgICAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfRkFOLCAwLCA0KTsKLSAgICAgICAgaHcuZmxpcChzY3JlZW5Cb3VuZHMpOwotICAgIH0KLQotICAgIG5iRnJhbWVzID0gNDsKLSAgICB2X3N0cmV0Y2ggdnZlcnRzKGh3X3csIGh3X2gpOwotICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKLSAgICBnbEJsZW5kRnVuYyhHTF9PTkUsIEdMX09ORSk7Ci0gICAgZm9yIChpbnQgaT1uYkZyYW1lcy0xIDsgaT49MCA7IGktLSkgewotICAgICAgICBmbG9hdCB4LCB5LCB3LCBoOwotICAgICAgICBjb25zdCBmbG9hdCB2ciA9IGl0cihpKTsKLSAgICAgICAgY29uc3QgZmxvYXQgdmcgPSBpdGcoaSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHZiID0gaXRiKGkpOwotCi0gICAgICAgIC8vIGNsZWFyIHNjcmVlbgotICAgICAgICBnbENvbG9yTWFzaygxLDEsMSwxKTsKLSAgICAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKLSAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgcmVkIHBsYW5lCi0gICAgICAgIHZ2ZXJ0cyh2dHgsIHZyKTsKLSAgICAgICAgZ2xDb2xvck1hc2soMSwwLDAsMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIGdyZWVuIHBsYW5lCi0gICAgICAgIHZ2ZXJ0cyh2dHgsIHZnKTsKLSAgICAgICAgZ2xDb2xvck1hc2soMCwxLDAsMSk7Ci0gICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRV9GQU4sIDAsIDQpOwotCi0gICAgICAgIC8vIGRyYXcgdGhlIGJsdWUgcGxhbmUKLSAgICAgICAgdnZlcnRzKHZ0eCwgdmIpOwotICAgICAgICBnbENvbG9yTWFzaygwLDAsMSwxKTsKLSAgICAgICAgZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCk7Ci0KLSAgICAgICAgaHcuZmxpcChzY3JlZW5Cb3VuZHMpOwotICAgIH0KLQotICAgIGdsQ29sb3JNYXNrKDEsMSwxLDEpOwotICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfVEVYVFVSRV9DT09SRF9BUlJBWSk7Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdG5hbWUpOwotICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzJEKTsKLSAgICBnbERpc2FibGUoR0xfQkxFTkQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OnR1cm5FbGVjdHJvbkJlYW1PZmZJbXBsTG9ja2VkKGludDMyX3QgbW9kZSkKLXsKLSAgICBEaXNwbGF5SGFyZHdhcmUmIGh3KGdyYXBoaWNQbGFuZSgwKS5lZGl0RGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGlmICghaHcuY2FuRHJhdygpKSB7Ci0gICAgICAgIC8vIHdlJ3JlIGFscmVhZHkgb2ZmCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyB0dXJuIG9mZiBod2Mgd2hpbGUgd2UncmUgZG9pbmcgdGhlIGFuaW1hdGlvbgotICAgIGh3LmdldEh3Q29tcG9zZXIoKS5kaXNhYmxlKCk7Ci0gICAgLy8gYW5kIG1ha2Ugc3VyZSB0byB0dXJuIGl0IGJhY2sgb24gKGlmIG5lZWRlZCkgbmV4dCB0aW1lIHdlIGNvbXBvc2UKLSAgICBpbnZhbGlkYXRlSHdjR2VvbWV0cnkoKTsKLQotICAgIGlmIChtb2RlICYgSVN1cmZhY2VDb21wb3Nlcjo6ZUVsZWN0cm9uQmVhbUFuaW1hdGlvbk9mZikgewotICAgICAgICBlbGVjdHJvbkJlYW1PZmZBbmltYXRpb25JbXBsTG9ja2VkKCk7Ci0gICAgfQotCi0gICAgLy8gYWx3YXlzIGNsZWFyIHRoZSB3aG9sZSBzY3JlZW4gYXQgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uCi0gICAgZ2xDbGVhckNvbG9yKDAsMCwwLDEpOwotICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7Ci0gICAgZ2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBody5mbGlwKCBSZWdpb24oaHcuYm91bmRzKCkpICk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VGbGluZ2VyOjp0dXJuRWxlY3Ryb25CZWFtT2ZmKGludDMyX3QgbW9kZSkKLXsKLSAgICBjbGFzcyBNZXNzYWdlVHVybkVsZWN0cm9uQmVhbU9mZiA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7Ci0gICAgICAgIFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyOwotICAgICAgICBpbnQzMl90IG1vZGU7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lc3NhZ2VUdXJuRWxlY3Ryb25CZWFtT2ZmKFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyLCBpbnQzMl90IG1vZGUpCi0gICAgICAgICAgICA6IGZsaW5nZXIoZmxpbmdlciksIG1vZGUobW9kZSksIHJlc3VsdChQRVJNSVNTSU9OX0RFTklFRCkgewotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IGdldFJlc3VsdCgpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBib29sIGhhbmRsZXIoKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZmxpbmdlci0+bVN0YXRlTG9jayk7Ci0gICAgICAgICAgICByZXN1bHQgPSBmbGluZ2VyLT50dXJuRWxlY3Ryb25CZWFtT2ZmSW1wbExvY2tlZChtb2RlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHNwPE1lc3NhZ2VCYXNlPiBtc2cgPSBuZXcgTWVzc2FnZVR1cm5FbGVjdHJvbkJlYW1PZmYodGhpcywgbW9kZSk7Ci0gICAgc3RhdHVzX3QgcmVzID0gcG9zdE1lc3NhZ2VTeW5jKG1zZyk7Ci0gICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewotICAgICAgICByZXMgPSBzdGF0aWNfY2FzdDxNZXNzYWdlVHVybkVsZWN0cm9uQmVhbU9mZio+KCBtc2cuZ2V0KCkgKS0+Z2V0UmVzdWx0KCk7Ci0KLSAgICAgICAgLy8gd29yay1hcm91bmQ6IHdoZW4gdGhlIHBvd2VyLW1hbmFnZXIgY2FsbHMgdXMgd2UgYWN0aXZhdGUgdGhlCi0gICAgICAgIC8vIGFuaW1hdGlvbi4gZXZlbnR1YWxseSwgdGhlICJvbiIgYW5pbWF0aW9uIHdpbGwgYmUgY2FsbGVkCi0gICAgICAgIC8vIGJ5IHRoZSBwb3dlci1tYW5hZ2VyIGl0c2VsZgotICAgICAgICBtRWxlY3Ryb25CZWFtQW5pbWF0aW9uTW9kZSA9IG1vZGU7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6dHVybkVsZWN0cm9uQmVhbU9uSW1wbExvY2tlZChpbnQzMl90IG1vZGUpCi17Ci0gICAgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoMCkuZWRpdERpc3BsYXlIYXJkd2FyZSgpKTsKLSAgICBpZiAoaHcuY2FuRHJhdygpKSB7Ci0gICAgICAgIC8vIHdlJ3JlIGFscmVhZHkgb24KLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAobW9kZSAmIElTdXJmYWNlQ29tcG9zZXI6OmVFbGVjdHJvbkJlYW1BbmltYXRpb25PbikgewotICAgICAgICBlbGVjdHJvbkJlYW1PbkFuaW1hdGlvbkltcGxMb2NrZWQoKTsKLSAgICB9Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcmVkcmF3IHRoZSB3aG9sZSBzY3JlZW4gd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGRvbmUKLSAgICBtRGlydHlSZWdpb24uc2V0KGh3LmJvdW5kcygpKTsKLSAgICBzaWduYWxUcmFuc2FjdGlvbigpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6dHVybkVsZWN0cm9uQmVhbU9uKGludDMyX3QgbW9kZSkKLXsKLSAgICBjbGFzcyBNZXNzYWdlVHVybkVsZWN0cm9uQmVhbU9uIDogcHVibGljIE1lc3NhZ2VCYXNlIHsKLSAgICAgICAgU3VyZmFjZUZsaW5nZXIqIGZsaW5nZXI7Ci0gICAgICAgIGludDMyX3QgbW9kZTsKLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0OwotICAgIHB1YmxpYzoKLSAgICAgICAgTWVzc2FnZVR1cm5FbGVjdHJvbkJlYW1PbihTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgaW50MzJfdCBtb2RlKQotICAgICAgICAgICAgOiBmbGluZ2VyKGZsaW5nZXIpLCBtb2RlKG1vZGUpLCByZXN1bHQoUEVSTUlTU0lPTl9ERU5JRUQpIHsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBnZXRSZXN1bHQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVyKCkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGZsaW5nZXItPm1TdGF0ZUxvY2spOwotICAgICAgICAgICAgcmVzdWx0ID0gZmxpbmdlci0+dHVybkVsZWN0cm9uQmVhbU9uSW1wbExvY2tlZChtb2RlKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHBvc3RNZXNzYWdlQXN5bmMoIG5ldyBNZXNzYWdlVHVybkVsZWN0cm9uQmVhbU9uKHRoaXMsIG1vZGUpICk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgU3VyZmFjZUZsaW5nZXI6OmNhcHR1cmVTY3JlZW5JbXBsTG9ja2VkKERpc3BsYXlJRCBkcHksCi0gICAgICAgIHNwPElNZW1vcnlIZWFwPiogaGVhcCwKLSAgICAgICAgdWludDMyX3QqIHcsIHVpbnQzMl90KiBoLCBQaXhlbEZvcm1hdCogZiwKLSAgICAgICAgdWludDMyX3Qgc3csIHVpbnQzMl90IHNoLAotICAgICAgICB1aW50MzJfdCBtaW5MYXllclosIHVpbnQzMl90IG1heExheWVyWikKLXsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIC8vIG9ubHkgb25lIGRpc3BsYXkgc3VwcG9ydGVkIGZvciBub3cKLSAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QoZHB5KSA+PSBESVNQTEFZX0NPVU5UKSkKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIGlmICghR0xFeHRlbnNpb25zOjpnZXRJbnN0YW5jZSgpLmhhdmVGcmFtZWJ1ZmZlck9iamVjdCgpKQotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICAvLyBnZXQgc2NyZWVuIGdlb21ldHJ5Ci0gICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiBodyhncmFwaGljUGxhbmUoZHB5KS5kaXNwbGF5SGFyZHdhcmUoKSk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfdyA9IGh3LmdldFdpZHRoKCk7Ci0gICAgY29uc3QgdWludDMyX3QgaHdfaCA9IGh3LmdldEhlaWdodCgpOwotCi0gICAgaWYgKChzdyA+IGh3X3cpIHx8IChzaCA+IGh3X2gpKQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgc3cgPSAoIXN3KSA/IGh3X3cgOiBzdzsKLSAgICBzaCA9ICghc2gpID8gaHdfaCA6IHNoOwotICAgIGNvbnN0IHNpemVfdCBzaXplID0gc3cgKiBzaCAqIDQ7Ci0KLSAgICAvL0FMT0dEKCJzY3JlZW5zaG90OiBzdz0lZCwgc2g9JWQsIG1pblo9JWQsIG1heFo9JWQiLAotICAgIC8vICAgICAgICBzdywgc2gsIG1pbkxheWVyWiwgbWF4TGF5ZXJaKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhciBhbGwgR0wgZXJyb3IgZmxhZ3MKLSAgICB3aGlsZSAoIGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUiApIDsKLQotICAgIC8vIGNyZWF0ZSBhIEZCTwotICAgIEdMdWludCBuYW1lLCB0bmFtZTsKLSAgICBnbEdlblJlbmRlcmJ1ZmZlcnNPRVMoMSwgJnRuYW1lKTsKLSAgICBnbEJpbmRSZW5kZXJidWZmZXJPRVMoR0xfUkVOREVSQlVGRkVSX09FUywgdG5hbWUpOwotICAgIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyhHTF9SRU5ERVJCVUZGRVJfT0VTLCBHTF9SR0JBOF9PRVMsIHN3LCBzaCk7Ci0gICAgZ2xHZW5GcmFtZWJ1ZmZlcnNPRVMoMSwgJm5hbWUpOwotICAgIGdsQmluZEZyYW1lYnVmZmVyT0VTKEdMX0ZSQU1FQlVGRkVSX09FUywgbmFtZSk7Ci0gICAgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyhHTF9GUkFNRUJVRkZFUl9PRVMsCi0gICAgICAgICAgICBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9PRVMsIEdMX1JFTkRFUkJVRkZFUl9PRVMsIHRuYW1lKTsKLQotICAgIEdMZW51bSBzdGF0dXMgPSBnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNPRVMoR0xfRlJBTUVCVUZGRVJfT0VTKTsKLQotICAgIGlmIChzdGF0dXMgPT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTKSB7Ci0KLSAgICAgICAgLy8gaW52ZXJ0IGV2ZXJ5dGhpbmcsIGIvYyBnbFJlYWRQaXhlbCgpIGJlbG93IHdpbGwgaW52ZXJ0IHRoZSBGQgotICAgICAgICBnbFZpZXdwb3J0KDAsIDAsIHN3LCBzaCk7Ci0gICAgICAgIGdsU2Npc3NvcigwLCAwLCBzdywgc2gpOwotICAgICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIGdsUHVzaE1hdHJpeCgpOwotICAgICAgICBnbExvYWRJZGVudGl0eSgpOwotICAgICAgICBnbE9ydGhvZigwLCBod193LCBod19oLCAwLCAwLCAxKTsKLSAgICAgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7Ci0KLSAgICAgICAgLy8gcmVkcmF3IHRoZSBzY3JlZW4gZW50aXJlbHkuLi4KLSAgICAgICAgZ2xDbGVhckNvbG9yKDAsMCwwLDEpOwotICAgICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotCi0gICAgICAgIGNvbnN0IExheWVyVmVjdG9yJiBsYXllcnMobURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOwotICAgICAgICBjb25zdCBzaXplX3QgY291bnQgPSBsYXllcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcihsYXllcnNbaV0pOwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZmxhZ3MgPSBsYXllci0+ZHJhd2luZ1N0YXRlKCkuZmxhZ3M7Ci0gICAgICAgICAgICBpZiAoIShmbGFncyAmIElTdXJmYWNlQ29tcG9zZXI6OmVMYXllckhpZGRlbikpIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB6ID0gbGF5ZXItPmRyYXdpbmdTdGF0ZSgpLno7Ci0gICAgICAgICAgICAgICAgaWYgKHogPj0gbWluTGF5ZXJaICYmIHogPD0gbWF4TGF5ZXJaKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxheWVyLT5kcmF3Rm9yU3JlZW5TaG90KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gWFhYOiB0aGlzIGlzIG5lZWRlZCBvbiB0ZWdyYQotICAgICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICBnbFNjaXNzb3IoMCwgMCwgc3csIHNoKTsKLQotICAgICAgICAvLyBjaGVjayBmb3IgZXJyb3JzIGFuZCByZXR1cm4gc2NyZWVuIGNhcHR1cmUKLSAgICAgICAgaWYgKGdsR2V0RXJyb3IoKSAhPSBHTF9OT19FUlJPUikgewotICAgICAgICAgICAgLy8gZXJyb3Igd2hpbGUgcmVuZGVyaW5nCi0gICAgICAgICAgICByZXN1bHQgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnkgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCi0gICAgICAgICAgICAvLyBzY3JlZW4gY2FwdHVyZQotICAgICAgICAgICAgc3A8TWVtb3J5SGVhcEJhc2U+IGJhc2UoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlIZWFwQmFzZShzaXplLCAwLCAic2NyZWVuLWNhcHR1cmUiKSApOwotICAgICAgICAgICAgdm9pZCogY29uc3QgcHRyID0gYmFzZS0+Z2V0QmFzZSgpOwotICAgICAgICAgICAgaWYgKHB0cikgewotICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgdGhlIHNjcmVlbiB3aXRoIGdsUmVhZFBpeGVscygpCi0gICAgICAgICAgICAgICAgZ2xSZWFkUGl4ZWxzKDAsIDAsIHN3LCBzaCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgcHRyKTsKLSAgICAgICAgICAgICAgICBpZiAoZ2xHZXRFcnJvcigpID09IEdMX05PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICpoZWFwID0gYmFzZTsKLSAgICAgICAgICAgICAgICAgICAgKncgPSBzdzsKLSAgICAgICAgICAgICAgICAgICAgKmggPSBzaDsKLSAgICAgICAgICAgICAgICAgICAgKmYgPSBQSVhFTF9GT1JNQVRfUkdCQV84ODg4OwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBOT19FUlJPUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgICAgICBnbFZpZXdwb3J0KDAsIDAsIGh3X3csIGh3X2gpOwotICAgICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7Ci0gICAgICAgIGdsUG9wTWF0cml4KCk7Ci0gICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyByZWxlYXNlIEZCTyByZXNvdXJjZXMKLSAgICBnbEJpbmRGcmFtZWJ1ZmZlck9FUyhHTF9GUkFNRUJVRkZFUl9PRVMsIDApOwotICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc09FUygxLCAmdG5hbWUpOwotICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzT0VTKDEsICZuYW1lKTsKLQotICAgIGh3LmNvbXBvc2l0aW9uQ29tcGxldGUoKTsKLQotICAgIC8vIEFMT0dEKCJzY3JlZW5zaG90OiByZXN1bHQgPSAlcyIsIHJlc3VsdDwwID8gc3RyZXJyb3IocmVzdWx0KSA6ICJPSyIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1zdGF0dXNfdCBTdXJmYWNlRmxpbmdlcjo6Y2FwdHVyZVNjcmVlbihEaXNwbGF5SUQgZHB5LAotICAgICAgICBzcDxJTWVtb3J5SGVhcD4qIGhlYXAsCi0gICAgICAgIHVpbnQzMl90KiB3aWR0aCwgdWludDMyX3QqIGhlaWdodCwgUGl4ZWxGb3JtYXQqIGZvcm1hdCwKLSAgICAgICAgdWludDMyX3Qgc3csIHVpbnQzMl90IHNoLAotICAgICAgICB1aW50MzJfdCBtaW5MYXllclosIHVpbnQzMl90IG1heExheWVyWikKLXsKLSAgICAvLyBvbmx5IG9uZSBkaXNwbGF5IHN1cHBvcnRlZCBmb3Igbm93Ci0gICAgaWYgKENDX1VOTElLRUxZKHVpbnQzMl90KGRweSkgPj0gRElTUExBWV9DT1VOVCkpCi0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0KLSAgICBpZiAoIUdMRXh0ZW5zaW9uczo6Z2V0SW5zdGFuY2UoKS5oYXZlRnJhbWVidWZmZXJPYmplY3QoKSkKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgY2xhc3MgTWVzc2FnZUNhcHR1cmVTY3JlZW4gOiBwdWJsaWMgTWVzc2FnZUJhc2UgewotICAgICAgICBTdXJmYWNlRmxpbmdlciogZmxpbmdlcjsKLSAgICAgICAgRGlzcGxheUlEIGRweTsKLSAgICAgICAgc3A8SU1lbW9yeUhlYXA+KiBoZWFwOwotICAgICAgICB1aW50MzJfdCogdzsKLSAgICAgICAgdWludDMyX3QqIGg7Ci0gICAgICAgIFBpeGVsRm9ybWF0KiBmOwotICAgICAgICB1aW50MzJfdCBzdzsKLSAgICAgICAgdWludDMyX3Qgc2g7Ci0gICAgICAgIHVpbnQzMl90IG1pbkxheWVyWjsKLSAgICAgICAgdWludDMyX3QgbWF4TGF5ZXJaOwotICAgICAgICBzdGF0dXNfdCByZXN1bHQ7Ci0gICAgcHVibGljOgotICAgICAgICBNZXNzYWdlQ2FwdHVyZVNjcmVlbihTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgRGlzcGxheUlEIGRweSwKLSAgICAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4qIGhlYXAsIHVpbnQzMl90KiB3LCB1aW50MzJfdCogaCwgUGl4ZWxGb3JtYXQqIGYsCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc3csIHVpbnQzMl90IHNoLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiwgdWludDMyX3QgbWF4TGF5ZXJaKQotICAgICAgICAgICAgOiBmbGluZ2VyKGZsaW5nZXIpLCBkcHkoZHB5KSwKLSAgICAgICAgICAgICAgaGVhcChoZWFwKSwgdyh3KSwgaChoKSwgZihmKSwgc3coc3cpLCBzaChzaCksCi0gICAgICAgICAgICAgIG1pbkxheWVyWihtaW5MYXllclopLCBtYXhMYXllcloobWF4TGF5ZXJaKSwKLSAgICAgICAgICAgICAgcmVzdWx0KFBFUk1JU1NJT05fREVOSUVEKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgZ2V0UmVzdWx0KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlcigpIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChmbGluZ2VyLT5tU3RhdGVMb2NrKTsKLQotICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBzZWN1cmUgd2luZG93cywgbmV2ZXIgYWxsb3cgdGhlIHNjcmVlbiBjYXB0dXJlCi0gICAgICAgICAgICBpZiAoZmxpbmdlci0+bVNlY3VyZUZyYW1lQnVmZmVyKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICByZXN1bHQgPSBmbGluZ2VyLT5jYXB0dXJlU2NyZWVuSW1wbExvY2tlZChkcHksCi0gICAgICAgICAgICAgICAgICAgIGhlYXAsIHcsIGgsIGYsIHN3LCBzaCwgbWluTGF5ZXJaLCBtYXhMYXllclopOwotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzcDxNZXNzYWdlQmFzZT4gbXNnID0gbmV3IE1lc3NhZ2VDYXB0dXJlU2NyZWVuKHRoaXMsCi0gICAgICAgICAgICBkcHksIGhlYXAsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgc3csIHNoLCBtaW5MYXllclosIG1heExheWVyWik7Ci0gICAgc3RhdHVzX3QgcmVzID0gcG9zdE1lc3NhZ2VTeW5jKG1zZyk7Ci0gICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewotICAgICAgICByZXMgPSBzdGF0aWNfY2FzdDxNZXNzYWdlQ2FwdHVyZVNjcmVlbio+KCBtc2cuZ2V0KCkgKS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zcDxMYXllcj4gU3VyZmFjZUZsaW5nZXI6OmdldExheWVyKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyKSBjb25zdAotewotICAgIHNwPExheWVyPiByZXN1bHQ7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TdGF0ZUxvY2spOwotICAgIHJlc3VsdCA9IG1MYXllck1hcC52YWx1ZUZvciggc3VyLT5hc0JpbmRlcigpICkucHJvbW90ZSgpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DbGllbnQ6OkNsaWVudChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpCi0gICAgOiBtRmxpbmdlcihmbGluZ2VyKSwgbU5hbWVHZW5lcmF0b3IoMSkKLXsKLX0KLQotQ2xpZW50Ojp+Q2xpZW50KCkKLXsKLSAgICBjb25zdCBzaXplX3QgY291bnQgPSBtTGF5ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgIHNwPExheWVyQmFzZUNsaWVudD4gbGF5ZXIobUxheWVycy52YWx1ZUF0KGkpLnByb21vdGUoKSk7Ci0gICAgICAgIGlmIChsYXllciAhPSAwKSB7Ci0gICAgICAgICAgICBtRmxpbmdlci0+cmVtb3ZlTGF5ZXIobGF5ZXIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBDbGllbnQ6OmluaXRDaGVjaygpIGNvbnN0IHsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNpemVfdCBDbGllbnQ6OmF0dGFjaExheWVyKGNvbnN0IHNwPExheWVyQmFzZUNsaWVudD4mIGxheWVyKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc2l6ZV90IG5hbWUgPSBtTmFtZUdlbmVyYXRvcisrOwotICAgIG1MYXllcnMuYWRkKG5hbWUsIGxheWVyKTsKLSAgICByZXR1cm4gbmFtZTsKLX0KLQotdm9pZCBDbGllbnQ6OmRldGFjaExheWVyKGNvbnN0IExheWVyQmFzZUNsaWVudCogbGF5ZXIpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyB3ZSBkbyBhIGxpbmVhciBzZWFyY2ggaGVyZSwgYmVjYXVzZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIG9mdGVuCi0gICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gbUxheWVycy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBpZiAobUxheWVycy52YWx1ZUF0KGkpID09IGxheWVyKSB7Ci0gICAgICAgICAgICBtTGF5ZXJzLnJlbW92ZUl0ZW1zQXQoaSwgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLXNwPExheWVyQmFzZUNsaWVudD4gQ2xpZW50OjpnZXRMYXllclVzZXIoaW50MzJfdCBpKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3A8TGF5ZXJCYXNlQ2xpZW50PiBsYmM7Ci0gICAgd3A8TGF5ZXJCYXNlQ2xpZW50PiBsYXllcihtTGF5ZXJzLnZhbHVlRm9yKGkpKTsKLSAgICBpZiAobGF5ZXIgIT0gMCkgewotICAgICAgICBsYmMgPSBsYXllci5wcm9tb3RlKCk7Ci0gICAgICAgIEFMT0dFX0lGKGxiYz09MCwgImdldExheWVyVXNlcihuYW1lPSVkKSBpcyBkZWFkIiwgaW50KGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxiYzsKLX0KLQotCi1zdGF0dXNfdCBDbGllbnQ6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvLyB0aGVzZSBtdXN0IGJlIGNoZWNrZWQKLSAgICAgSVBDVGhyZWFkU3RhdGUqIGlwYyA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7Ci0gICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKLSAgICAgY29uc3QgaW50IHVpZCA9IGlwYy0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgICBjb25zdCBpbnQgc2VsZl9waWQgPSBnZXRwaWQoKTsKLSAgICAgaWYgKENDX1VOTElLRUxZKHBpZCAhPSBzZWxmX3BpZCAmJiB1aWQgIT0gQUlEX0dSQVBISUNTICYmIHVpZCAhPSAwKSkgewotICAgICAgICAgLy8gd2UncmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcywgZG8gdGhlIHJlYWwgY2hlY2sKLSAgICAgICAgIGlmICghUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBY2Nlc3NTdXJmYWNlRmxpbmdlcikpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCi0gICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgb3Blbkdsb2JhbFRyYW5zYWN0aW9uIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgIH0KLSAgICAgfQotICAgICByZXR1cm4gQm5TdXJmYWNlQ29tcG9zZXJDbGllbnQ6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotCi1zcDxJU3VyZmFjZT4gQ2xpZW50OjpjcmVhdGVTdXJmYWNlKAotICAgICAgICBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCogcGFyYW1zLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAotICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBmbGFncykKLXsKLSAgICAvKgotICAgICAqIGNyZWF0ZVN1cmZhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgR0wgdGhyZWFkIHNvIHRoYXQgaXQgY2FuCi0gICAgICogaGF2ZSBhY2Nlc3MgdG8gdGhlIEdMIGNvbnRleHQuCi0gICAgICovCi0KLSAgICBjbGFzcyBNZXNzYWdlQ3JlYXRlU3VyZmFjZSA6IHB1YmxpYyBNZXNzYWdlQmFzZSB7Ci0gICAgICAgIHNwPElTdXJmYWNlPiByZXN1bHQ7Ci0gICAgICAgIFN1cmZhY2VGbGluZ2VyKiBmbGluZ2VyOwotICAgICAgICBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCogcGFyYW1zOwotICAgICAgICBDbGllbnQqIGNsaWVudDsKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZTsKLSAgICAgICAgRGlzcGxheUlEIGRpc3BsYXk7Ci0gICAgICAgIHVpbnQzMl90IHcsIGg7Ci0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdDsKLSAgICAgICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgcHVibGljOgotICAgICAgICBNZXNzYWdlQ3JlYXRlU3VyZmFjZShTdXJmYWNlRmxpbmdlciogZmxpbmdlciwKLSAgICAgICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpzdXJmYWNlX2RhdGFfdCogcGFyYW1zLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsIENsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgIERpc3BsYXlJRCBkaXNwbGF5LCB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpCi0gICAgICAgICAgICA6IGZsaW5nZXIoZmxpbmdlciksIHBhcmFtcyhwYXJhbXMpLCBjbGllbnQoY2xpZW50KSwgbmFtZShuYW1lKSwKLSAgICAgICAgICAgICAgZGlzcGxheShkaXNwbGF5KSwgdyh3KSwgaChoKSwgZm9ybWF0KGZvcm1hdCksIGZsYWdzKGZsYWdzKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SVN1cmZhY2U+IGdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIHJlc3VsdDsgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlcigpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZsaW5nZXItPmNyZWF0ZVN1cmZhY2UocGFyYW1zLCBuYW1lLCBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXksIHcsIGgsIGZvcm1hdCwgZmxhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3A8TWVzc2FnZUJhc2U+IG1zZyA9IG5ldyBNZXNzYWdlQ3JlYXRlU3VyZmFjZShtRmxpbmdlci5nZXQoKSwKLSAgICAgICAgICAgIHBhcmFtcywgbmFtZSwgdGhpcywgZGlzcGxheSwgdywgaCwgZm9ybWF0LCBmbGFncyk7Ci0gICAgbUZsaW5nZXItPnBvc3RNZXNzYWdlU3luYyhtc2cpOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlQ3JlYXRlU3VyZmFjZSo+KCBtc2cuZ2V0KCkgKS0+Z2V0UmVzdWx0KCk7Ci19Ci1zdGF0dXNfdCBDbGllbnQ6OmRlc3Ryb3lTdXJmYWNlKFN1cmZhY2VJRCBzaWQpIHsKLSAgICByZXR1cm4gbUZsaW5nZXItPnJlbW92ZVN1cmZhY2UodGhpcywgc2lkKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUdyYXBoaWNCdWZmZXJBbGxvYzo6R3JhcGhpY0J1ZmZlckFsbG9jKCkge30KLQotR3JhcGhpY0J1ZmZlckFsbG9jOjp+R3JhcGhpY0J1ZmZlckFsbG9jKCkge30KLQotc3A8R3JhcGhpY0J1ZmZlcj4gR3JhcGhpY0J1ZmZlckFsbG9jOjpjcmVhdGVHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIHN0YXR1c190KiBlcnJvcikgewotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIobmV3IEdyYXBoaWNCdWZmZXIodywgaCwgZm9ybWF0LCB1c2FnZSkpOwotICAgIHN0YXR1c190IGVyciA9IGdyYXBoaWNCdWZmZXItPmluaXRDaGVjaygpOwotICAgICplcnJvciA9IGVycjsKLSAgICBpZiAoZXJyICE9IDAgfHwgZ3JhcGhpY0J1ZmZlci0+aGFuZGxlID09IDApIHsKLSAgICAgICAgaWYgKGVyciA9PSBOT19NRU1PUlkpIHsKLSAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OmR1bXBBbGxvY2F0aW9uc1RvU3lzdGVtTG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR0UoIkdyYXBoaWNCdWZmZXJBbGxvYzo6Y3JlYXRlR3JhcGhpY0J1ZmZlcih3PSVkLCBoPSVkKSAiCi0gICAgICAgICAgICAgImZhaWxlZCAoJXMpLCBoYW5kbGU9JXAiLAotICAgICAgICAgICAgICAgIHcsIGgsIHN0cmVycm9yKC1lcnIpLCBncmFwaGljQnVmZmVyLT5oYW5kbGUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGdyYXBoaWNCdWZmZXI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1HcmFwaGljUGxhbmU6OkdyYXBoaWNQbGFuZSgpCi0gICAgOiBtSHcoMCkKLXsKLX0KLQotR3JhcGhpY1BsYW5lOjp+R3JhcGhpY1BsYW5lKCkgewotICAgIGRlbGV0ZSBtSHc7Ci19Ci0KLWJvb2wgR3JhcGhpY1BsYW5lOjppbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUh3ID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1pbnQgR3JhcGhpY1BsYW5lOjpnZXRXaWR0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVdpZHRoOwotfQotCi1pbnQgR3JhcGhpY1BsYW5lOjpnZXRIZWlnaHQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1IZWlnaHQ7Ci19Ci0KLXZvaWQgR3JhcGhpY1BsYW5lOjpzZXREaXNwbGF5SGFyZHdhcmUoRGlzcGxheUhhcmR3YXJlICpodykKLXsKLSAgICBtSHcgPSBodzsKLQotICAgIC8vIGluaXRpYWxpemUgdGhlIGRpc3BsYXkgb3JpZW50YXRpb24gdHJhbnNmb3JtLgotICAgIC8vIGl0J3MgYSBjb25zdGFudCB0aGF0IHNob3VsZCBjb21lIGZyb20gdGhlIGRpc3BsYXkgZHJpdmVyLgotICAgIGludCBkaXNwbGF5T3JpZW50YXRpb24gPSBJU3VyZmFjZUNvbXBvc2VyOjplT3JpZW50YXRpb25EZWZhdWx0OwotICAgIGNoYXIgcHJvcGVydHlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5zZi5od3JvdGF0aW9uIiwgcHJvcGVydHksIE5VTEwpID4gMCkgewotICAgICAgICAvL2Rpc3BsYXlPcmllbnRhdGlvbgotICAgICAgICBzd2l0Y2ggKGF0b2kocHJvcGVydHkpKSB7Ci0gICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICBkaXNwbGF5T3JpZW50YXRpb24gPSBJU3VyZmFjZUNvbXBvc2VyOjplT3JpZW50YXRpb245MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3MDoKLSAgICAgICAgICAgIGRpc3BsYXlPcmllbnRhdGlvbiA9IElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbjI3MDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgZmxvYXQgdyA9IGh3LT5nZXRXaWR0aCgpOwotICAgIGNvbnN0IGZsb2F0IGggPSBody0+Z2V0SGVpZ2h0KCk7Ci0gICAgR3JhcGhpY1BsYW5lOjpvcmllbnRhdGlvblRvVHJhbnNmcm9tKGRpc3BsYXlPcmllbnRhdGlvbiwgdywgaCwKLSAgICAgICAgICAgICZtRGlzcGxheVRyYW5zZm9ybSk7Ci0gICAgaWYgKGRpc3BsYXlPcmllbnRhdGlvbiAmIElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvblN3YXBNYXNrKSB7Ci0gICAgICAgIG1EaXNwbGF5V2lkdGggPSBoOwotICAgICAgICBtRGlzcGxheUhlaWdodCA9IHc7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbURpc3BsYXlXaWR0aCA9IHc7Ci0gICAgICAgIG1EaXNwbGF5SGVpZ2h0ID0gaDsKLSAgICB9Ci0KLSAgICBzZXRPcmllbnRhdGlvbihJU3VyZmFjZUNvbXBvc2VyOjplT3JpZW50YXRpb25EZWZhdWx0KTsKLX0KLQotc3RhdHVzX3QgR3JhcGhpY1BsYW5lOjpvcmllbnRhdGlvblRvVHJhbnNmcm9tKAotICAgICAgICBpbnQgb3JpZW50YXRpb24sIGludCB3LCBpbnQgaCwgVHJhbnNmb3JtKiB0cikKLXsKLSAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgc3dpdGNoIChvcmllbnRhdGlvbikgewotICAgIGNhc2UgSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uRGVmYXVsdDoKLSAgICAgICAgZmxhZ3MgPSBUcmFuc2Zvcm06OlJPVF8wOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbjkwOgotICAgICAgICBmbGFncyA9IFRyYW5zZm9ybTo6Uk9UXzkwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbjE4MDoKLSAgICAgICAgZmxhZ3MgPSBUcmFuc2Zvcm06OlJPVF8xODA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSVN1cmZhY2VDb21wb3Nlcjo6ZU9yaWVudGF0aW9uMjcwOgotICAgICAgICBmbGFncyA9IFRyYW5zZm9ybTo6Uk9UXzI3MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgdHItPnNldChmbGFncywgdywgaCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBHcmFwaGljUGxhbmU6OnNldE9yaWVudGF0aW9uKGludCBvcmllbnRhdGlvbikKLXsKLSAgICAvLyBJZiB0aGUgcm90YXRpb24gY2FuIGJlIGhhbmRsZWQgaW4gaGFyZHdhcmUsIHRoaXMgaXMgd2hlcmUKLSAgICAvLyB0aGUgbWFnaWMgc2hvdWxkIGhhcHBlbi4KLQotICAgIGNvbnN0IERpc3BsYXlIYXJkd2FyZSYgaHcoZGlzcGxheUhhcmR3YXJlKCkpOwotICAgIGNvbnN0IGZsb2F0IHcgPSBtRGlzcGxheVdpZHRoOwotICAgIGNvbnN0IGZsb2F0IGggPSBtRGlzcGxheUhlaWdodDsKLSAgICBtV2lkdGggPSBpbnQodyk7Ci0gICAgbUhlaWdodCA9IGludChoKTsKLQotICAgIFRyYW5zZm9ybSBvcmllbnRhdGlvblRyYW5zZm9ybTsKLSAgICBHcmFwaGljUGxhbmU6Om9yaWVudGF0aW9uVG9UcmFuc2Zyb20ob3JpZW50YXRpb24sIHcsIGgsCi0gICAgICAgICAgICAmb3JpZW50YXRpb25UcmFuc2Zvcm0pOwotICAgIGlmIChvcmllbnRhdGlvbiAmIElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvblN3YXBNYXNrKSB7Ci0gICAgICAgIG1XaWR0aCA9IGludChoKTsKLSAgICAgICAgbUhlaWdodCA9IGludCh3KTsKLSAgICB9Ci0KLSAgICBtT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLSAgICBtR2xvYmFsVHJhbnNmb3JtID0gbURpc3BsYXlUcmFuc2Zvcm0gKiBvcmllbnRhdGlvblRyYW5zZm9ybTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWNvbnN0IERpc3BsYXlIYXJkd2FyZSYgR3JhcGhpY1BsYW5lOjpkaXNwbGF5SGFyZHdhcmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuICptSHc7Ci19Ci0KLURpc3BsYXlIYXJkd2FyZSYgR3JhcGhpY1BsYW5lOjplZGl0RGlzcGxheUhhcmR3YXJlKCkgewotICAgIHJldHVybiAqbUh3OwotfQotCi1jb25zdCBUcmFuc2Zvcm0mIEdyYXBoaWNQbGFuZTo6dHJhbnNmb3JtKCkgY29uc3QgewotICAgIHJldHVybiBtR2xvYmFsVHJhbnNmb3JtOwotfQotCi1FR0xEaXNwbGF5IEdyYXBoaWNQbGFuZTo6Z2V0RUdMRGlzcGxheSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUh3LT5nZXRFR0xEaXNwbGF5KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MDc4NzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9ICi0jZGVmaW5lIEFORFJPSURfU1VSRkFDRV9GTElOR0VSX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9BdG9taWMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi0jaW5jbHVkZSAiQmFycmllci5oIgotI2luY2x1ZGUgIkxheWVyLmgiCi0KLSNpbmNsdWRlICJNZXNzYWdlUXVldWUuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ2xpZW50OwotY2xhc3MgRGlzcGxheUhhcmR3YXJlOwotY2xhc3MgRGlzcGxheUV2ZW50Q29ubmVjdGlvbjsKLWNsYXNzIEV2ZW50VGhyZWFkOwotY2xhc3MgTGF5ZXI7Ci1jbGFzcyBMYXllckRpbTsKLWNsYXNzIExheWVyU2NyZWVuc2hvdDsKLXN0cnVjdCBzdXJmYWNlX2ZsaW5nZXJfY2Jsa190OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgQ2xpZW50IDogcHVibGljIEJuU3VyZmFjZUNvbXBvc2VyQ2xpZW50Ci17Ci1wdWJsaWM6Ci0gICAgICAgIENsaWVudChjb25zdCBzcDxTdXJmYWNlRmxpbmdlcj4mIGZsaW5nZXIpOwotICAgICAgICB+Q2xpZW50KCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIC8vIHByb3RlY3RlZCBieSBTdXJmYWNlRmxpbmdlcjo6bVN0YXRlTG9jawotICAgIHNpemVfdCBhdHRhY2hMYXllcihjb25zdCBzcDxMYXllckJhc2VDbGllbnQ+JiBsYXllcik7Ci0gICAgdm9pZCBkZXRhY2hMYXllcihjb25zdCBMYXllckJhc2VDbGllbnQqIGxheWVyKTsKLSAgICBzcDxMYXllckJhc2VDbGllbnQ+IGdldExheWVyVXNlcihpbnQzMl90IGkpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIC8vIElTdXJmYWNlQ29tcG9zZXJDbGllbnQgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgIHN1cmZhY2VfZGF0YV90KiBwYXJhbXMsIGNvbnN0IFN0cmluZzgmIG5hbWUsCi0gICAgICAgICAgICBEaXNwbGF5SUQgZGlzcGxheSwgdWludDMyX3QgdywgdWludDMyX3QgaCxQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95U3VyZmFjZShTdXJmYWNlSUQgc3VyZmFjZUlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gY29uc3RhbnQKLSAgICBzcDxTdXJmYWNlRmxpbmdlcj4gbUZsaW5nZXI7Ci0KLSAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHNpemVfdCwgd3A8TGF5ZXJCYXNlQ2xpZW50PiA+IG1MYXllcnM7Ci0gICAgc2l6ZV90IG1OYW1lR2VuZXJhdG9yOwotCi0gICAgLy8gdGhyZWFkLXNhZmUKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotfTsKLQotY2xhc3MgR3JhcGhpY0J1ZmZlckFsbG9jIDogcHVibGljIEJuR3JhcGhpY0J1ZmZlckFsbG9jCi17Ci1wdWJsaWM6Ci0gICAgR3JhcGhpY0J1ZmZlckFsbG9jKCk7Ci0gICAgdmlydHVhbCB+R3JhcGhpY0J1ZmZlckFsbG9jKCk7Ci0gICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIHN0YXR1c190KiBlcnJvcik7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgR3JhcGhpY1BsYW5lCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IG9yaWVudGF0aW9uVG9UcmFuc2Zyb20oaW50IG9yaWVudGF0aW9uLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICBUcmFuc2Zvcm0qIHRyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljUGxhbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkdyYXBoaWNQbGFuZSgpOwotCi0gICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheUhhcmR3YXJlKERpc3BsYXlIYXJkd2FyZSAqKTsKLSAgICAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgc2V0T3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKTsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0T3JpZW50YXRpb24oKSBjb25zdCB7IHJldHVybiBtT3JpZW50YXRpb247IH0KLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0V2lkdGgoKSBjb25zdDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7Ci0KLSAgICAgICAgY29uc3QgRGlzcGxheUhhcmR3YXJlJiAgZGlzcGxheUhhcmR3YXJlKCkgY29uc3Q7Ci0gICAgICAgIERpc3BsYXlIYXJkd2FyZSYgICAgICAgIGVkaXREaXNwbGF5SGFyZHdhcmUoKTsKLSAgICAgICAgY29uc3QgVHJhbnNmb3JtJiAgICAgICAgdHJhbnNmb3JtKCkgY29uc3Q7Ci0gICAgICAgIEVHTERpc3BsYXkgICAgICAgICAgICAgIGdldEVHTERpc3BsYXkoKSBjb25zdDsKLSAgICAgICAgCi1wcml2YXRlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljUGxhbmUoY29uc3QgR3JhcGhpY1BsYW5lJik7Ci0gICAgICAgIEdyYXBoaWNQbGFuZSAgICAgICAgICAgIG9wZXJhdG9yID0gKGNvbnN0IEdyYXBoaWNQbGFuZSYpOwotCi0gICAgICAgIERpc3BsYXlIYXJkd2FyZSogICAgICAgIG1IdzsKLSAgICAgICAgVHJhbnNmb3JtICAgICAgICAgICAgICAgbUdsb2JhbFRyYW5zZm9ybTsKLSAgICAgICAgVHJhbnNmb3JtICAgICAgICAgICAgICAgbURpc3BsYXlUcmFuc2Zvcm07Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1PcmllbnRhdGlvbjsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbURpc3BsYXlXaWR0aDsKLSAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbURpc3BsYXlIZWlnaHQ7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1XaWR0aDsKLSAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUhlaWdodDsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1lbnVtIHsKLSAgICBlVHJhbnNhY3Rpb25OZWVkZWQgICAgICA9IDB4MDEsCi0gICAgZVRyYXZlcnNhbE5lZWRlZCAgICAgICAgPSAweDAyCi19OwotCi1jbGFzcyBTdXJmYWNlRmxpbmdlciA6Ci0gICAgICAgIHB1YmxpYyBCaW5kZXJTZXJ2aWNlPFN1cmZhY2VGbGluZ2VyPiwKLSAgICAgICAgcHVibGljIEJuU3VyZmFjZUNvbXBvc2VyLAotICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCi0gICAgICAgIHByb3RlY3RlZCBUaHJlYWQKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAiU3VyZmFjZUZsaW5nZXIiOyB9Ci0KLSAgICAgICAgICAgICAgICAgICAgU3VyZmFjZUZsaW5nZXIoKTsKLSAgICB2aXJ0dWFsICAgICAgICAgflN1cmZhY2VGbGluZ2VyKCk7Ci0gICAgICAgICAgICB2b2lkICAgIGluaXQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIC8vIElTdXJmYWNlQ29tcG9zZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzcDxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PiAgY3JlYXRlQ29ubmVjdGlvbigpOwotICAgIHZpcnR1YWwgc3A8SUdyYXBoaWNCdWZmZXJBbGxvYz4gICAgIGNyZWF0ZUdyYXBoaWNCdWZmZXJBbGxvYygpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeUhlYXA+ICAgICAgICAgICAgIGdldENibGsoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBib290RmluaXNoZWQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBzZXRUcmFuc2FjdGlvblN0YXRlKGNvbnN0IFZlY3RvcjxDb21wb3NlclN0YXRlPiYgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24sIHVpbnQzMl90IGZsYWdzKTsKLSAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVTdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJU3VyZmFjZVRleHR1cmU+JiBzdXJmYWNlKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNwPElEaXNwbGF5RXZlbnRDb25uZWN0aW9uPiBjcmVhdGVEaXNwbGF5RXZlbnRDb25uZWN0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNhcHR1cmVTY3JlZW4oRGlzcGxheUlEIGRweSwKLSAgICAgICAgICAgIHNwPElNZW1vcnlIZWFwPiogaGVhcCwKLSAgICAgICAgICAgIHVpbnQzMl90KiB3aWR0aCwgdWludDMyX3QqIGhlaWdodCwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0KiBmb3JtYXQsIHVpbnQzMl90IHJlcVdpZHRoLCB1aW50MzJfdCByZXFIZWlnaHQsCi0gICAgICAgICAgICB1aW50MzJfdCBtaW5MYXllclosIHVpbnQzMl90IG1heExheWVyWik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICB0dXJuRWxlY3Ryb25CZWFtT2ZmKGludDMyX3QgbW9kZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgdHVybkVsZWN0cm9uQmVhbU9uKGludDMyX3QgbW9kZSk7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5SZWxlYXNlZChEaXNwbGF5SUQgZHB5KTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5BY3F1aXJlZChEaXNwbGF5SUQgZHB5KTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgcmVuZGVyU2NyZWVuVG9UZXh0dXJlKERpc3BsYXlJRCBkcHksCi0gICAgICAgICAgICAgICAgICAgIEdMdWludCogdGV4dHVyZU5hbWUsIEdMZmxvYXQqIHVPdXQsIEdMZmxvYXQqIHZPdXQpOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVuZGVyU2NyZWVuVG9UZXh0dXJlTG9ja2VkKERpc3BsYXlJRCBkcHksCi0gICAgICAgICAgICAgICAgICAgIEdMdWludCogdGV4dHVyZU5hbWUsIEdMZmxvYXQqIHVPdXQsIEdMZmxvYXQqIHZPdXQpOwotCi0gICAgICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGludDMyX3Qgd2hhdCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHBvc3RNZXNzYWdlQXN5bmMoY29uc3Qgc3A8TWVzc2FnZUJhc2U+JiBtc2csCi0gICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgcmVsdGltZT0wLCB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBwb3N0TWVzc2FnZVN5bmMoY29uc3Qgc3A8TWVzc2FnZUJhc2U+JiBtc2csCi0gICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgcmVsdGltZT0wLCB1aW50MzJfdCBmbGFncyA9IDApOwotCi0gICAgc3RhdHVzX3QgcmVtb3ZlTGF5ZXIoY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpOwotICAgIHN0YXR1c190IGFkZExheWVyKGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKTsKLSAgICBzdGF0dXNfdCBpbnZhbGlkYXRlTGF5ZXJWaXNpYmlsaXR5KGNvbnN0IHNwPExheWVyQmFzZT4mIGxheWVyKTsKLSAgICB2b2lkIGludmFsaWRhdGVId2NHZW9tZXRyeSgpOwotCi0gICAgc3A8TGF5ZXI+IGdldExheWVyKGNvbnN0IHNwPElTdXJmYWNlPiYgc3VyKSBjb25zdDsKLQotICAgIEdMdWludCBnZXRQcm90ZWN0ZWRUZXhOYW1lKCkgY29uc3QgeyByZXR1cm4gbVByb3RlY3RlZFRleE5hbWU7IH0KLQotCi0gICAgY2xhc3MgTWVzc2FnZURlc3Ryb3lHTFRleHR1cmUgOiBwdWJsaWMgTWVzc2FnZUJhc2UgewotICAgICAgICBHTHVpbnQgdGV4dHVyZTsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lc3NhZ2VEZXN0cm95R0xUZXh0dXJlKEdMdWludCB0ZXh0dXJlKSA6IHRleHR1cmUodGV4dHVyZSkgeyB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVyKCkgewotICAgICAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH07Ci0KLQotcHJpdmF0ZToKLSAgICAvLyBEZWF0aFJlY2lwaWVudCBpbnRlcmZhY2UKLSAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2xpZW50OwotICAgIGZyaWVuZCBjbGFzcyBEaXNwbGF5RXZlbnRDb25uZWN0aW9uOwotICAgIGZyaWVuZCBjbGFzcyBMYXllckJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIExheWVyQmFzZUNsaWVudDsKLSAgICBmcmllbmQgY2xhc3MgTGF5ZXI7Ci0KLSAgICBzcDxJU3VyZmFjZT4gY3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnN1cmZhY2VfZGF0YV90KiBwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBuYW1lLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgRGlzcGxheUlEIGRpc3BsYXksIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHNwPExheWVyPiBjcmVhdGVOb3JtYWxTdXJmYWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgUGl4ZWxGb3JtYXQmIGZvcm1hdCk7Ci0KLSAgICBzcDxMYXllckRpbT4gY3JlYXRlRGltU3VyZmFjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwgRGlzcGxheUlEIGRpc3BsYXksCi0gICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmbGFncyk7Ci0KLSAgICBzcDxMYXllclNjcmVlbnNob3Q+IGNyZWF0ZVNjcmVlbnNob3RTdXJmYWNlKAotICAgICAgICAgICAgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBEaXNwbGF5SUQgZGlzcGxheSwKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIHVpbnQzMl90IGZsYWdzKTsKLQotICAgIHN0YXR1c190IHJlbW92ZVN1cmZhY2UoY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBTdXJmYWNlSUQgc2lkKTsKLSAgICBzdGF0dXNfdCBkZXN0cm95U3VyZmFjZShjb25zdCB3cDxMYXllckJhc2VDbGllbnQ+JiBsYXllcik7Ci0gICAgdWludDMyX3Qgc2V0Q2xpZW50U3RhdGVMb2NrZWQoY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LCBjb25zdCBsYXllcl9zdGF0ZV90JiBzKTsKLQotICAgIGNsYXNzIExheWVyVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExheWVyVmVjdG9yKCkgeyB9Ci0gICAgICAgIExheWVyVmVjdG9yKGNvbnN0IExheWVyVmVjdG9yJiByaHMpIDogU29ydGVkVmVjdG9yPCBzcDxMYXllckJhc2U+ID4ocmhzKSB7IH0KLSAgICAgICAgdmlydHVhbCBpbnQgZG9fY29tcGFyZShjb25zdCB2b2lkKiBsaHMsIGNvbnN0IHZvaWQqIHJocykgY29uc3QgewotICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbCgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzcDxMYXllckJhc2U+Kj4obGhzKSk7Ci0gICAgICAgICAgICBjb25zdCBzcDxMYXllckJhc2U+JiByKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHNwPExheWVyQmFzZT4qPihyaHMpKTsKLSAgICAgICAgICAgIC8vIHNvcnQgbGF5ZXJzIGJ5IFogb3JkZXIKLSAgICAgICAgICAgIHVpbnQzMl90IGx6ID0gbC0+Y3VycmVudFN0YXRlKCkuejsKLSAgICAgICAgICAgIHVpbnQzMl90IHJ6ID0gci0+Y3VycmVudFN0YXRlKCkuejsKLSAgICAgICAgICAgIC8vIHRoZW4gYnkgc2VxdWVuY2UsIHNvIHdlIGdldCBhIHN0YWJsZSBvcmRlcmluZwotICAgICAgICAgICAgcmV0dXJuIChseiAhPSByeikgPyAobHogLSByeikgOiAobC0+c2VxdWVuY2UgLSByLT5zZXF1ZW5jZSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgc3RydWN0IFN0YXRlIHsKLSAgICAgICAgU3RhdGUoKSB7Ci0gICAgICAgICAgICBvcmllbnRhdGlvbiA9IElTdXJmYWNlQ29tcG9zZXI6OmVPcmllbnRhdGlvbkRlZmF1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgTGF5ZXJWZWN0b3IgICAgIGxheWVyc1NvcnRlZEJ5WjsKLSAgICAgICAgdWludDhfdCAgICAgICAgIG9yaWVudGF0aW9uOwotICAgICAgICB1aW50OF90ICAgICAgICAgb3JpZW50YXRpb25GbGFnczsKLSAgICB9OwotCi0gICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0KLXB1YmxpYzogICAgIC8vIGhhY2sgdG8gd29yayBhcm91bmQgZ2NjIDQuMC4zIGJ1ZwotICAgIGNvbnN0IEdyYXBoaWNQbGFuZSYgICAgIGdyYXBoaWNQbGFuZShpbnQgZHB5KSBjb25zdDsKLSAgICAgICAgICBHcmFwaGljUGxhbmUmICAgICBncmFwaGljUGxhbmUoaW50IGRweSk7Ci0KLSAgICAgICAgICB2b2lkICAgICAgICAgICAgICBzaWduYWxUcmFuc2FjdGlvbigpOwotICAgICAgICAgIHZvaWQgICAgICAgICAgICAgIHNpZ25hbExheWVyVXBkYXRlKCk7Ci0gICAgICAgICAgdm9pZCAgICAgICAgICAgICAgc2lnbmFsUmVmcmVzaCgpOwotICAgICAgICAgIHZvaWQgICAgICAgICAgICAgIHJlcGFpbnRFdmVyeXRoaW5nKCk7Ci0KLXByaXZhdGU6Ci0gICAgICAgICAgICB2b2lkICAgICAgICB3YWl0Rm9yRXZlbnQoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZUNvbnNvbGVFdmVudHMoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVRyYW5zYWN0aW9uKHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgaGFuZGxlVHJhbnNhY3Rpb25Mb2NrZWQodWludDMyX3QgdHJhbnNhY3Rpb25GbGFncyk7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIGNvbXB1dGVWaXNpYmxlUmVnaW9ucygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMYXllclZlY3RvciYgY3VycmVudExheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb24mIGRpcnR5UmVnaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lvbiYgd29ybWhvbGVSZWdpb24pOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVQYWdlRmxpcCgpOwotICAgICAgICAgICAgYm9vbCAgICAgICAgbG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHVubG9ja1BhZ2VGbGlwKGNvbnN0IExheWVyVmVjdG9yJiBjdXJyZW50TGF5ZXJzKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVJlZnJlc2goKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVdvcmtMaXN0KCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVSZXBhaW50KCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBwb3N0RnJhbWVidWZmZXIoKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldHVwSGFyZHdhcmVDb21wb3NlcihSZWdpb24mIGRpcnR5SW5PdXQpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgY29tcG9zZVN1cmZhY2VzKGNvbnN0IFJlZ2lvbiYgZGlydHkpOwotCi0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEludmFsaWRhdGVSZWdpb24oY29uc3QgUmVnaW9uJiByZWcpOwotICAgICAgICAgICAgUmVnaW9uICAgICAgZ2V0QW5kQ2xlYXJJbnZhbGlkYXRlUmVnaW9uKCk7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgICAgIGFkZENsaWVudExheWVyKGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TGF5ZXJCYXNlQ2xpZW50PiYgbGJjKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgIGFkZExheWVyX2woY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgcmVtb3ZlTGF5ZXJfbChjb25zdCBzcDxMYXllckJhc2U+JiBsYXllcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICBwdXJnYXRvcml6ZUxheWVyX2woY29uc3Qgc3A8TGF5ZXJCYXNlPiYgbGF5ZXIpOwotCi0gICAgICAgICAgICB1aW50MzJfdCAgICBnZXRUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKTsKLSAgICAgICAgICAgIHVpbnQzMl90ICAgIHBlZWtUcmFuc2FjdGlvbkZsYWdzKHVpbnQzMl90IGZsYWdzKTsKLSAgICAgICAgICAgIHVpbnQzMl90ICAgIHNldFRyYW5zYWN0aW9uRmxhZ3ModWludDMyX3QgZmxhZ3MpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgY29tbWl0VHJhbnNhY3Rpb24oKTsKLQotCi0gICAgICAgICAgICBzdGF0dXNfdCBjYXB0dXJlU2NyZWVuSW1wbExvY2tlZChEaXNwbGF5SUQgZHB5LAotICAgICAgICAgICAgICAgICAgICBzcDxJTWVtb3J5SGVhcD4qIGhlYXAsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB3aWR0aCwgdWludDMyX3QqIGhlaWdodCwgUGl4ZWxGb3JtYXQqIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVxV2lkdGgsIHVpbnQzMl90IHJlcUhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWluTGF5ZXJaLCB1aW50MzJfdCBtYXhMYXllclopOwotCi0gICAgICAgICAgICBzdGF0dXNfdCB0dXJuRWxlY3Ryb25CZWFtT2ZmSW1wbExvY2tlZChpbnQzMl90IG1vZGUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdHVybkVsZWN0cm9uQmVhbU9uSW1wbExvY2tlZChpbnQzMl90IG1vZGUpOwotICAgICAgICAgICAgc3RhdHVzX3QgZWxlY3Ryb25CZWFtT2ZmQW5pbWF0aW9uSW1wbExvY2tlZCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgZWxlY3Ryb25CZWFtT25BbmltYXRpb25JbXBsTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIHZvaWQgICAgICAgIGRlYnVnRmxhc2hSZWdpb25zKCk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBkcmF3V29ybWhvbGUoKSBjb25zdDsKLSAgICAgICAgICAgCi0gICAgICAgICAgICB2b2lkIGxpc3RMYXllcnNMb2NrZWQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgc2l6ZV90JiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgZHVtcFN0YXRzTG9ja2VkKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIHNpemVfdCYgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgmIHJlc3VsdCwgY2hhciogYnVmZmVyLCBzaXplX3QgU0laRSkgY29uc3Q7Ci0gICAgICAgICAgICB2b2lkIGNsZWFyU3RhdHNMb2NrZWQoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgc2l6ZV90JiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCYgcmVzdWx0LCBjaGFyKiBidWZmZXIsIHNpemVfdCBTSVpFKSBjb25zdDsKLSAgICAgICAgICAgIHZvaWQgZHVtcEFsbExvY2tlZChTdHJpbmc4JiByZXN1bHQsIGNoYXIqIGJ1ZmZlciwgc2l6ZV90IFNJWkUpIGNvbnN0OwotCi0gICAgbXV0YWJsZSAgICAgTWVzc2FnZVF1ZXVlICAgIG1FdmVudFF1ZXVlOwotCi0gICAgICAgICAgICAgICAgLy8gYWNjZXNzIG11c3QgYmUgcHJvdGVjdGVkIGJ5IG1TdGF0ZUxvY2sKLSAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtU3RhdGVMb2NrOwotICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGU7Ci0gICAgdm9sYXRpbGUgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uRmxhZ3M7Ci0gICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgbVRyYW5zYWN0aW9uQ1Y7Ci0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxMYXllckJhc2U+ID4gbUxheWVyUHVyZ2F0b3J5OwotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UcmFuc2F0aW9uUGVuZGluZzsKLSAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPExheWVyQmFzZT4gPiBtTGF5ZXJzUGVuZGluZ1JlbW92YWw7Ci0KLSAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbVN0YXRlTG9jayAoYnV0IHdlIGNvdWxkIHVzZSBhbm90aGVyIGxvY2spCi0gICAgICAgICAgICAgICAgR3JhcGhpY1BsYW5lICAgICAgICAgICAgICAgIG1HcmFwaGljUGxhbmVzWzFdOwotICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTGF5ZXJzUmVtb3ZlZDsKLSAgICAgICAgICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHdwPElCaW5kZXI+LCB3cDxMYXllcj4gPiBtTGF5ZXJNYXA7Ci0KLSAgICAgICAgICAgICAgICAvLyBhY2Nlc3MgbXVzdCBiZSBwcm90ZWN0ZWQgYnkgbUludmFsaWRhdGVMb2NrCi0gICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgIG1JbnZhbGlkYXRlTG9jazsKLSAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGVSZWdpb247Ci0KLSAgICAgICAgICAgICAgICAvLyBjb25zdGFudCBtZW1iZXJzIChubyBzeW5jaHJvbml6YXRpb24gbmVlZGVkIGZvciBhY2Nlc3MpCi0gICAgICAgICAgICAgICAgc3A8SU1lbW9yeUhlYXA+ICAgICAgICAgICAgIG1TZXJ2ZXJIZWFwOwotICAgICAgICAgICAgICAgIHN1cmZhY2VfZmxpbmdlcl9jYmxrX3QqICAgICBtU2VydmVyQ2JsazsKLSAgICAgICAgICAgICAgICBHTHVpbnQgICAgICAgICAgICAgICAgICAgICAgbVdvcm1ob2xlVGV4TmFtZTsKLSAgICAgICAgICAgICAgICBHTHVpbnQgICAgICAgICAgICAgICAgICAgICAgbVByb3RlY3RlZFRleE5hbWU7Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgIG1Cb290VGltZTsKLSAgICAgICAgICAgICAgICBzcDxFdmVudFRocmVhZD4gICAgICAgICAgICAgbUV2ZW50VGhyZWFkOwotCi0gICAgICAgICAgICAgICAgLy8gQ2FuIG9ubHkgYWNjZXNzZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQsIHRoZXNlIG1lbWJlcnMKLSAgICAgICAgICAgICAgICAvLyBkb24ndCBuZWVkIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICAgICAgICAgICAgICAgICBtRHJhd2luZ1N0YXRlOwotICAgICAgICAgICAgICAgIFJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICBtRGlydHlSZWdpb247Ci0gICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIG1EaXJ0eVJlZ2lvblJlbW92ZWRMYXllcjsKLSAgICAgICAgICAgICAgICBSZWdpb24gICAgICAgICAgICAgICAgICAgICAgbVN3YXBSZWdpb247Ci0gICAgICAgICAgICAgICAgUmVnaW9uICAgICAgICAgICAgICAgICAgICAgIG1Xb3JtaG9sZVJlZ2lvbjsKLSAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbVZpc2libGVSZWdpb25zRGlydHk7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Id1dvcmtMaXN0RGlydHk7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1FbGVjdHJvbkJlYW1BbmltYXRpb25Nb2RlOwotICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8TGF5ZXJCYXNlPiA+ICAgICBtVmlzaWJsZUxheWVyc1NvcnRlZEJ5WjsKLQotCi0gICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIGEgbG9jayBmb3IgdGhlc2UsIHdlIGRvbid0IGNhcmUKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbURlYnVnUmVnaW9uOwotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdCYWNrZ3JvdW5kOwotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdERE1TOwotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlSFdDOwotICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtRGVidWdEaXNhYmxlVHJhbnNmb3JtSGludDsKLSAgICAgICAgICAgICAgICB2b2xhdGlsZSBuc2Vjc190ICAgICAgICAgICAgbURlYnVnSW5Td2FwQnVmZmVyczsKLSAgICAgICAgICAgICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgbUxhc3RTd2FwQnVmZmVyVGltZTsKLSAgICAgICAgICAgICAgICB2b2xhdGlsZSBuc2Vjc190ICAgICAgICAgICAgbURlYnVnSW5UcmFuc2FjdGlvbjsKLSAgICAgICAgICAgICAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFuc2FjdGlvblRpbWU7Ci0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1Cb290RmluaXNoZWQ7Ci0KLSAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgdGhyZWFkIHNhZmUKLSAgICBtdXRhYmxlICAgICBCYXJyaWVyICAgICAgICAgICAgICAgICAgICAgbVJlYWR5VG9SdW5CYXJyaWVyOwotCi0KLSAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbURlc3Ryb3llZExheWVyTG9jazsKLSAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbURlc3Ryb3llZExheWVyTG9jazsKLSAgICAgICAgICAgICAgICBWZWN0b3I8TGF5ZXJCYXNlIGNvbnN0ICo+ICAgbURlc3Ryb3llZExheWVyczsKLQotICAgICAgICAgICAgICAgIC8vIGF0b21pYyB2YXJpYWJsZXMKLSAgICAgICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICAgICAgZUNvbnNvbGVSZWxlYXNlZCA9IDEsCi0gICAgICAgICAgICAgICAgICAgIGVDb25zb2xlQWNxdWlyZWQgPSAyCi0gICAgICAgICAgICAgICAgfTsKLSAgIHZvbGF0aWxlICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbUNvbnNvbGVTaWduYWxzOwotCi0gICAvLyBvbmx5IHdyaXR0ZW4gaW4gdGhlIG1haW4gdGhyZWFkLCBvbmx5IHJlYWQgaW4gb3RoZXIgdGhyZWFkcwotICAgdm9sYXRpbGUgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2VjdXJlRnJhbWVCdWZmZXI7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlVGV4dHVyZUxheWVyLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWU4ZTYzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VUZXh0dXJlTGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotI2luY2x1ZGUgIkxheWVyLmgiCi0jaW5jbHVkZSAiU3VyZmFjZVRleHR1cmVMYXllci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1TdXJmYWNlVGV4dHVyZUxheWVyOjpTdXJmYWNlVGV4dHVyZUxheWVyKEdMdWludCB0ZXgsIGNvbnN0IHNwPExheWVyPiYgbGF5ZXIpCi0gICAgOiBTdXJmYWNlVGV4dHVyZSh0ZXgsIHRydWUsIEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTLCBmYWxzZSksIG1MYXllcihsYXllcikgewotfQotCi1TdXJmYWNlVGV4dHVyZUxheWVyOjp+U3VyZmFjZVRleHR1cmVMYXllcigpIHsKLX0KLQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZUxheWVyOjpzZXREZWZhdWx0QnVmZmVyU2l6ZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoKQotewotICAgIC8vQUxPR0QoIiVzLCB3PSV1LCBoPSV1IiwgX19QUkVUVFlfRlVOQ1RJT05fXywgdywgaCk7Ci0gICAgcmV0dXJuIFN1cmZhY2VUZXh0dXJlOjpzZXREZWZhdWx0QnVmZmVyU2l6ZSh3LCBoKTsKLX0KLQotc3RhdHVzX3QgU3VyZmFjZVRleHR1cmVMYXllcjo6c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpCi17Ci0gICAgbURlZmF1bHRGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZUxheWVyOjpzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpIHsKLSAgICBzdGF0dXNfdCByZXMgPSBTdXJmYWNlVGV4dHVyZTo6c2V0QnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IFN1cmZhY2VUZXh0dXJlTGF5ZXI6OnF1ZXVlQnVmZmVyKGludCBidWYsIGludDY0X3QgdGltZXN0YW1wLAotICAgICAgICB1aW50MzJfdCogb3V0V2lkdGgsIHVpbnQzMl90KiBvdXRIZWlnaHQsIHVpbnQzMl90KiBvdXRUcmFuc2Zvcm0pIHsKLQotICAgIHN0YXR1c190IHJlcyA9IFN1cmZhY2VUZXh0dXJlOjpxdWV1ZUJ1ZmZlcihidWYsIHRpbWVzdGFtcCwKLSAgICAgICAgICAgIG91dFdpZHRoLCBvdXRIZWlnaHQsIG91dFRyYW5zZm9ybSk7Ci0gICAgc3A8TGF5ZXI+IGxheWVyKG1MYXllci5wcm9tb3RlKCkpOwotICAgIGlmIChsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICpvdXRUcmFuc2Zvcm0gPSBsYXllci0+Z2V0VHJhbnNmb3JtSGludCgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZUxheWVyOjpkZXF1ZXVlQnVmZmVyKGludCAqYnVmLAotICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSB7Ci0KLSAgICBzdGF0dXNfdCByZXMoTk9fSU5JVCk7Ci0gICAgc3A8TGF5ZXI+IGxheWVyKG1MYXllci5wcm9tb3RlKCkpOwotICAgIGlmIChsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChmb3JtYXQgPT0gMCkKLSAgICAgICAgICAgIGZvcm1hdCA9IG1EZWZhdWx0Rm9ybWF0OwotICAgICAgICB1aW50MzJfdCBlZmZlY3RpdmVVc2FnZSA9IGxheWVyLT5nZXRFZmZlY3RpdmVVc2FnZSh1c2FnZSk7Ci0gICAgICAgIC8vQUxPR0QoIiVzLCB3PSV1LCBoPSV1LCBmb3JtYXQ9JXUsIHVzYWdlPSUwOHgsIGVmZmVjdGl2ZVVzYWdlPSUwOHgiLAotICAgICAgICAvLyAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywgdywgaCwgZm9ybWF0LCB1c2FnZSwgZWZmZWN0aXZlVXNhZ2UpOwotICAgICAgICByZXMgPSBTdXJmYWNlVGV4dHVyZTo6ZGVxdWV1ZUJ1ZmZlcihidWYsIHcsIGgsIGZvcm1hdCwgZWZmZWN0aXZlVXNhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBTdXJmYWNlVGV4dHVyZUxheWVyOjpjb25uZWN0KGludCBhcGksCi0gICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSkgewotICAgIHN0YXR1c190IGVyciA9IFN1cmZhY2VUZXh0dXJlOjpjb25uZWN0KGFwaSwKLSAgICAgICAgICAgIG91dFdpZHRoLCBvdXRIZWlnaHQsIG91dFRyYW5zZm9ybSk7Ci0gICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICBzcDxMYXllcj4gbGF5ZXIobUxheWVyLnByb21vdGUoKSk7Ci0gICAgICAgIGlmIChsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBvcmllbnRhdGlvbiA9IGxheWVyLT5nZXRPcmllbnRhdGlvbigpOwotICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICYgVHJhbnNmb3JtOjpST1RfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpvdXRUcmFuc2Zvcm0gPSBvcmllbnRhdGlvbjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2goYXBpKSB7Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NQVToKLSAgICAgICAgICAgICAgICAvLyBTdXJmYWNlVGV4dHVyZUNsaWVudCBzdXBwb3J0cyBvbmx5IDIgYnVmZmVycyBmb3IgQ1BVIGNvbm5lY3Rpb25zCi0gICAgICAgICAgICAgICAgdGhpcy0+c2V0QnVmZmVyQ291bnRTZXJ2ZXIoMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX01FRElBOgotICAgICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkE6Ci0gICAgICAgICAgICAgICAgLy8gQ2FtZXJhIHByZXZpZXcgYW5kIHZpZGVvcyBhcmUgcmF0ZS1saW1pdGVkIG9uIHRoZSBwcm9kdWNlcgotICAgICAgICAgICAgICAgIC8vIHNpZGUuICBJZiBlbmFibGVkIGZvciB0aGlzIGJ1aWxkLCB3ZSB1c2UgYXN5bmMgbW9kZSB0byBhbHdheXMKLSAgICAgICAgICAgICAgICAvLyBzaG93IHRoZSBtb3N0IHJlY2VudCBmcmFtZSBhdCB0aGUgY29zdCBvZiByZXF1aXJpbmcgYW4KLSAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGJ1ZmZlci4KLSNpZm5kZWYgTkVWRVJfREVGQVVMVF9UT19BU1lOQ19NT0RFCi0gICAgICAgICAgICAgICAgZXJyID0gc2V0U3luY2hyb25vdXNNb2RlKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBzZXQgc3luY2hyb25vdXMgbW9kZSB3aGVuIG5vdCBkZWZhdWx0aW5nIHRvCi0gICAgICAgICAgICAgICAgLy8gYXN5bmMgbW9kZS4KLSAgICAgICAgICAgIGRlYWZ1bHQ6Ci0gICAgICAgICAgICAgICAgZXJyID0gc2V0U3luY2hyb25vdXNNb2RlKHRydWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoYXBpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlVGV4dHVyZUxheWVyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlVGV4dHVyZUxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDg1MjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZVRleHR1cmVMYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TVVJGQUNFX1RFWFRVUkVfTEFZRVJfSAotI2RlZmluZSBBTkRST0lEX1NVUkZBQ0VfVEVYVFVSRV9MQVlFUl9ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlVGV4dHVyZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTGF5ZXI7Ci0KLWNsYXNzIFN1cmZhY2VUZXh0dXJlTGF5ZXIgOiBwdWJsaWMgU3VyZmFjZVRleHR1cmUKLXsKLSAgICB3cDxMYXllcj4gbUxheWVyOwotICAgIHVpbnQzMl90IG1EZWZhdWx0Rm9ybWF0OwotCi1wdWJsaWM6Ci0gICAgU3VyZmFjZVRleHR1cmVMYXllcihHTHVpbnQgdGV4LCBjb25zdCBzcDxMYXllcj4mIGxheWVyKTsKLSAgICB+U3VyZmFjZVRleHR1cmVMYXllcigpOwotCi0gICAgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlclNpemUodWludDMyX3QgdywgdWludDMyX3QgaCk7Ci0gICAgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotCi1wdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlcihpbnQgYnVmLCBpbnQ2NF90IHRpbWVzdGFtcCwKLSAgICAgICAgICAgIHVpbnQzMl90KiBvdXRXaWR0aCwgdWludDMyX3QqIG91dEhlaWdodCwgdWludDMyX3QqIG91dFRyYW5zZm9ybSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpidWYsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCi0gICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdChpbnQgYXBpLAotICAgICAgICAgICAgdWludDMyX3QqIG91dFdpZHRoLCB1aW50MzJfdCogb3V0SGVpZ2h0LCB1aW50MzJfdCogb3V0VHJhbnNmb3JtKTsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfU1VSRkFDRV9URVhUVVJFX0xBWUVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9UcmFuc2Zvcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNmYTZlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dWkvUmVnaW9uLmg+Ci0KLSNpbmNsdWRlICJjbHouaCIKLSNpbmNsdWRlICJUcmFuc2Zvcm0uaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRyYW5zZm9ybTo6VHJhbnNmb3JtKCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLVRyYW5zZm9ybTo6VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybSYgIG90aGVyKQotICAgIDogbU1hdHJpeChvdGhlci5tTWF0cml4KSwgbVR5cGUob3RoZXIubVR5cGUpIHsKLX0KLQotVHJhbnNmb3JtOjpUcmFuc2Zvcm0odWludDMyX3Qgb3JpZW50YXRpb24pIHsKLSAgICBzZXQob3JpZW50YXRpb24sIDAsIDApOwotfQotCi1UcmFuc2Zvcm06On5UcmFuc2Zvcm0oKSB7Ci19Ci0KLXN0YXRpYyBjb25zdCBmbG9hdCBFUFNJTE9OID0gMC4wZjsKLQotYm9vbCBUcmFuc2Zvcm06OmlzWmVybyhmbG9hdCBmKSB7Ci0gICAgcmV0dXJuIGZhYnMoZikgPD0gRVBTSUxPTjsKLX0KLQotYm9vbCBUcmFuc2Zvcm06OmFic0lzT25lKGZsb2F0IGYpIHsKLSAgICByZXR1cm4gaXNaZXJvKGZhYnMoZikgLSAxLjBmKTsKLX0KLQotVHJhbnNmb3JtIFRyYW5zZm9ybTo6b3BlcmF0b3IgKiAoY29uc3QgVHJhbnNmb3JtJiByaHMpIGNvbnN0Ci17Ci0gICAgaWYgKENDX0xJS0VMWShtVHlwZSA9PSBJREVOVElUWSkpCi0gICAgICAgIHJldHVybiByaHM7Ci0KLSAgICBUcmFuc2Zvcm0gcigqdGhpcyk7Ci0gICAgaWYgKHJocy5tVHlwZSA9PSBJREVOVElUWSkKLSAgICAgICAgcmV0dXJuIHI7Ci0KLSAgICAvLyBUT0RPOiB3ZSBjb3VsZCB1c2UgbVR5cGUgdG8gb3B0aW1pemUgdGhlIG1hdHJpeCBtdWx0aXBseQotICAgIGNvbnN0IG1hdDMzJiBBKG1NYXRyaXgpOwotICAgIGNvbnN0IG1hdDMzJiBCKHJocy5tTWF0cml4KTsKLSAgICAgICAgICBtYXQzMyYgRChyLm1NYXRyaXgpOwotICAgIGZvciAoaW50IGk9MCA7IGk8MyA7IGkrKykgewotICAgICAgICBjb25zdCBmbG9hdCB2MCA9IEFbMF1baV07Ci0gICAgICAgIGNvbnN0IGZsb2F0IHYxID0gQVsxXVtpXTsKLSAgICAgICAgY29uc3QgZmxvYXQgdjIgPSBBWzJdW2ldOwotICAgICAgICBEWzBdW2ldID0gdjAqQlswXVswXSArIHYxKkJbMF1bMV0gKyB2MipCWzBdWzJdOwotICAgICAgICBEWzFdW2ldID0gdjAqQlsxXVswXSArIHYxKkJbMV1bMV0gKyB2MipCWzFdWzJdOwotICAgICAgICBEWzJdW2ldID0gdjAqQlsyXVswXSArIHYxKkJbMl1bMV0gKyB2MipCWzJdWzJdOwotICAgIH0KLSAgICByLm1UeXBlIHw9IHJocy5tVHlwZTsKLQotICAgIC8vIFRPRE86IHdlIGNvdWxkIHJlY29tcHV0ZSB0aGlzIHZhbHVlIGZyb20gciBhbmQgcmhzCi0gICAgci5tVHlwZSAmPSAweEZGOwotICAgIHIubVR5cGUgfD0gVU5LTk9XTl9UWVBFOwotICAgIHJldHVybiByOwotfQotCi1mbG9hdCBjb25zdCogVHJhbnNmb3JtOjpvcGVyYXRvciBbXSAoaW50IGkpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1hdHJpeFtpXS52OwotfQotCi1ib29sIFRyYW5zZm9ybTo6dHJhbnNmb3JtZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGUoKSA+IFRSQU5TTEFURTsKLX0KLQotZmxvYXQgVHJhbnNmb3JtOjp0eCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1hdHJpeFsyXVswXTsKLX0KLQotZmxvYXQgVHJhbnNmb3JtOjp0eSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU1hdHJpeFsyXVsxXTsKLX0KLQotdm9pZCBUcmFuc2Zvcm06OnJlc2V0KCkgewotICAgIG1UeXBlID0gSURFTlRJVFk7Ci0gICAgZm9yKGludCBpPTAgOyBpPDMgOyBpKyspIHsKLSAgICAgICAgdmVjMyYgdihtTWF0cml4W2ldKTsKLSAgICAgICAgZm9yIChpbnQgaj0wIDsgajwzIDsgaisrKQotICAgICAgICAgICAgdltqXSA9ICgoaT09aikgPyAxLjBmIDogMC4wZik7Ci0gICAgfQotfQotCi12b2lkIFRyYW5zZm9ybTo6c2V0KGZsb2F0IHR4LCBmbG9hdCB0eSkKLXsKLSAgICBtTWF0cml4WzJdWzBdID0gdHg7Ci0gICAgbU1hdHJpeFsyXVsxXSA9IHR5OwotICAgIG1NYXRyaXhbMl1bMl0gPSAxLjBmOwotCi0gICAgaWYgKGlzWmVybyh0eCkgJiYgaXNaZXJvKHR5KSkgewotICAgICAgICBtVHlwZSAmPSB+VFJBTlNMQVRFOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1UeXBlIHw9IFRSQU5TTEFURTsKLSAgICB9Ci19Ci0KLXZvaWQgVHJhbnNmb3JtOjpzZXQoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCkKLXsKLSAgICBtYXQzMyYgTShtTWF0cml4KTsKLSAgICBNWzBdWzBdID0gYTsgICAgTVsxXVswXSA9IGI7Ci0gICAgTVswXVsxXSA9IGM7ICAgIE1bMV1bMV0gPSBkOwotICAgIE1bMF1bMl0gPSAwOyAgICBNWzFdWzJdID0gMDsKLSAgICBtVHlwZSA9IFVOS05PV05fVFlQRTsKLX0KLQotc3RhdHVzX3QgVHJhbnNmb3JtOjpzZXQodWludDMyX3QgZmxhZ3MsIGZsb2F0IHcsIGZsb2F0IGgpCi17Ci0gICAgaWYgKGZsYWdzICYgUk9UX0lOVkFMSUQpIHsKLSAgICAgICAgLy8gdGhhdCdzIG5vdCBhbGxvd2VkIQotICAgICAgICByZXNldCgpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIFRyYW5zZm9ybSBILCBWLCBSOwotICAgIGlmIChmbGFncyAmIFJPVF85MCkgewotICAgICAgICAvLyB3ICYgaCBhcmUgaW52ZXJ0ZWQgd2hlbiByb3RhdGluZyBieSA5MCBkZWdyZWVzCi0gICAgICAgIHN3YXAodywgaCk7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgRkxJUF9IKSB7Ci0gICAgICAgIEgubVR5cGUgPSAoRkxJUF9IIDw8IDgpIHwgU0NBTEU7Ci0gICAgICAgIEgubVR5cGUgfD0gaXNaZXJvKHcpID8gSURFTlRJVFkgOiBUUkFOU0xBVEU7Ci0gICAgICAgIG1hdDMzJiBNKEgubU1hdHJpeCk7Ci0gICAgICAgIE1bMF1bMF0gPSAtMTsKLSAgICAgICAgTVsyXVswXSA9IHc7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgRkxJUF9WKSB7Ci0gICAgICAgIFYubVR5cGUgPSAoRkxJUF9WIDw8IDgpIHwgU0NBTEU7Ci0gICAgICAgIFYubVR5cGUgfD0gaXNaZXJvKGgpID8gSURFTlRJVFkgOiBUUkFOU0xBVEU7Ci0gICAgICAgIG1hdDMzJiBNKFYubU1hdHJpeCk7Ci0gICAgICAgIE1bMV1bMV0gPSAtMTsKLSAgICAgICAgTVsyXVsxXSA9IGg7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgUk9UXzkwKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IG9yaWdpbmFsX3cgPSBoOwotICAgICAgICBSLm1UeXBlID0gKFJPVF85MCA8PCA4KSB8IFJPVEFURTsKLSAgICAgICAgUi5tVHlwZSB8PSBpc1plcm8ob3JpZ2luYWxfdykgPyBJREVOVElUWSA6IFRSQU5TTEFURTsKLSAgICAgICAgbWF0MzMmIE0oUi5tTWF0cml4KTsKLSAgICAgICAgTVswXVswXSA9IDA7ICAgIE1bMV1bMF0gPS0xOyAgICBNWzJdWzBdID0gb3JpZ2luYWxfdzsKLSAgICAgICAgTVswXVsxXSA9IDE7ICAgIE1bMV1bMV0gPSAwOwotICAgIH0KLQotICAgICp0aGlzID0gKFIqKEgqVikpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotVHJhbnNmb3JtOjp2ZWMyIFRyYW5zZm9ybTo6dHJhbnNmb3JtKGNvbnN0IHZlYzImIHYpIGNvbnN0IHsKLSAgICB2ZWMyIHI7Ci0gICAgY29uc3QgbWF0MzMmIE0obU1hdHJpeCk7Ci0gICAgclswXSA9IE1bMF1bMF0qdlswXSArIE1bMV1bMF0qdlsxXSArIE1bMl1bMF07Ci0gICAgclsxXSA9IE1bMF1bMV0qdlswXSArIE1bMV1bMV0qdlsxXSArIE1bMl1bMV07Ci0gICAgcmV0dXJuIHI7Ci19Ci0KLVRyYW5zZm9ybTo6dmVjMyBUcmFuc2Zvcm06OnRyYW5zZm9ybShjb25zdCB2ZWMzJiB2KSBjb25zdCB7Ci0gICAgdmVjMyByOwotICAgIGNvbnN0IG1hdDMzJiBNKG1NYXRyaXgpOwotICAgIHJbMF0gPSBNWzBdWzBdKnZbMF0gKyBNWzFdWzBdKnZbMV0gKyBNWzJdWzBdKnZbMl07Ci0gICAgclsxXSA9IE1bMF1bMV0qdlswXSArIE1bMV1bMV0qdlsxXSArIE1bMl1bMV0qdlsyXTsKLSAgICByWzJdID0gTVswXVsyXSp2WzBdICsgTVsxXVsyXSp2WzFdICsgTVsyXVsyXSp2WzJdOwotICAgIHJldHVybiByOwotfQotCi12b2lkIFRyYW5zZm9ybTo6dHJhbnNmb3JtKGZsb2F0KiBwb2ludCwgaW50IHgsIGludCB5KSBjb25zdAotewotICAgIGNvbnN0IG1hdDMzJiBNKG1NYXRyaXgpOwotICAgIHZlYzIgdih4LCB5KTsKLSAgICB2ID0gdHJhbnNmb3JtKHYpOwotICAgIHBvaW50WzBdID0gdlswXTsKLSAgICBwb2ludFsxXSA9IHZbMV07Ci19Ci0KLVJlY3QgVHJhbnNmb3JtOjptYWtlQm91bmRzKGludCB3LCBpbnQgaCkgY29uc3QKLXsKLSAgICByZXR1cm4gdHJhbnNmb3JtKCBSZWN0KHcsIGgpICk7Ci19Ci0KLVJlY3QgVHJhbnNmb3JtOjp0cmFuc2Zvcm0oY29uc3QgUmVjdCYgYm91bmRzKSBjb25zdAotewotICAgIFJlY3QgcjsKLSAgICB2ZWMyIGx0KCBib3VuZHMubGVmdCwgIGJvdW5kcy50b3AgICAgKTsKLSAgICB2ZWMyIHJ0KCBib3VuZHMucmlnaHQsIGJvdW5kcy50b3AgICAgKTsKLSAgICB2ZWMyIGxiKCBib3VuZHMubGVmdCwgIGJvdW5kcy5ib3R0b20gKTsKLSAgICB2ZWMyIHJiKCBib3VuZHMucmlnaHQsIGJvdW5kcy5ib3R0b20gKTsKLQotICAgIGx0ID0gdHJhbnNmb3JtKGx0KTsKLSAgICBydCA9IHRyYW5zZm9ybShydCk7Ci0gICAgbGIgPSB0cmFuc2Zvcm0obGIpOwotICAgIHJiID0gdHJhbnNmb3JtKHJiKTsKLQotICAgIHIubGVmdCAgID0gZmxvb3JmKG1pbihsdFswXSwgcnRbMF0sIGxiWzBdLCByYlswXSkgKyAwLjVmKTsKLSAgICByLnRvcCAgICA9IGZsb29yZihtaW4obHRbMV0sIHJ0WzFdLCBsYlsxXSwgcmJbMV0pICsgMC41Zik7Ci0gICAgci5yaWdodCAgPSBmbG9vcmYobWF4KGx0WzBdLCBydFswXSwgbGJbMF0sIHJiWzBdKSArIDAuNWYpOwotICAgIHIuYm90dG9tID0gZmxvb3JmKG1heChsdFsxXSwgcnRbMV0sIGxiWzFdLCByYlsxXSkgKyAwLjVmKTsKLQotICAgIHJldHVybiByOwotfQotCi1SZWdpb24gVHJhbnNmb3JtOjp0cmFuc2Zvcm0oY29uc3QgUmVnaW9uJiByZWcpIGNvbnN0Ci17Ci0gICAgUmVnaW9uIG91dDsKLSAgICBpZiAoQ0NfVU5MSUtFTFkodHJhbnNmb3JtZWQoKSkpIHsKLSAgICAgICAgaWYgKENDX0xJS0VMWShwcmVzZXJ2ZVJlY3RzKCkpKSB7Ci0gICAgICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVnLmJlZ2luKCk7Ci0gICAgICAgICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGNvbnN0IGVuZCA9IHJlZy5lbmQoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdCAhPSBlbmQpIHsKLSAgICAgICAgICAgICAgICBvdXQub3JTZWxmKHRyYW5zZm9ybSgqaXQrKykpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0LnNldCh0cmFuc2Zvcm0ocmVnLmJvdW5kcygpKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgeHBvcyA9IGZsb29yZih0eCgpICsgMC41Zik7Ci0gICAgICAgIGludCB5cG9zID0gZmxvb3JmKHR5KCkgKyAwLjVmKTsKLSAgICAgICAgb3V0ID0gcmVnLnRyYW5zbGF0ZSh4cG9zLCB5cG9zKTsKLSAgICB9Ci0gICAgcmV0dXJuIG91dDsKLX0KLQotdWludDMyX3QgVHJhbnNmb3JtOjp0eXBlKCkgY29uc3QKLXsKLSAgICBpZiAobVR5cGUgJiBVTktOT1dOX1RZUEUpIHsKLSAgICAgICAgLy8gcmVjb21wdXRlIHdoYXQgdGhpcyB0cmFuc2Zvcm0gaXMKLQotICAgICAgICBjb25zdCBtYXQzMyYgTShtTWF0cml4KTsKLSAgICAgICAgY29uc3QgZmxvYXQgYSA9IE1bMF1bMF07Ci0gICAgICAgIGNvbnN0IGZsb2F0IGIgPSBNWzFdWzBdOwotICAgICAgICBjb25zdCBmbG9hdCBjID0gTVswXVsxXTsKLSAgICAgICAgY29uc3QgZmxvYXQgZCA9IE1bMV1bMV07Ci0gICAgICAgIGNvbnN0IGZsb2F0IHggPSBNWzJdWzBdOwotICAgICAgICBjb25zdCBmbG9hdCB5ID0gTVsyXVsxXTsKLQotICAgICAgICBib29sIHNjYWxlID0gZmFsc2U7Ci0gICAgICAgIHVpbnQzMl90IGZsYWdzID0gUk9UXzA7Ci0gICAgICAgIGlmIChpc1plcm8oYikgJiYgaXNaZXJvKGMpKSB7Ci0gICAgICAgICAgICBpZiAoYTwwKSAgICBmbGFncyB8PSBGTElQX0g7Ci0gICAgICAgICAgICBpZiAoZDwwKSAgICBmbGFncyB8PSBGTElQX1Y7Ci0gICAgICAgICAgICBpZiAoIWFic0lzT25lKGEpIHx8ICFhYnNJc09uZShkKSkgewotICAgICAgICAgICAgICAgIHNjYWxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpc1plcm8oYSkgJiYgaXNaZXJvKGQpKSB7Ci0gICAgICAgICAgICBmbGFncyB8PSBST1RfOTA7Ci0gICAgICAgICAgICBpZiAoYj4wKSAgICBmbGFncyB8PSBGTElQX1Y7Ci0gICAgICAgICAgICBpZiAoYzwwKSAgICBmbGFncyB8PSBGTElQX0g7Ci0gICAgICAgICAgICBpZiAoIWFic0lzT25lKGIpIHx8ICFhYnNJc09uZShjKSkgewotICAgICAgICAgICAgICAgIHNjYWxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgc2tldyBjb21wb25lbnQgYW5kL29yIGEgbm9uIDkwIGRlZ3JlZXMgcm90YXRpb24KLSAgICAgICAgICAgIGZsYWdzID0gUk9UX0lOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHlwZSA9IGZsYWdzIDw8IDg7Ci0gICAgICAgIGlmIChmbGFncyAmIFJPVF9JTlZBTElEKSB7Ci0gICAgICAgICAgICBtVHlwZSB8PSBVTktOT1dOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChmbGFncyAmIFJPVF85MCkgfHwgKChmbGFncyAmIFJPVF8xODApID09IFJPVF8xODApKQotICAgICAgICAgICAgICAgIG1UeXBlIHw9IFJPVEFURTsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIEZMSVBfSCkKLSAgICAgICAgICAgICAgICBtVHlwZSBePSBTQ0FMRTsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIEZMSVBfVikKLSAgICAgICAgICAgICAgICBtVHlwZSBePSBTQ0FMRTsKLSAgICAgICAgICAgIGlmIChzY2FsZSkKLSAgICAgICAgICAgICAgICBtVHlwZSB8PSBTQ0FMRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNaZXJvKHgpIHx8ICFpc1plcm8oeSkpCi0gICAgICAgICAgICBtVHlwZSB8PSBUUkFOU0xBVEU7Ci0gICAgfQotICAgIHJldHVybiBtVHlwZTsKLX0KLQotdWludDMyX3QgVHJhbnNmb3JtOjpnZXRUeXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlKCkgJiAweEZGOwotfQotCi11aW50MzJfdCBUcmFuc2Zvcm06OmdldE9yaWVudGF0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKHR5cGUoKSA+PiA4KSAmIDB4RkY7Ci19Ci0KLWJvb2wgVHJhbnNmb3JtOjpwcmVzZXJ2ZVJlY3RzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gKGdldE9yaWVudGF0aW9uKCkgJiBST1RfSU5WQUxJRCkgPyBmYWxzZSA6IHRydWU7Ci19Ci0KLXZvaWQgVHJhbnNmb3JtOjpkdW1wKGNvbnN0IGNoYXIqIG5hbWUpIGNvbnN0Ci17Ci0gICAgdHlwZSgpOyAvLyB1cGRhdGVzIHRoZSB0eXBlCi0KLSAgICBTdHJpbmc4IGZsYWdzLCB0eXBlOwotICAgIGNvbnN0IG1hdDMzJiBtKG1NYXRyaXgpOwotICAgIHVpbnQzMl90IG9yaWVudCA9IG1UeXBlID4+IDg7Ci0KLSAgICBpZiAob3JpZW50JlJPVF9JTlZBTElEKSB7Ci0gICAgICAgIGZsYWdzLmFwcGVuZCgiUk9UX0lOVkFMSUQgIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG9yaWVudCZST1RfOTApIHsKLSAgICAgICAgICAgIGZsYWdzLmFwcGVuZCgiUk9UXzkwICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKCJST1RfMCAiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAob3JpZW50JkZMSVBfVikKLSAgICAgICAgICAgIGZsYWdzLmFwcGVuZCgiRkxJUF9WICIpOwotICAgICAgICBpZiAob3JpZW50JkZMSVBfSCkKLSAgICAgICAgICAgIGZsYWdzLmFwcGVuZCgiRkxJUF9IICIpOwotICAgIH0KLQotICAgIGlmICghKG1UeXBlJihTQ0FMRXxST1RBVEV8VFJBTlNMQVRFKSkpCi0gICAgICAgIHR5cGUuYXBwZW5kKCJJREVOVElUWSAiKTsKLSAgICBpZiAobVR5cGUmU0NBTEUpCi0gICAgICAgIHR5cGUuYXBwZW5kKCJTQ0FMRSAiKTsKLSAgICBpZiAobVR5cGUmUk9UQVRFKQotICAgICAgICB0eXBlLmFwcGVuZCgiUk9UQVRFICIpOwotICAgIGlmIChtVHlwZSZUUkFOU0xBVEUpCi0gICAgICAgIHR5cGUuYXBwZW5kKCJUUkFOU0xBVEUgIik7Ci0KLSAgICBBTE9HRCgiJXMgMHglMDh4ICglcywgJXMpIiwgbmFtZSwgbVR5cGUsIGZsYWdzLnN0cmluZygpLCB0eXBlLnN0cmluZygpKTsKLSAgICBBTE9HRCgiJS40ZiAgJS40ZiAgJS40ZiIsIG1bMF1bMF0sIG1bMV1bMF0sIG1bMl1bMF0pOwotICAgIEFMT0dEKCIlLjRmICAlLjRmICAlLjRmIiwgbVswXVsxXSwgbVsxXVsxXSwgbVsyXVsxXSk7Ci0gICAgQUxPR0QoIiUuNGYgICUuNGYgICUuNGYiLCBtWzBdWzJdLCBtWzFdWzJdLCBtWzJdWzJdKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9UcmFuc2Zvcm0uaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzc0MjQzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVFJBTlNGT1JNX0gKLSNkZWZpbmUgQU5EUk9JRF9UUkFOU0ZPUk1fSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1aS9Qb2ludC5oPgotI2luY2x1ZGUgPHVpL1JlY3QuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgUmVnaW9uOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgVHJhbnNmb3JtCi17Ci1wdWJsaWM6Ci0gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybSgpOwotICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtJiAgb3RoZXIpOwotICAgICAgICAgICBleHBsaWNpdCBUcmFuc2Zvcm0odWludDMyX3Qgb3JpZW50YXRpb24pOwotICAgICAgICAgICAgICAgICAgICB+VHJhbnNmb3JtKCk7Ci0KLSAgICAgICAgICAgIGVudW0gb3JpZW50YXRpb25fZmxhZ3MgewotICAgICAgICAgICAgICAgIFJPVF8wICAgPSAweDAwMDAwMDAwLAotICAgICAgICAgICAgICAgIEZMSVBfSCAgPSBIQUxfVFJBTlNGT1JNX0ZMSVBfSCwKLSAgICAgICAgICAgICAgICBGTElQX1YgID0gSEFMX1RSQU5TRk9STV9GTElQX1YsCi0gICAgICAgICAgICAgICAgUk9UXzkwICA9IEhBTF9UUkFOU0ZPUk1fUk9UXzkwLAotICAgICAgICAgICAgICAgIFJPVF8xODAgPSBGTElQX0h8RkxJUF9WLAotICAgICAgICAgICAgICAgIFJPVF8yNzAgPSBST1RfMTgwfFJPVF85MCwKLSAgICAgICAgICAgICAgICBST1RfSU5WQUxJRCA9IDB4ODAKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIGVudW0gdHlwZV9tYXNrIHsKLSAgICAgICAgICAgICAgICBJREVOVElUWSAgICAgICAgICAgID0gMCwKLSAgICAgICAgICAgICAgICBUUkFOU0xBVEUgICAgICAgICAgID0gMHgxLAotICAgICAgICAgICAgICAgIFJPVEFURSAgICAgICAgICAgICAgPSAweDIsCi0gICAgICAgICAgICAgICAgU0NBTEUgICAgICAgICAgICAgICA9IDB4NCwKLSAgICAgICAgICAgICAgICBVTktOT1dOICAgICAgICAgICAgID0gMHg4Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAvLyBxdWVyeSB0aGUgdHJhbnNmb3JtCi0gICAgICAgICAgICBib29sICAgICAgICB0cmFuc2Zvcm1lZCgpIGNvbnN0OwotICAgICAgICAgICAgYm9vbCAgICAgICAgcHJlc2VydmVSZWN0cygpIGNvbnN0OwotICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0VHlwZSgpIGNvbnN0OwotICAgICAgICAgICAgdWludDMyX3QgICAgZ2V0T3JpZW50YXRpb24oKSBjb25zdDsKLQotICAgICAgICAgICAgZmxvYXQgY29uc3QqIG9wZXJhdG9yIFtdIChpbnQgaSkgY29uc3Q7ICAvLyByZXR1cm5zIGNvbHVtbiBpCi0gICAgICAgICAgICBmbG9hdCAgIHR4KCkgY29uc3Q7Ci0gICAgICAgICAgICBmbG9hdCAgIHR5KCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIG1vZGlmeSB0aGUgdHJhbnNmb3JtCi0gICAgICAgICAgICB2b2lkICAgICAgICByZXNldCgpOwotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0KGZsb2F0IHR4LCBmbG9hdCB0eSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXQoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICBzZXQodWludDMyX3QgZmxhZ3MsIGZsb2F0IHcsIGZsb2F0IGgpOwotCi0gICAgICAgICAgICAvLyB0cmFuc2Zvcm0gZGF0YQotICAgICAgICAgICAgUmVjdCAgICBtYWtlQm91bmRzKGludCB3LCBpbnQgaCkgY29uc3Q7Ci0gICAgICAgICAgICB2b2lkICAgIHRyYW5zZm9ybShmbG9hdCogcG9pbnQsIGludCB4LCBpbnQgeSkgY29uc3Q7Ci0gICAgICAgICAgICBSZWdpb24gIHRyYW5zZm9ybShjb25zdCBSZWdpb24mIHJlZykgY29uc3Q7Ci0gICAgICAgICAgICBUcmFuc2Zvcm0gb3BlcmF0b3IgKiAoY29uc3QgVHJhbnNmb3JtJiByaHMpIGNvbnN0OwotCi0gICAgICAgICAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgICAgICAgICB2b2lkIGR1bXAoY29uc3QgY2hhciogbmFtZSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IHZlYzMgewotICAgICAgICBmbG9hdCB2WzNdOwotICAgICAgICBpbmxpbmUgdmVjMygpIHsgfQotICAgICAgICBpbmxpbmUgdmVjMyhmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBjKSB7Ci0gICAgICAgICAgICB2WzBdID0gYTsgdlsxXSA9IGI7IHZbMl0gPSBjOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSBmbG9hdCBvcGVyYXRvciBbXSAoaW50IGkpIGNvbnN0IHsgcmV0dXJuIHZbaV07IH0KLSAgICAgICAgaW5saW5lIGZsb2F0JiBvcGVyYXRvciBbXSAoaW50IGkpIHsgcmV0dXJuIHZbaV07IH0KLSAgICB9OwotICAgIHN0cnVjdCB2ZWMyIHsKLSAgICAgICAgZmxvYXQgdlsyXTsKLSAgICAgICAgaW5saW5lIHZlYzIoKSB7IH0KLSAgICAgICAgaW5saW5lIHZlYzIoZmxvYXQgYSwgZmxvYXQgYikgewotICAgICAgICAgICAgdlswXSA9IGE7IHZbMV0gPSBiOwotICAgICAgICB9Ci0gICAgICAgIGlubGluZSBmbG9hdCBvcGVyYXRvciBbXSAoaW50IGkpIGNvbnN0IHsgcmV0dXJuIHZbaV07IH0KLSAgICAgICAgaW5saW5lIGZsb2F0JiBvcGVyYXRvciBbXSAoaW50IGkpIHsgcmV0dXJuIHZbaV07IH0KLSAgICB9OwotICAgIHN0cnVjdCBtYXQzMyB7Ci0gICAgICAgIHZlYzMgdlszXTsKLSAgICAgICAgaW5saW5lIGNvbnN0IHZlYzMmIG9wZXJhdG9yIFtdIChpbnQgaSkgY29uc3QgeyByZXR1cm4gdltpXTsgfQotICAgICAgICBpbmxpbmUgdmVjMyYgb3BlcmF0b3IgW10gKGludCBpKSB7IHJldHVybiB2W2ldOyB9Ci0gICAgfTsKLQotICAgIGVudW0geyBVTktOT1dOX1RZUEUgPSAweDgwMDAwMDAwIH07Ci0KLSAgICAvLyBhc3N1bWVzIHRoZSBsYXN0IHJvdyBpcyA8IDAgLCAwICwgMSA+Ci0gICAgdmVjMiB0cmFuc2Zvcm0oY29uc3QgdmVjMiYgdikgY29uc3Q7Ci0gICAgdmVjMyB0cmFuc2Zvcm0oY29uc3QgdmVjMyYgdikgY29uc3Q7Ci0gICAgUmVjdCB0cmFuc2Zvcm0oY29uc3QgUmVjdCYgYm91bmRzKSBjb25zdDsKLSAgICB1aW50MzJfdCB0eXBlKCkgY29uc3Q7Ci0gICAgc3RhdGljIGJvb2wgYWJzSXNPbmUoZmxvYXQgZik7Ci0gICAgc3RhdGljIGJvb2wgaXNaZXJvKGZsb2F0IGYpOwotCi0gICAgbWF0MzMgICAgICAgICAgICAgICBtTWF0cml4OwotICAgIG11dGFibGUgdWludDMyX3QgICAgbVR5cGU7Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBBTkRST0lEX1RSQU5TRk9STV9IICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9jbHouY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1NmI4Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9jbHouY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjbHouaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1pbnQgY2x6X2ltcGwoaW50MzJfdCB4KQotewotI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQotICAgIHJldHVybiBfX2J1aWx0aW5fY2x6KHgpOwotI2Vsc2UKLSAgICBpZiAoIXgpIHJldHVybiAzMjsKLSAgICBpbnQgZSA9IDMxOwotICAgIGlmICh4JjB4RkZGRjAwMDApICAgeyBlIC09MTY7IHggPj49MTY7IH0KLSAgICBpZiAoeCYweDAwMDBGRjAwKSAgIHsgZSAtPSA4OyB4ID4+PSA4OyB9Ci0gICAgaWYgKHgmMHgwMDAwMDBGMCkgICB7IGUgLT0gNDsgeCA+Pj0gNDsgfQotICAgIGlmICh4JjB4MDAwMDAwMEMpICAgeyBlIC09IDI7IHggPj49IDI7IH0KLSAgICBpZiAoeCYweDAwMDAwMDAyKSAgIHsgZSAtPSAxOyB9Ci0gICAgcmV0dXJuIGU7Ci0jZW5kaWYKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL2Nsei5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YzUyNjIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvY2x6LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9DTFpfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IGlubGluZSBjbHooaW50MzJfdCB4KSB7Ci0gICAgcmV0dXJuIF9fYnVpbHRpbl9jbHooeCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZSBUIG1pbihUIGEsIFQgYikgewotICAgIHJldHVybiBhPGIgPyBhIDogYjsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotc3RhdGljIGlubGluZSBUIG1pbihUIGEsIFQgYiwgVCBjKSB7Ci0gICAgcmV0dXJuIG1pbihhLCBtaW4oYiwgYykpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWluKFQgYSwgVCBiLCBUIGMsIFQgZCkgewotICAgIHJldHVybiBtaW4oYSwgYiwgbWluKGMsIGQpKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWF4KFQgYSwgVCBiKSB7Ci0gICAgcmV0dXJuIGE+YiA/IGEgOiBiOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgaW5saW5lIFQgbWF4KFQgYSwgVCBiLCBUIGMpIHsKLSAgICByZXR1cm4gbWF4KGEsIG1heChiLCBjKSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtYXgoVCBhLCBUIGIsIFQgYywgVCBkKSB7Ci0gICAgcmV0dXJuIG1heChhLCBiLCBtYXgoYywgZCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUKLXZvaWQgc3dhcChUJiBhLCBUJiBiKSB7Ci0gICAgVCB0KGEpOwotICAgIGEgPSBiOwotICAgIGIgPSB0OwotfQotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvKiBBTkRST0lEX1NVUkZBQ0VfRkxJTkdFUl9DTFpfSCAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NTU2NDguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMsCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gU3VyZmFjZUZsaW5nZXJfdGVzdAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFRyYW5zYWN0aW9uX3Rlc3QuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliRUdMIFwKLQlsaWJHTEVTdjIgXAotCWxpYmFuZHJvaWQgXAotCWxpYmJpbmRlciBcCi0JbGliY3V0aWxzIFwKLQlsaWJndWkgXAotCWxpYnN0bHBvcnQgXAotCWxpYnVpIFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGJpb25pYyBcCi0gICAgYmlvbmljL2xpYnN0ZGMrKy9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9ndGVzdC9pbmNsdWRlIFwKLSAgICBleHRlcm5hbC9zdGxwb3J0L3N0bHBvcnQgXAotCi0jIEJ1aWxkIHRoZSBiaW5hcnkgdG8gJChUQVJHRVRfT1VUX0RBVEFfTkFUSVZFX1RFU1RTKS8kKExPQ0FMX01PRFVMRSkKLSMgdG8gaW50ZWdyYXRlIHdpdGggYXV0by10ZXN0IGZyYW1ld29yay4KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCi0jIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCi1pZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCi1pbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9UcmFuc2FjdGlvbl90ZXN0LmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL1RyYW5zYWN0aW9uX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGFlMGQ5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL1RyYW5zYWN0aW9uX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotI2luY2x1ZGUgPHByaXZhdGUvZ3VpL0NvbXBvc2VyU2VydmljZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEZpbGwgYW4gUkdCQV84ODg4IGZvcm1hdHRlZCBzdXJmYWNlIHdpdGggYSBzaW5nbGUgY29sb3IuCi1zdGF0aWMgdm9pZCBmaWxsU3VyZmFjZVJHQkE4KGNvbnN0IHNwPFN1cmZhY2VDb250cm9sPiYgc2MsCi0gICAgICAgIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIpIHsKLSAgICBTdXJmYWNlOjpTdXJmYWNlSW5mbyBpbmZvOwotICAgIHNwPFN1cmZhY2U+IHMgPSBzYy0+Z2V0U3VyZmFjZSgpOwotICAgIEFTU0VSVF9UUlVFKHMgIT0gTlVMTCk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzLT5sb2NrKCZpbmZvKSk7Ci0gICAgdWludDhfdCogaW1nID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oaW5mby5iaXRzKTsKLSAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgaW5mby5oOyB5KyspIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGluZm8udzsgeCsrKSB7Ci0gICAgICAgICAgICB1aW50OF90KiBwaXhlbCA9IGltZyArICg0ICogKHkqaW5mby5zICsgeCkpOwotICAgICAgICAgICAgcGl4ZWxbMF0gPSByOwotICAgICAgICAgICAgcGl4ZWxbMV0gPSBnOwotICAgICAgICAgICAgcGl4ZWxbMl0gPSBiOwotICAgICAgICAgICAgcGl4ZWxbM10gPSAyNTU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBzLT51bmxvY2tBbmRQb3N0KCkpOwotfQotCi0vLyBBIFNjcmVlbkNhcHR1cmUgaXMgYSBzY3JlZW5zaG90IGZyb20gU3VyZmFjZUZsaW5nZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGVjawotLy8gaW5kaXZpZHVhbCBwaXhlbCB2YWx1ZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi1jbGFzcyBTY3JlZW5DYXB0dXJlIDogcHVibGljIFJlZkJhc2UgewotcHVibGljOgotICAgIHN0YXRpYyB2b2lkIGNhcHR1cmVTY3JlZW4oc3A8U2NyZWVuQ2FwdHVyZT4qIHNjKSB7Ci0gICAgICAgIHNwPElNZW1vcnlIZWFwPiBoZWFwOwotICAgICAgICB1aW50MzJfdCB3PTAsIGg9MDsKLSAgICAgICAgUGl4ZWxGb3JtYXQgZm10PTA7Ci0gICAgICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IHNmKENvbXBvc2VyU2VydmljZTo6Z2V0Q29tcG9zZXJTZXJ2aWNlKCkpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHNmLT5jYXB0dXJlU2NyZWVuKDAsICZoZWFwLCAmdywgJmgsICZmbXQsIDAsIDAsCi0gICAgICAgICAgICAgICAgMCwgSU5UX01BWCkpOwotICAgICAgICBBU1NFUlRfVFJVRShoZWFwICE9IE5VTEwpOwotICAgICAgICBBU1NFUlRfRVEoUElYRUxfRk9STUFUX1JHQkFfODg4OCwgZm10KTsKLSAgICAgICAgKnNjID0gbmV3IFNjcmVlbkNhcHR1cmUodywgaCwgaGVhcCk7Ci0gICAgfQotCi0gICAgdm9pZCBjaGVja1BpeGVsKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCogaW1nID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obUhlYXAtPmJhc2UoKSk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBpeGVsID0gaW1nICsgKDQgKiAoeSptV2lkdGggKyB4KSk7Ci0gICAgICAgIGlmIChyICE9IHBpeGVsWzBdIHx8IGcgIT0gcGl4ZWxbMV0gfHwgYiAhPSBwaXhlbFsyXSkgewotICAgICAgICAgICAgU3RyaW5nOCBlcnIoU3RyaW5nODo6Zm9ybWF0KCJwaXhlbCBAICglM2QsICUzZCk6ICIKLSAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIFslM2QsICUzZCwgJTNkXSwgZ290IFslM2QsICUzZCwgJTNkXSIsCi0gICAgICAgICAgICAgICAgICAgIHgsIHksIHIsIGcsIGIsIHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShTdHJpbmc4KCksIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgU2NyZWVuQ2FwdHVyZSh1aW50MzJfdCB3LCB1aW50MzJfdCBoLCBjb25zdCBzcDxJTWVtb3J5SGVhcD4mIGhlYXApIDoKLSAgICAgICAgbVdpZHRoKHcpLAotICAgICAgICBtSGVpZ2h0KGgpLAotICAgICAgICBtSGVhcChoZWFwKQotICAgIHt9Ci0KLSAgICBjb25zdCB1aW50MzJfdCBtV2lkdGg7Ci0gICAgY29uc3QgdWludDMyX3QgbUhlaWdodDsKLSAgICBzcDxJTWVtb3J5SGVhcD4gbUhlYXA7Ci19OwotCi1jbGFzcyBMYXllclVwZGF0ZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgICAgIG1Db21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7Ci0KLSAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBtQ29tcG9zZXJDbGllbnQtPmdldERpc3BsYXlXaWR0aCgwKTsKLSAgICAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gbUNvbXBvc2VyQ2xpZW50LT5nZXREaXNwbGF5SGVpZ2h0KDApOwotCi0gICAgICAgIC8vIEJhY2tncm91bmQgc3VyZmFjZQotICAgICAgICBtQkdTdXJmYWNlQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KCJCRyBUZXN0IFN1cmZhY2UiKSwgMCwgZGlzcGxheVdpZHRoLCBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgICAgIFBJWEVMX0ZPUk1BVF9SR0JBXzg4ODgsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShtQkdTdXJmYWNlQ29udHJvbCAhPSBOVUxMKTsKLSAgICAgICAgQVNTRVJUX1RSVUUobUJHU3VyZmFjZUNvbnRyb2wtPmlzVmFsaWQoKSk7Ci0gICAgICAgIGZpbGxTdXJmYWNlUkdCQTgobUJHU3VyZmFjZUNvbnRyb2wsIDYzLCA2MywgMTk1KTsKLQotICAgICAgICAvLyBGb3JlZ3JvdW5kIHN1cmZhY2UKLSAgICAgICAgbUZHU3VyZmFjZUNvbnRyb2wgPSBtQ29tcG9zZXJDbGllbnQtPmNyZWF0ZVN1cmZhY2UoCi0gICAgICAgICAgICAgICAgU3RyaW5nOCgiRkcgVGVzdCBTdXJmYWNlIiksIDAsIDY0LCA2NCwgUElYRUxfRk9STUFUX1JHQkFfODg4OCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKG1GR1N1cmZhY2VDb250cm9sICE9IE5VTEwpOwotICAgICAgICBBU1NFUlRfVFJVRShtRkdTdXJmYWNlQ29udHJvbC0+aXNWYWxpZCgpKTsKLQotICAgICAgICBmaWxsU3VyZmFjZVJHQkE4KG1GR1N1cmZhY2VDb250cm9sLCAxOTUsIDYzLCA2Myk7Ci0KLSAgICAgICAgLy8gU3luY2hyb25pemF0aW9uIHN1cmZhY2UKLSAgICAgICAgbVN5bmNTdXJmYWNlQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KCJTeW5jIFRlc3QgU3VyZmFjZSIpLCAwLCAxLCAxLCBQSVhFTF9GT1JNQVRfUkdCQV84ODg4LCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUobVN5bmNTdXJmYWNlQ29udHJvbCAhPSBOVUxMKTsKLSAgICAgICAgQVNTRVJUX1RSVUUobVN5bmNTdXJmYWNlQ29udHJvbC0+aXNWYWxpZCgpKTsKLQotICAgICAgICBmaWxsU3VyZmFjZVJHQkE4KG1TeW5jU3VyZmFjZUNvbnRyb2wsIDMxLCAzMSwgMzEpOwotCi0gICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtQkdTdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoSU5UX01BWC0yKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUJHU3VyZmFjZUNvbnRyb2wtPnNob3coKSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtRkdTdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoSU5UX01BWC0xKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbUZHU3VyZmFjZUNvbnRyb2wtPnNldFBvc2l0aW9uKDY0LCA2NCkpOwotICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1GR1N1cmZhY2VDb250cm9sLT5zaG93KCkpOwotCi0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVN5bmNTdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoSU5UX01BWC0xKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVN5bmNTdXJmYWNlQ29udHJvbC0+c2V0UG9zaXRpb24oZGlzcGxheVdpZHRoLTIsCi0gICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodC0yKSk7Ci0gICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbVN5bmNTdXJmYWNlQ29udHJvbC0+c2hvdygpKTsKLQotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24odHJ1ZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgICAgICBtQ29tcG9zZXJDbGllbnQtPmRpc3Bvc2UoKTsKLSAgICAgICAgbUJHU3VyZmFjZUNvbnRyb2wgPSAwOwotICAgICAgICBtRkdTdXJmYWNlQ29udHJvbCA9IDA7Ci0gICAgICAgIG1TeW5jU3VyZmFjZUNvbnRyb2wgPSAwOwotICAgICAgICBtQ29tcG9zZXJDbGllbnQgPSAwOwotICAgIH0KLQotICAgIHZvaWQgd2FpdEZvclBvc3RlZEJ1ZmZlcnMoKSB7Ci0gICAgICAgIC8vIFNpbmNlIHRoZSBzeW5jIHN1cmZhY2UgaXMgaW4gc3luY2hyb25vdXMgbW9kZSAoaS5lLiBkb3VibGUgYnVmZmVyZWQpCi0gICAgICAgIC8vIHBvc3RpbmcgdGhyZWUgYnVmZmVycyB0byBpdCBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QgdHdvCi0gICAgICAgIC8vIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVQYWdlRmxpcCBjYWxscyBoYXZlIGJlZW4gbWFkZSwgd2hpY2ggc2hvdWxkCi0gICAgICAgIC8vIGd1YXJhbnRlZWQgdGhhdCBhIGJ1ZmZlciBwb3N0ZWQgdG8gYW5vdGhlciBTdXJmYWNlIGhhcyBiZWVuIHJldGlyZWQuCi0gICAgICAgIGZpbGxTdXJmYWNlUkdCQTgobVN5bmNTdXJmYWNlQ29udHJvbCwgMzEsIDMxLCAzMSk7Ci0gICAgICAgIGZpbGxTdXJmYWNlUkdCQTgobVN5bmNTdXJmYWNlQ29udHJvbCwgMzEsIDMxLCAzMSk7Ci0gICAgICAgIGZpbGxTdXJmYWNlUkdCQTgobVN5bmNTdXJmYWNlQ29udHJvbCwgMzEsIDMxLCAzMSk7Ci0gICAgfQotCi0gICAgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiBtQ29tcG9zZXJDbGllbnQ7Ci0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1CR1N1cmZhY2VDb250cm9sOwotICAgIHNwPFN1cmZhY2VDb250cm9sPiBtRkdTdXJmYWNlQ29udHJvbDsKLQotICAgIC8vIFRoaXMgc3VyZmFjZSBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXJzIHBvc3RlZCB0bwotICAgIC8vIG1GR1N1cmZhY2VDb250cm9sIGhhdmUgYmVlbiBwaWNrZWQgdXAgYnkgU3VyZmFjZUZsaW5nZXIuCi0gICAgc3A8U3VyZmFjZUNvbnRyb2w+IG1TeW5jU3VyZmFjZUNvbnRyb2w7Ci19OwotCi1URVNUX0YoTGF5ZXJVcGRhdGVUZXN0LCBMYXllck1vdmVXb3JrcykgewotICAgIHNwPFNjcmVlbkNhcHR1cmU+IHNjOwotICAgIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKCJiZWZvcmUgbW92ZSIpOwotICAgICAgICBTY3JlZW5DYXB0dXJlOjpjYXB0dXJlU2NyZWVuKCZzYyk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCAgMCwgIDEyLCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDc1LCAgNzUsIDE5NSwgIDYzLCAgNjMpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCgxNDUsIDE0NSwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgfQotCi0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1GR1N1cmZhY2VDb250cm9sLT5zZXRQb3NpdGlvbigxMjgsIDEyOCkpOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbih0cnVlKTsKLSAgICB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIHJlZmxlY3QgdGhlIG5ldyBwb3NpdGlvbiwgYnV0IG5vdCB0aGUgbmV3IGNvbG9yLgotICAgICAgICBTQ09QRURfVFJBQ0UoImFmdGVyIG1vdmUsIGJlZm9yZSByZWRyYXciKTsKLSAgICAgICAgU2NyZWVuQ2FwdHVyZTo6Y2FwdHVyZVNjcmVlbigmc2MpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCggMjQsICAyNCwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCA3NSwgIDc1LCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoMTQ1LCAxNDUsIDE5NSwgIDYzLCAgNjMpOwotICAgIH0KLQotICAgIGZpbGxTdXJmYWNlUkdCQTgobUZHU3VyZmFjZUNvbnRyb2wsIDYzLCAxOTUsIDYzKTsKLSAgICB3YWl0Rm9yUG9zdGVkQnVmZmVycygpOwotICAgIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgcmVmbGVjdCB0aGUgbmV3IHBvc2l0aW9uIGFuZCB0aGUgbmV3IGNvbG9yLgotICAgICAgICBTQ09QRURfVFJBQ0UoImFmdGVyIHJlZHJhdyIpOwotICAgICAgICBTY3JlZW5DYXB0dXJlOjpjYXB0dXJlU2NyZWVuKCZzYyk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCAyNCwgIDI0LCAgNjMsICA2MywgMTk1KTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoIDc1LCAgNzUsICA2MywgIDYzLCAxOTUpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCgxNDUsIDE0NSwgIDYzLCAxOTUsICA2Myk7Ci0gICAgfQotfQotCi1URVNUX0YoTGF5ZXJVcGRhdGVUZXN0LCBMYXllclJlc2l6ZVdvcmtzKSB7Ci0gICAgc3A8U2NyZWVuQ2FwdHVyZT4gc2M7Ci0gICAgewotICAgICAgICBTQ09QRURfVFJBQ0UoImJlZm9yZSByZXNpemUiKTsKLSAgICAgICAgU2NyZWVuQ2FwdHVyZTo6Y2FwdHVyZVNjcmVlbigmc2MpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCggIDAsICAxMiwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCA3NSwgIDc1LCAxOTUsICA2MywgIDYzKTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoMTQ1LCAxNDUsICA2MywgIDYzLCAxOTUpOwotICAgIH0KLQotICAgIEFMT0dEKCJyZXNpemluZyIpOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtRkdTdXJmYWNlQ29udHJvbC0+c2V0U2l6ZSgxMjgsIDEyOCkpOwotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6Y2xvc2VHbG9iYWxUcmFuc2FjdGlvbih0cnVlKTsKLSAgICBBTE9HRCgicmVzaXplZCIpOwotICAgIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IHJlZmxlY3QgdGhlIG5ldyBzaXplIG9yIGNvbG9yIGJlY2F1c2UgU3VyZmFjZUZsaW5nZXIKLSAgICAgICAgLy8gaGFzIG5vdCB5ZXQgcmVjZWl2ZWQgYSBidWZmZXIgb2YgdGhlIGNvcnJlY3Qgc2l6ZS4KLSAgICAgICAgU0NPUEVEX1RSQUNFKCJhZnRlciByZXNpemUsIGJlZm9yZSByZWRyYXciKTsKLSAgICAgICAgU2NyZWVuQ2FwdHVyZTo6Y2FwdHVyZVNjcmVlbigmc2MpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCggIDAsICAxMiwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCA3NSwgIDc1LCAxOTUsICA2MywgIDYzKTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoMTQ1LCAxNDUsICA2MywgIDYzLCAxOTUpOwotICAgIH0KLQotICAgIEFMT0dEKCJkcmF3aW5nIik7Ci0gICAgZmlsbFN1cmZhY2VSR0JBOChtRkdTdXJmYWNlQ29udHJvbCwgNjMsIDE5NSwgNjMpOwotICAgIHdhaXRGb3JQb3N0ZWRCdWZmZXJzKCk7Ci0gICAgQUxPR0QoImRyYXduIik7Ci0gICAgewotICAgICAgICAvLyBUaGlzIHNob3VsZCByZWZsZWN0IHRoZSBuZXcgc2l6ZSBhbmQgdGhlIG5ldyBjb2xvci4KLSAgICAgICAgU0NPUEVEX1RSQUNFKCJhZnRlciByZWRyYXciKTsKLSAgICAgICAgU2NyZWVuQ2FwdHVyZTo6Y2FwdHVyZVNjcmVlbigmc2MpOwotICAgICAgICBzYy0+Y2hlY2tQaXhlbCggMjQsICAyNCwgIDYzLCAgNjMsIDE5NSk7Ci0gICAgICAgIHNjLT5jaGVja1BpeGVsKCA3NSwgIDc1LCAgNjMsIDE5NSwgIDYzKTsKLSAgICAgICAgc2MtPmNoZWNrUGl4ZWwoMTQ1LCAxNDUsICA2MywgMTk1LCAgNjMpOwotICAgIH0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvcmVzaXplL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9yZXNpemUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxNjc5ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9yZXNpemUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlyZXNpemUuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmN1dGlscyBcCi0JbGlidXRpbHMgXAotICAgIGxpYnVpIFwKLSAgICBsaWJndWkKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC1yZXNpemUKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9yZXNpemUvcmVzaXplLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3Jlc2l6ZS9yZXNpemUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQzYjNkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3Jlc2l6ZS9yZXNpemUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxjdXRpbHMvbWVtb3J5Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIC8vIHNldCB1cCB0aGUgdGhyZWFkLXBvb2wKLSAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwotICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLQotICAgIC8vIGNyZWF0ZSBhIGNsaWVudCB0byBzdXJmYWNlZmxpbmdlcgotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCgpOwotICAgIAotICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBjbGllbnQtPmNyZWF0ZVN1cmZhY2UoMCwgMTYwLCAyNDAsCi0gICAgICAgICAgICBQSVhFTF9GT1JNQVRfUkdCXzU2NSk7Ci0KLQotICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6b3Blbkdsb2JhbFRyYW5zYWN0aW9uKCk7Ci0gICAgc3VyZmFjZS0+c2V0TGF5ZXIoMTAwMDAwKTsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgIFN1cmZhY2U6OlN1cmZhY2VJbmZvIGluZm87Ci0gICAgc3VyZmFjZS0+bG9jaygmaW5mbyk7Ci0gICAgc3NpemVfdCBicHIgPSBpbmZvLnMgKiBieXRlc1BlclBpeGVsKGluZm8uZm9ybWF0KTsKLSAgICBhbmRyb2lkX21lbXNldDE2KCh1aW50MTZfdCopaW5mby5iaXRzLCAweEY4MDAsIGJwcippbmZvLmgpOwotICAgIHN1cmZhY2UtPnVubG9ja0FuZFBvc3QoKTsKLQotICAgIHN1cmZhY2UtPmxvY2soJmluZm8pOwotICAgIGFuZHJvaWRfbWVtc2V0MTYoKHVpbnQxNl90KilpbmZvLmJpdHMsIDB4MDdFMCwgYnByKmluZm8uaCk7Ci0gICAgc3VyZmFjZS0+dW5sb2NrQW5kUG9zdCgpOwotCi0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICBzdXJmYWNlLT5zZXRTaXplKDMyMCwgMjQwKTsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmpvaW5UaHJlYWRQb29sKCk7Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9zY3JlZW5jYXAvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3NjcmVlbmNhcC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkMWE4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3NjcmVlbmNhcC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXNjcmVlbmNhcC5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0JbGliYmluZGVyIFwKLQlsaWJza2lhIFwKLSAgICBsaWJ1aSBcCi0gICAgbGliZ3VpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtc2NyZWVuY2FwCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotCWV4dGVybmFsL3NraWEvaW5jbHVkZS9jb3JlIFwKLQlleHRlcm5hbC9za2lhL2luY2x1ZGUvZWZmZWN0cyBcCi0JZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2ltYWdlcyBcCi0JZXh0ZXJuYWwvc2tpYS9zcmMvcG9ydHMgXAotCWV4dGVybmFsL3NraWEvaW5jbHVkZS91dGlscwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3NjcmVlbmNhcC9zY3JlZW5jYXAuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc2NyZWVuY2FwL3NjcmVlbmNhcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTY2ZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvc2NyZWVuY2FwL3NjcmVlbmNhcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KLQotI2luY2x1ZGUgPFNrSW1hZ2VFbmNvZGVyLmg+Ci0jaW5jbHVkZSA8U2tCaXRtYXAuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBpZiAoYXJnYyAhPSAyKSB7Ci0gICAgICAgIHByaW50ZigidXNhZ2U6ICVzIHBhdGhcbiIsIGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDApOwotICAgIH0KLQotICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoIlN1cmZhY2VGbGluZ2VyIik7Ci0gICAgc3A8SVN1cmZhY2VDb21wb3Nlcj4gY29tcG9zZXI7Ci0gICAgZ2V0U2VydmljZShuYW1lLCAmY29tcG9zZXIpOwotCi0gICAgc3A8SU1lbW9yeUhlYXA+IGhlYXA7Ci0gICAgdWludDMyX3QgdywgaDsKLSAgICBQaXhlbEZvcm1hdCBmOwotICAgIHN0YXR1c190IGVyciA9IGNvbXBvc2VyLT5jYXB0dXJlU2NyZWVuKDAsICZoZWFwLCAmdywgJmgsICZmLCAwLCAwKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAic2NyZWVuIGNhcHR1cmUgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICBleGl0KDApOwotICAgIH0KLQotICAgIHByaW50Zigic2NyZWVuIGNhcHR1cmUgc3VjY2Vzczogdz0ldSwgaD0ldSwgcGl4ZWxzPSVwXG4iLAotICAgICAgICAgICAgdywgaCwgaGVhcC0+Z2V0QmFzZSgpKTsKLQotICAgIHByaW50Zigic2F2aW5nIGZpbGUgYXMgUE5HIGluICVzIC4uLlxuIiwgYXJndlsxXSk7Ci0KLSAgICBTa0JpdG1hcCBiOwotICAgIGIuc2V0Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywgdywgaCk7Ci0gICAgYi5zZXRQaXhlbHMoaGVhcC0+Z2V0QmFzZSgpKTsKLSAgICBTa0ltYWdlRW5jb2Rlcjo6RW5jb2RlRmlsZShhcmd2WzFdLCBiLAotICAgICAgICAgICAgU2tJbWFnZUVuY29kZXI6OmtQTkdfVHlwZSwgU2tJbWFnZUVuY29kZXI6OmtEZWZhdWx0UXVhbGl0eSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3N1cmZhY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3N1cmZhY2UvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MDYwZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9zdXJmYWNlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0Jc3VyZmFjZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0JbGliYmluZGVyIFwKLSAgICBsaWJ1aSBcCi0gICAgbGliZ3VpCi0KLUxPQ0FMX01PRFVMRTo9IHRlc3Qtc3VyZmFjZQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3N1cmZhY2Uvc3VyZmFjZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy9zdXJmYWNlL3N1cmZhY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODg3OGY3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3N1cmZhY2Uvc3VyZmFjZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGN1dGlscy9tZW1vcnkuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLQotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oPgotCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQotewotICAgIC8vIHNldCB1cCB0aGUgdGhyZWFkLXBvb2wKLSAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwotICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKLQotICAgIC8vIGNyZWF0ZSBhIGNsaWVudCB0byBzdXJmYWNlZmxpbmdlcgotICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCgpOwotICAgIAotICAgIHNwPFN1cmZhY2VDb250cm9sPiBzdXJmYWNlQ29udHJvbCA9IGNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKLSAgICAgICAgICAgIDAsIDE2MCwgMjQwLCBQSVhFTF9GT1JNQVRfUkdCXzU2NSk7Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpvcGVuR2xvYmFsVHJhbnNhY3Rpb24oKTsKLSAgICBzdXJmYWNlQ29udHJvbC0+c2V0TGF5ZXIoMTAwMDAwKTsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmNsb3NlR2xvYmFsVHJhbnNhY3Rpb24oKTsKLQotICAgIC8vIHByZXRlbmQgaXQgd2VudCBjcm9zcy1wcm9jZXNzCi0gICAgUGFyY2VsIHBhcmNlbDsKLSAgICBTdXJmYWNlQ29udHJvbDo6d3JpdGVTdXJmYWNlVG9QYXJjZWwoc3VyZmFjZUNvbnRyb2wsICZwYXJjZWwpOwotICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7Ci0gICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IFN1cmZhY2U6OnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7Ci0gICAgQU5hdGl2ZVdpbmRvdyogd2luZG93ID0gc3VyZmFjZS5nZXQoKTsKLQotICAgIHByaW50Zigid2luZG93PSVwXG4iLCB3aW5kb3cpOwotCi0gICAgaW50IGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCh3aW5kb3csIDgpOwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlcjsKLQotICAgIGZvciAoaW50IGk9MCA7IGk8OCA7IGkrKykgewotICAgICAgICB3aW5kb3ctPmRlcXVldWVCdWZmZXIod2luZG93LCAmYnVmZmVyKTsKLSAgICAgICAgcHJpbnRmKCJidWZmZXIgJWQ6ICVwXG4iLCBpLCBidWZmZXIpOwotICAgIH0KLQotICAgIHByaW50ZigidGVzdCBjb21wbGV0ZS4gQ1RSTCtDIHRvIGZpbmlzaC5cbiIpOwotCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3RyYW5zZm9ybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdHJhbnNmb3JtL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTlkYWUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdHJhbnNmb3JtL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JVHJhbnNmb3JtVGVzdC5jcHAgXAotCS4uLy4uL1RyYW5zZm9ybS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGliY3V0aWxzIFwKLQlsaWJ1dGlscyBcCi0JbGlidWkgXAotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LXRyYW5zZm9ybQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IC4uLy4uCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdHJhbnNmb3JtL1RyYW5zZm9ybVRlc3QuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdHJhbnNmb3JtL1RyYW5zZm9ybVRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTEyYzRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3RyYW5zZm9ybS9UcmFuc2Zvcm1UZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSAiLi4vLi4vVHJhbnNmb3JtLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgVHJhbnNmb3JtIHRyOTAoVHJhbnNmb3JtOjpST1RfOTApOwotICAgIFRyYW5zZm9ybSB0ckZIKFRyYW5zZm9ybTo6RkxJUF9IKTsKLSAgICBUcmFuc2Zvcm0gdHJGVihUcmFuc2Zvcm06OkZMSVBfVik7Ci0KLSAgICBUcmFuc2Zvcm0gdHI5MEZIKFRyYW5zZm9ybTo6Uk9UXzkwIHwgVHJhbnNmb3JtOjpGTElQX0gpOwotICAgIFRyYW5zZm9ybSB0cjkwRlYoVHJhbnNmb3JtOjpST1RfOTAgfCBUcmFuc2Zvcm06OkZMSVBfVik7Ci0KLSAgICB0cjkwLmR1bXAoInRyOTAiKTsKLSAgICB0ckZILmR1bXAoInRyRkgiKTsKLSAgICB0ckZWLmR1bXAoInRyRlYiKTsKLQotICAgIHRyOTBGSC5kdW1wKCJ0cjkwRkgiKTsKLSAgICB0cjkwRlYuZHVtcCgidHI5MEZWIik7Ci0KLSAgICAodHJGSCp0cjkwKS5kdW1wKCJ0ckZIKnRyOTAiKTsKLSAgICAodHJGVip0cjkwKS5kdW1wKCJ0ckZWKnRyOTAiKTsKLQotICAgICh0cjkwKnRyRkgpLmR1bXAoInRyOTAqdHJGSCIpOwotICAgICh0cjkwKnRyRlYpLmR1bXAoInRyOTAqdHJGViIpOwotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy92c3luYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdnN5bmMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4MTc2MC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy92c3luYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCXZzeW5jLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCWxpYnV0aWxzIFwKLQlsaWJiaW5kZXIgXAotICAgIGxpYnVpIFwKLSAgICBsaWJndWkKLQotTE9DQUxfTU9EVUxFOj0gdGVzdC12c3luYy1ldmVudHMKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy92c3luYy92c3luYy5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci90ZXN0cy92c3luYy92c3luYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDU0YzQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvdnN5bmMvdnN5bmMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxndWkvRGlzcGxheUV2ZW50UmVjZWl2ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb29wZXIuaD4KLQotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Ci0KLWludCByZWNlaXZlcihpbnQgZmQsIGludCBldmVudHMsIHZvaWQqIGRhdGEpCi17Ci0gICAgRGlzcGxheUV2ZW50UmVjZWl2ZXIqIHEgPSAoRGlzcGxheUV2ZW50UmVjZWl2ZXIqKWRhdGE7Ci0KLSAgICBzc2l6ZV90IG47Ci0gICAgRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkV2ZW50IGJ1ZmZlclsxXTsKLQotICAgIHN0YXRpYyBuc2Vjc190IG9sZFRpbWVTdGFtcCA9IDA7Ci0KLSAgICB3aGlsZSAoKG4gPSBxLT5nZXRFdmVudHMoYnVmZmVyLCAxKSkgPiAwKSB7Ci0gICAgICAgIGZvciAoaW50IGk9MCA7IGk8biA7IGkrKykgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcltpXS5oZWFkZXIudHlwZSA9PSBEaXNwbGF5RXZlbnRSZWNlaXZlcjo6RElTUExBWV9FVkVOVF9WU1lOQykgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXZlbnQgdnN5bmM6IGNvdW50PSVkXHQiLCBidWZmZXJbaV0udnN5bmMuY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9sZFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgIGZsb2F0IHQgPSBmbG9hdChidWZmZXJbaV0uaGVhZGVyLnRpbWVzdGFtcCAtIG9sZFRpbWVTdGFtcCkgLyBzMm5zKDEpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJWYgbXMgKCVmIEh6KVxuIiwgdCoxMDAwLCAxLjAvdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbGRUaW1lU3RhbXAgPSBidWZmZXJbaV0uaGVhZGVyLnRpbWVzdGFtcDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobjwwKSB7Ci0gICAgICAgIHByaW50ZigiZXJyb3IgcmVhZGluZyBldmVudHMgKCVzKVxuIiwgc3RyZXJyb3IoLW4pKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLSAgICBEaXNwbGF5RXZlbnRSZWNlaXZlciBteURpc3BsYXlFdmVudDsKLQotCi0gICAgc3A8TG9vcGVyPiBsb29wID0gbmV3IExvb3BlcihmYWxzZSk7Ci0gICAgbG9vcC0+YWRkRmQobXlEaXNwbGF5RXZlbnQuZ2V0RmQoKSwgMCwgQUxPT1BFUl9FVkVOVF9JTlBVVCwgcmVjZWl2ZXIsCi0gICAgICAgICAgICAmbXlEaXNwbGF5RXZlbnQpOwotCi0gICAgbXlEaXNwbGF5RXZlbnQuc2V0VnN5bmNSYXRlKDEpOwotCi0gICAgZG8gewotICAgICAgICAvL3ByaW50ZigiYWJvdXQgdG8gcG9sbC4uLlxuIik7Ci0gICAgICAgIGludDMyX3QgcmV0ID0gbG9vcC0+cG9sbE9uY2UoLTEpOwotICAgICAgICBzd2l0Y2ggKHJldCkgewotICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfV0FLRToKLSAgICAgICAgICAgICAgICAvLygiQUxPT1BFUl9QT0xMX1dBS0VcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfQ0FMTEJBQ0s6Ci0gICAgICAgICAgICAgICAgLy8oIkFMT09QRVJfUE9MTF9DQUxMQkFDS1xuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFMT09QRVJfUE9MTF9USU1FT1VUOgotICAgICAgICAgICAgICAgIHByaW50ZigiQUxPT1BFUl9QT0xMX1RJTUVPVVRcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBTE9PUEVSX1BPTExfRVJST1I6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJBTE9PUEVSX1BPTExfVElNRU9VVFxuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHByaW50ZigidWdoPyBwb2xsIHJldHVybmVkICVkXG4iLCByZXQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoMSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3dhaXRmb3J2c3luYy9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvd2FpdGZvcnZzeW5jL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWY1YWIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvd2FpdGZvcnZzeW5jL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0Jd2FpdGZvcnZzeW5jLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgXAotCi1MT0NBTF9NT0RVTEU6PSB0ZXN0LXdhaXRmb3J2c3luYwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL3Rlc3RzL3dhaXRmb3J2c3luYy93YWl0Zm9ydnN5bmMuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvd2FpdGZvcnZzeW5jL3dhaXRmb3J2c3luYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWI4OGIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvdGVzdHMvd2FpdGZvcnZzeW5jL3dhaXRmb3J2c3luYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9mYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBGQklPX1dBSVRGT1JWU1lOQwotI2RlZmluZSBGQklPX1dBSVRGT1JWU1lOQyAgIF9JT1coJ0YnLCAweDIwLCBfX3UzMikKLSNlbmRpZgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L2dyYXBoaWNzL2ZiMCIsIE9fUkRXUik7Ci0gICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgdWludDMyX3QgY3J0ID0gMDsKLSAgICAgICAgICAgaW50IGVyciA9IGlvY3RsKGZkLCBGQklPX1dBSVRGT1JWU1lOQywgJmNydCk7Ci0gICAgICAgICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICAgICBwcmludGYoIkZCSU9fV0FJVEZPUlZTWU5DIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUoMSk7Ci0gICAgICAgIGNsb3NlKGZkKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvQW5kcm9pZC5tayBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTExNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvQW5kcm9pZC5tawpAQCAtMCwwICsxLDMyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZm5lcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSAkKGNhbGwgYWxsLXJlbmRlcnNjcmlwdC1maWxlcy11bmRlciwgc3JjKQorI0xPQ0FMX1NUQVRJQ19KQVZBX0xJQlJBUklFUyA6PSBhbmRyb2lkLnJlbmRlcnNjcmlwdAorCitMT0NBTF9QQUNLQUdFX05BTUUgOj0gRm91bnRhaW5fdjExCitMT0NBTF9TREtfVkVSU0lPTiA6PSAxMQorCitpbmNsdWRlICQoQlVJTERfUEFDS0FHRSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNGZhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmZvdW50YWluX3YxMSI+CisgICAgPHVzZXMtc2RrIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMTEiIC8+CisgICAgPGFwcGxpY2F0aW9uIAorICAgICAgICBhbmRyb2lkOmxhYmVsPSJGb3VudGFpbl92MTEiCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL3Rlc3RfcGF0dGVybiI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkZvdW50YWluX3YxMSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisgICAgPC9hcHBsaWNhdGlvbj4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvX2luZGV4Lmh0bWwgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvX2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzMjQyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9faW5kZXguaHRtbApAQCAtMCwwICsxLDUgQEAKKzxwPkFuIGV4YW1wbGUgdGhhdCByZW5kZXJzIG1hbnkgZG90cyBvbiB0aGUgc2NyZWVuIHRoYXQgZm9sbG93IGEgdXNlcidzIHRvdWNoLiBUaGUgZG90cyBmYWxsIAordG8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIHdoZW4gdGhlIHVzZXIgcmVsZWFzZXMgdGhlIGZpbmdlci48L3A+CisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkMTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9yZXMvZHJhd2FibGUvdGVzdF9wYXR0ZXJuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5SUy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NTgxMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluUlMuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5mb3VudGFpbl92MTE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKKworcHVibGljIGNsYXNzIEZvdW50YWluUlMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBUlRfQ09VTlQgPSA1MDAwMDsKKworICAgIHB1YmxpYyBGb3VudGFpblJTKCkgeworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisgICAgcHJpdmF0ZSBTY3JpcHRDX2ZvdW50YWluIG1TY3JpcHQ7CisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworCisgICAgICAgIFByb2dyYW1GcmFnbWVudEZpeGVkRnVuY3Rpb24uQnVpbGRlciBwZmIgPSBuZXcgUHJvZ3JhbUZyYWdtZW50Rml4ZWRGdW5jdGlvbi5CdWlsZGVyKHJzKTsKKyAgICAgICAgcGZiLnNldFZhcnlpbmdDb2xvcih0cnVlKTsKKyAgICAgICAgcnMuYmluZFByb2dyYW1GcmFnbWVudChwZmIuY3JlYXRlKCkpOworCisgICAgICAgIFNjcmlwdEZpZWxkX1BvaW50IHBvaW50cyA9IG5ldyBTY3JpcHRGaWVsZF9Qb2ludChtUlMsIFBBUlRfQ09VTlQpOy8vCisgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRpb24uVVNBR0VfR1JBUEhJQ1NfVkVSVEVYKTsKKworICAgICAgICBNZXNoLkFsbG9jYXRpb25CdWlsZGVyIHNtYiA9IG5ldyBNZXNoLkFsbG9jYXRpb25CdWlsZGVyKG1SUyk7CisgICAgICAgIHNtYi5hZGRWZXJ0ZXhBbGxvY2F0aW9uKHBvaW50cy5nZXRBbGxvY2F0aW9uKCkpOworICAgICAgICBzbWIuYWRkSW5kZXhTZXRUeXBlKE1lc2guUHJpbWl0aXZlLlBPSU5UKTsKKyAgICAgICAgTWVzaCBzbSA9IHNtYi5jcmVhdGUoKTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfZm91bnRhaW4obVJTLCBtUmVzLCBSLnJhdy5mb3VudGFpbik7CisgICAgICAgIG1TY3JpcHQuc2V0X3BhcnRNZXNoKHNtKTsKKyAgICAgICAgbVNjcmlwdC5iaW5kX3BvaW50KHBvaW50cyk7CisgICAgICAgIG1SUy5iaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICB9CisKKyAgICBib29sZWFuIGhvbGRpbmdDb2xvcltdID0gbmV3IGJvb2xlYW5bMTBdOworICAgIHB1YmxpYyB2b2lkIG5ld1RvdWNoUG9zaXRpb24oZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcHJlc3N1cmUsIGludCBpZCkgeworICAgICAgICBpZiAoaWQgPj0gaG9sZGluZ0NvbG9yLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCByYXRlID0gKGludCkocHJlc3N1cmUgKiBwcmVzc3VyZSAqIDUwMC5mKTsKKyAgICAgICAgaWYgKHJhdGUgPiA1MDApIHsKKyAgICAgICAgICAgIHJhdGUgPSA1MDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhdGUgPiAwKSB7CisgICAgICAgICAgICBtU2NyaXB0Lmludm9rZV9hZGRQYXJ0aWNsZXMocmF0ZSwgeCwgeSwgaWQsICFob2xkaW5nQ29sb3JbaWRdKTsKKyAgICAgICAgICAgIGhvbGRpbmdDb2xvcltpZF0gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaG9sZGluZ0NvbG9yW2lkXSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9Gb3VudGFpbl92MTEvc3JjL2NvbS9hbmRyb2lkL2ZvdW50YWluL0ZvdW50YWluVmlldy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODIzNzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpblZpZXcuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZm91bnRhaW5fdjExOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7CisKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SU1N1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHRHTDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7CitpbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKKworcHVibGljIGNsYXNzIEZvdW50YWluVmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHVibGljIEZvdW50YWluVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgRm91bnRhaW5SUyBtUmVuZGVyOworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHRHTChzYyk7CisgICAgICAgICAgICBtUlMuc2V0U3VyZmFjZShob2xkZXIsIHcsIGgpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBGb3VudGFpblJTKCk7CisgICAgICAgICAgICBtUmVuZGVyLmluaXQobVJTLCBnZXRSZXNvdXJjZXMoKSwgdywgaCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKKyAgICAgICAgaWYgKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdEdMKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldikKKyAgICB7CisgICAgICAgIGludCBhY3QgPSBldi5nZXRBY3Rpb25NYXNrZWQoKTsKKyAgICAgICAgaWYgKGFjdCA9PSBldi5BQ1RJT05fVVApIHsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBldi5nZXRQb2ludGVySWQoMCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKGFjdCA9PSBNb3Rpb25FdmVudC5BQ1RJT05fUE9JTlRFUl9VUCkgeworICAgICAgICAgICAgLy8gb25seSBvbmUgcG9pbnRlciBnb2luZyB1cCwgd2UgY2FuIGdldCB0aGUgaW5kZXggbGlrZSB0aGlzCisgICAgICAgICAgICBpbnQgcG9pbnRlckluZGV4ID0gZXYuZ2V0QWN0aW9uSW5kZXgoKTsKKyAgICAgICAgICAgIGludCBwb2ludGVySWQgPSBldi5nZXRQb2ludGVySWQocG9pbnRlckluZGV4KTsKKyAgICAgICAgICAgIG1SZW5kZXIubmV3VG91Y2hQb3NpdGlvbigwLCAwLCAwLCBwb2ludGVySWQpOworICAgICAgICB9CisgICAgICAgIGludCBjb3VudCA9IGV2LmdldEhpc3RvcnlTaXplKCk7CisgICAgICAgIGludCBwY291bnQgPSBldi5nZXRQb2ludGVyQ291bnQoKTsKKworICAgICAgICBmb3IgKGludCBwPTA7IHAgPCBwY291bnQ7IHArKykgeworICAgICAgICAgICAgaW50IGlkID0gZXYuZ2V0UG9pbnRlcklkKHApOworICAgICAgICAgICAgbVJlbmRlci5uZXdUb3VjaFBvc2l0aW9uKGV2LmdldFgocCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXYuZ2V0WShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRQcmVzc3VyZShwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtUmVuZGVyLm5ld1RvdWNoUG9zaXRpb24oZXYuZ2V0SGlzdG9yaWNhbFgocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmdldEhpc3RvcmljYWxZKHAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldi5nZXRIaXN0b3JpY2FsUHJlc3N1cmUocCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9Gb3VudGFpbl92MTEuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5fdjExLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwN2IyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vRm91bnRhaW5fdjExLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQuZm91bnRhaW5fdjExOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBGb3VudGFpbl92MTEgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLy9FdmVudExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBFdmVudExpc3RlbmVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJsaWJSU19qbmkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfRU5BQkxFRCA9IERFQlVHID8gQ29uZmlnLkxPR0QgOiBDb25maWcuTE9HVjsKKworICAgIHByaXZhdGUgRm91bnRhaW5WaWV3IG1WaWV3OworCisgICAgLy8gZ2V0IHRoZSBjdXJyZW50IGxvb3BlciAoZnJvbSB5b3VyIEFjdGl2aXR5IFVJIHRocmVhZCBmb3IgaW5zdGFuY2UKKworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgRm91bnRhaW5WaWV3KHRoaXMpOworICAgICAgICBzZXRDb250ZW50VmlldyhtVmlldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN1bWUoKSB7CisgICAgICAgIExvZy5lKCJycyIsICJvblJlc3VtZSIpOworCisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICBMb2cuZSgicnMiLCAib25QYXVzZSIpOworCisgICAgICAgIC8vIElkZWFsbHkgYSBnYW1lIHNob3VsZCBpbXBsZW1lbnQgb25SZXN1bWUoKSBhbmQgb25QYXVzZSgpCisgICAgICAgIC8vIHRvIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHdoZW4gdGhlIGFjdGl2aXR5IGxvb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3LnBhdXNlKCk7CisKKworCisgICAgICAgIC8vUnVudGltZS5nZXRSdW50aW1lKCkuZXhpdCgwKTsKKyAgICB9CisKKworICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAoTE9HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIExvZy52KExPR19UQUcsIG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvRm91bnRhaW5fdjExL3NyYy9jb20vYW5kcm9pZC9mb3VudGFpbi9mb3VudGFpbi5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2Yzg5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL0ZvdW50YWluX3YxMS9zcmMvY29tL2FuZHJvaWQvZm91bnRhaW4vZm91bnRhaW4ucnMKQEAgLTAsMCArMSw2OSBAQAorLy8gRm91bnRhaW4gdGVzdCBzY3JpcHQKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLmZvdW50YWluX3YxMSkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworc3RhdGljIGludCBuZXdQYXJ0ID0gMDsKK3JzX21lc2ggcGFydE1lc2g7CisKK3R5cGVkZWYgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCwgYWxpZ25lZCg0KSkpIFBvaW50IHsKKyAgICBmbG9hdDIgZGVsdGE7CisgICAgZmxvYXQyIHBvc2l0aW9uOworICAgIHVjaGFyNCBjb2xvcjsKK30gUG9pbnRfdDsKK1BvaW50X3QgKnBvaW50OworCitpbnQgcm9vdCgpIHsKKyAgICBmbG9hdCBkdCA9IG1pbihyc0dldER0KCksIDAuMWYpOworICAgIHJzZ0NsZWFyQ29sb3IoMC5mLCAwLmYsIDAuZiwgMS5mKTsKKyAgICBjb25zdCBmbG9hdCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKyAgICBjb25zdCBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgZmxvYXQgZHkyID0gZHQgKiAoMTAuZik7CisgICAgUG9pbnRfdCAqIHAgPSBwb2ludDsKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IHNpemU7IGN0KyspIHsKKyAgICAgICAgcC0+ZGVsdGEueSArPSBkeTI7CisgICAgICAgIHAtPnBvc2l0aW9uICs9IHAtPmRlbHRhOworICAgICAgICBpZiAoKHAtPnBvc2l0aW9uLnkgPiBoZWlnaHQpICYmIChwLT5kZWx0YS55ID4gMCkpIHsKKyAgICAgICAgICAgIHAtPmRlbHRhLnkgKj0gLTAuM2Y7CisgICAgICAgIH0KKyAgICAgICAgcCsrOworICAgIH0KKworICAgIHJzZ0RyYXdNZXNoKHBhcnRNZXNoKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGZsb2F0NCBwYXJ0Q29sb3JbMTBdOwordm9pZCBhZGRQYXJ0aWNsZXMoaW50IHJhdGUsIGZsb2F0IHgsIGZsb2F0IHksIGludCBpbmRleCwgYm9vbCBuZXdDb2xvcikKK3sKKyAgICBpZiAobmV3Q29sb3IpIHsKKyAgICAgICAgcGFydENvbG9yW2luZGV4XS54ID0gcnNSYW5kKDAuNWYsIDEuMGYpOworICAgICAgICBwYXJ0Q29sb3JbaW5kZXhdLnkgPSByc1JhbmQoMS4wZik7CisgICAgICAgIHBhcnRDb2xvcltpbmRleF0ueiA9IHJzUmFuZCgxLjBmKTsKKyAgICB9CisgICAgZmxvYXQgck1heCA9ICgoZmxvYXQpcmF0ZSkgKiAwLjAyZjsKKyAgICBpbnQgc2l6ZSA9IHJzQWxsb2NhdGlvbkdldERpbVgocnNHZXRBbGxvY2F0aW9uKHBvaW50KSk7CisgICAgdWNoYXI0IGMgPSByc1BhY2tDb2xvclRvODg4OChwYXJ0Q29sb3JbaW5kZXhdKTsKKworICAgIFBvaW50X3QgKiBucCA9ICZwb2ludFtuZXdQYXJ0XTsKKyAgICBmbG9hdDIgcCA9IHt4LCB5fTsKKyAgICB3aGlsZSAocmF0ZS0tKSB7CisgICAgICAgIGZsb2F0IGFuZ2xlID0gcnNSYW5kKDMuMTRmICogMi5mKTsKKyAgICAgICAgZmxvYXQgbGVuID0gcnNSYW5kKHJNYXgpOworICAgICAgICBucC0+ZGVsdGEueCA9IGxlbiAqIHNpbihhbmdsZSk7CisgICAgICAgIG5wLT5kZWx0YS55ID0gbGVuICogY29zKGFuZ2xlKTsKKyAgICAgICAgbnAtPnBvc2l0aW9uID0gcDsKKyAgICAgICAgbnAtPmNvbG9yID0gYzsKKyAgICAgICAgbmV3UGFydCsrOworICAgICAgICBucCsrOworICAgICAgICBpZiAobmV3UGFydCA+PSBzaXplKSB7CisgICAgICAgICAgICBuZXdQYXJ0ID0gMDsKKyAgICAgICAgICAgIG5wID0gJnBvaW50W25ld1BhcnRdOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3Jlcy9yYXcvZGlmZnVzZV9saWdodHMuZ2xzbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9kaWZmdXNlX2xpZ2h0cy5nbHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOTNlMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3Jlcy9yYXcvZGlmZnVzZV9saWdodHMuZ2xzbApAQCAtMCwwICsxLDIyIEBACit2YXJ5aW5nIHZlYzMgdmFyV29ybGRQb3M7Cit2YXJ5aW5nIHZlYzMgdmFyV29ybGROb3JtYWw7Cit2YXJ5aW5nIHZlYzIgdmFyVGV4MDsKKwordm9pZCBtYWluKCkgeworCisgICB2ZWMzIFYgPSBub3JtYWxpemUoVU5JX2NhbWVyYVBvcy54eXogLSB2YXJXb3JsZFBvcy54eXopOworICAgdmVjMyB3b3JsZE5vcm0gPSBub3JtYWxpemUodmFyV29ybGROb3JtYWwpOworCisgICB2ZWMzIGxpZ2h0MFZlYyA9IG5vcm1hbGl6ZShVTklfbGlnaHRQb3NfMC54eXogLSB2YXJXb3JsZFBvcy54eXopOworICAgZmxvYXQgbGlnaHQwX0RpZmZ1c2UgPSBjbGFtcChkb3Qod29ybGROb3JtLCBsaWdodDBWZWMpLCAwLjAsIDEuMCk7CisKKyAgIHZlYzMgbGlnaHQxVmVjID0gbm9ybWFsaXplKFVOSV9saWdodFBvc18xLnh5eiAtIHZhcldvcmxkUG9zLnh5eik7CisgICBmbG9hdCBsaWdodDFfRGlmZnVzZSA9IGNsYW1wKGRvdCh3b3JsZE5vcm0sIGxpZ2h0MVZlYyksIDAuMCwgMS4wKTsKKworICAgdmVjMiB0MCA9IHZhclRleDAueHk7CisgICBsb3dwIHZlYzQgY29sID0gVU5JX2RpZmZ1c2U7CisgICBjb2wueHl6ID0gY29sLnh5eiAqIChsaWdodDBfRGlmZnVzZSAqIFVOSV9saWdodENvbG9yXzAueHl6ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0MV9EaWZmdXNlICogVU5JX2xpZ2h0Q29sb3JfMS54eXopOworICAgZ2xfRnJhZ0NvbG9yID0gY29sOworfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3Jlcy9yYXcvc2hhZGVyMnYuZ2xzbCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9zaGFkZXIydi5nbHNsCmluZGV4IDFlYTIzNGYuLjc5MTBhNTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9zaGFkZXIydi5nbHNsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvcmVzL3Jhdy9zaGFkZXIydi5nbHNsCkBAIC0xLDMgKzEsOCBAQAorLyoKKyAgICByc19tYXRyaXg0eDQgbW9kZWw7CisgICAgcnNfbWF0cml4NHg0IHZpZXdQcm9qOworKi8KKwogdmFyeWluZyB2ZWMzIHZhcldvcmxkUG9zOwogdmFyeWluZyB2ZWMzIHZhcldvcmxkTm9ybWFsOwogdmFyeWluZyB2ZWMyIHZhclRleDA7CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1NpbXBsZUFwcFZpZXcuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvU2ltcGxlQXBwVmlldy5qYXZhCmluZGV4IDA1M2U1NDUuLjIxMTIxODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvU2ltcGxlQXBwVmlldy5qYXZhCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvU2ltcGxlQXBwVmlldy5qYXZhCkBAIC00MSw2ICs0MSw3IEBACiAgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgewogICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CiAgICAgICAgICAgICBzYy5zZXREZXB0aCgxNiwgMjQpOworICAgICAgICAgICAgc2Muc2V0U2FtcGxlcygxLCAyLCAxKTsKICAgICAgICAgICAgIG1SUyA9IGNyZWF0ZVJlbmRlclNjcmlwdEdMKHNjKTsKICAgICAgICAgICAgIG1SUy5zZXRTdXJmYWNlKGhvbGRlciwgdywgaCk7CiAgICAgICAgICAgICBtUmVuZGVyID0gbmV3IFNpbXBsZUFwcFJTKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1Rlc3RBcHBSUy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9UZXN0QXBwUlMuamF2YQppbmRleCBmMTU5ZTg1Li4zYWE4MGY0IDEwMDY0NAotLS0gYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1Rlc3RBcHBSUy5qYXZhCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVGVzdEFwcFJTLmphdmEKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAvLyBTaGFkZXJzCiAgICAgcHJpdmF0ZSBGcmFnbWVudFNoYWRlciBtUGFpbnRGOwogICAgIHByaXZhdGUgRnJhZ21lbnRTaGFkZXIgbUxpZ2h0c0Y7CisgICAgcHJpdmF0ZSBGcmFnbWVudFNoYWRlciBtTGlnaHRzRGlmZkY7CiAgICAgcHJpdmF0ZSBGcmFnbWVudFNoYWRlciBtQWx1bWludW1GOwogICAgIHByaXZhdGUgRnJhZ21lbnRTaGFkZXIgbVBsYXN0aWNGOwogICAgIHByaXZhdGUgRnJhZ21lbnRTaGFkZXIgbURpZmZ1c2VGOwpAQCAtMTczLDYgKzE3NCwxMSBAQAogICAgICAgICBmYi5zZXRTaGFkZXIobVJlcywgUi5yYXcucGxhc3RpY19saWdodHMpOwogICAgICAgICBtTGlnaHRzRiA9IGZiLmNyZWF0ZSgpOwogCisgICAgICAgIGZiID0gbmV3IEZyYWdtZW50U2hhZGVyLkJ1aWxkZXIobVJTKTsKKyAgICAgICAgZmIuc2V0T2JqZWN0Q29uc3QobGlnaHRQYXJhbXMuZ2V0QWxsb2NhdGlvbigpLmdldFR5cGUoKSk7CisgICAgICAgIGZiLnNldFNoYWRlcihtUmVzLCBSLnJhdy5kaWZmdXNlX2xpZ2h0cyk7CisgICAgICAgIG1MaWdodHNEaWZmRiA9IGZiLmNyZWF0ZSgpOworCiAgICAgICAgIEZ1bGxzY3JlZW5CbHVyLmluaXRTaGFkZXJzKG1SZXMsIG1SUyk7CiAgICAgfQogCkBAIC0yMDMsNiArMjA5LDcgQEAKICAgICBwcml2YXRlIHZvaWQgYWRkU2hhZGVyc1RvU2NlbmUoKSB7CiAgICAgICAgIG1BY3RpdmVTY2VuZS5hcHBlbmRTaGFkZXIobVBhaW50Rik7CiAgICAgICAgIG1BY3RpdmVTY2VuZS5hcHBlbmRTaGFkZXIobUxpZ2h0c0YpOworICAgICAgICBtQWN0aXZlU2NlbmUuYXBwZW5kU2hhZGVyKG1MaWdodHNEaWZmRik7CiAgICAgICAgIG1BY3RpdmVTY2VuZS5hcHBlbmRTaGFkZXIobUFsdW1pbnVtRik7CiAgICAgICAgIG1BY3RpdmVTY2VuZS5hcHBlbmRTaGFkZXIobVBsYXN0aWNGKTsKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFwcGVuZFNoYWRlcihtRGlmZnVzZUYpOwpAQCAtMjE5LDggKzIyNiwxMiBAQAogICAgICAgICBSZW5kZXJTdGF0ZSBwYWludCA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1QYWludEYsIG51bGwsIG51bGwpOwogICAgICAgICBSZW5kZXJTdGF0ZSBhbHVtaW51bSA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1BbHVtaW51bUYsIG51bGwsIG51bGwpOwogICAgICAgICBSZW5kZXJTdGF0ZSBsaWdodHMgPSBuZXcgUmVuZGVyU3RhdGUobUdlbmVyaWNWLCBtTGlnaHRzRiwgbnVsbCwgbnVsbCk7CisgICAgICAgIFJlbmRlclN0YXRlIGRpZmZfbGlnaHRzID0gbmV3IFJlbmRlclN0YXRlKG1HZW5lcmljViwgbUxpZ2h0c0RpZmZGLCBudWxsLCBudWxsKTsKKyAgICAgICAgUmVuZGVyU3RhdGUgZGlmZl9saWdodHNfbm9fY3VsbCA9IG5ldyBSZW5kZXJTdGF0ZShtR2VuZXJpY1YsIG1MaWdodHNEaWZmRiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtUmFzdGVyLkNVTExfTk9ORShtUlMpKTsKICAgICAgICAgUmVuZGVyU3RhdGUgZ2xhc3NUcmFuc3AgPSBuZXcgUmVuZGVyU3RhdGUobUdlbmVyaWNWLCBtUGFpbnRGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9ncmFtU3RvcmUuQkxFTkRfQUxQSEFfREVQVEhfVEVTVChtUlMpLCBudWxsKTsKKyAgICAgICAgUmVuZGVyU3RhdGUgdGV4U3RhdGUgPSBuZXcgUmVuZGVyU3RhdGUobUdlbmVyaWNWLCBtVGV4dHVyZUYsIG51bGwsIG51bGwpOwogCiAgICAgICAgIGluaXRSZW5kZXJQYXNzZXMoKTsKIApAQCAtMjM5LDEwICsyNTAsMTIgQEAKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFzc2lnblJlbmRlclN0YXRlVG9NYXRlcmlhbChnbGFzc1RyYW5zcCwgIl5HbGFzc0xpZ2h0Iik7CiAKICAgICAgICAgbUFjdGl2ZVNjZW5lLmFzc2lnblJlbmRlclN0YXRlVG9NYXRlcmlhbChsaWdodHMsICJeTGlnaHRCbGlubiIpOworICAgICAgICBtQWN0aXZlU2NlbmUuYXNzaWduUmVuZGVyU3RhdGVUb01hdGVyaWFsKGRpZmZfbGlnaHRzLCAiXkxpZ2h0TGFtYmVydCIpOworICAgICAgICBtQWN0aXZlU2NlbmUuYXNzaWduUmVuZGVyU3RhdGVUb01hdGVyaWFsKGRpZmZfbGlnaHRzX25vX2N1bGwsICJeTGlnaHRMYW1iZXJ0Tm9DdWxsIik7CisgICAgICAgIG1BY3RpdmVTY2VuZS5hc3NpZ25SZW5kZXJTdGF0ZVRvTWF0ZXJpYWwodGV4U3RhdGUsICJeVGV4dHVyZU9ubHkiKTsKIAogICAgICAgICBSZW5kZXJhYmxlIHBsYW5lID0gKFJlbmRlcmFibGUpbUFjdGl2ZVNjZW5lLmdldFJlbmRlcmFibGVCeU5hbWUoInBQbGFuZVNoYXBlMSIpOwogICAgICAgICBpZiAocGxhbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgUmVuZGVyU3RhdGUgdGV4U3RhdGUgPSBuZXcgUmVuZGVyU3RhdGUobUdlbmVyaWNWLCBtVGV4dHVyZUYsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgcGxhbmUuc2V0UmVuZGVyU3RhdGUodGV4U3RhdGUpOwogICAgICAgICAgICAgcGxhbmUuc2V0VmlzaWJsZSghbVVzZUJsdXIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1Rlc3RBcHBWaWV3LmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1Rlc3RBcHBWaWV3LmphdmEKaW5kZXggNjg3ZjM1Yi4uMzNjYTFiOCAxMDA2NDQKLS0tIGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9UZXN0QXBwVmlldy5qYXZhCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVGVzdEFwcFZpZXcuamF2YQpAQCAtNTksNiArNTksNyBAQAogICAgICAgICBpZiAobVJTID09IG51bGwpIHsKICAgICAgICAgICAgIFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcgc2MgPSBuZXcgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZygpOwogICAgICAgICAgICAgc2Muc2V0RGVwdGgoMTYsIDI0KTsKKyAgICAgICAgICAgIHNjLnNldFNhbXBsZXMoMSwgMiwgMSk7CiAgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHRHTChzYyk7CiAgICAgICAgICAgICBtUlMuc2V0U3VyZmFjZShob2xkZXIsIHcsIGgpOwogICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBUZXN0QXBwUlMoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVG91Y2hIYW5kbGVyLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy9TY2VuZUdyYXBoL3NyYy9jb20vYW5kcm9pZC90ZXN0YXBwL1RvdWNoSGFuZGxlci5qYXZhCmluZGV4IGUyNzJjYzUuLmQwZjk3OTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL1NjZW5lR3JhcGgvc3JjL2NvbS9hbmRyb2lkL3Rlc3RhcHAvVG91Y2hIYW5kbGVyLmphdmEKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvU2NlbmVHcmFwaC9zcmMvY29tL2FuZHJvaWQvdGVzdGFwcC9Ub3VjaEhhbmRsZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogICAgIHB1YmxpYyB2b2lkIGluaXQoU2NlbmUgc2NlbmUpIHsKICAgICAgICAgLy8gU29tZSBpbml0aWFsIHZhbHVlcyBmb3IgY2FtZXJhIHBvc2l0aW9uCiAgICAgICAgIG1Sb3RhdGVYVmFsdWUgPSAtMjA7Ci0gICAgICAgIG1Sb3RhdGVZVmFsdWUgPSA0NTsKKyAgICAgICAgbVJvdGF0ZVlWYWx1ZSA9IDA7CiAgICAgICAgIG1EaXN0VmFsdWUgPSBuZXcgRmxvYXQzKDAsIDAsIDQ1KTsKICAgICAgICAgbVBvc1ZhbHVlID0gbmV3IEZsb2F0MygwLCA0LCAwKTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL0FuZHJvaWQubWsgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E0MjliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWZuZXEgKCQoVEFSR0VUX1NJTVVMQVRPUiksdHJ1ZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFJTVGVzdF92MTEKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDExCisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGFlZGEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQucnMudGVzdF92MTEiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjExIiAvPgorICAgIDxhcHBsaWNhdGlvbiAKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JTX1Rlc3RfdjExIgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSU1Rlc3RfdjExIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3Jlcy9kcmF3YWJsZS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvcmVzL2RyYXdhYmxlL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4Y2ZlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKKworCitwdWJsaWMgY2xhc3MgUlNUZXN0Q29yZSB7CisgICAgaW50IG1XaWR0aDsKKyAgICBpbnQgbUhlaWdodDsKKyAgICBDb250ZXh0IG1DdHg7CisKKyAgICBwdWJsaWMgUlNUZXN0Q29yZShDb250ZXh0IGN0eCkgeworICAgICAgICBtQ3R4ID0gY3R4OworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBSZW5kZXJTY3JpcHRHTCBtUlM7CisKKyAgICBwcml2YXRlIEZvbnQgbUZvbnQ7CisgICAgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zIG1MaXN0QWxsb2NzOworICAgIGludCBtTGFzdFg7CisgICAgaW50IG1MYXN0WTsKKyAgICBwcml2YXRlIFNjcmlwdENfcnNsaXN0IG1TY3JpcHQ7CisKKyAgICBwcml2YXRlIEFycmF5TGlzdDxVbml0VGVzdD4gdW5pdFRlc3RzOworICAgIHByaXZhdGUgTGlzdEl0ZXJhdG9yPFVuaXRUZXN0PiB0ZXN0X2l0ZXI7CisgICAgcHJpdmF0ZSBVbml0VGVzdCBhY3RpdmVUZXN0OworICAgIHByaXZhdGUgYm9vbGVhbiBzdG9wVGVzdGluZzsKKworICAgIC8qIFBlcmlvZGljIHRpbWVyIGZvciBlbnN1cmluZyBmdXR1cmUgdGVzdHMgZ2V0IHNjaGVkdWxlZCAqLworICAgIHByaXZhdGUgVGltZXIgbVRpbWVyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTX1RJTUVSX1BFUklPRCA9IDEwMDsKKworICAgIHB1YmxpYyB2b2lkIGluaXQoUmVuZGVyU2NyaXB0R0wgcnMsIFJlc291cmNlcyByZXMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgICAgICBtUlMgPSByczsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICAgICAgbVdpZHRoID0gd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIHN0b3BUZXN0aW5nID0gZmFsc2U7CisKKyAgICAgICAgbVNjcmlwdCA9IG5ldyBTY3JpcHRDX3JzbGlzdChtUlMsIG1SZXMsIFIucmF3LnJzbGlzdCk7CisKKyAgICAgICAgdW5pdFRlc3RzID0gbmV3IEFycmF5TGlzdDxVbml0VGVzdD4oKTsKKworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9wcmltaXRpdmVzKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcnNkZWJ1Zyh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3JzdGltZSh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3JzdHlwZXModGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9tYXRoKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfZnBfbWFkKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgLyoKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QobnVsbCwgIjxQYXNzPiIsIDEpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QoKSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KG51bGwsICI8RmFpbD4iLCAtMSkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgeworICAgICAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVW5pdFRlc3QobnVsbCwgIjxQYXNzPiIsIDEpKTsKKyAgICAgICAgfQorICAgICAgICAqLworCisgICAgICAgIFVuaXRUZXN0IFtdIHV0YSA9IG5ldyBVbml0VGVzdFt1bml0VGVzdHMuc2l6ZSgpXTsKKyAgICAgICAgdXRhID0gdW5pdFRlc3RzLnRvQXJyYXkodXRhKTsKKworICAgICAgICBtTGlzdEFsbG9jcyA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MobVJTLCB1dGEubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1dGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIGxpc3RFbGVtID0gbmV3IFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtKCk7CisgICAgICAgICAgICBsaXN0RWxlbS50ZXh0ID0gQWxsb2NhdGlvbi5jcmVhdGVGcm9tU3RyaW5nKG1SUywgdXRhW2ldLm5hbWUsIEFsbG9jYXRpb24uVVNBR0VfU0NSSVBUKTsKKyAgICAgICAgICAgIGxpc3RFbGVtLnJlc3VsdCA9IHV0YVtpXS5yZXN1bHQ7CisgICAgICAgICAgICBtTGlzdEFsbG9jcy5zZXQobGlzdEVsZW0sIGksIGZhbHNlKTsKKyAgICAgICAgICAgIHV0YVtpXS5zZXRJdGVtKGxpc3RFbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworCisgICAgICAgIG1Gb250ID0gRm9udC5jcmVhdGUobVJTLCBtUmVzLCAic2VyaWYiLCBGb250LlN0eWxlLkJPTEQsIDgpOworICAgICAgICBtU2NyaXB0LnNldF9nRm9udChtRm9udCk7CisKKyAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworCisgICAgICAgIHRlc3RfaXRlciA9IHVuaXRUZXN0cy5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7IC8qIEtpY2sgb2ZmIHRoZSBmaXJzdCB0ZXN0ICovCisKKyAgICAgICAgVGltZXJUYXNrIHBUYXNrID0gbmV3IFRpbWVyVGFzaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtVGltZXIgPSBuZXcgVGltZXIoKTsKKyAgICAgICAgbVRpbWVyLnNjaGVkdWxlKHBUYXNrLCBSU19USU1FUl9QRVJJT0QsIFJTX1RJTUVSX1BFUklPRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tBbmRSdW5OZXh0VGVzdCgpIHsKKyAgICAgICAgaWYgKGFjdGl2ZVRlc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFhY3RpdmVUZXN0LmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgIC8qIFByb3Blcmx5IGNsZWFuIHVwIG9uIG91ciBsYXN0IHRlc3QgKi8KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUZXN0LmpvaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aXZlVGVzdCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXN0b3BUZXN0aW5nICYmIGFjdGl2ZVRlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHRlc3RfaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0ID0gdGVzdF9pdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVUZXN0LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgLyogVGhpcyByb3V0aW5lIHdpbGwgb25seSBnZXQgY2FsbGVkIG9uY2Ugd2hlbiBhIG5ldyB0ZXN0CisgICAgICAgICAgICAgICAgICogc2hvdWxkIHN0YXJ0IHJ1bm5pbmcuIFRoZSBtZXNzYWdlIGhhbmRsZXIgaW4gVW5pdFRlc3QuamF2YQorICAgICAgICAgICAgICAgICAqIGVuc3VyZXMgdGhpcy4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtVGltZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgICAgICAgICBtVGltZXIgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hUZXN0UmVzdWx0cygpIHsKKyAgICAgICAgY2hlY2tBbmRSdW5OZXh0VGVzdCgpOworCisgICAgICAgIGlmIChtTGlzdEFsbG9jcyAhPSBudWxsICYmIG1TY3JpcHQgIT0gbnVsbCAmJiBtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUxpc3RBbGxvY3MuY29weUFsbCgpOworCisgICAgICAgICAgICBtU2NyaXB0LmJpbmRfZ0xpc3QobUxpc3RBbGxvY3MpOworICAgICAgICAgICAgbVJTLmJpbmRSb290U2NyaXB0KG1TY3JpcHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgc3RvcFRlc3RpbmcgPSB0cnVlOworICAgICAgICBVbml0VGVzdCB0ID0gYWN0aXZlVGVzdDsKKworICAgICAgICAvKiBTdG9wIHBlcmlvZGljIHJlZnJlc2ggb2YgdGVzdGluZyAqLworICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1UaW1lci5jYW5jZWwoKTsKKyAgICAgICAgICAgIG1UaW1lci5wdXJnZSgpOworICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFdhaXQgdG8gZXhpdCB1bnRpbCB3ZSBmaW5pc2ggdGhlIGN1cnJlbnQgdGVzdCAqLworICAgICAgICBpZiAodCAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHQuam9pbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQgPSBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBuZXdUb3VjaFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHByZXNzdXJlLCBpbnQgaWQpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFjdGlvbkRvd24oaW50IHgsIGludCB5KSB7CisgICAgICAgIG1TY3JpcHQuc2V0X2dEWSgwLjBmKTsKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Nb3ZlKGludCB4LCBpbnQgeSkgeworICAgICAgICBpbnQgZHggPSBtTGFzdFggLSB4OworICAgICAgICBpbnQgZHkgPSBtTGFzdFkgLSB5OworCisgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPD0gMikgeworICAgICAgICAgICAgZHkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0RZKGR5KTsKKworICAgICAgICBtTGFzdFggPSB4OworICAgICAgICBtTGFzdFkgPSB5OworICAgICAgICByZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0Vmlldy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJlYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxMTsKKworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0R0w7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2U7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlN1cmZhY2VWaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7CisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RWaWV3IGV4dGVuZHMgUlNTdXJmYWNlVmlldyB7CisKKyAgICBwcml2YXRlIENvbnRleHQgbUN0eDsKKworICAgIHB1YmxpYyBSU1Rlc3RWaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgbUN0eCA9IGNvbnRleHQ7CisgICAgICAgIC8vc2V0Rm9jdXNhYmxlKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgUmVuZGVyU2NyaXB0R0wgbVJTOworICAgIHByaXZhdGUgUlNUZXN0Q29yZSBtUmVuZGVyOworCisgICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3LCBpbnQgaCkgeworICAgICAgICBzdXBlci5zdXJmYWNlQ2hhbmdlZChob2xkZXIsIGZvcm1hdCwgdywgaCk7CisgICAgICAgIGlmIChtUlMgPT0gbnVsbCkgeworICAgICAgICAgICAgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZyBzYyA9IG5ldyBSZW5kZXJTY3JpcHRHTC5TdXJmYWNlQ29uZmlnKCk7CisgICAgICAgICAgICBtUlMgPSBjcmVhdGVSZW5kZXJTY3JpcHRHTChzYyk7CisgICAgICAgICAgICBtUlMuc2V0U3VyZmFjZShob2xkZXIsIHcsIGgpOworICAgICAgICAgICAgbVJlbmRlciA9IG5ldyBSU1Rlc3RDb3JlKG1DdHgpOworICAgICAgICAgICAgbVJlbmRlci5pbml0KG1SUywgZ2V0UmVzb3VyY2VzKCksIHcsIGgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7CisgICAgICAgIGlmKG1SUyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUmVuZGVyLmNsZWFudXAoKTsKKyAgICAgICAgICAgIG1SUyA9IG51bGw7CisgICAgICAgICAgICBkZXN0cm95UmVuZGVyU2NyaXB0R0woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnQoTW90aW9uRXZlbnQgZXYpCisgICAgeworICAgICAgICBib29sZWFuIHJldCA9IGZhbHNlOworICAgICAgICBpbnQgYWN0ID0gZXYuZ2V0QWN0aW9uKCk7CisgICAgICAgIGlmIChhY3QgPT0gZXYuQUNUSU9OX0RPV04pIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Eb3duKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFjdCA9PSBldi5BQ1RJT05fTU9WRSkgeworICAgICAgICAgICAgbVJlbmRlci5vbkFjdGlvbk1vdmUoKGludClldi5nZXRYKCksIChpbnQpZXYuZ2V0WSgpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RfdjExLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0X3YxMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWRmY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0X3YxMS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUlNTdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQ7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzLlN5c3RlbTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQ29uZmlnOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworCitpbXBvcnQgamF2YS5sYW5nLlJ1bnRpbWU7CisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RfdjExIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8vRXZlbnRMaXN0ZW5lciBtTGlzdGVuZXIgPSBuZXcgRXZlbnRMaXN0ZW5lcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAibGliUlNfam5pIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX0VOQUJMRUQgPSBERUJVRyA/IENvbmZpZy5MT0dEIDogQ29uZmlnLkxPR1Y7CisKKyAgICBwcml2YXRlIFJTVGVzdFZpZXcgbVZpZXc7CisKKyAgICAvLyBnZXQgdGhlIGN1cnJlbnQgbG9vcGVyIChmcm9tIHlvdXIgQWN0aXZpdHkgVUkgdGhyZWFkIGZvciBpbnN0YW5jZQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOworCisgICAgICAgIC8vIENyZWF0ZSBvdXIgUHJldmlldyB2aWV3IGFuZCBzZXQgaXQgYXMgdGhlIGNvbnRlbnQgb2Ygb3VyCisgICAgICAgIC8vIEFjdGl2aXR5CisgICAgICAgIG1WaWV3ID0gbmV3IFJTVGVzdFZpZXcodGhpcyk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KG1WaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKKyAgICAgICAgbVZpZXcucmVzdW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKKyAgICAgICAgLy8gSWRlYWxseSBhIGdhbWUgc2hvdWxkIGltcGxlbWVudCBvblJlc3VtZSgpIGFuZCBvblBhdXNlKCkKKyAgICAgICAgLy8gdG8gdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gd2hlbiB0aGUgYWN0aXZpdHkgbG9zZXMgZm9jdXMKKyAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgICAgICBtVmlldy5wYXVzZSgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAoTE9HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIExvZy52KExPR19UQUcsIG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9mcF9tYWQuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9mcF9tYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDcyYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX2ZwX21hZCBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX2ZwX21hZChSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJGcF9NYWQiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfZnBfbWFkIHMgPSBuZXcgU2NyaXB0Q19mcF9tYWQocFJTLCBtUmVzLCBSLnJhdy5mcF9tYWQpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX2ZwX21hZF90ZXN0KDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX21hdGguamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9tYXRoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UzNTZmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9tYXRoLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTE7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfbWF0aCBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX21hdGgoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAiTWF0aCIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19tYXRoIHMgPSBuZXcgU2NyaXB0Q19tYXRoKHBSUywgbVJlcywgUi5yYXcubWF0aCk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfbWF0aF90ZXN0KDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9wcmltaXRpdmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMzZWZiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9wcmltaXRpdmVzLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3ByaW1pdGl2ZXMgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9wcmltaXRpdmVzKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIlByaW1pdGl2ZXMiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplR2xvYmFscyhTY3JpcHRDX3ByaW1pdGl2ZXMgcykgeworICAgICAgICBmbG9hdCBwRiA9IHMuZ2V0X2Zsb2F0VGVzdCgpOworICAgICAgICBpZiAocEYgIT0gMS45OWYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9mbG9hdFRlc3QoMi45OWYpOworCisgICAgICAgIGRvdWJsZSBwRCA9IHMuZ2V0X2RvdWJsZVRlc3QoKTsKKyAgICAgICAgaWYgKHBEICE9IDIuMDUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9kb3VibGVUZXN0KDMuMDUpOworCisgICAgICAgIGJ5dGUgcEMgPSBzLmdldF9jaGFyVGVzdCgpOworICAgICAgICBpZiAocEMgIT0gLTgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9jaGFyVGVzdCgoYnl0ZSktMTYpOworCisgICAgICAgIHNob3J0IHBTID0gcy5nZXRfc2hvcnRUZXN0KCk7CisgICAgICAgIGlmIChwUyAhPSAtMTYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9zaG9ydFRlc3QoKHNob3J0KS0zMik7CisKKyAgICAgICAgaW50IHBJID0gcy5nZXRfaW50VGVzdCgpOworICAgICAgICBpZiAocEkgIT0gLTMyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfaW50VGVzdCgtNjQpOworCisgICAgICAgIGxvbmcgcEwgPSBzLmdldF9sb25nVGVzdCgpOworICAgICAgICBpZiAocEwgIT0gMTcxNzk4NjkxODRsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfbG9uZ1Rlc3QoMTcxNzk4NjkxODVsKTsKKworICAgICAgICBsb25nIHB1TCA9IHMuZ2V0X3Vsb25nVGVzdCgpOworICAgICAgICBpZiAocHVMICE9IDQ2MTE2ODYwMTg0MjczODc5MDRMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfdWxvbmdUZXN0KDQ2MTE2ODYwMTg0MjczODc5MDNMKTsKKworCisgICAgICAgIGxvbmcgcExMID0gcy5nZXRfbG9uZ2xvbmdUZXN0KCk7CisgICAgICAgIGlmIChwTEwgIT0gNjg3MTk0NzY3MzZMKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcy5zZXRfbG9uZ2xvbmdUZXN0KDY4NzE5NDc2NzM1TCk7CisKKyAgICAgICAgbG9uZyBwdTY0ID0gcy5nZXRfdWludDY0X3RUZXN0KCk7CisgICAgICAgIGlmIChwdTY0ICE9IDExNzE3OTg2OTE4NGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF91aW50NjRfdFRlc3QoMTE3MTc5ODY5MTg1bCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19wcmltaXRpdmVzIHMgPSBuZXcgU2NyaXB0Q19wcmltaXRpdmVzKHBSUywgbVJlcywgUi5yYXcucHJpbWl0aXZlcyk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplR2xvYmFscyhzKSkgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZUdsb2JhbHMgZmFpbGVkCisgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMuaW52b2tlX3ByaW1pdGl2ZXNfdGVzdCgwLCAwKTsKKyAgICAgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnNkZWJ1Zy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzZGVidWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRiYWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzZGVidWcuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxMTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9yc2RlYnVnIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfcnNkZWJ1ZyhSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJyc0RlYnVnIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX3JzZGVidWcgcyA9IG5ldyBTY3JpcHRDX3JzZGVidWcocFJTLCBtUmVzLCBSLnJhdy5yc2RlYnVnKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBzLmludm9rZV90ZXN0X3JzZGVidWcoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnN0aW1lLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnN0aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0YzM5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3RpbWUuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxMTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9yc3RpbWUgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9yc3RpbWUoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAicnNUaW1lIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX3JzdGltZSBzID0gbmV3IFNjcmlwdENfcnN0aW1lKHBSUywgbVJlcywgUi5yYXcucnN0aW1lKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBzLmludm9rZV90ZXN0X3JzdGltZSgwLCAwKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3R5cGVzLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnN0eXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYTk3YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnN0eXBlcy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjExOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3JzdHlwZXMgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9yc3R5cGVzKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgInJzVHlwZXMiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfcnN0eXBlcyBzID0gbmV3IFNjcmlwdENfcnN0eXBlcyhwUlMsIG1SZXMsIFIucmF3LnJzdHlwZXMpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX3Rlc3RfcnN0eXBlcygwLCAwKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VuaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYyZTUzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxMTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUlNNZXNzYWdlSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitwdWJsaWMgY2xhc3MgVW5pdFRlc3QgZXh0ZW5kcyBUaHJlYWQgeworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IHJlc3VsdDsKKyAgICBwcml2YXRlIFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIG1JdGVtOworICAgIHByaXZhdGUgUlNUZXN0Q29yZSBtUlNUQzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbXNnSGFuZGxlZDsKKyAgICBwcm90ZWN0ZWQgQ29udGV4dCBtQ3R4OworCisgICAgLyogVGhlc2UgY29uc3RhbnRzIG11c3QgbWF0Y2ggdGhvc2UgaW4gc2hhcmVkLnJzaCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJTX01TR19URVNUX1BBU1NFRCA9IDEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU19NU0dfVEVTVF9GQUlMRUQgPSAxMDE7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtVGVzdHMgPSAwOworICAgIHB1YmxpYyBpbnQgdGVzdElEOworCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YywgU3RyaW5nIG4sIGludCBpbml0UmVzdWx0LCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtUlNUQyA9IHJzdGM7CisgICAgICAgIG5hbWUgPSBuOworICAgICAgICBtc2dIYW5kbGVkID0gZmFsc2U7CisgICAgICAgIG1DdHggPSBjdHg7CisgICAgICAgIHJlc3VsdCA9IGluaXRSZXN1bHQ7CisgICAgICAgIHRlc3RJRCA9IG51bVRlc3RzKys7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YywgU3RyaW5nIG4sIENvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMocnN0YywgbiwgMCwgY3R4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoUlNUZXN0Q29yZSByc3RjLCBDb250ZXh0IGN0eCkgeworICAgICAgICB0aGlzIChyc3RjLCAiPFVua25vd24+IiwgY3R4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVW5pdFRlc3QoQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdGhpcyAobnVsbCwgY3R4KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUlNNZXNzYWdlSGFuZGxlciBtUnNNZXNzYWdlID0gbmV3IFJTTWVzc2FnZUhhbmRsZXIoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobUlEKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUlNfTVNHX1RFU1RfUEFTU0VEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJTX01TR19URVNUX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLnV0aWwuTG9nLnYoIlJlbmRlclNjcmlwdCIsICJVbml0IHRlc3QgZ290IHVuZXhwZWN0ZWQgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1JdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtSXRlbS5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgbXNnSGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbVJTVEMucmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBJZ25vcmUgdGhlIGNhc2Ugd2hlcmUgb3VyIG1lc3NhZ2UgcmVjZWl2ZXIgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBsZWF2ZSB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGl0IGZpbmlzaGVzIHJ1bm5pbmcgYWxsIG9mIHRoZSB1bml0IHRlc3RzLiAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yTWVzc2FnZSgpIHsKKyAgICAgICAgd2hpbGUgKCFtc2dIYW5kbGVkKSB7CisgICAgICAgICAgICB5aWVsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SXRlbShTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBpdGVtKSB7CisgICAgICAgIG1JdGVtID0gaXRlbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIC8qIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGZvciBlYWNoIHN1YmNsYXNzICovCisgICAgICAgIGlmIChtUlNUQyAhPSBudWxsKSB7CisgICAgICAgICAgICBtUlNUQy5yZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjJiMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycwpAQCAtMCwwICsxLDE3NCBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKK2NvbnN0IGludCBURVNUX0NPVU5UID0gMTsKKworc3RhdGljIGZsb2F0IGRhdGFfZjFbMTAyNV07CitzdGF0aWMgZmxvYXQ0IGRhdGFfZjRbMTAyNV07CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFkNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEgYmlsbGlvbiBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAoMTAwMCAvIDgwKTsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IChkYXRhX2Y0W2ldICogMC4wMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krMV0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsyXSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzNdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs0XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNV0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzZdICogMC4xZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs3XSAqIDAuMDVmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzhdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOV0gKiAwLjAyZiArIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9tYWQ0IE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWFkKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gMjApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gKGRhdGFfZjFbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZCBNIG9wcyIsIDEwMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X25vcm0odWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gbm9ybWFsaXplKGRhdGFfZjRbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbm9ybSBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zaW5jb3M0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMCAvIDQ7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBzaW4oZGF0YV9mNFtpXSkgKiBjb3MoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9zaW5jb3M0IE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvcyh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSBzaW4oZGF0YV9mMVtpXSkgKiBjb3MoZGF0YV9mMVtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9zaW5jb3MgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXAodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IGNsYW1wKGRhdGFfZjFbaV0sIC0xLmYsIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7CisKKyAgICBzdGFydCgpOworICAgIC8vIERvIH4xMDAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChkYXRhX2YxW2ldIDwgLTEuZikgZGF0YV9mMVtpXSA9IC0xLmY7CisgICAgICAgICAgICBpZiAoZGF0YV9mMVtpXSA+IC0xLmYpIGRhdGFfZjFbaV0gPSAxLmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcCByZWYgTSBvcHMiLCAxMDAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2NsYW1wNCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMCAvNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IGNsYW1wKGRhdGFfZjRbaV0sIC0xLmYsIDEuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9jbGFtcDQgTSBvcHMiLCAxMDAuZiAvIHRpbWUpOworfQorCit2b2lkIGZwX21hZF90ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBpbnQgeDsKKyAgICBmb3IgKHg9MDsgeCA8IDEwMjU7IHgrKykgeworICAgICAgICBkYXRhX2YxW3hdID0gKHggJiAweGYpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS54ID0gKHggJiAweGYpICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS55ID0gKHggJiAweGYwKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0ueiA9ICh4ICYgMHgzMykgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLncgPSAoeCAmIDB4NzcpICogMC4xZjsKKyAgICB9CisKKyAgICB0ZXN0X21hZDQoaW5kZXgpOworICAgIHRlc3RfbWFkKGluZGV4KTsKKworICAgIGZvciAoeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmICsgMS5mOworICAgIH0KKworICAgIHRlc3Rfbm9ybShpbmRleCk7CisgICAgdGVzdF9zaW5jb3M0KGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvcyhpbmRleCk7CisgICAgdGVzdF9jbGFtcDQoaW5kZXgpOworICAgIHRlc3RfY2xhbXAoaW5kZXgpOworCisgICAgLy8gVE9ETyBBY3R1YWxseSB2ZXJpZnkgdGVzdCByZXN1bHQgYWNjdXJhY3kKKyAgICByc0RlYnVnKCJmcF9tYWRfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L21hdGgucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODY3YmUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L21hdGgucnMKQEAgLTAsMCArMSwzNDggQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIG1hdGggbGlicmFyeQorCit2b2xhdGlsZSBmbG9hdCBmMTsKK3ZvbGF0aWxlIGZsb2F0MiBmMjsKK3ZvbGF0aWxlIGZsb2F0MyBmMzsKK3ZvbGF0aWxlIGZsb2F0NCBmNDsKKwordm9sYXRpbGUgaW50IGkxOwordm9sYXRpbGUgaW50MiBpMjsKK3ZvbGF0aWxlIGludDMgaTM7Cit2b2xhdGlsZSBpbnQ0IGk0OworCit2b2xhdGlsZSB1aW50IHVpMTsKK3ZvbGF0aWxlIHVpbnQyIHVpMjsKK3ZvbGF0aWxlIHVpbnQzIHVpMzsKK3ZvbGF0aWxlIHVpbnQ0IHVpNDsKKwordm9sYXRpbGUgc2hvcnQgczE7Cit2b2xhdGlsZSBzaG9ydDIgczI7Cit2b2xhdGlsZSBzaG9ydDMgczM7Cit2b2xhdGlsZSBzaG9ydDQgczQ7CisKK3ZvbGF0aWxlIHVzaG9ydCB1czE7Cit2b2xhdGlsZSB1c2hvcnQyIHVzMjsKK3ZvbGF0aWxlIHVzaG9ydDMgdXMzOwordm9sYXRpbGUgdXNob3J0NCB1czQ7CisKK3ZvbGF0aWxlIGNoYXIgYzE7Cit2b2xhdGlsZSBjaGFyMiBjMjsKK3ZvbGF0aWxlIGNoYXIzIGMzOwordm9sYXRpbGUgY2hhcjQgYzQ7CisKK3ZvbGF0aWxlIHVjaGFyIHVjMTsKK3ZvbGF0aWxlIHVjaGFyMiB1YzI7Cit2b2xhdGlsZSB1Y2hhcjMgdWMzOwordm9sYXRpbGUgdWNoYXI0IHVjNDsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUEZOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoZmxvYXQqKSAmZjEpOyAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoZmxvYXQyKikgJmYyKTsgICAgXAorICAgIGYzID0gZm5jKGYzLCAoZmxvYXQzKikgJmYzKTsgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoZmxvYXQ0KikgJmY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMik7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0YoZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9JTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGkyKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGkzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGk0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fSShmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBpMSk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGZuYykgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIsIGYyKTsgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMsIGYzKTsgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUElOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoaW50KikgJmkxKTsgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoaW50MiopICZpMik7ICAgICAgXAorICAgIGYzID0gZm5jKGYzLCAoaW50MyopICZpMyk7ICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoaW50NCopICZpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihmbmMpIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIChpbnQqKSAmaTEpOyAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIsIChpbnQyKikgJmkyKTsgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMsIChpbnQzKikgJmkzKTsgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQsIChpbnQ0KikgJmk0KTsKKworI2RlZmluZSBURVNUX0lOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGkxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGk0ID0gZm5jKGY0KTsKKworCitzdGF0aWMgYm9vbCB0ZXN0X2ZwX21hdGgodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIHN0YXJ0KCk7CisKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3NoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvc3BpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGF0YW4yKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihhdGFuMnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY2JydCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNlaWwpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihjb3B5c2lnbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvc2gpOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3NwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGVyZmMpOworICAgIFRFU1RfRk5fRlVOQ19GTihlcmYpOworICAgIFRFU1RfRk5fRlVOQ19GTihleHApOworICAgIFRFU1RfRk5fRlVOQ19GTihleHAyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwMTApOworICAgIFRFU1RfRk5fRlVOQ19GTihleHBtMSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGZhYnMpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmZGltKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZmxvb3IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihmbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihmbWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YoZm1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtb2QpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QRk4oZnJhY3QpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QSU4oZnJleHApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihoeXBvdCk7CisgICAgVEVTVF9JTl9GVU5DX0ZOKGlsb2diKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4obGRleHApOworICAgIFRFU1RfRk5fRlVOQ19GTl9JKGxkZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGxnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzIpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzFwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKG1hZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihtb2RmKTsKKyAgICAvLyBuYW4KKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obmV4dGFmdGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocG93KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocG93bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHBvd3IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihyZW1haW5kZXIpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9QSU4ocmVtcXVvKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocmludCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKHJvb3RuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocm91bmQpOworICAgIFRFU1RfRk5fRlVOQ19GTihyc3FydCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihzaW5jb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2lucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihzcXJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odHJ1bmMpOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBGQUlMRUQiLCB0aW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIERFQ0xfSU5UKHByZWZpeCkgICAgICAgICAgICBcCit2b2xhdGlsZSBjaGFyIHByZWZpeCMjX2NfMSA9IDE7ICAgICBcCit2b2xhdGlsZSBjaGFyMiBwcmVmaXgjI19jXzIgPSAxOyAgICBcCit2b2xhdGlsZSBjaGFyMyBwcmVmaXgjI19jXzMgPSAxOyAgICBcCit2b2xhdGlsZSBjaGFyNCBwcmVmaXgjI19jXzQgPSAxOyAgICBcCit2b2xhdGlsZSB1Y2hhciBwcmVmaXgjI191Y18xID0gMTsgICBcCit2b2xhdGlsZSB1Y2hhcjIgcHJlZml4IyNfdWNfMiA9IDE7ICBcCit2b2xhdGlsZSB1Y2hhcjMgcHJlZml4IyNfdWNfMyA9IDE7ICBcCit2b2xhdGlsZSB1Y2hhcjQgcHJlZml4IyNfdWNfNCA9IDE7ICBcCit2b2xhdGlsZSBzaG9ydCBwcmVmaXgjI19zXzEgPSAxOyAgICBcCit2b2xhdGlsZSBzaG9ydDIgcHJlZml4IyNfc18yID0gMTsgICBcCit2b2xhdGlsZSBzaG9ydDMgcHJlZml4IyNfc18zID0gMTsgICBcCit2b2xhdGlsZSBzaG9ydDQgcHJlZml4IyNfc180ID0gMTsgICBcCit2b2xhdGlsZSB1c2hvcnQgcHJlZml4IyNfdXNfMSA9IDE7ICBcCit2b2xhdGlsZSB1c2hvcnQyIHByZWZpeCMjX3VzXzIgPSAxOyBcCit2b2xhdGlsZSB1c2hvcnQzIHByZWZpeCMjX3VzXzMgPSAxOyBcCit2b2xhdGlsZSB1c2hvcnQ0IHByZWZpeCMjX3VzXzQgPSAxOyBcCit2b2xhdGlsZSBpbnQgcHJlZml4IyNfaV8xID0gMTsgICAgICBcCit2b2xhdGlsZSBpbnQyIHByZWZpeCMjX2lfMiA9IDE7ICAgICBcCit2b2xhdGlsZSBpbnQzIHByZWZpeCMjX2lfMyA9IDE7ICAgICBcCit2b2xhdGlsZSBpbnQ0IHByZWZpeCMjX2lfNCA9IDE7ICAgICBcCit2b2xhdGlsZSB1aW50IHByZWZpeCMjX3VpXzEgPSAxOyAgICBcCit2b2xhdGlsZSB1aW50MiBwcmVmaXgjI191aV8yID0gMTsgICBcCit2b2xhdGlsZSB1aW50MyBwcmVmaXgjI191aV8zID0gMTsgICBcCit2b2xhdGlsZSB1aW50NCBwcmVmaXgjI191aV80ID0gMTsgICBcCit2b2xhdGlsZSBsb25nIHByZWZpeCMjX2xfMSA9IDE7ICAgICBcCit2b2xhdGlsZSB1bG9uZyBwcmVmaXgjI191bF8xID0gMTsKKworI2RlZmluZSBURVNUX0lOVF9PUF9UWVBFKG9wLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjEiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18xID0gc3JjMV8jI3R5cGUjI18xIG9wIHNyYzJfIyN0eXBlIyNfMTsgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIyIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMiA9IHNyYzFfIyN0eXBlIyNfMiBvcCBzcmMyXyMjdHlwZSMjXzI7ICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiMyIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzMgPSBzcmMxXyMjdHlwZSMjXzMgb3Agc3JjMl8jI3R5cGUjI18zOyAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjQiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI180ID0gc3JjMV8jI3R5cGUjI180IG9wIHNyYzJfIyN0eXBlIyNfNDsKKworI2RlZmluZSBURVNUX0lOVF9PUChvcCkgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBjKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVjKSAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgcykgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCB1cykgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIGkpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdWkpICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yIGwxIiwgaSsrKTsgICAgIFwKK3Jlc19sXzEgPSBzcmMxX2xfMSBvcCBzcmMyX2xfMTsgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciB1bDEiLCBpKyspOyAgICBcCityZXNfdWxfMSA9IHNyYzFfdWxfMSBvcCBzcmMyX3VsXzE7CisKK0RFQ0xfSU5UKHJlcykKK0RFQ0xfSU5UKHNyYzEpCitERUNMX0lOVChzcmMyKQorCitzdGF0aWMgYm9vbCB0ZXN0X2Jhc2ljX29wZXJhdG9ycygpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGludCBpID0gMDsKKworICAgIFRFU1RfSU5UX09QKCspOworICAgIFRFU1RfSU5UX09QKC0pOworICAgIFRFU1RfSU5UX09QKCopOworICAgIFRFU1RfSU5UX09QKC8pOworICAgIFRFU1RfSU5UX09QKCUpOworICAgIFRFU1RfSU5UX09QKDw8KTsKKyAgICBURVNUX0lOVF9PUCg+Pik7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfYmFzaWNfb3BlcmF0b3JzIEZBSUxFRCIsIDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworI2RlZmluZSBURVNUX0NWVCh0bywgZnJvbSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nIGNvbnZlcnQgZnJvbSAiICNmcm9tICIgdG8gIiAjdG8sIDApOyAgIFwKK3RvIyMxID0gZnJvbSMjMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordG8jIzIgPSBjb252ZXJ0XyMjdHlwZSMjMihmcm9tIyMyKTsgICAgICAgICAgICAgICAgICAgICBcCit0byMjMyA9IGNvbnZlcnRfIyN0eXBlIyMzKGZyb20jIzMpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyM0ID0gY29udmVydF8jI3R5cGUjIzQoZnJvbSMjNCk7CisKKyNkZWZpbmUgVEVTVF9DVlRfTUFUUklYKHRvLCB0eXBlKSAgIFwKK1RFU1RfQ1ZUKHRvLCBjLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1YywgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBzLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1cywgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBpLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1aSwgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBmLCB0eXBlKTsgICAgICAgICAgICAgIFwKKworc3RhdGljIGJvb2wgdGVzdF9jb252ZXJ0KCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICBURVNUX0NWVF9NQVRSSVgoYywgY2hhcik7CisgICAgVEVTVF9DVlRfTUFUUklYKHVjLCB1Y2hhcik7CisgICAgVEVTVF9DVlRfTUFUUklYKHMsIHNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodXMsIHVzaG9ydCk7CisgICAgVEVTVF9DVlRfTUFUUklYKGksIGludCk7CisgICAgVEVTVF9DVlRfTUFUUklYKHVpLCB1aW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoZiwgZmxvYXQpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2NvbnZlcnQgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2NvbnZlcnQgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworI2RlZmluZSBJTklUX1BSRUZJWF9UWVBFKHByZWZpeCwgdHlwZSkgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzEgPSAxOyAgICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18yLnggPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfMi55ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzMueCA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18zLnkgPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfMy56ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzQueCA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI180LnkgPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfNC56ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzQudyA9IDE7CisKKyNkZWZpbmUgSU5JVF9UWVBFKHR5cGUpICAgICAgICAgXAorSU5JVF9QUkVGSVhfVFlQRShzcmMxLCB0eXBlKSAgICBcCitJTklUX1BSRUZJWF9UWVBFKHNyYzIsIHR5cGUpICAgIFwKK0lOSVRfUFJFRklYX1RZUEUocmVzLCB0eXBlKQorCisjZGVmaW5lIElOSVRfQUxMICAgIFwKK0lOSVRfVFlQRShjKTsgICAgICAgXAorSU5JVF9UWVBFKHVjKTsgICAgICBcCitJTklUX1RZUEUocyk7ICAgICAgIFwKK0lOSVRfVFlQRSh1cyk7ICAgICAgXAorSU5JVF9UWVBFKGkpOyAgICAgICBcCitJTklUX1RZUEUodWkpOworCit2b2lkIG1hdGhfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBJTklUX0FMTDsKKyAgICBmYWlsZWQgfD0gdGVzdF9jb252ZXJ0KCk7CisgICAgZmFpbGVkIHw9IHRlc3RfZnBfbWF0aChpbmRleCk7CisgICAgZmFpbGVkIHw9IHRlc3RfYmFzaWNfb3BlcmF0b3JzKCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ByaW1pdGl2ZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U0NTFkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzCkBAIC0wLDAgKzEsNjEgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIHByaW1pdGl2ZSB0eXBlcworZmxvYXQgZmxvYXRUZXN0ID0gMS45OWY7Citkb3VibGUgZG91YmxlVGVzdCA9IDIuMDU7CitjaGFyIGNoYXJUZXN0ID0gLTg7CitzaG9ydCBzaG9ydFRlc3QgPSAtMTY7CitpbnQgaW50VGVzdCA9IC0zMjsKK2xvbmcgbG9uZ1Rlc3QgPSAxNzE3OTg2OTE4NGw7IC8vIDEgPDwgMzQKK2xvbmcgbG9uZyBsb25nbG9uZ1Rlc3QgPSA2ODcxOTQ3NjczNmw7IC8vIDEgPDwgMzYKKwordWNoYXIgdWNoYXJUZXN0ID0gODsKK3VzaG9ydCB1c2hvcnRUZXN0ID0gMTY7Cit1aW50IHVpbnRUZXN0ID0gMzI7Cit1bG9uZyB1bG9uZ1Rlc3QgPSA0NjExNjg2MDE4NDI3Mzg3OTA0TDsKK2ludDY0X3QgaW50NjRfdFRlc3QgPSAtMTcxNzk4NjkxODRsOyAvLyAtIDEgPDwgMzQKK3VpbnQ2NF90IHVpbnQ2NF90VGVzdCA9IDExNzE3OTg2OTE4NGw7CisKK3N0YXRpYyBib29sIHRlc3RfcHJpbWl0aXZlX3R5cGVzKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgX1JTX0FTU0VSVChmbG9hdFRlc3QgPT0gMi45OWYpOworICAgIF9SU19BU1NFUlQoZG91YmxlVGVzdCA9PSAzLjA1KTsKKyAgICBfUlNfQVNTRVJUKGNoYXJUZXN0ID09IC0xNik7CisgICAgX1JTX0FTU0VSVChzaG9ydFRlc3QgPT0gLTMyKTsKKyAgICBfUlNfQVNTRVJUKGludFRlc3QgPT0gLTY0KTsKKyAgICBfUlNfQVNTRVJUKGxvbmdUZXN0ID09IDE3MTc5ODY5MTg1bCk7CisgICAgX1JTX0FTU0VSVChsb25nbG9uZ1Rlc3QgPT0gNjg3MTk0NzY3MzVsKTsKKworICAgIF9SU19BU1NFUlQodWNoYXJUZXN0ID09IDgpOworICAgIF9SU19BU1NFUlQodXNob3J0VGVzdCA9PSAxNik7CisgICAgX1JTX0FTU0VSVCh1aW50VGVzdCA9PSAzMik7CisgICAgX1JTX0FTU0VSVCh1bG9uZ1Rlc3QgPT0gNDYxMTY4NjAxODQyNzM4NzkwM0wpOworICAgIF9SU19BU1NFUlQoaW50NjRfdFRlc3QgPT0gLTE3MTc5ODY5MTg0bCk7CisgICAgX1JTX0FTU0VSVCh1aW50NjRfdFRlc3QgPT0gMTE3MTc5ODY5MTg1bCk7CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9wcmltaXRpdmVzIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9wcmltaXRpdmVzIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgcHJpbWl0aXZlc190ZXN0KHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZhaWxlZCB8PSB0ZXN0X3ByaW1pdGl2ZV90eXBlcyhpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2RlYnVnLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzZGVidWcucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5NDJhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2RlYnVnLnJzCkBAIC0wLDAgKzEsNTYgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIHByaW1pdGl2ZSB0eXBlcworZmxvYXQgZmxvYXRUZXN0ID0gMS45OWY7Citkb3VibGUgZG91YmxlVGVzdCA9IDIuMDU7CitjaGFyIGNoYXJUZXN0ID0gLTg7CitzaG9ydCBzaG9ydFRlc3QgPSAtMTY7CitpbnQgaW50VGVzdCA9IC0zMjsKK2xvbmcgbG9uZ1Rlc3QgPSAxNzE3OTg2OTE4NGw7IC8vIDEgPDwgMzQKK2xvbmcgbG9uZyBsb25nbG9uZ1Rlc3QgPSA2ODcxOTQ3NjczNmw7IC8vIDEgPDwgMzYKKwordWNoYXIgdWNoYXJUZXN0ID0gODsKK3VzaG9ydCB1c2hvcnRUZXN0ID0gMTY7Cit1aW50IHVpbnRUZXN0ID0gMzI7Cit1bG9uZyB1bG9uZ1Rlc3QgPSA0NjExNjg2MDE4NDI3Mzg3OTA0TDsKK2ludDY0X3QgaW50NjRfdFRlc3QgPSAtMTcxNzk4NjkxODRsOyAvLyAtIDEgPDwgMzQKK3VpbnQ2NF90IHVpbnQ2NF90VGVzdCA9IDExNzE3OTg2OTE4NGw7CisKK3N0YXRpYyBib29sIGJhc2ljX3Rlc3QodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgLy8gVGhpcyB0ZXN0IGZvY3VzZXMgcHJpbWFyaWx5IG9uIGNvbXBpbGF0aW9uLXRpbWUsIG5vdCBydW4tdGltZS4KKyAgICAvLyBGb3IgdGhpcyByZWFzb24sIG5vbmUgb2YgdGhlIG91dHB1dHMgYXJlIGFjdHVhbGx5IGNoZWNrZWQuCisKKyAgICByc0RlYnVnKCJmbG9hdFRlc3QiLCBmbG9hdFRlc3QpOworICAgIHJzRGVidWcoImRvdWJsZVRlc3QiLCBkb3VibGVUZXN0KTsKKyAgICByc0RlYnVnKCJjaGFyVGVzdCIsIGNoYXJUZXN0KTsKKyAgICByc0RlYnVnKCJzaG9ydFRlc3QiLCBzaG9ydFRlc3QpOworICAgIHJzRGVidWcoImludFRlc3QiLCBpbnRUZXN0KTsKKyAgICByc0RlYnVnKCJsb25nVGVzdCIsIGxvbmdUZXN0KTsKKyAgICByc0RlYnVnKCJsb25nbG9uZ1Rlc3QiLCBsb25nbG9uZ1Rlc3QpOworCisgICAgcnNEZWJ1ZygidWNoYXJUZXN0IiwgdWNoYXJUZXN0KTsKKyAgICByc0RlYnVnKCJ1c2hvcnRUZXN0IiwgdXNob3J0VGVzdCk7CisgICAgcnNEZWJ1ZygidWludFRlc3QiLCB1aW50VGVzdCk7CisgICAgcnNEZWJ1ZygidWxvbmdUZXN0IiwgdWxvbmdUZXN0KTsKKyAgICByc0RlYnVnKCJpbnQ2NF90VGVzdCIsIGludDY0X3RUZXN0KTsKKyAgICByc0RlYnVnKCJ1aW50NjRfdFRlc3QiLCB1aW50NjRfdFRlc3QpOworCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB0ZXN0X3JzZGVidWcodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IGJhc2ljX3Rlc3QoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgICAgIHJzRGVidWcoInJzZGVidWdfdGVzdCBGQUlMRUQiLCAtMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgICAgIHJzRGVidWcoInJzZGVidWdfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNsaXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjUwMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNsaXN0LnJzCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdF92MTEpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK2Zsb2F0IGdEWTsKKworcnNfZm9udCBnRm9udDsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7CisgICAgaW50IHJlc3VsdDsKK30gTGlzdEFsbG9jczsKKworTGlzdEFsbG9jcyAqZ0xpc3Q7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnRFkgPSAwLjBmOworfQorCitpbnQgdGV4dFBvcyA9IDA7CisKK2ludCByb290KGludCBsYXVuY2hJRCkgeworCisgICAgcnNnQ2xlYXJDb2xvcigwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKTsKKyAgICByc2dDbGVhckRlcHRoKDEuMGYpOworCisgICAgdGV4dFBvcyAtPSAoaW50KWdEWSoyOworICAgIGdEWSAqPSAwLjk1OworCisgICAgcnNnRm9udENvbG9yKDAuOWYsIDAuOWYsIDAuOWYsIDEuMGYpOworICAgIHJzZ0JpbmRGb250KGdGb250KTsKKworICAgIHJzX2FsbG9jYXRpb24gbGlzdEFsbG9jOworICAgIHJzU2V0T2JqZWN0KCZsaXN0QWxsb2MsIHJzR2V0QWxsb2NhdGlvbihnTGlzdCkpOworICAgIGludCBhbGxvY1NpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKGxpc3RBbGxvYyk7CisKKyAgICBpbnQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgIGludCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKworICAgIGludCBpdGVtSGVpZ2h0ID0gODA7CisgICAgaW50IHRvdGFsSXRlbUhlaWdodCA9IGl0ZW1IZWlnaHQgKiBhbGxvY1NpemU7CisKKyAgICAvKiBQcmV2ZW50IHNjcm9sbGluZyBhYm92ZSB0aGUgdG9wIG9mIHRoZSBsaXN0ICovCisgICAgaW50IGZpcnN0SXRlbSA9IGhlaWdodCAtIHRvdGFsSXRlbUhlaWdodDsKKyAgICBpZiAoZmlyc3RJdGVtIDwgMCkgeworICAgICAgICBmaXJzdEl0ZW0gPSAwOworICAgIH0KKworICAgIC8qIFByZXZlbnQgc2Nyb2xsaW5nIHBhc3QgdGhlIGxhc3QgbGluZSBvZiB0aGUgbGlzdCAqLworICAgIGludCBsYXN0SXRlbSA9IC0xICogKHRvdGFsSXRlbUhlaWdodCAtIGhlaWdodCk7CisgICAgaWYgKGxhc3RJdGVtID4gMCkgeworICAgICAgICBsYXN0SXRlbSA9IDA7CisgICAgfQorCisgICAgaWYgKHRleHRQb3MgPiBmaXJzdEl0ZW0pIHsKKyAgICAgICAgdGV4dFBvcyA9IGZpcnN0SXRlbTsKKyAgICB9CisgICAgZWxzZSBpZiAodGV4dFBvcyA8IGxhc3RJdGVtKSB7CisgICAgICAgIHRleHRQb3MgPSBsYXN0SXRlbTsKKyAgICB9CisKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgc3dpdGNoKGdMaXN0W2ldLnJlc3VsdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogUGFzc2VkICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLyogRmFpbGVkICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjVmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBTdGlsbCBUZXN0aW5nICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogVW5rbm93biAqLworICAgICAgICAgICAgICAgICAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdGltZS5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3RpbWUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzZTA3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3RpbWUucnMKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKK3N0YXRpYyBib29sIGJhc2ljX3Rlc3QodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgcnNfdGltZV90IGN1clRpbWUgPSByc1RpbWUoMCk7CisgICAgcnNfdG0gdG07CisgICAgcnNEZWJ1ZygiY3VyVGltZSIsIGN1clRpbWUpOworCisgICAgcnNMb2NhbHRpbWUoJnRtLCAmY3VyVGltZSk7CisKKyAgICByc0RlYnVnKCJ0bS50bV9zZWMiLCB0bS50bV9zZWMpOworICAgIHJzRGVidWcoInRtLnRtX21pbiIsIHRtLnRtX21pbik7CisgICAgcnNEZWJ1ZygidG0udG1faG91ciIsIHRtLnRtX2hvdXIpOworICAgIHJzRGVidWcoInRtLnRtX21kYXkiLCB0bS50bV9tZGF5KTsKKyAgICByc0RlYnVnKCJ0bS50bV9tb24iLCB0bS50bV9tb24pOworICAgIHJzRGVidWcoInRtLnRtX3llYXIiLCB0bS50bV95ZWFyKTsKKyAgICByc0RlYnVnKCJ0bS50bV93ZGF5IiwgdG0udG1fd2RheSk7CisgICAgcnNEZWJ1ZygidG0udG1feWRheSIsIHRtLnRtX3lkYXkpOworICAgIHJzRGVidWcoInRtLnRtX2lzZHN0IiwgdG0udG1faXNkc3QpOworCisgICAgLy8gVGVzdCBhIHNwZWNpZmljIHRpbWUgKG9ubHkgdmFsaWQgZm9yIFBTVCBsb2NhbHRpbWUpCisgICAgY3VyVGltZSA9IDEyOTQ0Mzg4OTM7CisgICAgcnNMb2NhbHRpbWUoJnRtLCAmY3VyVGltZSk7CisKKyAgICBfUlNfQVNTRVJUKHRtLnRtX3NlYyA9PSAzMyk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9taW4gPT0gMjEpOworICAgIF9SU19BU1NFUlQodG0udG1faG91ciA9PSAxNCk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9tZGF5ID09IDcpOworICAgIF9SU19BU1NFUlQodG0udG1fbW9uID09IDApOworICAgIF9SU19BU1NFUlQodG0udG1feWVhciA9PSAxMTEpOworICAgIF9SU19BU1NFUlQodG0udG1fd2RheSA9PSA1KTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX3lkYXkgPT0gNik7CisgICAgX1JTX0FTU0VSVCh0bS50bV9pc2RzdCA9PSAwKTsKKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgdGVzdF9yc3RpbWUodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IGJhc2ljX3Rlc3QoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgICAgIHJzRGVidWcoInJzdGltZV90ZXN0IEZBSUxFRCIsIC0xKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICAgICAgcnNEZWJ1ZygicnN0aW1lX3Rlc3QgUEFTU0VEIiwgMCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnN0eXBlcy5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3R5cGVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYmYyNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnN0eXBlcy5ycwpAQCAtMCwwICsxLDc5IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK3JzX2VsZW1lbnQgZWxlbWVudFRlc3Q7Cityc190eXBlIHR5cGVUZXN0OworcnNfYWxsb2NhdGlvbiBhbGxvY2F0aW9uVGVzdDsKK3JzX3NhbXBsZXIgc2FtcGxlclRlc3Q7Cityc19zY3JpcHQgc2NyaXB0VGVzdDsKK3JzX21lc2ggbWVzaFRlc3Q7Cityc19wcm9ncmFtX2ZyYWdtZW50IHByb2dyYW1fZnJhZ21lbnRUZXN0OworcnNfcHJvZ3JhbV92ZXJ0ZXggcHJvZ3JhbV92ZXJ0ZXhUZXN0OworcnNfcHJvZ3JhbV9yYXN0ZXIgcHJvZ3JhbV9yYXN0ZXJUZXN0OworcnNfcHJvZ3JhbV9zdG9yZSBwcm9ncmFtX3N0b3JlVGVzdDsKK3JzX2ZvbnQgZm9udFRlc3Q7CisKK3JzX21hdHJpeDR4NCBtYXRyaXg0eDRUZXN0OworcnNfbWF0cml4M3gzIG1hdHJpeDN4M1Rlc3Q7Cityc19tYXRyaXgyeDIgbWF0cml4MngyVGVzdDsKKworc3RydWN0IG15X3N0cnVjdCB7CisgICAgaW50IGk7CisgICAgcnNfZm9udCBmb250VGVzdFN0cnVjdDsKK307CisKK3N0YXRpYyBib29sIGJhc2ljX3Rlc3QodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDR4NFRlc3RMb2NhbDsKKyAgICByc19tYXRyaXgzeDMgbWF0cml4M3gzVGVzdExvY2FsOworICAgIHJzX21hdHJpeDJ4MiBtYXRyaXgyeDJUZXN0TG9jYWw7CisKKyAgICAvLyBUaGlzIHRlc3QgZm9jdXNlcyBwcmltYXJpbHkgb24gY29tcGlsYXRpb24tdGltZSwgbm90IHJ1bi10aW1lLgorICAgIHJzX2VsZW1lbnQgZWxlbWVudFRlc3RMb2NhbDsKKyAgICByc190eXBlIHR5cGVUZXN0TG9jYWw7CisgICAgcnNfYWxsb2NhdGlvbiBhbGxvY2F0aW9uVGVzdExvY2FsOworICAgIHJzX3NhbXBsZXIgc2FtcGxlclRlc3RMb2NhbDsKKyAgICByc19zY3JpcHQgc2NyaXB0VGVzdExvY2FsOworICAgIHJzX21lc2ggbWVzaFRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX2ZyYWdtZW50IHByb2dyYW1fZnJhZ21lbnRUZXN0TG9jYWw7CisgICAgcnNfcHJvZ3JhbV92ZXJ0ZXggcHJvZ3JhbV92ZXJ0ZXhUZXN0TG9jYWw7CisgICAgcnNfcHJvZ3JhbV9yYXN0ZXIgcHJvZ3JhbV9yYXN0ZXJUZXN0TG9jYWw7CisgICAgcnNfcHJvZ3JhbV9zdG9yZSBwcm9ncmFtX3N0b3JlVGVzdExvY2FsOworICAgIHJzX2ZvbnQgZm9udFRlc3RMb2NhbDsKKworICAgIHJzX2ZvbnQgZm9udFRlc3RMb2NhbEFycmF5WzRdOworCisgICAgcnNfZm9udCBmb250VGVzdExvY2FsUHJlSW5pdCA9IGZvbnRUZXN0OworCisgICAgc3RydWN0IG15X3N0cnVjdCBzdHJ1Y3RUZXN0OworCisgICAgcnNTZXRPYmplY3QoJmZvbnRUZXN0TG9jYWwsIGZvbnRUZXN0KTsKKyAgICAvL2FsbG9jYXRpb25UZXN0TG9jYWwgPSBhbGxvY2F0aW9uVGVzdDsKKworICAgIHJzU2V0T2JqZWN0KCZmb250VGVzdCwgZm9udFRlc3RMb2NhbCk7CisgICAgLy9hbGxvY2F0aW9uVGVzdCA9IGFsbG9jYXRpb25UZXN0TG9jYWw7CisKKyAgICAvKmZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHJzU2V0T2JqZWN0KCZmb250VGVzdExvY2FsQXJyYXlbaV0sIGZvbnRUZXN0TG9jYWwpOworICAgIH0qLworCisgICAgLypyc1NldE9iamVjdCgmZm9udFRlc3QsIGZvbnRUZXN0TG9jYWxBcnJheVszXSk7Ki8KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgdGVzdF9yc3R5cGVzKHVpbnQzMl90IGluZGV4LCBpbnQgdGVzdF9udW0pIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGZhaWxlZCB8PSBiYXNpY190ZXN0KGluZGV4KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgICAgICByc0RlYnVnKCJyc3R5cGVzX3Rlc3QgRkFJTEVEIiwgLTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgICAgICByc0RlYnVnKCJyc3R5cGVzX3Rlc3QgUEFTU0VEIiwgMCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaCBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxMS9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzQ0ODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3Qvc2hhcmVkLnJzaApAQCAtMCwwICsxLDM4IEBACisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0X3YxMSkKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdFJlc3VsdF9zIHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworICAgIGludDY0X3QgdGltZTsKK30gVGVzdFJlc3VsdDsKKy8vVGVzdFJlc3VsdCAqZ19yZXN1bHRzOworCitzdGF0aWMgaW50NjRfdCBnX3RpbWU7CisKK3N0YXRpYyB2b2lkIHN0YXJ0KHZvaWQpIHsKKyAgICBnX3RpbWUgPSByc1VwdGltZU1pbGxpcygpOworfQorCitzdGF0aWMgZmxvYXQgZW5kKHVpbnQzMl90IGlkeCkgeworICAgIGludDY0X3QgdCA9IHJzVXB0aW1lTWlsbGlzKCkgLSBnX3RpbWU7CisgICAgLy9nX3Jlc3VsdHNbaWR4XS50aW1lID0gdDsKKyAgICAvL3JzRGVidWcoInRlc3QgdGltZSIsIChpbnQpdCk7CisgICAgcmV0dXJuICgoZmxvYXQpdCkgLyAxMDAwLmY7Cit9CisKKyNkZWZpbmUgX1JTX0FTU0VSVChiKSBcCitkbyB7IFwKKyAgICBpZiAoIShiKSkgeyBcCisgICAgICAgIGZhaWxlZCA9IHRydWU7IFwKKyAgICAgICAgcnNEZWJ1ZygjYiAiIEZBSUxFRCIsIDApOyBcCisgICAgfSBcCitcCit9IHdoaWxlICgwKQorCisvKiBUaGVzZSBjb25zdGFudHMgbXVzdCBtYXRjaCB0aG9zZSBpbiBVbml0VGVzdC5qYXZhICovCitzdGF0aWMgY29uc3QgaW50IFJTX01TR19URVNUX1BBU1NFRCA9IDEwMDsKK3N0YXRpYyBjb25zdCBpbnQgUlNfTVNHX1RFU1RfRkFJTEVEID0gMTAxOworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTEvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM4M2JhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjExL3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3Rlc3Rfcm9vdC5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBGb3VudGFpbiB0ZXN0IHNjcmlwdAorI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdCkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0IHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworfSBUZXN0UmVzdWx0X3Q7CitUZXN0UmVzdWx0X3QgKnJlc3VsdHM7CisKK2ludCByb290KCkgeworCisgICAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L0FuZHJvaWQubWsgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGMzYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgJChjYWxsIGFsbC1yZW5kZXJzY3JpcHQtZmlsZXMtdW5kZXIsIHNyYykKKworTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFJTVGVzdF92MTQKK0xPQ0FMX1NES19WRVJTSU9OIDo9IDE0CisKK2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q5YmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQucnMudGVzdF92MTQiPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjE0IiAvPgorICAgIDxhcHBsaWNhdGlvbiAKKyAgICAgICAgYW5kcm9pZDpsYWJlbD0iX1JTX1Rlc3RfdjE0IgorICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS90ZXN0X3BhdHRlcm4iPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJSU1Rlc3RfdjE0IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzY3JlZW5PcmllbnRhdGlvbj0icG9ydHJhaXQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorICAgIDwvYXBwbGljYXRpb24+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3Jlcy9kcmF3YWJsZS1ub2RwaS90ZXN0X3BhdHRlcm4ucG5nIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3Jlcy9kcmF3YWJsZS1ub2RwaS90ZXN0X3BhdHRlcm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDE0NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvcmVzL2RyYXdhYmxlLW5vZHBpL3Rlc3RfcGF0dGVybi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdENvcmUuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlODFhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RDb3JlLmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCisKK3B1YmxpYyBjbGFzcyBSU1Rlc3RDb3JlIHsKKyAgICBpbnQgbVdpZHRoOworICAgIGludCBtSGVpZ2h0OworICAgIENvbnRleHQgbUN0eDsKKworICAgIHB1YmxpYyBSU1Rlc3RDb3JlKENvbnRleHQgY3R4KSB7CisgICAgICAgIG1DdHggPSBjdHg7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKworICAgIHByaXZhdGUgRm9udCBtRm9udDsKKyAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MgbUxpc3RBbGxvY3M7CisgICAgaW50IG1MYXN0WDsKKyAgICBpbnQgbUxhc3RZOworICAgIHByaXZhdGUgU2NyaXB0Q19yc2xpc3QgbVNjcmlwdDsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PFVuaXRUZXN0PiB1bml0VGVzdHM7CisgICAgcHJpdmF0ZSBMaXN0SXRlcmF0b3I8VW5pdFRlc3Q+IHRlc3RfaXRlcjsKKyAgICBwcml2YXRlIFVuaXRUZXN0IGFjdGl2ZVRlc3Q7CisgICAgcHJpdmF0ZSBib29sZWFuIHN0b3BUZXN0aW5nOworCisgICAgLyogUGVyaW9kaWMgdGltZXIgZm9yIGVuc3VyaW5nIGZ1dHVyZSB0ZXN0cyBnZXQgc2NoZWR1bGVkICovCisgICAgcHJpdmF0ZSBUaW1lciBtVGltZXI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNfVElNRVJfUEVSSU9EID0gMTAwOworCisgICAgcHVibGljIHZvaWQgaW5pdChSZW5kZXJTY3JpcHRHTCBycywgUmVzb3VyY2VzIHJlcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgICAgIG1SUyA9IHJzOworICAgICAgICBtUmVzID0gcmVzOworICAgICAgICBtV2lkdGggPSB3aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgc3RvcFRlc3RpbmcgPSBmYWxzZTsKKworICAgICAgICBtU2NyaXB0ID0gbmV3IFNjcmlwdENfcnNsaXN0KG1SUywgbVJlcywgUi5yYXcucnNsaXN0KTsKKworICAgICAgICB1bml0VGVzdHMgPSBuZXcgQXJyYXlMaXN0PFVuaXRUZXN0PigpOworCisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX3ByaW1pdGl2ZXModGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF92ZWN0b3IodGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9yc2RlYnVnKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcnN0aW1lKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcnN0eXBlcyh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX2FsbG9jKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfcmVmY291bnQodGhpcywgbVJlcywgbUN0eCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVVF9mb3JlYWNoKHRoaXMsIG1SZXMsIG1DdHgpKTsKKyAgICAgICAgdW5pdFRlc3RzLmFkZChuZXcgVVRfbWF0aCh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVUX2ZwX21hZCh0aGlzLCBtUmVzLCBtQ3R4KSk7CisgICAgICAgIC8qCisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KG51bGwsICI8UGFzcz4iLCAxKSk7CisgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KCkpOworICAgICAgICB1bml0VGVzdHMuYWRkKG5ldyBVbml0VGVzdChudWxsLCAiPEZhaWw+IiwgLTEpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIHVuaXRUZXN0cy5hZGQobmV3IFVuaXRUZXN0KG51bGwsICI8UGFzcz4iLCAxKSk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKworICAgICAgICBVbml0VGVzdCBbXSB1dGEgPSBuZXcgVW5pdFRlc3RbdW5pdFRlc3RzLnNpemUoKV07CisgICAgICAgIHV0YSA9IHVuaXRUZXN0cy50b0FycmF5KHV0YSk7CisKKyAgICAgICAgbUxpc3RBbGxvY3MgPSBuZXcgU2NyaXB0RmllbGRfTGlzdEFsbG9jc19zKG1SUywgdXRhLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXRhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBsaXN0RWxlbSA9IG5ldyBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSgpOworICAgICAgICAgICAgbGlzdEVsZW0udGV4dCA9IEFsbG9jYXRpb24uY3JlYXRlRnJvbVN0cmluZyhtUlMsIHV0YVtpXS5uYW1lLCBBbGxvY2F0aW9uLlVTQUdFX1NDUklQVCk7CisgICAgICAgICAgICBsaXN0RWxlbS5yZXN1bHQgPSB1dGFbaV0ucmVzdWx0OworICAgICAgICAgICAgbUxpc3RBbGxvY3Muc2V0KGxpc3RFbGVtLCBpLCBmYWxzZSk7CisgICAgICAgICAgICB1dGFbaV0uc2V0SXRlbShsaXN0RWxlbSk7CisgICAgICAgIH0KKworICAgICAgICBtTGlzdEFsbG9jcy5jb3B5QWxsKCk7CisKKyAgICAgICAgbVNjcmlwdC5iaW5kX2dMaXN0KG1MaXN0QWxsb2NzKTsKKworICAgICAgICBtRm9udCA9IEZvbnQuY3JlYXRlKG1SUywgbVJlcywgInNlcmlmIiwgRm9udC5TdHlsZS5CT0xELCA4KTsKKyAgICAgICAgbVNjcmlwdC5zZXRfZ0ZvbnQobUZvbnQpOworCisgICAgICAgIG1SUy5iaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKworICAgICAgICB0ZXN0X2l0ZXIgPSB1bml0VGVzdHMubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIHJlZnJlc2hUZXN0UmVzdWx0cygpOyAvKiBLaWNrIG9mZiB0aGUgZmlyc3QgdGVzdCAqLworCisgICAgICAgIFRpbWVyVGFzayBwVGFzayA9IG5ldyBUaW1lclRhc2soKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbVRpbWVyID0gbmV3IFRpbWVyKCk7CisgICAgICAgIG1UaW1lci5zY2hlZHVsZShwVGFzaywgUlNfVElNRVJfUEVSSU9ELCBSU19USU1FUl9QRVJJT0QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNoZWNrQW5kUnVuTmV4dFRlc3QoKSB7CisgICAgICAgIGlmIChhY3RpdmVUZXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghYWN0aXZlVGVzdC5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICAvKiBQcm9wZXJseSBjbGVhbiB1cCBvbiBvdXIgbGFzdCB0ZXN0ICovCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGVzdC5qb2luKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFjdGl2ZVRlc3QgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdG9wVGVzdGluZyAmJiBhY3RpdmVUZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0ZXN0X2l0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlVGVzdCA9IHRlc3RfaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgYWN0aXZlVGVzdC5zdGFydCgpOworICAgICAgICAgICAgICAgIC8qIFRoaXMgcm91dGluZSB3aWxsIG9ubHkgZ2V0IGNhbGxlZCBvbmNlIHdoZW4gYSBuZXcgdGVzdAorICAgICAgICAgICAgICAgICAqIHNob3VsZCBzdGFydCBydW5uaW5nLiBUaGUgbWVzc2FnZSBoYW5kbGVyIGluIFVuaXRUZXN0LmphdmEKKyAgICAgICAgICAgICAgICAgKiBlbnN1cmVzIHRoaXMuICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVyLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWZyZXNoVGVzdFJlc3VsdHMoKSB7CisgICAgICAgIGNoZWNrQW5kUnVuTmV4dFRlc3QoKTsKKworICAgICAgICBpZiAobUxpc3RBbGxvY3MgIT0gbnVsbCAmJiBtU2NyaXB0ICE9IG51bGwgJiYgbVJTICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1MaXN0QWxsb2NzLmNvcHlBbGwoKTsKKworICAgICAgICAgICAgbVNjcmlwdC5iaW5kX2dMaXN0KG1MaXN0QWxsb2NzKTsKKyAgICAgICAgICAgIG1SUy5iaW5kUm9vdFNjcmlwdChtU2NyaXB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisgICAgICAgIHN0b3BUZXN0aW5nID0gdHJ1ZTsKKyAgICAgICAgVW5pdFRlc3QgdCA9IGFjdGl2ZVRlc3Q7CisKKyAgICAgICAgLyogU3RvcCBwZXJpb2RpYyByZWZyZXNoIG9mIHRlc3RpbmcgKi8KKyAgICAgICAgaWYgKG1UaW1lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtVGltZXIuY2FuY2VsKCk7CisgICAgICAgICAgICBtVGltZXIucHVyZ2UoKTsKKyAgICAgICAgICAgIG1UaW1lciA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiBXYWl0IHRvIGV4aXQgdW50aWwgd2UgZmluaXNoIHRoZSBjdXJyZW50IHRlc3QgKi8KKyAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0LmpvaW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHZvaWQgbmV3VG91Y2hQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCBwcmVzc3VyZSwgaW50IGlkKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgb25BY3Rpb25Eb3duKGludCB4LCBpbnQgeSkgeworICAgICAgICBtU2NyaXB0LnNldF9nRFkoMC4wZik7CisgICAgICAgIG1MYXN0WCA9IHg7CisgICAgICAgIG1MYXN0WSA9IHk7CisgICAgICAgIHJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG9uQWN0aW9uTW92ZShpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgaW50IGR4ID0gbUxhc3RYIC0geDsKKyAgICAgICAgaW50IGR5ID0gbUxhc3RZIC0geTsKKworICAgICAgICBpZiAoTWF0aC5hYnMoZHkpIDw9IDIpIHsKKyAgICAgICAgICAgIGR5ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1TY3JpcHQuc2V0X2dEWShkeSk7CisKKyAgICAgICAgbUxhc3RYID0geDsKKyAgICAgICAgbUxhc3RZID0geTsKKyAgICAgICAgcmVmcmVzaFRlc3RSZXN1bHRzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdFZpZXcuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxOTJlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9SU1Rlc3RWaWV3LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJlbmRlclNjcmlwdEdMOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuS2V5RXZlbnQ7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworCitwdWJsaWMgY2xhc3MgUlNUZXN0VmlldyBleHRlbmRzIFJTU3VyZmFjZVZpZXcgeworCisgICAgcHJpdmF0ZSBDb250ZXh0IG1DdHg7CisKKyAgICBwdWJsaWMgUlNUZXN0VmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIG1DdHggPSBjb250ZXh0OworICAgICAgICAvL3NldEZvY3VzYWJsZSh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlbmRlclNjcmlwdEdMIG1SUzsKKyAgICBwcml2YXRlIFJTVGVzdENvcmUgbVJlbmRlcjsKKworICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDaGFuZ2VkKFN1cmZhY2VIb2xkZXIgaG9sZGVyLCBpbnQgZm9ybWF0LCBpbnQgdywgaW50IGgpIHsKKyAgICAgICAgc3VwZXIuc3VyZmFjZUNoYW5nZWQoaG9sZGVyLCBmb3JtYXQsIHcsIGgpOworICAgICAgICBpZiAobVJTID09IG51bGwpIHsKKyAgICAgICAgICAgIFJlbmRlclNjcmlwdEdMLlN1cmZhY2VDb25maWcgc2MgPSBuZXcgUmVuZGVyU2NyaXB0R0wuU3VyZmFjZUNvbmZpZygpOworICAgICAgICAgICAgbVJTID0gY3JlYXRlUmVuZGVyU2NyaXB0R0woc2MpOworICAgICAgICAgICAgbVJTLnNldFN1cmZhY2UoaG9sZGVyLCB3LCBoKTsKKyAgICAgICAgICAgIG1SZW5kZXIgPSBuZXcgUlNUZXN0Q29yZShtQ3R4KTsKKyAgICAgICAgICAgIG1SZW5kZXIuaW5pdChtUlMsIGdldFJlc291cmNlcygpLCB3LCBoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgeworICAgICAgICBpZihtUlMgIT0gbnVsbCkgeworICAgICAgICAgICAgbVJlbmRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICBtUlMgPSBudWxsOworICAgICAgICAgICAgZGVzdHJveVJlbmRlclNjcmlwdEdMKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50KE1vdGlvbkV2ZW50IGV2KQorICAgIHsKKyAgICAgICAgYm9vbGVhbiByZXQgPSBmYWxzZTsKKyAgICAgICAgaW50IGFjdCA9IGV2LmdldEFjdGlvbigpOworICAgICAgICBpZiAoYWN0ID09IGV2LkFDVElPTl9ET1dOKSB7CisgICAgICAgICAgICBtUmVuZGVyLm9uQWN0aW9uRG93bigoaW50KWV2LmdldFgoKSwgKGludClldi5nZXRZKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhY3QgPT0gZXYuQUNUSU9OX01PVkUpIHsKKyAgICAgICAgICAgIG1SZW5kZXIub25BY3Rpb25Nb3ZlKChpbnQpZXYuZ2V0WCgpLCAoaW50KWV2LmdldFkoKSk7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvUlNUZXN0X3YxNC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdF92MTQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTA5NjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1JTVGVzdF92MTQuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0LlJTU3VyZmFjZVZpZXc7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuUmVuZGVyU2NyaXB0OworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5TZXR0aW5ncy5TeXN0ZW07CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CisKK2ltcG9ydCBqYXZhLmxhbmcuUnVudGltZTsKKworcHVibGljIGNsYXNzIFJTVGVzdF92MTQgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgLy9FdmVudExpc3RlbmVyIG1MaXN0ZW5lciA9IG5ldyBFdmVudExpc3RlbmVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJSU1Rlc3RfdjE0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHICA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX0VOQUJMRUQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgUlNUZXN0VmlldyBtVmlldzsKKworICAgIC8vIGdldCB0aGUgY3VycmVudCBsb29wZXIgKGZyb20geW91ciBBY3Rpdml0eSBVSSB0aHJlYWQgZm9yIGluc3RhbmNlCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgaWNpY2xlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKGljaWNsZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91ciBQcmV2aWV3IHZpZXcgYW5kIHNldCBpdCBhcyB0aGUgY29udGVudCBvZiBvdXIKKyAgICAgICAgLy8gQWN0aXZpdHkKKyAgICAgICAgbVZpZXcgPSBuZXcgUlNUZXN0Vmlldyh0aGlzKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcobVZpZXcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUmVzdW1lKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblJlc3VtZSgpOworICAgICAgICBtVmlldy5yZXN1bWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblBhdXNlKCkgeworICAgICAgICAvLyBJZGVhbGx5IGEgZ2FtZSBzaG91bGQgaW1wbGVtZW50IG9uUmVzdW1lKCkgYW5kIG9uUGF1c2UoKQorICAgICAgICAvLyB0byB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiB3aGVuIHRoZSBhY3Rpdml0eSBsb3NlcyBmb2N1cworICAgICAgICBzdXBlci5vblBhdXNlKCk7CisgICAgICAgIG1WaWV3LnBhdXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdG9wKCkgeworICAgICAgICAvLyBBY3R1YWxseSBraWxsIHRoZSBhcHAgaWYgd2UgYXJlIHN0b3BwaW5nLiBXZSBkb24ndCB3YW50IHRvCisgICAgICAgIC8vIGNvbnRpbnVlL3Jlc3VtZSB0aGlzIHRlc3QgZXZlci4gSXQgc2hvdWxkIGFsd2F5cyBzdGFydCBmcmVzaC4KKyAgICAgICAgZmluaXNoKCk7CisgICAgICAgIHN1cGVyLm9uU3RvcCgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBpZiAoTE9HX0VOQUJMRUQpIHsKKyAgICAgICAgICAgIExvZy52KExPR19UQUcsIG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9hbGxvYy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2FsbG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0MmIyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9hbGxvYy5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX2FsbG9jIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfYWxsb2MoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAiQWxsb2MiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR2xvYmFscyhSZW5kZXJTY3JpcHQgUlMsIFNjcmlwdENfYWxsb2MgcykgeworICAgICAgICBUeXBlLkJ1aWxkZXIgdHlwZUJ1aWxkZXIgPSBuZXcgVHlwZS5CdWlsZGVyKFJTLCBFbGVtZW50LkkzMihSUykpOworICAgICAgICBpbnQgWCA9IDU7CisgICAgICAgIGludCBZID0gNzsKKyAgICAgICAgaW50IFogPSAwOworICAgICAgICBzLnNldF9kaW1YKFgpOworICAgICAgICBzLnNldF9kaW1ZKFkpOworICAgICAgICBzLnNldF9kaW1aKFopOworICAgICAgICB0eXBlQnVpbGRlci5zZXRYKFgpLnNldFkoWSk7CisgICAgICAgIEFsbG9jYXRpb24gQSA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQoUlMsIHR5cGVCdWlsZGVyLmNyZWF0ZSgpKTsKKyAgICAgICAgcy5iaW5kX2EoQSk7CisKKyAgICAgICAgdHlwZUJ1aWxkZXIgPSBuZXcgVHlwZS5CdWlsZGVyKFJTLCBFbGVtZW50LkkzMihSUykpOworICAgICAgICB0eXBlQnVpbGRlci5zZXRYKFgpLnNldFkoWSkuc2V0RmFjZXModHJ1ZSk7CisgICAgICAgIEFsbG9jYXRpb24gQUZhY2VzID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChSUywgdHlwZUJ1aWxkZXIuY3JlYXRlKCkpOworICAgICAgICBzLnNldF9hRmFjZXMoQUZhY2VzKTsKKyAgICAgICAgdHlwZUJ1aWxkZXIuc2V0RmFjZXMoZmFsc2UpLnNldE1pcG1hcHModHJ1ZSk7CisgICAgICAgIEFsbG9jYXRpb24gQUxPRCA9IEFsbG9jYXRpb24uY3JlYXRlVHlwZWQoUlMsIHR5cGVCdWlsZGVyLmNyZWF0ZSgpKTsKKyAgICAgICAgcy5zZXRfYUxPRChBTE9EKTsKKyAgICAgICAgdHlwZUJ1aWxkZXIuc2V0RmFjZXModHJ1ZSkuc2V0TWlwbWFwcyh0cnVlKTsKKyAgICAgICAgQWxsb2NhdGlvbiBBRmFjZXNMT0QgPSBBbGxvY2F0aW9uLmNyZWF0ZVR5cGVkKFJTLCB0eXBlQnVpbGRlci5jcmVhdGUoKSk7CisgICAgICAgIHMuc2V0X2FGYWNlc0xPRChBRmFjZXNMT0QpOworCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX2FsbG9jIHMgPSBuZXcgU2NyaXB0Q19hbGxvYyhwUlMsIG1SZXMsIFIucmF3LmFsbG9jKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBpbml0aWFsaXplR2xvYmFscyhwUlMsIHMpOworICAgICAgICBzLmludm9rZV9hbGxvY190ZXN0KCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZm9yZWFjaC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZvcmVhY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWI1YmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZvcmVhY2guamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9mb3JlYWNoIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisgICAgcHJpdmF0ZSBBbGxvY2F0aW9uIEE7CisKKyAgICBwcm90ZWN0ZWQgVVRfZm9yZWFjaChSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJGb3JFYWNoIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdsb2JhbHMoUmVuZGVyU2NyaXB0IFJTLCBTY3JpcHRDX2ZvcmVhY2ggcykgeworICAgICAgICBUeXBlLkJ1aWxkZXIgdHlwZUJ1aWxkZXIgPSBuZXcgVHlwZS5CdWlsZGVyKFJTLCBFbGVtZW50LkkzMihSUykpOworICAgICAgICBpbnQgWCA9IDU7CisgICAgICAgIGludCBZID0gNzsKKyAgICAgICAgcy5zZXRfZGltWChYKTsKKyAgICAgICAgcy5zZXRfZGltWShZKTsKKyAgICAgICAgdHlwZUJ1aWxkZXIuc2V0WChYKS5zZXRZKFkpOworICAgICAgICBBID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChSUywgdHlwZUJ1aWxkZXIuY3JlYXRlKCkpOworICAgICAgICBzLmJpbmRfYShBKTsKKworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19mb3JlYWNoIHMgPSBuZXcgU2NyaXB0Q19mb3JlYWNoKHBSUywgbVJlcywgUi5yYXcuZm9yZWFjaCk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgaW5pdGlhbGl6ZUdsb2JhbHMocFJTLCBzKTsKKyAgICAgICAgcy5mb3JFYWNoX3Jvb3QoQSk7CisgICAgICAgIHMuaW52b2tlX2ZvcmVhY2hfdGVzdCgpOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX2ZwX21hZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTQ5NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfZnBfbWFkLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfZnBfbWFkIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfZnBfbWFkKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgIkZwX01hZCIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19mcF9tYWQgcyA9IG5ldyBTY3JpcHRDX2ZwX21hZChwUlMsIG1SZXMsIFIucmF3LmZwX21hZCk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfZnBfbWFkX3Rlc3QoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfbWF0aC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX21hdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjEzNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX21hdGguamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5ycy50ZXN0X3YxNDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQucmVuZGVyc2NyaXB0Lio7CisKK3B1YmxpYyBjbGFzcyBVVF9tYXRoIGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfbWF0aChSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJNYXRoIiwgY3R4KTsKKyAgICAgICAgbVJlcyA9IHJlczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX21hdGggcyA9IG5ldyBTY3JpcHRDX21hdGgocFJTLCBtUmVzLCBSLnJhdy5tYXRoKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBzLmludm9rZV9tYXRoX3Rlc3QoMCwgMCk7CisgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcHJpbWl0aXZlcy5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2M1NmYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ByaW1pdGl2ZXMuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcHJpbWl0aXZlcyBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3ByaW1pdGl2ZXMoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAiUHJpbWl0aXZlcyIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVHbG9iYWxzKFNjcmlwdENfcHJpbWl0aXZlcyBzKSB7CisgICAgICAgIGZsb2F0IHBGID0gcy5nZXRfZmxvYXRUZXN0KCk7CisgICAgICAgIGlmIChwRiAhPSAxLjk5ZikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2Zsb2F0VGVzdCgyLjk5Zik7CisKKyAgICAgICAgZG91YmxlIHBEID0gcy5nZXRfZG91YmxlVGVzdCgpOworICAgICAgICBpZiAocEQgIT0gMi4wNSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2RvdWJsZVRlc3QoMy4wNSk7CisKKyAgICAgICAgYnl0ZSBwQyA9IHMuZ2V0X2NoYXJUZXN0KCk7CisgICAgICAgIGlmIChwQyAhPSAtOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X2NoYXJUZXN0KChieXRlKS0xNik7CisKKyAgICAgICAgc2hvcnQgcFMgPSBzLmdldF9zaG9ydFRlc3QoKTsKKyAgICAgICAgaWYgKHBTICE9IC0xNikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X3Nob3J0VGVzdCgoc2hvcnQpLTMyKTsKKworICAgICAgICBpbnQgcEkgPSBzLmdldF9pbnRUZXN0KCk7CisgICAgICAgIGlmIChwSSAhPSAtMzIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9pbnRUZXN0KC02NCk7CisKKyAgICAgICAgbG9uZyBwTCA9IHMuZ2V0X2xvbmdUZXN0KCk7CisgICAgICAgIGlmIChwTCAhPSAxNzE3OTg2OTE4NGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9sb25nVGVzdCgxNzE3OTg2OTE4NWwpOworCisgICAgICAgIGxvbmcgcHVMID0gcy5nZXRfdWxvbmdUZXN0KCk7CisgICAgICAgIGlmIChwdUwgIT0gNDYxMTY4NjAxODQyNzM4NzkwNEwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF91bG9uZ1Rlc3QoNDYxMTY4NjAxODQyNzM4NzkwM0wpOworCisKKyAgICAgICAgbG9uZyBwTEwgPSBzLmdldF9sb25nbG9uZ1Rlc3QoKTsKKyAgICAgICAgaWYgKHBMTCAhPSA2ODcxOTQ3NjczNkwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzLnNldF9sb25nbG9uZ1Rlc3QoNjg3MTk0NzY3MzVMKTsKKworICAgICAgICBsb25nIHB1NjQgPSBzLmdldF91aW50NjRfdFRlc3QoKTsKKyAgICAgICAgaWYgKHB1NjQgIT0gMTE3MTc5ODY5MTg0bCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHMuc2V0X3VpbnQ2NF90VGVzdCgxMTcxNzk4NjkxODVsKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIFJlbmRlclNjcmlwdCBwUlMgPSBSZW5kZXJTY3JpcHQuY3JlYXRlKG1DdHgpOworICAgICAgICBTY3JpcHRDX3ByaW1pdGl2ZXMgcyA9IG5ldyBTY3JpcHRDX3ByaW1pdGl2ZXMocFJTLCBtUmVzLCBSLnJhdy5wcmltaXRpdmVzKTsKKyAgICAgICAgcFJTLnNldE1lc3NhZ2VIYW5kbGVyKG1Sc01lc3NhZ2UpOworICAgICAgICBpZiAoIWluaXRpYWxpemVHbG9iYWxzKHMpKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplR2xvYmFscyBmYWlsZWQKKyAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5pbnZva2VfcHJpbWl0aXZlc190ZXN0KDAsIDApOworICAgICAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICAgICAgd2FpdEZvck1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yZWZjb3VudC5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JlZmNvdW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNTE2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yZWZjb3VudC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3JlZmNvdW50IGV4dGVuZHMgVW5pdFRlc3QgeworICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXM7CisKKyAgICBwcm90ZWN0ZWQgVVRfcmVmY291bnQoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAiUmVmY291bnQiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplR2xvYmFscyhSZW5kZXJTY3JpcHQgUlMsIFNjcmlwdENfcmVmY291bnQgcykgeworICAgICAgICBUeXBlLkJ1aWxkZXIgdHlwZUJ1aWxkZXIgPSBuZXcgVHlwZS5CdWlsZGVyKFJTLCBFbGVtZW50LkkzMihSUykpOworICAgICAgICBpbnQgWCA9IDUwMDsKKyAgICAgICAgaW50IFkgPSA3MDA7CisgICAgICAgIHR5cGVCdWlsZGVyLnNldFgoWCkuc2V0WShZKTsKKyAgICAgICAgQWxsb2NhdGlvbiBBID0gQWxsb2NhdGlvbi5jcmVhdGVUeXBlZChSUywgdHlwZUJ1aWxkZXIuY3JlYXRlKCkpOworICAgICAgICBzLnNldF9nbG9iYWxBKEEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgU2NyaXB0Q19yZWZjb3VudCBzID0gbmV3IFNjcmlwdENfcmVmY291bnQocFJTLCBtUmVzLCBSLnJhdy5yZWZjb3VudCk7CisgICAgICAgIGluaXRpYWxpemVHbG9iYWxzKHBSUywgcyk7CisgICAgICAgIHMuaW52b2tlX3JlZmNvdW50X3Rlc3QoKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc2RlYnVnLmphdmEgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnNkZWJ1Zy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTkyZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfcnNkZWJ1Zy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3JzZGVidWcgZXh0ZW5kcyBVbml0VGVzdCB7CisgICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlczsKKworICAgIHByb3RlY3RlZCBVVF9yc2RlYnVnKFJTVGVzdENvcmUgcnN0YywgUmVzb3VyY2VzIHJlcywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIocnN0YywgInJzRGVidWciLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfcnNkZWJ1ZyBzID0gbmV3IFNjcmlwdENfcnNkZWJ1ZyhwUlMsIG1SZXMsIFIucmF3LnJzZGVidWcpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX3Rlc3RfcnNkZWJ1ZygwLCAwKTsKKyAgICAgICAgcFJTLmZpbmlzaCgpOworICAgICAgICB3YWl0Rm9yTWVzc2FnZSgpOworICAgICAgICBwUlMuZGVzdHJveSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3RpbWUuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3RpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzJlZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdGltZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3JzdGltZSBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3JzdGltZShSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJyc1RpbWUiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfcnN0aW1lIHMgPSBuZXcgU2NyaXB0Q19yc3RpbWUocFJTLCBtUmVzLCBSLnJhdy5yc3RpbWUpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIHMuaW52b2tlX3Rlc3RfcnN0aW1lKDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3JzdHlwZXMuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3R5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5Njg2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9VVF9yc3R5cGVzLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC4qOworCitwdWJsaWMgY2xhc3MgVVRfcnN0eXBlcyBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3JzdHlwZXMoUlNUZXN0Q29yZSByc3RjLCBSZXNvdXJjZXMgcmVzLCBDb250ZXh0IGN0eCkgeworICAgICAgICBzdXBlcihyc3RjLCAicnNUeXBlcyIsIGN0eCk7CisgICAgICAgIG1SZXMgPSByZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBSZW5kZXJTY3JpcHQgcFJTID0gUmVuZGVyU2NyaXB0LmNyZWF0ZShtQ3R4KTsKKyAgICAgICAgU2NyaXB0Q19yc3R5cGVzIHMgPSBuZXcgU2NyaXB0Q19yc3R5cGVzKHBSUywgbVJlcywgUi5yYXcucnN0eXBlcyk7CisgICAgICAgIHBSUy5zZXRNZXNzYWdlSGFuZGxlcihtUnNNZXNzYWdlKTsKKyAgICAgICAgcy5pbnZva2VfdGVzdF9yc3R5cGVzKDAsIDApOworICAgICAgICBwUlMuZmluaXNoKCk7CisgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIHBSUy5kZXN0cm95KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ZlY3Rvci5qYXZhIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L1VUX3ZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzQxM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVVRfdmVjdG9yLmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5yZW5kZXJzY3JpcHQuKjsKKworcHVibGljIGNsYXNzIFVUX3ZlY3RvciBleHRlbmRzIFVuaXRUZXN0IHsKKyAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzOworCisgICAgcHJvdGVjdGVkIFVUX3ZlY3RvcihSU1Rlc3RDb3JlIHJzdGMsIFJlc291cmNlcyByZXMsIENvbnRleHQgY3R4KSB7CisgICAgICAgIHN1cGVyKHJzdGMsICJWZWN0b3IiLCBjdHgpOworICAgICAgICBtUmVzID0gcmVzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplR2xvYmFscyhTY3JpcHRDX3ZlY3RvciBzKSB7CisgICAgICAgIEZsb2F0MiBGMiA9IHMuZ2V0X2YyKCk7CisgICAgICAgIGlmIChGMi54ICE9IDEuMGYgfHwgRjIueSAhPSAyLjBmKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgRjIueCA9IDIuOTlmOworICAgICAgICBGMi55ID0gMy45OWY7CisgICAgICAgIHMuc2V0X2YyKEYyKTsKKworICAgICAgICBGbG9hdDMgRjMgPSBzLmdldF9mMygpOworICAgICAgICBpZiAoRjMueCAhPSAxLjBmIHx8IEYzLnkgIT0gMi4wZiB8fCBGMy56ICE9IDMuMGYpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBGMy54ID0gMi45OWY7CisgICAgICAgIEYzLnkgPSAzLjk5ZjsKKyAgICAgICAgRjMueiA9IDQuOTlmOworICAgICAgICBzLnNldF9mMyhGMyk7CisKKyAgICAgICAgRmxvYXQ0IEY0ID0gcy5nZXRfZjQoKTsKKyAgICAgICAgaWYgKEY0LnggIT0gMS4wZiB8fCBGNC55ICE9IDIuMGYgfHwgRjQueiAhPSAzLjBmIHx8IEY0LncgIT0gNC4wZikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEY0LnggPSAyLjk5ZjsKKyAgICAgICAgRjQueSA9IDMuOTlmOworICAgICAgICBGNC56ID0gNC45OWY7CisgICAgICAgIEY0LncgPSA1Ljk5ZjsKKyAgICAgICAgcy5zZXRfZjQoRjQpOworCisgICAgICAgIERvdWJsZTIgRDIgPSBzLmdldF9kMigpOworICAgICAgICBpZiAoRDIueCAhPSAxLjAgfHwgRDIueSAhPSAyLjApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBEMi54ID0gMi45OTsKKyAgICAgICAgRDIueSA9IDMuOTk7CisgICAgICAgIHMuc2V0X2QyKEQyKTsKKworICAgICAgICBEb3VibGUzIEQzID0gcy5nZXRfZDMoKTsKKyAgICAgICAgaWYgKEQzLnggIT0gMS4wIHx8IEQzLnkgIT0gMi4wIHx8IEQzLnogIT0gMy4wKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgRDMueCA9IDIuOTk7CisgICAgICAgIEQzLnkgPSAzLjk5OworICAgICAgICBEMy56ID0gNC45OTsKKyAgICAgICAgcy5zZXRfZDMoRDMpOworCisgICAgICAgIERvdWJsZTQgRDQgPSBzLmdldF9kNCgpOworICAgICAgICBpZiAoRDQueCAhPSAxLjAgfHwgRDQueSAhPSAyLjAgfHwgRDQueiAhPSAzLjAgfHwgRDQudyAhPSA0LjApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBENC54ID0gMi45OTsKKyAgICAgICAgRDQueSA9IDMuOTk7CisgICAgICAgIEQ0LnogPSA0Ljk5OworICAgICAgICBENC53ID0gNS45OTsKKyAgICAgICAgcy5zZXRfZDQoRDQpOworCisgICAgICAgIEJ5dGUyIEIyID0gcy5nZXRfaThfMigpOworICAgICAgICBpZiAoQjIueCAhPSAxIHx8IEIyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEIyLnggPSAyOworICAgICAgICBCMi55ID0gMzsKKyAgICAgICAgcy5zZXRfaThfMihCMik7CisKKyAgICAgICAgQnl0ZTMgQjMgPSBzLmdldF9pOF8zKCk7CisgICAgICAgIGlmIChCMy54ICE9IDEgfHwgQjMueSAhPSAyIHx8IEIzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEIzLnggPSAyOworICAgICAgICBCMy55ID0gMzsKKyAgICAgICAgQjMueiA9IDQ7CisgICAgICAgIHMuc2V0X2k4XzMoQjMpOworCisgICAgICAgIEJ5dGU0IEI0ID0gcy5nZXRfaThfNCgpOworICAgICAgICBpZiAoQjQueCAhPSAxIHx8IEI0LnkgIT0gMiB8fCBCNC56ICE9IDMgfHwgQjQudyAhPSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQjQueCA9IDI7CisgICAgICAgIEI0LnkgPSAzOworICAgICAgICBCNC56ID0gNDsKKyAgICAgICAgQjQudyA9IDU7CisgICAgICAgIHMuc2V0X2k4XzQoQjQpOworCisgICAgICAgIFNob3J0MiBTMiA9IHMuZ2V0X3U4XzIoKTsKKyAgICAgICAgaWYgKFMyLnggIT0gMSB8fCBTMi55ICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTMi54ID0gMjsKKyAgICAgICAgUzIueSA9IDM7CisgICAgICAgIHMuc2V0X3U4XzIoUzIpOworCisgICAgICAgIFNob3J0MyBTMyA9IHMuZ2V0X3U4XzMoKTsKKyAgICAgICAgaWYgKFMzLnggIT0gMSB8fCBTMy55ICE9IDIgfHwgUzMueiAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgUzMueCA9IDI7CisgICAgICAgIFMzLnkgPSAzOworICAgICAgICBTMy56ID0gNDsKKyAgICAgICAgcy5zZXRfdThfMyhTMyk7CisKKyAgICAgICAgU2hvcnQ0IFM0ID0gcy5nZXRfdThfNCgpOworICAgICAgICBpZiAoUzQueCAhPSAxIHx8IFM0LnkgIT0gMiB8fCBTNC56ICE9IDMgfHwgUzQudyAhPSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgUzQueCA9IDI7CisgICAgICAgIFM0LnkgPSAzOworICAgICAgICBTNC56ID0gNDsKKyAgICAgICAgUzQudyA9IDU7CisgICAgICAgIHMuc2V0X3U4XzQoUzQpOworCisgICAgICAgIFMyID0gcy5nZXRfaTE2XzIoKTsKKyAgICAgICAgaWYgKFMyLnggIT0gMSB8fCBTMi55ICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTMi54ID0gMjsKKyAgICAgICAgUzIueSA9IDM7CisgICAgICAgIHMuc2V0X2kxNl8yKFMyKTsKKworICAgICAgICBTMyA9IHMuZ2V0X2kxNl8zKCk7CisgICAgICAgIGlmIChTMy54ICE9IDEgfHwgUzMueSAhPSAyIHx8IFMzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFMzLnggPSAyOworICAgICAgICBTMy55ID0gMzsKKyAgICAgICAgUzMueiA9IDQ7CisgICAgICAgIHMuc2V0X2kxNl8zKFMzKTsKKworICAgICAgICBTNCA9IHMuZ2V0X2kxNl80KCk7CisgICAgICAgIGlmIChTNC54ICE9IDEgfHwgUzQueSAhPSAyIHx8IFM0LnogIT0gMyB8fCBTNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTNC54ID0gMjsKKyAgICAgICAgUzQueSA9IDM7CisgICAgICAgIFM0LnogPSA0OworICAgICAgICBTNC53ID0gNTsKKyAgICAgICAgcy5zZXRfaTE2XzQoUzQpOworCisgICAgICAgIEludDIgSTIgPSBzLmdldF91MTZfMigpOworICAgICAgICBpZiAoSTIueCAhPSAxIHx8IEkyLnkgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEkyLnggPSAyOworICAgICAgICBJMi55ID0gMzsKKyAgICAgICAgcy5zZXRfdTE2XzIoSTIpOworCisgICAgICAgIEludDMgSTMgPSBzLmdldF91MTZfMygpOworICAgICAgICBpZiAoSTMueCAhPSAxIHx8IEkzLnkgIT0gMiB8fCBJMy56ICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBJMy54ID0gMjsKKyAgICAgICAgSTMueSA9IDM7CisgICAgICAgIEkzLnogPSA0OworICAgICAgICBzLnNldF91MTZfMyhJMyk7CisKKyAgICAgICAgSW50NCBJNCA9IHMuZ2V0X3UxNl80KCk7CisgICAgICAgIGlmIChJNC54ICE9IDEgfHwgSTQueSAhPSAyIHx8IEk0LnogIT0gMyB8fCBJNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBJNC54ID0gMjsKKyAgICAgICAgSTQueSA9IDM7CisgICAgICAgIEk0LnogPSA0OworICAgICAgICBJNC53ID0gNTsKKyAgICAgICAgcy5zZXRfdTE2XzQoSTQpOworCisgICAgICAgIEkyID0gcy5nZXRfaTMyXzIoKTsKKyAgICAgICAgaWYgKEkyLnggIT0gMSB8fCBJMi55ICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBJMi54ID0gMjsKKyAgICAgICAgSTIueSA9IDM7CisgICAgICAgIHMuc2V0X2kzMl8yKEkyKTsKKworICAgICAgICBJMyA9IHMuZ2V0X2kzMl8zKCk7CisgICAgICAgIGlmIChJMy54ICE9IDEgfHwgSTMueSAhPSAyIHx8IEkzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEkzLnggPSAyOworICAgICAgICBJMy55ID0gMzsKKyAgICAgICAgSTMueiA9IDQ7CisgICAgICAgIHMuc2V0X2kzMl8zKEkzKTsKKworICAgICAgICBJNCA9IHMuZ2V0X2kzMl80KCk7CisgICAgICAgIGlmIChJNC54ICE9IDEgfHwgSTQueSAhPSAyIHx8IEk0LnogIT0gMyB8fCBJNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBJNC54ID0gMjsKKyAgICAgICAgSTQueSA9IDM7CisgICAgICAgIEk0LnogPSA0OworICAgICAgICBJNC53ID0gNTsKKyAgICAgICAgcy5zZXRfaTMyXzQoSTQpOworCisgICAgICAgIExvbmcyIEwyID0gcy5nZXRfdTMyXzIoKTsKKyAgICAgICAgaWYgKEwyLnggIT0gMSB8fCBMMi55ICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMMi54ID0gMjsKKyAgICAgICAgTDIueSA9IDM7CisgICAgICAgIHMuc2V0X3UzMl8yKEwyKTsKKworICAgICAgICBMb25nMyBMMyA9IHMuZ2V0X3UzMl8zKCk7CisgICAgICAgIGlmIChMMy54ICE9IDEgfHwgTDMueSAhPSAyIHx8IEwzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEwzLnggPSAyOworICAgICAgICBMMy55ID0gMzsKKyAgICAgICAgTDMueiA9IDQ7CisgICAgICAgIHMuc2V0X3UzMl8zKEwzKTsKKworICAgICAgICBMb25nNCBMNCA9IHMuZ2V0X3UzMl80KCk7CisgICAgICAgIGlmIChMNC54ICE9IDEgfHwgTDQueSAhPSAyIHx8IEw0LnogIT0gMyB8fCBMNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMNC54ID0gMjsKKyAgICAgICAgTDQueSA9IDM7CisgICAgICAgIEw0LnogPSA0OworICAgICAgICBMNC53ID0gNTsKKyAgICAgICAgcy5zZXRfdTMyXzQoTDQpOworCisgICAgICAgIEwyID0gcy5nZXRfaTY0XzIoKTsKKyAgICAgICAgaWYgKEwyLnggIT0gMSB8fCBMMi55ICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMMi54ID0gMjsKKyAgICAgICAgTDIueSA9IDM7CisgICAgICAgIHMuc2V0X2k2NF8yKEwyKTsKKworICAgICAgICBMMyA9IHMuZ2V0X2k2NF8zKCk7CisgICAgICAgIGlmIChMMy54ICE9IDEgfHwgTDMueSAhPSAyIHx8IEwzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEwzLnggPSAyOworICAgICAgICBMMy55ID0gMzsKKyAgICAgICAgTDMueiA9IDQ7CisgICAgICAgIHMuc2V0X2k2NF8zKEwzKTsKKworICAgICAgICBMNCA9IHMuZ2V0X2k2NF80KCk7CisgICAgICAgIGlmIChMNC54ICE9IDEgfHwgTDQueSAhPSAyIHx8IEw0LnogIT0gMyB8fCBMNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMNC54ID0gMjsKKyAgICAgICAgTDQueSA9IDM7CisgICAgICAgIEw0LnogPSA0OworICAgICAgICBMNC53ID0gNTsKKyAgICAgICAgcy5zZXRfaTY0XzQoTDQpOworCisgICAgICAgIEwyID0gcy5nZXRfdTY0XzIoKTsKKyAgICAgICAgaWYgKEwyLnggIT0gMSB8fCBMMi55ICE9IDIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMMi54ID0gMjsKKyAgICAgICAgTDIueSA9IDM7CisgICAgICAgIHMuc2V0X3U2NF8yKEwyKTsKKworICAgICAgICBMMyA9IHMuZ2V0X3U2NF8zKCk7CisgICAgICAgIGlmIChMMy54ICE9IDEgfHwgTDMueSAhPSAyIHx8IEwzLnogIT0gMykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEwzLnggPSAyOworICAgICAgICBMMy55ID0gMzsKKyAgICAgICAgTDMueiA9IDQ7CisgICAgICAgIHMuc2V0X3U2NF8zKEwzKTsKKworICAgICAgICBMNCA9IHMuZ2V0X3U2NF80KCk7CisgICAgICAgIGlmIChMNC54ICE9IDEgfHwgTDQueSAhPSAyIHx8IEw0LnogIT0gMyB8fCBMNC53ICE9IDQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBMNC54ID0gMjsKKyAgICAgICAgTDQueSA9IDM7CisgICAgICAgIEw0LnogPSA0OworICAgICAgICBMNC53ID0gNTsKKyAgICAgICAgcy5zZXRfdTY0XzQoTDQpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgUmVuZGVyU2NyaXB0IHBSUyA9IFJlbmRlclNjcmlwdC5jcmVhdGUobUN0eCk7CisgICAgICAgIFNjcmlwdENfdmVjdG9yIHMgPSBuZXcgU2NyaXB0Q192ZWN0b3IocFJTLCBtUmVzLCBSLnJhdy52ZWN0b3IpOworICAgICAgICBwUlMuc2V0TWVzc2FnZUhhbmRsZXIobVJzTWVzc2FnZSk7CisgICAgICAgIGlmICghaW5pdGlhbGl6ZUdsb2JhbHMocykpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy5pbnZva2VfdmVjdG9yX3Rlc3QoKTsKKyAgICAgICAgICAgIHBSUy5maW5pc2goKTsKKyAgICAgICAgICAgIHdhaXRGb3JNZXNzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgcFJTLmRlc3Ryb3koKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVW5pdFRlc3QuamF2YSBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9Vbml0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OGEyNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvVW5pdFRlc3QuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQucnMudGVzdF92MTQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnJlbmRlcnNjcmlwdC5SZW5kZXJTY3JpcHQuUlNNZXNzYWdlSGFuZGxlcjsKKworcHVibGljIGNsYXNzIFVuaXRUZXN0IGV4dGVuZHMgVGhyZWFkIHsKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIGludCByZXN1bHQ7CisgICAgcHJpdmF0ZSBTY3JpcHRGaWVsZF9MaXN0QWxsb2NzX3MuSXRlbSBtSXRlbTsKKyAgICBwcml2YXRlIFJTVGVzdENvcmUgbVJTVEM7CisgICAgcHJpdmF0ZSBib29sZWFuIG1zZ0hhbmRsZWQ7CisgICAgcHJvdGVjdGVkIENvbnRleHQgbUN0eDsKKworICAgIC8qIFRoZXNlIGNvbnN0YW50cyBtdXN0IG1hdGNoIHRob3NlIGluIHNoYXJlZC5yc2ggKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSU19NU0dfVEVTVF9QQVNTRUQgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlNfTVNHX1RFU1RfRkFJTEVEID0gMTAxOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG51bVRlc3RzID0gMDsKKyAgICBwdWJsaWMgaW50IHRlc3RJRDsKKworICAgIHByb3RlY3RlZCBVbml0VGVzdChSU1Rlc3RDb3JlIHJzdGMsIFN0cmluZyBuLCBpbnQgaW5pdFJlc3VsdCwgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgbVJTVEMgPSByc3RjOworICAgICAgICBuYW1lID0gbjsKKyAgICAgICAgbXNnSGFuZGxlZCA9IGZhbHNlOworICAgICAgICBtQ3R4ID0gY3R4OworICAgICAgICByZXN1bHQgPSBpbml0UmVzdWx0OworICAgICAgICB0ZXN0SUQgPSBudW1UZXN0cysrOworICAgIH0KKworICAgIHByb3RlY3RlZCBVbml0VGVzdChSU1Rlc3RDb3JlIHJzdGMsIFN0cmluZyBuLCBDb250ZXh0IGN0eCkgeworICAgICAgICB0aGlzKHJzdGMsIG4sIDAsIGN0eCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KFJTVGVzdENvcmUgcnN0YywgQ29udGV4dCBjdHgpIHsKKyAgICAgICAgdGhpcyAocnN0YywgIjxVbmtub3duPiIsIGN0eCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFVuaXRUZXN0KENvbnRleHQgY3R4KSB7CisgICAgICAgIHRoaXMgKG51bGwsIGN0eCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgX1JTX0FTU0VSVChTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiBiKSB7CisgICAgICAgIGlmKGIgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgTG9nLmUobmFtZSwgbWVzc2FnZSArICIgRkFJTEVEIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVSSgpIHsKKyAgICAgICAgaWYgKG1JdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1JdGVtLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIG1zZ0hhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtUlNUQy5yZWZyZXNoVGVzdFJlc3VsdHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8qIElnbm9yZSB0aGUgY2FzZSB3aGVyZSBvdXIgbWVzc2FnZSByZWNlaXZlciBoYXMgYmVlbgorICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZC4gVGhpcyBoYXBwZW5zIHdoZW4gd2UgbGVhdmUgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgYmVmb3JlIGl0IGZpbmlzaGVzIHJ1bm5pbmcgYWxsIG9mIHRoZSB1bml0IHRlc3RzLiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJTTWVzc2FnZUhhbmRsZXIgbVJzTWVzc2FnZSA9IG5ldyBSU01lc3NhZ2VIYW5kbGVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1JRCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJTX01TR19URVNUX1BBU1NFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSU19NU0dfVEVTVF9GQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgUlNUZXN0X3YxNC5sb2coIlVuaXQgdGVzdCBnb3QgdW5leHBlY3RlZCBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1cGRhdGVVSSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyB2b2lkIHdhaXRGb3JNZXNzYWdlKCkgeworICAgICAgICB3aGlsZSAoIW1zZ0hhbmRsZWQpIHsKKyAgICAgICAgICAgIHlpZWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJdGVtKFNjcmlwdEZpZWxkX0xpc3RBbGxvY3Nfcy5JdGVtIGl0ZW0pIHsKKyAgICAgICAgbUl0ZW0gPSBpdGVtOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgLyogVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgZm9yIGVhY2ggc3ViY2xhc3MgKi8KKyAgICAgICAgaWYgKG1SU1RDICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1SU1RDLnJlZnJlc2hUZXN0UmVzdWx0cygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2FsbG9jLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2FsbG9jLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvYWxsb2MucnMKQEAgLTAsMCArMSw5NCBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKK2ludCAqYTsKK2ludCBkaW1YOworaW50IGRpbVk7CitpbnQgZGltWjsKKworcnNfYWxsb2NhdGlvbiBhRmFjZXM7Cityc19hbGxvY2F0aW9uIGFMT0Q7Cityc19hbGxvY2F0aW9uIGFGYWNlc0xPRDsKKworc3RhdGljIGJvb2wgdGVzdF9hbGxvY19kaW1zKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgZGltWTsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1YOyBpKyspIHsKKyAgICAgICAgICAgIGFbaSArIGogKiBkaW1YXSA9IGkgKyBqICogZGltWDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJzX2FsbG9jYXRpb24gYWxsb2MgPSByc0dldEFsbG9jYXRpb24oYSk7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1YKGFsbG9jKSA9PSBkaW1YKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbVkoYWxsb2MpID09IGRpbVkpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWihhbGxvYykgPT0gZGltWik7CisKKyAgICAvLyBUZXN0IDJEIGFkZHJlc3NpbmcKKyAgICBmb3IgKGogPSAwOyBqIDwgZGltWTsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkaW1YOyBpKyspIHsKKyAgICAgICAgICAgIHJzRGVidWcoIlZlcmlmeWluZyAiLCBpICsgaiAqIGRpbVgpOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqcCA9IHJzR2V0RWxlbWVudEF0KGFsbG9jLCBpLCBqKTsKKyAgICAgICAgICAgIGludCB2YWwgPSAqKGNvbnN0IGludCAqKXA7CisgICAgICAgICAgICBfUlNfQVNTRVJUKHZhbCA9PSAoaSArIGogKiBkaW1YKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUZXN0IDFEIGFkZHJlc3NpbmcKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltWCAqIGRpbVk7IGkrKykgeworICAgICAgICByc0RlYnVnKCJWZXJpZnlpbmcgIiwgaSk7CisgICAgICAgIGNvbnN0IHZvaWQgKnAgPSByc0dldEVsZW1lbnRBdChhbGxvYywgaSk7CisgICAgICAgIGludCB2YWwgPSAqKGNvbnN0IGludCAqKXA7CisgICAgICAgIF9SU19BU1NFUlQodmFsID09IGkpOworICAgIH0KKworICAgIC8vIFRlc3QgM0QgYWRkcmVzc2luZworICAgIGZvciAoaiA9IDA7IGogPCBkaW1ZOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRpbVg7IGkrKykgeworICAgICAgICAgICAgcnNEZWJ1ZygiVmVyaWZ5aW5nICIsIGkgKyBqICogZGltWCk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpwID0gcnNHZXRFbGVtZW50QXQoYWxsb2MsIGksIGosIDApOworICAgICAgICAgICAgaW50IHZhbCA9ICooY29uc3QgaW50ICopcDsKKyAgICAgICAgICAgIF9SU19BU1NFUlQodmFsID09IChpICsgaiAqIGRpbVgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWChhRmFjZXMpID09IGRpbVgpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWShhRmFjZXMpID09IGRpbVkpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWihhRmFjZXMpID09IGRpbVopOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltRmFjZXMoYUZhY2VzKSAhPSAwKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbUxPRChhRmFjZXMpID09IDApOworCisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1YKGFMT0QpID09IGRpbVgpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWShhTE9EKSA9PSBkaW1ZKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbVooYUxPRCkgPT0gZGltWik7CisgICAgX1JTX0FTU0VSVChyc0FsbG9jYXRpb25HZXREaW1GYWNlcyhhTE9EKSA9PSAwKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbUxPRChhTE9EKSAhPSAwKTsKKworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWChhRmFjZXNMT0QpID09IGRpbVgpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWShhRmFjZXNMT0QpID09IGRpbVkpOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltWihhRmFjZXNMT0QpID09IGRpbVopOworICAgIF9SU19BU1NFUlQocnNBbGxvY2F0aW9uR2V0RGltRmFjZXMoYUZhY2VzTE9EKSAhPSAwKTsKKyAgICBfUlNfQVNTRVJUKHJzQWxsb2NhdGlvbkdldERpbUxPRChhRmFjZXNMT0QpICE9IDApOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2FsbG9jX2RpbXMgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2FsbG9jX2RpbXMgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCBhbGxvY190ZXN0KCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IHRlc3RfYWxsb2NfZGltcygpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZm9yZWFjaC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mb3JlYWNoLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTNlZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZm9yZWFjaC5ycwpAQCAtMCwwICsxLDQyIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworaW50ICphOworaW50IGRpbVg7CitpbnQgZGltWTsKKwordm9pZCByb290KGludCAqb3V0LCB1aW50MzJfdCB4LCB1aW50MzJfdCB5KSB7CisgICAgKm91dCA9IHggKyB5ICogZGltWDsKK30KKworc3RhdGljIGJvb2wgdGVzdF9mb3JlYWNoX291dHB1dCgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGludCBpLCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IGRpbVk7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZGltWDsgaSsrKSB7CisgICAgICAgICAgICBfUlNfQVNTRVJUKGFbaSArIGogKiBkaW1YXSA9PSAoaSArIGogKiBkaW1YKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZm9yZWFjaF9vdXRwdXQgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ZvcmVhY2hfb3V0cHV0IFBBU1NFRCIsIDApOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgZm9yZWFjaF90ZXN0KCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IHRlc3RfZm9yZWFjaF9vdXRwdXQoKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L2ZwX21hZC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9mcF9tYWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZmMmIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvZnBfbWFkLnJzCkBAIC0wLDAgKzEsMTc0IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworY29uc3QgaW50IFRFU1RfQ09VTlQgPSAxOworCitzdGF0aWMgZmxvYXQgZGF0YV9mMVsxMDI1XTsKK3N0YXRpYyBmbG9hdDQgZGF0YV9mNFsxMDI1XTsKKworc3RhdGljIHZvaWQgdGVzdF9tYWQ0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MSBiaWxsaW9uIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqICgxMDAwIC8gODApOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gKGRhdGFfZjRbaV0gKiAwLjAyZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSsxXSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzJdICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krM10gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzRdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs1XSAqIDAuMmYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krNl0gKiAwLjFmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mNFtpKzddICogMC4wNWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Y0W2krOF0gKiAwLjA0ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjRbaSs5XSAqIDAuMDJmICsgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX21hZDQgTSBvcHMiLCAxMDAwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9tYWQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xIGJpbGxpb24gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogKDEwMDAgLyAyMCk7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjFbaV0gPSAoZGF0YV9mMVtpXSAqIDAuMDJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzFdICogMC4wNGYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krMl0gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSszXSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krNF0gKiAwLjJmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzVdICogMC4yZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs2XSAqIDAuMWYgKworICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2YxW2krN10gKiAwLjA1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZjFbaSs4XSAqIDAuMDRmICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9mMVtpKzldICogMC4wMmYgKyAxLmYpOworICAgICAgICB9CisgICAgfQorCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisgICAgcnNEZWJ1ZygiZnBfbWFkIE0gb3BzIiwgMTAwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfbm9ybSh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICBmbG9hdCB0b3RhbCA9IDA7CisgICAgLy8gRG8gfjEwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTA7IGN0KyspIHsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgKDEwMDApOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFfZjRbaV0gPSBub3JtYWxpemUoZGF0YV9mNFtpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCB0aW1lID0gZW5kKGluZGV4KTsKKyAgICByc0RlYnVnKCJmcF9ub3JtIE0gb3BzIiwgMTAuZiAvIHRpbWUpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NpbmNvczQodWludDMyX3QgaW5kZXgpIHsKKyAgICBzdGFydCgpOworCisgICAgZmxvYXQgdG90YWwgPSAwOworICAgIC8vIERvIH4xMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwIC8gNDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mNFtpXSA9IHNpbihkYXRhX2Y0W2ldKSAqIGNvcyhkYXRhX2Y0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvczQgTSBvcHMiLCAxMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2luY29zKHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAgTSBvcHMKKyAgICBmb3IgKGludCBjdD0wOyBjdCA8IDEwMDAgKiAxMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgZGF0YV9mMVtpXSA9IHNpbihkYXRhX2YxW2ldKSAqIGNvcyhkYXRhX2YxW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX3NpbmNvcyBNIG9wcyIsIDEwLmYgLyB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jbGFtcCh1aW50MzJfdCBpbmRleCkgeworICAgIHN0YXJ0KCk7CisKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwOyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2YxW2ldID0gY2xhbXAoZGF0YV9mMVtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIE0gb3BzIiwgMTAwLmYgLyB0aW1lKTsKKworICAgIHN0YXJ0KCk7CisgICAgLy8gRG8gfjEwMCBNIG9wcworICAgIGZvciAoaW50IGN0PTA7IGN0IDwgMTAwMCAqIDEwMDsgY3QrKykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCAoMTAwMCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGRhdGFfZjFbaV0gPCAtMS5mKSBkYXRhX2YxW2ldID0gLTEuZjsKKyAgICAgICAgICAgIGlmIChkYXRhX2YxW2ldID4gLTEuZikgZGF0YV9mMVtpXSA9IDEuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wIHJlZiBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfY2xhbXA0KHVpbnQzMl90IGluZGV4KSB7CisgICAgc3RhcnQoKTsKKworICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAvLyBEbyB+MTAwIE0gb3BzCisgICAgZm9yIChpbnQgY3Q9MDsgY3QgPCAxMDAwICogMTAwIC80OyBjdCsrKSB7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8ICgxMDAwKTsgaSsrKSB7CisgICAgICAgICAgICBkYXRhX2Y0W2ldID0gY2xhbXAoZGF0YV9mNFtpXSwgLTEuZiwgMS5mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworICAgIHJzRGVidWcoImZwX2NsYW1wNCBNIG9wcyIsIDEwMC5mIC8gdGltZSk7Cit9CisKK3ZvaWQgZnBfbWFkX3Rlc3QodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGludCB4OworICAgIGZvciAoeD0wOyB4IDwgMTAyNTsgeCsrKSB7CisgICAgICAgIGRhdGFfZjFbeF0gPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnggPSAoeCAmIDB4ZikgKiAwLjFmOworICAgICAgICBkYXRhX2Y0W3hdLnkgPSAoeCAmIDB4ZjApICogMC4xZjsKKyAgICAgICAgZGF0YV9mNFt4XS56ID0gKHggJiAweDMzKSAqIDAuMWY7CisgICAgICAgIGRhdGFfZjRbeF0udyA9ICh4ICYgMHg3NykgKiAwLjFmOworICAgIH0KKworICAgIHRlc3RfbWFkNChpbmRleCk7CisgICAgdGVzdF9tYWQoaW5kZXgpOworCisgICAgZm9yICh4PTA7IHggPCAxMDI1OyB4KyspIHsKKyAgICAgICAgZGF0YV9mMVt4XSA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueCA9ICh4ICYgMHhmKSAqIDAuMWYgKyAxLmY7CisgICAgICAgIGRhdGFfZjRbeF0ueSA9ICh4ICYgMHhmMCkgKiAwLjFmICsgMS5mOworICAgICAgICBkYXRhX2Y0W3hdLnogPSAoeCAmIDB4MzMpICogMC4xZiArIDEuZjsKKyAgICAgICAgZGF0YV9mNFt4XS53ID0gKHggJiAweDc3KSAqIDAuMWYgKyAxLmY7CisgICAgfQorCisgICAgdGVzdF9ub3JtKGluZGV4KTsKKyAgICB0ZXN0X3NpbmNvczQoaW5kZXgpOworICAgIHRlc3Rfc2luY29zKGluZGV4KTsKKyAgICB0ZXN0X2NsYW1wNChpbmRleCk7CisgICAgdGVzdF9jbGFtcChpbmRleCk7CisKKyAgICAvLyBUT0RPIEFjdHVhbGx5IHZlcmlmeSB0ZXN0IHJlc3VsdCBhY2N1cmFjeQorICAgIHJzRGVidWcoImZwX21hZF90ZXN0IFBBU1NFRCIsIDApOworICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKK30KKworCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjM3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycwpAQCAtMCwwICsxLDQ2MiBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgbWF0aCBsaWJyYXJ5CisKK3ZvbGF0aWxlIGZsb2F0IGYxOwordm9sYXRpbGUgZmxvYXQyIGYyOwordm9sYXRpbGUgZmxvYXQzIGYzOwordm9sYXRpbGUgZmxvYXQ0IGY0OworCit2b2xhdGlsZSBpbnQgaTE7Cit2b2xhdGlsZSBpbnQyIGkyOwordm9sYXRpbGUgaW50MyBpMzsKK3ZvbGF0aWxlIGludDQgaTQ7CisKK3ZvbGF0aWxlIHVpbnQgdWkxOwordm9sYXRpbGUgdWludDIgdWkyOwordm9sYXRpbGUgdWludDMgdWkzOwordm9sYXRpbGUgdWludDQgdWk0OworCit2b2xhdGlsZSBzaG9ydCBzMTsKK3ZvbGF0aWxlIHNob3J0MiBzMjsKK3ZvbGF0aWxlIHNob3J0MyBzMzsKK3ZvbGF0aWxlIHNob3J0NCBzNDsKKwordm9sYXRpbGUgdXNob3J0IHVzMTsKK3ZvbGF0aWxlIHVzaG9ydDIgdXMyOwordm9sYXRpbGUgdXNob3J0MyB1czM7Cit2b2xhdGlsZSB1c2hvcnQ0IHVzNDsKKwordm9sYXRpbGUgY2hhciBjMTsKK3ZvbGF0aWxlIGNoYXIyIGMyOwordm9sYXRpbGUgY2hhcjMgYzM7Cit2b2xhdGlsZSBjaGFyNCBjNDsKKwordm9sYXRpbGUgdWNoYXIgdWMxOwordm9sYXRpbGUgdWNoYXIyIHVjMjsKK3ZvbGF0aWxlIHVjaGFyMyB1YzM7Cit2b2xhdGlsZSB1Y2hhcjQgdWM0OworCisjZGVmaW5lIERFQ0xfSU5UKHByZWZpeCkgICAgICAgICAgICBcCit2b2xhdGlsZSBjaGFyIHByZWZpeCMjX2NfMSA9IDE7ICAgICBcCit2b2xhdGlsZSBjaGFyMiBwcmVmaXgjI19jXzIgPSAxOyAgICBcCit2b2xhdGlsZSBjaGFyMyBwcmVmaXgjI19jXzMgPSAxOyAgICBcCit2b2xhdGlsZSBjaGFyNCBwcmVmaXgjI19jXzQgPSAxOyAgICBcCit2b2xhdGlsZSB1Y2hhciBwcmVmaXgjI191Y18xID0gMTsgICBcCit2b2xhdGlsZSB1Y2hhcjIgcHJlZml4IyNfdWNfMiA9IDE7ICBcCit2b2xhdGlsZSB1Y2hhcjMgcHJlZml4IyNfdWNfMyA9IDE7ICBcCit2b2xhdGlsZSB1Y2hhcjQgcHJlZml4IyNfdWNfNCA9IDE7ICBcCit2b2xhdGlsZSBzaG9ydCBwcmVmaXgjI19zXzEgPSAxOyAgICBcCit2b2xhdGlsZSBzaG9ydDIgcHJlZml4IyNfc18yID0gMTsgICBcCit2b2xhdGlsZSBzaG9ydDMgcHJlZml4IyNfc18zID0gMTsgICBcCit2b2xhdGlsZSBzaG9ydDQgcHJlZml4IyNfc180ID0gMTsgICBcCit2b2xhdGlsZSB1c2hvcnQgcHJlZml4IyNfdXNfMSA9IDE7ICBcCit2b2xhdGlsZSB1c2hvcnQyIHByZWZpeCMjX3VzXzIgPSAxOyBcCit2b2xhdGlsZSB1c2hvcnQzIHByZWZpeCMjX3VzXzMgPSAxOyBcCit2b2xhdGlsZSB1c2hvcnQ0IHByZWZpeCMjX3VzXzQgPSAxOyBcCit2b2xhdGlsZSBpbnQgcHJlZml4IyNfaV8xID0gMTsgICAgICBcCit2b2xhdGlsZSBpbnQyIHByZWZpeCMjX2lfMiA9IDE7ICAgICBcCit2b2xhdGlsZSBpbnQzIHByZWZpeCMjX2lfMyA9IDE7ICAgICBcCit2b2xhdGlsZSBpbnQ0IHByZWZpeCMjX2lfNCA9IDE7ICAgICBcCit2b2xhdGlsZSB1aW50IHByZWZpeCMjX3VpXzEgPSAxOyAgICBcCit2b2xhdGlsZSB1aW50MiBwcmVmaXgjI191aV8yID0gMTsgICBcCit2b2xhdGlsZSB1aW50MyBwcmVmaXgjI191aV8zID0gMTsgICBcCit2b2xhdGlsZSB1aW50NCBwcmVmaXgjI191aV80ID0gMTsgICBcCit2b2xhdGlsZSBsb25nIHByZWZpeCMjX2xfMSA9IDE7ICAgICBcCit2b2xhdGlsZSB1bG9uZyBwcmVmaXgjI191bF8xID0gMTsKKworREVDTF9JTlQocmVzKQorREVDTF9JTlQoc3JjMSkKK0RFQ0xfSU5UKHNyYzIpCisKKyNkZWZpbmUgVEVTVF9JTlRfT1BfVFlQRShvcCwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIxIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMSA9IHNyYzFfIyN0eXBlIyNfMSBvcCBzcmMyXyMjdHlwZSMjXzE7ICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiMiIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzIgPSBzcmMxXyMjdHlwZSMjXzIgb3Agc3JjMl8jI3R5cGUjI18yOyAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjMiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18zID0gc3JjMV8jI3R5cGUjI18zIG9wIHNyYzJfIyN0eXBlIyNfMzsgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICI0IiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfNCA9IHNyYzFfIyN0eXBlIyNfNCBvcCBzcmMyXyMjdHlwZSMjXzQ7CisKKyNkZWZpbmUgVEVTVF9JTlRfT1Aob3ApICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgYykgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCB1YykgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHMpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdXMpICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBpKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVpKSAgICAgICAgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciBsMSIsIGkrKyk7ICAgICBcCityZXNfbF8xID0gc3JjMV9sXzEgb3Agc3JjMl9sXzE7ICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgdWwxIiwgaSsrKTsgICAgXAorcmVzX3VsXzEgPSBzcmMxX3VsXzEgb3Agc3JjMl91bF8xOworCisjZGVmaW5lIFRFU1RfWE5fRlVOQ19ZTih0eXBlb3V0LCBmbmMsIHR5cGVpbikgICBcCisgICAgcmVzXyMjdHlwZW91dCMjXzEgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzEpOyBcCisgICAgcmVzXyMjdHlwZW91dCMjXzIgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzIpOyBcCisgICAgcmVzXyMjdHlwZW91dCMjXzMgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzMpOyBcCisgICAgcmVzXyMjdHlwZW91dCMjXzQgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzQpOworCisjZGVmaW5lIFRFU1RfWE5fRlVOQ19YTl9YTih0eXBlLCBmbmMpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzXyMjdHlwZSMjXzEgPSBmbmMoc3JjMV8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEpOyBcCisgICAgcmVzXyMjdHlwZSMjXzIgPSBmbmMoc3JjMV8jI3R5cGUjI18yLCBzcmMyXyMjdHlwZSMjXzIpOyBcCisgICAgcmVzXyMjdHlwZSMjXzMgPSBmbmMoc3JjMV8jI3R5cGUjI18zLCBzcmMyXyMjdHlwZSMjXzMpOyBcCisgICAgcmVzXyMjdHlwZSMjXzQgPSBmbmMoc3JjMV8jI3R5cGUjI180LCBzcmMyXyMjdHlwZSMjXzQpOworCisjZGVmaW5lIFRFU1RfWF9GVU5DX1hfWF9YKHR5cGUsIGZuYykgICAgXAorICAgIHJlc18jI3R5cGUjI18xID0gZm5jKHNyYzFfIyN0eXBlIyNfMSwgc3JjMl8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEpOworCisjZGVmaW5lIFRFU1RfSU5fRlVOQ19JTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVjLCBmbmMsIHVjKSAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKGMsIGZuYywgYykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVzLCBmbmMsIHVzKSAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHMsIGZuYywgcykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVpLCBmbmMsIHVpKSAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKGksIGZuYywgaSkKKworI2RlZmluZSBURVNUX1VJTl9GVU5DX0lOKGZuYykgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1YywgZm5jLCBjKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1cywgZm5jLCBzKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1aSwgZm5jLCBpKSAgICAgXAorCisjZGVmaW5lIFRFU1RfSU5fRlVOQ19JTl9JTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHVjLCBmbmMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKGMsIGZuYykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHVzLCBmbmMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHMsIGZuYykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHVpLCBmbmMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKGksIGZuYykKKworI2RlZmluZSBURVNUX0lfRlVOQ19JX0lfSShmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHVjLCBmbmMpICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKGMsIGZuYykgICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHVzLCBmbmMpICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHMsIGZuYykgICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHVpLCBmbmMpICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKGksIGZuYykKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUEZOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoZmxvYXQqKSAmZjEpOyAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoZmxvYXQyKikgJmYyKTsgICAgXAorICAgIGYzID0gZm5jKGYzLCAoZmxvYXQzKikgJmYzKTsgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoZmxvYXQ0KikgJmY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMik7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GMzRfRlVOQ19GMzRfRjM0KGZuYykgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGYxKTsKKworI2RlZmluZSBURVNUX0ZfRlVOQ19GTihmbmMpICAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGY0KTsKKworI2RlZmluZSBURVNUX0ZfRlVOQ19GTl9GTihmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYyLCBmMik7ICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0lOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgaTIpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgaTMpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgaTQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9JKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGkxKTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oZm5jKSAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSwgZjEpOyAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMiwgZjIpOyAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMywgZjMpOyAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9GKGZuYykgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGYxLCBmMSk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX1BJTihmbmMpICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgKGludCopICZpMSk7ICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgKGludDIqKSAmaTIpOyAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgKGludDMqKSAmaTMpOyAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgKGludDQqKSAmaTQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9QSU4oZm5jKSBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCAoaW50KikgJmkxKTsgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyLCAoaW50MiopICZpMik7ICBcCisgICAgZjMgPSBmbmMoZjMsIGYzLCAoaW50MyopICZpMyk7ICBcCisgICAgZjQgPSBmbmMoZjQsIGY0LCAoaW50NCopICZpNCk7CisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0ZOKGZuYykgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBpMSA9IGZuYyhmMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpMiA9IGZuYyhmMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpMyA9IGZuYyhmMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpNCA9IGZuYyhmNCk7CisKK3N0YXRpYyBib29sIHRlc3RfZnBfbWF0aCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RhcnQoKTsKKworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvc2gpOworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zcGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2lucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oYXRhbjIpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGF0YW4ycGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihjYnJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY2VpbCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGNsYW1wKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRihjbGFtcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGNvcHlzaWduKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvc3BpKTsKKyAgICBURVNUX0YzNF9GVU5DX0YzNF9GMzQoY3Jvc3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihkZWdyZWVzKTsKKyAgICBURVNUX0ZfRlVOQ19GTl9GTihkaXN0YW5jZSk7CisgICAgVEVTVF9GX0ZVTkNfRk5fRk4oZG90KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXJmYyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGVyZik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cDIpOworICAgIFRFU1RfRk5fRlVOQ19GTihleHAxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cG0xKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZmFicyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZkaW0pOworICAgIFRFU1RfRk5fRlVOQ19GTihmbG9vcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGZtYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKGZtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihmbWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1vZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihmcmFjdCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BJTihmcmV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGh5cG90KTsKKyAgICBURVNUX0lOX0ZVTkNfRk4oaWxvZ2IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihsZGV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0kobGRleHApOworICAgIFRFU1RfRl9GVU5DX0ZOKGxlbmd0aCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BJTihsZ2FtbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nMTApOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cxcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZ2IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihtYWQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKG1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YobWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4obWl4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRihtaXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QRk4obW9kZik7CisgICAgLy8gbmFuCisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG5leHRhZnRlcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKG5vcm1hbGl6ZSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHBvdyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKHBvd24pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihwb3dyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocmFkaWFucyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHJlbWFpbmRlcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihyZW1xdW8pOworICAgIFRFU1RfRk5fRlVOQ19GTihyaW50KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocm9vdG4pOworICAgIFRFU1RfRk5fRlVOQ19GTihyb3VuZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJzcXJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2lnbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihzaW5jb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2lucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihzcXJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oc3RlcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0Yoc3RlcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTih0YW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRydW5jKTsKKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ZwX21hdGggRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ZwX21hdGggUEFTU0VEIiwgdGltZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworc3RhdGljIGJvb2wgdGVzdF9pbnRfbWF0aCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RhcnQoKTsKKworICAgIFRFU1RfVUlOX0ZVTkNfSU4oYWJzKTsKKyAgICBURVNUX0lOX0ZVTkNfSU4oY2x6KTsKKyAgICBURVNUX0lOX0ZVTkNfSU5fSU4obWluKTsKKyAgICBURVNUX0lOX0ZVTkNfSU5fSU4obWF4KTsKKyAgICBURVNUX0lfRlVOQ19JX0lfSShyc0NsYW1wKTsKKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ludF9tYXRoIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9pbnRfbWF0aCBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X2Jhc2ljX29wZXJhdG9ycygpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGludCBpID0gMDsKKworICAgIFRFU1RfSU5UX09QKCspOworICAgIFRFU1RfSU5UX09QKC0pOworICAgIFRFU1RfSU5UX09QKCopOworICAgIFRFU1RfSU5UX09QKC8pOworICAgIFRFU1RfSU5UX09QKCUpOworICAgIFRFU1RfSU5UX09QKDw8KTsKKyAgICBURVNUX0lOVF9PUCg+Pik7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfYmFzaWNfb3BlcmF0b3JzIEZBSUxFRCIsIDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworI2RlZmluZSBURVNUX0NWVCh0bywgZnJvbSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nIGNvbnZlcnQgZnJvbSAiICNmcm9tICIgdG8gIiAjdG8sIDApOyAgIFwKK3RvIyMxID0gZnJvbSMjMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordG8jIzIgPSBjb252ZXJ0XyMjdHlwZSMjMihmcm9tIyMyKTsgICAgICAgICAgICAgICAgICAgICBcCit0byMjMyA9IGNvbnZlcnRfIyN0eXBlIyMzKGZyb20jIzMpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyM0ID0gY29udmVydF8jI3R5cGUjIzQoZnJvbSMjNCk7CisKKyNkZWZpbmUgVEVTVF9DVlRfTUFUUklYKHRvLCB0eXBlKSAgIFwKK1RFU1RfQ1ZUKHRvLCBjLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1YywgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBzLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1cywgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBpLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1aSwgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBmLCB0eXBlKTsgICAgICAgICAgICAgIFwKKworc3RhdGljIGJvb2wgdGVzdF9jb252ZXJ0KCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICBURVNUX0NWVF9NQVRSSVgoYywgY2hhcik7CisgICAgVEVTVF9DVlRfTUFUUklYKHVjLCB1Y2hhcik7CisgICAgVEVTVF9DVlRfTUFUUklYKHMsIHNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodXMsIHVzaG9ydCk7CisgICAgVEVTVF9DVlRfTUFUUklYKGksIGludCk7CisgICAgVEVTVF9DVlRfTUFUUklYKHVpLCB1aW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoZiwgZmxvYXQpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2NvbnZlcnQgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2NvbnZlcnQgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworI2RlZmluZSBJTklUX1BSRUZJWF9UWVBFKHByZWZpeCwgdHlwZSkgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzEgPSAxOyAgICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18yLnggPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfMi55ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzMueCA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI18zLnkgPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfMy56ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzQueCA9IDE7ICAgICAgICAgICAgICBcCitwcmVmaXgjI18jI3R5cGUjI180LnkgPSAxOyAgICAgICAgICAgICAgXAorcHJlZml4IyNfIyN0eXBlIyNfNC56ID0gMTsgICAgICAgICAgICAgIFwKK3ByZWZpeCMjXyMjdHlwZSMjXzQudyA9IDE7CisKKyNkZWZpbmUgSU5JVF9UWVBFKHR5cGUpICAgICAgICAgXAorSU5JVF9QUkVGSVhfVFlQRShzcmMxLCB0eXBlKSAgICBcCitJTklUX1BSRUZJWF9UWVBFKHNyYzIsIHR5cGUpICAgIFwKK0lOSVRfUFJFRklYX1RZUEUocmVzLCB0eXBlKQorCisjZGVmaW5lIElOSVRfQUxMICAgIFwKK0lOSVRfVFlQRShjKTsgICAgICAgXAorSU5JVF9UWVBFKHVjKTsgICAgICBcCitJTklUX1RZUEUocyk7ICAgICAgIFwKK0lOSVRfVFlQRSh1cyk7ICAgICAgXAorSU5JVF9UWVBFKGkpOyAgICAgICBcCitJTklUX1RZUEUodWkpOworCit2b2lkIG1hdGhfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBJTklUX0FMTDsKKyAgICBmYWlsZWQgfD0gdGVzdF9jb252ZXJ0KCk7CisgICAgZmFpbGVkIHw9IHRlc3RfZnBfbWF0aChpbmRleCk7CisgICAgZmFpbGVkIHw9IHRlc3RfaW50X21hdGgoaW5kZXgpOworICAgIGZhaWxlZCB8PSB0ZXN0X2Jhc2ljX29wZXJhdG9ycygpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycy5iYWsgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycy5iYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4MDJjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzLmJhawpAQCAtMCwwICsxLDQyMyBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKKy8vIFRlc3RpbmcgbWF0aCBsaWJyYXJ5CisKK3ZvbGF0aWxlIGZsb2F0IGYxOwordm9sYXRpbGUgZmxvYXQyIGYyOwordm9sYXRpbGUgZmxvYXQzIGYzOwordm9sYXRpbGUgZmxvYXQ0IGY0OworCit2b2xhdGlsZSBpbnQgaTE7Cit2b2xhdGlsZSBpbnQyIGkyOwordm9sYXRpbGUgaW50MyBpMzsKK3ZvbGF0aWxlIGludDQgaTQ7CisKK3ZvbGF0aWxlIHVpbnQgdWkxOwordm9sYXRpbGUgdWludDIgdWkyOwordm9sYXRpbGUgdWludDMgdWkzOwordm9sYXRpbGUgdWludDQgdWk0OworCit2b2xhdGlsZSBzaG9ydCBzMTsKK3ZvbGF0aWxlIHNob3J0MiBzMjsKK3ZvbGF0aWxlIHNob3J0MyBzMzsKK3ZvbGF0aWxlIHNob3J0NCBzNDsKKwordm9sYXRpbGUgdXNob3J0IHVzMTsKK3ZvbGF0aWxlIHVzaG9ydDIgdXMyOwordm9sYXRpbGUgdXNob3J0MyB1czM7Cit2b2xhdGlsZSB1c2hvcnQ0IHVzNDsKKwordm9sYXRpbGUgY2hhciBjMTsKK3ZvbGF0aWxlIGNoYXIyIGMyOwordm9sYXRpbGUgY2hhcjMgYzM7Cit2b2xhdGlsZSBjaGFyNCBjNDsKKwordm9sYXRpbGUgdWNoYXIgdWMxOwordm9sYXRpbGUgdWNoYXIyIHVjMjsKK3ZvbGF0aWxlIHVjaGFyMyB1YzM7Cit2b2xhdGlsZSB1Y2hhcjQgdWM0OworCisjZGVmaW5lIERFQ0xfSU5UKHByZWZpeCkgICAgICAgICAgICBcCit2b2xhdGlsZSBjaGFyIHByZWZpeCMjX2NfMSA9IDE7ICAgICBcCit2b2xhdGlsZSBjaGFyMiBwcmVmaXgjI19jXzIgPSAxOyAgICBcCit2b2xhdGlsZSBjaGFyMyBwcmVmaXgjI19jXzMgPSAxOyAgICBcCit2b2xhdGlsZSBjaGFyNCBwcmVmaXgjI19jXzQgPSAxOyAgICBcCit2b2xhdGlsZSB1Y2hhciBwcmVmaXgjI191Y18xID0gMTsgICBcCit2b2xhdGlsZSB1Y2hhcjIgcHJlZml4IyNfdWNfMiA9IDE7ICBcCit2b2xhdGlsZSB1Y2hhcjMgcHJlZml4IyNfdWNfMyA9IDE7ICBcCit2b2xhdGlsZSB1Y2hhcjQgcHJlZml4IyNfdWNfNCA9IDE7ICBcCit2b2xhdGlsZSBzaG9ydCBwcmVmaXgjI19zXzEgPSAxOyAgICBcCit2b2xhdGlsZSBzaG9ydDIgcHJlZml4IyNfc18yID0gMTsgICBcCit2b2xhdGlsZSBzaG9ydDMgcHJlZml4IyNfc18zID0gMTsgICBcCit2b2xhdGlsZSBzaG9ydDQgcHJlZml4IyNfc180ID0gMTsgICBcCit2b2xhdGlsZSB1c2hvcnQgcHJlZml4IyNfdXNfMSA9IDE7ICBcCit2b2xhdGlsZSB1c2hvcnQyIHByZWZpeCMjX3VzXzIgPSAxOyBcCit2b2xhdGlsZSB1c2hvcnQzIHByZWZpeCMjX3VzXzMgPSAxOyBcCit2b2xhdGlsZSB1c2hvcnQ0IHByZWZpeCMjX3VzXzQgPSAxOyBcCit2b2xhdGlsZSBpbnQgcHJlZml4IyNfaV8xID0gMTsgICAgICBcCit2b2xhdGlsZSBpbnQyIHByZWZpeCMjX2lfMiA9IDE7ICAgICBcCit2b2xhdGlsZSBpbnQzIHByZWZpeCMjX2lfMyA9IDE7ICAgICBcCit2b2xhdGlsZSBpbnQ0IHByZWZpeCMjX2lfNCA9IDE7ICAgICBcCit2b2xhdGlsZSB1aW50IHByZWZpeCMjX3VpXzEgPSAxOyAgICBcCit2b2xhdGlsZSB1aW50MiBwcmVmaXgjI191aV8yID0gMTsgICBcCit2b2xhdGlsZSB1aW50MyBwcmVmaXgjI191aV8zID0gMTsgICBcCit2b2xhdGlsZSB1aW50NCBwcmVmaXgjI191aV80ID0gMTsgICBcCit2b2xhdGlsZSBsb25nIHByZWZpeCMjX2xfMSA9IDE7ICAgICBcCit2b2xhdGlsZSB1bG9uZyBwcmVmaXgjI191bF8xID0gMTsKKworREVDTF9JTlQocmVzKQorREVDTF9JTlQoc3JjMSkKK0RFQ0xfSU5UKHNyYzIpCisKKyNkZWZpbmUgVEVTVF9JTlRfT1BfVFlQRShvcCwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIzIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMyA9IHNyYzFfIyN0eXBlIyNfMyBvcCBzcmMyXyMjdHlwZSMjXzM7ICAgIFwKKworI2RlZmluZSBURVNUX0lOVF9PUChvcCkgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBjKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVjKSAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIFRFU1RfWE5fRlVOQ19ZTih0eXBlb3V0LCBmbmMsIHR5cGVpbikgICBcCisgICAgcmVzXyMjdHlwZW91dCMjXzEgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzEpOyBcCisgICAgcmVzXyMjdHlwZW91dCMjXzIgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzIpOyBcCisgICAgcmVzXyMjdHlwZW91dCMjXzMgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzMpOyBcCisgICAgcmVzXyMjdHlwZW91dCMjXzQgPSBmbmMoc3JjMV8jI3R5cGVpbiMjXzQpOworCisjZGVmaW5lIFRFU1RfWE5fRlVOQ19YTl9YTih0eXBlLCBmbmMpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVzXyMjdHlwZSMjXzEgPSBmbmMoc3JjMV8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEpOyBcCisgICAgcmVzXyMjdHlwZSMjXzIgPSBmbmMoc3JjMV8jI3R5cGUjI18yLCBzcmMyXyMjdHlwZSMjXzIpOyBcCisgICAgcmVzXyMjdHlwZSMjXzMgPSBmbmMoc3JjMV8jI3R5cGUjI18zLCBzcmMyXyMjdHlwZSMjXzMpOyBcCisgICAgcmVzXyMjdHlwZSMjXzQgPSBmbmMoc3JjMV8jI3R5cGUjI180LCBzcmMyXyMjdHlwZSMjXzQpOworCisjZGVmaW5lIFRFU1RfWF9GVU5DX1hfWF9YKHR5cGUsIGZuYykgICAgXAorICAgIHJlc18jI3R5cGUjI18xID0gZm5jKHNyYzFfIyN0eXBlIyNfMSwgc3JjMl8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEpOworCisjZGVmaW5lIFRFU1RfSU5fRlVOQ19JTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVjLCBmbmMsIHVjKSAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKGMsIGZuYywgYykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVzLCBmbmMsIHVzKSAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHMsIGZuYywgcykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVpLCBmbmMsIHVpKSAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKGksIGZuYywgaSkKKworI2RlZmluZSBURVNUX1VJTl9GVU5DX0lOKGZuYykgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1YywgZm5jLCBjKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1cywgZm5jLCBzKSAgICAgXAorICAgIFRFU1RfWE5fRlVOQ19ZTih1aSwgZm5jLCBpKSAgICAgXAorCisjZGVmaW5lIFRFU1RfSU5fRlVOQ19JTl9JTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHVjLCBmbmMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKGMsIGZuYykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHVzLCBmbmMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHMsIGZuYykgICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKHVpLCBmbmMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1hOX1hOKGksIGZuYykKKworI2RlZmluZSBURVNUX0lfRlVOQ19JX0lfSShmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHVjLCBmbmMpICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKGMsIGZuYykgICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHVzLCBmbmMpICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHMsIGZuYykgICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKHVpLCBmbmMpICAgICAgXAorICAgIFRFU1RfWF9GVU5DX1hfWF9YKGksIGZuYykKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUEZOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoZmxvYXQqKSAmZjEpOyAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoZmxvYXQyKikgJmYyKTsgICAgXAorICAgIGYzID0gZm5jKGYzLCAoZmxvYXQzKikgJmYzKTsgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoZmxvYXQ0KikgJmY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMik7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GMzRfRlVOQ19GMzRfRjM0KGZuYykgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGYxKTsKKworI2RlZmluZSBURVNUX0ZfRlVOQ19GTihmbmMpICAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGY0KTsKKworI2RlZmluZSBURVNUX0ZfRlVOQ19GTl9GTihmbmMpICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSk7ICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYyLCBmMik7ICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGYxID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0lOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgaTIpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgaTMpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgaTQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9JKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGkxKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGkxKTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oZm5jKSAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBmMSwgZjEpOyAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBmMiwgZjIpOyAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMywgZjMpOyAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCwgZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9GKGZuYykgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGYxLCBmMSk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX1BJTihmbmMpICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgKGludCopICZpMSk7ICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgKGludDIqKSAmaTIpOyAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgKGludDMqKSAmaTMpOyAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgKGludDQqKSAmaTQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9QSU4oZm5jKSBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCAoaW50KikgJmkxKTsgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyLCAoaW50MiopICZpMik7ICBcCisgICAgZjMgPSBmbmMoZjMsIGYzLCAoaW50MyopICZpMyk7ICBcCisgICAgZjQgPSBmbmMoZjQsIGY0LCAoaW50NCopICZpNCk7CisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0ZOKGZuYykgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBpMSA9IGZuYyhmMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpMiA9IGZuYyhmMik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpMyA9IGZuYyhmMyk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpNCA9IGZuYyhmNCk7CisKK3N0YXRpYyBib29sIHRlc3RfZnBfbWF0aCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RhcnQoKTsKKworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYWNvc2gpOworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zcGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2lucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oYXRhbjIpOworICAgIFRFU1RfRk5fRlVOQ19GTihhdGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGF0YW4ycGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihjYnJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY2VpbCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGNsYW1wKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRihjbGFtcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGNvcHlzaWduKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNvc3BpKTsKKyAgICBURVNUX0YzNF9GVU5DX0YzNF9GMzQoY3Jvc3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihkZWdyZWVzKTsKKyAgICBURVNUX0ZfRlVOQ19GTl9GTihkaXN0YW5jZSk7CisgICAgVEVTVF9GX0ZVTkNfRk5fRk4oZG90KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXJmYyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGVyZik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cDIpOworICAgIFRFU1RfRk5fRlVOQ19GTihleHAxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cG0xKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZmFicyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZkaW0pOworICAgIFRFU1RfRk5fRlVOQ19GTihmbG9vcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKGZtYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKGZtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihmbWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1vZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihmcmFjdCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BJTihmcmV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGh5cG90KTsKKyAgICBURVNUX0lOX0ZVTkNfRk4oaWxvZ2IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihsZGV4cCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0kobGRleHApOworICAgIFRFU1RfRl9GVU5DX0ZOKGxlbmd0aCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BJTihsZ2FtbWEpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nMTApOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cxcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZ2IpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihtYWQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihtYXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKG1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG1pbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YobWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4obWl4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRihtaXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9QRk4obW9kZik7CisgICAgLy8gbmFuCisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG5leHRhZnRlcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKG5vcm1hbGl6ZSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHBvdyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKHBvd24pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihwb3dyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocmFkaWFucyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHJlbWFpbmRlcik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihyZW1xdW8pOworICAgIFRFU1RfRk5fRlVOQ19GTihyaW50KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocm9vdG4pOworICAgIFRFU1RfRk5fRlVOQ19GTihyb3VuZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJzcXJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2lnbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihzaW5jb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2lucGkpOworICAgIFRFU1RfRk5fRlVOQ19GTihzcXJ0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oc3RlcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0Yoc3RlcCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTih0YW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRydW5jKTsKKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ZwX21hdGggRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ZwX21hdGggUEFTU0VEIiwgdGltZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworc3RhdGljIGJvb2wgdGVzdF9pbnRfbWF0aCh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RhcnQoKTsKKworICAgIFRFU1RfVUlOX0ZVTkNfSU4oYWJzKTsKKyAgICBURVNUX0lOX0ZVTkNfSU4oY2x6KTsKKyAgICBURVNUX0lOX0ZVTkNfSU5fSU4obWluKTsKKyAgICBURVNUX0lOX0ZVTkNfSU5fSU4obWF4KTsKKyAgICBURVNUX0lfRlVOQ19JX0lfSShyc0NsYW1wKTsKKworICAgIGZsb2F0IHRpbWUgPSBlbmQoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ludF9tYXRoIEZBSUxFRCIsIHRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9pbnRfbWF0aCBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X2Jhc2ljX29wZXJhdG9ycygpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworICAgIGludCBpID0gMDsKKworICAgIFRFU1RfSU5UX09QKCspOworICAgIFRFU1RfSU5UX09QKC0pOworICAgIFRFU1RfSU5UX09QKCopOworICAgIFRFU1RfSU5UX09QKC8pOworICAgIFRFU1RfSU5UX09QKCUpOworICAgIFRFU1RfSU5UX09QKDw8KTsKKyAgICBURVNUX0lOVF9PUCg+Pik7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfYmFzaWNfb3BlcmF0b3JzIEZBSUxFRCIsIDApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKworI2RlZmluZSBURVNUX0NWVCh0bywgZnJvbSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nIGNvbnZlcnQgZnJvbSAiICNmcm9tICIgdG8gIiAjdG8sIDApOyAgIFwKK3RvIyMxID0gZnJvbSMjMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordG8jIzIgPSBjb252ZXJ0XyMjdHlwZSMjMihmcm9tIyMyKTsgICAgICAgICAgICAgICAgICAgICBcCit0byMjMyA9IGNvbnZlcnRfIyN0eXBlIyMzKGZyb20jIzMpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyM0ID0gY29udmVydF8jI3R5cGUjIzQoZnJvbSMjNCk7CisKKyNkZWZpbmUgVEVTVF9DVlRfTUFUUklYKHRvLCB0eXBlKSAgIFwKK1RFU1RfQ1ZUKHRvLCBjLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1YywgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBzLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1cywgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBpLCB0eXBlKTsgICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCB1aSwgdHlwZSk7ICAgICAgICAgICAgIFwKK1RFU1RfQ1ZUKHRvLCBmLCB0eXBlKTsgICAgICAgICAgICAgIFwKKworc3RhdGljIGJvb2wgdGVzdF9jb252ZXJ0KCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisKKyAgICBURVNUX0NWVF9NQVRSSVgoYywgY2hhcik7CisgICAgVEVTVF9DVlRfTUFUUklYKHVjLCB1Y2hhcik7CisgICAgVEVTVF9DVlRfTUFUUklYKHMsIHNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodXMsIHVzaG9ydCk7CisgICAgVEVTVF9DVlRfTUFUUklYKGksIGludCk7CisgICAgVEVTVF9DVlRfTUFUUklYKHVpLCB1aW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoZiwgZmxvYXQpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2NvbnZlcnQgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2NvbnZlcnQgUEFTU0VEIiwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCBtYXRoX3Rlc3QodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgcnNEZWJ1ZygiSGVyZSAiLCAxKTsKKyAgICByZXNfdWNfMyA9IHNyYzFfdWNfMyAvIHNyYzJfdWNfMzsKKyAgICByc0RlYnVnKCJIZXJlICIsIDIpOworICAgIGZhaWxlZCB8PSB0ZXN0X2Jhc2ljX29wZXJhdG9ycygpOworICAgIHJzRGVidWcoIkhlcmUgIiwgMyk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfRkFJTEVEKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9tYXRoLnJzLm9yaWcgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycy5vcmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTI5YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvbWF0aC5ycy5vcmlnCkBAIC0wLDAgKzEsNDM2IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworLy8gVGVzdGluZyBtYXRoIGxpYnJhcnkKKwordm9sYXRpbGUgZmxvYXQgZjE7Cit2b2xhdGlsZSBmbG9hdDIgZjI7Cit2b2xhdGlsZSBmbG9hdDMgZjM7Cit2b2xhdGlsZSBmbG9hdDQgZjQ7CisKK3ZvbGF0aWxlIGludCBpMTsKK3ZvbGF0aWxlIGludDIgaTI7Cit2b2xhdGlsZSBpbnQzIGkzOwordm9sYXRpbGUgaW50NCBpNDsKKwordm9sYXRpbGUgdWludCB1aTE7Cit2b2xhdGlsZSB1aW50MiB1aTI7Cit2b2xhdGlsZSB1aW50MyB1aTM7Cit2b2xhdGlsZSB1aW50NCB1aTQ7CisKK3ZvbGF0aWxlIHNob3J0IHMxOwordm9sYXRpbGUgc2hvcnQyIHMyOwordm9sYXRpbGUgc2hvcnQzIHMzOwordm9sYXRpbGUgc2hvcnQ0IHM0OworCit2b2xhdGlsZSB1c2hvcnQgdXMxOwordm9sYXRpbGUgdXNob3J0MiB1czI7Cit2b2xhdGlsZSB1c2hvcnQzIHVzMzsKK3ZvbGF0aWxlIHVzaG9ydDQgdXM0OworCit2b2xhdGlsZSBjaGFyIGMxOwordm9sYXRpbGUgY2hhcjIgYzI7Cit2b2xhdGlsZSBjaGFyMyBjMzsKK3ZvbGF0aWxlIGNoYXI0IGM0OworCit2b2xhdGlsZSB1Y2hhciB1YzE7Cit2b2xhdGlsZSB1Y2hhcjIgdWMyOwordm9sYXRpbGUgdWNoYXIzIHVjMzsKK3ZvbGF0aWxlIHVjaGFyNCB1YzQ7CisKKyNkZWZpbmUgREVDTF9JTlQocHJlZml4KSAgICAgICAgICAgIFwKK3ZvbGF0aWxlIGNoYXIgcHJlZml4IyNfY18xID0gMTsgICAgIFwKK3ZvbGF0aWxlIGNoYXIyIHByZWZpeCMjX2NfMiA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXIzIHByZWZpeCMjX2NfMyA9IDE7ICAgIFwKK3ZvbGF0aWxlIGNoYXI0IHByZWZpeCMjX2NfNCA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVjaGFyIHByZWZpeCMjX3VjXzEgPSAxOyAgIFwKK3ZvbGF0aWxlIHVjaGFyMiBwcmVmaXgjI191Y18yID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyMyBwcmVmaXgjI191Y18zID0gMTsgIFwKK3ZvbGF0aWxlIHVjaGFyNCBwcmVmaXgjI191Y180ID0gMTsgIFwKK3ZvbGF0aWxlIHNob3J0IHByZWZpeCMjX3NfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHNob3J0MiBwcmVmaXgjI19zXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0MyBwcmVmaXgjI19zXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHNob3J0NCBwcmVmaXgjI19zXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIHVzaG9ydCBwcmVmaXgjI191c18xID0gMTsgIFwKK3ZvbGF0aWxlIHVzaG9ydDIgcHJlZml4IyNfdXNfMiA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDMgcHJlZml4IyNfdXNfMyA9IDE7IFwKK3ZvbGF0aWxlIHVzaG9ydDQgcHJlZml4IyNfdXNfNCA9IDE7IFwKK3ZvbGF0aWxlIGludCBwcmVmaXgjI19pXzEgPSAxOyAgICAgIFwKK3ZvbGF0aWxlIGludDIgcHJlZml4IyNfaV8yID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDMgcHJlZml4IyNfaV8zID0gMTsgICAgIFwKK3ZvbGF0aWxlIGludDQgcHJlZml4IyNfaV80ID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVpbnQgcHJlZml4IyNfdWlfMSA9IDE7ICAgIFwKK3ZvbGF0aWxlIHVpbnQyIHByZWZpeCMjX3VpXzIgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQzIHByZWZpeCMjX3VpXzMgPSAxOyAgIFwKK3ZvbGF0aWxlIHVpbnQ0IHByZWZpeCMjX3VpXzQgPSAxOyAgIFwKK3ZvbGF0aWxlIGxvbmcgcHJlZml4IyNfbF8xID0gMTsgICAgIFwKK3ZvbGF0aWxlIHVsb25nIHByZWZpeCMjX3VsXzEgPSAxOworCitERUNMX0lOVChyZXMpCitERUNMX0lOVChzcmMxKQorREVDTF9JTlQoc3JjMikKKworI2RlZmluZSBURVNUX0lOVF9PUF9UWVBFKG9wLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjEiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI18xID0gc3JjMV8jI3R5cGUjI18xIG9wIHNyYzJfIyN0eXBlIyNfMTsgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciAiICN0eXBlICIyIiwgaSsrKTsgICAgICAgICBcCityZXNfIyN0eXBlIyNfMiA9IHNyYzFfIyN0eXBlIyNfMiBvcCBzcmMyXyMjdHlwZSMjXzI7ICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgIiAjb3AgIiBmb3IgIiAjdHlwZSAiMyIsIGkrKyk7ICAgICAgICAgXAorcmVzXyMjdHlwZSMjXzMgPSBzcmMxXyMjdHlwZSMjXzMgb3Agc3JjMl8jI3R5cGUjI18zOyAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yICIgI3R5cGUgIjQiLCBpKyspOyAgICAgICAgIFwKK3Jlc18jI3R5cGUjI180ID0gc3JjMV8jI3R5cGUjI180IG9wIHNyYzJfIyN0eXBlIyNfNDsKKworI2RlZmluZSBURVNUX0lOVF9PUChvcCkgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCBjKSAgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIHVjKSAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgcykgICAgICAgICAgICAgICAgICAgICBcCitURVNUX0lOVF9PUF9UWVBFKG9wLCB1cykgICAgICAgICAgICAgICAgICAgIFwKK1RFU1RfSU5UX09QX1RZUEUob3AsIGkpICAgICAgICAgICAgICAgICAgICAgXAorVEVTVF9JTlRfT1BfVFlQRShvcCwgdWkpICAgICAgICAgICAgICAgICAgICBcCityc0RlYnVnKCJUZXN0aW5nICIgI29wICIgZm9yIGwxIiwgaSsrKTsgICAgIFwKK3Jlc19sXzEgPSBzcmMxX2xfMSBvcCBzcmMyX2xfMTsgICAgICAgICAgICAgXAorcnNEZWJ1ZygiVGVzdGluZyAiICNvcCAiIGZvciB1bDEiLCBpKyspOyAgICBcCityZXNfdWxfMSA9IHNyYzFfdWxfMSBvcCBzcmMyX3VsXzE7CisKKyNkZWZpbmUgVEVTVF9YTl9GVU5DX1lOKHR5cGVvdXQsIGZuYywgdHlwZWluKSAgIFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMSA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMSk7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMiA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMik7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfMyA9IGZuYyhzcmMxXyMjdHlwZWluIyNfMyk7IFwKKyAgICByZXNfIyN0eXBlb3V0IyNfNCA9IGZuYyhzcmMxXyMjdHlwZWluIyNfNCk7CisKKyNkZWZpbmUgVEVTVF9YTl9GVU5DX1hOX1hOKHR5cGUsIGZuYykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXNfIyN0eXBlIyNfMSA9IGZuYyhzcmMxXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSk7IFwKKyAgICByZXNfIyN0eXBlIyNfMiA9IGZuYyhzcmMxXyMjdHlwZSMjXzIsIHNyYzJfIyN0eXBlIyNfMik7IFwKKyAgICByZXNfIyN0eXBlIyNfMyA9IGZuYyhzcmMxXyMjdHlwZSMjXzMsIHNyYzJfIyN0eXBlIyNfMyk7IFwKKyAgICByZXNfIyN0eXBlIyNfNCA9IGZuYyhzcmMxXyMjdHlwZSMjXzQsIHNyYzJfIyN0eXBlIyNfNCk7CisKKyNkZWZpbmUgVEVTVF9YX0ZVTkNfWF9YX1godHlwZSwgZm5jKSAgICBcCisgICAgcmVzXyMjdHlwZSMjXzEgPSBmbmMoc3JjMV8jI3R5cGUjI18xLCBzcmMyXyMjdHlwZSMjXzEsIHNyYzJfIyN0eXBlIyNfMSk7CisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0lOKGZuYykgICAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWMsIGZuYywgdWMpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4oYywgZm5jLCBjKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odXMsIGZuYywgdXMpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4ocywgZm5jLCBzKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4odWksIGZuYywgdWkpICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWU4oaSwgZm5jLCBpKQorCisjZGVmaW5lIFRFU1RfVUlOX0ZVTkNfSU4oZm5jKSAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVjLCBmbmMsIGMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVzLCBmbmMsIHMpICAgICBcCisgICAgVEVTVF9YTl9GVU5DX1lOKHVpLCBmbmMsIGkpICAgICBcCisKKyNkZWZpbmUgVEVTVF9JTl9GVU5DX0lOX0lOKGZuYykgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odWMsIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4oYywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odXMsIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4ocywgZm5jKSAgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4odWksIGZuYykgICAgIFwKKyAgICBURVNUX1hOX0ZVTkNfWE5fWE4oaSwgZm5jKQorCisjZGVmaW5lIFRFU1RfSV9GVU5DX0lfSV9JKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godWMsIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1goYywgZm5jKSAgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godXMsIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1gocywgZm5jKSAgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1godWksIGZuYykgICAgICBcCisgICAgVEVTVF9YX0ZVTkNfWF9YX1goaSwgZm5jKQorCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTihmbmMpICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9QRk4oZm5jKSAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIChmbG9hdCopICZmMSk7ICAgICBcCisgICAgZjIgPSBmbmMoZjIsIChmbG9hdDIqKSAmZjIpOyAgICBcCisgICAgZjMgPSBmbmMoZjMsIChmbG9hdDMqKSAmZjMpOyAgICBcCisgICAgZjQgPSBmbmMoZjQsIChmbG9hdDQqKSAmZjQpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTihmbmMpICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0YzNF9GVU5DX0YzNF9GMzQoZm5jKSAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYzID0gZm5jKGYzLCBmMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0YoZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEpOworCisjZGVmaW5lIFRFU1RfRl9GVU5DX0ZOKGZuYykgICAgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjMpOyAgICAgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjQpOworCisjZGVmaW5lIFRFU1RfRl9GVU5DX0ZOX0ZOKGZuYykgICAgICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjIsIGYyKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjMsIGYzKTsgICAgICAgICAgICAgICBcCisgICAgZjEgPSBmbmMoZjQsIGY0KTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fSU4oZm5jKSAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCBpMSk7ICAgICAgICAgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCBpMik7ICAgICAgICAgICAgICAgXAorICAgIGYzID0gZm5jKGYzLCBpMyk7ICAgICAgICAgICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCBpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0koZm5jKSAgICAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgaTEpOyAgICAgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgaTEpOworCisjZGVmaW5lIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihmbmMpICBcCisgICAgcnNEZWJ1ZygiVGVzdGluZyAiICNmbmMsIDApOyAgICBcCisgICAgZjEgPSBmbmMoZjEsIGYxLCBmMSk7ICAgICAgICAgICBcCisgICAgZjIgPSBmbmMoZjIsIGYyLCBmMik7ICAgICAgICAgICBcCisgICAgZjMgPSBmbmMoZjMsIGYzLCBmMyk7ICAgICAgICAgICBcCisgICAgZjQgPSBmbmMoZjQsIGY0LCBmNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX0YoZm5jKSAgIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmMyA9IGZuYyhmMywgZjEsIGYxKTsgICAgICAgICAgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjEsIGYxKTsKKworI2RlZmluZSBURVNUX0ZOX0ZVTkNfRk5fUElOKGZuYykgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGYxID0gZm5jKGYxLCAoaW50KikgJmkxKTsgICAgICAgXAorICAgIGYyID0gZm5jKGYyLCAoaW50MiopICZpMik7ICAgICAgXAorICAgIGYzID0gZm5jKGYzLCAoaW50MyopICZpMyk7ICAgICAgXAorICAgIGY0ID0gZm5jKGY0LCAoaW50NCopICZpNCk7CisKKyNkZWZpbmUgVEVTVF9GTl9GVU5DX0ZOX0ZOX1BJTihmbmMpIFwKKyAgICByc0RlYnVnKCJUZXN0aW5nICIgI2ZuYywgMCk7ICAgIFwKKyAgICBmMSA9IGZuYyhmMSwgZjEsIChpbnQqKSAmaTEpOyAgIFwKKyAgICBmMiA9IGZuYyhmMiwgZjIsIChpbnQyKikgJmkyKTsgIFwKKyAgICBmMyA9IGZuYyhmMywgZjMsIChpbnQzKikgJmkzKTsgIFwKKyAgICBmNCA9IGZuYyhmNCwgZjQsIChpbnQ0KikgJmk0KTsKKworI2RlZmluZSBURVNUX0lOX0ZVTkNfRk4oZm5jKSAgICAgICAgXAorICAgIHJzRGVidWcoIlRlc3RpbmcgIiAjZm5jLCAwKTsgICAgXAorICAgIGkxID0gZm5jKGYxKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkyID0gZm5jKGYyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGkzID0gZm5jKGYzKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGk0ID0gZm5jKGY0KTsKKworc3RhdGljIGJvb2wgdGVzdF9mcF9tYXRoKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihhY29zaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFjb3NwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTihhc2luaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGFzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihhdGFuMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGF0YW5oKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oYXRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oYXRhbjJwaSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGNicnQpOworICAgIFRFU1RfRk5fRlVOQ19GTihjZWlsKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oY2xhbXApOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GKGNsYW1wKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oY29weXNpZ24pOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3MpOworICAgIFRFU1RfRk5fRlVOQ19GTihjb3NoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oY29zcGkpOworICAgIFRFU1RfRjM0X0ZVTkNfRjM0X0YzNChjcm9zcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGRlZ3JlZXMpOworICAgIFRFU1RfRl9GVU5DX0ZOX0ZOKGRpc3RhbmNlKTsKKyAgICBURVNUX0ZfRlVOQ19GTl9GTihkb3QpOworICAgIFRFU1RfRk5fRlVOQ19GTihlcmZjKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXJmKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwMik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGV4cDEwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oZXhwbTEpOworICAgIFRFU1RfRk5fRlVOQ19GTihmYWJzKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZmRpbSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGZsb29yKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fRk4oZm1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oZm1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YoZm1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKGZtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GKGZtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihmbW9kKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKGZyYWN0KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGZyZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4oaHlwb3QpOworICAgIFRFU1RfSU5fRlVOQ19GTihpbG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0lOKGxkZXhwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSShsZGV4cCk7CisgICAgVEVTVF9GX0ZVTkNfRk4obGVuZ3RoKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUElOKGxnYW1tYSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzIpOworICAgIFRFU1RfRk5fRlVOQ19GTihsb2cxMCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKGxvZzFwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obG9nYik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOX0ZOKG1hZCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKG1heCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0YobWF4KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obWluKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihtaW4pOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GTihtaXgpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTl9GKG1peCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOX1BGTihtb2RmKTsKKyAgICAvLyBuYW4KKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4obmV4dGFmdGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4obm9ybWFsaXplKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocG93KTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fSU4ocG93bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOX0ZOKHBvd3IpOworICAgIFRFU1RfRk5fRlVOQ19GTihyYWRpYW5zKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk4ocmVtYWluZGVyKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRk5fUElOKHJlbXF1byk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJpbnQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9JTihyb290bik7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHJvdW5kKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4ocnNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaWduKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4oc2luKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fUEZOKHNpbmNvcyk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNpbmgpOworICAgIFRFU1RfRk5fRlVOQ19GTihzaW5waSk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHNxcnQpOworICAgIFRFU1RfRk5fRlVOQ19GTl9GTihzdGVwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk5fRihzdGVwKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGFuaCk7CisgICAgVEVTVF9GTl9GVU5DX0ZOKHRhbnBpKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odGdhbW1hKTsKKyAgICBURVNUX0ZOX0ZVTkNfRk4odHJ1bmMpOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBGQUlMRUQiLCB0aW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfZnBfbWF0aCBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X2ludF9tYXRoKHVpbnQzMl90IGluZGV4KSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBzdGFydCgpOworCisgICAgVEVTVF9VSU5fRlVOQ19JTihhYnMpOworICAgIFRFU1RfSU5fRlVOQ19JTihjbHopOworICAgIFRFU1RfSU5fRlVOQ19JTl9JTihtaW4pOworICAgIFRFU1RfSU5fRlVOQ19JTl9JTihtYXgpOworICAgIFRFU1RfSV9GVU5DX0lfSV9JKHJzQ2xhbXApOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfaW50X21hdGggRkFJTEVEIiwgdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2ludF9tYXRoIFBBU1NFRCIsIHRpbWUpOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3N0YXRpYyBib29sIHRlc3RfYmFzaWNfb3BlcmF0b3JzKCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgaW50IGkgPSAwOworCisgICAgVEVTVF9JTlRfT1AoKyk7CisgICAgVEVTVF9JTlRfT1AoLSk7CisgICAgVEVTVF9JTlRfT1AoKik7CisgICAgVEVTVF9JTlRfT1AoLyk7CisgICAgVEVTVF9JTlRfT1AoJSk7CisgICAgVEVTVF9JTlRfT1AoPDwpOworICAgIFRFU1RfSU5UX09QKD4+KTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNEZWJ1ZygidGVzdF9iYXNpY19vcGVyYXRvcnMgRkFJTEVEIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X2Jhc2ljX29wZXJhdG9ycyBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCisjZGVmaW5lIFRFU1RfQ1ZUKHRvLCBmcm9tLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3JzRGVidWcoIlRlc3RpbmcgY29udmVydCBmcm9tICIgI2Zyb20gIiB0byAiICN0bywgMCk7ICAgXAordG8jIzEgPSBmcm9tIyMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0byMjMiA9IGNvbnZlcnRfIyN0eXBlIyMyKGZyb20jIzIpOyAgICAgICAgICAgICAgICAgICAgIFwKK3RvIyMzID0gY29udmVydF8jI3R5cGUjIzMoZnJvbSMjMyk7ICAgICAgICAgICAgICAgICAgICAgXAordG8jIzQgPSBjb252ZXJ0XyMjdHlwZSMjNChmcm9tIyM0KTsKKworI2RlZmluZSBURVNUX0NWVF9NQVRSSVgodG8sIHR5cGUpICAgXAorVEVTVF9DVlQodG8sIGMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVjLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHMsIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVzLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGksIHR5cGUpOyAgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIHVpLCB0eXBlKTsgICAgICAgICAgICAgXAorVEVTVF9DVlQodG8sIGYsIHR5cGUpOyAgICAgICAgICAgICAgXAorCitzdGF0aWMgYm9vbCB0ZXN0X2NvbnZlcnQoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKworICAgIFRFU1RfQ1ZUX01BVFJJWChjLCBjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWMsIHVjaGFyKTsKKyAgICBURVNUX0NWVF9NQVRSSVgocywgc2hvcnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWCh1cywgdXNob3J0KTsKKyAgICBURVNUX0NWVF9NQVRSSVgoaSwgaW50KTsKKyAgICBURVNUX0NWVF9NQVRSSVgodWksIHVpbnQpOworICAgIFRFU1RfQ1ZUX01BVFJJWChmLCBmbG9hdCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfY29udmVydCBQQVNTRUQiLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIG1hdGhfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gdGVzdF9jb252ZXJ0KCk7CisgICAgZmFpbGVkIHw9IHRlc3RfZnBfbWF0aChpbmRleCk7CisgICAgZmFpbGVkIHw9IHRlc3RfaW50X21hdGgoaW5kZXgpOworICAgIGZhaWxlZCB8PSB0ZXN0X2Jhc2ljX29wZXJhdG9ycygpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9wcmltaXRpdmVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNDUxZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcHJpbWl0aXZlcy5ycwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworLy8gVGVzdGluZyBwcmltaXRpdmUgdHlwZXMKK2Zsb2F0IGZsb2F0VGVzdCA9IDEuOTlmOworZG91YmxlIGRvdWJsZVRlc3QgPSAyLjA1OworY2hhciBjaGFyVGVzdCA9IC04Oworc2hvcnQgc2hvcnRUZXN0ID0gLTE2OworaW50IGludFRlc3QgPSAtMzI7Citsb25nIGxvbmdUZXN0ID0gMTcxNzk4NjkxODRsOyAvLyAxIDw8IDM0Citsb25nIGxvbmcgbG9uZ2xvbmdUZXN0ID0gNjg3MTk0NzY3MzZsOyAvLyAxIDw8IDM2CisKK3VjaGFyIHVjaGFyVGVzdCA9IDg7Cit1c2hvcnQgdXNob3J0VGVzdCA9IDE2OwordWludCB1aW50VGVzdCA9IDMyOwordWxvbmcgdWxvbmdUZXN0ID0gNDYxMTY4NjAxODQyNzM4NzkwNEw7CitpbnQ2NF90IGludDY0X3RUZXN0ID0gLTE3MTc5ODY5MTg0bDsgLy8gLSAxIDw8IDM0Cit1aW50NjRfdCB1aW50NjRfdFRlc3QgPSAxMTcxNzk4NjkxODRsOworCitzdGF0aWMgYm9vbCB0ZXN0X3ByaW1pdGl2ZV90eXBlcyh1aW50MzJfdCBpbmRleCkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgc3RhcnQoKTsKKworICAgIF9SU19BU1NFUlQoZmxvYXRUZXN0ID09IDIuOTlmKTsKKyAgICBfUlNfQVNTRVJUKGRvdWJsZVRlc3QgPT0gMy4wNSk7CisgICAgX1JTX0FTU0VSVChjaGFyVGVzdCA9PSAtMTYpOworICAgIF9SU19BU1NFUlQoc2hvcnRUZXN0ID09IC0zMik7CisgICAgX1JTX0FTU0VSVChpbnRUZXN0ID09IC02NCk7CisgICAgX1JTX0FTU0VSVChsb25nVGVzdCA9PSAxNzE3OTg2OTE4NWwpOworICAgIF9SU19BU1NFUlQobG9uZ2xvbmdUZXN0ID09IDY4NzE5NDc2NzM1bCk7CisKKyAgICBfUlNfQVNTRVJUKHVjaGFyVGVzdCA9PSA4KTsKKyAgICBfUlNfQVNTRVJUKHVzaG9ydFRlc3QgPT0gMTYpOworICAgIF9SU19BU1NFUlQodWludFRlc3QgPT0gMzIpOworICAgIF9SU19BU1NFUlQodWxvbmdUZXN0ID09IDQ2MTE2ODYwMTg0MjczODc5MDNMKTsKKyAgICBfUlNfQVNTRVJUKGludDY0X3RUZXN0ID09IC0xNzE3OTg2OTE4NGwpOworICAgIF9SU19BU1NFUlQodWludDY0X3RUZXN0ID09IDExNzE3OTg2OTE4NWwpOworCisgICAgZmxvYXQgdGltZSA9IGVuZChpbmRleCk7CisKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfcHJpbWl0aXZlcyBGQUlMRUQiLCB0aW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfcHJpbWl0aXZlcyBQQVNTRUQiLCB0aW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFpbGVkOworfQorCit2b2lkIHByaW1pdGl2ZXNfdGVzdCh1aW50MzJfdCBpbmRleCwgaW50IHRlc3RfbnVtKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gdGVzdF9wcmltaXRpdmVfdHlwZXMoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcmVmY291bnQucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcmVmY291bnQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhNzBlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yZWZjb3VudC5ycwpAQCAtMCwwICsxLDEzIEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKworLy8gVGVzdGluZyByZWZlcmVuY2UgY291bnRpbmcgb2YgUlMgb2JqZWN0IHR5cGVzCisKK3JzX2FsbG9jYXRpb24gZ2xvYmFsQTsKK3N0YXRpYyByc19hbGxvY2F0aW9uIHN0YXRpY0dsb2JhbEE7CisKK3ZvaWQgcmVmY291bnRfdGVzdCgpIHsKKyAgICBzdGF0aWNHbG9iYWxBID0gZ2xvYmFsQTsKKyAgICByc0NsZWFyT2JqZWN0KCZnbG9iYWxBKTsKKyAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2RlYnVnLnJzIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzZGVidWcucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5NDJhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2RlYnVnLnJzCkBAIC0wLDAgKzEsNTYgQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIHByaW1pdGl2ZSB0eXBlcworZmxvYXQgZmxvYXRUZXN0ID0gMS45OWY7Citkb3VibGUgZG91YmxlVGVzdCA9IDIuMDU7CitjaGFyIGNoYXJUZXN0ID0gLTg7CitzaG9ydCBzaG9ydFRlc3QgPSAtMTY7CitpbnQgaW50VGVzdCA9IC0zMjsKK2xvbmcgbG9uZ1Rlc3QgPSAxNzE3OTg2OTE4NGw7IC8vIDEgPDwgMzQKK2xvbmcgbG9uZyBsb25nbG9uZ1Rlc3QgPSA2ODcxOTQ3NjczNmw7IC8vIDEgPDwgMzYKKwordWNoYXIgdWNoYXJUZXN0ID0gODsKK3VzaG9ydCB1c2hvcnRUZXN0ID0gMTY7Cit1aW50IHVpbnRUZXN0ID0gMzI7Cit1bG9uZyB1bG9uZ1Rlc3QgPSA0NjExNjg2MDE4NDI3Mzg3OTA0TDsKK2ludDY0X3QgaW50NjRfdFRlc3QgPSAtMTcxNzk4NjkxODRsOyAvLyAtIDEgPDwgMzQKK3VpbnQ2NF90IHVpbnQ2NF90VGVzdCA9IDExNzE3OTg2OTE4NGw7CisKK3N0YXRpYyBib29sIGJhc2ljX3Rlc3QodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgLy8gVGhpcyB0ZXN0IGZvY3VzZXMgcHJpbWFyaWx5IG9uIGNvbXBpbGF0aW9uLXRpbWUsIG5vdCBydW4tdGltZS4KKyAgICAvLyBGb3IgdGhpcyByZWFzb24sIG5vbmUgb2YgdGhlIG91dHB1dHMgYXJlIGFjdHVhbGx5IGNoZWNrZWQuCisKKyAgICByc0RlYnVnKCJmbG9hdFRlc3QiLCBmbG9hdFRlc3QpOworICAgIHJzRGVidWcoImRvdWJsZVRlc3QiLCBkb3VibGVUZXN0KTsKKyAgICByc0RlYnVnKCJjaGFyVGVzdCIsIGNoYXJUZXN0KTsKKyAgICByc0RlYnVnKCJzaG9ydFRlc3QiLCBzaG9ydFRlc3QpOworICAgIHJzRGVidWcoImludFRlc3QiLCBpbnRUZXN0KTsKKyAgICByc0RlYnVnKCJsb25nVGVzdCIsIGxvbmdUZXN0KTsKKyAgICByc0RlYnVnKCJsb25nbG9uZ1Rlc3QiLCBsb25nbG9uZ1Rlc3QpOworCisgICAgcnNEZWJ1ZygidWNoYXJUZXN0IiwgdWNoYXJUZXN0KTsKKyAgICByc0RlYnVnKCJ1c2hvcnRUZXN0IiwgdXNob3J0VGVzdCk7CisgICAgcnNEZWJ1ZygidWludFRlc3QiLCB1aW50VGVzdCk7CisgICAgcnNEZWJ1ZygidWxvbmdUZXN0IiwgdWxvbmdUZXN0KTsKKyAgICByc0RlYnVnKCJpbnQ2NF90VGVzdCIsIGludDY0X3RUZXN0KTsKKyAgICByc0RlYnVnKCJ1aW50NjRfdFRlc3QiLCB1aW50NjRfdFRlc3QpOworCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB0ZXN0X3JzZGVidWcodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IGJhc2ljX3Rlc3QoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgICAgIHJzRGVidWcoInJzZGVidWdfdGVzdCBGQUlMRUQiLCAtMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgICAgIHJzRGVidWcoInJzZGVidWdfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc2xpc3QucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNsaXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDhiOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnNsaXN0LnJzCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMudGVzdF92MTQpCisKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK2Zsb2F0IGdEWTsKKworcnNfZm9udCBnRm9udDsKKwordHlwZWRlZiBzdHJ1Y3QgTGlzdEFsbG9jc19zIHsKKyAgICByc19hbGxvY2F0aW9uIHRleHQ7CisgICAgaW50IHJlc3VsdDsKK30gTGlzdEFsbG9jczsKKworTGlzdEFsbG9jcyAqZ0xpc3Q7CisKK3ZvaWQgaW5pdCgpIHsKKyAgICBnRFkgPSAwLjBmOworfQorCitpbnQgdGV4dFBvcyA9IDA7CisKK2ludCByb290KHZvaWQpIHsKKworICAgIHJzZ0NsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZik7CisgICAgcnNnQ2xlYXJEZXB0aCgxLjBmKTsKKworICAgIHRleHRQb3MgLT0gKGludClnRFkqMjsKKyAgICBnRFkgKj0gMC45NTsKKworICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjlmLCAxLjBmKTsKKyAgICByc2dCaW5kRm9udChnRm9udCk7CisKKyAgICByc19hbGxvY2F0aW9uIGxpc3RBbGxvYzsKKyAgICBsaXN0QWxsb2MgPSByc0dldEFsbG9jYXRpb24oZ0xpc3QpOworICAgIGludCBhbGxvY1NpemUgPSByc0FsbG9jYXRpb25HZXREaW1YKGxpc3RBbGxvYyk7CisKKyAgICBpbnQgd2lkdGggPSByc2dHZXRXaWR0aCgpOworICAgIGludCBoZWlnaHQgPSByc2dHZXRIZWlnaHQoKTsKKworICAgIGludCBpdGVtSGVpZ2h0ID0gODA7CisgICAgaW50IHRvdGFsSXRlbUhlaWdodCA9IGl0ZW1IZWlnaHQgKiBhbGxvY1NpemU7CisKKyAgICAvKiBQcmV2ZW50IHNjcm9sbGluZyBhYm92ZSB0aGUgdG9wIG9mIHRoZSBsaXN0ICovCisgICAgaW50IGZpcnN0SXRlbSA9IGhlaWdodCAtIHRvdGFsSXRlbUhlaWdodDsKKyAgICBpZiAoZmlyc3RJdGVtIDwgMCkgeworICAgICAgICBmaXJzdEl0ZW0gPSAwOworICAgIH0KKworICAgIC8qIFByZXZlbnQgc2Nyb2xsaW5nIHBhc3QgdGhlIGxhc3QgbGluZSBvZiB0aGUgbGlzdCAqLworICAgIGludCBsYXN0SXRlbSA9IC0xICogKHRvdGFsSXRlbUhlaWdodCAtIGhlaWdodCk7CisgICAgaWYgKGxhc3RJdGVtID4gMCkgeworICAgICAgICBsYXN0SXRlbSA9IDA7CisgICAgfQorCisgICAgaWYgKHRleHRQb3MgPiBmaXJzdEl0ZW0pIHsKKyAgICAgICAgdGV4dFBvcyA9IGZpcnN0SXRlbTsKKyAgICB9CisgICAgZWxzZSBpZiAodGV4dFBvcyA8IGxhc3RJdGVtKSB7CisgICAgICAgIHRleHRQb3MgPSBsYXN0SXRlbTsKKyAgICB9CisKKyAgICBpbnQgY3VycmVudFlQb3MgPSBpdGVtSGVpZ2h0ICsgdGV4dFBvczsKKworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBhbGxvY1NpemU7IGkgKyspIHsKKyAgICAgICAgaWYoY3VycmVudFlQb3MgLSBpdGVtSGVpZ2h0ID4gaGVpZ2h0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGN1cnJlbnRZUG9zID4gMCkgeworICAgICAgICAgICAgc3dpdGNoKGdMaXN0W2ldLnJlc3VsdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMTogLyogUGFzc2VkICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjVmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAtMTogLyogRmFpbGVkICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjVmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBTdGlsbCBUZXN0aW5nICovCisgICAgICAgICAgICAgICAgICAgIHJzZ0ZvbnRDb2xvcigwLjlmLCAwLjlmLCAwLjVmLCAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogLyogVW5rbm93biAqLworICAgICAgICAgICAgICAgICAgICByc2dGb250Q29sb3IoMC45ZiwgMC45ZiwgMC45ZiwgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnNnRHJhd1JlY3QoMCwgY3VycmVudFlQb3MgLSAxLCB3aWR0aCwgY3VycmVudFlQb3MsIDApOworICAgICAgICAgICAgcnNnRHJhd1RleHQoZ0xpc3RbaV0udGV4dCwgMzAsIGN1cnJlbnRZUG9zIC0gMzIpOworICAgICAgICB9CisgICAgICAgIGN1cnJlbnRZUG9zICs9IGl0ZW1IZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDEwOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3JzdGltZS5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3RpbWUucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzZTA3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3RpbWUucnMKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgInNoYXJlZC5yc2giCisKK3N0YXRpYyBib29sIGJhc2ljX3Rlc3QodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgcnNfdGltZV90IGN1clRpbWUgPSByc1RpbWUoMCk7CisgICAgcnNfdG0gdG07CisgICAgcnNEZWJ1ZygiY3VyVGltZSIsIGN1clRpbWUpOworCisgICAgcnNMb2NhbHRpbWUoJnRtLCAmY3VyVGltZSk7CisKKyAgICByc0RlYnVnKCJ0bS50bV9zZWMiLCB0bS50bV9zZWMpOworICAgIHJzRGVidWcoInRtLnRtX21pbiIsIHRtLnRtX21pbik7CisgICAgcnNEZWJ1ZygidG0udG1faG91ciIsIHRtLnRtX2hvdXIpOworICAgIHJzRGVidWcoInRtLnRtX21kYXkiLCB0bS50bV9tZGF5KTsKKyAgICByc0RlYnVnKCJ0bS50bV9tb24iLCB0bS50bV9tb24pOworICAgIHJzRGVidWcoInRtLnRtX3llYXIiLCB0bS50bV95ZWFyKTsKKyAgICByc0RlYnVnKCJ0bS50bV93ZGF5IiwgdG0udG1fd2RheSk7CisgICAgcnNEZWJ1ZygidG0udG1feWRheSIsIHRtLnRtX3lkYXkpOworICAgIHJzRGVidWcoInRtLnRtX2lzZHN0IiwgdG0udG1faXNkc3QpOworCisgICAgLy8gVGVzdCBhIHNwZWNpZmljIHRpbWUgKG9ubHkgdmFsaWQgZm9yIFBTVCBsb2NhbHRpbWUpCisgICAgY3VyVGltZSA9IDEyOTQ0Mzg4OTM7CisgICAgcnNMb2NhbHRpbWUoJnRtLCAmY3VyVGltZSk7CisKKyAgICBfUlNfQVNTRVJUKHRtLnRtX3NlYyA9PSAzMyk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9taW4gPT0gMjEpOworICAgIF9SU19BU1NFUlQodG0udG1faG91ciA9PSAxNCk7CisgICAgX1JTX0FTU0VSVCh0bS50bV9tZGF5ID09IDcpOworICAgIF9SU19BU1NFUlQodG0udG1fbW9uID09IDApOworICAgIF9SU19BU1NFUlQodG0udG1feWVhciA9PSAxMTEpOworICAgIF9SU19BU1NFUlQodG0udG1fd2RheSA9PSA1KTsKKyAgICBfUlNfQVNTRVJUKHRtLnRtX3lkYXkgPT0gNik7CisgICAgX1JTX0FTU0VSVCh0bS50bV9pc2RzdCA9PSAwKTsKKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgdGVzdF9yc3RpbWUodWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IGJhc2ljX3Rlc3QoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgICAgIHJzRGVidWcoInJzdGltZV90ZXN0IEZBSUxFRCIsIC0xKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzU2VuZFRvQ2xpZW50QmxvY2tpbmcoUlNfTVNHX1RFU1RfUEFTU0VEKTsKKyAgICAgICAgcnNEZWJ1ZygicnN0aW1lX3Rlc3QgUEFTU0VEIiwgMCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnN0eXBlcy5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9yc3R5cGVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZDljMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvcnN0eXBlcy5ycwpAQCAtMCwwICsxLDc5IEBACisjaW5jbHVkZSAic2hhcmVkLnJzaCIKKyNpbmNsdWRlICJyc19ncmFwaGljcy5yc2giCisKK3JzX2VsZW1lbnQgZWxlbWVudFRlc3Q7Cityc190eXBlIHR5cGVUZXN0OworcnNfYWxsb2NhdGlvbiBhbGxvY2F0aW9uVGVzdDsKK3JzX3NhbXBsZXIgc2FtcGxlclRlc3Q7Cityc19zY3JpcHQgc2NyaXB0VGVzdDsKK3JzX21lc2ggbWVzaFRlc3Q7Cityc19wcm9ncmFtX2ZyYWdtZW50IHByb2dyYW1fZnJhZ21lbnRUZXN0OworcnNfcHJvZ3JhbV92ZXJ0ZXggcHJvZ3JhbV92ZXJ0ZXhUZXN0OworcnNfcHJvZ3JhbV9yYXN0ZXIgcHJvZ3JhbV9yYXN0ZXJUZXN0OworcnNfcHJvZ3JhbV9zdG9yZSBwcm9ncmFtX3N0b3JlVGVzdDsKK3JzX2ZvbnQgZm9udFRlc3Q7CisKK3JzX21hdHJpeDR4NCBtYXRyaXg0eDRUZXN0OworcnNfbWF0cml4M3gzIG1hdHJpeDN4M1Rlc3Q7Cityc19tYXRyaXgyeDIgbWF0cml4MngyVGVzdDsKKworc3RydWN0IG15X3N0cnVjdCB7CisgICAgaW50IGk7CisgICAgcnNfZm9udCBmb250VGVzdFN0cnVjdDsKK307CisKK3N0YXRpYyBib29sIGJhc2ljX3Rlc3QodWludDMyX3QgaW5kZXgpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgcnNfbWF0cml4NHg0IG1hdHJpeDR4NFRlc3RMb2NhbDsKKyAgICByc19tYXRyaXgzeDMgbWF0cml4M3gzVGVzdExvY2FsOworICAgIHJzX21hdHJpeDJ4MiBtYXRyaXgyeDJUZXN0TG9jYWw7CisKKyAgICAvLyBUaGlzIHRlc3QgZm9jdXNlcyBwcmltYXJpbHkgb24gY29tcGlsYXRpb24tdGltZSwgbm90IHJ1bi10aW1lLgorICAgIHJzX2VsZW1lbnQgZWxlbWVudFRlc3RMb2NhbDsKKyAgICByc190eXBlIHR5cGVUZXN0TG9jYWw7CisgICAgcnNfYWxsb2NhdGlvbiBhbGxvY2F0aW9uVGVzdExvY2FsOworICAgIHJzX3NhbXBsZXIgc2FtcGxlclRlc3RMb2NhbDsKKyAgICByc19zY3JpcHQgc2NyaXB0VGVzdExvY2FsOworICAgIHJzX21lc2ggbWVzaFRlc3RMb2NhbDsKKyAgICByc19wcm9ncmFtX2ZyYWdtZW50IHByb2dyYW1fZnJhZ21lbnRUZXN0TG9jYWw7CisgICAgcnNfcHJvZ3JhbV92ZXJ0ZXggcHJvZ3JhbV92ZXJ0ZXhUZXN0TG9jYWw7CisgICAgcnNfcHJvZ3JhbV9yYXN0ZXIgcHJvZ3JhbV9yYXN0ZXJUZXN0TG9jYWw7CisgICAgcnNfcHJvZ3JhbV9zdG9yZSBwcm9ncmFtX3N0b3JlVGVzdExvY2FsOworICAgIHJzX2ZvbnQgZm9udFRlc3RMb2NhbDsKKworICAgIHJzX2ZvbnQgZm9udFRlc3RMb2NhbEFycmF5WzRdOworCisgICAgcnNfZm9udCBmb250VGVzdExvY2FsUHJlSW5pdCA9IGZvbnRUZXN0OworCisgICAgc3RydWN0IG15X3N0cnVjdCBzdHJ1Y3RUZXN0OworCisgICAgZm9udFRlc3RMb2NhbCA9IGZvbnRUZXN0OworICAgIC8vYWxsb2NhdGlvblRlc3RMb2NhbCA9IGFsbG9jYXRpb25UZXN0OworCisgICAgZm9udFRlc3QgPSBmb250VGVzdExvY2FsOworICAgIC8vYWxsb2NhdGlvblRlc3QgPSBhbGxvY2F0aW9uVGVzdExvY2FsOworCisgICAgLypmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb250VGVzdExvY2FsQXJyYXlbaV0gPSBmb250VGVzdExvY2FsOworICAgIH0qLworCisgICAgLypmb250VGVzdCA9IGZvbnRUZXN0TG9jYWxBcnJheVszXTsqLworCisgICAgcmV0dXJuIGZhaWxlZDsKK30KKwordm9pZCB0ZXN0X3JzdHlwZXModWludDMyX3QgaW5kZXgsIGludCB0ZXN0X251bSkgeworICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgZmFpbGVkIHw9IGJhc2ljX3Rlc3QoaW5kZXgpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX0ZBSUxFRCk7CisgICAgICAgIHJzRGVidWcoInJzdHlwZXNfdGVzdCBGQUlMRUQiLCAtMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByc1NlbmRUb0NsaWVudEJsb2NraW5nKFJTX01TR19URVNUX1BBU1NFRCk7CisgICAgICAgIHJzRGVidWcoInJzdHlwZXNfdGVzdCBQQVNTRUQiLCAwKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoIGIvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3NoYXJlZC5yc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE3MTUxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC9zaGFyZWQucnNoCkBAIC0wLDAgKzEsMzggQEAKKyNwcmFnbWEgdmVyc2lvbigxKQorCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLnRlc3RfdjE0KQorCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0X3MgeworICAgIHJzX2FsbG9jYXRpb24gbmFtZTsKKyAgICBib29sIHBhc3M7CisgICAgZmxvYXQgc2NvcmU7CisgICAgaW50NjRfdCB0aW1lOworfSBUZXN0UmVzdWx0OworLy9UZXN0UmVzdWx0ICpnX3Jlc3VsdHM7CisKK3N0YXRpYyBpbnQ2NF90IGdfdGltZTsKKworc3RhdGljIHZvaWQgc3RhcnQodm9pZCkgeworICAgIGdfdGltZSA9IHJzVXB0aW1lTWlsbGlzKCk7Cit9CisKK3N0YXRpYyBmbG9hdCBlbmQodWludDMyX3QgaWR4KSB7CisgICAgaW50NjRfdCB0ID0gcnNVcHRpbWVNaWxsaXMoKSAtIGdfdGltZTsKKyAgICAvL2dfcmVzdWx0c1tpZHhdLnRpbWUgPSB0OworICAgIC8vcnNEZWJ1ZygidGVzdCB0aW1lIiwgKGludCl0KTsKKyAgICByZXR1cm4gKChmbG9hdCl0KSAvIDEwMDAuZjsKK30KKworI2RlZmluZSBfUlNfQVNTRVJUKGIpIFwKK2RvIHsgXAorICAgIGlmICghKGIpKSB7IFwKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsgXAorICAgICAgICByc0RlYnVnKCNiICIgRkFJTEVEIiwgMCk7IFwKKyAgICB9IFwKK1wKK30gd2hpbGUgKDApCisKKy8qIFRoZXNlIGNvbnN0YW50cyBtdXN0IG1hdGNoIHRob3NlIGluIFVuaXRUZXN0LmphdmEgKi8KK3N0YXRpYyBjb25zdCBpbnQgUlNfTVNHX1RFU1RfUEFTU0VEID0gMTAwOworc3RhdGljIGNvbnN0IGludCBSU19NU0dfVEVTVF9GQUlMRUQgPSAxMDE7CisKZGlmZiAtLWdpdCBhL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC90ZXN0X3Jvb3QucnMgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZmUzNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9SZW5kZXJTY3JpcHRUZXN0cy90ZXN0c192MTQvc3JjL2NvbS9hbmRyb2lkL3JzL3Rlc3QvdGVzdF9yb290LnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIEZvdW50YWluIHRlc3Qgc2NyaXB0CisjcHJhZ21hIHZlcnNpb24oMSkKKworI3ByYWdtYSBycyBqYXZhX3BhY2thZ2VfbmFtZShjb20uYW5kcm9pZC5ycy50ZXN0X3YxNCkKKworI3ByYWdtYSBzdGF0ZUZyYWdtZW50KHBhcmVudCkKKworI2luY2x1ZGUgInJzX2dyYXBoaWNzLnJzaCIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0UmVzdWx0IHsKKyAgICByc19hbGxvY2F0aW9uIG5hbWU7CisgICAgYm9vbCBwYXNzOworICAgIGZsb2F0IHNjb3JlOworfSBUZXN0UmVzdWx0X3Q7CitUZXN0UmVzdWx0X3QgKnJlc3VsdHM7CisKK2ludCByb290KCkgeworCisgICAgcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvUmVuZGVyU2NyaXB0VGVzdHMvdGVzdHNfdjE0L3NyYy9jb20vYW5kcm9pZC9ycy90ZXN0L3ZlY3Rvci5ycyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC92ZWN0b3IucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzMGEyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL1JlbmRlclNjcmlwdFRlc3RzL3Rlc3RzX3YxNC9zcmMvY29tL2FuZHJvaWQvcnMvdGVzdC92ZWN0b3IucnMKQEAgLTAsMCArMSwxOTggQEAKKyNpbmNsdWRlICJzaGFyZWQucnNoIgorCisvLyBUZXN0aW5nIHZlY3RvciB0eXBlcworZmxvYXQyIGYyID0geyAxLjBmLCAyLjBmIH07CitmbG9hdDMgZjMgPSB7IDEuMGYsIDIuMGYsIDMuMGYgfTsKK2Zsb2F0NCBmNCA9IHsgMS4wZiwgMi4wZiwgMy4wZiwgNC4wZiB9OworCitkb3VibGUyIGQyID0geyAxLjAsIDIuMCB9OworZG91YmxlMyBkMyA9IHsgMS4wLCAyLjAsIDMuMCB9OworZG91YmxlNCBkNCA9IHsgMS4wLCAyLjAsIDMuMCwgNC4wIH07CisKK2NoYXIyIGk4XzIgPSB7IDEsIDIgfTsKK2NoYXIzIGk4XzMgPSB7IDEsIDIsIDMgfTsKK2NoYXI0IGk4XzQgPSB7IDEsIDIsIDMsIDQgfTsKKwordWNoYXIyIHU4XzIgPSB7IDEsIDIgfTsKK3VjaGFyMyB1OF8zID0geyAxLCAyLCAzIH07Cit1Y2hhcjQgdThfNCA9IHsgMSwgMiwgMywgNCB9OworCitzaG9ydDIgaTE2XzIgPSB7IDEsIDIgfTsKK3Nob3J0MyBpMTZfMyA9IHsgMSwgMiwgMyB9Oworc2hvcnQ0IGkxNl80ID0geyAxLCAyLCAzLCA0IH07CisKK3VzaG9ydDIgdTE2XzIgPSB7IDEsIDIgfTsKK3VzaG9ydDMgdTE2XzMgPSB7IDEsIDIsIDMgfTsKK3VzaG9ydDQgdTE2XzQgPSB7IDEsIDIsIDMsIDQgfTsKKworaW50MiBpMzJfMiA9IHsgMSwgMiB9OworaW50MyBpMzJfMyA9IHsgMSwgMiwgMyB9OworaW50NCBpMzJfNCA9IHsgMSwgMiwgMywgNCB9OworCit1aW50MiB1MzJfMiA9IHsgMSwgMiB9OwordWludDMgdTMyXzMgPSB7IDEsIDIsIDMgfTsKK3VpbnQ0IHUzMl80ID0geyAxLCAyLCAzLCA0IH07CisKK2xvbmcyIGk2NF8yID0geyAxLCAyIH07Citsb25nMyBpNjRfMyA9IHsgMSwgMiwgMyB9OworbG9uZzQgaTY0XzQgPSB7IDEsIDIsIDMsIDQgfTsKKwordWxvbmcyIHU2NF8yID0geyAxLCAyIH07Cit1bG9uZzMgdTY0XzMgPSB7IDEsIDIsIDMgfTsKK3Vsb25nNCB1NjRfNCA9IHsgMSwgMiwgMywgNCB9OworCitzdGF0aWMgYm9vbCB0ZXN0X3ZlY3Rvcl90eXBlcygpIHsKKyAgICBib29sIGZhaWxlZCA9IGZhbHNlOworCisgICAgcnNEZWJ1ZygiVGVzdGluZyBGMzIiLCAwKTsKKyAgICBfUlNfQVNTRVJUKGYyLnggPT0gMi45OWYpOworICAgIF9SU19BU1NFUlQoZjIueSA9PSAzLjk5Zik7CisKKyAgICBfUlNfQVNTRVJUKGYzLnggPT0gMi45OWYpOworICAgIF9SU19BU1NFUlQoZjMueSA9PSAzLjk5Zik7CisgICAgX1JTX0FTU0VSVChmMy56ID09IDQuOTlmKTsKKworICAgIF9SU19BU1NFUlQoZjQueCA9PSAyLjk5Zik7CisgICAgX1JTX0FTU0VSVChmNC55ID09IDMuOTlmKTsKKyAgICBfUlNfQVNTRVJUKGY0LnogPT0gNC45OWYpOworICAgIF9SU19BU1NFUlQoZjQudyA9PSA1Ljk5Zik7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIEY2NCIsIDApOworICAgIF9SU19BU1NFUlQoZDIueCA9PSAyLjk5KTsKKyAgICBfUlNfQVNTRVJUKGQyLnkgPT0gMy45OSk7CisKKyAgICBfUlNfQVNTRVJUKGQzLnggPT0gMi45OSk7CisgICAgX1JTX0FTU0VSVChkMy55ID09IDMuOTkpOworICAgIF9SU19BU1NFUlQoZDMueiA9PSA0Ljk5KTsKKworICAgIF9SU19BU1NFUlQoZDQueCA9PSAyLjk5KTsKKyAgICBfUlNfQVNTRVJUKGQ0LnkgPT0gMy45OSk7CisgICAgX1JTX0FTU0VSVChkNC56ID09IDQuOTkpOworICAgIF9SU19BU1NFUlQoZDQudyA9PSA1Ljk5KTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgSTgiLCAwKTsKKyAgICBfUlNfQVNTRVJUKGk4XzIueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGk4XzIueSA9PSAzKTsKKworICAgIF9SU19BU1NFUlQoaThfMy54ID09IDIpOworICAgIF9SU19BU1NFUlQoaThfMy55ID09IDMpOworICAgIF9SU19BU1NFUlQoaThfMy56ID09IDQpOworCisgICAgX1JTX0FTU0VSVChpOF80LnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpOF80LnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVChpOF80LnogPT0gNCk7CisgICAgX1JTX0FTU0VSVChpOF80LncgPT0gNSk7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIFU4IiwgMCk7CisgICAgX1JTX0FTU0VSVCh1OF8yLnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1OF8yLnkgPT0gMyk7CisKKyAgICBfUlNfQVNTRVJUKHU4XzMueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHU4XzMueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKHU4XzMueiA9PSA0KTsKKworICAgIF9SU19BU1NFUlQodThfNC54ID09IDIpOworICAgIF9SU19BU1NFUlQodThfNC55ID09IDMpOworICAgIF9SU19BU1NFUlQodThfNC56ID09IDQpOworICAgIF9SU19BU1NFUlQodThfNC53ID09IDUpOworCisgICAgcnNEZWJ1ZygiVGVzdGluZyBJMTYiLCAwKTsKKyAgICBfUlNfQVNTRVJUKGkxNl8yLnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpMTZfMi55ID09IDMpOworCisgICAgX1JTX0FTU0VSVChpMTZfMy54ID09IDIpOworICAgIF9SU19BU1NFUlQoaTE2XzMueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKGkxNl8zLnogPT0gNCk7CisKKyAgICBfUlNfQVNTRVJUKGkxNl80LnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpMTZfNC55ID09IDMpOworICAgIF9SU19BU1NFUlQoaTE2XzQueiA9PSA0KTsKKyAgICBfUlNfQVNTRVJUKGkxNl80LncgPT0gNSk7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIFUxNiIsIDApOworICAgIF9SU19BU1NFUlQodTE2XzIueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHUxNl8yLnkgPT0gMyk7CisKKyAgICBfUlNfQVNTRVJUKHUxNl8zLnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1MTZfMy55ID09IDMpOworICAgIF9SU19BU1NFUlQodTE2XzMueiA9PSA0KTsKKworICAgIF9SU19BU1NFUlQodTE2XzQueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHUxNl80LnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVCh1MTZfNC56ID09IDQpOworICAgIF9SU19BU1NFUlQodTE2XzQudyA9PSA1KTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgSTMyIiwgMCk7CisgICAgX1JTX0FTU0VSVChpMzJfMi54ID09IDIpOworICAgIF9SU19BU1NFUlQoaTMyXzIueSA9PSAzKTsKKworICAgIF9SU19BU1NFUlQoaTMyXzMueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGkzMl8zLnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVChpMzJfMy56ID09IDQpOworCisgICAgX1JTX0FTU0VSVChpMzJfNC54ID09IDIpOworICAgIF9SU19BU1NFUlQoaTMyXzQueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKGkzMl80LnogPT0gNCk7CisgICAgX1JTX0FTU0VSVChpMzJfNC53ID09IDUpOworCisgICAgcnNEZWJ1ZygiVGVzdGluZyBVMzIiLCAwKTsKKyAgICBfUlNfQVNTRVJUKHUzMl8yLnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1MzJfMi55ID09IDMpOworCisgICAgX1JTX0FTU0VSVCh1MzJfMy54ID09IDIpOworICAgIF9SU19BU1NFUlQodTMyXzMueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKHUzMl8zLnogPT0gNCk7CisKKyAgICBfUlNfQVNTRVJUKHUzMl80LnggPT0gMik7CisgICAgX1JTX0FTU0VSVCh1MzJfNC55ID09IDMpOworICAgIF9SU19BU1NFUlQodTMyXzQueiA9PSA0KTsKKyAgICBfUlNfQVNTRVJUKHUzMl80LncgPT0gNSk7CisKKyAgICByc0RlYnVnKCJUZXN0aW5nIEk2NCIsIDApOworICAgIF9SU19BU1NFUlQoaTY0XzIueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGk2NF8yLnkgPT0gMyk7CisKKyAgICBfUlNfQVNTRVJUKGk2NF8zLnggPT0gMik7CisgICAgX1JTX0FTU0VSVChpNjRfMy55ID09IDMpOworICAgIF9SU19BU1NFUlQoaTY0XzMueiA9PSA0KTsKKworICAgIF9SU19BU1NFUlQoaTY0XzQueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKGk2NF80LnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVChpNjRfNC56ID09IDQpOworICAgIF9SU19BU1NFUlQoaTY0XzQudyA9PSA1KTsKKworICAgIHJzRGVidWcoIlRlc3RpbmcgVTY0IiwgMCk7CisgICAgX1JTX0FTU0VSVCh1NjRfMi54ID09IDIpOworICAgIF9SU19BU1NFUlQodTY0XzIueSA9PSAzKTsKKworICAgIF9SU19BU1NFUlQodTY0XzMueCA9PSAyKTsKKyAgICBfUlNfQVNTRVJUKHU2NF8zLnkgPT0gMyk7CisgICAgX1JTX0FTU0VSVCh1NjRfMy56ID09IDQpOworCisgICAgX1JTX0FTU0VSVCh1NjRfNC54ID09IDIpOworICAgIF9SU19BU1NFUlQodTY0XzQueSA9PSAzKTsKKyAgICBfUlNfQVNTRVJUKHU2NF80LnogPT0gNCk7CisgICAgX1JTX0FTU0VSVCh1NjRfNC53ID09IDUpOworCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICByc0RlYnVnKCJ0ZXN0X3ZlY3RvciBGQUlMRUQiLCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJzRGVidWcoInRlc3RfdmVjdG9yIFBBU1NFRCIsIDApOworICAgIH0KKworICAgIHJldHVybiBmYWlsZWQ7Cit9CisKK3ZvaWQgdmVjdG9yX3Rlc3QoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKKyAgICBmYWlsZWQgfD0gdGVzdF92ZWN0b3JfdHlwZXMoKTsKKworICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9GQUlMRUQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnNTZW5kVG9DbGllbnRCbG9ja2luZyhSU19NU0dfVEVTVF9QQVNTRUQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcCBiL3Rvb2xzL2FhcHQvUmVzb3VyY2VUYWJsZS5jcHAKaW5kZXggMGMwYjJlYS4uZGY2YWJlOCAxMDA2NDQKLS0tIGEvdG9vbHMvYWFwdC9SZXNvdXJjZVRhYmxlLmNwcAorKysgYi90b29scy9hYXB0L1Jlc291cmNlVGFibGUuY3BwCkBAIC0yMzA0LDEwICsyMzA0LDggQEAKIAogICAgICAgICBjb25zdCBjaGFyMTZfdCogZW5kID0gbmFtZSArIG5hbWVMZW47CiAgICAgICAgIGNvbnN0IGNoYXIxNl90KiBwb3MgPSBuYW1lOwotICAgICAgICBib29sIGZhaWxlZCA9IGZhbHNlOwotICAgICAgICB3aGlsZSAocG9zIDwgZW5kICYmICFmYWlsZWQpIHsKKyAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkgewogICAgICAgICAgICAgY29uc3QgY2hhcjE2X3QqIHN0YXJ0ID0gcG9zOwotICAgICAgICAgICAgZW5kKys7CiAgICAgICAgICAgICB3aGlsZSAocG9zIDwgZW5kICYmICpwb3MgIT0gJ3wnKSB7CiAgICAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICB9CkBAIC0yMzMzLDkgKzIzMzEsNyBAQAogICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaW5kIHRoaXMgZmxhZyBpZGVudGlmaWVyLgogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb3MgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICBwb3MrKzsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcysrOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwIGIvdG9vbHMvYWFwdC9TdHJpbmdQb29sLmNwcAppbmRleCBmZTg4ZTM3Li43ZjEzN2NlIDEwMDY0NAotLS0gYS90b29scy9hYXB0L1N0cmluZ1Bvb2wuY3BwCisrKyBiL3Rvb2xzL2FhcHQvU3RyaW5nUG9vbC5jcHAKQEAgLTE3NCw3ICsxNzQsOSBAQAogICAgIH0KIAogICAgIGNvbnN0IGJvb2wgZmlyc3QgPSB2aWR4IDwgMDsKLSAgICBpZiAoZmlyc3QgfHwgIW1lcmdlRHVwbGljYXRlcykgeworICAgIGNvbnN0IGJvb2wgc3R5bGVkID0gKHBvcyA+PSAwICYmIChzaXplX3QpcG9zIDwgbUVudHJ5U3R5bGVBcnJheS5zaXplKCkpID8KKyAgICAgICAgbUVudHJ5U3R5bGVBcnJheVtwb3NdLnNwYW5zLnNpemUoKSA6IDA7CisgICAgaWYgKGZpcnN0IHx8IHN0eWxlZCB8fCAhbWVyZ2VEdXBsaWNhdGVzKSB7CiAgICAgICAgIHBvcyA9IG1FbnRyeUFycmF5LmFkZChlaWR4KTsKICAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAgICB2aWR4ID0gbVZhbHVlcy5hZGQodmFsdWUsIHBvcyk7CmRpZmYgLS1naXQgYS90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlV2luZG93LmphdmEgYi90b29scy9sYXlvdXRsaWIvYnJpZGdlL3NyYy9jb20vYW5kcm9pZC9sYXlvdXRsaWIvYnJpZGdlL2FuZHJvaWQvQnJpZGdlV2luZG93LmphdmEKaW5kZXggNzk2MDZhNC4uN2M2ODNjOSAxMDA2NDQKLS0tIGEvdG9vbHMvbGF5b3V0bGliL2JyaWRnZS9zcmMvY29tL2FuZHJvaWQvbGF5b3V0bGliL2JyaWRnZS9hbmRyb2lkL0JyaWRnZVdpbmRvdy5qYXZhCisrKyBiL3Rvb2xzL2xheW91dGxpYi9icmlkZ2Uvc3JjL2NvbS9hbmRyb2lkL2xheW91dGxpYi9icmlkZ2UvYW5kcm9pZC9CcmlkZ2VXaW5kb3cuamF2YQpAQCAtMzksNiArMzksNyBAQAogICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoR2V0TmV3U3VyZmFjZSgpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAvLyBwYXNzIGZvciBub3cuCiAgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxLCBQYXJjZWxGaWxlRGVzY3JpcHRvciBhcmcyKQogICAgICAgICAgICAgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CkBAIC01Miw2ICs1MywxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3BhdGNoU2NyZWVuU3RhdGUoYm9vbGVhbiBvbikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHBhc3MgZm9yIG5vdy4KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3aW5kb3dGb2N1c0NoYW5nZWQoYm9vbGVhbiBhcmcwLCBib29sZWFuIGFyZzEpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewogICAgICAgICAvLyBwYXNzIGZvciBub3cuCiAgICAgfQo=